add playback console codes for testing ecb crash

This commit is contained in:
Jas Laferriere
2022-10-12 21:34:18 -04:00
parent f31edc158a
commit 33c04289e7
10 changed files with 512 additions and 491 deletions

1
.gitignore vendored
View File

@@ -221,6 +221,7 @@ pip-log.txt
.vscode
Output/Console/install.bat
Output/Netplay/install.bat
Output/Netplay/build-netplay.bat - Shortcut.lnk
Output/Playback/install.bat

View File

@@ -50,460 +50,88 @@ C225B8BC 00000002 #External/LRAStart From SSS Goes to CSS/LRAStart From SSS Goes
88630000 00000000
043D4A70 00000000 #External/Rumble Off/Rumble Off.asm
$Slippi Recording [Fizzi, Achilles, UnclePunch, Nikki, jmlee337, Krohnos]
*Used in conjunction with Slippi plugged into PortB to extract game data
040679BC 38802600 #Recording/ExtendPlayerBlock.asm
C23219EC 0000001D #Recording/FlushFrameBuffer.asm
7C0802A6 90010004
9421FF20 BE8100B0
3D808000 618C5604
$Required: Slippi Playback [Fizzi, UnclePunch, Achilles, tauKhan, Krohnos]
*Used to play back a .slp file
*Will play replay configured in playback.txt
C216D298 00000011 #PlaybackConsole/Core/FetchGameFrame.asm
881F0008 2C000000
40820074 7C0802A6
90010004 9421FF20
BE8100B0 806DB64C
83630000 38600076
987B0000 806DB654
907B0001 7F63DB78
38800005 38A00001
3D808000 618C55F0
7D8903A6 4E800421
2C030000 418200A8
806DB64C 83C30000
83ADB650 7F9EEA14
2C1D0000 41820090
3860003C 987C0000
806DB654 907C0001
3C608048 80639D30
5463443E 2C030208
806DB654 4082003C
80ADB61C 88850010
2C040000 4082002C
8885000F 2C040000
40820020 80850909
3884FF85 80E50916
7C872050 7C041800
40800008 7C832378
907C0005 3BBD0009
7FC3F378 7FA4EB78
38A00001 3D808000
7F63DB78 38800065
38A00000 3D808000
618C55F0 7D8903A6
4E800421 38600000
906DB650 BA8100B0
4E800421 BA8100B0
800100E4 382100E0
7C0803A6 8001001C
7C0803A6 881F0008
60000000 00000000
C216D884 00000030 #Recording/SendGameEnd.asm
C206B0DC 0000001D #PlaybackConsole/Core/RestoreGameFrame.asm
7C0802A6 90010004
9421FF20 BE8100B0
3D808000 618C5604
8BBF000C 7FA3EB78
3D808003 618C1724
7D8903A6 4E800421
2C030000 41820144
3F208046 6339B6A0
8B590008 2C1A0000
41820130 830DB64C
88780004 2C030000
40820120 3C608048
80639D30 5463443E
2C030208 4082001C
2C1A0002 40820014
806DB61C 8863000F
2C030000 418200F4
83B80000 38600039
987D0000 9B5D0001
2C1A0007 4082000C
88790001 48000008
3860FFFF 987D0002
3E808047 62949DA4
7E83A378 3C808046
6084B8EC 38A02278
3D808000 618C31F4
7D8903A6 4E800421
3C808046 6084B6A0
7E83A378 880424D0
98030006 88040008
98030004 3D808016
618C6378 7D8903A6
4E800421 3AA00000
7EA3AB78 48000041
38950003 7C64E9AE
3AB50001 2C150003
4081FFE8 7FA3EB78
38800007 38A00001
3D808000 618C55F0
7D8903A6 4E800421
38600001 98780004
48000030 3D808047
618C9DA4 1D6300A8
7D6B6214 886B0058
2C030003 4182000C
886B005E 48000008
3860FFFF 4E800020
BA8100B0 800100E4
382100E0 7C0803A6
819F2514 00000000
C216E74C 000000FC #Recording/SendGameInfo.asm
7C0802A6 90010004
9421FF20 BE8100B0
3D808000 618C5604
7D8903A6 4E800421
2C030000 418207A0
38600005 3D808037
618CF1E4 7D8903A6
4E800421 7C7B1B78
936DB64C 38800005
3D808000 618CC160
7D8903A6 4E800421
3860072A 3D808037
618CF1E4 7D8903A6
4E800421 7C7E1B78
93DB0000 38600000
906DB650 3C608000
60635600 80630000
38630008 38800000
3D808000 618C55FC
7D8903A6 4E800421
7C7C1B78 38600035
987E0000 3860001C
987E0001 38600036
987E0002 386002BD
B07E0003 38600037
987E0005 3860003F
B07E0006 38600038
987E0008 38600050
B07E0009 38600039
987E000B 38600006
B07E000C 3860003A
987E000E 3860000C
B07E000F 3860003B
987E0011 3860002A
B07E0012 3860003C
987E0014 38600008
B07E0015 3860003D
987E0017 B39E0018
38600010 987E001A
38600204 B07E001B
38600036 987E001D
3C60030D 60630000
907E001E 387E0022
7FE4FB78 38A00138
3D808000 618C31F4
7D8903A6 4E800421
387E0062 3880001C
3D808000 618CC160
7D8903A6 4E800421
387E0022 3AA30060
3A800000 1ED40024
7ED6AA14 88760001
2C030000 40820034
88760000 2C030012
40820028 3C60804C
606320BC 1C940044
7C632214 80630000
546005EF 4182000C
38600013 98760000
3A940001 2C140004
4180FFB4 387E0022
3AA30060 3A800000
1ED40024 7ED6AA14
88760001 2C030000
4082002C 88760000
3D808016 618C9238
7D8903A6 4E800421
88960003 7C041800
4081000C 38600000
98760003 3A940001
2C140004 4180FFBC
3C60804D 80635F90
907E015A 3A82F228
3AA00000 3ADE015E
1EF50008 38600001
7C76B92E 3AF70004
7C76B92E 3AB50001
2C150004 4180FFE4
3A800000 3ABF0060
3AFE017E 1F140010
7F18BA14 1ED40024
7ED6AA14 88760001
2C030000 40820040
8876000A 2C030078
41820034 3D808023
618C754C 7D8903A6
4E800421 7C641B78
7F03C378 38A00010
3D808000 618C31F4
7D8903A6 4E800421
4800001C 7F03C378
38800010 3D808000
618CC160 7D8903A6
4E800421 3A940001
2C140004 4180FF88
8862F234 987E01BE
8862F23C 987E01BF
3C608048 80639D30
5463443E B07E01C0
3C608048 80639D30
5463443E 2C030208
40820190 38600000
3D808000 618C5610
7D8903A6 4E800421
7C791B78 3A800000
3ABF0060 3AFE01C2
3B590034 1C74001F
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
1C74001F 7C83D214
7F03C378 38A0001F
3D808000 618C31F4
7D8903A6 4E800421
4800001C 7F03C378
3880001F 3D808000
618CC160 7D8903A6
4E800421 3A940001
2C140004 4180FFA0
3A800000 3ABF0060
3AFE023E 3B5900CF
1C74000A 7F03BA14
1ED40024 7ED6AA14
88760001 2C030000
40820028 1C74000A
7C83D214 7F03C378
38A0000A 3D808000
618C31F4 7D8903A6
4E800421 4800001C
7F03C378 3880000A
3D808000 618CC160
7D8903A6 4E800421
3A940001 2C140004
4180FFA0 3A800000
3ABF0060 3AFE0266
3B5900F7 1C74001D
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
1C74001D 7C83D214
7F03C378 38A0001D
3D808000 618C31F4
7D8903A6 4E800421
4800001C 7F03C378
3880001D 3D808000
618CC160 7D8903A6
4E800421 3A940001
2C140004 4180FFA0
7F23CB78 3D808037
618CF1B0 7D8903A6
4E800421 4800001C
387E01C2 38800118
3D808000 618CC160
7D8903A6 4E800421
3D808000 618CADF4
7D8903A6 4E800421
987E02DA 7FC3F378
388002DB 38A00001
3D808000 618C55F0
7D8903A6 4E800421
38600205 3D808037
618CF1E4 7D8903A6
4E800421 7C751B78
3C608000 60635600
80630000 3AE30008
38600010 98750000
3860003D 98750203
38600200 B0750201
38600000 98750204
3AC00000 7C76E050
2C030200 41810010
B0750201 38600001
98750204 38750001
7EE4BB78 7C84B214
A0B50201 3D808000
618C31F4 7D8903A6
4E800421 7EA3AB78
38800205 38A00001
3D808000 618C55F0
7D8903A6 4E800421
3AD60200 7C16E000
4180FFA4 7EA3AB78
3D808037 618CF1B0
7D8903A6 4E800421
38600004 38800007
38A00000 3D808039
618C01F0 7D8903A6
4E800421 48000021
7C8802A6 38A00000
3D808038 618CFD54
7D8903A6 4E800421
48000070 4E800021
7C0802A6 90010004
9421FF20 BE8100B0
806DB64C 83A30000
838DB650 7FBDE214
3860003A 987D0000
806DB654 907D0001
3C60804D 80635F90
907D0005 3C608048
80639D60 907D0009
838DB650 3B9C000D
938DB650 BA8100B0
800100E4 382100E0
7C0803A6 4E800020
38600004 38800007
38A00000 3D808039
618C01F0 7D8903A6
4E800421 48000021
7C8802A6 38A0000F
3D808038 618CFD54
7D8903A6 4E800421
48000124 4E800021
7C0802A6 90010004
9421FF20 BE8100B0
806DB64C 83E30000
83CDB650 7FFFF214
3B600000 806DC18C
83A30024 2C1D0000
418200D8 3B7B0001
2C1B000F 418100CC
839D002C 3860003B
987F0000 806DB654
907F0001 807C0010
B07F0005 807C0024
987F0007 807C002C
907F0008 807C0040
907F000C 807C0044
907F0010 807C004C
907F0014 807C0050
907F0018 807C0C9C
B07F001C 807C0D44
907F001E 807C001C
907F0022 887C0DD7
987F0026 887C0DDB
987F0027 887C0DEB
987F0028 887C0DEF
987F0029 807C0518
2C030000 41820018
8063002C 2C030000
4182000C 8863000C
48000008 3860FFFF
987F002A 83CDB650
3BDE002B 93CDB650
3BFF002B 83BD0008
2C1D0000 4082FF30
BA8100B0 800100E4
382100E0 7C0803A6
4E800020 BA8100B0
800100E4 382100E0
7C0803A6 3C608017
60000000 00000000
C206DA34 00000036 #Recording/SendGamePostFrame.asm
7C0802A6 90010004
9421FF20 BE8100B0
3D808000 618C5604
7D8903A6 4E800421
2C030000 41820170
887F221F 546306F7
40820164 8B7F000C
806DB64C 83A30000
838DB650 7FBDE214
38600038 987D0000
806DB654 907D0001
9B7D0005 7FE3FB78
7C7C1B78 832DB64C
83790000 7FE3FB78
3D808000 618C55F8
7D8903A6 4E800421
987D0006 807F0004
987D0007 807F0010
B07D0008 807F00B0
907D000A 807F00B4
907D000E 807F002C
907D0012 807F1830
907D0016 807F1998
907D001A 807F208C
987D001E A07F2090
987D001F 807F18C4
987D0020 7F63DB78
3D808003 618C3BD8
7D8903A6 4E800421
987D0021 807F0894
907D0022 887F2218
987D0026 887F221A
987D0027 887F221B
987D0028 887F221C
987D0029 887F221F
987D002A 807F2340
907D002B 807F00E0
987D002F 807F083C
B07D0030 887F1968
809F0168 7C632050
987D0032 887F25FF
987D0033 807F1988
2C030000 40820008
807F198C 987D0034
807F0080 907D0035
807F0084 907D0039
807F008C 907D003D
807F0090 907D0041
807F00EC 907D0045
807F195C 907D0049
807F0014 907D004D
838DB650 3B9C0051
938DB650 BA8100B0
800100E4 382100E0
7C0803A6 8001001C
60000000 00000000
C206B0DC 0000002B #Recording/SendGamePreFrame.asm
2C030000 40820084
389B0001 88BF000C
1CA50019 7F442A14
807A0000 907F0620
807A0004 907F0624
807A0008 907F0638
807A000C 907F063C
807A0010 907F0650
807A0014 907F065C
3C608046 6063B108
3C80804C 60841F78
88840001 3884FFFF
2C040000 40A00008
38840005 1C840030
7C632214 889F0618
1C84000C 7E832214
887A0018 98740002
BA8100B0 800100E4
382100E0 7C0803A6
881F2219 00000000
C216E74C 0000001E #PlaybackConsole/Core/RestoreGameInfo.asm
7C0802A6 90010004
9421FF20 BE8100B0
3D808000 618C5604
386005EC 3D808037
618CF1E4 7D8903A6
4E800421 7C7C1B78
938DB64C 388005EC
3D808000 618CC160
7D8903A6 4E800421
2C030000 41820118
8B7F000C 806DB64C
83A30000 838DB650
7FBDE214 38600037
987D0000 806DB654
907D0001 9B7D0005
7FE3FB78 3D808000
618C55F8 7D8903A6
4E800421 987D0006
3C60804D 80635F90
907D0007 807F0010
B07D000B 807F00B0
907D000D 807F00B4
907D0011 807F002C
907D0015 807F0620
907D0019 807F0624
907D001D 807F0638
907D0021 807F063C
907D0025 807F0650
907D0029 807F065C
907D002D 3C60804C
60631FAC 1C9B0044
7C832214 A0640002
B07D0031 80640030
907D0033 80640034
907D0037 3C608046
6063B108 3C80804C
60841F78 88840001
3884FFFF 2C040000
40A00008 38840005
1C840030 7C632214
1C9B000C 7C632214
88630002 987D003B
807F1830 907D003C
838DB650 3B9C0040
938DB650 BA8100B0
800100E4 382100E0
7C0803A6 881F2219
60000000 00000000
C2005604 0000000A #Recording/ShouldRecord.asm
3C608048 80639D30
5463443E 2C030202
4182002C 2C030302
41820024 2C030208
4182001C 2C03010F
41820014 2C030120
4182000C 38600000
4800000C 38600001
48000004 4E800020
60000000 00000000
C208D698 00000005 #Recording/GetLCancelStatus/GetLCancelStatus.asm
7C050000 4080000C
38E00001 48000008
38E00002 8103002C
98E825FF 7C050000
60000000 00000000
C206C324 00000002 #Recording/GetLCancelStatus/ResetLCancelStatus.asm
38600000 987E25FF
807E00B0 00000000
38600221 3D808037
618CF1E4 7D8903A6
4E800421 7C7E1B78
93DC0000 38600080
3D808037 618CF1E4
7D8903A6 4E800421
907C0004 38600075
987E0000 387C001C
907E0001 38600553
907E0005 38600000
907E0009 7FC3F378
3880000D 38A00001
3D808000 618C55F0
7D8903A6 4E800421
7FC3F378 38800221
38A00000 3D808000
618C55F0 7D8903A6
4E800421 807E0001
3C80804D 90645F90
BA8100B0 800100E4
382100E0 7C0803A6
3C608017 00000000
C20055F8 0000000F #Common/GetIsFollower.asm
7C0802A6 90010004
9421FF20 BE8100B0
@@ -620,41 +248,24 @@ C20055F0 0000002C #Common/EXITransferBuffer/EXITransferBuffer.asm
BA8100B0 800100E4
382100E0 7C0803A6
4E800020 00000000
C20055FC 00000021 #Common/Gecko/ProcessCodeList.asm
C209E090 00000011 #Common/FastForward/DynamicsFix.asm
807E0000 80630028
48000009 48000074
7C0802A6 90010004
9421FF20 BE8100B0
7C7D1B78 7C7A1B78
7C9E2378 3B800000
807D0000 5463463C
3B600008 3B200000
2C0300C0 41820044
2C0300C2 4182004C
2C030004 41820058
2C030006 41820058
2C030008 41820068
807D0000 5463213E
2C03000F 40820010
807D0004 2C030000
4182007C 4800004C
807D0004 1C630008
3B630008 4800003C
807D0004 1C630008
3B630008 3B200004
48000028 3B200004
48000020 807D0004
38630007 54630038
3B630008 833D0004
48000008 3B600010
3B9C0001 2C1E0000
4182001C 807D0000
5463463C 7FA4EB78
7F25CB78 7FC903A6
4E800421 7FBDDA14
4BFFFF38 7C7AE850
BA8100B0 800100E4
382100E0 7C0803A6
4E800020 00000000
04005600 801910E0 #Common/ConsoleOverrides/SetGeckoStart.asm
9421FFE8 93E10014
7C7F1B78 807F0014
54600211 40820020
54600673 41820018
7FE3FB78 3D808037
618C3078 7D8903A6
4E800421 807F0010
2C030000 41820008
4BFFFFB9 807F0008
2C030000 41820008
4BFFFFA9 83E10014
8001001C 38210018
7C0803A6 4E800020
BB010028 00000000
C20AC5B8 00000002 #Common/NanaDeterminism/NanaDeterminism.asm
7C7D1B78 3BC00000
60000000 00000000

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,71 @@
################################################################################
# Address: 8016d298
################################################################################
################################################################################
# Inject at address 8016d298
# Function is SceneThink_VSMode and we're calling FetchGameFrame to update
# the EXI buffer.
################################################################################
.include "Common/Common.s"
.include "PlaybackConsole/Playback.s"
# Register names
.set PlayerData,31
.set PlayerGObj,30
.set PlayerSlot,29
.set PlayerDataStatic,28
.set BufferPointer,27
.set PlayerBackup,26
.set FrameNumber,25
# debug flag
.set debugFlag,0
#First, check if game ended. This isn't really strictly required except that without
#it we try to fetch a frame that doesn't exist at the end of the game.
#That causes problems when mirroring because we haven't gotten a game
#end message yet so the game will have to hang temporarily before GAME can be
#shown
lbz r0, 0x0008 (r31)
cmpwi r0,0x0
bne Exit # r0 is 2 on successful game end
################################################################################
# subroutine: FetchGameFrame
# description: per frame function that will handle fetching the current frame's
# data and storing it to the buffer
################################################################################
FetchGameFrame:
backup
lwz r3,primaryDataBuffer(r13)
lwz BufferPointer,PDB_EXI_BUF_ADDR(r3)
FetchFrameInfo_REQUEST_DATA:
# request game information from slippi
li r3, CMD_GET_FRAME # store gameframe request ID
stb r3,0x0(BufferPointer)
lwz r3,frameIndex(r13) #get frame to request
stw r3,0x1(BufferPointer)
# Transfer buffer over DMA
mr r3,BufferPointer #Buffer Pointer
li r4,0x5 #Buffer Length
li r5,CONST_ExiWrite
branchl r12,FN_EXITransferBuffer
FetchFrameInfo_RECEIVE_DATA:
# Transfer buffer over DMA
mr r3,BufferPointer
li r4,Buffer_Length #Buffer Length
li r5,CONST_ExiRead
branchl r12,FN_EXITransferBuffer
FetchFrameInfo_Exit:
restore
#-----------------------------------------------
Exit:
# Original Codeline
lbz r0, 0x0008 (r31)

View File

@@ -0,0 +1,92 @@
################################################################################
# Address: 8006b0dc
################################################################################
.include "Common/Common.s"
.include "PlaybackConsole/Playback.s"
# Register names
.set PlayerData,31
.set PlayerGObj,30
.set PlayerSlot,29
.set PlayerDataStatic,28
.set BufferPointer,27
.set PlayerBackup,26
.set REG_PDB_ADDR,25
################################################################################
# subroutine: readInputs
# description: reads inputs from Slippi for a given frame and overwrites
# memory locations
################################################################################
# Create stack frame and store link register
backup
#------------- INITIALIZE -------------
# here we want to initalize some variables we plan on using throughout
lbz PlayerSlot,0xC(PlayerData) #loads this player slot
# Get address for static player block
mr r3,PlayerSlot
branchl r12, PlayerBlock_LoadStaticBlock
mr PlayerDataStatic,r3
# get buffer pointer
lwz REG_PDB_ADDR,primaryDataBuffer(r13)
lwz BufferPointer,PDB_EXI_BUF_ADDR(REG_PDB_ADDR)
#Check if this player is a follower
mr r3,PlayerData
branchl r12,FN_GetIsFollower
cmpwi r3, 0
bne Injection_Exit # Don't restore follower inputs
# Get players offset in buffer ()
addi r4,BufferPointer, GameFrame_Start #get to player frame data start
lbz r5,0xC(PlayerData) #get player number
mulli r5,r5,PlayerDataLength #get players offset
add PlayerBackup,r4,r5
CONTINUE_READ_DATA:
RestoreData:
# clogf "[P%d] %08X", "lbz r5,0xC(PlayerData)", "mr r6, PlayerBackup", "li r7, 1"
# Restore data
lwz r3,AnalogX(PlayerBackup)
stw r3,0x620(PlayerData) #analog X
lwz r3,AnalogY(PlayerBackup)
stw r3,0x624(PlayerData) #analog Y
lwz r3,CStickX(PlayerBackup)
stw r3,0x638(PlayerData) #cstick X
lwz r3,CStickY(PlayerBackup)
stw r3,0x63C(PlayerData) #cstick Y
lwz r3,Trigger(PlayerBackup)
stw r3,0x650(PlayerData) #trigger
lwz r3,Buttons(PlayerBackup)
stw r3,0x65C(PlayerData) #buttons
# UCF uses raw controller inputs for dashback, restore x analog byte here
load r3, 0x8046b108 # start location of circular buffer
# Get offset in raw controller input buffer
load r4, 0x804c1f78
lbz r4, 0x0001(r4) # this is the current index in the circular buffer
subi r4, r4, 1
cmpwi r4, 0
bge+ CONTINUE_RAW_X # if our index is already 0 or greater, continue
addi r4, r4, 5 # here our index was -1, this should wrap around to be 4
CONTINUE_RAW_X:
mulli r4, r4, 0x30
add r3, r3, r4 # move to the correct start index for this index
# Get this players controller port
lbz r4,0x618(PlayerData)
mulli r4, r4, 0xc
add r20, r3, r4 # move to the correct player position
# Get backed up input value
lbz r3,AnalogRawInput(PlayerBackup)
stb r3, 0x2(r20) #store raw x analog
Injection_Exit:
restore #restore registers and lr
lbz r0, 0x2219(r31) #execute replaced code line

View File

@@ -0,0 +1,80 @@
################################################################################
# Address: 8016e74c
################################################################################
################################################################################
# Inject at address 8016e74c
# Function is StartMelee and we are loading game information right before
# it gets read to initialize the match
################################################################################
.include "Common/Common.s"
.include "PlaybackConsole/Playback.s"
# Register names
.set BufferPointer,30
.set REG_GeckoBuffer,29
.set REG_DirectoryBuffer,28
################################################################################
# subroutine: gameInfoLoad
# description: reads game info from slippi and loads those into memory
# addresses that will be used
################################################################################
# create stack frame and store link register
backup
# allocate memory for directory buffer
li r3, PDB_SIZE
branchl r12, HSD_MemAlloc
mr REG_DirectoryBuffer, r3
stw REG_DirectoryBuffer, primaryDataBuffer(r13) # Store directory buffer location
li r4, PDB_SIZE
branchl r12, Zero_AreaLength
# allocate memory for the gameframe buffer used here and in ReceiveGameFrame
li r3,EXIBufferLength
branchl r12, HSD_MemAlloc
mr BufferPointer,r3
stw BufferPointer,PDB_EXI_BUF_ADDR(REG_DirectoryBuffer)
# allocate memory for the Secondary Buffer used in RestoreStockSteal
li r3,128
branchl r12, HSD_MemAlloc
stw r3,PDB_SECONDARY_EXI_BUF_ADDR(REG_DirectoryBuffer)
# get the game info data
REQUEST_DATA:
# request game information from slippi
li r3,CMD_GET_GAME_INFO # store game info request ID
stb r3,0x0(BufferPointer)
# write memory locations to preserve when doing mem savestates
addi r3, REG_DirectoryBuffer, PDB_SFXDB_START
stw r3, 0x1(BufferPointer)
li r3, SFXDB_SIZE + 4 # include the latest frame which follows SFXDB
stw r3, 0x5(BufferPointer)
li r3, 0
stw r3, 0x9(BufferPointer)
# Transfer buffer over DMA
mr r3,BufferPointer #Buffer Pointer
li r4,0xD #Buffer Length
li r5,CONST_ExiWrite
branchl r12,FN_EXITransferBuffer
RECEIVE_DATA:
# Transfer buffer over DMA
mr r3,BufferPointer
li r4,GameInfoLength #Buffer Length
li r5,CONST_ExiRead
branchl r12,FN_EXITransferBuffer
READ_DATA:
lwz r3,InfoRNGSeed(BufferPointer)
lis r4, 0x804D
stw r3, 0x5F90(r4) #store random seed
# clogf "RNG Seed: %08X\n", "mr r5, 3"
Injection_Exit:
restore
lis r3, 0x8017 #execute replaced code line

161
PlaybackConsole/Playback.s Normal file
View File

@@ -0,0 +1,161 @@
################################################################################
# Static Function Locations
################################################################################
# Local functions (added by us). These must not interfere with the Functions
# in Common/Common.s
# None
################################################################################
# Const Definitions
################################################################################
.set CONST_FrameFetchResult_Wait, 0
.set CONST_FrameFetchResult_Continue, 1
.set CONST_FrameFetchResult_Terminate, 2
.set CONST_FrameFetchResult_FastForward, 3
################################################################################
# Command Bytes
################################################################################
.set CMD_GET_GAME_INFO, 0x75
.set CMD_GET_FRAME, 0x76
.set CMD_IS_REPLAY_READY, 0x88
.set CMD_IS_STOCK_STEAL,0x89
.set CMD_GET_GECKO_CODES,0x8A
################################################################################
# SFX Storage
################################################################################
.set MAX_SOUNDS_PER_FRAME, 0x10
.set SOUND_STORAGE_FRAME_COUNT, 7
.set SFXS_ENTRY_SOUND_ID, 0 # u16, ID of the sound played
.set SFXS_ENTRY_INSTANCE_ID, SFXS_ENTRY_SOUND_ID + 2 # u32
.set SFXS_ENTRY_SIZE, SFXS_ENTRY_INSTANCE_ID + 4
.set SFXS_LOG_INDEX, 0 # u8, Index where we are in the frame
.set SFXS_LOG_ENTRIES, SFXS_LOG_INDEX + 1 # SFXS_ENTRY_SIZE * MAX_SOUNDS_PER_FRAME
.set SFXS_LOG_SIZE, SFXS_LOG_ENTRIES + SFXS_ENTRY_SIZE * MAX_SOUNDS_PER_FRAME
.set SFXS_FRAME_PENDING_LOG, 0 # SFXS_LOG_SIZE
.set SFXS_FRAME_STABLE_LOG, SFXS_FRAME_PENDING_LOG + SFXS_LOG_SIZE # SFXS_LOG_SIZE
.set SFXS_FRAME_SIZE, SFXS_FRAME_STABLE_LOG + SFXS_LOG_SIZE
.set SFXDB_WRITE_INDEX, 0 # u8
.set SFXDB_FRAMES, SFXDB_WRITE_INDEX + 1 # SFXS_FRAME_SIZE * SOUND_STORAGE_FRAME_COUNT
.set SFXDB_SIZE, SFXDB_FRAMES + SFXS_FRAME_SIZE * SOUND_STORAGE_FRAME_COUNT
################################################################################
# Playback Directory Buffer
################################################################################
.set PDB_EXI_BUF_ADDR, 0x0 # u32
.set PDB_SECONDARY_EXI_BUF_ADDR, PDB_EXI_BUF_ADDR + 4 # u32
.set PDB_DYNAMIC_GECKO_ADDR, PDB_SECONDARY_EXI_BUF_ADDR + 4 # u32
.set PDB_RESTORE_BUF_SIZE, PDB_DYNAMIC_GECKO_ADDR + 4 # u32
.set PDB_RESTORE_BUF_ADDR, PDB_RESTORE_BUF_SIZE + 4 # u32
.set PDB_RESTORE_BUF_WRITE_POS, PDB_RESTORE_BUF_ADDR + 4 # u32
.set PDB_RESTORE_C2_BRANCH, PDB_RESTORE_BUF_WRITE_POS + 4 # u32
.set PDB_SFXDB_START, PDB_RESTORE_C2_BRANCH + 4 # SFXDB_SIZE
.set PDB_LATEST_FRAME, PDB_SFXDB_START + SFXDB_SIZE # u32, must follow SFXDB as it is preserved
.set PDB_SHOULD_RESYNC, PDB_LATEST_FRAME + 4 # bool
.set PDB_DISPLAY_NAMES, PDB_SHOULD_RESYNC + 1 # string (31)[4]
.set PDB_SIZE, PDB_DISPLAY_NAMES + 124
################################################################################
# Buffer Offsets
################################################################################
# buffer status
.set BufferStatus_Start,0x0
.set BufferStatus_Length,0x1
# buffer status offsets
.set BufferStatus_Status,0x0
# gameframe
.set GameFrame_Start, BufferStatus_Start + BufferStatus_Length
# per player offsets
.set PlayerDataLength,0x19
.set AnalogX,0x00
.set AnalogY,0x04
.set CStickX,0x08
.set CStickY,0x0C
.set Trigger,0x10
.set Buttons,0x14
.set AnalogRawInput,0x18
.set GameFrame_Length, PlayerDataLength * 4
.set Buffer_Length, GameFrame_Start + GameFrame_Length
################################################################################
# Game Info Buffer Offsets
################################################################################
.set SuccessBool,0x0
.set SuccessBool_Length,0x1
.set InfoRNGSeed,0x1
.set InfoRNGSeed_Length,0x4
.set MatchStruct,0x5
.set MatchStruct_Length,0x138
.set UCFToggles,0x13D
.set UCFToggles_Length,0x20
.set NametagData,0x15D
.set NametagData_Length,0x40
.set PALBool,0x19D
.set PALBool_Length,0x1
.set PSPreloadBool,0x19E
.set PSPreloadBool_Length,0x1
.set FrozenPSBool,0x19F
.set FrozenPSBool_Length,0x1
.set ShouldResyncBool,0x1A0
.set ShouldResyncBool_Length,0x1
.set DisplayNameData,0x1A1
.set DisplayNameData_Length,0x7C
.set GeckoListSize,0x21D
.set GeckoListSize_Length,0x4
.set GameInfoLength, SuccessBool_Length + InfoRNGSeed_Length + MatchStruct_Length + UCFToggles_Length + NametagData_Length + PALBool_Length + PSPreloadBool_Length + FrozenPSBool_Length + ShouldResyncBool_Length + DisplayNameData_Length + GeckoListSize_Length
.if GameInfoLength > Buffer_Length
.set EXIBufferLength, GameInfoLength
.else
.set EXIBufferLength, Buffer_Length
.endif
.macro clogf str, arg1="nop", arg2="nop", arg3="nop", arg4="nop", arg5="nop", arg6="nop"
b 1f
0:
blrl
.string "\str"
.align 2
1:
backupall
# Set up args to log
\arg1
\arg2
\arg3
\arg4
\arg5
\arg6
lwz r3,primaryDataBuffer(r13)
lwz r3,PDB_SECONDARY_EXI_BUF_ADDR(r3)
addi r3, r3, 1
bl 0b
mflr r4
crset 6
branchl r12, 0x80323cf4 # sprintf
lwz r3,primaryDataBuffer(r13)
lwz r3,PDB_SECONDARY_EXI_BUF_ADDR(r3)
li r4, 0xD0
stb r4, 0(r3)
li r4, 128 # Length of buf
li r5, CONST_ExiWrite
branchl r12, FN_EXITransferBuffer
restoreall
.endm

10
build-console.bat Normal file
View File

@@ -0,0 +1,10 @@
@echo off
echo Building console_core.json for Port A...
gecko build -c console_core.json -defsym "STG_EXIIndex=0" -o "Output/Console/g_core_porta.bin"
echo.
echo Building console_core.json...
gecko build -c console_core.json -defsym "STG_EXIIndex=1" -o "Output/Console/g_core.bin"
echo.
pause

View File

@@ -119,24 +119,23 @@
]
},
{
"name": "Slippi Recording",
"name": "Required: Slippi Playback",
"authors": [
"Fizzi",
"Achilles",
"UnclePunch",
"Nikki",
"jmlee337",
"Achilles",
"tauKhan",
"Krohnos"
],
"description": [
"Used in conjunction with Slippi plugged into PortB to extract game data"
"Used to play back a .slp file",
"Will play replay configured in playback.txt"
],
"build": [
{
"type": "injectFolder",
"sourceFolder": "Recording",
"isRecursive": true,
"annotation": "Slippi Recording [Fizzi, Achilles, UnclePunch]"
"sourceFolder": "PlaybackConsole/Core",
"isRecursive": true
},
{
"type": "injectFolder",
@@ -168,13 +167,9 @@
},
{
"type": "injectFolder",
"sourceFolder": "Common/Gecko",
"annotation": "Static function to process Gecko codes [Fizzi]"
},
{
"type": "injectFolder",
"sourceFolder": "Common/ConsoleOverrides",
"annotation": "Forces values for proper console operation [Fizzi]"
"sourceFolder": "Common/FastForward",
"isRecursive": true,
"annotation": "Functions for supporting FFW [Fizzi, Unclepunch]"
},
{
"type": "injectFolder",