paul@71 | 1 | The Acorn Electron ULA
|
paul@71 | 2 | ======================
|
paul@71 | 3 |
|
paul@46 | 4 | Principal Design and Feature Constraints
|
paul@46 | 5 | ----------------------------------------
|
paul@46 | 6 |
|
paul@46 | 7 | The features of the ULA are limited by the amount of time and resources that
|
paul@46 | 8 | can be allocated to each activity necessary to support such features given the
|
paul@46 | 9 | fundamental obligations of the unit. Maintaining a screen display based on the
|
paul@46 | 10 | contents of RAM itself requires the ULA to have exclusive access to such
|
paul@46 | 11 | hardware resources for a significant period of time. Whilst other elements of
|
paul@46 | 12 | the ULA can in principle run in parallel with this activity, they cannot also
|
paul@46 | 13 | access the RAM. Consequently, other features that might use the RAM must
|
paul@46 | 14 | accept a reduced allocation of that resource in comparison to a hypothetical
|
paul@46 | 15 | architecture where concurrent RAM access is possible.
|
paul@46 | 16 |
|
paul@46 | 17 | Thus, the principal constraint for many features is bandwidth. The duration of
|
paul@46 | 18 | access to hardware resources is one aspect of this; the rate at which such
|
paul@46 | 19 | resources can be accessed is another. For example, the RAM is not fast enough
|
paul@46 | 20 | to support access more frequently than one byte per 2MHz cycle, and for screen
|
paul@46 | 21 | modes involving 80 bytes of screen data per scanline, there are no free cycles
|
paul@46 | 22 | for anything other than the production of pixel output during the active
|
paul@46 | 23 | scanline periods.
|
paul@46 | 24 |
|
paul@22 | 25 | Timing
|
paul@22 | 26 | ------
|
paul@22 | 27 |
|
paul@40 | 28 | According to 15.3.2 in the Advanced User Guide, there are 312 scanlines, 256
|
paul@40 | 29 | of which are used to generate pixel data. At 50Hz, this means that 128 cycles
|
paul@40 | 30 | are spent on each scanline (2000000 cycles / 50 = 40000 cycles; 40000 cycles /
|
paul@40 | 31 | 312 ~= 128 cycles). This is consistent with the observation that each scanline
|
paul@37 | 32 | requires at most 80 bytes of data, and that the ULA is apparently busy for 40
|
paul@37 | 33 | out of 64 microseconds in each scanline.
|
paul@22 | 34 |
|
paul@33 | 35 | Access to RAM involves accessing four 64Kb dynamic RAM devices (IC4 to IC7,
|
paul@33 | 36 | each providing two bits of each byte) using two cycles within the 500ns period
|
paul@36 | 37 | of the 2MHz clock to complete each access operation. Since the CPU and ULA
|
paul@36 | 38 | have to take turns in accessing the RAM in MODE 4, 5 and 6, the CPU must
|
paul@36 | 39 | effectively run at 1MHz (since every other 500ns period involves the ULA
|
paul@36 | 40 | accessing RAM). The CPU is driven by an external clock (IC8) whose 16MHz
|
paul@36 | 41 | frequency is divided by the ULA (IC1) depending on the screen mode in use.
|
paul@33 | 42 |
|
paul@37 | 43 | Each 16MHz cycle is approximately 62.5ns. To access the memory, the following
|
paul@37 | 44 | patterns corresponding to 16MHz cycles are required:
|
paul@37 | 45 |
|
paul@39 | 46 | Time (ns): 0-------------- 500------------ ...
|
paul@37 | 47 | 2 MHz cycle: 0 1 ...
|
paul@37 | 48 | 16 MHz cycle: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 ...
|
paul@39 | 49 | ~RAS: 0 1 0 1 ...
|
paul@39 | 50 | ~CAS: 0 1 0 1 0 1 0 1 ...
|
paul@64 | 51 | A B C A B C ...
|
paul@39 | 52 | F S F S ...
|
paul@64 | 53 | a b c a b c ...
|
paul@37 | 54 |
|
paul@64 | 55 | Here, "A" and "B" respectively indicate the row and first column addresses
|
paul@64 | 56 | being latched into the RAM (on a negative edge for ~RAS and ~CAS
|
paul@64 | 57 | respectively), and "C" indicates the second column address being latched into
|
paul@64 | 58 | the RAM. Presumably, the first and second half-bytes can be read at "F" and
|
paul@64 | 59 | "S" respectively, and the row and column addresses must be made available at
|
paul@64 | 60 | "a" and "b" (and "c") respectively at the latest.
|
paul@64 | 61 |
|
paul@64 | 62 | The TM4164EC4-15 has a row address access time of 150ns (maximum) and a column
|
paul@64 | 63 | address access time of 90ns (maximum), which appears to mean that
|
paul@64 | 64 | approximately two 16MHz cycles after the row address is latched, and one and a
|
paul@64 | 65 | half cycles after the column address is latched, the data becomes available.
|
paul@37 | 66 |
|
paul@38 | 67 | Note that the Service Manual refers to the negative edge of RAS and CAS, but
|
paul@38 | 68 | the datasheet for the similar TM4164EC4 product shows latching on the negative
|
paul@38 | 69 | edge of ~RAS and ~CAS. It is possible that the Service Manual also intended to
|
paul@38 | 70 | communicate the latter behaviour. In the TM4164EC4 datasheet, it appears that
|
paul@38 | 71 | "page mode" provides the appropriate behaviour for that particular product.
|
paul@38 | 72 |
|
paul@57 | 73 | See: Acorn Electron Advanced User Guide
|
paul@57 | 74 | See: Acorn Electron Service Manual
|
paul@57 | 75 | http://acorn.chriswhy.co.uk/docs/Acorn/Manuals/Acorn_ElectronSM.pdf
|
paul@57 | 76 | See: http://mdfs.net/Docs/Comp/Electron/Techinfo.htm
|
paul@57 | 77 |
|
paul@40 | 78 | Video Timing
|
paul@40 | 79 | ------------
|
paul@40 | 80 |
|
paul@40 | 81 | According to 8.7 in the Service Manual, and the PAL Wikipedia page,
|
paul@40 | 82 | approximately 4.7µs is used for the sync pulse, 5.7µs for the "back porch"
|
paul@40 | 83 | (including the "colour burst"), and 1.65µs for the "front porch", totalling
|
paul@40 | 84 | 12.05µs and thus leaving 51.95µs for the active video signal for each
|
paul@40 | 85 | scanline. As the Service Manual suggests in the oscilloscope traces, the
|
paul@40 | 86 | display information is transmitted more or less centred within the active
|
paul@40 | 87 | video period since the ULA will only be providing pixel data for 40µs in each
|
paul@40 | 88 | scanline.
|
paul@39 | 89 |
|
paul@39 | 90 | Each 62.5ns cycle happens to correspond to 64µs divided by 1024, meaning that
|
paul@39 | 91 | each scanline can be divided into 1024 cycles, although only 640 at most are
|
paul@40 | 92 | actively used to provide pixel data. Pixel data production should only occur
|
paul@40 | 93 | within a certain period on each scanline, approximately 262 cycles after the
|
paul@40 | 94 | start of hsync:
|
paul@40 | 95 |
|
paul@40 | 96 | active video period = 51.95µs
|
paul@40 | 97 | pixel data period = 40µs
|
paul@40 | 98 | total silent period = 51.95µs - 40µs = 11.95µs
|
paul@40 | 99 | silent periods (before and after) = 11.95µs / 2 = 5.975µs
|
paul@40 | 100 | hsync and back porch period = 4.7µs + 5.7µs = 10.4µs
|
paul@40 | 101 | time before pixel data period = 10.4µs + 5.975µs = 16.375µs
|
paul@40 | 102 | pixel data period start cycle = 16.375µs / 62.5ns = 262
|
paul@40 | 103 |
|
paul@40 | 104 | By choosing a number divisible by 8, the RAM access mechanism can be
|
paul@40 | 105 | synchronised with the pixel production. Thus, 264 is a more appropriate start
|
paul@40 | 106 | cycle.
|
paul@40 | 107 |
|
paul@40 | 108 | The "vertical blanking period", meaning the period before picture information
|
paul@40 | 109 | in each field is 25 lines out of 312 (strictly 312.5) and thus lasts for
|
paul@40 | 110 | 1.6ms. Of this, 2.5 lines occur before the vsync (field sync) which also lasts
|
paul@40 | 111 | for 2.5 lines. Thus, the first visible scanline on the first field of a frame
|
paul@40 | 112 | occurs half way through the 23rd scanline period measured from the start of
|
paul@40 | 113 | vsync:
|
paul@40 | 114 |
|
paul@40 | 115 | 10 20 23
|
paul@40 | 116 | Line in frame: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
|
paul@40 | 117 | Line from 1: 0 22 3
|
paul@40 | 118 | Line on screen: .:::::VVVVV::::: 12233445566
|
paul@40 | 119 | |_________________________________________________|
|
paul@40 | 120 | 25 line vertical blanking period
|
paul@40 | 121 |
|
paul@40 | 122 | In the second field of a frame, the first visible scanline coincides with the
|
paul@40 | 123 | 24th scanline period measured from the start of line 313 in the frame:
|
paul@40 | 124 |
|
paul@40 | 125 | 310 336
|
paul@40 | 126 | Line in frame: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
|
paul@40 | 127 | Line from 313: 0 23
|
paul@40 | 128 | Line on screen: 88:::::VVVVV:::: 11223344
|
paul@40 | 129 | 288 | |
|
paul@40 | 130 | |_________________________________________________|
|
paul@40 | 131 | 25 line vertical blanking period
|
paul@40 | 132 |
|
paul@40 | 133 | In order to consider only full lines, we might consider the start of each
|
paul@40 | 134 | frame to occur 23 lines after the start of vsync.
|
paul@40 | 135 |
|
paul@40 | 136 | Again, it is likely that pixel data production should only occur on scanlines
|
paul@40 | 137 | within a certain period on each frame. The "625/50" document indicates that
|
paul@40 | 138 | only a certain region is "safe" to use, suggesting a vertically centred region
|
paul@40 | 139 | with approximately 15 blank lines above and below the picture. Thus, the start
|
paul@40 | 140 | of the picture could be chosen as 38 lines after the start of vsync.
|
paul@40 | 141 |
|
paul@57 | 142 | See: http://en.wikipedia.org/wiki/PAL
|
paul@57 | 143 | See: http://en.wikipedia.org/wiki/Analog_television#Structure_of_a_video_signal
|
paul@57 | 144 | See: The 625/50 PAL Video Signal and TV Compatible Graphics Modes
|
paul@57 | 145 | http://lipas.uwasa.fi/~f76998/video/modes/
|
paul@57 | 146 | See: PAL TV timing and voltages
|
paul@57 | 147 | http://www.retroleum.co.uk/electronics-articles/pal-tv-timing-and-voltages/
|
paul@57 | 148 | See: Line Standards
|
paul@57 | 149 | http://www.pembers.freeserve.co.uk/World-TV-Standards/Line-Standards.html
|
paul@57 | 150 |
|
paul@56 | 151 | RAM Integrated Circuits
|
paul@56 | 152 | -----------------------
|
paul@56 | 153 |
|
paul@65 | 154 | Unicorn Electronics appears to offer 4164 RAM chips (as well as 6502 series
|
paul@65 | 155 | CPUs such as the 6502, 6502A, 6502B and 65C02). These 4164 devices are
|
paul@65 | 156 | available in 100ns (4164-100), 120ns (4164-120) and 150ns (4164-150) variants,
|
paul@65 | 157 | have 16 pins and address 65536 bits through a 1-bit wide channel.
|
paul@65 | 158 |
|
paul@56 | 159 | The documentation for the Electron mentions 4164-15 RAM chips for IC4-7, and
|
paul@64 | 160 | the Samsung-produced KM41464 series is apparently equivalent to the Texas
|
paul@56 | 161 | Instruments 4164 chips presumably used in the Electron.
|
paul@56 | 162 |
|
paul@56 | 163 | The TM4164EC4 series combines 4 64K x 1b units into a single package and
|
paul@57 | 164 | appears similar to the TM4164EA4 featured on the Electron's circuit diagram
|
paul@57 | 165 | (in the Advanced User Guide but not the Service Manual), and it also has 22
|
paul@56 | 166 | pins providing 3 additional inputs and 3 additional outputs over the 16 pins
|
paul@57 | 167 | of the individual 4164-15 modules, presumably allowing concurrent access to
|
paul@57 | 168 | the packaged memory units.
|
paul@56 | 169 |
|
paul@56 | 170 | As far as currently available replacements are concerned, the NTE4164 is a
|
paul@57 | 171 | potential candidate: according to the Vetco Electronics entry, it is
|
paul@57 | 172 | supposedly a replacement for the TMS4164-15 amongst many other parts. Similar
|
paul@57 | 173 | parts include the NTE2164 and the NTE6664, both of which appear to have
|
paul@57 | 174 | largely the same performance and connection characteristics. Meanwhile, the
|
paul@58 | 175 | NTE21256 appears to be a 16-pin replacement with four times the capacity that
|
paul@58 | 176 | maintains the single data input and output pins. Using the NTE21256 as a
|
paul@57 | 177 | replacement for all ICs combined would be difficult because of the single bit
|
paul@57 | 178 | output.
|
paul@56 | 179 |
|
paul@57 | 180 | Another device equivalent to the 4164-15 appears to be available under the
|
paul@57 | 181 | code 41662 from Jameco Electronics as the Siemens HYB 4164-2. The Jameco Web
|
paul@57 | 182 | site lists data sheets for other devices on the same page, but these are
|
paul@57 | 183 | different and actually appear to be provided under the 41574 product code (but
|
paul@57 | 184 | are listed under 41464-10) and appear to be replacements for the TM4164EC4:
|
paul@57 | 185 | the Samsung KM41464A-15 and NEC µPD41464 employ 18 pins, eliminating 4 pins by
|
paul@57 | 186 | employing 4 pins for both input and output.
|
paul@57 | 187 |
|
paul@64 | 188 | Pins I/O pins Row access Column access
|
paul@64 | 189 | ---- -------- ---------- -------------
|
paul@64 | 190 | TM4164EC4 22 4 + 4 150ns (15) 90ns (15)
|
paul@64 | 191 | KM41464AP 18 4 150ns (15) 75ns (15)
|
paul@64 | 192 | NTE21256 16 1 + 1 150ns 75ns
|
paul@64 | 193 | HYB 4164-2 16 1 + 1 150ns 100ns
|
paul@64 | 194 | µPD41464 18 4 120ns (12) 60ns (12)
|
paul@64 | 195 |
|
paul@40 | 196 | See: TM4164EC4 65,536 by 4-Bit Dynamic RAM Module
|
paul@40 | 197 | http://www.datasheetarchive.com/dl/Datasheets-112/DSAP0051030.pdf
|
paul@65 | 198 | See: Dynamic RAMS
|
paul@65 | 199 | http://www.unicornelectronics.com/IC/DYNAMIC.html
|
paul@56 | 200 | See: KM4164B 64K x 1 Bit Dynamic RAM with Page Mode
|
paul@56 | 201 | http://images.ihscontent.net/vipimages/VipMasterIC/IC/SAMS/SAMSD020/SAMSD020-45.pdf
|
paul@57 | 202 | See: NTE2164 Integrated Circuit 65,536 X 1 Bit Dynamic Random Access Memory
|
paul@57 | 203 | http://www.vetco.net/catalog/product_info.php?products_id=2806
|
paul@56 | 204 | See: NTE4164 - IC-NMOS 64K DRAM 150NS
|
paul@56 | 205 | http://www.vetco.net/catalog/product_info.php?products_id=3680
|
paul@56 | 206 | See: NTE21256 - IC-256K DRAM 150NS
|
paul@56 | 207 | http://www.vetco.net/catalog/product_info.php?products_id=2799
|
paul@56 | 208 | See: NTE21256 262,144-Bit Dynamic Random Access Memory (DRAM)
|
paul@56 | 209 | http://www.nteinc.com/specs/21000to21999/pdf/nte21256.pdf
|
paul@57 | 210 | See: NTE6664 - IC-MOS 64K DRAM 150NS
|
paul@57 | 211 | http://www.vetco.net/catalog/product_info.php?products_id=5213
|
paul@57 | 212 | See: NTE6664 Integrated Circuit 64K-Bit Dynamic RAM
|
paul@57 | 213 | http://www.nteinc.com/specs/6600to6699/pdf/nte6664.pdf
|
paul@57 | 214 | See: 4164-150: MAJOR BRANDS
|
paul@57 | 215 | http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_41662_-1
|
paul@57 | 216 | See: HYB 4164-1, HYB 4164-2, HYB 4164-3 65,536-Bit Dynamic Random Access Memory (RAM)
|
paul@57 | 217 | http://www.jameco.com/Jameco/Products/ProdDS/41662SIEMENS.pdf
|
paul@57 | 218 | See: KM41464A NMOS DRAM 64K x 4 Bit Dynamic RAM with Page Mode
|
paul@57 | 219 | http://www.jameco.com/Jameco/Products/ProdDS/41662SAM.pdf
|
paul@57 | 220 | See: NEC µ41464 65,536 x 4-Bit Dynamic NMOS RAM
|
paul@57 | 221 | http://www.jameco.com/Jameco/Products/ProdDS/41662NEC.pdf
|
paul@57 | 222 | See: 41464-10: MAJOR BRANDS
|
paul@57 | 223 | http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_41574_-1
|
paul@39 | 224 |
|
paul@43 | 225 | Interrupts
|
paul@43 | 226 | ----------
|
paul@43 | 227 |
|
paul@43 | 228 | The ULA generates IRQs (maskable interrupts) according to certain conditions
|
paul@43 | 229 | and these conditions are controlled by location &FE00:
|
paul@43 | 230 |
|
paul@43 | 231 | * Vertical sync (bottom of displayed screen)
|
paul@43 | 232 | * 50MHz real time clock
|
paul@43 | 233 | * Transmit data empty
|
paul@43 | 234 | * Receive data full
|
paul@43 | 235 | * High tone detect
|
paul@43 | 236 |
|
paul@43 | 237 | The ULA is also used to clear interrupt conditions through location &FE05. Of
|
paul@43 | 238 | particular significance is bit 7, which must be set if an NMI (non-maskable
|
paul@43 | 239 | interrupt) has occurred and has thus suspended ULA access to memory, restoring
|
paul@43 | 240 | the normal function of the ULA.
|
paul@43 | 241 |
|
paul@43 | 242 | ROM Paging
|
paul@43 | 243 | ----------
|
paul@43 | 244 |
|
paul@43 | 245 | Accessing different ROMs involves bits 0 to 3 of &FE05. Some special ROM
|
paul@43 | 246 | mappings exist:
|
paul@43 | 247 |
|
paul@43 | 248 | 8 keyboard
|
paul@43 | 249 | 9 keyboard (duplicate)
|
paul@43 | 250 | 10 BASIC ROM
|
paul@43 | 251 | 11 BASIC ROM (duplicate)
|
paul@43 | 252 |
|
paul@43 | 253 | Paging in a ROM involves the following procedure:
|
paul@43 | 254 |
|
paul@43 | 255 | 1. Assert ROM page enable (bit 3) together with a ROM number n in bits 0 to
|
paul@43 | 256 | 2, corresponding to ROM number 8+n, such that one of ROMs 12 to 15 is
|
paul@43 | 257 | selected.
|
paul@43 | 258 | 2. Where a ROM numbered from 0 to 7 is to be selected, set bit 3 to zero
|
paul@43 | 259 | whilst writing the desired ROM number n in bits 0 to 2.
|
paul@43 | 260 |
|
paul@37 | 261 | Shadow/Expanded Memory
|
paul@37 | 262 | ----------------------
|
paul@37 | 263 |
|
paul@37 | 264 | The Electron exposes all sixteen address lines and all eight data lines
|
paul@37 | 265 | through the expansion bus. Using such lines, it is possible to provide
|
paul@37 | 266 | additional memory - typically sideways ROM and RAM - on expansion cards and
|
paul@37 | 267 | through cartridges, although the official cartridge specification provides
|
paul@37 | 268 | fewer address lines and only seeks to provide access to memory in 16K units.
|
paul@37 | 269 |
|
paul@37 | 270 | Various modifications and upgrades were developed to offer "turbo"
|
paul@37 | 271 | capabilities to the Electron, permitting the CPU to access a separate 8K of
|
paul@37 | 272 | RAM at 2MHz, presumably preventing access to the low 8K of RAM accessible via
|
paul@37 | 273 | the ULA through additional logic. However, an enhanced ULA might support
|
paul@37 | 274 | independent CPU access to memory over the expansion bus by allowing itself to
|
paul@37 | 275 | be discharged from providing access to memory, potentially for a range of
|
paul@37 | 276 | addresses, and for the CPU to communicate with external memory uninterrupted.
|
paul@33 | 277 |
|
paul@0 | 278 | Hardware Scrolling
|
paul@0 | 279 | ------------------
|
paul@0 | 280 |
|
paul@0 | 281 | On the standard ULA, &FE02 and &FE03 map to a 9 significant bits address with
|
paul@0 | 282 | the least significant 5 bits being zero, thus limiting the scrolling
|
paul@0 | 283 | resolution to 64 bytes. An enhanced ULA could support a resolution of 2 bytes
|
paul@0 | 284 | using the same layout of these addresses.
|
paul@0 | 285 |
|
paul@0 | 286 | |--&FE02--------------| |--&FE03--------------|
|
paul@0 | 287 | XX XX 14 13 12 11 10 09 08 07 06 XX XX XX XX XX
|
paul@0 | 288 |
|
paul@0 | 289 | XX 14 13 12 11 10 09 08 07 06 05 04 03 02 01 XX
|
paul@0 | 290 |
|
paul@4 | 291 | Arguably, a resolution of 8 bytes is more useful, since the mapping of screen
|
paul@4 | 292 | memory to pixel locations is character oriented. A change in 8 bytes would
|
paul@4 | 293 | permit a horizontal scrolling resolution of 2 pixels in MODE 2, 4 pixels in
|
paul@4 | 294 | MODE 1 and 5, and 8 pixels in MODE 0, 3 and 6. This resolution is actually
|
paul@4 | 295 | observed on the BBC Micro (see 18.11.2 in the BBC Microcomputer Advanced User
|
paul@4 | 296 | Guide).
|
paul@4 | 297 |
|
paul@4 | 298 | One argument for a 2 byte resolution is smooth vertical scrolling. A pitfall
|
paul@4 | 299 | of changing the screen address by 2 bytes is the change in the number of lines
|
paul@4 | 300 | from the initial and final character rows that need reading by the ULA, which
|
paul@9 | 301 | would need to maintain this state information (although this is a relatively
|
paul@9 | 302 | trivial change). Another pitfall is the complication that might be introduced
|
paul@9 | 303 | to software writing bitmaps of character height to the screen.
|
paul@4 | 304 |
|
paul@55 | 305 | Enhancement: Region Blanking
|
paul@55 | 306 | ----------------------------
|
paul@4 | 307 |
|
paul@4 | 308 | The problem of permitting character-oriented blitting in programs whilst
|
paul@4 | 309 | scrolling the screen by sub-character amounts could be mitigated by permitting
|
paul@4 | 310 | a region of the display to be blank, such as the final lines of the display.
|
paul@4 | 311 | Consider the following vertical scrolling by 2 bytes that would cause an
|
paul@4 | 312 | initial character row of 6 lines and a final character row of 2 lines:
|
paul@4 | 313 |
|
paul@4 | 314 | 6 lines - initial, partial character row
|
paul@4 | 315 | 248 lines - 31 complete rows
|
paul@4 | 316 | 2 lines - final, partial character row
|
paul@4 | 317 |
|
paul@4 | 318 | If a routine were in use that wrote 8 line bitmaps to the partial character
|
paul@4 | 319 | row now split in two, it would be advisable to hide one of the regions in
|
paul@4 | 320 | order to prevent content appearing in the wrong place on screen (such as
|
paul@4 | 321 | content meant to appear at the top "leaking" onto the bottom). Blanking 6
|
paul@4 | 322 | lines would be sufficient, as can be seen from the following cases.
|
paul@4 | 323 |
|
paul@4 | 324 | Scrolling up by 2 lines:
|
paul@4 | 325 |
|
paul@4 | 326 | 6 lines - initial, partial character row
|
paul@4 | 327 | 240 lines - 30 complete rows
|
paul@4 | 328 | 4 lines - part of 1 complete row
|
paul@4 | 329 | -----------------------------------------------------------------
|
paul@4 | 330 | 4 lines - part of 1 complete row (hidden to maintain 250 lines)
|
paul@4 | 331 | 2 lines - final, partial character row (hidden)
|
paul@4 | 332 |
|
paul@4 | 333 | Scrolling down by 2 lines:
|
paul@4 | 334 |
|
paul@4 | 335 | 2 lines - initial, partial character row
|
paul@4 | 336 | 248 lines - 31 complete rows
|
paul@4 | 337 | ----------------------------------------------------------
|
paul@4 | 338 | 6 lines - final, partial character row (hidden)
|
paul@4 | 339 |
|
paul@24 | 340 | Thus, in this case, region blanking would impose a 250 line display with the
|
paul@24 | 341 | bottom 6 lines blank.
|
paul@24 | 342 |
|
paul@55 | 343 | See the description of the display suspend enhancement for a more efficient
|
paul@55 | 344 | way of blanking lines whilst allowing the CPU to perform useful work during
|
paul@55 | 345 | the blanking period.
|
paul@55 | 346 |
|
paul@55 | 347 | Enhancement: Screen Height Adjustment
|
paul@55 | 348 | -------------------------------------
|
paul@24 | 349 |
|
paul@24 | 350 | The height of the screen could be configurable in order to reduce screen
|
paul@24 | 351 | memory consumption. This is not quite done in MODE 3 and 6 since the start of
|
paul@24 | 352 | the screen appears to be rounded down to the nearest page, but by reducing the
|
paul@24 | 353 | height by amounts more than a page, savings would be possible. For example:
|
paul@24 | 354 |
|
paul@24 | 355 | Screen width Depth Height Bytes per line Saving in bytes Start address
|
paul@24 | 356 | ------------ ----- ------ -------------- --------------- -------------
|
paul@24 | 357 | 640 1 252 80 320 &3140 -> &3100
|
paul@24 | 358 | 640 1 248 80 640 &3280 -> &3200
|
paul@24 | 359 | 320 1 240 40 640 &5A80 -> &5A00
|
paul@24 | 360 | 320 2 240 80 1280 &3500
|
paul@0 | 361 |
|
paul@55 | 362 | Screen Mode Selection
|
paul@55 | 363 | ---------------------
|
paul@55 | 364 |
|
paul@55 | 365 | Bits 3, 4 and 5 of address &FE*7 control the selected screen mode. For a wider
|
paul@55 | 366 | range of modes, the other bits of &FE*7 (related to sound, cassette
|
paul@55 | 367 | input/output and the Caps Lock LED) would need to be reassigned and bit 0
|
paul@55 | 368 | potentially being made available for use.
|
paul@55 | 369 |
|
paul@58 | 370 | Enhancement: Palette Definition
|
paul@58 | 371 | -------------------------------
|
paul@0 | 372 |
|
paul@0 | 373 | Since all memory accesses go via the ULA, an enhanced ULA could employ more
|
paul@0 | 374 | specific addresses than &FE*X to perform enhanced functions. For example, the
|
paul@0 | 375 | palette control is done using &FE*8-F and merely involves selecting predefined
|
paul@0 | 376 | colours, whereas an enhanced ULA could support the redefinition of all 16
|
paul@0 | 377 | colours using specific ranges such as &FE18-F (colours 0 to 7) and &FE28-F
|
paul@0 | 378 | (colours 8 to 15), where a single byte might provide 8 bits per pixel colour
|
paul@0 | 379 | specifications similar to those used on the Archimedes.
|
paul@0 | 380 |
|
paul@4 | 381 | The principal limitation here is actually the hardware: the Electron has only
|
paul@4 | 382 | a single output line for each of the red, green and blue channels, and if
|
paul@4 | 383 | those outputs are strictly digital and can only be set to a "high" and "low"
|
paul@4 | 384 | value, then only the existing eight colours are possible. If a modern ULA were
|
paul@4 | 385 | able to output analogue values, it would still need to be assessed whether the
|
paul@46 | 386 | circuitry could successfully handle and propagate such values. Various sources
|
paul@46 | 387 | indicate that only "TTL levels" are supported by the RGB output circuit, and
|
paul@46 | 388 | since there are 74LS08 AND logic gates involved in the RGB component outputs
|
paul@46 | 389 | from the ULA, it is likely that the ULA is expected to provide only "high" or
|
paul@46 | 390 | "low" values.
|
paul@4 | 391 |
|
paul@58 | 392 | Short of adding extra outputs from the ULA (either additional red, green and
|
paul@70 | 393 | blue outputs or a combined intensity output, the former employed on the
|
paul@70 | 394 | Amstrad CPC series), another approach might involve some kind of modulation
|
paul@70 | 395 | where an output value might be encoded in multiple pulses at a higher
|
paul@70 | 396 | frequency than the pixel frequency. However, this would demand additional
|
paul@70 | 397 | circuitry outside the ULA, and component RGB monitors would probably not be
|
paul@70 | 398 | able to take advantage of this feature; only UHF and composite video devices
|
paul@70 | 399 | (the latter with the composite video colour support enabled on the Electron's
|
paul@70 | 400 | circuit board) would potentially benefit.
|
paul@58 | 401 |
|
paul@51 | 402 | Flashing Colours
|
paul@51 | 403 | ----------------
|
paul@51 | 404 |
|
paul@51 | 405 | According to the Advanced User Guide, "The cursor and flashing colours are
|
paul@51 | 406 | entirely generated in software: This means that all of the logical to physical
|
paul@51 | 407 | colour map must be changed to cause colours to flash." This appears to suggest
|
paul@51 | 408 | that the palette registers must be updated upon the flash counter - read and
|
paul@51 | 409 | written by OSBYTE &C1 (193) - reaching zero and that some way of changing the
|
paul@51 | 410 | colour pairs to be any combination of colours might be possible, instead of
|
paul@52 | 411 | having colour complements as pairs.
|
paul@52 | 412 |
|
paul@52 | 413 | It is conceivable that the interrupt code responsible does the simple thing
|
paul@54 | 414 | and merely inverts the current values for any logical colours (LC) for which
|
paul@54 | 415 | the associated physical colour (as supplied as the second parameter to the VDU
|
paul@54 | 416 | 19 call) has the top bit of its four bit value set. These top bits are not
|
paul@52 | 417 | recorded in the palette registers but are presumably recorded separately and
|
paul@52 | 418 | used to build bitmaps as follows:
|
paul@52 | 419 |
|
paul@54 | 420 | LC 2 colour 4 colour 16 colour 4-bit value for inversion
|
paul@54 | 421 | -- -------- -------- --------- -------------------------
|
paul@54 | 422 | 0 00010001 00010001 00010001 1, 1, 1
|
paul@54 | 423 | 1 01000100 00100010 00010001 4, 2, 1
|
paul@54 | 424 | 2 01000100 00100010 4, 2
|
paul@54 | 425 | 3 10001000 00100010 8, 2
|
paul@54 | 426 | 4 00010001 1
|
paul@54 | 427 | 5 00010001 1
|
paul@54 | 428 | 6 00100010 2
|
paul@54 | 429 | 7 00100010 2
|
paul@54 | 430 | 8 01000100 4
|
paul@54 | 431 | 9 01000100 4
|
paul@54 | 432 | 10 10001000 8
|
paul@54 | 433 | 11 10001000 8
|
paul@54 | 434 | 12 01000100 4
|
paul@54 | 435 | 13 01000100 4
|
paul@54 | 436 | 14 10001000 8
|
paul@54 | 437 | 15 10001000 8
|
paul@54 | 438 |
|
paul@54 | 439 | Inversion value calculation:
|
paul@54 | 440 |
|
paul@54 | 441 | 2 colour formula: 1 << (colour * 2)
|
paul@54 | 442 | 4 colour formula: 1 << colour
|
paul@54 | 443 | 16 colour formula: 1 << ((colour & 2) + ((colour & 8) * 2))
|
paul@52 | 444 |
|
paul@53 | 445 | For example, where logical colour 0 has been mapped to a physical colour in
|
paul@53 | 446 | the range 8 to 15, a bitmap of 00010001 would be chosen as its contribution to
|
paul@53 | 447 | the inversion operation. (The lower three bits of the physical colour would be
|
paul@53 | 448 | used to set the underlying colour information affected by the inversion
|
paul@53 | 449 | operation.)
|
paul@53 | 450 |
|
paul@52 | 451 | An operation in the interrupt code would then combine the bitmaps for all
|
paul@52 | 452 | logical colours in 2 and 4 colour modes, with the 16 colour bitmaps being
|
paul@52 | 453 | combined for groups of logical colours as follows:
|
paul@52 | 454 |
|
paul@54 | 455 | Logical colours
|
paul@54 | 456 | ---------------
|
paul@52 | 457 | 0, 2, 8, 10
|
paul@52 | 458 | 4, 6, 12, 14
|
paul@52 | 459 | 5, 7, 13, 15
|
paul@52 | 460 | 1, 3, 9, 11
|
paul@52 | 461 |
|
paul@52 | 462 | These combined bitmaps would be EORed with the existing palette register
|
paul@52 | 463 | values in order to perform the value inversion necessary to produce the
|
paul@52 | 464 | flashing effect.
|
paul@51 | 465 |
|
paul@54 | 466 | Thus, in the VDU 19 operation, the appropriate inversion value would be
|
paul@54 | 467 | calculated for the logical colour, and this value would then be combined with
|
paul@54 | 468 | other inversion values in a dedicated memory location corresponding to the
|
paul@54 | 469 | colour's group as indicated above. Meanwhile, the palette channel values would
|
paul@54 | 470 | be derived from the lower three bits of the specified physical colour and
|
paul@54 | 471 | combined with other palette data in dedicated memory locations corresponding
|
paul@54 | 472 | to the palette registers.
|
paul@54 | 473 |
|
paul@55 | 474 | Enhancement: Palette Definition Lists
|
paul@55 | 475 | -------------------------------------
|
paul@4 | 476 |
|
paul@4 | 477 | It can be useful to redefine the palette in order to change the colours
|
paul@4 | 478 | available for a particular region of the screen, particularly in modes where
|
paul@4 | 479 | the choice of colours is constrained, and if an increased colour depth were
|
paul@4 | 480 | available, palette redefinition would be useful to give the illusion of more
|
paul@4 | 481 | than 16 colours in MODE 2. Traditionally, palette redefinition has been done
|
paul@4 | 482 | by using interrupt-driven timers, but a more efficient approach would involve
|
paul@4 | 483 | presenting lists of palette definitions to the ULA so that it can change the
|
paul@4 | 484 | palette at a particular display line.
|
paul@4 | 485 |
|
paul@4 | 486 | One might define a palette redefinition list in a region of memory and then
|
paul@4 | 487 | communicate its contents to the ULA by writing the address and length of the
|
paul@4 | 488 | list, along with the display line at which the palette is to be changed, to
|
paul@4 | 489 | ULA registers such that the ULA buffers the list and performs the redefinition
|
paul@4 | 490 | at the appropriate time. Throughput/bandwidth considerations might impose
|
paul@4 | 491 | restrictions on the practical length of such a list, however.
|
paul@4 | 492 |
|
paul@55 | 493 | Enhancement: Palette-Free Modes
|
paul@55 | 494 | -------------------------------
|
paul@4 | 495 |
|
paul@4 | 496 | Palette-free modes might be defined where bit values directly correspond to
|
paul@4 | 497 | the red, green and blue channels, although this would mostly make sense only
|
paul@4 | 498 | for modes with depths greater than the standard 4 bits per pixel, and such
|
paul@4 | 499 | modes would require more memory than MODE 2 if they were to have an acceptable
|
paul@4 | 500 | resolution.
|
paul@4 | 501 |
|
paul@55 | 502 | Enhancement: Display Suspend
|
paul@55 | 503 | ----------------------------
|
paul@4 | 504 |
|
paul@4 | 505 | Especially when writing to the screen memory, it could be beneficial to be
|
paul@4 | 506 | able to suspend the ULA's access to the memory, instead producing blank values
|
paul@4 | 507 | for all screen pixels until a program is ready to reveal the screen. This is
|
paul@4 | 508 | different from palette blanking since with a blank palette, the ULA is still
|
paul@4 | 509 | reading screen memory and translating its contents into pixel values that end
|
paul@4 | 510 | up being blank.
|
paul@4 | 511 |
|
paul@4 | 512 | This function is reminiscent of a capability of the ZX81, albeit necessary on
|
paul@4 | 513 | that hardware to reduce the load on the system CPU which was responsible for
|
paul@62 | 514 | producing the video output. By allowing display suspend on the Electron, the
|
paul@62 | 515 | performance benefit would be derived from giving the CPU full access to the
|
paul@62 | 516 | memory bandwidth.
|
paul@4 | 517 |
|
paul@63 | 518 | Enhancement: Memory Filling
|
paul@63 | 519 | ---------------------------
|
paul@63 | 520 |
|
paul@63 | 521 | A capability that could be given to an enhanced ULA is that of permitting the
|
paul@63 | 522 | ULA to write to screen memory as well being able to read from it. Although
|
paul@63 | 523 | such a capability would probably not be useful in conjunction with the
|
paul@63 | 524 | existing read operations when producing a screen display, and insufficient
|
paul@63 | 525 | bandwidth would exist to do so in high-bandwidth screen modes anyway, the
|
paul@63 | 526 | capability could be offered during a display suspend period (as described
|
paul@63 | 527 | above), permitting a more efficient mechanism to rapidly fill memory with a
|
paul@63 | 528 | predetermined value.
|
paul@63 | 529 |
|
paul@63 | 530 | This capability could also support block filling, where the limits of the
|
paul@63 | 531 | filled memory would be defined by the position and size of a screen area,
|
paul@63 | 532 | although this would demand the provision of additional registers in the ULA to
|
paul@63 | 533 | retain the details of such areas and additional logic to control the fill
|
paul@63 | 534 | operation.
|
paul@63 | 535 |
|
paul@69 | 536 | Enhancement: Region Filling
|
paul@69 | 537 | ---------------------------
|
paul@69 | 538 |
|
paul@69 | 539 | An alternative to memory writing might involve indicating regions using
|
paul@69 | 540 | additional registers or memory where the ULA fills regions of the screen with
|
paul@69 | 541 | content instead of reading from memory. Unlike hardware sprites which should
|
paul@69 | 542 | realistically provide varied content, region filling could employ single
|
paul@69 | 543 | colours or patterns, and one advantage of doing so would be that the ULA need
|
paul@69 | 544 | not access memory at all within a particular region.
|
paul@69 | 545 |
|
paul@69 | 546 | Regions would be defined on a row-by-row basis. Instead of reading memory and
|
paul@69 | 547 | blitting a direct representation to the screen, the ULA would read region
|
paul@69 | 548 | definitions containing a start column, region width and colour details. There
|
paul@69 | 549 | might be a certain number of definitions allowed per row, or the ULA might
|
paul@69 | 550 | just traverse an ordered list of such definitions with each one indicating the
|
paul@71 | 551 | row, start column, region width and colour details.
|
paul@71 | 552 |
|
paul@71 | 553 | One could even compress this information further by requiring only the row,
|
paul@71 | 554 | start column and colour details with each subsequent definition terminating
|
paul@71 | 555 | the effect of the previous one. However, one would also need to consider the
|
paul@71 | 556 | convenience of preparing such definitions and whether efficient access to
|
paul@71 | 557 | definitions for a particular row might be desirable. It might also be
|
paul@71 | 558 | desirable to avoid having to prepare definitions for "empty" areas of the
|
paul@71 | 559 | screen, effectively making the definition of the screen contents employ
|
paul@71 | 560 | run-length encoding and employ only colour plus length information.
|
paul@69 | 561 |
|
paul@69 | 562 | One application of region filling is that of simple 2D and 3D shape rendering.
|
paul@69 | 563 | Although it is entirely possible to plot such shapes to the screen and have
|
paul@69 | 564 | the ULA blit the memory contents to the screen, such operations consume
|
paul@69 | 565 | bandwidth both in the initial plotting and in the final transfer to the
|
paul@69 | 566 | screen. Region filling would reduce such bandwidth usage substantially.
|
paul@69 | 567 |
|
paul@71 | 568 | This way of representing screen images would make certain kinds of images
|
paul@71 | 569 | unfeasible to represent - consider alternating single pixel values which could
|
paul@71 | 570 | easily occur in some character bitmaps - even if an internal queue of regions
|
paul@71 | 571 | were to be supported such that the ULA could read ahead and buffer such
|
paul@71 | 572 | "bandwidth intensive" areas. Thus, the ULA might be better served providing
|
paul@71 | 573 | this feature for certain areas of the display only as some kind of special
|
paul@71 | 574 | graphics window.
|
paul@71 | 575 |
|
paul@55 | 576 | Enhancement: Hardware Sprites
|
paul@55 | 577 | -----------------------------
|
paul@0 | 578 |
|
paul@0 | 579 | An enhanced ULA might provide hardware sprites, but this would be done in an
|
paul@0 | 580 | way that is incompatible with the standard ULA, since no &FE*X locations are
|
paul@34 | 581 | available for allocation. To keep the facility simple, hardware sprites would
|
paul@34 | 582 | have a standard byte width and height.
|
paul@34 | 583 |
|
paul@34 | 584 | The specification of sprites could involve the reservation of 16 locations
|
paul@34 | 585 | (for example, &FE20-F) specifying a fixed number of eight sprites, with each
|
paul@34 | 586 | location pair referring to the sprite data. By limiting the ULA to dealing
|
paul@34 | 587 | with a fixed number of sprites, the work required inside the ULA would be
|
paul@35 | 588 | reduced since it would avoid having to deal with arbitrary numbers of sprites.
|
paul@0 | 589 |
|
paul@35 | 590 | The principal limitation on providing hardware sprites is that of having to
|
paul@35 | 591 | obtain sprite data, given that the ULA is usually required to retrieve screen
|
paul@35 | 592 | data, and given the lack of memory bandwidth available to retrieve sprite data
|
paul@35 | 593 | (particularly from multiple sprites supposedly at the same position) and
|
paul@35 | 594 | screen data simultaneously. Although the ULA could potentially read sprite
|
paul@35 | 595 | data and screen data in alternate memory accesses in screen modes where the
|
paul@35 | 596 | bandwidth is not already fully utilised, this would result in a degradation of
|
paul@35 | 597 | performance.
|
paul@34 | 598 |
|
paul@55 | 599 | Enhancement: Additional Screen Mode Configurations
|
paul@55 | 600 | --------------------------------------------------
|
paul@24 | 601 |
|
paul@24 | 602 | Alternative screen mode configurations could be supported. The ULA has to
|
paul@24 | 603 | produce 640 pixel values across the screen, with pixel doubling or quadrupling
|
paul@24 | 604 | employed to fill the screen width:
|
paul@24 | 605 |
|
paul@24 | 606 | Screen width Columns Scaling Depth Bytes
|
paul@24 | 607 | ------------ ------- ------- ----- -----
|
paul@24 | 608 | 640 80 x1 1 80
|
paul@24 | 609 | 320 40 x2 1, 2 40, 80
|
paul@24 | 610 | 160 20 x4 2, 4 40, 80
|
paul@24 | 611 |
|
paul@24 | 612 | It must also use at most 80 byte-sized memory accesses to provide the
|
paul@24 | 613 | information for the display. Given that characters must occupy an 8x8 pixel
|
paul@24 | 614 | array, if a configuration featuring anything other than 20, 40 or 80 character
|
paul@24 | 615 | columns is to be supported, compromises must be made such as the introduction
|
paul@24 | 616 | of blank pixels either between characters (such as occurs between rows in MODE
|
paul@24 | 617 | 3 and 6) or at the end of a scanline (such as occurs at the end of the frame
|
paul@55 | 618 | in MODE 3 and 6). Consider the following configuration:
|
paul@24 | 619 |
|
paul@24 | 620 | Screen width Columns Scaling Depth Bytes Blank
|
paul@24 | 621 | ------------ ------- ------- ----- ------ -----
|
paul@24 | 622 | 208 26 x3 1, 2 26, 52 16
|
paul@24 | 623 |
|
paul@24 | 624 | Here, if the ULA can triple pixels, a 26 column mode with either 2 or 4
|
paul@24 | 625 | colours could be provided, with 16 blank pixel values (out of a total of 640)
|
paul@24 | 626 | generated either at the start or end (or split between the start and end) of
|
paul@24 | 627 | each scanline.
|
paul@24 | 628 |
|
paul@55 | 629 | Enhancement: Character Attributes
|
paul@55 | 630 | ---------------------------------
|
paul@24 | 631 |
|
paul@24 | 632 | The BBC Micro MODE 7 employs something resembling character attributes to
|
paul@24 | 633 | support teletext displays, but depends on circuitry providing a character
|
paul@24 | 634 | generator. The ZX Spectrum, on the other hand, provides character attributes
|
paul@24 | 635 | as a means of colouring bitmapped graphics. Although such a feature is very
|
paul@24 | 636 | limiting as the sole means of providing multicolour graphics, in situations
|
paul@24 | 637 | where the choice is between low resolution multicolour graphics or high
|
paul@24 | 638 | resolution monochrome graphics, character attributes provide a potentially
|
paul@24 | 639 | useful compromise.
|
paul@24 | 640 |
|
paul@24 | 641 | For each byte read, the ULA must deliver 8 pixel values (out of a total of
|
paul@24 | 642 | 640) to the video output, doing so by either emptying its pixel buffer on a
|
paul@24 | 643 | pixel per cycle basis, or by multiplying pixels and thus holding them for more
|
paul@24 | 644 | than one cycle. For example for a screen mode having 640 pixels in width:
|
paul@24 | 645 |
|
paul@24 | 646 | Cycle: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
paul@24 | 647 | Reads: B B
|
paul@24 | 648 | Pixels: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
|
paul@24 | 649 |
|
paul@24 | 650 | And for a screen mode having 320 pixels in width:
|
paul@24 | 651 |
|
paul@24 | 652 | Cycle: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
paul@24 | 653 | Reads: B
|
paul@24 | 654 | Pixels: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7
|
paul@24 | 655 |
|
paul@24 | 656 | However, in modes where less than 80 bytes are required to generate the pixel
|
paul@24 | 657 | values, an enhanced ULA might be able to read additional bytes between those
|
paul@24 | 658 | providing the bitmapped graphics data:
|
paul@24 | 659 |
|
paul@24 | 660 | Cycle: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
paul@24 | 661 | Reads: B A
|
paul@24 | 662 | Pixels: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7
|
paul@24 | 663 |
|
paul@24 | 664 | These additional bytes could provide colour information for the bitmapped data
|
paul@24 | 665 | in the following character column (of 8 pixels). Since it would be desirable
|
paul@24 | 666 | to apply attribute data to the first column, the initial 8 cycles might be
|
paul@24 | 667 | configured to not produce pixel values.
|
paul@24 | 668 |
|
paul@35 | 669 | For an entire character, attribute data need only be read for the first row of
|
paul@35 | 670 | pixels for a character. The subsequent rows would have attribute information
|
paul@35 | 671 | applied to them, although this would require the attribute data to be stored
|
paul@35 | 672 | in some kind of buffer. Thus, the following access pattern would be observed:
|
paul@35 | 673 |
|
paul@35 | 674 | Cycle: A B ... _ B ... _ B ... _ B ... _ B ... _ B ... _ B ... _ B ...
|
paul@35 | 675 |
|
paul@24 | 676 | A whole byte used for colour information for a whole character would result in
|
paul@35 | 677 | a choice of 256 colours, and this might be somewhat excessive. By only reading
|
paul@35 | 678 | attribute bytes at every other opportunity, a choice of 16 colours could be
|
paul@35 | 679 | applied individually to two characters.
|
paul@24 | 680 |
|
paul@24 | 681 | Cycle: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
paul@24 | 682 | Reads: B A B -
|
paul@24 | 683 | Pixels: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7
|
paul@24 | 684 |
|
paul@35 | 685 | Further reductions in attribute data access, offering 4 colours for every
|
paul@35 | 686 | character in a four character block, for example, might also be worth
|
paul@34 | 687 | considering.
|
paul@34 | 688 |
|
paul@24 | 689 | Consider the following configurations for screen modes with a colour depth of
|
paul@24 | 690 | 1 bit per pixel for bitmap information:
|
paul@24 | 691 |
|
paul@35 | 692 | Screen width Columns Scaling Bytes (B) Bytes (A) Colours Screen start
|
paul@35 | 693 | ------------ ------- ------- --------- --------- ------- ------------
|
paul@35 | 694 | 320 40 x2 40 40 256 &5300
|
paul@35 | 695 | 320 40 x2 40 20 16 &5580 -> &5500
|
paul@35 | 696 | 320 40 x2 40 10 4 &56C0 -> &5600
|
paul@35 | 697 | 208 26 x3 26 26 256 &62C0 -> &6200
|
paul@35 | 698 | 208 26 x3 26 13 16 &6460 -> &6400
|
paul@34 | 699 |
|
paul@55 | 700 | Enhancement: MODE 7 Emulation using Character Attributes
|
paul@55 | 701 | --------------------------------------------------------
|
paul@24 | 702 |
|
paul@24 | 703 | If the scheme of applying attributes to character regions were employed to
|
paul@24 | 704 | emulate MODE 7, in conjunction with the MODE 6 display technique, the
|
paul@24 | 705 | following configuration would be required:
|
paul@24 | 706 |
|
paul@24 | 707 | Screen width Columns Rows Bytes (B) Bytes (A) Colours Screen start
|
paul@24 | 708 | ------------ ------- ---- --------- --------- ------- ------------
|
paul@35 | 709 | 320 40 25 40 20 16 &5ECC -> &5E00
|
paul@35 | 710 | 320 40 25 40 10 4 &5FC6 -> &5F00
|
paul@24 | 711 |
|
paul@35 | 712 | Although this requires much more memory than MODE 7 (8500 bytes versus MODE
|
paul@35 | 713 | 7's 1000 bytes), it does not need much more memory than MODE 6, and it would
|
paul@35 | 714 | at least make a limited 40-column multicolour mode available as a substitute
|
paul@35 | 715 | for MODE 7.
|
paul@24 | 716 |
|
paul@55 | 717 | Enhancement: High Resolution Graphics and Mode Layouts
|
paul@55 | 718 | ------------------------------------------------------
|
paul@0 | 719 |
|
paul@0 | 720 | Screen modes with different screen memory mappings, higher resolutions and
|
paul@0 | 721 | larger colour depths might be possible, but this would in most cases involve
|
paul@0 | 722 | the allocation of more screen memory, and the ULA would probably then be
|
paul@0 | 723 | obliged to page in such memory for the CPU to be able to sensibly access it
|
paul@0 | 724 | all. Merely changing the memory mappings in order to have Archimedes-style
|
paul@0 | 725 | row-oriented screen addresses (instead of character-oriented addresses) could
|
paul@0 | 726 | be done for the existing modes, but this might not be sufficiently beneficial,
|
paul@0 | 727 | especially since accessing regions of the screen would involve incrementing
|
paul@0 | 728 | pointers by amounts that are inconvenient on an 8-bit CPU.
|
paul@0 | 729 |
|
paul@55 | 730 | Enhancement: Genlock Support
|
paul@55 | 731 | ----------------------------
|
paul@46 | 732 |
|
paul@46 | 733 | The ULA generates a video signal in conjunction with circuitry producing the
|
paul@46 | 734 | output features necessary for the correct display of the screen image.
|
paul@46 | 735 | However, it appears that the ULA drives the video synchronisation mechanism
|
paul@46 | 736 | instead of reacting to an existing signal. Genlock support might be possible
|
paul@46 | 737 | if the ULA were made to be responsive to such external signals, resetting its
|
paul@46 | 738 | address generators upon receiving synchronisation events.
|
paul@46 | 739 |
|
paul@55 | 740 | Enhancement: Improved Sound
|
paul@55 | 741 | ---------------------------
|
paul@0 | 742 |
|
paul@55 | 743 | The standard ULA reserves &FE*6 for sound generation and cassette input/output
|
paul@55 | 744 | (with bits 1 and 2 of &FE*7 being used to select either sound generation or
|
paul@55 | 745 | cassette I/O), thus making it impossible to support multiple channels within
|
paul@0 | 746 | the given framework. The BBC Micro ULA employs &FE40-&FE4F for sound control,
|
paul@0 | 747 | and an enhanced ULA could adopt this interface.
|
paul@0 | 748 |
|
paul@9 | 749 | The BBC Micro uses the SN76489 chip to produce sound, and the entire
|
paul@9 | 750 | functionality of this chip could be emulated for enhanced sound, with a subset
|
paul@9 | 751 | of the functionality exposed via the &FE*6 interface.
|
paul@9 | 752 |
|
paul@9 | 753 | See: http://en.wikipedia.org/wiki/Texas_Instruments_SN76489
|
paul@9 | 754 |
|
paul@55 | 755 | Enhancement: Waveform Upload
|
paul@55 | 756 | ----------------------------
|
paul@0 | 757 |
|
paul@0 | 758 | As with a hardware sprite function, waveforms could be uploaded or referenced
|
paul@0 | 759 | using locations as registers referencing memory regions.
|
paul@0 | 760 |
|
paul@55 | 761 | Enhancement: Sound Input/Output
|
paul@55 | 762 | -------------------------------
|
paul@46 | 763 |
|
paul@46 | 764 | Since the ULA already controls audio input/output for cassette-based data, it
|
paul@46 | 765 | would have been interesting to entertain the idea of sampling and output of
|
paul@46 | 766 | sounds through the cassette interface. However, a significant amount of
|
paul@46 | 767 | circuitry is employed to process the input signal for use by the ULA and to
|
paul@46 | 768 | process the output signal for recording.
|
paul@46 | 769 |
|
paul@46 | 770 | See: http://bbc.nvg.org/doc/A%20Hardware%20Guide%20for%20the%20BBC%20Microcomputer/bbc_hw_03.htm#3.11
|
paul@46 | 771 |
|
paul@55 | 772 | Enhancement: BBC ULA Compatibility
|
paul@55 | 773 | ----------------------------------
|
paul@0 | 774 |
|
paul@0 | 775 | Although some new ULA functions could be defined in a way that is also
|
paul@0 | 776 | compatible with the BBC Micro, the BBC ULA is itself incompatible with the
|
paul@0 | 777 | Electron ULA: &FE00-7 is reserved for the video controller in the BBC memory
|
paul@0 | 778 | map, but controls various functions specific to the 6845 video controller;
|
paul@0 | 779 | &FE08-F is reserved for the serial controller. It therefore becomes possible
|
paul@0 | 780 | to disregard compatibility where compatibility is already disregarded for a
|
paul@0 | 781 | particular area of functionality.
|
paul@0 | 782 |
|
paul@0 | 783 | &FE20-F maps to video ULA functionality on the BBC Micro which provides
|
paul@0 | 784 | control over the palette (using address &FE21, compared to &FE07-F on the
|
paul@0 | 785 | Electron) and other system-specific functions. Since the location usage is
|
paul@0 | 786 | generally incompatible, this region could be reused for other purposes.
|
paul@31 | 787 |
|
paul@55 | 788 | Enhancement: Increased RAM, ULA and CPU Performance
|
paul@55 | 789 | ---------------------------------------------------
|
paul@49 | 790 |
|
paul@49 | 791 | More modern implementations of the hardware might feature faster RAM coupled
|
paul@49 | 792 | with an increased ULA clock frequency in order to increase the bandwidth
|
paul@49 | 793 | available to the ULA and to the CPU in situations where the ULA is not needed
|
paul@49 | 794 | to perform work. A ULA employing a 32MHz clock would be able to complete the
|
paul@49 | 795 | retrieval of a byte from RAM in only 250ns and thus be able to enable the CPU
|
paul@49 | 796 | to access the RAM for the following 250ns even in display modes requiring the
|
paul@49 | 797 | retrieval of a byte for the display every 500ns. The CPU could, subject to
|
paul@49 | 798 | timing issues, run at 2MHz even in MODE 0, 1 and 2.
|
paul@49 | 799 |
|
paul@49 | 800 | A scheme such as that described above would have a similar effect to the
|
paul@49 | 801 | scheme employed in the BBC Micro, although the latter made use of RAM with a
|
paul@49 | 802 | wider bandwidth in order to complete memory transfers within 250ns and thus
|
paul@49 | 803 | permit the CPU to run continuously at 2MHz.
|
paul@49 | 804 |
|
paul@49 | 805 | Higher bandwidth could potentially be used to implement exotic features such
|
paul@49 | 806 | as RAM-resident hardware sprites or indeed any feature demanding RAM access
|
paul@49 | 807 | concurrent with the production of the display image.
|
paul@49 | 808 |
|
paul@31 | 809 | ULA Pin Functions
|
paul@31 | 810 | -----------------
|
paul@31 | 811 |
|
paul@31 | 812 | The functions of the ULA pins are described in the Electron Service Manual. Of
|
paul@31 | 813 | interest to video processing are the following:
|
paul@31 | 814 |
|
paul@31 | 815 | CSYNC (low during horizontal or vertical synchronisation periods, high
|
paul@31 | 816 | otherwise)
|
paul@31 | 817 |
|
paul@31 | 818 | HS (low during horizontal synchronisation periods, high otherwise)
|
paul@31 | 819 |
|
paul@31 | 820 | RED, GREEN, BLUE (pixel colour outputs)
|
paul@31 | 821 |
|
paul@31 | 822 | CLOCK IN (a 16MHz clock input, 4V peak to peak)
|
paul@31 | 823 |
|
paul@31 | 824 | PHI OUT (a 1MHz, 2MHz and stopped clock signal for the CPU)
|
paul@31 | 825 |
|
paul@31 | 826 | More general memory access pins:
|
paul@31 | 827 |
|
paul@31 | 828 | RAM0...RAM3 (data lines to/from the RAM)
|
paul@31 | 829 |
|
paul@31 | 830 | RA0...RA7 (address lines for sending both row and column addresses to the RAM)
|
paul@31 | 831 |
|
paul@38 | 832 | RAS (row address strobe setting the row address on a negative edge - see the
|
paul@38 | 833 | timing notes)
|
paul@31 | 834 |
|
paul@38 | 835 | CAS (column address strobe setting the column address on a negative edge -
|
paul@38 | 836 | see the timing notes)
|
paul@31 | 837 |
|
paul@31 | 838 | WE (sets write enable with logic 0, read with logic 1)
|
paul@31 | 839 |
|
paul@31 | 840 | ROM (select data access from ROM)
|
paul@31 | 841 |
|
paul@31 | 842 | CPU-oriented memory access pins:
|
paul@31 | 843 |
|
paul@31 | 844 | A0...A15 (CPU address lines)
|
paul@31 | 845 |
|
paul@31 | 846 | PD0...PD7 (CPU data lines)
|
paul@31 | 847 |
|
paul@31 | 848 | R/W (indicates CPU write with logic 0, CPU read with logic 1)
|
paul@31 | 849 |
|
paul@31 | 850 | Interrupt-related pins:
|
paul@31 | 851 |
|
paul@31 | 852 | NMI (CPU request for uninterrupted 1MHz access to memory)
|
paul@31 | 853 |
|
paul@31 | 854 | IRQ (signal event to CPU)
|
paul@31 | 855 |
|
paul@31 | 856 | POR (power-on reset, resetting the ULA on a positive edge and asserting the
|
paul@31 | 857 | CPU's RST pin)
|
paul@31 | 858 |
|
paul@31 | 859 | RST (master reset for the CPU signalled on power-up and by the Break key)
|
paul@31 | 860 |
|
paul@31 | 861 | Keyboard-related pins:
|
paul@31 | 862 |
|
paul@31 | 863 | KBD0...KBD3 (keyboard inputs)
|
paul@31 | 864 |
|
paul@31 | 865 | CAPS LOCK (control status LED)
|
paul@31 | 866 |
|
paul@31 | 867 | Sound-related pins:
|
paul@31 | 868 |
|
paul@31 | 869 | SOUND O/P (sound output using internal oscillator)
|
paul@31 | 870 |
|
paul@31 | 871 | Cassette-related pins:
|
paul@31 | 872 |
|
paul@31 | 873 | CAS IN (cassette circuit input, between 0.5V to 2V peak to peak)
|
paul@31 | 874 |
|
paul@31 | 875 | CAS OUT (pseudo-sinusoidal output, 1.8V peak to peak)
|
paul@31 | 876 |
|
paul@31 | 877 | CAS RC (detect high tone)
|
paul@31 | 878 |
|
paul@31 | 879 | CAS MO (motor relay output)
|
paul@31 | 880 |
|
paul@31 | 881 | ÷13 IN (~1200 baud clock input)
|
paul@46 | 882 |
|
paul@46 | 883 | References
|
paul@46 | 884 | ----------
|
paul@46 | 885 |
|
paul@46 | 886 | See: http://bbc.nvg.org/doc/A%20Hardware%20Guide%20for%20the%20BBC%20Microcomputer/bbc_hw.htm
|
paul@71 | 887 |
|
paul@71 | 888 | About this Document
|
paul@71 | 889 | -------------------
|
paul@71 | 890 |
|
paul@71 | 891 | The most recent version of this document and accompanying distribution should
|
paul@71 | 892 | be available from the following location:
|
paul@71 | 893 |
|
paul@71 | 894 | http://hgweb.boddie.org.uk/ULA
|
paul@71 | 895 |
|
paul@71 | 896 | Copyright and licence information can be found in the docs directory of this
|
paul@71 | 897 | distribution - see docs/COPYING.txt for more information.
|