From d54860ae38d3188ece2bb44a037267d2cac10468 Mon Sep 17 00:00:00 2001 From: jbo-85 <1428333+jbo-85@users.noreply.github.com> Date: Mon, 14 Mar 2022 01:09:52 +0100 Subject: [PATCH 1/3] sfc: Add database entry for the "Super FX voxel demo" to specify a RAM size of 64k instead of 32k Support ROM/RAM addressing for Super FX ROMs that are not a power of 2 fixes 123 --- bsnes/Database/Super Famicom.bml | 24 ++++++++++++++++++++++++ bsnes/sfc/coprocessor/superfx/memory.cpp | 12 ++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/bsnes/Database/Super Famicom.bml b/bsnes/Database/Super Famicom.bml index 6567fc09e..3dd5a0f71 100644 --- a/bsnes/Database/Super Famicom.bml +++ b/bsnes/Database/Super Famicom.bml @@ -30,6 +30,30 @@ game size: 0x80000 content: Program +//Prototypes (USA) + +database + revision: 2022-03-14 + +game + sha256: 4362afe51da8a01a67a1c2d6c2545d9e7cbaf8c42fd8f319dd8b61fe328512e1 + name: Super FX voxel demo + title: Super FX voxel demo + label: Voxels in progress + region: USA + revision: 1.0 + board: GSU-RAM + memory + type: ROM + size: 0x60000 + content: Program + memory + type: RAM + size: 0x10000 + content: Save + oscillator + frequency: 21440000 + //Super Comboy (KOR) database diff --git a/bsnes/sfc/coprocessor/superfx/memory.cpp b/bsnes/sfc/coprocessor/superfx/memory.cpp index 01a8c8210..f002a9cf8 100644 --- a/bsnes/sfc/coprocessor/superfx/memory.cpp +++ b/bsnes/sfc/coprocessor/superfx/memory.cpp @@ -1,29 +1,32 @@ auto SuperFX::read(uint addr, uint8 data) -> uint8 { if((addr & 0xc00000) == 0x000000) { //$00-3f:0000-7fff,:8000-ffff + addr = Bus::mirror(addr, rom.size()); while(!regs.scmr.ron) { step(6); synchronizeCPU(); if(synchronizing()) break; } - return rom.read((((addr & 0x3f0000) >> 1) | (addr & 0x7fff)) & romMask); + return rom.read((((addr & 0x3f0000) >> 1) | (addr & 0x7fff))); } if((addr & 0xe00000) == 0x400000) { //$40-5f:0000-ffff + addr = Bus::mirror(addr, rom.size()); while(!regs.scmr.ron) { step(6); synchronizeCPU(); if(synchronizing()) break; } - return rom.read(addr & romMask); + return rom.read(addr); } if((addr & 0xe00000) == 0x600000) { //$60-7f:0000-ffff + addr = Bus::mirror(addr, ram.size()); while(!regs.scmr.ran) { step(6); synchronizeCPU(); if(synchronizing()) break; } - return ram.read(addr & ramMask); + return ram.read(addr); } return data; @@ -31,12 +34,13 @@ auto SuperFX::read(uint addr, uint8 data) -> uint8 { auto SuperFX::write(uint addr, uint8 data) -> void { if((addr & 0xe00000) == 0x600000) { //$60-7f:0000-ffff + addr = Bus::mirror(addr, ram.size()); while(!regs.scmr.ran) { step(6); synchronizeCPU(); if(synchronizing()) break; } - return ram.write(addr & ramMask, data); + return ram.write(addr, data); } } From 1cfd9c6a5da380386f7947e82a21ff4e1b221ad6 Mon Sep 17 00:00:00 2001 From: jbo-85 <1428333+jbo-85@users.noreply.github.com> Date: Tue, 31 May 2022 02:00:16 +0200 Subject: [PATCH 2/3] sfc: Fix regression with several SuperFX games like Doom --- bsnes/sfc/coprocessor/superfx/memory.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bsnes/sfc/coprocessor/superfx/memory.cpp b/bsnes/sfc/coprocessor/superfx/memory.cpp index f002a9cf8..71b6f2e1d 100644 --- a/bsnes/sfc/coprocessor/superfx/memory.cpp +++ b/bsnes/sfc/coprocessor/superfx/memory.cpp @@ -1,12 +1,13 @@ auto SuperFX::read(uint addr, uint8 data) -> uint8 { if((addr & 0xc00000) == 0x000000) { //$00-3f:0000-7fff,:8000-ffff - addr = Bus::mirror(addr, rom.size()); while(!regs.scmr.ron) { step(6); synchronizeCPU(); if(synchronizing()) break; } - return rom.read((((addr & 0x3f0000) >> 1) | (addr & 0x7fff))); + addr = (((addr & 0x3f0000) >> 1) | (addr & 0x7fff)); + addr = Bus::mirror(addr, rom.size()); + return rom.read(addr); } if((addr & 0xe00000) == 0x400000) { //$40-5f:0000-ffff From 8c46f119b95f0b452f1b01b10fa69c91d7344932 Mon Sep 17 00:00:00 2001 From: jbo-85 <1428333+jbo-85@users.noreply.github.com> Date: Mon, 5 Sep 2022 05:12:02 +0200 Subject: [PATCH 3/3] sfc: revert RAM changes, since RAM is always a power of two, thanks carmiker --- bsnes/sfc/coprocessor/superfx/memory.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bsnes/sfc/coprocessor/superfx/memory.cpp b/bsnes/sfc/coprocessor/superfx/memory.cpp index 71b6f2e1d..58a54df29 100644 --- a/bsnes/sfc/coprocessor/superfx/memory.cpp +++ b/bsnes/sfc/coprocessor/superfx/memory.cpp @@ -21,13 +21,12 @@ auto SuperFX::read(uint addr, uint8 data) -> uint8 { } if((addr & 0xe00000) == 0x600000) { //$60-7f:0000-ffff - addr = Bus::mirror(addr, ram.size()); while(!regs.scmr.ran) { step(6); synchronizeCPU(); if(synchronizing()) break; } - return ram.read(addr); + return ram.read(addr & ramMask); } return data; @@ -35,13 +34,12 @@ auto SuperFX::read(uint addr, uint8 data) -> uint8 { auto SuperFX::write(uint addr, uint8 data) -> void { if((addr & 0xe00000) == 0x600000) { //$60-7f:0000-ffff - addr = Bus::mirror(addr, ram.size()); while(!regs.scmr.ran) { step(6); synchronizeCPU(); if(synchronizing()) break; } - return ram.write(addr, data); + return ram.write(addr & ramMask, data); } }