Prev: B549 Up: Map Next: B648
B58E: Draws the car
Used by the routine at animate_hero_car.
Input
A Turn speed. 0/1/2 => Straight/Turning/Turning hard.
B 0/3 to make the car wobble when off-road.
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