| Chase H.Q. | Routines |
| Prev: BB69 | Up: Map | Next: BDC1 |
|
Copies 240 x 128 pixels from the back buffer to the screen. This is thinner than the real screen due to the main gameplay area's left and right black borders: each row is copied as 16 bytes then 14. It then sets up the attributes, scrolling the sky and ground colour boundary by the horizon delta of the frame before, and painting the smash-o-meter's six attribute rows at $5962 once a perp has been sighted.
Used by the routines at load_stage, attract_mode_48k, main_loop, run_pregame_screen, escape_scene and load_stage_128k.
|
||||
| send_playfield | BC3E | LD HL,$4811 | Point HL at screen pixel (136,64). This is positioned halfway across so we can PUSH to the screen via SP. | |
| BC41 | EXX | |||
| BC42 | LD HL,$F001 | Point HL' at back buffer + 1 byte. | ||
| BC45 | LD ($BDBE),SP | Self modify SP restore instruction | ||
|
A sequence that transfers 16 bytes
|
||||
| ds_loop_16bytes | BC49 | LD SP,HL | Point SP at the back buffer | |
| BC4A | POP AF | Pull in 16 bytes from the back buffer (order: AF' DE BC AF' DE' BC' IX IY), incrementing SP | ||
| BC4B | EX AF,AF' | |||
| BC4C | POP DE | |||
| BC4D | POP BC | |||
| BC4E | EXX | |||
| BC4F | POP AF | |||
| BC50 | POP DE | |||
| BC51 | POP BC | |||
| BC52 | POP IX | |||
| BC54 | POP IY | |||
| BC56 | LD SP,HL | Point SP at screen | ||
| BC57 | PUSH IY | Push out 16 bytes to the screen (reversing the order), decrementing SP | ||
| BC59 | PUSH IX | |||
| BC5B | PUSH BC | |||
| BC5C | PUSH DE | |||
| BC5D | PUSH AF | |||
| BC5E | INC H | Advance screen pointer | ||
| BC5F | EXX | Continue pushing | ||
| BC60 | PUSH BC | |||
| BC61 | PUSH DE | |||
| BC62 | EX AF,AF' | |||
| BC63 | PUSH AF | |||
| BC64 | INC H | Advance back buffer pointer | ||
| BC65 | LD SP,HL | Transfer another 16 bytes (128 pixels) | ||
| BC66 | POP AF | |||
| BC67 | EX AF,AF' | |||
| BC68 | POP DE | |||
| BC69 | POP BC | |||
| BC6A | EXX | |||
| BC6B | POP AF | |||
| BC6C | POP DE | |||
| BC6D | POP BC | |||
| BC6E | POP IX | |||
| BC70 | POP IY | |||
| BC72 | LD SP,HL | |||
| BC73 | PUSH IY | |||
| BC75 | PUSH IX | |||
| BC77 | PUSH BC | |||
| BC78 | PUSH DE | |||
| BC79 | PUSH AF | |||
| BC7A | INC H | |||
| BC7B | EXX | |||
| BC7C | PUSH BC | |||
| BC7D | PUSH DE | |||
| BC7E | EX AF,AF' | |||
| BC7F | PUSH AF | |||
| BC80 | INC H | |||
| BC81 | LD SP,HL | Transfer another 16 bytes (128 pixels) | ||
| BC82 | POP AF | |||
| BC83 | EX AF,AF' | |||
| BC84 | POP DE | |||
| BC85 | POP BC | |||
| BC86 | EXX | |||
| BC87 | POP AF | |||
| BC88 | POP DE | |||
| BC89 | POP BC | |||
| BC8A | POP IX | |||
| BC8C | POP IY | |||
| BC8E | LD SP,HL | |||
| BC8F | PUSH IY | |||
| BC91 | PUSH IX | |||
| BC93 | PUSH BC | |||
| BC94 | PUSH DE | |||
| BC95 | PUSH AF | |||
| BC96 | INC H | |||
| BC97 | EXX | |||
| BC98 | PUSH BC | |||
| BC99 | PUSH DE | |||
| BC9A | EX AF,AF' | |||
| BC9B | PUSH AF | |||
| BC9C | INC H | |||
| BC9D | LD SP,HL | Transfer another 16 bytes (128 pixels) | ||
| BC9E | POP AF | |||
| BC9F | EX AF,AF' | |||
| BCA0 | POP DE | |||
| BCA1 | POP BC | |||
| BCA2 | EXX | |||
| BCA3 | POP AF | |||
| BCA4 | POP DE | |||
| BCA5 | POP BC | |||
| BCA6 | POP IX | |||
| BCA8 | POP IY | |||
| BCAA | LD SP,HL | |||
| BCAB | PUSH IY | |||
| BCAD | PUSH IX | |||
| BCAF | PUSH BC | |||
| BCB0 | PUSH DE | |||
| BCB1 | PUSH AF | |||
| BCB2 | INC H | |||
| BCB3 | EXX | |||
| BCB4 | PUSH BC | |||
| BCB5 | PUSH DE | |||
| BCB6 | EX AF,AF' | |||
| BCB7 | PUSH AF | |||
| BCB8 | INC H | |||
| BCB9 | BIT 2,H | If bit 2 of backbufptr is set then we're on the first pass | ||
| BCBB | JP NZ,ds_loop_16bytes | Loop if so | ||
| BCBE | LD DE,$F810 | Advance back buffer pointer (backwards) by a half row? | ||
| BCC1 | ADD HL,DE | |||
| BCC2 | EXX | |||
| BCC3 | LD DE,$F80E | Advance screen pointer (backwards) by half a row? | ||
| BCC6 | ADD HL,DE | |||
| BCC7 | EXX | |||
|
This is a similar sequence but only moves 14 bytes (not using IY)
|
||||
| ds_loop_14bytes | BCC8 | LD SP,HL | Point SP at the back buffer | |
| BCC9 | POP AF | Pull in 14 bytes from the back buffer (order: AF' DE BC AF' DE' BC' IX), incrementing SP | ||
| BCCA | EX AF,AF' | |||
| BCCB | POP DE | |||
| BCCC | POP BC | |||
| BCCD | EXX | |||
| BCCE | POP AF | |||
| BCCF | POP DE | |||
| BCD0 | POP BC | |||
| BCD1 | POP IX | |||
| BCD3 | LD SP,HL | |||
| BCD4 | PUSH IX | |||
| BCD6 | PUSH BC | |||
| BCD7 | PUSH DE | |||
| BCD8 | PUSH AF | |||
| BCD9 | INC H | |||
| BCDA | EXX | |||
| BCDB | PUSH BC | |||
| BCDC | PUSH DE | |||
| BCDD | EX AF,AF' | |||
| BCDE | PUSH AF | |||
| BCDF | INC H | |||
| BCE0 | LD SP,HL | Transfer another 14 bytes (112 pixels) | ||
| BCE1 | POP AF | |||
| BCE2 | EX AF,AF' | |||
| BCE3 | POP DE | |||
| BCE4 | POP BC | |||
| BCE5 | EXX | |||
| BCE6 | POP AF | |||
| BCE7 | POP DE | |||
| BCE8 | POP BC | |||
| BCE9 | POP IX | |||
| BCEB | LD SP,HL | |||
| BCEC | PUSH IX | |||
| BCEE | PUSH BC | |||
| BCEF | PUSH DE | |||
| BCF0 | PUSH AF | |||
| BCF1 | INC H | |||
| BCF2 | EXX | |||
| BCF3 | PUSH BC | |||
| BCF4 | PUSH DE | |||
| BCF5 | EX AF,AF' | |||
| BCF6 | PUSH AF | |||
| BCF7 | INC H | |||
| BCF8 | LD SP,HL | Transfer another 14 bytes (112 pixels) | ||
| BCF9 | POP AF | |||
| BCFA | EX AF,AF' | |||
| BCFB | POP DE | |||
| BCFC | POP BC | |||
| BCFD | EXX | |||
| BCFE | POP AF | |||
| BCFF | POP DE | |||
| BD00 | POP BC | |||
| BD01 | POP IX | |||
| BD03 | LD SP,HL | |||
| BD04 | PUSH IX | |||
| BD06 | PUSH BC | |||
| BD07 | PUSH DE | |||
| BD08 | PUSH AF | |||
| BD09 | INC H | |||
| BD0A | EXX | |||
| BD0B | PUSH BC | |||
| BD0C | PUSH DE | |||
| BD0D | EX AF,AF' | |||
| BD0E | PUSH AF | |||
| BD0F | INC H | |||
| BD10 | LD SP,HL | Transfer another 14 bytes (112 pixels) | ||
| BD11 | POP AF | |||
| BD12 | EX AF,AF' | |||
| BD13 | POP DE | |||
| BD14 | POP BC | |||
| BD15 | EXX | |||
| BD16 | POP AF | |||
| BD17 | POP DE | |||
| BD18 | POP BC | |||
| BD19 | POP IX | |||
| BD1B | LD SP,HL | |||
| BD1C | PUSH IX | |||
| BD1E | PUSH BC | |||
| BD1F | PUSH DE | |||
| BD20 | PUSH AF | |||
| BD21 | INC H | |||
| BD22 | EXX | |||
| BD23 | PUSH BC | |||
| BD24 | PUSH DE | |||
| BD25 | EX AF,AF' | |||
| BD26 | PUSH AF | |||
| BD27 | INC H | |||
| BD28 | BIT 2,H | If bit 2 of backbufptr is set then we're on the first pass | ||
| BD2A | JP NZ,ds_loop_14bytes | Loop if so | ||
|
Second pass completed.
|
||||
| BD2D | BIT 3,H | If bit 3 of backbufptr is set then we're not overflowing into the top four bits yet | ||
| BD2F | JR NZ,ds_bd4d | Jump if so | ||
|
Otherwise we've rolled into the top nibble.
|
||||
| BD31 | LD H,$F0 | H = $F0 | ||
| BD33 | LD A,L | L -= $F0 | ||
| BD34 | SUB H | |||
| BD35 | LD L,A | |||
| BD36 | JP NC,ds_attributes | L >= $F0 | ||
| BD39 | JP PE,ds_bd45 | PE => signed overflow for SUB | ||
| BD3C | EXX | |||
| BD3D | LD DE,$F812 | Increment the screen address | ||
| BD40 | ADD HL,DE | |||
| BD41 | EXX | |||
| BD42 | JP ds_loop_16bytes | Copy more | ||
| ds_bd45 | BD45 | EXX | ||
| BD46 | LD HL,$5011 | Point HL at screen pixel (136,128) | ||
| BD49 | EXX | |||
| BD4A | JP ds_loop_16bytes | Copy more | ||
| ds_bd4d | BD4D | EXX | ||
| BD4E | LD DE,$F812 | Increment the screen address | ||
| BD51 | ADD HL,DE | |||
| BD52 | EXX | |||
| BD53 | LD A,L | Update buffer address | ||
| BD54 | SUB $10 | |||
| BD56 | LD L,A | |||
| BD57 | JP ds_loop_16bytes | Copy more | ||
| ds_attributes | BD5A | LD A,($A220) | Don't update the attributes if the level intro screen is being shown | |
| BD5D | AND A | |||
| BD5E | JR NZ,ds_exit | |||
| BD60 | LD HL,$E34C | A = this frame's horizon delta, in multiples of 8 pixels, written by build_height_table | ||
| BD63 | LD A,(HL) | |||
| BD64 | INC L | E = last frame's delta, the one this call acts on | ||
| BD65 | LD E,(HL) | |||
| BD66 | LD (HL),A | Hold this frame's delta over for the next call | ||
| BD67 | LD A,E | Jump to exit check if E is zero | ||
| BD68 | OR A | |||
| BD69 | JR Z,ds_smash_meter | |||
| BD6B | ADD A,A | E = A * 4 | ||
| BD6C | ADD A,A | |||
| BD6D | LD E,A | |||
| BD6E | SBC A,A | A = $FF if carry set, zero otherwise (sign extending?) | ||
| BD6F | LD D,A | D = A | ||
| BD70 | LD HL,($A186) | Load the address of the first line of ground attributes (+ 31) | ||
| BD73 | LD BC,$6868 | Set the sky colour screen attributes by default (always bright, black over cyan) | ||
| BD76 | JR Z,ds_bd7d | If A was zero then jump (Z => sky, NZ => ground) | ||
| BD78 | LD BC,($5CF4) | Load the ground colour screen attributes (varies per level) | ||
| BD7C | ADD HL,DE | Point SP at the screen attributes (DE = $FFE0 = -32) - doesn't affect Z | ||
| ds_bd7d | BD7D | LD SP,HL | ||
| BD7E | PUSH BC | Fill 30 bytes - length of attribute line minus the two blank edges | ||
| BD7F | PUSH BC | |||
| BD80 | PUSH BC | |||
| BD81 | PUSH BC | |||
| BD82 | PUSH BC | |||
| BD83 | PUSH BC | |||
| BD84 | PUSH BC | |||
| BD85 | PUSH BC | |||
| BD86 | PUSH BC | |||
| BD87 | PUSH BC | |||
| BD88 | PUSH BC | |||
| BD89 | PUSH BC | |||
| BD8A | PUSH BC | |||
| BD8B | PUSH BC | |||
| BD8C | PUSH BC | |||
| BD8D | JR NZ,ds_bd90 | |||
| BD8F | ADD HL,DE | Move to next line of attributes | ||
| ds_bd90 | BD90 | LD ($A186),HL | Save the address of the first line of ground attributes (+ 31) | |
| ds_smash_meter | BD93 | LD A,($A22E) | Exit if sighted_flag is zero (flashing lights / smash mode) | |
| BD96 | AND A | |||
| BD97 | JR Z,ds_exit | |||
| BD99 | LD A,($A230) | Jump if perp_caught_phase >= 3 (when car stops) | ||
| BD9C | CP $03 | |||
| BD9E | JR NC,ds_exit | |||
|
Set the smash meter attributes
|
||||
| BDA0 | LD HL,$5962 | Screen attribute (2,11) | ||
| BDA3 | LD DE,$0020 | = 32 | ||
| BDA6 | LD C,$50 | Bright, black over red | ||
| BDA8 | LD (HL),C | Set two attrs | ||
| BDA9 | ADD HL,DE | |||
| BDAA | LD (HL),C | |||
| BDAB | ADD HL,DE | |||
| BDAC | LD C,$58 | Bright, black over magenta | ||
| BDAE | LD (HL),C | Set two attrs | ||
| BDAF | ADD HL,DE | |||
| BDB0 | LD (HL),C | |||
| BDB1 | ADD HL,DE | |||
| BDB2 | LD C,$60 | Bright, black over green | ||
| BDB4 | LD (HL),C | Set two attrs | ||
| BDB5 | ADD HL,DE | |||
| BDB6 | LD (HL),C | |||
| BDB7 | ADD HL,DE | |||
| BDB8 | LD C,$78 | Bright, black over white | ||
| BDBA | LD (HL),C | Set two attrs | ||
| BDBB | ADD HL,DE | |||
| BDBC | LD (HL),C | |||
| ds_exit | BDBD | LD SP,$0000 | Restore original SP (self modified at start of routine) | |
| BDC0 | RET | Return | ||
| Prev: BB69 | Up: Map | Next: BDC1 |