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 |