diff options
Diffstat (limited to 'home')
-rw-r--r-- | home/audio.asm | 143 | ||||
-rw-r--r-- | home/bankswitch.asm | 8 | ||||
-rw-r--r-- | home/clear_sprites.asm | 23 | ||||
-rw-r--r-- | home/copy.asm | 68 | ||||
-rw-r--r-- | home/copy_tilemap.asm | 18 | ||||
-rw-r--r-- | home/farcall.asm | 36 | ||||
-rw-r--r-- | home/init.asm | 129 | ||||
-rw-r--r-- | home/interrupts.asm | 26 | ||||
-rw-r--r-- | home/lcd.asm | 77 | ||||
-rw-r--r-- | home/oam_dma.asm | 23 | ||||
-rw-r--r-- | home/predef.asm | 43 | ||||
-rw-r--r-- | home/rst.asm | 25 | ||||
-rw-r--r-- | home/serial.asm | 53 | ||||
-rw-r--r-- | home/sram.asm | 19 | ||||
-rw-r--r-- | home/vblank.asm | 29 |
15 files changed, 720 insertions, 0 deletions
diff --git a/home/audio.asm b/home/audio.asm new file mode 100644 index 0000000..bb49d42 --- /dev/null +++ b/home/audio.asm @@ -0,0 +1,143 @@ +SECTION "Audio", ROM0[$3CBF] + +DisableAudio:: ; 3cbf + push hl + push de + push bc + push af + ldh a, [hROMBank] + push af + ld a, BANK(_DisableAudio) + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + call _DisableAudio + pop af + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + pop af + pop bc + pop de + pop hl + ret + + +UpdateSound:: ; 3cdb + push hl + push de + push bc + push af + ldh a, [hROMBank] + push af + ld a, BANK(_UpdateSound) + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + call _UpdateSound + pop af + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + pop af + pop bc + pop de + pop hl + ret + + +LoadMusicByte:: ; 3cf7 + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + ld a, [de] + push af + ld a, BANK(_UpdateSound) + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + pop af + ret + + +PlayMusic:: ; 3d07 + push hl + push de + push bc + push af + ldh a, [hROMBank] + push af + ld a, BANK(_PlayMusic) + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + call _PlayMusic + pop af + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + pop af + pop bc + pop de + pop hl + ret + + +PlayCryHeader:: ; 3d23 + push hl + push de + push bc + push af + ldh a, [hROMBank] + push af + + ld a, BANK(CryHeaders) + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + ld hl, CryHeaders +REPT 6 + add hl, de +ENDR + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld a, [hli] + ld [wCryPitch], a + ld a, [hli] + ld [wCryPitch + 1], a + ld a, [hli] + ld [wCryLength], a + ld a, [hl] + ld [wCryLength + 1], a + + ld a, BANK(_PlayCryHeader) + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + call _PlayCryHeader + + pop af + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + pop af + pop bc + pop de + pop hl + ret + + + + +PlaySFX:: ; 3d63 + push hl + push de + push bc + push af + ldh a, [hROMBank] + push af + ld a, BANK(PlaySFX_) + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + call PlaySFX_ + pop af + ld [MBC3RomBank], a ; Unsafe + ldh [hROMBank], a + pop af + pop bc + pop de + pop hl + ret + + diff --git a/home/bankswitch.asm b/home/bankswitch.asm new file mode 100644 index 0000000..67fae1a --- /dev/null +++ b/home/bankswitch.asm @@ -0,0 +1,8 @@ +SECTION "Bankswitch", ROM0[$32C2] + +; Moved to a rst vector in final US releases (not sure about JP) +; All rst vectors are unused at this point in development +Bankswitch:: ; 32c2 + ldh [hROMBank], a + ld [MBC3RomBank], a + ret diff --git a/home/clear_sprites.asm b/home/clear_sprites.asm new file mode 100644 index 0000000..9ce9a54 --- /dev/null +++ b/home/clear_sprites.asm @@ -0,0 +1,23 @@ +SECTION "Sprite clearing", ROM0[$32DC] + +ClearSprites:: ; 32dc + ld hl, wVirtualOAM + ld b, wVirtualOAMEnd - wVirtualOAM + xor a +.loop + ld [hli], a + dec b + jr nz, .loop + ret + +HideSprites:: ; 32e7 + ld hl, wVirtualOAM + ld de, SPRITEOAMSTRUCT_LENGTH + ld b, NUM_SPRITE_OAM_STRUCTS + ld a, $A0 +.loop + ld [hli], a + add hl, de + dec b + jr nz, .loop + ret diff --git a/home/copy.asm b/home/copy.asm new file mode 100644 index 0000000..f89bd49 --- /dev/null +++ b/home/copy.asm @@ -0,0 +1,68 @@ +SECTION "Copy functions", ROM0[$32F7] + +FarCopyBytes:: ; 32f7 + ld [wBuffer], a + ldh a, [hROMBank] + push af + ld a, [wBuffer] + call Bankswitch + call CopyBytes + pop af + jp Bankswitch + +CopyBytes:: ; 330a + ld a, b + and a + jr z, CopyBytesSmall + ld a, c + and a + jr z, .next + inc b +.next + call CopyBytesSmall + dec b + jr nz, .next + ret + +CopyBytesSmall:: ; 331a + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, CopyBytesSmall + ret + + +GetFarByte:: ; 3321 + ld [wBuffer], a + ldh a, [hROMBank] + push af + ld a, [wBuffer] + call Bankswitch + ld a, [hl] + ld [wBuffer], a + pop af + call Bankswitch + ld a, [wBuffer] + ret + + +ByteFill:: ; 3339 + push af + ld a, b + and a + jr z, .small_fill + ld a, c + and a + jr z, .start_filling +.small_fill + inc b +.start_filling + pop af +.loop + ld [hli], a + dec c + jr z, .loop + dec b + jr z, .loop + ret diff --git a/home/copy_tilemap.asm b/home/copy_tilemap.asm new file mode 100644 index 0000000..950bb24 --- /dev/null +++ b/home/copy_tilemap.asm @@ -0,0 +1,18 @@ +SECTION "Tilemap copy/restore funcs", ROM0[$3355] + +BackUpTilesToBuffer:: ; 3355 + hlcoord 0, 0 + decoord 0, 0, wTileMapBackup + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + jp CopyBytes + +ReloadTilesFromBuffer:: ; 3361 + xor a + ldh [hBGMapMode], a + hlcoord 0, 0, wTileMapBackup + decoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + call CopyBytes + ld a, 1 + ldh [hBGMapMode], a + ret diff --git a/home/farcall.asm b/home/farcall.asm new file mode 100644 index 0000000..68f8ab0 --- /dev/null +++ b/home/farcall.asm @@ -0,0 +1,36 @@ +SECTION "Farcall", ROM0[$2FA8] + +FarCall_hl:: ; 2fa8 + push af + ld a, b + ld [wFarCallBCBuffer], a + ld a, c + ld [wFarCallBCBuffer + 1], a + pop af + ld b, a + ldh a, [hROMBank] + push af + ld a, b + call Bankswitch + ld bc, .return + push bc + push hl + ld a, [wFarCallBCBuffer] + ld b, a + ld a, [wFarCallBCBuffer + 1] + ld c, a + ret + +.return + ld a, b + ld [wFarCallBCBuffer], a + ld a, c + ld [wFarCallBCBuffer + 1], a + pop bc + ld a, b + call Bankswitch + ld a, [wFarCallBCBuffer] + ld b, a + ld a, [wFarCallBCBuffer + 1] + ld c, a + ret diff --git a/home/init.asm b/home/init.asm new file mode 100644 index 0000000..fcafa3c --- /dev/null +++ b/home/init.asm @@ -0,0 +1,129 @@ +SECTION "Entry point", ROM0[$100] + nop + jp Init + +SECTION "Global check value", ROM0[$14E] +; The ROM has an incorrect global check, so set it here +; It is not corrected by RGBFIX + db $21, $C6 + + +SECTION "Init", ROM0[$52F] + +Init: ; 052f + di + xor a + ld [rIF], a + ld [rIE], a + ld [rSCX], a + ld [rSCY], a + ld [rSB], a + ld [rSC], a + ld [rWX], a + ld [rWY], a + ld [rBGP], a + ld [rOBP0], a + ld [rOBP1], a + ld [rTMA], a + ld [rTAC], a + ld [wcc38], a ; Useless, since WRAM gets cleared right after + ld a, 1 << rTAC_ON | rTAC_4096_HZ + ld [rTAC], a + ld a, 1 << rLCDC_ENABLE + ld [rLCDC], a + + ld sp, wStackBottom + call ClearVRAM + ld hl, WRAM0_Begin + ld bc, WRAM1_End - WRAM0_Begin +.ByteFill ; 0565 + ld [hl], 0 + inc hl + dec bc + ld a, b + or c + jr nz, .ByteFill + ld hl, HRAM_Begin + ld bc, HRAM_End - HRAM_Begin + call ByteFill + call ClearSprites + + ld a, BANK(WriteOAMDMACodeToHRAM) + call Bankswitch + call WriteOAMDMACodeToHRAM + + xor a + ldh [hMapAnims], a + ldh [hSCX], a + ldh [hSCY], a + ldh [rJOYP], a + ld a, 1 << rSTAT_HBLANK + ld [rSTAT], a + ld a, SCREEN_HEIGHT_PX + ldh [hWY], a + ld [rWY], a + ld a, 7 + ldh [hWX], a + ld [rWX], a + + ld a, $FF + ldh [hLinkPlayerNumber], a + ld h, HIGH($9800) + call BlankBGMap + ld h, HIGH($9800) + call BlankBGMap + ld a, LCDC_DEFAULT + ld [rLCDC], a + + call DisableAudio + call _2007 + ; predef ??? + ld a, $4B ; TODO: add predefs so the line above can be uncommented + call Predef + ld a, $1F + ld [rIE], a + ld a, HIGH($9C00) + ldh [hBGMapAddress + 1], a + xor a + ldh [hBGMapAddress], a + + call DisableLCD + call ClearVRAM + ld a, LCDC_DEFAULT + ld [rLCDC], a + ei + + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + ld a, RTC_DH + ld [MBC3SRamBank], a + xor a + ld [SRAM_Begin], a + ld a, 0 ; Useless + ld [MBC3LatchClock], a + ld [MBC3SRamEnable], a + jp GameInit + +ClearVRAM: ; 05e6 + ld hl, VRAM_Begin + ld bc, VRAM_End - VRAM_Begin + call ByteFill + ret + +BlankBGMap: + ld a, $7F + jr _FillBGMap + +FillBGMap: + ld a, l + +_FillBGMap: + ld de, $400 + ld l, e +.loop + ld [hli], a + dec e + jr nz, .loop + dec d + jr nz, .loop + ret diff --git a/home/interrupts.asm b/home/interrupts.asm new file mode 100644 index 0000000..91610e0 --- /dev/null +++ b/home/interrupts.asm @@ -0,0 +1,26 @@ +SECTION "VBlank interrupt vector", ROM0[$040] + jp VBlank + +SECTION "LCD interrupt vector", ROM0[$048] + jp LCD + +SECTION "Timer interrupt vector", ROM0[$050] + jp TimerDummy + +SECTION "Serial interrupt vector", ROM0[$058] + jp Serial + +SECTION "Joypad interrupt vector", ROM0[$060] + jp JoypadDummy + + +SECTION "Timer dummy interrupt", ROM0[$42A] + +TimerDummy: ; 042a + reti + + +SECTION "Joypad dummy interrupt", ROM0[$7F7] + +JoypadDummy: ; 07f7 + reti
\ No newline at end of file diff --git a/home/lcd.asm b/home/lcd.asm new file mode 100644 index 0000000..dcf6bfa --- /dev/null +++ b/home/lcd.asm @@ -0,0 +1,77 @@ +SECTION "LCD functions", ROM0[$3AE] + +LCD:: ; 03ae + push af + ldh a, [hLCDCPointer] + and a + jr z, .done + push hl + rla + jr c, .try_hide_sprites + ld a, [rLY] + ld l, a + ld h, HIGH(wLYOverrides) + ld h, [hl] + ldh a, [hLCDCPointer] + ld l, a + ld a, h + ld h, $FF + ld [hl], a + pop hl + pop af + reti + +.try_hide_sprites + ld a, [rLY] + cp $80 + jr nz, .dont_hide + ld hl, rLCDC + res 1, [hl] +.dont_hide + pop hl + pop af + reti + + ; Seems unused? + ldh a, [hSCX] + ld [rSCX], a + ldh a, [hSCY] + ld [rSCY], a + pop hl +.done + pop af + reti + + +; 0:3e1 + sine_table 16 + + +DisableLCD:: ; 0401 + ld a, [rLY] + bit 7, a + ret z + xor a + ld [rIF], a + ld a, [rIE] + ld b, a + res 0, a + ld [rIE], a +.wait + ld a, [rLY] + cp LY_VBLANK + jr nz, .wait + ld a, [rLCDC] + and $7F ; Shut LCD down + ld [rLCDC], a + xor a + ld [rIF], a + ld a, b + ld [rIE], a + ret + +EnableLCD:: ; 0423 + ld a, [rLCDC] + set 7, a + ld [rLCDC], a + ret diff --git a/home/oam_dma.asm b/home/oam_dma.asm new file mode 100644 index 0000000..958e88c --- /dev/null +++ b/home/oam_dma.asm @@ -0,0 +1,23 @@ +SECTION "OAM DMA", ROMX[$4153],BANK[1] + +WriteOAMDMACodeToHRAM:: ; 4153 + ld c, LOW(hOAMDMA) + ld b, .OAMDMAEnd - .OAMDMA + ld hl, .OAMDMA +.loop + ld a, [hli] + ld [$ff00+c], a + inc c + dec b + jr nz, .loop + ret + +.OAMDMA ; 4161 + ld a, HIGH(wVirtualOAM) + ldh [rDMA], a +.wait + ld a, $28 + dec a + jr nz, .wait + ret +.OAMDMAEnd ; 416b diff --git a/home/predef.asm b/home/predef.asm new file mode 100644 index 0000000..6c85236 --- /dev/null +++ b/home/predef.asm @@ -0,0 +1,43 @@ +SECTION "Predef", ROM0[$2FDE] + +Predef:: ; 2fde + ld [wPredefID], a + ldh a, [hROMBank] + push af + ld a, BANK(GetPredefPointer) + call Bankswitch + call GetPredefPointer + call Bankswitch + ld hl, .return + push hl + push de + jr .save_regs + +.return + ld a, h + ld [wPredefHL], a + ld a, l + ld [wPredefHL + 1], a + pop hl + ld a, h ; Could have used `pop af` instead + call Bankswitch + ld a, [wPredefHL] + ld h, a + ld a, [wPredefHL + 1] + ld l, a + ret + +.save_regs + ld a, h + ld [wPredefHL], a + ld a, l + ld [wPredefHL + 1], a + ld a, d + ld [wPredefDE], a + ld a, e + ld [wPredefDE + 1], a + ld a, b + ld [wPredefBC], a + ld a, c + ld [wPredefBC + 1], a + ret diff --git a/home/rst.asm b/home/rst.asm new file mode 100644 index 0000000..851775b --- /dev/null +++ b/home/rst.asm @@ -0,0 +1,25 @@ +; rst vectors + +SECTION "rst00", ROM0[$000] + rst $38 + +SECTION "rst08", ROM0[$008] + rst $38 + +SECTION "rst10", ROM0[$010] + rst $38 + +SECTION "rst18", ROM0[$018] + rst $38 + +SECTION "rst20", ROM0[$020] + rst $38 + +SECTION "rst28", ROM0[$028] + rst $38 + +SECTION "rst30", ROM0[$030] + rst $38 + +SECTION "rst38", ROM0[$038] + jp $F080 ; Jumps in the middle of unmapped memory. Probably used to trigger a breakpoint of sorts. diff --git a/home/serial.asm b/home/serial.asm new file mode 100644 index 0000000..b474e5d --- /dev/null +++ b/home/serial.asm @@ -0,0 +1,53 @@ +SECTION "Serial handler", ROM0[$602] + +Serial:: + push af + push bc + push de + push hl + ldh a, [hLinkPlayerNumber] + inc a + jr z, .init_player_number + + ld a, [rSB] + ldh [hSerialRecieve], a + ldh a, [hSerialSend] + ld [rSB], a + ldh a, [hLinkPlayerNumber] + cp 2 + jr z, .done + ld a, 1 << rSC_ON + ld [rSC], a + jr .done + +.init_player_number + ld a, [rSB] + ldh [hSerialRecieve], a + ldh [hLinkPlayerNumber], a + cp 2 + jr z, .master + xor a + ld [rSB], a + ld a, 3 + ld [rDIV], a +.wait + ld a, [rDIV] + bit 7, a + jr nz, .wait + ld a, 1 << rSC_ON + ld [rSC], a + jr .done +.master + xor a + ld [rSC], a + +.done + ld a, 1 + ldh [hSerialRecieved], a + ld a, SERIAL_NO_DATA_BYTE + ldh [hSerialSend], a + pop hl + pop de + pop bc + pop af + reti diff --git a/home/sram.asm b/home/sram.asm new file mode 100644 index 0000000..c204b9b --- /dev/null +++ b/home/sram.asm @@ -0,0 +1,19 @@ +SECTION "SRAM functions", ROM0[$32A7] + +OpenSRAM:: ; 32a7 + push af + ld a, 1 + ld [MBC3LatchClock], a + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + pop af + ld [MBC3SRamBank], a + ret + +CloseSRAM:: ; 32b7 + push af + ld a, SRAM_DISABLE + ld [MBC3LatchClock], a + ld [MBC3SRamEnable], a + pop af + ret diff --git a/home/vblank.asm b/home/vblank.asm new file mode 100644 index 0000000..efa7196 --- /dev/null +++ b/home/vblank.asm @@ -0,0 +1,29 @@ +SECTION "VBlank handler", ROM0[$150] + +VBlank:: ; 0150 + push af + push bc + push de + push hl + ldh a, [hVBlank] + and 3 + ld e, a + ld d, 0 + ld hl, .blanks + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .return + push de + jp hl +.return + pop hl + pop de + pop bc + pop af + reti + +.blanks + ; TODO |