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 |