Hey yann, I took a swing at it. All the addresses are in SNES memory format. Use Lunar Address LoROM 00:8000 to convert the ROM addresses to file addresses if needed.
It does use the decompression routine at $00:8B48. I CPU log to a file (trace once is set) during the screen change. Then search the log for "JSL $008B48" to see each time something is decompressed. I found 4 or 5 calls before the "WIN" screen shows up. I made a savestate after running each call to see which one decompresses the graphics we need, and looked at the WRAM using vSNES. The 4th decompression call put the graphics into WRAM.
It looks like code will set up addresses before calling the decompression routine.
-destination bank $7E-
$0A/A663 A9 7E LDA #$7E
$0A/A665 85 5A STA $5A [$00:005A]
-source address $07:A000-
$0A/A667 A9 07 LDA #$07
$0A/A669 F4 00 A0 PEA $A000
-destination $4000-
$0A/A66C F4 00 40 PEA $4000
$0A/A66F 22 48 8B 00 JSL $008B48[$00:8B48]
The source ROM address is $07:A000, destination WRAM address is $7E:4000.
I just used vSNES to see how big the graphics are, they take up $4000 bytes. I used Snes9X "Show Hex" and set the range to RAM, $7E4000 $7E7FFF, then press Dump and it saves the uncompressed graphics.
To hijack the decompression call we also NOP over the two PEA (Push Effective Absolute address) codes before the jump. They push onto the stack, the decompression code pulls them off. Since we skip the decompression code, these pushes corrupt the stack and the game crashes.
$0A/A669 F4 00 A0 PEA $A000
$0A/A66C F4 00 40 PEA $4000
$0A/A66F 22 48 8B 00 JSL $008B48[$00:8B48]
becomes
org $0AA669 ;hijack original decompression call
NOP #3 ;blank out the stack push (PEA $A000)
NOP #3 ;blank out the stack push (PEA $4000)
JSL skip_ending_sequence_decompress
We could leave the PEA, PEA, but we would need PLA, PLA in our copy routine.
Even easier right after the decompression call, the code copies the data from WRAM to VRAM. By simply changing the address, it'll copy straight from ROM into VRAM for you.
$0A/A687 BF 00 40 7E LDA $7E4000,x[$7E:4000]
$0A/A68B 8D 18 21 STA $2118 [$03:2118]
$0A/A68E E8 INX
$0A/A68F BF 00 40 7E LDA $7E4000,x[$7E:4001]
$0A/A693 8D 19 21 STA $2119 [$03:2119]
$0A/A696 E8 INX
$0A/A697 E0 00 40 CPX #$4000
$0A/A69A D0 EB BNE $EB [$A687]
so it could be as simple as
;xkas v0.06
lorom
org $1FFFFF ;pad to 1 mbit
db $00
org $0AA669 ;hijack original decompression call
NOP #3 ;blank out the stack push (PEA $A000)
NOP #3 ;blank out the stack push (PEA $4000)
NOP #4 ;blank out the decompression call
org $0AA687
LDA ending_sequence,x ;load ROM source for VRAM copy
org $0AA68F
LDA ending_sequence,x ;load ROM source for VRAM copy
;===============================
;beginning of expanded ROM space
;===============================
org $108000
ending_sequence:
incbin soccer.RAM.7e4000-7e7fff.dump.bin
Here's the files plus an ips.
https://files.catbox.moe/duoaet.zip