Load_Map: LD A, $mem_viewport_x SUB $02 LD C, A ADD $10 LD E, A LD A, $mem_viewport_y SUB $02 LD B, A ADD $10 LD D, A .For_Y: .For_X: LD A, C CALL =Load_Block CALL =Display_Prepared_Block INC C LD A, C CP E JR NZ, =.For_X INC B LD A, B CP D JR NZ, =.For_Y RET Load_Next_Block_Row: ; (+1/-1 direction in B, block number (between 0-f) in C PUSH AF PUSH BC PUSH DE LD A, B CP $01 JR NZ, =Load_Next_Block_Row.Up LD A, $mem_viewport_y ADD $0C LD B, A JR =Load_Next_Block_Row.Set_X_Limits Load_Next_Block_Row.Up: LD A, $mem_viewport_y SUB $02 LD B, A Load_Next_Block_Row.Set_X_Limits: LD A, $mem_viewport_x SUB $03 LD D, A LD A, C ADD D LD D, A LD A, $mem_viewport_x ADD $0D LD E, A LD A, D CALL =Load_Block POP DE POP BC POP AF RET Load_Next_Block_Column: ; (+1/-1 direction in B), block number (between 0-f) in C PUSH AF PUSH BC PUSH DE LD A, B CP $01 JR NZ, =Load_Next_Block_Column.Left LD A, $mem_viewport_x ADD $0C LD D, A JR =Load_Next_Block_Column.Set_Y_Limits Load_Next_Block_Column.Left: LD A, $mem_viewport_x SUB $02 LD D, A Load_Next_Block_Column.Set_Y_Limits: LD A, $mem_viewport_y SUB $03 LD B, A LD A, $mem_viewport_y ADD $0D LD E, A LD A, C ADD B LD B, A LD A, D CALL =Load_Block POP DE POP BC POP AF RET Prepare_Scrolling_Map: LD A, $mem_map_loading_flags BIT 0, A JR Z, =Display_Scrolling_Map.End LD A, $mem_moving_animation_step LD C, A LD A, $mem_bunny_direction AND $07 DEC A AND $01 SLA A DEC A LD B, A LD A, $mem_bunny_direction AND $07 DEC A BIT 1, A JR NZ, =Display_Scrolling_Map.vertical Display_Scrolling_Map.horizontal: CALL =Load_Next_Block_Column JR =Display_Scrolling_Map.End Display_Scrolling_Map.vertical: CALL =Load_Next_Block_Row Display_Scrolling_Map.End: RET Construct_Tile_Address: ; Construct Tile Map address from A and B in DE PUSH AF PUSH BC AND $0f LD C, A LD A, B AND $0f LD B, A LD A, C LD D, $00 LD E, $00 LD E, B SWAP E SLA E RL D SLA E RL D SLA A OR E LD E, A LD A, D OR $98 LD D, A POP BC POP AF RET Load_Block: ; X in A, Y in B PUSH BC PUSH AF PUSH DE CALL =Construct_Tile_Address PUSH AF PUSH DE LD C, $00 LD D, A ; Checking down block LD A, D INC B CALL =Is_Solid OR C LD C, A DEC B SLA C ; Checking up block LD A, D DEC B CALL =Is_Solid OR C LD C, A INC B SLA C ; Checking right block LD A, D INC A CALL =Is_Solid OR C LD C, A SLA C ; Checking left block LD A, D DEC A CALL =Is_Solid OR C LD C, A SLA C SLA C LD A, C ADD $20 LD C, A LD A, $mem_map_loading_flags SET 2, A LD $mem_map_loading_flags, A POP DE LD A, D LD $mem_prepared_block_position_1, A LD A, E LD $mem_prepared_block_position_2, A POP AF CALL =Is_Solid CP $00 JR Z, =Load_Block.Empty Load_Block.Solid: LD A, C LD $mem_prepared_block_tile, A JR =Load_Block.End Load_Block.Empty: LD A, $00 LD $mem_prepared_block_tile, A Load_Block.End: POP DE POP AF POP BC RET Display_Prepared_Block: PUSH AF PUSH BC PUSH DE LD A, $mem_map_loading_flags BIT 2, A JR Z, =.End LD A, $mem_map_loading_flags RES 2, A LD $mem_map_loading_flags, A LD A, $mem_prepared_block_position_1 LD D, A LD A, $mem_prepared_block_position_2 LD E, A LD A, $mem_prepared_block_tile LD C, A LD (DE), A LD A, E OR $20 LD E, A LD A, C OR $02 LD (DE), A INC E LD A, C OR $03 LD (DE), A LD A, E AND $DF LD E, A LD A, C OR $01 LD (DE), A .End: POP DE POP BC POP AF RET Is_Solid: ; X in A, Y in B, Result A PUSH BC CP $20 JR NC, =Is_Solid.Solid LD C, A LD A, B CP $20 JR NC, =Is_Solid.Solid LD A, C LD H, $00 CP $10 RL B AND $0f CP $08 RL B AND $07 LD L, A LD C, B LD B, $mem_dungeon_map_high LD A, (BC) AND (HL) CP $01 LD A, $00 RL A POP BC RET Is_Solid.Solid: LD A, $01 POP BC RET