| Chase H.Q. | Routines |
| Prev: B549 | Up: Map | Next: B648 |
|
Used by the routine at animate_hero_car.
|
||||||||||
| draw_car | B58E | AND A | If A is zero (straight) then flip_car = 0 | |||||||
| B58F | JR NZ,dc_1 | |||||||||
| B591 | LD ($A251),A | |||||||||
| dc_1 | B594 | LD C,A | Preserve C (A from input) | |||||||
| B595 | PUSH BC | |||||||||
| B596 | LD HL,$CF8E | Point HL at hero_car_shadow then add (A * 4) | ||||||||
| B599 | RLCA | |||||||||
| B59A | RLCA | |||||||||
| B59B | LD C,A | |||||||||
| B59C | LD B,$00 | |||||||||
| B59E | ADD HL,BC | |||||||||
| B59F | LD DE,$7860 | D = $78 (vertical postion in rows), E = $60 (horizontal position in pixels) | ||||||||
| B5A2 | LD C,$07 | C = 7 | ||||||||
| B5A4 | CALL dc_draw | Call dc_draw to draw shadow | ||||||||
| B5A7 | POP BC | Restore C | ||||||||
|
117 is the car's normal vertical position. Smaller values make it higher.
|
||||||||||
| B5A8 | LD A,$75 | 117 - <self modified value $B5AB> == car jump offset | ||||||||
| B5AA | SUB $00 | |||||||||
| B5AC | LD D,A | D = A | ||||||||
|
Build an index into hero_car_refs[].
|
||||||||||
| B5AD | LD A,C | A = C (0/1/2, turn value from input) + B (counter value from input) + <self modified value $B5B0 == up/down facing (0/3/6 => level,up,down)> | ||||||||
| B5AE | ADD A,B | |||||||||
| B5AF | ADD A,$00 | |||||||||
| B5B1 | CP $09 | If A >= 9 A -= 9 -- clamping | ||||||||
| B5B3 | JR C,dc_2 | |||||||||
| B5B5 | SUB $09 | |||||||||
| dc_2 | B5B7 | LD HL,$CEDA | Point HL at hero_car_refs[A] (rows/entries are 20 bytes wide) | |||||||
| B5BA | ADD A,A | |||||||||
| B5BB | ADD A,A | |||||||||
| B5BC | LD C,A | |||||||||
| B5BD | ADD A,A | |||||||||
| B5BE | ADD A,A | |||||||||
| B5BF | ADD A,C | |||||||||
| B5C0 | LD C,A | |||||||||
| B5C1 | LD B,$00 | |||||||||
| B5C3 | ADD HL,BC | |||||||||
| B5C4 | PUSH DE | |||||||||
| B5C5 | LD A,($A22A) | A = car_y + *HL | ||||||||
| B5C8 | ADD A,(HL) | |||||||||
| B5C9 | NEG | A=0-A | ||||||||
| B5CB | ADD A,D | A+=D (aka A=D-A) D here is (117 - car jump offset) from earlier | ||||||||
| B5CC | LD E,A | E=A | ||||||||
| B5CD | AND $0F | A &= $0F | ||||||||
| B5CF | ADD A,$F0 | A += $F0 | ||||||||
| B5D1 | LD D,A | D=A | ||||||||
| B5D2 | LD A,E | A=E | ||||||||
| B5D3 | AND $70 | A &= $70 | ||||||||
| B5D5 | ADD A,A | A = A*2 | ||||||||
| B5D6 | ADD A,$0D | A += $0D | ||||||||
| B5D8 | LD E,A | E=A | ||||||||
| B5D9 | INC HL | HL++ | ||||||||
| B5DA | LD B,(HL) | B=*HL++ | ||||||||
| B5DB | INC HL | |||||||||
| B5DC | LD A,(HL) | A=*HL++ | ||||||||
| B5DD | INC HL | |||||||||
| B5DE | PUSH HL | |||||||||
| B5DF | PUSH DE | |||||||||
| B5E0 | LD H,(HL) | H=*HL | ||||||||
| B5E1 | LD L,A | L=A | ||||||||
| B5E2 | LD A,$05 | A=5 | ||||||||
| B5E4 | LD E,A | E=A | ||||||||
| B5E5 | LD D,$00 | D=0 | ||||||||
| B5E7 | EXX | |||||||||
| B5E8 | POP HL | |||||||||
| B5E9 | EX AF,AF' | |||||||||
| B5EA | LD A,($A251) | If flip_car jump to draw_car_perhaps_flipped | ||||||||
| B5ED | AND A | |||||||||
| B5EE | JR NZ,dc_perhaps_flipped | |||||||||
| B5F0 | EX AF,AF' | |||||||||
| B5F1 | CALL plot_sprite | Call plot_sprite -- A is (how many pixels to plot - 1) / 8 | ||||||||
| B5F4 | JR dc_cont | Jump to draw_car_cont | ||||||||
| dc_perhaps_flipped | B5F6 | EX AF,AF' | ||||||||
| B5F7 | DEC L | L-- | ||||||||
| B5F8 | CALL plot_sprite_flipped | Call plot_sprite_flipped | ||||||||
| dc_cont | B5FB | POP HL | ||||||||
| B5FC | POP DE | |||||||||
| B5FD | INC HL | HL++ | ||||||||
| B5FE | LD E,$68 | E=$68 C=$05 (width) CALL dc_draw draws the top (windscreen) | ||||||||
| B600 | LD C,$05 | |||||||||
| B602 | CALL dc_draw | |||||||||
| B605 | LD E,$68 | E=$68 C=$05 (width) CALL dc_draw draws the bottom (wheels) | ||||||||
| B607 | LD C,$05 | |||||||||
| B609 | CALL dc_draw | |||||||||
| B60C | LD A,($A251) | Check flip_car flag | ||||||||
| B60F | AND A | |||||||||
| B610 | LD C,$01 | |||||||||
| B612 | LD E,$60 | unflipped | ||||||||
| B614 | JR Z,dc_3 | |||||||||
| B616 | LD E,$90 | flipped | ||||||||
| dc_3 | B618 | CALL dc_draw | Draws left side of car | |||||||
| B61B | LD C,$01 | C = 1 | ||||||||
| B61D | LD A,($A251) | A = flip_car | ||||||||
| B620 | AND A | Set flags | ||||||||
| B621 | LD E,$60 | E = $60 | ||||||||
| B623 | JR NZ,dc_draw | Jump if flipped | ||||||||
| B625 | LD E,$90 | E = $90 | ||||||||
|
Drawing subroutine. C = byte width?, D = Y (vertical postion in rows), E = X (horizontal position in pixels), HL -> address of graphic def (v.shift, n.rows, data address)
|
||||||||||
| dc_draw | B627 | LD A,D | A = D -- vertical position in rows | |||||||
| B628 | PUSH DE | Preserve X,Y | ||||||||
| B629 | SUB (HL) | D = A - *HL++ -- this byte seems to be a vertical shift value | ||||||||
| B62A | LD D,A | |||||||||
| B62B | INC HL | |||||||||
| B62C | LD B,(HL) | B = *HL++ -- num rows | ||||||||
| B62D | INC HL | |||||||||
| B62E | LD A,(HL) | HL = wordat(HL) while preserving (HL+1) -- load data address | ||||||||
| B62F | INC HL | |||||||||
| B630 | PUSH HL | |||||||||
| B631 | LD H,(HL) | |||||||||
| B632 | LD L,A | |||||||||
| B633 | PUSH BC | Preserve byte width | ||||||||
|
D = v.shift, B = n.rows, HL -> data
|
||||||||||
| B634 | EXX | Bank | ||||||||
| B635 | POP BC | Restore byte width | ||||||||
| B636 | LD A,($A251) | Load flip_car into B | ||||||||
| B639 | LD B,A | |||||||||
| B63A | LD E,C | E = C -- byte width | ||||||||
| B63B | DEC C | C-- -- reduce byte width | ||||||||
| B63C | AND A | If A == 0 C = A -- check flip_car flag, if clear then C = 0 else C = bytewidth-1 | ||||||||
| B63D | JR NZ,dc_5 | |||||||||
| B63F | LD C,A | |||||||||
| dc_5 | B640 | EXX | Unbank | |||||||
| B641 | CALL draw_part | Draws all masked parts of the car | ||||||||
| B644 | POP HL | Restore ptr | ||||||||
| B645 | INC HL | Skip final byte | ||||||||
| B646 | POP DE | Restore X,Y | ||||||||
| B647 | RET | Return | ||||||||
| Prev: B549 | Up: Map | Next: B648 |