diff --git a/65c816.h b/65c816.h index 6f8cbb56b0defaeb237140e855c6067c8a8b5dd7..183c695e97b848eb27ddf9d8cc706e8043aa8b7f 100644 --- a/65c816.h +++ b/65c816.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/apu/apu.cpp b/apu/apu.cpp index 3dcdc36f5afb59ee784b461c79c89e27cd4461ae..12d42c8e1c16899fad937e4a962b039b8e22e810 100644 --- a/apu/apu.cpp +++ b/apu/apu.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2016 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -138,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2016 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -146,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2016 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -272,7 +274,7 @@ static void DeStereo (uint8 *buffer, int sample_count) int16 *buf = (int16 *) buffer; int32 s1, s2; - for (int i = 0; i < sample_count >> 1; i++) + for (int i = 0; i < (sample_count >> 1); i++) { s1 = (int32) buf[2 * i]; s2 = (int32) buf[2 * i + 1]; @@ -346,7 +348,7 @@ bool8 S9xMixSamples (uint8 *buffer, int sample_count) if (msu::resampler->avail() >= sample_count) { msu::resampler->read((short *)msu::resample_buffer, sample_count); - for (uint32 i = 0; i < sample_count; ++i) + for (int i = 0; i < sample_count; ++i) *((int16*)(dest+(i * 2))) += *((int16*)(msu::resample_buffer +(i * 2))); } else // should never occur @@ -756,7 +758,6 @@ void S9xAPULoadState (uint8 *block) SNES::dsp.clock = SNES::get_le32(ptr); ptr += sizeof(int32); memcpy (SNES::cpu.registers, ptr, 4); - ptr += 4; } static void to_var_from_buf (uint8 **buf, void *var, size_t size) @@ -897,4 +898,3 @@ bool8 S9xSPCDump (const char *filename) return (TRUE); } - diff --git a/apu/apu.h b/apu/apu.h index ca0324b9b9eda57c6476d3925eaf1e9b76b9ca32..724c12b6bf6342b33a283855efcfceeae8b3709f 100644 --- a/apu/apu.h +++ b/apu/apu.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/apu/bapu/dsp/SPC_DSP.cpp b/apu/bapu/dsp/SPC_DSP.cpp index 061c25ae8e890663c338acb3bd3b202333e2f059..59a02193acd71effd087298310e35e1c673667e6 100644 --- a/apu/bapu/dsp/SPC_DSP.cpp +++ b/apu/bapu/dsp/SPC_DSP.cpp @@ -131,6 +131,9 @@ static short const gauss [512] = inline int SPC_DSP::interpolate( voice_t const* v ) { + // libretro: alternate methods + if(libretro_get_snes_interp()) return libretro_snes_interp((void*)v); + // Make pointers into gaussian based on fractional position between samples int offset = v->interp_pos >> 4 & 0xFF; short const* fwd = gauss + 255 - offset; @@ -416,7 +419,8 @@ inline VOICE_CLOCK( V3b ) m.t_brr_byte = m.ram [(v->brr_addr + v->brr_offset) & 0xFFFF]; m.t_brr_header = m.ram [v->brr_addr]; // brr_addr doesn't need masking } -VOICE_CLOCK( V3c ) + +inline VOICE_CLOCK( V3c ) { // Pitch modulation using previous voice's output if ( m.t_pmon & v->vbit ) @@ -510,7 +514,8 @@ inline void SPC_DSP::voice_output( voice_t const* v, int ch ) CLAMP16( m.t_echo_out [ch] ); } } -VOICE_CLOCK( V4 ) + +inline VOICE_CLOCK( V4 ) { // Decode BRR m.t_looped = 0; @@ -810,7 +815,7 @@ void SPC_DSP::run( int clocks_remain ) { loop: - #define PHASE( n ) if ( n && !--clocks_remain ) break; case n: + #define PHASE( n ) if ( n && !--clocks_remain ) break; /* Fall through */ case n: GEN_DSP_TIMING #undef PHASE diff --git a/apu/bapu/smp/core.cpp b/apu/bapu/smp/core.cpp index 5303bed79b816718b24268a1093c1e9400642519..b88810fb5ec322d8f7ab6295fcc09572f14f4e52 100644 --- a/apu/bapu/smp/core.cpp +++ b/apu/bapu/smp/core.cpp @@ -51,8 +51,8 @@ void SMP::op_write(uint16 addr, uint8 data) { void SMP::op_step() { #define op_readpc() op_read(regs.pc++) - #define op_readdp(addr) op_read((regs.p.p << 8) + (addr & 0xff)) - #define op_writedp(addr, data) op_write((regs.p.p << 8) + (addr & 0xff), data) + #define op_readdp(addr) op_read((regs.p.p << 8) + ((addr) & 0xff)) + #define op_writedp(addr, data) op_write((regs.p.p << 8) + ((addr) & 0xff), data) #define op_readaddr(addr) op_read(addr) #define op_writeaddr(addr, data) op_write(addr, data) #define op_readstack() op_read(0x0100 | ++regs.sp) @@ -62,7 +62,17 @@ void SMP::op_step() { #if defined(PSEUDO_CYCLE) if(opcode_cycle == 0) + { +#ifdef DEBUGGER + if (Settings.TraceSMP) + { + disassemble_opcode(tmp, regs.pc); + S9xTraceMessage (tmp); + } +#endif opcode_number = op_readpc(); + } + switch(opcode_number) { #include "core/oppseudo_misc.cpp" diff --git a/apu/bapu/smp/core/oppseudo_mov.cpp b/apu/bapu/smp/core/oppseudo_mov.cpp index a2219255c01395c1a36ea8676a117d7bf0de64c2..2d44bf15419c86581b4ceaba5f0c45cffb4232a1 100644 --- a/apu/bapu/smp/core/oppseudo_mov.cpp +++ b/apu/bapu/smp/core/oppseudo_mov.cpp @@ -373,7 +373,8 @@ case 0xaf: { switch(++opcode_cycle) { case 1: op_io(2); - case 2: + break; + case 2: op_writedp(regs.x++, regs.B.a); opcode_cycle = 0; break; diff --git a/apu/bapu/smp/debugger/disassembler.cpp b/apu/bapu/smp/debugger/disassembler.cpp index fb76ae922da87edc128728ed85b2511b012e2130..624c8acb336ff61366eca17ff5500bee0fad33f2 100644 --- a/apu/bapu/smp/debugger/disassembler.cpp +++ b/apu/bapu/smp/debugger/disassembler.cpp @@ -288,7 +288,7 @@ void SMP::disassemble_opcode(char *output, uint16 addr) { strcat(s, t); sprintf(t, "A:%.2x X:%.2x Y:%.2x SP:01%.2x YA:%.4x ", - regs.a, regs.x, regs.y, regs.sp, (uint16)regs.ya); + regs.B.a, regs.x, regs.B.y, regs.sp, (uint16)regs.ya); strcat(s, t); sprintf(t, "%c%c%c%c%c%c%c%c", @@ -301,4 +301,9 @@ void SMP::disassemble_opcode(char *output, uint16 addr) { regs.p.z ? 'Z' : 'z', regs.p.c ? 'C' : 'c'); strcat(s, t); + + sprintf(t, " %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x", + apuram[0xf4], apuram[0xf5], apuram[0xf6], apuram[0xf7], + cpu.port_read(0), cpu.port_read(1), cpu.port_read(2), cpu.port_read(3)); + strcat(s, t); } diff --git a/apu/bapu/smp/smp.cpp b/apu/bapu/smp/smp.cpp index d0b08cf82e6248bdf933cee2f83a5ae959d5e669..5b6b49488bc07ddb2ce5c26e22743654c2dde448 100644 --- a/apu/bapu/smp/smp.cpp +++ b/apu/bapu/smp/smp.cpp @@ -1,17 +1,24 @@ -#define CYCLE_ACCURATE -#define PSEUDO_CYCLE - -#include - -#define SMP_CPP -namespace SNES { - -#if defined(DEBUGGER) - #include "debugger/debugger.cpp" - #include "debugger/disassembler.cpp" - SMPDebugger smp; -#else - SMP smp; +#define CYCLE_ACCURATE +#define PSEUDO_CYCLE + +#ifdef DEBUGGER +#include "../../../snes9x.h" +#include "../../../debug.h" +char tmp[1024]; +#endif + +#include + +#define SMP_CPP +namespace SNES { + +// TODO: reactivate once APU debugger works again +#ifdef DEBUGGER +// #include "debugger/debugger.cpp" + #include "debugger/disassembler.cpp" + SMP smp; +#else + SMP smp; #endif #include "algorithms.cpp" @@ -152,6 +159,7 @@ SMP::SMP() { } SMP::~SMP() { + delete[] apuram; } } diff --git a/apu/bapu/smp/smp.hpp b/apu/bapu/smp/smp.hpp index cce64a6951ac2ef375034045ca1cce6cdfbc9fba..e8c77a9ac1fe8d55bdc10121cee5f024cc66ad90 100644 --- a/apu/bapu/smp/smp.hpp +++ b/apu/bapu/smp/smp.hpp @@ -122,9 +122,15 @@ public: inline uint8 op_lsr (uint8 x); inline uint8 op_rol (uint8 x); inline uint8 op_ror (uint8 x); +#ifdef DEBUGGER + void disassemble_opcode(char *output, uint16 addr); + inline uint8 disassemble_read(uint16 addr); + inline uint16 relb(int8 offset, int op_len); +#endif }; -#if defined(DEBUGGER) +// TODO: reactivate once APU debugger works again +#if 0 // DEBUGGER #include "debugger/debugger.hpp" extern SMPDebugger smp; #else diff --git a/apu/hermite_resampler.h b/apu/hermite_resampler.h index b84d0eef01832af658053273a7f0d58e5d3ae29d..602b56286c506041adc9aaa9da75356072fdf26b 100644 --- a/apu/hermite_resampler.h +++ b/apu/hermite_resampler.h @@ -66,12 +66,12 @@ class HermiteResampler : public Resampler void read (short *data, int num_samples) { - //If we are outputting the exact same ratio as the input, pull directly from the input buffer - if (r_step == 1.0) - { - ring_buffer::pull((unsigned char*)data, num_samples * sizeof(short)); - return; - } + //If we are outputting the exact same ratio as the input, pull directly from the input buffer + if (r_step == 1.0) + { + ring_buffer::pull((unsigned char*)data, num_samples * sizeof(short)); + return; + } int i_position = start >> 1; int max_samples = buffer_size >> 1; @@ -88,7 +88,7 @@ class HermiteResampler : public Resampler while (r_frac <= 1.0 && o_position < num_samples) { hermite_val[0] = hermite (r_frac, r_left [0], r_left [1], r_left [2], r_left [3]); - hermite_val[1] = hermite (r_frac, r_right[0], r_right[1], r_right[2], r_right[3]); + hermite_val[1] = hermite (r_frac, r_right[0], r_right[1], r_right[2], r_right[3]); data[o_position] = SHORT_CLAMP (hermite_val[0]); data[o_position + 1] = SHORT_CLAMP (hermite_val[1]); @@ -127,13 +127,13 @@ class HermiteResampler : public Resampler inline int avail (void) { - //If we are outputting the exact same ratio as the input, find out directly from the input buffer - if (r_step == 1.0) - { - return (ring_buffer::space_filled() + sizeof(short) - 1) / sizeof(short); - } + //If we are outputting the exact same ratio as the input, find out directly from the input buffer + if (r_step == 1.0) + { + return (ring_buffer::space_filled() + sizeof(short) - 1) / sizeof(short); + } - return (int) floor (((size >> 2) - r_frac) / r_step) * 2; + return (int) floor (((size >> 2) - r_frac) / r_step) * 2; } }; diff --git a/apu/resampler.h b/apu/resampler.h index 267546fdcfa3176cbf48efb02b2c3cf3b4747e91..4f8cf6f6a392d59c86b51bde408a86ff9282039e 100644 --- a/apu/resampler.h +++ b/apu/resampler.h @@ -12,7 +12,7 @@ class Resampler : public ring_buffer virtual void time_ratio (double) = 0; virtual void read (short *, int) = 0; virtual int avail (void) = 0; - + Resampler (int num_samples) : ring_buffer (num_samples << 1) { } @@ -33,19 +33,19 @@ class Resampler : public ring_buffer } inline int - space_empty (void) + space_empty (void) const { return buffer_size - size; } - + inline int - space_filled (void) + space_filled (void) const { return size; } - + inline int - max_write (void) + max_write (void) const { return space_empty () >> 1; } diff --git a/apu/ring_buffer.h b/apu/ring_buffer.h index b743c471ce283ce82af46f0eb9ff71807d6cd1eb..eb8cbda905ca58c0559fd4934ea358383a0475de 100644 --- a/apu/ring_buffer.h +++ b/apu/ring_buffer.h @@ -69,13 +69,13 @@ public: } inline int - space_empty (void) + space_empty (void) const { return buffer_size - size; } inline int - space_filled (void) + space_filled (void) const { return size; } @@ -96,7 +96,7 @@ public: buffer = new unsigned char[buffer_size]; memset (buffer, 0, this->buffer_size); - size = 0; + this->size = 0; start = 0; } diff --git a/bsx.cpp b/bsx.cpp index 34f1fbcef432a930652d429664cb4a84597e3007..756dc4b883e376f7ce87b067c2144ca22eab9c7f 100644 --- a/bsx.cpp +++ b/bsx.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -192,11 +197,12 @@ #include "snes9x.h" #include "memmap.h" #include "display.h" +#include //#define BSX_DEBUG #define BIOS_SIZE 0x100000 -#define FLASH_SIZE 0x200000 +#define FLASH_SIZE 0x100000 #define PSRAM_SIZE 0x80000 #define Map Memory.Map @@ -215,6 +221,10 @@ struct SBSX_RTC { + int year; + int month; + int dayweek; + int day; int hours; int minutes; int seconds; @@ -228,7 +238,7 @@ static const uint8 flashcard[20] = { 0x4D, 0x00, 0x50, 0x00, // vendor id 0x00, 0x00, // ? - 0x2B, 0x00, // 2MB Flash (1MB = 0x2A) + 0x1A, 0x00, // 2MB Flash (1MB = 0x2A) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -258,10 +268,7 @@ static void BSX_Map_SRAM (void); static void BSX_Map_PSRAM (void); static void BSX_Map_BIOS (void); static void BSX_Map_RAM (void); -static void BSX_Map_Dirty (void); static void BSX_Map (void); -static void BSX_Set_Bypass_FlashIO (uint16, uint8); -static uint8 BSX_Get_Bypass_FlashIO (uint16); static bool8 BSX_LoadBIOS (void); static void map_psram_mirror_sub (uint32); static int is_bsx (unsigned char *); @@ -367,18 +374,32 @@ static void BSX_Map_MMC (void) static void BSX_Map_FlashIO (void) { - int c; + int i, c; - if (BSX.MMC[0x0C] || BSX.MMC[0x0D]) + if (BSX.prevMMC[0x0C]) { - // Bank C0:0000, 2AAA, 5555, FF00-FF1F - for (c = 0; c < 16; c++) + // Banks 00->3F and 80->BF + for (c = 0; c < 0x400; c += 16) { - Map[c + 0xC00] = (uint8 *) MAP_BSX; - BlockIsRAM[c + 0xC00] = TRUE; - BlockIsROM[c + 0xC00] = FALSE; + for (i = c + 8; i < c + 16; i++) + { + Map[i] = Map[i + 0x800] = (uint8 *)MAP_BSX; + BlockIsRAM[i] = BlockIsRAM[i + 0x800] = TRUE; + BlockIsROM[i] = BlockIsROM[i + 0x800] = FALSE; + } } - } + + // Banks 40->7F and C0->FF + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + Map[i + 0x400] = Map[i + 0xC00] = (uint8 *)MAP_BSX; + BlockIsRAM[i + 0x400] = BlockIsRAM[i + 0xC00] = TRUE; + BlockIsROM[i + 0x400] = BlockIsROM[i + 0xC00] = FALSE; + } + } + } } static void BSX_Map_SRAM (void) @@ -400,30 +421,49 @@ static void map_psram_mirror_sub (uint32 bank) bank <<= 4; - if (BSX.MMC[0x02]) + if (BSX.prevMMC[0x02]) { - for (c = 0; c < 0x100; c += 16) + //HiROM + for (c = 0; c < 0x80; c += 16) { - for (i = c; i < c + 16; i++) + if ((bank & 0x7F0) >= 0x400) { - Map[i + bank] = &PSRAM[(c << 12) % PSRAM_SIZE]; - BlockIsRAM[i + bank] = TRUE; - BlockIsROM[i + bank] = FALSE; + for (i = c; i < c + 16; i++) + { + Map[i + bank] = &PSRAM[(c << 12) % PSRAM_SIZE]; + BlockIsRAM[i + bank] = TRUE; + BlockIsROM[i + bank] = FALSE; + } + } + else + { + for (i = c + 8; i < c + 16; i++) + { + Map[i + bank] = &PSRAM[(c << 12) % PSRAM_SIZE]; + BlockIsRAM[i + bank] = TRUE; + BlockIsROM[i + bank] = FALSE; + } } } } else { + //LoROM for (c = 0; c < 0x100; c += 16) { - for (i = c; i < c + 8; i++) - Map[i + bank] = &PSRAM[(c << 11) % PSRAM_SIZE]; + if ((bank & 0x7F0) >= 0x400) + { + for (i = c; i < c + 8; i++) + { + Map[i + bank] = &PSRAM[(c << 11) % PSRAM_SIZE]; + BlockIsRAM[i + bank] = TRUE; + BlockIsROM[i + bank] = FALSE; + } + } for (i = c + 8; i < c + 16; i++) - Map[i + bank] = &PSRAM[(c << 11) % PSRAM_SIZE] - 0x8000; - - for (i = c; i < c + 16; i++) { + Map[i + bank] = &PSRAM[(c << 11) % PSRAM_SIZE] - 0x8000; BlockIsRAM[i + bank] = TRUE; BlockIsROM[i + bank] = FALSE; } @@ -431,42 +471,149 @@ static void map_psram_mirror_sub (uint32 bank) } } -static void BSX_Map_PSRAM (void) +static void BSX_Map_PSRAM(void) { int c; - // Banks 70->77:0000-FFFF - // FIXME: could be toggled by $03 - for (c = 0; c < 0x80; c++) + if (!BSX.prevMMC[0x02]) { - Map[c + 0x700] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; - BlockIsRAM[c + 0x700] = TRUE; - BlockIsROM[c + 0x700] = FALSE; - } + //LoROM Mode + if (!BSX.prevMMC[0x05] && !BSX.prevMMC[0x06]) + { + //Map PSRAM to 00-0F/80-8F + if (BSX.prevMMC[0x03]) + map_psram_mirror_sub(0x00); - // Banks 20->3F:6000-7FFF mirrors 70->77:6000-7FFF - for (c = 0x200; c < 0x400; c += 16) - { - Map[c + 6] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; - Map[c + 7] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; - BlockIsRAM[c + 6] = TRUE; - BlockIsRAM[c + 7] = TRUE; - BlockIsROM[c + 6] = FALSE; - BlockIsROM[c + 7] = FALSE; + if (BSX.prevMMC[0x04]) + map_psram_mirror_sub(0x80); + } + else if (BSX.prevMMC[0x05] && !BSX.prevMMC[0x06]) + { + //Map PSRAM to 20-2F/A0-AF + if (BSX.prevMMC[0x03]) + map_psram_mirror_sub(0x20); + + if (BSX.prevMMC[0x04]) + map_psram_mirror_sub(0xA0); + } + else if (!BSX.prevMMC[0x05] && BSX.prevMMC[0x06]) + { + //Map PSRAM to 40-4F/C0-CF + if (BSX.prevMMC[0x03]) + map_psram_mirror_sub(0x40); + + if (BSX.prevMMC[0x04]) + map_psram_mirror_sub(0xC0); + } + else + { + //Map PSRAM to 60-6F/E0-EF + if (BSX.prevMMC[0x03]) + map_psram_mirror_sub(0x60); + + if (BSX.prevMMC[0x04]) + map_psram_mirror_sub(0xE0); + } + + //Map PSRAM to 70-7D/F0-FF + if (BSX.prevMMC[0x03]) + map_psram_mirror_sub(0x70); + + if (BSX.prevMMC[0x04]) + map_psram_mirror_sub(0xF0); } + else + { + //HiROM Mode + if (!BSX.prevMMC[0x05] && !BSX.prevMMC[0x06]) + { + //Map PSRAM to 00-07/40-47 / 80-87/C0-C7 + if (BSX.prevMMC[0x03]) + { + map_psram_mirror_sub(0x00); + map_psram_mirror_sub(0x40); + } + + if (BSX.prevMMC[0x04]) + { + map_psram_mirror_sub(0x80); + map_psram_mirror_sub(0xC0); + } + } + else if (BSX.prevMMC[0x05] && !BSX.prevMMC[0x06]) + { + //Map PSRAM to 10-17/50-57 / 90-97-D0-D7 + if (BSX.prevMMC[0x03]) + { + map_psram_mirror_sub(0x10); + map_psram_mirror_sub(0x50); + } + + if (BSX.prevMMC[0x04]) + { + map_psram_mirror_sub(0x90); + map_psram_mirror_sub(0xD0); + } + } + else if (!BSX.prevMMC[0x05] && BSX.prevMMC[0x06]) + { + //Map PSRAM to 20-27/60-67 / A0-A7/E0-E7 + if (BSX.prevMMC[0x03]) + { + map_psram_mirror_sub(0x20); + map_psram_mirror_sub(0x60); + } - if (!BSX.MMC[0x05]) - // Banks 40->4F:0000-FFFF mirrors 70->77:0000-7FFF - map_psram_mirror_sub(0x40); + if (BSX.prevMMC[0x04]) + { + map_psram_mirror_sub(0xA0); + map_psram_mirror_sub(0xE0); + } + } + else + { + //Map PSRAM to 30-37/70-77 / B0-B7/F0-F7 + if (BSX.prevMMC[0x03]) + { + map_psram_mirror_sub(0x30); + map_psram_mirror_sub(0x70); + } - if (!BSX.MMC[0x06]) - // Banks 50->5F:0000-FFFF mirrors 70->77:0000-7FFF - map_psram_mirror_sub(0x50); + if (BSX.prevMMC[0x04]) + { + map_psram_mirror_sub(0xB0); + map_psram_mirror_sub(0xF0); + } + } + + if (BSX.prevMMC[0x03]) + { + //Map PSRAM to 20->3F:6000-7FFF + for (c = 0x200; c < 0x400; c += 16) + { + Map[c + 6] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; + Map[c + 7] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; + BlockIsRAM[c + 6] = TRUE; + BlockIsRAM[c + 7] = TRUE; + BlockIsROM[c + 6] = FALSE; + BlockIsROM[c + 7] = FALSE; + } + } - // FIXME - if (!BSX.MMC[0x03]) - // Banks 60->6F:0000-FFFF mirrors 70->77:0000-7FFF (?) - map_psram_mirror_sub(0x60); + if (BSX.prevMMC[0x04]) + { + //Map PSRAM to A0->BF:6000-7FFF + for (c = 0xA00; c < 0xC00; c += 16) + { + Map[c + 6] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; + Map[c + 7] = &PSRAM[((c & 0x70) << 12) % PSRAM_SIZE]; + BlockIsRAM[c + 6] = TRUE; + BlockIsRAM[c + 7] = TRUE; + BlockIsROM[c + 6] = FALSE; + BlockIsROM[c + 7] = FALSE; + } + } + } } static void BSX_Map_BIOS (void) @@ -474,7 +621,7 @@ static void BSX_Map_BIOS (void) int i,c; // Banks 00->1F:8000-FFFF - if (BSX.MMC[0x07]) + if (BSX.prevMMC[0x07]) { for (c = 0; c < 0x200; c += 16) { @@ -488,7 +635,7 @@ static void BSX_Map_BIOS (void) } // Banks 80->9F:8000-FFFF - if (BSX.MMC[0x08]) + if (BSX.prevMMC[0x08]) { for (c = 0; c < 0x200; c += 16) { @@ -518,39 +665,6 @@ static void BSX_Map_RAM (void) } } -static void BSX_Map_Dirty (void) -{ - // for the quick bank change - - int i, c; - - // Banks 00->1F and 80->9F:8000-FFFF - if (BSX.MMC[0x02]) - { - for (c = 0; c < 0x200; c += 16) - { - for (i = c + 8; i < c + 16; i++) - { - Map[i] = Map[i + 0x800] = &MapROM[(c << 12) % FlashSize]; - BlockIsRAM[i] = BlockIsRAM[i + 0x800] = BSX.write_enable; - BlockIsROM[i] = BlockIsROM[i + 0x800] = !BSX.write_enable; - } - } - } - else - { - for (c = 0; c < 0x200; c += 16) - { - for (i = c + 8; i < c + 16; i++) - { - Map[i] = Map[i + 0x800] = &MapROM[(c << 11) % FlashSize] - 0x8000; - BlockIsRAM[i] = BlockIsRAM[i + 0x800] = BSX.write_enable; - BlockIsROM[i] = BlockIsROM[i + 0x800] = !BSX.write_enable; - } - } - } -} - static void BSX_Map (void) { #ifdef BSX_DEBUG @@ -561,42 +675,22 @@ static void BSX_Map (void) memcpy(BSX.prevMMC, BSX.MMC, sizeof(BSX.MMC)); - // Do a quick bank change - if (BSX.dirty2 && !BSX.dirty) - { - BSX_Map_Dirty(); - BSX_Map_BIOS(); - - BSX.dirty2 = FALSE; - - Memory.map_WriteProtectROM(); - return; - } - - if (BSX.MMC[0x01]) - { - MapROM = PSRAM; - FlashSize = PSRAM_SIZE; - } - else - { - MapROM = FlashROM; - FlashSize = FLASH_SIZE; - } - - BSX_Map_SNES(); - - if (BSX.MMC[0x02]) + MapROM = FlashROM; + FlashSize = FLASH_SIZE; + + if (BSX.prevMMC[0x02]) BSX_Map_HiROM(); else BSX_Map_LoROM(); - + + BSX_Map_FlashIO(); BSX_Map_PSRAM(); + + BSX_Map_SNES(); BSX_Map_SRAM(); BSX_Map_RAM(); BSX_Map_BIOS(); - BSX_Map_FlashIO(); BSX_Map_MMC(); // Monitor new register changes @@ -606,30 +700,26 @@ static void BSX_Map (void) Memory.map_WriteProtectROM(); } -static uint8 BSX_Get_Bypass_FlashIO (uint16 offset) +static uint8 BSX_Get_Bypass_FlashIO (uint32 offset) { - if (BSX.MMC[0x02]) - return (MapROM[offset]); + //For games other than BS-X + FlashROM = Memory.ROM + Multi.cartOffsetB; + + if (BSX.prevMMC[0x02]) + return (FlashROM[offset & 0x0FFFFF]); else - { - if (offset < 0x8000) - return (MapROM[offset]); - else - return (MapROM[offset - 0x8000]); - } + return (FlashROM[(offset & 0x1F0000) >> 1 | (offset & 0x7FFF)]); } -static void BSX_Set_Bypass_FlashIO (uint16 offset, uint8 byte) +static void BSX_Set_Bypass_FlashIO (uint32 offset, uint8 byte) { - if (BSX.MMC[0x02]) - MapROM[offset] = byte; + //For games other than BS-X + FlashROM = Memory.ROM + Multi.cartOffsetB; + + if (BSX.prevMMC[0x02]) + FlashROM[offset & 0x0FFFFF] = FlashROM[offset & 0x0FFFFF] & byte; else - { - if (offset < 0x8000) - MapROM[offset] = byte; - else - MapROM[offset - 0x8000] = byte; - } + FlashROM[(offset & 0x1F0000) >> 1 | (offset & 0x7FFF)] = FlashROM[(offset & 0x1F0000) >> 1 | (offset & 0x7FFF)] & byte; } uint8 S9xGetBSX (uint32 address) @@ -639,43 +729,54 @@ uint8 S9xGetBSX (uint32 address) uint8 t = 0; // MMC - if ((bank >= 0x01 && bank <= 0x0E) && (offset == 0x5000)) + if ((bank >= 0x01 && bank <= 0x0E) && ((address & 0xF000) == 0x5000)) return (BSX.MMC[bank]); - // Flash IO - if (bank == 0xC0) + // Flash Mapping + + // default: read-through mode + t = BSX_Get_Bypass_FlashIO(address); + + // note: may be more registers, purposes unknown + switch (offset) { - // default: read-through mode - t = BSX_Get_Bypass_FlashIO(offset); + case 0x0002: + case 0x8002: + if (BSX.flash_bsr) + t = 0xC0; // Page Status Register + break; - // note: may be more registers, purposes unknown - switch (offset) - { - case 0x0002: - if (BSX.flash_enable) - t = 0x80; // status register? - break; + case 0x0004: + case 0x8004: + if (BSX.flash_gsr) + t = 0x82; // Global Status Register + break; - case 0x5555: - if (BSX.flash_enable) - t = 0x80; // ??? - break; + case 0x5555: + if (BSX.flash_enable) + t = 0x80; // ??? + break; - case 0xFF00: - case 0xFF02: - case 0xFF04: - case 0xFF06: - case 0xFF08: - case 0xFF0A: - case 0xFF0C: - case 0xFF0E: - case 0xFF10: - case 0xFF12: - // return flash vendor information - if (BSX.read_enable) - t = flashcard[offset - 0xFF00]; - break; - } + case 0xFF00: + case 0xFF02: + case 0xFF04: + case 0xFF06: + case 0xFF08: + case 0xFF0A: + case 0xFF0C: + case 0xFF0E: + case 0xFF10: + case 0xFF12: + // return flash vendor information + if (BSX.read_enable) + t = flashcard[offset - 0xFF00]; + break; + } + + if (BSX.flash_csr) + { + t = 0x80; // Compatible Status Register + BSX.flash_csr = false; } return (t); @@ -684,122 +785,238 @@ uint8 S9xGetBSX (uint32 address) void S9xSetBSX (uint8 byte, uint32 address) { uint8 bank = (address >> 16) & 0xFF; - uint16 offset = address & 0xFFFF; // MMC - if ((bank >= 0x01 && bank <= 0x0E) && (offset == 0x5000)) + if ((bank >= 0x01 && bank <= 0x0E) && ((address & 0xF000) == 0x5000)) { - switch (bank) + //Avoid updating the memory map when it is not needed + if (bank == 0x0E && BSX.dirty) { - case 0x01: - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - case 0x09: - case 0x0A: - case 0x0B: - case 0x0C: - case 0x0D: - if (BSX.MMC[bank] != byte) - { - BSX.MMC[bank] = byte; - BSX.dirty = TRUE; - } - break; - - case 0x07: - case 0x08: - if (BSX.MMC[bank] != byte) - { - BSX.MMC[bank] = byte; - BSX.dirty2 = TRUE; - } - break; - - case 0x0E: - BSX.MMC[bank] = byte; - if (byte && (BSX.dirty || BSX.dirty2)) - BSX_Map(); - break; + BSX_Map(); + BSX.dirty = FALSE; + } + else if (bank != 0x0E && BSX.MMC[bank] != byte) + { + BSX.dirty = TRUE; } + + BSX.MMC[bank] = byte; } // Flash IO - if (bank == 0xC0) + + // Write to Flash + if (BSX.write_enable) { - BSX.old_write = BSX.new_write; - BSX.new_write = address; + BSX_Set_Bypass_FlashIO(address, byte); + BSX.write_enable = false; + return; + } - // ???: double writes to the desired address will bypass - // flash registers - if (BSX.old_write == BSX.new_write && BSX.write_enable) - { - BSX_Set_Bypass_FlashIO(offset, byte); - return; - } + // Flash Command Handling + + //Memory Pack Type 1 & 3 & 4 + BSX.flash_command <<= 8; + BSX.flash_command |= byte; - // flash command handling - // note: incomplete - switch (offset) - { - case 0x0000: - BSX.flash_command <<= 8; - BSX.flash_command |= byte; - if ((BSX.flash_command & 0xFFFF) == 0x38D0) - { - // retrieve information about the flash card - BSX.flash_enable = TRUE; - BSX.read_enable = TRUE; - } - break; + switch (BSX.flash_command & 0xFF) + { + case 0x00: + case 0xFF: + //Reset to normal + BSX.flash_enable = false; + BSX.flash_bsr = false; + BSX.flash_csr = false; + BSX.flash_gsr = false; + BSX.read_enable = false; + BSX.write_enable = false; + BSX.flash_cmd_done = true; + break; - case 0x2AAA: - BSX.flash_command <<= 8; - BSX.flash_command |= byte; - break; + case 0x10: + case 0x40: + //Write Byte + BSX.flash_enable = false; + BSX.flash_bsr = false; + BSX.flash_csr = true; + BSX.flash_gsr = false; + BSX.read_enable = false; + BSX.write_enable = true; + BSX.flash_cmd_done = true; + break; - case 0x5555: - BSX.flash_command <<= 8; - BSX.flash_command |= byte; + case 0x50: + //Clear Status Register + BSX.flash_enable = false; + BSX.flash_bsr = false; + BSX.flash_csr = false; + BSX.flash_gsr = false; + BSX.flash_cmd_done = true; + break; - switch (BSX.flash_command & 0xFFFFFF) - { - case 0xAA55F0: - // turn off flash i/o - BSX.flash_enable = FALSE; - BSX.write_enable = FALSE; - BSX.read_enable = FALSE; - break; - - case 0xAA55A0: - // enable writing to flash - BSX.old_write = 0; - BSX.new_write = 0; - BSX.flash_enable = TRUE; - BSX.write_enable = TRUE; - BSX_Map(); - break; - - case 0xAA5570: - // turn on write-protection - BSX.write_enable = FALSE; - BSX_Map(); - break; - - case 0xAA5580: - case 0xAA5510: - // ??? - break; + case 0x70: + //Read CSR + BSX.flash_enable = false; + BSX.flash_bsr = false; + BSX.flash_csr = true; + BSX.flash_gsr = false; + BSX.read_enable = false; + BSX.write_enable = false; + BSX.flash_cmd_done = true; + break; - } + case 0x71: + //Read Extended Status Registers (Page and Global) + BSX.flash_enable = false; + BSX.flash_bsr = true; + BSX.flash_csr = false; + BSX.flash_gsr = true; + BSX.read_enable = false; + BSX.write_enable = false; + BSX.flash_cmd_done = true; + break; - break; - } + case 0x75: + //Show Page Buffer / Vendor Info + BSX.flash_csr = false; + BSX.read_enable = true; + BSX.flash_cmd_done = true; + break; + + case 0xD0: + //DO COMMAND + switch (BSX.flash_command & 0xFFFF) + { + case 0x20D0: //Block Erase + uint32 x; + for (x = 0; x < 0x10000; x++) { + //BSX_Set_Bypass_FlashIO(((address & 0xFF0000) + x), 0xFF); + if (BSX.MMC[0x02]) + FlashROM[(address & 0x0F0000) + x] = 0xFF; + else + FlashROM[((address & 0x1E0000) >> 1) + x] = 0xFF; + } + break; + + case 0xA7D0: //Chip Erase (ONLY IN TYPE 1 AND 4) + if ((flashcard[6] & 0xF0) == 0x10 || (flashcard[6] & 0xF0) == 0x40) + { + uint32 x; + for (x = 0; x < FLASH_SIZE; x++) { + //BSX_Set_Bypass_FlashIO(x, 0xFF); + FlashROM[x] = 0xFF; + } + } + break; + + case 0x38D0: //Flashcart Reset + break; + } + break; + } +} + +void S9xBSXSetStream1 (uint8 count) +{ + if (BSX.sat_stream1.is_open()) + BSX.sat_stream1.close(); //If Stream already opened for one file: Close it. + + char path[PATH_MAX + 1], name[PATH_MAX + 1]; + + strcpy(path, S9xGetDirectory(SAT_DIR)); + strcat(path, SLASH_STR); + + snprintf(name, PATH_MAX + 1, "BSX%04X-%d.bin", (BSX.PPU[0x2188 - BSXPPUBASE] | (BSX.PPU[0x2189 - BSXPPUBASE] * 256)), count); //BSXHHHH-DDD.bin + strcat(path, name); + + BSX.sat_stream1.clear(); + BSX.sat_stream1.open(path, std::ios::in | std::ios::binary); + if (BSX.sat_stream1.good()) + { + BSX.sat_stream1.seekg(0, BSX.sat_stream1.end); + long str1size = BSX.sat_stream1.tellg(); + BSX.sat_stream1.seekg(0, BSX.sat_stream1.beg); + float QueueSize = str1size / 22.; + BSX.sat_stream1_queue = (uint16)(ceil(QueueSize)); + BSX.PPU[0x218D - BSXPPUBASE] = 0; + BSX.sat_stream1_first = TRUE; + BSX.sat_stream1_loaded = TRUE; + } + else + { + BSX.sat_stream1_loaded = FALSE; + } +} + +void S9xBSXSetStream2 (uint8 count) +{ + if (BSX.sat_stream2.is_open()) + BSX.sat_stream2.close(); //If Stream already opened for one file: Close it. + + char path[PATH_MAX + 1], name[PATH_MAX + 1]; + + strcpy(path, S9xGetDirectory(SAT_DIR)); + strcat(path, SLASH_STR); + + snprintf(name, PATH_MAX + 1, "BSX%04X-%d.bin", (BSX.PPU[0x218E - BSXPPUBASE] | (BSX.PPU[0x218F - BSXPPUBASE] * 256)), count); //BSXHHHH-DDD.bin + strcat(path, name); + + BSX.sat_stream2.clear(); + BSX.sat_stream2.open(path, std::ios::in | std::ios::binary); + if (BSX.sat_stream2.good()) + { + BSX.sat_stream2.seekg(0, BSX.sat_stream2.end); + long str2size = BSX.sat_stream2.tellg(); + BSX.sat_stream2.seekg(0, BSX.sat_stream2.beg); + float QueueSize = str2size / 22.; + BSX.sat_stream2_queue = (uint16)(ceil(QueueSize)); + BSX.PPU[0x2193 - BSXPPUBASE] = 0; + BSX.sat_stream2_first = TRUE; + BSX.sat_stream2_loaded = TRUE; + } + else + { + BSX.sat_stream2_loaded = FALSE; } } +uint8 S9xBSXGetRTC (void) +{ + //Get Time + time_t t; + struct tm *tmr; + + time(&t); + tmr = localtime(&t); + + BSX.test2192[0] = 0x00; + BSX.test2192[1] = 0x00; + BSX.test2192[2] = 0x00; + BSX.test2192[3] = 0x00; + BSX.test2192[4] = 0x10; + BSX.test2192[5] = 0x01; + BSX.test2192[6] = 0x01; + BSX.test2192[7] = 0x00; + BSX.test2192[8] = 0x00; + BSX.test2192[9] = 0x00; + BSX.test2192[10] = BSX_RTC.seconds = tmr->tm_sec; + BSX.test2192[11] = BSX_RTC.minutes = tmr->tm_min; + BSX.test2192[12] = BSX_RTC.hours = tmr->tm_hour; + BSX.test2192[13] = BSX_RTC.dayweek = (tmr->tm_wday) + 1; + BSX.test2192[14] = BSX_RTC.day = tmr->tm_mday; + BSX.test2192[15] = BSX_RTC.month = (tmr->tm_mon) + 1; + BSX_RTC.year = tmr->tm_year + 1900; + BSX.test2192[16] = (BSX_RTC.year) & 0xFF; + BSX.test2192[17] = (BSX_RTC.year) >> 8; + + t = BSX.test2192[BSX.out_index++]; + + if (BSX.out_index > 22) + BSX.out_index = 0; + + return t; +} + uint8 S9xGetBSXPPU (uint16 address) { uint8 t; @@ -807,95 +1024,268 @@ uint8 S9xGetBSXPPU (uint16 address) // known read registers switch (address) { - // Test register low? (r/w) + //Stream 1 + // Logical Channel 1 + Data Structure (R/W) case 0x2188: t = BSX.PPU[0x2188 - BSXPPUBASE]; break; - // Test register high? (r/w) + // Logical Channel 2 (R/W) [6bit] case 0x2189: t = BSX.PPU[0x2189 - BSXPPUBASE]; break; + // Prefix Count (R) case 0x218A: - t = BSX.PPU[0x218A - BSXPPUBASE]; + if (!BSX.sat_pf_latch1_enable || !BSX.sat_dt_latch1_enable) + { + t = 0; + break; + } + + if (BSX.PPU[0x2188 - BSXPPUBASE] == 0 && BSX.PPU[0x2189 - BSXPPUBASE] == 0) + { + t = 1; + break; + } + + if (BSX.sat_stream1_queue <= 0) + { + BSX.sat_stream1_count++; + S9xBSXSetStream1(BSX.sat_stream1_count - 1); + } + + if (!BSX.sat_stream1_loaded && (BSX.sat_stream1_count - 1) > 0) + { + BSX.sat_stream1_count = 1; + S9xBSXSetStream1(BSX.sat_stream1_count - 1); + } + + if (BSX.sat_stream1_loaded) + { + //Lock at 0x7F for bigger packets + if (BSX.sat_stream1_queue >= 128) + BSX.PPU[0x218A - BSXPPUBASE] = 0x7F; + else + BSX.PPU[0x218A - BSXPPUBASE] = BSX.sat_stream1_queue; + t = BSX.PPU[0x218A - BSXPPUBASE]; + } + else + t = 0; break; + // Prefix Latch (R/W) + case 0x218B: + if (BSX.sat_pf_latch1_enable) + { + if (BSX.PPU[0x2188 - BSXPPUBASE] == 0 && BSX.PPU[0x2189 - BSXPPUBASE] == 0) + { + BSX.PPU[0x218B - BSXPPUBASE] = 0x90; + } + + if (BSX.sat_stream1_loaded) + { + uint8 temp = 0; + if (BSX.sat_stream1_first) + { + // First packet + temp |= 0x10; + BSX.sat_stream1_first = FALSE; + } + + BSX.sat_stream1_queue--; + + if (BSX.sat_stream1_queue == 0) + { + //Last packet + temp |= 0x80; + } + + BSX.PPU[0x218B - BSXPPUBASE] = temp; + } + + BSX.PPU[0x218D - BSXPPUBASE] |= BSX.PPU[0x218B - BSXPPUBASE]; + t = BSX.PPU[0x218B - BSXPPUBASE]; + } + else + { + t = 0; + } + break; + + // Data Latch (R/W) case 0x218C: - t = BSX.PPU[0x218C - BSXPPUBASE]; + if (BSX.sat_dt_latch1_enable) + { + if (BSX.PPU[0x2188 - BSXPPUBASE] == 0 && BSX.PPU[0x2189 - BSXPPUBASE] == 0) + { + BSX.PPU[0x218C - BSXPPUBASE] = S9xBSXGetRTC(); + } + else if (BSX.sat_stream1_loaded) + { + if (BSX.sat_stream1.eof()) + BSX.PPU[0x218C - BSXPPUBASE] = 0xFF; + else + BSX.PPU[0x218C - BSXPPUBASE] = BSX.sat_stream1.get(); + } + t = BSX.PPU[0x218C - BSXPPUBASE]; + } + else + { + t = 0; + } break; - // Transmission number low? (r/w) + // OR gate (R) + case 0x218D: + t = BSX.PPU[0x218D - BSXPPUBASE]; + BSX.PPU[0x218D - BSXPPUBASE] = 0; + break; + + //Stream 2 + // Logical Channel 1 + Data Structure (R/W) case 0x218E: t = BSX.PPU[0x218E - BSXPPUBASE]; break; - // Transmission number high? (r/w) + // Logical Channel 2 (R/W) [6bit] case 0x218F: t = BSX.PPU[0x218F - BSXPPUBASE]; break; - // Status register? (r) + // Prefix Count (R) case 0x2190: - t = BSX.PPU[0x2190 - BSXPPUBASE]; - break; - - // Data register? (r/w) - case 0x2192: - t = BSX.PPU[0x2192 - BSXPPUBASE]; + if (!BSX.sat_pf_latch2_enable || !BSX.sat_dt_latch2_enable) + { + t = 0; + break; + } - // test - t = BSX.test2192[BSX.out_index++]; - if (BSX.out_index == 32) - BSX.out_index = 0; + if (BSX.PPU[0x218E - BSXPPUBASE] == 0 && BSX.PPU[0x218F - BSXPPUBASE] == 0) + { + t = 1; + break; + } - BSX_RTC.ticks++; - if (BSX_RTC.ticks >= 1000) + if (BSX.sat_stream2_queue <= 0) { - BSX_RTC.ticks = 0; - BSX_RTC.seconds++; + BSX.sat_stream2_count++; + S9xBSXSetStream2(BSX.sat_stream2_count - 1); } - if (BSX_RTC.seconds >= 60) + + if (!BSX.sat_stream2_loaded && (BSX.sat_stream2_count - 1) > 0) { - BSX_RTC.seconds = 0; - BSX_RTC.minutes++; + BSX.sat_stream2_count = 1; + S9xBSXSetStream2(BSX.sat_stream2_count - 1); } - if (BSX_RTC.minutes >= 60) + + if (BSX.sat_stream2_loaded) { - BSX_RTC.minutes = 0; - BSX_RTC.hours++; + if (BSX.sat_stream2_queue >= 128) + BSX.PPU[0x2190 - BSXPPUBASE] = 0x7F; + else + BSX.PPU[0x2190 - BSXPPUBASE] = BSX.sat_stream2_queue; + t = BSX.PPU[0x2190 - BSXPPUBASE]; } - if (BSX_RTC.hours >= 24) - BSX_RTC.hours = 0; + else + t = 0; + break; + + // Prefix Latch (R/W) + case 0x2191: + if (BSX.sat_pf_latch2_enable) + { + if (BSX.PPU[0x218E - BSXPPUBASE] == 0 && BSX.PPU[0x218F - BSXPPUBASE] == 0) + { + BSX.PPU[0x2191 - BSXPPUBASE] = 0x90; + } - BSX.test2192[10] = BSX_RTC.seconds; - BSX.test2192[11] = BSX_RTC.minutes; - BSX.test2192[12] = BSX_RTC.hours; + if (BSX.sat_stream2_loaded) + { + uint8 temp = 0; + if (BSX.sat_stream2_first) + { + // First packet + temp |= 0x10; + BSX.sat_stream2_first = FALSE; + } + + BSX.sat_stream2_queue--; + + if (BSX.sat_stream2_queue == 0) + { + //Last packet + temp |= 0x80; + } + + BSX.PPU[0x2191 - BSXPPUBASE] = temp; + } + BSX.PPU[0x2193 - BSXPPUBASE] |= BSX.PPU[0x2191 - BSXPPUBASE]; + t = BSX.PPU[0x2191 - BSXPPUBASE]; + } + else + { + t = 0; + } break; - // Transmission status? (r/w) + // Data Latch (R/W) + case 0x2192: + if (BSX.sat_dt_latch2_enable) + { + if (BSX.PPU[0x218E - BSXPPUBASE] == 0 && BSX.PPU[0x218F - BSXPPUBASE] == 0) + { + BSX.PPU[0x2192 - BSXPPUBASE] = S9xBSXGetRTC(); + } + else if (BSX.sat_stream2_loaded) + { + if (BSX.sat_stream2.eof()) + BSX.PPU[0x2192 - BSXPPUBASE] = 0xFF; + else + BSX.PPU[0x2192 - BSXPPUBASE] = BSX.sat_stream2.get(); + } + t = BSX.PPU[0x2192 - BSXPPUBASE]; + } + else + { + t = 0; + } + break; + + // OR gate (R) case 0x2193: - // Data ready when bits 2/3 clear? - t = BSX.PPU[0x2193 - BSXPPUBASE] & ~0x0C; + t = BSX.PPU[0x2193 - BSXPPUBASE]; + BSX.PPU[0x2193 - BSXPPUBASE] = 0; break; - // Reset? (r/w) + //Other + // Satellaview LED / Stream Enable (R/W) [4bit] case 0x2194: t = BSX.PPU[0x2194 - BSXPPUBASE]; break; - // Unknown (r) + // Unknown + case 0x2195: + t = BSX.PPU[0x2195 - BSXPPUBASE]; + break; + + // Satellaview Status (R) case 0x2196: t = BSX.PPU[0x2196 - BSXPPUBASE]; break; - // Unknown (r/w) + // Soundlink Settings (R/W) case 0x2197: t = BSX.PPU[0x2197 - BSXPPUBASE]; break; - // Modem protocol? (r/w) + // Serial I/O - Serial Number (R/W) + case 0x2198: + t = BSX.PPU[0x2198 - BSXPPUBASE]; + break; + + // Serial I/O - Unknown (R/W) case 0x2199: t = BSX.PPU[0x2199 - BSXPPUBASE]; break; @@ -913,78 +1303,82 @@ void S9xSetBSXPPU (uint8 byte, uint16 address) // known write registers switch (address) { - // Test register low? (r/w) + //Stream 1 + // Logical Channel 1 + Data Structure (R/W) case 0x2188: + if (BSX.PPU[0x2188 - BSXPPUBASE] == byte) + { + BSX.sat_stream1_count = 0; + } BSX.PPU[0x2188 - BSXPPUBASE] = byte; break; - // Test register high? (r/w) + // Logical Channel 2 (R/W) [6bit] case 0x2189: - BSX.PPU[0x2189 - BSXPPUBASE] = byte; - break; - - case 0x218A: - BSX.PPU[0x218A - BSXPPUBASE] = byte; + if (BSX.PPU[0x2188 - BSXPPUBASE] == (byte & 0x3F)) + { + BSX.sat_stream1_count = 0; + } + BSX.PPU[0x2189 - BSXPPUBASE] = byte & 0x3F; break; + // Prefix Latch (R/W) case 0x218B: - BSX.PPU[0x218B - BSXPPUBASE] = byte; + BSX.sat_pf_latch1_enable = (byte != 0); break; + // Data Latch (R/W) case 0x218C: - BSX.PPU[0x218C - BSXPPUBASE] = byte; + if (BSX.PPU[0x2188 - BSXPPUBASE] == 0 && BSX.PPU[0x2189 - BSXPPUBASE] == 0) + { + BSX.out_index = 0; + } + BSX.sat_dt_latch1_enable = (byte != 0); break; - // Transmission number low? (r/w) + //Stream 2 + // Logical Channel 1 + Data Structure (R/W) case 0x218E: + if (BSX.PPU[0x218E - BSXPPUBASE] == byte) + { + BSX.sat_stream2_count = 0; + } BSX.PPU[0x218E - BSXPPUBASE] = byte; break; - // Transmission number high? (r/w) + // Logical Channel 2 (R/W) [6bit] case 0x218F: - BSX.PPU[0x218F - BSXPPUBASE] = byte; - - // ? - BSX.PPU[0x218E - BSXPPUBASE] >>= 1; - BSX.PPU[0x218E - BSXPPUBASE] = BSX.PPU[0x218F - BSXPPUBASE] - BSX.PPU[0x218E - BSXPPUBASE]; - BSX.PPU[0x218F - BSXPPUBASE] >>= 1; - - BSX.PPU[0x2190 - BSXPPUBASE] = 0x80; // ? + if (BSX.PPU[0x218F - BSXPPUBASE] == (byte & 0x3F)) + { + BSX.sat_stream2_count = 0; + } + BSX.PPU[0x218F - BSXPPUBASE] = byte & 0x3F; break; - // Strobe assert? (w) + // Prefix Latch (R/W) case 0x2191: - BSX.PPU[0x2191 - BSXPPUBASE] = byte; - BSX.out_index = 0; + BSX.sat_pf_latch2_enable = (byte != 0); break; - // Data register? (r/w) + // Data Latch (R/W) case 0x2192: - BSX.PPU[0x2192 - BSXPPUBASE] = 0x01; // ? - BSX.PPU[0x2190 - BSXPPUBASE] = 0x80; // ? - break; - - // Transmission status? (r/w) - case 0x2193: - BSX.PPU[0x2193 - BSXPPUBASE] = byte; + if (BSX.PPU[0x218E - BSXPPUBASE] == 0 && BSX.PPU[0x218F - BSXPPUBASE] == 0) + { + BSX.out_index = 0; + } + BSX.sat_dt_latch2_enable = (byte != 0); break; - // Reset? (r/w) + //Other + // Satellaview LED / Stream Enable (R/W) [4bit] case 0x2194: - BSX.PPU[0x2194 - BSXPPUBASE] = byte; + BSX.PPU[0x2194 - BSXPPUBASE] = byte & 0x0F; break; - // Unknown (r/w) + // Soundlink Settings (R/W) case 0x2197: BSX.PPU[0x2197 - BSXPPUBASE] = byte; break; - - // Modem protocol? (r/w) - case 0x2199: - // Lots of modem strings written here when - // connection is lost or no uplink established - BSX.PPU[0x2199 - BSXPPUBASE] = byte; - break; } } @@ -1044,7 +1438,7 @@ void S9xInitBSX (void) { Settings.BS = FALSE; - if (is_BSX_BIOS(Memory.ROM,Memory.CalculatedSize)) + if (is_BSX_BIOS(Memory.ROM,Memory.CalculatedSize)) { // BS-X itself @@ -1081,7 +1475,13 @@ void S9xInitBSX (void) uint8 *header = r1 ? Memory.ROM + 0x7FC0 : Memory.ROM + 0xFFC0; FlashMode = (header[0x18] & 0xEF) == 0x20 ? FALSE : TRUE; - FlashSize = (header[0x19] & 0x20) ? PSRAM_SIZE : FLASH_SIZE; + FlashSize = FLASH_SIZE; + + // Fix Block Allocation Flags + // (for games that don't have it setup properly, + // for exemple when taken seperately from the upper memory of the Memory Pack, + // else the game will error out on BS-X) + for (; (((header[0x10] & 1) == 0) && header[0x10] != 0); (header[0x10] >>= 1)); #ifdef BSX_DEBUG for (int i = 0; i <= 0x1F; i++) @@ -1103,7 +1503,7 @@ void S9xInitBSX (void) { MapROM = NULL; FlashROM = Memory.ROM; - + /* time_t t; struct tm *tmr; @@ -1118,6 +1518,7 @@ void S9xInitBSX (void) #ifdef BSX_DEBUG printf("BS: Current Time: %02d:%02d:%02d\n", BSX_RTC.hours, BSX_RTC.minutes, BSX_RTC.seconds); #endif + */ SNESGameFixes.SRAMInitialValue = 0x00; } } @@ -1144,34 +1545,32 @@ void S9xResetBSX (void) memset(BSX.output, 0, sizeof(BSX.output)); // starting from the bios - if (BSX.bootup) - BSX.MMC[0x07] = BSX.MMC[0x08] = 0x80; - else - { - BSX.MMC[0x02] = FlashMode ? 0x80: 0; + BSX.MMC[0x02] = BSX.MMC[0x03] = BSX.MMC[0x05] = BSX.MMC[0x06] = 0x80; + BSX.MMC[0x09] = BSX.MMC[0x0B] = 0x80; - // per bios: run from psram or flash card - if (FlashSize == PSRAM_SIZE) - { - memcpy(PSRAM, FlashROM, PSRAM_SIZE); + BSX.MMC[0x07] = BSX.MMC[0x08] = 0x80; + BSX.MMC[0x0E] = 0x80; - BSX.MMC[0x01] = 0x80; - BSX.MMC[0x03] = 0x80; - BSX.MMC[0x04] = 0x80; - BSX.MMC[0x0C] = 0x80; - BSX.MMC[0x0D] = 0x80; - } - else - { - BSX.MMC[0x03] = 0x80; - BSX.MMC[0x05] = 0x80; - BSX.MMC[0x06] = 0x80; - } + // default register values + BSX.PPU[0x2196 - BSXPPUBASE] = 0x10; + BSX.PPU[0x2197 - BSXPPUBASE] = 0x80; - BSX.MMC[0x0E] = 0x80; - } + // stream reset + BSX.sat_pf_latch1_enable = BSX.sat_dt_latch1_enable = FALSE; + BSX.sat_pf_latch2_enable = BSX.sat_dt_latch2_enable = FALSE; - BSX_Map(); + BSX.sat_stream1_loaded = BSX.sat_stream2_loaded = FALSE; + BSX.sat_stream1_first = BSX.sat_stream2_first = FALSE; + BSX.sat_stream1_count = BSX.sat_stream2_count = 0; + + if (BSX.sat_stream1.is_open()) + BSX.sat_stream1.close(); + + if (BSX.sat_stream2.is_open()) + BSX.sat_stream2.close(); + + if (Settings.BS) + BSX_Map(); } void S9xBSXPostLoadState (void) diff --git a/bsx.h b/bsx.h index c87d8060322d278fca16b75420b1486ad2cfa5d2..03bdd174efddeb2bf7e741e91a012488be9014c4 100644 --- a/bsx.h +++ b/bsx.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -188,6 +193,8 @@ #ifndef _BSX_H_ #define _BSX_H_ +#include + struct SBSX { bool8 dirty; // Changed register values @@ -205,6 +212,22 @@ struct SBSX uint8 MMC[16]; uint8 prevMMC[16]; uint8 test2192[32]; + + bool flash_csr; + bool flash_gsr; + bool flash_bsr; + bool flash_cmd_done; + + std::ifstream sat_stream1; + std::ifstream sat_stream2; + + bool sat_pf_latch1_enable, sat_dt_latch1_enable; + bool sat_pf_latch2_enable, sat_dt_latch2_enable; + + bool sat_stream1_loaded, sat_stream2_loaded; + bool sat_stream1_first, sat_stream2_first; + uint8 sat_stream1_count, sat_stream2_count; + uint16 sat_stream1_queue, sat_stream2_queue; }; extern struct SBSX BSX; diff --git a/c4.cpp b/c4.cpp index 7877cdce44f6df5b94ab38f4fac1ec310d3ceead..922c205cf4dc7fa190154d55346b366e514eb72d 100644 --- a/c4.cpp +++ b/c4.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/c4.h b/c4.h index 7778ddae1d7531a216af88963fc56537cf316e9b..bbd37803ea37870f7b2ae4ab4391d426db93050e 100644 --- a/c4.h +++ b/c4.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/c4emu.cpp b/c4emu.cpp index 85fee9a44f45752cfa5996d3d6bfcf0c964b2c14..655ae9a443a6cb34d6d7c7e7b6e0fc203a085e64 100644 --- a/c4emu.cpp +++ b/c4emu.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles @@ -1207,11 +1207,12 @@ void S9xSetC4 (uint8 byte, uint16 Address) if (Memory.C4RAM[0x1f4d] != 0x0e) printf("$7f4d=%02x, expected 0e for command 54 %02x\n", Memory.C4RAM[0x1f4d], Memory.C4RAM[0x1f4d]); #endif - int64 b = (int64) READ_3WORD(Memory.C4RAM + 0x1f80); - int64 c = b << 40; - int64 a = SAR(c, 30); + // libretro: msvc2005 hack + int64 b = (int64) READ_3WORD(Memory.C4RAM + 0x1f80); + int64 c = b << 40; + int64 a = SAR(c, 30); //printf("%08X%08X\n", (uint32) (a>>32), (uint32) (a&0xFFFFFFFF)); - a = SAR(c, 10); + a = SAR(c, 10); a *= a; //printf("%08X%08X\n", (uint32) (a>>32), (uint32) (a&0xFFFFFFFF)); WRITE_3WORD(Memory.C4RAM + 0x1f83, a); diff --git a/cheats.cpp b/cheats.cpp index d6f7a7109ea2734b83265dfc172507780f8e8195..ee2b68c481685b3e8c6d8b85b43795d09dd106d4 100644 --- a/cheats.cpp +++ b/cheats.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -256,8 +261,8 @@ const char * S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram, if (sscanf(tmp, "%x", &address) != 1) return ("Invalid Gold Finger code."); - //Correct GoldFinger Address - address=(address&0x7FFF)|((address&0x7F8000)<<1)|0x8000; + // Correct GoldFinger Address + address = (address & 0x7FFF) | ((address & 0x7F8000) << 1) | 0x8000; for (i = 0; i < 3; i++) { diff --git a/cheats.h b/cheats.h index f3a70f559a0ef911dcda5dedfb2752ec5901373f..c13cef2bb4af93f7318b9c9b629dc4149fa96b26 100644 --- a/cheats.h +++ b/cheats.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/cheats2.cpp b/cheats2.cpp index 55082d95a60eac7fe54e38fa322612c393d433d2..4a276daed1612ec853392666af03c01504a8ef17 100644 --- a/cheats2.cpp +++ b/cheats2.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/clip.cpp b/clip.cpp index 2bab7dc5114aa4642368a7e72dd9080c276b6884..5ff8c8a282270479061ccfa65c1e349c7a7f2404 100644 --- a/clip.cpp +++ b/clip.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/conffile.cpp b/conffile.cpp index 9891e24a10418e7ed986f7318cc2ee074d1a1c36..38f4ec7378f59dd63a7a5fb1a5825c096aff6eab 100644 --- a/conffile.cpp +++ b/conffile.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -226,7 +231,8 @@ bool ConfigFile::LoadFile(const char *filename){ n=filename; n2=strrchr(n, '/'); if(n2!=NULL) n=n2+1; n2=strrchr(n, '\\'); if(n2!=NULL) n=n2+1; - LoadFile(new fStream(s), n); + fStream fS(s); + LoadFile(&fS, n); CLOSE_FSTREAM(s); ret = true; } else { @@ -401,7 +407,7 @@ bool ConfigFile::SaveTo(const char *filename){ if(ferror(fp)) { - fp = fp; + printf ("Error writing config file %s\n", filename); } fclose(fp); diff --git a/conffile.h b/conffile.h index e16d58902c6b89dfcf8d0892be24262f6e4eb005..c9014cc7a4f87c9af466c4162cb779e1dffcc025 100644 --- a/conffile.h +++ b/conffile.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -194,7 +199,11 @@ #include #ifdef UNZIP_SUPPORT -#include "unzip/unzip.h" +# ifdef SYSTEM_ZIP +# include +# else +# include "unzip/unzip.h" +# endif #endif #include "snes9x.h" diff --git a/controls.cpp b/controls.cpp index 2472e43267050a71644464d6f60a04b5547f4f87..2cdf9bf74ca406bb395f6898fd0bbdcb4531d350 100644 --- a/controls.cpp +++ b/controls.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -221,7 +226,8 @@ using namespace std; #define SUPERSCOPE 10 #define ONE_JUSTIFIER 11 #define TWO_JUSTIFIERS 12 -#define NUMCTLS 13 // This must be LAST +#define MACSRIFLE 13 +#define NUMCTLS 14 // This must be LAST #define POLL_ALL NUMCTLS @@ -235,6 +241,8 @@ using namespace std; #define JUSTIFIER_START 0x20 #define JUSTIFIER_SELECT 0x08 +#define MACSRIFLE_TRIGGER 0x01 + #define MAP_UNKNOWN (-1) #define MAP_NONE 0 #define MAP_BUTTON 1 @@ -315,6 +323,14 @@ static struct int8 pads[4]; } mp5[2]; +static struct +{ + int16 x, y; + uint8 buttons; + uint32 ID; + struct crosshair crosshair; +} macsrifle; + static set exemultis; static set pollmap[NUMCTLS + 1]; static map keymap; @@ -456,6 +472,7 @@ static const char *command_names[LAST_COMMAND + 1] = static void DisplayStateChange (const char *, bool8); static void DoGunLatch (int, int); +static void DoMacsRifleLatch (int, int); static int maptype (int); static bool strless (const char *, const char *); static int findstr (const char *, const char **, int); @@ -506,6 +523,12 @@ static void DoGunLatch (int x, int y) PPU.GunHLatch = (uint16) x; } +static void DoMacsRifleLatch (int x, int y) +{ + PPU.GunVLatch = (uint16) (y + 42); + PPU.GunHLatch = (uint16) (x + 76); +} + static int maptype (int t) { switch (t) @@ -517,6 +540,7 @@ static int maptype (int t) case S9xButtonMouse: case S9xButtonSuperscope: case S9xButtonJustifier: + case S9xButtonMacsRifle: case S9xButtonCommand: case S9xButtonPseudopointer: case S9xButtonPort: @@ -544,6 +568,7 @@ void S9xControlsReset (void) mouse[0].buttons &= ~0x30; mouse[1].buttons &= ~0x30; justifier.buttons &= ~JUSTIFIER_SELECT; + macsrifle.buttons = 0; } void S9xControlsSoftReset (void) @@ -557,6 +582,9 @@ void S9xControlsSoftReset (void) read_idx[i][j]=0; FLAG_LATCH = FALSE; + + curcontrollers[0] = newcontrollers[0]; + curcontrollers[1] = newcontrollers[1]; } void S9xUnmapAllControls (void) @@ -628,6 +656,17 @@ void S9xUnmapAllControls (void) if (!(superscope.crosshair.set & 4)) superscope.crosshair.bg = 1; + macsrifle.x = macsrifle.y = 0; + macsrifle.buttons = 0; + macsrifle.ID = InvalidControlID; + + if (!(macsrifle.crosshair.set & 1)) + macsrifle.crosshair.img = 2; + if (!(macsrifle.crosshair.set & 2)) + macsrifle.crosshair.fg = 5; + if (!(macsrifle.crosshair.set & 4)) + macsrifle.crosshair.bg = 1; + memset(pseudobuttons, 0, sizeof(pseudobuttons)); turbo_time = 1; @@ -647,7 +686,8 @@ void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2 if (id1 < 0 || id1 > 7) break; - newcontrollers[port] = JOYPAD0 + id1; + // libretro: hotplug immediately + curcontrollers[port] = newcontrollers[port] = JOYPAD0 + id1; return; case CTL_MOUSE: @@ -659,7 +699,8 @@ void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2 break; } - newcontrollers[port] = MOUSE0 + id1; + // libretro: hotplug immediately + curcontrollers[port] = newcontrollers[port] = MOUSE0 + id1; return; case CTL_SUPERSCOPE: @@ -669,7 +710,8 @@ void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2 break; } - newcontrollers[port] = SUPERSCOPE; + // libretro: hotplug immediately + curcontrollers[port] = newcontrollers[port] = SUPERSCOPE; return; case CTL_JUSTIFIER: @@ -681,7 +723,19 @@ void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2 break; } - newcontrollers[port] = ONE_JUSTIFIER + id1; + // libretro: hotplug immediately + curcontrollers[port] = newcontrollers[port] = ONE_JUSTIFIER + id1; + return; + + case CTL_MACSRIFLE: + if (!Settings.MacsRifleMaster) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select SNES M.A.C.S. Rifle: MacsRifleMaster disabled"); + break; + } + + // libretro: hotplug immediately + curcontrollers[port] = newcontrollers[port] = MACSRIFLE; return; case CTL_MP5: @@ -699,7 +753,8 @@ void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2 break; } - newcontrollers[port] = MP5; + // libretro: hotplug immediately + curcontrollers[port] = newcontrollers[port] = MP5; mp5[port].pads[0] = (id1 < 0) ? NONE : JOYPAD0 + id1; mp5[port].pads[1] = (id2 < 0) ? NONE : JOYPAD0 + id2; mp5[port].pads[2] = (id3 < 0) ? NONE : JOYPAD0 + id3; @@ -711,7 +766,8 @@ void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2 break; } - newcontrollers[port] = NONE; + // libretro: hotplug immediately + curcontrollers[port] = newcontrollers[port] = NONE; } bool S9xVerifyControllers (void) @@ -787,6 +843,26 @@ bool S9xVerifyControllers (void) break; + case MACSRIFLE: + if (!Settings.MacsRifleMaster) + { + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, "Cannot select SNES M.A.C.S. Rifle: MacsRifleMaster disabled"); + newcontrollers[port] = NONE; + ret = true; + break; + } + + if (used[i]++ > 0) + { + snprintf(buf, sizeof(buf), "M.A.C.S. Rifle used more than once! Disabling extra instances"); + S9xMessage(S9X_CONFIG_INFO, S9X_ERROR, buf); + newcontrollers[port] = NONE; + ret = true; + break; + } + + break; + case MP5: if (!Settings.MultiPlayer5Master) { @@ -888,6 +964,11 @@ void S9xGetController (int port, enum controllers *controller, int8 *id1, int8 * *controller = CTL_JUSTIFIER; *id1 = i - ONE_JUSTIFIER; return; + + case MACSRIFLE: + *controller = CTL_MACSRIFLE; + *id1 = 1; + return; } } @@ -956,6 +1037,13 @@ void S9xReportControllers (void) else c += sprintf(c, "Blue and Pink Justifiers. "); break; + + case MACSRIFLE: + if (port == 0) + c += sprintf(c, "M.A.C.S. Rifle (cannot fire). "); + else + c += sprintf(c, "M.A.C.S. Rifle. "); + break; } } @@ -1043,6 +1131,17 @@ char * S9xGetCommandName (s9xcommand_t command) break; + case S9xButtonMacsRifle: + if (!command.button.macsrifle.trigger) + return (strdup("None")); + + s = "MacsRifle"; + + c = ' '; + if (command.button.macsrifle.trigger) { s += c; s += "Trigger"; c = '+'; } + + break; + case S9xButtonCommand: if (command.button.command >= LAST_COMMAND) return (strdup("None")); @@ -1050,7 +1149,7 @@ char * S9xGetCommandName (s9xcommand_t command) return (strdup(command_names[command.button.command])); case S9xPointer: - if (!command.pointer.aim_mouse0 && !command.pointer.aim_mouse1 && !command.pointer.aim_scope && !command.pointer.aim_justifier0 && !command.pointer.aim_justifier1) + if (!command.pointer.aim_mouse0 && !command.pointer.aim_mouse1 && !command.pointer.aim_scope && !command.pointer.aim_justifier0 && !command.pointer.aim_justifier1 && !command.pointer.aim_macsrifle) return (strdup("None")); s = "Pointer"; @@ -1061,6 +1160,7 @@ char * S9xGetCommandName (s9xcommand_t command) if (command.pointer.aim_scope ) { s += c; s += "Superscope"; c = '+'; } if (command.pointer.aim_justifier0) { s += c; s += "Justifier1"; c = '+'; } if (command.pointer.aim_justifier1) { s += c; s += "Justifier2"; c = '+'; } + if (command.pointer.aim_macsrifle) { s += c; s += "MacsRifle"; c = '+'; } break; @@ -1394,6 +1494,19 @@ s9xcommand_t S9xGetCommandT (const char *name) cmd.type = S9xButtonJustifier; } else + if (!strncmp(name, "MacsRifle ", 10)) + { + s = name + 10; + i = 0; + + if ((cmd.button.macsrifle.trigger = strncmp(s, "Trigger", 7) ? 0 : 1)) { s += i = 7; } + + if (i == 0 || *s != 0 || *(s - 1) == '+') + return (cmd); + + cmd.type = S9xButtonMacsRifle; + } + else if (!strncmp(name, "Pointer ", 8)) { s = name + 8; @@ -1403,7 +1516,8 @@ s9xcommand_t S9xGetCommandT (const char *name) if ((cmd.pointer.aim_mouse1 = strncmp(s, "Mouse2", 6) ? 0 : 1)) { s += i = 6; if (*s == '+') s++; } if ((cmd.pointer.aim_scope = strncmp(s, "Superscope", 10) ? 0 : 1)) { s += i = 10; if (*s == '+') s++; } if ((cmd.pointer.aim_justifier0 = strncmp(s, "Justifier1", 10) ? 0 : 1)) { s += i = 10; if (*s == '+') s++; } - if ((cmd.pointer.aim_justifier1 = strncmp(s, "Justifier2", 10) ? 0 : 1)) { s += i = 10; } + if ((cmd.pointer.aim_justifier1 = strncmp(s, "Justifier2", 10) ? 0 : 1)) { s += i = 10; if (*s == '+') s++; } + if ((cmd.pointer.aim_macsrifle = strncmp(s, "MacsRifle", 9) ? 0 : 1)) { s += i = 9; } if (i == 0 || *s != 0 || *(s - 1) == '+') return (cmd); @@ -1704,6 +1818,7 @@ void S9xUnmapID (uint32 id) if (superscope.ID == id) superscope.ID = InvalidControlID; if (justifier.ID[0] == id) justifier.ID[0] = InvalidControlID; if (justifier.ID[1] == id) justifier.ID[1] = InvalidControlID; + if (macsrifle.ID == id) macsrifle.ID = InvalidControlID; if (id >= PseudoPointerBase) pseudopointer[id - PseudoPointerBase].mapped = false; @@ -1769,6 +1884,10 @@ bool S9xMapButton (uint32 id, s9xcommand_t mapping, bool poll) t = ONE_JUSTIFIER + mapping.button.justifier.idx; break; + case S9xButtonMacsRifle: + t = MACSRIFLE; + break; + case S9xButtonCommand: case S9xButtonPseudopointer: case S9xButtonPort: @@ -1875,6 +1994,12 @@ bool S9xMapPointer (uint32 id, s9xcommand_t mapping, bool poll) fprintf(stderr, "ERROR: Rejecting attempt to control Justifier2 with two pointers\n"); return (false); } + + if (mapping.pointer.aim_macsrifle && macsrifle.ID != InvalidControlID && macsrifle.ID != id) + { + fprintf(stderr, "ERROR: Rejecting attempt to control M.A.C.S. Rifle with two pointers\n"); + return (false); + } } S9xUnmapID(id); @@ -1893,6 +2018,7 @@ bool S9xMapPointer (uint32 id, s9xcommand_t mapping, bool poll) if (mapping.pointer.aim_scope ) pollmap[SUPERSCOPE ].insert(id); if (mapping.pointer.aim_justifier0) pollmap[ONE_JUSTIFIER ].insert(id); if (mapping.pointer.aim_justifier1) pollmap[TWO_JUSTIFIERS].insert(id); + if (mapping.pointer.aim_macsrifle ) pollmap[MACSRIFLE ].insert(id); break; case S9xPointerPort: @@ -1912,6 +2038,7 @@ bool S9xMapPointer (uint32 id, s9xcommand_t mapping, bool poll) if (mapping.pointer.aim_scope ) superscope.ID = id; if (mapping.pointer.aim_justifier0) justifier.ID[0] = id; if (mapping.pointer.aim_justifier1) justifier.ID[1] = id; + if (mapping.pointer.aim_macsrifle ) macsrifle.ID = id; return (true); } @@ -2055,7 +2182,6 @@ void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) { uint16 r, s, t, st; - s = t = st = 0; r = cmd.button.joypad.buttons; st = r & joypad[cmd.button.joypad.idx].togglestick & joypad[cmd.button.joypad.idx].toggleturbo; r ^= st; @@ -2127,7 +2253,7 @@ void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) if (data1) mouse[cmd.button.mouse.idx].buttons |= i; - else + else mouse[cmd.button.mouse.idx].buttons &= ~i; return; @@ -2155,8 +2281,8 @@ void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) superscope.next_buttons |= i & (SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR | SUPERSCOPE_PAUSE); - if ((superscope.next_buttons & (SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR)) && curcontrollers[1] == SUPERSCOPE && !(superscope.phys_buttons & SUPERSCOPE_OFFSCREEN)) - DoGunLatch(superscope.x, superscope.y); + if ((superscope.next_buttons & (SUPERSCOPE_FIRE | SUPERSCOPE_CURSOR)) && curcontrollers[1] == SUPERSCOPE && !(superscope.phys_buttons & SUPERSCOPE_OFFSCREEN)) + DoGunLatch(superscope.x, superscope.y); } else { @@ -2180,6 +2306,17 @@ void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) return; + case S9xButtonMacsRifle: + i = 0; + if (cmd.button.macsrifle.trigger) i |= MACSRIFLE_TRIGGER; + + if(data1) + macsrifle.buttons |= i; + else + macsrifle.buttons &= ~i; + + return; + case S9xButtonCommand: if (((enum command_numbers) cmd.button.command) >= LAST_COMMAND) { @@ -2333,7 +2470,7 @@ void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) if (S9xUnfreezeGame(filename)) { - sprintf(buf, "%s.%.*s loaded", def, _MAX_EXT - 1, "oops"); + snprintf(buf, 256, "%s.%.*s loaded", def, _MAX_EXT - 1, "oops"); S9xSetInfoString (buf); } else @@ -2370,7 +2507,7 @@ void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) if (S9xUnfreezeGame(filename)) { - sprintf(buf, "%s.%03d loaded", def, i - QuickLoad000); + snprintf(buf, 256, "%s.%03d loaded", def, i - QuickLoad000); S9xSetInfoString(buf); } else @@ -2397,7 +2534,7 @@ void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) _splitpath(Memory.ROMFilename, drive, dir, def, ext); snprintf(filename, PATH_MAX + 1, "%s%s%s.%03d", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, i - QuickSave000); - sprintf(buf, "%s.%03d saved", def, i - QuickSave000); + snprintf(buf, 256, "%s.%03d saved", def, i - QuickSave000); S9xSetInfoString(buf); S9xFreezeGame(filename); @@ -2536,6 +2673,12 @@ void S9xApplyCommand (s9xcommand_t cmd, int16 data1, int16 data2) justifier.y[1] = data2; } + if (cmd.pointer.aim_macsrifle) + { + macsrifle.x = data1; + macsrifle.y = data2; + } + return; case S9xButtonPseudopointer: @@ -2829,8 +2972,9 @@ void S9xSetJoypadLatch (bool latch) switch (i = curcontrollers[n]) { case MP5: - for (int j = 0, k = mp5[n].pads[j]; j < 4; k = mp5[n].pads[j++]) + for (int j = 0, k; j < 4; ++j) { + k = mp5[n].pads[j]; if (k == NONE) continue; do_polling(k); @@ -2852,7 +2996,7 @@ void S9xSetJoypadLatch (bool latch) case MOUSE0: case MOUSE1: do_polling(i); - UpdatePolledMouse(i); + UpdatePolledMouse(i); break; case SUPERSCOPE: @@ -2886,6 +3030,10 @@ void S9xSetJoypadLatch (bool latch) do_polling(ONE_JUSTIFIER); break; + case MACSRIFLE: + do_polling(i); + break; + default: break; } @@ -2936,6 +3084,10 @@ uint8 S9xReadJOYSERn (int n) case TWO_JUSTIFIERS: return (bits); + case MACSRIFLE: + do_polling(i); + return (bits | ((macsrifle.buttons & 0x01) ? 1 : 0)); + default: return (bits); } @@ -3031,6 +3183,10 @@ uint8 S9xReadJOYSERn (int n) return (bits | 1); } + case MACSRIFLE: + do_polling(i); + return (bits | ((macsrifle.buttons & 0x01) ? 1 : 0)); + default: read_idx[n][0]++; return (bits); @@ -3096,6 +3252,13 @@ void S9xDoAutoJoypad (void) WRITE_WORD(Memory.FillRAM + 0x421c + n * 2, 0); break; + case MACSRIFLE: + read_idx[n][0] = 16; + Memory.FillRAM[0x4218 + n * 2] = 0xff; + Memory.FillRAM[0x4219 + n * 2] = macsrifle.buttons; + WRITE_WORD(Memory.FillRAM + 0x421c + n * 2, 0); + break; + default: WRITE_WORD(Memory.FillRAM + 0x4218 + n * 2, 0); WRITE_WORD(Memory.FillRAM + 0x421c + n * 2, 0); @@ -3117,8 +3280,9 @@ void S9xControlEOF (void) switch (i = curcontrollers[n]) { case MP5: - for (j = 0, i = mp5[n].pads[j]; j < 4; i = mp5[n].pads[j++]) + for (j = 0; j < 4; ++j) { + i = mp5[n].pads[j]; if (i == NONE) continue; @@ -3197,6 +3361,18 @@ void S9xControlEOF (void) break; + case MACSRIFLE: + if (n == 1) + { + DoMacsRifleLatch(macsrifle.x, macsrifle.y); + + c = &macsrifle.crosshair; + if (IPPU.RenderThisFrame) + S9xDrawCrosshair(S9xGetCrosshair(c->img), c->fg, c->bg, macsrifle.x, macsrifle.y); + } + + break; + default: break; } @@ -3300,6 +3476,7 @@ void S9xSetControllerCrosshair (enum crosscontrols ctl, int8 idx, const char *fg case X_SUPERSCOPE: c = &superscope.crosshair; break; case X_JUSTIFIER1: c = &justifier.crosshair[0]; break; case X_JUSTIFIER2: c = &justifier.crosshair[1]; break; + case X_MACSRIFLE: c = &macsrifle.crosshair; break; default: fprintf(stderr, "S9xSetControllerCrosshair() called with an invalid controller ID %d\n", ctl); return; @@ -3389,6 +3566,7 @@ void S9xGetControllerCrosshair (enum crosscontrols ctl, int8 *idx, const char ** case X_SUPERSCOPE: c = &superscope.crosshair; break; case X_JUSTIFIER1: c = &justifier.crosshair[0]; break; case X_JUSTIFIER2: c = &justifier.crosshair[1]; break; + case X_MACSRIFLE: c = &macsrifle.crosshair; break; default: fprintf(stderr, "S9xGetControllerCrosshair() called with an invalid controller ID %d\n", ctl); return; @@ -3407,7 +3585,7 @@ void S9xGetControllerCrosshair (enum crosscontrols ctl, int8 *idx, const char ** void S9xControlPreSaveState (struct SControlSnapshot *s) { memset(s, 0, sizeof(*s)); - s->ver = 3; + s->ver = 4; for (int j = 0; j < 2; j++) { @@ -3456,7 +3634,11 @@ void S9xControlPreSaveState (struct SControlSnapshot *s) for (int k = 0; k < 2; k++) COPY(mp5[j].pads[k]); - assert(i == sizeof(s->internal)); + COPY(macsrifle.x); + COPY(macsrifle.y); + COPY(macsrifle.buttons); + + assert(i == sizeof(s->internal) + sizeof(s->internal_macs)); #undef COPY @@ -3529,6 +3711,15 @@ void S9xControlPostLoadState (struct SControlSnapshot *s) assert(i == sizeof(s->internal)); + if (s->ver > 3) + { + COPY(macsrifle.x); + COPY(macsrifle.y); + COPY(macsrifle.buttons); + + assert(i == sizeof(s->internal) + sizeof(s->internal_macs)); + } + #undef COPY } @@ -3647,3 +3838,30 @@ void MovieSetJustifier (int i, uint8 in[11]) justifier.offscreen[0] = *ptr++; justifier.offscreen[1] = *ptr; } + +bool MovieGetMacsRifle (int i, uint8 out[5]) +{ + if (i < 0 || i > 1 || curcontrollers[i] != MACSRIFLE) + return (false); + + uint8 *ptr = out; + + WRITE_WORD(ptr, macsrifle.x); ptr += 2; + WRITE_WORD(ptr, macsrifle.y); ptr += 2; + *ptr = macsrifle.buttons; + + return (true); +} + +void MovieSetMacsRifle (int i, uint8 in[5]) +{ + if (i < 0 || i > 1 || curcontrollers[i] != MACSRIFLE) + return; + + uint8 *ptr = in; + + macsrifle.x = READ_WORD(ptr); ptr += 2; + macsrifle.y = READ_WORD(ptr); ptr += 2; + macsrifle.buttons = *ptr; +} + diff --git a/controls.h b/controls.h index 0eba8233460d19e5da28199ec826c92e10f57db9..e34ae1f4ab1157fe7355463ee2aa1b05aebad947 100644 --- a/controls.h +++ b/controls.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -195,8 +200,9 @@ #define S9xButtonJustifier 4 #define S9xButtonCommand 5 #define S9xButtonMulti 6 -#define S9xAxisJoypad 7 -#define S9xPointer 8 +#define S9xButtonMacsRifle 7 +#define S9xAxisJoypad 8 +#define S9xPointer 9 #define S9xButtonPseudopointer 254 #define S9xAxisPseudopointer 253 @@ -269,6 +275,11 @@ typedef struct uint8 aim_offscreen:1; // Pretend we're pointing the gun offscreen (ignore the pointer) } justifier; + struct + { + uint8 trigger:1; + } macsrifle; + int32 multi_idx; uint16 command; } button; @@ -306,6 +317,7 @@ typedef struct uint16 aim_scope:1; uint16 aim_justifier0:1; uint16 aim_justifier1:1; + uint16 aim_macsrifle:1; } pointer; uint8 port[4]; @@ -325,7 +337,8 @@ enum controllers CTL_MOUSE, // use id1 to specify 0-1 CTL_SUPERSCOPE, CTL_JUSTIFIER, // use id1: 0=one justifier, 1=two justifiers - CTL_MP5 // use id1-id4 to specify pad 0-7 (or -1) + CTL_MP5, // use id1-id4 to specify pad 0-7 (or -1) + CTL_MACSRIFLE }; void S9xSetController (int port, enum controllers controller, int8 id1, int8 id2, int8 id3, int8 id4); // port=0-1 @@ -449,6 +462,7 @@ struct SControlSnapshot uint8 dummy3[8]; bool8 pad_read, pad_read_last; uint8 internal[60]; // yes, we need to save this! + uint8 internal_macs[5]; }; void S9xControlPreSaveState (struct SControlSnapshot *s); diff --git a/cpu.cpp b/cpu.cpp index 320d9affa710c26a5b235a6b82d14a43c51c95d4..cd5748905a10a353d706bb49b013abd8620ee71c 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -225,9 +230,7 @@ static void S9xSoftResetCPU (void) CPU.NMIPending = FALSE; CPU.IRQLine = FALSE; CPU.IRQTransition = FALSE; - CPU.IRQLastState = FALSE; CPU.IRQExternal = FALSE; - CPU.IRQPending = Timings.IRQPendCount; CPU.MemSpeed = SLOW_ONE_CYCLE; CPU.MemSpeedx2 = SLOW_ONE_CYCLE * 2; CPU.FastROMSpeed = SLOW_ONE_CYCLE; @@ -263,6 +266,9 @@ static void S9xSoftResetCPU (void) Timings.H_Max = Timings.H_Max_Master; Timings.V_Max = Timings.V_Max_Master; Timings.NMITriggerPos = 0xffff; + Timings.NextIRQTimer = 0x0fffffff; + Timings.IRQFlagChanging = IRQ_NONE; + if (Model->_5A22 == 2) Timings.WRAMRefreshPos = SNES_WRAM_REFRESH_HC_v2; else @@ -285,9 +291,7 @@ void S9xReset (void) memset(Memory.VRAM, 0x00, 0x10000); memset(Memory.FillRAM, 0, 0x8000); - if (Settings.BS) - S9xResetBSX(); - + S9xResetBSX(); S9xResetCPU(); S9xResetPPU(); S9xResetDMA(); @@ -329,7 +333,7 @@ void S9xSoftReset (void) S9xSoftResetPPU(); S9xResetDMA(); S9xSoftResetAPU(); - S9xResetMSU(); + S9xResetMSU(); if (Settings.DSP) S9xResetDSP(); diff --git a/cpuaddr.h b/cpuaddr.h index f1472148673515761a9ac68c12efafd3c63e8d3b..fd3cb9e2355d1ff0eaea2ec637274a6b25b184f2 100644 --- a/cpuaddr.h +++ b/cpuaddr.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/cpuexec.cpp b/cpuexec.cpp index 4cca179e8a171c229c6f7f0c658dcfcd0b671157..2df4617746ca5a48141e136342862ca5fac7a841 100644 --- a/cpuexec.cpp +++ b/cpuexec.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -197,13 +202,6 @@ #include "missing.h" #endif -//#define CPU_OPCODE_INSTRUMENTATION - -/* Pipe the output to : - * | grep -B1 EXEC=NMI | grep -v EXEC=NMI | grep EXEC= | sort | uniq -c | sort -nr - * - */ - static inline void S9xReschedule (void); #ifdef LAGFIX @@ -216,10 +214,25 @@ void S9xMainLoop (void) do { #endif + + #define CHECK_FOR_IRQ_CHANGE() \ + if (Timings.IRQFlagChanging) \ + { \ + if (Timings.IRQFlagChanging == IRQ_CLEAR_FLAG) \ + ClearIRQ(); \ + else if (Timings.IRQFlagChanging == IRQ_SET_FLAG) \ + SetIRQ(); \ + Timings.IRQFlagChanging = IRQ_NONE; \ + } + for (;;) { if (CPU.NMIPending) { + #ifdef DEBUGGER + if (Settings.TraceHCEvent) + S9xTraceFormattedMessage ("Comparing %d to %d\n", Timings.NMITriggerPos, CPU.Cycles); + #endif if (Timings.NMITriggerPos <= CPU.Cycles) { CPU.NMIPending = FALSE; @@ -228,35 +241,50 @@ void S9xMainLoop (void) { CPU.WaitingForInterrupt = FALSE; Registers.PCw++; + CPU.Cycles += ONE_CYCLE; + while (CPU.Cycles >= CPU.NextEvent) + S9xDoHEventProcessing(); } + CHECK_FOR_IRQ_CHANGE(); S9xOpcode_NMI(); -#ifdef CPU_OPCODE_INSTRUMENTATION - puts("** EXEC=NMI"); -#endif } } - if (CPU.IRQTransition || CPU.IRQExternal) + if (CPU.IRQTransition) { - if (CPU.IRQPending) - CPU.IRQPending--; - else + if (CPU.WaitingForInterrupt) { - if (CPU.WaitingForInterrupt) - { - CPU.WaitingForInterrupt = FALSE; - Registers.PCw++; - } + CPU.WaitingForInterrupt = FALSE; + Registers.PCw++; + CPU.Cycles += ONE_CYCLE; + while (CPU.Cycles >= CPU.NextEvent) + S9xDoHEventProcessing(); + } + CPU.IRQTransition = FALSE; + CPU.IRQLine = TRUE; + } - CPU.IRQTransition = FALSE; - CPU.IRQPending = Timings.IRQPendCount; + if (CPU.Cycles >= Timings.NextIRQTimer) + { + #ifdef DEBUGGER + S9xTraceMessage ("Timer triggered\n"); + #endif - if (!CheckFlag(IRQ)) - S9xOpcode_IRQ(); - } + S9xUpdateIRQPositions(false); + CPU.IRQTransition = TRUE; } + if ((CPU.IRQLine || CPU.IRQExternal) && !CheckFlag(IRQ)) + { + /* The flag pushed onto the stack is the new value */ + CHECK_FOR_IRQ_CHANGE(); + S9xOpcode_IRQ(); + } + + /* Change IRQ flag for instructions that set it only on last cycle */ + CHECK_FOR_IRQ_CHANGE(); + #ifdef DEBUGGER if ((CPU.Flags & BREAK_FLAG) && !(CPU.Flags & SINGLE_STEP_FLAG)) { @@ -296,9 +324,7 @@ void S9xMainLoop (void) if (CPU.PCBase) { Op = CPU.PCBase[Registers.PCw]; - CPU.PrevCycles = CPU.Cycles; CPU.Cycles += CPU.MemSpeed; - S9xCheckInterrupts(); Opcodes = ICPU.S9xOpcodes; } else @@ -317,9 +343,6 @@ void S9xMainLoop (void) Opcodes = S9xOpcodesSlow; } -#ifdef CPU_OPCODE_INSTRUMENTATION - printf("EXEC=%.6X\n",Registers.PBPC); -#endif Registers.PCw++; (*Opcodes[Op].S9xOpcode)(); @@ -443,11 +466,11 @@ void S9xDoHEventProcessing (void) S9xAPUEndScanline(); CPU.Cycles -= Timings.H_Max; - CPU.PrevCycles -= Timings.H_Max; - S9xAPUSetReferenceTime(CPU.Cycles); - - if ((Timings.NMITriggerPos != 0xffff) && (Timings.NMITriggerPos >= Timings.H_Max)) + if (Timings.NMITriggerPos != 0xffff) Timings.NMITriggerPos -= Timings.H_Max; + if (Timings.NextIRQTimer != 0x0fffffff) + Timings.NextIRQTimer -= Timings.H_Max; + S9xAPUSetReferenceTime(CPU.Cycles); CPU.V_Counter++; if (CPU.V_Counter >= Timings.V_Max) // V ranges from 0 to Timings.V_Max - 1 @@ -475,7 +498,6 @@ void S9xDoHEventProcessing (void) ICPU.Frame++; PPU.HVBeamCounterLatched = 0; - CPU.Flags |= SCAN_KEYS_FLAG; } // From byuu: @@ -506,9 +528,9 @@ void S9xDoHEventProcessing (void) { S9xEndScreenRefresh(); + CPU.Flags |= SCAN_KEYS_FLAG; #ifdef LAGFIX - if (!(GFX.DoInterlace && GFX.InterlaceFrame == 0)) /* MIBR */ - finishedFrame = true; + finishedFrame = true; #endif PPU.HDMA = 0; // Bits 7 and 6 of $4212 are computed when read in S9xGetPPU. @@ -539,6 +561,10 @@ void S9xDoHEventProcessing (void) Memory.FillRAM[0x4210] = 0x80 | Model->_5A22; if (Memory.FillRAM[0x4200] & 0x80) { +#ifdef DEBUGGER + if (Settings.TraceHCEvent) + S9xTraceFormattedMessage ("NMI Scheduled for next scanline."); +#endif // FIXME: triggered at HC=6, checked just before the final CPU cycle, // then, when to call S9xOpcode_NMI()? CPU.NMIPending = TRUE; @@ -586,9 +612,7 @@ void S9xDoHEventProcessing (void) S9xTraceFormattedMessage("*** WRAM Refresh HC:%04d", CPU.Cycles); #endif - CPU.PrevCycles = CPU.Cycles; CPU.Cycles += SNES_WRAM_REFRESH_CYCLES; - S9xCheckInterrupts(); S9xReschedule(); diff --git a/cpuexec.h b/cpuexec.h index 06ba5fce9ada6d98b3e49c4ff28ce042b3525128..9e914cbe2568cbc8a26d1ff94ac8781d60cdbbfe 100644 --- a/cpuexec.h +++ b/cpuexec.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -280,46 +285,4 @@ static inline void S9xFixCycles (void) } } -static inline void S9xCheckInterrupts (void) -{ - bool8 thisIRQ = PPU.HTimerEnabled | PPU.VTimerEnabled; - - if (CPU.IRQLine & thisIRQ) - CPU.IRQTransition = TRUE; - - if (PPU.HTimerEnabled) - { - int32 htimepos = PPU.HTimerPosition; - if (CPU.Cycles >= Timings.H_Max & htimepos < CPU.PrevCycles) - htimepos += Timings.H_Max; - - if (CPU.PrevCycles >= htimepos | CPU.Cycles < htimepos) - thisIRQ = FALSE; - } - - if (PPU.VTimerEnabled) - { - int32 vcounter = CPU.V_Counter; - if (CPU.Cycles >= Timings.H_Max & (!PPU.HTimerEnabled | PPU.HTimerPosition < CPU.PrevCycles)) { - vcounter++; - if(vcounter >= Timings.V_Max) - vcounter = 0; - } - - if (vcounter != PPU.VTimerPosition) - thisIRQ = FALSE; - } - - if (!CPU.IRQLastState & thisIRQ) - { -#ifdef DEBUGGER - S9xTraceFormattedMessage("--- /IRQ High->Low prev HC:%04d curr HC:%04d HTimer:%d Pos:%04d VTimer:%d Pos:%03d", - CPU.PrevCycles, CPU.Cycles, PPU.HTimerEnabled, PPU.HTimerPosition, PPU.VTimerEnabled, PPU.VTimerPosition); -#endif - CPU.IRQLine = TRUE; - } - - CPU.IRQLastState = thisIRQ; -} - #endif diff --git a/cpumacro.h b/cpumacro.h index 157c76761c16b8ca392dcc8fd48a5cf019868c3a..6a173f93b6f73d1ee1814f585bc3edb347e891ce 100644 --- a/cpumacro.h +++ b/cpumacro.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/cpuops.cpp b/cpuops.cpp index cf46c908021f02dce83f0c9f7e2571d54c80b7aa..dbf4051f62c62b82797848dfee21e2a17f16c1d7 100644 --- a/cpuops.cpp +++ b/cpuops.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -200,7 +205,7 @@ #ifdef SA1_OPCODES #define AddCycles(n) { SA1.Cycles += (n); } #else -#define AddCycles(n) { CPU.PrevCycles = CPU.Cycles; CPU.Cycles += (n); S9xCheckInterrupts(); while (CPU.Cycles >= CPU.NextEvent) S9xDoHEventProcessing(); } +#define AddCycles(n) { CPU.Cycles += (n); while (CPU.Cycles >= CPU.NextEvent) S9xDoHEventProcessing(); } #endif #include "cpuaddr.h" @@ -1630,16 +1635,25 @@ static void OpF8 (void) // CLI static void Op58 (void) { - ClearIRQ(); AddCycles(ONE_CYCLE); - CHECK_FOR_IRQ(); + +#ifndef SA1_OPCODES + Timings.IRQFlagChanging = IRQ_CLEAR_FLAG; +#else + ClearIRQ(); +#endif } // SEI static void Op78 (void) { - SetIRQ(); AddCycles(ONE_CYCLE); + +#ifndef SA1_OPCODES + Timings.IRQFlagChanging = IRQ_SET_FLAG; +#else + SetIRQ(); +#endif } // CLV @@ -3475,7 +3489,7 @@ static void OpCB (void) #else CPU.WaitingForInterrupt = TRUE; Registers.PCw--; - AddCycles(TWO_CYCLES); + AddCycles(ONE_CYCLE); #endif } @@ -3484,7 +3498,6 @@ static void OpDB (void) { Registers.PCw--; CPU.Flags |= DEBUG_MODE_FLAG | HALTED_FLAG; - AddCycles(ONE_CYCLE); } /* WDM (Reserved S9xOpcode) ************************************************ */ diff --git a/cpuops.h b/cpuops.h index 64c30aa6f85fd8e33d2764bc902cfb932659561f..1f9a6e65e41396de570c052beebb88417c0c238e 100644 --- a/cpuops.h +++ b/cpuops.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/crosshairs.cpp b/crosshairs.cpp index 490818fe3318979cc0581567c0555d90e0ed9fdd..f3b8d357f28c5593c26fc3d5e5a2cb4934b8520e 100644 --- a/crosshairs.cpp +++ b/crosshairs.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/crosshairs.h b/crosshairs.h index b39acd10b1156090231b088a4be8f6a3c93bdd2f..d5de8009237cba13a53abea81ca9bfb72bbfa2bf 100644 --- a/crosshairs.h +++ b/crosshairs.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -209,6 +214,7 @@ const char * S9xGetCrosshair (int idx); // Superscope: 2 White Black // Justifier 1: 4 Blue Black // Justifier 2: 4 MagicPink Black +// Macs Rifle: 2 White Black // // Available colors are: Trans, Black, 25Grey, 50Grey, 75Grey, White, Red, Orange, // Yellow, Green, Cyan, Sky, Blue, Violet, MagicPink, and Purple. @@ -221,7 +227,8 @@ enum crosscontrols X_MOUSE2, X_SUPERSCOPE, X_JUSTIFIER1, - X_JUSTIFIER2 + X_JUSTIFIER2, + X_MACSRIFLE }; void S9xSetControllerCrosshair (enum crosscontrols ctl, int8 idx, const char *fg, const char *bg); diff --git a/debug.cpp b/debug.cpp index 9eadb9399c9ac0e05003e019b8619e8d17e934f6..1ad461e2a73a15ae3954f8bb04627f5cba00b628 100644 --- a/debug.cpp +++ b/debug.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -197,6 +202,8 @@ #include "debug.h" #include "missing.h" +#include "apu/bapu/snes/snes.hpp" + extern SDMA DMA[8]; extern FILE *apu_trace; FILE *trace = NULL, *trace2 = NULL; @@ -254,7 +261,7 @@ static const char *HelpMessage[] = // "ai - Shou APU vectors", // "a - Show APU status", // "x - Show Sound DSP status", -// "A - Toggle APU instruction tracing to aputrace.log", + "A - Toggle APU instruction tracing to trace.log", // "B - Toggle sound DSP register tracing to aputrace.log", // "C - Dump sound sample addresses", // "ad [Address] - Dump APU RAM from PC or [Address]", @@ -336,7 +343,6 @@ static uint8 debug_sa1_op_print (char *, uint8, uint16); static void debug_line_print (const char *); static int debug_get_number (char *, uint16 *); static short debug_get_start_address (char *, uint8 *, uint32 *); -static void debug_process_command (char *); static void debug_print_window (uint8 *); static const char * debug_clip_fn (int); static void debug_whats_used (void); @@ -882,7 +888,7 @@ static uint8 debug_cpu_op_print (char *Line, uint8 Bank, uint16 Address) break; } - sprintf(Line, "%-44s A:%04X X:%04X Y:%04X D:%04X DB:%02X S:%04X P:%c%c%c%c%c%c%c%c%c HC:%04ld VC:%03ld FC:%02d %03x", + sprintf(Line, "%-44s A:%04X X:%04X Y:%04X D:%04X DB:%02X S:%04X P:%c%c%c%c%c%c%c%c%c HC:%04ld VC:%03ld FC:%02d %c%c%c %c %c%c HT:%d VT:%d C:%d", Line, Registers.A.W, Registers.X.W, Registers.Y.W, Registers.D.W, Registers.DB, Registers.S.W, CheckEmulation() ? 'E' : 'e', @@ -897,7 +903,11 @@ static uint8 debug_cpu_op_print (char *Line, uint8 Bank, uint16 Address) (long) CPU.Cycles, (long) CPU.V_Counter, IPPU.FrameCount, - (CPU.IRQExternal ? 0x100 : 0) | (PPU.HTimerEnabled ? 0x10 : 0) | (PPU.VTimerEnabled ? 0x01 : 0)); + CPU.IRQExternal ? 'E' : ' ', PPU.HTimerEnabled ? 'H' : ' ', PPU.VTimerEnabled ? 'V' : ' ', + CPU.NMIPending ? 'N' : '.', + CPU.IRQTransition ? 'T' : ' ', + CPU.IRQLine ? 'L' : ' ', + PPU.HTimerPosition, PPU.VTimerPosition, Timings.NextIRQTimer); return (Size); } @@ -1362,7 +1372,7 @@ static short debug_get_start_address (char *Line, uint8 *Bank, uint32 *Address) return (1); } -static void debug_process_command (char *Line) +void S9xDebugProcessCommand(char *Line) { uint8 Bank = Registers.PB; uint32 Address = Registers.PCw; @@ -1575,8 +1585,12 @@ static void debug_process_command (char *Line) printf("HC event tracing %s.\n", Settings.TraceHCEvent ? "enabled" : "disabled"); } + // TODO: reactivate once APU debugger works again if (*Line == 'A') - spc_core->debug_toggle_trace(); + { + Settings.TraceSMP = !Settings.TraceSMP; + printf("SMP tracing %s\n", Settings.TraceSMP ? "enabled" : "disabled"); + } /* if (*Line == 'B') @@ -1637,20 +1651,16 @@ static void debug_process_command (char *Line) } *Line = 0; - } + }*/ + + if (*Line == 'a') { - printf("APU in-ports : %02X %02X %02X %02X\n", IAPU.RAM[0xF4], IAPU.RAM[0xF5], IAPU.RAM[0xF6], IAPU.RAM[0xF7]); - printf("APU out-ports: %02X %02X %02X %02X\n", APU.OutPorts[0], APU.OutPorts[1], APU.OutPorts[2], APU.OutPorts[3]); - printf("ROM/RAM switch: %s\n", (IAPU.RAM[0xf1] & 0x80) ? "ROM" : "RAM"); - - for (int i = 0; i < 3; i++) - if (APU.TimerEnabled[i]) - printf("Timer%d enabled, Value: 0x%03X, 4-bit: 0x%02X, Target: 0x%03X\n", - i, APU.Timer[i], IAPU.RAM[0xfd + i], APU.TimerTarget[i]); + printf("S-CPU-side ports S-CPU writes these, S-SMP reads: %02X %02X %02X %02X\n", SNES::cpu.port_read(0), SNES::cpu.port_read(1), SNES::cpu.port_read(2), SNES::cpu.port_read(3)); + printf("S-SMP-side ports S-SMP writes these, S-CPU reads: %02X %02X %02X %02X\n", SNES::smp.port_read(0), SNES::smp.port_read(1), SNES::smp.port_read(2), SNES::smp.port_read(3)); } - +/* if (*Line == 'P') { Settings.TraceDSP = !Settings.TraceDSP; @@ -2547,7 +2557,7 @@ void S9xDoDebug (void) S9xTextMode(); strcpy(Line, "r"); - debug_process_command(Line); + S9xDebugProcessCommand(Line); while (CPU.Flags & DEBUG_MODE_FLAG) { @@ -2561,7 +2571,7 @@ void S9xDoDebug (void) Line[strlen(Line) - 1] = 0; Cycles = CPU.Cycles; - debug_process_command(Line); + S9xDebugProcessCommand(Line); CPU.Cycles = Cycles; } diff --git a/debug.h b/debug.h index 92fc8463e403d23cc77bb31a03eb2956c52d5361..1ffceeb64f584cc6083ca0dc04e1ec8304bc8bf0 100644 --- a/debug.h +++ b/debug.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -215,6 +220,7 @@ void S9xSA1Trace (void); void S9xTraceMessage (const char *); void S9xTraceFormattedMessage (const char *, ...); void S9xPrintHVPosition (char *); +void S9xDebugProcessCommand(char *); #endif diff --git a/display.h b/display.h index 7f6f3de5b37b8a38a8af0c186bcac196f14b39a8..b41c11e0ff3dd77c7f995373d2bae2fc819f1e1d 100644 --- a/display.h +++ b/display.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -201,14 +206,16 @@ enum s9x_getdirtype SCREENSHOT_DIR, SPC_DIR, CHEAT_DIR, - IPS_DIR, + PATCH_DIR, BIOS_DIR, LOG_DIR, + SAT_DIR, LAST_DIR }; void S9xUsage (void); char * S9xParseArgs (char **, int); +void S9xParseArgsForCheats (char **, int); void S9xLoadConfigFiles (char **, int); void S9xSetInfoString (const char *); diff --git a/dma.cpp b/dma.cpp index e5f2a70e9a1773197b21c4b3dad94c366f748aed..2b227f3e0059988d0fc1eef7c6e769ef1bc42dfb 100644 --- a/dma.cpp +++ b/dma.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -195,7 +200,7 @@ #include "missing.h" #endif -#define ADD_CYCLES(n) { CPU.PrevCycles = CPU.Cycles; CPU.Cycles += (n); S9xCheckInterrupts(); } +#define ADD_CYCLES(n) { CPU.Cycles += (n); } extern uint8 *HDMAMemPointers[8]; extern int HDMA_ModeByteCounts[8]; @@ -212,6 +217,10 @@ static inline bool8 addCyclesInDMA (uint8 dma_channel) // Add 8 cycles per byte, sync APU, and do HC related events. // If HDMA was done in S9xDoHEventProcessing(), check if it used the same channel as DMA. ADD_CYCLES(SLOW_ONE_CYCLE); + + extern int dma_kludge; + if(dma_kludge && overclock_cycles == 0 && CPU.WhichEvent==HC_HCOUNTER_MAX_EVENT) ADD_CYCLES(-1); + while (CPU.Cycles >= CPU.NextEvent) S9xDoHEventProcessing(); @@ -608,7 +617,7 @@ bool8 S9xDoDMA (uint8 Channel) S9xSetPPU(Work, 0x2100 + d->BAddress); UPDATE_COUNTERS; count--; - + // Fall through case 1: Work = S9xGetByte((d->ABank << 16) + p); S9xSetPPU(Work, 0x2101 + d->BAddress); @@ -643,7 +652,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 1; break; } - + // Fall through case 1: Work = S9xGetByte((d->ABank << 16) + p); S9xSetPPU(Work, 0x2100 + d->BAddress); @@ -653,7 +662,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 2; break; } - + // Fall through case 2: Work = S9xGetByte((d->ABank << 16) + p); S9xSetPPU(Work, 0x2101 + d->BAddress); @@ -663,7 +672,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 3; break; } - + // Fall through case 3: Work = S9xGetByte((d->ABank << 16) + p); S9xSetPPU(Work, 0x2101 + d->BAddress); @@ -692,7 +701,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 1; break; } - + // Fall through case 1: Work = S9xGetByte((d->ABank << 16) + p); S9xSetPPU(Work, 0x2101 + d->BAddress); @@ -702,7 +711,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 2; break; } - + // Fall through case 2: Work = S9xGetByte((d->ABank << 16) + p); S9xSetPPU(Work, 0x2102 + d->BAddress); @@ -712,7 +721,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 3; break; } - + // Fall through case 3: Work = S9xGetByte((d->ABank << 16) + p); S9xSetPPU(Work, 0x2103 + d->BAddress); @@ -852,10 +861,10 @@ bool8 S9xDoDMA (uint8 Channel) REGISTER_2118_linear(Work); UPDATE_COUNTERS; count--; - + // Fall through case 1: - Work = *(base + p); - REGISTER_2119_linear(Work); + OpenBus = *(base + p); + REGISTER_2119_linear(OpenBus); UPDATE_COUNTERS; count--; } @@ -882,7 +891,7 @@ bool8 S9xDoDMA (uint8 Channel) REGISTER_2118_tile(Work); UPDATE_COUNTERS; count--; - + // Fall through case 1: Work = *(base + p); REGISTER_2119_tile(Work); @@ -914,7 +923,7 @@ bool8 S9xDoDMA (uint8 Channel) S9xSetPPU(Work, 0x2100 + d->BAddress); UPDATE_COUNTERS; count--; - + // Fall through case 1: Work = *(base + p); S9xSetPPU(Work, 0x2101 + d->BAddress); @@ -950,7 +959,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 1; break; } - + // Fall through case 1: Work = *(base + p); S9xSetPPU(Work, 0x2100 + d->BAddress); @@ -960,7 +969,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 2; break; } - + // Fall through case 2: Work = *(base + p); S9xSetPPU(Work, 0x2101 + d->BAddress); @@ -970,7 +979,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 3; break; } - + // Fall through case 3: Work = *(base + p); S9xSetPPU(Work, 0x2101 + d->BAddress); @@ -999,7 +1008,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 1; break; } - + // Fall through case 1: Work = *(base + p); S9xSetPPU(Work, 0x2101 + d->BAddress); @@ -1009,7 +1018,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 2; break; } - + // Fall through case 2: Work = *(base + p); S9xSetPPU(Work, 0x2102 + d->BAddress); @@ -1019,7 +1028,7 @@ bool8 S9xDoDMA (uint8 Channel) b = 3; break; } - + // Fall through case 3: Work = *(base + p); S9xSetPPU(Work, 0x2103 + d->BAddress); @@ -1286,8 +1295,6 @@ bool8 S9xDoDMA (uint8 Channel) if (CPU.NMIPending && (Timings.NMITriggerPos != 0xffff)) { Timings.NMITriggerPos = CPU.Cycles + Timings.NMIDMADelay; - if (Timings.NMITriggerPos >= Timings.H_Max) - Timings.NMITriggerPos -= Timings.H_Max; } // Release the memory used in SPC7110 DMA @@ -1418,13 +1425,14 @@ void S9xStartHDMA (void) uint8 S9xDoHDMA (uint8 byte) { - struct SDMA *p = &DMA[0]; + struct SDMA *p; uint32 ShiftedIBank; uint16 IAddr; bool8 temp; int32 tmpch; - int d = 0; + int d; + uint8 mask; CPU.InHDMA = TRUE; CPU.InDMAorHDMA = TRUE; @@ -1435,7 +1443,7 @@ uint8 S9xDoHDMA (uint8 byte) // XXX: Not quite right... ADD_CYCLES(Timings.DMACPUSync); - for (uint8 mask = 1; mask; mask <<= 1, p++, d++) + for (mask = 1, p = &DMA[0], d = 0; mask; mask <<= 1, p++, d++) { if (byte & mask) { @@ -1637,7 +1645,10 @@ uint8 S9xDoHDMA (uint8 byte) case 1: S9xSetPPU(*(HDMAMemPointers[d] + 0), 0x2100 + p->BAddress); ADD_CYCLES(SLOW_ONE_CYCLE); - S9xSetPPU(*(HDMAMemPointers[d] + 1), 0x2101 + p->BAddress); + // XXX: All HDMA should read to MDR first. This one just + // happens to fix Speedy Gonzales. + OpenBus = *(HDMAMemPointers[d] + 1); + S9xSetPPU(OpenBus, 0x2101 + p->BAddress); ADD_CYCLES(SLOW_ONE_CYCLE); HDMAMemPointers[d] += 2; break; @@ -1750,7 +1761,16 @@ uint8 S9xDoHDMA (uint8 byte) #undef DOBYTE } + } + } + } + for (mask = 1, p = &DMA[0], d = 0; mask; mask <<= 1, p++, d++) + { + if (byte & mask) + { + if (p->DoTransfer) + { if (p->HDMAIndirectAddressing) p->IndirectAddress += HDMA_ModeByteCounts[p->TransferMode]; else @@ -1766,7 +1786,6 @@ uint8 S9xDoHDMA (uint8 byte) byte &= ~mask; PPU.HDMAEnded |= mask; p->DoTransfer = FALSE; - continue; } } else diff --git a/dma.h b/dma.h index 275b1ab5055bfafd7115ba8076e931ecc07a29ef..b5fa5c1ec10ce1eb5bb05b58424647d8fdd8a9b9 100644 --- a/dma.h +++ b/dma.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/dsp.cpp b/dsp.cpp index e08a678bd65f45951347278c97262222f5af548f..ab541852d41c499415e1864157006fd96ebcb700 100644 --- a/dsp.cpp +++ b/dsp.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/dsp.h b/dsp.h index ddbe2fe011f4a8099028b89817508b3af3c75db7..7b9d37145725165686ed1ffaff70aadebe2387f4 100644 --- a/dsp.h +++ b/dsp.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/dsp1.cpp b/dsp1.cpp index eb85dab375a4ba4388c79467bef227870f942840..1628744df5cd1b1db20fe964657a66ca62bfc258 100644 --- a/dsp1.cpp +++ b/dsp1.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/dsp2.cpp b/dsp2.cpp index 7c6c845ea49128194700c6400f8396868f3c6c9b..fb6c9f8d2a44a29d6e6330f6817272c2278344a4 100644 --- a/dsp2.cpp +++ b/dsp2.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/dsp3.cpp b/dsp3.cpp index 1372a20078c50fb0c24073bfc44a3bfc85e9cdd9..9ee6a5daa30d2981f715cdef3c6000b7830a83bd 100644 --- a/dsp3.cpp +++ b/dsp3.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/dsp4.cpp b/dsp4.cpp index 50389f6022859332033f02f5a9b4688ae1fb4df2..63530db1d046fa037f368e66b2d78c6ed6b82c08 100644 --- a/dsp4.cpp +++ b/dsp4.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/font.h b/font.h index 1834fdf75992325bab9eed432256e51bde4840c7..9614f4576a840e541d77006089300d492b9ec616 100644 --- a/font.h +++ b/font.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/fxdbg.cpp b/fxdbg.cpp index c60514c6231fee6ff65f7ce804aa6d47c64a00d6..0b7fb77f43f326e1f04bce168ee2539d3bb00d58 100644 --- a/fxdbg.cpp +++ b/fxdbg.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/fxemu.cpp b/fxemu.cpp index 5244c7043b676eb815f752dd19d4ea6328a21400..09761a3e0c08f6fb97f663bde5c71e9ca68e9464 100644 --- a/fxemu.cpp +++ b/fxemu.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles @@ -214,7 +214,7 @@ void S9xInitSuperFX (void) void S9xResetSuperFX (void) { // FIXME: Snes9x can't execute CPU and SuperFX at a time. Don't ask me what is 0.417 :P - SuperFX.speedPerLine = (uint32) (Settings.SuperFXSpeedPerLine * ((1.0f / Memory.ROMFramesPerSecond) / ((float) (Timings.V_Max)))); + SuperFX.speedPerLine = (uint32) (0.417 * 10.5e6 * ((1.0 / (float) Memory.ROMFramesPerSecond) / ((float) (Timings.V_Max)))); SuperFX.oneLineDone = FALSE; SuperFX.vFlags = 0; CPU.IRQExternal = FALSE; @@ -329,7 +329,7 @@ void S9xSuperFXExec (void) { if ((Memory.FillRAM[0x3000 + GSU_SFR] & FLG_G) && (Memory.FillRAM[0x3000 + GSU_SCMR] & 0x18) == 0x18) { - FxEmulate((Memory.FillRAM[0x3000 + GSU_CLSR] & 1) ? SuperFX.speedPerLine * 2 : SuperFX.speedPerLine); + FxEmulate(((Memory.FillRAM[0x3000 + GSU_CLSR] & 1) ? SuperFX.speedPerLine * 2 : SuperFX.speedPerLine) * Settings.SuperFXClockMultiplier / 100); uint16 GSUStatus = Memory.FillRAM[0x3000 + GSU_SFR] | (Memory.FillRAM[0x3000 + GSU_SFR + 1] << 8); if ((GSUStatus & (FLG_G | FLG_IRQ)) == FLG_IRQ) diff --git a/fxemu.h b/fxemu.h index 4e8698e37d4db07d66d5ffbcefb94b80e655a8ca..ac73d11c2fae8df47e8b8d85fb33465ff005af4d 100644 --- a/fxemu.h +++ b/fxemu.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/fxinst.cpp b/fxinst.cpp index da4ed48fdb870ee76313c739db5d4e9500407192..b25251ce18053245eec07a424f235d0effbe9577 100644 --- a/fxinst.cpp +++ b/fxinst.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/fxinst.h b/fxinst.h index 88e9113b5e8f32483e9f66d0aa6fc1c0f5947cb8..d2124bdcb93380b882a63fcc5c836c7312089a46 100644 --- a/fxinst.h +++ b/fxinst.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/getset.h b/getset.h index baef1eaccd20bdff5b76b8223cff540fbf06e0ea..33b9b45632a6555987227be0bbe7c300964ee6f0 100644 --- a/getset.h +++ b/getset.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -201,9 +206,7 @@ #define addCyclesInMemoryAccess \ if (!CPU.InDMAorHDMA) \ { \ - CPU.PrevCycles = CPU.Cycles; \ CPU.Cycles += speed; \ - S9xCheckInterrupts(); \ while (CPU.Cycles >= CPU.NextEvent) \ S9xDoHEventProcessing(); \ } @@ -211,9 +214,7 @@ #define addCyclesInMemoryAccess_x2 \ if (!CPU.InDMAorHDMA) \ { \ - CPU.PrevCycles = CPU.Cycles; \ CPU.Cycles += speed << 1; \ - S9xCheckInterrupts(); \ while (CPU.Cycles >= CPU.NextEvent) \ S9xDoHEventProcessing(); \ } @@ -344,35 +345,36 @@ inline uint8 S9xGetByte (uint32 Address) inline uint16 S9xGetWord (uint32 Address, enum s9xwrap_t w = WRAP_NONE) { + uint16 word; + uint32 mask = MEMMAP_MASK & (w == WRAP_PAGE ? 0xff : (w == WRAP_BANK ? 0xffff : 0xffffff)); if ((Address & mask) == mask) { PC_t a; - OpenBus = S9xGetByte(Address); + word = OpenBus = S9xGetByte(Address); switch (w) { case WRAP_PAGE: a.xPBPC = Address; a.B.xPCl++; - return (OpenBus | (S9xGetByte(a.xPBPC) << 8)); + return (word | (S9xGetByte(a.xPBPC) << 8)); case WRAP_BANK: a.xPBPC = Address; a.W.xPC++; - return (OpenBus | (S9xGetByte(a.xPBPC) << 8)); + return (word | (S9xGetByte(a.xPBPC) << 8)); case WRAP_NONE: default: - return (OpenBus | (S9xGetByte(Address + 1) << 8)); + return (word | (S9xGetByte(Address + 1) << 8)); } } int block = (Address & 0xffffff) >> MEMMAP_SHIFT; uint8 *GetAddress = Memory.Map[block]; int32 speed = memory_speed(Address); - uint16 word; if (GetAddress >= (uint8 *) CMemory::MAP_LAST) { @@ -393,8 +395,8 @@ inline uint16 S9xGetWord (uint32 Address, enum s9xwrap_t w = WRAP_NONE) case CMemory::MAP_PPU: if (CPU.InDMAorHDMA) { - OpenBus = S9xGetByte(Address); - return (OpenBus | (S9xGetByte(Address + 1) << 8)); + word = OpenBus = S9xGetByte(Address); + return (word | (S9xGetByte(Address + 1) << 8)); } word = S9xGetPPU(Address & 0xffff); @@ -883,8 +885,7 @@ inline void S9xSetPCBase (uint32 Address) Registers.PBPC = Address & 0xffffff; ICPU.ShiftedPB = Address & 0xff0000; - int block; - uint8 *GetAddress = Memory.Map[block = ((Address & 0xffffff) >> MEMMAP_SHIFT)]; + uint8 *GetAddress = Memory.Map[(int)((Address & 0xffffff) >> MEMMAP_SHIFT)]; CPU.MemSpeed = memory_speed(Address); CPU.MemSpeedx2 = CPU.MemSpeed << 1; diff --git a/gfx.cpp b/gfx.cpp index 8beb5cdfc12318794d4d030a55eb04b1b63c0b7d..034c2b3e99b807a8aa6209289bd6898d00f21ab6 100644 --- a/gfx.cpp +++ b/gfx.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -234,9 +239,9 @@ bool8 S9xGraphicsInit (void) GFX.InterlaceFrame = 0; GFX.RealPPL = GFX.Pitch >> 1; IPPU.OBJChanged = TRUE; - IPPU.DirectColourMapsNeedRebuild = TRUE; Settings.BG_Forced = 0; S9xFixColourBrightness(); + S9xBuildDirectColourMaps(); GFX.X2 = (uint16 *) malloc(sizeof(uint16) * 0x10000); GFX.ZERO = (uint16 *) malloc(sizeof(uint16) * 0x10000); @@ -329,15 +334,14 @@ void S9xBuildDirectColourMaps (void) for (uint32 p = 0; p < 8; p++) for (uint32 c = 0; c < 256; c++) DirectColourMaps[p][c] = BUILD_PIXEL(IPPU.XB[((c & 7) << 2) | ((p & 1) << 1)], IPPU.XB[((c & 0x38) >> 1) | (p & 2)], IPPU.XB[((c & 0xc0) >> 3) | (p & 4)]); - - IPPU.DirectColourMapsNeedRebuild = FALSE; } void S9xStartScreenRefresh (void) { + GFX.InterlaceFrame = !GFX.InterlaceFrame; + if (IPPU.RenderThisFrame) { - GFX.InterlaceFrame = !GFX.InterlaceFrame; if (!GFX.DoInterlace || !GFX.InterlaceFrame) { if (!S9xInitUpdate()) @@ -720,8 +724,8 @@ void S9xUpdateScreen (void) GFX.PPL = GFX.RealPPL << 1; GFX.DoInterlace = 2; - for (register int32 y = (int32) GFX.StartY - 1; y >= 0; y--) - memmove(GFX.Screen + y * GFX.PPL, GFX.Screen + y * GFX.RealPPL, IPPU.RenderedScreenWidth * sizeof(uint16)); + for (register int32 y = (int32) GFX.StartY - 2; y >= 0; y--) + memmove(GFX.Screen + (y + 1) * GFX.PPL, GFX.Screen + y * GFX.RealPPL, GFX.PPL * sizeof(uint16)); } } @@ -988,6 +992,8 @@ static void SetupOBJ (void) IPPU.OBJChanged = FALSE; } +#pragma GCC push_options +#pragma GCC optimize ("no-tree-vrp") static void DrawOBJS (int D) { void (*DrawTile) (uint32, uint32, uint32, uint32) = NULL; @@ -1080,6 +1086,8 @@ static void DrawOBJS (int D) } } } +#pragma GCC pop_options + static void DrawBackground (int bg, uint8 Zh, uint8 Zl) { @@ -1502,7 +1510,6 @@ static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; - void (*DrawTile) (uint32, uint32, uint32, uint32); void (*DrawClippedTile) (uint32, uint32, uint32, uint32, uint32, uint32); for (int clip = 0; clip < GFX.Clip[bg].Count; clip++) @@ -1511,12 +1518,10 @@ static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) if (BG.EnableMath && (GFX.Clip[bg].DrawMode[clip] & 2)) { - DrawTile = GFX.DrawTileMath; DrawClippedTile = GFX.DrawClippedTileMath; } else { - DrawTile = GFX.DrawTileNomath; DrawClippedTile = GFX.DrawClippedTileNomath; } @@ -1548,8 +1553,8 @@ static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) uint32 Left = GFX.Clip[bg].Left[clip]; uint32 Right = GFX.Clip[bg].Right[clip]; uint32 Offset = Left * PixWidth + Y * GFX.PPL; - uint32 LineHOffset = LineData[Y].BG[bg].HOffset; - bool8 left_edge = (Left < (8 - (LineHOffset & 7))); + uint32 HScroll = LineData[Y].BG[bg].HOffset; + bool8 left_edge = (Left < (8 - (HScroll & 7))); uint32 Width = Right - Left; while (Left < Right) @@ -1560,12 +1565,12 @@ static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) { // SNES cannot do OPT for leftmost tile column VOffset = LineData[Y].BG[bg].VOffset; - HOffset = LineHOffset; + HOffset = HScroll; left_edge = FALSE; } else { - int HOffTile = ((HOff + Left - 1) & Offset2Mask) >> 3; + int HOffTile = ((HOff + Left - 1) & Offset2Mask) >> 3; if (BG.OffsetSizeH == 8) { @@ -1604,9 +1609,9 @@ static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) VOffset = LineData[Y].BG[bg].VOffset; if (HCellOffset & OffsetEnableMask) - HOffset = (HCellOffset & ~7) | (LineHOffset & 7); + HOffset = (HCellOffset & ~7) | (HScroll & 7); else - HOffset = LineHOffset; + HOffset = HScroll; } if (HiresInterlace) @@ -1728,7 +1733,6 @@ static void DrawBackgroundOffsetMosaic (int bg, uint8 Zh, uint8 Zl, int VOffOff) int Lines; int OffsetMask = (BG.TileSizeH == 16) ? 0x3ff : 0x1ff; int OffsetShift = (BG.TileSizeV == 16) ? 4 : 3; - int Offset2Mask = (BG.OffsetSizeH == 16) ? 0x3ff : 0x1ff; int Offset2Shift = (BG.OffsetSizeV == 16) ? 4 : 3; int OffsetEnableMask = 0x2000 << bg; int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; @@ -1780,24 +1784,22 @@ static void DrawBackgroundOffsetMosaic (int bg, uint8 Zh, uint8 Zl, int VOffOff) uint32 Left = GFX.Clip[bg].Left[clip]; uint32 Right = GFX.Clip[bg].Right[clip]; uint32 Offset = Left * PixWidth + (Y + MosaicStart) * GFX.PPL; - uint32 LineHOffset = LineData[Y].BG[bg].HOffset; - bool8 left_edge = (Left < (8 - (LineHOffset & 7))); + uint32 HScroll = LineData[Y].BG[bg].HOffset; uint32 Width = Right - Left; while (Left < Right) { uint32 VOffset, HOffset; - if (left_edge) + if (Left < (8 - (HScroll & 7))) { // SNES cannot do OPT for leftmost tile column VOffset = LineData[Y].BG[bg].VOffset; - HOffset = LineHOffset; - left_edge = FALSE; + HOffset = HScroll; } else { - int HOffTile = ((HOff + Left - 1) & Offset2Mask) >> 3; + int HOffTile = (((Left + (HScroll & 7)) - 8) + (HOff & ~7)) >> 3; if (BG.OffsetSizeH == 8) { @@ -1836,9 +1838,9 @@ static void DrawBackgroundOffsetMosaic (int bg, uint8 Zh, uint8 Zl, int VOffOff) VOffset = LineData[Y].BG[bg].VOffset; if (HCellOffset & OffsetEnableMask) - HOffset = (HCellOffset & ~7) | (LineHOffset & 7); + HOffset = (HCellOffset & ~7) | (HScroll & 7); else - HOffset = LineHOffset; + HOffset = HScroll; } if (HiresInterlace) diff --git a/gfx.h b/gfx.h index d4f9ce414d84f06953cd0767676cdfaded53a829..64e93b3e4e00fc2953b92db8b82e0b0676d928e1 100644 --- a/gfx.h +++ b/gfx.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/globals.cpp b/globals.cpp index 207d4ce9f6b307e247dd45d3783004044284d915..a89e74c74d51f652ede0ee6c9b625f76a613a37b 100644 --- a/globals.cpp +++ b/globals.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/language.h b/language.h index 9be198d4e9c70c86ce3d213ecb43a2cb4474cc8f..408a914b4b90655e7cdbfb98ed94e0a513a8633b 100644 --- a/language.h +++ b/language.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/libretro/Makefile b/libretro/Makefile index 51c7b2a0a1e3c0190151a3e328d68dd3e73264aa..b6fc945a0d4b45832ca98af0bd33ecfbaa2b8826 100644 --- a/libretro/Makefile +++ b/libretro/Makefile @@ -9,6 +9,7 @@ BACKSLASH := \$(BACKSLASH) filter_out1 = $(filter-out $(firstword $1),$1) filter_out2 = $(call filter_out1,$(call filter_out1,$1)) + ifeq ($(platform),) platform = unix ifeq ($(shell uname -s),) @@ -28,6 +29,8 @@ else ifneq (,$(findstring armv,$(platform))) override platform += unix else ifneq (,$(findstring rpi,$(platform))) override platform += unix +else ifneq (,$(findstring nintendoc,$(platform))) + override platform += unix endif TARGET_NAME = snes9x @@ -69,6 +72,10 @@ ifneq (,$(findstring unix,$(platform))) else ifneq (,$(findstring rpi,$(platform))) CXXFLAGS += -DARM endif + # Nintendo Classics (Hakchi) + ifneq (,$(findstring nintendoc,$(platform))) + CXXFLAGS += -DARM -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard + endif # OS X else ifeq ($(platform), osx) @@ -215,7 +222,7 @@ include $(DEVKITPRO)/libnx/switch_rules -O2 \ -fPIE -I$(LIBNX)/include/ -ffunction-sections -fdata-sections -ftls-model=local-exec -Wl,--allow-multiple-definition -specs=$(LIBNX)/switch.specs CFLAGS += $(INCDIRS) - CFLAGS += $(INCLUDE) -D__SWITCH__ + CFLAGS += $(INCLUDE) -D__SWITCH__ -DARM -march=armv8-a -mtune=cortex-a57 -mtp=soft CXXFLAGS := $(ASFLAGS) $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 CFLAGS += -std=gnu11 STATIC_LINKING = 1 @@ -267,11 +274,14 @@ else ifneq (,$(findstring windows_msvc2017,$(platform))) LIBS += kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib else ifneq (,$(findstring uwp,$(PlatformSuffix))) WinPartition = uwp - MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_APP -DWINDLL -D_UNICODE -DUNICODE -DWRL_NO_DEFAULT_LIB + MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WINDLL -D_UNICODE -DUNICODE -D__WRL_NO_DEFAULT_LIB__ -ZW:nostdlib -EHsc LDFLAGS += -APPCONTAINER -NXCOMPAT -DYNAMICBASE -MANIFEST:NO -LTCG -OPT:REF -SUBSYSTEM:CONSOLE -MANIFESTUAC:NO -OPT:ICF -ERRORREPORT:PROMPT -NOLOGO -TLBID:1 -DEBUG:FULL -WINMD:NO LIBS += WindowsApp.lib endif + # Specific to this core + MSVC2017CompileFlags += -D__WIN32__ + CFLAGS += $(MSVC2017CompileFlags) CXXFLAGS += $(MSVC2017CompileFlags) @@ -335,6 +345,9 @@ else ifneq (,$(findstring windows_msvc2017,$(platform))) PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VsInstallRoot)/Common7/IDE") INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VcCompilerToolsDir)/include") LIB := $(shell IFS=$$'\n'; cygpath -w "$(VcCompilerToolsDir)/lib/$(TargetArchMoniker)") + ifneq (,$(findstring uwp,$(PlatformSuffix))) + LIB := $(shell IFS=$$'\n'; cygpath -w "$(LIB)/store") + endif export INCLUDE := $(INCLUDE);$(WindowsSDKSharedIncludeDir);$(WindowsSDKUCRTIncludeDir);$(WindowsSDKUMIncludeDir) export LIB := $(LIB);$(WindowsSDKUCRTLibDir);$(WindowsSDKUMLibDir) @@ -533,6 +546,16 @@ else $(LD) $(fpic) $(SHARED) $(LINKOUT)$@ $(OBJECTS) $(LDFLAGS) $(LIBS) endif + +ifneq (,$(findstring nintendoc,$(platform))) + @echo "** BUILDING HAKCHI HMOD PACKAGE **" + mkdir -p hakchi/etc/libretro/core/ hakchi/etc/libretro/info/ hakchi/etc/preinit.d/ + rm -f hakchi/etc/libretro/info/* + cp $(TARGET_NAME)_libretro.so hakchi/etc/libretro/core/ + cd hakchi/etc/libretro/info/; wget https://buildbot.libretro.com/assets/frontend/info/$(TARGET_NAME)_libretro.info + cd hakchi/; tar -czvf "CORE_$(TARGET_NAME).hmod" * +endif + %.o: %.cpp $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $(OBJOUT)$@ $< @@ -540,5 +563,5 @@ endif $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $(OBJOUT)$@ $< clean: - rm -f $(OBJECTS) $(TARGET) + rm -f $(OBJECTS) $(TARGET) CORE_$(TARGET_NAME).hmod endif diff --git a/libretro/hakchi/bin/snes b/libretro/hakchi/bin/snes new file mode 100755 index 0000000000000000000000000000000000000000..4447455c369642eecfa8efac191956d3aef02276 --- /dev/null +++ b/libretro/hakchi/bin/snes @@ -0,0 +1,38 @@ +#!/bin/sh + +setFileName(){ + filename="$(readlink -f "$1")" + filebase="$(basename "$filename")" + extension="${filebase##*.}" +} + +getSfrom(){ + local rom="$(hexdump -e '1/4 "%u"' -s8 -n4 "$1")" + local footer="$(hexdump -e '1/4 "%u"' -s20 -n4 "$1")" + local size="$(hexdump -e '1/4 "%u"' -s$((footer+1)) -n4 "$1")" + dd "status=none" "if=$1" "iflag=skip_bytes" "skip=$rom" "bs=$size" "count=1" +} + +setFileName "$1" +shift + +tmppath="/tmp/rom" +rm -rf "$tmppath" +mkdir -p "$tmppath" +cd "$tmppath" + +if [ "$extension" = "7z" ]; then + tiny7zx x "$filename" + filename="$tmppath/$(ls | head -n1)" + filename_str="${filename// /_}" + mv "$filename" "$filename_str" + setFileName "$filename_str" +fi + +if [ "$extension" = "sfrom" ]; then + filename_str="$filebase.sfc" + getSfrom "$filename" > "$filename_str" + setFileName "$filename_str" +fi + +exec retroarch-clover snes9x "$filename" "$@" diff --git a/libretro/hakchi/bin/snes16 b/libretro/hakchi/bin/snes16 new file mode 100755 index 0000000000000000000000000000000000000000..4447455c369642eecfa8efac191956d3aef02276 --- /dev/null +++ b/libretro/hakchi/bin/snes16 @@ -0,0 +1,38 @@ +#!/bin/sh + +setFileName(){ + filename="$(readlink -f "$1")" + filebase="$(basename "$filename")" + extension="${filebase##*.}" +} + +getSfrom(){ + local rom="$(hexdump -e '1/4 "%u"' -s8 -n4 "$1")" + local footer="$(hexdump -e '1/4 "%u"' -s20 -n4 "$1")" + local size="$(hexdump -e '1/4 "%u"' -s$((footer+1)) -n4 "$1")" + dd "status=none" "if=$1" "iflag=skip_bytes" "skip=$rom" "bs=$size" "count=1" +} + +setFileName "$1" +shift + +tmppath="/tmp/rom" +rm -rf "$tmppath" +mkdir -p "$tmppath" +cd "$tmppath" + +if [ "$extension" = "7z" ]; then + tiny7zx x "$filename" + filename="$tmppath/$(ls | head -n1)" + filename_str="${filename// /_}" + mv "$filename" "$filename_str" + setFileName "$filename_str" +fi + +if [ "$extension" = "sfrom" ]; then + filename_str="$filebase.sfc" + getSfrom "$filename" > "$filename_str" + setFileName "$filename_str" +fi + +exec retroarch-clover snes9x "$filename" "$@" diff --git a/libretro/hakchi/bin/snes9x b/libretro/hakchi/bin/snes9x new file mode 100755 index 0000000000000000000000000000000000000000..4447455c369642eecfa8efac191956d3aef02276 --- /dev/null +++ b/libretro/hakchi/bin/snes9x @@ -0,0 +1,38 @@ +#!/bin/sh + +setFileName(){ + filename="$(readlink -f "$1")" + filebase="$(basename "$filename")" + extension="${filebase##*.}" +} + +getSfrom(){ + local rom="$(hexdump -e '1/4 "%u"' -s8 -n4 "$1")" + local footer="$(hexdump -e '1/4 "%u"' -s20 -n4 "$1")" + local size="$(hexdump -e '1/4 "%u"' -s$((footer+1)) -n4 "$1")" + dd "status=none" "if=$1" "iflag=skip_bytes" "skip=$rom" "bs=$size" "count=1" +} + +setFileName "$1" +shift + +tmppath="/tmp/rom" +rm -rf "$tmppath" +mkdir -p "$tmppath" +cd "$tmppath" + +if [ "$extension" = "7z" ]; then + tiny7zx x "$filename" + filename="$tmppath/$(ls | head -n1)" + filename_str="${filename// /_}" + mv "$filename" "$filename_str" + setFileName "$filename_str" +fi + +if [ "$extension" = "sfrom" ]; then + filename_str="$filebase.sfc" + getSfrom "$filename" > "$filename_str" + setFileName "$filename_str" +fi + +exec retroarch-clover snes9x "$filename" "$@" diff --git a/libretro/hakchi/etc/preinit.d/pe9b0_retroarch_snes b/libretro/hakchi/etc/preinit.d/pe9b0_retroarch_snes new file mode 100755 index 0000000000000000000000000000000000000000..82b9be49ab403fe7257194fdcf4a3f51eb11d5fd --- /dev/null +++ b/libretro/hakchi/etc/preinit.d/pe9b0_retroarch_snes @@ -0,0 +1 @@ +[ -f "$mountpoint/usr/bin/clover-canoe-shvc" ] && overmount /usr/bin/clover-canoe-shvc diff --git a/libretro/hakchi/readme.md b/libretro/hakchi/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..19ac691eee87726a34c6cfe35edafb3946a4bc94 --- /dev/null +++ b/libretro/hakchi/readme.md @@ -0,0 +1,24 @@ +----------------------- +Name: SNES9x +Creator: Libretro +Category: RetroArch Cores +----------------------- +=== SNES9x Core for RetroArch === + +Module adds support for Super Famicom / Super Nintendo + +Available executables and arguments to run Core: +- /bin/snes +- /bin/snes16 +- /bin/snes9x + +Core by libretro + +Built and assembled by HakchiCloud - [Website](https://hakchiresources.com) + +Hakchi module system by madmonkey + +NES/SNES Mini shell integration by Cluster + +(c) 2016-2018 + diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 9f44fc72a36ddff5b04982129709e77bc45b395e..a6066354a0521f0ef9a17220ebb5ac9da88e4a90 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -21,11 +21,13 @@ #include #include #include +#include "../apu/bapu/dsp/SPC_DSP.h" -#define RETRO_DEVICE_JOYPAD_MULTITAP ((1 << 8) | RETRO_DEVICE_JOYPAD) +#define RETRO_DEVICE_JOYPAD_MULTITAP ((2 << 8) | RETRO_DEVICE_JOYPAD) #define RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE ((1 << 8) | RETRO_DEVICE_LIGHTGUN) #define RETRO_DEVICE_LIGHTGUN_JUSTIFIER ((2 << 8) | RETRO_DEVICE_LIGHTGUN) #define RETRO_DEVICE_LIGHTGUN_JUSTIFIERS ((3 << 8) | RETRO_DEVICE_LIGHTGUN) +#define RETRO_DEVICE_LIGHTGUN_MACSRIFLE ((4 << 8) | RETRO_DEVICE_LIGHTGUN) #define RETRO_MEMORY_SNES_BSX_RAM ((1 << 8) | RETRO_MEMORY_SAVE_RAM) #define RETRO_MEMORY_SNES_BSX_PRAM ((2 << 8) | RETRO_MEMORY_SAVE_RAM) @@ -34,18 +36,26 @@ #define RETRO_MEMORY_SNES_GAME_BOY_RAM ((5 << 8) | RETRO_MEMORY_SAVE_RAM) #define RETRO_MEMORY_SNES_GAME_BOY_RTC ((6 << 8) | RETRO_MEMORY_RTC) -#define RETRO_GAME_TYPE_BSX 0x101 -#define RETRO_GAME_TYPE_BSX_SLOTTED 0x102 -#define RETRO_GAME_TYPE_SUFAMI_TURBO 0x103 -#define RETRO_GAME_TYPE_SUPER_GAME_BOY 0x104 +#define RETRO_GAME_TYPE_BSX 0x101 | 0x1000 +#define RETRO_GAME_TYPE_BSX_SLOTTED 0x102 | 0x1000 +#define RETRO_GAME_TYPE_SUFAMI_TURBO 0x103 | 0x1000 +#define RETRO_GAME_TYPE_SUPER_GAME_BOY 0x104 | 0x1000 +#define RETRO_GAME_TYPE_MULTI_CART 0x105 | 0x1000 + #define SNES_4_3 4.0f / 3.0f char g_rom_dir[1024]; char g_basename[1024]; +char retro_system_directory[4096]; +char retro_save_directory[4096]; + +bool hires_blend = false; bool overclock_cycles = false; bool reduce_sprite_flicker = false; +bool randomize_memory = false; int one_c, slow_one_c, two_c; +int16 macsrifle_adjust_x, macsrifle_adjust_y; retro_log_printf_t log_cb = NULL; static retro_video_refresh_t video_cb = NULL; @@ -54,6 +64,12 @@ static retro_audio_sample_batch_t audio_batch_cb = NULL; static retro_input_poll_t poll_cb = NULL; static retro_input_state_t input_state_cb = NULL; +static bool lufia2_credits_hack = false; +static uint16 *gfx_blend; + +static int audio_interp_max = 32768; +static int audio_interp_mode = 2; + static void extract_basename(char *buf, const char *path, size_t size) { const char *base = strrchr(path, '/'); @@ -100,7 +116,7 @@ void retro_set_audio_sample(retro_audio_sample_t cb) void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { - audio_batch_cb = cb; + audio_batch_cb = cb; } void retro_set_input_poll(retro_input_poll_t cb) @@ -113,22 +129,48 @@ void retro_set_input_state(retro_input_state_t cb) input_state_cb = cb; } + static retro_environment_t environ_cb; static unsigned crop_overscan_mode = 0; static unsigned aspect_ratio_mode = 0; static bool rom_loaded = false; + void retro_set_environment(retro_environment_t cb) { environ_cb = cb; + static const struct retro_subsystem_memory_info multi_a_memory[] = { + { "srm", RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM }, + }; + + static const struct retro_subsystem_memory_info multi_b_memory[] = { + { "srm", RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM }, + }; + + static const struct retro_subsystem_rom_info multicart_roms[] = { + { "Cart A", "smc|sfc|swc|fig|bs", false, false, false, multi_a_memory, 1 }, + { "Add-On B", "smc|sfc|swc|fig|bs", false, false, false, multi_b_memory, 1 }, + }; + + static const struct retro_subsystem_info subsystems[] = { + { "Multi-Cart Link", "multicart_addon", multicart_roms, 2, RETRO_GAME_TYPE_MULTI_CART }, + {} + }; + + cb(RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO, (void*)subsystems); + + struct retro_variable variables[] = { // These variable names and possible values constitute an ABI with ZMZ (ZSNES Libretro player). // Changing "Show layer 1" is fine, but don't change "layer_1"/etc or the possible values ("Yes|No"). // Adding more variables and rearranging them is safe. { "snes9x_up_down_allowed", "Allow Opposing Directions; disabled|enabled" }, - { "snes9x_overclock", "SuperFX Frequency; 10MHz|20MHz|40MHz|60MHz|80MHz|100MHz" }, + { "snes9x_hires_blend", "Hires Blending; disabled|enabled" }, + { "snes9x_overclock_superfx", "SuperFX Overclocking; 100%|150%|200%|250%|300%|350%|400%|450%|500%|50%" }, { "snes9x_overclock_cycles", "Reduce Slowdown (Hack, Unsafe); disabled|compatible|max" }, { "snes9x_reduce_sprite_flicker", "Reduce Flickering (Hack, Unsafe); disabled|enabled" }, + { "snes9x_randomize_memory", "Randomize Memory (Unsafe); disabled|enabled" }, + { "snes9x_audio_interpolation", "Audio Interpolation; gaussian|cubic|sinc|none|linear" }, { "snes9x_layer_1", "Show layer 1; enabled|disabled" }, { "snes9x_layer_2", "Show layer 2; enabled|disabled" }, { "snes9x_layer_3", "Show layer 3; enabled|disabled" }, @@ -136,7 +178,7 @@ void retro_set_environment(retro_environment_t cb) { "snes9x_layer_5", "Show sprite layer; enabled|disabled" }, { "snes9x_gfx_clip", "Enable graphic clip windows; enabled|disabled" }, { "snes9x_gfx_transp", "Enable transparency effects; enabled|disabled" }, - { "snes9x_gfx_hires", "Enable hires mode; enabled|disabled" }, + { "snes9x_gfx_hires", "Enable hires mode; enabled|disabled" }, { "snes9x_sndchan_1", "Enable sound channel 1; enabled|disabled" }, { "snes9x_sndchan_2", "Enable sound channel 2; enabled|disabled" }, { "snes9x_sndchan_3", "Enable sound channel 3; enabled|disabled" }, @@ -147,57 +189,68 @@ void retro_set_environment(retro_environment_t cb) { "snes9x_sndchan_8", "Enable sound channel 8; enabled|disabled" }, { "snes9x_overscan", "Crop overscan; auto|enabled|disabled" }, { "snes9x_aspect", "Preferred aspect ratio; auto|ntsc|pal|4:3" }, - { NULL, NULL }, + { "snes9x_macsrifle_adjust_x", "M.A.C.S. Rifle - adjust aim x; 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|-25|-24|-23|-22|-21|-20|-19|-18|-17|-16|-15|-14|-13|-12|-11|-10|-9|-8|-7|-6|-5|-4|-3|-2|-1" }, + { "snes9x_macsrifle_adjust_y", "M.A.C.S. Rifle - adjust aim y; 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|-25|-24|-23|-22|-21|-20|-19|-18|-17|-16|-15|-14|-13|-12|-11|-10|-9|-8|-7|-6|-5|-4|-3|-2|-1" }, + {}, }; environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); static const struct retro_controller_description port_1[] = { + { "None", RETRO_DEVICE_NONE }, { "SNES Joypad", RETRO_DEVICE_JOYPAD }, { "SNES Mouse", RETRO_DEVICE_MOUSE }, { "Multitap", RETRO_DEVICE_JOYPAD_MULTITAP }, }; static const struct retro_controller_description port_2[] = { + { "None", RETRO_DEVICE_NONE }, { "SNES Joypad", RETRO_DEVICE_JOYPAD }, { "SNES Mouse", RETRO_DEVICE_MOUSE }, { "Multitap", RETRO_DEVICE_JOYPAD_MULTITAP }, { "SuperScope", RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE }, { "Justifier", RETRO_DEVICE_LIGHTGUN_JUSTIFIER }, + { "M.A.C.S. Rifle", RETRO_DEVICE_LIGHTGUN_MACSRIFLE }, }; static const struct retro_controller_info ports[] = { - { port_1, 3 }, - { port_2, 5 }, - { 0 }, + { port_1, 4 }, + { port_2, 7 }, + {}, }; environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); } -extern void S9xResetSuperFX(void); - -void update_geometry() +void update_geometry(void) { - struct retro_system_av_info av_info; - retro_get_system_av_info(&av_info); - environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &av_info); + struct retro_system_av_info av_info; + retro_get_system_av_info(&av_info); + environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &av_info); } static void update_variables(void) { - bool reset_sfx = false; bool geometry_update = false; char key[256]; struct retro_variable var; - var.key = "snes9x_overclock"; + + var.key = "snes9x_hires_blend"; + var.value = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) + hires_blend = !strcmp(var.value, "disabled") ? false : true; + else + hires_blend = false; + + var.key = "snes9x_overclock_superfx"; var.value = NULL; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) { - int freq = atoi(var.value); - Settings.SuperFXSpeedPerLine = 0.417f * ((freq + 0.5f) * 1e6); - reset_sfx = true; + int newval; + if(sscanf(var.value,"%d%%",&newval)) + Settings.SuperFXClockMultiplier = newval; } var.key = "snes9x_up_down_allowed"; @@ -214,35 +267,68 @@ static void update_variables(void) var.value = NULL; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (strcmp(var.value, "compatible") == 0) { - if (strcmp(var.value, "compatible") == 0) - { - overclock_cycles = true; - one_c = 4; - slow_one_c = 5; - two_c = 6; - } - else if (strcmp(var.value, "max") == 0) - { - overclock_cycles = true; - one_c = 3; - slow_one_c = 3; - two_c = 3; - } - else - overclock_cycles = false; + overclock_cycles = true; + one_c = 4; + slow_one_c = 5; + two_c = 6; } + else if (strcmp(var.value, "max") == 0) + { + overclock_cycles = true; + one_c = 3; + slow_one_c = 3; + two_c = 3; + } + else + overclock_cycles = false; + } var.key = "snes9x_reduce_sprite_flicker"; var.value = NULL; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) - { - if (strcmp(var.value, "enabled") == 0) - reduce_sprite_flicker = true; - else - reduce_sprite_flicker = false; - } + { + if (strcmp(var.value, "enabled") == 0) + reduce_sprite_flicker = true; + else + reduce_sprite_flicker = false; + } + + var.key = "snes9x_randomize_memory"; + var.value = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (strcmp(var.value, "enabled") == 0) + randomize_memory = true; + else + randomize_memory = false; + } + + var.key = "snes9x_audio_interpolation"; + var.value = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + int oldval = audio_interp_mode; + + if (strcmp(var.value, "none") == 0) + audio_interp_mode = 0; + else if (strcmp(var.value, "linear") == 0) + audio_interp_mode = 1; + else if (strcmp(var.value, "gaussian") == 0) + audio_interp_mode = 2; + else if (strcmp(var.value, "cubic") == 0) + audio_interp_mode = 3; + else if (strcmp(var.value, "sinc") == 0) + audio_interp_mode = 4; + + if (oldval != audio_interp_mode) + audio_interp_max = 32768; + } int disabled_channels=0; strcpy(key, "snes9x_sndchan_x"); @@ -256,7 +342,6 @@ static void update_variables(void) } S9xSetSoundControl(disabled_channels^0xFF); - int disabled_layers=0; strcpy(key, "snes9x_layer_x"); for (int i=0;i<5;i++) @@ -285,17 +370,17 @@ static void update_variables(void) if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { - unsigned newval = 0; - if (strcmp(var.value, "enabled") == 0) - newval = 1; - else if (strcmp(var.value, "disabled") == 0) - newval = 2; - - if (newval != crop_overscan_mode) - { - crop_overscan_mode = newval; - geometry_update = true; - } + unsigned newval = 0; + if (strcmp(var.value, "enabled") == 0) + newval = 1; + else if (strcmp(var.value, "disabled") == 0) + newval = 2; + + if (newval != crop_overscan_mode) + { + crop_overscan_mode = newval; + geometry_update = true; + } } var.key = "snes9x_aspect"; @@ -304,24 +389,31 @@ static void update_variables(void) { unsigned newval = 0; if (strcmp(var.value, "ntsc") == 0) - newval = 1; + newval = 1; else if (strcmp(var.value, "pal") == 0) - newval = 2; + newval = 2; else if (strcmp(var.value, "4:3") == 0) - newval = 3; + newval = 3; if (newval != aspect_ratio_mode) { - aspect_ratio_mode = newval; - geometry_update = true; + aspect_ratio_mode = newval; + geometry_update = true; } } - if (reset_sfx) - S9xResetSuperFX(); + var.key="snes9x_macsrifle_adjust_x"; + var.value=NULL; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + macsrifle_adjust_x = atoi(var.value); + + var.key="snes9x_macsrifle_adjust_y"; + var.value=NULL; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + macsrifle_adjust_y = atoi(var.value); if (geometry_update) - update_geometry(); + update_geometry(); } static void S9xAudioCallback(void*) @@ -334,78 +426,78 @@ static void S9xAudioCallback(void*) size_t avail = S9xGetSampleCount(); while (avail >= BUFFER_SIZE) { - //this loop will never be entered, but handle oversized sample counts just in case - S9xMixSamples((uint8*)audio_buf, BUFFER_SIZE); - audio_batch_cb(audio_buf, BUFFER_SIZE >> 1); + //this loop will never be entered, but handle oversized sample counts just in case + S9xMixSamples((uint8*)audio_buf, BUFFER_SIZE); + audio_batch_cb(audio_buf, BUFFER_SIZE >> 1); - avail -= BUFFER_SIZE; + avail -= BUFFER_SIZE; } if (avail > 0) { - S9xMixSamples((uint8*)audio_buf, avail); - audio_batch_cb(audio_buf, avail >> 1); + S9xMixSamples((uint8*)audio_buf, avail); + audio_batch_cb(audio_buf, avail >> 1); } } void retro_get_system_info(struct retro_system_info *info) { - memset(info,0,sizeof(retro_system_info)); + memset(info,0,sizeof(retro_system_info)); - info->library_name = "Snes9x"; + info->library_name = "Snes9x"; #ifndef GIT_VERSION #define GIT_VERSION "" #endif - info->library_version = VERSION GIT_VERSION; - info->valid_extensions = "smc|sfc|swc|fig"; - info->need_fullpath = false; - info->block_extract = false; + info->library_version = VERSION GIT_VERSION; + info->valid_extensions = "smc|sfc|swc|fig|bs"; + info->need_fullpath = false; + info->block_extract = false; } float get_aspect_ratio(unsigned width, unsigned height) { - if (aspect_ratio_mode == 3) // 4:3 - { - return SNES_4_3; - } - - float sample_frequency_ntsc = 135000000.0 / 11.0; - float sample_frequency_pal = 14750000.0; - - float sample_freq = retro_get_region() == RETRO_REGION_NTSC ? sample_frequency_ntsc : sample_frequency_pal; - float dot_rate = SNES::cpu.frequency / 4.0; - - if (aspect_ratio_mode == 1) // ntsc - { - sample_freq = sample_frequency_ntsc; - dot_rate = NTSC_MASTER_CLOCK / 4.0; - } - else if (aspect_ratio_mode == 2) // pal - { - sample_freq = sample_frequency_pal; - dot_rate = PAL_MASTER_CLOCK / 4.0; - } - - float par = sample_freq / 2.0 / dot_rate; - return (float)width * par / (float)height; + if (aspect_ratio_mode == 3) // 4:3 + { + return SNES_4_3; + } + + float sample_frequency_ntsc = 135000000.0 / 11.0; + float sample_frequency_pal = 14750000.0; + + float sample_freq = retro_get_region() == RETRO_REGION_NTSC ? sample_frequency_ntsc : sample_frequency_pal; + float dot_rate = SNES::cpu.frequency / 4.0; + + if (aspect_ratio_mode == 1) // ntsc + { + sample_freq = sample_frequency_ntsc; + dot_rate = NTSC_MASTER_CLOCK / 4.0; + } + else if (aspect_ratio_mode == 2) // pal + { + sample_freq = sample_frequency_pal; + dot_rate = PAL_MASTER_CLOCK / 4.0; + } + + float par = sample_freq / 2.0 / dot_rate; + return (float)width * par / (float)height; } void retro_get_system_av_info(struct retro_system_av_info *info) { - memset(info,0,sizeof(retro_system_av_info)); - unsigned width = SNES_WIDTH; - unsigned height = PPU.ScreenHeight; - if (crop_overscan_mode == 1) // enabled + memset(info,0,sizeof(retro_system_av_info)); + unsigned width = SNES_WIDTH; + unsigned height = PPU.ScreenHeight; + if (crop_overscan_mode == 1) // enabled height = SNES_HEIGHT; - else if (crop_overscan_mode == 2) // disabled + else if (crop_overscan_mode == 2) // disabled height = SNES_HEIGHT_EXTENDED; - info->geometry.base_width = width; - info->geometry.base_height = height; - info->geometry.max_width = MAX_SNES_WIDTH; - info->geometry.max_height = MAX_SNES_HEIGHT; - info->geometry.aspect_ratio = get_aspect_ratio(width, height); - info->timing.sample_rate = 32040; - info->timing.fps = retro_get_region() == RETRO_REGION_NTSC ? 21477272.0 / 357366.0 : 21281370.0 / 425568.0; + info->geometry.base_width = width; + info->geometry.base_height = height; + info->geometry.max_width = MAX_SNES_WIDTH; + info->geometry.max_height = MAX_SNES_HEIGHT; + info->geometry.aspect_ratio = get_aspect_ratio(width, height); + info->timing.sample_rate = 32040; + info->timing.fps = retro_get_region() == RETRO_REGION_NTSC ? 21477272.0 / 357366.0 : 21281370.0 / 425568.0; } unsigned retro_api_version() @@ -413,7 +505,6 @@ unsigned retro_api_version() return RETRO_API_VERSION; } - void retro_reset() { S9xSoftReset(); @@ -427,6 +518,10 @@ void retro_set_controller_port_device(unsigned port, unsigned device) int offset = snes_devices[0] == RETRO_DEVICE_JOYPAD_MULTITAP ? 4 : 1; switch (device) { + case RETRO_DEVICE_NONE: + S9xSetController(port, CTL_NONE, port, 0, 0, 0); + snes_devices[port] = RETRO_DEVICE_NONE; + break; case RETRO_DEVICE_JOYPAD: S9xSetController(port, CTL_JOYPAD, port * offset, 0, 0, 0); snes_devices[port] = RETRO_DEVICE_JOYPAD; @@ -447,6 +542,10 @@ void retro_set_controller_port_device(unsigned port, unsigned device) S9xSetController(port, CTL_JUSTIFIER, 0, 0, 0, 0); snes_devices[port] = RETRO_DEVICE_LIGHTGUN_JUSTIFIER; break; + case RETRO_DEVICE_LIGHTGUN_MACSRIFLE: + S9xSetController(port, CTL_MACSRIFLE, 0, 0, 0, 0); + snes_devices[port] = RETRO_DEVICE_LIGHTGUN_MACSRIFLE; + break; default: if (log_cb) log_cb(RETRO_LOG_ERROR, "[libretro]: Invalid device.\n"); @@ -525,41 +624,41 @@ static unsigned memorydesc_c; static bool merge_mapping() { - if (memorydesc_c==1) return false;//can't merge the only one - struct retro_memory_descriptor * a=&memorydesc[MAX_MAPS - (memorydesc_c-1)]; - struct retro_memory_descriptor * b=&memorydesc[MAX_MAPS - memorydesc_c]; + if (memorydesc_c==1) return false;//can't merge the only one + struct retro_memory_descriptor * a=&memorydesc[MAX_MAPS - (memorydesc_c-1)]; + struct retro_memory_descriptor * b=&memorydesc[MAX_MAPS - memorydesc_c]; //printf("test %x/%x\n",a->start,b->start); - if (a->flags != b->flags) return false; - if (a->disconnect != b->disconnect) return false; - if (a->len != b->len) return false; - if (a->addrspace || b->addrspace) return false;//we don't use these - if (((char*)a->ptr)+a->offset==((char*)b->ptr)+b->offset && a->select==b->select) - { + if (a->flags != b->flags) return false; + if (a->disconnect != b->disconnect) return false; + if (a->len != b->len) return false; + if (a->addrspace || b->addrspace) return false;//we don't use these + if (((char*)a->ptr)+a->offset==((char*)b->ptr)+b->offset && a->select==b->select) + { //printf("merge/mirror\n"); - a->select&=~(a->start^b->start); - memorydesc_c--; - return true; - } - uint32 len=a->len; - if (!len) len=(0x1000000 - a->select); - if (len && ((len-1) & (len | a->disconnect))==0 && ((char*)a->ptr)+a->offset+len == ((char*)b->ptr)+b->offset) - { + a->select&=~(a->start^b->start); + memorydesc_c--; + return true; + } + uint32 len=a->len; + if (!len) len=(0x1000000 - a->select); + if (len && ((len-1) & (len | a->disconnect))==0 && ((char*)a->ptr)+a->offset+len == ((char*)b->ptr)+b->offset) + { //printf("merge/consec\n"); - a->select &=~ len; - a->disconnect &=~ len; - memorydesc_c--; - return true; - } + a->select &=~ len; + a->disconnect &=~ len; + memorydesc_c--; + return true; + } //printf("nomerge\n"); - return false; + return false; } void S9xAppendMapping(struct retro_memory_descriptor *desc) { - //do it backwards - snes9x defines the last one to win, while we define the first one to win - //printf("add %x\n",desc->start); - memcpy(&memorydesc[MAX_MAPS - (++memorydesc_c)], desc, sizeof(struct retro_memory_descriptor)); - while (merge_mapping()) {} + //do it backwards - snes9x defines the last one to win, while we define the first one to win + //printf("add %x\n",desc->start); + memcpy(&memorydesc[MAX_MAPS - (++memorydesc_c)], desc, sizeof(struct retro_memory_descriptor)); + while (merge_mapping()) {} } static void init_descriptors(void) @@ -630,7 +729,7 @@ static void init_descriptors(void) { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, - { 0 }, + { 0, 0, 0, 0, "" }, }; environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc); @@ -638,26 +737,123 @@ static void init_descriptors(void) static bool ChronoTriggerFrameHack; -bool retro_load_game(const struct retro_game_info *game) +static bool valid_normal_bank (uint8 bankbyte) { - init_descriptors(); - memorydesc_c = 0; + switch (bankbyte) + { + case 32: case 33: case 48: case 49: + return (true); + } - update_variables(); + return (false); +} - if(game->data == NULL && game->size == 0 && game->path != NULL) - rom_loaded = Memory.LoadROM(game->path); - else +static int is_bsx (uint8 *p) +{ + if ((p[26] == 0x33 || p[26] == 0xFF) && (!p[21] || (p[21] & 131) == 128) && valid_normal_bank(p[24])) { - if (game->path != NULL) + unsigned char m = p[22]; + + if (!m && !p[23]) + return (2); + + if ((m == 0xFF && p[23] == 0xFF) || (!(m & 0xF) && ((m >> 4) - 1 < 12))) + return (1); + } + + return (0); +} + +static bool8 is_SufamiTurbo_Cart(const uint8 *data, size_t size) +{ + if (size >= 0x80000 && size <= 0x100000 && + strncmp((const char*)data, "BANDAI SFC-ADX", 14) == 0 && strncmp((const char*)(data + 0x10), "SFC-ADX BACKUP", 14) != 0) + return (TRUE); + + return (FALSE); +} + +static void Remove_Header(uint8_t *&romptr, size_t &romsize, bool multicart_sufami) +{ + if (romptr==0 || romsize==0) return; + + uint32 calc_size = (romsize / 0x2000) * 0x2000; + if ((romsize - calc_size == 512 && !Settings.ForceNoHeader) || Settings.ForceHeader) + { + romptr += 512; + romsize -= 512; + + if(log_cb) log_cb(RETRO_LOG_INFO,"[libretro]: ROM header removed\n"); + } + + if (multicart_sufami) + { + if (strncmp((const char*)(romptr+0x100000), "BANDAI SFC-ADX", 14) == 0 && + strncmp((const char*)(romptr+0x000000), "BANDAI SFC-ADX", 14) == 0) { - extract_basename(g_basename, game->path, sizeof(g_basename)); - extract_directory(g_rom_dir, game->path, sizeof(g_rom_dir)); + romptr += 0x100000; + romsize -= 0x100000; + + if(log_cb) log_cb(RETRO_LOG_INFO,"[libretro]: Sufami Turbo Multi-ROM bios removed\n"); } + } +} + +static bool LoadBIOS(uint8 *biosrom, const char *biosname, size_t biossize) +{ + FILE *fp; + char name[PATH_MAX + 1]; + bool8 r = false; + + strcpy(name, S9xGetDirectory(ROMFILENAME_DIR)); + strcat(name, SLASH_STR); + strcat(name, biosname); - rom_loaded = Memory.LoadROMMem((const uint8_t*)game->data ,game->size); + fp = fopen(name, "rb"); + if (!fp) + { + strcpy(name, S9xGetDirectory(BIOS_DIR)); + strcat(name, SLASH_STR); + strcat(name, biosname); + + fp = fopen(name, "rb"); } + if (fp) + { + size_t size; + + fseek(fp,0,SEEK_END); + size = ftell(fp); + + if (size + 0x200 == biossize) + fseek(fp,0x200,SEEK_SET); + else + fseek(fp,0,SEEK_SET); + + size = fread((void *) biosrom, 1, biossize, fp); + fclose(fp); + + if(size == biossize) r = true; + } + + + if(log_cb) + { + if(!r) + log_cb(RETRO_LOG_INFO, "[libretro]: BIOS not found [%s]\n", biosname); + + else + log_cb(RETRO_LOG_INFO, "[libretro]: BIOS loaded [%s]\n", biosname); + } + return (r); +} + +void retro_load_init_reset() +{ + struct retro_memory_map map={ memorydesc+MAX_MAPS-memorydesc_c, memorydesc_c }; + if (rom_loaded) environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &map); + int pixel_format = RGB555; if(environ_cb) { pixel_format = RGB565; @@ -669,23 +865,103 @@ bool retro_load_game(const struct retro_game_info *game) S9xSetRenderPixelFormat(pixel_format); S9xGraphicsInit(); - if (!rom_loaded && log_cb) - log_cb(RETRO_LOG_ERROR, "[libretro]: Rom loading failed...\n"); - /* Check if Chrono Trigger is loaded, if so, we need to set a variable to * true to get rid of an annoying mid-frame resolution switch to 256x239 * which can cause an undesirable flicker/breakup of the screen for a * split second - this happens whenever the game switches from normal * mode to battle mode and vice versa. */ ChronoTriggerFrameHack = false; - if (Memory.match_nc("CHRONO TRIGGER") || /* Chrono Trigger */ - Memory.match_id("ACT") || - Memory.match_id("AC9J") /* Chrono Trigger (Sample) */ + if (Memory.match_nc("CHRONO TRIGGER") || /* Chrono Trigger */ + Memory.match_id("ACT") || + Memory.match_id("AC9J") /* Chrono Trigger (Sample) */ ) - ChronoTriggerFrameHack = true; + { + ChronoTriggerFrameHack = true; + } - struct retro_memory_map map={ memorydesc+MAX_MAPS-memorydesc_c, memorydesc_c }; - if (rom_loaded) environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &map); + lufia2_credits_hack = false; + if (Memory.match_id("E9ANIE") || + Memory.match_id("01ANIP") || + Memory.match_id("C0ANIJ") || + Memory.match_id("01ANIS") || + Memory.match_id("01ANIH") || + Memory.match_id("01ANID") + ) + { + lufia2_credits_hack = true; + } + + update_geometry(); + + if(randomize_memory) + { + srand(time(NULL)); + for(int lcv=0; lcv<0x20000; lcv++) + Memory.RAM[lcv] = rand()%256; + } + + audio_interp_max = 32768; +} + +bool retro_load_game(const struct retro_game_info *game) +{ + init_descriptors(); + memorydesc_c = 0; + rom_loaded = false; + + update_variables(); + + if(game->data == NULL && game->size == 0 && game->path != NULL) + rom_loaded = Memory.LoadROM(game->path); + else + { + uint8_t *romptr = (uint8_t *) game->data; + size_t romsize = game->size; + + Remove_Header(romptr, romsize, false); + + if (game->path != NULL) + { + extract_basename(g_basename, game->path, sizeof(g_basename)); + extract_directory(g_rom_dir, game->path, sizeof(g_rom_dir)); + } + + if (is_SufamiTurbo_Cart(romptr,romsize)) { + uint8 *biosrom = new uint8[0x40000]; + uint8 *biosptr = biosrom; + + if (LoadBIOS(biosptr,"STBIOS.bin",0x40000)) { + if (log_cb) log_cb(RETRO_LOG_INFO, "[libretro]: Loading Sufami Turbo game\n"); + + rom_loaded = Memory.LoadMultiCartMem((const uint8_t*)romptr, romsize, 0, 0, biosptr, 0x40000); + } + + if(biosrom) delete[] biosrom; + } + + else + if ((is_bsx((uint8 *) romptr+0x7fc0)==1) | (is_bsx((uint8 *) romptr+0xffc0)==1)) { + uint8 *biosrom = new uint8[0x100000]; + uint8 *biosptr = biosrom; + + if (LoadBIOS(biosptr,"BS-X.bin",0x100000)) { + if (log_cb) log_cb(RETRO_LOG_INFO, "[libretro]: Loading Satellaview game\n"); + + rom_loaded = Memory.LoadMultiCartMem(biosptr, 0x100000, (const uint8_t*)romptr, romsize, 0, 0); + } + + if(biosrom) delete[] biosrom; + } + + else + rom_loaded = Memory.LoadROMMem((const uint8_t*)romptr, romsize); + } + + if (rom_loaded) + retro_load_init_reset(); + + else if (log_cb) + log_cb(RETRO_LOG_ERROR, "[libretro]: Rom loading failed...\n"); return rom_loaded; } @@ -693,60 +969,94 @@ bool retro_load_game(const struct retro_game_info *game) void retro_unload_game(void) {} -bool retro_load_game_special(unsigned game_type, - const struct retro_game_info *info, size_t num_info) { +bool retro_load_game_special(unsigned game_type, const struct retro_game_info *info, size_t num_info) +{ + uint8_t *romptr[3]; + size_t romsize[3]; + + for(size_t lcv=0; lcv (SNES_HEIGHT-1)) snes_scope_state[1] = SNES_HEIGHT-1; S9xReportPointer(BTN_POINTER, snes_scope_state[0], snes_scope_state[1]); for (int i = SCOPE_TRIGGER; i <= SCOPE_LAST; i++) - S9xReportButton(MAKE_BUTTON(2, i), input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, i)); + S9xReportButton(MAKE_BUTTON(2, i), input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, i)); break; case RETRO_DEVICE_LIGHTGUN_JUSTIFIER: @@ -1017,16 +1352,30 @@ static void report_buttons() S9xReportButton(MAKE_BUTTON(2, i), input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, i)); break; + case RETRO_DEVICE_LIGHTGUN_MACSRIFLE: + snes_macsrifle_state[0] += input_state_cb(port, RETRO_DEVICE_LIGHTGUN_MACSRIFLE, 0, RETRO_DEVICE_ID_LIGHTGUN_X); + snes_macsrifle_state[1] += input_state_cb(port, RETRO_DEVICE_LIGHTGUN_MACSRIFLE, 0, RETRO_DEVICE_ID_LIGHTGUN_Y); + if (snes_macsrifle_state[0] < 0) snes_macsrifle_state[0] = 0; + else if (snes_macsrifle_state[0] > (SNES_WIDTH-1)) snes_macsrifle_state[0] = SNES_WIDTH-1; + if (snes_macsrifle_state[1] < 0) snes_macsrifle_state[1] = 0; + else if (snes_macsrifle_state[1] > (SNES_HEIGHT-1)) snes_macsrifle_state[1] = SNES_HEIGHT-1; + S9xReportPointer(BTN_POINTER, snes_macsrifle_state[0]+macsrifle_adjust_x, snes_macsrifle_state[1]+macsrifle_adjust_y); + for (int i = MACSRIFLE_TRIGGER; i <= MACSRIFLE_LAST; i++) + S9xReportButton(MAKE_BUTTON(2, i), input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, i)); + break; + default: if (log_cb) log_cb(RETRO_LOG_ERROR, "[libretro]: Unknown device...\n"); - } } } void retro_run() { + //sanity check to prevent infinite loop inside emulator + if (!rom_loaded) return; + static uint16 height = PPU.ScreenHeight; bool updated = false; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) @@ -1069,6 +1418,7 @@ void retro_deinit() S9xUnmapAllControls(); free(GFX.Screen); + free(gfx_blend); } @@ -1085,25 +1435,25 @@ void* retro_get_memory_data(unsigned type) case RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM: case RETRO_MEMORY_SAVE_RAM: data = Memory.SRAM; - break; + break; case RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM: data = Multi.sramB; break; - case RETRO_MEMORY_RTC: - data = RTCData.reg; + case RETRO_MEMORY_RTC: + data = RTCData.reg; + break; + case RETRO_MEMORY_SYSTEM_RAM: + data = Memory.RAM; + break; + case RETRO_MEMORY_VIDEO_RAM: + data = Memory.VRAM; + break; + //case RETRO_MEMORY_ROM: + // data = Memory.ROM; + // break; + default: + data = NULL; break; - case RETRO_MEMORY_SYSTEM_RAM: - data = Memory.RAM; - break; - case RETRO_MEMORY_VIDEO_RAM: - data = Memory.VRAM; - break; - //case RETRO_MEMORY_ROM: - // data = Memory.ROM; - // break; - default: - data = NULL; - break; } return data; @@ -1118,14 +1468,14 @@ size_t retro_get_memory_size(unsigned type) case RETRO_MEMORY_SAVE_RAM: size = (unsigned) (Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0); if (size > 0x20000) - size = 0x20000; - break; + size = 0x20000; + break; case RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM: - size = (unsigned) (Multi.cartType && Multi.sramSizeB ? (1 << (Multi.sramSizeB + 3)) * 128 : 0); + size = (unsigned) (Multi.cartType==4 && Multi.sramSizeB ? (1 << (Multi.sramSizeB + 3)) * 128 : 0); + break; + case RETRO_MEMORY_RTC: + size = (Settings.SRTC || Settings.SPC7110RTC)?20:0; break; - case RETRO_MEMORY_RTC: - size = (Settings.SRTC || Settings.SPC7110RTC)?20:0; - break; case RETRO_MEMORY_SYSTEM_RAM: size = 128 * 1024; break; @@ -1135,9 +1485,9 @@ size_t retro_get_memory_size(unsigned type) //case RETRO_MEMORY_ROM: // size = Memory.CalculatedSize; // break; - default: - size = 0; - break; + default: + size = 0; + break; } return size; @@ -1150,14 +1500,14 @@ size_t retro_serialize_size() bool retro_serialize(void *data, size_t size) { - int result = -1; - bool okay = false; - okay = environ_cb(RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE, &result); - if (okay) - { - Settings.FastSavestates = 0 != (result & 4); - } - if (S9xFreezeGameMem((uint8_t*)data,size) == FALSE) + int result = -1; + bool okay = false; + okay = environ_cb(RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE, &result); + if (okay) + { + Settings.FastSavestates = 0 != (result & 4); + } + if (S9xFreezeGameMem((uint8_t*)data,size) == FALSE) return false; return true; @@ -1170,7 +1520,7 @@ bool retro_unserialize(const void* data, size_t size) okay = environ_cb(RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE, &result); if (okay) { - Settings.FastSavestates = 0 != (result & 4); + Settings.FastSavestates = 0 != (result & 4); } if (S9xUnfreezeGameMem((const uint8_t*)data,size) != SUCCESS) return false; @@ -1200,7 +1550,7 @@ bool8 S9xDeinitUpdate(int width, int height) if (height > SNES_HEIGHT_EXTENDED) { if (height < SNES_HEIGHT_EXTENDED << 1) - memset(GFX.Screen + (GFX.Pitch >> 1) * height,0,GFX.Pitch * ((SNES_HEIGHT_EXTENDED << 1) - height)); + memset(GFX.Screen + (GFX.Pitch >> 1) * height,0,GFX.Pitch * ((SNES_HEIGHT_EXTENDED << 1) - height)); height = SNES_HEIGHT_EXTENDED << 1; } else @@ -1211,12 +1561,44 @@ bool8 S9xDeinitUpdate(int width, int height) } } - video_cb(GFX.Screen, width, height, GFX.Pitch); + if(width==MAX_SNES_WIDTH && hires_blend) + { +#define AVERAGE_565(el0, el1) (((el0) & (el1)) + ((((el0) ^ (el1)) & 0xF7DE) >> 1)) + for (register int y = 0; y < height; y++) + { + register uint16 *input = (uint16 *) ((uint8 *) GFX.Screen + y * GFX.Pitch); + register uint16 *output = (uint16 *) ((uint8 *) gfx_blend + y * GFX.Pitch); + register uint16 l, r; + + l = 0; + for (register int x = 0; x < (width >> 1); x++) + { + r = *input++; + *output++ = AVERAGE_565 (l, r); + l = r; + + r = *input++; + *output++ = AVERAGE_565 (l, r); + l = r; + } + } + + video_cb(gfx_blend, width, height, GFX.Pitch); + } + else + { + video_cb(GFX.Screen, width, height, GFX.Pitch); + } + return TRUE; } bool8 S9xContinueUpdate(int width, int height) { + // scrolling credits interlace -- show whole frame + if(lufia2_credits_hack && PPU.BGMode==6) + return TRUE; + return S9xDeinitUpdate(width, height); } @@ -1240,8 +1622,7 @@ const char* S9xGetFilename(const char* in, s9x_getdirtype type) switch (type) { case ROMFILENAME_DIR: - sprintf(newpath, "%s%c%s%s", - g_rom_dir, SLASH, g_basename, in); + sprintf(newpath, "%s%c%s%s", g_rom_dir, SLASH, g_basename, in); return newpath; default: break; @@ -1256,6 +1637,8 @@ const char* S9xGetDirectory(s9x_getdirtype type) { case ROMFILENAME_DIR: return g_rom_dir; + case BIOS_DIR: + return retro_system_directory; default: break; } @@ -1280,26 +1663,26 @@ bool S9xPollPointer(unsigned int, short*, short*) { return false; } void S9xMessage(int type, int, const char* s) { - if (!log_cb) return; - - switch (type) - { - case S9X_DEBUG: - log_cb(RETRO_LOG_DEBUG, "%s\n", s); - break; - case S9X_WARNING: - log_cb(RETRO_LOG_WARN, "%s\n", s); - break; - case S9X_INFO: - log_cb(RETRO_LOG_INFO, "%s\n", s); - break; - case S9X_ERROR: - log_cb(RETRO_LOG_ERROR, "%s\n", s); - break; - default: - log_cb(RETRO_LOG_DEBUG, "%s\n", s); - break; - } + if (!log_cb) return; + + switch (type) + { + case S9X_DEBUG: + log_cb(RETRO_LOG_DEBUG, "%s\n", s); + break; + case S9X_WARNING: + log_cb(RETRO_LOG_WARN, "%s\n", s); + break; + case S9X_INFO: + log_cb(RETRO_LOG_INFO, "%s\n", s); + break; + case S9X_ERROR: + log_cb(RETRO_LOG_ERROR, "%s\n", s); + break; + default: + log_cb(RETRO_LOG_DEBUG, "%s\n", s); + break; + } } bool8 S9xOpenSnapshotFile(const char* filepath, bool8 read_only, STREAM *file) @@ -1337,8 +1720,8 @@ void _splitpath (const char *path, char *drive, char *dir, char *fname, char *ex { *drive = 0; - const char *slash = strrchr(path, SLASH_CHAR), - *dot = strrchr(path, '.'); + const char *slash = strrchr(path, SLASH_CHAR), + *dot = strrchr(path, '.'); if (dot && slash && dot < slash) dot = NULL; @@ -1393,3 +1776,397 @@ void _makepath (char *path, const char *, const char *dir, const char *fname, co } } #endif // __WIN32__ + +// interpolation by Mudlord +static short const cubic [514] = +{ + 0, -4, -8, -12, -16, -20, -23, -27, -30, -34, -37, -41, -44, -47, -50, -53, + -56, -59, -62, -65, -68, -71, -73, -76, -78, -81, -84, -87, -89, -91, -93, -95, + -98,-100,-102,-104,-106,-109,-110,-112,-113,-116,-117,-119,-121,-122,-123,-125, +-126,-128,-129,-131,-132,-134,-134,-136,-136,-138,-138,-140,-141,-141,-142,-143, +-144,-144,-145,-146,-147,-148,-147,-148,-148,-149,-149,-150,-150,-150,-150,-151, +-151,-151,-151,-151,-152,-152,-151,-152,-151,-152,-151,-151,-151,-151,-150,-150, +-150,-149,-149,-149,-149,-148,-147,-147,-146,-146,-145,-145,-144,-144,-143,-142, +-141,-141,-140,-139,-139,-138,-137,-136,-135,-135,-133,-133,-132,-131,-130,-129, +-128,-127,-126,-125,-124,-123,-121,-121,-119,-118,-117,-116,-115,-114,-112,-111, +-110,-109,-107,-106,-105,-104,-102,-102,-100, -99, -97, -97, -95, -94, -92, -91, + -90, -88, -87, -86, -85, -84, -82, -81, -79, -78, -76, -76, -74, -73, -71, -70, + -68, -67, -66, -65, -63, -62, -60, -60, -58, -57, -55, -55, -53, -52, -50, -49, + -48, -46, -45, -44, -43, -42, -40, -39, -38, -37, -36, -35, -34, -32, -31, -30, + -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -19, -17, -16, -15, -14, + -14, -13, -12, -11, -11, -10, -9, -9, -8, -8, -7, -7, -6, -5, -4, -4, + -3, -3, -3, -2, -2, -2, -1, -1, 0, -1, 0, -1, 0, 0, 0, 0, + 0, +2048,2048,2048,2048,2047,2047,2046,2045,2043,2042,2041,2039,2037,2035,2033,2031, +2028,2026,2024,2021,2018,2015,2012,2009,2005,2002,1999,1995,1991,1987,1982,1978, +1974,1969,1965,1960,1955,1951,1946,1940,1934,1929,1924,1918,1912,1906,1900,1895, +1888,1882,1875,1869,1862,1856,1849,1842,1835,1828,1821,1814,1806,1799,1791,1783, +1776,1768,1760,1753,1744,1737,1728,1720,1711,1703,1695,1686,1677,1668,1659,1651, +1641,1633,1623,1614,1605,1596,1587,1577,1567,1559,1549,1539,1529,1520,1510,1499, +1490,1480,1470,1460,1450,1440,1430,1420,1408,1398,1389,1378,1367,1357,1346,1336, +1325,1315,1304,1293,1282,1272,1261,1250,1239,1229,1218,1207,1196,1185,1174,1163, +1152,1141,1130,1119,1108,1097,1086,1075,1063,1052,1042,1030,1019,1008, 997, 986, + 974, 964, 952, 941, 930, 919, 908, 897, 886, 875, 864, 853, 842, 831, 820, 809, + 798, 787, 776, 765, 754, 744, 733, 722, 711, 700, 690, 679, 668, 658, 647, 637, + 626, 616, 605, 595, 584, 574, 564, 554, 543, 534, 524, 514, 503, 494, 483, 473, + 464, 454, 444, 435, 425, 416, 407, 397, 387, 378, 370, 360, 351, 342, 333, 325, + 315, 307, 298, 290, 281, 273, 265, 256, 248, 241, 233, 225, 216, 209, 201, 193, + 186, 178, 171, 164, 157, 150, 143, 137, 129, 123, 117, 110, 103, 97, 91, 85, + 79, 74, 68, 62, 56, 51, 46, 41, 35, 31, 27, 22, 17, 13, 8, 4, + 0 +}; + +static short const sinc [2048] = +{ + 39, -315, 666, 15642, 666, -315, 39, -38, + 38, -302, 613, 15642, 718, -328, 41, -38, + 36, -288, 561, 15641, 772, -342, 42, -38, + 35, -275, 510, 15639, 826, -355, 44, -38, + 33, -263, 459, 15636, 880, -369, 46, -38, + 32, -250, 408, 15632, 935, -383, 47, -38, + 31, -237, 358, 15628, 990, -396, 49, -38, + 29, -224, 309, 15622, 1046, -410, 51, -38, + 28, -212, 259, 15616, 1103, -425, 53, -38, + 27, -200, 211, 15609, 1159, -439, 54, -38, + 25, -188, 163, 15601, 1216, -453, 56, -38, + 24, -175, 115, 15593, 1274, -467, 58, -38, + 23, -164, 68, 15583, 1332, -482, 60, -38, + 22, -152, 22, 15573, 1391, -496, 62, -37, + 21, -140, -24, 15562, 1450, -511, 64, -37, + 19, -128, -70, 15550, 1509, -526, 66, -37, + 18, -117, -115, 15538, 1569, -540, 68, -37, + 17, -106, -159, 15524, 1629, -555, 70, -37, + 16, -94, -203, 15510, 1690, -570, 72, -36, + 15, -83, -247, 15495, 1751, -585, 74, -36, + 14, -72, -289, 15479, 1813, -600, 76, -36, + 13, -62, -332, 15462, 1875, -616, 79, -36, + 12, -51, -374, 15445, 1937, -631, 81, -35, + 11, -40, -415, 15426, 2000, -646, 83, -35, + 11, -30, -456, 15407, 2063, -662, 85, -35, + 10, -20, -496, 15387, 2127, -677, 88, -34, + 9, -9, -536, 15366, 2191, -693, 90, -34, + 8, 1, -576, 15345, 2256, -708, 92, -34, + 7, 10, -614, 15323, 2321, -724, 95, -33, + 7, 20, -653, 15300, 2386, -740, 97, -33, + 6, 30, -690, 15276, 2451, -755, 99, -33, + 5, 39, -728, 15251, 2517, -771, 102, -32, + 5, 49, -764, 15226, 2584, -787, 104, -32, + 4, 58, -801, 15200, 2651, -803, 107, -32, + 3, 67, -836, 15173, 2718, -819, 109, -31, + 3, 76, -871, 15145, 2785, -835, 112, -31, + 2, 85, -906, 15117, 2853, -851, 115, -30, + 2, 93, -940, 15087, 2921, -867, 117, -30, + 1, 102, -974, 15057, 2990, -883, 120, -29, + 1, 110, -1007, 15027, 3059, -899, 122, -29, + 0, 118, -1039, 14995, 3128, -915, 125, -29, + 0, 127, -1071, 14963, 3198, -931, 128, -28, + -1, 135, -1103, 14930, 3268, -948, 131, -28, + -1, 142, -1134, 14896, 3338, -964, 133, -27, + -1, 150, -1164, 14862, 3409, -980, 136, -27, + -2, 158, -1194, 14827, 3480, -996, 139, -26, + -2, 165, -1224, 14791, 3551, -1013, 142, -26, + -3, 172, -1253, 14754, 3622, -1029, 144, -25, + -3, 179, -1281, 14717, 3694, -1045, 147, -25, + -3, 187, -1309, 14679, 3766, -1062, 150, -24, + -3, 193, -1337, 14640, 3839, -1078, 153, -24, + -4, 200, -1363, 14601, 3912, -1094, 156, -23, + -4, 207, -1390, 14561, 3985, -1110, 159, -23, + -4, 213, -1416, 14520, 4058, -1127, 162, -22, + -4, 220, -1441, 14479, 4131, -1143, 165, -22, + -4, 226, -1466, 14437, 4205, -1159, 168, -22, + -5, 232, -1490, 14394, 4279, -1175, 171, -21, + -5, 238, -1514, 14350, 4354, -1192, 174, -21, + -5, 244, -1537, 14306, 4428, -1208, 177, -20, + -5, 249, -1560, 14261, 4503, -1224, 180, -20, + -5, 255, -1583, 14216, 4578, -1240, 183, -19, + -5, 260, -1604, 14169, 4653, -1256, 186, -19, + -5, 265, -1626, 14123, 4729, -1272, 189, -18, + -5, 271, -1647, 14075, 4805, -1288, 192, -18, + -5, 276, -1667, 14027, 4881, -1304, 195, -17, + -6, 280, -1687, 13978, 4957, -1320, 198, -17, + -6, 285, -1706, 13929, 5033, -1336, 201, -16, + -6, 290, -1725, 13879, 5110, -1352, 204, -16, + -6, 294, -1744, 13829, 5186, -1368, 207, -15, + -6, 299, -1762, 13777, 5263, -1383, 210, -15, + -6, 303, -1779, 13726, 5340, -1399, 213, -14, + -6, 307, -1796, 13673, 5418, -1414, 216, -14, + -6, 311, -1813, 13620, 5495, -1430, 219, -13, + -5, 315, -1829, 13567, 5573, -1445, 222, -13, + -5, 319, -1844, 13512, 5651, -1461, 225, -13, + -5, 322, -1859, 13458, 5728, -1476, 229, -12, + -5, 326, -1874, 13402, 5806, -1491, 232, -12, + -5, 329, -1888, 13347, 5885, -1506, 235, -11, + -5, 332, -1902, 13290, 5963, -1521, 238, -11, + -5, 335, -1915, 13233, 6041, -1536, 241, -10, + -5, 338, -1928, 13176, 6120, -1551, 244, -10, + -5, 341, -1940, 13118, 6199, -1566, 247, -10, + -5, 344, -1952, 13059, 6277, -1580, 250, -9, + -5, 347, -1964, 13000, 6356, -1595, 253, -9, + -5, 349, -1975, 12940, 6435, -1609, 256, -8, + -4, 352, -1986, 12880, 6514, -1623, 259, -8, + -4, 354, -1996, 12819, 6594, -1637, 262, -8, + -4, 356, -2005, 12758, 6673, -1651, 265, -7, + -4, 358, -2015, 12696, 6752, -1665, 268, -7, + -4, 360, -2024, 12634, 6831, -1679, 271, -7, + -4, 362, -2032, 12572, 6911, -1693, 274, -6, + -4, 364, -2040, 12509, 6990, -1706, 277, -6, + -4, 366, -2048, 12445, 7070, -1719, 280, -6, + -3, 367, -2055, 12381, 7149, -1732, 283, -5, + -3, 369, -2062, 12316, 7229, -1745, 286, -5, + -3, 370, -2068, 12251, 7308, -1758, 289, -5, + -3, 371, -2074, 12186, 7388, -1771, 291, -4, + -3, 372, -2079, 12120, 7467, -1784, 294, -4, + -3, 373, -2084, 12054, 7547, -1796, 297, -4, + -3, 374, -2089, 11987, 7626, -1808, 300, -4, + -2, 375, -2094, 11920, 7706, -1820, 303, -3, + -2, 376, -2098, 11852, 7785, -1832, 305, -3, + -2, 376, -2101, 11785, 7865, -1844, 308, -3, + -2, 377, -2104, 11716, 7944, -1855, 311, -3, + -2, 377, -2107, 11647, 8024, -1866, 313, -2, + -2, 378, -2110, 11578, 8103, -1877, 316, -2, + -2, 378, -2112, 11509, 8182, -1888, 318, -2, + -1, 378, -2113, 11439, 8262, -1899, 321, -2, + -1, 378, -2115, 11369, 8341, -1909, 323, -2, + -1, 378, -2116, 11298, 8420, -1920, 326, -2, + -1, 378, -2116, 11227, 8499, -1930, 328, -1, + -1, 378, -2116, 11156, 8578, -1940, 331, -1, + -1, 378, -2116, 11084, 8656, -1949, 333, -1, + -1, 377, -2116, 11012, 8735, -1959, 335, -1, + -1, 377, -2115, 10940, 8814, -1968, 337, -1, + -1, 377, -2114, 10867, 8892, -1977, 340, -1, + -1, 376, -2112, 10795, 8971, -1985, 342, -1, + 0, 375, -2111, 10721, 9049, -1994, 344, -1, + 0, 375, -2108, 10648, 9127, -2002, 346, 0, + 0, 374, -2106, 10574, 9205, -2010, 348, 0, + 0, 373, -2103, 10500, 9283, -2018, 350, 0, + 0, 372, -2100, 10426, 9360, -2025, 352, 0, + 0, 371, -2097, 10351, 9438, -2032, 354, 0, + 0, 370, -2093, 10276, 9515, -2039, 355, 0, + 0, 369, -2089, 10201, 9592, -2046, 357, 0, + 0, 367, -2084, 10126, 9669, -2052, 359, 0, + 0, 366, -2080, 10050, 9745, -2058, 360, 0, + 0, 365, -2075, 9974, 9822, -2064, 362, 0, + 0, 363, -2070, 9898, 9898, -2070, 363, 0, + 0, 362, -2064, 9822, 9974, -2075, 365, 0, + 0, 360, -2058, 9745, 10050, -2080, 366, 0, + 0, 359, -2052, 9669, 10126, -2084, 367, 0, + 0, 357, -2046, 9592, 10201, -2089, 369, 0, + 0, 355, -2039, 9515, 10276, -2093, 370, 0, + 0, 354, -2032, 9438, 10351, -2097, 371, 0, + 0, 352, -2025, 9360, 10426, -2100, 372, 0, + 0, 350, -2018, 9283, 10500, -2103, 373, 0, + 0, 348, -2010, 9205, 10574, -2106, 374, 0, + 0, 346, -2002, 9127, 10648, -2108, 375, 0, + -1, 344, -1994, 9049, 10721, -2111, 375, 0, + -1, 342, -1985, 8971, 10795, -2112, 376, -1, + -1, 340, -1977, 8892, 10867, -2114, 377, -1, + -1, 337, -1968, 8814, 10940, -2115, 377, -1, + -1, 335, -1959, 8735, 11012, -2116, 377, -1, + -1, 333, -1949, 8656, 11084, -2116, 378, -1, + -1, 331, -1940, 8578, 11156, -2116, 378, -1, + -1, 328, -1930, 8499, 11227, -2116, 378, -1, + -2, 326, -1920, 8420, 11298, -2116, 378, -1, + -2, 323, -1909, 8341, 11369, -2115, 378, -1, + -2, 321, -1899, 8262, 11439, -2113, 378, -1, + -2, 318, -1888, 8182, 11509, -2112, 378, -2, + -2, 316, -1877, 8103, 11578, -2110, 378, -2, + -2, 313, -1866, 8024, 11647, -2107, 377, -2, + -3, 311, -1855, 7944, 11716, -2104, 377, -2, + -3, 308, -1844, 7865, 11785, -2101, 376, -2, + -3, 305, -1832, 7785, 11852, -2098, 376, -2, + -3, 303, -1820, 7706, 11920, -2094, 375, -2, + -4, 300, -1808, 7626, 11987, -2089, 374, -3, + -4, 297, -1796, 7547, 12054, -2084, 373, -3, + -4, 294, -1784, 7467, 12120, -2079, 372, -3, + -4, 291, -1771, 7388, 12186, -2074, 371, -3, + -5, 289, -1758, 7308, 12251, -2068, 370, -3, + -5, 286, -1745, 7229, 12316, -2062, 369, -3, + -5, 283, -1732, 7149, 12381, -2055, 367, -3, + -6, 280, -1719, 7070, 12445, -2048, 366, -4, + -6, 277, -1706, 6990, 12509, -2040, 364, -4, + -6, 274, -1693, 6911, 12572, -2032, 362, -4, + -7, 271, -1679, 6831, 12634, -2024, 360, -4, + -7, 268, -1665, 6752, 12696, -2015, 358, -4, + -7, 265, -1651, 6673, 12758, -2005, 356, -4, + -8, 262, -1637, 6594, 12819, -1996, 354, -4, + -8, 259, -1623, 6514, 12880, -1986, 352, -4, + -8, 256, -1609, 6435, 12940, -1975, 349, -5, + -9, 253, -1595, 6356, 13000, -1964, 347, -5, + -9, 250, -1580, 6277, 13059, -1952, 344, -5, + -10, 247, -1566, 6199, 13118, -1940, 341, -5, + -10, 244, -1551, 6120, 13176, -1928, 338, -5, + -10, 241, -1536, 6041, 13233, -1915, 335, -5, + -11, 238, -1521, 5963, 13290, -1902, 332, -5, + -11, 235, -1506, 5885, 13347, -1888, 329, -5, + -12, 232, -1491, 5806, 13402, -1874, 326, -5, + -12, 229, -1476, 5728, 13458, -1859, 322, -5, + -13, 225, -1461, 5651, 13512, -1844, 319, -5, + -13, 222, -1445, 5573, 13567, -1829, 315, -5, + -13, 219, -1430, 5495, 13620, -1813, 311, -6, + -14, 216, -1414, 5418, 13673, -1796, 307, -6, + -14, 213, -1399, 5340, 13726, -1779, 303, -6, + -15, 210, -1383, 5263, 13777, -1762, 299, -6, + -15, 207, -1368, 5186, 13829, -1744, 294, -6, + -16, 204, -1352, 5110, 13879, -1725, 290, -6, + -16, 201, -1336, 5033, 13929, -1706, 285, -6, + -17, 198, -1320, 4957, 13978, -1687, 280, -6, + -17, 195, -1304, 4881, 14027, -1667, 276, -5, + -18, 192, -1288, 4805, 14075, -1647, 271, -5, + -18, 189, -1272, 4729, 14123, -1626, 265, -5, + -19, 186, -1256, 4653, 14169, -1604, 260, -5, + -19, 183, -1240, 4578, 14216, -1583, 255, -5, + -20, 180, -1224, 4503, 14261, -1560, 249, -5, + -20, 177, -1208, 4428, 14306, -1537, 244, -5, + -21, 174, -1192, 4354, 14350, -1514, 238, -5, + -21, 171, -1175, 4279, 14394, -1490, 232, -5, + -22, 168, -1159, 4205, 14437, -1466, 226, -4, + -22, 165, -1143, 4131, 14479, -1441, 220, -4, + -22, 162, -1127, 4058, 14520, -1416, 213, -4, + -23, 159, -1110, 3985, 14561, -1390, 207, -4, + -23, 156, -1094, 3912, 14601, -1363, 200, -4, + -24, 153, -1078, 3839, 14640, -1337, 193, -3, + -24, 150, -1062, 3766, 14679, -1309, 187, -3, + -25, 147, -1045, 3694, 14717, -1281, 179, -3, + -25, 144, -1029, 3622, 14754, -1253, 172, -3, + -26, 142, -1013, 3551, 14791, -1224, 165, -2, + -26, 139, -996, 3480, 14827, -1194, 158, -2, + -27, 136, -980, 3409, 14862, -1164, 150, -1, + -27, 133, -964, 3338, 14896, -1134, 142, -1, + -28, 131, -948, 3268, 14930, -1103, 135, -1, + -28, 128, -931, 3198, 14963, -1071, 127, 0, + -29, 125, -915, 3128, 14995, -1039, 118, 0, + -29, 122, -899, 3059, 15027, -1007, 110, 1, + -29, 120, -883, 2990, 15057, -974, 102, 1, + -30, 117, -867, 2921, 15087, -940, 93, 2, + -30, 115, -851, 2853, 15117, -906, 85, 2, + -31, 112, -835, 2785, 15145, -871, 76, 3, + -31, 109, -819, 2718, 15173, -836, 67, 3, + -32, 107, -803, 2651, 15200, -801, 58, 4, + -32, 104, -787, 2584, 15226, -764, 49, 5, + -32, 102, -771, 2517, 15251, -728, 39, 5, + -33, 99, -755, 2451, 15276, -690, 30, 6, + -33, 97, -740, 2386, 15300, -653, 20, 7, + -33, 95, -724, 2321, 15323, -614, 10, 7, + -34, 92, -708, 2256, 15345, -576, 1, 8, + -34, 90, -693, 2191, 15366, -536, -9, 9, + -34, 88, -677, 2127, 15387, -496, -20, 10, + -35, 85, -662, 2063, 15407, -456, -30, 11, + -35, 83, -646, 2000, 15426, -415, -40, 11, + -35, 81, -631, 1937, 15445, -374, -51, 12, + -36, 79, -616, 1875, 15462, -332, -62, 13, + -36, 76, -600, 1813, 15479, -289, -72, 14, + -36, 74, -585, 1751, 15495, -247, -83, 15, + -36, 72, -570, 1690, 15510, -203, -94, 16, + -37, 70, -555, 1629, 15524, -159, -106, 17, + -37, 68, -540, 1569, 15538, -115, -117, 18, + -37, 66, -526, 1509, 15550, -70, -128, 19, + -37, 64, -511, 1450, 15562, -24, -140, 21, + -37, 62, -496, 1391, 15573, 22, -152, 22, + -38, 60, -482, 1332, 15583, 68, -164, 23, + -38, 58, -467, 1274, 15593, 115, -175, 24, + -38, 56, -453, 1216, 15601, 163, -188, 25, + -38, 54, -439, 1159, 15609, 211, -200, 27, + -38, 53, -425, 1103, 15616, 259, -212, 28, + -38, 51, -410, 1046, 15622, 309, -224, 29, + -38, 49, -396, 990, 15628, 358, -237, 31, + -38, 47, -383, 935, 15632, 408, -250, 32, + -38, 46, -369, 880, 15636, 459, -263, 33, + -38, 44, -355, 826, 15639, 510, -275, 35, + -38, 42, -342, 772, 15641, 561, -288, 36, + -38, 41, -328, 718, 15642, 613, -302, 38, +}; + +bool8 libretro_get_snes_interp() +{ + if(audio_interp_mode != 2) return true; + return false; +} + +#define CLAMP16( io )\ +{\ + if ( (int16_t) io != io )\ + io = (io >> 31) ^ 0x7FFF;\ +} + +int libretro_snes_interp(void *ptr) +{ + SNES::SPC_DSP::voice_t const* v = (SNES::SPC_DSP::voice_t const*) ptr; + int out = 0; + + switch(audio_interp_mode) { + // none + case 0: + out = v->buf [(v->interp_pos >> 12) + v->buf_pos] & ~1; + break; + + // linear + case 1: { + int fract = v->interp_pos & 0xFFF; + + int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos]; + out = (0x1000 - fract) * in [0]; + out += fract * in [1]; + out >>= 12; + break; + } + + // gaussian + case 2: + break; + + // cubic + case 3: { + // Make pointers into cubic based on fractional position between samples + int offset = v->interp_pos >> 4 & 0xFF; + short const* fwd = cubic + offset; + short const* rev = cubic + 256 - offset; // mirror left half of cubic + + int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos]; + out = fwd [ 0] * in [0]; + out += fwd [257] * in [1]; + out += rev [257] * in [2]; + out += rev [ 0] * in [3]; + out >>= 11; + break; + } + + // sinc + case 4: { + // Make pointers into cubic based on fractional position between samples + int offset = v->interp_pos & 0xFF0; + short const* filt = (short const*) (((char const*)sinc) + offset); + + int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos]; + out = filt [0] * in [0]; + out += filt [1] * in [1]; + out += filt [2] * in [2]; + out += filt [3] * in [3]; + out += filt [4] * in [4]; + out += filt [5] * in [5]; + out += filt [6] * in [6]; + out += filt [7] * in [7]; + out >>= 14; + break; + } + } + + int out_max = out; + out *= 32768; + out /= audio_interp_max; + + if( out > 32767 ) + { + //if(log_cb) log_cb(RETRO_LOG_INFO,"audio max = %X\n",out_max); + audio_interp_max = out_max; + out = 32767; + } + + else if( out < -32768 ) + { + //if(log_cb) log_cb(RETRO_LOG_INFO,"audio max = %X\n",out_max); + audio_interp_max = -out_max; + out = -32768; + } + + return out; +} diff --git a/loadzip.cpp b/loadzip.cpp index c190aa21cca8443bb6b1f70ffbce3dd4369e6fb8..7249aba281f479f4d9aea3a47cd99260520b6e18 100644 --- a/loadzip.cpp +++ b/loadzip.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/logger.cpp b/logger.cpp index 4754aad70f2096031514a4cfec57748f6d6b126d..c95124f10a356c5fadbc03626a7b540b6287154d 100644 --- a/logger.cpp +++ b/logger.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/logger.h b/logger.h index d0d69e4bfbf635019586d80f5003f85f8e8e01c4..a4dd102a44d5ce28d10b6116cf0cd7963bef06c8 100644 --- a/logger.h +++ b/logger.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/memmap.cpp b/memmap.cpp index c18d978ba6c148bbe7659c3e8813be0a8220e236..8c65a53c5186d0bd382c97c553c3bcea751101e9 100644 --- a/memmap.cpp +++ b/memmap.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -190,7 +195,11 @@ #include #ifdef UNZIP_SUPPORT -#include "unzip/unzip.h" +# ifdef SYSTEM_ZIP +# include +# else +# include "unzip/unzip.h" +# endif #endif #ifdef JMA_SUPPORT @@ -199,11 +208,6 @@ #include #include -#ifdef _WIN32 -#include -#else -#include -#endif #include "snes9x.h" #include "memmap.h" @@ -215,8 +219,11 @@ #include "cheats.h" #include "display.h" +#ifdef __LIBRETRO__ #include "libretro/libretro.h" extern retro_log_printf_t log_cb; +#endif +int dma_kludge; void S9xAppendMapping(struct retro_memory_descriptor *desc); @@ -958,9 +965,8 @@ static void S9xDeinterleaveGD24 (int, uint8 *); static bool8 allASCII (uint8 *, int); static bool8 is_SufamiTurbo_BIOS (const uint8 *, uint32); static bool8 is_SufamiTurbo_Cart (const uint8 *, uint32); -static bool8 is_SameGame_BIOS (const uint8 *, uint32); -static bool8 is_SameGame_Add_On (const uint8 *, uint32); -static bool8 is_GNEXT_BIOS (const uint8 *, uint32); +static bool8 is_BSCart_BIOS (const uint8 *, uint32); +static bool8 is_BSCartSA1_BIOS(const uint8 *, uint32); static bool8 is_GNEXT_Add_On (const uint8 *, uint32); static uint32 caCRC32 (uint8 *, uint32, uint32 crc32 = 0xffffffff); // deinterleave @@ -1071,10 +1077,10 @@ static void S9xDeinterleaveGD24 (int size, uint8 *base) bool8 CMemory::Init (void) { - RAM = (uint8 *) malloc(0x20000); - SRAM = (uint8 *) malloc(0x20000); - VRAM = (uint8 *) malloc(0x10000); - ROM = (uint8 *) malloc(MAX_ROM_SIZE + 0x200 + 0x8000); + RAM = (uint8 *) malloc(0x20000); + SRAM = (uint8 *) malloc(0x20000); + VRAM = (uint8 *) malloc(0x10000); + ROM = (uint8 *) malloc(MAX_ROM_SIZE + 0x200 + 0x8000); IPPU.TileCache[TILE_2BIT] = (uint8 *) malloc(MAX_2BIT_TILES * 64); IPPU.TileCache[TILE_4BIT] = (uint8 *) malloc(MAX_4BIT_TILES * 64); @@ -1236,25 +1242,34 @@ static bool8 is_SufamiTurbo_Cart (const uint8 *data, uint32 size) return (FALSE); } -static bool8 is_SameGame_BIOS (const uint8 *data, uint32 size) +static bool8 is_BSCart_BIOS(const uint8 *data, uint32 size) { - if (size == 0x100000 && strncmp((char *) (data + 0xffc0), "Same Game Tsume Game", 20) == 0) + if ((data[0x7FB2] == 0x5A) && (data[0x7FB5] != 0x20) && (data[0x7FDA] == 0x33)) + { + Memory.LoROM = TRUE; + Memory.HiROM = FALSE; + return (TRUE); - else - return (FALSE); -} + } + else if ((data[0xFFB2] == 0x5A) && (data[0xFFB5] != 0x20) && (data[0xFFDA] == 0x33)) + { + Memory.LoROM = FALSE; + Memory.HiROM = TRUE; -static bool8 is_SameGame_Add_On (const uint8 *data, uint32 size) -{ - if (size == 0x80000) return (TRUE); + } else return (FALSE); } -static bool8 is_GNEXT_BIOS (const uint8 *data, uint32 size) +static bool8 is_BSCartSA1_BIOS (const uint8 *data, uint32 size) { - if (size == 0x180000 && strncmp((char *) (data + 0x7fc0), "SFC SDGUNDAMGNEXT", 17) == 0) + //Same basic check as BSCart + if (!is_BSCart_BIOS(data, size)) + return (FALSE); + + //Checks if the game is Itoi's Bass Fishing No. 1 (ZBPJ) or SD Gundam G-NEXT (ZX3J) + if (strncmp((char *)(data + 0x7fb2), "ZBPJ", 4) == 0 || strncmp((char *)(data + 0x7fb2), "ZX3J", 4) == 0) return (TRUE); else return (FALSE); @@ -1268,14 +1283,6 @@ static bool8 is_GNEXT_Add_On (const uint8 *data, uint32 size) return (FALSE); } -static bool8 MsuRomExists (void) -{ - struct stat buf; - const char *path = S9xGetFilename(".msu", ROMFILENAME_DIR); - - return (stat(path, &buf) == 0); -} - int CMemory::ScoreHiROM (bool8 skip_header, int32 romoff) { uint8 *buf = ROM + 0xff00 + romoff + (skip_header ? 0x200 : 0); @@ -1423,7 +1430,7 @@ uint32 CMemory::FileLoader (uint8 *buffer, const char *filename, uint32 maxsize) _makepath(fname, drive, dir, name, exts); int nFormat = FILE_DEFAULT; - if (strcasecmp(ext, "zip") == 0) + if (strcasecmp(ext, "zip") == 0 || strcasecmp(ext, "msu1") == 0) nFormat = FILE_ZIP; else if (strcasecmp(ext, "jma") == 0) @@ -1536,16 +1543,6 @@ bool8 CMemory::LoadROMMem (const uint8 *source, uint32 sourceSize) return FALSE; strcpy(ROMFilename,"MemoryROM"); - - //allows headered roms to be loaded from ram instead of file - uint32 calc_size = (sourceSize / 0x2000) * 0x2000; - if ((sourceSize - calc_size == 512 && !Settings.ForceNoHeader) || Settings.ForceHeader) - { - source += 512; - sourceSize -= 512; - S9xMessage(S9X_INFO, S9X_HEADERS_INFO, "Found ROM file header (and ignored it)."); - } - //end of header fix do { @@ -1651,7 +1648,7 @@ bool8 CMemory::LoadROMInt (int32 ROMfillSize) bool8 interleaved, tales = FALSE; - interleaved = Settings.ForceInterleaved || Settings.ForceInterleaved2 || Settings.ForceInterleaveGD24; + interleaved = Settings.ForceInterleaved || Settings.ForceInterleaved2 || Settings.ForceInterleaveGD24; if (Settings.ForceLoROM || (!Settings.ForceHiROM && lo_score >= hi_score)) { @@ -1747,14 +1744,14 @@ bool8 CMemory::LoadROMInt (int32 ROMfillSize) lo_score = ScoreLoROM(FALSE); if ((HiROM && (lo_score >= hi_score || hi_score < 0)) || - (LoROM && (hi_score > lo_score || lo_score < 0))) + (LoROM && (hi_score > lo_score || lo_score < 0))) { S9xMessage(S9X_INFO, S9X_ROM_CONFUSING_FORMAT_INFO, "ROM lied about its type! Trying again."); Settings.ForceNotInterleaved = TRUE; Settings.ForceInterleaved = FALSE; - return (FALSE); + return (FALSE); } - } + } if (ExtendedFormat == SMALLFIRST) tales = TRUE; @@ -1790,70 +1787,70 @@ bool8 CMemory::LoadROMInt (int32 ROMfillSize) S9xReset(); - return (TRUE); + return (TRUE); } bool8 CMemory::LoadMultiCartMem (const uint8 *sourceA, uint32 sourceASize, const uint8 *sourceB, uint32 sourceBSize, const uint8 *bios, uint32 biosSize) { - uint32 offset = 0; - memset(ROM, 0, MAX_ROM_SIZE); + uint32 offset = 0; + memset(ROM, 0, MAX_ROM_SIZE); memset(&Multi, 0, sizeof(Multi)); + + if(bios) { + if(!is_SufamiTurbo_BIOS(bios,biosSize)) + return FALSE; - if(bios) { - if(!is_SufamiTurbo_BIOS(bios,biosSize)) - return FALSE; - - memcpy(ROM,bios,biosSize); - offset+=biosSize; - } + memcpy(ROM,bios,biosSize); + offset+=biosSize; + } - if(sourceA) { - memcpy(ROM + offset,sourceA,sourceASize); - Multi.cartOffsetA = offset; - Multi.cartSizeA = sourceASize; - offset += sourceASize; - strcpy(Multi.fileNameA,"MemCartA"); - } + if(sourceA) { + memcpy(ROM + offset,sourceA,sourceASize); + Multi.cartOffsetA = offset; + Multi.cartSizeA = sourceASize; + offset += sourceASize; + strcpy(Multi.fileNameA,"MemCartA"); + } - if(sourceB) { - memcpy(ROM + offset,sourceB,sourceBSize); - Multi.cartOffsetB = offset; - Multi.cartSizeB = sourceBSize; - offset += sourceBSize; - strcpy(Multi.fileNameB,"MemCartB"); - } + if(sourceB) { + memcpy(ROM + offset,sourceB,sourceBSize); + Multi.cartOffsetB = offset; + Multi.cartSizeB = sourceBSize; + offset += sourceBSize; + strcpy(Multi.fileNameB,"MemCartB"); + } - return LoadMultiCartInt(); + return LoadMultiCartInt(); } bool8 CMemory::LoadMultiCart (const char *cartA, const char *cartB) { - memset(ROM, 0, MAX_ROM_SIZE); + memset(ROM, 0, MAX_ROM_SIZE); memset(&Multi, 0, sizeof(Multi)); Settings.DisplayColor = BUILD_PIXEL(31, 31, 31); SET_UI_COLOR(255, 255, 255); - if (cartB && cartB[0]) + if (cartB && cartB[0]) Multi.cartSizeB = FileLoader(ROM, cartB, MAX_ROM_SIZE); - if (Multi.cartSizeB) { - strcpy(Multi.fileNameB, cartB); + if (Multi.cartSizeB) { + strcpy(Multi.fileNameB, cartB); - Multi.cartOffsetB = 0x400000; - memcpy(ROM + Multi.cartOffsetB,ROM,Multi.cartSizeB); - } + Multi.cartOffsetB = 0x400000; + memcpy(ROM + Multi.cartOffsetB,ROM,Multi.cartSizeB); + } if (cartA && cartA[0]) Multi.cartSizeA = FileLoader(ROM, cartA, MAX_ROM_SIZE); - if (Multi.cartSizeA) { - strcpy(Multi.fileNameA, cartA); - } + if (Multi.cartSizeA) { + strcpy(Multi.fileNameA, cartA); + } - return LoadMultiCartInt(); + return LoadMultiCartInt(); } bool8 CMemory::LoadMultiCartInt () @@ -1865,53 +1862,54 @@ bool8 CMemory::LoadMultiCartInt () if (Multi.cartSizeA) { - if (is_SufamiTurbo_Cart(ROM + Multi.cartOffsetA, Multi.cartSizeA)) + if (is_SufamiTurbo_Cart(ROM + Multi.cartOffsetA, Multi.cartSizeA)) Multi.cartType = 4; else - if (is_SameGame_BIOS(ROM + Multi.cartOffsetA, Multi.cartSizeA)) - Multi.cartType = 3; - else - if (is_GNEXT_BIOS(ROM + Multi.cartOffsetA, Multi.cartSizeA)) + if (is_BSCartSA1_BIOS(ROM + Multi.cartOffsetA, Multi.cartSizeA)) Multi.cartType = 5; + else + if (is_BSCart_BIOS(ROM + Multi.cartOffsetA, Multi.cartSizeA)) + Multi.cartType = 3; } else if (Multi.cartSizeB) { - if (is_SufamiTurbo_Cart(ROM + Multi.cartOffsetB, Multi.cartSizeB)) + if (is_SufamiTurbo_Cart(ROM + Multi.cartOffsetB, Multi.cartSizeB)) Multi.cartType = 4; } else Multi.cartType = 4; // assuming BIOS only + if(log_cb) log_cb(RETRO_LOG_DEBUG,"Multi.cartType = %d\n", Multi.cartType ); - if(Multi.cartType == 4 && Multi.cartOffsetA == 0) { // try to load bios from file - Multi.cartOffsetA = 0x40000; - if(Multi.cartSizeA) - memmove(ROM + Multi.cartOffsetA, ROM, Multi.cartSizeA + Multi.cartSizeB); - else if(Multi.cartOffsetB) // clear cart A so the bios can detect that it's not present - memset(ROM, 0, Multi.cartOffsetB); - - FILE *fp; - size_t size; - char path[PATH_MAX + 1]; - - strcpy(path, S9xGetDirectory(BIOS_DIR)); - strcat(path, SLASH_STR); - strcat(path, "STBIOS.bin"); - - fp = fopen(path, "rb"); - if (fp) - { - size = fread((void *) ROM, 1, 0x40000, fp); - fclose(fp); - if (!is_SufamiTurbo_BIOS(ROM, size)) - return (FALSE); - } - else - return (FALSE); - - strcpy(ROMFilename, path); - } + if(Multi.cartType == 4 && Multi.cartOffsetA == 0) { // try to load bios from file + Multi.cartOffsetA = 0x40000; + if(Multi.cartSizeA) + memmove(ROM + Multi.cartOffsetA, ROM, Multi.cartSizeA + Multi.cartSizeB); + else if(Multi.cartOffsetB) // clear cart A so the bios can detect that it's not present + memset(ROM, 0, Multi.cartOffsetB); + + FILE *fp; + size_t size; + char path[PATH_MAX + 1]; + + strcpy(path, S9xGetDirectory(BIOS_DIR)); + strcat(path, SLASH_STR); + strcat(path, "STBIOS.bin"); + + fp = fopen(path, "rb"); + if (fp) + { + size = fread((void *) ROM, 1, 0x40000, fp); + fclose(fp); + if (!is_SufamiTurbo_BIOS(ROM, size)) + return (FALSE); + } + else + return FALSE; + + strcpy(ROMFilename, path); + } switch (Multi.cartType) { @@ -1920,11 +1918,8 @@ bool8 CMemory::LoadMultiCartInt () break; case 3: - r = LoadSameGame(); - break; - case 5: - r = LoadGNEXT(); + r = LoadBSCart(); break; default: @@ -1937,7 +1932,7 @@ bool8 CMemory::LoadMultiCartInt () return (FALSE); } - if (Multi.cartSizeA) + if (Multi.cartSizeA) strcpy(ROMFilename, Multi.fileNameA); else if (Multi.cartSizeB) @@ -1971,7 +1966,7 @@ bool8 CMemory::LoadSufamiTurbo () if (Multi.cartSizeB) { - if (!is_SufamiTurbo_Cart(ROM + Multi.cartOffsetB, Multi.cartSizeB)) + if (!is_SufamiTurbo_Cart(ROM + Multi.cartOffsetB, Multi.cartSizeB)) Multi.cartSizeB = 0; } @@ -1988,26 +1983,31 @@ bool8 CMemory::LoadSufamiTurbo () return (TRUE); } -bool8 CMemory::LoadSameGame () +bool8 CMemory::LoadBSCart () { Multi.sramA = SRAM; Multi.sramB = NULL; - Multi.sramSizeA = ROM[0xffd8]; + if (LoROM) + Multi.sramSizeA = ROM[0x7fd8]; + else + Multi.sramSizeA = ROM[0xffd8]; + Multi.sramMaskA = Multi.sramSizeA ? ((1 << (Multi.sramSizeA + 3)) * 128 - 1) : 0; Multi.sramSizeB = 0; Multi.sramMaskB = 0; - if (Multi.cartSizeB) + CalculatedSize = Multi.cartSizeA; + + if (Multi.cartSizeB == 0 && Multi.cartSizeA <= (int32)(MAX_ROM_SIZE - 0x100000 - Multi.cartOffsetA)) { - if (!is_SameGame_Add_On(ROM + Multi.cartOffsetB, Multi.cartSizeB)) - Multi.cartSizeB = 0; + //Initialize 1MB Empty Memory Pack only if cart B is cleared + //It does not make a Memory Pack if game is loaded like a normal ROM + Multi.cartOffsetB = Multi.cartOffsetA + CalculatedSize; + Multi.cartSizeB = 0x100000; + memset(Memory.ROM + Multi.cartOffsetB, 0xFF, 0x100000); } - LoROM = FALSE; - HiROM = TRUE; - CalculatedSize = Multi.cartSizeA; - return (TRUE); } @@ -2037,13 +2037,12 @@ bool8 CMemory::LoadGNEXT () bool8 CMemory::LoadSRTC (void) { FILE *fp; - size_t ignore; fp = fopen(S9xGetFilename(".rtc", SRAM_DIR), "rb"); if (!fp) return (FALSE); - ignore = fread(RTCData.reg, 1, 20, fp); + fread(RTCData.reg, 1, 20, fp); fclose(fp); return (TRUE); @@ -2052,13 +2051,12 @@ bool8 CMemory::LoadSRTC (void) bool8 CMemory::SaveSRTC (void) { FILE *fp; - size_t ignore; fp = fopen(S9xGetFilename(".rtc", SRAM_DIR), "wb"); if (!fp) return (FALSE); - ignore = fwrite(RTCData.reg, 1, 20, fp); + fwrite(RTCData.reg, 1, 20, fp); fclose(fp); return (TRUE); @@ -2185,15 +2183,14 @@ bool8 CMemory::SaveSRAM (const char *filename) file = fopen(name, "wb"); if (file) { - size_t ignore; - ignore = fwrite((char *) Multi.sramB, size, 1, file); + fwrite((char *) Multi.sramB, size, 1, file); fclose(file); } strcpy(ROMFilename, temp); - } + } - size = SRAMSize ? (1 << (SRAMSize + 3)) * 128 : 0; + size = SRAMSize ? (1 << (SRAMSize + 3)) * 128 : 0; if (size > 0x20000) size = 0x20000; @@ -2202,8 +2199,7 @@ bool8 CMemory::SaveSRAM (const char *filename) file = fopen(sramName, "wb"); if (file) { - size_t ignore; - ignore = fwrite((char *) SRAM, size, 1, file); + fwrite((char *) SRAM, size, 1, file); fclose(file); if (Settings.SRTC || Settings.SPC7110RTC) @@ -2216,6 +2212,31 @@ bool8 CMemory::SaveSRAM (const char *filename) return (FALSE); } +bool8 CMemory::SaveMPAK (const char *filename) +{ + if (Settings.BS || (Multi.cartSizeB && (Multi.cartType == 3))) + { + FILE *file; + int size; + char mempakName[PATH_MAX + 1]; + + strcpy(mempakName, filename); + size = 0x100000; + if (size) + { + file = fopen(mempakName, "wb"); + if (file) + { + fwrite((char *)Memory.ROM + Multi.cartOffsetB, size, 1, file); + fclose(file); + + return (TRUE); + } + } + } + return (FALSE); +} + // initialization static uint32 caCRC32 (uint8 *array, uint32 size, uint32 crc32) @@ -2473,6 +2494,7 @@ void CMemory::InitROM (void) // SPC7110 case 0xF93A: Settings.SPC7110RTC = TRUE; + // Fall through case 0xF53A: Settings.SPC7110 = TRUE; S9xInitSPC7110(); @@ -2543,18 +2565,18 @@ void CMemory::InitROM (void) } // MSU1 - Settings.MSU1 = MsuRomExists(); + Settings.MSU1 = S9xMSU1ROMExists(); //// Map memory and calculate checksum Map_Initialize(); CalculatedChecksum = 0; - // SRAM size + // libretro: setup sram before memory map SRAMMask = SRAMSize ? ((1 << (SRAMSize + 3)) * 128) - 1 : 0; if (HiROM) - { + { if (Settings.BS) /* Do nothing */; else @@ -2565,12 +2587,12 @@ void CMemory::InitROM (void) Map_ExtendedHiROMMap(); else if (Multi.cartType == 3) - Map_SameGameHiROMMap(); + Map_BSCartHiROMMap(); else Map_HiROMMap(); - } - else - { + } + else + { if (Settings.BS) /* Do nothing */; else @@ -2583,7 +2605,7 @@ void CMemory::InitROM (void) if (Settings.SA1) { if (Multi.cartType == 5) - Map_GNEXTSA1LoROMMap(); + Map_BSSA1LoROMMap(); else Map_SA1LoROMMap(); } @@ -2597,6 +2619,13 @@ void CMemory::InitROM (void) if (strncmp(ROMName, "WANDERERS FROM YS", 17) == 0) Map_NoMAD1LoROMMap(); else + if (Multi.cartType == 3) + if (strncmp(ROMName, "SOUND NOVEL-TCOOL", 17) == 0 || + strncmp(ROMName, "DERBY STALLION 96", 17) == 0) + Map_BSCartLoROMMap(1); + else + Map_BSCartLoROMMap(0); + else if (strncmp(ROMName, "SOUND NOVEL-TCOOL", 17) == 0 || strncmp(ROMName, "DERBY STALLION 96", 17) == 0) Map_ROM24MBSLoROMMap(); @@ -2609,23 +2638,27 @@ void CMemory::InitROM (void) { if (Multi.cartType == 4) { + // libretro: sram size changed SRAMSize = Multi.sramSizeA; + SRAMMask = SRAMSize ? ((1 << (SRAMSize + 3)) * 128) - 1 : 0; Map_SufamiTurboLoROMMap(); } else { + // libretro: sram size changed SRAMSize = 5; + SRAMMask = SRAMSize ? ((1 << (SRAMSize + 3)) * 128) - 1 : 0; Map_SufamiTurboPseudoLoROMMap(); } } else Map_LoROMMap(); - } + } Checksum_Calculate(); bool8 isChecksumOK = (ROMChecksum + ROMComplementChecksum == 0xffff) & - (ROMChecksum == CalculatedChecksum); + (ROMChecksum == CalculatedChecksum); //// Build more ROM information @@ -2637,7 +2670,7 @@ void CMemory::InitROM (void) int offset = HiROM ? 0xffc0 : 0x7fc0; // Backup uint8 BSMagic0 = ROM[offset + 22], - BSMagic1 = ROM[offset + 23]; + BSMagic1 = ROM[offset + 23]; // uCONSRT standard ROM[offset + 22] = 0x42; ROM[offset + 23] = 0x00; @@ -2718,7 +2751,6 @@ void CMemory::InitROM (void) and the NMI handler, time enough for an instruction or two. */ // Wild Guns, Mighty Morphin Power Rangers - The Fighting Edition Timings.NMIDMADelay = 24; - Timings.IRQPendCount = 0; IPPU.TotalEmulatedFrames = 0; @@ -2753,7 +2785,7 @@ void CMemory::InitROM (void) if (PostRomInitFunc) PostRomInitFunc(); - S9xVerifyControllers(); + S9xVerifyControllers(); } // memory map @@ -2794,7 +2826,7 @@ void CMemory::map_lorom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 add if (auto_export_map) { - struct retro_memory_descriptor desc = {0}; + struct retro_memory_descriptor desc = {}; desc.flags=RETRO_MEMDESC_CONST; desc.ptr=ROM; desc.start=bank_s<<16 | addr_s; @@ -2823,7 +2855,7 @@ void CMemory::map_hirom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 add if (auto_export_map) { - struct retro_memory_descriptor desc = {0}; + struct retro_memory_descriptor desc = {}; desc.flags=RETRO_MEMDESC_CONST; desc.ptr=ROM; desc.offset=map_mirror(size, addr_s); @@ -2852,7 +2884,7 @@ void CMemory::map_lorom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uin if (auto_export_map) { - struct retro_memory_descriptor desc = {0}; + struct retro_memory_descriptor desc = {}; desc.flags=RETRO_MEMDESC_CONST; desc.ptr=ROM; desc.offset=offset; @@ -2879,9 +2911,10 @@ void CMemory::map_hirom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uin BlockIsRAM[p] = FALSE; } } + if (auto_export_map) { - struct retro_memory_descriptor desc = {0}; + struct retro_memory_descriptor desc = {}; desc.flags=RETRO_MEMDESC_CONST; desc.ptr=ROM; desc.offset=map_mirror(size, offset + addr_s); @@ -2908,7 +2941,7 @@ void CMemory::map_space (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 add } if (auto_export_map) { - struct retro_memory_descriptor desc = {0}; + struct retro_memory_descriptor desc = {}; desc.ptr=data; desc.start=bank_s<<16 | addr_s; desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; @@ -2930,14 +2963,15 @@ void CMemory::map_index (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 add for (i = addr_s; i <= addr_e; i += 0x1000) { p = (c << 4) | (i >> 12); - Map[p] = (uint8 *) index; + Map[p] = (uint8 *) (pint) index; BlockIsROM[p] = isROM; BlockIsRAM[p] = isRAM; } } + if (auto_export_map) { - struct retro_memory_descriptor desc = {0}; + struct retro_memory_descriptor desc = {}; desc.start=bank_s<<16 | addr_s; desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; if (type==MAP_LOROM_SRAM || type==MAP_SA1RAM) @@ -2990,12 +3024,16 @@ void CMemory::map_WRAM (void) void CMemory::map_LoROMSRAM (void) { - uint32 hi; + uint32 hi; + + // libretro: Deae Tonosama - Appare Ichiban (Japan) copier protection + if( SRAMSize == 0 ) return; + - if (ROMSize > 11 || SRAMSize > 5) - hi = 0x7fff; - else - hi = 0xffff; + if (ROMSize > 11 || SRAMSize > 5) + hi = 0x7fff; + else + hi = 0xffff; map_index(0x70, 0x7d, 0x0000, hi, MAP_LOROM_SRAM, MAP_TYPE_RAM); map_index(0xf0, 0xff, 0x0000, hi, MAP_LOROM_SRAM, MAP_TYPE_RAM); @@ -3358,9 +3396,9 @@ void CMemory::Map_SA1LoROMMap (void) BWRAM = SRAM; } -void CMemory::Map_GNEXTSA1LoROMMap (void) +void CMemory::Map_BSSA1LoROMMap(void) { - if (log_cb) log_cb(RETRO_LOG_INFO, "Map_GNEXTSA1LoROMMap\n"); + if (log_cb) log_cb(RETRO_LOG_INFO, "Map_BSSA1LoROMMap\n"); map_System(); map_lorom_offset(0x00, 0x3f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); @@ -3376,9 +3414,6 @@ void CMemory::Map_GNEXTSA1LoROMMap (void) for (int c = 0x40; c < 0x80; c++) map_space(c, c, 0x0000, 0xffff, SRAM + (c & 1) * 0x10000); - // FIXME: untested! - map_hirom_offset(0x70, 0x7f, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); - map_WRAM(); map_WriteProtectROM(); @@ -3438,26 +3473,6 @@ void CMemory::Map_ExtendedHiROMMap (void) map_WriteProtectROM(); } -void CMemory::Map_SameGameHiROMMap (void) -{ - if (log_cb) log_cb(RETRO_LOG_INFO, "Map_SameGameHiROMMap\n"); - map_System(); - - map_hirom_offset(0x00, 0x1f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); - map_hirom_offset(0x20, 0x3f, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); - map_hirom_offset(0x40, 0x5f, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); - map_hirom_offset(0x60, 0x7f, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); - map_hirom_offset(0x80, 0x9f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); - map_hirom_offset(0xa0, 0xbf, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); - map_hirom_offset(0xc0, 0xdf, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); - map_hirom_offset(0xe0, 0xff, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); - - map_HiROMSRAM(); - map_WRAM(); - - map_WriteProtectROM(); -} - void CMemory::Map_SPC7110HiROMMap (void) { if (log_cb) log_cb(RETRO_LOG_INFO, "Map_SPC7110HiROMMap\n"); @@ -3466,7 +3481,8 @@ void CMemory::Map_SPC7110HiROMMap (void) map_index(0x00, 0x00, 0x6000, 0x7fff, MAP_HIROM_SRAM, MAP_TYPE_RAM); map_hirom(0x00, 0x0f, 0x8000, 0xffff, CalculatedSize); map_index(0x30, 0x30, 0x6000, 0x7fff, MAP_HIROM_SRAM, MAP_TYPE_RAM); - map_hirom_offset(0x40, 0x4f, 0x0000, 0xffff, CalculatedSize, 0x600000); + if(Memory.ROMSize >= 13) + map_hirom_offset(0x40, 0x4f, 0x0000, 0xffff, CalculatedSize, 0x600000); map_index(0x50, 0x50, 0x0000, 0xffff, MAP_SPC7110_DRAM, MAP_TYPE_ROM); map_hirom(0x80, 0x8f, 0x8000, 0xffff, CalculatedSize); map_hirom_offset(0xc0, 0xcf, 0x0000, 0xffff, CalculatedSize, 0); @@ -3477,6 +3493,71 @@ void CMemory::Map_SPC7110HiROMMap (void) map_WriteProtectROM(); } +void CMemory::Map_BSCartLoROMMap(uint8 mapping) +{ + if (log_cb) log_cb(RETRO_LOG_INFO, "Map_BSCartLoROMMap\n"); + + BSX.MMC[0x02] = 0x00; + BSX.MMC[0x0C] = 0x80; + + map_System(); + + if (mapping) + { + map_lorom_offset(0x00, 0x1f, 0x8000, 0xffff, 0x100000, 0); + map_lorom_offset(0x20, 0x3f, 0x8000, 0xffff, 0x100000, 0x100000); + map_lorom_offset(0x80, 0x9f, 0x8000, 0xffff, 0x100000, 0x200000); + map_lorom_offset(0xa0, 0xbf, 0x8000, 0xffff, 0x100000, 0x100000); + } + else + { + map_lorom(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize); + map_lorom(0x40, 0x7f, 0x0000, 0x7fff, CalculatedSize); + map_lorom(0x80, 0xbf, 0x8000, 0xffff, CalculatedSize); + map_lorom(0xc0, 0xff, 0x0000, 0x7fff, CalculatedSize); + } + + map_LoROMSRAM(); + map_index(0xc0, 0xef, 0x0000, 0xffff, MAP_BSX, MAP_TYPE_RAM); + map_WRAM(); + + map_WriteProtectROM(); +} + +void CMemory::Map_BSCartHiROMMap(void) +{ + if (log_cb) log_cb(RETRO_LOG_INFO, "Map_BSCartHiROMMap\n"); + + BSX.MMC[0x02] = 0x80; + BSX.MMC[0x0C] = 0x80; + + map_System(); + map_hirom_offset(0x00, 0x1f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_hirom_offset(0x20, 0x3f, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + map_hirom_offset(0x40, 0x5f, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_hirom_offset(0x60, 0x7f, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + map_hirom_offset(0x80, 0x9f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + map_hirom_offset(0xa0, 0xbf, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + map_hirom_offset(0xc0, 0xdf, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); + + if ((ROM[Multi.cartOffsetB + 0xFF00] == 0x4D) + && (ROM[Multi.cartOffsetB + 0xFF02] == 0x50) + && ((ROM[Multi.cartOffsetB + 0xFF06] & 0xF0) == 0x70)) + { + //Type 7 Memory Pack detection - if detected, emulate it as Mask ROM + map_hirom_offset(0xe0, 0xff, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); + } + else + { + map_index(0xe0, 0xff, 0x0000, 0xffff, MAP_BSX, MAP_TYPE_RAM); + } + + map_HiROMSRAM(); + map_WRAM(); + + map_WriteProtectROM(); +} + // checksum uint16 CMemory::checksum_calc_sum (uint8 *data, uint32 length) @@ -3766,8 +3847,8 @@ void CMemory::ApplyROMFixes (void) if (!Settings.DisableGameSpecificHacks) { - if (match_id("AVCJ")) // Rendering Ranger R2 - Timings.APUSpeedup = 2; + //if (match_id("AVCJ")) // Rendering Ranger R2 + // Timings.APUSpeedup = 2; if (match_id("AANJ")) // Chou Aniki Timings.APUSpeedup = 1; if (match_na("CIRCUIT USA")) @@ -3838,25 +3919,28 @@ void CMemory::ApplyROMFixes (void) if (!Settings.DisableGameSpecificHacks) { - // An infinite loop reads $4212 and waits V-blank end, whereas VIRQ is set V=0. - // If Snes9x succeeds to escape from the loop before jumping into the IRQ handler, the game goes further. - // If Snes9x jumps into the IRQ handler before escaping from the loop, - // Snes9x cannot escape from the loop permanently because the RTI is in the next V-blank. - if (match_na("Aero the AcroBat 2")) + // libretro: smp transfer loop problem + if (match_na("LITTLE MAGIC") || + match_nc("Little Magic (Europe)") || + match_nc("Little Magic (Japan)")) { - Timings.IRQPendCount = 2; - if (log_cb) log_cb(RETRO_LOG_INFO, "IRQ count hack: %d\n", Timings.IRQPendCount); + unsigned char patch[] = {0x7e,0xf4,0xb0,0xed,0x7e,0xf4,0xb0,0xe9}; + if(memcmp(patch,Memory.ROM+0xf9b0,sizeof(patch))==0) + { + // spc700: bcs => bpl + Memory.ROM[0xf9b2]=0x10; + Memory.ROM[0xf9b6]=0x10; + } } } if (!Settings.DisableGameSpecificHacks) { - // XXX: What's happening? - if (match_na("X-MEN")) // Spider-Man and the X-Men - { - Settings.BlockInvalidVRAMAccess = FALSE; - if (log_cb) log_cb(RETRO_LOG_INFO, "Invalid VRAM access hack\n"); - } + dma_kludge = 0; + + // libretro: possible timing problem + if (match_na("K A T ' S R U N")) + dma_kludge = 1; } //// SRAM initial value diff --git a/memmap.h b/memmap.h index 534a7028c6383a2336be93671ac826e1d1ac4f5b..27c3d5d028dbd8b0b6e407dc734faac660840f44 100644 --- a/memmap.h +++ b/memmap.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles @@ -287,6 +287,7 @@ struct CMemory int ScoreLoROM (bool8, int32 romoff = 0); uint32 HeaderRemove (uint32, uint8 *); uint32 FileLoader (uint8 *, const char *, uint32); + uint32 MemLoader (uint8 *, const char*, uint32); bool8 LoadROMMem (const uint8 *, uint32); bool8 LoadROM (const char *); bool8 LoadROMInt (int32); @@ -294,13 +295,14 @@ struct CMemory bool8 LoadMultiCart (const char *, const char *); bool8 LoadMultiCartInt (); bool8 LoadSufamiTurbo (); - bool8 LoadSameGame (); + bool8 LoadBSCart (); bool8 LoadGNEXT (); bool8 LoadSRAM (const char *); bool8 SaveSRAM (const char *); void ClearSRAM (bool8 onlyNonSavedSRAM = 0); bool8 LoadSRTC (void); bool8 SaveSRTC (void); + bool8 SaveMPAK (const char *); char * Safe (const char *); char * SafeANK (const char *); @@ -336,11 +338,12 @@ struct CMemory void Map_SetaDSPLoROMMap (void); void Map_SDD1LoROMMap (void); void Map_SA1LoROMMap (void); - void Map_GNEXTSA1LoROMMap (void); + void Map_BSSA1LoROMMap (void); void Map_HiROMMap (void); void Map_ExtendedHiROMMap (void); - void Map_SameGameHiROMMap (void); void Map_SPC7110HiROMMap (void); + void Map_BSCartLoROMMap(uint8); + void Map_BSCartHiROMMap(void); uint16 checksum_calc_sum (uint8 *, uint32); uint16 checksum_mirror_sum (uint8 *, uint32 &, uint32 mask = 0x800000); diff --git a/messages.h b/messages.h index bb59aa881e43697dc0e0a44e19eb8a47d429dab5..168ec5244abc424b3580fafb1003fe40988796d3 100644 --- a/messages.h +++ b/messages.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/missing.h b/missing.h index c19690bcd07e4624dde280c222b9c4d2d7c20317..8c2dd11a88fc65f89278624c4782aea13866592e 100644 --- a/missing.h +++ b/missing.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/msu1.cpp b/msu1.cpp index 277d230d5d9ccf237ca6fdc9936e330dd573dc8f..05a51929076da39ae458c577cb22ce134624036e 100644 --- a/msu1.cpp +++ b/msu1.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles @@ -206,7 +206,7 @@ extern retro_log_printf_t log_cb; STREAM dataStream = NULL; STREAM audioStream = NULL; uint32 audioLoopPos; -size_t partial_samples; +size_t partial_frames; // Sample buffer int16 *bufPos, *bufBegin, *bufEnd; @@ -324,6 +324,8 @@ static bool AudioOpen() audioLoopPos <<= 2; audioLoopPos += 8; + MSU1.MSU1_AUDIO_POS = 8; + MSU1.MSU1_STATUS &= ~AudioError; return true; } @@ -370,7 +372,7 @@ void S9xResetMSU(void) bufBegin = 0; bufEnd = 0; - partial_samples = 0; + partial_frames = 0; DataClose(); @@ -420,40 +422,40 @@ bool S9xMSU1ROMExists(void) void S9xMSU1Generate(size_t sample_count) { - partial_samples += 4410 * sample_count; + partial_frames += 4410 * (sample_count / 2); - while (((uintptr_t)bufPos < (uintptr_t)bufEnd) && partial_samples > 3204) + while ((bufPos < (bufEnd - 2)) && partial_frames >= 3204) { if (MSU1.MSU1_STATUS & AudioPlaying && audioStream) { - int16 sample; - int bytes_read = READ_STREAM((char *)&sample, 2, audioStream); - if (bytes_read == 2) + int32 sample; + int16* left = (int16*)&sample; + int16* right = left + 1; + + int bytes_read = READ_STREAM((char *)&sample, 4, audioStream); + if (bytes_read == 4) { - sample = (int16)((double)(int16)GET_LE16(&sample) * (double)MSU1.MSU1_VOLUME / 255.0); + *left = ((int32)(int16)GET_LE16(left) * MSU1.MSU1_VOLUME / 255); + *right = ((int32)(int16)GET_LE16(right) * MSU1.MSU1_VOLUME / 255); + - *(bufPos++) = sample; - MSU1.MSU1_AUDIO_POS += 2; - partial_samples -= 3204; + *(bufPos++) = *left; + *(bufPos++) = *right; + MSU1.MSU1_AUDIO_POS += 4; + partial_frames -= 3204; } else if (bytes_read >= 0) { - sample = (int16)((double)(int16)GET_LE16(&sample) * (double)MSU1.MSU1_VOLUME / 255.0); - - *(bufPos++) = sample; - MSU1.MSU1_AUDIO_POS += 2; - partial_samples -= 3204; - if (MSU1.MSU1_STATUS & AudioRepeating) { MSU1.MSU1_AUDIO_POS = audioLoopPos; - REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); + REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); - REVERT_STREAM(audioStream, 8, 0); + REVERT_STREAM(audioStream, 8, 0); } } else @@ -464,7 +466,8 @@ void S9xMSU1Generate(size_t sample_count) else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); - partial_samples -= 3204; + partial_frames -= 3204; + *(bufPos++) = 0; *(bufPos++) = 0; } } @@ -621,6 +624,5 @@ void S9xMSU1PostLoadState(void) bufBegin = 0; bufEnd = 0; - partial_samples = 0; + partial_frames = 0; } - diff --git a/msu1.h b/msu1.h index b5e9a65bc2dc15c01c317c0aa0f9453e8ed52afa..853761399640f8efff537b430adb48231c436360 100644 --- a/msu1.h +++ b/msu1.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/netplay.cpp b/netplay.cpp index d575ca8241fea4f7e3db916d120de2f8f5772cdd..e56248419a3f260420650927087ac949dd56fa97 100644 --- a/netplay.cpp +++ b/netplay.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/netplay.h b/netplay.h index 9464a68a3f902a407b71a25d3ac1f7e054e60c4f..d8e8145451f4ccc5763da4d30e162d8c62fa9920 100644 --- a/netplay.h +++ b/netplay.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/obc1.cpp b/obc1.cpp index 7a37871c80d2bab4f33d1727e9552f63a99fb6f9..803f6a1c1ae96a3bc73389e82fcccef99703f2bf 100644 --- a/obc1.cpp +++ b/obc1.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/obc1.h b/obc1.h index b1425a3b2b9800b08df12308b3468a22851aa06d..a8de868f51b2789ce255de258424bbf5f8edddaa 100644 --- a/obc1.h +++ b/obc1.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/pixform.h b/pixform.h index 52a911d9caad0f1d51582c016f9413a6cf1349b9..51b143ef21cab9e0dff7ed90b6d45c16a9bbbca3 100644 --- a/pixform.h +++ b/pixform.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/port.h b/port.h index 29599d8f17f70c87070fb4b06f11031c8a4c5dca..a5b47aa2d8454d694bafc791c89b38ee0897ac47 100644 --- a/port.h +++ b/port.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/ppu.cpp b/ppu.cpp index 2a473ad858dad5b4a5c30ee459ca95fe5fdddaa3..bf8051bd1fa36cbad84fff1950dd9b1592ea8954 100644 --- a/ppu.cpp +++ b/ppu.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles @@ -268,31 +268,105 @@ static inline void S9xTryGunLatch (bool force) } } -void S9xUpdateHVTimerPosition (void) +static int CyclesUntilNext (int hc, int vc) { - PPU.HTimerPosition = PPU.IRQHBeamPos * ONE_DOT_CYCLE + Timings.IRQTriggerCycles; - if (Timings.H_Max == Timings.H_Max_Master) // 1364 + int32 total = 0; + int vpos = CPU.V_Counter; + + if (vc - vpos > 0) + { + // It's still in this frame */ + // Add number of lines + total += (vc - vpos) * Timings.H_Max_Master; + // If line 240 is in there and we're odd, subtract a dot + if (vpos <= 240 && vc > 240 && Timings.InterlaceField & !IPPU.Interlace) + total -= ONE_DOT_CYCLE; + } + else { - if (PPU.IRQHBeamPos > 322) - PPU.HTimerPosition += (ONE_DOT_CYCLE / 2); - if (PPU.IRQHBeamPos > 326) - PPU.HTimerPosition += (ONE_DOT_CYCLE / 2); + if (vc == vpos && (hc > CPU.Cycles)) + { + return hc; + } + + total += (Timings.V_Max - vpos) * Timings.H_Max_Master; + if (vpos <= 240 && Timings.InterlaceField && !IPPU.Interlace) + total -= ONE_DOT_CYCLE; + + total += (vc) * Timings.H_Max_Master; + if (vc > 240 && !Timings.InterlaceField && !IPPU.Interlace) + total -= ONE_DOT_CYCLE; } + total += hc; + + return total; +} + +void S9xUpdateIRQPositions (bool initial) +{ + PPU.HTimerPosition = PPU.IRQHBeamPos * ONE_DOT_CYCLE + Timings.IRQTriggerCycles; + PPU.HTimerPosition -= PPU.IRQHBeamPos ? 0 : ONE_DOT_CYCLE; + PPU.HTimerPosition += PPU.IRQHBeamPos > 322 ? (ONE_DOT_CYCLE / 2) : 0; + PPU.HTimerPosition += PPU.IRQHBeamPos > 326 ? (ONE_DOT_CYCLE / 2) : 0; PPU.VTimerPosition = PPU.IRQVBeamPos; - if ((PPU.HTimerPosition >= Timings.H_Max) && (PPU.IRQHBeamPos < 340)) + if (PPU.VTimerEnabled && (PPU.VTimerPosition >= (Timings.V_Max + (IPPU.Interlace ? 1 : 0)))) + { + Timings.NextIRQTimer = 0x0fffffff; + } + else if (!PPU.HTimerEnabled && !PPU.VTimerEnabled) + { + Timings.NextIRQTimer = 0x0fffffff; + } + else if (PPU.HTimerEnabled && !PPU.VTimerEnabled) + { + int v_pos = CPU.V_Counter; + + Timings.NextIRQTimer = PPU.HTimerPosition; + if (CPU.Cycles > Timings.NextIRQTimer - Timings.IRQTriggerCycles) + { + Timings.NextIRQTimer += Timings.H_Max; + v_pos++; + } + + // Check for short dot scanline + if (v_pos == 240 && Timings.InterlaceField && !IPPU.Interlace) + { + Timings.NextIRQTimer -= PPU.IRQHBeamPos <= 322 ? ONE_DOT_CYCLE / 2 : 0; + Timings.NextIRQTimer -= PPU.IRQHBeamPos <= 326 ? ONE_DOT_CYCLE / 2 : 0; + } + } + else if (!PPU.HTimerEnabled && PPU.VTimerEnabled) { - PPU.HTimerPosition -= Timings.H_Max; - PPU.VTimerPosition++; - // FIXME - if (PPU.VTimerPosition >= Timings.V_Max) - PPU.VTimerPosition = 0; + if (CPU.V_Counter == PPU.VTimerPosition && initial) + Timings.NextIRQTimer = CPU.Cycles + Timings.IRQTriggerCycles; + else + Timings.NextIRQTimer = CyclesUntilNext (Timings.IRQTriggerCycles, PPU.VTimerPosition); + } + else + { + Timings.NextIRQTimer = CyclesUntilNext (PPU.HTimerPosition, PPU.VTimerPosition); + + // Check for short dot scanline + int field = Timings.InterlaceField; + + if (PPU.VTimerPosition < CPU.V_Counter || + (PPU.VTimerPosition == CPU.V_Counter && Timings.NextIRQTimer > Timings.H_Max)) + { + field = !field; + } + + if (PPU.VTimerPosition == 240 && field && !IPPU.Interlace) + { + Timings.NextIRQTimer -= PPU.IRQHBeamPos <= 322 ? ONE_DOT_CYCLE / 2 : 0; + Timings.NextIRQTimer -= PPU.IRQHBeamPos <= 326 ? ONE_DOT_CYCLE / 2 : 0; + } } #ifdef DEBUGGER - S9xTraceFormattedMessage("--- IRQ Timer set HTimer:%d Pos:%04d VTimer:%d Pos:%03d", - PPU.HTimerEnabled, PPU.HTimerPosition, PPU.VTimerEnabled, PPU.VTimerPosition); + S9xTraceFormattedMessage("--- IRQ Timer HC:%d VC:%d set %d cycles HTimer:%d Pos:%04d->%04d VTimer:%d Pos:%03d->%03d", CPU.Cycles, CPU.V_Counter, + Timings.NextIRQTimer, PPU.HTimerEnabled, PPU.IRQHBeamPos, PPU.HTimerPosition, PPU.VTimerEnabled, PPU.IRQVBeamPos, PPU.VTimerPosition); #endif } @@ -364,9 +438,9 @@ void S9xSetPPU (uint8 Byte, uint16 Address) if (PPU.Brightness != (Byte & 0xf)) { IPPU.ColorsChanged = TRUE; - IPPU.DirectColourMapsNeedRebuild = TRUE; PPU.Brightness = Byte & 0xf; S9xFixColourBrightness(); + S9xBuildDirectColourMaps(); if (PPU.Brightness > IPPU.MaxBrightness) IPPU.MaxBrightness = PPU.Brightness; } @@ -1094,7 +1168,6 @@ void S9xSetPPU (uint8 Byte, uint16 Address) } Memory.FillRAM[Address] = Byte; - OpenBus = Byte; } uint8 S9xGetPPU (uint16 Address) @@ -1104,7 +1177,7 @@ uint8 S9xGetPPU (uint16 Address) return (S9xMSU1ReadPort(Address & 7)); else if (Address < 0x2100) - return (PPU.OpenBus1); + return (OpenBus); if (CPU.InDMAorHDMA) { @@ -1340,7 +1413,7 @@ uint8 S9xGetPPU (uint16 Address) else if (Settings.BS && Address >= 0x2188 && Address <= 0x219f) return (S9xGetBSXPPU(Address)); - else + else if (Settings.SRTC && Address == 0x2800) return (S9xGetSRTC(Address)); else @@ -1349,12 +1422,12 @@ uint8 S9xGetPPU (uint16 Address) case 0x21c2: if (Model->_5C77 == 2) return (0x20); - return (PPU.OpenBus2); + return (OpenBus); case 0x21c3: if (Model->_5C77 == 2) return (0); - return (PPU.OpenBus2); + return (OpenBus); default: return (OpenBus); @@ -1476,13 +1549,22 @@ void S9xSetCPU (uint8 Byte, uint16 Address) switch (Address) { case 0x4200: // NMITIMEN + #ifdef DEBUGGER + if (Settings.TraceHCEvent) + S9xTraceFormattedMessage("Write to 0x4200. Byte is %2x was %2x\n", Byte, Memory.FillRAM[Address]); + #endif + + if (Byte == Memory.FillRAM[0x4200]) + break; + if (Byte & 0x20) { PPU.VTimerEnabled = TRUE; - #ifdef DEBUGGER + + #ifdef DEBUGGER missing.virq = 1; missing.virq_pos = PPU.IRQVBeamPos; - #endif + #endif } else PPU.VTimerEnabled = FALSE; @@ -1490,23 +1572,23 @@ void S9xSetCPU (uint8 Byte, uint16 Address) if (Byte & 0x10) { PPU.HTimerEnabled = TRUE; - #ifdef DEBUGGER + + #ifdef DEBUGGER missing.hirq = 1; missing.hirq_pos = PPU.IRQHBeamPos; - #endif + #endif } else PPU.HTimerEnabled = FALSE; - if (CPU.IRQLine && !PPU.HTimerEnabled && PPU.VTimerEnabled) - CPU.IRQTransition = TRUE; - - if (!PPU.HTimerEnabled && !PPU.VTimerEnabled) + if (!(Byte & 0x10) && !(Byte & 0x20)) { CPU.IRQLine = FALSE; CPU.IRQTransition = FALSE; } + S9xUpdateIRQPositions(true); + // NMI can trigger immediately during VBlank as long as NMI_read ($4210) wasn't cleard. if ((Byte & 0x80) && !(Memory.FillRAM[0x4200] & 0x80) && (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) && (Memory.FillRAM[0x4210] & 0x80)) @@ -1515,12 +1597,17 @@ void S9xSetCPU (uint8 Byte, uint16 Address) // then, when to call S9xOpcode_NMI()? CPU.NMIPending = TRUE; Timings.NMITriggerPos = CPU.Cycles + 6 + 6; + + #ifdef DEBUGGER + if (Settings.TraceHCEvent) + S9xTraceFormattedMessage("NMI Triggered on low-to-high occurring at next HC=%d\n", Timings.NMITriggerPos); + #endif } - #ifdef DEBUGGER - S9xTraceFormattedMessage("--- IRQ Timer Enable HTimer:%d Pos:%04d VTimer:%d Pos:%03d", - PPU.HTimerEnabled, PPU.HTimerPosition, PPU.VTimerEnabled, PPU.VTimerPosition); - #endif + #ifdef DEBUGGER + S9xTraceFormattedMessage("--- IRQ Timer Enable HTimer:%d Pos:%04d VTimer:%d Pos:%03d", + PPU.HTimerEnabled, PPU.HTimerPosition, PPU.VTimerEnabled, PPU.VTimerPosition); + #endif break; @@ -1565,7 +1652,7 @@ void S9xSetCPU (uint8 Byte, uint16 Address) pos = PPU.IRQHBeamPos; PPU.IRQHBeamPos = (PPU.IRQHBeamPos & 0xff00) | Byte; if (PPU.IRQHBeamPos != pos) - S9xUpdateHVTimerPosition(); + S9xUpdateIRQPositions(false); #ifdef DEBUGGER missing.hirq_pos = PPU.IRQHBeamPos; #endif @@ -1575,7 +1662,7 @@ void S9xSetCPU (uint8 Byte, uint16 Address) pos = PPU.IRQHBeamPos; PPU.IRQHBeamPos = (PPU.IRQHBeamPos & 0xff) | ((Byte & 1) << 8); if (PPU.IRQHBeamPos != pos) - S9xUpdateHVTimerPosition(); + S9xUpdateIRQPositions(false); #ifdef DEBUGGER missing.hirq_pos = PPU.IRQHBeamPos; #endif @@ -1585,7 +1672,7 @@ void S9xSetCPU (uint8 Byte, uint16 Address) pos = PPU.IRQVBeamPos; PPU.IRQVBeamPos = (PPU.IRQVBeamPos & 0xff00) | Byte; if (PPU.IRQVBeamPos != pos) - S9xUpdateHVTimerPosition(); + S9xUpdateIRQPositions(true); #ifdef DEBUGGER missing.virq_pos = PPU.IRQVBeamPos; #endif @@ -1595,7 +1682,7 @@ void S9xSetCPU (uint8 Byte, uint16 Address) pos = PPU.IRQVBeamPos; PPU.IRQVBeamPos = (PPU.IRQVBeamPos & 0xff) | ((Byte & 1) << 8); if (PPU.IRQVBeamPos != pos) - S9xUpdateHVTimerPosition(); + S9xUpdateIRQPositions(true); #ifdef DEBUGGER missing.virq_pos = PPU.IRQVBeamPos; #endif @@ -1606,9 +1693,7 @@ void S9xSetCPU (uint8 Byte, uint16 Address) return; // XXX: Not quite right... if (Byte) { - CPU.PrevCycles = CPU.Cycles; - CPU.Cycles += Timings.DMACPUSync; - S9xCheckInterrupts(); + CPU.Cycles += Timings.DMACPUSync; } if (Byte & 0x01) S9xDoDMA(0); @@ -1773,9 +1858,14 @@ uint8 S9xGetCPU (uint16 Address) return ((byte & 0x80) | (OpenBus & 0x70) | Model->_5A22); case 0x4211: // TIMEUP - byte = CPU.IRQLine ? 0x80 : 0; - CPU.IRQLine = FALSE; - CPU.IRQTransition = FALSE; + byte = 0; + if (CPU.IRQLine) + { + byte = 0x80; + CPU.IRQLine = FALSE; + CPU.IRQTransition = FALSE; + } + return (byte | (OpenBus & 0x7f)); case 0x4212: // HVBJOY @@ -1824,7 +1914,6 @@ void S9xResetPPUFast (void) PPU.RecomputeClipWindows = TRUE; IPPU.ColorsChanged = TRUE; IPPU.OBJChanged = TRUE; - IPPU.DirectColourMapsNeedRebuild = TRUE; memset(IPPU.TileCached[TILE_2BIT], 0, MAX_2BIT_TILES); memset(IPPU.TileCached[TILE_4BIT], 0, MAX_4BIT_TILES); memset(IPPU.TileCached[TILE_8BIT], 0, MAX_8BIT_TILES); @@ -1832,6 +1921,7 @@ void S9xResetPPUFast (void) memset(IPPU.TileCached[TILE_2BIT_ODD], 0, MAX_2BIT_TILES); memset(IPPU.TileCached[TILE_4BIT_EVEN], 0, MAX_4BIT_TILES); memset(IPPU.TileCached[TILE_4BIT_ODD], 0, MAX_4BIT_TILES); + S9xBuildDirectColourMaps(); } void S9xSoftResetPPU (void) @@ -1933,7 +2023,7 @@ void S9xSoftResetPPU (void) PPU.BGMosaic[1] = FALSE; PPU.BGMosaic[2] = FALSE; PPU.BGMosaic[3] = FALSE; - + PPU.Window1Left = 1; PPU.Window1Right = 0; PPU.Window2Left = 1; @@ -1971,7 +2061,6 @@ void S9xSoftResetPPU (void) memset(&IPPU.Clip[c], 0, sizeof(struct ClipData)); IPPU.ColorsChanged = TRUE; IPPU.OBJChanged = TRUE; - IPPU.DirectColourMapsNeedRebuild = TRUE; memset(IPPU.TileCached[TILE_2BIT], 0, MAX_2BIT_TILES); memset(IPPU.TileCached[TILE_4BIT], 0, MAX_4BIT_TILES); memset(IPPU.TileCached[TILE_8BIT], 0, MAX_8BIT_TILES); @@ -1980,6 +2069,7 @@ void S9xSoftResetPPU (void) memset(IPPU.TileCached[TILE_4BIT_EVEN], 0, MAX_4BIT_TILES); memset(IPPU.TileCached[TILE_4BIT_ODD], 0, MAX_4BIT_TILES); IPPU.VRAMReadBuffer = 0; // XXX: FIXME: anything better? + GFX.InterlaceFrame = 0; IPPU.Interlace = FALSE; IPPU.InterlaceOBJ = FALSE; IPPU.DoubleWidthPixels = FALSE; @@ -2000,6 +2090,7 @@ void S9xSoftResetPPU (void) IPPU.FrameSkip = 0; S9xFixColourBrightness(); + S9xBuildDirectColourMaps(); for (int c = 0; c < 0x8000; c += 0x100) memset(&Memory.FillRAM[c], c >> 8, 0x100); diff --git a/ppu.h b/ppu.h index 0c40a063c193670c1b8e6cc68c8835c1df673cfb..ffe5cae72c348ad2b04d1a51322663753157ff08 100644 --- a/ppu.h +++ b/ppu.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles @@ -225,7 +225,6 @@ struct InternalPPU struct ClipData Clip[2][6]; bool8 ColorsChanged; bool8 OBJChanged; - bool8 DirectColourMapsNeedRebuild; uint8 *TileCache[7]; uint8 *TileCached[7]; uint16 VRAMReadBuffer; @@ -391,7 +390,7 @@ void S9xSetPPU (uint8, uint16); uint8 S9xGetPPU (uint16); void S9xSetCPU (uint8, uint16); uint8 S9xGetCPU (uint16); -void S9xUpdateHVTimerPosition (void); +void S9xUpdateIRQPositions (bool initial); void S9xFixColourBrightness (void); void S9xDoAutoJoypad (void); @@ -640,10 +639,10 @@ static inline void REGISTER_2118_linear (uint8 Byte) } #endif + static inline void REGISTER_2119 (uint8 Byte) { CHECK_INBLANK(); - uint32 address; if (PPU.VMA.FullGraphicCount) diff --git a/sa1.cpp b/sa1.cpp index 29c9dad8b8377aaab79a6df3ae4a34e2e7e14362..961169c0b587654bad8633027fcef8ca8c27917b 100644 --- a/sa1.cpp +++ b/sa1.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles @@ -315,7 +315,16 @@ static void S9xSetSA1MemMap (uint32 which1, uint8 map) for (int c = 0; c < 0x100; c += 16) { - uint8 *block = &Memory.ROM[(map & 7) * 0x100000 + (c << 12)]; + uint8 *block; + if (Multi.cartType != 5) + block = &Memory.ROM[(map & 7) * 0x100000 + (c << 12)]; + else + { + if ((map & 7) < 4) + block = Memory.ROM + Multi.cartOffsetA + ((map & 7) * 0x100000 + (c << 12)); + else + block = Memory.ROM + Multi.cartOffsetB + (((map & 7) - 4) * 0x100000 + (c << 12)); + } for (int i = c; i < c + 16; i++) Memory.Map[start + i] = SA1.Map[start + i] = block; } @@ -323,8 +332,26 @@ static void S9xSetSA1MemMap (uint32 which1, uint8 map) for (int c = 0; c < 0x200; c += 16) { // conversion to int is needed here - map is promoted but which1 is not - int32 offset = (((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000; - uint8 *block = &Memory.ROM[offset]; + int32 offset; + uint8 *block; + if (Multi.cartType != 5) + { + offset = (((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000; + block = &Memory.ROM[offset]; + } + else + { + if ((map & 7) < 4) + { + offset = (((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000; + block = Memory.ROM + Multi.cartOffsetA + offset; + } + else + { + offset = (((map & 0x80) ? (map - 4) : which1) & 7) * 0x100000 + (c << 11) - 0x8000; + block = Memory.ROM + Multi.cartOffsetB + offset; + } + } for (int i = c + 8; i < c + 16; i++) Memory.Map[start2 + i] = SA1.Map[start2 + i] = block; } diff --git a/sa1.h b/sa1.h index 58461aa611458bc189558f4a2ce2e96cd7350ef4..8241d815875774a8949723aed999c2b4d79ee792 100644 --- a/sa1.h +++ b/sa1.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/sa1cpu.cpp b/sa1cpu.cpp index adaa58a260075a7fcaf7acd0a77f9956031ee951..a83c77b34a5bb01c4b94abfc53d9ab31e63b50ad 100644 --- a/sa1cpu.cpp +++ b/sa1cpu.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/sar.h b/sar.h index 11d87d115a29a4fb92801152dfc317345dec7fc8..9bc6555eea098a911e5a3a7e10638373f64c8c40 100644 --- a/sar.h +++ b/sar.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/screenshot.cpp b/screenshot.cpp index 5011e9640f85d6f7c99fe97bb8f2d4f5613ec795..8410944fa997f3eeeeee125a21e2d61996d54226 100644 --- a/screenshot.cpp +++ b/screenshot.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2016 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -138,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2016 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -146,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2016 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/screenshot.h b/screenshot.h index 5e9a0ea8a5377a45aaa2243ead387fafd30469bf..1cb6efca727930a56f2f89ac684b7d26e88a1244 100644 --- a/screenshot.h +++ b/screenshot.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2016 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -138,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2016 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -146,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2016 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/sdd1.cpp b/sdd1.cpp index 391d76a1249dd89d3602630835a63cc6fac80f74..f56b4b117937221584c4a2516e512b3cfb2ac693 100644 --- a/sdd1.cpp +++ b/sdd1.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/sdd1.h b/sdd1.h index f49dec3d571bf9eea6e7f21b9aff0c3fcb875795..244704f4fd13f27032e848f3e53381a46edcd222 100644 --- a/sdd1.h +++ b/sdd1.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/sdd1emu.cpp b/sdd1emu.cpp index 5f7a0665b4f11c354ba1c94873b19843df13609d..00e0c79c19c8dd9b370eb5eeb768fbedd2de1746 100644 --- a/sdd1emu.cpp +++ b/sdd1emu.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/sdd1emu.h b/sdd1emu.h index 789e327414bb65f54b22bcd1eefd77d09bac9543..a53c9b99cba3688886b012566fb4c6f21d9cd0c3 100644 --- a/sdd1emu.h +++ b/sdd1emu.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/server.cpp b/server.cpp index 524b1d4dadb52a1f5626cbc23f76b07ab8c5b09e..5fc60e11c036de6d914c0eedaaa58d5029cf41bd 100644 --- a/server.cpp +++ b/server.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -355,7 +360,6 @@ static bool8 S9xNPSGetData (int socket, uint8 *data, int length) static bool8 S9xNPSSendData (int fd, const uint8 *data, int length) { - int Percent = 0; int len = length; int chunk = length / 50; @@ -399,8 +403,8 @@ static bool8 S9xNPSSendData (int fd, const uint8 *data, int length) data += sent; if (length > 1024) { - Percent = (uint8) (((length - len) * 100) / length); #ifdef __WIN32__ + int Percent = (uint8) (((length - len) * 100) / length); PostMessage (GUI.hWnd, WM_USER, Percent, Percent); Sleep (0); #endif @@ -591,11 +595,11 @@ void S9xNPProcessClient (int c) if (NPServer.SyncByReset) { - S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) c); + S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) (pint) c); S9xNPServerAddTask (NP_SERVER_RESET_ALL, 0); } else - S9xNPServerAddTask (NP_SERVER_SYNC_CLIENT, (void *) c); + S9xNPServerAddTask (NP_SERVER_SYNC_CLIENT, (void *) (pint) c); break; case NP_CLNT_RECEIVED_ROM_IMAGE: @@ -610,11 +614,11 @@ void S9xNPProcessClient (int c) if (NPServer.SyncByReset) { - S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) c); + S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) (pint) c); S9xNPServerAddTask (NP_SERVER_RESET_ALL, 0); } else - S9xNPServerAddTask (NP_SERVER_SYNC_CLIENT, (void *) c); + S9xNPServerAddTask (NP_SERVER_SYNC_CLIENT, (void *) (pint) c); break; @@ -655,7 +659,7 @@ void S9xNPProcessClient (int c) if (NPServer.SyncByReset) { - S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) c); + S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) (pint) c); S9xNPServerAddTask (NP_SERVER_RESET_ALL, 0); } else @@ -663,7 +667,7 @@ void S9xNPProcessClient (int c) S9xNPServerAddTask (NP_SERVER_SYNC_CLIENT, (void *) c); #else /* We need to resync all clients on new player connect as we don't have a 'reference game' */ - S9xNPServerAddTask (NP_SERVER_SYNC_ALL, (void *) c); + S9xNPServerAddTask (NP_SERVER_SYNC_ALL, (void *) (pint) c); #endif } } @@ -1052,19 +1056,22 @@ void S9xNPServerLoop (void *) bool8 S9xNPStartServer (int port) { +#ifdef __WIN32__ static int p; + p = port; +#endif #ifdef NP_DEBUG printf ("SERVER: Starting server on port %d @%ld\n", port, S9xGetMilliTime () - START); #endif - p = port; + server_continue = TRUE; if (S9xNPServerInit (port)) #ifdef __WIN32__ return (_beginthread (S9xNPServerLoop, 0, &p) != (uintptr_t)(~0)); #else - S9xNPServerLoop(NULL); - return (TRUE); + S9xNPServerLoop(NULL); + return (TRUE); #endif return (FALSE); @@ -1301,17 +1308,17 @@ void S9xNPSendROMLoadRequest (const char *filename) for (int i = NP_ONE_CLIENT; i < NP_MAX_CLIENTS; i++) { - if (NPServer.Clients [i].SaidHello) - { + if (NPServer.Clients [i].SaidHello) + { #ifdef NP_DEBUG printf ("SERVER: Sending load ROM requesting to player %d @%ld\n", i + 1, S9xGetMilliTime () - START); #endif sprintf (NetPlay.WarningMsg, "SERVER: sending ROM load request to player %d...", i + 1); S9xNPSetAction (NetPlay.WarningMsg, TRUE); data [1] = NPServer.Clients [i].SendSequenceNum++; - if (!S9xNPSSendData (NPServer.Clients [i].Socket, data, len)) + if (!S9xNPSSendData (NPServer.Clients [i].Socket, data, len)) { - S9xNPShutdownClient (i, TRUE); + S9xNPShutdownClient (i, TRUE); } } } diff --git a/seta.cpp b/seta.cpp index 8bec523a7d6556eb4d85bf9eeaa8ef215d60591c..c726399806f689d9c0d2cd1f4cc8584bc2cf0b09 100644 --- a/seta.cpp +++ b/seta.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/seta.h b/seta.h index aa813e98ab1649937e3b43d7c2447a3acc807b8c..2cd64ea073a7dd485a85bd00117e1a01797f2bc8 100644 --- a/seta.h +++ b/seta.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/seta010.cpp b/seta010.cpp index 240197679baa2e927dcb2b1424d3b02c4c1a3b1a..925cf705bb998dda00a71f2554ece4180f665912 100644 --- a/seta010.cpp +++ b/seta010.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/seta011.cpp b/seta011.cpp index 751b1c10c75860467b328cc0bf3aed9b08fcde10..3590692b8ecf5fe311bbf1aa89452aeda16a11c6 100644 --- a/seta011.cpp +++ b/seta011.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/seta018.cpp b/seta018.cpp index 37d07b3550934b20cfcc72e44910318e3ab3bdd2..80d24bde355c92b7524a4e850d47d7da5a44d1a3 100644 --- a/seta018.cpp +++ b/seta018.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/snapshot.cpp b/snapshot.cpp index a6b66248969de21facdab227fb51bd349e4c08fc..afad7d9c22356202fd7c5c728334c6e9f3b5ede0 100644 --- a/snapshot.cpp +++ b/snapshot.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2016 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -138,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2016 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -146,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2016 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -571,7 +573,8 @@ static FreezeData SnapControls[] = ARRAY_ENTRY(6, dummy3, 8, uint8_ARRAY_V), INT_ENTRY(6, pad_read), INT_ENTRY(6, pad_read_last), - ARRAY_ENTRY(6, internal, 60, uint8_ARRAY_V) + ARRAY_ENTRY(6, internal, 60, uint8_ARRAY_V), + ARRAY_ENTRY(10, internal_macs, 5, uint8_ARRAY_V) }; #undef STRUCT @@ -593,7 +596,7 @@ static FreezeData SnapTimings[] = INT_ENTRY(6, InterlaceField), INT_ENTRY(6, DMACPUSync), INT_ENTRY(6, NMIDMADelay), - INT_ENTRY(6, IRQPendCount), + INT_ENTRY(6, IRQFlagChanging), INT_ENTRY(6, APUSpeedup), INT_ENTRY(7, IRQTriggerCycles), INT_ENTRY(7, APUAllowTimeOverflow) @@ -1196,7 +1199,7 @@ void S9xResetSaveTimer (bool8 dontsave) char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], def[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; _splitpath(Memory.ROMFilename, drive, dir, def, ext); - sprintf(filename, "%s%s%s.%.*s", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, _MAX_EXT - 1, "oops"); + snprintf(filename, PATH_MAX + 1, "%s%s%s.%.*s", S9xGetDirectory(SNAPSHOT_DIR), SLASH_STR, def, _MAX_EXT - 1, "oops"); S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, SAVE_INFO_OOPS); S9xFreezeGame(filename); } @@ -1206,14 +1209,14 @@ void S9xResetSaveTimer (bool8 dontsave) uint32 S9xFreezeSize() { - nulStream stream; - S9xFreezeToStream(&stream); - return stream.size(); + nulStream stream; + S9xFreezeToStream(&stream); + return stream.size(); } bool8 S9xFreezeGameMem (uint8 *buf, uint32 bufSize) { - memStream mStream(buf, bufSize); + memStream mStream(buf, bufSize); S9xFreezeToStream(&mStream); return (TRUE); @@ -1238,7 +1241,7 @@ bool8 S9xFreezeGame (const char *filename) int S9xUnfreezeGameMem (const uint8 *buf, uint32 bufSize) { - memStream stream(buf, bufSize); + memStream stream(buf, bufSize); int result = S9xUnfreezeFromStream(&stream); return result; @@ -1310,10 +1313,10 @@ bool8 S9xUnfreezeGame (const char *filename) void S9xFreezeToStream (STREAM stream) { - char buffer[1024]; + char buffer[8192]; uint8 *soundsnapshot = new uint8[SPC_SAVE_STATE_BLOCK_SIZE]; - S9xPackStatus(); + S9xPackStatus(); sprintf(buffer, "%s:%04d\n", SNAPSHOT_MAGIC, SNAPSHOT_VERSION); WRITE_STREAM(buffer, strlen(buffer), stream); @@ -1401,8 +1404,11 @@ void S9xFreezeToStream (STREAM stream) if (Settings.BS) FreezeStruct(stream, "BSX", &BSX, SnapBSX, COUNT(SnapBSX)); - if (Settings.MSU1) - FreezeStruct(stream, "MSU", &MSU1, SnapMSU1, COUNT(SnapMSU1)); + // libretro: g++ guard warning + if (Settings.MSU1) + { + FreezeStruct(stream, "MSU", &MSU1, SnapMSU1, COUNT(SnapMSU1)); + } delete [] soundsnapshot; } @@ -1416,7 +1422,7 @@ int S9xUnfreezeFromStream (STREAM stream) char buffer[PATH_MAX + 1]; len = strlen(SNAPSHOT_MAGIC) + 1 + 4 + 1; - if (READ_STREAM(buffer, len, stream) != len) + if (READ_STREAM(buffer, len, stream) != (unsigned int ) len) return (WRONG_FORMAT); if (strncmp(buffer, SNAPSHOT_MAGIC, strlen(SNAPSHOT_MAGIC)) != 0) @@ -1455,7 +1461,7 @@ int S9xUnfreezeFromStream (STREAM stream) uint8 *local_srtc = NULL; uint8 *local_rtc_data = NULL; uint8 *local_bsx_data = NULL; - uint8 *local_msu1_data = NULL; + uint8 *local_msu1_data = NULL; uint8 *local_screenshot = NULL; uint8 *local_movie_data = NULL; @@ -1648,11 +1654,12 @@ int S9xUnfreezeFromStream (STREAM stream) if (local_fillram) memcpy(Memory.FillRAM, local_fillram, 0x8000); - if(version < SNAPSHOT_VERSION_BAPU) { - printf("Using Blargg APU snapshot loading (snapshot version %d, current is %d)\n...", version, SNAPSHOT_VERSION); - S9xAPULoadBlarggState(local_apu_sound); - } else - S9xAPULoadState(local_apu_sound); + if(version < SNAPSHOT_VERSION_BAPU) { + printf("Using Blargg APU snapshot loading (snapshot version %d, current is %d)\n...", version, SNAPSHOT_VERSION); + S9xAPULoadBlarggState(local_apu_sound); + } + else + S9xAPULoadState(local_apu_sound); struct SControlSnapshot ctl_snap; UnfreezeStructFromCopy(&ctl_snap, SnapControls, COUNT(SnapControls), local_control_data, version); @@ -1746,6 +1753,7 @@ int S9xUnfreezeFromStream (STREAM stream) ICPU.ShiftedDB = Registers.DB << 16; S9xSetPCBase(Registers.PBPC); S9xUnpackStatus(); + S9xUpdateIRQPositions(false); S9xFixCycles(); for (int d = 0; d < 8; d++) @@ -1755,6 +1763,7 @@ int S9xUnfreezeFromStream (STREAM stream) CPU.HDMARanInDMA = 0; S9xFixColourBrightness(); + S9xBuildDirectColourMaps(); IPPU.ColorsChanged = TRUE; IPPU.OBJChanged = TRUE; IPPU.RenderThisFrame = TRUE; @@ -2050,7 +2059,6 @@ static bool CheckBlockName(STREAM stream, const char *name, int &len) { char buffer[16]; len = 0; - long rewind = FIND_STREAM(stream); size_t l = READ_STREAM(buffer, 11, stream); buffer[l] = 0; @@ -2093,7 +2101,7 @@ static void SkipBlockWithName(STREAM stream, const char *name) static int UnfreezeBlock (STREAM stream, const char *name, uint8 *block, int size) { - char buffer[16]; + char buffer[20]; int len = 0, rem = 0; long rewind = FIND_STREAM(stream); @@ -2134,7 +2142,7 @@ static int UnfreezeBlock (STREAM stream, const char *name, uint8 *block, int siz memset(block, 0, size); } - if (READ_STREAM(block, len, stream) != len) + if (READ_STREAM(block, len, stream) != (unsigned int) len) { REVERT_STREAM(stream, rewind, 0); return (WRONG_FORMAT); diff --git a/snapshot.h b/snapshot.h index edc8f734b9fc17e3977f19bd73b88829b28b7586..a88d6123b883158f21ab34cd1c234339e2064954 100644 --- a/snapshot.h +++ b/snapshot.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -193,7 +198,7 @@ #define SNAPSHOT_MAGIC "#!s9xsnp" #define SNAPSHOT_VERSION_IRQ 7 #define SNAPSHOT_VERSION_BAPU 8 -#define SNAPSHOT_VERSION 9 +#define SNAPSHOT_VERSION 10 #define SUCCESS 1 #define WRONG_FORMAT (-1) diff --git a/snes9x.cpp b/snes9x.cpp index 703476e119e06b19da28a46c72af337f19200f9a..74b7e3f90d77489dae9c6ec80548bc883b1eea18 100644 --- a/snes9x.cpp +++ b/snes9x.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -187,6 +192,9 @@ #include #include +#ifdef HAVE_STRINGS_H +#include +#endif #include "snes9x.h" #include "memmap.h" @@ -206,13 +214,14 @@ extern FILE *trace; #define S9X_CONF_FILE_NAME "snes9x.conf" +#ifndef __LIBRETRO__ static char *rom_filename = NULL; static bool parse_controller_spec (int, const char *); static void parse_crosshair_spec (enum crosscontrols, const char *); static bool try_load_config_file (const char *, ConfigFile &); -#ifndef __LIBRETRO__ + static bool parse_controller_spec (int port, const char *arg) { if (!strcasecmp(arg, "none")) @@ -233,6 +242,9 @@ static bool parse_controller_spec (int port, const char *arg) if (!strcasecmp(arg, "two-justifiers")) S9xSetController(port, CTL_JUSTIFIER, 1, 0, 0, 0); else + if (!strcasecmp(arg, "macsrifle")) + S9xSetController(port, CTL_MACSRIFLE, 0, 0, 0, 0); + else if (!strncasecmp(arg, "mp5:", 4) && ((arg[4] >= '1' && arg[4] <= '8') || arg[4] == 'n') && ((arg[5] >= '1' && arg[5] <= '8') || arg[5] == 'n') && ((arg[6] >= '1' && arg[6] <= '8') || arg[6] == 'n') && @@ -327,7 +339,8 @@ static bool try_load_config_file (const char *fname, ConfigFile &conf) if (fp) { fprintf(stdout, "Reading config file %s.\n", fname); - conf.LoadFile(new fStream(fp)); + fStream fS(fp); + conf.LoadFile(&fS); CLOSE_FSTREAM(fp); return (true); } @@ -377,14 +390,15 @@ void S9xLoadConfigFiles (char **argv, int argc) Settings.ForceInterleaved2 = conf.GetBool("ROM::Interleaved2", false); Settings.ForceInterleaveGD24 = conf.GetBool("ROM::InterleaveGD24", false); Settings.ApplyCheats = conf.GetBool("ROM::Cheat", false); + Cheat.enabled = false; + Settings.NoPatch = !conf.GetBool("ROM::Patch", true); + Settings.IgnorePatchChecksum = conf.GetBool("ROM::IgnorePatchChecksum", false); Settings.ForceLoROM = conf.GetBool("ROM::LoROM", false); Settings.ForceHiROM = conf.GetBool("ROM::HiROM", false); if (Settings.ForceLoROM) Settings.ForceHiROM = false; - Settings.SuperFXSpeedPerLine = 0.417 * 10.5e6; - Settings.ForcePAL = conf.GetBool("ROM::PAL", false); Settings.ForceNTSC = conf.GetBool("ROM::NTSC", false); if (Settings.ForcePAL) @@ -411,8 +425,10 @@ void S9xLoadConfigFiles (char **argv, int argc) Settings.Stereo = conf.GetBool("Sound::Stereo", true); Settings.ReverseStereo = conf.GetBool("Sound::ReverseStereo", false); Settings.SoundPlaybackRate = conf.GetUInt("Sound::Rate", 32000); - Settings.SoundInputRate = conf.GetUInt("Sound::InputRate", 32000); + Settings.SoundInputRate = conf.GetUInt("Sound::InputRate", 31950); Settings.Mute = conf.GetBool("Sound::Mute", false); + Settings.DynamicRateControl = conf.GetBool("Sound::DynamicRateControl", false); + Settings.DynamicRateLimit = conf.GetInt ("Sound::DynamicRateLimit", 5); // Display @@ -422,14 +438,21 @@ void S9xLoadConfigFiles (char **argv, int argc) Settings.DisplayFrameRate = conf.GetBool("Display::DisplayFrameRate", false); Settings.DisplayWatchedAddresses = conf.GetBool("Display::DisplayWatchedAddresses", false); Settings.DisplayPressedKeys = conf.GetBool("Display::DisplayInput", false); + Settings.DisplayMovieFrame = conf.GetBool("Display::DisplayFrameCount", false); Settings.AutoDisplayMessages = conf.GetBool("Display::MessagesInImage", true); Settings.InitialInfoStringTimeout = conf.GetInt ("Display::MessageDisplayTime", 120); + Settings.BilinearFilter = conf.GetBool("Display::BilinearFilter", false); // Settings Settings.BSXBootup = conf.GetBool("Settings::BSXBootup", false); Settings.TurboMode = conf.GetBool("Settings::TurboMode", false); Settings.TurboSkipFrames = conf.GetUInt("Settings::TurboFrameSkip", 15); + Settings.MovieTruncate = conf.GetBool("Settings::MovieTruncateAtEnd", false); + Settings.MovieNotifyIgnored = conf.GetBool("Settings::MovieNotifyIgnored", false); + Settings.WrongMovieStateProtection = conf.GetBool("Settings::WrongMovieStateProtection", true); + Settings.StretchScreenshots = conf.GetInt ("Settings::StretchScreenshots", 1); + Settings.SnapshotScreenshots = conf.GetBool("Settings::SnapshotScreenshots", true); Settings.DontSaveOopsSnapshot = conf.GetBool("Settings::DontSaveOopsSnapshot", false); Settings.AutoSaveDelay = conf.GetUInt("Settings::AutoSaveDelay", 0); @@ -446,6 +469,7 @@ void S9xLoadConfigFiles (char **argv, int argc) Settings.MouseMaster = conf.GetBool("Controls::MouseMaster", true); Settings.SuperScopeMaster = conf.GetBool("Controls::SuperscopeMaster", true); Settings.JustifierMaster = conf.GetBool("Controls::JustifierMaster", true); + Settings.MacsRifleMaster = conf.GetBool("Controls::MacsRifleMaster", true); Settings.MultiPlayer5Master = conf.GetBool("Controls::MP5Master", true); Settings.UpAndDown = conf.GetBool("Controls::AllowLeftRight", false); @@ -464,8 +488,11 @@ void S9xLoadConfigFiles (char **argv, int argc) parse_crosshair_spec(X_JUSTIFIER1, conf.GetString("Controls::Justifier1Crosshair")); if (conf.Exists("Controls::Justifier2Crosshair")) parse_crosshair_spec(X_JUSTIFIER2, conf.GetString("Controls::Justifier2Crosshair")); + if (conf.Exists("Controls::MacsRifleCrosshair")) + parse_crosshair_spec(X_MACSRIFLE, conf.GetString("Controls::MacsRifleCrosshair")); // Hack + Settings.SuperFXClockMultiplier = conf.GetUInt("Hack::SuperFXClockMultiplier", 100); Settings.DisableGameSpecificHacks = !conf.GetBool("Hack::EnableGameSpecificHacks", true); Settings.BlockInvalidVRAMAccessMaster = !conf.GetBool("Hack::AllowInvalidVRAMAccess", false); @@ -496,6 +523,7 @@ void S9xLoadConfigFiles (char **argv, int argc) ENSURE_TRACE_OPEN(trace,"trace.log","wb") CPU.Flags |= TRACE_FLAG; } + Settings.TraceSMP = FALSE; #endif S9xParsePortConfig(conf, 1); @@ -536,6 +564,7 @@ void S9xUsage (void) S9xMessage(S9X_INFO, S9X_USAGE, "-nomouse Disable emulation of the SNES mouse"); S9xMessage(S9X_INFO, S9X_USAGE, "-nosuperscope Disable emulation of the Superscope"); S9xMessage(S9X_INFO, S9X_USAGE, "-nojustifier Disable emulation of the Konami Justifier"); + S9xMessage(S9X_INFO, S9X_USAGE, "-nomacsrifle Disable emulation of the M.A.C.S. Rifle"); S9xMessage(S9X_INFO, S9X_USAGE, "-port# Specify which controller to emulate in port 1/2"); S9xMessage(S9X_INFO, S9X_USAGE, " Controllers: none No controller"); S9xMessage(S9X_INFO, S9X_USAGE, " pad# Joypad number 1-8"); @@ -544,6 +573,7 @@ void S9xUsage (void) S9xMessage(S9X_INFO, S9X_USAGE, " justifier Blue Justifier (not useful with -port1)"); S9xMessage(S9X_INFO, S9X_USAGE, " two-justifiers Blue & Pink Justifiers"); S9xMessage(S9X_INFO, S9X_USAGE, " mp5:#### MP5 with the 4 named pads (1-8 or n)"); + S9xMessage(S9X_INFO, S9X_USAGE, " macsrifle M.A.C.S. Rifle"); S9xMessage(S9X_INFO, S9X_USAGE, ""); // ROM OPTIONS @@ -566,9 +596,8 @@ void S9xUsage (void) // PATCH/CHEAT OPTIONS S9xMessage(S9X_INFO, S9X_USAGE, "-nopatch Do not apply any available IPS/UPS patches"); S9xMessage(S9X_INFO, S9X_USAGE, "-cheat Apply saved cheats"); - S9xMessage(S9X_INFO, S9X_USAGE, "-gamegenie Supply a Game Genie code"); - S9xMessage(S9X_INFO, S9X_USAGE, "-actionreplay Supply a Pro-Action Reply code"); - S9xMessage(S9X_INFO, S9X_USAGE, "-goldfinger Supply a Gold Finger code"); + S9xMessage(S9X_INFO, S9X_USAGE, "-cheatcode Supply a cheat code in Game Genie,"); + S9xMessage(S9X_INFO, S9X_USAGE, " Pro-Action Replay, or Raw format (address=byte)"); S9xMessage(S9X_INFO, S9X_USAGE, ""); #ifdef NETPLAY_SUPPORT @@ -607,6 +636,31 @@ void S9xUsage (void) exit(1); } +void S9xParseArgsForCheats (char **argv, int argc) +{ + for (int i = 1; i < argc; i++) + { + if (!strcasecmp(argv[i], "-gamegenie") || + !strcasecmp(argv[i], "-actionreplay") || + !strcasecmp(argv[i], "-cheatcode")) + { + if (i + 1 < argc) + { + if (S9xAddCheatGroup ("Unknown", argv[++i]) < 0) + { + S9xMessage(S9X_ERROR, S9X_GAME_GENIE_CODE_ERROR, "Code format invalid"); + } + else + { + S9xEnableCheatGroup (Cheat.g.size() - 1); + } + } + else + S9xUsage(); + } + } +} + char * S9xParseArgs (char **argv, int argc) { for (int i = 1; i < argc; i++) @@ -639,8 +693,10 @@ char * S9xParseArgs (char **argv, int argc) if (i + 1 < argc) { Settings.SoundInputRate = atoi(argv[++i]); - if (Settings.SoundInputRate < 8192) - Settings.SoundInputRate = 8192; + if (Settings.SoundInputRate < 31700) + Settings.SoundInputRate = 31700; + if (Settings.SoundInputRate > 32300) + Settings.SoundInputRate = 32300; } else S9xUsage(); @@ -691,6 +747,9 @@ char * S9xParseArgs (char **argv, int argc) if (!strcasecmp(argv[i], "-nojustifier")) Settings.JustifierMaster = FALSE; else + if (!strcasecmp(argv[i], "-nomacsrifle")) + Settings.MacsRifleMaster = FALSE; + else if (!strcasecmp(argv[i], "-port1") || !strcasecmp(argv[i], "-port2")) { @@ -739,70 +798,46 @@ char * S9xParseArgs (char **argv, int argc) else if (!strcasecmp(argv[i], "-bsxbootup")) Settings.BSXBootup = TRUE; + else + if (!strcasecmp(argv[i], "-snapshot")) + { + if (i + 1 < argc) + { + strncpy(Settings.InitialSnapshotFilename, argv[++i], PATH_MAX); + Settings.InitialSnapshotFilename[PATH_MAX] = 0; + } + else + S9xUsage(); + } else // PATCH/CHEAT OPTIONS + if (!strcasecmp(argv[i], "-nopatch")) + Settings.NoPatch = TRUE; + else if (!strcasecmp(argv[i], "-cheat")) Settings.ApplyCheats = TRUE; else - if (!strcasecmp(argv[i], "-gamegenie")) - { - if (i + 1 < argc) - { - uint32 address; - uint8 byte; - const char *error; - - if ((error = S9xGameGenieToRaw(argv[++i], address, byte)) == NULL) - S9xAddCheat(TRUE, FALSE, address, byte); - else - S9xMessage(S9X_ERROR, S9X_GAME_GENIE_CODE_ERROR, error); - } - else - S9xUsage(); - } - else - if (!strcasecmp(argv[i], "-actionreplay")) - { - if (i + 1 < argc) - { - uint32 address; - uint8 byte; - const char *error; - - if ((error = S9xProActionReplayToRaw(argv[++i], address, byte)) == NULL) - S9xAddCheat(TRUE, FALSE, address, byte); - else - S9xMessage(S9X_ERROR, S9X_ACTION_REPLY_CODE_ERROR, error); - } - else - S9xUsage(); - } - else - if (!strcasecmp(argv[i], "-goldfinger")) + if (!strcasecmp(argv[i], "-gamegenie") || + !strcasecmp(argv[i], "-actionreplay") || + !strcasecmp(argv[i], "-cheatcode")) { if (i + 1 < argc) { - uint32 address; - uint8 bytes[3]; - bool8 sram; - uint8 num_bytes; - const char *error; - - if ((error = S9xGoldFingerToRaw(argv[++i], address, sram, num_bytes, bytes)) == NULL) + if (S9xAddCheatGroup ("Unknown", argv[++i]) < 0) { - for (int c = 0; c < num_bytes; c++) - S9xAddCheat(TRUE, FALSE, address + c, bytes[c]); + S9xMessage(S9X_ERROR, S9X_GAME_GENIE_CODE_ERROR, "Code format invalid"); } else - S9xMessage(S9X_ERROR, S9X_GOLD_FINGER_CODE_ERROR, error); + { + S9xEnableCheatGroup (Cheat.g.size() - 1); + } } else S9xUsage(); } else - // NETPLAY OPTIONS #ifdef NETPLAY_SUPPORT @@ -831,7 +866,7 @@ char * S9xParseArgs (char **argv, int argc) #endif // HACKING OR DEBUGGING OPTIONS - + #ifdef DEBUGGER if (!strcasecmp(argv[i], "-debug")) CPU.Flags |= DEBUG_MODE_FLAG; @@ -903,5 +938,4 @@ char * S9xParseArgs (char **argv, int argc) return (rom_filename); } -#endif - +#endif \ No newline at end of file diff --git a/snes9x.h b/snes9x.h index 5f73303f95029054dde97afe581a6f4bffde68f3..9659dbd2bd524688271bf913488e35185b701b09 100644 --- a/snes9x.h +++ b/snes9x.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -189,7 +194,7 @@ #define _SNES9X_H_ #ifndef VERSION -#define VERSION "1.54.1" +#define VERSION "1.56.1" #endif #include "port.h" @@ -249,7 +254,7 @@ #define SNES_MAX_PAL_VCOUNTER 312 #define SNES_HCOUNTER_MAX 341 -#define ONE_CYCLE (overclock_cycles ? one_c : 6) +#define ONE_CYCLE (overclock_cycles ? one_c : 6) #define SLOW_ONE_CYCLE (overclock_cycles ? slow_one_c : 8) #define TWO_CYCLES (overclock_cycles ? two_c : 12) #define ONE_DOT_CYCLE 4 @@ -333,6 +338,13 @@ enum HC_WRAM_REFRESH_EVENT = 6 }; +enum +{ + IRQ_NONE = 0, + IRQ_SET_FLAG = 1, + IRQ_CLEAR_FLAG = 2 +}; + struct STimings { int32 H_Max_Master; @@ -344,13 +356,14 @@ struct STimings int32 HDMAInit; int32 HDMAStart; int32 NMITriggerPos; + int32 NextIRQTimer; int32 IRQTriggerCycles; int32 WRAMRefreshPos; int32 RenderPos; bool8 InterlaceField; int32 DMACPUSync; // The cycles to synchronize DMA and CPU. Snes9x cannot emulate correctly. int32 NMIDMADelay; // The delay of NMI trigger after DMA transfers. Snes9x cannot emulate correctly. - int32 IRQPendCount; // This value is just a hack. + int32 IRQFlagChanging; // This value is just a hack. int32 APUSpeedup; bool8 APUAllowTimeOverflow; }; @@ -363,6 +376,7 @@ struct SSettings bool8 TraceUnknownRegisters; bool8 TraceDSP; bool8 TraceHCEvent; + bool8 TraceSMP; bool8 SuperFX; uint8 DSP; @@ -382,7 +396,8 @@ struct SSettings bool8 SuperScopeMaster; bool8 JustifierMaster; bool8 MultiPlayer5Master; - + bool8 MacsRifleMaster; + bool8 ForceLoROM; bool8 ForceHiROM; bool8 ForceHeader; @@ -408,7 +423,6 @@ struct SSettings bool8 SupportHiRes; bool8 Transparency; - float SuperFXSpeedPerLine; uint8 BG_Forced; bool8 DisableGraphicWindows; @@ -450,6 +464,7 @@ struct SSettings bool8 UpAndDown; bool8 OpenGLEnable; + uint32 SuperFXClockMultiplier; bool8 FastSavestates; bool8 HardDisableAudio; @@ -476,7 +491,7 @@ enum void S9xSetPause(uint32); void S9xClearPause(uint32); void S9xExit(void); -void S9xMessage(int type, int, const char *s); +void S9xMessage(int, int, const char *); extern struct SSettings Settings; extern struct SCPUState CPU; @@ -484,4 +499,7 @@ extern struct STimings Timings; extern struct SSNESGameFixes SNESGameFixes; extern char String[513]; +extern bool8 libretro_get_snes_interp(); +extern int libretro_snes_interp(void *ptr); + #endif diff --git a/spc7110.cpp b/spc7110.cpp index 8bf53748b102ce41c759e69b982ee07ab25fba98..3e3770a4ab804701c84818b0bdcfa73c984e40fd 100644 --- a/spc7110.cpp +++ b/spc7110.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/spc7110.h b/spc7110.h index 27b44c3bcc598be7f1e6ea525f29d9e37b4f6113..8e7ecd22a1974891fb32db774a2135f8c67b3fac 100644 --- a/spc7110.h +++ b/spc7110.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) diff --git a/spc7110dec.cpp b/spc7110dec.cpp index f1ac32e126919832b9ede9e65bf650359ed224ec..6cc28670dbf2dfac9d54f67dd298fad1a6885ae0 100644 --- a/spc7110dec.cpp +++ b/spc7110dec.cpp @@ -42,7 +42,7 @@ void SPC7110Decomp::write(uint8 data) { } uint8 SPC7110Decomp::dataread() { - unsigned size = memory_cartrom_size() - programmrom_size; + unsigned size = memory_cartrom_size() > 0x500000 ? memory_cartrom_size() - 0x200000 : memory_cartrom_size() - 0x100000; while(decomp_offset >= size) decomp_offset -= size; return memory_cartrom_read(0x100000 + decomp_offset++); } @@ -520,8 +520,6 @@ SPC7110Decomp::SPC7110Decomp() { + map(3, 24) + map(2, 16) + map(1, 8) + map(0, 0); #undef map } - - programmrom_size = (memory_cartrom_size() > 0x500000) ? 0x200000 : 0x100000; } SPC7110Decomp::~SPC7110Decomp() { diff --git a/spc7110dec.h b/spc7110dec.h index 1282a0e54d2d987c4acd005df41521790a386c66..3a9c7ce3b63cbba29bb0c2e600c900c5b753402f 100644 --- a/spc7110dec.h +++ b/spc7110dec.h @@ -31,8 +31,6 @@ public: unsigned decomp_mode; unsigned decomp_offset; - unsigned programmrom_size; - //read() will spool chunks half the size of decomp_buffer_size enum { decomp_buffer_size = SPC7110_DECOMP_BUFFER_SIZE }; //must be >= 64, and must be a power of two uint8 *decomp_buffer; diff --git a/spc7110emu.cpp b/spc7110emu.cpp index fa7dd9178d93f7e3a4894900cdd967f90d9dbeaf..304e5d0510e7f2c0ddd053360313f2b77dffac0c 100644 --- a/spc7110emu.cpp +++ b/spc7110emu.cpp @@ -91,7 +91,7 @@ void SPC7110::reset() { } unsigned SPC7110::datarom_addr(unsigned addr) { - unsigned size = memory_cartrom_size() - programmrom_size; + unsigned size = memory_cartrom_size() > 0x500000 ? memory_cartrom_size() - 0x200000 : memory_cartrom_size() - 0x100000; while(addr >= size) addr -= size; return addr + 0x100000; } @@ -642,5 +642,4 @@ void SPC7110::mmio_write(unsigned addr, uint8 data) { } SPC7110::SPC7110() { - programmrom_size = (memory_cartrom_size() > 0x500000) ? 0x200000 : 0x100000; } diff --git a/spc7110emu.h b/spc7110emu.h index 43b08ba9d2e9baf6cc53d8f1b4314804bef4a9b2..5f66fecc7f481df3e3d3ae40e7cfa8e73587fe84 100644 --- a/spc7110emu.h +++ b/spc7110emu.h @@ -131,8 +131,6 @@ public: unsigned rtc_index; static const unsigned months[12]; - - unsigned programmrom_size; }; #endif diff --git a/srtc.cpp b/srtc.cpp index 4aaf672e4774415b4eb3257d90e7f83fec345ec0..254dab105067c8eec16dfcd77e8865649fe9bce5 100644 --- a/srtc.cpp +++ b/srtc.cpp @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/srtc.h b/srtc.h index 71b3c04cbcd15d2aeb090e8729b0ef38c15096bf..d21ea982f75a1d0243532dd89a987bf69e3373eb 100644 --- a/srtc.h +++ b/srtc.h @@ -22,7 +22,7 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2017 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 (c) Copyright 2017 qwertymodo @@ -140,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2017 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -148,7 +148,7 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2017 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles diff --git a/stream.cpp b/stream.cpp index b2ee69a681c7d39969cf5c063de9b07dc1b489be..b385e51ace66cc72ccfb54505550cb5953b98d5b 100644 --- a/stream.cpp +++ b/stream.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -189,7 +194,11 @@ #include #ifdef UNZIP_SUPPORT -#include "unzip.h" +# ifdef SYSTEM_ZIP +# include +# else +# include "unzip.h" +# endif #endif #include "snes9x.h" #include "stream.h" @@ -308,8 +317,12 @@ void fStream::closeStream() unzStream::unzStream (unzFile &v) { file = v; - head = NULL; - numbytes = 0; + pos_in_buf = 0; + buf_pos_in_unzipped = unztell(file); + bytes_in_buf = 0; + + // remember start pos for seeks + unzGetFilePos(file, &unz_file_start_pos); } unzStream::~unzStream (void) @@ -317,21 +330,31 @@ unzStream::~unzStream (void) return; } +size_t unzStream::buffer_remaining() +{ + return bytes_in_buf - pos_in_buf; +} + +void unzStream::fill_buffer() +{ + buf_pos_in_unzipped = unztell(file); + bytes_in_buf = unzReadCurrentFile(file, buffer, unz_BUFFSIZ); + pos_in_buf = 0; +} + int unzStream::get_char (void) { unsigned char c; - if (numbytes <= 0) + if (buffer_remaining() <= 0) { - numbytes = unzReadCurrentFile(file, buffer, unz_BUFFSIZ); - if (numbytes <= 0) + fill_buffer(); + if (bytes_in_buf <= 0) return (EOF); - head = buffer; } - c = *head; - head++; - numbytes--; + c = *(buffer + pos_in_buf); + pos_in_buf++; return ((int) c); } @@ -366,28 +389,25 @@ size_t unzStream::read (void *buf, size_t len) if (len == 0) return (len); - if (len <= numbytes) - { - memcpy(buf, head, len); - numbytes -= len; - head += len; - return (len); - } - - size_t numread = 0; - if (numbytes > 0) - { - memcpy(buf, head, numbytes); - numread += numbytes; - head = NULL; - numbytes = 0; - } + size_t to_read = len; + uint8 *read_to = (uint8 * )buf; + do + { + size_t in_buffer = buffer_remaining(); + if (to_read <= in_buffer) + { + memcpy(read_to, buffer + pos_in_buf, to_read); + pos_in_buf += to_read; + to_read = 0; + break; + } - int l = unzReadCurrentFile(file, (uint8 *)buf + numread, len - numread); - if (l > 0) - numread += l; + memcpy(read_to, buffer + pos_in_buf, in_buffer); + to_read -= in_buffer; + fill_buffer(); + } while (bytes_in_buf); - return (numread); + return (len - to_read); } // not supported @@ -398,7 +418,7 @@ size_t unzStream::write (void *buf, size_t len) size_t unzStream::pos (void) { - return (unztell(file)); + return buf_pos_in_unzipped + pos_in_buf; } size_t unzStream::size (void) @@ -408,10 +428,27 @@ size_t unzStream::size (void) return info.uncompressed_size; } -// not supported int unzStream::revert (size_t from, size_t offset) { - return -1; + size_t target_pos = from + offset; + + // new pos inside buffered data + if (target_pos >= buf_pos_in_unzipped && target_pos < buf_pos_in_unzipped + bytes_in_buf) + { + pos_in_buf = target_pos - buf_pos_in_unzipped; + } + else // outside of buffer, reset file and read until pos + { + unzGoToFilePos(file, &unz_file_start_pos); + unzOpenCurrentFile(file); // necessary to reopen after seek + int times_to_read = target_pos / unz_BUFFSIZ + 1; + for( int i = 0; i < times_to_read; i++) + { + fill_buffer(); + } + pos_in_buf = target_pos % unz_BUFFSIZ; + } + return 0; } void unzStream::closeStream() diff --git a/stream.h b/stream.h index 44d8e0712f88fc44306678560e92c620ec5a459e..16ceee5a28bd15fd4523ce7e2e25ecff62fe072a 100644 --- a/stream.h +++ b/stream.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -226,8 +231,11 @@ class fStream : public Stream }; #ifdef UNZIP_SUPPORT - -#include "unzip.h" +# ifdef SYSTEM_ZIP +# include +# else +# include "unzip.h" +# endif #define unz_BUFFSIZ 1024 @@ -246,10 +254,15 @@ class unzStream : public Stream virtual void closeStream(); private: + void fill_buffer(); + size_t buffer_remaining(); + unzFile file; char buffer[unz_BUFFSIZ]; - char *head; - size_t numbytes; + size_t pos_in_buf; + size_t buf_pos_in_unzipped; + size_t bytes_in_buf; + unz_file_pos unz_file_start_pos; }; #endif diff --git a/tile.cpp b/tile.cpp index 95177cf993b0b213c737261484968dde2b2df5e0..e5360085593ef16ed7fd06dc412a12ddf029ce7c 100644 --- a/tile.cpp +++ b/tile.cpp @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -484,7 +489,6 @@ static uint8 ConvertTile4h_even (uint8 *pCache, uint32 TileAddr, uint32 Tile) #undef DOBIT // First-level include: Get all the renderers. - #include "tile.cpp" // Functions to select which converter and renderer to use. @@ -712,8 +716,6 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) #define SELECT_PALETTE() \ if (BG.DirectColourMode) \ { \ - if (IPPU.DirectColourMapsNeedRebuild) \ - S9xBuildDirectColourMaps(); \ GFX.RealScreenColors = DirectColourMaps[(Tile >> 10) & 7]; \ } \ else \ @@ -759,6 +761,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) if (!(Tile & (V_FLIP | H_FLIP))) \ { \ bp = pCache + BPSTART; \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, bp += 8 * PITCH, Offset += GFX.PPL) \ { \ DRAW_PIXEL(0, Pix = bp[0]); \ @@ -775,6 +778,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) if (!(Tile & V_FLIP)) \ { \ bp = pCache + BPSTART; \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, bp += 8 * PITCH, Offset += GFX.PPL) \ { \ DRAW_PIXEL(0, Pix = bp[7]); \ @@ -791,6 +795,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) if (!(Tile & H_FLIP)) \ { \ bp = pCache + 56 - BPSTART; \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, bp -= 8 * PITCH, Offset += GFX.PPL) \ { \ DRAW_PIXEL(0, Pix = bp[0]); \ @@ -806,6 +811,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) else \ { \ bp = pCache + 56 - BPSTART; \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, bp -= 8 * PITCH, Offset += GFX.PPL) \ { \ DRAW_PIXEL(0, Pix = bp[7]); \ @@ -850,6 +856,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) if (!(Tile & (V_FLIP | H_FLIP))) \ { \ bp = pCache + BPSTART; \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, bp += 8 * PITCH, Offset += GFX.PPL) \ { \ w = Width; \ @@ -870,6 +877,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) if (!(Tile & V_FLIP)) \ { \ bp = pCache + BPSTART; \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, bp += 8 * PITCH, Offset += GFX.PPL) \ { \ w = Width; \ @@ -890,6 +898,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) if (!(Tile & H_FLIP)) \ { \ bp = pCache + 56 - BPSTART; \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, bp -= 8 * PITCH, Offset += GFX.PPL) \ { \ w = Width; \ @@ -909,6 +918,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) else \ { \ bp = pCache + 56 - BPSTART; \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, bp -= 8 * PITCH, Offset += GFX.PPL) \ { \ w = Width; \ @@ -965,6 +975,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) \ if (Pix) \ { \ + OFFSET_IN_LINE; \ for (l = LineCount; l > 0; l--, Offset += GFX.PPL) \ { \ for (w = Width - 1; w >= 0; w--) \ @@ -1001,6 +1012,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) GFX.RealScreenColors = IPPU.ScreenColors; \ GFX.ScreenColors = GFX.ClipColors ? BlackColourMap : GFX.RealScreenColors; \ \ + OFFSET_IN_LINE; \ for (l = GFX.StartY; l <= GFX.EndY; l++, Offset += GFX.PPL) \ { \ for (x = Left; x < Right; x++) \ @@ -1046,8 +1058,6 @@ extern struct SLineMatrixData LineMatrixData[240]; \ if (DCMODE) \ { \ - if (IPPU.DirectColourMapsNeedRebuild) \ - S9xBuildDirectColourMaps(); \ GFX.RealScreenColors = DirectColourMaps[0]; \ } \ else \ @@ -1061,6 +1071,7 @@ extern struct SLineMatrixData LineMatrixData[240]; uint32 Offset = GFX.StartY * GFX.PPL; \ struct SLineMatrixData *l = &LineMatrixData[GFX.StartY]; \ \ + OFFSET_IN_LINE; \ for (uint32 Line = GFX.StartY; Line <= GFX.EndY; Line++, Offset += GFX.PPL, l++) \ { \ int yy, starty; \ @@ -1143,8 +1154,6 @@ extern struct SLineMatrixData LineMatrixData[240]; \ if (DCMODE) \ { \ - if (IPPU.DirectColourMapsNeedRebuild) \ - S9xBuildDirectColourMaps(); \ GFX.RealScreenColors = DirectColourMaps[0]; \ } \ else \ @@ -1176,6 +1185,7 @@ extern struct SLineMatrixData LineMatrixData[240]; uint32 Offset = StartY * GFX.PPL; \ struct SLineMatrixData *l = &LineMatrixData[StartY]; \ \ + OFFSET_IN_LINE; \ for (uint32 Line = StartY; Line <= GFX.EndY; Line += VMosaic, Offset += VMosaic * GFX.PPL, l += VMosaic) \ { \ if (Line + VMosaic > GFX.EndY) \ @@ -1351,6 +1361,7 @@ extern struct SLineMatrixData LineMatrixData[240]; // The 1x1 pixel plotter, for speedhacking modes. +#define OFFSET_IN_LINE #define DRAW_PIXEL(N, M) \ if (Z1 > GFX.DB[Offset + N] && (M)) \ { \ @@ -1385,6 +1396,7 @@ extern struct SLineMatrixData LineMatrixData[240]; #undef NAME2 #undef DRAW_PIXEL +#undef OFFSET_IN_LINE // Hires pixel plotter, this combines the main and subscreen pixels as appropriate to render hires or pseudo-hires images. // Use it only on the main screen, subscreen should use Normal2x1 instead. @@ -1396,29 +1408,18 @@ extern struct SLineMatrixData LineMatrixData[240]; // We don't know how Sub(0, y) is handled. #define DRAW_PIXEL_H2x1(N, M) \ - if (Z1 > GFX.DB[Offset + 2 * N] && (M)) \ - { \ - GFX.S[Offset + 2 * N] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + 2 * N], GFX.SubZBuffer[Offset + 2 * N]); \ - GFX.S[Offset + 2 * N + 1] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N + 2]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ - GFX.DB[Offset + 2 * N] = GFX.DB[Offset + 2 * N + 1] = Z2; \ - } - -/* The logic above shifts everything one pixel to the left, thus producing a blank line on the right. The code below places the pixel on correct positions but - would incur two additional branches for the edges on every pixel. -*/ - -/* #define DRAW_PIXEL_H2x1(N, M) \ - if (Z1 > GFX.DB[Offset + 2 * N] && (M)) \ - { \ - GFX.S[Offset + 2 * N + 1] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + 2 * N], GFX.SubZBuffer[Offset + 2 * N]); \ - if ((Offset + 2 * N ) % GFX.RealPPL != (SNES_WIDTH - 1) << 1) \ - GFX.S[Offset + 2 * N + 2] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N + 2]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ - if ((Offset + 2 * N) % GFX.RealPPL == 0) \ - GFX.S[Offset + 2 * N] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ - GFX.DB[Offset + 2 * N] = GFX.DB[Offset + 2 * N + 1] = Z2; \ - } -*/ + if (Z1 > GFX.DB[Offset + 2 * N] && (M)) \ + { \ + GFX.S[Offset + 2 * N + 1] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + 2 * N], GFX.SubZBuffer[Offset + 2 * N]); \ + if ((OffsetInLine + 2 * N ) != (SNES_WIDTH - 1) << 1) \ + GFX.S[Offset + 2 * N + 2] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N + 2]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ + if ((OffsetInLine + 2 * N) == 0) \ + GFX.S[Offset + 2 * N] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ + GFX.DB[Offset + 2 * N] = GFX.DB[Offset + 2 * N + 1] = Z2; \ + } +#define OFFSET_IN_LINE \ + uint32 OffsetInLine = Offset % GFX.RealPPL; #define DRAW_PIXEL(N, M) DRAW_PIXEL_H2x1(N, M) #define NAME2 Hires @@ -1428,6 +1429,7 @@ extern struct SLineMatrixData LineMatrixData[240]; #undef NAME2 #undef DRAW_PIXEL +#undef OFFSET_IN_LINE // Interlace: Only draw every other line, so we'll redefine BPSTART and PITCH to do so. // Otherwise, it's the same as Normal2x1/Hires2x1. @@ -1440,6 +1442,7 @@ extern struct SLineMatrixData LineMatrixData[240]; #ifndef NO_INTERLACE +#define OFFSET_IN_LINE #define DRAW_PIXEL(N, M) DRAW_PIXEL_N2x1(N, M) #define NAME2 Interlace @@ -1449,7 +1452,10 @@ extern struct SLineMatrixData LineMatrixData[240]; #undef NAME2 #undef DRAW_PIXEL +#undef OFFSET_IN_LINE +#define OFFSET_IN_LINE \ + uint32 OffsetInLine = Offset % GFX.RealPPL; #define DRAW_PIXEL(N, M) DRAW_PIXEL_H2x1(N, M) #define NAME2 HiresInterlace @@ -1459,6 +1465,7 @@ extern struct SLineMatrixData LineMatrixData[240]; #undef NAME2 #undef DRAW_PIXEL +#undef OFFSET_IN_LINE #endif diff --git a/tile.h b/tile.h index 6c5ea0b6f649a475f0783437a8c548e5b4cc20ce..04b5075ecc6e040be4ec77985cee47e08b634d88 100644 --- a/tile.h +++ b/tile.h @@ -22,10 +22,12 @@ (c) Copyright 2006 - 2007 nitsuja - (c) Copyright 2009 - 2011 BearOso, + (c) Copyright 2009 - 2018 BearOso, OV2 - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2017 qwertymodo + + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given) @@ -122,6 +124,9 @@ Sound emulator code used in 1.52+ (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com) + S-SMP emulator code used in 1.54+ + (c) Copyright 2016 byuu + SH assembler code partly based on x86 assembler code (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) @@ -135,7 +140,7 @@ (c) Copyright 2006 - 2007 Shay Green GTK+ GUI code - (c) Copyright 2004 - 2011 BearOso + (c) Copyright 2004 - 2018 BearOso Win32 GUI code (c) Copyright 2003 - 2006 blip, @@ -143,14 +148,14 @@ Matthew Kendora, Nach, nitsuja - (c) Copyright 2009 - 2011 OV2 + (c) Copyright 2009 - 2018 OV2 Mac OS GUI code (c) Copyright 1998 - 2001 John Stiles (c) Copyright 2001 - 2011 zones Libretro port - (c) Copyright 2011 - 2016 Hans-Kristian Arntzen, + (c) Copyright 2011 - 2017 Hans-Kristian Arntzen, Daniel De Matteis (Under no circumstances will commercial rights be given)