15 ICs
1K ’257 1L ’20 1M ’273
2K ’257 2L ’257 2M ’257
3K 2148H 3L ’1’ 3M ’1’
4K 2148H 4L ’86 4M ’86
5K ’163 5L ’163 5M ’163
5L — 74LS163: X counter low: preloads DF0-DF3 (the sprite X byte) at /1LOAD, cleared per line at /1CL, counts at OB6M with P and T tied high so it free-runs; its carry (pin 15) enables 5M. — verified 2026-07-27
5L ✓
74LS163
/1CL
~CL
1
/1CL
OB6M
CLK
2
OB6M
DF0
A
3
DF0
DF1
B
4
DF1
DF2
C
5
DF2
DF3
D
6
DF3
+5V
P
7
+5V
/1LOAD
~LD
9
/1LOAD
+5V
T
10
+5V
$X1D
QD
11
$X1D
$X1C
QC
12
$X1C
$X1B
QB
13
$X1B
$X1A
QA
14
$X1A
$X1CA1 · -> 5M pins 7 (P) and 10 (T) - ripple carry into the high counter
CA
15
$X1CA1
GND:8=GND VCC:16=+5V
5M — 74LS163: X counter high: preloads DF4-DF7 at /1LOAD, cleared at /1CL, clocked at OB6M like 5L. Enabled by 5L's carry on pins 7/10, and passes its own carry on to 5K - so 5L/5M/5K form one 9-bit X counter across the sprite line. — verified 2026-07-27
5M ✓
74LS163
/1CL
~CL
1
/1CL
OB6M
CLK
2
OB6M
DF4
A
3
DF4
DF5
B
4
DF5
DF6
C
5
DF6
DF7
D
6
DF7
$X1CA1 · <- 5L pin 15 CA
P
7
$X1CA1
/1LOAD
~LD
9
/1LOAD
$X1CA1 · <- 5L pin 15 CA
T
10
$X1CA1
$X1H
QD
11
$X1H
$X1G
QC
12
$X1G
$X1F
QB
13
$X1F
$X1E
QA
14
$X1E
$X1CA2 · -> 5K pins 7 (P) and 10 (T) - second stage of the ripple carry
CA
15
$X1CA2
GND:8=GND VCC:16=+5V
5K — 74LS163: X counter bit 8: preloads HOVER (the sprite X msb from 3/6) with B/C/D grounded, enabled by 5M's carry. Its QA is the 9th X bit, and it drives /CE on both buffer RAMs - so as soon as the counter walks past 255 the RAM is deselected and the sprite is clipped at the right-hand edge of the line. QB/QC/QD and CA are unused. — verified 2026-07-27
5K ✓
74LS163
/1CL
~CL
1
/1CL
OB6M
CLK
2
OB6M
HOVER · from 3/6
A
3
HOVER
GND
B
4
GND
GND
C
5
GND
GND
D
6
GND
$X1CA2 · <- 5M pin 15 CA
P
7
$X1CA2
/1LOAD
~LD
9
/1LOAD
$X1CA2 · <- 5M pin 15 CA
T
10
$X1CA2
$X1OVER · -> 3K and 4K pin 8 /CE. Unlabelled on the sheet; $X1OVER is our name. | the sheet annotates this wire as bit 8 of the address bus
QA
14
$X1OVER
GND:8=GND VCC:16=+5V
4M — 74LS86: Flip XOR high. (A) inputs 1/4/9/12 take 5M's QA-QD; (Y) outputs 3/6/8/11 become RAM address A4-A7. Together with 4L it mirrors all eight X bits under OBFLIP1. — verified 2026-07-27
4M ✓
74LS86
$X1E · <- 5M pin 14
A1
1
$X1E
OBFLIP1 · the sheet letters this bundle just FLIP; it is OBFLIP1, in from 4/6
B1
2
OBFLIP1
$X1F · <- 5M pin 13
A2
4
$X1F
OBFLIP1 · the sheet letters this bundle just FLIP; it is OBFLIP1, in from 4/6
B2
5
OBFLIP1
$X1G · <- 5M pin 12
A3
9
$X1G
OBFLIP1 · the sheet letters this bundle just FLIP; it is OBFLIP1, in from 4/6
B3
10
OBFLIP1
$X1H · <- 5M pin 11
A4
12
$X1H
OBFLIP1 · the sheet letters this bundle just FLIP; it is OBFLIP1, in from 4/6
B4
13
OBFLIP1
$BA4 · -> 3K/4K RAM address | the sheet annotates this address bus as bit indices 0-7, not by name
Y1
3
$BA4
$BA5 · -> 3K/4K RAM address | the sheet annotates this address bus as bit indices 0-7, not by name
Y2
6
$BA5
$BA6 · -> 3K/4K RAM address | the sheet annotates this address bus as bit indices 0-7, not by name
Y3
8
$BA6
$BA7 · -> 3K/4K RAM address | the sheet annotates this address bus as bit indices 0-7, not by name
Y4
11
$BA7
GND:7=GND VCC:14=+5V
4L — 74LS86: Flip XOR low. (A) inputs 1/4/9/12 take 5L's QA-QD; (Y) outputs 3/6/8/11 become RAM address A0-A3. OBFLIP1 on 2/5/10/13 inverts the four low X bits, so a horizontally flipped sprite walks its pixels into the line buffer backwards. — verified 2026-07-27
4L ✓
74LS86
$X1A
A1
1
$X1A
OBFLIP1 · the sheet letters this bundle just FLIP; it is OBFLIP1, in from 4/6
B1
2
OBFLIP1
$X1B
A2
4
$X1B
OBFLIP1 · the sheet letters this bundle just FLIP; it is OBFLIP1, in from 4/6
B2
5
OBFLIP1
$X1C
A3
9
$X1C
OBFLIP1 · the sheet letters this bundle just FLIP; it is OBFLIP1, in from 4/6
B3
10
OBFLIP1
$X1D
A4
12
$X1D
OBFLIP1 · the sheet letters this bundle just FLIP; it is OBFLIP1, in from 4/6
B4
13
OBFLIP1
$BA0 · the repaired stuck-low output | the sheet annotates this address bus as bit indices 0-7, not by name
Y1
3
$BA0
$BA1 · the sheet annotates this address bus as bit indices 0-7, not by name
Y2
6
$BA1
$BA2 · the sheet annotates this address bus as bit indices 0-7, not by name
Y3
8
$BA2
$BA3 · the sheet annotates this address bus as bit indices 0-7, not by name
Y4
11
$BA3
GND:7=GND VCC:14=+5V
3K — 2148H: Line RAM low nibble, 1K x 4. Address A0-A7 comes from the flip XORs 4L/4M, A8/A9 grounded, so only 256 locations are used - one per pixel across the line. /CE is the 9th X bit, so the sprite clips at the right edge. Its data pins sit on a shared read-modify-write bus with 1K's '257: the RAM drives it while the mux is tri-stated, the mux samples it on (B), then drives the chosen value back during /1WR. RA4/RA5 (1K x 4) hold the bus when nobody drives it. — verified 2026-07-27
3K ✓
2148H
$BA6 · the sheet annotates this address bus as bit indices 0-7, not by name
A6
1
$BA6
$BA5 · the sheet annotates this address bus as bit indices 0-7, not by name
A5
2
$BA5
$BA4 · the sheet annotates this address bus as bit indices 0-7, not by name
A4
3
$BA4
$BA3 · the sheet annotates this address bus as bit indices 0-7, not by name
A3
4
$BA3
$BA0 · the sheet annotates this address bus as bit indices 0-7, not by name
A0
5
$BA0
$BA1 · the sheet annotates this address bus as bit indices 0-7, not by name
A1
6
$BA1
$BA2 · the sheet annotates this address bus as bit indices 0-7, not by name
A2
7
$BA2
$X1OVER · <- 5K pin 14 QA - the 9th X bit deselects the RAM once the sprite runs off the line | the sheet annotates this wire as bit 8 of the address bus
~CE
8
$X1OVER
/1WR · from 4/6 - one wire shared with 4K pin 10
~WE
10
/1WR
$BD3 · <-> 1K pin 4, pulled up to +5 through RA4 (1K x 4), read by 3L
IO4
11
$BD3
$BD2 · <-> 1K pin 7, pulled up to +5 through RA4 (1K x 4), read by 3L
IO3
12
$BD2
$BD1 · <-> 1K pin 9, pulled up to +5 through RA4 (1K x 4), read by 3L
IO2
13
$BD1
$BD0 · <-> 1K pin 12, pulled up to +5 through RA4 (1K x 4), read by 3L
IO1
14
$BD0
GND
A9
15
GND
GND
A8
16
GND
$BA7 · the sheet annotates this address bus as bit indices 0-7, not by name
A7
17
$BA7
GND:9=GND VCC:18=+5V
4K — 2148H: Line RAM high nibble, 1K x 4. Shares everything with 3K - the same A0-A7 from the flip XORs, the same /CE from 5K's 9th X bit and the same /1WR on a single wire - so the pair behaves as one 256 x 8 line store, 3K holding the low nibble and 4K the high. Its data pins sit on the read-modify-write bus with 2K's '257. — verified 2026-07-27
4K ✓
2148H
$BA6 · the sheet annotates this address bus as bit indices 0-7, not by name
A6
1
$BA6
$BA5 · the sheet annotates this address bus as bit indices 0-7, not by name
A5
2
$BA5
$BA4 · the sheet annotates this address bus as bit indices 0-7, not by name
A4
3
$BA4
$BA3 · the sheet annotates this address bus as bit indices 0-7, not by name
A3
4
$BA3
$BA0 · the sheet annotates this address bus as bit indices 0-7, not by name
A0
5
$BA0
$BA1 · the sheet annotates this address bus as bit indices 0-7, not by name
A1
6
$BA1
$BA2 · the sheet annotates this address bus as bit indices 0-7, not by name
A2
7
$BA2
$X1OVER · <- 5K pin 14 QA - the 9th X bit deselects the RAM once the sprite runs off the line | the sheet annotates this wire as bit 8 of the address bus
~CE
8
$X1OVER
/1WR · from 4/6 - one wire shared with 3K pin 10
~WE
10
/1WR
$BD7 · <-> 2K pin 4, pulled up to +5 through RA5 (1K x 4), read by 3M
IO4
11
$BD7
$BD6 · <-> 2K pin 7, pulled up to +5 through RA5 (1K x 4), read by 3M
IO3
12
$BD6
$BD5 · <-> 2K pin 9, pulled up to +5 through RA5 (1K x 4), read by 3M
IO2
13
$BD5
$BD4 · <-> 2K pin 12, pulled up to +5 through RA5 (1K x 4), read by 3M
IO1
14
$BD4
GND
A9
15
GND
GND
A8
16
GND
$BA7 · the sheet annotates this address bus as bit indices 0-7, not by name
A7
17
$BA7
GND:9=GND VCC:18=+5V
1L — 74LS20: Transparency test / first-sprite priority. NANDs the low nibble read back from the RAM: all four bits high means pen 15, i.e. nothing has been written to that pixel yet, so the output drops and steers both write-back muxes to take the new sprite pixel. Any other value means an earlier sprite already owns the pixel and it is written straight back unchanged - so the first sprite to reach a pixel keeps it. Only one of the '20's two gates is drawn on this sheet. — verified 2026-07-27
1L ✓
74LS20
OB10
A
1
OB10
OB13
D
2
OB13
OB11
B
4
OB11
OB12
C
5
OB12
drawn on b1-6-linebuffer2 - click to jump there · OB21 · <- 10L
B
9
OB21
↗
drawn on b1-6-linebuffer2 - click to jump there · OB22 · <- 10L
C
10
OB22
↗
drawn on b1-6-linebuffer2 - click to jump there · OB20 · <- 10L
A
12
OB20
↗
drawn on b1-6-linebuffer2 - click to jump there · OB23 · <- 10L
D
13
OB23
↗
/$B1EMPTY · one wire to SEL on both 1K pin 1 and 2K pin 1
Y
6
/$B1EMPTY
drawn on b1-6-linebuffer2 - click to jump there · /$B2EMPTY · one wire to SEL on both 8L and 8M
Y
8
/$B2EMPTY
↗
GND:7=GND VCC:14=+5V
1K — 74LS257: Write-back mux, low nibble. (A) = COL0-COL3, the incoming sprite pixel; (B) = OB10-OB13, the value 3L latched out of the RAM; (Y) drives the RAM data bus. 1L's transparency test picks between them, so a pixel is only overwritten while the slot still reads as empty - first sprite wins. Tri-stated by /1ST so the RAM can drive the same bus during the read half. — verified 2026-07-27
1K ✓
74LS257
/$B1EMPTY · <- 1L pin 6, shared
SEL
1
/$B1EMPTY
COL3 · from 4/6
4A
2
COL3
OB13
4B
3
OB13
COL2 · from 4/6
3A
5
COL2
OB12
3B
6
OB12
OB11
2B
10
OB11
COL1 · from 4/6
2A
11
COL1
OB10
1B
13
OB10
COL0 · from 4/6
1A
14
COL0
/1ST · from 4/6 - one line to both muxes
~ST
15
/1ST
$BD3 · -> 3K pin 11 (shared bus, RA4 pull-up)
4Y
4
$BD3
$BD2 · -> 3K pin 12 (shared bus, RA4 pull-up)
3Y
7
$BD2
$BD1 · -> 3K pin 13 (shared bus, RA4 pull-up)
2Y
9
$BD1
$BD0 · -> 3K pin 14 (shared bus, RA4 pull-up)
1Y
12
$BD0
GND:8=GND VCC:16=+5V
2K — 74LS257: Write-back mux, high nibble. A sprite pixel is only six bits, so only (A) inputs 14 and 11 are used - COL4 and COL5 in from 3/6. Inputs 5 and 2 are left genuinely open (no trace on the board), so the buffer's top two bits are whatever the RA5 pull-ups give when a sprite writes. (B) takes OB14-OB17 back from 3M, (Y) drives the 4K data bus, and SEL and /1ST are shared with 1K so both nibbles switch together. — verified 2026-07-27
2K ✓
74LS257
/$B1EMPTY · <- 1L pin 6, shared
SEL
1
/$B1EMPTY
OB17
4B
3
OB17
OB16
3B
6
OB16
OB15
2B
10
OB15
COL5 · from 3/6
2A
11
COL5
OB14
1B
13
OB14
COL4 · from 3/6
1A
14
COL4
/1ST · from 4/6 - one line to both muxes
~ST
15
/1ST
$BD7 · -> 4K pin 11 (shared bus, RA5 pull-up)
4Y
4
$BD7
$BD6 · -> 4K pin 12 (shared bus, RA5 pull-up)
3Y
7
$BD6
$BD5 · -> 4K pin 13 (shared bus, RA5 pull-up)
2Y
9
$BD5
$BD4 · -> 4K pin 14 (shared bus, RA5 pull-up)
1Y
12
$BD4
GND:8=GND VCC:16=+5V
3L — 74LS174: Playback latch, low nibble. Registers the RAM data bus at L6MB and presents it as OB10-OB13 - the value the screen sees, the value 1K compares against on its (B) side, and (for 3L) the value 1L tests for transparency. Cleared each line by /1CL so stale pixels cannot leak through. Only four of the '174's six flip-flops are used. — verified 2026-07-27
3L ✓
74LS174
/1CL · from 4/6 - cleared at the start of every line (corrected 2026-07-27; was recorded as +5)
~CL
1
/1CL
$BD3 · <- shared RAM data bus (3K D pins / 1K (Y))
D1
3
$BD3
$BD2 · <- shared RAM data bus (3K D pins / 1K (Y))
D2
4
$BD2
$BD1 · <- shared RAM data bus (3K D pins / 1K (Y))
D3
6
$BD1
L6MB · from 4/6 - the buffered 6M pixel clock
CLK
9
L6MB
$BD0 · <- shared RAM data bus (3K D pins / 1K (Y))
D4
11
$BD0
OB13
Q1
2
OB13
OB12
Q2
5
OB12
OB11
Q3
7
OB11
OB10
Q4
10
OB10
GND:8=GND VCC:16=+5V
3M — 74LS174: Playback latch, high nibble. Registers the RAM data bus at L6MB and presents it as OB14-OB17 - the value the screen sees, the value 2K compares against on its (B) side, and (for 3L) the value 1L tests for transparency. Cleared each line by /1CL so stale pixels cannot leak through. Only four of the '174's six flip-flops are used. — verified 2026-07-27
3M ✓
74LS174
/1CL · from 4/6 - cleared at the start of every line (corrected 2026-07-27; was recorded as +5)
~CL
1
/1CL
$BD7 · <- shared RAM data bus (4K D pins / 2K (Y))
D1
3
$BD7
$BD6 · <- shared RAM data bus (4K D pins / 2K (Y))
D2
4
$BD6
$BD5 · <- shared RAM data bus (4K D pins / 2K (Y))
D3
6
$BD5
L6MB · from 4/6 - the buffered 6M pixel clock
CLK
9
L6MB
$BD4 · <- shared RAM data bus (4K D pins / 2K (Y))
D4
11
$BD4
OB17
Q1
2
OB17
OB16
Q2
5
OB16
OB15
Q3
7
OB15
OB14
Q4
10
OB14
GND:8=GND VCC:16=+5V
2L — 74LS257: Buffer output mux, low nibble. (A) takes this sheet's own buffer from 3L, (B) takes the other buffer's from 6/6, and V1a on SEL flips between them every line - so one buffer is being played out to the screen while the other is being filled with the next line's sprites. /DISPTMa blanks the output outside the display window. Drives OBJ0-OBJ3 into 1M. Note the sheet numbers the mux channels 1-4 top to bottom, opposite to the datasheet. — verified 2026-07-27
2L ✓
74LS257
V1a · from 4/6 - one line to both 2L and 2M
SEL
1
V1a
OB13 · <- 3L (this buffer)
4A
2
OB13
OB23 · <- 6/6 (the other line buffer)
4B
3
OB23
OB12 · <- 3L (this buffer)
3A
5
OB12
OB22 · <- 6/6 (the other line buffer)
3B
6
OB22
OB21 · <- 6/6 (the other line buffer)
2B
10
OB21
OB11 · <- 3L (this buffer)
2A
11
OB11
OB20 · <- 6/6 (the other line buffer)
1B
13
OB20
OB10 · <- 3L (this buffer)
1A
14
OB10
/DISPTMa · from 4/6 - one line to both 2L and 2M
~ST
15
/DISPTMa
OBJ3 · -> 1M
4Y
4
OBJ3
OBJ2 · -> 1M
3Y
7
OBJ2
OBJ1 · -> 1M
2Y
9
OBJ1
OBJ0 · -> 1M
1Y
12
OBJ0
GND:8=GND VCC:16=+5V
2M — 74LS257: Buffer output mux, high nibble. (A) takes this sheet's own buffer from 3M, (B) takes the other buffer's from 6/6, and V1a on SEL flips between them every line - so one buffer is being played out to the screen while the other is being filled with the next line's sprites. /DISPTMa blanks the output outside the display window. Drives OBJ4-OBJ7 into 1M. Note the sheet numbers the mux channels 1-4 top to bottom, opposite to the datasheet. — verified 2026-07-27
2M ✓
74LS257
V1a · from 4/6 - one line to both 2L and 2M
SEL
1
V1a
OB17 · <- 3M (this buffer)
4A
2
OB17
OB27 · <- 6/6 (the other line buffer)
4B
3
OB27
OB16 · <- 3M (this buffer)
3A
5
OB16
OB26 · <- 6/6 (the other line buffer)
3B
6
OB26
OB25 · <- 6/6 (the other line buffer)
2B
10
OB25
OB15 · <- 3M (this buffer)
2A
11
OB15
OB24 · <- 6/6 (the other line buffer)
1B
13
OB24
OB14 · <- 3M (this buffer)
1A
14
OB14
/DISPTMa · from 4/6 - one line to both 2L and 2M
~ST
15
/DISPTMa
OBJ7 · -> 1M
4Y
4
OBJ7
OBJ6 · -> 1M
3Y
7
OBJ6
OBJ5 · -> 1M
2Y
9
OBJ5
OBJ4 · -> 1M
1Y
12
OBJ4
GND:8=GND VCC:16=+5V
1M — 74LS273: Final sprite output register, clocked at OB6M. Takes the eight bits the buffer muxes selected and presents them to the A board on CN-2 as OBJA-OBJH. Only OBJA-OBJF carry real data - a sprite pixel is six bits - and nothing on the A board reads OBJG or OBJH, which is why 2K's two spare mux inputs could be left open. Clear is tied high. — verified 2026-07-27
1M ✓
74LS273
+5V · clear tied high
~CL
1
+5V
OBJ0 · <- 2L/2M
D1
3
OBJ0
OBJ1 · <- 2L/2M
D2
4
OBJ1
OBJ2 · <- 2L/2M
D3
7
OBJ2
OBJ3 · <- 2L/2M
D4
8
OBJ3
OB6M · from 4/6
CLK
11
OB6M
OBJ4 · <- 2L/2M
D5
13
OBJ4
OBJ5 · <- 2L/2M
D6
14
OBJ5
OBJ6 · <- 2L/2M
D7
17
OBJ6
OBJ7 · <- 2L/2M
D8
18
OBJ7
OBJA · -> CN-2 D17
Q1
2
OBJA
OBJB · -> CN-2 C17
Q2
5
OBJB
OBJC · -> CN-2 D16
Q3
6
OBJC
OBJD · -> CN-2 C16
Q4
9
OBJD
OBJE · -> CN-2 D15
Q5
12
OBJE
OBJF · -> CN-2 C15
Q6
15
OBJF
OBJG · -> CN-2 D14. EXPLAINED, not a gap: the cable carries 8 sprite bits (manual p11 lists both pins) but a Commando sprite pixel is only 6 (4 colour + 2 palette), so nothing on the A board reads this line. Same two bits are the unconnected mux inputs on 2K/8M.
Q7
16
OBJG
OBJH · -> CN-2 C14. EXPLAINED, not a gap: the cable carries 8 sprite bits (manual p11 lists both pins) but a Commando sprite pixel is only 6 (4 colour + 2 palette), so nothing on the A board reads this line. Same two bits are the unconnected mux inputs on 2K/8M.
Q8
19
OBJH
GND:10=GND VCC:20=+5V