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 |