| Chase H.Q. | Routines |
| Prev: 9052 | Up: Map | Next: 924D |
|
Used by the routine at draw_overhead.
|
||||||||||
|
Entry point for left hand objects.
|
||||||||||
| draw_stretchy_object_left | 916C | LD HL,$9293 | HL = $9293 -- callback address | |||||||
| 916F | JR dso_common | |||||||||
|
Entry point for right hand objects.
|
||||||||||
| draw_stretchy_object_right | 9171 | LD HL,$92FC | HL = $92FC -- callback address | |||||||
| dso_common | 9174 | LD ($91CE),HL | Self modify CALL at $91CD to call HL | |||||||
| 9177 | LD ($9244),HL | Self modify CALL at $9243 to call HL | ||||||||
|
build A - an index into the road drawing tables.
See similar code at CD4D.
|
||||||||||
| 917A | LD A,($A23F) | A = fast_counter & $E0 -- top three bits | ||||||||
| 917D | AND $E0 | |||||||||
|
Scale 0..223 (in steps of 16) to 0..153, reducing A by 31.25%, mapping the incoming value to the 7x22 byte tables. So fast_counter indexes the rows of the table.
|
||||||||||
| 917F | LD L,A | Copy for reducing | ||||||||
| 9180 | RRC L | Divide A by 4 and subtract -- nothing will rotate out due to AND $E0 | ||||||||
| 9182 | RRC L | |||||||||
| 9184 | SUB L | |||||||||
| 9185 | RRC L | Divide A by 16 and subtract | ||||||||
| 9187 | RRC L | |||||||||
| 9189 | SUB L | |||||||||
| 918A | ADD A,B | B here must be an additional table offset | ||||||||
|
Look up that value in the vertical table.
|
||||||||||
| 918B | LD L,A | HL = $E600 + L | ||||||||
| 918C | LD H,$E6 | |||||||||
| 918E | LD A,(HL) | A = *HL | ||||||||
| 918F | LD ($91DC),A | Self modify 'LD A,x' at 91DB to load A | ||||||||
| 9192 | EX DE,HL | Swap | ||||||||
| 9193 | LD A,B | A = min(B,10) | ||||||||
| 9194 | CP $0A | |||||||||
| 9196 | JR C,draw_stretchy_object_left_0 | |||||||||
| 9198 | LD A,$0A | |||||||||
| draw_stretchy_object_left_0 | 919A | RLCA | DE = A * 2 - 1 -- the -1 accounts for later pointer position | |||||||
| 919B | DEC A | |||||||||
| 919C | LD E,A | |||||||||
| 919D | LD D,$00 | |||||||||
| 919F | LD C,D | C = 0 | ||||||||
| 91A0 | LD ($91BB),DE | Self modify 'LD BC,xxxx' at 91BA to load DE | ||||||||
| dso_loop | 91A4 | LD A,C | A = -C | |||||||
| 91A5 | NEG | |||||||||
| 91A7 | LD ($933E),A | Self modify 'LD D,x' @ draw_object_right_7 to load A | ||||||||
| 91AA | LD B,(HL) | B = *HL - 1 -- read count byte from graphic stream, e.g. stretchy_shortpole + 0 | ||||||||
| 91AB | DEC B | |||||||||
| 91AC | RET Z | Return if count byte was 1 (terminator) | ||||||||
| 91AD | INC HL | Advance past count byte | ||||||||
| 91AE | LD E,(HL) | Read address of ? data to DE, e.g. shortpole_7e0c | ||||||||
| 91AF | INC HL | |||||||||
| 91B0 | LD D,(HL) | |||||||||
| 91B1 | INC HL | |||||||||
| 91B2 | PUSH HL | Preserve HL, IX, BC | ||||||||
| 91B3 | PUSH IX | |||||||||
| 91B5 | PUSH BC | |||||||||
| 91B6 | EX DE,HL | Swap | ||||||||
| 91B7 | LD E,(HL) | DE = wordat(HL); HL++ -- this is the LOD pointer e.g. streetlampbody_lods | ||||||||
| 91B8 | INC HL | |||||||||
| 91B9 | LD D,(HL) | |||||||||
|
This seems to be a 0..9 value that selects from the table.
|
||||||||||
| 91BA | LD BC,$0000 | HL += <self modified> -- by 91A0, this is the table offset from earlier | ||||||||
| 91BD | ADD HL,BC | |||||||||
|
HL now points to an entry in the table. Load it. sampled DE = $717E (-> tree_lods), HL = $713E (first of a byte pair)
|
||||||||||
| 91BE | LD A,(HL) | A = *HL++ -- e.g. 0 | ||||||||
| 91BF | INC HL | |||||||||
| 91C0 | LD L,(HL) | HL = *HL -- e.g. $56 | ||||||||
| 91C1 | LD H,$00 | |||||||||
| 91C3 | ADD HL,DE | HL += DE -- so HL's an offset from streetlampbody_lods | ||||||||
| 91C4 | POP BC | Restore BC | ||||||||
| 91C5 | DEC B | B-- -- e.g. cmd byte 2 would be 0 after this | ||||||||
| 91C6 | JR NZ,dso_dispatch | Jump to dispatch for cmd bytes 3+ | ||||||||
|
Zero path => command byte was 2
|
||||||||||
| 91C8 | LD B,(HL) | B = *HL | ||||||||
| 91C9 | DEC HL | HL -= 2 | ||||||||
| 91CA | DEC HL | |||||||||
| 91CB | PUSH BC | Preserve BC | ||||||||
| 91CC | LD B,A | B = A | ||||||||
| 91CD | CALL draw_object_left_stretchy_entrypt | Call <self modified> -- callback | ||||||||
| dso_loop_perhaps | 91D0 | POP BC | Restore BC | |||||||
| 91D1 | LD A,C | C += B | ||||||||
| 91D2 | ADD A,B | |||||||||
| 91D3 | LD C,A | |||||||||
| 91D4 | POP IX | Restore IX, HL | ||||||||
| 91D6 | POP HL | |||||||||
| 91D7 | JP dso_loop | Loop dso_loop | ||||||||
|
Non-zero path
|
||||||||||
| dso_dispatch | 91DA | EX AF,AF' | Bank <byte[0] of table entry, loaded at 91BE> | |||||||
| 91DB | LD A,$00 | A = <self modified> | ||||||||
|
Dispatch ladder
|
||||||||||
| 91DD | DEC B | Jump if 3 | ||||||||
| 91DE | JR Z,dso_case_3 | |||||||||
| 91E0 | DEC B | Jump if 4 | ||||||||
| 91E1 | JR Z,dso_case_4 | |||||||||
| 91E3 | DEC B | Jump if 5 | ||||||||
| 91E4 | JR Z,dso_case_5 | |||||||||
| 91E6 | DEC B | Jump if 6 | ||||||||
| 91E7 | JR Z,dso_case_6 | |||||||||
| 91E9 | DEC B | Jump if 7 | ||||||||
| 91EA | JR Z,dso_case_7 | |||||||||
| 91EC | DEC B | Jump if 8 | ||||||||
| 91ED | JR Z,dso_case_8 | |||||||||
| 91EF | DEC B | Jump to continue if 9 | ||||||||
| 91F0 | JR Z,dso_continue | |||||||||
| 91F2 | ADD A,A | A += A | ||||||||
| 91F3 | JR dso_continue | Continue | ||||||||
| dso_case_8 | 91F5 | SRL A | A >>= 2 | |||||||
| 91F7 | SRL A | |||||||||
| 91F9 | JR dso_continue | Continue | ||||||||
| dso_case_7 | 91FB | SRL A | ||||||||
| 91FD | LD B,A | B = A | ||||||||
| 91FE | SRL B | |||||||||
| 9200 | ADD A,B | A += B | ||||||||
| 9201 | JR dso_continue | Continue | ||||||||
| dso_case_6 | 9203 | SRL A | ||||||||
| 9205 | LD B,A | B = A | ||||||||
| 9206 | SRL B | B >>= 2 | ||||||||
| 9208 | SRL B | |||||||||
| 920A | SUB B | A -= B | ||||||||
| 920B | JR dso_continue | Continue | ||||||||
| dso_case_5 | 920D | LD B,A | B = A | |||||||
| 920E | SRL B | B >>= 3 | ||||||||
| 9210 | SRL B | |||||||||
| 9212 | SRL B | |||||||||
| 9214 | ADD A,B | A += B | ||||||||
| 9215 | JR dso_continue | Continue | ||||||||
| dso_case_4 | 9217 | SRL A | ||||||||
| 9219 | JR dso_continue | Continue | ||||||||
| dso_case_3 | 921B | LD B,A | B = A | |||||||
| 921C | SRL B | |||||||||
| 921E | ADD A,B | A += B | ||||||||
| dso_continue | 921F | SUB C | A -= C | |||||||
| 9220 | JR Z,draw_stretchy_object_left_1 | |||||||||
| 9222 | JR NC,draw_stretchy_object_left_2 | C was >= A | ||||||||
| draw_stretchy_object_left_1 | 9224 | LD A,$01 | A = 1 | |||||||
| draw_stretchy_object_left_2 | 9226 | LD B,A | B = A | |||||||
| 9227 | PUSH BC | |||||||||
| 9228 | LD A,(IY+$35) | A = IY[$35] + 1 - C - B | ||||||||
| 922B | INC A | |||||||||
| 922C | SUB C | |||||||||
| 922D | SUB B | |||||||||
| 922E | JR NC,draw_stretchy_object_left_3 | |||||||||
| 9230 | ADD A,B | B += A | ||||||||
| 9231 | LD B,A | |||||||||
| draw_stretchy_object_left_3 | 9232 | LD A,B | A = B | |||||||
| 9233 | LD ($9405),A | *$9405 = A | ||||||||
| 9236 | LD A,(HL) | A = *HL | ||||||||
| 9237 | DEC HL | HL -= 2 | ||||||||
| 9238 | DEC HL | |||||||||
| 9239 | LD ($9416),A | *$9416 = A | ||||||||
| 923C | LD A,$02 | A = $02 | ||||||||
| 923E | LD ($93C1),A | Self modify 'LD A,x' @ 93C0 to load 2 | ||||||||
| 9241 | EX AF,AF' | |||||||||
| 9242 | LD B,A | B = A | ||||||||
| 9243 | CALL draw_object_left_stretchy_entrypt | Call <self modified> | ||||||||
| 9246 | XOR A | Self modify 'LD A,x' @ 93C0 to load 0 | ||||||||
| 9247 | LD ($93C1),A | |||||||||
| 924A | JP dso_loop_perhaps | Loop to dso_loop_perhaps | ||||||||
| Prev: 9052 | Up: Map | Next: 924D |