| Chase H.Q. | Routines |
| Prev: CBC5 | Up: Map | Next: CD3A |
|
Used by the routine at layout_road.
|
||||
|
This gets hit during road forks.
|
||||
| sub_cbce_fork | CBCE | LD HL,$EEEC | Load two table high-bytes: $EE, $EC | |
| CBD1 | LD DE,$44ED | $ED $44 => NEG instruction for CC21 & CC22 | ||
| CBD4 | JR sub_cbce_self_modify | |||
|
This entry point is used by the routine at layout_road.
This is the normal entry point?
|
||||
| sub_cbce_non_fork | CBD6 | LD HL,$EDE9 | Load two table high-bytes: $ED, $E9 | |
| CBD9 | LD DE,$0000 | Pair of NOP instructions for CC21 & CC22 | ||
| sub_cbce_self_modify | CBDC | LD ($CC21),DE | Write instructions in DE to CC21 & CC22 | |
| CBE0 | LD A,H | Self modify 'LD HL' @ CC70 to load ($<H>00) | ||
| CBE1 | LD ($CC72),A | |||
| CBE4 | LD A,L | Self modify 'LD HL' @ CCA5 to load ($<L>00) | ||
| CBE5 | LD ($CCA7),A | |||
| CBE8 | LD HL,($A240) | Load road_buffer_offset into HL | ||
| CBEB | LD C,(HL) | Read a curvature data byte | ||
|
There's similar code at CD47.
|
||||
| CBEC | LD A,($A23F) | A = fast_counter & $E0 -- top three bits | ||
| CBEF | AND $E0 | |||
| CBF1 | LD B,A | |||
|
Reduces A by 31.25% ... unsure why that figure.
|
||||
| CBF2 | RRC B | Divide A by 4 and subtract | ||
| CBF4 | RRC B | |||
| CBF6 | SUB B | |||
| CBF7 | RRC B | Divide A by 16 and subtract | ||
| CBF9 | RRC B | |||
| CBFB | SUB B | |||
| CBFC | ADD A,$B0 | IY = data_e6b0[A] | ||
| CBFE | LD IYl,A | |||
| CC00 | LD A,$E6 | |||
| CC02 | ADC A,$00 | |||
| CC04 | LD IYh,A | |||
| CC06 | CALL multiply | Call multiply (A = multiplier, C = multiplicand) | ||
| CC09 | NEG | A = (128 - A) & $FE | ||
| CC0B | ADD A,$80 | |||
| CC0D | AND $FE | |||
| CC0F | LD IXl,A | IX = $E500 + A -- point into inward_bend_table | ||
| CC11 | LD IXh,$E5 | |||
| CC14 | LD DE,$E320 | D = $E3, E = $20 | ||
| CC17 | LD B,$16 | 20 iterations | ||
| CC19 | EXX | Bank | ||
| CC1A | LD DE,($A26C) | Get road position | ||
| CC1E | PUSH DE | |||
| CC1F | EXX | Unbank | ||
| sub_cbce_fork_0 | CC20 | LD A,(HL) | Read road buffer byte | |
| CC21 | NOP | Self modified above - Set to NOP or NEG | ||
| CC22 | NOP | |||
| CC23 | INC L | Advance road buffer pointer (wrapping) | ||
| CC24 | EXX | Bank | ||
| CC25 | ADD A,IXl | IX.low += A -- point into distance shift table | ||
| CC27 | LD IXl,A | |||
| CC29 | LD HL,$0000 | HL = 0 -- not self modified | ||
| CC2C | LD A,(IX+$00) | Reads from the inward_bend_table table (inward_bend_table) | ||
|
Subtract DE from table entry, result in BC.
|
||||
| CC2F | SUB E | C = A - E -- E is $20 here I think | ||
| CC30 | LD C,A | |||
| CC31 | LD A,(IX+$01) | high byte | ||
| CC34 | SBC A,D | A -= D | ||
| CC35 | LD B,A | B = A | ||
|
Sampled IY = E71E E71F E720 ..
|
||||
| CC36 | LD A,(IY+$00) | IY seems to point to $E6xx..E7xx | ||
| CC39 | INC IY | |||
|
This is a multiplier of HL (distance shift value computed above) by A (value from $E600+).
|
||||
| CC3B | ADD A,A | shift left | ||
| CC3C | JR NC,sub_cbce_fork_1 | top bit not set | ||
| CC3E | LD H,B | HL = BC copy of distance shift value | ||
| CC3F | LD L,C | |||
| CC40 | ADD HL,HL | shift result left. HL seems to be zeroed above, so this is confusing | ||
| sub_cbce_fork_1 | CC41 | ADD A,A | shift topmost bit out | |
| CC42 | JR NC,sub_cbce_fork_2 | jump if top bit not set | ||
| CC44 | ADD HL,BC | otherwise HL += BC | ||
| sub_cbce_fork_2 | CC45 | ADD HL,HL | repeat | |
| CC46 | ADD A,A | |||
| CC47 | JR NC,sub_cbce_fork_3 | |||
| CC49 | ADD HL,BC | |||
| sub_cbce_fork_3 | CC4A | ADD HL,HL | repeat | |
| CC4B | ADD A,A | |||
| CC4C | JR NC,sub_cbce_fork_4 | |||
| CC4E | ADD HL,BC | |||
| sub_cbce_fork_4 | CC4F | ADD HL,HL | repeat | |
| CC50 | ADD A,A | |||
| CC51 | JR NC,sub_cbce_fork_5 | |||
| CC53 | ADD HL,BC | |||
| sub_cbce_fork_5 | CC54 | ADD HL,HL | repeat | |
| CC55 | ADD A,A | |||
| CC56 | JR NC,sub_cbce_fork_6 | |||
| CC58 | ADD HL,BC | |||
| sub_cbce_fork_6 | CC59 | LD A,H | A = H | |
| CC5A | RL L | L <<= 1 | ||
| CC5C | LD H,$00 | H = 0 | ||
| CC5E | ADC A,H | A += H + carry | ||
| CC5F | LD L,A | L = A | ||
| CC60 | ADD A,A | A <<= 1 | ||
| CC61 | JR NC,sub_cbce_fork_7 | jump if top bit not set | ||
| CC63 | DEC H | H-- | ||
| sub_cbce_fork_7 | CC64 | RRA | A >>= 1 | |
| CC65 | ADD HL,DE | |||
| CC66 | EX DE,HL | |||
| CC67 | EXX | Unbank | ||
| CC68 | LD (DE),A | *DE++ = A | ||
| CC69 | INC E | |||
| CC6A | DJNZ sub_cbce_fork_0 | Loop back to read buffer byte bit | ||
| CC6C | POP DE | |||
| CC6D | LD B,$00 | |||
| CC6F | EXX | Bank | ||
| CC70 | LD HL,$ED00 | |||
| CC73 | CALL sub_cbce_fork_10 | subroutine | ||
| CC76 | LD A,($A23F) | A = fast_counter | ||
| CC79 | AND $E0 | take top three bits | ||
| CC7B | LD B,A | same pattern as above | ||
| CC7C | RRC B | |||
| CC7E | RRC B | |||
| CC80 | SUB B | |||
| CC81 | RRC B | |||
| CC83 | RRC B | |||
| CC85 | SUB B | |||
| CC86 | ADD A,$60 | |||
| CC88 | LD L,A | HL = $E700 | A | ||
| CC89 | LD H,$E7 | |||
| CC8B | JR NC,sub_cbce_fork_8 | Jump if A+$60 had no carry | ||
| CC8D | INC H | Add carry otherwise | ||
|
Converts the 20 bytes at $E320 to totals.
|
||||
| sub_cbce_fork_8 | CC8E | LD DE,$E320 | [points to presumed lanes data in pristine memory map but must be something else] | |
| CC91 | LD B,$16 | B = 20 | ||
| sub_cbce_fork_9 | CC93 | LD A,(DE) | *DE += *HL | |
|
This reads from $E760+ in sequence.
|
||||
| CC94 | ADD A,(HL) | |||
| CC95 | LD (DE),A | } | ||
| CC96 | INC HL | HL++ | ||
| CC97 | INC E | E++ | ||
| CC98 | DJNZ sub_cbce_fork_9 | Loop while B > 0 | ||
| CC9A | LD HL,($A26C) | HL = road position - 295 | ||
| CC9D | LD DE,$FED9 | |||
| CCA0 | ADD HL,DE | |||
| CCA1 | EX DE,HL | swap | ||
| CCA2 | LD B,$00 | B = 0 | ||
| CCA4 | EXX | Unbank | ||
| CCA5 | LD HL,$E900 | table? | ||
| sub_cbce_fork_10 | CCA8 | LD IY,$E300 | table? | |
| CCAC | LD B,$15 | B = 21 | ||
| CCAE | LD ($CCF5),SP | Save SP to restore on exit (self modify) | ||
| CCB2 | LD SP,HL | Put address in SP (so we can use POP for speed) | ||
| sub_cbce_fork_11 | CCB3 | EXX | Bank | |
| CCB4 | LD A,B | A = B - 2 | ||
| CCB5 | SUB $02 | |||
| CCB7 | ADD A,(IY+$00) | A += *IY | ||
| CCBA | INC IYl | IY++ | ||
| CCBC | SUB (IY+$00) | A -= *IY | ||
| CCBF | JP M,sub_cbce_fork_20 | |||
| CCC2 | ADD A,$02 | A += 2 | ||
| CCC4 | LD (IY+$4E),A | IY[$4E] = A | ||
| CCC7 | SUB B | A -= B | ||
| CCC8 | LD C,A | C = A | ||
| CCC9 | LD B,A | B = A | ||
| CCCA | LD L,(IY+$1F) | L = IY[$1F] | ||
| CCCD | BIT 7,L | test bit 7 of L | ||
| CCCF | JR Z,sub_cbce_fork_12 | jump if ? | ||
| CCD1 | LD A,L | L = -L | ||
| CCD2 | NEG | |||
| CCD4 | LD L,A | |||
| CCD5 | LD A,B | A = B | ||
| CCD6 | CP L | A < L ? | ||
| CCD7 | LD A,$1B | Opcode for DEC DE | ||
| CCD9 | JR C,sub_cbce_fork_17 | jump if A < L | ||
| CCDB | JP sub_cbce_fork_13 | |||
| sub_cbce_fork_12 | CCDE | CP L | A < L ? | |
| CCDF | LD A,$13 | Opcode for INC DE | ||
| CCE1 | JR C,sub_cbce_fork_17 | jump if A < L | ||
| sub_cbce_fork_13 | CCE3 | LD ($CCED),A | Self modify instruction below | |
| CCE6 | LD A,B | A = B | ||
| CCE7 | RRA | A >>= 1 | ||
| sub_cbce_fork_14 | CCE8 | ADD A,L | A += L | |
| CCE9 | CP C | A < C ? | ||
| CCEA | JR C,sub_cbce_fork_15 | jump if A < C | ||
| CCEC | SUB C | A -= C | ||
| CCED | INC DE | Self modified: INC DE or DEC DE | ||
| sub_cbce_fork_15 | CCEE | PUSH DE | ||
| CCEF | DJNZ sub_cbce_fork_14 | Loop while B > 0 | ||
| CCF1 | EXX | Unbank | ||
| CCF2 | DJNZ sub_cbce_fork_11 | Outer loop? | ||
| sub_cbce_fork_16 | CCF4 | LD SP,$0000 | Restore original SP (must be self modified) | |
| CCF7 | RET | Return | ||
| sub_cbce_fork_17 | CCF8 | LD ($CCFC),A | Self modify instruction below | |
| CCFB | XOR A | A = 0 | ||
| sub_cbce_fork_18 | CCFC | INC DE | Self modified: INC DE or DEC DE | |
| CCFD | ADD A,C | A += C | ||
| CCFE | JR C,sub_cbce_fork_19 | jump if overflow | ||
| CD00 | CP L | A < L ? | ||
| CD01 | JR C,sub_cbce_fork_18 | jump if A < L | ||
| sub_cbce_fork_19 | CD03 | SUB L | A -= L | |
| CD04 | PUSH DE | |||
| CD05 | DJNZ sub_cbce_fork_18 | Loop while B > 0 | ||
| CD07 | EXX | Bank | ||
| CD08 | DJNZ sub_cbce_fork_11 | Outer loop? | ||
| CD0A | JR sub_cbce_fork_16 | Exit | ||
| sub_cbce_fork_20 | CD0C | LD (IY+$4E),$01 | IY[$4E] = 1 | |
| CD10 | INC A | A++ | ||
| CD11 | JR Z,sub_cbce_fork_21 | |||
| CD13 | INC A | A++ | ||
| CD14 | LD B,A | B = A | ||
| CD15 | LD A,(IY+$1F) | A = IY[$1F] | ||
| CD18 | LD L,A | L = A | ||
| CD19 | ADD A,A | A <<= 1 | ||
| CD1A | SBC A,A | A = A - A - carry | ||
| CD1B | LD H,A | H = A | ||
| CD1C | ADD HL,DE | HL += DE | ||
| CD1D | EX DE,HL | swap | ||
| CD1E | PUSH DE | push | ||
| CD1F | EXX | Unbank | ||
| CD20 | DEC B | B-- | ||
| CD21 | JP NZ,sub_cbce_fork_11 | Outer loop? | ||
| CD24 | JP sub_cbce_fork_16 | Exit | ||
| sub_cbce_fork_21 | CD27 | LD B,A | B = A | |
| CD28 | LD A,(IY+$1F) | A = IY[$1F] | ||
| CD2B | LD L,A | L = A | ||
| CD2C | ADD A,A | A <<= 1 | ||
| CD2D | SBC A,A | A = A - A - carry | ||
| CD2E | LD H,A | H = A | ||
| CD2F | ADD HL,DE | HL += DE | ||
| CD30 | EX DE,HL | swap | ||
| CD31 | PUSH DE | push result? | ||
| CD32 | EXX | Bank | ||
| CD33 | DEC B | B-- | ||
| CD34 | JP NZ,sub_cbce_fork_11 | Outer loop? | ||
| CD37 | JP sub_cbce_fork_16 | Exit | ||
| Prev: CBC5 | Up: Map | Next: CD3A |