Routines |
Prev: A819 | Up: Map | Next: A8A2 |
This plots a single horizontal row of tiles to the screen buffer.
Simultaneously updates the visible tiles buffer.
Used by the routine at plot_bottommost_tiles.
|
||||||||||||||
plot_horizontal_tiles_common | A826 | AND $03 | Compute the row offset within a supertile from the map's Y position (0, 4, 8 or 12) | |||||||||||
A828 | ADD A,A | |||||||||||||
A829 | ADD A,A | |||||||||||||
A82A | LD ($A86A),A | Self modify the "LD A,$xx" instruction at supertile_plot_horizontal_common_iters to load the row offset | ||||||||||||
A82D | LD C,A | Preserve the row offset in C for the next step | ||||||||||||
A82E | LD A,($81BB) | Compute the column offset within a supertile from the map's X position (0, 1, 2 or 3) | ||||||||||||
A831 | AND $03 | |||||||||||||
A833 | ADD A,C | Now add it to the row offset - giving the combined offset | ||||||||||||
A834 | EX AF,AF' | Bank the combined offset | ||||||||||||
Initial edge. This draws up to 4 tiles.
|
||||||||||||||
A835 | LD A,(HL) | Fetch a supertile index from map_buf | ||||||||||||
A836 | EXX | Switch register banks for the initial edge | ||||||||||||
A837 | LD L,A | Point HL at super_tiles[A] | ||||||||||||
A838 | LD H,$00 | |||||||||||||
A83A | ADD HL,HL | |||||||||||||
A83B | ADD HL,HL | |||||||||||||
A83C | ADD HL,HL | |||||||||||||
A83D | ADD HL,HL | |||||||||||||
A83E | LD A,$5B | |||||||||||||
A840 | ADD A,H | |||||||||||||
A841 | LD H,A | |||||||||||||
A842 | EX AF,AF' | Unbank the combined offset | ||||||||||||
A843 | ADD A,L | Add on the combined offset to HL to point us at the appropriate part of the supertile | ||||||||||||
A844 | LD L,A | |||||||||||||
A845 | NEG | Turn 0,1,2,3 into 4,3,2,1 - the number of initial loop iterations | ||||||||||||
A847 | AND $03 | |||||||||||||
A849 | JR NZ,plot_horizontal_tiles_common_0 | |||||||||||||
A84B | LD A,$04 | |||||||||||||
plot_horizontal_tiles_common_0 | A84D | LD B,A | Set 1..4 iterations | |||||||||||
Start loop
|
||||||||||||||
plot_horizontal_tiles_common_1 | A84E | LD A,(HL) | Fetch a tile index from the super tile pointer | |||||||||||
A84F | LD (DE),A | Store it in visible tiles (DE' on entry) | ||||||||||||
A850 | CALL plot_tile | Plot the tile in A to the screen buffer at DE' using supertile pointer HL' | ||||||||||||
A853 | INC L | Advance the tile pointer | ||||||||||||
A854 | INC DE | Advance the visible tiles pointer | ||||||||||||
A855 | DJNZ plot_horizontal_tiles_common_1 | ...loop | ||||||||||||
A857 | EXX | Unbank | ||||||||||||
A858 | INC HL | Advance the map buffer pointer | ||||||||||||
Middle loop.
|
||||||||||||||
A859 | LD B,$05 | There are always five iterations (five supertiles in the middle section). | ||||||||||||
Start loop (outer) -- advanced for each supertile
|
||||||||||||||
plot_horizontal_tiles_common_2 | A85B | PUSH BC | Preserve the loop counter | |||||||||||
A85C | LD A,(HL) | Fetch a supertile index from the map buffer pointer | ||||||||||||
A85D | EXX | Switch register banks during the middle loop | ||||||||||||
A85E | LD L,A | Point HL at super_tiles[A] | ||||||||||||
A85F | LD H,$00 | |||||||||||||
A861 | ADD HL,HL | |||||||||||||
A862 | ADD HL,HL | |||||||||||||
A863 | ADD HL,HL | |||||||||||||
A864 | ADD HL,HL | |||||||||||||
A865 | LD BC,$5B00 | |||||||||||||
A868 | ADD HL,BC | |||||||||||||
supertile_plot_horizontal_common_iters | A869 | LD A,$00 | Load the row offset - self modified by $A82A | |||||||||||
A86B | ADD A,L | Add on the row offset to HL | ||||||||||||
A86C | LD L,A | |||||||||||||
A86D | LD B,$04 | Supertiles are four tiles wide | ||||||||||||
Start loop (inner) -- advanced for each tile
|
||||||||||||||
plot_horizontal_tiles_common_3 | A86F | LD A,(HL) | Fetch a tile index from the super tile pointer | |||||||||||
A870 | LD (DE),A | Store it in visible tiles | ||||||||||||
A871 | CALL plot_tile | Plot the tile in A to the screen buffer at DE' using supertile pointer HL' | ||||||||||||
A874 | INC HL | Advance the tiles pointer | ||||||||||||
A875 | INC DE | Advance the visible tiles pointer | ||||||||||||
A876 | DJNZ plot_horizontal_tiles_common_3 | ...loop (inner) | ||||||||||||
A878 | EXX | Unbank | ||||||||||||
A879 | INC HL | Advance the map buffer pointer | ||||||||||||
A87A | POP BC | Restore the loop counter | ||||||||||||
A87B | DJNZ plot_horizontal_tiles_common_2 | ...loop (outer) | ||||||||||||
Trailing edge.
|
||||||||||||||
A87D | LD A,C | Spurious instructions | ||||||||||||
A87E | EX AF,AF' | |||||||||||||
A87F | LD A,(HL) | Fetch a supertile index from map_buf | ||||||||||||
A880 | EXX | Switch register banks during the trailing loop | ||||||||||||
A881 | LD L,A | Point HL at super_tiles[A] | ||||||||||||
A882 | LD H,$00 | |||||||||||||
A884 | ADD HL,HL | |||||||||||||
A885 | ADD HL,HL | |||||||||||||
A886 | ADD HL,HL | |||||||||||||
A887 | ADD HL,HL | |||||||||||||
A888 | LD BC,$5B00 | |||||||||||||
A88B | ADD HL,BC | |||||||||||||
A88C | LD A,($A86A) | Load the row offset from (self modified) $A86A | ||||||||||||
A88F | ADD A,L | Add on the row offset to HL | ||||||||||||
A890 | LD L,A | |||||||||||||
A891 | LD A,($81BB) | Form the trailing loop iteration counter | ||||||||||||
A894 | AND $03 | |||||||||||||
A896 | RET Z | Return if no iterations are required | ||||||||||||
A897 | LD B,A | Move iterations into B | ||||||||||||
Start loop
|
||||||||||||||
plot_horizontal_tiles_common_4 | A898 | LD A,(HL) | Fetch a tile index from the super tile pointer | |||||||||||
A899 | LD (DE),A | Store it in visible tiles | ||||||||||||
A89A | CALL plot_tile | Plot the tile in A to the screen buffer at DE' using supertile pointer HL' | ||||||||||||
A89D | INC L | Advance the tiles pointer | ||||||||||||
A89E | INC DE | Advance the visible tiles pointer | ||||||||||||
A89F | DJNZ plot_horizontal_tiles_common_4 | ...loop | ||||||||||||
A8A1 | RET | Return |
Prev: A819 | Up: Map | Next: A8A2 |