Skip to content

fc: Initial GDB server support. #1231

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ares/component/processor/mos6502/mos6502.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ struct MOS6502 {
virtual auto write(n16 addr, n8 data) -> void = 0;
virtual auto lastCycle() -> void = 0;
virtual auto nmi(n16& vector) -> void = 0;
virtual auto debugAddress(n16 address) -> n32 { return address; }
virtual auto readDebugger(n16 addr) -> n8 { return 0; }

//mos6502.cpp
Expand Down
21 changes: 21 additions & 0 deletions ares/fc/cartridge/board/action53.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,27 @@ struct Action53 : Interface {
}
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;

n32 result;
n8 programBankMask = (1 << programBankWidth) - 1;
if (programBankMode < 2) {
n8 outerBank = programOuterBank & ~programBankMask;
n8 innerBank = programBank & programBankMask;
result = (outerBank | innerBank) << 16;
} else {
n9 outerBank = (programOuterBank & ~programBankMask) << 1;
n9 innerBank = programBank & ((2 << programBankWidth) - 1);
n9 offset = (address >> 14) & 1;
if(offset == (programBankMode & 1))
result = programOuterBank << 16;
else
result = (outerBank | innerBank) << 16;
}
return (result | (n16)address) & ((bit::round(programROM.size()) << 1) - 1);
}

inline auto addressCIRAM(n32 address) -> n11 {
if(mirror) {
return ((address >> nametableBank) & 0x0400) | (n10)address;
Expand Down
1 change: 1 addition & 0 deletions ares/fc/cartridge/board/board.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ struct Interface {

virtual auto readPRG(n32 address, n8 data) -> n8 { return data; }
virtual auto writePRG(n32 address, n8 data) -> void {}
virtual auto debugAddress(n32 address) -> n32 { return address; }

virtual auto readCHR(n32 address, n8 data) -> n8 { return data; }
virtual auto writeCHR(n32 address, n8 data) -> void {}
Expand Down
5 changes: 5 additions & 0 deletions ares/fc/cartridge/board/gtrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ struct GTROM : Interface {
}
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;
return (programBank << 16 | (n16)address) & ((bit::round(programROM.size()) << 1) - 1);
}

auto readCHR(n32 address, n8 data) -> n8 override {
if(address & 0x2000) return videoRAM.read(videoBank << 13 | (n13)address);
if(characterRAM) return characterRAM.read(characterBank << 13 | (n13)address);
Expand Down
5 changes: 5 additions & 0 deletions ares/fc/cartridge/board/hvc-axrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ struct HVC_AxROM : Interface {
mirror = data.bit(4);
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;
return (programBank << 16 | (n16)address) & ((bit::round(programROM.size()) << 1) - 1);
}

auto readCHR(n32 address, n8 data) -> n8 override {
if(address & 0x2000) return ppu.readCIRAM(mirror << 10 | (n10)address);
if(characterROM) return characterROM.read(address);
Expand Down
5 changes: 5 additions & 0 deletions ares/fc/cartridge/board/hvc-bnrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ struct HVC_BNROM : Interface {
programBank = data;
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;
return (programBank << 16 | (n16)address) & ((bit::round(programROM.size()) << 1) - 1);
}

auto readCHR(n32 address, n8 data) -> n8 override {
if(address & 0x2000) {
address = address >> !mirror & 0x0400 | (n10)address;
Expand Down
13 changes: 11 additions & 2 deletions ares/fc/cartridge/board/hvc-exrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ struct HVC_ExROM : Interface { //MMC5
return ramBank << 13 | (n13)address;
}

auto programRomAddress(n32 address) -> n32 {
auto programRomBank(n32 address) -> n8 {
n8 bank;

if(programMode == 0) {
Expand All @@ -216,7 +216,11 @@ struct HVC_ExROM : Interface { //MMC5
address &= 0x1fff;
}

return bank << 13 | address;
return bank;
}

auto programRomAddress(n32 address) -> n32 {
return programRomBank(address) << 13 | address;
}

auto readPRG(n32 address, n8 data) -> n8 override {
Expand Down Expand Up @@ -569,6 +573,11 @@ struct HVC_ExROM : Interface { //MMC5
}
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;
return programRomBank(address) << 16 | (n16)address;
}

auto readCIRAM(n32 address) -> n8 {
if(vsplitFetch && (hcounter & 2) == 0) return exram[vsplitVoffset / 8 * 32 + vsplitHoffset / 8];
if(vsplitFetch && (hcounter & 2) != 0) return exram[vsplitVoffset / 32 * 8 + vsplitHoffset / 32 + 0x03c0];
Expand Down
13 changes: 11 additions & 2 deletions ares/fc/cartridge/board/hvc-sxrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ struct HVC_SxROM : Interface { //MMC1
if(writeDelay) writeDelay--;
}

auto addressProgramROM(n32 address) -> n32 {
auto bankPRG(n32 address) -> n5 {
bool region = address & 0x4000;
n5 bank = programBank & ~1 | region;
if(programSize == 1) {
Expand All @@ -102,7 +102,11 @@ struct HVC_SxROM : Interface { //MMC1
if(revision == Revision::SXROM) {
bank.bit(4) = characterBank[0].bit(4);
}
return bank << 14 | (n14)address;
return bank;
}

auto addressProgramROM(n32 address) -> n32 {
return bankPRG(address) << 14 | (n14)address;
}

auto addressProgramRAM(n32 address) -> n32 {
Expand Down Expand Up @@ -158,6 +162,11 @@ struct HVC_SxROM : Interface { //MMC1
if(address & 0x8000) return writeIO(address, data);
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;
return (bankPRG(address) << 16 | (n16)address) & ((bit::round(programROM.size()) << 2) - 1);
}

auto writeIO(n32 address, n8 data) -> void {
if(writeDelay) return;
writeDelay = 2;
Expand Down
23 changes: 15 additions & 8 deletions ares/fc/cartridge/board/hvc-txrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,15 @@ struct HVC_TxROM : Interface { //MMC3
characterAddress = address;
}

inline auto bankPRG(n32 address) -> n6 {
switch(address >> 13 & 3) {
case 0: return (programMode == 0 ? programBank[0] : (n6)0x3e); break;
case 1: return programBank[1]; break;
case 2: return (programMode == 1 ? programBank[0] : (n6)0x3e); break;
case 3: default: return 0x3f; break;
}
}

auto readPRG(n32 address, n8 data) -> n8 override {
if(address < 0x6000) return data;

Expand All @@ -87,14 +96,7 @@ struct HVC_TxROM : Interface { //MMC3
return programRAM.read((n13)address);
}

n6 bank;
switch(address >> 13 & 3) {
case 0: bank = (programMode == 0 ? programBank[0] : (n6)0x3e); break;
case 1: bank = programBank[1]; break;
case 2: bank = (programMode == 1 ? programBank[0] : (n6)0x3e); break;
case 3: bank = 0x3f; break;
}

n6 bank = bankPRG(address);
address = bank << 13 | (n13)address;
if(revision == Revision::NESQJ) {
address = outerBank.bit(0) << 17 | (n17)address;
Expand Down Expand Up @@ -159,6 +161,11 @@ struct HVC_TxROM : Interface { //MMC3
}
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;
return (bankPRG(address) << 16 | (n16)address) & ((bit::round(programROM.size()) << 2) - 1);
}

auto addressCHR(n32 address) const -> n32 {
if(characterMode == 0) {
if(address <= 0x07ff) return characterBank[0] << 10 | (n11)address;
Expand Down
19 changes: 13 additions & 6 deletions ares/fc/cartridge/board/hvc-uxrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,16 @@ struct HVC_UxROM : Interface {
Interface::save(characterRAM, "character.ram");
}

auto readPRG(n32 address, n8 data) -> n8 override {
if(address < 0x8000) return data;
n8 bank;
inline auto bankPRG(n32 address) -> n8 {
switch(address >> 14 & 1) {
case 0: bank = (revision == Revision::UNROMA ? (n8)0x00 : programBank); break;
case 1: bank = (revision == Revision::UNROMA ? programBank : (n8)0xff); break;
case 0: return (revision == Revision::UNROMA ? (n8)0x00 : programBank); break;
case 1: default: return (revision == Revision::UNROMA ? programBank : (n8)0xff); break;
}
return programROM.read(bank << 14 | (n14)address);
}

auto readPRG(n32 address, n8 data) -> n8 override {
if(address < 0x8000) return data;
return programROM.read(bankPRG(address) << 14 | (n14)address);
}

auto writePRG(n32 address, n8 data) -> void override {
Expand All @@ -47,6 +49,11 @@ struct HVC_UxROM : Interface {
if(revision == Revision::UN1ROM) programBank >>= 2;
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;
return (bankPRG(address) << 16 | (n16)address) & ((bit::round(programROM.size()) << 2) - 1);
}

auto readCHR(n32 address, n8 data) -> n8 override {
if(address & 0x2000) {
address = address >> !mirror & 0x0400 | (n10)address;
Expand Down
19 changes: 13 additions & 6 deletions ares/fc/cartridge/board/unrom-512.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,16 @@ struct UNROM512 : Interface {
Interface::save(characterRAM, "character.ram");
}

auto readPRG(n32 address, n8 data) -> n8 override {
if(address < 0x8000) return data;
n5 bank;
inline auto bankPRG(n32 address) -> n5 {
switch(address >> 14 & 1) {
case 0: bank = programBank; break;
case 1: bank = (n5)0x1f; break;
case 0: return programBank; break;
case 1: default: return (n5)0x1f; break;
}
return programROM.read(bank << 14 | (n14)address);
}

auto readPRG(n32 address, n8 data) -> n8 override {
if(address < 0x8000) return data;
return programROM.read(bankPRG(address) << 14 | (n14)address);
}

auto writePRG(n32 address, n8 data) -> void override {
Expand All @@ -38,6 +40,11 @@ struct UNROM512 : Interface {
nametableBank = data.bit(7);
}

auto debugAddress(n32 address) -> n32 override {
if(address < 0x8000) return address;
return (bankPRG(address) << 16 | (n16)address) & ((bit::round(programROM.size()) << 2) - 1);
}

inline auto addressCIRAM(n32 address) -> n11 {
if(mirror & 2) {
return (nametableBank << 10) | (n10)address;
Expand Down
4 changes: 4 additions & 0 deletions ares/fc/cartridge/cartridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ auto Cartridge::writeCHR(n32 address, n8 data) -> void {
return board->writeCHR(address, data);
}

auto Cartridge::debugAddress(n32 address) -> n32 {
return board->debugAddress(address);
}

auto Cartridge::scanline(n32 y) -> void {
return board->scanline(y);
}
Expand Down
1 change: 1 addition & 0 deletions ares/fc/cartridge/cartridge.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ struct Cartridge : Thread {

auto readCHR(n32 address, n8 data = 0x00) -> n8;
auto writeCHR(n32 address, n8 data) -> void;
auto debugAddress(n32 address) -> n32;

//scanline() is for debugging purposes only:
//boards must detect scanline edges on their own
Expand Down
1 change: 1 addition & 0 deletions ares/fc/cpu/cpu.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <fc/fc.hpp>
#include <nall/gdb/server.hpp>

namespace ares::Famicom {

Expand Down
1 change: 1 addition & 0 deletions ares/fc/cpu/cpu.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ struct CPU : MOS6502, Thread {
auto readIO(n16 address) -> n8;
auto writeIO(n16 address, n8 data) -> void;

auto debugAddress(n16 address) -> n32 override;
auto readDebugger(n16 address) -> n8 override;

auto serialize(serializer&) -> void;
Expand Down
5 changes: 5 additions & 0 deletions ares/fc/cpu/memory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ inline auto CPU::writeBus(n16 address, n8 data) -> void {
if(address <= 0x4017) return cpu.writeIO(address, data);
}

inline auto CPU::debugAddress(n16 address) -> n32 {
if(address <= 0x4017) return address;
return cartridge.debugAddress(address);
}

auto CPU::readIO(n16 address) -> n8 {
n8 data = MDR;

Expand Down
4 changes: 4 additions & 0 deletions ares/fc/cpu/timing.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
auto CPU::read(n16 address) -> n8 {
GDB::server.reportMemRead(address, 1);

if(io.oamDMAPending) {
io.oamDMAPending = 0;
read(address);
Expand All @@ -16,6 +18,8 @@ auto CPU::read(n16 address) -> n8 {
}

auto CPU::write(n16 address, n8 data) -> void {
GDB::server.reportMemWrite(address, 1);

writeBus(address, MDR = data);
step(rate());
}
Expand Down
Loading