| Chase H.Q. | Routines | 
| Prev: C2E7 | Up: Map | Next: C8BE | 
|  | ||||
| draw_road | C452 | LD ($C8A4),SP | Self modify SP restore instruction | |
| C456 | XOR A | on_dirt_track = 0 | ||
| C457 | LD ($A248),A | |||
| C45A | LD ($C161),A | Self modify 'LD A,x' @ C160 to be zero (in draw_tunnel) | ||
| C45D | LD ($C890),A | Self modify 'LD A,x' @ C88F to be zero (tunnel related) | ||
| C460 | LD A,$03 | Self modify 'LD A,x' @ dr_c6d8 to be 3 | ||
| C462 | LD ($C6D9),A | |||
| C465 | LD IY,$E301 | IY = $E301 | ||
| C469 | LD A,$60 | C = $60 - IY[0] | ||
| C46B | SUB (IY+$00) | |||
| C46E | LD C,A | |||
| C46F | LD A,($A240) | Load road_buffer_offset into A | ||
| C472 | ADD A,$40 | Add 64 so it's the lanes data offset | ||
| C474 | LD IXl,A | IX = $EE00 | A | ||
| C476 | LD IXh,$EE | |||
| C479 | LD B,A | B = A | ||
| C47A | AND $01 | |||
| C47C | LD ($C6B3),A | $C6B3 = A & 1 | ||
| C47F | RR B | RR B twice | ||
| C481 | RR B | |||
| 
I'm debating whether $D0 here is an opcode. I'm currently thinking not.
 | ||||
| C483 | LD HL,$D010 | H = $D0, L = 16 | ||
| C486 | LD A,H | Copy $D0 to A | ||
| C487 | LD B,$55 | B = $55 -- Zero this and the landscape goes blank but only half the time | ||
| C489 | JR C,dr_c48f | If B carried out (earlier) then jump | ||
| C48B | LD HL,$0030 | H = $00, L = 48 | ||
| C48E | LD B,H | Copy $00 to B | ||
| dr_c48f | C48F | LD ($C6D4),A | Self modify 'XOR x' @ C6D3 to be x = $D0 | |
| C492 | LD A,H | Self modify 'ADD A,x' @ C677 to be x = $D0 or x = $00 | ||
| C493 | LD ($C678),A | |||
| C496 | LD A,L | Self modify 'ADD A,x' @ C651 to be x = $10 or x = $30 | ||
| C497 | LD ($C652),A | |||
| C49A | INC A | Self modify 'ADD A,x' @ C698 to be x = $11 or x = $31 | ||
| C49B | LD ($C699),A | |||
| C49E | LD HL,$C534 | Self modify 'JP Z,x' @ C4B2 to be dr_c534 | ||
| C4A1 | LD ($C4B3),HL | |||
| C4A4 | LD L,$FF | L = $FF | ||
| C4A6 | LD DE,$0100 | DE = $0100 | ||
| C4A9 | LD A,B | A = B | ||
| C4AA | LD ($C6BD),A | Self modify 'LD A,x' @ C6BC to be zero? | ||
| 
This entry point is used by the routine at dr_c598.
 | ||||
| dr_c4ad | C4AD | LD A,(IX+$00) | A = IX[0] & 3 -- lanes byte & 3 | |
| C4B0 | AND $03 | |||
| C4B2 | JP Z,dr_c534 | Jump to <self modified> if zero | ||
| C4B5 | EXX | Bank | ||
| C4B6 | LD L,(IX+$00) | L = IX[0] -- sampled IX=$EEFD $EEFE $EEFF $EE00 .. etc. | ||
| C4B9 | ADD A,$E7 | A += $E7 | ||
| C4BB | LD ($C643),A | Self modify 'LD H,x' @ C642 | ||
| C4BE | LD ($C5B4),A | Self modify 'LD H,x' @ C5B3 | ||
| C4C1 | LD H,A | H = A | ||
| C4C2 | SLA L | L <<= 1 | ||
| C4C4 | BIT 7,L | New bit 7 set? | ||
| C4C6 | JR NZ,dr_c4e2 | Jump if set -- Forked road plotting path | ||
| C4C8 | JR NC,dr_c4d1 | Old bit 7 was set? | ||
| C4CA | ADD A,$03 | A &= 3 | ||
| C4CC | LD C,$FD | C = $FD | ||
| C4CE | JP dr_c4d5 | Jump | ||
| dr_c4d1 | C4D1 | ADD A,$02 | A += 2 | |
| C4D3 | LD C,$FE | C = $FE | ||
| dr_c4d5 | C4D5 | LD ($C5DA),A | Self modify 'LD H,x' @ C5D9 | |
| C4D8 | LD ($C68B),A | Self modify 'LD H,x' @ dr_c68a | ||
| C4DB | LD A,C | A = C | ||
| C4DC | LD ($C5AD),A | Self modify 'LD B,x' @ C5AC | ||
| C4DF | JP $C2E7 | Exit via | ||
| dr_c4e2 | C4E2 | JR C,dr_c519 | -- Forked road plotting path | |
| C4E4 | LD C,$FF | C = $FF | ||
| C4E6 | LD H,$01 | H = 1 | ||
| C4E8 | BIT 4,L | Bit 4 set? | ||
| C4EA | JR NZ,dr_c4f0 | Jump if set | ||
| C4EC | BIT 3,L | Bit 3 set? | ||
| C4EE | JR Z,dr_c502 | Jump if clear | ||
| dr_c4f0 | C4F0 | LD A,IYl | A = IY.low -- tunnel size factor | |
| C4F2 | LD ($C15E),A | Self modify 'CP x' @ C15D | ||
| C4F5 | LD A,$01 | A = 1 | ||
| C4F7 | INC C | C++ | ||
| C4F8 | BIT 5,L | Bit 5 set? | ||
| C4FA | JR Z,dr_c4ff | Jump if clear | ||
| C4FC | DEC C | C-- | ||
| C4FD | INC A | A++ | ||
| C4FE | DEC H | H-- | ||
| dr_c4ff | C4FF | LD ($C161),A | Self modify 'LD A,x' @ C160 (in draw_tunnel) | |
| dr_c502 | C502 | LD A,H | A = H | |
| C503 | LD ($C890),A | Self modify 'LD A,x' @ C88F (tunnel related) | ||
| C506 | LD A,$EB | A = $EB | ||
| C508 | LD ($C5DA),A | Self modify 'LD H,x' @ C5D9 | ||
| C50B | LD ($C68B),A | Self modify 'LD H,x' @ dr_c68a | ||
| C50E | LD A,$FF | A = $FF | ||
| C510 | LD ($C5AD),A | Self modify 'LD B,x' @ C5AC | ||
| C513 | LD A,C | A = C | ||
| C514 | EXX | Bank/unbank | ||
| C515 | LD B,A | B = A | ||
| C516 | JP dr_c551 | Jump | ||
| dr_c519 | C519 | BIT 6,L | Bit 6 set? | |
| C51B | JP NZ,forked_road_plotter | Jump to forked_road_plotter if set | ||
| 
Non-forked path.
 | ||||
| C51E | LD A,L | A = L | ||
| C51F | AND $18 | A &= 24 | ||
| C521 | LD A,$00 | A = 0 | ||
| C523 | JR NZ,dr_c526 | Jump if non-zero | ||
| C525 | INC A | A++ | ||
| dr_c526 | C526 | LD ($A248),A | on_dirt_track = A | |
| C529 | LD A,$FF | A = $FF | ||
| C52B | LD ($C5AD),A | Self modify 'LD B,x' @ C5AC | ||
| C52E | LD HL,$C534 | |||
| C531 | JP dr_c54d | Jump forward | ||
| dr_c534 | C534 | EXX | Bank/unbank | |
| C535 | LD A,$E8 | A = $E8 | ||
| C537 | LD ($C643),A | Self modify 'LD H,x' @ C642 | ||
| C53A | LD ($C5B4),A | Self modify 'LD H,x' @ C5B3 | ||
| C53D | ADD A,$04 | A += 4 | ||
| C53F | LD ($C68B),A | Self modify 'LD H,x' @ dr_c68a | ||
| C542 | LD ($C5DA),A | Self modify 'LD H,x' @ C5D9 | ||
| C545 | LD A,$FC | A = $FC | ||
| C547 | LD ($C5AD),A | Self modify 'LD B,x' @ C5AC | ||
| C54A | LD HL,$C551 | |||
| 
This entry point is used by the routine at C2E7.
 | ||||
| dr_c54d | C54D | LD ($C4B3),HL | Self modify 'JP Z,x' @ C4B2 | |
| C550 | EXX | Bank/unbank | ||
| dr_c551 | C551 | LD A,B | A = B | |
| C552 | AND A | Set flags | ||
| C553 | JP NZ,dr_c598 | Jump if non-zero | ||
| C556 | EXX | Bank/unbank | ||
| C557 | LD HL,$C55F | Self modify 'JP NZ,x' @ C6AD to be C55F | ||
| C55A | LD ($C6AE),HL | |||
| C55D | EXX | Bank/unbank | ||
| C55E | EX AF,AF' | |||
| C55F | LD A,D | A = D | ||
| C560 | DEC D | D-- | ||
| C561 | AND $0F | A &= 15 | ||
| C563 | JR Z,dr_c58a | Jump if zero | ||
| 
This entry point is used by the routine at dr_c58a.
 | ||||
| dr_c565 | C565 | LD ($C56D),DE | Self modify 'LD DE,x' @ C56C (below) | |
| C569 | LD B,$FF | B = $FF | ||
| C56B | EXX | Bank/unbank | ||
| 
Calculate address of next bitmap scanline ??
 | ||||
| C56C | LD DE,$0000 | DE = <self modified> | ||
| C56F | LD A,E | L = E + 31 | ||
| C570 | ADD A,$1F | |||
| C572 | LD L,A | |||
| C573 | LD H,D | H = D | ||
| C574 | LD SP,HL | Put it in SP (so we can use PUSH for speed) | ||
| C575 | LD HL,$0000 | HL = 0 [not self modified apparently] | ||
| C578 | LD C,L | C = L | ||
| C579 | JP dr_c62e | Jump into a sequence of 15 PUSH HLs | ||
| 
smells like scanline/buffer pointer movement
 | ||||
| dr_c57c | C57C | LD A,E | E -= 32 | |
| C57D | SUB $20 | |||
| C57F | LD E,A | |||
| C580 | JP C,dr_c5a7 | Jump if it went -ve | ||
| C583 | LD A,D | D += 16 | ||
| C584 | ADD A,$10 | |||
| C586 | LD D,A | |||
| C587 | JP dr_c5a7 | jump | ||
| 
smells like scanline/buffer pointer movement
 | ||||
| dr_c58a | C58A | LD A,E | E -= 32 | |
| C58B | SUB $20 | |||
| C58D | LD E,A | |||
| C58E | JP C,dr_c565 | Jump if it went -ve | ||
| C591 | LD A,D | D += 16 | ||
| C592 | ADD A,$10 | |||
| C594 | LD D,A | |||
| C595 | JP dr_c565 | jump | ||
| 
Road and backdrop plotting
 | ||||
| dr_c598 | C598 | EXX | Bank | |
| C599 | LD HL,$C5A1 | Self modify 'JP NZ,x' @ C6AD to be C5A1 | ||
| C59C | LD ($C6AE),HL | |||
| C59F | EXX | Unbank | ||
| C5A0 | EX AF,AF' | |||
| C5A1 | LD A,D | A = D | ||
| C5A2 | DEC D | D-- | ||
| C5A3 | AND $0F | A &= 15 | ||
| C5A5 | JR Z,dr_c57c | Jump if zero | ||
| 
This entry point is used by the routine at dr_c57c.
 | ||||
| dr_c5a7 | C5A7 | LD ($C5FA),DE | Self modify 'LD DE,x' @ C5F9 | |
| C5AB | LD A,L | A = L | ||
| C5AC | LD B,$00 | B = <self modified> | ||
| C5AE | EXX | Bank | ||
| C5AF | LD L,A | L = A | ||
| C5B0 | LD BC,$10F8 | B = 16, C = $F8 (mask) | ||
| C5B3 | LD H,$E8 | Self modified | ||
| C5B5 | LD A,(HL) | A = *HL | ||
| C5B6 | AND A | Set flags | ||
| C5B7 | JP Z,dr_c5c4 | Jump if zero | ||
| C5BA | LD A,$00 | A = 0 (not self modified) | ||
| C5BC | JP M,dr_c5d3 | Jump if negative | ||
| C5BF | LD A,$0F | A = 15 | ||
| C5C1 | JP dr_c5d3 | Jump | ||
| 
Pattern
 | ||||
| dr_c5c4 | C5C4 | DEC L | A = HL[-1] | |
| C5C5 | LD A,(HL) | |||
| C5C6 | INC L | |||
| C5C7 | AND C | A &= C -- C is the mask $F8 here | ||
| C5C8 | RRCA | A >>= 3 | ||
| C5C9 | RRCA | |||
| C5CA | RRCA | |||
| C5CB | RRA | A >>= 1 | ||
| C5CC | ADC A,$00 | Add carry | ||
| C5CE | CP B | Jump if A < B | ||
| C5CF | JP C,dr_c5d3 | |||
| C5D2 | DEC A | A-- | ||
| dr_c5d3 | C5D3 | LD E,A | E = A | |
| C5D4 | CPL | A = ~A + B | ||
| C5D5 | ADD A,B | |||
| C5D6 | LD ($C62D),A | Self modify 'JR x' @ draw_road_2 -- jump table target | ||
| C5D9 | LD H,$EC | H = $EC | ||
| C5DB | LD A,(HL) | A = *HL | ||
| C5DC | AND A | Set flags | ||
| C5DD | JP Z,dr_c5e9 | Jump if zero | ||
| C5E0 | LD A,$0F | A = 15 | ||
| C5E2 | JP P,dr_c5f0 | Jump if positive | ||
| C5E5 | XOR A | A = 0 | ||
| C5E6 | JP dr_c5f0 | Jump | ||
| 
Same pattern again
 | ||||
| dr_c5e9 | C5E9 | DEC L | L-- | |
| C5EA | LD A,(HL) | A = *HL & C -- C is the mask $F8 here | ||
| C5EB | AND C | |||
| C5EC | RRCA | A >>= 3 | ||
| C5ED | RRCA | |||
| C5EE | RRCA | |||
| C5EF | RRA | A >>= 1 | ||
| dr_c5f0 | C5F0 | LD ($C60B),A | Self modify 'JR x' @ draw_road_0 -- jump table target | |
| C5F3 | CPL | A = ~A + B + E | ||
| C5F4 | ADD A,B | |||
| C5F5 | ADD A,E | |||
| C5F6 | LD ($C61C),A | Self modify 'JR x' @ draw_road_1 -- jump table target | ||
| C5F9 | LD DE,$0000 | DE = <self modified> | ||
| C5FC | LD A,E | L = E + 31 | ||
| C5FD | ADD A,$1F | |||
| C5FF | LD L,A | |||
| C600 | LD H,D | H = D | ||
| C601 | LD SP,HL | Put it in SP (so we can use PUSH for speed) | ||
| C602 | EX AF,AF' | Bank | ||
| C603 | RLCA | A <<= 1 | ||
| C604 | LD H,A | H = A | ||
| C605 | LD L,A | L = A | ||
| C606 | EX AF,AF' | Unbank | ||
| C607 | LD BC,$0000 | BC = 0 | ||
| draw_road_0 | C60A | JR draw_road_0 | Jump table (self modified) | |
| C60C | PUSH HL | |||
| C60D | PUSH HL | |||
| C60E | PUSH HL | |||
| C60F | PUSH HL | |||
| C610 | PUSH HL | |||
| C611 | PUSH HL | |||
| C612 | PUSH HL | |||
| C613 | PUSH HL | |||
| C614 | PUSH HL | |||
| C615 | PUSH HL | |||
| C616 | PUSH HL | |||
| C617 | PUSH HL | |||
| C618 | PUSH HL | |||
| C619 | PUSH HL | |||
| C61A | PUSH HL | |||
| draw_road_1 | C61B | JR draw_road_1 | Jump table (self modified) | |
| C61D | PUSH BC | |||
| C61E | PUSH BC | |||
| C61F | PUSH BC | |||
| C620 | PUSH BC | |||
| C621 | PUSH BC | |||
| C622 | PUSH BC | |||
| C623 | PUSH BC | |||
| C624 | PUSH BC | |||
| C625 | PUSH BC | |||
| C626 | PUSH BC | |||
| C627 | PUSH BC | |||
| C628 | PUSH BC | |||
| C629 | PUSH BC | |||
| C62A | PUSH BC | |||
| C62B | PUSH BC | |||
| draw_road_2 | C62C | JR draw_road_2 | Jump table (self modified) | |
| 
This entry point is used by the routine at draw_road.
 | ||||
| dr_c62e | C62E | PUSH HL | ||
| C62F | PUSH HL | |||
| C630 | PUSH HL | |||
| C631 | PUSH HL | |||
| C632 | PUSH HL | |||
| C633 | PUSH HL | |||
| C634 | PUSH HL | |||
| C635 | PUSH HL | |||
| C636 | PUSH HL | |||
| C637 | PUSH HL | |||
| C638 | PUSH HL | |||
| C639 | PUSH HL | |||
| C63A | PUSH HL | |||
| C63B | PUSH HL | |||
| C63C | PUSH HL | |||
| C63D | LD B,E | B = E | ||
| C63E | DEC C | C-- | ||
| C63F | LD H,$E4 | H = $E4 -- point at $E4xx - road edge/markings table | ||
| C641 | EXX | Bank/unbank | ||
| C642 | LD H,$E8 | H = <self modified> -- seems to receive $E8 $E9 $EA (left, centre left, centre tables) | ||
| C644 | LD A,(HL) | A = *HL | ||
| C645 | AND A | Jump if non-zero | ||
| C646 | JR NZ,dr_c667 | |||
| C648 | DEC L | A = HL[-1] | ||
| C649 | LD A,(HL) | |||
| C64A | INC L | |||
| C64B | EXX | Bank/unbank | ||
| 
Build address of road edge marking graphic.
 
Bottom three bits select the row.
 | ||||
| C64C | LD E,A | Save index | ||
| C64D | AND $07 | A = (A & 7) * 4 | ||
| C64F | RLCA | |||
| C650 | RLCA | |||
| C651 | ADD A,$00 | A += <self modifed> -- set to one of $10 $30 $50 $70 $90 $B0 - offset of the current edge graphic | ||
| C653 | LD L,A | Set road/edge markings address | ||
| 
Top five bits select screen buffer addr?
 
If I break this it seems to affect the left hand side only.
 | ||||
| C654 | LD A,E | E = ((index >> 3) & 31) + B | ||
| C655 | RRA | |||
| C656 | RRA | |||
| C657 | RRA | |||
| C658 | AND $1F | |||
| C65A | ADD A,B | |||
| C65B | LD E,A | |||
| 
AND-OR masking here. DE is address of screen buffer byte HL is address of mask byte, followed by bitmap byte [then again since the edges are 16x8]
 | ||||
| C65C | LD A,(DE) | Read a screen buffer byte | ||
| C65D | AND (HL) | Apply the mask | ||
| C65E | INC L | Advance to bitmap byte | ||
| C65F | OR (HL) | Apply the bitmap | ||
| C660 | LD (DE),A | Write the new screen buffer byte | ||
| C661 | INC L | L += 2 | ||
| C662 | INC L | |||
| C663 | INC E | E++ | ||
| C664 | LDI | *DE++ = *HL++, BC-- | ||
| C666 | EXX | Bank/unbank | ||
| dr_c667 | C667 | INC B | B++ -- counter? | |
| C668 | JR Z,dr_c68a | Jump if zero -- exit? | ||
| C66A | INC H | H++ | ||
| C66B | LD A,(HL) | A = *HL | ||
| C66C | AND A | Set flags | ||
| C66D | JR NZ,dr_c667 | Jump if non-zero | ||
| C66F | DEC L | A = HL[-1] | ||
| C670 | LD A,(HL) | |||
| C671 | INC L | |||
| C672 | EXX | Bank/unbank | ||
| C673 | LD E,A | E = A -- save A | ||
| C674 | AND $07 | L = ((A & 7) << 1) + <self modified> | ||
| C676 | RLCA | |||
| C677 | ADD A,$00 | |||
| C679 | LD L,A | |||
| C67A | LD A,E | E = ((E >> 3) & 31) + B | ||
| C67B | RRA | |||
| C67C | RRA | |||
| C67D | RRA | |||
| C67E | AND $1F | |||
| C680 | ADD A,B | |||
| C681 | LD E,A | |||
| C682 | LDI | *DE++ = *HL++, BC-- | ||
| 
This reads a road edge byte from $E4xx.
 | ||||
| C684 | LD A,(HL) | A = *HL | ||
| C685 | LD (DE),A | *DE = A | ||
| C686 | EXX | Bank/unbank | ||
| C687 | JP dr_c667 | Jump -- looks like a loop | ||
| dr_c68a | C68A | LD H,$00 | H = <self modified> | |
| C68C | LD A,(HL) | A = *HL | ||
| C68D | DEC L | L-- | ||
| C68E | AND A | Set flags | ||
| C68F | JR NZ,dr_c6ab | Jump if non-zero | ||
| C691 | LD A,(HL) | A = *HL | ||
| C692 | EXX | Bank/unbank | ||
| C693 | LD E,A | E = A -- save A | ||
| 
Must be the right hand edge handling.
 | ||||
| C694 | AND $07 | L = ((A & 7) << 2) + <self modified> -- as above but * 4 | ||
| C696 | RLCA | |||
| C697 | RLCA | |||
| C698 | ADD A,$11 | |||
| C69A | LD L,A | |||
| C69B | LD A,E | E = ((E >> 3) & 31) + B | ||
| C69C | RRA | |||
| C69D | RRA | |||
| C69E | RRA | |||
| C69F | AND $1F | |||
| C6A1 | ADD A,B | |||
| C6A2 | LD E,A | |||
| C6A3 | LDI | *DE++ = *HL++, BC-- | ||
| 
AND-OR masking here. This affects road lines when altered.
 | ||||
| C6A5 | LD A,(DE) | A = *DE & *HL | ||
| C6A6 | AND (HL) | |||
| C6A7 | INC L | L++ | ||
| C6A8 | OR (HL) | *DE = A | *HL | ||
| C6A9 | LD (DE),A | |||
| C6AA | EXX | Bank/unbank | ||
| dr_c6ab | C6AB | DEC L | L-- | |
| C6AC | DEC C | C-- | ||
| C6AD | JP NZ,$0000 | Jump to <self modified> if non-zero | ||
| C6B0 | EX AF,AF' | Swap | ||
| C6B1 | LD B,A | B = A | ||
| dr_c6b2 | C6B2 | LD A,$00 | A = <self modified> | |
| C6B4 | XOR $01 | A ^= 1 | ||
| C6B6 | LD ($C6B3),A | Self modify above | ||
| C6B9 | JP NZ,dr_c6d8 | Jump if non-zero | ||
| C6BC | LD A,$00 | A = <self modified> ^ 0x55 | ||
| C6BE | XOR $55 | |||
| C6C0 | LD ($C6BD),A | Self modify above | ||
| C6C3 | LD B,A | B = A | ||
| 
This causes the road edge stripes.
 | ||||
| C6C4 | LD A,($C652) | Toggle bit 5 of x in 'ADD A,x' @ C651 -- switch between adjacent edge graphics | ||
| C6C7 | XOR $20 | |||
| C6C9 | LD ($C652),A | |||
| C6CC | INC A | A++ | ||
| C6CD | LD ($C699),A | Self modify 'ADD A,x' @ C698 | ||
| C6D0 | LD A,($C678) | Toggle <self modified> bits of 'ADD A,x' @ C677 | ||
| C6D3 | XOR $00 | |||
| C6D5 | LD ($C678),A | |||
| dr_c6d8 | C6D8 | LD A,$00 | A = <self modified> -- self modified below | |
| C6DA | DEC A | A-- | ||
| C6DB | LD ($C6D9),A | Self modify 'LD A' @ dr_c6d8 to be new A [above] | ||
| C6DE | JP NZ,dr_c703 | Jump if non-zero | ||
| C6E1 | LD A,($C6D4) | Read 'XOR x' @ C6D3 | ||
| C6E4 | ADD A,$10 | A += 16 | ||
| C6E6 | JR C,dr_c703 | Jump if carried | ||
| C6E8 | LD ($C6D4),A | Self modify 'XOR x' @ C6D3 to be new A | ||
| C6EB | LD C,A | C = A | ||
| C6EC | LD A,($C678) | Read 'ADD A,x' @ C677 | ||
| C6EF | AND A | Set flags | ||
| C6F0 | JR Z,dr_c6f6 | Jump if zero | ||
| C6F2 | LD A,C | A = C | ||
| C6F3 | LD ($C678),A | Self modify 'ADD A,x' @ C677 | ||
| dr_c6f6 | C6F6 | LD A,($C652) | Increment x in 'ADD A,x' @ C651 by 64 -- next road edge graphic? | |
| C6F9 | ADD A,$40 | |||
| C6FB | LD ($C652),A | |||
| C6FE | LD A,$05 | Self modify 'LD A,x' @ dr_c6d8 to be 5 | ||
| C700 | LD ($C6D9),A | |||
| dr_c703 | C703 | LD A,(IY+$00) | A = IY[0] | |
| C706 | INC IY | IY++ | ||
| C708 | INC IXl | IX.low++ | ||
| C70A | SUB (IY+$00) | A -= IY[0] | ||
| C70D | JR Z,dr_c715 | Jump if zero | ||
| C70F | JP P,dr_c794 | Jump if positive | ||
| C712 | JP dr_c746 | Jump | ||
| dr_c715 | C715 | DEC L | L -= 2 | |
| C716 | DEC L | |||
| C717 | LD C,(IX+$00) | C = IX[0] | ||
| C71A | BIT 6,C | Bit 6 of C set? | ||
| C71C | JP Z,dr_c6b2 | Jump if clear | ||
| C71F | BIT 7,C | Bit 7 of C set? | ||
| C721 | JP NZ,dr_c6b2 | Jump if set | ||
| C724 | LD B,$FF | B = 255 | ||
| C726 | BIT 2,C | Bit 2 of C set? | ||
| C728 | LD A,$01 | A = 1 | ||
| C72A | JR Z,dr_c740 | Jump if clear | ||
| C72C | LD A,IYl | A = IY.low -- tunnel size factor | ||
| C72E | LD ($C15E),A | Self modify 'CP x' @ C15D [15 when tunnel is small, 6 when fills screen] | ||
| C731 | LD A,$01 | A = 1 | ||
| C733 | INC B | B++ | ||
| C734 | BIT 4,C | Bit 4 of C set? | ||
| C736 | LD C,A | C = A | ||
| C737 | JR Z,dr_c73c | Jump if clear | ||
| C739 | DEC B | B-- | ||
| C73A | INC A | A++ | ||
| C73B | DEC C | C-- | ||
| dr_c73c | C73C | LD ($C161),A | Self modify 'LD A,x' @ C160 (in draw_tunnel) | |
| C73F | LD A,C | A = C | ||
| dr_c740 | C740 | LD ($C890),A | Self modify 'LD A,x' @ C88F (tunnel related) | |
| C743 | JP dr_c6b2 | Jump | ||
| 
Variation:
 | ||||
| dr_c746 | C746 | LD C,(IX+$00) | C = IX[0] | |
| C749 | BIT 6,C | Bit 6 of C set? | ||
| C74B | JP Z,dr_c774 | Jump if clear | ||
| C74E | BIT 7,C | Bit 7 of C set? | ||
| C750 | JP NZ,dr_c774 | Jump if set | ||
| C753 | EX AF,AF' | Swap | ||
| C754 | LD B,$FF | B = 255 | ||
| C756 | BIT 2,C | Bit 2 of C set? | ||
| C758 | LD A,$01 | A = 1 | ||
| C75A | JR Z,dr_c770 | Jump if clear | ||
| C75C | LD A,IYl | A = IY.low -- tunnel size factor | ||
| C75E | LD ($C15E),A | Self modify 'CP x' @ C15D [15 when tunnel is small, 6 when fills screen] | ||
| C761 | LD A,$01 | A = 1 | ||
| C763 | INC B | B++ | ||
| C764 | BIT 4,C | Bit 4 of C set? | ||
| C766 | LD C,A | C = A | ||
| C767 | JR Z,dr_c76c | Jump if clear | ||
| C769 | DEC B | B-- | ||
| C76A | INC A | A++ | ||
| C76B | DEC C | C-- | ||
| dr_c76c | C76C | LD ($C161),A | Self modify 'LD A,x' @ C160 (in draw_tunnel) | |
| C76F | LD A,C | A = C | ||
| dr_c770 | C770 | LD ($C890),A | Self modify 'LD A,x' @ C88F (tunnel related) | |
| C773 | EX AF,AF' | Swap | ||
| dr_c774 | C774 | LD C,A | C = A | |
| C775 | LD A,(IY+$00) | A = IY[0] | ||
| C778 | INC IY | IY++ | ||
| C77A | INC IXl | IX.low++ | ||
| C77C | SUB (IY+$00) | A -= IY[0] | ||
| C77F | CP $E0 | Compare to $E0 | ||
| C781 | JP NC,dr_c788 | Jump if A >= $E0 | ||
| C784 | CP $50 | Compare to $50 | ||
| C786 | JR NC,dr_c79a | Jump if A >= $50 | ||
| dr_c788 | C788 | DEC L | L -= 2 | |
| C789 | DEC L | |||
| C78A | ADD A,C | A += C | ||
| C78B | JR Z,dr_c746 | Jump if zero or negative | ||
| C78D | JP M,dr_c746 | |||
| C790 | LD C,A | C = A | ||
| C791 | JP dr_c4ad | Jump | ||
| dr_c794 | C794 | LD C,A | C = A | |
| C795 | CP $50 | Compare to $50 | ||
| C797 | JP C,dr_c4ad | Jump if A < $50 | ||
| dr_c79a | C79A | INC E | E++ | |
| C79B | LD HL,$C161 | Address of x in 'LD A,x' @ C160 (in draw_tunnel) | ||
| C79E | LD A,($C890) | Read 'LD A,x' @ C88F (tunnel related) | ||
| C7A1 | OR (HL) | A |= *HL | ||
| C7A2 | RRA | A >>= 1 | ||
| C7A3 | JP C,dr_start_sky_fill | Jump if carry | ||
| C7A6 | LD A,D | A = D | ||
| C7A7 | AND $0F | A &= 15 | ||
| C7A9 | LD C,A | C = A | ||
| C7AA | LD A,E | A = E | ||
| C7AB | SRL A | A >>= 1 | ||
| C7AD | ADD A,C | A += C | ||
| C7AE | CPL | A = ~A | ||
| C7AF | ADD A,$80 | A += $80 | ||
| C7B1 | LD B,A | B = A | ||
| C7B2 | LD HL,($A171) | HL = horizon_level | ||
| C7B5 | LD C,$18 | C = 24 | ||
| C7B7 | LD A,H | A = H | ||
| C7B8 | AND A | Set flags | ||
| C7B9 | JP M,dr_start_sky_fill | Jump if negative | ||
| C7BC | JR NZ,dr_c7ca | Jump if non-zero | ||
| C7BE | LD A,L | A = L | ||
| C7BF | SUB B | A -= B | ||
| C7C0 | JR NC,dr_c7ca | Jump if A was >= B | ||
| C7C2 | ADD A,C | A += C | ||
| C7C3 | JP NC,dr_start_sky_fill | Jump if no carry | ||
| C7C6 | JP Z,dr_start_sky_fill | Jump if zero | ||
| C7C9 | LD C,A | C = A | ||
| dr_c7ca | C7CA | LD A,C | A = C | |
| C7CB | LD ($C80C),A | Self modify xx in 'LD BC,$xxyy' @ C80A | ||
| C7CE | ADD A,B | A += B | ||
| C7CF | JP P,dr_c7db | Jump if positive | ||
| C7D2 | SUB $7F | A -= 127 | ||
| C7D4 | NEG | A = -A | ||
| C7D6 | ADD A,C | A += C | ||
| C7D7 | LD ($C80C),A | Self modify xx in 'LD BC,$xxyy' @ C80A | ||
| C7DA | LD C,A | C = A | ||
| dr_c7db | C7DB | LD A,C | A = 24 - C | |
| C7DC | CPL | |||
| C7DD | ADD A,$19 | |||
| C7DF | RLCA | A <<= 1 | ||
| C7E0 | LD C,A | C = A | ||
| C7E1 | RLCA | A <<= 2 | ||
| C7E2 | RLCA | |||
| C7E3 | ADD A,C | A += C | ||
| C7E4 | LD C,A | C = A | ||
| C7E5 | LD B,$00 | B = 0 | ||
| C7E7 | LD A,$00 | A = <self modified> -- horizon shift value (ranges 0..19) | ||
| C7E9 | RRA | A >>= 1 -- deciding whether to use the shifted or non shifted backdrop | ||
| C7EA | LD HL,$5B00 | Point at first hill backdrop (shifted version) | ||
| C7ED | JR NC,dr_c7f2 | Jump if no carry | ||
| C7EF | LD HL,$5C00 | Point at second hill backdrop | ||
| dr_c7f2 | C7F2 | ADD HL,BC | HL += BC | |
| C7F3 | EXX | Bank/unbank | ||
| C7F4 | ADD A,A | A = 18 - A * 2 | ||
| C7F5 | CPL | |||
| C7F6 | ADD A,$13 | |||
| C7F8 | LD ($C86D),A | Self modify 'JR x' @ dr_c86c -- jump table target | ||
| C7FB | LD E,A | DE = A | ||
| C7FC | LD D,$00 | |||
| C7FE | LD HL,$86F6 | Address of backdrop_shift_instrs | ||
| C801 | ADD HL,DE | HL += DE | ||
| C802 | LD BC,$0012 | BC = 18 | ||
| C805 | LD DE,$C82D | Address in instruction stream | ||
| C808 | LDIR | Copy | ||
| C80A | LD BC,$180A | BC = $<self modified>0A | ||
| C80D | EXX | Bank/unbank | ||
| C80E | LD A,L | A = L | ||
| C80F | EX AF,AF' | Swap | ||
| C810 | JP dr_c824 | Jump | ||
| 
Scanline advance pattern.
 | ||||
| dr_c813 | C813 | LD A,E | E -= 32 | |
| C814 | SUB $20 | |||
| C816 | LD E,A | |||
| C817 | JP C,dr_c82a | Jump if E < 32 | ||
| C81A | LD A,D | D -= 16 | ||
| C81B | ADD A,$10 | |||
| C81D | LD D,A | |||
| C81E | JP dr_c82a | |||
| dr_c821 | C821 | EXX | Bank/unbank | |
| C822 | EX AF,AF' | Swap | ||
| C823 | LD E,A | E = A | ||
| dr_c824 | C824 | LD A,D | A = D | |
| C825 | DEC D | D-- | ||
| C826 | AND $0F | A &= 15 | ||
| C828 | JR Z,dr_c813 | Jump if zero | ||
| 
This entry point is used by the routine at dr_c813.
 | ||||
| dr_c82a | C82A | LD A,E | A = E | |
| C82B | EX AF,AF' | Swap | ||
| C82C | LD L,A | L = A | ||
| C82D | NOP | 18 instructions/lines filled in by earlier code | ||
| C82E | NOP | |||
| C82F | NOP | |||
| C830 | NOP | |||
| C831 | NOP | |||
| C832 | NOP | |||
| C833 | NOP | |||
| C834 | NOP | |||
| C835 | NOP | |||
| C836 | NOP | |||
| C837 | NOP | |||
| C838 | NOP | |||
| C839 | NOP | |||
| C83A | NOP | |||
| C83B | NOP | |||
| C83C | NOP | |||
| C83D | NOP | |||
| C83E | NOP | |||
| C83F | LDI | |||
| C841 | LD L,A | |||
| C842 | LDI | |||
| C844 | LDI | |||
| C846 | LDI | |||
| C848 | LDI | |||
| C84A | LDI | |||
| C84C | LDI | |||
| C84E | LDI | |||
| C850 | LDI | |||
| C852 | LDI | |||
| C854 | LDI | |||
| C856 | LD L,A | |||
| C857 | LDI | |||
| C859 | LDI | |||
| C85B | LDI | |||
| C85D | LDI | |||
| C85F | LDI | |||
| C861 | LDI | |||
| C863 | LDI | |||
| C865 | LDI | |||
| C867 | LDI | |||
| C869 | LDI | |||
| C86B | LD L,A | |||
| dr_c86c | C86C | JR dr_c86c | Self modified - jump table | |
| C86E | LDI | |||
| C870 | LDI | |||
| C872 | LDI | |||
| C874 | LDI | |||
| C876 | LDI | |||
| C878 | LDI | |||
| C87A | LDI | |||
| C87C | LDI | |||
| C87E | LDI | |||
| C880 | EXX | |||
| C881 | ADD A,C | A += C | ||
| C882 | DJNZ dr_c821 | Loop? | ||
| C884 | EXX | Bank/unbank | ||
| C885 | EX AF,AF' | Swap | ||
| C886 | LD E,A | E = A | ||
| 
This entry point is used by the routine at dr_c598.
 | ||||
| dr_start_sky_fill | C887 | EX DE,HL | Swap | |
| C888 | LD A,L | L += 30 | ||
| C889 | ADD A,$1E | |||
| C88B | LD L,A | |||
| C88C | LD DE,$0000 | Fill value for blank sky | ||
| 
The following value is tunnel related: 1 if in tunnel, 0 if not.
 
It alternates fast when there is a partial tunnel on screen.
 | ||||
| C88F | LD A,$00 | A = <self modified> | ||
| C891 | AND A | Set flags | ||
| C892 | JP Z,dr_chose_colour | Jump if zero | ||
| 
In tunnel. Draw black scanlines for the sky instead of coloured.
 | ||||
| C895 | DEC DE | $0000 -> $FFFF | ||
| dr_chose_colour | C896 | LD C,$0F | Mask for later | |
| 
Decrement the screen address.
 | ||||
| dr_sky_fill_loop | C898 | LD A,H | Save H in A | |
| C899 | DEC H | Decrement row address | ||
| C89A | AND C | Extract low four bits of row address | ||
| C89B | JR NZ,dr_sky_fill_scanline | Jump to dr_sky_fill_scanline if non-zero (easy case) | ||
| 
Otherwise it was zero so will need extra work.
 | ||||
| C89D | LD A,L | Decrement high three bits of the row address | ||
| C89E | SUB $20 | |||
| C8A0 | LD L,A | |||
| C8A1 | JR NC,dr_sky_fill_fix_address | No carry, so ... | ||
| 
Exit.
 | ||||
| C8A3 | LD SP,$0000 | Restore original SP (self modified) | ||
| C8A6 | RET | Return | ||
| dr_sky_fill_fix_address | C8A7 | LD A,H | Didn't carry so fix H from earlier DEC H (1110xxxx -> 1111xxxx) | |
| C8A8 | ADD A,$10 | |||
| C8AA | LD H,A | |||
| 
Writes DE to HL 15 times filling the scanline. Draws the blank upper part of the sky. DE must always be zero? or what about tunnels?
 | ||||
| dr_sky_fill_scanline | C8AB | LD SP,HL | Put it in SP (so we can use PUSH for speed) | |
| C8AC | PUSH DE | Write 30 bytes of sky pixels | ||
| C8AD | PUSH DE | |||
| C8AE | PUSH DE | |||
| C8AF | PUSH DE | |||
| C8B0 | PUSH DE | |||
| C8B1 | PUSH DE | |||
| C8B2 | PUSH DE | |||
| C8B3 | PUSH DE | |||
| C8B4 | PUSH DE | |||
| C8B5 | PUSH DE | |||
| C8B6 | PUSH DE | |||
| C8B7 | PUSH DE | |||
| C8B8 | PUSH DE | |||
| C8B9 | PUSH DE | |||
| C8BA | PUSH DE | |||
| C8BB | JP dr_sky_fill_loop | Loop | ||
| Prev: C2E7 | Up: Map | Next: C8BE |