From d78dc1b31c6ce8c14f24e45ab58c3818eaab49c7 Mon Sep 17 00:00:00 2001 From: Donkey Kong Date: Tue, 8 Aug 2023 21:34:21 +0930 Subject: [PATCH] Some more attempts at fixing things --- decompressed.us.yaml | 5 +- find_first_diff.sh | 4 +- include/arcade_int.h | 2 +- src/arcade/code_0.c | 67 ++++++++++++----------- src/dk64_boot/io/devmgr.c | 112 +++++++++++++++++++++++++++++++++++++- symbol_addrs.us.txt | 51 ++++++++++------- 6 files changed, 184 insertions(+), 57 deletions(-) diff --git a/decompressed.us.yaml b/decompressed.us.yaml index 16637dc..53f2093 100644 --- a/decompressed.us.yaml +++ b/decompressed.us.yaml @@ -188,7 +188,8 @@ segments: - [0x11180, rodata, os/exceptasm] - [0x111D0, rodata, gu/cosf] - [0x11220, rodata, gu/sinf] - - [0x11270, .rodata, io/devmgr] + - [0x11270, rodata] + - [0x112F0, .rodata, io/devmgr] - [0x11310, rodata] - { start: 0x11320, type: bss, vram: 0x80010720 } - name: assets @@ -554,7 +555,7 @@ segments: # - [0x21CDEF0, bin, data_213C0] # - [0x21CDF58, rgba16, img/arcade_80045428.rgba16, 48, 41] # - [0x21CEEB8, bin, data_22338] - - [0x21D3370, rodata, code_0] + - [0x21D3370, .rodata, code_0] - { start: 0x21D3730, type: bss, vram: 0x8004AC00 } - name: jetpac dir: jetpac diff --git a/find_first_diff.sh b/find_first_diff.sh index 4c58c42..d29d1d5 100755 --- a/find_first_diff.sh +++ b/find_first_diff.sh @@ -1,4 +1,6 @@ #!/bin/bash -cmp -l baserom.us.decompressed.z64 build/us/donkeykong64.us.uncompressed.z64 | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' +vbindiff baserom.us.decompressed.z64 ./build/us/donkeykong64.us.uncompressed.z64 + +# cmp -l baserom.us.decompressed.z64 build/us/donkeykong64.us.uncompressed.z64 | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' #diff -y <(xxd build/us/$1.us.bin) <(xxd build/us/$1.full) \ No newline at end of file diff --git a/include/arcade_int.h b/include/arcade_int.h index 86ca4db..96174c0 100644 --- a/include/arcade_int.h +++ b/include/arcade_int.h @@ -285,7 +285,7 @@ extern u8 D_arcade_8004A9D0; extern u8 D_arcade_8004A9DC; /*jmp_tbl D_arcade_8004A9EC[6]*/ -extern f32 D_arcade_8004AA18; +extern f32 D_arcade_8004AA18; // 1170.2857666 extern f64 D_arcade_8004AA98; extern f64 D_arcade_8004AAA0; extern f64 D_arcade_8004AAA8; diff --git a/src/arcade/code_0.c b/src/arcade/code_0.c index c8278eb..f594da4 100644 --- a/src/arcade/code_0.c +++ b/src/arcade/code_0.c @@ -1812,7 +1812,8 @@ void func_arcade_8002AFA4(Gfx **arg0, s32 arg1) { if (D_arcade_8004A338[D_arcade_8004BCD0[arg1].unk18] & 1) { phi_f0 = 1024.0f; } else { - phi_f0 = D_arcade_8004AA18; + // phi_f0 = D_arcade_8004AA18; + phi_f0 = 1170.2857666f; } guSprite2DInit( &D_arcade_8004AC00[D_global_asm_807444FC].sprite[arg1], D_arcade_8004BCD0[arg1].unk14, 0, @@ -2648,7 +2649,8 @@ void func_arcade_8002E3D4(s32 arg0) { D_arcade_8004BCD0[newFlameIndex].unk19 = 3; D_arcade_8004BCD0[newFlameIndex].y_velocity = -1; if (arcade_background_visual == 1) { - D_arcade_8004BCD0[newFlameIndex].x_velocity = D_arcade_8004AB24; + // D_arcade_8004BCD0[newFlameIndex].x_velocity = D_arcade_8004AB24; + D_arcade_8004BCD0[newFlameIndex].x_velocity = 0.4f; } else { if (D_arcade_8004BCD0[D_arcade_8004C71F].x_position < 160) { D_arcade_8004BCD0[newFlameIndex].x_velocity = -0.5f; @@ -2810,8 +2812,8 @@ void arcade_dk_title_update(s32 arg0) { } if (phi_v1 >= 0x3C) { if (phi_v1 >= 0x169) { - D_arcade_8004BCD0[arg0].y_velocity += D_arcade_8004AB28; - //D_arcade_8004BCD0[arg0].unkC += 0.05; + // D_arcade_8004BCD0[arg0].y_velocity += D_arcade_8004AB28; + D_arcade_8004BCD0[arg0].y_velocity += 0.05; D_arcade_8004BCD0[arg0].y_position += D_arcade_8004BCD0[arg0].y_velocity; D_arcade_8004BCD0[arg0].x_position += D_arcade_8004BCD0[arg0].x_velocity; if ((D_arcade_8004BCD0[arg0].y_velocity > 0.0f) && (D_arcade_8004BCD0[arg0].y_position >= 38.0f)) { @@ -2825,15 +2827,15 @@ void arcade_dk_title_update(s32 arg0) { if ((phi_v1 == 0x2D0) || (phi_v1 < 0x26C)) { D_arcade_8004BCD0[arg0].unk14 = &D_arcade_80040540; } - if (D_arcade_8004AB30 < D_arcade_8004BCD0[arg0].y_velocity) { - //if (0.06 < D_arcade_8004BCD0[arg0].unkC) { + // if (D_arcade_8004AB30 < D_arcade_8004BCD0[arg0].y_velocity) { + if (0.06 < D_arcade_8004BCD0[arg0].y_velocity) { D_arcade_8004C708 = (s32) (D_arcade_8004C708 + 1); func_global_asm_80737638(D_global_asm_8076D1F8, SFX_42_ARCADE_JUMPMAN_HIT, 0x7FFF, 0x3F, 1.0f, 0, 0); } if ((D_arcade_8004BCD0[arg0].x_position > 74.0f) && !(D_arcade_8004C6DC < 0x1A5)) { D_arcade_8004BCD0[arg0].x_velocity = -0.5f; - D_arcade_8004BCD0[arg0].y_velocity = D_arcade_8004AB38; - //D_arcade_8004BCD0[arg0].unkC = -0.81f; + // D_arcade_8004BCD0[arg0].y_velocity = D_arcade_8004AB38; + D_arcade_8004BCD0[arg0].y_velocity = -0.81f; } else { D_arcade_8004BCD0[arg0].x_velocity = 0.0f; @@ -3446,54 +3448,54 @@ void func_arcade_8003159C(Gfx **arg0) { if (D_arcade_8004C724 == 3) { func_arcade_800244E4(0x00, 0xff, 0xff, 0xff); func_arcade_80024508(0x78, 0x3b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A840, &D_arcade_8004A774); - //func_dk64_boot_800031E0(sp50, "NAME %.3s", &D_arcade_8004A774); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A840, &D_arcade_8004A774); + func_dk64_boot_800031E0(sp50, "NAME %.3s", &D_arcade_8004A774); func_arcade_8002451C(&spA0, sp50); func_arcade_80024508(0xA0, 0x41); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A84C); - //func_dk64_boot_800031E0(sp50, "---"); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A84C); + func_dk64_boot_800031E0(sp50, "---"); func_arcade_8002451C(&spA0, sp50); if (D_arcade_8004C6DC < 1800) { func_arcade_80024508(0x60, 0x7b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A850, 30 - D_arcade_8004C6DC/60); - //func_dk64_boot_800031E0(sp50, "REGI TIME <%02d>", 30 - D_arcade_8004C6DC/60); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A850, 30 - D_arcade_8004C6DC/60); + func_dk64_boot_800031E0(sp50, "REGI TIME <%02d>", 30 - D_arcade_8004C6DC/60); } else {//L800316A0 func_arcade_80024508(0x40, 0x7b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A864); - //func_dk64_boot_800031E0(sp50, "YOUR NAME WAS"); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A864); + func_dk64_boot_800031E0(sp50, "YOUR NAME WAS"); func_arcade_8002451C(&spA0, sp50); func_arcade_80024508(0xb0, 0x7b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A874); - //func_dk64_boot_800031E0(sp50, "REGISTERED."); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A874); + func_dk64_boot_800031E0(sp50, "REGISTERED."); }//L800316E8 func_arcade_8002451C(&spA0, sp50); func_arcade_800244E4(0xff, 0x00, 0x00, 0xff); func_arcade_80024508(0x58, 0x2b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A880); - //func_dk64_boot_800031E0(sp50, "NAME REGISTRATION"); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A880); + func_dk64_boot_800031E0(sp50, "NAME REGISTRATION"); func_arcade_8002451C(&spA0, sp50); func_arcade_800244E4(0x00, 0xff, 0x00, 0xff); func_arcade_80024508(0x58, 0x4b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A894); - //func_dk64_boot_800031E0(sp50, "A B C D E F G H I J"); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A894); + func_dk64_boot_800031E0(sp50, "A B C D E F G H I J"); func_arcade_8002451C(&spA0, sp50); func_arcade_80024508(0x58, 0x5b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A8A8); - //func_dk64_boot_800031E0(sp50, "K L M N O P Q R S T"); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A8A8); + func_dk64_boot_800031E0(sp50, "K L M N O P Q R S T"); func_arcade_8002451C(&spA0, sp50); func_arcade_80024508(0x58, 0x6b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A8BC); - //func_dk64_boot_800031E0(sp50, "U V W X Y Z . -"); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A8BC); + func_dk64_boot_800031E0(sp50, "U V W X Y Z . -"); func_arcade_8002451C(&spA0, sp50); func_arcade_80024508(0xd4, 0x6b); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A8CC); - //func_dk64_boot_800031E0(sp50, "ba"); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A8CC); + func_dk64_boot_800031E0(sp50, "ba"); func_arcade_8002451C(&spA0, sp50); }//L800317E0 @@ -3506,16 +3508,19 @@ void func_arcade_8003159C(Gfx **arg0) { && D_arcade_8004C6DC & 0x20 && D_arcade_8004C724 == 3 ) { - func_dk64_boot_800031E0(sp50, &D_arcade_8004A8D0, &D_arcade_8004A82C[i]); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A8D0, &D_arcade_8004A82C[i]); + func_dk64_boot_800031E0(sp50, "%.3s", &D_arcade_8004A82C[i]); } else {//L80031888 - func_dk64_boot_800031E0(sp50, &D_arcade_8004A8D8, D_arcade_8004A82C[i], arcade_saved_high_scores[i], arcade_saved_high_score_initials[i]); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A8D8, D_arcade_8004A82C[i], arcade_saved_high_scores[i], arcade_saved_high_score_initials[i]); + func_dk64_boot_800031E0(sp50, "%.3s %06d %.3s", D_arcade_8004A82C[i], arcade_saved_high_scores[i], arcade_saved_high_score_initials[i]); }//L800318B8 func_arcade_8002451C(&spA0, sp50); } func_arcade_800244E4(0x00, 0xff, 0x00, 0xff); func_arcade_80024508(0xb8, 0xdb); - func_dk64_boot_800031E0(sp50, &D_arcade_8004A8EC); + // func_dk64_boot_800031E0(sp50, &D_arcade_8004A8EC); + func_dk64_boot_800031E0(sp50, "CREDIT 00"); func_arcade_8002451C(&spA0, sp50); *arg0 = spA0; diff --git a/src/dk64_boot/io/devmgr.c b/src/dk64_boot/io/devmgr.c index 535f15e..ff894b6 100644 --- a/src/dk64_boot/io/devmgr.c +++ b/src/dk64_boot/io/devmgr.c @@ -1,5 +1,113 @@ -#include +#include #include "piint.h" +void __osDevMgrMain(void *args) +{ + OSIoMesg *mb; + OSMesg em; + OSMesg dummy; + s32 ret; + OSDevMgr *dm; + s32 messageSend; -#pragma GLOBAL_ASM("asm/nonmatchings/dk64_boot/io/devmgr/__osDevMgrMain.s") + messageSend = 0; + mb = NULL; + ret = 0; + dm = (OSDevMgr *)args; + while (TRUE) + { + osRecvMesg(dm->cmdQueue, (OSMesg)&mb, OS_MESG_BLOCK); + if (mb->piHandle != NULL && + mb->piHandle->type == DEVICE_TYPE_64DD && + (mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0 || + mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_1)) + { + __OSBlockInfo *blockInfo; + __OSTranxInfo *info; + info = &mb->piHandle->transferInfo; + blockInfo = &info->block[info->blockNum]; + info->sectorNum = -1; + if (info->transferMode != LEO_SECTOR_MODE) + { + blockInfo->dramAddr = (void *)((u32)blockInfo->dramAddr - blockInfo->sectorSize); + } + if (info->transferMode == LEO_TRACK_MODE && mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0) + messageSend = 1; + else + messageSend = 0; + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + __osResetGlobalIntMask(OS_IM_PI); + osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, (info->bmCtlShadow | 0x80000000)); + while (TRUE) + { + + osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); + info = &mb->piHandle->transferInfo; + blockInfo = &info->block[info->blockNum]; + if (blockInfo->errStatus == LEO_ERROR_29) + { + u32 stat; + osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET); //TODO: remove magic constants + osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow); + osEPiRawReadIo(mb->piHandle, LEO_STATUS, &stat); + + if (stat & LEO_STATUS_MECHANIC_INTERRUPT) //TODO: remove magic constants + { + osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR); + } + + blockInfo->errStatus = LEO_ERROR_4; + IO_WRITE(PI_STATUS_REG, PI_CLR_INTR); + __osSetGlobalIntMask(OS_IM_PI | SR_IBIT4); + } + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + + if (messageSend != 1) + break; + if (mb->piHandle->transferInfo.block[0].errStatus != LEO_ERROR_GOOD) + break; + messageSend = 0; + } + osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); + if (mb->piHandle->transferInfo.blockNum == 1) + osYieldThread(); + } + else + { + switch (mb->hdr.type) + { + case OS_MESG_TYPE_DMAREAD: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->dma(OS_READ, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_DMAWRITE: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->dma(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_EDMAREAD: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->edma(mb->piHandle, OS_READ, mb->devAddr, mb->dramAddr, + mb->size); + break; + case OS_MESG_TYPE_EDMAWRITE: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->edma(mb->piHandle, OS_WRITE, mb->devAddr, mb->dramAddr, + mb->size); + break; + case OS_MESG_TYPE_LOOPBACK: + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + ret = -1; + break; + default: + ret = -1; + break; + } + if (ret == 0) + { + osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); + } + } + } +} diff --git a/symbol_addrs.us.txt b/symbol_addrs.us.txt index 382e32b..44b705e 100644 --- a/symbol_addrs.us.txt +++ b/symbol_addrs.us.txt @@ -404,36 +404,47 @@ arcade_lives_visual = 0x8004C71C; // segment:arcade arcade_game_state = 0x8004C71D; // segment:arcade arcade_background_visual = 0x8004C722; // segment:arcade -D_arcade_8004C6DC = 0x8004C6DC; // segment:arcade +D_arcade_8004A840 = 0x8004A840; // segment:arcade +D_arcade_8004A874 = 0x8004A874; // segment:arcade +D_arcade_8004A880 = 0x8004A880; // segment:arcade +D_arcade_8004A8A8 = 0x8004A8A8; // segment:arcade +D_arcade_8004A8EC = 0x8004A8EC; // segment:arcade +D_arcade_8004AA18 = 0x8004AA18; // segment:arcade +D_arcade_8004AB24 = 0x8004AB24; // segment:arcade +D_arcade_8004AB28 = 0x8004AB28; // segment:arcade +D_arcade_8004AB30 = 0x8004AB30; // segment:arcade +D_arcade_8004AC00 = 0x8004AC00; // segment:arcade + D_arcade_8004BCD0 = 0x8004BCD0; // segment:arcade -D_arcade_8004C724 = 0x8004C724; // segment:arcade -D_arcade_8004C70C = 0x8004C70C; // segment:arcade -D_arcade_8004C723 = 0x8004C723; // segment:arcade -D_arcade_8004C71A = 0x8004C71A; // segment:arcade -D_arcade_8004C719 = 0x8004C719; // segment:arcade -D_arcade_8004C6D4 = 0x8004C6D4; // segment:arcade -D_arcade_8004C6D0 = 0x8004C6D0; // segment:arcade +D_arcade_8004BB00 = 0x8004BB00; // segment:arcade D_arcade_8004BB30 = 0x8004BB30; // segment:arcade D_arcade_8004BB60 = 0x8004BB60; // segment:arcade D_arcade_8004BB90 = 0x8004BB90; // segment:arcade D_arcade_8004BBC0 = 0x8004BBC0; // segment:arcade -D_arcade_8004C6D6 = 0x8004C6D6; // segment:arcade -D_arcade_8004C708 = 0x8004C708; // segment:arcade -D_arcade_8004BB00 = 0x8004BB00; // segment:arcade -D_arcade_8004C71F = 0x8004C71F; // segment:arcade D_arcade_8004BC88 = 0x8004BC88; // segment:arcade -D_arcade_8004C71E = 0x8004C71E; // segment:arcade -D_arcade_8004C710 = 0x8004C710; // segment:arcade -D_arcade_8004C718 = 0x8004C718; // segment:arcade -D_arcade_8004C6F8 = 0x8004C6F8; // segment:arcade -D_arcade_8004C721 = 0x8004C721; // segment:arcade -D_arcade_8004C6F0 = 0x8004C6F0; // segment:arcade -D_arcade_8004C6F4 = 0x8004C6F4; // segment:arcade + D_arcade_8004C6E0 = 0x8004C6E0; // segment:arcade D_arcade_8004C6E4 = 0x8004C6E4; // segment:arcade D_arcade_8004C6E8 = 0x8004C6E8; // segment:arcade D_arcade_8004C6EC = 0x8004C6EC; // segment:arcade -D_arcade_8004AC00 = 0x8004AC00; // segment:arcade +D_arcade_8004C6F0 = 0x8004C6F0; // segment:arcade +D_arcade_8004C6F4 = 0x8004C6F4; // segment:arcade +D_arcade_8004C6D0 = 0x8004C6D0; // segment:arcade +D_arcade_8004C6D4 = 0x8004C6D4; // segment:arcade +D_arcade_8004C6D6 = 0x8004C6D6; // segment:arcade +D_arcade_8004C6DC = 0x8004C6DC; // segment:arcade +D_arcade_8004C6F8 = 0x8004C6F8; // segment:arcade +D_arcade_8004C708 = 0x8004C708; // segment:arcade +D_arcade_8004C70C = 0x8004C70C; // segment:arcade +D_arcade_8004C710 = 0x8004C710; // segment:arcade +D_arcade_8004C718 = 0x8004C718; // segment:arcade +D_arcade_8004C719 = 0x8004C719; // segment:arcade +D_arcade_8004C71A = 0x8004C71A; // segment:arcade +D_arcade_8004C71E = 0x8004C71E; // segment:arcade +D_arcade_8004C71F = 0x8004C71F; // segment:arcade +D_arcade_8004C721 = 0x8004C721; // segment:arcade +D_arcade_8004C723 = 0x8004C723; // segment:arcade +D_arcade_8004C724 = 0x8004C724; // segment:arcade D_jetpac_8002EC30 = 0x8002EC30; // segment:jetpac D_jetpac_8002EC48 = 0x8002EC48; // segment:jetpac