Load_Prepared_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 LD A, ($mem_prepared_block_position) SUB high($VRAM_tilemap_1) ADD high($mem_map_loading_buffer) LD ($mem_prepared_block_position), A CALL =Display_Main_Prepared_Block INC C LD A, C CP E JR NZ, =.For_X LD A, $mem_viewport_x SUB $02 LD C, A 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 RES 0, A LD $mem_map_loading_flags, A LD A, $mem_moving_animation_step LD C, A LD A, $mem_bunny_direction AND $07 DEC A AND $01 ADD 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 ADD A OR E LD E, A LD A, D OR high($VRAM_tilemap_1) LD D, A POP BC POP AF RET Load_Block_From_Solid: ; X in A, Y in B .AF_AF_BC_Push: POP AF .AF_BC_Push: 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 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), A LD A, E LD ($mem_prepared_block_position+1), A POP AF CALL =Is_Solid CP $00 JR Z, =Load_Block.Empty Load_Block.Solid: LD A, C AND 0b0101 SRA A RRA RLCA ADD $20 LD ($mem_prepared_block_tile), A LD A, C AND 0b0110 SRA A ADD $24 LD ($mem_prepared_block_tile+1), A LD A, C AND 0b1001 SRA A RRA RLCA SRA A RRA RLCA ADD $28 LD ($mem_prepared_block_tile+2), A LD A, C AND 0b1010 SRA A RRA RRA RLCA ADD $2c LD ($mem_prepared_block_tile+3), A JR =Load_Block.End Load_Block.Empty: LD A, $00 LD ($mem_prepared_block_tile), A LD ($mem_prepared_block_tile+1), A LD ($mem_prepared_block_tile+2), A LD ($mem_prepared_block_tile+3), A Load_Block.End: POP DE POP AF POP BC RET Load_Additional_Block: LD A, $mem_display_flag BIT 6, A RET Z LD A, $mem_additional_loading_block_y LD B, A LD A, $mem_additional_loading_block_x CALL =Load_Block .COPY_4BYTES $mem_additional_loading_block_tile, $mem_prepared_block_tile LD A, ($mem_prepared_block_position) LD ($mem_additional_loading_block_position), A LD A, ($mem_prepared_block_position+1) LD ($mem_additional_loading_block_position+1), A RET Display_Prepared_Blocks: LD A, $mem_map_loading_flags BIT 2, A JR Z, =.Skip_Main LD A, $mem_map_loading_flags RES 2, A LD $mem_map_loading_flags, A CALL =Display_Main_Prepared_Block .Skip_Main: LD A, $mem_display_flag BIT 6, A RET Z RES 6, A LD $mem_display_flag, A .COPY_4BYTES $mem_prepared_block_tile, $mem_additional_loading_block_tile LD A, ($mem_additional_loading_block_position) LD ($mem_prepared_block_position), A LD A, ($mem_additional_loading_block_position+1) LD ($mem_prepared_block_position+1), A Display_Main_Prepared_Block: PUSH AF PUSH BC PUSH DE LD A, ($mem_prepared_block_position) LD D, A LD A, ($mem_prepared_block_position+1) LD E, A LD A, ($mem_prepared_block_tile) LD (DE), A INC E LD A, ($mem_prepared_block_tile+1) LD (DE), A LD A, E OR $20 DEC A LD E, A LD A, ($mem_prepared_block_tile+2) LD (DE), A INC E LD A, ($mem_prepared_block_tile+3) LD (DE), A 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, high($mem_dungeon_map) LD A, (BC) AND (HL) CP $01 LD A, $00 RL A POP BC RET Is_Solid.Solid: LD A, $01 POP BC RET