Fixes. Does not run it seems.

This commit is contained in:
Themaister 2011-06-20 17:04:45 +02:00
parent 27bd88f44e
commit 66956f04f0
13 changed files with 115 additions and 48 deletions

View File

@ -158,6 +158,17 @@ SNESCartridge::SNESCartridge(const uint8_t *data, unsigned size) {
xml << " <map address='00-3f:6000-7fff'/>\n";
xml << " <map address='80-bf:6000-7fff'/>\n";
xml << " </icd2>\n";
} else if(has_cx4) {
xml << " <hitachidsp model='HG51B169' frequency='20000000' program='cx4.bin' sha256='ae8d4d1961b93421ff00b3caa1d0f0ce7783e749772a3369c36b3dbf0d37ef18'>\n";
xml << " <rom>\n";
xml << " <map mode='linear' address='00-7f:8000-ffff'/>\n";
xml << " <map mode='linear' address='80-ff:8000-ffff'/>\n";
xml << " </rom>\n";
xml << " <mmio>\n";
xml << " <map address='00-3f:6000-7fff'/>\n";
xml << " <map address='80-bf:6000-7fff'/>\n";
xml << " </mmio>\n";
xml << " </hitachidsp>\n";
} else if(has_spc7110) {
xml << " <rom>\n";
xml << " <map mode='shadow' address='00-0f:8000-ffff'/>\n";
@ -399,13 +410,6 @@ SNESCartridge::SNESCartridge(const uint8_t *data, unsigned size) {
xml << " </sdd1>\n";
}
if(has_cx4) {
xml << " <cx4>\n";
xml << " <map address='00-3f:6000-7fff'/>\n";
xml << " <map address='80-bf:6000-7fff'/>\n";
xml << " </cx4>\n";
}
if(has_dsp1) {
xml << " <necdsp revision='upd7725' frequency='8000000' program='dsp1b.bin' sha256='4d42db0f36faef263d6b93f508e8c1c4ae8fc2605fd35e3390ecc02905cd420c'>\n";
if(dsp1_mapper == DSP1LoROM1MB) {

View File

@ -3,8 +3,8 @@ snes_objects += snes-system
snes_objects += snes-cartridge snes-cheat
snes_objects += snes-memory snes-cpucore snes-smpcore
snes_objects += snes-cpu snes-smp snes-dsp snes-ppu
snes_objects += snes-nss snes-icd2 snes-superfx snes-sa1 snes-necdsp
snes_objects += snes-bsx snes-srtc snes-sdd1 snes-spc7110 snes-sufamiturbo snes-cx4
snes_objects += snes-nss snes-icd2 snes-superfx snes-sa1 snes-necdsp snes-hitachidsp
snes_objects += snes-bsx snes-srtc snes-sdd1 snes-spc7110 snes-sufamiturbo
snes_objects += snes-obc1 snes-st0018
snes_objects += snes-msu1 snes-serial snes-link
snes_objects += $(gameboy_objects)
@ -50,11 +50,11 @@ obj/snes-icd2.o : $(snes)/chip/icd2/icd2.cpp $(call rwildcard,$(snes)/chip/ic
obj/snes-superfx.o : $(snes)/chip/superfx/superfx.cpp $(call rwildcard,$(snes)/chip/superfx/)
obj/snes-sa1.o : $(snes)/chip/sa1/sa1.cpp $(call rwildcard,$(snes)/chip/sa1/)
obj/snes-necdsp.o : $(snes)/chip/necdsp/necdsp.cpp $(call rwildcard,$(snes)/chip/necdsp/)
obj/snes-hitachidsp.o : $(snes)/chip/hitachidsp/hitachidsp.cpp $(call rwildcard,$(snes)/chip/hitachidsp/)
obj/snes-bsx.o : $(snes)/chip/bsx/bsx.cpp $(snes)/chip/bsx/*
obj/snes-srtc.o : $(snes)/chip/srtc/srtc.cpp $(snes)/chip/srtc/*
obj/snes-sdd1.o : $(snes)/chip/sdd1/sdd1.cpp $(snes)/chip/sdd1/*
obj/snes-spc7110.o : $(snes)/chip/spc7110/spc7110.cpp $(snes)/chip/spc7110/*
obj/snes-cx4.o : $(snes)/chip/cx4/cx4.cpp $(snes)/chip/cx4/*
obj/snes-obc1.o : $(snes)/chip/obc1/obc1.cpp $(snes)/chip/obc1/*
obj/snes-st0018.o : $(snes)/chip/st0018/st0018.cpp $(snes)/chip/st0018/*
obj/snes-msu1.o : $(snes)/chip/msu1/msu1.cpp $(snes)/chip/msu1/*

View File

@ -21,11 +21,11 @@ void Cartridge::load(Mode::e cartridge_mode, const lstring &xml_list) {
has_superfx = false;
has_sa1 = false;
has_necdsp = false;
has_hitachidsp = false;
has_srtc = false;
has_sdd1 = false;
has_spc7110 = false;
has_spc7110rtc = false;
has_cx4 = false;
has_obc1 = false;
has_st0018 = false;
has_msu1 = false;

View File

@ -41,11 +41,11 @@ public:
readonly<bool> has_superfx;
readonly<bool> has_sa1;
readonly<bool> has_necdsp;
readonly<bool> has_hitachidsp;
readonly<bool> has_srtc;
readonly<bool> has_sdd1;
readonly<bool> has_spc7110;
readonly<bool> has_spc7110rtc;
readonly<bool> has_cx4;
readonly<bool> has_obc1;
readonly<bool> has_st0018;
readonly<bool> has_msu1;
@ -108,13 +108,13 @@ private:
void xml_parse_superfx(xml_element&);
void xml_parse_sa1(xml_element&);
void xml_parse_necdsp(xml_element&);
void xml_parse_hitachidsp(xml_element&);
void xml_parse_bsx(xml_element&);
void xml_parse_sufamiturbo(xml_element&);
void xml_parse_supergameboy(xml_element&);
void xml_parse_srtc(xml_element&);
void xml_parse_sdd1(xml_element&);
void xml_parse_spc7110(xml_element&);
void xml_parse_cx4(xml_element&);
void xml_parse_obc1(xml_element&);
void xml_parse_setarisc(xml_element&);
void xml_parse_msu1(xml_element&);

View File

@ -40,12 +40,12 @@ void Cartridge::parse_xml_cartridge(const char *data) {
if(node.name == "superfx") xml_parse_superfx(node);
if(node.name == "sa1") xml_parse_sa1(node);
if(node.name == "necdsp") xml_parse_necdsp(node);
if(node.name == "hitachidsp") xml_parse_hitachidsp(node);
if(node.name == "bsx") xml_parse_bsx(node);
if(node.name == "sufamiturbo") xml_parse_sufamiturbo(node);
if(node.name == "srtc") xml_parse_srtc(node);
if(node.name == "sdd1") xml_parse_sdd1(node);
if(node.name == "spc7110") xml_parse_spc7110(node);
if(node.name == "cx4") xml_parse_cx4(node);
if(node.name == "obc1") xml_parse_obc1(node);
if(node.name == "setarisc") xml_parse_setarisc(node);
if(node.name == "msu1") xml_parse_msu1(node);
@ -372,6 +372,81 @@ void Cartridge::xml_parse_necdsp(xml_element &root) {
}
}
void Cartridge::xml_parse_hitachidsp(xml_element &root) {
has_hitachidsp = true;
hitachidsp.frequency = 20000000;
for(unsigned n = 0; n < 1024; n++) hitachidsp.dataROM[n] = 0x000000;
string program, sha256;
foreach(attr, root.attribute) {
if(attr.name == "frequency") {
hitachidsp.frequency = decimal(attr.content);
} else if(attr.name == "program") {
program = attr.content;
} else if(attr.name == "sha256") {
sha256 = attr.content;
}
}
string path = string( dir(system.interface->path(Slot::Base, ".dsp")), program );
file fp;
if(fp.open(path, file::mode_read) == false) {
system.interface->message(string( "Warning: Hitachi DSP program ", program, " is missing." ));
} else if(fp.size() != 1024 * 3) {
system.interface->message(string( "Warning: Hitachi DSP program ", program, " is of the wrong file size." ));
fp.close();
} else {
for(unsigned n = 0; n < 1024; n++) hitachidsp.dataROM[n] = fp.readl(3);
if(sha256 != "") {
//XML file specified SHA256 sum for program. Verify file matches the hash.
fp.seek(0);
uint8 data[3072];
fp.read(data, 3072);
sha256_ctx sha;
uint8 hash[32];
sha256_init(&sha);
sha256_chunk(&sha, data, 3072);
sha256_final(&sha);
sha256_hash(&sha, hash);
string filehash;
foreach(n, hash) filehash.append(hex<2>(n));
if(sha256 != filehash) {
system.interface->message(string( "Warning: Hitachi DSP program ", program, " SHA256 sum is incorrect." ));
}
}
fp.close();
}
foreach(node, root.element) {
if(node.name == "rom") foreach(leaf, node.element) {
if(leaf.name == "map") {
Mapping m(function<uint8 (unsigned)>( &HitachiDSP::rom_read, &hitachidsp ), function<void (unsigned, uint8)>( &HitachiDSP::rom_write, &hitachidsp ));
foreach(attr, leaf.attribute) {
if(attr.name == "address") xml_parse_address(m, attr.content);
if(attr.name == "mode") xml_parse_mode(m, attr.content);
if(attr.name == "offset") m.offset = hex(attr.content);
if(attr.name == "size") m.size = hex(attr.content);
}
mapping.append(m);
}
}
if(node.name == "mmio") foreach(leaf, node.element) {
Mapping m(function<uint8 (unsigned)>( &HitachiDSP::dsp_read, &hitachidsp ), function<void (unsigned, uint8)>( &HitachiDSP::dsp_write, &hitachidsp ));
foreach(attr, leaf.attribute) {
if(attr.name == "address") xml_parse_address(m, attr.content);
}
mapping.append(m);
}
}
}
void Cartridge::xml_parse_bsx(xml_element &root) {
if(mode.i != Mode::BsxSlotted && mode.i != Mode::Bsx) return;
@ -580,20 +655,6 @@ void Cartridge::xml_parse_spc7110(xml_element &root) {
}
}
void Cartridge::xml_parse_cx4(xml_element &root) {
has_cx4 = true;
foreach(node, root.element) {
if(node.name == "map") {
Mapping m(function<uint8(unsigned)>( &Cx4::read, &cx4 ), function<void(unsigned, uint8)>( &Cx4::write, &cx4 ));
foreach(attr, node.attribute) {
if(attr.name == "address") xml_parse_address(m, attr.content);
}
mapping.append(m);
}
}
}
void Cartridge::xml_parse_obc1(xml_element &root) {
has_obc1 = true;

Binary file not shown.

View File

@ -13,11 +13,11 @@ void HitachiDSP::Enter() { hitachidsp.enter(); }
void HitachiDSP::enter() {
while(true) {
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
if(scheduler.sync.i == Scheduler::SynchronizeMode::All) {
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
}
switch(state) {
switch(state.i) {
case State::Idle:
step(1);
break;
@ -26,7 +26,7 @@ void HitachiDSP::enter() {
bus.write(regs.dma_target + n, bus.read(regs.dma_source + n));
step(2);
}
state = State::Idle;
state.i = State::Idle;
break;
case State::Execute:
unsigned offset = regs.program_offset + regs.pc * 2;
@ -57,7 +57,7 @@ void HitachiDSP::power() {
void HitachiDSP::reset() {
create(HitachiDSP::Enter, frequency);
state = State::Idle;
state.i = State::Idle;
regs.n = 0;
regs.z = 0;

View File

@ -8,7 +8,7 @@ public:
uint8 dataRAM[3072];
uint24 stack[8];
uint16 opcode;
enum class State : unsigned { Idle, DMA, Execute } state;
struct State { enum e { Idle, DMA, Execute } i; } state;
#include "registers.hpp"
static void Enter();

View File

@ -11,7 +11,7 @@ void HitachiDSP::bus_write(unsigned addr, uint8 data) {
uint8 HitachiDSP::rom_read(unsigned addr) {
if(co_active() == cpu.thread) {
if(state == State::Idle) return cartridge.rom.read(addr);
if(state.i == State::Idle) return cartridge.rom.read(addr);
if((addr & 0x40ffe0) == 0x00ffe0) return regs.vector[addr & 0x1f];
return cpu.regs.mdr;
}
@ -56,7 +56,7 @@ uint8 HitachiDSP::dsp_read(unsigned addr) {
case 0x1f53: case 0x1f54: case 0x1f55: case 0x1f56:
case 0x1f57: case 0x1f58: case 0x1f59: case 0x1f5a:
case 0x1f5b: case 0x1f5c: case 0x1f5d: case 0x1f5e:
case 0x1f5f: return ((state != State::Idle) << 6) | ((state == State::Idle) << 1);
case 0x1f5f: return ((state.i != State::Idle) << 6) | ((state.i == State::Idle) << 1);
}
//Vector
@ -93,7 +93,7 @@ void HitachiDSP::dsp_write(unsigned addr, uint8 data) {
case 0x1f45: regs.dma_target = (regs.dma_target & 0xffff00) | (data << 0); return;
case 0x1f46: regs.dma_target = (regs.dma_target & 0xff00ff) | (data << 8); return;
case 0x1f47: regs.dma_target = (regs.dma_target & 0x00ffff) | (data << 16);
if(state == State::Idle) state = State::DMA;
if(state.i == State::Idle) state.i = State::DMA;
return;
case 0x1f48: regs.r1f48 = data & 0x01; return;
case 0x1f49: regs.program_offset = (regs.program_offset & 0xffff00) | (data << 0); return;
@ -103,9 +103,9 @@ void HitachiDSP::dsp_write(unsigned addr, uint8 data) {
case 0x1f4d: regs.page_number = (regs.page_number & 0x7f00) | ((data & 0xff) << 0); return;
case 0x1f4e: regs.page_number = (regs.page_number & 0x00ff) | ((data & 0x7f) << 8); return;
case 0x1f4f: regs.program_counter = data;
if(state == State::Idle) {
if(state.i == State::Idle) {
regs.pc = regs.page_number * 256 + regs.program_counter;
state = State::Execute;
state.i = State::Execute;
}
return;
case 0x1f50: regs.r1f50 = data & 0x77; return;

View File

@ -341,12 +341,12 @@ void HitachiDSP::exec() {
else if((opcode & 0xffff) == 0xfc00) {
//1111 1100 0000 0000
//halt
state = State::Idle;
state.i = State::Idle;
}
else {
print("Hitachi DSP: invalid opcode @ ", hex<4>(regs.pc - 1), " = ", hex<4>(opcode), "\n");
state = State::Idle;
state.i = State::Idle;
}
}

View File

@ -1,8 +1,8 @@
namespace SNES {
namespace Info {
static const char Name[] = "bsnes";
static const char Version[] = "079.03";
static const unsigned SerializerVersion = 20;
static const char Version[] = "079.04";
static const unsigned SerializerVersion = 21;
}
}
@ -43,6 +43,8 @@ namespace SNES {
typedef int32_t int32;
typedef int64_t int64;
typedef int_t<24> int24;
typedef uint8_t uint8;
typedef uint16_t uint16;
typedef uint32_t uint32;

View File

@ -62,10 +62,10 @@ void System::serialize_all(serializer &s) {
if(cartridge.has_superfx()) superfx.serialize(s);
if(cartridge.has_sa1()) sa1.serialize(s);
if(cartridge.has_necdsp()) necdsp.serialize(s);
if(cartridge.has_hitachidsp()) hitachidsp.serialize(s);
if(cartridge.has_srtc()) srtc.serialize(s);
if(cartridge.has_sdd1()) sdd1.serialize(s);
if(cartridge.has_spc7110()) spc7110.serialize(s);
if(cartridge.has_cx4()) cx4.serialize(s);
if(cartridge.has_obc1()) obc1.serialize(s);
if(cartridge.has_msu1()) msu1.serialize(s);
if(cartridge.has_serial()) serial.serialize(s);

View File

@ -74,13 +74,13 @@ void System::init(Interface *interface_) {
superfx.init();
sa1.init();
necdsp.init();
hitachidsp.init();
bsxsatellaview.init();
bsxcartridge.init();
bsxflash.init();
srtc.init();
sdd1.init();
spc7110.init();
cx4.init();
obc1.init();
st0018.init();
msu1.init();
@ -117,10 +117,10 @@ void System::load() {
if(cartridge.has_superfx()) superfx.load();
if(cartridge.has_sa1()) sa1.load();
if(cartridge.has_necdsp()) necdsp.load();
if(cartridge.has_hitachidsp()) hitachidsp.load();
if(cartridge.has_srtc()) srtc.load();
if(cartridge.has_sdd1()) sdd1.load();
if(cartridge.has_spc7110()) spc7110.load();
if(cartridge.has_cx4()) cx4.load();
if(cartridge.has_obc1()) obc1.load();
if(cartridge.has_st0018()) st0018.load();
if(cartridge.has_msu1()) msu1.load();
@ -142,10 +142,10 @@ void System::unload() {
if(cartridge.has_superfx()) superfx.unload();
if(cartridge.has_sa1()) sa1.unload();
if(cartridge.has_necdsp()) necdsp.unload();
if(cartridge.has_hitachidsp()) hitachidsp.unload();
if(cartridge.has_srtc()) srtc.unload();
if(cartridge.has_sdd1()) sdd1.unload();
if(cartridge.has_spc7110()) spc7110.unload();
if(cartridge.has_cx4()) cx4.unload();
if(cartridge.has_obc1()) obc1.unload();
if(cartridge.has_st0018()) st0018.unload();
if(cartridge.has_msu1()) msu1.unload();
@ -179,10 +179,10 @@ void System::power() {
if(cartridge.has_superfx()) superfx.power();
if(cartridge.has_sa1()) sa1.power();
if(cartridge.has_necdsp()) necdsp.power();
if(cartridge.has_hitachidsp()) hitachidsp.power();
if(cartridge.has_srtc()) srtc.power();
if(cartridge.has_sdd1()) sdd1.power();
if(cartridge.has_spc7110()) spc7110.power();
if(cartridge.has_cx4()) cx4.power();
if(cartridge.has_obc1()) obc1.power();
if(cartridge.has_st0018()) st0018.power();
if(cartridge.has_msu1()) msu1.power();
@ -217,10 +217,10 @@ void System::reset() {
if(cartridge.has_superfx()) superfx.reset();
if(cartridge.has_sa1()) sa1.reset();
if(cartridge.has_necdsp()) necdsp.reset();
if(cartridge.has_hitachidsp()) hitachidsp.reset();
if(cartridge.has_srtc()) srtc.reset();
if(cartridge.has_sdd1()) sdd1.reset();
if(cartridge.has_spc7110()) spc7110.reset();
if(cartridge.has_cx4()) cx4.reset();
if(cartridge.has_obc1()) obc1.reset();
if(cartridge.has_st0018()) st0018.reset();
if(cartridge.has_msu1()) msu1.reset();