Chase H.Q. | Routines |
Prev: B6D6 | Up: Map | Next: B76C |
This plots the game's graphics using AND-OR masking.
This uses the "stack trick": internally the stack is pointed at pairs of bitmap and mask bytes and HL points into the screen buffer. It proceeds left-right.
This routine doesn't flip sprites; instead use plot_masked_sprite_flipped (below) for that.
|
||||||||||||||||
plot_masked_sprite | B716 | LD ($B720),SP | Save SP to be restored on exit | |||||||||||||
B71A | JR pms_entry | Start | ||||||||||||||
pms_end_row | B71C | EXX | Unbank | |||||||||||||
B71D | DJNZ pms_start_row | Decrement rows, jump if +ve | ||||||||||||||
B71F | LD SP,$0000 | Restore original SP (self modified) | ||||||||||||||
B722 | RET | Return | ||||||||||||||
pms_start_row | B723 | ADD HL,DE | Advance to start of next row | |||||||||||||
This entry point is used by the routine at plot_masked_sprite_variant.
|
||||||||||||||||
pms_entry | B724 | LD SP,HL | Point SP at the source data | |||||||||||||
B725 | EXX | Bank | ||||||||||||||
B726 | LD C,L | Preserve start address | ||||||||||||||
B727 | JP (IX) | Jump into table | ||||||||||||||
pms_jumptable | B729 | POP DE | Load a bitmap and mask pair (D,E) | |||||||||||||
B72A | LD A,(HL) | Load the screen pixels and AND with mask | ||||||||||||||
B72B | AND E | |||||||||||||||
B72C | OR D | OR in new pixels and store back to screen | ||||||||||||||
B72D | LD (HL),A | |||||||||||||||
B72E | INC L | Move to next screen pixel | ||||||||||||||
B72F | POP DE | Repeat 7 more times | ||||||||||||||
B730 | LD A,(HL) | |||||||||||||||
B731 | AND E | |||||||||||||||
B732 | OR D | |||||||||||||||
B733 | LD (HL),A | |||||||||||||||
B734 | INC L | |||||||||||||||
B735 | POP DE | |||||||||||||||
B736 | LD A,(HL) | |||||||||||||||
B737 | AND E | |||||||||||||||
B738 | OR D | |||||||||||||||
B739 | LD (HL),A | |||||||||||||||
B73A | INC L | |||||||||||||||
B73B | POP DE | |||||||||||||||
B73C | LD A,(HL) | |||||||||||||||
B73D | AND E | |||||||||||||||
B73E | OR D | |||||||||||||||
B73F | LD (HL),A | |||||||||||||||
B740 | INC L | |||||||||||||||
B741 | POP DE | |||||||||||||||
B742 | LD A,(HL) | |||||||||||||||
B743 | AND E | |||||||||||||||
B744 | OR D | |||||||||||||||
B745 | LD (HL),A | |||||||||||||||
B746 | INC L | |||||||||||||||
B747 | POP DE | |||||||||||||||
B748 | LD A,(HL) | |||||||||||||||
B749 | AND E | |||||||||||||||
B74A | OR D | |||||||||||||||
B74B | LD (HL),A | |||||||||||||||
B74C | INC L | |||||||||||||||
B74D | POP DE | |||||||||||||||
B74E | LD A,(HL) | |||||||||||||||
B74F | AND E | |||||||||||||||
B750 | OR D | |||||||||||||||
B751 | LD (HL),A | |||||||||||||||
B752 | INC L | |||||||||||||||
B753 | POP DE | |||||||||||||||
B754 | LD A,(HL) | |||||||||||||||
B755 | AND E | |||||||||||||||
B756 | OR D | |||||||||||||||
B757 | LD (HL),A | |||||||||||||||
Handle end of row.
|
||||||||||||||||
B758 | LD L,C | Restore row start address | ||||||||||||||
Move to next back buffer row (addresses have the form 0b1111BAAACCCXXXXX where 0bCCCBAAA is the row index)
|
||||||||||||||||
B759 | LD A,H | Preserve A for checking in a moment | ||||||||||||||
B75A | DEC H | Move to next row (visually upwards) | ||||||||||||||
B75B | AND B | Would it have rolled over into the top nibble? (B is a mask, 15, here) | ||||||||||||||
B75C | JP NZ,pms_end_row | No - continue | ||||||||||||||
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.
|
||||||||||||||||
B75F | LD A,L | Move to next chunk of 16 rows | ||||||||||||||
B760 | SUB $20 | |||||||||||||||
B762 | LD L,A | |||||||||||||||
B763 | JR C,pms_end_row | Carry set if CCC field was zero - don't compensate 1111 field and continue | ||||||||||||||
Otherwise have to compensate 1111 field.
|
||||||||||||||||
B765 | LD A,H | Put back the bit stolen since BAAA field was zero | ||||||||||||||
B766 | ADD A,$10 | |||||||||||||||
B768 | LD H,A | |||||||||||||||
B769 | JP pms_end_row | Continue |
Prev: B6D6 | Up: Map | Next: B76C |