Prev: 9DF4 Up: Map Next: 9F47
9E11: Draws the turbo sprites and updates the displayed scores
Used by the routine at bonus_string.
plot_turbos_and_scores 9E11 LD A,($A170) If no turbo boosts remain jump to plot_scores_only
9E14 AND A
9E15 JR Z,plot_speed_only
9E17 LD C,A Preserve number of turbo boosts in C
9E18 LD A,($A24E) Read boost time remaining and set flags
9E1C LD HL,$76F0 Point HL at base of turbo sprites
9E1F JR Z,ptas_turbo_setup Avoid frame increment and address calculation if possible
9E21 LD A,$00 Get frame number (0, 1 or 2)
9E23 INC A
9E24 CP $03
9E26 JR NZ,plot_turbos_and_scores_0
9E28 XOR A
plot_turbos_and_scores_0 9E29 LD ($9E22),A Self modify frame number
9E2C JR Z,ptas_turbo_setup Avoid frame address calculation if possible
9E2E LD DE,$0038 56 bytes per frame
9E31 LD B,A Calculate the frame address
plot_turbos_and_scores_1 9E32 ADD HL,DE
9E33 DJNZ plot_turbos_and_scores_1
ptas_turbo_setup 9E35 LD ($9E45),HL Self modify 9E44 to load SP with address of frame
9E38 LD ($9E79),SP Self modify 9E78 to restore SP once drawing is done
9E3C LD A,$E1 Low byte of back buffer draw address
Draw a whole frame of turbo sprite.
Note that the frame data is stored in memory inverted (bottom first), so we draw the bottom row first and then proceed upwards.
ptas_turbo_loops 9E3E LD SP,$76F0 Base address of frames
9E41 DEC C Temporarily decrement the number of turbos remaining to draw
9E42 JR NZ,plot_turbos_and_scores_2 All but the final turbo sprite use the zeroth frame
9E44 LD SP,$0000 SP is pointed at frame data (self modified)
plot_turbos_and_scores_2 9E47 INC C Restore number of turbos
9E48 LD H,$FE Form back buffer position
9E4B EX AF,AF' Preserve partial back buffer position
9E4C LD B,$0E Height of frame
Draw a scanline of frame.
ptas_turbo_scanline 9E4E POP DE Pop some frame data off the stack (E is mask data, D is bitmap data)
9E4F LD A,(HL) Write to screen: Screen = (Screen AND Mask) OR Bitmap
9E50 AND E
9E51 OR D
9E52 LD (HL),A
9E53 INC L Advance screen address to next column
9E54 POP DE (Repeat)
9E55 LD A,(HL)
9E56 AND E
9E57 OR D
9E58 LD (HL),A
9E59 DEC L Step back
9E5A LD A,H Move up a row (standard pattern)
9E5C AND $0F
9E5E JP NZ,plot_turbo_continue
9E61 LD A,H
9E62 ADD A,$10
9E64 LD H,A
9E65 LD A,L
9E66 SUB $20
9E68 LD L,A
9E69 JP NC,plot_turbo_continue
9E6D SUB $10
plot_turbo_continue 9E70 DJNZ ptas_turbo_scanline Loop until out of rows
9E72 EX AF,AF' Restore back buffer draw address
9E73 ADD A,$02 Advance screen address to next turbo position
9E75 DEC C Decrement number of turbos
9E76 JR NZ,ptas_turbo_loops Loop until none are left
9E78 LD SP,$0000 Restore SP
plot_speed_only 9E7B LD DE,$4132 Point DE at speed digits screen position (144, 9)
9E7E EXX Bank
9E7F LD DE,($A24A) Load speed into DE
Scale internal speed (0..511) to displayed speed by multiplying by 82 then discarding the bottom two digits.
9E83 LD HL,$0000 Initialise counter
9E86 LD B,$07 Do 7 digits / iterations
9E88 LD A,$52 Multiplier of 82 (a percentage: speed * multiplier / 100 = displayed speed)
plot_turbos_and_scores_3 9E8A RLA Shift one bit out
9E8B JR NC,ptas_speed_multiply_loop Jump if not adding
ptas_speed_multiply_loop 9E8E ADD HL,HL Double
9E8F DJNZ plot_turbos_and_scores_3 Loop
Count 10,000s.
9E91 LD BC,$2710 10000
9E94 LD DE,$FFFF Initialise D and E counters to -1
9E97 XOR A ?Clear carry flag?
ptas_speed_10000s_loop 9E98 INC D Increment counter
9E99 SBC HL,BC Decrease total by 10,000
9E9B JR NC,ptas_speed_10000s_loop Loop until HL goes negative
9E9D ADD HL,BC Correct for overshoot
9E9E AND A ?Clear carry flag?
Count 1,000s.
9E9F LD BC,$03E8 1000
plot_speed_1000s_loop 9EA2 INC E Increment counter
9EA3 SBC HL,BC Decrease total by 1,000
9EA5 JR NC,plot_speed_1000s_loop Loop until total goes negative
9EA7 ADD HL,BC Correct for overshoot
Count 100s.
9EA8 XOR A Initialise counter (to zero not -1 as in previous cases)
9EA9 LD BC,$0064 100
ptas_speed_100s_loop 9EAC INC A Increment counter
9EAD SBC HL,BC Decrease total by 100
9EAF JR NC,ptas_speed_100s_loop Loop until total goes negative
9EB1 DEC A Correct for starting early
Plot speed digits.
We divide by 100 here by throwing away the bottom two digits.
9EB2 PUSH AF Stack 100s counter
9EB3 LD A,E Stack 1,000s counter
9EB5 LD A,D Get 10,000s counter
9EB6 CALL ledfont_plot Plot a digit for 10,000s
9EBA CALL ledfont_plot Plot a digit for 1,000s
9EBE CALL ledfont_plot Plot a digit for 100s
9EC1 LD DE,$412F Point DE at time digits screen position (120, 9)
9EC4 EXX Bank
9EC5 LD DE,$A17E Point DE at time_bcd (one BCD byte)
9EC8 LD HL,$A180 Point HL at time_digits + 1
9ECB LD B,$01 One pair of digits
9ECD CALL ptas_led_digits Call plot_led_digits
9ED0 LD DE,$A256 Point DE at distance_bcd + 1 (the second of two BCD bytes)
9ED3 LD A,($A189) L = Distance byte from first 'hazard' (the perp)
9ED7 LD A,($A199) H = 17th byte from first hazard (not sure yet how they relate)
Count 1000s (no loop here - it's not required)
9EDB LD BC,$03E8 1,000
9EDE SBC HL,BC Decrease total by 1,000
9EE0 LD A,$10 BCD "10"
9EE2 JR NC,plot_turbos_and_scores_4 Jump if distance >= 1,000
9EE4 ADD HL,BC Otherwise correct for overshoot
9EE5 XOR A BCD "00"
Count 100s
plot_turbos_and_scores_4 9EE6 LD BC,$0064 100
ptas_scores_distance_100s_loop 9EE9 INC A Increment counter
9EEA SBC HL,BC Decrease total by 100
9EEC JP NC,ptas_scores_distance_100s_loop Loop until total goes negative
9EEF ADD HL,BC Correct for overshoot
9EF0 DEC A Correct for starting early
9EF1 LD (DE),A distance_bcd[1] = counter
Count 10s
9EF2 LD C,$0A 10 (B's already zero)
9EF4 AND A ?Clear carry flag?
9EF5 LD A,$F0 A = $F0 (BCD)
ptas_scores_distance_10s_loop 9EF7 ADD A,$10 Increment counter
9EF9 AND A ?Clear carry flag?
9EFA SBC HL,BC Decrease total by 10
9EFC JP NC,ptas_scores_distance_10s_loop Loop until total goes negative
9EFF ADD HL,BC Correct for overshoot
9F00 OR L OR in the remainder
9F01 DEC DE distance_bcd[0] = A
9F02 LD (DE),A
9F03 LD DE,$4191 Point DE at distance digits screen position (136,33)
9F06 EXX Bank
9F07 LD DE,$A256 Point DE at distance_bcd + 1 (two BCD bytes)
9F0A LD HL,$A184 Point HL at distance_digits + 3
9F0D LD B,$02 Two pairs of digits (4 digits)
9F0F CALL ptas_led_digits Call ptas_led_digits
9F12 LD DE,$4126 Point DE at score digits screen position
9F15 EXX Bank
9F16 LD DE,$8005 Point DE at score (four BCD bytes)
9F19 LD HL,$A17C Point HL at score digits (eight bytes)
9F1C LD B,$04 B = 4
Plots scoreboard digits (DE -> BCD) only if different than recorded values (HL -> byte per digit). B is the count.
ptas_led_digits 9F1E LD A,(DE) Read a pair of digits (BCD)
9F1F LD C,A Save digits for later
9F20 RRCA Unpack a BCD digit
9F24 AND $0F
9F26 CP (HL) If different than stored then plot
9F27 JR NZ,ptas_led_plot_1st
9F29 EXX Move screen position
ptas_led_next_half 9F2C DEC HL Move to next recorded value
9F2D LD A,C Examine next digit
9F2E AND $0F
9F30 CP (HL) If different than stored then plot
9F31 JR NZ,ptas_led_plot_2nd
9F33 EXX Move screen position
9F34 INC E
9F35 EXX
ptas_led_next_whole 9F36 DEC HL Move to next recorded value
9F37 DEC DE Move to next digits
9F38 DJNZ ptas_led_digits Loop until B is zero
9F3A RET Return
ptas_led_plot_1st 9F3B LD (HL),A Update drawn digit
9F3C CALL ledfont_plot Plot the digit
9F3F JR ptas_led_next_half Jump back to handle next digit (second half of a pair)
ptas_led_plot_2nd 9F41 LD (HL),A Update drawn digit
9F42 CALL ledfont_plot Plot the digit
9F45 JR ptas_led_next_whole Jump back to handle hext digit (next whole pair)
Prev: 9DF4 Up: Map Next: 9F47