From ad10c4efcad508b2cef7587cbf4c6e1a5fc0b7a4 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Fri, 3 Feb 2023 11:55:04 +0200 Subject: [PATCH 1/2] Unused .s files --- .../createGuard__12daTagGuard_cFUl.s | 55 ------------------- .../daTagGuard_Create__FP10fopAc_ac_c.s | 49 ----------------- .../daTagGuard_Delete__FP12daTagGuard_c.s | 14 ----- .../getAppearPoint__12daTagGuard_cFP3Vec.s | 28 ---------- 4 files changed, 146 deletions(-) delete mode 100644 asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/createGuard__12daTagGuard_cFUl.s delete mode 100644 asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/daTagGuard_Create__FP10fopAc_ac_c.s delete mode 100644 asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/daTagGuard_Delete__FP12daTagGuard_c.s delete mode 100644 asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/getAppearPoint__12daTagGuard_cFP3Vec.s diff --git a/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/createGuard__12daTagGuard_cFUl.s b/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/createGuard__12daTagGuard_cFUl.s deleted file mode 100644 index 8ee49be9276..00000000000 --- a/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/createGuard__12daTagGuard_cFUl.s +++ /dev/null @@ -1,55 +0,0 @@ -lbl_80D5985C: -/* 80D5985C 94 21 FF D0 */ stwu r1, -0x30(r1) -/* 80D59860 7C 08 02 A6 */ mflr r0 -/* 80D59864 90 01 00 34 */ stw r0, 0x34(r1) -/* 80D59868 93 E1 00 2C */ stw r31, 0x2c(r1) -/* 80D5986C 93 C1 00 28 */ stw r30, 0x28(r1) -/* 80D59870 7C 7E 1B 78 */ mr r30, r3 -/* 80D59874 7C 9F 23 78 */ mr r31, r4 -/* 80D59878 C0 03 04 D0 */ lfs f0, 0x4d0(r3) -/* 80D5987C D0 01 00 10 */ stfs f0, 0x10(r1) -/* 80D59880 C0 03 04 D4 */ lfs f0, 0x4d4(r3) -/* 80D59884 D0 01 00 14 */ stfs f0, 0x14(r1) -/* 80D59888 C0 03 04 D8 */ lfs f0, 0x4d8(r3) -/* 80D5988C D0 01 00 18 */ stfs f0, 0x18(r1) -/* 80D59890 80 03 00 B0 */ lwz r0, 0xb0(r3) -/* 80D59894 54 00 C6 3E */ rlwinm r0, r0, 0x18, 0x18, 0x1f -/* 80D59898 28 00 00 FF */ cmplwi r0, 0xff -/* 80D5989C 41 82 00 34 */ beq lbl_80D598D0 -/* 80D598A0 80 7E 05 68 */ lwz r3, 0x568(r30) -/* 80D598A4 38 80 00 00 */ li r4, 0 -/* 80D598A8 4B 2F 7F 09 */ bl dPath_GetPnt__FPC5dPathi -/* 80D598AC C0 03 00 04 */ lfs f0, 4(r3) -/* 80D598B0 D0 01 00 10 */ stfs f0, 0x10(r1) -/* 80D598B4 C0 03 00 08 */ lfs f0, 8(r3) -/* 80D598B8 D0 01 00 14 */ stfs f0, 0x14(r1) -/* 80D598BC C0 03 00 0C */ lfs f0, 0xc(r3) -/* 80D598C0 D0 01 00 18 */ stfs f0, 0x18(r1) -/* 80D598C4 80 1E 00 B0 */ lwz r0, 0xb0(r30) -/* 80D598C8 54 00 42 1E */ rlwinm r0, r0, 8, 8, 0xf -/* 80D598CC 7F FF 03 78 */ or r31, r31, r0 -lbl_80D598D0: -/* 80D598D0 88 1E 04 E2 */ lbz r0, 0x4e2(r30) -/* 80D598D4 7C 07 07 74 */ extsb r7, r0 -/* 80D598D8 38 00 00 00 */ li r0, 0 -/* 80D598DC 90 01 00 08 */ stw r0, 8(r1) -/* 80D598E0 38 60 02 97 */ li r3, 0x297 -/* 80D598E4 28 1E 00 00 */ cmplwi r30, 0 -/* 80D598E8 41 82 00 0C */ beq lbl_80D598F4 -/* 80D598EC 80 9E 00 04 */ lwz r4, 4(r30) -/* 80D598F0 48 00 00 08 */ b lbl_80D598F8 -lbl_80D598F4: -/* 80D598F4 38 80 FF FF */ li r4, -1 -lbl_80D598F8: -/* 80D598F8 7F E5 FB 78 */ mr r5, r31 -/* 80D598FC 38 C1 00 10 */ addi r6, r1, 0x10 -/* 80D59900 39 1E 04 DC */ addi r8, r30, 0x4dc -/* 80D59904 39 20 00 00 */ li r9, 0 -/* 80D59908 39 40 FF FF */ li r10, -1 -/* 80D5990C 4B 2C 05 E5 */ bl fopAcM_createChild__FsUiUlPC4cXyziPC5csXyzPC4cXyzScPFPv_i -/* 80D59910 83 E1 00 2C */ lwz r31, 0x2c(r1) -/* 80D59914 83 C1 00 28 */ lwz r30, 0x28(r1) -/* 80D59918 80 01 00 34 */ lwz r0, 0x34(r1) -/* 80D5991C 7C 08 03 A6 */ mtlr r0 -/* 80D59920 38 21 00 30 */ addi r1, r1, 0x30 -/* 80D59924 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/daTagGuard_Create__FP10fopAc_ac_c.s b/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/daTagGuard_Create__FP10fopAc_ac_c.s deleted file mode 100644 index 19612cf9193..00000000000 --- a/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/daTagGuard_Create__FP10fopAc_ac_c.s +++ /dev/null @@ -1,49 +0,0 @@ -lbl_80D59928: -/* 80D59928 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 80D5992C 7C 08 02 A6 */ mflr r0 -/* 80D59930 90 01 00 14 */ stw r0, 0x14(r1) -/* 80D59934 93 E1 00 0C */ stw r31, 0xc(r1) -/* 80D59938 93 C1 00 08 */ stw r30, 8(r1) -/* 80D5993C 7C 7E 1B 78 */ mr r30, r3 -/* 80D59940 80 03 04 A0 */ lwz r0, 0x4a0(r3) -/* 80D59944 54 00 07 39 */ rlwinm. r0, r0, 0, 0x1c, 0x1c -/* 80D59948 40 82 00 1C */ bne lbl_80D59964 -/* 80D5994C 28 1E 00 00 */ cmplwi r30, 0 -/* 80D59950 41 82 00 08 */ beq lbl_80D59958 -/* 80D59954 4B 2B F2 11 */ bl __ct__10fopAc_ac_cFv -lbl_80D59958: -/* 80D59958 80 1E 04 A0 */ lwz r0, 0x4a0(r30) -/* 80D5995C 60 00 00 08 */ ori r0, r0, 8 -/* 80D59960 90 1E 04 A0 */ stw r0, 0x4a0(r30) -lbl_80D59964: -/* 80D59964 80 1E 00 B0 */ lwz r0, 0xb0(r30) -/* 80D59968 54 03 C6 3E */ rlwinm r3, r0, 0x18, 0x18, 0x1f -/* 80D5996C 88 1E 04 BA */ lbz r0, 0x4ba(r30) -/* 80D59970 7C 04 07 74 */ extsb r4, r0 -/* 80D59974 4B 2F 7E 79 */ bl dPath_GetRoomPath__Fii -/* 80D59978 90 7E 05 68 */ stw r3, 0x568(r30) -/* 80D5997C 80 7E 05 68 */ lwz r3, 0x568(r30) -/* 80D59980 38 80 00 00 */ li r4, 0 -/* 80D59984 4B 2F 7E 2D */ bl dPath_GetPnt__FPC5dPathi -/* 80D59988 7C 7F 1B 78 */ mr r31, r3 -/* 80D5998C 80 7E 05 68 */ lwz r3, 0x568(r30) -/* 80D59990 38 80 00 01 */ li r4, 1 -/* 80D59994 4B 2F 7E 1D */ bl dPath_GetPnt__FPC5dPathi -/* 80D59998 7C 64 1B 78 */ mr r4, r3 -/* 80D5999C C0 1F 00 04 */ lfs f0, 4(r31) -/* 80D599A0 D0 1E 04 D0 */ stfs f0, 0x4d0(r30) -/* 80D599A4 C0 1F 00 08 */ lfs f0, 8(r31) -/* 80D599A8 D0 1E 04 D4 */ stfs f0, 0x4d4(r30) -/* 80D599AC C0 1F 00 0C */ lfs f0, 0xc(r31) -/* 80D599B0 D0 1E 04 D8 */ stfs f0, 0x4d8(r30) -/* 80D599B4 38 7F 00 04 */ addi r3, r31, 4 -/* 80D599B8 38 84 00 04 */ addi r4, r4, 4 -/* 80D599BC 4B 51 72 49 */ bl cLib_targetAngleY__FPC3VecPC3Vec -/* 80D599C0 B0 7E 04 DE */ sth r3, 0x4de(r30) -/* 80D599C4 38 60 00 04 */ li r3, 4 -/* 80D599C8 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 80D599CC 83 C1 00 08 */ lwz r30, 8(r1) -/* 80D599D0 80 01 00 14 */ lwz r0, 0x14(r1) -/* 80D599D4 7C 08 03 A6 */ mtlr r0 -/* 80D599D8 38 21 00 10 */ addi r1, r1, 0x10 -/* 80D599DC 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/daTagGuard_Delete__FP12daTagGuard_c.s b/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/daTagGuard_Delete__FP12daTagGuard_c.s deleted file mode 100644 index ae414c2ec27..00000000000 --- a/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/daTagGuard_Delete__FP12daTagGuard_c.s +++ /dev/null @@ -1,14 +0,0 @@ -lbl_80D599E0: -/* 80D599E0 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 80D599E4 7C 08 02 A6 */ mflr r0 -/* 80D599E8 90 01 00 14 */ stw r0, 0x14(r1) -/* 80D599EC 28 03 00 00 */ cmplwi r3, 0 -/* 80D599F0 41 82 00 0C */ beq lbl_80D599FC -/* 80D599F4 38 80 00 00 */ li r4, 0 -/* 80D599F8 4B 2B F2 95 */ bl __dt__10fopAc_ac_cFv -lbl_80D599FC: -/* 80D599FC 38 60 00 01 */ li r3, 1 -/* 80D59A00 80 01 00 14 */ lwz r0, 0x14(r1) -/* 80D59A04 7C 08 03 A6 */ mtlr r0 -/* 80D59A08 38 21 00 10 */ addi r1, r1, 0x10 -/* 80D59A0C 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/getAppearPoint__12daTagGuard_cFP3Vec.s b/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/getAppearPoint__12daTagGuard_cFP3Vec.s deleted file mode 100644 index 2c7e759d83d..00000000000 --- a/asm/rel/d/a/tag/d_a_tag_guard/d_a_tag_guard/getAppearPoint__12daTagGuard_cFP3Vec.s +++ /dev/null @@ -1,28 +0,0 @@ -lbl_80D597F8: -/* 80D597F8 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 80D597FC 7C 08 02 A6 */ mflr r0 -/* 80D59800 90 01 00 14 */ stw r0, 0x14(r1) -/* 80D59804 93 E1 00 0C */ stw r31, 0xc(r1) -/* 80D59808 7C 9F 23 78 */ mr r31, r4 -/* 80D5980C 80 63 05 68 */ lwz r3, 0x568(r3) -/* 80D59810 28 03 00 00 */ cmplwi r3, 0 -/* 80D59814 40 82 00 0C */ bne lbl_80D59820 -/* 80D59818 38 60 00 00 */ li r3, 0 -/* 80D5981C 48 00 00 2C */ b lbl_80D59848 -lbl_80D59820: -/* 80D59820 A0 83 00 00 */ lhz r4, 0(r3) -/* 80D59824 38 84 FF FF */ addi r4, r4, -1 -/* 80D59828 4B 2F 7F 89 */ bl dPath_GetPnt__FPC5dPathi -/* 80D5982C C0 03 00 04 */ lfs f0, 4(r3) -/* 80D59830 D0 1F 00 00 */ stfs f0, 0(r31) -/* 80D59834 C0 03 00 08 */ lfs f0, 8(r3) -/* 80D59838 D0 1F 00 04 */ stfs f0, 4(r31) -/* 80D5983C C0 03 00 0C */ lfs f0, 0xc(r3) -/* 80D59840 D0 1F 00 08 */ stfs f0, 8(r31) -/* 80D59844 38 60 00 01 */ li r3, 1 -lbl_80D59848: -/* 80D59848 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 80D5984C 80 01 00 14 */ lwz r0, 0x14(r1) -/* 80D59850 7C 08 03 A6 */ mtlr r0 -/* 80D59854 38 21 00 10 */ addi r1, r1, 0x10 -/* 80D59858 4E 80 00 20 */ blr From 118a3f288fff342cf7942f5318d376ce99749c61 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Fri, 3 Feb 2023 12:01:55 +0200 Subject: [PATCH 2/2] Only DVDLowRead left in dvdlow --- Progress.md | 8 +- asm/dolphin/dvd/dvdlow/AlarmHandler.s | 36 --- asm/dolphin/dvd/dvdlow/DVDLowRead.s | 2 +- asm/dolphin/dvd/dvdlow/DVDLowReset.s | 49 ---- .../dvd/dvdlow/__DVDInterruptHandler.s | 205 ------------- libs/dolphin/dvd/dvdlow.c | 276 ++++++++++++++---- 6 files changed, 222 insertions(+), 354 deletions(-) delete mode 100644 asm/dolphin/dvd/dvdlow/AlarmHandler.s delete mode 100644 asm/dolphin/dvd/dvdlow/DVDLowReset.s delete mode 100644 asm/dolphin/dvd/dvdlow/__DVDInterruptHandler.s diff --git a/Progress.md b/Progress.md index fb44be567c7..56020508e7e 100644 --- a/Progress.md +++ b/Progress.md @@ -7,22 +7,22 @@ Section | Percentage | Decompiled (bytes) | Total (bytes) .init | 97.972973% | 9280 | 9472 .extab | 100.000000% | 96 | 96 .extabindex | 100.000000% | 96 | 96 -.text | 24.087902% | 866332 | 3596544 +.text | 24.117264% | 867388 | 3596544 .ctors | 100.000000% | 448 | 448 .dtors | 100.000000% | 32 | 32 .rodata | 100.000000% | 193856 | 193856 .data | 100.000000% | 197632 | 197632 .sdata | 100.000000% | 1408 | 1408 .sdata2 | 100.000000% | 20832 | 20832 -Total | 32.090854% | 1290268 | 4020672 +Total | 32.117119% | 1291324 | 4020672 ## Total Section | Percentage | Decompiled (bytes) | Total (bytes) ---|---|---|--- -main.dol | 32.090854% | 1290268 | 4020672 +main.dol | 32.117119% | 1291324 | 4020672 RELs | 33.048286% | 3800660 | 11500324 -Total | 32.800266% | 5090928 | 15520996 +Total | 32.807070% | 5091984 | 15520996 ## RELs diff --git a/asm/dolphin/dvd/dvdlow/AlarmHandler.s b/asm/dolphin/dvd/dvdlow/AlarmHandler.s deleted file mode 100644 index 02f295f423b..00000000000 --- a/asm/dolphin/dvd/dvdlow/AlarmHandler.s +++ /dev/null @@ -1,36 +0,0 @@ -lbl_80347994: -/* 80347994 7C 08 02 A6 */ mflr r0 -/* 80347998 3C 60 80 45 */ lis r3, CommandList@ha /* 0x8044C830@ha */ -/* 8034799C 90 01 00 04 */ stw r0, 4(r1) -/* 803479A0 38 83 C8 30 */ addi r4, r3, CommandList@l /* 0x8044C830@l */ -/* 803479A4 94 21 FF F8 */ stwu r1, -8(r1) -/* 803479A8 80 0D 91 D4 */ lwz r0, NextCommandNumber(r13) -/* 803479AC 1C 00 00 14 */ mulli r0, r0, 0x14 -/* 803479B0 7C 64 00 2E */ lwzx r3, r4, r0 -/* 803479B4 2C 03 00 01 */ cmpwi r3, 1 -/* 803479B8 40 82 00 2C */ bne lbl_803479E4 -/* 803479BC 80 6D 91 D4 */ lwz r3, NextCommandNumber(r13) -/* 803479C0 7C C4 02 14 */ add r6, r4, r0 -/* 803479C4 38 03 00 01 */ addi r0, r3, 1 -/* 803479C8 90 0D 91 D4 */ stw r0, NextCommandNumber(r13) -/* 803479CC 80 66 00 04 */ lwz r3, 4(r6) -/* 803479D0 80 86 00 08 */ lwz r4, 8(r6) -/* 803479D4 80 A6 00 0C */ lwz r5, 0xc(r6) -/* 803479D8 80 C6 00 10 */ lwz r6, 0x10(r6) -/* 803479DC 48 00 00 AD */ bl Read -/* 803479E0 48 00 00 28 */ b lbl_80347A08 -lbl_803479E4: -/* 803479E4 2C 03 00 02 */ cmpwi r3, 2 -/* 803479E8 40 82 00 20 */ bne lbl_80347A08 -/* 803479EC 80 6D 91 D4 */ lwz r3, NextCommandNumber(r13) -/* 803479F0 7C 84 02 14 */ add r4, r4, r0 -/* 803479F4 38 03 00 01 */ addi r0, r3, 1 -/* 803479F8 90 0D 91 D4 */ stw r0, NextCommandNumber(r13) -/* 803479FC 80 64 00 0C */ lwz r3, 0xc(r4) -/* 80347A00 80 84 00 10 */ lwz r4, 0x10(r4) -/* 80347A04 48 00 04 AD */ bl DVDLowSeek -lbl_80347A08: -/* 80347A08 80 01 00 0C */ lwz r0, 0xc(r1) -/* 80347A0C 38 21 00 08 */ addi r1, r1, 8 -/* 80347A10 7C 08 03 A6 */ mtlr r0 -/* 80347A14 4E 80 00 20 */ blr diff --git a/asm/dolphin/dvd/dvdlow/DVDLowRead.s b/asm/dolphin/dvd/dvdlow/DVDLowRead.s index 5da6d3f2ee3..c25fd8d4028 100644 --- a/asm/dolphin/dvd/dvdlow/DVDLowRead.s +++ b/asm/dolphin/dvd/dvdlow/DVDLowRead.s @@ -112,7 +112,7 @@ lbl_80347D9C: /* 80347DA4 81 0D 91 C0 */ lwz r8, LastReadFinished(r13) /* 80347DA8 80 05 00 F8 */ lwz r0, 0x00F8(r5) /* 0x800000F8@l */ /* 80347DAC 3C A0 10 62 */ lis r5, 0x1062 /* 0x10624DD3@ha */ -/* 80347DB0 81 2D 91 C4 */ lwz r9, data_80451744(r13) +/* 80347DB0 81 2D 91 C4 */ lwz r9, LastReadFinished+0x4(r13) /* 80347DB4 38 C0 00 00 */ li r6, 0 /* 80347DB8 54 07 F0 BE */ srwi r7, r0, 2 /* 80347DBC 38 05 4D D3 */ addi r0, r5, 0x4DD3 /* 0x10624DD3@l */ diff --git a/asm/dolphin/dvd/dvdlow/DVDLowReset.s b/asm/dolphin/dvd/dvdlow/DVDLowReset.s deleted file mode 100644 index 20bdb91d837..00000000000 --- a/asm/dolphin/dvd/dvdlow/DVDLowReset.s +++ /dev/null @@ -1,49 +0,0 @@ -lbl_80348388: -/* 80348388 7C 08 02 A6 */ mflr r0 -/* 8034838C 3C 80 CC 00 */ lis r4, 0xCC00 /* 0xCC003000@ha */ -/* 80348390 90 01 00 04 */ stw r0, 4(r1) -/* 80348394 38 00 00 02 */ li r0, 2 -/* 80348398 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 8034839C BF 41 00 08 */ stmw r26, 8(r1) -/* 803483A0 3B E4 30 00 */ addi r31, r4, 0x3000 /* 0xCC003000@l */ -/* 803483A4 90 04 60 04 */ stw r0, 0x6004(r4) -/* 803483A8 83 C4 30 24 */ lwz r30, 0x3024(r4) -/* 803483AC 57 C0 07 B8 */ rlwinm r0, r30, 0, 0x1e, 0x1c -/* 803483B0 60 00 00 01 */ ori r0, r0, 1 -/* 803483B4 94 1F 00 24 */ stwu r0, 0x24(r31) -/* 803483B8 4B FF A3 65 */ bl __OSGetSystemTime -/* 803483BC 3C A0 80 00 */ lis r5, 0x8000 /* 0x800000F8@ha */ -/* 803483C0 80 05 00 F8 */ lwz r0, 0x00F8(r5) /* 0x800000F8@l */ -/* 803483C4 3C A0 43 1C */ lis r5, 0x431C /* 0x431BDE83@ha */ -/* 803483C8 38 A5 DE 83 */ addi r5, r5, 0xDE83 /* 0x431BDE83@l */ -/* 803483CC 54 00 F0 BE */ srwi r0, r0, 2 -/* 803483D0 7C 05 00 16 */ mulhwu r0, r5, r0 -/* 803483D4 54 00 8B FE */ srwi r0, r0, 0xf -/* 803483D8 1C 00 00 0C */ mulli r0, r0, 0xc -/* 803483DC 3B 44 00 00 */ addi r26, r4, 0 -/* 803483E0 3B 63 00 00 */ addi r27, r3, 0 -/* 803483E4 54 1C E8 FE */ srwi r28, r0, 3 -/* 803483E8 3B A0 00 00 */ li r29, 0 -lbl_803483EC: -/* 803483EC 4B FF A3 31 */ bl __OSGetSystemTime -/* 803483F0 7C BA 20 10 */ subfc r5, r26, r4 -/* 803483F4 7C 1B 19 10 */ subfe r0, r27, r3 -/* 803483F8 6C 04 80 00 */ xoris r4, r0, 0x8000 -/* 803483FC 6F A3 80 00 */ xoris r3, r29, 0x8000 -/* 80348400 7C 1C 28 10 */ subfc r0, r28, r5 -/* 80348404 7C 63 21 10 */ subfe r3, r3, r4 -/* 80348408 7C 64 21 10 */ subfe r3, r4, r4 -/* 8034840C 7C 63 00 D1 */ neg. r3, r3 -/* 80348410 40 82 FF DC */ bne lbl_803483EC -/* 80348414 63 C0 00 05 */ ori r0, r30, 5 -/* 80348418 90 1F 00 00 */ stw r0, 0(r31) -/* 8034841C 38 00 00 01 */ li r0, 1 -/* 80348420 90 0D 91 A8 */ stw r0, ResetOccurred(r13) -/* 80348424 4B FF A2 F9 */ bl __OSGetSystemTime -/* 80348428 90 8D 91 A4 */ stw r4, data_80451724(r13) -/* 8034842C 90 6D 91 A0 */ stw r3, LastResetEnd(r13) -/* 80348430 BB 41 00 08 */ lmw r26, 8(r1) -/* 80348434 80 01 00 24 */ lwz r0, 0x24(r1) -/* 80348438 38 21 00 20 */ addi r1, r1, 0x20 -/* 8034843C 7C 08 03 A6 */ mtlr r0 -/* 80348440 4E 80 00 20 */ blr diff --git a/asm/dolphin/dvd/dvdlow/__DVDInterruptHandler.s b/asm/dolphin/dvd/dvdlow/__DVDInterruptHandler.s deleted file mode 100644 index 1f81f7fc1d0..00000000000 --- a/asm/dolphin/dvd/dvdlow/__DVDInterruptHandler.s +++ /dev/null @@ -1,205 +0,0 @@ -lbl_803476B4: -/* 803476B4 7C 08 02 A6 */ mflr r0 -/* 803476B8 3C 60 80 45 */ lis r3, CommandList@ha /* 0x8044C830@ha */ -/* 803476BC 90 01 00 04 */ stw r0, 4(r1) -/* 803476C0 94 21 FD 10 */ stwu r1, -0x2f0(r1) -/* 803476C4 BF 61 02 DC */ stmw r27, 0x2dc(r1) -/* 803476C8 3B 84 00 00 */ addi r28, r4, 0 -/* 803476CC 3B C3 C8 30 */ addi r30, r3, CommandList@l /* 0x8044C830@l */ -/* 803476D0 3B A0 00 00 */ li r29, 0 -/* 803476D4 80 0D 91 D0 */ lwz r0, LastCommandWasRead(r13) -/* 803476D8 2C 00 00 00 */ cmpwi r0, 0 -/* 803476DC 41 82 00 40 */ beq lbl_8034771C -/* 803476E0 4B FF B0 3D */ bl __OSGetSystemTime -/* 803476E4 90 8D 91 C4 */ stw r4, data_80451744(r13) -/* 803476E8 38 00 00 00 */ li r0, 0 -/* 803476EC 90 6D 91 C0 */ stw r3, LastReadFinished(r13) -/* 803476F0 90 0D 84 58 */ stw r0, FirstRead(r13) -/* 803476F4 80 1E 00 C4 */ lwz r0, 0xc4(r30) -/* 803476F8 90 1E 00 B8 */ stw r0, 0xb8(r30) -/* 803476FC 80 1E 00 C8 */ lwz r0, 0xc8(r30) -/* 80347700 90 1E 00 BC */ stw r0, 0xbc(r30) -/* 80347704 80 1E 00 CC */ lwz r0, 0xcc(r30) -/* 80347708 90 1E 00 C0 */ stw r0, 0xc0(r30) -/* 8034770C 80 0D 91 90 */ lwz r0, StopAtNextInt(r13) -/* 80347710 2C 00 00 01 */ cmpwi r0, 1 -/* 80347714 40 82 00 08 */ bne lbl_8034771C -/* 80347718 63 BD 00 08 */ ori r29, r29, 8 -lbl_8034771C: -/* 8034771C 38 00 00 00 */ li r0, 0 -/* 80347720 90 0D 91 D0 */ stw r0, LastCommandWasRead(r13) -/* 80347724 3C 60 CC 00 */ lis r3, 0xCC00 /* 0xCC006000@ha */ -/* 80347728 90 0D 91 90 */ stw r0, StopAtNextInt(r13) -/* 8034772C 80 03 60 00 */ lwz r0, 0x6000(r3) /* 0xCC006000@l */ -/* 80347730 70 1F 00 2A */ andi. r31, r0, 0x2a -/* 80347734 70 03 00 54 */ andi. r3, r0, 0x54 -/* 80347738 57 E0 08 3C */ slwi r0, r31, 1 -/* 8034773C 7C 7B 00 38 */ and r27, r3, r0 -/* 80347740 57 60 06 73 */ rlwinm. r0, r27, 0, 0x19, 0x19 -/* 80347744 41 82 00 08 */ beq lbl_8034774C -/* 80347748 63 BD 00 08 */ ori r29, r29, 8 -lbl_8034774C: -/* 8034774C 57 60 06 F7 */ rlwinm. r0, r27, 0, 0x1b, 0x1b -/* 80347750 41 82 00 08 */ beq lbl_80347758 -/* 80347754 63 BD 00 01 */ ori r29, r29, 1 -lbl_80347758: -/* 80347758 57 60 07 7B */ rlwinm. r0, r27, 0, 0x1d, 0x1d -/* 8034775C 41 82 00 08 */ beq lbl_80347764 -/* 80347760 63 BD 00 02 */ ori r29, r29, 2 -lbl_80347764: -/* 80347764 28 1D 00 00 */ cmplwi r29, 0 -/* 80347768 41 82 00 14 */ beq lbl_8034777C -/* 8034776C 38 00 00 00 */ li r0, 0 -/* 80347770 90 0D 91 A8 */ stw r0, ResetOccurred(r13) -/* 80347774 38 7E 00 68 */ addi r3, r30, 0x68 -/* 80347778 4B FF 34 C5 */ bl OSCancelAlarm -lbl_8034777C: -/* 8034777C 7F 60 FB 78 */ or r0, r27, r31 -/* 80347780 3F E0 CC 00 */ lis r31, 0xCC00 /* 0xCC006000@ha */ -/* 80347784 90 1F 60 00 */ stw r0, 0x6000(r31) /* 0xCC006000@l */ -/* 80347788 80 0D 91 A8 */ lwz r0, ResetOccurred(r13) -/* 8034778C 28 00 00 00 */ cmplwi r0, 0 -/* 80347790 41 82 00 A0 */ beq lbl_80347830 -/* 80347794 4B FF AF 89 */ bl __OSGetSystemTime -/* 80347798 3C A0 80 00 */ lis r5, 0x8000 /* 0x800000F8@ha */ -/* 8034779C 80 ED 91 A0 */ lwz r7, LastResetEnd(r13) -/* 803477A0 80 C5 00 F8 */ lwz r6, 0x00F8(r5) /* 0x800000F8@l */ -/* 803477A4 3C A0 10 62 */ lis r5, 0x1062 /* 0x10624DD3@ha */ -/* 803477A8 38 A5 4D D3 */ addi r5, r5, 0x4DD3 /* 0x10624DD3@l */ -/* 803477AC 81 0D 91 A4 */ lwz r8, data_80451724(r13) -/* 803477B0 54 C6 F0 BE */ srwi r6, r6, 2 -/* 803477B4 7C A5 30 16 */ mulhwu r5, r5, r6 -/* 803477B8 54 A5 D1 BE */ srwi r5, r5, 6 -/* 803477BC 1C A5 00 C8 */ mulli r5, r5, 0xc8 -/* 803477C0 7C C8 20 10 */ subfc r6, r8, r4 -/* 803477C4 7C 67 19 10 */ subfe r3, r7, r3 -/* 803477C8 38 00 00 00 */ li r0, 0 -/* 803477CC 6C 64 80 00 */ xoris r4, r3, 0x8000 -/* 803477D0 6C 03 80 00 */ xoris r3, r0, 0x8000 -/* 803477D4 7C 05 30 10 */ subfc r0, r5, r6 -/* 803477D8 7C 63 21 10 */ subfe r3, r3, r4 -/* 803477DC 7C 64 21 10 */ subfe r3, r4, r4 -/* 803477E0 7C 63 00 D1 */ neg. r3, r3 -/* 803477E4 41 82 00 4C */ beq lbl_80347830 -/* 803477E8 3B 7F 60 00 */ addi r27, r31, 0x6000 -/* 803477EC 84 1B 00 04 */ lwzu r0, 4(r27) -/* 803477F0 54 03 07 7A */ rlwinm r3, r0, 0, 0x1d, 0x1d -/* 803477F4 54 00 0F 7A */ rlwinm r0, r0, 1, 0x1d, 0x1d -/* 803477F8 7C 60 00 38 */ and r0, r3, r0 -/* 803477FC 54 00 07 7B */ rlwinm. r0, r0, 0, 0x1d, 0x1d -/* 80347800 41 82 00 24 */ beq lbl_80347824 -/* 80347804 81 8D 91 9C */ lwz r12, ResetCoverCallback(r13) -/* 80347808 28 0C 00 00 */ cmplwi r12, 0 -/* 8034780C 41 82 00 10 */ beq lbl_8034781C -/* 80347810 7D 88 03 A6 */ mtlr r12 -/* 80347814 38 60 00 04 */ li r3, 4 -/* 80347818 4E 80 00 21 */ blrl -lbl_8034781C: -/* 8034781C 38 00 00 00 */ li r0, 0 -/* 80347820 90 0D 91 9C */ stw r0, ResetCoverCallback(r13) -lbl_80347824: -/* 80347824 80 1B 00 00 */ lwz r0, 0(r27) -/* 80347828 90 1B 00 00 */ stw r0, 0(r27) -/* 8034782C 48 00 00 58 */ b lbl_80347884 -lbl_80347830: -/* 80347830 80 0D 91 AC */ lwz r0, WaitingCoverClose(r13) -/* 80347834 2C 00 00 00 */ cmpwi r0, 0 -/* 80347838 41 82 00 40 */ beq lbl_80347878 -/* 8034783C 3C 60 CC 00 */ lis r3, 0xCC00 /* 0xCC006000@ha */ -/* 80347840 38 A3 60 00 */ addi r5, r3, 0x6000 /* 0xCC006000@l */ -/* 80347844 84 05 00 04 */ lwzu r0, 4(r5) -/* 80347848 54 04 07 BC */ rlwinm r4, r0, 0, 0x1e, 0x1e -/* 8034784C 54 03 07 7A */ rlwinm r3, r0, 0, 0x1d, 0x1d -/* 80347850 54 00 0F 7A */ rlwinm r0, r0, 1, 0x1d, 0x1d -/* 80347854 7C 63 00 38 */ and r3, r3, r0 -/* 80347858 54 60 07 7B */ rlwinm. r0, r3, 0, 0x1d, 0x1d -/* 8034785C 41 82 00 08 */ beq lbl_80347864 -/* 80347860 63 BD 00 04 */ ori r29, r29, 4 -lbl_80347864: -/* 80347864 7C 60 23 78 */ or r0, r3, r4 -/* 80347868 90 05 00 00 */ stw r0, 0(r5) -/* 8034786C 38 00 00 00 */ li r0, 0 -/* 80347870 90 0D 91 AC */ stw r0, WaitingCoverClose(r13) -/* 80347874 48 00 00 10 */ b lbl_80347884 -lbl_80347878: -/* 80347878 3C 60 CC 00 */ lis r3, 0xCC00 /* 0xCC006004@ha */ -/* 8034787C 38 00 00 00 */ li r0, 0 -/* 80347880 90 03 60 04 */ stw r0, 0x6004(r3) /* 0xCC006004@l */ -lbl_80347884: -/* 80347884 57 A0 07 39 */ rlwinm. r0, r29, 0, 0x1c, 0x1c -/* 80347888 41 82 00 14 */ beq lbl_8034789C -/* 8034788C 80 0D 91 B0 */ lwz r0, Breaking(r13) -/* 80347890 2C 00 00 00 */ cmpwi r0, 0 -/* 80347894 40 82 00 08 */ bne lbl_8034789C -/* 80347898 57 BD 07 76 */ rlwinm r29, r29, 0, 0x1d, 0x1b -lbl_8034789C: -/* 8034789C 57 A0 07 FF */ clrlwi. r0, r29, 0x1f -/* 803478A0 41 82 00 80 */ beq lbl_80347920 -/* 803478A4 80 0D 91 D4 */ lwz r0, NextCommandNumber(r13) -/* 803478A8 1C 00 00 14 */ mulli r0, r0, 0x14 -/* 803478AC 7C 7E 00 2E */ lwzx r3, r30, r0 -/* 803478B0 2C 03 00 01 */ cmpwi r3, 1 -/* 803478B4 40 82 00 30 */ bne lbl_803478E4 -/* 803478B8 80 6D 91 D4 */ lwz r3, NextCommandNumber(r13) -/* 803478BC 7C DE 02 14 */ add r6, r30, r0 -/* 803478C0 38 03 00 01 */ addi r0, r3, 1 -/* 803478C4 90 0D 91 D4 */ stw r0, NextCommandNumber(r13) -/* 803478C8 80 66 00 04 */ lwz r3, 4(r6) -/* 803478CC 80 86 00 08 */ lwz r4, 8(r6) -/* 803478D0 80 A6 00 0C */ lwz r5, 0xc(r6) -/* 803478D4 80 C6 00 10 */ lwz r6, 0x10(r6) -/* 803478D8 48 00 01 B1 */ bl Read -/* 803478DC 38 00 00 01 */ li r0, 1 -/* 803478E0 48 00 00 34 */ b lbl_80347914 -lbl_803478E4: -/* 803478E4 2C 03 00 02 */ cmpwi r3, 2 -/* 803478E8 40 82 00 28 */ bne lbl_80347910 -/* 803478EC 80 6D 91 D4 */ lwz r3, NextCommandNumber(r13) -/* 803478F0 7C 9E 02 14 */ add r4, r30, r0 -/* 803478F4 38 03 00 01 */ addi r0, r3, 1 -/* 803478F8 90 0D 91 D4 */ stw r0, NextCommandNumber(r13) -/* 803478FC 80 64 00 0C */ lwz r3, 0xc(r4) -/* 80347900 80 84 00 10 */ lwz r4, 0x10(r4) -/* 80347904 48 00 05 AD */ bl DVDLowSeek -/* 80347908 38 00 00 01 */ li r0, 1 -/* 8034790C 48 00 00 08 */ b lbl_80347914 -lbl_80347910: -/* 80347910 38 00 00 00 */ li r0, 0 -lbl_80347914: -/* 80347914 2C 00 00 00 */ cmpwi r0, 0 -/* 80347918 41 82 00 18 */ beq lbl_80347930 -/* 8034791C 48 00 00 64 */ b lbl_80347980 -lbl_80347920: -/* 80347920 38 00 FF FF */ li r0, -1 -/* 80347924 90 1E 00 00 */ stw r0, 0(r30) -/* 80347928 38 00 00 00 */ li r0, 0 -/* 8034792C 90 0D 91 D4 */ stw r0, NextCommandNumber(r13) -lbl_80347930: -/* 80347930 38 61 00 10 */ addi r3, r1, 0x10 -/* 80347934 4B FF 46 CD */ bl OSClearContext -/* 80347938 38 61 00 10 */ addi r3, r1, 0x10 -/* 8034793C 4B FF 44 FD */ bl OSSetCurrentContext -/* 80347940 28 1D 00 00 */ cmplwi r29, 0 -/* 80347944 41 82 00 2C */ beq lbl_80347970 -/* 80347948 81 8D 91 98 */ lwz r12, Callback(r13) -/* 8034794C 38 00 00 00 */ li r0, 0 -/* 80347950 28 0C 00 00 */ cmplwi r12, 0 -/* 80347954 90 0D 91 98 */ stw r0, Callback(r13) -/* 80347958 41 82 00 10 */ beq lbl_80347968 -/* 8034795C 7D 88 03 A6 */ mtlr r12 -/* 80347960 38 7D 00 00 */ addi r3, r29, 0 -/* 80347964 4E 80 00 21 */ blrl -lbl_80347968: -/* 80347968 38 00 00 00 */ li r0, 0 -/* 8034796C 90 0D 91 B0 */ stw r0, Breaking(r13) -lbl_80347970: -/* 80347970 38 61 00 10 */ addi r3, r1, 0x10 -/* 80347974 4B FF 46 8D */ bl OSClearContext -/* 80347978 7F 83 E3 78 */ mr r3, r28 -/* 8034797C 4B FF 44 BD */ bl OSSetCurrentContext -lbl_80347980: -/* 80347980 BB 61 02 DC */ lmw r27, 0x2dc(r1) -/* 80347984 80 01 02 F4 */ lwz r0, 0x2f4(r1) -/* 80347988 38 21 02 F0 */ addi r1, r1, 0x2f0 -/* 8034798C 7C 08 03 A6 */ mtlr r0 -/* 80347990 4E 80 00 20 */ blr diff --git a/libs/dolphin/dvd/dvdlow.c b/libs/dolphin/dvd/dvdlow.c index c36c65bd7f3..2ab0f3ab18f 100644 --- a/libs/dolphin/dvd/dvdlow.c +++ b/libs/dolphin/dvd/dvdlow.c @@ -4,22 +4,25 @@ // #include "dolphin/dvd/dvdlow.h" +#include "dolphin/dvd/dvd.h" #include "dol2asm.h" #include "dolphin/types.h" #include "dolphin/os/OSAlarm.h" #include "dolphin/os/OSTime.h" +#include "dolphin/os/OSContext.h" +#include "dolphin/os/OSReset.h" // // Forward References: // void __DVDInitWA(); -void __DVDInterruptHandler(); +void __DVDInterruptHandler(u32 arg0, OSContext* context); static void AlarmHandler(); static void AlarmHandlerForTimeout(); -static void Read(u32 arg0, u32 arg1, u32 arg2, DVDLowCallback cb); -static void SeekTwiceBeforeRead(u32 arg0, u32 arg1, u32 arg2, DVDLowCallback cb); -void DVDLowRead(); +static void Read(void* arg0, u32 arg1, u32 arg2, DVDLowCallback cb); +static void SeekTwiceBeforeRead(void* arg0, u32 arg1, u32 arg2, DVDLowCallback cb); +BOOL DVDLowRead(void* arg0, u32 arg1, u32 arg2, DVDLowCallback cb); BOOL DVDLowSeek(u32 arg0, DVDLowCallback cb); BOOL DVDLowWaitCoverClose(DVDLowCallback cb); BOOL DVDLowReadDiskID(u32 arg0, DVDLowCallback cb); @@ -43,13 +46,10 @@ void OSInitAlarm(); void OSCreateAlarm(); void OSSetAlarm(); void OSCancelAlarm(); -void OSSetCurrentContext(); -void OSClearContext(); BOOL OSDisableInterrupts(); void OSRestoreInterrupts(BOOL enabled); void __OSMaskInterrupts(); OSTime __OSGetSystemTime(); -void DVDGetCurrentDiskID(); // // Declarations: @@ -57,7 +57,7 @@ void DVDGetCurrentDiskID(); typedef struct DVDCommand { s32 _0; - u32 _4; + void* _4; u32 _8; u32 _c; DVDLowCallback callback; @@ -77,16 +77,13 @@ static u32 LastLength; static DVDLowCallback Callback; /* 8045171C-80451720 000C1C 0004+00 1/1 0/0 0/0 .sbss ResetCoverCallback */ -static u8 ResetCoverCallback[4]; +static DVDLowCallback ResetCoverCallback; /* 80451720-80451724 000C20 0004+00 2/2 0/0 0/0 .sbss LastResetEnd */ -static u8 LastResetEnd[4]; - -/* 80451724-80451728 000C24 0004+00 2/2 0/0 0/0 .sbss None */ -static u8 data_80451724[4]; +static volatile OSTime LastResetEnd; /* 80451728-8045172C 000C28 0004+00 2/2 0/0 0/0 .sbss ResetOccurred */ -static u8 ResetOccurred[4]; +static volatile u32 ResetOccurred; /* 8045172C-80451730 000C2C 0004+00 3/3 0/0 0/0 .sbss WaitingCoverClose */ static volatile BOOL WaitingCoverClose; @@ -95,16 +92,13 @@ static volatile BOOL WaitingCoverClose; static BOOL Breaking; /* 80451734-80451738 000C34 0004+00 2/2 0/0 0/0 .sbss WorkAroundType */ -static u32 WorkAroundType; +static volatile u32 WorkAroundType; /* 80451738-80451740 000C38 0004+04 2/2 0/0 0/0 .sbss WorkAroundSeekLocation */ static u32 WorkAroundSeekLocation[2]; /* 80451740-80451744 000C40 0004+00 2/2 0/0 0/0 .sbss LastReadFinished */ -static BOOL LastReadFinished; - -/* 80451744-80451748 000C44 0004+00 2/2 0/0 0/0 .sbss None */ -static u8 data_80451744[4]; +static volatile OSTime LastReadFinished; /* 80451748-8045174C 000C48 0004+00 1/1 0/0 0/0 .sbss LastReadIssued */ static OSTime LastReadIssued; @@ -113,7 +107,7 @@ static OSTime LastReadIssued; static volatile BOOL LastCommandWasRead; /* 80451754-80451758 000C54 0004+00 5/5 0/0 0/0 .sbss NextCommandNumber */ -static u32 NextCommandNumber; +static volatile u32 NextCommandNumber; /* 80347674-803476B4 341FB4 0040+00 0/0 1/1 0/0 .text __DVDInitWA */ void __DVDInitWA() { @@ -125,10 +119,7 @@ void __DVDInitWA() { /* ############################################################################################## */ /* 8044C870-8044C898 079590 0028+00 0/1 0/0 0/0 .bss AlarmForWA */ -#pragma push -#pragma force_active on -static u8 AlarmForWA[40]; -#pragma pop +static OSAlarm AlarmForWA; /* 8044C898-8044C8C0 0795B8 0028+00 9/11 0/0 0/0 .bss AlarmForTimeout */ static OSAlarm AlarmForTimeout; @@ -139,56 +130,149 @@ static OSAlarm AlarmForBreak; /* 8044C8E8-8044C8F4 079608 000C+00 0/1 0/0 0/0 .bss Prev */ #pragma push #pragma force_active on -static u8 Prev[12]; +static u32 Prev[3]; #pragma pop /* 8044C8F4-8044C900 079614 000C+00 0/2 0/0 0/0 .bss Curr */ #pragma push #pragma force_active on -static u8 Curr[12]; +static u32 Curr[3]; #pragma pop /* 804509D8-804509E0 000458 0004+04 2/2 0/0 0/0 .sdata FirstRead */ -SECTION_SDATA static u32 FirstRead[1 + 1 /* padding */] = { +SECTION_SDATA static BOOL FirstRead[1 + 1 /* padding */] = { 0x00000001, /* padding */ 0x00000000, }; /* 803476B4-80347994 341FF4 02E0+00 0/0 1/1 0/0 .text __DVDInterruptHandler */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void __DVDInterruptHandler() { - nofralloc -#include "asm/dolphin/dvd/dvdlow/__DVDInterruptHandler.s" +void __DVDInterruptHandler(u32 arg0, OSContext* context) { + u32 reg; + s32 rv; + u32 val = 0; + u32 val2; + u32 val3; + u32 val4; + OSContext localContext; + if (LastCommandWasRead) { + LastReadFinished = __OSGetSystemTime(); + FirstRead[0] = 0; + Prev[0] = Curr[0]; + Prev[1] = Curr[1]; + Prev[2] = Curr[2]; + + if (StopAtNextInt == TRUE) { + val |= 8; + } + } + + LastCommandWasRead = FALSE; + StopAtNextInt = FALSE; + reg = __DIRegs[0]; + val4 = (reg & 0x2a); + val2 = (reg & 0x54) & (val4 << 1); + if (val2 & 0x40) { + val |= 8; + } + if (val2 & 0x10) { + val |= 1; + } + if (val2 & 0x4) { + val |= 2; + } + + if (val) { + ResetOccurred = FALSE; + OSCancelAlarm(&AlarmForTimeout); + } + __DIRegs[0] = val2 | (val4); + + if (ResetOccurred && (__OSGetSystemTime() - LastResetEnd) < (OSTime)OSMillisecondsToTicks(200)) { + reg = __DIRegs[1]; + val2 = (reg & 0x4) & ((reg & 0x2) << 1); + if (val2 & 0x4) { + if (ResetCoverCallback) { + ResetCoverCallback(4); + } + ResetCoverCallback = NULL; + } + + __DIRegs[1] = __DIRegs[1]; + } else if (WaitingCoverClose) { + reg = __DIRegs[1]; + val3 = reg & 2; + val2 = (reg & 0x4) & ((reg & 0x2) << 1); + if (val2 & 4) { + val |= 4; + } + __DIRegs[1] = val2 | val3; + WaitingCoverClose = FALSE; + } else { + __DIRegs[1] = 0; + } + + if ((val & 8) && !Breaking) { + val &= ~0x8; + } + + if (val & 1) { + u32 num; + DVDCommand* command; + s32 cmd0 = CommandList[num = NextCommandNumber]._0; + if (cmd0 == 1) { + NextCommandNumber++; + command = &CommandList[num]; + Read(command->_4, command->_8, command->_c, command->callback); + rv = 1; + } else if (cmd0 == 2) { + NextCommandNumber++; + command = &CommandList[num]; + DVDLowSeek(command->_c, command->callback); + rv = 1; + } else { + rv = 0; + } + + if (rv) { + return; + } + } else { + CommandList[0]._0 = -1; + NextCommandNumber = 0; + } + + OSClearContext(&localContext); + OSSetCurrentContext(&localContext); + if (val) { + DVDLowCallback cb = Callback; + Callback = NULL; + if (cb) { + cb(val); + } + Breaking = FALSE; + } + + OSClearContext(&localContext); + OSSetCurrentContext(context); } -#pragma pop /* 80347994-80347A18 3422D4 0084+00 1/1 0/0 0/0 .text AlarmHandler */ -#ifdef NONMATCHING static void AlarmHandler(OSAlarm* alarm, OSContext* context) { DVDCommand* cmd; - cmd = &CommandList[NextCommandNumber]; + u32 num; + s32 cmd0 = CommandList[num = NextCommandNumber]._0; - if (cmd->_0 == 1) { + if (cmd0 == 1) { ++NextCommandNumber; + cmd = &CommandList[num]; Read(cmd->_4, cmd->_8, cmd->_c, cmd->callback); - } else if (cmd->_0 == 2) { + } else if (cmd0 == 2) { ++NextCommandNumber; + cmd = &CommandList[num]; DVDLowSeek(cmd->_c, cmd->callback); } } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void AlarmHandler() { - nofralloc -#include "asm/dolphin/dvd/dvdlow/AlarmHandler.s" -} -#pragma pop -#endif /* 80347A18-80347A88 342358 0070+00 9/9 0/0 0/0 .text AlarmHandlerForTimeout */ static void AlarmHandlerForTimeout(OSAlarm* alarm, OSContext* context) { @@ -213,7 +297,7 @@ static void __setAlarm(u32 seconds) { } /* 80347A88-80347B98 3423C8 0110+00 3/3 0/0 0/0 .text Read */ -void Read(u32 arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { +void Read(void* arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { StopAtNextInt = FALSE; Callback = cb; LastCommandWasRead = TRUE; @@ -221,7 +305,7 @@ void Read(u32 arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { __DIRegs[2] = 0xA8000000; __DIRegs[3] = arg2 >> 2; __DIRegs[4] = arg1; - __DIRegs[5] = arg0; + __DIRegs[5] = (u32)arg0; __DIRegs[6] = arg1; LastLength = arg1; __DIRegs[7] = 3; @@ -233,7 +317,7 @@ void Read(u32 arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { } /* 80347B98-80347C18 3424D8 0080+00 1/1 0/0 0/0 .text SeekTwiceBeforeRead */ -void SeekTwiceBeforeRead(u32 arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { +void SeekTwiceBeforeRead(void* arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { u32 val; u32 temp = arg2 & 0xffff8000; if (temp == 0) { @@ -256,14 +340,82 @@ void SeekTwiceBeforeRead(u32 arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { } /* 80347C18-80347EB0 342558 0298+00 0/0 4/4 0/0 .text DVDLowRead */ +// Issues with alarm time calculation +#ifdef NONMATCHING +BOOL DVDLowRead(void* arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { + if (WorkAroundType == 0) { + Curr[2] = -1; + NextCommandNumber = 0; + Read(arg0, arg1, arg2, cb); + } else if (WorkAroundType == 1) { + if (FirstRead[0]) { + SeekTwiceBeforeRead(arg0, arg1, arg2, cb); + } else { + u32 curr2 = Curr[2] >> 15; + u32 prev1 = (Prev[2] + Prev[1] - 1) >> 15; + DVDDiskID* id = DVDGetCurrentDiskID(); + + BOOL is_streaming = id->is_streaming ? TRUE : FALSE; + u32 val; + BOOL val2; + if (is_streaming) { + val = 5; + } else { + val = 15; + } + + if (curr2 > prev1 - 2 || curr2 < prev1 + (val + 3)) { + val2 = TRUE; + } else { + val2 = FALSE; + } + + if (!val2) { + CommandList[0]._0 = -1; + NextCommandNumber = 0; + Read(arg0, arg1, arg2, cb); + } else { + curr2 = Curr[2] >> 15; + prev1 = (Prev[2] + Prev[1] - 1) >> 15; + if (curr2 == prev1 || curr2 + 1 == prev1) { + OSTime diff = __OSGetSystemTime() - LastReadFinished; + OSTime five_ms = (OSTime)OSMillisecondsToTicks(5); + if (diff < five_ms) { + CommandList[0]._0 = -1; + NextCommandNumber = 0; + Read(arg0, arg1, arg2, cb); + } else { + OSTime temp; + temp = diff - five_ms + (OSTime)OSMicrosecondsToTicks(500); + CommandList[0]._0 = 1; + CommandList[0]._4 = arg0; + CommandList[0]._8 = arg1; + CommandList[0]._c = arg2; + CommandList[0].callback = cb; + CommandList[1]._0 = -1; + NextCommandNumber = 0; + OSCreateAlarm(&AlarmForWA); + OSSetAlarm(&AlarmForWA, temp, AlarmHandler); + } + } else { + SeekTwiceBeforeRead(arg0, arg1, arg2, cb); + } + } + } + } + + return TRUE; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void DVDLowRead() { +asm BOOL DVDLowRead(void* arg0, u32 arg1, u32 arg2, DVDLowCallback cb) { nofralloc #include "asm/dolphin/dvd/dvdlow/DVDLowRead.s" } #pragma pop +#endif /* 80347EB0-80347F44 3427F0 0094+00 3/3 2/2 0/0 .text DVDLowSeek */ BOOL DVDLowSeek(u32 arg0, DVDLowCallback cb) { @@ -365,14 +517,20 @@ BOOL DVDLowAudioBufferConfig(s32 arg0, u32 arg1, DVDLowCallback cb) { } /* 80348388-80348444 342CC8 00BC+00 0/0 1/1 0/0 .text DVDLowReset */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void DVDLowReset() { - nofralloc -#include "asm/dolphin/dvd/dvdlow/DVDLowReset.s" +void DVDLowReset() { + u32 reg; + OSTime startTime; + __DIRegs[1] = 2; + reg = __PIRegs[9]; + __PIRegs[9] = (reg & ~4) | 1; + startTime = __OSGetSystemTime(); + + while (__OSGetSystemTime() - startTime < OSMicrosecondsToTicks(12)); + + __PIRegs[9] = reg | 5; + ResetOccurred = TRUE; + LastResetEnd = __OSGetSystemTime(); } -#pragma pop /* 80348444-80348458 342D84 0014+00 0/0 1/1 0/0 .text DVDLowBreak */ BOOL DVDLowBreak() {