Update to bsnes v063r14 release.

- libsnes updated ... should be the official syntax now, I don't
expect any more changes
- added kode54's patch for HQ2x
- NOT going to add the libjma Windows Unicode fix, I want something
more elegant than hijacking all of std::ifstream, so that can wait for
now
- fixed status.irq_lock for Power Rangers
- went back to blargg's 1.024MHz S-DSP for the fast build
- updated mightymo's cheat pack to the latest version
This commit is contained in:
byuu 2010-04-13 15:21:37 +00:00
parent 65ff00e28a
commit 7227107d5e
14 changed files with 5045 additions and 1194 deletions

BIN
bsnes.exe

Binary file not shown.

BIN
snesfilter.dll Normal file

Binary file not shown.

BIN
snesreader.dll Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
snes_core = sMemory sCPU sSMP aDSP bPPU
snes_core = sMemory sCPU sSMP sDSP bPPU
snes_objects := libco
snes_objects += snes-system

View File

@ -8,6 +8,7 @@ unsigned sCPU::dma_counter() {
}
void sCPU::add_clocks(unsigned clocks) {
status.irq_lock = false;
unsigned ticks = clocks >> 1;
while(ticks--) {
tick();
@ -142,12 +143,9 @@ void sCPU::dma_edge() {
//status.irq_lock is used to simulate hardware delay before interrupts can
//trigger during certain events (immediately after DMA, writes to $4200, etc)
void sCPU::last_cycle() {
if(status.irq_lock) {
status.irq_lock = false;
} else {
if(status.irq_lock == false) {
status.nmi_pending |= nmi_test();
status.irq_pending |= irq_test();
status.interrupt_pending = (status.nmi_pending || status.irq_pending);
}
}

View File

@ -52,6 +52,10 @@ void snes_set_input_state(snes_input_state_t input_state) {
interface.pinput_state = input_state;
}
void snes_set_controller_port_device(bool port, unsigned device) {
SNES::input.port_set_device(port, (SNES::Input::Device)device);
}
void snes_init() {
SNES::system.init(&interface);
SNES::input.port_set_device(0, SNES::Input::Device::Joypad);
@ -70,19 +74,12 @@ void snes_run() {
SNES::system.run();
}
void snes_runtosave() {
SNES::system.runtosave();
}
void snes_set_controller_port_device(bool port, unsigned device) {
SNES::input.port_set_device(port, (SNES::Input::Device)device);
}
unsigned snes_serialize_size() {
return SNES::system.serialize_size();
}
bool snes_serialize(uint8_t *data, unsigned size) {
SNES::system.runtosave();
serializer s = SNES::system.serialize();
if(s.size() > size) return false;
memcpy(data, s.data(), s.size());
@ -106,8 +103,9 @@ void snes_cheat_set(unsigned index, bool enabled, const char *code) {
}
void snes_load_cartridge_normal(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size
) {
SNES::cheat.reset();
SNES::memory::cartrom.copy(rom_data, rom_size);
string xmlrom = rom_xml ? string(rom_xml) : snes_information(rom_data, rom_size).xml_memory_map;
SNES::cartridge.load(SNES::Cartridge::Mode::Normal, { xmlrom });
@ -115,9 +113,10 @@ void snes_load_cartridge_normal(
}
void snes_load_cartridge_bsx_slotted(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size,
const char *bsx_xml, uint8_t *bsx_data, unsigned bsx_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
const char *bsx_xml, const uint8_t *bsx_data, unsigned bsx_size
) {
SNES::cheat.reset();
SNES::memory::cartrom.copy(rom_data, rom_size);
string xmlrom = rom_xml ? string(rom_xml) : snes_information(rom_data, rom_size).xml_memory_map;
SNES::memory::bsxflash.copy(bsx_data, bsx_size);
@ -127,9 +126,10 @@ void snes_load_cartridge_bsx_slotted(
}
void snes_load_cartridge_bsx(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size,
const char *bsx_xml, uint8_t *bsx_data, unsigned bsx_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
const char *bsx_xml, const uint8_t *bsx_data, unsigned bsx_size
) {
SNES::cheat.reset();
SNES::memory::cartrom.copy(rom_data, rom_size);
string xmlrom = rom_xml ? string(rom_xml) : snes_information(rom_data, rom_size).xml_memory_map;
SNES::memory::bsxflash.copy(bsx_data, bsx_size);
@ -139,10 +139,11 @@ void snes_load_cartridge_bsx(
}
void snes_load_cartridge_sufami_turbo(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size,
const char *sta_xml, uint8_t *sta_data, unsigned sta_size,
const char *stb_xml, uint8_t *stb_data, unsigned stb_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
const char *sta_xml, const uint8_t *sta_data, unsigned sta_size,
const char *stb_xml, const uint8_t *stb_data, unsigned stb_size
) {
SNES::cheat.reset();
SNES::memory::cartrom.copy(rom_data, rom_size);
string xmlrom = rom_xml ? string(rom_xml) : snes_information(rom_data, rom_size).xml_memory_map;
SNES::memory::stArom.copy(sta_data, sta_size);
@ -154,9 +155,10 @@ void snes_load_cartridge_sufami_turbo(
}
void snes_load_cartridge_super_game_boy(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size,
const char *dmg_xml, uint8_t *dmg_data, unsigned dmg_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
const char *dmg_xml, const uint8_t *dmg_data, unsigned dmg_size
) {
SNES::cheat.reset();
SNES::memory::cartrom.copy(rom_data, rom_size);
string xmlrom = rom_xml ? string(rom_xml) : snes_information(rom_data, rom_size).xml_memory_map;
SNES::memory::gbrom.copy(dmg_data, dmg_size);
@ -165,19 +167,39 @@ void snes_load_cartridge_super_game_boy(
SNES::system.power();
}
uint8_t* snes_get_cartridge_ram_data() { return SNES::memory::cartram.data(); }
unsigned snes_get_cartridge_ram_size() { return SNES::memory::cartram.size(); }
uint8_t* snes_get_cartridge_rtc_data() { return SNES::memory::cartrtc.data(); }
unsigned snes_get_cartridge_rtc_size() { return SNES::memory::cartrtc.size(); }
uint8_t* snes_get_bsx_ram_data() { return SNES::memory::bsxram.data(); }
unsigned snes_get_bsx_ram_size() { return SNES::memory::bsxram.size(); }
uint8_t* snes_get_bsx_pram_data() { return SNES::memory::bsxpram.data(); }
unsigned snes_get_bsx_pram_size() { return SNES::memory::bsxpram.size(); }
uint8_t* snes_get_sufami_turbo_a_ram_data() { return SNES::memory::stAram.data(); }
unsigned snes_get_sufami_turbo_a_ram_size() { return SNES::memory::stAram.size(); }
uint8_t* snes_get_sufami_turbo_b_ram_data() { return SNES::memory::stBram.data(); }
unsigned snes_get_sufami_turbo_b_ram_size() { return SNES::memory::stBram.size(); }
uint8_t* snes_get_game_boy_ram_data() { return SNES::memory::gbram.data(); }
unsigned snes_get_game_boy_ram_size() { return SNES::memory::gbram.size(); }
uint8_t* snes_get_game_boy_rtc_data() { return SNES::memory::gbrtc.data(); }
unsigned snes_get_game_boy_rtc_size() { return SNES::memory::gbrtc.size(); }
#define SNES_MEMORY_CARTRIDGE_RAM 0
#define SNES_MEMORY_CARTRIDGE_RTC 1
#define SNES_MEMORY_BSX_RAM 2
#define SNES_MEMORY_BSX_PRAM 3
#define SNES_MEMORY_SUFAMI_TURBO_A_RAM 4
#define SNES_MEMORY_SUFAMI_TURBO_B_RAM 5
#define SNES_MEMORY_GAME_BOY_RAM 6
#define SNES_MEMORY_GAME_BOY_RTC 7
uint8_t* snes_get_memory_data(unsigned id) {
switch(id) {
case SNES_MEMORY_CARTRIDGE_RAM: return SNES::memory::cartram.data();
case SNES_MEMORY_CARTRIDGE_RTC: return SNES::memory::cartrtc.data();
case SNES_MEMORY_BSX_RAM: return SNES::memory::bsxram.data();
case SNES_MEMORY_BSX_PRAM: return SNES::memory::bsxpram.data();
case SNES_MEMORY_SUFAMI_TURBO_A_RAM: return SNES::memory::stAram.data();
case SNES_MEMORY_SUFAMI_TURBO_B_RAM: return SNES::memory::stBram.data();
case SNES_MEMORY_GAME_BOY_RAM: return SNES::memory::gbram.data();
case SNES_MEMORY_GAME_BOY_RTC: return SNES::memory::gbrtc.data();
}
return 0;
}
unsigned snes_get_memory_size(unsigned id) {
switch(id) {
case SNES_MEMORY_CARTRIDGE_RAM: return SNES::memory::cartram.size();
case SNES_MEMORY_CARTRIDGE_RTC: return SNES::memory::cartrtc.size();
case SNES_MEMORY_BSX_RAM: return SNES::memory::bsxram.size();
case SNES_MEMORY_BSX_PRAM: return SNES::memory::bsxpram.size();
case SNES_MEMORY_SUFAMI_TURBO_A_RAM: return SNES::memory::stAram.size();
case SNES_MEMORY_SUFAMI_TURBO_B_RAM: return SNES::memory::stBram.size();
case SNES_MEMORY_GAME_BOY_RAM: return SNES::memory::gbram.size();
case SNES_MEMORY_GAME_BOY_RTC: return SNES::memory::gbrtc.size();
}
return 0;
}

View File

@ -4,25 +4,70 @@
extern "C" {
#endif
unsigned snes_library_revision();
#define SNES_MEMORY_CARTRIDGE_RAM 0
#define SNES_MEMORY_CARTRIDGE_RTC 1
#define SNES_MEMORY_BSX_RAM 2
#define SNES_MEMORY_BSX_PRAM 3
#define SNES_MEMORY_SUFAMI_TURBO_A_RAM 4
#define SNES_MEMORY_SUFAMI_TURBO_B_RAM 5
#define SNES_MEMORY_GAME_BOY_RAM 6
#define SNES_MEMORY_GAME_BOY_RTC 7
typedef void (*snes_video_refresh_t)(uint16_t *data, unsigned pitch, unsigned *line, unsigned width, unsigned height);
#define SNES_DEVICE_NONE 0
#define SNES_DEVICE_JOYPAD 1
#define SNES_DEVICE_MULTITAP 2
#define SNES_DEVICE_MOUSE 3
#define SNES_DEVICE_SUPER_SCOPE 4
#define SNES_DEVICE_JUSTIFIER 5
#define SNES_DEVICE_JUSTIFIERS 6
#define SNES_DEVICE_ID_JOYPAD_B 0
#define SNES_DEVICE_ID_JOYPAD_Y 1
#define SNES_DEVICE_ID_JOYPAD_SELECT 2
#define SNES_DEVICE_ID_JOYPAD_START 3
#define SNES_DEVICE_ID_JOYPAD_UP 4
#define SNES_DEVICE_ID_JOYPAD_DOWN 5
#define SNES_DEVICE_ID_JOYPAD_LEFT 6
#define SNES_DEVICE_ID_JOYPAD_RIGHT 7
#define SNES_DEVICE_ID_JOYPAD_A 8
#define SNES_DEVICE_ID_JOYPAD_X 9
#define SNES_DEVICE_ID_JOYPAD_L 10
#define SNES_DEVICE_ID_JOYPAD_R 11
#define SNES_DEVICE_ID_MOUSE_X 0
#define SNES_DEVICE_ID_MOUSE_Y 1
#define SNES_DEVICE_ID_MOUSE_LEFT 2
#define SNES_DEVICE_ID_MOUSE_RIGHT 3
#define SNES_DEVICE_ID_SUPER_SCOPE_X 0
#define SNES_DEVICE_ID_SUPER_SCOPE_Y 1
#define SNES_DEVICE_ID_SUPER_SCOPE_TRIGGER 2
#define SNES_DEVICE_ID_SUPER_SCOPE_CURSOR 3
#define SNES_DEVICE_ID_SUPER_SCOPE_TURBO 4
#define SNES_DEVICE_ID_SUPER_SCOPE_PAUSE 5
#define SNES_DEVICE_ID_JUSTIFIER_X 0
#define SNES_DEVICE_ID_JUSTIFIER_Y 1
#define SNES_DEVICE_ID_JUSTIFIER_TRIGGER 2
#define SNES_DEVICE_ID_JUSTIFIER_START 3
typedef void (*snes_video_refresh_t)(const uint16_t *data, unsigned pitch, const unsigned *line, unsigned width, unsigned height);
typedef void (*snes_audio_sample_t)(uint16_t left, uint16_t right);
typedef void (*snes_input_poll_t)();
typedef int16_t (*snes_input_state_t)(bool port, unsigned device, unsigned index, unsigned id);
unsigned snes_library_revision();
void snes_set_video_refresh(snes_video_refresh_t);
void snes_set_audio_sample(snes_audio_sample_t);
void snes_set_input_poll(snes_input_poll_t);
void snes_set_input_state(snes_input_state_t);
void snes_set_controller_port_device(bool port, unsigned device);
void snes_init();
void snes_term();
void snes_unload();
void snes_run();
void snes_runtosave();
void snes_set_controller_port_device(bool port, unsigned device);
unsigned snes_serialize_size();
bool snes_serialize(uint8_t *data, unsigned size);
@ -32,46 +77,32 @@ void snes_cheat_reset();
void snes_cheat_set(unsigned index, bool enabled, const char *code);
void snes_load_cartridge_normal(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size
);
void snes_load_cartridge_bsx_slotted(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size,
const char *bsx_xml, uint8_t *bsx_data, unsigned bsx_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
const char *bsx_xml, const uint8_t *bsx_data, unsigned bsx_size
);
void snes_load_cartridge_bsx(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size,
const char *bsx_xml, uint8_t *bsx_data, unsigned bsx_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
const char *bsx_xml, const uint8_t *bsx_data, unsigned bsx_size
);
void snes_load_cartridge_sufami_turbo(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size,
const char *sta_xml, uint8_t *sta_data, unsigned sta_size,
const char *stb_xml, uint8_t *stb_data, unsigned stb_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
const char *sta_xml, const uint8_t *sta_data, unsigned sta_size,
const char *stb_xml, const uint8_t *stb_data, unsigned stb_size
);
void snes_load_cartridge_super_game_boy(
const char *rom_xml, uint8_t *rom_data, unsigned rom_size,
const char *dmg_xml, uint8_t *dmg_data, unsigned dmg_size
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
const char *dmg_xml, const uint8_t *dmg_data, unsigned dmg_size
);
uint8_t* snes_get_cartridge_ram_data();
unsigned snes_get_cartridge_ram_size();
uint8_t* snes_get_cartridge_rtc_data();
unsigned snes_get_cartridge_rtc_size();
uint8_t* snes_get_bsx_ram_data();
unsigned snes_get_bsx_ram_size();
uint8_t* snes_get_bsx_pram_data();
unsigned snes_get_bsx_pram_size();
uint8_t* snes_get_sufami_turbo_a_ram_data();
unsigned snes_get_sufami_turbo_a_ram_size();
uint8_t* snes_get_sufami_turbo_b_ram_data();
unsigned snes_get_sufami_turbo_b_ram_size();
uint8_t* snes_get_game_boy_ram_data();
unsigned snes_get_game_boy_ram_size();
uint8_t* snes_get_game_boy_rtc_data();
unsigned snes_get_game_boy_rtc_size();
uint8_t* snes_get_memory_data(unsigned id);
unsigned snes_get_memory_size(unsigned id);
#ifdef __cplusplus
}

View File

@ -32,7 +32,7 @@ void MappedRAM::map(uint8 *source, unsigned length) {
size_ = data_ && length > 0 ? length : -1U;
}
void MappedRAM::copy(uint8 *data, unsigned size) {
void MappedRAM::copy(const uint8 *data, unsigned size) {
if(!data_) {
size_ = (size & ~255) + ((bool)(size & 255) << 8);
data_ = new uint8[size_]();

View File

@ -40,7 +40,7 @@ private:
struct MappedRAM : Memory {
inline void reset();
inline void map(uint8*, unsigned);
inline void copy(uint8*, unsigned);
inline void copy(const uint8*, unsigned);
inline void write_protect(bool status);
inline uint8* data();

View File

@ -1,11 +1,11 @@
static const char bsnesVersion[] = "063.13";
static const char bsnesVersion[] = "063.14";
static const char bsnesTitle[] = "bsnes";
static const unsigned bsnesSerializerVersion = 10;
#define CORE_SMEMORY
#define CORE_SCPU
#define CORE_SSMP
#define CORE_ADSP
#define CORE_SDSP
#define CORE_BPPU
//S-DSP can be encapsulated into a state machine using #define magic

View File

@ -13,8 +13,8 @@ MemoryEditor::MemoryEditor() {
setLayout(layout);
editor = new HexEditor;
editor->reader = bind(&MemoryEditor::reader, this);
editor->writer = bind(&MemoryEditor::writer, this);
editor->reader = { &MemoryEditor::reader, this };
editor->writer = { &MemoryEditor::writer, this };
editor->setFont(QFont(Style::Monospace));
editor->setMinimumWidth((editor->lineWidth() + 3) * editor->fontMetrics().width(' '));
editor->setMinimumHeight((16 + 1) * editor->fontMetrics().height());

View File

@ -63,8 +63,8 @@ Tracer::Tracer() {
traceMaskCPU = new uint8_t[(1 << 24) >> 3]();
traceMaskSMP = new uint8_t[(1 << 16) >> 3]();
SNES::cpu.step_event = bind(&Tracer::stepCpu, this);
SNES::smp.step_event = bind(&Tracer::stepSmp, this);
SNES::cpu.step_event = { &Tracer::stepCpu, this };
SNES::smp.step_event = { &Tracer::stepSmp, this };
}
Tracer::~Tracer() {

View File

@ -3,7 +3,7 @@
SDL_Surface *screen, *backbuffer;
void video_refresh(uint16_t *data, unsigned pitch, unsigned *line, unsigned width, unsigned height) {
void video_refresh(const uint16_t *data, unsigned pitch, const unsigned *line, unsigned width, unsigned height) {
if(SDL_MUSTLOCK(screen)) SDL_LockSurface(screen);
if(SDL_MUSTLOCK(backbuffer)) SDL_LockSurface(backbuffer);
@ -38,19 +38,20 @@ int16_t input_state(bool port, unsigned device, unsigned index, unsigned id) {
uint8_t *state = SDL_GetKeyState(0);
if(port == 0) {
//B, Y, Select, Start, Up, Down, Left, Right, A, X, L, R
if(id == 0) return state[SDLK_z];
if(id == 1) return state[SDLK_a];
if(id == 2) return state[SDLK_RSHIFT];
if(id == 3) return state[SDLK_RETURN];
if(id == 4) return state[SDLK_UP];
if(id == 5) return state[SDLK_DOWN] & !state[SDLK_UP];
if(id == 6) return state[SDLK_LEFT];
if(id == 7) return state[SDLK_RIGHT] & !state[SDLK_LEFT];
if(id == 8) return state[SDLK_x];
if(id == 9) return state[SDLK_s];
if(id == 10) return state[SDLK_d];
if(id == 11) return state[SDLK_c];
if(device == SNES_DEVICE_JOYPAD) {
if(id == SNES_DEVICE_ID_JOYPAD_B) return state[SDLK_z];
if(id == SNES_DEVICE_ID_JOYPAD_Y) return state[SDLK_a];
if(id == SNES_DEVICE_ID_JOYPAD_SELECT) return state[SDLK_RSHIFT];
if(id == SNES_DEVICE_ID_JOYPAD_START) return state[SDLK_RETURN];
if(id == SNES_DEVICE_ID_JOYPAD_UP) return state[SDLK_UP];
if(id == SNES_DEVICE_ID_JOYPAD_DOWN) return state[SDLK_DOWN] & !state[SDLK_UP];
if(id == SNES_DEVICE_ID_JOYPAD_LEFT) return state[SDLK_LEFT];
if(id == SNES_DEVICE_ID_JOYPAD_RIGHT) return state[SDLK_RIGHT] & !state[SDLK_LEFT];
if(id == SNES_DEVICE_ID_JOYPAD_A) return state[SDLK_x];
if(id == SNES_DEVICE_ID_JOYPAD_X) return state[SDLK_s];
if(id == SNES_DEVICE_ID_JOYPAD_L) return state[SDLK_d];
if(id == SNES_DEVICE_ID_JOYPAD_R) return state[SDLK_c];
}
}
return 0;
@ -88,10 +89,8 @@ int main(int argc, char *argv[]) {
unsigned serial_size = snes_serialize_size();
uint8_t *serial_data = new uint8_t[serial_size];
snes_runtosave();
snes_serialize(serial_data, serial_size);
snes_cheat_reset();
//snes_cheat_set(0, true, "DD32-6DAD");
while(true) {
@ -102,7 +101,6 @@ int main(int argc, char *argv[]) {
if(event.key.keysym.sym == SDLK_ESCAPE) {
break;
} else if(event.key.keysym.sym == SDLK_F2) {
snes_runtosave();
snes_serialize(serial_data, serial_size);
} else if(event.key.keysym.sym == SDLK_F4) {
snes_unserialize(serial_data, serial_size);