Update to v071 release.

byuu says (since v070):

- fixed a regression in the accuracy/compatibility CPU core with IRQ
  masking; fixes World Heroes 2
- fixed OAM address reset on $2100 writes for performance PPU core;
  fixes Mahjongg 2 and others
- DSP-1 always returns high 8-bits of status register; fixes Ace wo
  Nerae! freeze [Jonas Quinn]
- performance core can now take advantage of serial support
- pixel shaders now use a unified XML format; in the future they will
  support multi-pass shaders and textures
- major code restructuring
- first public release of phoenix GUI port
- mightymo's cheat code pack is now an external file for the phoenix
  port
- phoenix port stores cheat codes in XML format as well, unifying all
  file formats to the same markup language
This commit is contained in:
Tim Allen 2010-10-22 20:54:59 +11:00
parent 4016ae1d43
commit 6c3aec7dc9
8 changed files with 65 additions and 11 deletions

View File

@ -1,6 +1,6 @@
include nall/Makefile include nall/Makefile
snes := snes snes := snes
profile := performance profile := accuracy
ui := ui-phoenix ui := ui-phoenix
# compiler # compiler

View File

@ -75,7 +75,7 @@ void PPU::render_line_mode7(uint8 pri0_pos, uint8 pri1_pos) {
palette = memory::vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1]; palette = memory::vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1];
} break; } break;
case 2: { //palette color 0 outside of screen area case 2: { //palette color 0 outside of screen area
if(px < 0 || px > 1023 || py < 0 || py > 1023) { if((px | py) & ~1023) {
palette = 0; palette = 0;
} else { } else {
px &= 1023; px &= 1023;
@ -87,7 +87,7 @@ void PPU::render_line_mode7(uint8 pri0_pos, uint8 pri1_pos) {
} }
} break; } break;
case 3: { //character 0 repetition outside of screen area case 3: { //character 0 repetition outside of screen area
if(px < 0 || px > 1023 || py < 0 || py > 1023) { if((px | py) & ~1023) {
tile = 0; tile = 0;
} else { } else {
px &= 1023; px &= 1023;

View File

@ -49,7 +49,7 @@ void PPU::Background::render_mode7() {
} }
case 2: { case 2: {
if(px < 0 || px > 1023 || py < 0 || py > 1023) { if((px | py) & ~1023) {
palette = 0; palette = 0;
} else { } else {
px &= 1023; px &= 1023;
@ -63,7 +63,7 @@ void PPU::Background::render_mode7() {
} }
case 3: { case 3: {
if(px < 0 || px > 1023 || py < 0 || py > 1023) { if((px | py) & ~1023) {
tile = 0; tile = 0;
} else { } else {
px &= 1023; px &= 1023;

View File

@ -283,7 +283,7 @@ void PPU::mmio_write(unsigned addr, uint8 data) {
switch(addr & 0xffff) { switch(addr & 0xffff) {
case 0x2100: { //INIDISP case 0x2100: { //INIDISP
if(regs.display_disable && vcounter() == display.height) oam.address_reset(); if(regs.display_disable && cpu.vcounter() == display.height) oam.address_reset();
regs.display_disable = data & 0x80; regs.display_disable = data & 0x80;
regs.display_brightness = data & 0x0f; regs.display_brightness = data & 0x0f;
return; return;

View File

@ -38,7 +38,7 @@ unsigned snes_library_revision_major(void) {
} }
unsigned snes_library_revision_minor(void) { unsigned snes_library_revision_minor(void) {
return 0; return 1;
} }
void snes_set_video_refresh(snes_video_refresh_t video_refresh) { void snes_set_video_refresh(snes_video_refresh_t video_refresh) {
@ -61,6 +61,10 @@ void snes_set_controller_port_device(bool port, unsigned device) {
SNES::input.port_set_device(port, (SNES::Input::Device)device); SNES::input.port_set_device(port, (SNES::Input::Device)device);
} }
void snes_set_cartridge_basename(const char *basename) {
SNES::cartridge.basename = basename;
}
void snes_init(void) { void snes_init(void) {
SNES::system.init(&interface); SNES::system.init(&interface);
SNES::input.port_set_device(0, SNES::Input::Device::Joypad); SNES::input.port_set_device(0, SNES::Input::Device::Joypad);

View File

@ -74,6 +74,7 @@ void snes_set_input_poll(snes_input_poll_t);
void snes_set_input_state(snes_input_state_t); void snes_set_input_state(snes_input_state_t);
void snes_set_controller_port_device(bool port, unsigned device); void snes_set_controller_port_device(bool port, unsigned device);
void snes_set_cartridge_basename(const char *basename);
void snes_init(void); void snes_init(void);
void snes_term(void); void snes_term(void);

View File

@ -1,7 +1,7 @@
namespace SNES { namespace SNES {
namespace Info { namespace Info {
static const char Name[] = "bsnes"; static const char Name[] = "bsnes";
static const char Version[] = "070.17"; static const char Version[] = "071";
static const unsigned SerializerVersion = 14; static const unsigned SerializerVersion = 14;
} }
} }

View File

@ -1,5 +1,54 @@
void InputMapper::poll_hotkeys(unsigned scancode, int16_t value) { void InputMapper::poll_hotkeys(unsigned scancode, int16_t value) {
if(value == 0) return; //internal state
static unsigned activeSlot = 1;
static bool videoSync = false;
static bool audioSync = false;
if(value) {
//key pressed
if(scancode == keyboard(0)[Keyboard::Escape]) input.unacquire(); if(scancode == keyboard(0)[Keyboard::Escape]) input.unacquire();
if(mainWindow.focused() == false) return; if(mainWindow.focused() == false) return;
//save states
if(scancode == keyboard(0)[Keyboard::F5]) {
utility.saveState(activeSlot);
}
if(scancode == keyboard(0)[Keyboard::F7]) {
utility.loadState(activeSlot);
}
if(scancode == keyboard(0)[Keyboard::F6]) {
activeSlot = (activeSlot == 1 ? 5 : activeSlot - 1);
utility.showMessage({ "Slot ", activeSlot, " selected" });
}
if(scancode == keyboard(0)[Keyboard::F8]) {
activeSlot = (activeSlot == 5 ? 1 : activeSlot + 1);
utility.showMessage({ "Slot ", activeSlot, " selected" });
}
//fast forward
if(scancode == keyboard(0)[Keyboard::Tilde]) {
videoSync = config.video.synchronize;
audioSync = config.audio.synchronize;
video.set(Video::Synchronize, config.video.synchronize = false);
audio.set(Audio::Synchronize, config.audio.synchronize = false);
#if defined(PROFILE_COMPATIBILITY) || defined(PROFILE_PERFORMANCE)
SNES::ppu.set_frameskip(9);
#endif
}
} else {
//key released
if(mainWindow.focused() == false) return;
//fast forward
if(scancode == keyboard(0)[Keyboard::Tilde]) {
video.set(Video::Synchronize, config.video.synchronize = videoSync);
audio.set(Audio::Synchronize, config.audio.synchronize = audioSync);
#if defined(PROFILE_COMPATIBILITY) || defined(PROFILE_PERFORMANCE)
SNES::ppu.set_frameskip(0);
#endif
}
}
} }