| Chase H.Q. | Routines |
| Prev: 92E1 | Up: Map | Next: 9542 |
|
||||||||||||||||
| plot_sprite | 949C | SRL A | Use plot_sprite_odd if the bottom bit is set (odd widths) | |||||||||||||
| 949E | JP C,plot_sprite_odd | |||||||||||||||
| 94A1 | LD IX,$94C8 | IX = Base of jump table | ||||||||||||||
| 94A5 | CPL | (~A + 5) is (4 - A) is the number of plot operations to skip | ||||||||||||||
| 94A6 | ADD A,$05 | |||||||||||||||
| 94A8 | LD C,A | Multiply A by 5: the length of an individual plot operation | ||||||||||||||
| 94A9 | RLCA | |||||||||||||||
| 94AA | RLCA | |||||||||||||||
| 94AB | ADD A,C | |||||||||||||||
| 94AC | LD C,A | Move result to BC | ||||||||||||||
| 94AD | LD B,$00 | |||||||||||||||
| 94AF | ADD IX,BC | Add it to IX to complete the jump target | ||||||||||||||
|
This entry point is used by the routine at draw_object_right.
|
||||||||||||||||
| plot_sprite_even | 94B1 | LD ($94BF),SP | Save SP to restore on exit (self modify) | |||||||||||||
| 94B5 | LD BC,$0F10 | B = 15 rows to draw, C = 16, an increment value used later | ||||||||||||||
| 94B8 | EXX | Bank | ||||||||||||||
| 94B9 | JR plot_sprite_even_start | Jump into body of loop | ||||||||||||||
| ps_even_unbank_continue | 94BB | EXX | Bank | |||||||||||||
| 94BC | DJNZ ps_even_next | Next scanline | ||||||||||||||
| 94BE | LD SP,$0000 | Restore original SP (self modified) | ||||||||||||||
| 94C1 | RET | Return (banked...) | ||||||||||||||
| ps_even_next | 94C2 | ADD HL,DE | Calculate address of next bitmap scanline | |||||||||||||
| plot_sprite_even_start | 94C3 | LD SP,HL | Put it in SP (so we can use PUSH for speed) | |||||||||||||
| 94C4 | EXX | Unbank | ||||||||||||||
| 94C5 | LD A,L | Preserve row start address | ||||||||||||||
| 94C6 | JP (IX) | Jump into table | ||||||||||||||
| ps_even_jumptable | 94C8 | POP DE | Transfer two bitmap bytes (16 pixels) from the "stack" to screen buffer | |||||||||||||
| 94C9 | LD (HL),E | |||||||||||||||
| 94CA | INC L | |||||||||||||||
| 94CB | LD (HL),D | |||||||||||||||
| 94CC | INC L | |||||||||||||||
| 94CD | POP DE | Transfer another 16 pixels | ||||||||||||||
| 94CE | LD (HL),E | |||||||||||||||
| 94CF | INC L | |||||||||||||||
| 94D0 | LD (HL),D | |||||||||||||||
| 94D1 | INC L | |||||||||||||||
| 94D2 | POP DE | Transfer another 16 pixels | ||||||||||||||
| 94D3 | LD (HL),E | |||||||||||||||
| 94D4 | INC L | |||||||||||||||
| 94D5 | LD (HL),D | |||||||||||||||
| 94D6 | INC L | |||||||||||||||
| 94D7 | POP DE | Transfer another 16 pixels | ||||||||||||||
| 94D8 | LD (HL),E | |||||||||||||||
| 94D9 | INC L | |||||||||||||||
| 94DA | LD (HL),D | |||||||||||||||
| 94DB | LD L,A | Restore row start address | ||||||||||||||
|
Move to next scanline (longer form).
Move to next back buffer row (addresses have the form 0b1111BAAACCCXXXXX where 0bCCCBAAA is the row index).
|
||||||||||||||||
| 94DC | LD A,H | Save for checking in a moment | ||||||||||||||
| 94DD | DEC H | Move to next scanline (visually upwards) | ||||||||||||||
| 94DE | AND B | Would it have rolled over into the top nibble? (B is a mask, 15, here) | ||||||||||||||
| 94DF | JP NZ,ps_even_unbank_continue | No - continue | ||||||||||||||
|
It rolled over.
The row field BAAA was zero but the decrement changed it to 1111 and borrowed from the 1111 field at the top of the address.
|
||||||||||||||||
| 94E2 | LD A,H | Put back the bit stolen by rollover (C is 16 here) | ||||||||||||||
| 94E3 | ADD A,C | |||||||||||||||
| 94E4 | LD H,A | |||||||||||||||
| 94E5 | LD A,L | Move to next chunk of 16 scanlines | ||||||||||||||
| 94E6 | SUB $20 | |||||||||||||||
| 94E8 | LD L,A | |||||||||||||||
| 94E9 | JP NC,ps_even_unbank_continue | Continue if it didn't roll over | ||||||||||||||
|
Otherwise have to compensate 1111 field.
|
||||||||||||||||
| 94EC | LD A,H | Otherwise move to the next chunk of 128 scanlines (would put us outside the back buffer) (C is 16 here) | ||||||||||||||
| 94ED | SUB C | |||||||||||||||
| 94EE | LD H,A | |||||||||||||||
| 94EF | JP ps_even_unbank_continue | Continue | ||||||||||||||
| plot_sprite_odd | 94F2 | INC A | Increment A for upcoming calculation | |||||||||||||
| 94F3 | LD IX,$951A | Point IX at start of plot instructions | ||||||||||||||
| 94F7 | CPL | (~A + 5) is (4 - A) is the number of plot operations to skip | ||||||||||||||
| 94F8 | ADD A,$05 | |||||||||||||||
| 94FA | LD C,A | Multiply A by 5: the length of an individual plot operation | ||||||||||||||
| 94FB | RLCA | |||||||||||||||
| 94FC | RLCA | |||||||||||||||
| 94FD | ADD A,C | |||||||||||||||
| 94FE | LD C,A | Move result to BC | ||||||||||||||
| 94FF | LD B,$00 | |||||||||||||||
| 9501 | ADD IX,BC | Add it to IX to complete the jump target | ||||||||||||||
| plot_sprite_odd_entrypt | 9503 | LD ($9511),SP | Save SP to restore on exit (self modify) | |||||||||||||
| 9507 | LD BC,$0F10 | B = 15 rows to draw, C = 16, an increment value used later | ||||||||||||||
| 950A | EXX | Bank | ||||||||||||||
| 950B | JR plot_sprite_odd_start | Jump into body of loop | ||||||||||||||
| ps_odd_loop | 950D | EXX | Bank | |||||||||||||
| ps_odd_continue | 950E | DJNZ ps_odd_next | Next scanline | |||||||||||||
| 9510 | LD SP,$0000 | Restore original SP (self modified) | ||||||||||||||
| 9513 | RET | Return | ||||||||||||||
| ps_odd_next | 9514 | ADD HL,DE | Calculate address of next bitmap scanline | |||||||||||||
| plot_sprite_odd_start | 9515 | LD SP,HL | Put it in SP (so we can use PUSH for speed) | |||||||||||||
| 9516 | EXX | Unbank | ||||||||||||||
| 9517 | LD A,L | Preserve row start address | ||||||||||||||
| 9518 | JP (IX) | Jump into table | ||||||||||||||
| ps_odd_jumptable | 951A | POP DE | Transfer two bitmap bytes (16 pixels) from the "stack" to screen buffer | |||||||||||||
| 951B | LD (HL),E | |||||||||||||||
| 951C | INC L | |||||||||||||||
| 951D | LD (HL),D | |||||||||||||||
| 951E | INC L | |||||||||||||||
| 951F | POP DE | Transfer another 16 pixels | ||||||||||||||
| 9520 | LD (HL),E | |||||||||||||||
| 9521 | INC L | |||||||||||||||
| 9522 | LD (HL),D | |||||||||||||||
| 9523 | INC L | |||||||||||||||
| 9524 | POP DE | Transfer another 16 pixels | ||||||||||||||
| 9525 | LD (HL),E | |||||||||||||||
| 9526 | INC L | |||||||||||||||
| 9527 | LD (HL),D | |||||||||||||||
| 9528 | INC L | |||||||||||||||
| 9529 | POP DE | Transfer another 8 pixels | ||||||||||||||
| 952A | LD (HL),E | |||||||||||||||
|
Handle end of row (longer form).
Move to next back buffer row (addresses have the form 0b1111BAAACCCXXXXX where 0bCCCBAAA is the row index).
|
||||||||||||||||
| 952B | LD L,A | Restore row start address | ||||||||||||||
| 952C | LD A,H | Save for checking in a moment | ||||||||||||||
| 952D | DEC H | Move to next scanline (visually upwards) | ||||||||||||||
| 952E | AND B | Would it have rolled over into the top nibble? (B is a mask, 15, here) | ||||||||||||||
| 952F | JP NZ,ps_odd_loop | No - continue | ||||||||||||||
|
It rolled over.
The row field BAAA was zero but the decrement changed it to 1111 and borrowed from the 1111 field at the top of the address.
|
||||||||||||||||
| 9532 | LD A,H | Fix 1111 field (C is 16 here) | ||||||||||||||
| 9533 | ADD A,C | |||||||||||||||
| 9534 | LD H,A | |||||||||||||||
| 9535 | LD A,L | Move to next chunk of 16 scanlines | ||||||||||||||
| 9536 | SUB $20 | |||||||||||||||
| 9538 | LD L,A | |||||||||||||||
| 9539 | JP NC,ps_odd_loop | No carry, so continue | ||||||||||||||
|
Otherwise have to compensate 1111 field.
|
||||||||||||||||
| 953C | LD A,H | Undo carry | ||||||||||||||
| 953D | SUB C | |||||||||||||||
| 953E | LD H,A | |||||||||||||||
| 953F | JP ps_odd_loop | Continue | ||||||||||||||
| Prev: 92E1 | Up: Map | Next: 9542 |