Prev: 813C Up: Map Next: 81B3
8146: Print World Map
Used by the routines at GameInitialise and Handler_SubGame.
world-map
Print_WorldMap 8146 LD IX,$F000 IX=WorldMap_Data.
814A LD HL,$6000 HL=ShadowBuffer.
814D LD E,$FF Set E as a bit counter/ mask.
814F LD D,$80 D is used as a bit mask for the output.
8151 LD A,$00 Initialise A to 00 which is used for comparisons.
Main loop, process the map data.
WorldMap_Loop 8153 INC IX Increment the map data pointer by one.
8155 LD B,(IX-$01) Load the current map data byte into B.
8158 INC E Increment the bit counter by one.
8159 JR Z,WorldMap_ExpandData Jump to WorldMap_ExpandData if the bit counter wrapped around to zero.
815B LD E,$FF Reset E to FF if it didn't wrap.
Expand map data into pixels.
WorldMap_ExpandData 815D RRC E Rotate E right (with carry).
815F RL (HL) Rotate the byte at *HL left one position, including the carry from the previous line.
8161 DEC B Decrease bits remaining in the current map byte by one.
8162 SRL D Shift the output bit mask right one position.
8164 JR Z,WorldMap_NextByte Jump to WorldMap_NextByte if B is zero (the byte is filled).
8166 CP B Jump to WorldMap_ExpandData if A is not equal to B.
8167 JR NZ,WorldMap_ExpandData
Move to the next map data byte.
8169 JR WorldMap_Loop Jump to WorldMap_Loop.
Move to next shadow buffer byte.
WorldMap_NextByte 816B INC HL Increment the shadow buffer pointer by one.
816C LD A,$78 A=78 (high byte of the shadow buffer end address).
816E CP H Jump to WorldMap_ClearEdge if the end of the shadow buffer has been reached.
816F JR Z,WorldMap_ClearEdge
8171 LD A,B Store the remaining bits from the current map byte in A.
8172 CP $08 Jump to WorldMap_FullByte if A is equal to/ higher than 08.
8174 JR NC,WorldMap_FullByte
8176 CP $00 Check if we're done with current map byte.
8178 LD D,$80 Reset the bit mask in D to 80.
817A JR Z,WorldMap_Loop Jump to WorldMap_Loop if we are done with the current map byte.
817C LD A,$00 Reset A for comparison in bit manipulation loop.
817E JR WorldMap_ExpandData Jump to WorldMap_ExpandData.
Handle full byte remaining.
WorldMap_FullByte 8180 LD (HL),E Store the full byte in the shadow buffer.
8181 SUB $08 Subtract 08 from the remaining bit count.
8183 LD B,A
8184 JR WorldMap_NextByte Jump to WorldMap_NextByte.
Due to the way the decompression works, the image is left with a trailing line - this is what it would look like if we didn't clear the right edge of the map.
world-map-no-clear
Clear the right edge of the map.
WorldMap_ClearEdge 8186 LD HL,$601F HL=601F.
8189 LD DE,$0020 Set the row width in DE (0020 bytes is one whole row).
818C LD B,$C0 Set a counter in B of the number of rows to process (C0).
WorldMap_ClearEdge_Loop 818E RES 0,(HL) Reset bit 0 of *HL.
8190 ADD HL,DE Move to the next row.
8191 DJNZ WorldMap_ClearEdge_Loop Decrease the row counter by one and loop back to WorldMap_ClearEdge_Loop until all rows have been processed.
Copy the map to the screen buffer.
8193 LD HL,$6000 Copy 1800 bytes from ShadowBuffer to the screen buffer.
8196 LD DE,$4000
8199 LD BC,$1800
819C LDIR
Colour the whole of the attribute buffer INK: YELLOW, PAPER: BLUE (BRIGHT) .
819E LD HL,$5800 HL=5800 (attribute buffer location).
81A1 LD DE,$5801 DE=5801.
81A4 LD BC,$02FF BC=02FF.
81A7 LD (HL),$4E Write INK: YELLOW, PAPER: BLUE (BRIGHT) to *HL.
81A9 LDIR Copy 02FF more bytes to the rest of the attribute buffer.
81AB LD A,$01 Write 01 to *99CC.
81AD LD ($99CC),A
81B0 OUT ($FE),A Set the border to BLUE.
81B2 RET Return.
Prev: 813C Up: Map Next: 81B3