; VBlank: Write loading text, then wait for generation, then loading vram stuff ; When VBlank interrupts -> context switch ; When stat out of vblank interrupt -> context switch back to generation .MACRODEF ENABLE_MODE_2_INTERRUPT LD A, low(=Dungeon_generation_Out_Of_VBlank) LD ($mem_stat_jump_destination), A LD A, high(=Dungeon_generation_Out_Of_VBlank) LD ($mem_stat_jump_destination+1), A .RESET_INTERRUPTS LD A, $20 LD $reg_lcd_status, A LD A, $02 LD $reg_interrupt_enable, A .END .MACRODEF DISABLE_MODE_2_INTERRUPT LD A, $00 LD $reg_lcd_status, A LD A, $00 LD $reg_interrupt_enable, A .END New_Dungeon: LD SP, $fffe LD A, $00 LD $reg_viewport_x, A LD A, $68 LD $reg_viewport_y, A LD A, $00 LD $mem_display_flag, A LD HL, =Dungeon CALL =Load_Dungeon_Txt LD A, $f4 LD ($9ecb), A LD HL, $9ec9 LD A, $mem_floor_count CALL =Print_8bit LD A, $07 LD $reg_bg_palette, A LD A, $lcdc_guibg_tilemap LD $reg_lcd_controller, A CALL =Reset_Map LD HL, =Dungeon CALL =Load_Dungeon_Spawn_patterns LD A, $entity_questgoalbunny_index LD $mem_loaded_special_entity_index, A CALL =Reload_EP_Cost CALL =Dungeon_Generation CALL =Initialize_Entities CALL =Initialize_Objects ; Reset animations LD HL, $mem_animation_list LD BC, $1f CALL =bzero ; Clear OAM buffer LD HL, $mem_oam_buffer LD BC, $00a0 CALL =bzero LD A, $00 LD $mem_display_flag, A LD $mem_moving_animation_step, A LD $mem_animation_wait_frames, A LD $mem_blinking_animation_counter, A LD A, $mem_bunny_x LD $mem_bunny_predicted_x, A LD A, $mem_bunny_y LD $mem_bunny_predicted_y, A LD A, $mem_map_loading_flags RES 3, A LD $mem_map_loading_flags, A LD A, $enum_dungeon_mode LD $mem_current_mode, A LD $mem_requested_mode, A LD A, $00 LD $mem_oam_buffer_low, A CALL =Display_Entities CALL =Generation_Event_Execution CALL =Load_Prepared_Map CALL =VBlank_Wait Dungeon_generation_VBlank: .ENABLE_MODE_2_INTERRUPT EI ; Heart LD A, $f0 LD ($9d62), A ; Energy points LD A, $f1 LD ($9d66), A ; Floor LD A, $f4 LD ($9d73), A LD B, B CALL =Reload_Entities_Tile_Data LD B, B ; Clear OAM LD HL, $fe00 LD BC, $00a0 CALL =bzero LD DE, $mem_map_loading_buffer LD HL, $9800 LD BC, $0400 CALL =memcpy CALL =Load_Objects LD HL, $9d71 LD A, $mem_floor_count CALL =Print_8bit CALL =Update_VBlank_Handler DI .DISABLE_MODE_2_INTERRUPT CALL =Reset_Entities_Collision_Map .ENABLE_VBLANK_INTERRUPTS .RESET_INTERRUPTS EI Wait_for_Interrupt.loop: LD A, $reg_lcd_status HALT JP =Wait_for_Interrupt.loop Dungeon_generation_Out_Of_VBlank: PUSH AF CALL =VBlank_Wait .ENABLE_MODE_2_INTERRUPT .RESET_INTERRUPTS POP AF RETI