Revolution SDK work (#3091)

* Implement revolution/ax

Copied mostly unchanged from Petari

* Implement revolution/axfx

Copied mostly unchanged from Petari

* Implement revolution/arc

Copied mostly unchanged from Petari

* Implement revolution/mem

Copied mostly unchanged from Petari

* Implement revolution/tpl

Copied verbatim from Petari

* revolution/ipc matching (except small linking issue on ShieldD)

* revolution/pad/Pad matching

Largely copied from Petari with significant modifications

* Fix up ut_TextWriterBase symbols

* Fix homebuttonLib file names in Shield splits
This commit is contained in:
Max Roncace
2026-02-11 03:10:40 -05:00
committed by GitHub
parent b9de3375b4
commit 255705a4cd
40 changed files with 1976 additions and 393 deletions
+2 -2
View File
@@ -3313,7 +3313,7 @@ revolution/sc/scsystem.c:
.data start:0x80401E40 end:0x80401FC0
.bss start:0x804B1DE0 end:0x804B9F80
.sdata start:0x804FA640 end:0x804FA718
.sbss start:0x804FB91C end:0x804FB934
.sbss start:0x804FB91C end:0x804FB930
revolution/sc/scapi.c:
.text start:0x8033D99C end:0x8033DD18
@@ -3330,7 +3330,7 @@ revolution/wenc/wenc.c:
revolution/ipc/ipcMain.c:
.text start:0x8033E1E0 end:0x8033E264
.sbss start:0x804FB934 end:0x804FB948
.sbss start:0x804FB930 end:0x804FB948
revolution/ipc/ipcclt.c:
.text start:0x8033E264 end:0x8033F964
+1 -1
View File
@@ -27821,7 +27821,7 @@ ItemIDOffsetTblOffset = .sbss:0x804FB928; // type:object size:0x4 scope:global a
IsDevKit = .sbss:0x804FB92C; // type:object size:0x1 scope:local data:byte
lbl_804FB92D = .sbss:0x804FB92D; // type:object size:0x1 data:byte
Initialized = .sbss:0x804FB92E; // type:object size:0x1 scope:local data:byte
lbl_804FB930 = .sbss:0x804FB930; // type:object size:0x1 data:byte
Initialized = .sbss:0x804FB930; // type:object size:0x1 scope:local data:byte
IPCCurrentBufferLo = .sbss:0x804FB934; // type:object size:0x4 scope:global align:4 data:4byte
IPCCurrentBufferHi = .sbss:0x804FB938; // type:object size:0x4 scope:global align:4 data:4byte
IPCBufferLo = .sbss:0x804FB93C; // type:object size:0x4 scope:global align:4 data:4byte
+5 -5
View File
@@ -3444,16 +3444,16 @@ revolution/ax/AXCL.c:
.text start:0x80369114 end:0x80369144
.sbss start:0x8053B7B0 end:0x8053B7B8
revolution/ax/AXFXReverbHi.c:
revolution/axfx/AXFXReverbHi.c:
.text start:0x80369144 end:0x803691D0
.sdata2 start:0x80540560 end:0x80540568
revolution/ax/AXFXReverbHiExp.c:
revolution/axfx/AXFXReverbHiExp.c:
.text start:0x803691D0 end:0x80369FA8
.data start:0x8043FD60 end:0x8043FF00
.sdata2 start:0x80540568 end:0x805405A8
revolution/ax/AXFXHooks.c:
revolution/axfx/AXFXHooks.c:
.text start:0x80369FA8 end:0x80369FE0
.sdata start:0x8053A418 end:0x8053A420
@@ -3564,7 +3564,7 @@ revolution/sc/scsystem.c:
.data start:0x804404C0 end:0x80440640
.bss start:0x804F1B40 end:0x804F9CE0
.sdata start:0x8053A480 end:0x8053A558
.sbss start:0x8053B7F4 end:0x8053B80C
.sbss start:0x8053B7F4 end:0x8053B808
revolution/sc/scapi.c:
.text start:0x80375134 end:0x80375514
@@ -3586,7 +3586,7 @@ revolution/arc/arc.c:
revolution/ipc/ipcMain.c:
.text start:0x80375EE8 end:0x80375F6C
.sbss start:0x8053B80C end:0x8053B820
.sbss start:0x8053B808 end:0x8053B820
revolution/ipc/ipcclt.c:
.text start:0x80375F6C end:0x8037766C
+18 -18
View File
@@ -13324,8 +13324,8 @@ CalcLineRectImpl<w>__25@unnamed@lyt_textBox_cpp@FPQ36nw4hbm2ut4RectPQ36nw4hbm2ut
GetCharStrmReader__Q36nw4hbm2ut4FontCFv = .text:0x802CA230; // type:function size:0x148 scope:global align:4
AllocStringBuffer__Q36nw4hbm3lyt7TextBoxFUs = .text:0x802CA378; // type:function size:0x78 scope:global align:4
FreeStringBuffer__Q36nw4hbm3lyt7TextBoxFv = .text:0x802CA3F0; // type:function size:0x48 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPC7wchar_tUs = .text:0x802CA438; // type:function size:0x68 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPC7wchar_tUsUs = .text:0x802CA4A0; // type:function size:0x140 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPCwUs = .text:0x802CA438; // type:function size:0x68 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPCwUsUs = .text:0x802CA4A0; // type:function size:0x140 scope:global align:4
__dt__Q36nw4hbm2ut4FontFv = .text:0x802CA5E0; // type:function size:0x40 scope:global align:4
GetTextDrawRect__Q36nw4hbm3lyt7TextBoxCFPQ36nw4hbm2ut17TextWriterBase<w> = .text:0x802CA620; // type:function size:0x614 scope:global align:4
CalcStringRectImpl<w>__25@unnamed@lyt_textBox_cpp@FPQ36nw4hbm2ut4RectPQ36nw4hbm2ut17TextWriterBase<w>PCwif_v = .text:0x802CAC34; // type:function size:0x438 scope:global align:4
@@ -13454,12 +13454,12 @@ GetCharSpace__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802DD8BC; // type:fun
GetTabWidth__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802DD9D4; // type:function size:0x118 scope:global align:4
SetTagProcessor__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut19TagProcessorBase<w> = .text:0x802DDAEC; // type:function size:0x210 scope:global align:4
GetTagProcessor__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802DDCFC; // type:function size:0x118 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_ti = .text:0x802DDE14; // type:function size:0x438 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_t = .text:0x802DE24C; // type:function size:0x540 scope:global align:4
CalcLineRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPC7wchar_ti = .text:0x802DE78C; // type:function size:0x1068 scope:global align:4
CalcStringRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPC7wchar_ti = .text:0x802DF7F4; // type:function size:0x3F0 scope:global align:4
PrintImpl__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_ti = .text:0x802DFBE4; // type:function size:0x1550 scope:global align:4
AdjustCursor__Q36nw4hbm2ut17TextWriterBase<w>FPfPfPC7wchar_ti = .text:0x802E1134; // type:function size:0xDFC scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPCwi = .text:0x802DDE14; // type:function size:0x438 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPCw = .text:0x802DE24C; // type:function size:0x540 scope:global align:4
CalcLineRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPCwi = .text:0x802DE78C; // type:function size:0x1068 scope:global align:4
CalcStringRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPCwi = .text:0x802DF7F4; // type:function size:0x3F0 scope:global align:4
PrintImpl__Q36nw4hbm2ut17TextWriterBase<w>FPCwi = .text:0x802DFBE4; // type:function size:0x1550 scope:global align:4
AdjustCursor__Q36nw4hbm2ut17TextWriterBase<w>FPfPfPCwi = .text:0x802E1134; // type:function size:0xDFC scope:global align:4
__sinit_\ut_TextWriterBase_cpp = .text:0x802E1F30; // type:function size:0x84 scope:local align:4
__ct__7JKRHeapFPvUlP7JKRHeapb = .text:0x802E1FB4; // type:function size:0x118 scope:global align:4
__dt__17JSULink<7JKRHeap>Fv = .text:0x802E20CC; // type:function size:0x5C scope:global align:4
@@ -23436,14 +23436,14 @@ __vt__Q36nw4hbm3lyt16ResourceAccessor = .data:0x804280E0; // type:object size:0x
@10603 = .data:0x80428450; // type:object size:0x19 scope:local align:4 data:string
__vt__Q36nw4hbm3lyt7TextBox = .data:0x8042846C; // type:object size:0x74 scope:global align:4
@STRING@GetCharStrmReader__Q36nw4hbm2ut4FontCFv@0 = .data:0x804284E0; // type:object size:0x35 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPC7wchar_t@6 = .data:0x80428518; // type:object size:0x37 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPC7wchar_t@5 = .data:0x80428550; // type:object size:0x11 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPC7wchar_t@4 = .data:0x80428564; // type:object size:0x37 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPC7wchar_t@3 = .data:0x8042859C; // type:object size:0x11 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPC7wchar_t@2 = .data:0x804285B0; // type:object size:0x49 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPC7wchar_t@1 = .data:0x804285FC; // type:object size:0x11 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPC7wchar_t@0 = .data:0x80428610; // type:object size:0x35 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPC7wchar_t = .data:0x80428648; // type:object size:0x11 scope:local align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPCw@6 = .data:0x80428518; // type:object size:0x37 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPCw@5 = .data:0x80428550; // type:object size:0x11 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPCw@4 = .data:0x80428564; // type:object size:0x37 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPCw@3 = .data:0x8042859C; // type:object size:0x11 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPCw@2 = .data:0x804285B0; // type:object size:0x49 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPCw@1 = .data:0x804285FC; // type:object size:0x11 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPCw@0 = .data:0x80428610; // type:object size:0x35 scope:global align:4 data:string
@STRING@Set__Q36nw4hbm2ut14CharStrmReaderFPCw = .data:0x80428648; // type:object size:0x11 scope:local align:4 data:string
@STRING@GetCurrentPos__Q36nw4hbm2ut14CharStrmReaderCFv@0 = .data:0x8042865C; // type:object size:0x35 scope:global align:4 data:string
@STRING@GetCurrentPos__Q36nw4hbm2ut14CharStrmReaderCFv = .data:0x80428694; // type:object size:0x11 scope:local align:4 data:string
@STRING@Next__Q36nw4hbm2ut14CharStrmReaderFv@0 = .data:0x804286A8; // type:object size:0x35 scope:global align:4 data:string
@@ -25945,7 +25945,7 @@ Type = .bss:0x804F9EE0; // type:object size:0x10 scope:local align:4
CmdProbeDevice = .bss:0x804F9EF0; // type:object size:0x10 scope:global align:4 data:4byte
pre_status$889 = .bss:0x804F9F00; // type:object size:0x30 scope:local align:4
...bss.0 = .bss:0x804F9F40; // type:label scope:local align:4
_managerAlarm = .bss:0x804F9F40; // type:object size:0x30 scope:global align:4
_managerAlarm = .bss:0x804F9F40; // type:object size:0x30 scope:global align:32
_wpdcb = .bss:0x804F9F70; // type:object size:0x10 scope:global align:4 data:4byte
__WPADiManageHandlerStack = .bss:0x804F9F80; // type:object size:0x1000 scope:global align:4
_dev_handle_index = .bss:0x804FAF80; // type:object size:0x10 scope:global align:4 data:byte
@@ -29004,7 +29004,7 @@ ItemIDOffsetTblOffset = .sbss:0x8053B800; // type:object size:0x4 scope:global a
IsDevKit = .sbss:0x8053B804; // type:object size:0x1 scope:local data:byte
lbl_8053B805 = .sbss:0x8053B805; // type:object size:0x1 data:byte
Initialized = .sbss:0x8053B806; // type:object size:0x1 scope:local data:byte
lbl_8053B808 = .sbss:0x8053B808; // type:object size:0x1 data:byte
Initialized = .sbss:0x8053B808; // type:object size:0x1 scope:local data:byte
IPCCurrentBufferLo = .sbss:0x8053B80C; // type:object size:0x4 scope:global align:4 data:4byte
IPCCurrentBufferHi = .sbss:0x8053B810; // type:object size:0x4 scope:global align:4 data:4byte
IPCBufferLo = .sbss:0x8053B814; // type:object size:0x4 scope:global align:4 data:4byte
+5 -5
View File
@@ -3406,16 +3406,16 @@ revolution/ax/AXCL.c:
.text start:0x80353B4C end:0x80353B7C
.sbss start:0x805217A8 end:0x805217B0
revolution/ax/AXFXReverbHi.c:
revolution/axfx/AXFXReverbHi.c:
.text start:0x80353B7C end:0x80353C08
.sdata2 start:0x805265E0 end:0x805265E8
revolution/ax/AXFXReverbHiExp.c:
revolution/axfx/AXFXReverbHiExp.c:
.text start:0x80353C08 end:0x803549E0
.data start:0x80427240 end:0x804273E0
.sdata2 start:0x805265E8 end:0x80526628
revolution/ax/AXFXHooks.c:
revolution/axfx/AXFXHooks.c:
.text start:0x803549E0 end:0x80354A18
.sdata start:0x80520428 end:0x80520430
@@ -3526,7 +3526,7 @@ revolution/sc/scsystem.c:
.data start:0x804279A0 end:0x80427B20
.bss start:0x804D7BC0 end:0x804DFD60
.sdata start:0x80520490 end:0x80520568
.sbss start:0x805217EC end:0x80521804
.sbss start:0x805217EC end:0x80521800
revolution/sc/scapi.c:
.text start:0x8035FB6C end:0x8035FF4C
@@ -3548,7 +3548,7 @@ revolution/arc/arc.c:
revolution/ipc/ipcMain.c:
.text start:0x80360920 end:0x803609A4
.sbss start:0x80521804 end:0x80521818
.sbss start:0x80521800 end:0x80521818
revolution/ipc/ipcclt.c:
.text start:0x803609A4 end:0x803620A4
+10 -10
View File
@@ -13256,8 +13256,8 @@ CalcLineRectImpl<w>__25@unnamed@lyt_textBox_cpp@FPQ36nw4hbm2ut4RectPQ36nw4hbm2ut
GetCharStrmReader__Q36nw4hbm2ut4FontCFv = .text:0x802C5090; // type:function size:0x38 scope:global align:4
AllocStringBuffer__Q36nw4hbm3lyt7TextBoxFUs = .text:0x802C50C8; // type:function size:0x78 scope:global align:4
FreeStringBuffer__Q36nw4hbm3lyt7TextBoxFv = .text:0x802C5140; // type:function size:0x48 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPC7wchar_tUs = .text:0x802C5188; // type:function size:0x68 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPC7wchar_tUsUs = .text:0x802C51F0; // type:function size:0xC8 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPCwUs = .text:0x802C5188; // type:function size:0x68 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPCwUsUs = .text:0x802C51F0; // type:function size:0xC8 scope:global align:4
__dt__Q36nw4hbm2ut4FontFv = .text:0x802C52B8; // type:function size:0x40 scope:global align:4
GetTextDrawRect__Q36nw4hbm3lyt7TextBoxCFPQ36nw4hbm2ut17TextWriterBase<w> = .text:0x802C52F8; // type:function size:0x328 scope:global align:4
CalcStringRectImpl<w>__25@unnamed@lyt_textBox_cpp@FPQ36nw4hbm2ut4RectPQ36nw4hbm2ut17TextWriterBase<w>PCwif_v = .text:0x802C5620; // type:function size:0x160 scope:global align:4
@@ -13380,12 +13380,12 @@ GetCharSpace__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CB12C; // type:fun
GetTabWidth__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CB134; // type:function size:0x8 scope:global align:4
SetTagProcessor__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut19TagProcessorBase<w> = .text:0x802CB13C; // type:function size:0x8 scope:global align:4
GetTagProcessor__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CB144; // type:function size:0x8 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_ti = .text:0x802CB14C; // type:function size:0x21C scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_t = .text:0x802CB368; // type:function size:0x238 scope:global align:4
CalcLineRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPC7wchar_ti = .text:0x802CB5A0; // type:function size:0x3C0 scope:global align:4
CalcStringRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPC7wchar_ti = .text:0x802CB960; // type:function size:0x124 scope:global align:4
PrintImpl__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_ti = .text:0x802CBA84; // type:function size:0x744 scope:global align:4
AdjustCursor__Q36nw4hbm2ut17TextWriterBase<w>FPfPfPC7wchar_ti = .text:0x802CC1C8; // type:function size:0x738 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPCwi = .text:0x802CB14C; // type:function size:0x21C scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPCw = .text:0x802CB368; // type:function size:0x238 scope:global align:4
CalcLineRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPCwi = .text:0x802CB5A0; // type:function size:0x3C0 scope:global align:4
CalcStringRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPCwi = .text:0x802CB960; // type:function size:0x124 scope:global align:4
PrintImpl__Q36nw4hbm2ut17TextWriterBase<w>FPCwi = .text:0x802CBA84; // type:function size:0x744 scope:global align:4
AdjustCursor__Q36nw4hbm2ut17TextWriterBase<w>FPfPfPCwi = .text:0x802CC1C8; // type:function size:0x738 scope:global align:4
__sinit_\ut_TextWriterBase_cpp = .text:0x802CC900; // type:function size:0x84 scope:global align:4
__ct__7JKRHeapFPvUlP7JKRHeapb = .text:0x802CC984; // type:function size:0x118 scope:global align:4
__dt__17JSULink<7JKRHeap>Fv = .text:0x802CCA9C; // type:function size:0x5C scope:global align:4
@@ -25491,7 +25491,7 @@ Type = .bss:0x804DFF60; // type:object size:0x10 scope:local align:4
CmdProbeDevice = .bss:0x804DFF70; // type:object size:0x10 scope:global align:4 data:4byte
pre_status$889 = .bss:0x804DFF80; // type:object size:0x30 scope:global align:4
...bss.0 = .bss:0x804DFFC0; // type:label scope:local align:4
_managerAlarm = .bss:0x804DFFC0; // type:object size:0x30 scope:global align:4
_managerAlarm = .bss:0x804DFFC0; // type:object size:0x30 scope:global align:32
_wpdcb = .bss:0x804DFFF0; // type:object size:0x10 scope:global align:4 data:4byte
__WPADiManageHandlerStack = .bss:0x804E0000; // type:object size:0x1000 scope:global align:4
_dev_handle_index = .bss:0x804E1000; // type:object size:0x10 scope:global align:4 data:byte
@@ -28524,7 +28524,7 @@ ItemIDOffsetTblOffset = .sbss:0x805217F8; // type:object size:0x4 scope:global a
IsDevKit = .sbss:0x805217FC; // type:object size:0x1 scope:local data:byte
lbl_805217FD = .sbss:0x805217FD; // type:object size:0x1 data:byte
Initialized = .sbss:0x805217FE; // type:object size:0x1 scope:local data:byte
lbl_80521800 = .sbss:0x80521800; // type:object size:0x1 data:byte
Initialized = .sbss:0x80521800; // type:object size:0x1 scope:local data:byte
IPCCurrentBufferLo = .sbss:0x80521804; // type:object size:0x4 scope:global align:4 data:4byte
IPCCurrentBufferHi = .sbss:0x80521808; // type:object size:0x4 scope:global align:4 data:4byte
IPCBufferLo = .sbss:0x8052180C; // type:object size:0x4 scope:global align:4 data:4byte
+5 -5
View File
@@ -3402,16 +3402,16 @@ revolution/ax/AXCL.c:
.text start:0x80355604 end:0x80355634
.sbss start:0x8051F618 end:0x8051F620
revolution/ax/AXFXReverbHi.c:
revolution/axfx/AXFXReverbHi.c:
.text start:0x80355634 end:0x803556C0
.sdata2 start:0x80524438 end:0x80524440
revolution/ax/AXFXReverbHiExp.c:
revolution/axfx/AXFXReverbHiExp.c:
.text start:0x803556C0 end:0x80356498
.data start:0x804250C0 end:0x80425260
.sdata2 start:0x80524440 end:0x80524480
revolution/ax/AXFXHooks.c:
revolution/axfx/AXFXHooks.c:
.text start:0x80356498 end:0x803564D0
.sdata start:0x8051E298 end:0x8051E2A0
@@ -3522,7 +3522,7 @@ revolution/sc/scsystem.c:
.data start:0x80425820 end:0x804259A0
.bss start:0x804D5A40 end:0x804DDBE0
.sdata start:0x8051E300 end:0x8051E3D8
.sbss start:0x8051F65C end:0x8051F674
.sbss start:0x8051F65C end:0x8051F670
revolution/sc/scapi.c:
.text start:0x80361624 end:0x80361A04
@@ -3544,7 +3544,7 @@ revolution/arc/arc.c:
revolution/ipc/ipcMain.c:
.text start:0x803623D8 end:0x8036245C
.sbss start:0x8051F674 end:0x8051F688
.sbss start:0x8051F670 end:0x8051F688
revolution/ipc/ipcclt.c:
.text start:0x8036245C end:0x80363B5C
+10 -10
View File
@@ -13261,8 +13261,8 @@ CalcLineRectImpl<w>__25@unnamed@lyt_textBox_cpp@FPQ36nw4hbm2ut4RectPQ36nw4hbm2ut
GetCharStrmReader__Q36nw4hbm2ut4FontCFv = .text:0x802C6BB0; // type:function size:0x38 scope:global align:4
AllocStringBuffer__Q36nw4hbm3lyt7TextBoxFUs = .text:0x802C6BE8; // type:function size:0x78 scope:global align:4
FreeStringBuffer__Q36nw4hbm3lyt7TextBoxFv = .text:0x802C6C60; // type:function size:0x48 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPC7wchar_tUs = .text:0x802C6CA8; // type:function size:0x68 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPC7wchar_tUsUs = .text:0x802C6D10; // type:function size:0xC8 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPCwUs = .text:0x802C6CA8; // type:function size:0x68 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPCwUsUs = .text:0x802C6D10; // type:function size:0xC8 scope:global align:4
__dt__Q36nw4hbm2ut4FontFv = .text:0x802C6DD8; // type:function size:0x40 scope:global align:4
GetTextDrawRect__Q36nw4hbm3lyt7TextBoxCFPQ36nw4hbm2ut17TextWriterBase<w> = .text:0x802C6E18; // type:function size:0x328 scope:global align:4
CalcStringRectImpl<w>__25@unnamed@lyt_textBox_cpp@FPQ36nw4hbm2ut4RectPQ36nw4hbm2ut17TextWriterBase<w>PCwif_v = .text:0x802C7140; // type:function size:0x160 scope:global align:4
@@ -13385,12 +13385,12 @@ GetCharSpace__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CCC4C; // type:fun
GetTabWidth__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CCC54; // type:function size:0x8 scope:global align:4
SetTagProcessor__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut19TagProcessorBase<w> = .text:0x802CCC5C; // type:function size:0x8 scope:global align:4
GetTagProcessor__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CCC64; // type:function size:0x8 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_ti = .text:0x802CCC6C; // type:function size:0x21C scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_t = .text:0x802CCE88; // type:function size:0x238 scope:global align:4
CalcLineRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPC7wchar_ti = .text:0x802CD0C0; // type:function size:0x3C0 scope:global align:4
CalcStringRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPC7wchar_ti = .text:0x802CD480; // type:function size:0x124 scope:global align:4
PrintImpl__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_ti = .text:0x802CD5A4; // type:function size:0x744 scope:global align:4
AdjustCursor__Q36nw4hbm2ut17TextWriterBase<w>FPfPfPC7wchar_ti = .text:0x802CDCE8; // type:function size:0x738 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPCwi = .text:0x802CCC6C; // type:function size:0x21C scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPCw = .text:0x802CCE88; // type:function size:0x238 scope:global align:4
CalcLineRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPCwi = .text:0x802CD0C0; // type:function size:0x3C0 scope:global align:4
CalcStringRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPCwi = .text:0x802CD480; // type:function size:0x124 scope:global align:4
PrintImpl__Q36nw4hbm2ut17TextWriterBase<w>FPCwi = .text:0x802CD5A4; // type:function size:0x744 scope:global align:4
AdjustCursor__Q36nw4hbm2ut17TextWriterBase<w>FPfPfPCwi = .text:0x802CDCE8; // type:function size:0x738 scope:global align:4
__sinit_\ut_TextWriterBase_cpp = .text:0x802CE420; // type:function size:0x84 scope:global align:4
__ct__7JKRHeapFPvUlP7JKRHeapb = .text:0x802CE4A4; // type:function size:0x118 scope:global align:4
__dt__17JSULink<7JKRHeap>Fv = .text:0x802CE5BC; // type:function size:0x5C scope:global align:4
@@ -25493,7 +25493,7 @@ Type = .bss:0x804DDDE0; // type:object size:0x10 scope:local align:4
CmdProbeDevice = .bss:0x804DDDF0; // type:object size:0x10 scope:global align:4 data:4byte
pre_status$889 = .bss:0x804DDE00; // type:object size:0x30 scope:local align:4
...bss.0 = .bss:0x804DDE40; // type:label scope:local align:4
_managerAlarm = .bss:0x804DDE40; // type:object size:0x30 scope:global align:4
_managerAlarm = .bss:0x804DDE40; // type:object size:0x30 scope:global align:32
_wpdcb = .bss:0x804DDE70; // type:object size:0x10 scope:global align:4 data:4byte
__WPADiManageHandlerStack = .bss:0x804DDE80; // type:object size:0x1000 scope:global align:4
_dev_handle_index = .bss:0x804DEE80; // type:object size:0x10 scope:global align:4 data:byte
@@ -28528,7 +28528,7 @@ ItemIDOffsetTblOffset = .sbss:0x8051F668; // type:object size:0x4 scope:global a
IsDevKit = .sbss:0x8051F66C; // type:object size:0x1 scope:local data:byte
lbl_8051F66D = .sbss:0x8051F66D; // type:object size:0x1 data:byte
Initialized = .sbss:0x8051F66E; // type:object size:0x1 scope:local data:byte
lbl_8051F670 = .sbss:0x8051F670; // type:object size:0x1 data:byte
Initialized = .sbss:0x8051F670; // type:object size:0x1 scope:local data:byte
IPCCurrentBufferLo = .sbss:0x8051F674; // type:object size:0x4 scope:global align:4 data:4byte
IPCCurrentBufferHi = .sbss:0x8051F678; // type:object size:0x4 scope:global align:4 data:4byte
IPCBufferLo = .sbss:0x8051F67C; // type:object size:0x4 scope:global align:4 data:4byte
+5 -5
View File
@@ -3402,16 +3402,16 @@ revolution/ax/AXCL.c:
.text start:0x80353F7C end:0x80353FAC
.sbss start:0x80521F68 end:0x80521F70
revolution/ax/AXFXReverbHi.c:
revolution/axfx/AXFXReverbHi.c:
.text start:0x80353FAC end:0x80354038
.sdata2 start:0x80526DB0 end:0x80526DB8
revolution/ax/AXFXReverbHiExp.c:
revolution/axfx/AXFXReverbHiExp.c:
.text start:0x80354038 end:0x80354E10
.data start:0x80427B40 end:0x80427CE0
.sdata2 start:0x80526DB8 end:0x80526DF8
revolution/ax/AXFXHooks.c:
revolution/axfx/AXFXHooks.c:
.text start:0x80354E10 end:0x80354E48
.sdata start:0x80520BD0 end:0x80520BD8
@@ -3522,7 +3522,7 @@ revolution/sc/scsystem.c:
.data start:0x804282A0 end:0x80428420
.bss start:0x804D84C0 end:0x804E0660
.sdata start:0x80520C38 end:0x80520D10
.sbss start:0x80521FAC end:0x80521FC4
.sbss start:0x80521FAC end:0x80521FC0
revolution/sc/scapi.c:
.text start:0x8035FF9C end:0x803603D0
@@ -3544,7 +3544,7 @@ revolution/arc/arc.c:
revolution/ipc/ipcMain.c:
.text start:0x80360DA4 end:0x80360E28
.sbss start:0x80521FC4 end:0x80521FD8
.sbss start:0x80521FC0 end:0x80521FD8
revolution/ipc/ipcclt.c:
.text start:0x80360E28 end:0x80362528
+10 -10
View File
@@ -13256,8 +13256,8 @@ CalcLineRectImpl<w>__25@unnamed@lyt_textBox_cpp@FPQ36nw4hbm2ut4RectPQ36nw4hbm2ut
GetCharStrmReader__Q36nw4hbm2ut4FontCFv = .text:0x802C54C0; // type:function size:0x38 scope:global align:4
AllocStringBuffer__Q36nw4hbm3lyt7TextBoxFUs = .text:0x802C54F8; // type:function size:0x78 scope:global align:4
FreeStringBuffer__Q36nw4hbm3lyt7TextBoxFv = .text:0x802C5570; // type:function size:0x48 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPC7wchar_tUs = .text:0x802C55B8; // type:function size:0x68 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPC7wchar_tUsUs = .text:0x802C5620; // type:function size:0xC8 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPCwUs = .text:0x802C55B8; // type:function size:0x68 scope:global align:4
SetString__Q36nw4hbm3lyt7TextBoxFPCwUsUs = .text:0x802C5620; // type:function size:0xC8 scope:global align:4
__dt__Q36nw4hbm2ut4FontFv = .text:0x802C56E8; // type:function size:0x40 scope:global align:4
GetTextDrawRect__Q36nw4hbm3lyt7TextBoxCFPQ36nw4hbm2ut17TextWriterBase<w> = .text:0x802C5728; // type:function size:0x328 scope:global align:4
CalcStringRectImpl<w>__25@unnamed@lyt_textBox_cpp@FPQ36nw4hbm2ut4RectPQ36nw4hbm2ut17TextWriterBase<w>PCwif_v = .text:0x802C5A50; // type:function size:0x160 scope:global align:4
@@ -13380,12 +13380,12 @@ GetCharSpace__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CB55C; // type:fun
GetTabWidth__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CB564; // type:function size:0x8 scope:global align:4
SetTagProcessor__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut19TagProcessorBase<w> = .text:0x802CB56C; // type:function size:0x8 scope:global align:4
GetTagProcessor__Q36nw4hbm2ut17TextWriterBase<w>CFv = .text:0x802CB574; // type:function size:0x8 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_ti = .text:0x802CB57C; // type:function size:0x21C scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_t = .text:0x802CB798; // type:function size:0x238 scope:global align:4
CalcLineRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPC7wchar_ti = .text:0x802CB9D0; // type:function size:0x3C0 scope:global align:4
CalcStringRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPC7wchar_ti = .text:0x802CBD90; // type:function size:0x124 scope:global align:4
PrintImpl__Q36nw4hbm2ut17TextWriterBase<w>FPC7wchar_ti = .text:0x802CBEB4; // type:function size:0x744 scope:global align:4
AdjustCursor__Q36nw4hbm2ut17TextWriterBase<w>FPfPfPC7wchar_ti = .text:0x802CC5F8; // type:function size:0x738 scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPCwi = .text:0x802CB57C; // type:function size:0x21C scope:global align:4
Print__Q36nw4hbm2ut17TextWriterBase<w>FPCw = .text:0x802CB798; // type:function size:0x238 scope:global align:4
CalcLineRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPCwi = .text:0x802CB9D0; // type:function size:0x3C0 scope:global align:4
CalcStringRectImpl__Q36nw4hbm2ut17TextWriterBase<w>FPQ36nw4hbm2ut4RectPCwi = .text:0x802CBD90; // type:function size:0x124 scope:global align:4
PrintImpl__Q36nw4hbm2ut17TextWriterBase<w>FPCwi = .text:0x802CBEB4; // type:function size:0x744 scope:global align:4
AdjustCursor__Q36nw4hbm2ut17TextWriterBase<w>FPfPfPCwi = .text:0x802CC5F8; // type:function size:0x738 scope:global align:4
__sinit_\ut_TextWriterBase_cpp = .text:0x802CCD30; // type:function size:0x84 scope:global align:4
__ct__7JKRHeapFPvUlP7JKRHeapb = .text:0x802CCDB4; // type:function size:0x118 scope:global align:4
__dt__17JSULink<7JKRHeap>Fv = .text:0x802CCECC; // type:function size:0x5C scope:global align:4
@@ -25487,7 +25487,7 @@ Type = .bss:0x804E0860; // type:object size:0x10 scope:local align:4
CmdProbeDevice = .bss:0x804E0870; // type:object size:0x10 scope:global align:4 data:4byte
pre_status$889 = .bss:0x804E0880; // type:object size:0x30 scope:local align:4
...bss.0 = .bss:0x804E08C0; // type:label scope:local align:4
_managerAlarm = .bss:0x804E08C0; // type:object size:0x30 scope:global align:4
_managerAlarm = .bss:0x804E08C0; // type:object size:0x30 scope:global align:32
_wpdcb = .bss:0x804E08F0; // type:object size:0x10 scope:global align:4 data:4byte
__WPADiManageHandlerStack = .bss:0x804E0900; // type:object size:0x1000 scope:global align:4
_dev_handle_index = .bss:0x804E1900; // type:object size:0x10 scope:global align:4 data:byte
@@ -28415,7 +28415,7 @@ ItemIDOffsetTblOffset = .sbss:0x80521FB8; // type:object size:0x4 scope:global a
IsDevKit = .sbss:0x80521FBC; // type:object size:0x1 scope:local data:byte
lbl_80521FBD = .sbss:0x80521FBD; // type:object size:0x1 data:byte
Initialized = .sbss:0x80521FBE; // type:object size:0x1 scope:local data:byte
lbl_80521FC0 = .sbss:0x80521FC0; // type:object size:0x1 data:byte
Initialized = .sbss:0x80521FC0; // type:object size:0x1 scope:local data:byte
IPCCurrentBufferLo = .sbss:0x80521FC4; // type:object size:0x4 scope:global align:4 data:4byte
IPCCurrentBufferHi = .sbss:0x80521FC8; // type:object size:0x4 scope:global align:4 data:4byte
IPCBufferLo = .sbss:0x80521FCC; // type:object size:0x4 scope:global align:4 data:4byte
+37 -37
View File
@@ -2412,7 +2412,7 @@ revolution/gf/GFPixel.cpp:
revolution/gf/GFTev.cpp:
.text start:0x803611A0 end:0x80361200
revolution/hbm/HBMBase.cpp:
revolution/homebuttonLib/nw4hbm/HBMBase.cpp:
.text start:0x80361200 end:0x803699C0
.rodata start:0x804A93A0 end:0x804A9650
.data start:0x804E11B0 end:0x804E1D58
@@ -2421,95 +2421,95 @@ revolution/hbm/HBMBase.cpp:
.sdata2 start:0x8050DF50 end:0x8050DFB0
.bss start:0x8057EEA8 end:0x8057EEB8
revolution/hbm/HBMAnmController.cpp:
revolution/homebuttonLib/nw4hbm/HBMAnmController.cpp:
.text start:0x803699C0 end:0x80369AD0
.data start:0x804E1D58 end:0x804E1D68
revolution/hbm/HBMFrameController.cpp:
revolution/homebuttonLib/nw4hbm/HBMFrameController.cpp:
.text start:0x80369AD0 end:0x80369C80
.sdata2 start:0x8050DFB0 end:0x8050DFB8
revolution/hbm/HBMGUIManager.cpp:
revolution/homebuttonLib/nw4hbm/HBMGUIManager.cpp:
.text start:0x80369C80 end:0x8036B120
.data start:0x804E1D68 end:0x804E1EC0
.sbss start:0x805091C0 end:0x805091C8
.sdata2 start:0x8050DFB8 end:0x8050DFC8
revolution/hbm/HBMController.cpp:
revolution/homebuttonLib/nw4hbm/HBMController.cpp:
.text start:0x8036B120 end:0x8036B9F0
.sbss start:0x805091C8 end:0x805091D0
.sdata2 start:0x8050DFC8 end:0x8050DFD8
.bss start:0x8057EEB8 end:0x8057F048
revolution/hbm/HBMRemoteSpk.cpp:
revolution/homebuttonLib/nw4hbm/HBMRemoteSpk.cpp:
.text start:0x8036B9F0 end:0x8036C170
.data start:0x804E1EC0 end:0x804E1ED0
.sbss start:0x805091D0 end:0x805091D8
revolution/hbm/db_DbgPrintBase.cpp:
revolution/homebuttonLib/nw4hbm/db_DbgPrintBase.cpp:
.text start:0x8036C170 end:0x8036C1B0
revolution/hbm/lyt_animation.cpp:
revolution/homebuttonLib/nw4hbm/lyt_animation.cpp:
.text start:0x8036C1B0 end:0x8036CD40
.data start:0x804E1ED0 end:0x804E1EF0
.sdata2 start:0x8050DFD8 end:0x8050DFF8
revolution/hbm/lyt_arcResourceAccessor.cpp:
revolution/homebuttonLib/nw4hbm/lyt_arcResourceAccessor.cpp:
.text start:0x8036CD40 end:0x8036D0C0
.data start:0x804E1EF0 end:0x804E1F08
.sdata start:0x80507DA8 end:0x80507DB0
revolution/hbm/lyt_bounding.cpp:
revolution/homebuttonLib/nw4hbm/lyt_bounding.cpp:
.text start:0x8036D0C0 end:0x8036D1F0
.ctors start:0x8048E688 end:0x8048E68C
.data start:0x804E1F08 end:0x804E1F70
.sbss start:0x805091D8 end:0x805091E8
revolution/hbm/lyt_common.cpp:
revolution/homebuttonLib/nw4hbm/lyt_common.cpp:
.text start:0x8036D1F0 end:0x8036E050
.sdata2 start:0x8050DFF8 end:0x8050E008
.bss start:0x8057F048 end:0x8057F068
revolution/hbm/lyt_drawInfo.cpp:
revolution/homebuttonLib/nw4hbm/lyt_drawInfo.cpp:
.text start:0x8036E050 end:0x8036E110
.data start:0x804E1F70 end:0x804E1F80
.sdata2 start:0x8050E008 end:0x8050E010
revolution/hbm/lyt_group.cpp:
revolution/homebuttonLib/nw4hbm/lyt_group.cpp:
.text start:0x8036E110 end:0x8036E450
.data start:0x804E1F80 end:0x804E1F90
revolution/hbm/lyt_layout.cpp:
revolution/homebuttonLib/nw4hbm/lyt_layout.cpp:
.text start:0x8036E450 end:0x8036EFD0
.data start:0x804E1F90 end:0x804E1FC8
.sbss start:0x805091E8 end:0x805091F0
.sdata2 start:0x8050E010 end:0x8050E018
revolution/hbm/lyt_material.cpp:
revolution/homebuttonLib/nw4hbm/lyt_material.cpp:
.text start:0x8036EFD0 end:0x803721E0
.data start:0x804E1FC8 end:0x804E2030
.sdata2 start:0x8050E018 end:0x8050E038
.sbss2 start:0x8050EFD0 end:0x8050EFD8
revolution/hbm/lyt_pane.cpp:
revolution/homebuttonLib/nw4hbm/lyt_pane.cpp:
.text start:0x803721E0 end:0x803732E0
.ctors start:0x8048E68C end:0x8048E690
.data start:0x804E2030 end:0x804E2098
.sbss start:0x805091F0 end:0x805091F8
.sdata2 start:0x8050E038 end:0x8050E058
revolution/hbm/lyt_picture.cpp:
revolution/homebuttonLib/nw4hbm/lyt_picture.cpp:
.text start:0x803732E0 end:0x80373830
.ctors start:0x8048E690 end:0x8048E694
.data start:0x804E2098 end:0x804E2108
.sbss start:0x805091F8 end:0x80509200
.sdata2 start:0x8050E058 end:0x8050E060
revolution/hbm/lyt_resourceAccessor.cpp:
revolution/homebuttonLib/nw4hbm/lyt_resourceAccessor.cpp:
.text start:0x80373830 end:0x80373890
.data start:0x804E2108 end:0x804E2120
revolution/hbm/lyt_textBox.cpp:
revolution/homebuttonLib/nw4hbm/lyt_textBox.cpp:
.text start:0x80373890 end:0x80374C90
.ctors start:0x8048E694 end:0x8048E698
.data start:0x804E2120 end:0x804E2198
@@ -2517,66 +2517,66 @@ revolution/hbm/lyt_textBox.cpp:
.sbss start:0x80509200 end:0x80509208
.sdata2 start:0x8050E060 end:0x8050E078
revolution/hbm/lyt_window.cpp:
revolution/homebuttonLib/nw4hbm/lyt_window.cpp:
.text start:0x80374C90 end:0x80377210
.ctors start:0x8048E698 end:0x8048E69C
.data start:0x804E2198 end:0x804E2250
.sbss start:0x80509208 end:0x80509214
.sdata2 start:0x8050E078 end:0x8050E090
revolution/hbm/math_triangular.cpp:
revolution/homebuttonLib/nw4hbm/math_triangular.cpp:
.text start:0x80377210 end:0x803774C0
.data start:0x804E2250 end:0x804E3368
.sdata2 start:0x8050E090 end:0x8050E0B0
revolution/hbm/snd_SoundArchivePlayer.cpp:
revolution/homebuttonLib/nw4hbm/snd_SoundArchivePlayer.cpp:
.text start:0x803774C0 end:0x803774D0
revolution/hbm/snd_SoundHandle.cpp:
revolution/homebuttonLib/nw4hbm/snd_SoundHandle.cpp:
.text start:0x803774D0 end:0x80377520
revolution/hbm/snd_SoundPlayer.cpp:
revolution/homebuttonLib/nw4hbm/snd_SoundPlayer.cpp:
.text start:0x80377520 end:0x803775A0
revolution/hbm/snd_SoundStartable.cpp:
revolution/homebuttonLib/nw4hbm/snd_SoundStartable.cpp:
.text start:0x803775A0 end:0x80377610
revolution/hbm/ut_binaryFileFormat.cpp:
revolution/homebuttonLib/nw4hbm/ut_binaryFileFormat.cpp:
.text start:0x80377610 end:0x80377690
revolution/hbm/ut_CharStrmReader.cpp:
revolution/homebuttonLib/nw4hbm/ut_CharStrmReader.cpp:
.text start:0x80377690 end:0x803777B0
revolution/hbm/ut_CharWriter.cpp:
revolution/homebuttonLib/nw4hbm/ut_CharWriter.cpp:
.text start:0x803777B0 end:0x80379120
.sbss start:0x80509214 end:0x80509218
.sdata2 start:0x8050E0B0 end:0x8050E0D0
.bss start:0x8057F068 end:0x8057F078
revolution/hbm/ut_Font.cpp:
revolution/homebuttonLib/nw4hbm/ut_Font.cpp:
.text start:0x80379120 end:0x803791D0
.data start:0x804E3368 end:0x804E3398
revolution/hbm/ut_LinkList.cpp:
revolution/homebuttonLib/nw4hbm/ut_LinkList.cpp:
.text start:0x803791D0 end:0x803792E0
revolution/hbm/ut_list.cpp:
revolution/homebuttonLib/nw4hbm/ut_list.cpp:
.text start:0x803792E0 end:0x80379450
revolution/hbm/ut_ResFont.cpp:
revolution/homebuttonLib/nw4hbm/ut_ResFont.cpp:
.text start:0x80379450 end:0x80379750
.data start:0x804E3398 end:0x804E33F0
revolution/hbm/ut_ResFontBase.cpp:
revolution/homebuttonLib/nw4hbm/ut_ResFontBase.cpp:
.text start:0x80379750 end:0x80379DA0
.data start:0x804E33F0 end:0x804E34B0
revolution/hbm/ut_TagProcessorBase.cpp:
revolution/homebuttonLib/nw4hbm/ut_TagProcessorBase.cpp:
.text start:0x80379DA0 end:0x8037A560
.data start:0x804E34B0 end:0x804E34D8
.sdata2 start:0x8050E0D0 end:0x8050E0D8
revolution/hbm/ut_TextWriterBase.cpp:
revolution/homebuttonLib/nw4hbm/ut_TextWriterBase.cpp:
.text start:0x8037A560 end:0x8037BAF0
.ctors start:0x8048E69C end:0x8048E6A0
.sbss start:0x80509218 end:0x80509228
@@ -3636,7 +3636,7 @@ revolution/sc/scsystem.c:
.rodata start:0x804AE070 end:0x804AE0C8
.data start:0x804FC0D8 end:0x804FC2D0
.sdata start:0x80508608 end:0x80508718
.sbss start:0x8050995C end:0x80509974
.sbss start:0x8050995C end:0x80509970
.bss start:0x8059DB80 end:0x805A5D20
revolution/sc/scapi.c:
@@ -3663,7 +3663,7 @@ revolution/esp/esp.c:
revolution/ipc/ipcMain.c:
.text start:0x804264A0 end:0x80426590
.sbss start:0x80509974 end:0x80509988
.sbss start:0x80509970 end:0x80509988
revolution/ipc/ipcclt.c:
.text start:0x80426590 end:0x80427FF0
+6 -6
View File
@@ -22112,7 +22112,7 @@ __FilterSizeTable = .data:0x804F9F80; // type:object size:0xE0 scope:global hash
@3935 = .data:0x804FA238; // type:object size:0x17 scope:local data:string hash:0x0C9F56A9
@2807 = .data:0x804FA260; // type:object size:0x47 scope:local data:string hash:0x0CA0F7A8
...data.0 = .data:0x804FA260; // type:label scope:local
s_currentDir = .data:0x804FA2C0; // type:object size:0x40 scope:global hash:0xAD8D041F
s_currentDir = .data:0x804FA2C0; // type:object size:0x40 scope:global align:32 hash:0xAD8D041F
s_shutdownFuncInfo = .data:0x804FA300; // type:object size:0x10 scope:global hash:0x31593411
@3814 = .data:0x804FA310; // type:object size:0x9 scope:local data:string hash:0x0C9F5B2B
@3818 = .data:0x804FA31C; // type:object size:0xA scope:local data:string hash:0x0C9F5B27
@@ -26048,7 +26048,7 @@ ItemIDOffsetTblOffset = .sbss:0x80509968; // type:object size:0x4 scope:global d
IsDevKit = .sbss:0x8050996C; // type:object size:0x1 scope:local data:byte hash:0x4316083E
lbl_8050996D = .sbss:0x8050996D; // type:object size:0x1 data:byte hash:0x6C951F5B
Initialized = .sbss:0x8050996E; // type:object size:0x1 scope:local data:byte hash:0x99FD6509
lbl_80509970 = .sbss:0x80509970; // type:object size:0x1 data:byte hash:0x99FD6509
Initialized = .sbss:0x80509970; // type:object size:0x1 scope:local data:byte hash:0x99FD6509
IPCCurrentBufferLo = .sbss:0x80509974; // type:object size:0x4 scope:global data:4byte hash:0xF2DFCBD5
IPCCurrentBufferHi = .sbss:0x80509978; // type:object size:0x4 scope:global data:4byte hash:0xF2DFCC57
IPCBufferLo = .sbss:0x8050997C; // type:object size:0x4 scope:global data:4byte hash:0xC4DB7D9C
@@ -31196,7 +31196,7 @@ statusRegister = .bss:0x8059D7A0; // type:object size:0x20 scope:global data:4by
controlRegister = .bss:0x8059D7C0; // type:object size:0x20 scope:global data:4byte hash:0xDB2D0FCB
sRootList = .bss:0x8059D7E0; // type:object size:0xC scope:global hash:0xF7269392
sRootMutex = .bss:0x8059D7F0; // type:object size:0x18 scope:global hash:0xDBE30C41
s_homeDir = .bss:0x8059D820; // type:object size:0x40 scope:global hash:0x784C1999
s_homeDir = .bss:0x8059D820; // type:object size:0x40 scope:global align:32 hash:0x784C1999
s_message = .bss:0x8059D880; // type:object size:0x100 scope:global hash:0xD144DA22
...bss.0 = .bss:0x8059D880; // type:label scope:local
@LOCAL@asyncRoutine__FlPv@s_rBuf = .bss:0x8059D980; // type:object size:0x100 scope:local hash:0x4463FC93 dhash:0x98BE39E5
@@ -31219,9 +31219,9 @@ Origin = .bss:0x805A9960; // type:object size:0x30 scope:global hash:0xABFD7E11
...bss.0 = .bss:0x805A9960; // type:label scope:local
Type = .bss:0x805A9990; // type:object size:0x10 scope:local data:4byte hash:0x7C88247D
CmdProbeDevice = .bss:0x805A99A0; // type:object size:0x10 scope:global data:4byte hash:0x37D18A3D
@LOCAL@SPEC2_MakeStatus__FlP9PADStatusPUl@pre_status@0 = .bss:0x805A99B0; // type:object size:0x30 scope:local hash:0xE44225C1 dhash:0x3BE688B3
@LOCAL@PADRead__FP9PADStatus@pre_status@1 = .bss:0x805A99E0; // type:object size:0x30 scope:local data:2byte hash:0x44A5529C dhash:0x557AE609
_wpadManageAlarm = .bss:0x805A9A20; // type:object size:0x30 scope:global hash:0x1F60ECAA
@LOCAL@SPEC2_MakeStatus__FlP9PADStatusPUl@pre_status = .bss:0x805A99B0; // type:object size:0x30 scope:local hash:0xE44225C1 dhash:0x3BE688B3
@LOCAL@PADRead__FP9PADStatus@pre_status = .bss:0x805A99E0; // type:object size:0x30 scope:local data:2byte hash:0x44A5529C dhash:0x557AE609
_wpadManageAlarm = .bss:0x805A9A20; // type:object size:0x30 scope:global align:32 hash:0x1F60ECAA
...bss.0 = .bss:0x805A9A20; // type:label scope:local
__rvl_p_wpadcb = .bss:0x805A9A50; // type:object size:0x10 scope:global data:4byte hash:0xA5CEDF5E
__wpadManageHandlerStack = .bss:0x805A9A60; // type:object size:0x1000 scope:global hash:0x7340F270
+2 -2
View File
@@ -63884,7 +63884,7 @@ __RTTI__9JORServer = .sdata:0x8074BC78; // type:object size:0x8 scope:global has
@STRING@Element_toNode__Q27JGadget40TLinkList<24JOREventCallbackListNode,-4>FP24JOREventCallbackListNode@0 = .sdata:0x8074BC98; // type:object size:0x5 scope:local data:string hash:0xA2419FA3 dhash:0x580336D2
@STRING@removeEventCallbackListNode__9JORServerFP24JOREventCallbackListNode@2 = .sdata:0x8074BCA0; // type:object size:0x5 scope:local data:string hash:0xA51686A8 dhash:0x89BBD614
@STRING@removeEventCallbackListNode__9JORServerFP24JOREventCallbackListNode@0 = .sdata:0x8074BCA8; // type:object size:0x5 scope:local data:string hash:0xA51686AA dhash:0x89BBD614
@10568 = .sdata:0x8074BCB0; // type:object size:0x2 scope:local hash:0xA0621CFF
@10568 = .sdata:0x8074BCB0; // type:object size:0x1 scope:local data:string hash:0xA0621CFF
@10885 = .sdata:0x8074BCB8; // type:object size:0x8 scope:local data:string hash:0xA06241B1
__RTTI__7JORFile = .sdata:0x8074BCC0; // type:object size:0x8 scope:global hash:0x956E1AD8 dhash:0x64FE5F8F
__RTTI__24JORHostInfo_CalendarTime = .sdata:0x8074BCC8; // type:object size:0x8 scope:global hash:0x2BC918B9 dhash:0xFAACAA1F
@@ -65241,7 +65241,7 @@ ItemIDOffsetTblOffset = .sbss:0x8074D5F8; // type:object size:0x4 scope:global d
IsDevKit = .sbss:0x8074D5FC; // type:object size:0x1 scope:local data:byte hash:0x4316083E
lbl_8074D5FD = .sbss:0x8074D5FD; // type:object size:0x1 data:byte hash:0x6C951F5B
Initialized = .sbss:0x8074D5FE; // type:object size:0x1 scope:local data:byte hash:0x99FD6509
lbl_8074D600 = .sbss:0x8074D600; // type:object size:0x1 data:byte hash:0x99FD6509
Initialized = .sbss:0x8074D600; // type:object size:0x1 scope:local data:byte hash:0x99FD6509
IPCCurrentBufferLo = .sbss:0x8074D604; // type:object size:0x4 scope:global data:4byte hash:0xF2DFCBD5
IPCCurrentBufferHi = .sbss:0x8074D608; // type:object size:0x4 scope:global data:4byte hash:0xF2DFCC57
IPCBufferLo = .sbss:0x8074D60C; // type:object size:0x4 scope:global data:4byte hash:0xC4DB7D9C
+43 -7
View File
@@ -1764,6 +1764,30 @@ config.libs = [
Object(NonMatching, "revolution/ai/ai.c"),
],
),
RevolutionLib(
"ax",
[
Object(Matching, "revolution/ax/AXAux.c"),
Object(Matching, "revolution/ax/AXCL.c"),
],
),
RevolutionLib(
"axfx",
[
Object(Matching, "revolution/axfx/AXFXHooks.c"),
Object(Matching, "revolution/axfx/AXFXReverbHi.c"),
Object(Matching, "revolution/axfx/AXFXReverbHiExp.c"),
],
),
RevolutionLib(
"axfx",
[
Object(Matching, "revolution/mem/mem_heapCommon.c"),
Object(Matching, "revolution/mem/mem_expHeap.c"),
Object(Matching, "revolution/mem/mem_allocator.c"),
Object(Matching, "revolution/mem/mem_list.c"),
],
),
RevolutionLib(
"dsp",
[
@@ -1822,6 +1846,12 @@ config.libs = [
Object(NonMatching, "revolution/wenc/wenc.c"),
],
),
RevolutionLib(
"arc",
[
Object(Matching, "revolution/arc/arc.c"),
],
),
RevolutionLib(
"esp",
[
@@ -1831,10 +1861,10 @@ config.libs = [
RevolutionLib(
"ipc",
[
Object(NonMatching, "revolution/ipc/ipcMain.c"),
Object(NonMatching, "revolution/ipc/ipcclt.c"),
Object(NonMatching, "revolution/ipc/memory.c"),
Object(NonMatching, "revolution/ipc/ipcProfile.c"),
Object(Matching, "revolution/ipc/ipcMain.c"),
Object(MatchingFor(ALL_WII, ALL_DEMO, "Shield"), "revolution/ipc/ipcclt.c"), # strnlen issue in ShieldD
Object(Matching, "revolution/ipc/memory.c"),
Object(Matching, "revolution/ipc/ipcProfile.c"),
],
),
RevolutionLib(
@@ -1846,8 +1876,8 @@ config.libs = [
RevolutionLib(
"pad",
[
Object(NonMatching, "revolution/pad/Padclamp.c"),
Object(NonMatching, "revolution/pad/Pad.c"),
Object(MatchingFor("ShieldD"), "revolution/pad/Padclamp.c"), # sqrtf issue on retail versions
Object(Matching, "revolution/pad/Pad.c"),
],
),
RevolutionLib(
@@ -1886,6 +1916,12 @@ config.libs = [
Object(Matching, "revolution/usb/usb.c"),
],
),
RevolutionLib(
"tpl",
[
Object(Matching, "revolution/tpl/TPL.c"),
],
),
RevolutionLib(
"gd",
[
@@ -1928,7 +1964,7 @@ config.libs = [
Object(NonMatching, "revolution/homebuttonLib/nw4hbm/ut/ut_ResFont.cpp"),
Object(NonMatching, "revolution/homebuttonLib/nw4hbm/ut/ut_ResFontBase.cpp"),
Object(NonMatching, "revolution/homebuttonLib/nw4hbm/ut/ut_TagProcessorBase.cpp"),
Object(NonMatching, "revolution/homebuttonLib/nw4hbm/ut/ut_TextWriterBase.cpp"),
Object(MatchingFor("RZDE01_02", "RZDP01", "RZDJ01"), "revolution/homebuttonLib/nw4hbm/ut/ut_TextWriterBase.cpp"), # RZDE01_00 func order
Object(NonMatching, "revolution/homebuttonLib/HBMBase.cpp"),
Object(NonMatching, "revolution/homebuttonLib/HBMAnmController.cpp"),
+47 -49
View File
@@ -1,5 +1,5 @@
#ifndef _REVOLUTION_ARC_H_
#define _REVOLUTION_ARC_H_
#ifndef ARC_H
#define ARC_H
#include <revolution/types.h>
@@ -7,61 +7,59 @@
extern "C" {
#endif
#define ARC_ENTRY_NUM_INVALID (-1)
typedef struct {
unsigned int magic;
int fstStart;
int fstSize;
int fileStart;
int pad[4];
} ARCHeader;
typedef struct {
unsigned int magic;
int fstStart;
int fstSize;
int fileStart;
int pad[4];
} ARCHeader;
typedef struct {
void* archiveStartAddr; // 0x0
void* FSTStart; // 0x4
void* fileStart; // 0x8
u32 entryNum; // 0xC
char* FSTStringStart; // 0x10
u32 FSTLength; // 0x14
u32 currDir; // 0x18
} ARCHandle;
typedef struct {
void* archiveStartAddr; // 0x0
void* FSTStart; // 0x4
void* fileStart; // 0x8
u32 entryNum; // 0xC
char* FSTStringStart; // 0x10
u32 FSTLength; // 0x14
u32 currDir; // 0x18
} ARCHandle;
typedef struct {
ARCHandle* handle;
u32 startOffset;
u32 length;
} ARCFileInfo;
typedef struct {
ARCHandle* handle;
u32 startOffset;
u32 length;
} ARCFileInfo;
typedef struct {
ARCHandle* handle;
u32 entryNum;
u32 location;
u32 next;
} ARCDir;
typedef struct {
ARCHandle* handle;
u32 entryNum;
u32 location;
u32 next;
} ARCDir;
typedef struct {
ARCHandle* handle;
u32 entryNum;
BOOL isDir;
char* name;
} ARCDirEntry;
typedef struct {
ARCHandle* handle;
u32 entryNum;
BOOL isDir;
char* name;
} ARCDirEntry;
BOOL ARCInitHandle(void *, ARCHandle *);
BOOL ARCFastOpen(ARCHandle *, s32, ARCFileInfo *);
s32 ARCConvertPathToEntrynum(ARCHandle *, const char *);
void* ARCGetStartAddrInMem(ARCFileInfo *);
u32 ARCGetLength(ARCFileInfo *);
BOOL ARCClose(ARCFileInfo *);
BOOL ARCChangeDir(ARCHandle *, const char *);
BOOL ARCGetCurrentDir(ARCHandle *, char *, u32);
BOOL ARCInitHandle(void*, ARCHandle*);
BOOL ARCFastOpen(ARCHandle*, s32, ARCFileInfo*);
s32 ARCConvertPathToEntrynum(ARCHandle*, const char*);
void* ARCGetStartAddrInMem(ARCFileInfo*);
u32 ARCGetLength(ARCFileInfo*);
BOOL ARCClose(ARCFileInfo*);
BOOL ARCChangeDir(ARCHandle*, const char*);
BOOL ARCGetCurrentDir(ARCHandle*, char*, u32);
BOOL ARCOpenDir(ARCHandle*, const char*, ARCDir*);
BOOL ARCReadDir(ARCDir*, ARCDirEntry*);
BOOL ARCCloseDir(ARCDir*);
BOOL ARCOpenDir(ARCHandle *, const char *, ARCDir *);
BOOL ARCReadDir(ARCDir *, ARCDirEntry *);
BOOL ARCCloseDir(ARCDir *);
#ifdef __cplusplus
}
#endif
#endif // _REVOLUTION_ARC_H_
#endif // ARC_H
+10
View File
@@ -362,6 +362,16 @@ void AXSetVoiceLpf(AXVPB* p, AXPBLPF* lpf);
void AXSetVoiceLpfCoefs(AXVPB* p, u16 a0, u16 b0);
void AXGetLpfCoefs(u16 freq, u16* a0, u16* b0);
void AXGetAuxACallback(AXAuxCallback* cbOut, void** contextOut);
u16 AXGetAuxAReturnVolume(void);
u16 AXGetAuxBReturnVolume(void);
u16 AXGetAuxCReturnVolume(void);
void AXSetAuxAReturnVolume(u16 volume);
void AXSetAuxBReturnVolume(u16 volume);
void AXSetAuxCReturnVolume(u16 volume);
void AXSetMasterVolume(u16 volume);
u16 AXGetMasterVolume(void);
// DSPCode
extern u16 axDspSlaveLength;
extern u16 axDspSlave[AX_DSP_SLAVE_LENGTH];
+78 -183
View File
@@ -1,214 +1,109 @@
#ifndef _REVOLUTION_AXFX_H_
#define _REVOLUTION_AXFX_H_
#ifndef AXFX_H
#define AXFX_H
#include <revolution/types.h>
#include <revolution/ax.h>
#include <revolution.h>
#include <cstdio>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct AXFX_REVSTD_DELAYLINE {
/* 0x00 */ s32 inPoint;
/* 0x04 */ s32 outPoint;
/* 0x08 */ s32 length;
/* 0x0C */ f32* inputs;
/* 0x10 */ f32 lastOutput;
} AXFX_REVSTD_DELAYLINE;
typedef struct AXFX_BUS {
s32* left;
s32* right;
s32* surround;
typedef struct AXFX_REVSTD_WORK {
/* 0x000 */ AXFX_REVSTD_DELAYLINE AP[6];
/* 0x078 */ AXFX_REVSTD_DELAYLINE C[6];
/* 0x0F0 */ f32 allPassCoeff;
/* 0x0F4 */ f32 combCoef[6];
/* 0x10C */ f32 lpLastout[3];
/* 0x118 */ f32 level;
/* 0x11C */ f32 damping;
/* 0x120 */ s32 preDelayTime;
/* 0x124 */ f32* preDelayLine[3];
/* 0x130 */ f32* preDelayPtr[3];
} AXFX_REVSTD_WORK;
typedef struct AXFX_REVERBSTD {
/* 0x000 */ AXFX_REVSTD_WORK rv;
/* 0x13C */ u8 tempDisableFX;
/* 0x140 */ f32 coloration;
/* 0x144 */ f32 mix;
/* 0x148 */ f32 time;
/* 0x14C */ f32 damping;
/* 0x150 */ f32 preDelay;
} AXFX_REVERBSTD;
} AXFX_BUS;
typedef struct AXFX_BUFFERUPDATE {
/* 0x00 */ s32* left;
/* 0x04 */ s32* right;
/* 0x08 */ s32* surround;
s32* left;
s32* right;
s32* surround;
} AXFX_BUFFERUPDATE;
typedef struct AXFX_BUFFERUPDATE_DPL2 {
/* 0x00 */ s32* L;
/* 0x04 */ s32* R;
/* 0x08 */ s32* Ls;
/* 0x0C */ s32* Rs;
} AXFX_BUFFERUPDATE_DPL2;
typedef struct AXFX_REVERBHI_EXP {
f32* earlyLine[3]; // at 0x0
u32 earlyPos[3]; // at 0xC
u32 earlyLength; // at 0x18
u32 earlyMaxLength; // at 0x1C
f32 earlyCoef[3]; // at 0x20
// REVHI Structs
f32* preDelayLine[3]; // at 0x2C
u32 preDelayPos; // at 0x38
u32 preDelayLength; // at 0x3C
u32 preDelayMaxLength; // at 0x40
typedef struct AXFX_REVHI_DELAYLINE {
/* 0x00 */ s32 inPoint;
/* 0x04 */ s32 outPoint;
/* 0x08 */ s32 length;
/* 0x0C */ f32* inputs;
/* 0x10 */ f32 lastOutput;
} AXFX_REVHI_DELAYLINE;
f32* combLine[3][3]; // at 0x44
u32 combPos[3]; // at 0x68
u32 combLength[3]; // at 0x74
u32 combMaxLength[3]; // at 0x80
f32 combCoef[3]; // at 0x8C
typedef struct AXFX_REVHI_WORK {
/* 0x000 */ AXFX_REVHI_DELAYLINE AP[9];
/* 0x0B4 */ AXFX_REVHI_DELAYLINE C[9];
/* 0x168 */ f32 allPassCoeff;
/* 0x16C */ f32 combCoef[9];
/* 0x190 */ f32 lpLastout[3];
/* 0x19C */ f32 level;
/* 0x1A0 */ f32 damping;
/* 0x1A4 */ s32 preDelayTime;
/* 0x1A8 */ f32 crosstalk;
/* 0x1AC */ f32* preDelayLine[3];
/* 0x1B8 */ f32* preDelayPtr[3];
} AXFX_REVHI_WORK;
f32* allpassLine[3][2]; // at 0x98
u32 allpassPos[2]; // at 0xB0
u32 allpassLength[2]; // at 0xB8
u32 allpassMaxLength[2]; // at 0xC0
typedef struct AXFX_REVHI_WORK_DPL2 {
/* 0x000 */ AXFX_REVHI_DELAYLINE AP[12];
/* 0x0F0 */ AXFX_REVHI_DELAYLINE C[12];
/* 0x1E0 */ f32 allPassCoeff;
/* 0x1E4 */ f32 combCoef[12];
/* 0x214 */ f32 lpLastout[4];
/* 0x224 */ f32 level;
/* 0x228 */ f32 damping;
/* 0x22C */ s32 preDelayTime;
/* 0x230 */ f32 crosstalk;
/* 0x234 */ f32* preDelayLine[4];
/* 0x244 */ f32* preDelayPtr[4];
} AXFX_REVHI_WORK_DPL2;
f32* lastAllpassLine[3]; // at 0xC8
u32 lastAllpassPos[3]; // at 0xD4
u32 lastAllpassLength[3]; // at 0xE0
u32 lastAllpassMaxLength[3]; // at 0xEC
f32 allpassCoef; // at 0xF8
f32 lastLpfOut[3]; // at 0xFC
f32 lpfCoef; // at 0x108
u32 active; // at 0x10C
u32 earlyMode; // at 0x110
f32 preDelayTimeMax; // at 0x114
f32 preDelayTime; // at 0x118
u32 fusedMode; // at 0x11C
f32 fusedTime; // at 0x120
f32 coloration; // at 0x124
f32 damping; // at 0x128
f32 crosstalk; // at 0x12C
f32 earlyGain; // at 0x130
f32 fusedGain; // at 0x134
AXFX_BUS* busIn; // at 0x138
AXFX_BUS* busOut; // at 0x13C
f32 outGain; // at 0x140
f32 sendGain; // at 0x144
} AXFX_REVERBHI_EXP;
typedef struct AXFX_REVERBHI {
/* 0x000 */ AXFX_REVHI_WORK rv;
/* 0x1C4 */ u8 tempDisableFX;
/* 0x1C8 */ f32 coloration;
/* 0x1CC */ f32 mix;
/* 0x1D0 */ f32 time;
/* 0x1D4 */ f32 damping;
/* 0x1D8 */ f32 preDelay;
/* 0x1DC */ f32 crosstalk;
AXFX_REVERBHI_EXP exp; // at 0x0
f32 coloration; // at 0x148
f32 mix; // at 0x14C
f32 time; // at 0x150
f32 damping; // at 0x154
f32 preDelay; // at 0x158
f32 crosstalk; // at 0x15C
} AXFX_REVERBHI;
typedef struct AXFX_REVERBHI_DPL2 {
/* 0x000 */ AXFX_REVHI_WORK_DPL2 rv;
/* 0x254 */ u8 tempDisableFX;
/* 0x258 */ f32 coloration;
/* 0x25C */ f32 mix;
/* 0x260 */ f32 time;
/* 0x264 */ f32 damping;
/* 0x268 */ f32 preDelay;
} AXFX_REVERBHI_DPL2;
typedef void* (*AXFXAllocHook)(size_t size);
typedef void (*AXFXFreeHook)(void* block);
typedef struct AXFX_DELAY {
/* 0x00 */ u32 currentSize[3];
/* 0x0C */ u32 currentPos[3];
/* 0x18 */ u32 currentFeedback[3];
/* 0x24 */ u32 currentOutput[3];
/* 0x30 */ s32* left;
/* 0x34 */ s32* right;
/* 0x38 */ s32* sur;
/* 0x3C */ u32 delay[3];
/* 0x48 */ u32 feedback[3];
/* 0x54 */ u32 output[3];
} AXFX_DELAY;
extern AXFXAllocHook __AXFXAlloc;
extern AXFXFreeHook __AXFXFree;
typedef struct AXFX_CHORUS_SRCINFO {
/* 0x00 */ s32* dest;
/* 0x04 */ s32* smpBase;
/* 0x08 */ s32* old;
/* 0x0C */ u32 posLo;
/* 0x10 */ u32 posHi;
/* 0x14 */ u32 pitchLo;
/* 0x18 */ u32 pitchHi;
/* 0x1C */ u32 trigger;
/* 0x20 */ u32 target;
} AXFX_CHORUS_SRCINFO;
void AXFXSetHooks(AXFXAllocHook alloc, AXFXFreeHook free);
void AXFXGetHooks(AXFXAllocHook* alloc, AXFXFreeHook* free);
typedef struct AXFX_CHORUS_WORK {
/* 0x00 */ s32* lastLeft[3];
/* 0x0C */ s32* lastRight[3];
/* 0x18 */ s32* lastSur[3];
/* 0x24 */ u8 currentLast;
/* 0x28 */ s32 oldLeft[4];
/* 0x38 */ s32 oldRight[4];
/* 0x48 */ s32 oldSur[4];
/* 0x58 */ u32 currentPosLo;
/* 0x5C */ u32 currentPosHi;
/* 0x60 */ s32 pitchOffset;
/* 0x64 */ u32 pitchOffsetPeriodCount;
/* 0x68 */ u32 pitchOffsetPeriod;
/* 0x6C */ AXFX_CHORUS_SRCINFO src;
} AXFX_CHORUS_WORK;
BOOL AXFXReverbHiInit(AXFX_REVERBHI* fx);
BOOL AXFXReverbHiShutdown(AXFX_REVERBHI* fx);
void AXFXReverbHiCallback(void* update, void* fx);
typedef struct AXFX_CHORUS {
/* 0x00 */ AXFX_CHORUS_WORK work;
/* 0x90 */ u32 baseDelay;
/* 0x94 */ u32 variation;
/* 0x98 */ u32 period;
} AXFX_CHORUS;
BOOL AXFXReverbHiExpInit(AXFX_REVERBHI_EXP* fx);
void AXFXReverbHiExpShutdown(AXFX_REVERBHI_EXP* fx);
void AXFXReverbHiExpCallback(AXFX_BUFFERUPDATE* update, AXFX_REVERBHI_EXP* fx);
typedef void* (*AXFXAllocFunc)(u32);
typedef void (*AXFXFreeFunc)(void*);
// chorus
int AXFXChorusInit(AXFX_CHORUS* c);
int AXFXChorusShutdown(AXFX_CHORUS* c);
int AXFXChorusSettings(AXFX_CHORUS* c);
void AXFXChorusCallback(AXFX_BUFFERUPDATE* bufferUpdate, AXFX_CHORUS* chorus);
// delay
void AXFXDelayCallback(AXFX_BUFFERUPDATE* bufferUpdate, AXFX_DELAY* delay);
int AXFXDelaySettings(AXFX_DELAY* delay);
int AXFXDelayInit(AXFX_DELAY* delay);
int AXFXDelayShutdown(AXFX_DELAY* delay);
// reverb_hi
void DoCrossTalk(s32* l, s32* r, f32 cross, f32 invcross);
int AXFXReverbHiInit(AXFX_REVERBHI* rev);
int AXFXReverbHiShutdown(AXFX_REVERBHI* rev);
int AXFXReverbHiSettings(AXFX_REVERBHI* rev);
// reverb_hi_4ch
int AXFXReverbHiInitDpl2(AXFX_REVERBHI_DPL2* reverb);
int AXFXReverbHiShutdownDpl2(AXFX_REVERBHI_DPL2* reverb);
int AXFXReverbHiSettingsDpl2(AXFX_REVERBHI_DPL2* rev);
void AXFXReverbHiCallbackDpl2(AXFX_BUFFERUPDATE_DPL2* bufferUpdate, AXFX_REVERBHI_DPL2* reverb);
// reverb_std
int AXFXReverbStdInit(AXFX_REVERBSTD* rev);
int AXFXReverbStdShutdown(AXFX_REVERBSTD* rev);
int AXFXReverbStdSettings(AXFX_REVERBSTD* rev);
void AXFXReverbStdCallback(AXFX_BUFFERUPDATE* bufferUpdate, AXFX_REVERBSTD* reverb);
void AXFXReverbHiCallback(void *data, void *context);
void AXGetAuxACallback(AXAuxCallback* cbOut, void** contextOut);
void AXFXSetHooks(AXFXAllocFunc alloc, AXFXFreeFunc free);
void AXFXGetHooks(AXFXAllocFunc* allocOut, AXFXFreeFunc* freeOut);
void AXFXSetHooks(AXFXAllocHook alloc, AXFXFreeHook free);
void AXFXGetHooks(AXFXAllocHook* allocOut, AXFXFreeHook* freeOut);
BOOL AXFXReverbHiInit(AXFX_REVERBHI* reverbHi);
BOOL AXFXReverbHiShutdown(AXFX_REVERBHI* reverbHi);
u16 AXGetAuxAReturnVolume(void);
u16 AXGetAuxBReturnVolume(void);
u16 AXGetAuxCReturnVolume(void);
void AXSetAuxAReturnVolume(u16 volume);
void AXSetAuxBReturnVolume(u16 volume);
void AXSetAuxCReturnVolume(u16 volume);
void AXSetMasterVolume(u16 volume);
u16 AXGetMasterVolume(void);
#ifdef __cplusplus
}
#endif
#endif // _REVOLUTION_AXFX_H_
#endif // AXFX_H
+2
View File
@@ -10,7 +10,9 @@ extern "C" {
#endif
void IPCInit(void);
#if SDK_AUG2010
void IPCReInit(void);
#endif
u32 IPCReadReg(u32 regIdx);
void IPCWriteReg(u32 regIdx, u32 data);
void* IPCGetBufferHi(void);
+2
View File
@@ -12,7 +12,9 @@ extern "C" {
typedef IOSError (*IOSIpcCb)(IOSError, void*);
IOSError IPCCltInit(void);
#if SDK_AUG2010
IOSError IPCCltReInit(void);
#endif
IOSError IOS_OpenAsync(const char* pPath, u32 flags, IOSIpcCb cb, void* callback_arg);
IOSError IOS_Open(const char* path, u32 flags);
+26 -1
View File
@@ -9,7 +9,7 @@ extern "C" {
typedef struct MEMiExpHeapMBlockHead MEMiExpHeapMBlockHead;
struct MEMiExPheapMBlockHead {
struct MEMiExpHeapMBlockHead {
u16 signature;
union {
@@ -27,6 +27,31 @@ struct MEMiExPheapMBlockHead {
MEMiExpHeapMBlockHead* next;
};
typedef struct MEMiExpMBlockList MEMiExpMBlockList;
struct MEMiExpMBlockList {
MEMiExpHeapMBlockHead* head;
MEMiExpHeapMBlockHead* tail;
};
typedef struct MEMiExpHeapHead MEMiExpHeapHead;
struct MEMiExpHeapHead {
MEMiExpMBlockList mbFreeList;
MEMiExpMBlockList mbUsedList;
u16 groupID;
union {
u16 val;
struct {
u16 _reserved : 14;
u16 useMarginOfAlign : 1;
u16 allocMode : 1;
} fields;
} feature;
};
MEMHeapHandle MEMCreateExpHeapEx(void*, u32, u16);
void* MEMDestroyExpHeap(MEMHeapHandle);
void* MEMAllocFromExpHeapEx(MEMHeapHandle, u32, int);
+53
View File
@@ -7,6 +7,7 @@ extern "C" {
#include <revolution/mem/list.h>
#include <revolution/os.h>
#include <cstring>
typedef struct MEMiHeapHead MEMiHeapHead;
@@ -36,6 +37,58 @@ static inline UIntPtr GetUIntPtr(const void* ptr) {
return (UIntPtr)(ptr);
}
static inline u32 GetOffsetFromPtr(const void* start, const void* end) {
return GetUIntPtr(end) - GetUIntPtr(start);
}
static inline void* SubU32ToPtr(void* ptr, u32 val) {
return (void*)(GetUIntPtr(ptr) - val);
}
static inline void* AddU32ToPtr(void* ptr, u32 val) {
return (void*)(GetUIntPtr(ptr) + val);
}
static inline void SetOptForHeap(MEMiHeapHead* pHeapHd, u16 optFlag) {
pHeapHd->attribute.fields.optFlag = (u8)optFlag;
}
static inline u16 GetOptForHeap(const MEMiHeapHead* pHeapHd) {
return (u16)pHeapHd->attribute.fields.optFlag;
}
static inline void FillAllocMemory(MEMiHeapHead* pHeapHd, void* address, u32 size) {
if (GetOptForHeap(pHeapHd) & 1) {
(void)memset(address, 0, size);
}
}
static inline int ComparePtr(const void* a, const void* b) {
const u8* wa = (const u8*)a;
const u8* wb = (const u8*)b;
return wa - wb;
}
static inline void LockHeap(MEMiHeapHead* pHeapHd) {
if (GetOptForHeap(pHeapHd) & 4) {
OSLockMutex(&pHeapHd->mutex);
}
}
static inline void UnlockHeap(MEMiHeapHead* pHeapHd) {
if (GetOptForHeap(pHeapHd) & 4) {
OSUnlockMutex(&pHeapHd->mutex);
}
}
void MEMiInitHeapHead(MEMiHeapHead* pHeapHd, u32 signature, void* heapStart, void* heapEnd, u16 optFlag);
void MEMiFinalizeHeap(MEMiHeapHead* pHeapHd);
void MEMiDumpHeapHead(MEMiHeapHead* pHeapHd);
#ifdef __cplusplus
}
#endif
+2 -1
View File
@@ -21,9 +21,10 @@ typedef struct {
void MEMInitList(MEMList*, u16);
void MEMAppendListObject(MEMList*, void*);
void MEMRemoveListObject(MEMList*, void*);
void* MEMGetNextListObject(MEMList*, void*);
#define MEM_INIT_LIST(list, structName, linkName) MEMInitList(list, offsetof(structName, linkName))
#ifdef __cplusplus
}
#endif
+297
View File
@@ -0,0 +1,297 @@
#include <revolution/arc.h>
#include <revolution.h>
#include <locale>
/* this is here because it won't be inlined otherwise */
inline int tolower(int c) {
return ((c < 0) || (c >= 0x100)) ? c : (int) (_current_locale.ctype_cmpt_ptr->lower_map_ptr[c]);
}
typedef struct FSTEntry FSTEntry;
struct FSTEntry {
unsigned int isDirAndStringOff;
unsigned int parentOrPosition;
unsigned int nextEntryOrLength;
};
#define entryIsDir(fstStart, i) \
( ( ( fstStart[i].isDirAndStringOff & 0xFF000000 ) == 0 )? FALSE : TRUE )
#define stringOff(fstStart, i) \
( fstStart[i].isDirAndStringOff & 0x00FFFFFF )
#define parentDir(fstStart, i) \
( fstStart[i].parentOrPosition )
#define nextDir(fstStart, i) \
( fstStart[i].nextEntryOrLength )
#define filePosition(fstStart, i) \
( fstStart[i].parentOrPosition )
#define fileLength(fstStart, i) \
( fstStart[i].nextEntryOrLength )
BOOL ARCInitHandle(void* arcStart, ARCHandle* handle) {
FSTEntry* FSTEntries;
ARCHeader* arcHeader = (ARCHeader*)arcStart;
if (arcHeader->magic != 0x55AA382D) {
#if SDK_AUG2010
OSPanic(__FILE__, 0x4A, "ARCInitHandle: bad archive format");
#else
OSPanic(__FILE__, 0x47, "ARCInitHandle: bad archive format");
#endif
}
handle->archiveStartAddr = arcStart;
handle->FSTStart = FSTEntries = (void*)((u32)arcStart + arcHeader->fstStart);
handle->fileStart = (void*)((u32)arcStart + arcHeader->fileStart);
handle->entryNum = nextDir(FSTEntries, 0);
handle->FSTStringStart = (char*)&(FSTEntries[handle->entryNum]);
handle->FSTLength = (u32)arcHeader->fstSize;
handle->currDir = 0;
return TRUE;
}
BOOL ARCFastOpen(ARCHandle* handle, s32 entrynum, ARCFileInfo* af) {
FSTEntry* FSTEntries = (FSTEntry*)handle->FSTStart;
if ((entrynum < 0) || (entrynum >= handle->entryNum) || entryIsDir(FSTEntries, entrynum)) {
return FALSE;
}
af->handle = handle;
af->startOffset = filePosition(FSTEntries, entrynum);
af->length = fileLength(FSTEntries, entrynum);
return TRUE;
}
static BOOL isSame(const char* path, const char* string) {
while(*string != '\0') {
if (tolower(*path++) != tolower(*string++)) {
return FALSE;
}
}
if ((*path == '/') || (*path == '\0')) {
return TRUE;
}
return FALSE;
}
s32 ARCConvertPathToEntrynum(ARCHandle* handle, const char* pathPtr)
{
const char* ptr;
char* stringPtr;
BOOL isDir;
s32 length;
u32 dirLookAt;
u32 i;
const char* origPathPtr = pathPtr;
FSTEntry* FSTEntries;
dirLookAt = handle->currDir;
FSTEntries = (FSTEntry*)handle->FSTStart;
while (1) {
if (*pathPtr == '\0') {
return (s32)dirLookAt;
}
else if (*pathPtr == '/') {
dirLookAt = 0;
pathPtr++;
continue;
}
else if (*pathPtr == '.') {
if (*(pathPtr + 1) == '.') {
if (*(pathPtr + 2) == '/') {
dirLookAt = parentDir(FSTEntries, dirLookAt);
pathPtr += 3;
continue;
}
else if (*(pathPtr + 2) == '\0') {
return (s32)parentDir(FSTEntries, dirLookAt);
}
}
else if (*(pathPtr + 1) == '/') {
pathPtr += 2;
continue;
}
else if (*(pathPtr + 1) == '\0') {
return (s32)dirLookAt;
}
}
for(ptr = pathPtr; (*ptr != '\0') && (*ptr != '/'); ptr++);
isDir = (*ptr == '\0')? FALSE : TRUE;
length = (s32)(ptr - pathPtr);
ptr = pathPtr;
for(i = dirLookAt + 1; i < nextDir(FSTEntries, dirLookAt);
i = entryIsDir(FSTEntries, i)? nextDir(FSTEntries, i): (i+1) )
{
dot:
if ((entryIsDir(FSTEntries, i) == FALSE) && (isDir == TRUE)) {
continue;
}
stringPtr = handle->FSTStringStart + stringOff(FSTEntries, i);
if (*stringPtr == '.' && *(stringPtr + 1) == '\0') {
i++;
goto dot;
}
if (isSame(ptr, stringPtr) == TRUE) {
goto next_hier;
}
}
return -1;
next_hier:
if (!isDir) {
return (s32)i;
}
dirLookAt = i;
pathPtr += length + 1;
}
// the world ends if this is reached
}
static u32 myStrncpy(char* dest, char* src, u32 maxlen) {
u32 i = maxlen;
while ((i > 0) && (*src != 0)) {
*dest++ = *src++;
i--;
}
return (maxlen - i);
}
static u32 entryToPath(ARCHandle* handle, u32 entry, char* path, u32 maxlen) {
char* name;
u32 loc;
FSTEntry* FSTEntries = (FSTEntry*)handle->FSTStart;
if (entry == 0) {
return 0;
}
name = handle->FSTStringStart + stringOff(FSTEntries, entry);
loc = entryToPath(handle, parentDir(FSTEntries, entry), path, maxlen);
if (loc == maxlen) {
return loc;
}
*(path + loc++) = '/';
loc += myStrncpy(path + loc, name, maxlen - loc);
return loc;
}
static BOOL ARCConvertEntrynumToPath(ARCHandle* handle, s32 entrynum, char* path, u32 maxlen) {
u32 loc;
FSTEntry* FSTEntries = (FSTEntry*)handle->FSTStart;
loc = entryToPath(handle, (u32)entrynum, path, maxlen);
if (loc == maxlen) {
path[maxlen - 1] = '\0';
return FALSE;
}
if (entryIsDir(FSTEntries, entrynum)) {
if (loc == maxlen - 1) {
path[loc] = '\0';
return FALSE;
}
path[loc++] = '/';
}
path[loc] = '\0';
return TRUE;
}
static BOOL ARCGetCurrentDir(ARCHandle* handle, char* path, u32 maxlen) {
return ARCConvertEntrynumToPath(handle, (s32)handle->currDir, path, maxlen);
}
void* ARCGetStartAddrInMem(ARCFileInfo* af) {
ARCHandle* handle = af->handle;
return (void*)((u32)handle->archiveStartAddr + af->startOffset);
}
u32 ARCGetLength(ARCFileInfo* af) {
return af->length;
}
BOOL ARCClose(ARCFileInfo* af) {
return TRUE;
}
BOOL ARCChangeDir(ARCHandle* handle, const char* dirName) {
s32 entry;
FSTEntry* FSTEntries;
entry = ARCConvertPathToEntrynum(handle, dirName);
FSTEntries = (FSTEntry*)handle->FSTStart;
if ((entry < 0) || (entryIsDir(FSTEntries, entry) == FALSE)) {
return FALSE;
}
handle->currDir = (u32)entry;
return TRUE;
}
BOOL ARCOpenDir(ARCHandle* handle, const char* dirName, ARCDir* dir) {
s32 entry;
FSTEntry* FSTEntries;
entry = ARCConvertPathToEntrynum(handle, dirName);
FSTEntries = (FSTEntry*)handle->FSTStart;
if ((entry < 0) || (entryIsDir(FSTEntries, entry) == FALSE)) {
return FALSE;
}
dir->handle = handle;
dir->entryNum = (u32)entry;
dir->location = (u32)entry + 1;
dir->next = nextDir(FSTEntries, entry);
return TRUE;
}
BOOL ARCReadDir(ARCDir* dir, ARCDirEntry* dirent) {
u32 loc;
FSTEntry* FSTEntries;
ARCHandle* handle;
handle = dir->handle;
FSTEntries = (FSTEntry*)handle->FSTStart;
loc = dir->location;
retry:
if ((loc <= dir->entryNum) || (dir->next <= loc)) {
return FALSE;
}
dirent->handle = handle;
dirent->entryNum = loc;
dirent->isDir = entryIsDir(FSTEntries, loc);
dirent->name = handle->FSTStringStart + stringOff(FSTEntries, loc);
if (dirent->name[0] == '.' && dirent->name[1] == '\0') {
loc++;
goto retry;
}
dir->location = entryIsDir(FSTEntries, loc)? nextDir(FSTEntries, loc) : (loc+1);
return TRUE;
}
BOOL ARCCloseDir(ARCDir* dir) {
return TRUE;
}
+30
View File
@@ -0,0 +1,30 @@
#include <revolution/ax.h>
#include <revolution/os.h>
#include <cstring>
static u8 __clearAuxA[3];
static AXAuxCallback __AXCallbackAuxA;
static void* __AXContextAuxA;
void AXRegisterAuxACallback(AXAuxCallback callback, void* context) {
#if SDK_AUG2010
BOOL enabled = OSDisableInterrupts();
#endif
__AXCallbackAuxA = callback;
__AXContextAuxA = context;
#if SDK_AUG2010
if (callback == NULL) {
memset(&__clearAuxA, TRUE, 3);
}
OSRestoreInterrupts(enabled);
#endif
}
void AXGetAuxACallback(AXAuxCallback* callback, void** context) {
*callback = __AXCallbackAuxA;
*context = __AXContextAuxA;
}
+30
View File
@@ -0,0 +1,30 @@
#include <revolution/ax.h>
#include <revolution/types.h>
static u16 __AXAuxAVolume;
static u16 __AXAuxBVolume;
static u16 __AXAuxCVolume;
u16 AXGetAuxAReturnVolume(void) {
return __AXAuxAVolume;
}
u16 AXGetAuxBReturnVolume(void) {
return __AXAuxBVolume;
}
u16 AXGetAuxCReturnVolume(void) {
return __AXAuxCVolume;
}
void AXSetAuxAReturnVolume(u16 volume) {
__AXAuxAVolume = volume;
}
void AXSetAuxBReturnVolume(u16 volume) {
__AXAuxBVolume = volume;
}
void AXSetAuxCReturnVolume(u16 volume) {
__AXAuxCVolume = volume;
}
+28
View File
@@ -0,0 +1,28 @@
#include <revolution/axfx.h>
#include <revolution/os.h>
#include <revolution/os/OSAlloc.h>
#include <cstdio>
static void* __AXFXAllocFunction(size_t size);
static void __AXFXFreeFunction(void* block);
AXFXAllocHook __AXFXAlloc = __AXFXAllocFunction;
AXFXFreeHook __AXFXFree = __AXFXFreeFunction;
static void* __AXFXAllocFunction(size_t size) {
return OSAllocFromHeap(__OSCurrHeap, size);
}
static void __AXFXFreeFunction(void* block) {
OSFreeToHeap(__OSCurrHeap, block);
}
void AXFXSetHooks(AXFXAllocHook alloc, AXFXFreeHook free) {
__AXFXAlloc = alloc;
__AXFXFree = free;
}
void AXFXGetHooks(AXFXAllocHook* alloc, AXFXFreeHook* free) {
*alloc = __AXFXAlloc;
*free = __AXFXFree;
}
+33
View File
@@ -0,0 +1,33 @@
#include <revolution/axfx.h>
#include <revolution.h>
static void __ParamConvert(AXFX_REVERBHI* fx) {
fx->exp.earlyMode = 5;
fx->exp.preDelayTimeMax = fx->preDelay;
fx->exp.preDelayTime = fx->preDelay;
fx->exp.fusedMode = 0;
fx->exp.fusedTime = fx->time;
fx->exp.coloration = fx->coloration;
fx->exp.damping = fx->damping;
fx->exp.crosstalk = fx->crosstalk;
fx->exp.earlyGain = 0.0f;
fx->exp.fusedGain = 1.0f;
fx->exp.busIn = NULL;
fx->exp.busOut = NULL;
fx->exp.outGain = fx->mix;
fx->exp.sendGain = 0.0f;
}
BOOL AXFXReverbHiInit(AXFX_REVERBHI* fx) {
__ParamConvert(fx);
return AXFXReverbHiExpInit(&fx->exp);
}
BOOL AXFXReverbHiShutdown(AXFX_REVERBHI* fx) {
AXFXReverbHiExpShutdown(&fx->exp);
return TRUE;
}
void AXFXReverbHiCallback(void* chans, void* context) {
AXFXReverbHiExpCallback((AXFX_BUFFERUPDATE*)chans, &((AXFX_REVERBHI*)context)->exp);
}
+418
View File
@@ -0,0 +1,418 @@
#include <revolution/axfx.h>
#include <revolution/mem.h>
#include <cmath>
static u32 __EarlySizeTable[8][3] = {
{157, 479, 829}, {317, 809, 1117}, {479, 941, 1487}, {641, 1259, 1949},
{797, 1667, 2579}, {967, 1901, 2903}, {1123, 2179, 3413}, {1279, 2477, 3889}
};
static f32 __EarlyCoefTable[8][3] = {
{0.4f, -1.0f, 0.3f}, {0.5f, -0.95f, 0.3f}, {0.6f, -0.9f, 0.3f}, {0.75f, -0.85f, 0.3f},
{-0.9f, 0.8f, 0.3f}, {-1.0f, 0.7f, 0.3f}, {-1.0f, 0.7f, 0.3f}, {-1.0f, 0.7f, 0.3f}
};
static u32 __FilterSizeTable[7][8] = {
{1789, 1999, 2333, 433, 149, 47, 73, 67}, {149, 293, 449, 251, 103, 47, 73, 67},
{947, 1361, 1531, 433, 137, 47, 73, 67}, {1279, 1531, 1973, 509, 149, 47, 73, 67},
{1531, 1847, 2297, 563, 179, 47, 73, 67}, {1823, 2357, 2693, 571, 137, 47, 73, 67},
{1823, 2357, 2693, 571, 179, 47, 73, 67}
};
static BOOL __AllocDelayLine(AXFX_REVERBHI_EXP* reverb);
static void __FreeDelayLine(AXFX_REVERBHI_EXP* reverb);
static void __BzeroDelayLines(AXFX_REVERBHI_EXP* reverb);
static BOOL __InitParams(AXFX_REVERBHI_EXP* reverb);
f32 dummy_0() {
return 32000.0f;
}
BOOL AXFXReverbHiExpInit(AXFX_REVERBHI_EXP* reverb) {
u32 ch, i;
BOOL result = TRUE;
BOOL mask = OSDisableInterrupts();
reverb->active = 1;
if (reverb->preDelayTimeMax < 0.0f) {
AXFXReverbHiExpShutdown(reverb);
OSRestoreInterrupts(mask);
return FALSE;
}
reverb->earlyMaxLength = __EarlySizeTable[8 - 1][2];
reverb->preDelayMaxLength = (u32)(reverb->preDelayTimeMax * 32000);
for (i = 0; i < 3; i++) {
reverb->combMaxLength[i] = __FilterSizeTable[6][i];
}
for (i = 0; i < 2; i++) {
reverb->allpassMaxLength[i] = __FilterSizeTable[6][3 + i];
}
for (ch = 0; ch < 3; ch++) {
reverb->lastAllpassMaxLength[ch] = __FilterSizeTable[6][5 + ch];
}
result = __AllocDelayLine(reverb);
if (result == FALSE) {
AXFXReverbHiExpShutdown(reverb);
OSRestoreInterrupts(mask);
return FALSE;
}
__BzeroDelayLines(reverb);
result = __InitParams(reverb);
if (result == FALSE) {
AXFXReverbHiExpShutdown(reverb);
OSRestoreInterrupts(mask);
return FALSE;
}
reverb->active &= ~1;
OSRestoreInterrupts(mask);
return TRUE;
}
void AXFXReverbHiExpShutdown(AXFX_REVERBHI_EXP* reverb) {
BOOL mask = OSDisableInterrupts();
reverb->active |= 1;
__FreeDelayLine(reverb);
OSRestoreInterrupts(mask);
}
void AXFXReverbHiExpCallback(AXFX_BUFFERUPDATE* bufferUpdate, AXFX_REVERBHI_EXP* reverb) {
u32 ch, i;
u32 samp;
s32* input[3];
f32 data;
f32 output[3];
f32* earlyLine;
f32 earlyOut;
f32* preDelayLine;
f32 preDelayOut;
f32 filterOut;
f32* combLine;
f32 combOutOne;
f32* allpass;
f32 outTmp;
f32 allpassIn;
f32 allpassCoef;
f32 lpfOut;
f32 lpfCoef1;
f32 lpfCoef2;
f32 fusedOut[3];
f32 fusedGain;
f32 crosstalkGain;
f32 crosstalkL;
f32 crosstalkR;
f32 crosstalkS;
s32* inBusData[3];
s32* outBusData[3];
if (reverb->active != 0) {
reverb->active &= ~2;
return;
}
input[0] = bufferUpdate->left;
input[1] = bufferUpdate->right;
input[2] = bufferUpdate->surround;
if (reverb->busIn != NULL) {
inBusData[0] = reverb->busIn->left;
inBusData[1] = reverb->busIn->right;
inBusData[2] = reverb->busIn->surround;
}
if (reverb->busOut != NULL) {
outBusData[0] = reverb->busOut->left;
outBusData[1] = reverb->busOut->right;
outBusData[2] = reverb->busOut->surround;
}
lpfCoef1 = 1.0f - reverb->lpfCoef;
lpfCoef2 = reverb->lpfCoef;
allpassCoef = reverb->allpassCoef;
fusedGain = reverb->fusedGain * 0.6f;
crosstalkGain = reverb->crosstalk * 0.5f;
for (samp = 0; samp < 96; samp++) {
for (ch = 0; ch < 3; ch++) {
if (reverb->busIn != NULL) {
data = (f32)(*(input[ch]) + *(inBusData[ch]++));
} else {
data = (f32)(*input[ch]);
}
earlyLine = reverb->earlyLine[ch];
earlyOut = earlyLine[reverb->earlyPos[0]] * reverb->earlyCoef[0] +
earlyLine[reverb->earlyPos[1]] * reverb->earlyCoef[1] +
earlyLine[reverb->earlyPos[2]] * reverb->earlyCoef[2];
#if SDK_AUG2010
earlyLine[reverb->earlyPos[2]] = data;
#endif
if (reverb->preDelayLength != 0) {
preDelayLine = reverb->preDelayLine[ch];
preDelayOut = preDelayLine[reverb->preDelayPos];
preDelayLine[reverb->preDelayPos] = data;
} else {
preDelayOut = data;
}
filterOut = 0.0f;
for (i = 0; i < 3; i++) {
combLine = reverb->combLine[ch][i];
combOutOne = combLine[reverb->combPos[i]];
combLine[reverb->combPos[i]] = preDelayOut + (combOutOne * reverb->combCoef[i]);
filterOut += combOutOne;
}
for (i = 0; i < 2; i++) {
allpass = reverb->allpassLine[ch][i];
outTmp = allpass[reverb->allpassPos[i]];
allpassIn = filterOut + outTmp * allpassCoef;
allpass[reverb->allpassPos[i]] = allpassIn;
filterOut = outTmp - allpassIn * allpassCoef;
}
lpfOut = lpfCoef1 * filterOut + lpfCoef2 * reverb->lastLpfOut[ch];
reverb->lastLpfOut[ch] = lpfOut;
allpass = reverb->lastAllpassLine[ch];
outTmp = allpass[reverb->lastAllpassPos[ch]];
allpassIn = lpfOut + outTmp * allpassCoef;
allpass[reverb->lastAllpassPos[ch]] = allpassIn;
fusedOut[ch] = outTmp - allpassIn * allpassCoef;
if (++reverb->lastAllpassPos[ch] >= reverb->lastAllpassLength[ch]) {
reverb->lastAllpassPos[ch] = 0;
}
fusedOut[ch] *= fusedGain;
fusedOut[ch] += earlyOut;
}
crosstalkL = fusedOut[1] + fusedOut[2];
crosstalkR = fusedOut[0] + fusedOut[2];
crosstalkS = fusedOut[0] + fusedOut[1];
output[0] = fusedOut[0] + crosstalkL * crosstalkGain;
output[1] = fusedOut[1] + crosstalkR * crosstalkGain;
output[2] = fusedOut[2] + crosstalkS * crosstalkGain;
*(input[0]++) = (s32)(output[0] * reverb->outGain);
*(input[1]++) = (s32)(output[1] * reverb->outGain);
*(input[2]++) = (s32)(output[2] * reverb->outGain);
if (reverb->busOut != NULL) {
*(outBusData[0]++) = (s32)(output[0] * reverb->sendGain);
*(outBusData[1]++) = (s32)(output[1] * reverb->sendGain);
*(outBusData[2]++) = (s32)(output[2] * reverb->sendGain);
}
for (i = 0; i < 3; i++) {
if (++reverb->earlyPos[i] >= reverb->earlyLength) {
reverb->earlyPos[i] = 0;
}
}
if (reverb->preDelayLength != 0) {
if (++reverb->preDelayPos >= reverb->preDelayLength) {
reverb->preDelayPos = 0;
}
}
for (i = 0; i < 3; i++) {
if (++reverb->combPos[i] >= reverb->combLength[i]) {
reverb->combPos[i] = 0;
}
}
for (i = 0; i < 2; i++) {
if (++reverb->allpassPos[i] >= reverb->allpassLength[i]) {
reverb->allpassPos[i] = 0;
}
}
}
}
static BOOL __AllocDelayLine(AXFX_REVERBHI_EXP* reverb) {
u32 ch, i;
for (ch = 0; ch < 3; ch++) {
reverb->earlyLine[ch] = (f32*)__AXFXAlloc(sizeof(f32) * reverb->earlyMaxLength);
if (reverb->earlyLine[ch] == NULL)
return FALSE;
if (reverb->preDelayMaxLength != 0) {
reverb->preDelayLine[ch] = (f32*)__AXFXAlloc(sizeof(f32) * reverb->preDelayMaxLength);
if (reverb->preDelayLine[ch] == NULL)
return FALSE;
} else {
reverb->preDelayLine[ch] = NULL;
}
for (i = 0; i < 3; i++) {
reverb->combLine[ch][i] = (f32*)__AXFXAlloc(sizeof(f32) * reverb->combMaxLength[i]);
if (reverb->combLine[ch][i] == NULL)
return FALSE;
}
for (i = 0; i < 2; i++) {
reverb->allpassLine[ch][i] = (f32*)__AXFXAlloc(sizeof(f32) * reverb->allpassMaxLength[i]);
if (reverb->allpassLine[ch][i] == NULL)
return FALSE;
}
reverb->lastAllpassLine[ch] = (f32*)__AXFXAlloc(sizeof(f32) * reverb->lastAllpassMaxLength[ch]);
if (reverb->lastAllpassLine[ch] == NULL)
return FALSE;
}
return TRUE;
}
static void __BzeroDelayLines(AXFX_REVERBHI_EXP* reverb) {
u32 ch, i;
for (ch = 0; ch < 3; ch++) {
if (reverb->earlyLine[ch] != NULL) {
memset(reverb->earlyLine[ch], 0, sizeof(f32) * reverb->earlyMaxLength);
}
if (reverb->preDelayLine[ch] != NULL) {
memset(reverb->preDelayLine[ch], 0, sizeof(f32) * reverb->preDelayMaxLength);
}
for (i = 0; i < 3; i++) {
if (reverb->combLine[ch][i] != NULL) {
memset(reverb->combLine[ch][i], 0, sizeof(f32) * reverb->combMaxLength[i]);
}
}
for (i = 0; i < 2; i++) {
if (reverb->allpassLine[ch][i] != NULL) {
memset(reverb->allpassLine[ch][i], 0, sizeof(f32) * reverb->allpassMaxLength[i]);
}
}
if (reverb->lastAllpassLine[ch] != NULL) {
memset(reverb->lastAllpassLine[ch], 0, sizeof(f32) * reverb->lastAllpassMaxLength[ch]);
}
}
}
static void __FreeDelayLine(AXFX_REVERBHI_EXP* reverb) {
u32 ch, i;
for (ch = 0; ch < 3; ch++) {
if (reverb->earlyLine[ch] != NULL) {
__AXFXFree(reverb->earlyLine[ch]);
reverb->earlyLine[ch] = NULL;
}
if (reverb->preDelayLine[ch] != NULL) {
__AXFXFree(reverb->preDelayLine[ch]);
reverb->preDelayLine[ch] = NULL;
}
for (i = 0; i < 3; i++) {
if (reverb->combLine[ch][i] != NULL) {
__AXFXFree(reverb->combLine[ch][i]);
reverb->combLine[ch][i] = NULL;
}
}
for (i = 0; i < 2; i++) {
if (reverb->allpassLine[ch][i] != NULL) {
__AXFXFree(reverb->allpassLine[ch][i]);
reverb->allpassLine[ch][i] = NULL;
}
}
if (reverb->lastAllpassLine[ch] != NULL) {
__AXFXFree(reverb->lastAllpassLine[ch]);
reverb->lastAllpassLine[ch] = NULL;
}
}
}
f32 dummy_1() {
return -3.0f;
}
static BOOL __InitParams(AXFX_REVERBHI_EXP* reverb) {
u32 ch, i;
if (reverb->earlyMode >= 8)
return FALSE;
if (reverb->preDelayTime < 0.0f || reverb->preDelayTime > reverb->preDelayTimeMax)
return FALSE;
if (reverb->fusedMode >= 6)
return FALSE;
if (reverb->fusedTime < 0.0f)
return FALSE;
if (reverb->coloration < 0.0f || reverb->coloration > 1.0f)
return FALSE;
if (reverb->damping < 0.0f || reverb->damping > 1.0f)
return FALSE;
if (reverb->crosstalk < 0.0f || reverb->crosstalk > 1.0f)
return FALSE;
if (reverb->earlyGain < 0.0f || reverb->earlyGain > 1.0f)
return FALSE;
if (reverb->fusedGain < 0.0f || reverb->fusedGain > 1.0f)
return FALSE;
if (reverb->outGain < 0.0f || reverb->outGain > 1.0f)
return FALSE;
if (reverb->sendGain < 0.0f || reverb->sendGain > 1.0f)
return FALSE;
reverb->earlyLength = __EarlySizeTable[reverb->earlyMode][2];
for (i = 0; i < 3; i++) {
reverb->earlyPos[i] = reverb->earlyLength - __EarlySizeTable[reverb->earlyMode][i];
reverb->earlyCoef[i] = __EarlyCoefTable[reverb->earlyMode][i] * reverb->earlyGain * 0.6f;
}
reverb->preDelayPos = 0;
reverb->preDelayLength = (u32)(reverb->preDelayTime * (f32)32000);
for (i = 0; i < 3; i++) {
reverb->combPos[i] = 0;
reverb->combLength[i] = __FilterSizeTable[reverb->fusedMode][i];
reverb->combCoef[i] = pow(10.0f, (-3.0f * (f32)(reverb->combLength[i]) / (f32)(reverb->fusedTime * 32000)));
}
for (i = 0; i < 2; i++) {
reverb->allpassPos[i] = 0;
reverb->allpassLength[i] = __FilterSizeTable[reverb->fusedMode][3 + i];
}
for (ch = 0; ch < 3; ch++) {
reverb->lastAllpassPos[ch] = 0;
reverb->lastAllpassLength[ch] = __FilterSizeTable[reverb->fusedMode][5 + ch];
}
reverb->allpassCoef = reverb->coloration;
reverb->lpfCoef = 1.0f - reverb->damping;
if (reverb->lpfCoef > 0.95f)
reverb->lpfCoef = 0.95f;
for (ch = 0; ch < 3; ch++) {
reverb->lastLpfOut[ch] = 0.0f;
}
return TRUE;
}
+2 -2
View File
@@ -260,8 +260,8 @@ namespace homebutton {
/* 0x5D0 */ nw4hbm::snd::SoundHeap* mpSoundHeap;
/* 0x5D4 */ nw4hbm::snd::SoundHandle* mpSoundHandle;
/* 0x5D8 */ u16 mAppVolume[3];
/* 0x5E0 */ AXFXAllocFunc mAxFxAlloc;
/* 0x5E4 */ AXFXFreeFunc mAxFxFree;
/* 0x5E0 */ AXFXAllocHook mAxFxAlloc;
/* 0x5E4 */ AXFXFreeHook mAxFxFree;
/* 0x5E8 */ AXFX_REVERBHI mAxFxReverb;
/* 0x748 */ AXAuxCallback mAuxCallback;
/* 0x74C */ void* mpAuxContext;
+2
View File
@@ -23,10 +23,12 @@ void IPCInit(void) {
Initialized = TRUE;
}
#if SDK_AUG2010
void IPCReInit(void) {
Initialized = FALSE;
IPCInit();
}
#endif
u32 IPCReadReg(u32 regIdx) {
u32 reg = __IPCRegs[regIdx];
+124 -14
View File
@@ -1,17 +1,40 @@
#include <revolution.h>
#include <cstring>
static u32 IpcReqPtrArray[96] = {0};
static u32 IpcReqArray[0x300] = {0};
static OSTime IpcStartTimeArray[96];
static u8 IpcHandlePathBuf[0x1800];
static u8 IpcOpenPathBuf[0x1200];
#if SDK_AUG2010
#define IPC_REQ_MAX 0x60
#define IPC_PATH_MAX 0x30
#else
#define IPC_REQ_MAX 0x20
#endif
#if SDK_AUG2010
// either release or debug config does something weird to swap the order of these in .bss
#if VERSION == VERSION_SHIELD_DEBUG
static IOSResourceRequest* IpcReqPtrArray[IPC_REQ_MAX] = {0};
static IOSResourceRequest IpcReqArray[IPC_REQ_MAX] = {0};
#else
static IOSResourceRequest IpcReqArray[IPC_REQ_MAX] = {0};
static IOSResourceRequest* IpcReqPtrArray[IPC_REQ_MAX] = {0};
#endif
static OSTime IpcStartTimeArray[IPC_REQ_MAX];
static char IpcHandlePathBuf[0x80][0x30];
static char IpcOpenPathBuf[IPC_REQ_MAX][0x30];
#else
static s32 IpcFdArray[IPC_REQ_MAX] = {0};
static u32 IpcReqPtrArray[IPC_REQ_MAX] = {0};
#endif
static u32 IpcNumPendingReqs = 0;
static u32 IpcNumUnIssuedReqs = 0;
static void AddReqInfo(void* req);
static void DelReqInfo(void* req);
#if SDK_AUG2010
static void AddReqInfo(IOSResourceRequest* req);
static void DelReqInfo(IOSResourceRequest* req);
#else
static void AddReqInfo(IOSResourceRequest* req, s32 fd);
static void DelReqInfo(IOSResourceRequest* req, s32 fd);
#endif
void IPCiProfInit(void) {
u32 i;
@@ -19,20 +42,31 @@ void IPCiProfInit(void) {
IpcNumPendingReqs = 0;
IpcNumUnIssuedReqs = 0;
for (i = 0; i < 96; ++i) {
for (i = 0; i < IPC_REQ_MAX; ++i) {
#if SDK_AUG2010
IpcReqPtrArray[i] = 0;
IpcStartTimeArray[i] = 0;
#else
IpcReqPtrArray[i] = 0;
IpcFdArray[i] = -1;
#endif
}
#if SDK_AUG2010
memset(IpcHandlePathBuf, 0, sizeof(IpcHandlePathBuf));
memset(IpcOpenPathBuf, 0, sizeof(IpcOpenPathBuf));
memset(IpcReqArray, 0, sizeof(IpcReqArray));
#endif
}
void IPCiProfQueueReq(void* req, s32 handle) {
++IpcNumPendingReqs;
++IpcNumUnIssuedReqs;
AddReqInfo(req);
#if SDK_AUG2010
AddReqInfo((IOSResourceRequest*)req);
#else
AddReqInfo((IOSResourceRequest*)req, handle);
#endif
}
void IPCiProfAck(void) {
@@ -41,13 +75,89 @@ void IPCiProfAck(void) {
void IPCiProfReply(void* req, s32 handle) {
--IpcNumPendingReqs;
DelReqInfo(req);
#if SDK_AUG2010
DelReqInfo((IOSResourceRequest*)req);
#else
DelReqInfo((IOSResourceRequest*)req, handle);
#endif
}
static void AddReqInfo(void* ptr) {
// NONMATCHING
#if SDK_AUG2010
static void AddReqInfo(IOSResourceRequest* req) {
u32 i;
for (i = 0; i < IPC_REQ_MAX; i++) {
if (!IpcReqPtrArray[i]) {
BOOL irqEnabled = OSDisableInterrupts();
IpcReqPtrArray[i] = req;
IpcReqArray[i] = *req;
IpcStartTimeArray[i] = OSGetTime();
if (IpcReqArray[i].cmd == 1) {
const char* path_p_virt = (const char*)OSPhysicalToCached((u32)IpcReqArray[i].args.open.path);
strncpy(IpcOpenPathBuf[i], path_p_virt,
IPC_PATH_MAX - 1);
IpcOpenPathBuf[i][IPC_PATH_MAX - 1] = '\0';
IpcReqArray[i].args.open.path = (u8*)IpcOpenPathBuf[i];
}
OSRestoreInterrupts(irqEnabled);
break;
}
}
}
static void DelReqInfo(void* ptr) {
// NONMATCHING
static void DelReqInfo(IOSResourceRequest* req) {
u32 i;
for (i = 0; i < IPC_REQ_MAX; i++) {
if (req == IpcReqPtrArray[i] && req->handle == IpcReqArray[i].cmd) {
BOOL irqEnabled = OSDisableInterrupts();
if (IpcReqArray[i].cmd == 1) {
if (req->status >= 0) {
strncpy(IpcHandlePathBuf[req->status],
(const char*)IpcReqArray[i].args.open.path, IPC_PATH_MAX - 1);
IpcHandlePathBuf[req->status][IPC_PATH_MAX - 1] = '\0';
memset(&IpcOpenPathBuf[i], 0, IPC_PATH_MAX);
}
}
if (IpcReqArray[i].cmd == 2) {
memset(&IpcHandlePathBuf[IpcReqArray[i].handle], 0, IPC_PATH_MAX);
}
IpcReqPtrArray[i] = NULL;
memset(&IpcReqArray[i], 0, sizeof(IOSResourceRequest));
IpcStartTimeArray[i] = 0;
OSRestoreInterrupts(irqEnabled);
break;
}
}
}
#else
static void AddReqInfo(IOSResourceRequest* ptr, s32 fd) {
u32 i;
for (i = 0; i < 32; ++i) {
if (IpcReqPtrArray[i] == 0 && IpcFdArray[i] == -1) {
IpcReqPtrArray[i] = (u32)ptr;
IpcFdArray[i] = fd;
break;
}
}
}
static void DelReqInfo(IOSResourceRequest* ptr, s32 fd) {
u32 i;
for (i = 0; i < 32; ++i) {
if (IpcReqPtrArray[i] == (u32)ptr && IpcFdArray[i] == fd) {
IpcReqPtrArray[i] = 0;
IpcFdArray[i] = -1;
break;
}
}
}
#endif
+39 -6
View File
@@ -4,6 +4,14 @@
#include <revolution/ipc.h>
#include <cstring>
#if SDK_AUG2010
#define RESPONSE_REQ_BUF_LEN 0x30
#define IPC_BUF_CNT 0x40
#else
#define RESPONSE_REQ_BUF_LEN 0x10
#define IPC_BUF_CNT 0x10
#endif
/* macro for matching __ipcQueueRequest */
#define diff(a, b) \
((a) < (b)) ? ((u32)0xffffffff - (b) + (a) + 1) : ((a) - (b))
@@ -23,9 +31,11 @@ typedef struct IOSRpcRequest {
} IOSRpcRequest;
static IOSRpcRequest* __relnchRpc = 0;
#if SDK_AUG2010
static IOSRpcRequest* __relnchRpcSave = 0;
#endif
#define ROUNDUP(sz) (((u32)(sz) + 31) & ~(u32)(31))
#define ROUNDUP(sz) (((u32)(sz) + (IPC_BUF_CNT / 2 - 1)) & ~(u32)(IPC_BUF_CNT / 2 - 1))
static u8 __rpcBuf[ROUNDUP(sizeof(IOSRpcRequest))] ATTRIBUTE_ALIGN(32);
@@ -34,7 +44,7 @@ static struct {
u32 wcount;
u32 rptr;
u32 wptr;
IOSResourceRequest* buf[48];
IOSResourceRequest* buf[RESPONSE_REQ_BUF_LEN];
} __responses;
static OSAlarm __timeout_alarm;
@@ -93,6 +103,10 @@ static void __ipcSendRequest(void) {
}
if (rpc->relaunch_flag) {
#if !SDK_AUG2010
__relnchFl = 1;
__relnchRpc = rpc;
#endif
__mailboxAck--;
}
@@ -149,7 +163,12 @@ void IpcReplyHandler(__OSInterrupt interrupt, OSContext* context) {
DCInvalidateRange(v->vector[i].base, v->vector[i].length);
}
if (__relnchFl && __relnchRpcSave == rep) {
#if SDK_AUG2010
if (__relnchFl && __relnchRpcSave == rep)
#else
if (__relnchFl && __relnchRpc == rep)
#endif
{
__relnchFl = 0;
if (__mailboxAck < 1) {
@@ -229,7 +248,7 @@ IOSError IPCCltInit(void) {
IPCInit();
i = ROUNDUP(64 * (ROUNDUP(sizeof(IOSRpcRequest)) + 64));
i = ROUNDUP(IPC_BUF_CNT * (ROUNDUP(sizeof(IOSRpcRequest)) + 64));
bufferLo = IPCGetBufferLo();
if ((void*)((u8*)bufferLo + i) > IPCGetBufferHi()) {
@@ -245,18 +264,21 @@ IOSError IPCCltInit(void) {
IPCWriteReg(1, (1 << 5 | 1<< 4 | 1 << 3));
IPCiProfInit();
#if SDK_AUG2010
OSCreateAlarm(&__timeout_alarm);
#endif
out:
return ret;
}
#if SDK_AUG2010
IOSError IPCCltReInit(void) {
u32 i;
IOSError ret = 0;
void* bufferLo;
i = ROUNDUP(64 * ROUNDUP(sizeof(IOSRpcRequest)));
i = ROUNDUP(IPC_BUF_CNT * ROUNDUP(sizeof(IOSRpcRequest)));
bufferLo = IPCGetBufferLo();
if ((void*)((u8*)bufferLo + i) > IPCGetBufferHi()) {
@@ -270,6 +292,7 @@ IOSError IPCCltReInit(void) {
out:
return ret;
}
#endif
static IOSError __ios_Ipc1(IOSFd fd, u32 cmd, IOSIpcCb cb, void* cbArg, IOSRpcRequest** rpc) {
IOSError ret = 0;
@@ -773,6 +796,7 @@ IOSError IOS_IoctlvReboot(IOSFd fd, s32 cmd, u32 readCount, u32 writeCount, IOSI
u32 inten;
IOSResourceRequest* req;
#if SDK_AUG2010
inten = OSDisableInterrupts();
if (__relnchFl) {
@@ -783,6 +807,7 @@ IOSError IOS_IoctlvReboot(IOSFd fd, s32 cmd, u32 readCount, u32 writeCount, IOSI
__relnchFl = 1;
OSRestoreInterrupts(inten);
#endif
ret = __ios_Ipc1(fd, 7, 0, 0, &rpc);
@@ -790,15 +815,18 @@ IOSError IOS_IoctlvReboot(IOSFd fd, s32 cmd, u32 readCount, u32 writeCount, IOSI
goto err;
}
#if SDK_AUG2010
__relnchRpcSave = rpc;
#endif
rpc->relaunch_flag = 1;
ret = __ios_Ioctlv(rpc, cmd, readCount, writeCount, vect);
if (ret != 0) {
goto err;
}
#if SDK_AUG2010
memcpy(&__rpcBuf, rpc, sizeof(IOSRpcRequest));
__relnchRpc = (IOSRpcRequest*)&__rpcBuf;
req = &rpc->request;
@@ -821,14 +849,19 @@ IOSError IOS_IoctlvReboot(IOSFd fd, s32 cmd, u32 readCount, u32 writeCount, IOSI
OSSleepThread(&__relnchRpc->thread_queue);
OSRestoreInterrupts(inten);
ret = (&__relnchRpc->request)->status;
#else
ret = __ios_Ipc2(rpc, NULL);
#endif
err:
#if SDK_AUG2010
__relnchFl = 0;
__relnchRpcSave = NULL;
if (rpc && (ret != 0)) {
ipcFree(rpc);
}
#endif
finish:
return ret;
+31
View File
@@ -0,0 +1,31 @@
#include <revolution/mem/allocator.h>
#include <revolution/mem/expHeap.h>
static void* AllocatorAllocForExpHeap_(MEMAllocator *pAllocator, u32 size) {
return MEMAllocFromExpHeapEx(pAllocator->pHeap, size, pAllocator->heapParam1);
}
static void AllocatorFreeForExpHeap_(MEMAllocator *pAllocator, void *pBlock) {
MEMFreeToExpHeap(pAllocator->pHeap, pBlock);
}
void* MEMAllocFromAllocator(MEMAllocator *pAllocator, u32 size) {
return (*pAllocator->pFunc->pfAlloc)(pAllocator, size);
}
void MEMFreeToAllocator(MEMAllocator *pAllocator, void *pBlock) {
(*pAllocator->pFunc->pfFree)(pAllocator, pBlock);
}
void MEMInitAllocatorForExpHeap(MEMAllocator *pAllocator, MEMHeapHandle handle, int align) {
static const MEMAllocatorFunc sAllocatorFunc =
{
AllocatorAllocForExpHeap_,
AllocatorFreeForExpHeap_,
};
pAllocator->pFunc = &sAllocatorFunc;
pAllocator->pHeap = handle;
pAllocator->heapParam1 = align;
pAllocator->heapParam2 = 0;
}
+380
View File
@@ -0,0 +1,380 @@
#include <revolution/mem/expHeap.h>
#include <revolution/mem/heapCommon.h>
#define FillFreeMemory(pHeapHd, address, size) ((void)0)
#define FillNoUseMemory(pHeapHd, address, size) ((void)0)
#define RoundUp(value, alignment) (((value) + ((alignment) - 1)) & ~((alignment) - 1))
#define RoundUpPtr(ptr, alignment) ((void*)RoundUp(GetUIntPtr(ptr), (alignment)))
#define RoundDown(value, alignment) ((value) & ~((alignment) - 1))
#define RoundDownPtr(ptr, alignment) ((void*)RoundDown(GetUIntPtr(ptr), (alignment)))
typedef struct MemRegion MemRegion;
struct MemRegion {
void* start;
void* end;
};
static inline void* GetMemPtrForMBlock_(MEMiExpHeapMBlockHead* pMBlkHd) {
return AddU32ToPtr(pMBlkHd, sizeof(MEMiExpHeapMBlockHead));
}
static inline void* GetMBlockEndAddr_(MEMiExpHeapMBlockHead* pMBHead) {
return AddU32ToPtr(GetMemPtrForMBlock_(pMBHead), pMBHead->blockSize);
}
static inline u16 GetAllocMode_(MEMiExpHeapHead* pEHHead) {
return pEHHead->feature.fields.allocMode;
}
static MEMiExpHeapMBlockHead* InitMBlock_(MemRegion* pRegion, u16 signature) {
MEMiExpHeapMBlockHead* block = (MEMiExpHeapMBlockHead*)pRegion->start;
block->signature = signature;
block->attribute.val = 0;
block->blockSize = GetOffsetFromPtr(GetMemPtrForMBlock_(block), pRegion->end);
block->prev = NULL;
block->next = NULL;
return block;
}
static inline void SetAllocDirForMBlock_(MEMiExpHeapMBlockHead* pMBHead, u16 mode) {
pMBHead->attribute.fields.allocDir = mode;
}
static inline u16 GetAlignmentForMBlock_(const MEMiExpHeapMBlockHead* pMBlkHd) {
return pMBlkHd->attribute.fields.alignment;
}
static inline void SetAlignmentForMBlock_(MEMiExpHeapMBlockHead* pMBlkHd, u16 alignment) {
pMBlkHd->attribute.fields.alignment = alignment;
}
static inline void SetGroupIDForMBlock_(MEMiExpHeapMBlockHead* pMBHead, u16 id) {
pMBHead->attribute.fields.groupID = (u8)id;
}
static void GetRegionOfMBlock_(MemRegion* region, MEMiExpHeapMBlockHead* block) {
region->start = SubU32ToPtr(block, GetAlignmentForMBlock_(block));
region->end = GetMBlockEndAddr_(block);
}
static inline MEMiHeapHead* GetHeapHeadPtrFromExpHeapHead_(MEMiExpHeapHead* pEHHead) {
return (MEMiHeapHead*)SubU32ToPtr(pEHHead, sizeof(MEMiHeapHead));
}
static MEMiExpHeapMBlockHead* InsertMBlock_(MEMiExpMBlockList* list, MEMiExpHeapMBlockHead* target, MEMiExpHeapMBlockHead* prev) {
MEMiExpHeapMBlockHead* next;
target->prev = prev;
if (prev) {
next = prev->next;
prev->next = target;
} else {
next = list->head;
list->head = target;
}
target->next = next;
if (next) {
next->prev = target;
} else {
list->tail = target;
}
return target;
}
static inline void AppendMBlock_(MEMiExpMBlockList* list, MEMiExpHeapMBlockHead* block) {
(void)InsertMBlock_(list, block, list->tail);
}
static inline MEMiExpHeapHead* GetExpHeapHeadPtrFromHeapHead_(MEMiHeapHead* pHHead) {
return (MEMiExpHeapHead*)AddU32ToPtr(pHHead, sizeof(MEMiHeapHead));
}
static MEMiExpHeapMBlockHead* RemoveMBlock_(MEMiExpMBlockList* list, MEMiExpHeapMBlockHead* block) {
MEMiExpHeapMBlockHead* const prev = block->prev;
MEMiExpHeapMBlockHead* const next = block->next;
if (prev) {
prev->next = next;
} else {
list->head = next;
}
if (next) {
next->prev = prev;
} else {
list->tail = prev;
}
return prev;
}
static inline MEMiExpHeapMBlockHead* InitFreeMBlock_(MemRegion* pRegion) {
return InitMBlock_(pRegion, 'FR');
}
static inline void SetAllocMode_(MEMiExpHeapHead* pEHHead, u16 mode) {
pEHHead->feature.fields.allocMode = mode;
}
static MEMiHeapHead* InitExpHeap_(void* startAddress, void* endAddress, u16 optFlag) {
MEMiHeapHead* pHeapHd = (MEMiHeapHead*)startAddress;
MEMiExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead_(pHeapHd);
MEMiInitHeapHead(pHeapHd, 'EXPH', AddU32ToPtr(pExpHeapHd, sizeof(MEMiExpHeapHead)), endAddress, optFlag);
pExpHeapHd->groupID = 0;
pExpHeapHd->feature.val = 0;
SetAllocMode_(pExpHeapHd, 0);
{
MEMiExpHeapMBlockHead* pMBHead;
MemRegion region;
region.start = pHeapHd->heapStart;
region.end = pHeapHd->heapEnd;
pMBHead = InitFreeMBlock_(&region);
pExpHeapHd->mbFreeList.head = pMBHead;
pExpHeapHd->mbFreeList.tail = pMBHead;
pExpHeapHd->mbUsedList.head = NULL;
pExpHeapHd->mbUsedList.tail = NULL;
return pHeapHd;
}
}
static void* AllocUsedBlockFromFreeBlock_(MEMiExpHeapHead* pEHHead, MEMiExpHeapMBlockHead* pMBHeadFree, void* mblock, u32 size, u16 direction) {
MemRegion freeRgnT;
MemRegion freeRgnB;
MEMiExpHeapMBlockHead* pMBHeadFreePrev;
GetRegionOfMBlock_(&freeRgnT, pMBHeadFree);
freeRgnB.end = freeRgnT.end;
freeRgnB.start = AddU32ToPtr(mblock, size);
freeRgnT.end = SubU32ToPtr(mblock, sizeof(MEMiExpHeapMBlockHead));
pMBHeadFreePrev = RemoveMBlock_(&pEHHead->mbFreeList, pMBHeadFree);
if ((GetOffsetFromPtr(freeRgnT.start, freeRgnT.end) < sizeof(MEMiExpHeapMBlockHead) + 4)
#if SDK_AUG2010
|| (direction == 0 && !pEHHead->feature.fields.useMarginOfAlign)
#endif
) {
freeRgnT.end = freeRgnT.start;
} else {
pMBHeadFreePrev = InsertMBlock_(&pEHHead->mbFreeList, InitFreeMBlock_(&freeRgnT), pMBHeadFreePrev);
}
if ((GetOffsetFromPtr(freeRgnB.start, freeRgnB.end) < sizeof(MEMiExpHeapMBlockHead) + 4)
#if SDK_AUG2010
|| (direction == 1 && !pEHHead->feature.fields.useMarginOfAlign)
#endif
) {
freeRgnB.start = freeRgnB.end;
} else {
(void)InsertMBlock_(&pEHHead->mbFreeList, InitFreeMBlock_(&freeRgnB), pMBHeadFreePrev);
}
FillAllocMemory(GetHeapHeadPtrFromExpHeapHead_(pEHHead), freeRgnT.end, GetOffsetFromPtr(freeRgnT.end, freeRgnB.start));
{
MEMiExpHeapMBlockHead* pMBHeadNewUsed;
MemRegion region;
region.start = SubU32ToPtr(mblock, sizeof(MEMiExpHeapMBlockHead));
region.end = freeRgnB.start;
pMBHeadNewUsed = InitMBlock_(&region, 'UD');
SetAllocDirForMBlock_(pMBHeadNewUsed, direction);
SetAlignmentForMBlock_(pMBHeadNewUsed, (u16)GetOffsetFromPtr(freeRgnT.end, pMBHeadNewUsed));
SetGroupIDForMBlock_(pMBHeadNewUsed, pEHHead->groupID);
AppendMBlock_(&pEHHead->mbUsedList, pMBHeadNewUsed);
}
return mblock;
}
static void* AllocFromHead_(MEMiHeapHead* pHeapHd, u32 size, int alignment) {
MEMiExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead_(pHeapHd);
const BOOL bAllocFirst = GetAllocMode_(pExpHeapHd) == 0;
MEMiExpHeapMBlockHead* pMBlkHd = NULL;
MEMiExpHeapMBlockHead* pMBlkHdFound = NULL;
u32 foundSize = 0xffffffff;
void* foundMBlock = NULL;
for (pMBlkHd = pExpHeapHd->mbFreeList.head; pMBlkHd; pMBlkHd = pMBlkHd->next) {
void* const mblock = GetMemPtrForMBlock_(pMBlkHd);
void* const reqMBlock = RoundUpPtr(mblock, alignment);
const u32 offset = GetOffsetFromPtr(mblock, reqMBlock);
if (pMBlkHd->blockSize >= size + offset && foundSize > pMBlkHd->blockSize) {
pMBlkHdFound = pMBlkHd;
foundSize = pMBlkHd->blockSize;
foundMBlock = reqMBlock;
if (bAllocFirst || foundSize == size) {
break;
}
}
}
if (!pMBlkHdFound) {
return NULL;
}
return AllocUsedBlockFromFreeBlock_(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 0);
}
static void* AllocFromTail_(MEMiHeapHead* pHeapHd, u32 size, int alignment) {
MEMiExpHeapHead* pExpHeapHd = GetExpHeapHeadPtrFromHeapHead_(pHeapHd);
const BOOL bAllocFirst = GetAllocMode_(pExpHeapHd) == 0;
MEMiExpHeapMBlockHead* pMBlkHd = NULL;
MEMiExpHeapMBlockHead* pMBlkHdFound = NULL;
u32 foundSize = 0xffffffff;
void* foundMBlock = NULL;
for (pMBlkHd = pExpHeapHd->mbFreeList.tail; pMBlkHd; pMBlkHd = pMBlkHd->prev) {
void* const mblock = GetMemPtrForMBlock_(pMBlkHd);
void* const mblockEnd = AddU32ToPtr(mblock, pMBlkHd->blockSize);
void* const reqMBlock = RoundDownPtr(SubU32ToPtr(mblockEnd, size), alignment);
if (ComparePtr(reqMBlock, mblock) >= 0 && foundSize > pMBlkHd->blockSize) {
pMBlkHdFound = pMBlkHd;
foundSize = pMBlkHd->blockSize;
foundMBlock = reqMBlock;
if (bAllocFirst || foundSize == size) {
break;
}
}
}
if (!pMBlkHdFound) {
return NULL;
}
return AllocUsedBlockFromFreeBlock_(pExpHeapHd, pMBlkHdFound, foundMBlock, size, 1);
}
static BOOL RecycleRegion_(MEMiExpHeapHead* pEHHead, const MemRegion* pRegion) {
MEMiExpHeapMBlockHead* pBlkPrFree = NULL;
MemRegion freeRgn = *pRegion;
{
MEMiExpHeapMBlockHead* pBlk;
for (pBlk = pEHHead->mbFreeList.head; pBlk; pBlk = pBlk->next) {
if (pBlk < pRegion->start) {
pBlkPrFree = pBlk;
continue;
}
if (pBlk == pRegion->end) {
freeRgn.end = GetMBlockEndAddr_(pBlk);
(void)RemoveMBlock_(&pEHHead->mbFreeList, pBlk);
FillNoUseMemory(GetHeapHeadPtrFromExpHeapHead_(pEHHead), pBlk, sizeof(MEMiExpHeapMBlockHead));
}
break;
}
}
if (pBlkPrFree && GetMBlockEndAddr_(pBlkPrFree) == pRegion->start) {
freeRgn.start = pBlkPrFree;
pBlkPrFree = RemoveMBlock_(&pEHHead->mbFreeList, pBlkPrFree);
}
if (GetOffsetFromPtr(freeRgn.start, freeRgn.end) < sizeof(MEMiExpHeapMBlockHead)) {
return FALSE;
}
FillFreeMemory(GetHeapHeadPtrFromExpHeapHead_(pEHHead), pRegion->start, GetOffsetFromPtr(pRegion->start, pRegion->end));
(void)InsertMBlock_(&pEHHead->mbFreeList, InitFreeMBlock_(&freeRgn), pBlkPrFree);
return TRUE;
}
MEMHeapHandle MEMCreateExpHeapEx(void* startAddress, u32 size, u16 optFlag) {
void* endAddress;
endAddress = RoundDownPtr(AddU32ToPtr(startAddress, size), 4);
startAddress = RoundUpPtr(startAddress, 4);
if (GetUIntPtr(startAddress) > GetUIntPtr(endAddress) ||
GetOffsetFromPtr(startAddress, endAddress) < sizeof(MEMiHeapHead) + sizeof(MEMiExpHeapHead) + sizeof(MEMiExpHeapMBlockHead) + 4) {
return 0;
}
{
MEMiHeapHead* pHeapHd = InitExpHeap_(startAddress, endAddress, optFlag);
return pHeapHd;
}
}
void* MEMAllocFromExpHeapEx(MEMHeapHandle heap, u32 size, int alignment) {
void* memory = NULL;
if (size == 0) {
size = 1;
}
size = RoundUp(size, 4);
LockHeap(heap);
if (alignment >= 0) {
memory = AllocFromHead_(heap, size, alignment);
} else {
memory = AllocFromTail_(heap, size, -alignment);
}
UnlockHeap(heap);
return memory;
}
static inline MEMiExpHeapMBlockHead* GetMBlockHeadPtr_(void* memBlock) {
return (MEMiExpHeapMBlockHead*)SubU32ToPtr(memBlock, sizeof(MEMiExpHeapMBlockHead));
}
static inline MEMiExpHeapHead* GetExpHeapHeadPtrFromHandle_(MEMHeapHandle heap) {
return (MEMiExpHeapHead*)GetExpHeapHeadPtrFromHeapHead_(heap);
}
void MEMFreeToExpHeap(MEMHeapHandle heap, void* memBlock) {
MEMiHeapHead* pHeapHd;
MEMiExpHeapHead* pExpHeapHd;
MEMiExpHeapMBlockHead* pMBHead;
MemRegion region;
if (memBlock == NULL) {
return;
}
#if SDK_AUG2010
LockHeap(heap);
#endif
pHeapHd = heap;
pExpHeapHd = GetExpHeapHeadPtrFromHandle_(pHeapHd);
pMBHead = GetMBlockHeadPtr_(memBlock);
#if !SDK_AUG2010
LockHeap(heap);
#endif
GetRegionOfMBlock_(&region, pMBHead);
(void)RemoveMBlock_(&pExpHeapHd->mbUsedList, pMBHead);
(void)RecycleRegion_(pExpHeapHd, &region);
UnlockHeap(heap);
}
+57
View File
@@ -0,0 +1,57 @@
#include <revolution/mem/heapCommon.h>
#include <revolution/mem/list.h>
static MEMList sRootList;
static BOOL sRootListInitialized = FALSE;
static OSMutex sRootMutex;
static MEMiHeapHead* FindContainHeap_(MEMList* pList, const void* memBlock) {
MEMiHeapHead* pHeapHd = NULL;
while (NULL != (pHeapHd = (MEMiHeapHead*)MEMGetNextListObject(pList, pHeapHd))) {
if (GetUIntPtr(pHeapHd->heapStart) <= GetUIntPtr(memBlock) && GetUIntPtr(memBlock) < GetUIntPtr(pHeapHd->heapEnd)) {
MEMiHeapHead* pChildHeapHd = FindContainHeap_(&pHeapHd->childList, memBlock);
if (pChildHeapHd) {
return pChildHeapHd;
}
return pHeapHd;
}
}
return NULL;
}
static MEMList* FindListContainHeap_(const MEMiHeapHead* pHeapHd) {
MEMList* pList = &sRootList;
MEMiHeapHead* pContainHeap = FindContainHeap_(&sRootList, pHeapHd);
if (pContainHeap) {
pList = &pContainHeap->childList;
}
return pList;
}
#define FillNoUseMemory(pHeapHd, address, size) ((void)0)
void MEMiInitHeapHead(MEMiHeapHead* pHeapHd, u32 signature, void* heapStart, void* heapEnd, u16 optFlag) {
pHeapHd->signature = signature;
pHeapHd->heapStart = heapStart;
pHeapHd->heapEnd = heapEnd;
pHeapHd->attribute.val = 0;
SetOptForHeap(pHeapHd, optFlag);
FillNoUseMemory(pHeapHd, heapStart, GetOffsetFromPtr(heapStart, heapEnd));
MEM_INIT_LIST(&pHeapHd->childList, MEMiHeapHead, link);
if (!sRootListInitialized) {
MEM_INIT_LIST(&sRootList, MEMiHeapHead, link);
OSInitMutex(&sRootMutex);
sRootListInitialized = TRUE;
}
OSInitMutex(&pHeapHd->mutex);
OSLockMutex(&sRootMutex);
MEMAppendListObject(FindListContainHeap_(pHeapHd), pHeapHd);
OSUnlockMutex(&sRootMutex);
}
+41
View File
@@ -0,0 +1,41 @@
#include <revolution/mem/list.h>
// I've tried inlines but only a macro seems to work
#define GetLink(parent_list, obj) ((MEMLink*)(((u32)(obj))+(parent_list)->offs))
void MEMInitList(MEMList *pList, u16 offs) {
pList->head = NULL;
pList->tail = NULL;
pList->num = 0;
pList->offs = offs;
}
void MEMAppendListObject(MEMList *pList, void *pObj) {
MEMLink* link;
if (pList->head == NULL) {
link = GetLink(pList, pObj);
link->next = NULL;
link->prev = NULL;
pList->head = pObj;
pList->tail = pObj;
pList->num++;
}
else {
link = GetLink(pList, pObj);
link->prev = pList->tail;
link->next = NULL;
GetLink(pList, pList->tail)->next = pObj;
pList->tail = pObj;
pList->num++;
}
}
void* MEMGetNextListObject(MEMList *pList, void *pObj) {
if (pObj == NULL) {
return pList->head;
}
return GetLink(pList, pObj)->next;
}
+2
View File
@@ -515,8 +515,10 @@ void __OSLaunchNextFirmware(void) {
}
__OSInitIPCBuffer();
#if SDK_AUG2010
IPCReInit();
IPCCltReInit();
#endif
DVDLowInit();
DVDLowIntType = 0;
+1 -1
View File
@@ -7,7 +7,7 @@
#include "__os.h"
OSAlarm __OSExpireAlarm;
OSAlarm __OSExpireAlarm ATTRIBUTE_ALIGN(32);
OSTime __OSExpireTime;
OSPlayTimeCallbackFunc __OSExpireCallback;
BOOL __OSExpireSetExpiredFlag;
+45 -13
View File
@@ -5,6 +5,7 @@
#include <cstring>
#include "__si.h"
#include "revolution/vi/__vi.h"
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
@@ -14,11 +15,11 @@
#if DEBUG
#define BUILD_TIME "17:27:55"
#else
#define BUILD_TIME "17:33:06"
#define BUILD_TIME "17:33:17"
#endif
#elif SDK_SEP2006
#define BUILD_DATE "Sep 21 2006"
#define BUILD_TIME "14:32:13"
#define BUILD_DATE "Sep 7 2006"
#define BUILD_TIME "07:20:50"
#endif
#ifdef SDK_AUG2010
@@ -143,7 +144,7 @@ static void DoReset() {
ASSERTLINE(589, 0 <= ResettingChan && ResettingChan < SI_MAX_CHAN);
chanBit = (PAD_CHAN0_BIT >> ResettingChan);
ResettingBits &= ~chanBit;
memset(&Origin[ResettingChan], 0, sizeof(PADStatus));
SIGetTypeAsync(ResettingChan, PADTypeAndStatusCallback);
}
@@ -221,7 +222,7 @@ static void PADProbeCallback(s32 chan, u32 error, OSContext* context) {
ASSERTLINE(740, 0 <= ResettingChan && ResettingChan < SI_MAX_CHAN);
ASSERTLINE(741, chan == ResettingChan);
ASSERTLINE(743, (Type[chan] & SI_WIRELESS_CONT_MASK) == SI_WIRELESS_CONT && !(Type[chan] & SI_WIRELESS_LITE));
if (!(error & (SI_ERROR_UNDER_RUN | SI_ERROR_OVER_RUN | SI_ERROR_NO_RESPONSE | SI_ERROR_COLLISION)))
{
PADEnable(ResettingChan);
@@ -381,7 +382,7 @@ BOOL PADInit() {
if (Initialized) {
return 1;
}
OSRegisterVersion(__PADVersion);
if (__PADSpec)
@@ -394,7 +395,7 @@ BOOL PADInit() {
__OSWirelessPadFixMode
= (u16)((((time)&0xffff) + ((time >> 16) & 0xffff) + ((time >> 32) & 0xffff) + ((time >> 48) & 0xffff))
& 0x3fffu);
RecalibrateBits = PAD_CHAN0_BIT | PAD_CHAN1_BIT | PAD_CHAN2_BIT | PAD_CHAN3_BIT;
}
@@ -416,7 +417,9 @@ u32 PADRead(PADStatus* status) {
u32 sr;
int chanShift;
u32 motor;
#if SDK_AUG2010
static PADStatus pre_status[4];
#endif
int threshold;
threshold = 3;
@@ -462,7 +465,7 @@ u32 PADRead(PADStatus* status) {
if (!(SIGetType(chan) & SI_GC_NOMOTOR)) {
motor |= chanBit;
}
if (!SIGetResponse(chan, &data)) {
status->err = PAD_ERR_TRANSFER;
memset(status, 0, offsetof(PADStatus, err));
@@ -470,7 +473,7 @@ u32 PADRead(PADStatus* status) {
status->err = PAD_ERR_TRANSFER;
memset(status, 0, offsetof(PADStatus, err));
} else {
MakeStatus(chan, status, data);
@@ -480,6 +483,7 @@ u32 PADRead(PADStatus* status) {
threshold = 3;
}
#if SDK_AUG2010
#ifdef __MWERKS__
#define abs(x) __abs(x)
#else
@@ -500,19 +504,20 @@ u32 PADRead(PADStatus* status) {
#undef abs
memcpy(&pre_status[chan], status, sizeof(PADStatus));
#endif
// Check and clear PAD_ORIGIN bit
if (status->button & 0x2000) {
status->err = PAD_ERR_TRANSFER;
memset(status, 0, offsetof(PADStatus, err));
// Get origin. It is okay if the following transfer fails
// since the PAD_ORIGIN bit remains until the read origin
// command complete.
SITransfer(chan, &CmdReadOrigin, 1, &Origin[chan], 10, PADOriginUpdateCallback, 0);
} else {
status->err = PAD_ERR_NONE;
// Clear PAD_INTERFERE bit
status->button &= ~0x0080;
}
@@ -690,6 +695,10 @@ static u8 ClampU8(u8 var, u8 org) {
}
static void SPEC2_MakeStatus(s32 chan, PADStatus* status, u32 data[2]) {
#if !SDK_AUG2010 || VERSION == VERSION_SHIELD
static PADStatus pre_status[4];
#endif
s32 threshold;
PADStatus* origin;
status->button = (u16)((data[0] >> 16) & PAD_ALL);
@@ -765,6 +774,29 @@ static void SPEC2_MakeStatus(s32 chan, PADStatus* status, u32 data[2]) {
status->substickY = ClampS8(status->substickY, origin->substickY);
status->triggerLeft = ClampU8(status->triggerLeft, origin->triggerLeft);
status->triggerRight = ClampU8(status->triggerRight, origin->triggerRight);
#if !SDK_AUG2010
#ifdef __MWERKS__
#define abs(x) __abs(x)
#else
#define abs(x) __builtin_abs(x)
#endif
threshold = 9;
if (abs(status->stickX * status->stickX - pre_status[chan].stickX * pre_status[chan].stickX) >= threshold ||
abs(status->stickY * status->stickY - pre_status[chan].stickY * pre_status[chan].stickY) >= threshold ||
abs(status->substickX * status->substickX - pre_status[chan].substickX * pre_status[chan].substickX) >= threshold ||
abs(status->substickY * status->substickY - pre_status[chan].substickY * pre_status[chan].substickY) >= threshold ||
abs(status->triggerLeft * status->triggerLeft - pre_status[chan].triggerLeft * pre_status[chan].triggerLeft) >= threshold ||
abs(status->triggerRight * status->triggerRight - pre_status[chan].triggerRight * pre_status[chan].triggerRight) >= threshold ||
pre_status[chan].button != status->button) {
__VIResetSIIdle();
}
memcpy(&pre_status[chan], status, sizeof(PADStatus));
#endif
#undef abs
}
int PADGetType(s32 chan, u32* type) {
@@ -889,6 +921,6 @@ BOOL PADIsBarrel(s32 chan) {
if (BarrelBits & (PAD_CHAN0_BIT >> chan)) {
return TRUE;
}
return FALSE;
}
+37
View File
@@ -0,0 +1,37 @@
#include <revolution/tpl.h>
#include <revolution/os.h>
void TPLBind(TPLPalettePtr ptr) {
u16 i;
if (ptr->versionNumber != 2142000) {
OSPanic(__FILE__, 0x19, "invalid version number for texture palette");
}
ptr->descriptorArray = (TPLDescriptorPtr)(((u32)(ptr->descriptorArray)) + ((u32)ptr));
for (i = 0; i < ptr->numDescriptors; i++) {
if (ptr->descriptorArray[i].textureHeader) {
ptr->descriptorArray[i].textureHeader = (TPLHeaderPtr)(((u32)(ptr->descriptorArray[i].textureHeader)) + ((u32)ptr));
if (!ptr->descriptorArray[i].textureHeader->unpacked) {
ptr->descriptorArray[i].textureHeader->data = (char*)((u32)(ptr->descriptorArray[i].textureHeader->data) + (u32)ptr);
ptr->descriptorArray[i].textureHeader->unpacked = 1;
}
}
if (ptr->descriptorArray[i].CLUTHeader) {
ptr->descriptorArray[i].CLUTHeader = (TPLClutHeaderPtr)((u32)(ptr->descriptorArray[i].CLUTHeader) + (u32)ptr);
if (!ptr->descriptorArray[i].CLUTHeader->unpacked) {
ptr->descriptorArray[i].CLUTHeader->data = (char*)((u32)(ptr->descriptorArray[i].CLUTHeader->data) + (u32)ptr);
ptr->descriptorArray[i].CLUTHeader->unpacked = 1;
}
}
}
}
TPLDescriptorPtr TPLGet(TPLPalettePtr ptr, u32 id) {
id %= ptr->numDescriptors;
return &ptr->descriptorArray[id];
}