summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRangi <remy.oukaour+rangi42@gmail.com>2020-09-11 13:50:12 -0400
committermid-kid <esteve.varela@gmail.com>2020-09-12 11:21:09 +0200
commitcf42820a06add7679048e3ce4be40f8483dfdf22 (patch)
tree5cae5f86e61aeb3a91ffb736a967105c630c77c4
parenta946e0ba851ad41b8d434e7494824128b247935a (diff)
Disassemble the start of bank 0
-rw-r--r--Makefile2
-rw-r--r--include/macros.inc12
-rw-r--r--shim.sym99
-rw-r--r--source/bank_00.asm754
4 files changed, 861 insertions, 6 deletions
diff --git a/Makefile b/Makefile
index 87151fb..b10b1d0 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ RGBGFX := rgbgfx
RGBLINK := rgblink
RGBFIX := rgbfix
-RGBASMFLAGS := -p 0xff -L
+RGBASMFLAGS := -p 0xff -L -h -E
RGBLINKFLAGS := -p 0xff -d
RGBFIXFLAGS := -p 0xff -c -m 0x1b -r 0x03 -k "01" -i "AKVJ" -t "POKEPICROSS"
diff --git a/include/macros.inc b/include/macros.inc
index 8b95257..2b5b6b8 100644
--- a/include/macros.inc
+++ b/include/macros.inc
@@ -9,3 +9,15 @@ farcall: macro
pop af
call _farcall
endm
+
+farjp: macro
+ push af
+ ld a, LOW(\1)
+ ld [w_farcall_target + 0], a
+ ld a, HIGH(\1)
+ ld [w_farcall_target + 1], a
+ ld a, BANK(\1)
+ ld [w_bank_temp], a
+ pop af
+ jp _farjp
+endm
diff --git a/shim.sym b/shim.sym
index 52cb5d5..de92902 100644
--- a/shim.sym
+++ b/shim.sym
@@ -1,11 +1,87 @@
+00:04c5 lcd
+00:0531 timer
+00:0533 joypad
+
+00:0df5 function_00_0df5
+00:0ecf function_00_0ecf
+00:0f20 function_00_0f20
+00:103c function_00_103c
+00:114e function_00_114e
+00:11f1 function_00_11f1
+00:1caa function_00_1caa
+00:1cfa function_00_1cfa
+00:1d59 function_00_1d59
+00:1de7 function_00_1de7
+00:2312 function_00_2312
+00:26c1 function_00_26c1
+
+04:43ec function_04_43ec
+
05:420f text_scroll_char_print
-00:c31e w_bank_temp ; db
-00:c317 w_farcall_target ; dw
+00:a03e s_a03e
+00:a040 s_a040
+00:a041 s_a041
+00:a042 s_a042
+00:a043 s_a043
+00:a04a s_a04a
+00:a04b s_a04b
+00:a054 s_a054
+00:a055 s_a055
+00:a056 s_a056
+00:a057 s_a057
+00:a058 s_a058
+00:a059 s_a059
+00:a05b s_a05b
+00:a06c s_a06c
+00:a06d s_a06d
+00:a071 s_a071
+00:a072 s_a072
+00:a073 s_a073
+00:a07d s_a07d
+
00:c315 w_bank_rom ; db
+00:c317 w_farcall_target ; dw
+00:c317 w_farcall_target_low
+00:c318 w_farcall_target_high
+00:c31e w_bank_temp ; db
+
+00:c301 w_c301
+00:c314 w_c314
+00:c316 w_c316
+00:c320 w_c320
+00:c321 w_c321
+00:c322 w_c322
+00:c325 w_c325
+00:c326 w_c326
+00:c327 w_c327
+00:c329 w_c329
+00:c32a w_c32a
+00:c32c w_c32c
+00:c32d w_c32d
+00:c330 w_c330
+00:c333 w_c333
+
+00:c336 w_LCDC
+00:c337 w_BGP
+00:c338 w_OBP0
+00:c339 w_OBP1
+00:c33a w_SCX
+00:c33b w_SCY
+00:c33c w_WX
+00:c33d w_WY
+00:c33e w_LYC
+00:c33f w_STAT
-00:c336 w_c336
+00:c340 w_c340
+00:c341 w_vblank_ran
00:c342 w_c342
+00:c344 w_c344
+00:c345 w_c345
+00:c357 w_c357
+00:c358 w_c358
+00:c359 w_c359
+00:c35a w_c35a
00:c35b w_vwf_char_start_x ; db
00:c35c w_vwf_char_start_y ; db
00:c35d w_vwf_char_end_x ; db
@@ -26,6 +102,14 @@
00:c36d w_vwf_char_buffer ; ds ??
00:cd6d w_cd6d
00:cd6e w_cd6e
+00:cd73 w_cd73
+00:cdcc w_cdcc
+00:cdce w_cdce
+00:cdd0 w_cdd0
+00:cdfc w_cdfc
+
+00:ff80 h_oam_dma
+00:fffe h_stack_bottom
01:d548 w_text_cur_string ; dw
01:d546 w_text_cur_x ; db
@@ -33,3 +117,12 @@
01:d55e w_textbox_x ; db
01:d560 w_textbox_width ; db
01:d561 w_textbox_height ; db
+
+01:d568 w_d568
+01:d61b w_d61b
+01:d6b5 w_d6b5
+01:df3f w_df3f ; ds 3
+01:df47 w_df47
+01:df62 w_df62
+
+01:dfff w_stack_bottom
diff --git a/source/bank_00.asm b/source/bank_00.asm
index c66c27d..2d57652 100644
--- a/source/bank_00.asm
+++ b/source/bank_00.asm
@@ -1,4 +1,487 @@
INCLUDE "hardware.inc"
+INCLUDE "macros.inc"
+
+SECTION "rst0", ROM0[$0000]
+rst0::
+ di
+ jp start
+
+SECTION "rst8", ROM0[$0008]
+rst8::
+ ldh a, [rLCDC]
+ bit 7, a ; LCDCF_ON
+ ret z
+ ld hl, w_vblank_ran
+ xor a
+ ld [hl], a
+.wait
+ halt
+ ld a, [hl]
+ and a
+ jr z, .wait
+ ret
+
+SECTION "jumptable", ROM0[$0018]
+jumptable::
+ add a
+ pop hl
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld l, e
+ ld h, d
+ jp hl
+
+SECTION "vblank_interrupt", ROM0[$0040]
+vblank_interrupt::
+ jp vblank
+
+SECTION "lcd_interrupt", ROM0[$0048]
+lcd_interrupt::
+ jp lcd
+
+SECTION "timer_interrupt", ROM0[$0050]
+timer_interrupt::
+ jp timer
+
+SECTION "serial_interrupt", ROM0[$0058]
+serial_interrupt::
+ jp serial
+
+SECTION "joypad_interrupt", ROM0[$0060]
+joypad_interrupt::
+ jp joypad
+
+SECTION "start", ROM0[$0100]
+start::
+ nop
+ jp _start
+
+SECTION "_start, etc", ROM0[$0150]
+_start::
+ ld c, a
+ xor a
+ ld [w_c357], a
+ ld [w_c358], a
+ ld a, c
+ cp $11
+ jr nz, .no_speed_switch
+ ld a, $1
+ ld [w_c357], a
+ ld [w_c358], a
+ ld hl, rSPD
+ bit 7, [hl] ; KEY1F_DBLSPEED
+ jr nz, .no_speed_switch
+ xor a
+ ldh [rIF], a
+ ldh [rIE], a
+ ldh a, [rP1]
+ or P1F_GET_NONE
+ ldh [rP1], a
+ ldh a, [rSPD]
+ ld a, KEY1F_PREPARE
+ ldh [rSPD], a
+ ei
+ di
+ db $10, $6f ; corrupted stop
+.no_speed_switch
+
+ ld a, $1
+ ld [w_c325], a
+ xor a
+ ld [w_c326], a
+ ld [w_c329], a
+ ld [w_c32c], a
+ ld [w_c327], a
+ ld [w_c32a], a
+ ld [w_c32d], a
+ ld [w_c330], a
+ ld [w_c333], a
+
+ ld sp, h_stack_bottom
+ di
+ xor a
+ ldh [rIF], a
+
+ ldh a, [rLCDC]
+ bit 7, a ; LCDCF_ON
+ jr nz, .lcd_on
+ set 7, a ; LCDCF_ON
+ ldh [rLCDC], a
+.lcd_on
+ ld bc, 2
+ call function_00_1120
+.wait_vblank
+ ldh a, [rLY]
+ cp SCRN_Y + 1
+ jr c, .wait_vblank
+ ld a, LCDCF_ON
+ ldh [rLCDC], a
+ xor a
+ ldh [rBGP], a
+ ldh [rOBP0], a
+ ldh [rOBP1], a
+ ld bc, 2
+ call function_00_1120
+
+ call function_00_0ecf
+ ld a, CART_SRAM_ENABLE
+ ld [rRAMG], a
+ ld a, $01
+ ld [rROMB0], a
+ ld a, $00
+ ld [rRAMB], a
+ ld a, $01
+ ld [w_bank_rom], a
+
+ ld a, [w_c344]
+ push af
+ ld a, [w_c357]
+ push af
+ ld a, [w_c358]
+ push af
+ ld hl, _RAM
+ ld bc, $1fff
+ call clear_mem
+ pop af
+ ld [w_c358], a
+ pop af
+ ld [w_c357], a
+ pop af
+ ld [w_c344], a
+
+ ld a, $02
+ ld [w_c316], a
+ ld a, $01
+ ld [w_d61b], a
+
+ ld a, $7e ; BANK(???)
+ ld [w_c35a], a
+ ld sp, w_stack_bottom
+ call function_00_0f20
+ call function_00_1085
+ call clear_scrn0
+ call function_00_103c
+ xor a
+ ld [w_c320], a
+ ld [w_c321], a
+ ld [w_c322], a
+ ld [w_c340], a
+ ld [w_cdcc], a
+ ld [w_c325], a
+ ld [s_a07d], a
+ ld [s_a072], a
+ ld [w_cdce], a
+
+ ld hl, w_LCDC
+ xor a
+ ld [hl+], a ; w_LCDC
+ ld [hl+], a ; w_BGP
+ ld [hl+], a ; w_OBP0
+ ld [hl+], a ; w_OBP1
+ ld [hl+], a ; w_SCX
+ ld [hl+], a ; w_SCY
+ ld a, SCRN_X + 6
+ ld [hl+], a ; w_WX
+ ld a, SCRN_Y - 1
+ ld [hl+], a ; w_WY
+ xor a
+ ld [hl+], a ; w_LYC
+ ld [hl+], a ; w_STAT
+ ld [w_c359], a
+
+ call function_00_24b7
+ ld a, IEF_SERIAL | IEF_VBLANK
+ ldh [rIE], a
+ ei
+
+ call function_00_1caa
+ rl a
+ and $1
+ ld [w_c344], a
+ jr z, .skip_call
+ call function_00_1d59
+.skip_call
+
+ xor a
+ ld [w_c345], a
+ ld a, $0
+ call function_00_0d91
+ ld a, $40
+ ld [w_cd73], a
+ call function_00_114e
+ xor a
+ ld [w_d568], a
+
+ farjp function_04_43ec
+
+function_00_0295::
+ ld a, $01
+ ld [w_c325], a
+ xor a
+ ld [w_c326], a
+ ld [w_c329], a
+ ld [w_c32c], a
+ ld [w_c327], a
+ ld [w_c32a], a
+ ld [w_c32d], a
+ ld [w_c330], a
+ ld [w_c333], a
+
+ ld sp, h_stack_bottom
+
+ ld a, $5
+ call function_00_0d91
+ ld a, $1
+ ld c, $0
+ call function_00_0d91
+ call function_00_0d58
+ ld c, $0
+ ld a, $1
+ call function_00_0d91
+
+ xor a
+ ld [w_BGP], a
+ ld [w_OBP0], a
+ ld [w_OBP1], a
+ ld bc, 2
+ call function_00_1120
+
+ di
+ xor a
+ ldh [rIF], a
+ ld sp, h_stack_bottom
+
+ call function_00_0ecf
+ ld a, CART_SRAM_ENABLE
+ ld [rRAMG], a
+ ld a, $01
+ ld [rROMB0], a
+ ld a, $00
+ ld [rRAMB], a
+ ld a, $01
+ ld [w_bank_rom], a
+
+ ld a, [w_d6b5]
+ push af
+ ld a, [w_c358]
+ push af
+ ld a, [w_c357]
+ push af
+ ld a, [w_c344]
+ push af
+ ld hl, _RAM
+ ld bc, $2000
+ call clear_mem
+ pop af
+ ld [w_c344], a
+ pop af
+ ld [w_c357], a
+ pop af
+ ld [w_c358], a
+ pop af
+ ld [w_d6b5], a
+
+ ld sp, w_stack_bottom
+ call function_00_0f20
+ call function_00_1085
+ call clear_scrn0
+ call function_00_103c
+ xor a
+ ld [w_c320], a
+ ld [w_c321], a
+ ld [w_c322], a
+ ld [w_c340], a
+ ld [w_cdcc], a
+ ld [w_c359], a
+ ld [s_a07d], a
+ ld [s_a072], a
+ ld [w_cdce], a
+ ld a, $7e ; BANK(???)
+ ld [w_c35a], a
+
+ ld hl, w_LCDC
+ xor a
+ ld [hl+], a ; w_LCDC
+ ld [hl+], a ; w_BGP
+ ld [hl+], a ; w_OBP0
+ ld [hl+], a ; w_OBP1
+ ld [hl+], a ; w_SCX
+ ld [hl+], a ; w_SCY
+ ld a, SCRN_X + 6
+ ld [hl+], a ; w_WX
+ ld a, SCRN_Y - 1
+ ld [hl+], a ; w_WY
+ xor a
+ ld [hl+], a ; w_LYC
+ ld [hl+], a ; w_STAT
+
+ call function_00_24b7
+ ld a, IEF_SERIAL | IEF_VBLANK
+ ldh [rIE], a
+ ei
+
+ xor a
+ ld [w_c345], a
+ ld a, $0
+ call function_00_0d91
+ ld a, $40
+ ld [w_cd73], a
+ call function_00_114e
+ xor a
+ ld [w_d568], a
+
+ ld a, $ff
+ ld hl, w_df3f
+ ld [hl+], a
+ ld [hl+], a
+ ld [hl], a
+
+ ld a, [w_df62]
+ and a
+ jr z, .jr_000_03a6
+ ld a, [w_c344]
+ and a
+ jr z, .jr_000_03a6
+ call function_00_1de7
+ ld a, $3
+ ld hl, $48cc ; ???
+ call function_00_1cfa
+ xor a
+ ld [w_df62], a
+.jr_000_03a6
+
+ farjp function_04_43ec
+
+vblank::
+ push af
+ push bc
+ push de
+ push hl
+ ld a, [s_a072]
+ and a
+ call nz, function_00_284d
+ ld a, [w_c301]
+ and a
+ jr z, .jr_000_03d5
+ ld a, $1
+ ld [w_vblank_ran], a
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+
+.jr_000_03d5:
+ call h_oam_dma
+
+ ld a, [w_cdcc]
+ and a
+ jr nz, .set_bg_8000
+ ld a, [w_LCDC]
+ ldh [rLCDC], a
+ jr .lcdc_done
+.set_bg_8000
+ ld a, [w_LCDC]
+ set 4, a ; LCDCF_BG8000
+ ldh [rLCDC], a
+.lcdc_done
+
+ ld a, [w_c345]
+ and a
+ jr nz, .skip_video_update
+ ld hl, w_BGP
+ ld a, [hl+] ; w_BGP
+ ldh [rBGP], a
+ ld a, [hl+] ; w_OBP0
+ ldh [rOBP0], a
+ ld a, [hl+] ; w_OBP1
+ ldh [rOBP1], a
+ ld a, [hl+] ; w_SCX
+ ldh [rSCX], a
+ ld a, [hl+] ; w_SCY
+ ldh [rSCY], a
+ ld a, [hl+] ; w_WX
+ ldh [rWX], a
+ ld a, [hl+] ; w_WY
+ ldh [rWY], a
+ ld a, [hl+] ; w_LYC
+ ldh [rLYC], a
+ ld a, [hl+] ; w_STAT
+ ldh [rSTAT], a
+ call function_00_11f1
+.skip_video_update
+
+ ld a, [w_cdd0]
+ and a
+ jr z, .continue
+ ld a, [w_c326]
+ cp $0f
+ jr nz, .continue
+ ld a, [w_c329]
+ and $0f
+ jr z, .continue
+ ld hl, function_00_0295
+ push hl
+ reti
+.continue
+
+ ld a, [w_c342]
+ inc a
+ ld [w_c342], a
+ ld a, $01
+ ld [w_vblank_ran], a
+ ld hl, w_cdfc
+ inc [hl]
+
+ ld a, [w_c345]
+ and a
+ jr nz, .continue_2
+ ld hl, function_00_0458
+ push hl
+ ld hl, function_00_0df5
+ push hl
+ reti
+.continue_2
+
+ ld hl, rSTAT
+.hblank_enter
+ ld a, STATF_LCD
+ and [hl]
+ jr nz, .hblank_enter
+
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+
+function_00_0458::
+ pop hl
+ pop de
+ pop bc
+
+ ld a, [w_c301]
+ and a
+ jr nz, .skip_hblank_wait
+ ldh a, [rLCDC]
+ bit 7, a ; LCDCF_ON
+ jr z, .hblank_enter
+.hblank_finish
+ ldh a, [rSTAT]
+ and STATF_LCD
+ jr z, .hblank_finish
+.hblank_enter
+ ldh a, [rSTAT]
+ and STATF_LCD
+ jr nz, .hblank_enter
+.skip_hblank_wait
+
+ pop af
+ ret
SECTION "vwf_draw_char", ROM0[$0723]
vwf_char_draw::
@@ -441,8 +924,8 @@ vwf_char_draw::
ld bc, w_vwf_char_buffer
; Ignore hblank (update during vblank?)
- ld a, [w_c336]
- bit 7, a
+ ld a, [w_LCDC]
+ bit 7, a ; LCDCF_ON
jr z, .write_tile_ignore_hblank_loop
.write_tile_loop
@@ -547,6 +1030,142 @@ vwf_char_draw::
db $00, $00, $68, $01, $d0, $02, $38, $04, $a0, $05, $08, $07, $70, $08, $d8, $09, $40, $0b, $a8, $0c, $fa, $57, $c3, $a7, $c8, $f0, $00, $f6, $30, $e0, $00, $f0, $4d, $3e, $01, $e0, $4d, $10, $6f
+SECTION "function_00_0d58, etc", ROM0[$0d58]
+function_00_0d58::
+ push hl
+ ldh a, [rLCDC]
+ bit 7, a ; LCDCF_ON
+ jr nz, .lcd_on
+
+; Wait for 70,000 clock cycles (17,500 machine cycles)
+ ld de, 1750
+.wait_loop
+ nop
+ nop
+ nop
+ dec de
+ ld a, d
+ or e
+ jr nz, .wait_loop
+
+ pop hl
+ ret
+
+.lcd_on
+ xor a
+ ld [w_c325], a
+ ld [w_c326], a
+ ld [w_c329], a
+ ld [w_c32c], a
+ rst rst8
+
+ xor a
+ ld [w_c327], a
+ ld [w_c32a], a
+ ld [w_c32d], a
+ ld a, $1
+ ld [w_c325], a
+
+.wait_ly
+ ldh a, [rLY]
+ cp 64
+ jr c, .wait_ly
+
+ pop hl
+ ret
+
+function_00_0d91::
+ push af
+ push bc
+ push de
+ push hl
+
+ cp $1
+ jr nz, .jr_000_0d9f
+ push af
+ ld a, c
+ ld [w_df47], a
+ pop af
+.jr_000_0d9f
+ ld l, a
+
+.wait_ly
+ ldh a, [rLY]
+ and a
+ jr z, .ly_ready
+ cp 48
+ jr c, .wait_ly
+ cp 130
+ jr nc, .wait_ly
+ ccf
+.ly_ready
+
+ ldh a, [rIE]
+ push af
+ res 0, a ; IEF_VBLANK
+ ldh [rIE], a
+ di
+ ld a, [w_c35a]
+ ld [rROMB0], a
+
+.main_loop
+ push bc
+ push hl
+ ld a, l
+ cp $1
+ jr nz, .skip_bankswitch
+ ld a, c
+ cp $80
+ jr c, .bank_7e
+ and $7f
+ ld c, a
+ ld a, $7f
+ jr .got_bank
+.bank_7e
+ ld a, $7e
+.got_bank
+ ld [w_c35a], a
+ ld [rROMB0], a
+ ld a, l
+.skip_bankswitch
+ call $4000
+ pop hl
+ pop bc
+ jr nc, .done
+ nop
+ nop
+ nop
+ nop
+ nop
+ jr .main_loop
+.done
+
+ ld a, [w_bank_rom]
+ ld [rROMB0], a
+ pop af
+ ldh [rIE], a
+ ei
+
+ pop hl
+ pop de
+ pop bc
+ pop af
+ ret
+
+SECTION "clear_mem", ROM0[$0f38]
+; Zeroes out RAM
+; Parameters:
+; hl - dest
+; bc - length
+clear_mem::
+ xor a
+ ld [hl+], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, clear_mem
+ ret
+
SECTION "vram_copy", ROM0[$0fbd]
; Parameters:
; a - bank
@@ -601,6 +1220,48 @@ vram_copy::
ld [rROMB0], a
ret
+SECTION "function_00_1085", ROM0[$1085]
+; Fills $c000--$c0ff with $f0 and sets [w_c314] = 0
+function_00_1085::
+ ld a, $f0
+ ld hl, _RAM
+.loop
+ ld [hl+], a
+ bit 0, h
+ jr z, .loop
+ xor a
+ ld [w_c314], a
+ ret
+
+SECTION "farjp", ROM0[$10b4]
+; Jump to w_farcall_target in w_bank_temp
+_farjp::
+ push af
+ push af
+ push hl
+ ld hl, sp + 4
+ ld a, [w_farcall_target + 0]
+ ld [hl+], a
+ ld a, [w_farcall_target + 1]
+ ld [hl], a
+ ld a, [w_bank_temp]
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ pop hl
+ pop af
+ ret
+
+SECTION "clear_scrn0", ROM0[$1031]
+; Fills _SCRN0 ($9800--$9BFF) with tile $01
+clear_scrn0::
+ ld a, $01
+ ld hl, _SCRN0
+.loop
+ ld [hl+], a
+ bit 2, h
+ jr z, .loop
+ ret
+
SECTION "farcall", ROM0[$10cd]
; Save current bank and jump to w_farcall_target in w_bank_temp
_farcall::
@@ -635,3 +1296,92 @@ farcall_ret::
inc sp
inc sp
ret
+
+SECTION "function_00_1120", ROM0[$1120]
+; Wait for 70,000 * bc clock cycles (17,500 * bc machine cycles)
+function_00_1120::
+ ld de, 1750
+.wait_loop
+ nop
+ nop
+ nop
+ dec de
+ ld a, d
+ or e
+ jr nz, .wait_loop
+ dec bc
+ ld a, b
+ or c
+ jr nz, function_00_1120
+ ret
+
+SECTION "function_00_24b7", ROM0[$24b7]
+function_00_24b7::
+ xor a
+ ldh [rSB], a
+ ldh [rSC], a
+ ld [s_a03e], a
+ dec a
+ ld [s_a058], a
+ ld [s_a059], a
+ call .sub
+ ret
+
+.sub
+ xor a
+ ld [s_a056], a
+ ld [s_a05b], a
+ ld [s_a06c], a
+ xor a
+ ld [s_a040], a
+ ld [s_a041], a
+ ld [s_a042], a
+ ld [s_a043], a
+ ld [s_a057], a
+ ld [s_a054], a
+ ld [s_a055], a
+ ld [s_a04a], a
+ ld [s_a04b], a
+ ld [s_a06d], a
+ ld [s_a073], a
+ ret
+
+SECTION "serial, etc", ROM0[$2836]
+serial::
+ push af
+ ldh a, [rSC]
+ bit 7, a ; transfer start flag
+ jr nz, .skip
+ push bc
+ push de
+ push hl
+ ld a, $01
+ ld [s_a05b], a
+ call function_00_2312
+ pop hl
+ pop de
+ pop bc
+.skip
+ pop af
+ reti
+
+function_00_284d::
+ ld a, [s_a03e]
+ cp $01
+ ret nz
+ ld a, [s_a058]
+ cp $ff
+ ret z
+ ld a, [s_a06c]
+ and a
+ ret nz
+ ld hl, s_a071
+ inc [hl]
+ ld a, [hl]
+ cp $06
+ ret c
+ xor a
+ ld [hl], a
+ ld [s_a073], a
+ call function_00_26c1
+ ret