Prev: C2E7 Up: Map Next: C8BE
C452: Draws the road
Used by the routines at main_loop, cpu_driver and escape_scene.
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
This entry point is used by the routines at CBA4 and CBC5.
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