Routines |
Prev: A8E7 | Up: Map | Next: A9A0 |
This plots a single vertical row of tiles to the screen buffer.
Simultaneously updates the visible tiles buffer.
Used by the routines at plot_all_tiles and plot_rightmost_tiles.
|
||||||||||||||
plot_vertical_tiles_common | A8F4 | AND $03 | Compute the column offset within a supertile from the map's X position (0, 1, 2 or 3) | |||||||||||
A8F6 | LD ($A94D),A | Self modify the "LD A,$xx" instruction at $A94C to load the column offset | ||||||||||||
A8F9 | LD C,A | Preserve the column offset in C for the next step | ||||||||||||
A8FA | LD A,($81BC) | Compute the row offset within a supertile from the map's Y position (0, 4, 8 or 12) | ||||||||||||
A8FD | AND $03 | |||||||||||||
A8FF | ADD A,A | |||||||||||||
A900 | ADD A,A | |||||||||||||
A901 | ADD A,C | Now add it to the column offset - giving the combined offset | ||||||||||||
A902 | EX AF,AF' | Bank the combined offset | ||||||||||||
Initial edge. This draws up to 4 tiles.
|
||||||||||||||
A903 | LD A,(HL) | Fetch a supertile index from map_buf | ||||||||||||
A904 | EXX | Switch register banks for the initial edge | ||||||||||||
A905 | LD L,A | Point HL at super_tiles[A] | ||||||||||||
A906 | LD H,$00 | |||||||||||||
A908 | ADD HL,HL | |||||||||||||
A909 | ADD HL,HL | |||||||||||||
A90A | ADD HL,HL | |||||||||||||
A90B | ADD HL,HL | |||||||||||||
A90C | LD A,$5B | |||||||||||||
A90E | ADD A,H | |||||||||||||
A90F | LD H,A | |||||||||||||
A910 | EX AF,AF' | Unbank the combined offset | ||||||||||||
A911 | ADD A,L | Add on the combined offset to HL to point us at the appropriate part of the supertile | ||||||||||||
A912 | LD L,A | |||||||||||||
A913 | RRA | Turn 0,4,8,12 into 4,3,2,1 - the number of initial loop iterations | ||||||||||||
A914 | RRA | |||||||||||||
A915 | AND $03 | |||||||||||||
A917 | NEG | |||||||||||||
A919 | AND $03 | |||||||||||||
A91B | JR NZ,plot_vertical_tiles_common_0 | |||||||||||||
A91D | LD A,$04 | |||||||||||||
plot_vertical_tiles_common_0 | A91F | EX DE,HL | Transpose tile_buf and map_buf pointers | |||||||||||
A920 | LD BC,$0018 | Set visible tiles stride | ||||||||||||
Start loop
|
||||||||||||||
plot_vertical_tiles_common_1 | A923 | PUSH AF | Save the loop counter | |||||||||||
A924 | LD A,(DE) | Fetch a tile index from the super tile pointer | ||||||||||||
A925 | LD (HL),A | Store it in the visible tiles (DE' on entry) | ||||||||||||
A926 | CALL plot_tile_then_advance | Plot the tile in A to the screen buffer at DE' using supertile pointer HL' then advance DE' by a row | ||||||||||||
A929 | LD A,$04 | Advance the tile pointer by a supertile row (4) | ||||||||||||
A92B | ADD A,E | |||||||||||||
A92C | LD E,A | |||||||||||||
A92D | ADD HL,BC | Advance the visible tiles pointer by a row (24) | ||||||||||||
A92E | POP AF | Restore the loop counter | ||||||||||||
A92F | DEC A | ...loop | ||||||||||||
A930 | JP NZ,plot_vertical_tiles_common_1 | |||||||||||||
A933 | EX DE,HL | Transpose the tile_buf and map_buf pointers back | ||||||||||||
A934 | EXX | Unbank | ||||||||||||
A935 | LD A,L | Advance the map buffer pointer by a row (7) | ||||||||||||
A936 | ADD A,$07 | |||||||||||||
A938 | LD L,A | |||||||||||||
A939 | JR NC,plot_vertical_tiles_common_2 | |||||||||||||
A93B | INC H | |||||||||||||
Middle loop.
|
||||||||||||||
plot_vertical_tiles_common_2 | A93C | LD B,$03 | There are always three iterations (three supertiles in the middle section). | |||||||||||
Start loop (outer) -- advanced for each supertile
|
||||||||||||||
plot_vertical_tiles_common_3 | A93E | PUSH BC | Preserve the loop counter | |||||||||||
A93F | LD A,(HL) | Fetch a supertile index from the map buffer pointer | ||||||||||||
A940 | EXX | Switch register banks during the middle loop | ||||||||||||
A941 | LD L,A | Point HL at super_tiles[A] | ||||||||||||
A942 | LD H,$00 | |||||||||||||
A944 | ADD HL,HL | |||||||||||||
A945 | ADD HL,HL | |||||||||||||
A946 | ADD HL,HL | |||||||||||||
A947 | ADD HL,HL | |||||||||||||
A948 | LD BC,$5B00 | |||||||||||||
A94B | ADD HL,BC | |||||||||||||
supertile_plot_vertical_common_iters | A94C | LD A,$00 | Load the column offset - self modified by $A8F6 | |||||||||||
A94E | ADD A,L | Add on the column offset to HL | ||||||||||||
A94F | LD L,A | |||||||||||||
A950 | LD BC,$0018 | Set visible tiles stride | ||||||||||||
A953 | EX DE,HL | Transpose the tile_buf and map_buf pointers | ||||||||||||
A954 | LD A,$04 | Supertiles are four tiles high | ||||||||||||
Start loop (inner) -- advanced for each tile
|
||||||||||||||
plot_vertical_tiles_common_4 | A956 | PUSH AF | Preserve the loop counter | |||||||||||
A957 | LD A,(DE) | Fetch a tile index from the super tile pointer | ||||||||||||
A958 | LD (HL),A | Store it in visible tiles | ||||||||||||
A959 | CALL plot_tile_then_advance | Plot the tile in A to the screen buffer at DE' using supertile pointer HL' then advance DE' by a row | ||||||||||||
A95C | ADD HL,BC | Advance the visible tiles pointer by a row | ||||||||||||
A95D | LD A,$04 | Advance the tiles pointer by a row | ||||||||||||
A95F | ADD A,E | |||||||||||||
A960 | LD E,A | |||||||||||||
A961 | POP AF | Restore the loop counter | ||||||||||||
A962 | DEC A | ...loop (inner) | ||||||||||||
A963 | JP NZ,plot_vertical_tiles_common_4 | |||||||||||||
A966 | EX DE,HL | Transpose the tile_buf and map_buf pointers back | ||||||||||||
A967 | EXX | Unbank | ||||||||||||
A968 | LD A,L | Advance the map buffer pointer | ||||||||||||
A969 | ADD A,$07 | |||||||||||||
A96B | LD L,A | |||||||||||||
A96C | JR NC,plot_vertical_tiles_common_5 | |||||||||||||
A96E | INC H | |||||||||||||
plot_vertical_tiles_common_5 | A96F | POP BC | Restore the loop counter | |||||||||||
A970 | DJNZ plot_vertical_tiles_common_3 | ...loop (outer) | ||||||||||||
Trailing edge.
|
||||||||||||||
A972 | LD A,(HL) | Fetch a supertile index from map_buf | ||||||||||||
A973 | EXX | Switch register banks during the trailing loop | ||||||||||||
A974 | LD L,A | Point HL at super_tiles[A] | ||||||||||||
A975 | LD H,$00 | |||||||||||||
A977 | ADD HL,HL | |||||||||||||
A978 | ADD HL,HL | |||||||||||||
A979 | ADD HL,HL | |||||||||||||
A97A | ADD HL,HL | |||||||||||||
A97B | LD BC,$5B00 | |||||||||||||
A97E | ADD HL,BC | |||||||||||||
A97F | LD A,($A94D) | Load the column offset from (self modified) $A94D | ||||||||||||
A982 | ADD A,L | Add on the column offset to HL | ||||||||||||
A983 | LD L,A | |||||||||||||
A984 | LD A,($81BC) | Form the trailing loop iteration counter | ||||||||||||
A987 | AND $03 | |||||||||||||
A989 | INC A | |||||||||||||
A98A | LD BC,$0018 | Set visible tiles stride | ||||||||||||
A98D | EX DE,HL | Transpose the tile_buf and map_buf pointers | ||||||||||||
Start loop
|
||||||||||||||
plot_vertical_tiles_common_6 | A98E | PUSH AF | Preserve the loop counter | |||||||||||
A98F | LD A,(DE) | Fetch a tile index from the super tile pointer | ||||||||||||
A990 | LD (HL),A | Store it in visible tiles | ||||||||||||
A991 | CALL plot_tile_then_advance | Plot the tile in A to the screen buffer at DE' using supertile pointer HL' then advance DE' by a row | ||||||||||||
A994 | LD A,$04 | Advance the tiles pointer by a row | ||||||||||||
A996 | ADD A,E | |||||||||||||
A997 | LD E,A | |||||||||||||
A998 | ADD HL,BC | Advance the visible tiles pointer by a row | ||||||||||||
A999 | POP AF | Restore the loop counter | ||||||||||||
A99A | DEC A | ...loop | ||||||||||||
A99B | JP NZ,plot_vertical_tiles_common_6 | |||||||||||||
A99E | EX DE,HL | Transpose the tile_buf and map_buf pointers back | ||||||||||||
A99F | RET | Return |
Prev: A8E7 | Up: Map | Next: A9A0 |