ULA

Annotated ULA.txt

35:d357bdd67748
2012-01-29 Paul Boddie Fixed character attribute calculations, noting that attribute data is only needed once per character row, not once per scanline. Added bandwidth notes on hardware sprites.
paul@22 1
Timing
paul@22 2
------
paul@22 3
paul@22 4
According to the above (15.3.2 in the AUG), there are 312 scanlines, 256 of
paul@22 5
which are used to generate pixel data. At 50Hz, this means that 128 cycles are
paul@22 6
used to produce pixel data (2000000 / 50 = 40000; 40000 / 312 ~= 128). This is
paul@22 7
consistent with the observation that each scanline requires at most 80 bytes
paul@22 8
of data, and that the ULA is apparently busy for 40 out of 64 microseconds in
paul@22 9
each scanline.
paul@22 10
paul@31 11
See: Acorn Electron Advanced User Guide
paul@22 12
See: http://mdfs.net/Docs/Comp/Electron/Techinfo.htm
paul@22 13
paul@33 14
Access to RAM involves accessing four 64Kb dynamic RAM devices (IC4 to IC7,
paul@33 15
each providing two bits of each byte) using two cycles within the 500ns period
paul@33 16
of the 2MHz clock to complete each access operation.
paul@33 17
paul@33 18
See: Acorn Electron Service Manual
paul@33 19
paul@0 20
Hardware Scrolling
paul@0 21
------------------
paul@0 22
paul@0 23
On the standard ULA, &FE02 and &FE03 map to a 9 significant bits address with
paul@0 24
the least significant 5 bits being zero, thus limiting the scrolling
paul@0 25
resolution to 64 bytes. An enhanced ULA could support a resolution of 2 bytes
paul@0 26
using the same layout of these addresses.
paul@0 27
paul@0 28
|--&FE02--------------| |--&FE03--------------|
paul@0 29
XX XX 14 13 12 11 10 09 08 07 06 XX XX XX XX XX
paul@0 30
paul@0 31
   XX 14 13 12 11 10 09 08 07 06 05 04 03 02 01 XX
paul@0 32
paul@4 33
Arguably, a resolution of 8 bytes is more useful, since the mapping of screen
paul@4 34
memory to pixel locations is character oriented. A change in 8 bytes would
paul@4 35
permit a horizontal scrolling resolution of 2 pixels in MODE 2, 4 pixels in
paul@4 36
MODE 1 and 5, and 8 pixels in MODE 0, 3 and 6. This resolution is actually
paul@4 37
observed on the BBC Micro (see 18.11.2 in the BBC Microcomputer Advanced User
paul@4 38
Guide).
paul@4 39
paul@4 40
One argument for a 2 byte resolution is smooth vertical scrolling. A pitfall
paul@4 41
of changing the screen address by 2 bytes is the change in the number of lines
paul@4 42
from the initial and final character rows that need reading by the ULA, which
paul@9 43
would need to maintain this state information (although this is a relatively
paul@9 44
trivial change). Another pitfall is the complication that might be introduced
paul@9 45
to software writing bitmaps of character height to the screen.
paul@4 46
paul@4 47
Region Blanking
paul@4 48
---------------
paul@4 49
paul@4 50
The problem of permitting character-oriented blitting in programs whilst
paul@4 51
scrolling the screen by sub-character amounts could be mitigated by permitting
paul@4 52
a region of the display to be blank, such as the final lines of the display.
paul@4 53
Consider the following vertical scrolling by 2 bytes that would cause an
paul@4 54
initial character row of 6 lines and a final character row of 2 lines:
paul@4 55
paul@4 56
    6 lines - initial, partial character row
paul@4 57
  248 lines - 31 complete rows
paul@4 58
    2 lines - final, partial character row
paul@4 59
paul@4 60
If a routine were in use that wrote 8 line bitmaps to the partial character
paul@4 61
row now split in two, it would be advisable to hide one of the regions in
paul@4 62
order to prevent content appearing in the wrong place on screen (such as
paul@4 63
content meant to appear at the top "leaking" onto the bottom). Blanking 6
paul@4 64
lines would be sufficient, as can be seen from the following cases.
paul@4 65
paul@4 66
Scrolling up by 2 lines:
paul@4 67
paul@4 68
    6 lines - initial, partial character row
paul@4 69
  240 lines - 30 complete rows
paul@4 70
    4 lines - part of 1 complete row
paul@4 71
  -----------------------------------------------------------------
paul@4 72
    4 lines - part of 1 complete row (hidden to maintain 250 lines)
paul@4 73
    2 lines - final, partial character row (hidden)
paul@4 74
paul@4 75
Scrolling down by 2 lines:
paul@4 76
paul@4 77
    2 lines - initial, partial character row
paul@4 78
  248 lines - 31 complete rows
paul@4 79
  ----------------------------------------------------------
paul@4 80
    6 lines - final, partial character row (hidden)
paul@4 81
paul@24 82
Thus, in this case, region blanking would impose a 250 line display with the
paul@24 83
bottom 6 lines blank.
paul@24 84
paul@24 85
Screen Height Adjustment
paul@24 86
------------------------
paul@24 87
paul@24 88
The height of the screen could be configurable in order to reduce screen
paul@24 89
memory consumption. This is not quite done in MODE 3 and 6 since the start of
paul@24 90
the screen appears to be rounded down to the nearest page, but by reducing the
paul@24 91
height by amounts more than a page, savings would be possible. For example:
paul@24 92
paul@24 93
  Screen width  Depth  Height  Bytes per line  Saving in bytes  Start address
paul@24 94
  ------------  -----  ------  --------------  ---------------  -------------
paul@24 95
  640           1      252     80              320              &3140 -> &3100
paul@24 96
  640           1      248     80              640              &3280 -> &3200
paul@24 97
  320           1      240     40              640              &5A80 -> &5A00
paul@24 98
  320           2      240     80              1280             &3500
paul@0 99
paul@0 100
Palette Definition
paul@0 101
------------------
paul@0 102
paul@0 103
Since all memory accesses go via the ULA, an enhanced ULA could employ more
paul@0 104
specific addresses than &FE*X to perform enhanced functions. For example, the
paul@0 105
palette control is done using &FE*8-F and merely involves selecting predefined
paul@0 106
colours, whereas an enhanced ULA could support the redefinition of all 16
paul@0 107
colours using specific ranges such as &FE18-F (colours 0 to 7) and &FE28-F
paul@0 108
(colours 8 to 15), where a single byte might provide 8 bits per pixel colour
paul@0 109
specifications similar to those used on the Archimedes.
paul@0 110
paul@4 111
The principal limitation here is actually the hardware: the Electron has only
paul@4 112
a single output line for each of the red, green and blue channels, and if
paul@4 113
those outputs are strictly digital and can only be set to a "high" and "low"
paul@4 114
value, then only the existing eight colours are possible. If a modern ULA were
paul@4 115
able to output analogue values, it would still need to be assessed whether the
paul@4 116
circuitry could successfully handle and propagate such values.
paul@4 117
paul@4 118
Palette Definition Lists
paul@4 119
------------------------
paul@4 120
paul@4 121
It can be useful to redefine the palette in order to change the colours
paul@4 122
available for a particular region of the screen, particularly in modes where
paul@4 123
the choice of colours is constrained, and if an increased colour depth were
paul@4 124
available, palette redefinition would be useful to give the illusion of more
paul@4 125
than 16 colours in MODE 2. Traditionally, palette redefinition has been done
paul@4 126
by using interrupt-driven timers, but a more efficient approach would involve
paul@4 127
presenting lists of palette definitions to the ULA so that it can change the
paul@4 128
palette at a particular display line.
paul@4 129
paul@4 130
One might define a palette redefinition list in a region of memory and then
paul@4 131
communicate its contents to the ULA by writing the address and length of the
paul@4 132
list, along with the display line at which the palette is to be changed, to
paul@4 133
ULA registers such that the ULA buffers the list and performs the redefinition
paul@4 134
at the appropriate time. Throughput/bandwidth considerations might impose
paul@4 135
restrictions on the practical length of such a list, however.
paul@4 136
paul@4 137
Palette-Free Modes
paul@4 138
------------------
paul@4 139
paul@4 140
Palette-free modes might be defined where bit values directly correspond to
paul@4 141
the red, green and blue channels, although this would mostly make sense only
paul@4 142
for modes with depths greater than the standard 4 bits per pixel, and such
paul@4 143
modes would require more memory than MODE 2 if they were to have an acceptable
paul@4 144
resolution.
paul@4 145
paul@4 146
Display Suspend
paul@4 147
---------------
paul@4 148
paul@4 149
Especially when writing to the screen memory, it could be beneficial to be
paul@4 150
able to suspend the ULA's access to the memory, instead producing blank values
paul@4 151
for all screen pixels until a program is ready to reveal the screen. This is
paul@4 152
different from palette blanking since with a blank palette, the ULA is still
paul@4 153
reading screen memory and translating its contents into pixel values that end
paul@4 154
up being blank.
paul@4 155
paul@4 156
This function is reminiscent of a capability of the ZX81, albeit necessary on
paul@4 157
that hardware to reduce the load on the system CPU which was responsible for
paul@4 158
producing the video output.
paul@4 159
paul@35 160
Hardware Sprites
paul@35 161
----------------
paul@0 162
paul@0 163
An enhanced ULA might provide hardware sprites, but this would be done in an
paul@0 164
way that is incompatible with the standard ULA, since no &FE*X locations are
paul@34 165
available for allocation. To keep the facility simple, hardware sprites would
paul@34 166
have a standard byte width and height.
paul@34 167
paul@34 168
The specification of sprites could involve the reservation of 16 locations
paul@34 169
(for example, &FE20-F) specifying a fixed number of eight sprites, with each
paul@34 170
location pair referring to the sprite data. By limiting the ULA to dealing
paul@34 171
with a fixed number of sprites, the work required inside the ULA would be
paul@35 172
reduced since it would avoid having to deal with arbitrary numbers of sprites.
paul@0 173
paul@35 174
The principal limitation on providing hardware sprites is that of having to
paul@35 175
obtain sprite data, given that the ULA is usually required to retrieve screen
paul@35 176
data, and given the lack of memory bandwidth available to retrieve sprite data
paul@35 177
(particularly from multiple sprites supposedly at the same position) and
paul@35 178
screen data simultaneously. Although the ULA could potentially read sprite
paul@35 179
data and screen data in alternate memory accesses in screen modes where the
paul@35 180
bandwidth is not already fully utilised, this would result in a degradation of
paul@35 181
performance.
paul@34 182
paul@24 183
Additional Screen Mode Configurations
paul@24 184
-------------------------------------
paul@24 185
paul@24 186
Alternative screen mode configurations could be supported. The ULA has to
paul@24 187
produce 640 pixel values across the screen, with pixel doubling or quadrupling
paul@24 188
employed to fill the screen width:
paul@24 189
paul@24 190
  Screen width      Columns     Scaling     Depth       Bytes
paul@24 191
  ------------      -------     -------     -----       -----
paul@24 192
  640               80          x1          1           80
paul@24 193
  320               40          x2          1, 2        40, 80
paul@24 194
  160               20          x4          2, 4        40, 80
paul@24 195
paul@24 196
It must also use at most 80 byte-sized memory accesses to provide the
paul@24 197
information for the display. Given that characters must occupy an 8x8 pixel
paul@24 198
array, if a configuration featuring anything other than 20, 40 or 80 character
paul@24 199
columns is to be supported, compromises must be made such as the introduction
paul@24 200
of blank pixels either between characters (such as occurs between rows in MODE
paul@24 201
3 and 6) or at the end of a scanline (such as occurs at the end of the frame
paul@24 202
in MODE 3 and 6).  Consider the following configuration:
paul@24 203
paul@24 204
  Screen width      Columns     Scaling     Depth       Bytes       Blank
paul@24 205
  ------------      -------     -------     -----       ------      -----
paul@24 206
  208               26          x3          1, 2        26, 52      16
paul@24 207
paul@24 208
Here, if the ULA can triple pixels, a 26 column mode with either 2 or 4
paul@24 209
colours could be provided, with 16 blank pixel values (out of a total of 640)
paul@24 210
generated either at the start or end (or split between the start and end) of
paul@24 211
each scanline.
paul@24 212
paul@24 213
Character Attributes
paul@24 214
--------------------
paul@24 215
paul@24 216
The BBC Micro MODE 7 employs something resembling character attributes to
paul@24 217
support teletext displays, but depends on circuitry providing a character
paul@24 218
generator. The ZX Spectrum, on the other hand, provides character attributes
paul@24 219
as a means of colouring bitmapped graphics. Although such a feature is very
paul@24 220
limiting as the sole means of providing multicolour graphics, in situations
paul@24 221
where the choice is between low resolution multicolour graphics or high
paul@24 222
resolution monochrome graphics, character attributes provide a potentially
paul@24 223
useful compromise.
paul@24 224
paul@24 225
For each byte read, the ULA must deliver 8 pixel values (out of a total of
paul@24 226
640) to the video output, doing so by either emptying its pixel buffer on a
paul@24 227
pixel per cycle basis, or by multiplying pixels and thus holding them for more
paul@24 228
than one cycle. For example for a screen mode having 640 pixels in width:
paul@24 229
paul@24 230
  Cycle:    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
paul@24 231
  Reads:    B                               B
paul@24 232
  Pixels:   0   1   2   3   4   5   6   7   0   1   2   3   4   5   6   7
paul@24 233
paul@24 234
And for a screen mode having 320 pixels in width:
paul@24 235
paul@24 236
  Cycle:    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
paul@24 237
  Reads:    B
paul@24 238
  Pixels:   0   0   1   1   2   2   3   3   4   4   5   5   6   6   7   7
paul@24 239
paul@24 240
However, in modes where less than 80 bytes are required to generate the pixel
paul@24 241
values, an enhanced ULA might be able to read additional bytes between those
paul@24 242
providing the bitmapped graphics data:
paul@24 243
paul@24 244
  Cycle:    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
paul@24 245
  Reads:    B                               A
paul@24 246
  Pixels:   0   0   1   1   2   2   3   3   4   4   5   5   6   6   7   7
paul@24 247
paul@24 248
These additional bytes could provide colour information for the bitmapped data
paul@24 249
in the following character column (of 8 pixels). Since it would be desirable
paul@24 250
to apply attribute data to the first column, the initial 8 cycles might be
paul@24 251
configured to not produce pixel values.
paul@24 252
paul@35 253
For an entire character, attribute data need only be read for the first row of
paul@35 254
pixels for a character. The subsequent rows would have attribute information
paul@35 255
applied to them, although this would require the attribute data to be stored
paul@35 256
in some kind of buffer. Thus, the following access pattern would be observed:
paul@35 257
paul@35 258
  Cycle:    A B ... _ B ... _ B ... _ B ... _ B ... _ B ... _ B ... _ B ...
paul@35 259
paul@24 260
A whole byte used for colour information for a whole character would result in
paul@35 261
a choice of 256 colours, and this might be somewhat excessive. By only reading
paul@35 262
attribute bytes at every other opportunity, a choice of 16 colours could be
paul@35 263
applied individually to two characters.
paul@24 264
paul@24 265
  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 266
  Reads:    B               A               B               -
paul@24 267
  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 268
paul@35 269
Further reductions in attribute data access, offering 4 colours for every
paul@35 270
character in a four character block, for example, might also be worth
paul@34 271
considering.
paul@34 272
paul@24 273
Consider the following configurations for screen modes with a colour depth of
paul@24 274
1 bit per pixel for bitmap information:
paul@24 275
paul@35 276
  Screen width  Columns  Scaling  Bytes (B)  Bytes (A)  Colours  Screen start
paul@35 277
  ------------  -------  -------  ---------  ---------  -------  ------------
paul@35 278
  320           40       x2       40         40         256      &5300
paul@35 279
  320           40       x2       40         20         16       &5580 -> &5500
paul@35 280
  320           40       x2       40         10         4        &56C0 -> &5600
paul@35 281
  208           26       x3       26         26         256      &62C0 -> &6200
paul@35 282
  208           26       x3       26         13         16       &6460 -> &6400
paul@34 283
paul@34 284
MODE 7 Emulation using Character Attributes
paul@34 285
-------------------------------------------
paul@24 286
paul@24 287
If the scheme of applying attributes to character regions were employed to
paul@24 288
emulate MODE 7, in conjunction with the MODE 6 display technique, the
paul@24 289
following configuration would be required:
paul@24 290
paul@24 291
  Screen width  Columns  Rows  Bytes (B)  Bytes (A)  Colours  Screen start
paul@24 292
  ------------  -------  ----  ---------  ---------  -------  ------------
paul@35 293
  320           40       25    40         20         16       &5ECC -> &5E00
paul@35 294
  320           40       25    40         10         4        &5FC6 -> &5F00
paul@24 295
paul@35 296
Although this requires much more memory than MODE 7 (8500 bytes versus MODE
paul@35 297
7's 1000 bytes), it does not need much more memory than MODE 6, and it would
paul@35 298
at least make a limited 40-column multicolour mode available as a substitute
paul@35 299
for MODE 7.
paul@24 300
paul@24 301
Enhanced Graphics and Mode Layouts
paul@24 302
----------------------------------
paul@0 303
paul@0 304
Screen modes with different screen memory mappings, higher resolutions and
paul@0 305
larger colour depths might be possible, but this would in most cases involve
paul@0 306
the allocation of more screen memory, and the ULA would probably then be
paul@0 307
obliged to page in such memory for the CPU to be able to sensibly access it
paul@0 308
all. Merely changing the memory mappings in order to have Archimedes-style
paul@0 309
row-oriented screen addresses (instead of character-oriented addresses) could
paul@0 310
be done for the existing modes, but this might not be sufficiently beneficial,
paul@0 311
especially since accessing regions of the screen would involve incrementing
paul@0 312
pointers by amounts that are inconvenient on an 8-bit CPU.
paul@0 313
paul@0 314
Enhanced Sound
paul@0 315
--------------
paul@0 316
paul@0 317
The standard ULA reserves &FE*6 for sound generation and cassette
paul@0 318
input/output, thus making it impossible to support multiple channels within
paul@0 319
the given framework. The BBC Micro ULA employs &FE40-&FE4F for sound control,
paul@0 320
and an enhanced ULA could adopt this interface.
paul@0 321
paul@9 322
The BBC Micro uses the SN76489 chip to produce sound, and the entire
paul@9 323
functionality of this chip could be emulated for enhanced sound, with a subset
paul@9 324
of the functionality exposed via the &FE*6 interface.
paul@9 325
paul@9 326
See: http://en.wikipedia.org/wiki/Texas_Instruments_SN76489
paul@9 327
paul@0 328
Waveform Upload
paul@0 329
---------------
paul@0 330
paul@0 331
As with a hardware sprite function, waveforms could be uploaded or referenced
paul@0 332
using locations as registers referencing memory regions.
paul@0 333
paul@0 334
BBC ULA Compatibility
paul@0 335
---------------------
paul@0 336
paul@0 337
Although some new ULA functions could be defined in a way that is also
paul@0 338
compatible with the BBC Micro, the BBC ULA is itself incompatible with the
paul@0 339
Electron ULA: &FE00-7 is reserved for the video controller in the BBC memory
paul@0 340
map, but controls various functions specific to the 6845 video controller;
paul@0 341
&FE08-F is reserved for the serial controller. It therefore becomes possible
paul@0 342
to disregard compatibility where compatibility is already disregarded for a
paul@0 343
particular area of functionality.
paul@0 344
paul@0 345
&FE20-F maps to video ULA functionality on the BBC Micro which provides
paul@0 346
control over the palette (using address &FE21, compared to &FE07-F on the
paul@0 347
Electron) and other system-specific functions. Since the location usage is
paul@0 348
generally incompatible, this region could be reused for other purposes.
paul@31 349
paul@31 350
ULA Pin Functions
paul@31 351
-----------------
paul@31 352
paul@31 353
The functions of the ULA pins are described in the Electron Service Manual. Of
paul@31 354
interest to video processing are the following:
paul@31 355
paul@31 356
  CSYNC (low during horizontal or vertical synchronisation periods, high
paul@31 357
         otherwise)
paul@31 358
paul@31 359
  HS (low during horizontal synchronisation periods, high otherwise)
paul@31 360
paul@31 361
  RED, GREEN, BLUE (pixel colour outputs)
paul@31 362
paul@31 363
  CLOCK IN (a 16MHz clock input, 4V peak to peak)
paul@31 364
paul@31 365
  PHI OUT (a 1MHz, 2MHz and stopped clock signal for the CPU)
paul@31 366
paul@31 367
More general memory access pins:
paul@31 368
paul@31 369
  RAM0...RAM3 (data lines to/from the RAM)
paul@31 370
paul@31 371
  RA0...RA7 (address lines for sending both row and column addresses to the RAM)
paul@31 372
paul@31 373
  RAS (row address strobe setting the row address on a negative edge)
paul@31 374
paul@31 375
  CAS (column address strobe setting the column address on a negative edge)
paul@31 376
paul@31 377
  WE (sets write enable with logic 0, read with logic 1)
paul@31 378
paul@31 379
  ROM (select data access from ROM)
paul@31 380
paul@31 381
CPU-oriented memory access pins:
paul@31 382
paul@31 383
  A0...A15 (CPU address lines)
paul@31 384
paul@31 385
  PD0...PD7 (CPU data lines)
paul@31 386
paul@31 387
  R/W (indicates CPU write with logic 0, CPU read with logic 1)
paul@31 388
paul@31 389
Interrupt-related pins:
paul@31 390
paul@31 391
  NMI (CPU request for uninterrupted 1MHz access to memory)
paul@31 392
paul@31 393
  IRQ (signal event to CPU)
paul@31 394
paul@31 395
  POR (power-on reset, resetting the ULA on a positive edge and asserting the
paul@31 396
       CPU's RST pin)
paul@31 397
paul@31 398
  RST (master reset for the CPU signalled on power-up and by the Break key)
paul@31 399
paul@31 400
Keyboard-related pins:
paul@31 401
paul@31 402
  KBD0...KBD3 (keyboard inputs)
paul@31 403
paul@31 404
  CAPS LOCK (control status LED)
paul@31 405
paul@31 406
Sound-related pins:
paul@31 407
paul@31 408
  SOUND O/P (sound output using internal oscillator)
paul@31 409
paul@31 410
Cassette-related pins:
paul@31 411
paul@31 412
  CAS IN (cassette circuit input, between 0.5V to 2V peak to peak)
paul@31 413
paul@31 414
  CAS OUT (pseudo-sinusoidal output, 1.8V peak to peak)
paul@31 415
paul@31 416
  CAS RC (detect high tone)
paul@31 417
paul@31 418
  CAS MO (motor relay output)
paul@31 419
paul@31 420
  ÷13 IN (~1200 baud clock input)