diff options
author | João Silva | 2017-02-12 01:52:03 +0000 |
---|---|---|
committer | João Silva | 2017-02-12 01:52:03 +0000 |
commit | 3777d1fcf4232cde426f46b7ee5c374fd949b1b0 (patch) | |
tree | e76f38bc1bac83bab19daea51d63ed87236e047e /source | |
parent | b6006bc542f89ad1b7086268f851f0ba880ad6cd (diff) | |
download | snesemu-3777d1fcf4232cde426f46b7ee5c374fd949b1b0.tar.gz snesemu-3777d1fcf4232cde426f46b7ee5c374fd949b1b0.tar.bz2 snesemu-3777d1fcf4232cde426f46b7ee5c374fd949b1b0.zip |
Type fixes. Fixes from snes9x 1.50. Minor changes and optimizations.
Diffstat (limited to 'source')
42 files changed, 515 insertions, 1853 deletions
diff --git a/source/65c816.h b/source/65c816.h index f180037..1d8eb60 100644 --- a/source/65c816.h +++ b/source/65c816.h @@ -26,50 +26,47 @@ #define Negative 128 #define Emulation 256 -#define ClearCarry() (ICPU._Carry = 0) -#define SetCarry() (ICPU._Carry = 1) -#define SetZero() (ICPU._Zero = 0) -#define ClearZero() (ICPU._Zero = 1) -#define SetIRQ() (ICPU.Registers.PL |= IRQ) -#define ClearIRQ() (ICPU.Registers.PL &= ~IRQ) -#define SetDecimal() (ICPU.Registers.PL |= Decimal) -#define ClearDecimal() (ICPU.Registers.PL &= ~Decimal) -#define SetIndex() (ICPU.Registers.PL |= IndexFlag) -#define ClearIndex() (ICPU.Registers.PL &= ~IndexFlag) -#define SetMemory() (ICPU.Registers.PL |= MemoryFlag) -#define ClearMemory() (ICPU.Registers.PL &= ~MemoryFlag) -#define SetOverflow() (ICPU._Overflow = 1) -#define ClearOverflow() (ICPU._Overflow = 0) -#define SetNegative() (ICPU._Negative = 0x80) -#define ClearNegative() (ICPU._Negative = 0) +#define SetCarry() (ICPU._Carry = 1) +#define ClearCarry() (ICPU._Carry = 0) +#define SetZero() (ICPU._Zero = 0) +#define ClearZero() (ICPU._Zero = 1) +#define SetIRQ() (ICPU.Registers.PL |= IRQ) +#define ClearIRQ() (ICPU.Registers.PL &= ~IRQ) +#define SetDecimal() (ICPU.Registers.PL |= Decimal) +#define ClearDecimal() (ICPU.Registers.PL &= ~Decimal) +#define SetIndex() (ICPU.Registers.PL |= IndexFlag) +#define ClearIndex() (ICPU.Registers.PL &= ~IndexFlag) +#define SetMemory() (ICPU.Registers.PL |= MemoryFlag) +#define ClearMemory() (ICPU.Registers.PL &= ~MemoryFlag) +#define SetOverflow() (ICPU._Overflow = 1) +#define ClearOverflow() (ICPU._Overflow = 0) +#define SetNegative() (ICPU._Negative = 0x80) +#define ClearNegative() (ICPU._Negative = 0) -#define CheckZero() (ICPU._Zero == 0) -#define CheckCarry() (ICPU._Carry) -#define CheckIRQ() (ICPU.Registers.PL & IRQ) -#define CheckDecimal() (ICPU.Registers.PL & Decimal) -#define CheckIndex() (ICPU.Registers.PL & IndexFlag) -#define CheckMemory() (ICPU.Registers.PL & MemoryFlag) -#define CheckOverflow() (ICPU._Overflow) -#define CheckNegative() (ICPU._Negative & 0x80) +#define CheckCarry() (ICPU._Carry) +#define CheckZero() (ICPU._Zero == 0) +#define CheckIRQ() (ICPU.Registers.PL & IRQ) +#define CheckDecimal() (ICPU.Registers.PL & Decimal) +#define CheckIndex() (ICPU.Registers.PL & IndexFlag) +#define CheckMemory() (ICPU.Registers.PL & MemoryFlag) +#define CheckOverflow() (ICPU._Overflow) +#define CheckNegative() (ICPU._Negative & 0x80) #define CheckEmulation() (ICPU.Registers.P.W & Emulation) -#define ClearFlags(f) (ICPU.Registers.P.W &= ~(f)) -#define SetFlags(f) (ICPU.Registers.P.W |= (f)) -#define CheckFlag(f) (ICPU.Registers.PL & (f)) +#define SetFlags(f) (ICPU.Registers.P.W |= (f)) +#define ClearFlags(f) (ICPU.Registers.P.W &= ~(f)) +#define CheckFlag(f) (ICPU.Registers.PL & (f)) typedef union { -#ifdef MSB_FIRST struct { +#ifdef MSB_FIRST uint8_t h, l; - } B; #else - struct - { uint8_t l, h; - } B; #endif + } B; uint16_t W; } pair; diff --git a/source/apu.c b/source/apu.c index a28469d..521d9b3 100644 --- a/source/apu.c +++ b/source/apu.c @@ -77,7 +77,6 @@ void S9xResetAPU() for (i = 0; i < 3; i++) { APU.TimerEnabled [i] = false; - APU.TimerValueWritten [i] = 0; APU.TimerTarget [i] = 0; APU.Timer [i] = 0; } @@ -388,9 +387,9 @@ void S9xSetAPUControl(uint8_t byte) if ((APU.TimerTarget [2] = IAPU.RAM [0xfc]) == 0) APU.TimerTarget [2] = 0x100; } - APU.TimerEnabled [0] = byte & 1; - APU.TimerEnabled [1] = (byte & 2) >> 1; - APU.TimerEnabled [2] = (byte & 4) >> 2; + APU.TimerEnabled [0] = (bool) (byte & 1); + APU.TimerEnabled [1] = (bool) (byte & 2); + APU.TimerEnabled [2] = (bool) (byte & 4); if (byte & 0x10) IAPU.RAM [0xF4] = IAPU.RAM [0xF5] = 0; diff --git a/source/apu.h b/source/apu.h index bafeac9..57ff79d 100644 --- a/source/apu.h +++ b/source/apu.h @@ -47,21 +47,21 @@ typedef struct SAPU APU; SIAPU IAPU; -static inline void S9xAPUUnpackStatus(void) +static inline void S9xAPUUnpackStatus() { IAPU._Zero = ((IAPU.Registers.P & Zero) == 0) | (IAPU.Registers.P & Negative); IAPU._Carry = (IAPU.Registers.P & Carry); IAPU._Overflow = (IAPU.Registers.P & Overflow) >> 6; } -static inline void S9xAPUPackStatus(void) +static inline void S9xAPUPackStatus() { IAPU.Registers.P &= ~(Zero | Negative | Carry | Overflow); IAPU.Registers.P |= IAPU._Carry | ((IAPU._Zero == 0) << 1) | (IAPU._Zero & 0x80) | (IAPU._Overflow << 6); } -void S9xResetAPU(void); +void S9xResetAPU(); bool S9xInitAPU(); void S9xDeinitAPU(); void S9xDecacheSamples(); @@ -73,7 +73,7 @@ void S9xOpenCloseSoundTracingFile(bool); void S9xPrintAPUState(); extern uint16_t S9xAPUCycles [256]; // Scaled cycle lengths extern uint16_t S9xAPUCycleLengths [256]; // Raw data. -extern void (*S9xApuOpcodes [256])(void); +extern void (*S9xApuOpcodes [256])(); #define APU_VOL_LEFT 0x00 #define APU_VOL_RIGHT 0x01 diff --git a/source/apu_blargg.c b/source/apu_blargg.c index bbe02c9..abf982e 100644 --- a/source/apu_blargg.c +++ b/source/apu_blargg.c @@ -327,7 +327,7 @@ static INLINE void dsp_decode_brr( dsp_voice_t* v ) if ( (dsp_m.every_other_sample ^= 1) != 0 ) \ dsp_m.new_kon &= ~dsp_m.kon; /* clears KON 63 clocks after it was last read */ -static INLINE void dsp_misc_30 (void) +static INLINE void dsp_misc_30() { if ( dsp_m.every_other_sample ) { @@ -606,11 +606,11 @@ static void dsp_voice_V9_V6_V3( dsp_voice_t* const v ) ECHO_FIR( 0 ) [ch] = ECHO_FIR( 8 ) [ch] = s >> 1; \ } -static INLINE void dsp_echo_22 (void) +static INLINE void dsp_echo_22() { int32_t l, r; - if ( ++dsp_m.echo_hist_pos >= &dsp_m.echo_hist [ECHO_HIST_SIZE] ) + if (++dsp_m.echo_hist_pos >= &dsp_m.echo_hist [ECHO_HIST_SIZE]) dsp_m.echo_hist_pos = dsp_m.echo_hist; dsp_m.t_echo_ptr = (dsp_m.t_esa * 0x100 + dsp_m.echo_offset) & 0xFFFF; @@ -624,7 +624,7 @@ static INLINE void dsp_echo_22 (void) dsp_m.t_echo_in [1] = r; } -static INLINE void dsp_echo_23 (void) +static INLINE void dsp_echo_23() { int32_t l, r; @@ -637,7 +637,7 @@ static INLINE void dsp_echo_23 (void) ECHO_READ(1); } -static INLINE void dsp_echo_24 (void) +static INLINE void dsp_echo_24() { int32_t l, r; @@ -648,7 +648,7 @@ static INLINE void dsp_echo_24 (void) dsp_m.t_echo_in [1] += r; } -static INLINE void dsp_echo_25 (void) +static INLINE void dsp_echo_25() { int32_t l = dsp_m.t_echo_in [0] + (((dsp_m.echo_hist_pos [6 + 1]) [0] * (int8_t) dsp_m.regs [R_FIR + 6 * 0x10]) >> 6); int32_t r = dsp_m.t_echo_in [1] + (((dsp_m.echo_hist_pos [6 + 1]) [1] * (int8_t) dsp_m.regs [R_FIR + 6 * 0x10]) >> 6); @@ -674,7 +674,7 @@ static INLINE void dsp_echo_25 (void) CLAMP16( var ); \ } -static INLINE void dsp_echo_26 (void) +static INLINE void dsp_echo_26() { int32_t l, r; @@ -690,7 +690,7 @@ static INLINE void dsp_echo_26 (void) dsp_m.t_echo_out [1] = r & ~1; } -static INLINE void dsp_echo_27 (void) +static INLINE void dsp_echo_27() { int32_t l, r; int16_t *out; @@ -733,7 +733,7 @@ static INLINE void dsp_echo_27 (void) } \ dsp_m.t_echo_out [ch] = 0; -static INLINE void dsp_echo_29 (void) +static INLINE void dsp_echo_29() { dsp_m.t_esa = dsp_m.regs [R_ESA]; @@ -949,7 +949,7 @@ static void dsp_set_output( int16_t * out, int32_t size ) /* Setup */ -static void dsp_soft_reset_common (void) +static void dsp_soft_reset_common() { dsp_m.noise = 0x4000; dsp_m.echo_hist_pos = dsp_m.echo_hist; @@ -962,7 +962,7 @@ static void dsp_soft_reset_common (void) /* Resets DSP to power-on state */ -static void dsp_reset (void) +static void dsp_reset() { int32_t i; @@ -1009,7 +1009,7 @@ static void dsp_init( void* ram_64k ) /* Emulates pressing reset switch on SNES */ -static void dsp_soft_reset (void) +static void dsp_soft_reset() { dsp_m.regs[R_FLG] = 0xE0; dsp_soft_reset_common(); @@ -2576,7 +2576,6 @@ set_psw: { addr &= 0xFFFF; SET_PC( addr ); - /* dprintf( "SPC: PC wrapped around\n" ); */ goto loop; } } @@ -2670,7 +2669,7 @@ uint8_t * spc_apuram() /* Init */ -static void spc_reset_buffer(void) +static void spc_reset_buffer() { int16_t *out; /* Start with half extra buffer of silence */ @@ -2745,7 +2744,7 @@ static void spc_reset_common( int32_t timer_counter_init ) /* Resets SPC to power-on state. This resets your output buffer, so you must call set_output() after this. */ -static void spc_reset (void) +static void spc_reset() { m.cpu_regs.pc = 0xFFC0; m.cpu_regs.a = 0x00; @@ -2782,9 +2781,9 @@ static void spc_reset (void) /* Emulates pressing reset switch on SNES. This resets your output buffer, so you must call set_output() after this. */ -static void spc_soft_reset (void) +static void spc_soft_reset() { - spc_reset_common( 0 ); + spc_reset_common(0); dsp_soft_reset(); } @@ -2926,7 +2925,7 @@ static INLINE int32_t hermite (int32_t mu1, int32_t a, int32_t b, int32_t c, int return ((a0) + (a1) + (a2) + (a3)) >> 15; } -static void resampler_clear(void) +static void resampler_clear() { rb_start = 0; rb_size = 0; @@ -3073,7 +3072,7 @@ bool S9xMixSamples (int16_t *buffer, uint32_t sample_count) return (true); } -int32_t S9xGetSampleCount (void) +int32_t S9xGetSampleCount() { return AVAIL(); } @@ -3108,7 +3107,7 @@ static void spc_set_output( int16_t* out, int32_t size ) dsp_set_output( out, out_end - out ); } -void S9xFinalizeSamples (void) +void S9xFinalizeSamples() { bool ret; @@ -3126,13 +3125,13 @@ void S9xFinalizeSamples (void) spc_set_output(landing_buffer, buffer_size); } -void S9xClearSamples (void) +void S9xClearSamples() { resampler_clear(); lag = lag_master; } -bool S9xSyncSound (void) +bool S9xSyncSound() { if (!Settings.SoundSync || sound_in_sync) return true; @@ -3147,7 +3146,7 @@ void S9xSetSamplesAvailableCallback (apu_callback callback) sa_callback = callback; } -static void UpdatePlaybackRate (void) +static void UpdatePlaybackRate() { double time_ratio; if (Settings.SoundInputRate == 0) @@ -3179,8 +3178,6 @@ bool S9xInitSound (int32_t buffer_ms, int32_t lag_ms) buffer_size <<= 1; buffer_size <<= 1; - printf("Sound buffer size: %d (%d samples)\n", buffer_size, sample_count); - if (landing_buffer) free(landing_buffer); landing_buffer = (int16_t*)malloc(buffer_size * 2); @@ -3248,7 +3245,7 @@ static int8_t const reg_times_ [256] = 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, }; -bool S9xInitAPU (void) +bool S9xInitAPU() { int32_t i; @@ -3303,7 +3300,7 @@ bool S9xInitAPU (void) return true; } -void S9xDeinitAPU (void) +void S9xDeinitAPU() { if (resampler) { @@ -3338,7 +3335,7 @@ void S9xAPUSetReferenceTime (int32_t cpucycles) reference_time = cpucycles; } -void S9xAPUExecute (void) +void S9xAPUExecute() { /* Accumulate partial APU cycles */ spc_end_frame(S9X_APU_GET_CLOCK(CPU.Cycles)); @@ -3352,9 +3349,6 @@ void S9xAPUExecute (void) void S9xAPUTimingSetSpeedup (int32_t ticks) { - if (ticks != 0) - printf("APU speedup hack: %d\n", ticks); - timing_hack_denominator = TEMPO_UNIT - ticks; spc_set_tempo(timing_hack_denominator); @@ -3370,7 +3364,7 @@ void S9xAPUAllowTimeOverflow (bool allow) allow_time_overflow = allow; } -void S9xResetAPU (void) +void S9xResetAPU() { reference_time = 0; spc_remainder = 0; @@ -3383,7 +3377,7 @@ void S9xResetAPU (void) resampler_clear(); } -void S9xSoftResetAPU (void) +void S9xSoftResetAPU() { reference_time = 0; spc_remainder = 0; diff --git a/source/apu_blargg.h b/source/apu_blargg.h index 66c375f..00d9428 100644 --- a/source/apu_blargg.h +++ b/source/apu_blargg.h @@ -226,7 +226,7 @@ typedef struct } Timer; /* Support SNES_MEMORY_APURAM */ -uint8_t *spc_apuram (void); +uint8_t* spc_apuram(); typedef struct { @@ -276,31 +276,31 @@ typedef struct /* Number of samples written to output since last set */ #define SPC_SAMPLE_COUNT() ((m.extra_clocks >> 5) * 2) -typedef void (*apu_callback)(void); +typedef void (*apu_callback)(); #define SPC_SAVE_STATE_BLOCK_SIZE (STATE_SIZE + 8) -bool S9xInitAPU (void); -void S9xDeinitAPU (void); -void S9xResetAPU (void); -void S9xSoftResetAPU (void); -uint8_t S9xAPUReadPort (int32_t port); -void S9xAPUWritePort (int32_t port, uint8_t byte); -void S9xAPUExecute (void); -void S9xAPUSetReferenceTime (int32_t cpucycles); -void S9xAPUTimingSetSpeedup (int32_t ticks); -void S9xAPUAllowTimeOverflow (bool allow); -void S9xAPULoadState (const uint8_t * block); -void S9xAPUSaveState (uint8_t * block); - -bool S9xInitSound (int32_t buffer_ms, int32_t lag_ms); - -bool S9xSyncSound (void); -int32_t S9xGetSampleCount (void); -void S9xFinalizeSamples (void); -void S9xClearSamples (void); -bool S9xMixSamples (int16_t * buffer, uint32_t sample_count); -void S9xSetSamplesAvailableCallback (apu_callback); +bool S9xInitAPU(); +void S9xDeinitAPU(); +void S9xResetAPU(); +void S9xSoftResetAPU(); +uint8_t S9xAPUReadPort(int32_t port); +void S9xAPUWritePort(int32_t port, uint8_t byte); +void S9xAPUExecute(); +void S9xAPUSetReferenceTime(int32_t cpucycles); +void S9xAPUTimingSetSpeedup(int32_t ticks); +void S9xAPUAllowTimeOverflow(bool allow); +void S9xAPULoadState(const uint8_t * block); +void S9xAPUSaveState(uint8_t * block); + +bool S9xInitSound(int32_t buffer_ms, int32_t lag_ms); + +bool S9xSyncSound(); +int32_t S9xGetSampleCount(); +void S9xFinalizeSamples(); +void S9xClearSamples(); +bool S9xMixSamples(int16_t * buffer, uint32_t sample_count); +void S9xSetSamplesAvailableCallback(apu_callback); #endif // APU_BLARGG_H diff --git a/source/cheats.c b/source/cheats.c index b394032..5856769 100644 --- a/source/cheats.c +++ b/source/cheats.c @@ -34,8 +34,7 @@ const char* S9xProActionReplayToRaw(const char* code, uint32_t* address, return (NULL); } -const char* S9xGoldFingerToRaw(const char* code, uint32_t* address, bool* sram, - uint8_t* num_bytes, uint8_t bytes[3]) +const char* S9xGoldFingerToRaw(const char* code, uint32_t* address, bool* sram, uint8_t* num_bytes, uint8_t bytes[3]) { char tmp [15]; if (strlen(code) != 14) @@ -65,8 +64,7 @@ const char* S9xGameGenieToRaw(const char* code, uint32_t* address, uint8_t* byte { char new_code [12]; - if (strlen(code) != 9 || *(code + 4) != '-' || !S9xAllHex(code, 4) || - !S9xAllHex(code + 5, 4)) + if (strlen(code) != 9 || *(code + 4) != '-' || !S9xAllHex(code, 4) || !S9xAllHex(code + 5, 4)) return ("Invalid Game Genie(tm) code - should be 'xxxx-xxxx'."); strcpy(new_code, "0x"); @@ -104,7 +102,7 @@ const char* S9xGameGenieToRaw(const char* code, uint32_t* address, uint8_t* byte ((data & 0x0f0000) >> 12) + ((data & 0x0003c0) >> 6); - return (NULL); + return NULL; } void S9xStartCheatSearch(SCheatData* d) diff --git a/source/cheats.h b/source/cheats.h index a4a5ba7..6c3c093 100644 --- a/source/cheats.h +++ b/source/cheats.h @@ -44,33 +44,28 @@ typedef enum S9X_8_BITS, S9X_16_BITS, S9X_24_BITS, S9X_32_BITS } S9xCheatDataSize; -void S9xInitCheatData (); +void S9xInitCheatData(); -const char *S9xGameGenieToRaw (const char *code, uint32_t *address, uint8_t *byte); -const char *S9xProActionReplayToRaw (const char *code, uint32_t *address, uint8_t *byte); -const char *S9xGoldFingerToRaw (const char *code, uint32_t *address, bool *sram, - uint8_t *num_bytes, uint8_t bytes[3]); -void S9xApplyCheats(void); -void S9xApplyCheat (uint32_t which1); -void S9xRemoveCheats (); -void S9xRemoveCheat (uint32_t which1); -void S9xEnableCheat (uint32_t which1); -void S9xDisableCheat (uint32_t which1); -void S9xDisableAllCheat(void); -void S9xAddCheat (bool enable, bool save_current_value, uint32_t address, - uint8_t byte); -void S9xDeleteCheats(void); -void S9xDeleteCheat (uint32_t which1); -bool S9xLoadCheatFile (const char *filename); -bool S9xSaveCheatFile (const char *filename); +const char *S9xGameGenieToRaw(const char *code, uint32_t *address, uint8_t *byte); +const char *S9xProActionReplayToRaw(const char *code, uint32_t *address, uint8_t *byte); +const char *S9xGoldFingerToRaw(const char *code, uint32_t *address, bool *sram, uint8_t *num_bytes, uint8_t bytes[3]); +void S9xApplyCheats(); +void S9xApplyCheat(uint32_t which1); +void S9xRemoveCheats(); +void S9xRemoveCheat(uint32_t which1); +void S9xEnableCheat(uint32_t which1); +void S9xDisableCheat(uint32_t which1); +void S9xDisableAllCheat(); +void S9xAddCheat(bool enable, bool save_current_value, uint32_t address, uint8_t byte); +void S9xDeleteCheats(); +void S9xDeleteCheat(uint32_t which1); +bool S9xLoadCheatFile(const char *filename); +bool S9xSaveCheatFile(const char *filename); -void S9xStartCheatSearch (SCheatData *cheats); -void S9xSearchForChange (SCheatData *cheats, S9xCheatComparisonType cmp, - S9xCheatDataSize size, bool is_signed, bool update); -void S9xSearchForValue (SCheatData *cheats, S9xCheatComparisonType cmp, - S9xCheatDataSize size, uint32_t value, - bool is_signed, bool update); -void S9xOutputCheatSearchResults (SCheatData *cheats); +void S9xStartCheatSearch(SCheatData *cheats); +void S9xSearchForChange(SCheatData *cheats, S9xCheatComparisonType cmp, S9xCheatDataSize size, bool is_signed, bool update); +void S9xSearchForValue(SCheatData *cheats, S9xCheatComparisonType cmp, S9xCheatDataSize size, uint32_t value, bool is_signed, bool update); +void S9xOutputCheatSearchResults(SCheatData *cheats); #endif diff --git a/source/cpu.c b/source/cpu.c index e702670..15206c5 100644 --- a/source/cpu.c +++ b/source/cpu.c @@ -7,6 +7,7 @@ #include "cpuexec.h" #include "apu.h" #include "dma.h" +#include "fxemu.h" #include "sa1.h" #include "cheats.h" #include "srtc.h" @@ -14,8 +15,6 @@ #include "spc7110.h" #include "obc1.h" -#include "fxemu.h" - extern struct FxInit_s SuperFX; void S9xResetSuperFX() @@ -27,11 +26,11 @@ void S9xResetSuperFX() void S9xResetCPU() { ICPU.Registers.PB = 0; - ICPU.Registers.PC = S9xGetWord(0xFFFC); + ICPU.Registers.PC = S9xGetWord(0xfffc); ICPU.Registers.D.W = 0; ICPU.Registers.DB = 0; ICPU.Registers.SH = 1; - ICPU.Registers.SL = 0xFF; + ICPU.Registers.SL = 0xff; ICPU.Registers.XH = 0; ICPU.Registers.YH = 0; ICPU.Registers.P.W = 0; @@ -52,13 +51,12 @@ void S9xResetCPU() CPU.PCBase = NULL; CPU.PCAtOpcodeStart = NULL; CPU.WaitAddress = NULL; - CPU.WaitCounter = 0; - CPU.Cycles = 0; + CPU.WaitCounter = 1; + CPU.Cycles = 188; // This is the cycle count just after the jump to the Reset Vector. CPU.NextEvent = Settings.HBlankStart; CPU.V_Counter = 0; CPU.MemSpeed = SLOW_ONE_CYCLE; CPU.MemSpeedx2 = SLOW_ONE_CYCLE * 2; - CPU.FastROMSpeed = SLOW_ONE_CYCLE; CPU.AutoSaveTimer = 0; CPU.SRAMModified = false; CPU.BRKTriggered = false; @@ -72,7 +70,7 @@ void S9xResetCPU() S9xUnpackStatus(); } -static void CommonS9xReset(void) +static void CommonS9xReset() { if (Settings.SuperFX) S9xResetSuperFX(); @@ -101,14 +99,14 @@ static void CommonS9xReset(void) #endif } -void S9xReset(void) +void S9xReset() { CommonS9xReset(); S9xResetPPU(); memset(Memory.RAM, 0x55, 0x20000); } -void S9xSoftReset(void) +void S9xSoftReset() { CommonS9xReset(); S9xSoftResetPPU(); diff --git a/source/cpuexec.c b/source/cpuexec.c index c834adf..d7151be 100644 --- a/source/cpuexec.c +++ b/source/cpuexec.c @@ -13,10 +13,10 @@ #include "sa1.h" #include "spc7110.h" -void S9xMainLoop_SA1_SFX(void); -void S9xMainLoop_SA1_NoSFX(void); -void S9xMainLoop_NoSA1_SFX(void); -void S9xMainLoop_NoSA1_NoSFX(void); +void S9xMainLoop_SA1_SFX(); +void S9xMainLoop_SA1_NoSFX(); +void S9xMainLoop_NoSA1_SFX(); +void S9xMainLoop_NoSA1_NoSFX(); /* * This is a CATSFC modification inspired by a Snes9x-Euphoria modification. @@ -27,7 +27,7 @@ void S9xMainLoop_NoSA1_NoSFX(void); * to propagate modifications to the SA1_NoSFX, NoSA1_SFX and NoSA1_NoSFX * versions. */ -void S9xMainLoop(void) +void S9xMainLoop() { if (Settings.SA1) { @@ -41,7 +41,7 @@ void S9xMainLoop(void) } } -void S9xMainLoop_SA1_SFX(void) +void S9xMainLoop_SA1_SFX() { for (;;) { @@ -56,7 +56,7 @@ void S9xMainLoop_SA1_SFX(void) if (CPU.WaitingForInterrupt) { CPU.WaitingForInterrupt = false; - ++CPU.PC; + CPU.PC++; } S9xOpcode_NMI(); } @@ -69,7 +69,7 @@ void S9xMainLoop_SA1_SFX(void) if (CPU.WaitingForInterrupt) { CPU.WaitingForInterrupt = false; - ++CPU.PC; + CPU.PC++; } if (CPU.IRQActive && !Settings.DisableIRQ) { @@ -79,13 +79,9 @@ void S9xMainLoop_SA1_SFX(void) else CPU.Flags &= ~IRQ_PENDING_FLAG; } - else - { - if (--CPU.IRQCycleCount == 0 && CheckFlag(IRQ)) - CPU.IRQCycleCount = 1; - } + else if (--CPU.IRQCycleCount == 0 && CheckFlag(IRQ)) + CPU.IRQCycleCount = 1; } - if (CPU.Flags & SCAN_KEYS_FLAG) break; } @@ -94,7 +90,6 @@ void S9xMainLoop_SA1_SFX(void) CPU.PCAtOpcodeStart = CPU.PC; #endif CPU.Cycles += CPU.MemSpeed; - (*ICPU.S9xOpcodes [*CPU.PC++].S9xOpcode)(); if (SA1.Executing) @@ -110,18 +105,9 @@ void S9xMainLoop_SA1_SFX(void) #endif if (CPU.Flags & SCAN_KEYS_FLAG) CPU.Flags &= ~SCAN_KEYS_FLAG; - -#ifdef DETECT_NASTY_FX_INTERLEAVE - if (CPU.BRKTriggered && Settings.SuperFX && !CPU.TriedInterleavedMode2) - { - CPU.TriedInterleavedMode2 = true; - CPU.BRKTriggered = false; - S9xDeinterleaveMode2(); - } -#endif } -void S9xMainLoop_SA1_NoSFX(void) +void S9xMainLoop_SA1_NoSFX() { for (;;) { @@ -159,13 +145,9 @@ void S9xMainLoop_SA1_NoSFX(void) else CPU.Flags &= ~IRQ_PENDING_FLAG; } - else - { - if (--CPU.IRQCycleCount == 0 && CheckFlag(IRQ)) - CPU.IRQCycleCount = 1; - } + else if (--CPU.IRQCycleCount == 0 && CheckFlag(IRQ)) + CPU.IRQCycleCount = 1; } - if (CPU.Flags & SCAN_KEYS_FLAG) break; } @@ -174,7 +156,6 @@ void S9xMainLoop_SA1_NoSFX(void) CPU.PCAtOpcodeStart = CPU.PC; #endif CPU.Cycles += CPU.MemSpeed; - (*ICPU.S9xOpcodes [*CPU.PC++].S9xOpcode)(); if (SA1.Executing) @@ -192,7 +173,7 @@ void S9xMainLoop_SA1_NoSFX(void) CPU.Flags &= ~SCAN_KEYS_FLAG; } -void S9xMainLoop_NoSA1_SFX(void) +void S9xMainLoop_NoSA1_SFX() { for (;;) { @@ -207,7 +188,7 @@ void S9xMainLoop_NoSA1_SFX(void) if (CPU.WaitingForInterrupt) { CPU.WaitingForInterrupt = false; - ++CPU.PC; + CPU.PC++; } S9xOpcode_NMI(); } @@ -220,7 +201,7 @@ void S9xMainLoop_NoSA1_SFX(void) if (CPU.WaitingForInterrupt) { CPU.WaitingForInterrupt = false; - ++CPU.PC; + CPU.PC++; } if (CPU.IRQActive && !Settings.DisableIRQ) { @@ -230,13 +211,9 @@ void S9xMainLoop_NoSA1_SFX(void) else CPU.Flags &= ~IRQ_PENDING_FLAG; } - else - { - if (--CPU.IRQCycleCount == 0 && CheckFlag(IRQ)) - CPU.IRQCycleCount = 1; - } + else if (--CPU.IRQCycleCount == 0 && CheckFlag(IRQ)) + CPU.IRQCycleCount = 1; } - if (CPU.Flags & SCAN_KEYS_FLAG) break; } @@ -245,9 +222,7 @@ void S9xMainLoop_NoSA1_SFX(void) CPU.PCAtOpcodeStart = CPU.PC; #endif CPU.Cycles += CPU.MemSpeed; - (*ICPU.S9xOpcodes [*CPU.PC++].S9xOpcode)(); - DO_HBLANK_CHECK_SFX(); } @@ -259,18 +234,9 @@ void S9xMainLoop_NoSA1_SFX(void) #endif if (CPU.Flags & SCAN_KEYS_FLAG) CPU.Flags &= ~SCAN_KEYS_FLAG; - -#ifdef DETECT_NASTY_FX_INTERLEAVE - if (CPU.BRKTriggered && Settings.SuperFX && !CPU.TriedInterleavedMode2) - { - CPU.TriedInterleavedMode2 = true; - CPU.BRKTriggered = false; - S9xDeinterleaveMode2(); - } -#endif } -void S9xMainLoop_NoSA1_NoSFX(void) +void S9xMainLoop_NoSA1_NoSFX() { for (;;) { @@ -308,13 +274,9 @@ void S9xMainLoop_NoSA1_NoSFX(void) else CPU.Flags &= ~IRQ_PENDING_FLAG; } - else - { - if (--CPU.IRQCycleCount == 0 && CheckFlag(IRQ)) - CPU.IRQCycleCount = 1; - } + else if (--CPU.IRQCycleCount == 0 && CheckFlag(IRQ)) + CPU.IRQCycleCount = 1; } - if (CPU.Flags & SCAN_KEYS_FLAG) break; } @@ -323,9 +285,7 @@ void S9xMainLoop_NoSA1_NoSFX(void) CPU.PCAtOpcodeStart = CPU.PC; #endif CPU.Cycles += CPU.MemSpeed; - (*ICPU.S9xOpcodes [*CPU.PC++].S9xOpcode)(); - DO_HBLANK_CHECK_NoSFX(); } @@ -396,8 +356,7 @@ void S9xDoHBlankProcessing_SFX() CPU.NextEvent = -1; ICPU.Scanline++; - if (++CPU.V_Counter >= (Settings.PAL ? SNES_MAX_PAL_VCOUNTER : - SNES_MAX_NTSC_VCOUNTER)) + if (++CPU.V_Counter >= (Settings.PAL ? SNES_MAX_PAL_VCOUNTER : SNES_MAX_NTSC_VCOUNTER)) { CPU.V_Counter = 0; Memory.FillRAM[0x213F] ^= 0x80; diff --git a/source/cpuexec.h b/source/cpuexec.h index c4342be..6d738dd 100644 --- a/source/cpuexec.h +++ b/source/cpuexec.h @@ -6,9 +6,9 @@ typedef struct { #ifdef __WIN32__ - void (__cdecl* S9xOpcode)(void); + void (__cdecl* S9xOpcode)(); #else - void (*S9xOpcode)(void); + void (*S9xOpcode)(); #endif } SOpcodes; @@ -41,9 +41,9 @@ typedef struct uint32_t FrameAdvanceCount; } SICPU; -void S9xMainLoop(void); -void S9xReset(void); -void S9xSoftReset(void); +void S9xMainLoop(); +void S9xReset(); +void S9xSoftReset(); void S9xDoHBlankProcessing_SFX(); void S9xDoHBlankProcessing_NoSFX(); void S9xClearIRQ(uint32_t); @@ -68,8 +68,7 @@ static inline void S9xUnpackStatus() static inline void S9xPackStatus() { ICPU.Registers.PL &= ~(Zero | Negative | Carry | Overflow); - ICPU.Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | - (ICPU._Negative & 0x80) | (ICPU._Overflow << 6); + ICPU.Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | (ICPU._Negative & 0x80) | (ICPU._Overflow << 6); } static inline void CLEAR_IRQ_SOURCE(uint32_t M) @@ -104,8 +103,7 @@ static inline void S9xReschedule() uint8_t which; int32_t max; - if (CPU.WhichEvent == HBLANK_START_EVENT || - CPU.WhichEvent == HTIMER_AFTER_EVENT) + if (CPU.WhichEvent == HBLANK_START_EVENT || CPU.WhichEvent == HTIMER_AFTER_EVENT) { which = HBLANK_END_EVENT; max = Settings.H_Max; diff --git a/source/display.h b/source/display.h index cee60bb..44e0900 100644 --- a/source/display.h +++ b/source/display.h @@ -8,7 +8,7 @@ uint32_t S9xReadJoypad(int32_t port); bool S9xReadMousePosition(int32_t which1_0_to_1, int32_t* x, int32_t* y, uint32_t* buttons); bool S9xReadSuperScopePosition(int32_t* x, int32_t* y, uint32_t* buttons); -void S9xInitDisplay(void); +void S9xInitDisplay(); void S9xDeinitDisplay(); void S9xToggleSoundChannel(int32_t channel); void S9xSetInfoString(const char* string); diff --git a/source/dma.c b/source/dma.c index 3800c70..e943975 100644 --- a/source/dma.c +++ b/source/dma.c @@ -59,7 +59,7 @@ void S9xDoDMA(uint8_t Channel) int32_t inc = d->AAddressFixed ? 0 : (!d->AAddressDecrement ? 1 : -1); - if ((d->ABank == 0x7E || d->ABank == 0x7F) && d->BAddress == 0x80) + if ((d->ABank == 0x7E || d->ABank == 0x7F) && d->BAddress == 0x80 && !d->TransferDirection) { d->AAddress += d->TransferBytes; //does an invalid DMA actually take time? @@ -301,9 +301,7 @@ void S9xDoDMA(uint8_t Channel) while (--count > 0); break; case 0x18: -#ifndef CORRECT_VRAM_READS IPPU.FirstVRAMRead = true; -#endif if (!PPU.VMA.FullGraphicCount) { do @@ -326,9 +324,7 @@ void S9xDoDMA(uint8_t Channel) } break; case 0x19: -#ifndef CORRECT_VRAM_READS IPPU.FirstVRAMRead = true; -#endif if (!PPU.VMA.FullGraphicCount) { do @@ -384,9 +380,7 @@ void S9xDoDMA(uint8_t Channel) if (d->BAddress == 0x18) { // Write to V-RAM -#ifndef CORRECT_VRAM_READS IPPU.FirstVRAMRead = true; -#endif if (!PPU.VMA.FullGraphicCount) { while (count > 1) @@ -632,8 +626,6 @@ update_address: d->TransferBytes = 0; CPU.InDMA = false; - - } void S9xStartHDMA() @@ -767,15 +759,6 @@ uint8_t S9xDoHDMA(uint8_t byte) continue; } - if (p->BAddress == 0x04) - { - if (SNESGameFixes.Uniracers) - { - PPU.OAMAddr = 0x10c; - PPU.OAMFlip = 0; - } - } - switch (p->TransferMode) { case 0: @@ -881,18 +864,12 @@ void S9xResetDMA() DMA [d].HDMAIndirectAddressing = false; DMA [d].AAddressFixed = true; DMA [d].AAddressDecrement = false; - DMA [d].TransferMode = 0xff; + DMA [d].TransferMode = 7; DMA [d].ABank = 0xff; DMA [d].AAddress = 0xffff; DMA [d].Address = 0xffff; DMA [d].BAddress = 0xff; DMA [d].TransferBytes = 0xffff; - } - for (c = 0x4300; c < 0x4380; c += 0x10) - { - for (d = c; d < c + 12; d++) - Memory.FillRAM [d] = 0xff; - - Memory.FillRAM [c + 0xf] = 0xff; + DMA [d].IndirectAddress = 0xffff; } } diff --git a/source/dma.h b/source/dma.h index c93ce64..7782ee2 100644 --- a/source/dma.h +++ b/source/dma.h @@ -3,7 +3,7 @@ #ifndef _DMA_H_ #define _DMA_H_ -void S9xResetDMA(void); +void S9xResetDMA(); uint8_t S9xDoHDMA(uint8_t); void S9xStartHDMA(); void S9xDoDMA(uint8_t); diff --git a/source/dsp1.c b/source/dsp1.c index 42f20c8..5d4d522 100644 --- a/source/dsp1.c +++ b/source/dsp1.c @@ -12,21 +12,8 @@ void (*SetDSP)(uint8_t, uint16_t) = &DSP1SetByte; uint8_t(*GetDSP)(uint16_t) = &DSP1GetByte; -void S9xInitDSP1() -{ - static bool init = false; - - if (!init) - { - InitDSP(); - init = true; - } -} - void S9xResetDSP1() { - S9xInitDSP1(); - DSP1.waiting4command = true; DSP1.in_count = 0; DSP1.out_count = 0; @@ -67,136 +54,89 @@ void DSP1SetByte(uint8_t byte, uint16_t address) // Mario Kart uses 0x00, 0x02, 0x06, 0x0c, 0x28, 0x0a switch (byte) { - case 0x00: - DSP1.in_count = 2; - break; - case 0x30: - case 0x10: - DSP1.in_count = 2; - break; - case 0x20: - DSP1.in_count = 2; - break; - case 0x24: - case 0x04: - DSP1.in_count = 2; - break; - case 0x08: - DSP1.in_count = 3; - break; - case 0x18: - DSP1.in_count = 4; - break; - case 0x28: - DSP1.in_count = 3; - break; - case 0x38: - DSP1.in_count = 4; - break; - case 0x2c: - case 0x0c: - DSP1.in_count = 3; - break; - case 0x3c: - case 0x1c: - DSP1.in_count = 6; - break; - case 0x32: - case 0x22: - case 0x12: - case 0x02: - DSP1.in_count = 7; - break; + case 0x07: case 0x0a: + case 0x0f: + case 0x1f: + case 0x27: + case 0x2f: DSP1.in_count = 1; break; - case 0x3a: - case 0x2a: - case 0x1a: - DSP1. command = 0x1a; - DSP1.in_count = 1; - break; - case 0x16: - case 0x26: - case 0x36: - case 0x06: - DSP1.in_count = 3; - break; + case 0x00: + case 0x04: + case 0x0e: + case 0x10: case 0x1e: + case 0x20: + case 0x24: case 0x2e: + case 0x30: case 0x3e: - case 0x0e: DSP1.in_count = 2; break; - case 0x05: - case 0x35: - case 0x31: - case 0x01: - DSP1.in_count = 4; - break; - case 0x15: - case 0x11: - DSP1.in_count = 4; - break; - case 0x25: - case 0x21: - DSP1.in_count = 4; - break; + case 0x03: + case 0x06: + case 0x08: case 0x09: - case 0x39: - case 0x3d: + case 0x0b: + case 0x0c: case 0x0d: - DSP1.in_count = 3; - break; + case 0x13: + case 0x16: case 0x19: + case 0x1b: case 0x1d: - DSP1.in_count = 3; - break; + case 0x23: + case 0x26: + case 0x28: case 0x29: + case 0x2b: + case 0x2c: case 0x2d: - DSP1.in_count = 3; - break; case 0x33: - case 0x03: - DSP1.in_count = 3; - break; - case 0x13: - DSP1.in_count = 3; - break; - case 0x23: - DSP1.in_count = 3; - break; + case 0x36: + case 0x39: case 0x3b: - case 0x0b: - DSP1.in_count = 3; - break; - case 0x1b: + case 0x3d: DSP1.in_count = 3; break; - case 0x2b: - DSP1.in_count = 3; + case 0x01: + case 0x05: + case 0x11: + case 0x15: + case 0x18: + case 0x21: + case 0x25: + case 0x31: + case 0x35: + case 0x38: + DSP1.in_count = 4; break; - case 0x34: case 0x14: + case 0x1c: + case 0x34: + case 0x3c: DSP1.in_count = 6; break; - case 0x07: - case 0x0f: - DSP1.in_count = 1; + case 0x02: + case 0x12: + case 0x22: + case 0x32: + DSP1.in_count = 7; break; - case 0x27: - case 0x2F: + case 0x3a: + case 0x2a: + case 0x1a: + DSP1.command = 0x1a; DSP1.in_count = 1; break; case 0x17: case 0x37: case 0x3F: DSP1.command = 0x1f; - case 0x1f: DSP1.in_count = 1; break; default: - case 0x80: DSP1.in_count = 0; DSP1.waiting4command = true; DSP1.first_parameter = true; @@ -211,17 +151,12 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.in_index++; } - if (DSP1.waiting4command || - (DSP1.first_parameter && byte == 0x80)) + if (DSP1.waiting4command || (DSP1.first_parameter && byte == 0x80)) { DSP1.waiting4command = true; DSP1.first_parameter = false; } - else if (DSP1.first_parameter && (DSP1.in_count != 0 || (DSP1.in_count == 0 - && DSP1.in_index == 0))) - { - } - else + else if (!(DSP1.first_parameter && (DSP1.in_count != 0 || (DSP1.in_count == 0 && DSP1.in_index == 0)))) { if (DSP1.in_count) { @@ -245,7 +180,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = Op00Result & 0xFF; DSP1.output [1] = (Op00Result >> 8) & 0xFF; break; - case 0x20: // Multiple Op20Multiplicand = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op20Multiplier = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); @@ -256,7 +190,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = Op20Result & 0xFF; DSP1.output [1] = (Op20Result >> 8) & 0xFF; break; - case 0x30: case 0x10: // Inverse Op10Coefficient = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -270,7 +203,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [2] = (uint8_t)(((int16_t) Op10ExponentR) & 0xff); DSP1.output [3] = (uint8_t)((((int16_t) Op10ExponentR) >> 8) & 0xff); break; - case 0x24: case 0x04: // Sin and Cos of angle Op04Angle = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -284,7 +216,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [2] = (uint8_t)(Op04Cos & 0xFF); DSP1.output [3] = (uint8_t)((Op04Cos >> 8) & 0xFF); break; - case 0x08: // Radius Op08X = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op08Y = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); @@ -298,9 +229,7 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [2] = (uint8_t)(((int16_t) Op08Lh) & 0xFF); DSP1.output [3] = (uint8_t)((((int16_t) Op08Lh) >> 8) & 0xFF); break; - case 0x18: // Range - Op18X = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op18Y = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); Op18Z = (int16_t)(DSP1.parameters [4] | (DSP1.parameters[5] << 8)); @@ -312,7 +241,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = (uint8_t)(Op18D & 0xFF); DSP1.output [1] = (uint8_t)((Op18D >> 8) & 0xFF); break; - case 0x38: // Range Op38X = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op38Y = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); @@ -325,7 +253,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = (uint8_t)(Op38D & 0xFF); DSP1.output [1] = (uint8_t)((Op38D >> 8) & 0xFF); break; - case 0x28: // Distance (vector length) Op28X = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op28Y = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); @@ -337,7 +264,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = (uint8_t)(Op28R & 0xFF); DSP1.output [1] = (uint8_t)((Op28R >> 8) & 0xFF); break; - case 0x2c: case 0x0c: // Rotate (2D rotate) Op0CA = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -352,7 +278,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [2] = (uint8_t)(Op0CY2 & 0xFF); DSP1.output [3] = (uint8_t)((Op0CY2 >> 8) & 0xFF); break; - case 0x3c: case 0x1c: // Polar (3D rotate) Op1CZ = (DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -373,7 +298,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op1CZAR & 0xFF); DSP1.output [5] = (uint8_t)((Op1CZAR >> 8) & 0xFF); break; - case 0x32: case 0x22: case 0x12: @@ -398,7 +322,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [6] = (uint8_t)(Op02CY & 0xFF); DSP1.output [7] = (uint8_t)((Op02CY >> 8) & 0xFF); break; - case 0x3a: //1a Mirror case 0x2a: //1a Mirror case 0x1a: // Raster mode 7 matrix data @@ -418,7 +341,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [7] = (uint8_t)((Op0AD >> 8) & 0xFF); DSP1.in_index = 0; break; - case 0x16: case 0x26: case 0x36: @@ -437,7 +359,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op06S & 0xFF); DSP1.output [5] = (uint8_t)((Op06S >> 8) & 0xFF); break; - case 0x1e: case 0x2e: case 0x3e: @@ -453,7 +374,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [2] = (uint8_t)(Op0EY & 0xFF); DSP1.output [3] = (uint8_t)((Op0EY >> 8) & 0xFF); break; - // Extra commands used by Pilot Wings case 0x05: case 0x35: @@ -466,7 +386,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSPOp01(); break; - case 0x15: case 0x11: // Set attitude matrix B Op11m = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -476,7 +395,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSPOp11(); break; - case 0x25: case 0x21: // Set attitude matrix C Op21m = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -486,7 +404,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSPOp21(); break; - case 0x09: case 0x39: case 0x3d: @@ -505,7 +422,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op0DU & 0xFF); DSP1.output [5] = (uint8_t)((Op0DU >> 8) & 0xFF); break; - case 0x19: case 0x1d: // Objective matrix B Op1DX = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -522,7 +438,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op1DU & 0xFF); DSP1.output [5] = (uint8_t)((Op1DU >> 8) & 0xFF); break; - case 0x29: case 0x2d: // Objective matrix C Op2DX = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -539,7 +454,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op2DU & 0xFF); DSP1.output [5] = (uint8_t)((Op2DU >> 8) & 0xFF); break; - case 0x33: case 0x03: // Subjective matrix A Op03F = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -556,7 +470,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op03Z & 0xFF); DSP1.output [5] = (uint8_t)((Op03Z >> 8) & 0xFF); break; - case 0x13: // Subjective matrix B Op13F = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op13L = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); @@ -572,7 +485,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op13Z & 0xFF); DSP1.output [5] = (uint8_t)((Op13Z >> 8) & 0xFF); break; - case 0x23: // Subjective matrix C Op23F = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op23L = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); @@ -588,7 +500,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op23Z & 0xFF); DSP1.output [5] = (uint8_t)((Op23Z >> 8) & 0xFF); break; - case 0x3b: case 0x0b: Op0BX = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -601,7 +512,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = (uint8_t)(Op0BS & 0xFF); DSP1.output [1] = (uint8_t)((Op0BS >> 8) & 0xFF); break; - case 0x1b: Op1BX = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op1BY = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); @@ -613,7 +523,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = (uint8_t)(Op1BS & 0xFF); DSP1.output [1] = (uint8_t)((Op1BS >> 8) & 0xFF); break; - case 0x2b: Op2BX = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); Op2BY = (int16_t)(DSP1.parameters [2] | (DSP1.parameters[3] << 8)); @@ -625,7 +534,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = (uint8_t)(Op2BS & 0xFF); DSP1.output [1] = (uint8_t)((Op2BS >> 8) & 0xFF); break; - case 0x34: case 0x14: Op14Zr = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -645,7 +553,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [4] = (uint8_t)(Op14Yrr & 0xFF); DSP1.output [5] = (uint8_t)((Op14Yrr >> 8) & 0xFF); break; - case 0x27: case 0x2F: Op2FUnknown = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -656,8 +563,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = (uint8_t)(Op2FSize & 0xFF); DSP1.output [1] = (uint8_t)((Op2FSize >> 8) & 0xFF); break; - - case 0x07: case 0x0F: Op0FRamsize = (int16_t)(DSP1.parameters [0] | (DSP1.parameters[1] << 8)); @@ -668,7 +573,6 @@ void DSP1SetByte(uint8_t byte, uint16_t address) DSP1.output [0] = (uint8_t)(Op0FPass & 0xFF); DSP1.output [1] = (uint8_t)((Op0FPass >> 8) & 0xFF); break; - default: break; } @@ -681,8 +585,7 @@ void DSP1SetByte(uint8_t byte, uint16_t address) uint8_t DSP1GetByte(uint16_t address) { uint8_t t; - if ((address & 0xf000) == 0x6000 || - (address & 0x7fff) < 0x4000) + if ((address & 0xf000) == 0x6000 || (address & 0x7fff) < 0x4000) { if (DSP1.out_count) { @@ -715,11 +618,10 @@ uint8_t DSP1GetByte(uint16_t address) DSP1.waiting4command = true; } else - { t = 0xff; - } } - else t = 0x80; + else + t = 0x80; return t; } @@ -735,28 +637,22 @@ void DSP2SetByte(uint8_t byte, uint16_t address) DSP1.waiting4command = false; switch (byte) { - case 0x01: - DSP1.in_count = 32; + default: + DSP1.in_count = 0; break; case 0x03: - DSP1.in_count = 1; - break; case 0x05: - DSP1.in_count = 1; - break; - case 0x09: - DSP1.in_count = 4; - break; case 0x06: DSP1.in_count = 1; break; - case 0x0D: + case 0x0d: DSP1.in_count = 2; break; - default: - printf("Op%02X\n", byte); - case 0x0f: - DSP1.in_count = 0; + case 0x09: + DSP1.in_count = 4; + break; + case 0x01: + DSP1.in_count = 32; break; } } @@ -863,8 +759,7 @@ void DSP2SetByte(uint8_t byte, uint16_t address) uint8_t DSP2GetByte(uint16_t address) { uint8_t t; - if ((address & 0xf000) == 0x6000 || - (address >= 0x8000 && address < 0xc000)) + if ((address & 0xf000) == 0x6000 || (address >= 0x8000 && address < 0xc000)) { if (DSP1.out_count) { @@ -876,253 +771,11 @@ uint8_t DSP2GetByte(uint16_t address) else t = 0xff; } - else t = 0x80; - return t; -} - -//Disable non-working chips? -#ifdef DSP_DUMMY_LOOPS -uint16_t Dsp3Rom[1024] = -{ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, - 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, - 0x4000, 0x7fff, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, - 0x0100, 0x0080, 0x0040, 0x0020, 0x0001, 0x0008, 0x0004, 0x0002, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x8000, 0xffe5, 0x0100, 0x7fff, 0x7f02, 0x7e08, - 0x7d12, 0x7c1f, 0x7b30, 0x7a45, 0x795d, 0x7878, 0x7797, 0x76ba, - 0x75df, 0x7507, 0x7433, 0x7361, 0x7293, 0x71c7, 0x70fe, 0x7038, - 0x6f75, 0x6eb4, 0x6df6, 0x6d3a, 0x6c81, 0x6bca, 0x6b16, 0x6a64, - 0x69b4, 0x6907, 0x685b, 0x67b2, 0x670b, 0x6666, 0x65c4, 0x6523, - 0x6484, 0x63e7, 0x634c, 0x62b3, 0x621c, 0x6186, 0x60f2, 0x6060, - 0x5fd0, 0x5f41, 0x5eb5, 0x5e29, 0x5d9f, 0x5d17, 0x5c91, 0x5c0c, - 0x5b88, 0x5b06, 0x5a85, 0x5a06, 0x5988, 0x590b, 0x5890, 0x5816, - 0x579d, 0x5726, 0x56b0, 0x563b, 0x55c8, 0x5555, 0x54e4, 0x5474, - 0x5405, 0x5398, 0x532b, 0x52bf, 0x5255, 0x51ec, 0x5183, 0x511c, - 0x50b6, 0x5050, 0x4fec, 0x4f89, 0x4f26, 0x4ec5, 0x4e64, 0x4e05, - 0x4da6, 0x4d48, 0x4cec, 0x4c90, 0x4c34, 0x4bda, 0x4b81, 0x4b28, - 0x4ad0, 0x4a79, 0x4a23, 0x49cd, 0x4979, 0x4925, 0x48d1, 0x487f, - 0x482d, 0x47dc, 0x478c, 0x473c, 0x46ed, 0x469f, 0x4651, 0x4604, - 0x45b8, 0x456c, 0x4521, 0x44d7, 0x448d, 0x4444, 0x43fc, 0x43b4, - 0x436d, 0x4326, 0x42e0, 0x429a, 0x4255, 0x4211, 0x41cd, 0x4189, - 0x4146, 0x4104, 0x40c2, 0x4081, 0x4040, 0x3fff, 0x41f7, 0x43e1, - 0x45bd, 0x478d, 0x4951, 0x4b0b, 0x4cbb, 0x4e61, 0x4fff, 0x5194, - 0x5322, 0x54a9, 0x5628, 0x57a2, 0x5914, 0x5a81, 0x5be9, 0x5d4a, - 0x5ea7, 0x5fff, 0x6152, 0x62a0, 0x63ea, 0x6530, 0x6672, 0x67b0, - 0x68ea, 0x6a20, 0x6b53, 0x6c83, 0x6daf, 0x6ed9, 0x6fff, 0x7122, - 0x7242, 0x735f, 0x747a, 0x7592, 0x76a7, 0x77ba, 0x78cb, 0x79d9, - 0x7ae5, 0x7bee, 0x7cf5, 0x7dfa, 0x7efe, 0x7fff, 0x0000, 0x0324, - 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, - 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, - 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, - 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, - 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, - 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, - 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, - 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, - 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, - 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, - 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, - 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, - 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, - 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, - 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, - 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x7fff, 0x7ff6, - 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, - 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, - 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, - 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, - 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, - 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, - 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, - 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, - 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, - 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, - 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, - 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, - 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, - 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, - 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, - 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x6488, 0x0080, - 0x03ff, 0x0116, 0x0002, 0x0080, 0x4000, 0x3fd7, 0x3faf, 0x3f86, - 0x3f5d, 0x3f34, 0x3f0c, 0x3ee3, 0x3eba, 0x3e91, 0x3e68, 0x3e40, - 0x3e17, 0x3dee, 0x3dc5, 0x3d9c, 0x3d74, 0x3d4b, 0x3d22, 0x3cf9, - 0x3cd0, 0x3ca7, 0x3c7f, 0x3c56, 0x3c2d, 0x3c04, 0x3bdb, 0x3bb2, - 0x3b89, 0x3b60, 0x3b37, 0x3b0e, 0x3ae5, 0x3abc, 0x3a93, 0x3a69, - 0x3a40, 0x3a17, 0x39ee, 0x39c5, 0x399c, 0x3972, 0x3949, 0x3920, - 0x38f6, 0x38cd, 0x38a4, 0x387a, 0x3851, 0x3827, 0x37fe, 0x37d4, - 0x37aa, 0x3781, 0x3757, 0x372d, 0x3704, 0x36da, 0x36b0, 0x3686, - 0x365c, 0x3632, 0x3609, 0x35df, 0x35b4, 0x358a, 0x3560, 0x3536, - 0x350c, 0x34e1, 0x34b7, 0x348d, 0x3462, 0x3438, 0x340d, 0x33e3, - 0x33b8, 0x338d, 0x3363, 0x3338, 0x330d, 0x32e2, 0x32b7, 0x328c, - 0x3261, 0x3236, 0x320b, 0x31df, 0x31b4, 0x3188, 0x315d, 0x3131, - 0x3106, 0x30da, 0x30ae, 0x3083, 0x3057, 0x302b, 0x2fff, 0x2fd2, - 0x2fa6, 0x2f7a, 0x2f4d, 0x2f21, 0x2ef4, 0x2ec8, 0x2e9b, 0x2e6e, - 0x2e41, 0x2e14, 0x2de7, 0x2dba, 0x2d8d, 0x2d60, 0x2d32, 0x2d05, - 0x2cd7, 0x2ca9, 0x2c7b, 0x2c4d, 0x2c1f, 0x2bf1, 0x2bc3, 0x2b94, - 0x2b66, 0x2b37, 0x2b09, 0x2ada, 0x2aab, 0x2a7c, 0x2a4c, 0x2a1d, - 0x29ed, 0x29be, 0x298e, 0x295e, 0x292e, 0x28fe, 0x28ce, 0x289d, - 0x286d, 0x283c, 0x280b, 0x27da, 0x27a9, 0x2777, 0x2746, 0x2714, - 0x26e2, 0x26b0, 0x267e, 0x264c, 0x2619, 0x25e7, 0x25b4, 0x2581, - 0x254d, 0x251a, 0x24e6, 0x24b2, 0x247e, 0x244a, 0x2415, 0x23e1, - 0x23ac, 0x2376, 0x2341, 0x230b, 0x22d6, 0x229f, 0x2269, 0x2232, - 0x21fc, 0x21c4, 0x218d, 0x2155, 0x211d, 0x20e5, 0x20ad, 0x2074, - 0x203b, 0x2001, 0x1fc7, 0x1f8d, 0x1f53, 0x1f18, 0x1edd, 0x1ea1, - 0x1e66, 0x1e29, 0x1ded, 0x1db0, 0x1d72, 0x1d35, 0x1cf6, 0x1cb8, - 0x1c79, 0x1c39, 0x1bf9, 0x1bb8, 0x1b77, 0x1b36, 0x1af4, 0x1ab1, - 0x1a6e, 0x1a2a, 0x19e6, 0x19a1, 0x195c, 0x1915, 0x18ce, 0x1887, - 0x183f, 0x17f5, 0x17ac, 0x1761, 0x1715, 0x16c9, 0x167c, 0x162e, - 0x15df, 0x158e, 0x153d, 0x14eb, 0x1497, 0x1442, 0x13ec, 0x1395, - 0x133c, 0x12e2, 0x1286, 0x1228, 0x11c9, 0x1167, 0x1104, 0x109e, - 0x1036, 0x0fcc, 0x0f5f, 0x0eef, 0x0e7b, 0x0e04, 0x0d89, 0x0d0a, - 0x0c86, 0x0bfd, 0x0b6d, 0x0ad6, 0x0a36, 0x098d, 0x08d7, 0x0811, - 0x0736, 0x063e, 0x0519, 0x039a, 0x0000, 0x7fff, 0x0100, 0x0080, - 0x021d, 0x00c8, 0x00ce, 0x0048, 0x0a26, 0x277a, 0x00ce, 0x6488, - 0x14ac, 0x0001, 0x00f9, 0x00fc, 0x00ff, 0x00fc, 0x00f9, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff - -}; - -void DSP3SetByte(uint8_t byte, uint16_t address) -{ - if ((address & 0xf000) == 0x6000 || - (address >= 0x8000 && address < 0xc000)) - { - if (DSP1.waiting4command) - { - DSP1.command = byte; - DSP1.in_index = 0; - DSP1.waiting4command = false; - switch (byte) - { - case 0x2F: - DSP1.in_count = 2; - break; - case 0x1F: - DSP1.in_count = 2; - break; - case 0x0F: - DSP1.in_count = 2; - break; - case 0x38: - DSP1.in_count = 4; - break; - default: - break; - } - } - else - { - DSP1.parameters [DSP1.in_index] = byte; - DSP1.in_index++; - } - - if (DSP1.in_count == DSP1.in_index) - { - // Actually execute the command - DSP1.waiting4command = true; - DSP1.out_index = 0; - switch (DSP1.command) - { - case 0x2F: - DSP1.out_count = 2; - break; - case 0x1F: - DSP1.out_count = 2048; - break; - case 0x0F: - DSP1.out_count = 2; - DSP1.output[0] = 0; - DSP1.output[1] = 0; - break; - case 0x38: - { - DSP1.out_count = 2; - // 176B - DSP1.output[0] = 0; - DSP1.output[1] = 0x80; - - break; - } - default: - break; - } - } - } -} - -uint8_t DSP3GetByte(uint16_t address) -{ - uint8_t t; - if ((address & 0xf000) == 0x6000 || - (address >= 0x8000 && address < 0xc000)) - { - if (DSP1.command == 0x38 && DSP1.out_index == 1) - t = 4; - - if (DSP1.out_count) - { - if (DSP1.command == 0x1f) - { - if ((DSP1.out_index % 2) != 0) - t = (uint8_t)Dsp3Rom[DSP1.out_index >> 1]; - else - t = Dsp3Rom[DSP1.out_index >> 1] >> 8; - DSP1.out_index++; - } - else - { - t = (uint8_t) DSP1.output [DSP1.out_index]; - DSP1.out_index++; - DSP1.out_index %= 512; - if (DSP1.out_count == DSP1.out_index) - DSP1.out_count = 0; - } - } - else - t = 0xff; - } else - { t = 0x80; - } return t; } -#endif - typedef struct { bool waiting4command; @@ -1151,8 +804,7 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4_init = true; } - if ((address & 0xf000) == 0x6000 || - (address >= 0x8000 && address < 0xc000)) + if ((address & 0xf000) == 0x6000 || (address >= 0x8000 && address < 0xc000)) { if (DSP4.out_index < DSP4.out_count) { @@ -1167,7 +819,7 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4.command |= (byte << 8); DSP4.in_index = 0; DSP4.waiting4command = false; - DSP4.half_command = 0; + DSP4.half_command = false; DSP4.out_count = 0; DSP4.out_index = 0; DSP4_Logic = 0; @@ -1181,11 +833,7 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4.in_count = 36; break; case 0x0003: - DSP4.in_count = 0; - break; case 0x0005: - DSP4.in_count = 0; - break; case 0x0006: DSP4.in_count = 0; break; @@ -1199,8 +847,6 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4.in_count = 14; break; case 0x000A: - DSP4.in_count = 6; - break; case 0x000B: DSP4.in_count = 6; break; @@ -1221,7 +867,7 @@ void DSP4SetByte(uint8_t byte, uint16_t address) else { DSP4.command = byte; - DSP4.half_command = 1; + DSP4.half_command = true; } } else @@ -1252,9 +898,8 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4.out_count = 4; DSP4_WRITE_WORD(0, product); DSP4_WRITE_WORD(2, product >> 16); + break; } - break; - // unknown: horizontal mapping command case 0x0011: { @@ -1271,40 +916,33 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4_WRITE_WORD(0, m); break; } - // track projection case 0x0001: DSP4_Op01(); break; - // track projection (pass 2) case 0x0007: DSP4_Op07(); break; - // zone projections (fuel/repair/lap/teleport/...) case 0x0008: DSP4_Op08(); break; - // sprite transformation case 0x0009: DSP4_Op09(); break; - // fast track projection case 0x000D: DSP4_Op0D(); break; - // internal memory management (01) case 0x0003: { // reset op09 data - op09_mode = 0; + op09_mode = false; break; } - // internal memory management (06) case 0x0005: { @@ -1316,15 +954,13 @@ void DSP4SetByte(uint8_t byte, uint16_t address) op06_OAM[lcv] = 0; break; } - // internal memory management (0D) case 0x000E: { // reset op09 data - op09_mode = 1; + op09_mode = true; break; } - // sprite OAM post-table data case 0x0006: { @@ -1334,7 +970,6 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4.output[lcv] = op06_OAM[lcv]; } break; - // unknown case 0x000A: { @@ -1372,7 +1007,7 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4_WRITE_WORD(4, oam); // OAM: size,msb data - DSP4_Op06(0, 0); + DSP4_Op06(false, false); } // 4p mode else @@ -1381,9 +1016,8 @@ void DSP4SetByte(uint8_t byte, uint16_t address) DSP4.out_count = 0; DSP4_WRITE_WORD(0, 0); } + break; } - break; - default: break; } diff --git a/source/dsp2emu.c b/source/dsp2emu.c index d1b6410..9e3e137 100644 --- a/source/dsp2emu.c +++ b/source/dsp2emu.c @@ -130,13 +130,11 @@ bool DSP2Op0DHasLen = false; int32_t DSP2Op0DOutLen = 0; int32_t DSP2Op0DInLen = 0; -#ifndef DSP2_BIT_ACCURRATE_CODE - // Scale bitmap based on input length out output length void DSP2_Op0D() { - // (Modified) Overload's algorithm - use this unless doing hardware testing + // (Modified) Overload's algorithm int32_t i; @@ -150,51 +148,3 @@ void DSP2_Op0D() DSP1.output[i] = (pixel_low << 4) | pixel_high; } } - -#else - -void DSP2_Op0D() -{ - // Bit accurate hardware algorithm - uses fixed point math - // This should match the DSP2 Op0D output exactly - // I wouldn't recommend using this unless you're doing hardware debug. - // In some situations it has small visual artifacts that - // are not readily apparent on a TV screen but show up clearly - // on a monitor. Use Overload's scaling instead. - // This is for hardware verification testing. - // - // One note: the HW can do odd byte scaling but since we divide - // by two to get the count of bytes this won't work well for - // odd byte scaling (in any of the current algorithm implementations). - // So far I haven't seen Dungeon Master use it. - // If it does we can adjust the parameters and code to work with it - - - uint32_t multiplier; - uint32_t pixloc; - int32_t i, j; - uint8_t pixelarray[512]; - - if (DSP2Op0DInLen <= DSP2Op0DOutLen) - multiplier = 0x10000; // In our self defined fixed point 0x10000 == 1 - else - multiplier = (DSP2Op0DInLen << 17) / ((DSP2Op0DOutLen << 1) + 1); - - pixloc = 0; - for (i = 0; i < DSP2Op0DOutLen * 2; i++) - { - j = pixloc >> 16; - - if (j & 1) - pixelarray[i] = DSP1.parameters[j >> 1] & 0x0f; - else - pixelarray[i] = (DSP1.parameters[j >> 1] & 0xf0) >> 4; - - pixloc += multiplier; - } - - for (i = 0; i < DSP2Op0DOutLen; i++) - DSP1.output[i] = (pixelarray[i << 1] << 4) | pixelarray[(i << 1) + 1]; -} - -#endif diff --git a/source/dsp4emu.c b/source/dsp4emu.c index c2ba8c8..3b3d843 100644 --- a/source/dsp4emu.c +++ b/source/dsp4emu.c @@ -160,7 +160,7 @@ resume2: - 1.07629051 * project_focaly - 65.69315963); // approximate # of raster lines - segments = abs(project_y2 - project_y1); + segments = ABS(project_y2 - project_y1); // prevent overdraw if (project_y2 >= raster) segments = 0; @@ -341,7 +341,7 @@ resume2: - 1.07629051 * project_focaly - 65.69315963); // approximate # of raster lines - segments = abs(project_y2 - project_y1); + segments = ABS(project_y2 - project_y1); // prevent overdraw if (project_y2 >= raster) segments = 0; @@ -555,7 +555,7 @@ DSP4_WAIT(2) resume2: int16_t dx1 = 0, dx2 = 0, dx3, dx4; // # segments to traverse - segments = abs(y_left - path_y[0]); + segments = ABS(y_left - path_y[0]); // prevent overdraw if (y_left >= path_raster[0]) segments = 0; @@ -638,7 +638,7 @@ DSP4_WAIT(2) resume2: ////////////////////////////////////////////// // zone 2 - segments = abs(y_right - path_y[1]); + segments = ABS(y_right - path_y[1]); // prevent overdraw if (y_right >= path_raster[2]) segments = 0; @@ -863,7 +863,7 @@ resume2: - 1.07629051 * project_focaly - 65.69315963); // approximate # of raster lines - segments = abs(project_y2 - project_y1); + segments = ABS(project_y2 - project_y1); // prevent overdraw if (project_y2 >= raster) segments = 0; @@ -994,7 +994,8 @@ void DSP4_Op09() // convert track line to the window region project_y2 = center_y + multi_raster[multi_index1] * (viewport_bottom - center_y) / (0x33 - 0); - if (op09_mode == 0) project_y2 -= 2; + if (!op09_mode) + project_y2 -= 2; goto no_sprite; @@ -1138,7 +1139,7 @@ DSP4_WAIT(5) resume5: } // default sprite size: 16x16 - sprite_size = 1; + sprite_size = true; // convert tile data to OAM diff --git a/source/fxemu.c b/source/fxemu.c index 5b3aba3..a92e3df 100644 --- a/source/fxemu.c +++ b/source/fxemu.c @@ -9,10 +9,6 @@ /* The FxChip Emulator's internal variables */ struct FxRegs_s GSU; // This will be initialized when loading a ROM -uint32_t(**fx_ppfFunctionTable)(uint32_t) = 0; -void (**fx_ppfPlotTable)() = 0; -void (**fx_ppfOpcodeTable)() = 0; - void FxCacheWriteAccess(uint16_t vAddress) { if ((vAddress & 0x00f) == 0x00f) @@ -99,10 +95,10 @@ static void fx_readRegisterSpace() GSU.pfPlot = fx_apfPlotTable[GSU.vMode]; GSU.pfRpix = fx_apfPlotTable[GSU.vMode + 5]; - fx_ppfOpcodeTable[0x04c] = GSU.pfPlot; - fx_ppfOpcodeTable[0x14c] = GSU.pfRpix; - fx_ppfOpcodeTable[0x24c] = GSU.pfPlot; - fx_ppfOpcodeTable[0x34c] = GSU.pfRpix; + fx_apfOpcodeTable[0x04c] = GSU.pfPlot; + fx_apfOpcodeTable[0x14c] = GSU.pfRpix; + fx_apfOpcodeTable[0x24c] = GSU.pfPlot; + fx_apfOpcodeTable[0x34c] = GSU.pfRpix; fx_computeScreenPointers(); } @@ -277,27 +273,8 @@ static void fx_writeRegisterSpace() /* Reset the FxChip */ void FxReset(struct FxInit_s* psFxInfo) { - int32_t i; - static uint32_t(**appfFunction[])(uint32_t) = - { - &fx_apfFunctionTable[0] - }; - static void (**appfPlot[])() = - { - &fx_apfPlotTable[0] - }; - static void (**appfOpcode[])() = - { - &fx_apfOpcodeTable[0] - }; - - /* Get function pointers for the current emulation mode */ - fx_ppfFunctionTable = appfFunction[psFxInfo->vFlags & 0x3]; - fx_ppfPlotTable = appfPlot[psFxInfo->vFlags & 0x3]; - fx_ppfOpcodeTable = appfOpcode[psFxInfo->vFlags & 0x3]; - /* Clear all internal variables */ - memset((uint8_t*)&GSU, 0, sizeof(struct FxRegs_s)); + memset((uint8_t*) &GSU, 0, sizeof(struct FxRegs_s)); /* Set default registers */ GSU.pvSreg = GSU.pvDreg = &R0; @@ -322,6 +299,7 @@ void FxReset(struct FxInit_s* psFxInfo) GSU.pvRegisters[0x3b] = 0; /* Make ROM bank table */ + int32_t i; for (i = 0; i < 256; i++) { uint32_t b = i & 0x7f; @@ -360,13 +338,10 @@ void FxReset(struct FxInit_s* psFxInfo) static bool fx_checkStartAddress() { /* Check if we start inside the cache */ - if (GSU.bCacheActive && R15 >= GSU.vCacheBaseReg - && R15 < (GSU.vCacheBaseReg + 512)) + if (GSU.bCacheActive && R15 >= GSU.vCacheBaseReg && R15 < (GSU.vCacheBaseReg + 512)) return true; /* Check if we're in an unused area */ - if (GSU.vPrgBankReg < 0x40 && R15 < 0x8000) - return false; if (GSU.vPrgBankReg >= 0x60 && GSU.vPrgBankReg <= 0x6f) return false; if (GSU.vPrgBankReg >= 0x74) @@ -402,7 +377,7 @@ int32_t FxEmulate(uint32_t nInstructions) /* Execute GSU session */ CF(IRQ); - vCount = fx_ppfFunctionTable[FX_FUNCTION_RUN](nInstructions); + vCount = fx_run(nInstructions); /* Store GSU registers */ fx_writeRegisterSpace(); @@ -414,33 +389,6 @@ int32_t FxEmulate(uint32_t nInstructions) return vCount; } -/* Step by step execution */ -int32_t FxStepOver(uint32_t nInstructions) -{ - uint32_t vCount; - fx_readRegisterSpace(); - - /* Check if the start address is valid */ - if (!fx_checkStartAddress()) - { - CF(G); - return 0; - } - - if (PIPE >= 0xf0) - GSU.vStepPoint = USEX16(R15 + 3); - else if ((PIPE >= 0x05 && PIPE <= 0x0f) || (PIPE >= 0xa0 && PIPE <= 0xaf)) - GSU.vStepPoint = USEX16(R15 + 2); - else - GSU.vStepPoint = USEX16(R15 + 1); - vCount = fx_ppfFunctionTable[FX_FUNCTION_STEP_OVER](nInstructions); - fx_writeRegisterSpace(); - if (GSU.vErrorCode) - return GSU.vErrorCode; - else - return vCount; -} - /* Errors */ int32_t FxGetErrorCode() { diff --git a/source/fxemu.h b/source/fxemu.h index 3c0511c..2176976 100644 --- a/source/fxemu.h +++ b/source/fxemu.h @@ -26,9 +26,6 @@ extern int32_t FxEmulate(uint32_t nInstructions); extern void FxCacheWriteAccess(uint16_t vAddress); extern void FxFlushCache(); /* Callled when the G flag in SFR is set to zero */ -/* Step by step execution */ -extern int32_t FxStepOver(uint32_t nInstructions); - /* Errors */ extern int32_t FxGetErrorCode(); extern int32_t FxGetIllegalAddress(); @@ -43,7 +40,7 @@ extern uint32_t FxGetDestinationRegisterIndex(); extern uint8_t FxPipe(); /* SCBR write seen. We need to update our cached screen pointers */ -extern void fx_dirtySCBR(void); +extern void fx_dirtySCBR(); /* Update RamBankReg and RAM Bank pointer */ extern void fx_updateRamBank(uint8_t Byte); diff --git a/source/fxinst.c b/source/fxinst.c index e78d932..4ec1e01 100644 --- a/source/fxinst.c +++ b/source/fxinst.c @@ -10,10 +10,6 @@ extern struct FxRegs_s GSU; int32_t gsu_bank [512] = {0}; -/* Set this define if you wish the plot instruction to check for y-pos limits */ -/* (I don't think it's nessecary) */ -#define CHECK_LIMITS - /* Codes used: * * rn = a GSU register (r0-r15) @@ -583,9 +579,6 @@ static void fx_plot_2bit() CLRFLAGS; R1++; -#ifdef CHECK_LIMITS - if (y >= GSU.vScreenHeight) return; -#endif if (GSU.vPlotOptionReg & 0x02) c = (x ^ y) & 1 ? (uint8_t)(GSU.vColorReg >> 4) : (uint8_t)GSU.vColorReg; else @@ -611,9 +604,6 @@ static void fx_rpix_2bit() R15++; CLRFLAGS; -#ifdef CHECK_LIMITS - if (y >= GSU.vScreenHeight) return; -#endif a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); v = 128 >> (x & 7); @@ -636,9 +626,6 @@ static void fx_plot_4bit() CLRFLAGS; R1++; -#ifdef CHECK_LIMITS - if (y >= GSU.vScreenHeight) return; -#endif if (GSU.vPlotOptionReg & 0x02) c = (x ^ y) & 1 ? (uint8_t)(GSU.vColorReg >> 4) : (uint8_t)GSU.vColorReg; else @@ -670,10 +657,6 @@ static void fx_rpix_4bit() R15++; CLRFLAGS; -#ifdef CHECK_LIMITS - if (y >= GSU.vScreenHeight) return; -#endif - a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); v = 128 >> (x & 7); @@ -697,9 +680,6 @@ static void fx_plot_8bit() CLRFLAGS; R1++; -#ifdef CHECK_LIMITS - if (y >= GSU.vScreenHeight) return; -#endif c = (uint8_t)GSU.vColorReg; if (!(GSU.vPlotOptionReg & 0x10)) { @@ -739,9 +719,6 @@ static void fx_rpix_8bit() R15++; CLRFLAGS; -#ifdef CHECK_LIMITS - if (y >= GSU.vScreenHeight) return; -#endif a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); v = 128 >> (x & 7); @@ -759,15 +736,9 @@ static void fx_rpix_8bit() } /* 4o - plot - plot pixel with R1,R2 as x,y and the color register as the color */ -static void fx_plot_obj() -{ - printf("ERROR fx_plot_obj called\n"); -} - /* 4c(ALT1) - rpix - read color of the pixel with R1,R2 as x,y */ -static void fx_rpix_obj() +static void fx_obj_func() { - printf("ERROR fx_rpix_obj called\n"); } /* 4d - swap - swap upper and lower byte of a register */ @@ -3238,7 +3209,7 @@ static void fx_sm_r15() /*** GSU executions functions ***/ -static uint32_t fx_run(uint32_t nInstructions) +uint32_t fx_run(uint32_t nInstructions) { GSU.vCounter = nInstructions; READR14; @@ -3247,70 +3218,15 @@ static uint32_t fx_run(uint32_t nInstructions) return (nInstructions - GSU.vInstCount); } -static uint32_t fx_run_to_breakpoint(uint32_t nInstructions) -{ - uint32_t vCounter = 0; - while (TF(G) && vCounter < nInstructions) - { - vCounter++; - FX_STEP; - if (USEX16(R15) == GSU.vBreakPoint) - { - GSU.vErrorCode = FX_BREAKPOINT; - break; - } - } - return vCounter; -} - -static uint32_t fx_step_over(uint32_t nInstructions) -{ - uint32_t vCounter = 0; - while (TF(G) && vCounter < nInstructions) - { - vCounter++; - FX_STEP; - if (USEX16(R15) == GSU.vBreakPoint) - { - GSU.vErrorCode = FX_BREAKPOINT; - break; - } - if (USEX16(R15) == GSU.vStepPoint) - break; - } - return vCounter; -} - -#ifdef FX_FUNCTION_TABLE -uint32_t(*FX_FUNCTION_TABLE[])(uint32_t) = -#else -uint32_t(*fx_apfFunctionTable[])(uint32_t) = -#endif -{ - &fx_run, - &fx_run_to_breakpoint, - &fx_step_over, -}; - /*** Special table for the different plot configurations ***/ - -#ifdef FX_PLOT_TABLE -void (*FX_PLOT_TABLE[])() = -#else void (*fx_apfPlotTable[])() = -#endif { - &fx_plot_2bit, &fx_plot_4bit, &fx_plot_4bit, &fx_plot_8bit, &fx_plot_obj, - &fx_rpix_2bit, &fx_rpix_4bit, &fx_rpix_4bit, &fx_rpix_8bit, &fx_rpix_obj, + &fx_plot_2bit, &fx_plot_4bit, &fx_plot_4bit, &fx_plot_8bit, &fx_obj_func, + &fx_rpix_2bit, &fx_rpix_4bit, &fx_rpix_4bit, &fx_rpix_8bit, &fx_obj_func, }; /*** Opcode table ***/ - -#ifdef FX_OPCODE_TABLE -void (*FX_OPCODE_TABLE[])() = -#else void (*fx_apfOpcodeTable[])() = -#endif { /* * ALT0 Table diff --git a/source/fxinst.h b/source/fxinst.h index a78b6d4..ce9187d 100644 --- a/source/fxinst.h +++ b/source/fxinst.h @@ -337,28 +337,12 @@ struct FxRegs_s /* Execute instruction from the pipe, and fetch next byte to the pipe */ #define FX_STEP { uint32_t vOpcode = (uint32_t)PIPE; FETCHPIPE; \ -(*fx_ppfOpcodeTable[ (GSU.vStatusReg & 0x300) | vOpcode ])(); } \ +(*fx_apfOpcodeTable[ (GSU.vStatusReg & 0x300) | vOpcode ])(); } \ -#define FX_FUNCTION_RUN 0 -#define FX_FUNCTION_RUN_TO_BREAKPOINT 1 -#define FX_FUNCTION_STEP_OVER 2 - -extern uint32_t(**fx_ppfFunctionTable)(uint32_t); -extern void (**fx_ppfPlotTable)(); -extern void (**fx_ppfOpcodeTable)(); - -extern uint32_t(*fx_apfFunctionTable[])(uint32_t); extern void (*fx_apfOpcodeTable[])(); extern void (*fx_apfPlotTable[])(); -extern uint32_t(*fx_a_apfFunctionTable[])(uint32_t); -extern void (*fx_a_apfOpcodeTable[])(); -extern void (*fx_a_apfPlotTable[])(); -extern uint32_t(*fx_r_apfFunctionTable[])(uint32_t); -extern void (*fx_r_apfOpcodeTable[])(); -extern void (*fx_r_apfPlotTable[])(); -extern uint32_t(*fx_ar_apfFunctionTable[])(uint32_t); -extern void (*fx_ar_apfOpcodeTable[])(); -extern void (*fx_ar_apfPlotTable[])(); + +uint32_t fx_run(uint32_t nInstructions); /* Set this define if branches are relative to the instruction in the delay slot */ /* (I think they are) */ diff --git a/source/getset.h b/source/getset.h index b0abba5..7d28a04 100644 --- a/source/getset.h +++ b/source/getset.h @@ -37,9 +37,6 @@ INLINE uint8_t S9xGetByte(uint32_t Address) case MAP_CPU: return (S9xGetCPU(Address & 0xffff)); case MAP_DSP: -#ifdef DSP_DUMMY_LOOPS - printf("Get DSP Byte @ %06X\n", Address); -#endif return (S9xGetDSP(Address & 0xffff)); case MAP_SA1RAM: case MAP_LOROM_SRAM: @@ -54,7 +51,7 @@ INLINE uint8_t S9xGetByte(uint32_t Address) case MAP_BWRAM: return (*(Memory.BWRAM + ((Address & 0x7fff) - 0x6000))); case MAP_C4: - return (S9xGetC4(Address & 0xffff)); + return S9xGetC4(Address & 0xffff); case MAP_SPC7110_ROM: return S9xGetSPC7110Byte(Address); case MAP_SPC7110_DRAM: @@ -65,7 +62,6 @@ INLINE uint8_t S9xGetByte(uint32_t Address) return S9xGetSetaDSP(Address); case MAP_SETA_RISC: return S9xGetST018(Address); - case MAP_DEBUG: default: return OpenBus; } @@ -79,13 +75,11 @@ INLINE uint16_t S9xGetWord(uint32_t Address) return (OpenBus | (S9xGetByte(Address + 1) << 8)); } int32_t block; - uint8_t* GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & - MEMMAP_MASK]; + uint8_t* GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; if (!CPU.InDMA) CPU.Cycles += (Memory.MemorySpeed [block] << 1); - if (GetAddress >= (uint8_t*) MAP_LAST) { #ifdef CPU_SHUTDOWN @@ -95,25 +89,18 @@ INLINE uint16_t S9xGetWord(uint32_t Address) #ifdef FAST_LSB_WORD_ACCESS return (*(uint16_t*)(GetAddress + (Address & 0xffff))); #else - return (*(GetAddress + (Address & 0xffff)) | - (*(GetAddress + (Address & 0xffff) + 1) << 8)); + return (*(GetAddress + (Address & 0xffff)) | (*(GetAddress + (Address & 0xffff) + 1) << 8)); #endif } switch ((intptr_t) GetAddress) { case MAP_PPU: - return (S9xGetPPU(Address & 0xffff) | - (S9xGetPPU((Address + 1) & 0xffff) << 8)); + return (S9xGetPPU(Address & 0xffff) | (S9xGetPPU((Address + 1) & 0xffff) << 8)); case MAP_CPU: - return (S9xGetCPU(Address & 0xffff) | - (S9xGetCPU((Address + 1) & 0xffff) << 8)); + return (S9xGetCPU(Address & 0xffff) | (S9xGetCPU((Address + 1) & 0xffff) << 8)); case MAP_DSP: -#ifdef DSP_DUMMY_LOOPS - printf("Get DSP Word @ %06X\n", Address); -#endif - return (S9xGetDSP(Address & 0xffff) | - (S9xGetDSP((Address + 1) & 0xffff) << 8)); + return (S9xGetDSP(Address & 0xffff) | (S9xGetDSP((Address + 1) & 0xffff) << 8)); case MAP_SA1RAM: case MAP_LOROM_SRAM: //Address &0x7FFF -offset into bank @@ -123,10 +110,8 @@ INLINE uint16_t S9xGetWord(uint32_t Address) /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff * then the high byte doesn't follow the low byte. */ return - (*(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) - &Memory.SRAMMask))) | - ((*(Memory.SRAM + (((((Address + 1) & 0xFF0000) >> 1) | (( - Address + 1) & 0x7FFF)) &Memory.SRAMMask))) << 8); + (*(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask))) | + ((*(Memory.SRAM + (((((Address + 1) & 0xFF0000) >> 1) | ((Address + 1) & 0x7FFF)) & Memory.SRAMMask))) << 8); case MAP_RONLY_SRAM: case MAP_HIROM_SRAM: /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff @@ -141,18 +126,14 @@ INLINE uint16_t S9xGetWord(uint32_t Address) #ifdef FAST_LSB_WORD_ACCESS return (*(uint16_t*)(Memory.BWRAM + ((Address & 0x7fff) - 0x6000))); #else - return (*(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) | - (*(Memory.BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) << 8)); + return (*(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) | (*(Memory.BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) << 8)); #endif case MAP_C4: - return (S9xGetC4(Address & 0xffff) | - (S9xGetC4((Address + 1) & 0xffff) << 8)); + return (S9xGetC4(Address & 0xffff) | (S9xGetC4((Address + 1) & 0xffff) << 8)); case MAP_SPC7110_ROM: - return (S9xGetSPC7110Byte(Address) | - (S9xGetSPC7110Byte(Address + 1)) << 8); + return (S9xGetSPC7110Byte(Address) | (S9xGetSPC7110Byte(Address + 1)) << 8); case MAP_SPC7110_DRAM: - return (S9xGetSPC7110(0x4800) | - (S9xGetSPC7110(0x4800) << 8)); + return (S9xGetSPC7110(0x4800) | (S9xGetSPC7110(0x4800) << 8)); case MAP_OBC_RAM: return GetOBC1(Address & 0xFFFF) | (GetOBC1((Address + 1) & 0xFFFF) << 8); case MAP_SETA_DSP: @@ -170,8 +151,7 @@ INLINE void S9xSetByte(uint8_t Byte, uint32_t Address) CPU.WaitAddress = NULL; #endif int32_t block; - uint8_t* SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & - MEMMAP_MASK)]; + uint8_t* SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)]; if (!CPU.InDMA) CPU.Cycles += Memory.MemorySpeed [block]; @@ -203,24 +183,19 @@ INLINE void S9xSetByte(uint8_t Byte, uint32_t Address) S9xSetCPU(Byte, Address & 0xffff); return; case MAP_DSP: -#ifdef DSP_DUMMY_LOOPS - printf("DSP Byte: %02X to %06X\n", Byte, Address); -#endif S9xSetDSP(Byte, Address & 0xffff); return; case MAP_LOROM_SRAM: if (Memory.SRAMMask) { - *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF))& - Memory.SRAMMask)) = Byte; + *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask)) = Byte; CPU.SRAMModified = true; } return; case MAP_HIROM_SRAM: if (Memory.SRAMMask) { - *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + - ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = Byte; + *(Memory.SRAM + (((Address & 0x7fff) - 0x6000 + ((Address & 0xf0000) >> 3)) & Memory.SRAMMask)) = Byte; CPU.SRAMModified = true; } return; @@ -228,7 +203,6 @@ INLINE void S9xSetByte(uint8_t Byte, uint32_t Address) *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = Byte; CPU.SRAMModified = true; return; - case MAP_DEBUG: case MAP_SA1RAM: *(Memory.SRAM + (Address & 0xffff)) = Byte; SA1.Executing = !SA1.Waiting; @@ -266,8 +240,7 @@ INLINE void S9xSetWord(uint16_t Word, uint32_t Address) CPU.WaitAddress = NULL; #endif int32_t block; - uint8_t* SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & - MEMMAP_MASK)]; + uint8_t* SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)]; if (!CPU.InDMA) CPU.Cycles += Memory.MemorySpeed [block] << 1; @@ -284,7 +257,7 @@ INLINE void S9xSetWord(uint16_t Word, uint32_t Address) SA1.WaitCounter = 0; } #ifdef FAST_LSB_WORD_ACCESS - *(uint16_t*) SetAddress = Word; + *(uint16_t*)SetAddress = Word; #else *SetAddress = (uint8_t) Word; *(SetAddress + 1) = Word >> 8; @@ -307,14 +280,11 @@ INLINE void S9xSetWord(uint16_t Word, uint32_t Address) S9xSetPPU(Word >> 8, (Address & 0xffff) + 1); return; case MAP_CPU: - S9xSetCPU((uint8_t) Word, (Address & 0xffff)); + S9xSetCPU((uint8_t) Word, Address & 0xffff); S9xSetCPU(Word >> 8, (Address & 0xffff) + 1); return; case MAP_DSP: -#ifdef DSP_DUMMY_LOOPS - printf("DSP Word: %04X to %06X\n", Word, Address); -#endif - S9xSetDSP((uint8_t) Word, (Address & 0xffff)); + S9xSetDSP((uint8_t) Word, Address & 0xffff); S9xSetDSP(Word >> 8, (Address & 0xffff) + 1); return; case MAP_LOROM_SRAM: @@ -322,11 +292,8 @@ INLINE void S9xSetWord(uint16_t Word, uint32_t Address) { /* BJ: no FAST_LSB_WORD_ACCESS here, since if Memory.SRAMMask=0x7ff * then the high byte doesn't follow the low byte. */ - *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF))& - Memory.SRAMMask)) = (uint8_t) Word; - *(Memory.SRAM + (((((Address + 1) & 0xFF0000) >> 1) | (( - Address + 1) & 0x7FFF))& Memory.SRAMMask)) = Word >> 8; - + *(Memory.SRAM + ((((Address & 0xFF0000) >> 1) | (Address & 0x7FFF)) & Memory.SRAMMask)) = (uint8_t) Word; + *(Memory.SRAM + (((((Address + 1) & 0xFF0000) >> 1) | ((Address + 1) & 0x7FFF))& Memory.SRAMMask)) = Word >> 8; CPU.SRAMModified = true; } return; @@ -349,11 +316,10 @@ INLINE void S9xSetWord(uint16_t Word, uint32_t Address) *(uint16_t*)(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = Word; #else *(Memory.BWRAM + ((Address & 0x7fff) - 0x6000)) = (uint8_t) Word; - *(Memory.BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) = (uint8_t)(Word >> 8); + *(Memory.BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) = (uint8_t) (Word >> 8); #endif CPU.SRAMModified = true; return; - case MAP_DEBUG: case MAP_SPC7110_DRAM: s7r.bank50[(Address & 0xffff)] = (uint8_t) Word; s7r.bank50[((Address + 1) & 0xffff)] = (uint8_t) Word; @@ -400,22 +366,21 @@ INLINE uint8_t* GetBasePointer(uint32_t Address) case MAP_PPU: //just a guess, but it looks like this should match the CPU as a source. case MAP_CPU: //fixes Ogre Battle's green lines case MAP_OBC_RAM: - return (Memory.FillRAM); + return Memory.FillRAM; case MAP_DSP: return (Memory.FillRAM - 0x6000); case MAP_SA1RAM: case MAP_LOROM_SRAM: - return (Memory.SRAM); + case MAP_SETA_DSP: + return Memory.SRAM; case MAP_BWRAM: return (Memory.BWRAM - 0x6000); case MAP_HIROM_SRAM: return (Memory.SRAM - 0x6000); case MAP_C4: return (Memory.C4RAM - 0x6000); - case MAP_SETA_DSP: - return Memory.SRAM; default: - return (0); + return NULL; } } @@ -431,7 +396,7 @@ INLINE uint8_t* S9xGetMemPointer(uint32_t Address) switch ((intptr_t) GetAddress) { case MAP_SPC7110_DRAM: - return &s7r.bank50[Address & 0x0000FFFF]; + return &s7r.bank50[Address & 0xffff]; case MAP_PPU: return (Memory.FillRAM + (Address & 0xffff)); case MAP_CPU: @@ -452,7 +417,7 @@ INLINE uint8_t* S9xGetMemPointer(uint32_t Address) case MAP_SETA_DSP: return Memory.SRAM + ((Address & 0xffff) & Memory.SRAMMask); default: - return (0); + return NULL; } } @@ -470,18 +435,12 @@ INLINE void S9xSetPCBase(uint32_t Address) switch ((intptr_t) GetAddress) { case MAP_PPU: - CPU.PCBase = Memory.FillRAM; - break; case MAP_CPU: CPU.PCBase = Memory.FillRAM; break; case MAP_DSP: CPU.PCBase = Memory.FillRAM - 0x6000; break; - case MAP_SA1RAM: - case MAP_LOROM_SRAM: - CPU.PCBase = Memory.SRAM; - break; case MAP_BWRAM: CPU.PCBase = Memory.BWRAM - 0x6000; break; diff --git a/source/gfx.c b/source/gfx.c index 5bd1a57..4b88295 100644 --- a/source/gfx.c +++ b/source/gfx.c @@ -336,7 +336,6 @@ bool S9xInitGFX() // then the value is zero, otherwise multiply the value by 2. Used by // the color subtraction code. -#if defined(OLD_COLOUR_BLENDING) for (r = 0; r <= MAX_RED; r++) { uint32_t r2 = r; @@ -362,49 +361,10 @@ bool S9xInitGFX() b2 = (b2 << 1) & MAX_BLUE; GFX.ZERO_OR_X2 [BUILD_PIXEL2(r, g, b)] = BUILD_PIXEL2(r2, g2, b2); - GFX.ZERO_OR_X2 [BUILD_PIXEL2(r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2(r2, g2, - b2); + GFX.ZERO_OR_X2 [BUILD_PIXEL2(r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2(MAX(1, r2), MAX(1, g2), MAX(1, b2)); } } } -#else - for (r = 0; r <= MAX_RED; r++) - { - uint32_t r2 = r; - if ((r2 & 0x10) == 0) - r2 = 0; - else - r2 = (r2 << 1) & MAX_RED; - - if (r2 == 0) - r2 = 1; - for (g = 0; g <= MAX_GREEN; g++) - { - uint32_t g2 = g; - if ((g2 & GREEN_HI_BIT) == 0) - g2 = 0; - else - g2 = (g2 << 1) & MAX_GREEN; - - if (g2 == 0) - g2 = 1; - for (b = 0; b <= MAX_BLUE; b++) - { - uint32_t b2 = b; - if ((b2 & 0x10) == 0) - b2 = 0; - else - b2 = (b2 << 1) & MAX_BLUE; - - if (b2 == 0) - b2 = 1; - GFX.ZERO_OR_X2 [BUILD_PIXEL2(r, g, b)] = BUILD_PIXEL2(r2, g2, b2); - GFX.ZERO_OR_X2 [BUILD_PIXEL2(r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2(r2, g2, - b2); - } - } - } -#endif // Build a lookup table that if the top bit of the color value is zero // then the value is zero, otherwise its just the value. @@ -439,7 +399,7 @@ bool S9xInitGFX() return (true); } -void S9xDeinitGFX(void) +void S9xDeinitGFX() { // Free any memory allocated in S9xInitGFX if (GFX.X2) @@ -495,8 +455,7 @@ void S9xStartScreenRefresh() if (PPU.BGMode == 5 || PPU.BGMode == 6) IPPU.Interlace = (Memory.FillRAM[0x2133] & 1); - if (Settings.SupportHiRes && (PPU.BGMode == 5 || PPU.BGMode == 6 - || IPPU.Interlace)) + if (Settings.SupportHiRes && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.Interlace)) { IPPU.RenderedScreenWidth = 512; IPPU.DoubleWidthPixels = true; @@ -519,8 +478,7 @@ void S9xStartScreenRefresh() GFX.PPLx2 = GFX.PPL << 1; } } - else if (!Settings.SupportHiRes && (PPU.BGMode == 5 || PPU.BGMode == 6 - || IPPU.Interlace)) + else if (!Settings.SupportHiRes && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.Interlace)) { IPPU.RenderedScreenWidth = 256; IPPU.DoubleWidthPixels = false; @@ -1495,19 +1453,13 @@ static void DrawBackgroundOffset(uint32_t BGMode, uint32_t bg, uint8_t Z1, uint8 // hardware limitation that the offsets cannot be set // for the tile at the left-hand edge of the screen. VOffset = LineData [Y].BG[bg].VOffset; - - //MKendora; use temp var to reduce memory accesses HOffset = LineHOffset; - //End MK - left_hand_edge = false; } else - { // All subsequent offset tile data is shifted left by one, // hence the - 1 below. - Quot2 = ((HOff + Left - 1) & OffsetMask) >> 3; if (Quot2 > 31) @@ -1520,11 +1472,7 @@ static void DrawBackgroundOffset(uint32_t BGMode, uint32_t bg, uint8_t Z1, uint8 if (BGMode == 4) { VOffset = LineData [Y].BG[bg].VOffset; - - //MKendora; use temp var to reduce memory accesses HOffset = LineHOffset; - //end MK - if ((HCellOffset & OffsetEnableMask)) { if (HCellOffset & 0x8000) @@ -1638,8 +1586,7 @@ static void DrawBackgroundOffset(uint32_t BGMode, uint32_t bg, uint8_t Z1, uint8 Left += Count; TotalCount += Count; - s += (IPPU.HalfWidthPixels ? (Offset + Count) >> 1 : (Offset + Count)) * - GFX.PixSize; + s += (IPPU.HalfWidthPixels ? (Offset + Count) >> 1 : (Offset + Count)) * GFX.PixSize; MaxCount = 8; } } @@ -1765,8 +1712,7 @@ static void DrawBackgroundMode5(uint32_t bg, uint8_t Z1, uint8_t Z2) continue; } - uint32_t s = (IPPU.HalfWidthPixels ? Left >> 1 : Left) * GFX.PixSize + Y * - GFX.PPL; + uint32_t s = (IPPU.HalfWidthPixels ? Left >> 1 : Left) * GFX.PixSize + Y * GFX.PPL; uint32_t HPos = (HOffset + Left * GFX.PixSize) & 0x3ff; uint32_t Quot = HPos >> 3; @@ -1985,7 +1931,6 @@ static void DrawBackground(uint32_t BGMode, uint32_t bg, uint8_t Z1, uint8_t Z2) { DrawBackgroundMosaic(BGMode, bg, Z1, Z2); return; - } switch (BGMode) { @@ -3108,7 +3053,7 @@ static void RenderScreen(uint8_t* Screen, bool sub, bool force_no_add, uint8_t D } } -void S9xUpdateScreen(void) +void S9xUpdateScreen() { int32_t x2 = 1; @@ -3542,13 +3487,13 @@ void S9xUpdateScreen(void) } // --if (SUB_OR_ADD(5)) else { + uint32_t y; // Subscreen not being added to back uint32_t back = IPPU.ScreenColors [0] | (IPPU.ScreenColors [0] << 16); pClip = &IPPU.Clip [0]; if (pClip->Count [5]) { - uint32_t y; for (y = starty; y <= endy; y++) { uint32_t b; @@ -3573,7 +3518,6 @@ void S9xUpdateScreen(void) } else { - uint32_t y; for (y = starty; y <= endy; y++) { uint16_t* p = (uint16_t*)(GFX.Screen + y * GFX.Pitch2); diff --git a/source/gfx.h b/source/gfx.h index c5f50cb..230d692 100644 --- a/source/gfx.h +++ b/source/gfx.h @@ -19,7 +19,7 @@ extern struct SGFX GFX; bool S9xInitGFX(); void S9xDeinitGFX(); -bool S9xInitUpdate(void); +bool S9xInitUpdate(); struct SGFX { diff --git a/source/memmap.c b/source/memmap.c index 4a96f66..286abc6 100644 --- a/source/memmap.c +++ b/source/memmap.c @@ -31,10 +31,6 @@ #include "fxemu.h" extern struct FxInit_s SuperFX; -#ifndef SET_UI_COLOR -#define SET_UI_COLOR(r,g,b) ; -#endif - static int32_t retry_count = 0; static uint8_t bytes0x2000 [0x2000]; int32_t is_bsx(uint8_t*); @@ -103,12 +99,6 @@ const uint32_t crc32Table[256] = void S9xDeinterleaveType1(int32_t TotalFileSize, uint8_t* base) { - if (Settings.DisplayColor == 0xffff) - { - Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); - SET_UI_COLOR(0, 255, 0); - } - int32_t i; int32_t nblocks = TotalFileSize >> 16; uint8_t blocks [256]; @@ -152,12 +142,6 @@ void S9xDeinterleaveGD24(int32_t TotalFileSize, uint8_t* base) if (TotalFileSize != 0x300000) return; - if (Settings.DisplayColor == 0xffff) - { - Settings.DisplayColor = BUILD_PIXEL(0, 31, 31); - SET_UI_COLOR(0, 255, 255); - } - // DS2 DMA notes: base may or may not be 32-byte aligned uint8_t* tmp = (uint8_t*) malloc(0x80000); if (tmp) @@ -684,20 +668,6 @@ static uint32_t FileLoader(uint8_t* buffer, const char* filename, int32_t maxsiz } while (more && (ROMFile = fopen(fname, "rb")) != NULL); - - - if (Memory.HeaderCount == 0) - S9xMessage(S9X_INFO, S9X_HEADERS_INFO, "No ROM file header found."); - else - { - if (Memory.HeaderCount == 1) - S9xMessage(S9X_INFO, S9X_HEADERS_INFO, - "Found ROM file header (and ignored it)."); - else - S9xMessage(S9X_INFO, S9X_HEADERS_INFO, - "Found multiple ROM file headers (and ignored them)."); - } - return TotalFileSize; } #endif @@ -735,9 +705,6 @@ bool LoadROM( retry_count = 0; again: - Settings.DisplayColor = 0xffff; - SET_UI_COLOR(255, 255, 255); - #ifdef LOAD_FROM_MEMORY_TEST strncpy(Memory.ROMFilename, game->path, sizeof(Memory.ROMFilename)); @@ -748,17 +715,12 @@ again: if ((((game->size & 0x1FFF) == 0x200) && !Settings.ForceNoHeader) || Settings.ForceHeader) { - S9xMessage(S9X_INFO, S9X_HEADERS_INFO, - "Found ROM file header (and ignored it)."); TotalFileSize -= 0x200; src += 0x200; Memory.HeaderCount = 1; } - else - { - S9xMessage(S9X_INFO, S9X_HEADERS_INFO, "No ROM file header found."); - } + if (TotalFileSize > MAX_ROM_SIZE) return false; @@ -777,25 +739,6 @@ again: { Memory.ROM[0x7FD5] = 0x31; Memory.ROM[0x7FD6] = 0x02; - Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); - SET_UI_COLOR(255, 0, 0); - S9xMessage(S9X_ERROR, S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); - } - - if ((strncmp("HONKAKUHA IGO GOSEI", (char*)&Memory.ROM[0xFFC0], 19) == 0) && (Memory.ROM[0xFFD5] != 0x31)) - { - Memory.ROM[0xFFD5] = 0x31; - Memory.ROM[0xFFD6] = 0x02; - Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); - SET_UI_COLOR(255, 0, 0); - S9xMessage(S9X_ERROR, S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); - } - - if ((Memory.ROM[0x7FD5] == 0x42) && (Memory.ROM[0x7FD6] == 0x13) && (strncmp("METAL COMBAT", (char*)&Memory.ROM[0x7FC0], 12) == 0)) - { - Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); - SET_UI_COLOR(255, 0, 0); - S9xMessage(S9X_ERROR, S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); } #ifndef NO_SPEEDHACKS @@ -854,8 +797,6 @@ again: memmove(Memory.ROM, Memory.ROM + 512, TotalFileSize - 512); #endif TotalFileSize -= 512; - S9xMessage(S9X_INFO, S9X_HEADER_WARNING, - "Try specifying the -nhd command line option if the game doesn't work\n"); } Memory.CalculatedSize = TotalFileSize & ~0x1FFF; // round down to lower 0x2000 @@ -869,17 +810,10 @@ again: //If both vectors are invalid, it's type 1 LoROM if (Memory.ExtendedFormat == NOPE && - ((Memory.ROM[0x7FFC] | (Memory.ROM[0x7FFD] << 8)) < 0x8000) && - ((Memory.ROM[0xFFFC] | (Memory.ROM[0xFFFD] << 8)) < 0x8000)) - { - if (Settings.DisplayColor == 0xffff) - { - Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); - SET_UI_COLOR(0, 255, 0); - } - if (!Settings.ForceInterleaved) - S9xDeinterleaveType1(TotalFileSize, Memory.ROM); - } + ((Memory.ROM[0x7FFC] | (Memory.ROM[0x7FFD] << 8)) < 0x8000) && + ((Memory.ROM[0xFFFC] | (Memory.ROM[0xFFFD] << 8)) < 0x8000) && + !Settings.ForceInterleaved) + S9xDeinterleaveType1(TotalFileSize, Memory.ROM); //CalculatedSize is now set, so rescore hi_score = ScoreHiROM(false, 0); @@ -972,8 +906,6 @@ again: if (!Settings.ForceNotInterleaved && Interleaved) { CPU.TriedInterleavedMode2 = true; - S9xMessage(S9X_INFO, S9X_ROM_INTERLEAVED_INFO, - "ROM image is in interleaved format - converting..."); if (Tales) { @@ -1003,11 +935,6 @@ again: } else { - if (Settings.DisplayColor == 0xffff) - { - Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); - SET_UI_COLOR(0, 255, 0); - } bool t = Memory.LoROM; Memory.LoROM = Memory.HiROM; @@ -1024,8 +951,6 @@ again: { if (retry_count == 0) { - S9xMessage(S9X_INFO, S9X_ROM_CONFUSING_FORMAT_INFO, - "ROM lied about its type! Trying again."); Settings.ForceNotInterleaved = true; Settings.ForceInterleaved = false; retry_count++; @@ -1058,15 +983,6 @@ void S9xDeinterleaveMode2(void) void S9xDeinterleaveType2(bool reset) { - if (Settings.DisplayColor == 0xffff || Settings.DisplayColor == BUILD_PIXEL(0, 31, 0)) - { - Settings.DisplayColor = BUILD_PIXEL(31, 14, 6); - SET_UI_COLOR(255, 119, 25); - - } - S9xMessage(S9X_INFO, S9X_ROM_INTERLEAVED_INFO, - "ROM image is in interleaved format - converting..."); - int32_t nblocks = Memory.CalculatedSize >> 16; int32_t step = 64; @@ -1426,20 +1342,7 @@ void InitROM(bool Interleaved) *p = 0; } - { - Memory.SRAMMask = Memory.SRAMSize ? - ((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0; - } - if ((Memory.ROMChecksum + Memory.ROMComplementChecksum != 0xffff) || - Memory.ROMChecksum != Memory.CalculatedChecksum || - ((uint32_t)Memory.CalculatedSize > (uint32_t)(((1 << (Memory.ROMSize - 7)) * 128) * 1024))) - { - if (Settings.DisplayColor == 0xffff || Settings.DisplayColor != BUILD_PIXEL(31, 0, 0)) - { - Settings.DisplayColor = BUILD_PIXEL(31, 31, 0); - SET_UI_COLOR(255, 255, 0); - } - } + Memory.SRAMMask = Memory.SRAMSize ? ((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0; #ifndef USE_BLARGG_APU IAPU.OneCycle = ONE_APU_CYCLE; @@ -1470,7 +1373,7 @@ void InitROM(bool Interleaved) Memory.CompanyId, Memory.ROMCRC32); - S9xMessage(S9X_INFO, S9X_ROM_INFO, String); + S9xMessage(String); Settings.ForceHeader = Settings.ForceHiROM = Settings.ForceLoROM = Settings.ForceInterleaved = Settings.ForceNoHeader = Settings.ForceNotInterleaved = @@ -1969,15 +1872,6 @@ void HiROMMap() mask[0] = (Memory.CalculatedSize / 0x10000) - 1; - if (Settings.ForceSA1 || - (!Settings.ForceNoSA1 && (Memory.ROMSpeed & ~0x10) == 0x23 && - (Memory.ROMType & 0xf) > 3 && (Memory.ROMType & 0xf0) == 0x30)) - { - Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); - SET_UI_COLOR(255, 0, 0); - } - - int32_t x; bool foundZeros; bool pastZeros; @@ -2097,15 +1991,6 @@ void TalesROMMap(bool Interleaved) { int32_t c; int32_t i; - - if (Interleaved) - { - if (Settings.DisplayColor == 0xffff) - { - Settings.DisplayColor = BUILD_PIXEL(0, 31, 0); - SET_UI_COLOR(0, 255, 0); - } - } uint32_t OFFSET0 = 0x400000; uint32_t OFFSET1 = 0x400000; uint32_t OFFSET2 = 0x000000; @@ -2171,15 +2056,6 @@ void TalesROMMap(bool Interleaved) } } - if ((strncmp("TALES", (char*)Memory.Map[8] + 0xFFC0, 5) == 0)) - { - if (*(Memory.Map[8] + 0xFFDE) == *(Memory.Map[0x808] + 0xFFDE)) - { - Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); - SET_UI_COLOR(255, 0, 0); - } - } - Memory.ROMChecksum = *(Memory.Map[8] + 0xFFDE) + (*(Memory.Map[8] + 0xFFDF) << 8); Memory.ROMComplementChecksum = *(Memory.Map[8] + 0xFFDC) + (*(Memory.Map[8] + 0xFFDD) << 8); @@ -2975,15 +2851,6 @@ void ApplyROMFixes() [14:25:27] <@Nach> case 0x340f23e5: //Donkey Kong Country 3 (U) copier hack - handled */ - if (Memory.ROMCRC32 == 0x6810aa95 || Memory.ROMCRC32 == 0x340f23e5 || Memory.ROMCRC32 == 0x77fd806a || - strncmp(Memory.ROMName, "HIGHWAY BATTLE 2", 16) == 0 || - (strcmp(Memory.ROMName, "FX SKIING NINTENDO 96") == 0 - && Memory.ROM[0x7FDA] == 0)) - { - Settings.DisplayColor = BUILD_PIXEL(31, 0, 0); - SET_UI_COLOR(255, 0, 0); - } - //Ambiguous chip function pointer assignments //DSP switching: @@ -3173,24 +3040,11 @@ void ApplyROMFixes() strcmp(Memory.ROMName, "King Arthurs World") == 0) SNESGameFixes.EchoOnlyOutput = true; - Settings.DaffyDuck = (strcmp(Memory.ROMName, "DAFFY DUCK: MARV MISS") == 0) || - (strcmp(Memory.ROMName, "ROBOCOP VS THE TERMIN") == 0) || - (strcmp(Memory.ROMName, "ROBOCOP VS TERMINATOR") == 0); Settings.HBlankStart = (256 * Settings.H_Max) / SNES_HCOUNTER_MAX; //OAM hacks because we don't fully understand the //behavior of the SNES. - //Totally wacky display... - //seems to need a disproven behavior, so - //we're definitely overlooking some other bug? - if (strncmp(Memory.ROMName, "UNIRACERS", 9) == 0) - SNESGameFixes.Uniracers = true; - - //is this even useful now? - if (strcmp(Memory.ROMName, "ALIENS vs. PREDATOR") == 0) - SNESGameFixes.alienVSpredetorFix = true; - if (strcmp(Memory.ROMName, "\xBD\xB0\xCA\xDF\xB0\xCC\xA7\xD0\xBD\xC0") == 0 || //Super Famista strcmp(Memory.ROMName, "\xBD\xB0\xCA\xDF\xB0\xCC\xA7\xD0\xBD\xC0 2") == 0 || //Super Famista 2 strcmp(Memory.ROMName, "ZENKI TENCHIMEIDOU") == 0 || diff --git a/source/messages.h b/source/messages.h deleted file mode 100644 index 00776ca..0000000 --- a/source/messages.h +++ /dev/null @@ -1,51 +0,0 @@ -#include "../copyright" - -#ifndef _messages_h_ -#define _messages_h_ - -/* Types of message sent to S9xMessage routine */ -enum -{ - S9X_TRACE, - S9X_DEBUG, - S9X_WARNING, - S9X_INFO, - S9X_ERROR, - S9X_FATAL_ERROR -}; - -/* Individual message numbers */ -enum -{ - S9X_ROM_INFO, - S9X_HEADERS_INFO, - S9X_ROM_CONFUSING_FORMAT_INFO, - S9X_ROM_INTERLEAVED_INFO, - S9X_SOUND_DEVICE_OPEN_FAILED, - S9X_APU_STOPPED, - S9X_USAGE, - S9X_GAME_GENIE_CODE_ERROR, - S9X_ACTION_REPLY_CODE_ERROR, - S9X_GOLD_FINGER_CODE_ERROR, - S9X_DEBUG_OUTPUT, - S9X_DMA_TRACE, - S9X_HDMA_TRACE, - S9X_WRONG_FORMAT, - S9X_WRONG_VERSION, - S9X_ROM_NOT_FOUND, - S9X_FREEZE_FILE_NOT_FOUND, - S9X_PPU_TRACE, - S9X_TRACE_DSP1, - S9X_FREEZE_ROM_NAME, - S9X_HEADER_WARNING, - S9X_NETPLAY_NOT_SERVER, - S9X_FREEZE_FILE_INFO, - S9X_TURBO_MODE, - S9X_SOUND_NOT_BUILT, - S9X_MOVIE_INFO, - S9X_WRONG_MOVIE_SNAPSHOT, - S9X_NOT_A_MOVIE_SNAPSHOT, - S9X_AVI_INFO -}; - -#endif diff --git a/source/obc1.c b/source/obc1.c index 2d46238..4263284 100644 --- a/source/obc1.c +++ b/source/obc1.c @@ -16,16 +16,12 @@ uint8_t GetOBC1(uint16_t Address) { case 0x7ff0: return OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2)]; - case 0x7ff1: return OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 1]; - case 0x7ff2: return OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 2]; - case 0x7ff3: return OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 3]; - case 0x7ff4: return OBC1_RAM[OBC1_BasePtr + (OBC1_Address >> 2) + 0x200]; } @@ -38,29 +34,17 @@ void SetOBC1(uint8_t Byte, uint16_t Address) switch (Address) { case 0x7ff0: - { OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2)] = Byte; break; - } - case 0x7ff1: - { OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 1] = Byte; break; - } - case 0x7ff2: - { OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 2] = Byte; break; - } - case 0x7ff3: - { OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 3] = Byte; break; - } - case 0x7ff4: { uint8_t Temp; @@ -69,7 +53,6 @@ void SetOBC1(uint8_t Byte, uint16_t Address) OBC1_RAM[OBC1_BasePtr + (OBC1_Address >> 2) + 0x200] = Temp; break; } - case 0x7ff5: { if (Byte & 1) @@ -80,14 +63,12 @@ void SetOBC1(uint8_t Byte, uint16_t Address) OBC1_RAM[0x1ff5] = Byte; break; } - case 0x7ff6: { OBC1_Address = Byte & 0x7f; OBC1_Shift = (Byte & 3) << 1; break; } - default: OBC1_RAM[Address & 0x1fff] = Byte; break; diff --git a/source/port.h b/source/port.h index b887fe1..bbe28c3 100644 --- a/source/port.h +++ b/source/port.h @@ -53,7 +53,8 @@ void _splitpath(const char* path, char* drive, char* dir, char* fname, #include <libretro.h> -#define MIN(A,B) ((A) < (B) ? (A) : (B)) -#define MAX(A,B) ((A) > (B) ? (A) : (B)) +#define ABS(X) ((X) < 0 ? -(X) : (X)) +#define MIN(A,B) ((A) < (B) ? (A) : (B)) +#define MAX(A,B) ((A) > (B) ? (A) : (B)) #endif diff --git a/source/ppu.c b/source/ppu.c index 9ef69d5..bf1aa8a 100644 --- a/source/ppu.c +++ b/source/ppu.c @@ -18,19 +18,19 @@ extern struct FxInit_s SuperFX; extern uint8_t mul_brightness [16][32]; -uint32_t justifiers = 0xFFFF00AA; +uint32_t justifiers = 0xffff00aa; uint8_t in_bit = 0; extern uint8_t* HDMAMemPointers [8]; void S9xLatchCounters(bool force) { - if (!force && !(Memory.FillRAM[0x4213] & 0x80)) return; + if (!force && !(Memory.FillRAM[0x4213] & 0x80)) + return; PPU.HVBeamCounterLatched = 1; PPU.VBeamPosLatched = (uint16_t) CPU.V_Counter; - PPU.HBeamPosLatched = (uint16_t)((CPU.Cycles * SNES_HCOUNTER_MAX) / - Settings.H_Max); + PPU.HBeamPosLatched = (uint16_t)((CPU.Cycles * SNES_HCOUNTER_MAX) / Settings.H_Max); Memory.FillRAM [0x213F] |= 0x40; } @@ -100,8 +100,7 @@ void S9xFixColourBrightness() IPPU.Red [i] = IPPU.XB [PPU.CGDATA [i] & 0x1f]; IPPU.Green [i] = IPPU.XB [(PPU.CGDATA [i] >> 5) & 0x1f]; IPPU.Blue [i] = IPPU.XB [(PPU.CGDATA [i] >> 10) & 0x1f]; - IPPU.ScreenColors [i] = BUILD_PIXEL(IPPU.Red [i], IPPU.Green [i], - IPPU.Blue [i]); + IPPU.ScreenColors [i] = BUILD_PIXEL(IPPU.Red [i], IPPU.Green [i], IPPU.Blue [i]); } } @@ -127,7 +126,6 @@ static void S9xSetSuperFX(uint8_t Byte, uint16_t Address) FxFlushCache(); } break; - case 0x3031: case 0x3033: case 0x3037: @@ -151,7 +149,6 @@ static void S9xSetSuperFX(uint8_t Byte, uint16_t Address) Memory.FillRAM [0x3000 + GSU_SFR] |= FLG_G; S9xSuperFXExec(); break; - default: if (Address >= 0x3100) FxCacheWriteAccess(Address); @@ -190,7 +187,6 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) } } break; - case 0x2101: // Sprite (OBJ) tile address if (Byte != Memory.FillRAM [0x2101]) @@ -202,7 +198,6 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) IPPU.OBJChanged = true; } break; - case 0x2102: // Sprite write address (low) PPU.OAMAddr = ((Memory.FillRAM[0x2103] & 1) << 8) | Byte; @@ -215,7 +210,6 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) IPPU.OBJChanged = true; } break; - case 0x2103: // Sprite register write address (high), sprite priority rotation // bit. @@ -242,12 +236,10 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) PPU.OAMReadFlip = 0; PPU.SavedOAMAddr = PPU.OAMAddr; break; - case 0x2104: // Sprite register write REGISTER_2104(Byte); break; - case 0x2105: // Screen mode (0 - 7), background tile sizes and background 3 // priority @@ -262,10 +254,9 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) // BJ: BG3Priority only takes effect if BGMode==1 and the bit is set PPU.BG3Priority = ((Byte & 0x0f) == 0x09); if (PPU.BGMode == 5 || PPU.BGMode == 6) - IPPU.Interlace = Memory.FillRAM[0x2133] & 1; + IPPU.Interlace = (bool) (Memory.FillRAM[0x2133] & 1); } break; - case 0x2106: // Mosaic pixel size and enable if (Byte != Memory.FillRAM [0x2106]) @@ -289,7 +280,6 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) PPU.BG[Address - 0x2107].SCBase = (Byte & 0x7c) << 8; } break; - case 0x210B: // [BG01NBA] if (Byte != Memory.FillRAM [0x210b]) { @@ -298,7 +288,6 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) PPU.BG[1].NameBase = ((Byte >> 4) & 7) << 12; } break; - case 0x210C: // [BG23NBA] if (Byte != Memory.FillRAM [0x210c]) { @@ -307,56 +296,44 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) PPU.BG[3].NameBase = ((Byte >> 4) & 7) << 12; } break; - - //This is the Theme Park fix - it appears all these registers //share a previous byte value for setting them. - case 0x210D: PPU.BG[0].HOffset = (Byte << 8) | PPU.BGnxOFSbyte; PPU.BGnxOFSbyte = Byte; break; - case 0x210E: PPU.BG[0].VOffset = (Byte << 8) | PPU.BGnxOFSbyte; PPU.BGnxOFSbyte = Byte; break; - case 0x210F: PPU.BG[1].HOffset = (Byte << 8) | PPU.BGnxOFSbyte; PPU.BGnxOFSbyte = Byte; break; - case 0x2110: PPU.BG[1].VOffset = (Byte << 8) | PPU.BGnxOFSbyte; PPU.BGnxOFSbyte = Byte; break; - case 0x2111: PPU.BG[2].HOffset = (Byte << 8) | PPU.BGnxOFSbyte; PPU.BGnxOFSbyte = Byte; break; - case 0x2112: PPU.BG[2].VOffset = (Byte << 8) | PPU.BGnxOFSbyte; PPU.BGnxOFSbyte = Byte; break; - case 0x2113: PPU.BG[3].HOffset = (Byte << 8) | PPU.BGnxOFSbyte; PPU.BGnxOFSbyte = Byte; break; - case 0x2114: PPU.BG[3].VOffset = (Byte << 8) | PPU.BGnxOFSbyte; PPU.BGnxOFSbyte = Byte; break; - //end Theme Park - case 0x2115: // VRAM byte/word access flag and increment - PPU.VMA.High = (Byte & 0x80) == 0 ? false : true; + PPU.VMA.High = (bool) (Byte & 0x80); switch (Byte & 3) { case 0: @@ -382,67 +359,28 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) else PPU.VMA.FullGraphicCount = 0; break; - case 0x2116: // VRAM read/write address (low) PPU.VMA.Address &= 0xFF00; PPU.VMA.Address |= Byte; -#ifdef CORRECT_VRAM_READS - if (PPU.VMA.FullGraphicCount) - { - uint32_t addr = PPU.VMA.Address; - uint32_t rem = addr & PPU.VMA.Mask1; - uint32_t address = (addr & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); - IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((address << 1) & 0xFFFF)); - } - else - IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((PPU.VMA.Address << 1) & - 0xffff)); -#else IPPU.FirstVRAMRead = true; -#endif break; - case 0x2117: // VRAM read/write address (high) PPU.VMA.Address &= 0x00FF; PPU.VMA.Address |= Byte << 8; -#ifdef CORRECT_VRAM_READS - if (PPU.VMA.FullGraphicCount) - { - uint32_t addr = PPU.VMA.Address; - uint32_t rem = addr & PPU.VMA.Mask1; - uint32_t address = (addr & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); - IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((address << 1) & 0xFFFF)); - } - else - IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((PPU.VMA.Address << 1) & - 0xffff)); -#else IPPU.FirstVRAMRead = true; -#endif break; - case 0x2118: // VRAM write data (low) -#ifndef CORRECT_VRAM_READS IPPU.FirstVRAMRead = true; -#endif REGISTER_2118(Byte); break; - case 0x2119: // VRAM write data (high) -#ifndef CORRECT_VRAM_READS IPPU.FirstVRAMRead = true; -#endif REGISTER_2119(Byte); break; - case 0x211a: // Mode 7 outside rotation area display mode and flipping if (Byte != Memory.FillRAM [0x211a]) @@ -451,8 +389,8 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) PPU.Mode7Repeat = Byte >> 6; if (PPU.Mode7Repeat == 1) PPU.Mode7Repeat = 0; - PPU.Mode7VFlip = (Byte & 2) >> 1; - PPU.Mode7HFlip = Byte & 1; + PPU.Mode7VFlip = (bool) (Byte & 2); + PPU.Mode7HFlip = (bool) (Byte & 1); } break; case 0x211b: @@ -481,18 +419,15 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) // Mode 7 centre of rotation Y (low & high) PPU.CentreY = ((PPU.CentreY >> 8) & 0xff) | (Byte << 8); break; - case 0x2121: // CG-RAM address - PPU.CGFLIP = 0; - PPU.CGFLIPRead = 0; + PPU.CGFLIP = false; + PPU.CGFLIPRead = false; PPU.CGADD = Byte; break; - case 0x2122: REGISTER_2122(Byte); break; - case 0x2123: // Window 1 and 2 enable for backgrounds 1 and 2 if (Byte != Memory.FillRAM [0x2123]) @@ -619,26 +554,16 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) return; } break; - case 0x212e: - // Window mask designation for main screen ? - case 0x212f: - // Window mask designation for sub-screen ? + case 0x212e: // Window mask designation for main screen ? + case 0x212f: // Window mask designation for sub-screen ? + case 0x2130: // Fixed colour addition or screen addition if (Byte != Memory.FillRAM [Address]) { FLUSH_REDRAW(); PPU.RecomputeClipWindows = true; } break; - case 0x2130: - // Fixed colour addition or screen addition - if (Byte != Memory.FillRAM [0x2130]) - { - FLUSH_REDRAW(); - PPU.RecomputeClipWindows = true; - } - break; - case 0x2131: - // Colour addition or subtraction select + case 0x2131: // Colour addition or subtraction select if (Byte != Memory.FillRAM[0x2131]) { FLUSH_REDRAW(); @@ -671,7 +596,8 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) else IPPU.RenderedScreenHeight = PPU.ScreenHeight; } - else PPU.ScreenHeight = SNES_HEIGHT; + else + PPU.ScreenHeight = SNES_HEIGHT; if ((Memory.FillRAM [0x2133] ^ Byte) & 3) { @@ -679,10 +605,9 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) if ((Memory.FillRAM [0x2133] ^ Byte) & 2) IPPU.OBJChanged = true; if (PPU.BGMode == 5 || PPU.BGMode == 6) - IPPU.Interlace = Byte & 1; - IPPU.InterlaceSprites = 0; + IPPU.Interlace = (bool) (Byte & 1); + IPPU.InterlaceSprites = false; } - } break; case 0x2134: @@ -829,11 +754,9 @@ void S9xSetPPU(uint8_t Byte, uint16_t Address) { S9xSetSuperFX(Byte, Address); return; - } } Memory.FillRAM[Address] = Byte; - } /******************************************************************************/ @@ -849,18 +772,13 @@ uint8_t S9xGetPPU(uint16_t Address) { switch (Address) { - case 0x2100: - case 0x2101: - case 0x2102: - case 0x2103: - return OpenBus; - case 0x2104: case 0x2105: case 0x2106: case 0x2108: case 0x2109: case 0x210a: + case 0x2114: case 0x2115: case 0x2116: case 0x2118: @@ -873,45 +791,6 @@ uint8_t S9xGetPPU(uint16_t Address) case 0x2129: case 0x212a: return PPU.OpenBus1; - - case 0x2107: - case 0x2117: - case 0x2121: - case 0x2122: - case 0x2123: - case 0x2127: - case 0x212b: - case 0x212c: - case 0x212d: - case 0x212e: - case 0x212f: - case 0x2130: - case 0x2131: - case 0x2132: - case 0x2133: - return OpenBus; - - case 0x210b: - case 0x210c: - case 0x210d: - case 0x210e: - case 0x210f: - case 0x2110: - case 0x2111: - case 0x2112: - case 0x2113: - return OpenBus; - - case 0x2114: - case 0x211b: - case 0x211c: - case 0x211d: - case 0x211e: - case 0x211f: - case 0x2120: - return OpenBus; - - case 0x2134: case 0x2135: case 0x2136: @@ -919,7 +798,6 @@ uint8_t S9xGetPPU(uint16_t Address) if (PPU.Need16x8Mulitply) { int32_t r = (int32_t) PPU.MatrixA * (int32_t)(PPU.MatrixB >> 8); - Memory.FillRAM[0x2134] = (uint8_t) r; Memory.FillRAM[0x2135] = (uint8_t)(r >> 8); Memory.FillRAM[0x2136] = (uint8_t)(r >> 16); @@ -929,7 +807,6 @@ uint8_t S9xGetPPU(uint16_t Address) case 0x2137: S9xLatchCounters(0); return OpenBus; - case 0x2138: // Read OAM (sprite) control data if (PPU.OAMAddr & 0x100) @@ -942,7 +819,7 @@ uint8_t S9xGetPPU(uint16_t Address) PPU.OAMAddr = (PPU.OAMAddr + 1) & 0x1ff; if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) { - PPU.FirstSprite = (PPU.OAMAddr & 0xFE) >> 1; + PPU.FirstSprite = (PPU.OAMAddr & 0xfe) >> 1; IPPU.OBJChanged = true; } } @@ -957,37 +834,17 @@ uint8_t S9xGetPPU(uint16_t Address) ++PPU.OAMAddr; if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) { - PPU.FirstSprite = (PPU.OAMAddr & 0xFE) >> 1; + PPU.FirstSprite = (PPU.OAMAddr & 0xfe) >> 1; IPPU.OBJChanged = true; } } } PPU.OAMFlip ^= 1; return (PPU.OpenBus1 = byte); - case 0x2139: // Read vram low byte -#ifdef CORRECT_VRAM_READS - byte = IPPU.VRAMReadBuffer & 0xff; - if (!PPU.VMA.High) - { - if (PPU.VMA.FullGraphicCount) - { - uint32_t addr = PPU.VMA.Address; - uint32_t rem = addr & PPU.VMA.Mask1; - uint32_t address = (addr & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); - IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((address << 1) & 0xFFFF)); - } - else - IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((PPU.VMA.Address << 1) & - 0xffff)); - PPU.VMA.Address += PPU.VMA.Increment; - } -#else if (IPPU.FirstVRAMRead) - byte = Memory.VRAM[(PPU.VMA.Address << 1) & 0xFFFF]; + byte = Memory.VRAM[(PPU.VMA.Address << 1) & 0xffff]; else if (PPU.VMA.FullGraphicCount) { uint32_t addr = PPU.VMA.Address - 1; @@ -995,7 +852,7 @@ uint8_t S9xGetPPU(uint16_t Address) uint32_t address = (addr & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); - byte = Memory.VRAM [((address << 1) - 2) & 0xFFFF]; + byte = Memory.VRAM [((address << 1) - 2) & 0xffff]; } else byte = Memory.VRAM[((PPU.VMA.Address << 1) - 2) & 0xffff]; @@ -1005,30 +862,9 @@ uint8_t S9xGetPPU(uint16_t Address) PPU.VMA.Address += PPU.VMA.Increment; IPPU.FirstVRAMRead = false; } -#endif - PPU.OpenBus1 = byte; - break; + return (PPU.OpenBus1 = byte); case 0x213A: // Read vram high byte -#ifdef CORRECT_VRAM_READS - byte = (IPPU.VRAMReadBuffer >> 8) & 0xff; - if (PPU.VMA.High) - { - if (PPU.VMA.FullGraphicCount) - { - uint32_t addr = PPU.VMA.Address; - uint32_t rem = addr & PPU.VMA.Mask1; - uint32_t address = (addr & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); - IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((address << 1) & 0xFFFF)); - } - else - IPPU.VRAMReadBuffer = READ_WORD(Memory.VRAM + ((PPU.VMA.Address << 1) & - 0xffff)); - PPU.VMA.Address += PPU.VMA.Increment; - } -#else if (IPPU.FirstVRAMRead) byte = Memory.VRAM[((PPU.VMA.Address << 1) + 1) & 0xffff]; else if (PPU.VMA.FullGraphicCount) @@ -1038,67 +874,52 @@ uint8_t S9xGetPPU(uint16_t Address) uint32_t address = (addr & ~PPU.VMA.Mask1) + (rem >> PPU.VMA.Shift) + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); - byte = Memory.VRAM [((address << 1) - 1) & 0xFFFF]; + byte = Memory.VRAM [((address << 1) - 1) & 0xffff]; } else - byte = Memory.VRAM[((PPU.VMA.Address << 1) - 1) & 0xFFFF]; + byte = Memory.VRAM[((PPU.VMA.Address << 1) - 1) & 0xffff]; if (PPU.VMA.High) { PPU.VMA.Address += PPU.VMA.Increment; IPPU.FirstVRAMRead = false; } -#endif - PPU.OpenBus1 = byte; - break; - + return (PPU.OpenBus1 = byte); case 0x213B: // Read palette data if (PPU.CGFLIPRead) - byte = PPU.CGDATA [PPU.CGADD++] >> 8; + byte = (PPU.OpenBus2 & 0x80) | ((PPU.CGDATA[PPU.CGADD++] >> 8) & 0x7f); else byte = PPU.CGDATA [PPU.CGADD] & 0xff; - PPU.CGFLIPRead ^= 1; + PPU.CGFLIPRead = !PPU.CGFLIPRead; return (PPU.OpenBus2 = byte); - case 0x213C: // Horizontal counter value 0-339 if (PPU.HBeamFlip) - byte = (PPU.OpenBus2 & 0xfe) - | ((PPU.HBeamPosLatched >> 8) & 0x01); - + byte = (PPU.OpenBus2 & 0xfe) | ((PPU.HBeamPosLatched >> 8) & 0x01); else byte = (uint8_t)PPU.HBeamPosLatched; - PPU.OpenBus2 = byte; PPU.HBeamFlip ^= 1; - break; - + return (PPU.OpenBus2 = byte); case 0x213D: // Vertical counter value 0-262 if (PPU.VBeamFlip) - byte = (PPU.OpenBus2 & 0xfe) - | ((PPU.VBeamPosLatched >> 8) & 0x01); + byte = (PPU.OpenBus2 & 0xfe) | ((PPU.VBeamPosLatched >> 8) & 0x01); else byte = (uint8_t)PPU.VBeamPosLatched; - PPU.OpenBus2 = byte; PPU.VBeamFlip ^= 1; - break; - + return (PPU.OpenBus2 = byte); case 0x213E: // PPU time and range over flags FLUSH_REDRAW(); - - //so far, 5c77 version is always 1. - return (PPU.OpenBus1 = (Model->_5C77 | PPU.RangeTimeOver)); - + byte = (PPU.OpenBus1 & 0x10) | PPU.RangeTimeOver | Model->_5C77; + return (PPU.OpenBus1 = byte); case 0x213F: // NTSC/PAL and which field flags PPU.VBeamFlip = PPU.HBeamFlip = 0; - //neviksti found a 2 and a 3 here. SNEeSe uses a 3. - //XXX: field flags not emulated - return ((Settings.PAL ? 0x10 : 0) | (Memory.FillRAM[0x213f] & 0xc0) | - Model->_5C78) | (~PPU.OpenBus2 & 0x20); - + byte = (PPU.OpenBus2 & 0x20) | (Memory.FillRAM[0x213f] & 0xc0) | (Settings.PAL ? 0x10 : 0) | Model->_5C78; + Memory.FillRAM[0x213f] &= ~0x40; + return (PPU.OpenBus2 = byte); case 0x2140: case 0x2141: case 0x2142: @@ -1175,10 +996,7 @@ uint8_t S9xGetPPU(uint16_t Address) { if (SNESGameFixes.APU_OutPorts_ReturnValueFix && Address >= 0x2140 && Address <= 0x2143 && !CPU.V_Counter) - { - return (uint8_t)((Address & 1) ? ((rand() & 0xff00) >> 8) : - (rand() & 0xff)); - } + return (uint8_t)((Address & 1) ? ((rand() & 0xff00) >> 8) : (rand() & 0xff)); return (APU.OutPorts [Address & 3]); } @@ -1211,27 +1029,24 @@ uint8_t S9xGetPPU(uint16_t Address) return ((r >> 3) & 0xff); } return (Memory.FillRAM[Address]); - #else // SPCTOOL return (S9xAPUReadPort(Address & 3)); #endif //#ifndef USE_BLARGG_APU - case 0x2180: // Read WRAM byte = Memory.RAM [PPU.WRAM++]; PPU.WRAM &= 0x1FFFF; - break; - case 0x2181: - case 0x2182: - case 0x2183: + return byte; default: return OpenBus; } } else { - if (Settings.SA1) - return (S9xGetSA1(Address)); + if (Settings.SA1 && Address >= 0x2200) + return S9xGetSA1(Address); + else if (Settings.SRTC && Address == 2800) + return S9xGetSRTC(Address); if (Address <= 0x2fff || Address >= 0x3300) { @@ -1245,12 +1060,6 @@ uint8_t S9xGetPPU(uint16_t Address) if (Model->_5C77 == 2) return (0); return OpenBus; - case 0x2800: - // For Dai Kaijyu Monogatari II - if (Settings.SRTC) - return (S9xGetSRTC(Address)); - /*FALL*/ - default: return OpenBus; } @@ -1271,9 +1080,9 @@ uint8_t S9xGetPPU(uint16_t Address) CLEAR_IRQ_SOURCE(GSU_IRQ_SOURCE); Memory.FillRAM [0x3031] = byte & 0x7f; } - return (byte); + return byte; } - return (byte); + return byte; } /******************************************************************************/ @@ -1340,15 +1149,13 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) PPU.HTimerEnabled = false; PPU.HTimerPosition = Settings.H_Max + 1; } - if (!Settings.DaffyDuck) + if (!(byte & 0x30)) CLEAR_IRQ_SOURCE(PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE); if ((byte & 0x80) && !(Memory.FillRAM [0x4200] & 0x80) && CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE && - CPU.V_Counter <= PPU.ScreenHeight + - (SNESGameFixes.alienVSpredetorFix ? 25 : 15) - && //jyam 15->25 alien vs predetor + // NMI can trigger during VBlank as long as NMI_read ($4210) wasn't cleared. // Panic Bomberman clears the NMI pending flag @ scanline 230 before enabling // NMIs again. The NMI routine crashes the CPU if it is called without the NMI // pending flag being set... @@ -1357,7 +1164,7 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) { CPU.Flags |= NMI_FLAG; CPU.NMIActive = true; - CPU.NMICycleCount = CPU.NMITriggerPoint; + CPU.NMICycleCount = CPU.Cycles + TWO_CYCLES; } break; case 0x4201: @@ -1366,7 +1173,7 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) Memory.FillRAM[0x4201] = Memory.FillRAM[0x4213] = byte; break; case 0x4202: - // Multiplier (for multply) + // Multiplier (for multiply) break; case 0x4203: { @@ -1416,7 +1223,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) if (PPU.HTimerEnabled && PPU.IRQHBeamPos != d) S9xUpdateHTimer(); break; - case 0x4208: d = PPU.IRQHBeamPos; PPU.IRQHBeamPos = (PPU.IRQHBeamPos & 0xFF) | ((byte & 1) << 8); @@ -1425,7 +1231,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) S9xUpdateHTimer(); break; - case 0x4209: d = PPU.IRQVBeamPos; PPU.IRQVBeamPos = (PPU.IRQVBeamPos & 0xFF00) | byte; @@ -1440,7 +1245,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) } } break; - case 0x420A: d = PPU.IRQVBeamPos; PPU.IRQVBeamPos = (PPU.IRQVBeamPos & 0xFF) | ((byte & 1) << 8); @@ -1455,7 +1259,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) } } break; - case 0x420B: if ((byte & 0x01) != 0) S9xDoDMA(0); @@ -1480,19 +1283,18 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) Memory.FillRAM[0x420c] = byte; IPPU.HDMA = byte; break; - case 0x420d: // Cycle speed 0 - 2.68Mhz, 1 - 3.58Mhz (banks 0x80 +) if ((byte & 1) != (Memory.FillRAM [0x420d] & 1)) { if (byte & 1) CPU.FastROMSpeed = ONE_CYCLE; - else CPU.FastROMSpeed = SLOW_ONE_CYCLE; + else + CPU.FastROMSpeed = SLOW_ONE_CYCLE; FixROMSpeed(); } break; - case 0x420e: case 0x420f: // --->>> Unknown @@ -1529,7 +1331,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) case 0x421f: // Joypad values (read-only) return; - case 0x4300: case 0x4310: case 0x4320: @@ -1539,13 +1340,13 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) case 0x4360: case 0x4370: d = (Address >> 4) & 0x7; - DMA[d].TransferDirection = (byte & 128) != 0 ? 1 : 0; - DMA[d].HDMAIndirectAddressing = (byte & 64) != 0 ? 1 : 0; - DMA[d].AAddressDecrement = (byte & 16) != 0 ? 1 : 0; - DMA[d].AAddressFixed = (byte & 8) != 0 ? 1 : 0; + DMA[d].TransferDirection = (bool) (byte & 0x80); + DMA[d].HDMAIndirectAddressing = (bool) (byte & 0x40); + Memory.FillRAM [Address | 0xf] = (byte & 0x20); + DMA[d].AAddressDecrement = (bool) (byte & 0x10); + DMA[d].AAddressFixed = (bool) (byte & 0x08); DMA[d].TransferMode = (byte & 7); break; - case 0x4301: case 0x4311: case 0x4321: @@ -1556,7 +1357,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) case 0x4371: DMA[((Address >> 4) & 0x7)].BAddress = byte; break; - case 0x4302: case 0x4312: case 0x4322: @@ -1569,7 +1369,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) DMA[d].AAddress &= 0xFF00; DMA[d].AAddress |= byte; break; - case 0x4303: case 0x4313: case 0x4323: @@ -1582,7 +1381,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) DMA[d].AAddress &= 0xFF; DMA[d].AAddress |= byte << 8; break; - case 0x4304: case 0x4314: case 0x4324: @@ -1593,9 +1391,7 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) case 0x4374: DMA[((Address >> 4) & 0x7)].ABank = byte; HDMAMemPointers[((Address >> 4) & 0x7)] = NULL; - break; - case 0x4305: case 0x4315: case 0x4325: @@ -1605,13 +1401,12 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) case 0x4365: case 0x4375: d = (Address >> 4) & 0x7; - DMA[d].TransferBytes &= 0xFF00; + DMA[d].TransferBytes &= 0xff00; DMA[d].TransferBytes |= byte; DMA[d].IndirectAddress &= 0xff00; DMA[d].IndirectAddress |= byte; HDMAMemPointers[d] = NULL; break; - case 0x4306: case 0x4316: case 0x4326: @@ -1627,7 +1422,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) DMA[d].IndirectAddress |= byte << 8; HDMAMemPointers[d] = NULL; break; - case 0x4307: case 0x4317: case 0x4327: @@ -1639,7 +1433,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) DMA[d = ((Address >> 4) & 0x7)].IndirectBank = byte; HDMAMemPointers[d] = NULL; break; - case 0x4308: case 0x4318: case 0x4328: @@ -1653,7 +1446,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) DMA[d].Address |= byte; HDMAMemPointers[d] = NULL; break; - case 0x4309: case 0x4319: case 0x4329: @@ -1667,7 +1459,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) DMA[d].Address |= byte << 8; HDMAMemPointers[d] = NULL; break; - case 0x430A: case 0x431A: case 0x432A: @@ -1680,17 +1471,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) DMA[d].LineCount = byte & 0x7f; DMA[d].Repeat = !(byte & 0x80); break; - - case 0x430F: - case 0x431F: - case 0x432F: - case 0x433F: - case 0x434F: - case 0x435F: - case 0x436F: - case 0x437F: - Address &= ~4; // Convert 43xF to 43xB - /* fall through */ case 0x430B: case 0x431B: case 0x432B: @@ -1699,9 +1479,17 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) case 0x435B: case 0x436B: case 0x437B: - // Unknown, but they seem to be RAM-ish + case 0x430F: + case 0x431F: + case 0x432F: + case 0x433F: + case 0x434F: + case 0x435F: + case 0x436F: + case 0x437F: + Memory.FillRAM [Address | 0xf] = byte; break; - + /* fall through */ //These registers are used by both the S-DD1 and the SPC7110 case 0x4800: case 0x4801: @@ -1710,16 +1498,15 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) if (Settings.SPC7110) S9xSetSPC7110(byte, Address); break; - case 0x4804: case 0x4805: case 0x4806: case 0x4807: if (Settings.SPC7110) S9xSetSPC7110(byte, Address); - else S9xSetSDD1MemoryMap(Address - 0x4804, byte & 7); + else + S9xSetSDD1MemoryMap(Address - 0x4804, byte & 7); break; - //these are used by the SPC7110 case 0x4808: case 0x4809: @@ -1765,7 +1552,6 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) S9xSetSPC7110(byte, Address); break; } - default: break; } @@ -1778,6 +1564,7 @@ void S9xSetCPU(uint8_t byte, uint16_t Address) /******************************************************************************/ uint8_t S9xGetCPU(uint16_t Address) { + int32_t d; uint8_t byte; if (Address < 0x4200) @@ -1866,7 +1653,6 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x420e: case 0x420f: return OpenBus; - case 0x4210: #ifdef CPU_SHUTDOWN CPU.WaitAddress = CPU.PCAtOpcodeStart; @@ -1874,31 +1660,19 @@ uint8_t S9xGetCPU(uint16_t Address) byte = Memory.FillRAM[0x4210]; Memory.FillRAM[0x4210] = Model->_5A22; //SNEeSe returns 2 for 5A22 version. - return ((byte & 0x80) - | (OpenBus & 0x70) - | Model->_5A22); - + return ((byte & 0x80) | (OpenBus & 0x70) | Model->_5A22); case 0x4211: - byte = (CPU.IRQActive & (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE)) ? - 0x80 : 0; - // Super Robot Wars Ex ROM bug requires this. - byte |= CPU.Cycles >= Settings.HBlankStart ? 0x40 : 0; + byte = (CPU.IRQActive & (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE)) ? 0x80 : 0; CLEAR_IRQ_SOURCE(PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE); - - // Maybe? Register Scan indicated open bus... - byte |= OpenBus & 0x3f; + byte |= OpenBus & 0x7f; return (byte); - case 0x4212: // V-blank, h-blank and joypads being read flags (read-only) #ifdef CPU_SHUTDOWN CPU.WaitAddress = CPU.PCAtOpcodeStart; #endif - return (REGISTER_4212() - | (OpenBus & 0x3E) - ); - + return (REGISTER_4212() | (OpenBus & 0x3E)); case 0x4213: // I/O port input - returns 0 wherever $4201 is 0, and 1 elsewhere // unless something else pulls it down (i.e. a gun) @@ -1919,8 +1693,8 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x421d: case 0x421e: case 0x421f: - // Joypads 1-4 button and direction state. - /* fall through */ + // Joypads 1-4 button and direction state. + return (Memory.FillRAM [Address]); case 0x4300: case 0x4310: case 0x4320: @@ -1929,8 +1703,13 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4350: case 0x4360: case 0x4370: - // DMA direction, address type, fixed flag, - /* fall through */ + d = (Address >> 4) & 0x7; + return ((DMA[d].TransferDirection ? 0x80 : 0x00) | + (DMA[d].HDMAIndirectAddressing ? 0x40 : 0x00) | + ((uint8_t) Memory.FillRAM [Address]) | + (DMA[d].AAddressDecrement ? 0x10 : 0x00) | + (DMA[d].AAddressFixed ? 0x08 : 0x00) | + (DMA[d].TransferMode & 7)); case 0x4301: case 0x4311: case 0x4321: @@ -1939,7 +1718,7 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4351: case 0x4361: case 0x4371: - /* fall through */ + return DMA[((Address >> 4) & 0x7)].BAddress; case 0x4302: case 0x4312: case 0x4322: @@ -1948,7 +1727,7 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4352: case 0x4362: case 0x4372: - /* fall through */ + return (DMA[((Address >> 4) & 0x7)].AAddress & 0xFF); case 0x4303: case 0x4313: case 0x4323: @@ -1957,7 +1736,7 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4353: case 0x4363: case 0x4373: - /* fall through */ + return (DMA[((Address >> 4) & 0x7)].AAddress >> 8); case 0x4304: case 0x4314: case 0x4324: @@ -1966,7 +1745,7 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4354: case 0x4364: case 0x4374: - /* fall through */ + return DMA[((Address >> 4) & 0x7)].ABank; case 0x4305: case 0x4315: case 0x4325: @@ -1975,7 +1754,7 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4355: case 0x4365: case 0x4375: - /* fall through */ + return (DMA[((Address >> 4) & 0x7)].IndirectAddress & 0xff); case 0x4306: case 0x4316: case 0x4326: @@ -1984,7 +1763,16 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4356: case 0x4366: case 0x4376: - /* fall through */ + return (DMA[((Address >> 4) & 0x7)].IndirectAddress >> 8); + case 0x4307: + case 0x4317: + case 0x4327: + case 0x4337: + case 0x4347: + case 0x4357: + case 0x4367: + case 0x4377: + return DMA[((Address >> 4) & 0x7)].IndirectBank; case 0x4308: case 0x4318: case 0x4328: @@ -1993,7 +1781,7 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4358: case 0x4368: case 0x4378: - /* fall through */ + return (DMA[((Address >> 4) & 0x7)].Address & 0xFF); case 0x4309: case 0x4319: case 0x4329: @@ -2002,18 +1790,7 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x4359: case 0x4369: case 0x4379: - return (Memory.FillRAM[Address]); - - case 0x4307: - case 0x4317: - case 0x4327: - case 0x4337: - case 0x4347: - case 0x4357: - case 0x4367: - case 0x4377: - return (DMA[(Address >> 4) & 7].IndirectBank); - + return (DMA[((Address >> 4) & 0x7)].Address >> 8); case 0x430A: case 0x431A: case 0x432A: @@ -2022,23 +1799,8 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x435A: case 0x436A: case 0x437A: - { - int32_t d = (Address & 0x70) >> 4; - if (IPPU.HDMA & (1 << d)) - return (DMA[d].LineCount); - return (Memory.FillRAM[Address]); - } - - case 0x430F: - case 0x431F: - case 0x432F: - case 0x433F: - case 0x434F: - case 0x435F: - case 0x436F: - case 0x437F: - Address &= ~4; // Convert 43xF to 43xB - /* fall through */ + d = (Address >> 4) & 0x7; + return (DMA[d].LineCount ^ (DMA[d].Repeat ? 0x00 : 0x80)); case 0x430B: case 0x431B: case 0x432B: @@ -2047,9 +1809,15 @@ uint8_t S9xGetCPU(uint16_t Address) case 0x435B: case 0x436B: case 0x437B: - // Unknown, but they seem to be RAM-ish - return (Memory.FillRAM[Address]); - + case 0x430F: + case 0x431F: + case 0x432F: + case 0x433F: + case 0x434F: + case 0x435F: + case 0x436F: + case 0x437F: + return (uint8_t) Memory.FillRAM [Address | 0xf]; default: if (Address >= 0x4800 && Settings.SPC7110) return S9xGetSPC7110(Address); @@ -2066,7 +1834,7 @@ static void CommonPPUReset() PPU.BGMode = 0; PPU.BG3Priority = 0; PPU.Brightness = 0; - PPU.VMA.High = 0; + PPU.VMA.High = false; PPU.VMA.Increment = 1; PPU.VMA.Address = 0; PPU.VMA.FullGraphicCount = 0; @@ -2098,15 +1866,14 @@ static void CommonPPUReset() PPU.ClipWindow1Inside[4] = PPU.ClipWindow1Inside[5] = true; PPU.ClipWindow2Inside[4] = PPU.ClipWindow2Inside[5] = true; - PPU.CGFLIP = 0; + PPU.CGFLIP = false; int32_t c; for (c = 0; c < 256; c++) { IPPU.Red [c] = (c & 7) << 2; IPPU.Green [c] = ((c >> 3) & 7) << 2; IPPU.Blue [c] = ((c >> 6) & 2) << 3; - PPU.CGDATA [c] = IPPU.Red [c] | (IPPU.Green [c] << 5) | - (IPPU.Blue [c] << 10); + PPU.CGDATA [c] = IPPU.Red [c] | (IPPU.Green [c] << 5) | (IPPU.Blue [c] << 10); } PPU.FirstSprite = 0; @@ -2150,12 +1917,9 @@ static void CommonPPUReset() PPU.WRAM = 0; PPU.BG_Forced = 0; PPU.ForcedBlanking = true; - PPU.OBJThroughMain = false; - PPU.OBJThroughSub = false; PPU.OBJSizeSelect = 0; PPU.OBJNameSelect = 0; PPU.OBJNameBase = 0; - PPU.OBJAddition = false; PPU.OAMReadFlip = 0; PPU.BGnxOFSbyte = 0; memset(PPU.OAMData, 0, 512 + 32); @@ -2174,7 +1938,7 @@ static void CommonPPUReset() PPU.Window2Left = 1; PPU.Window2Right = 0; PPU.RecomputeClipWindows = true; - PPU.CGFLIPRead = 0; + PPU.CGFLIPRead = false; PPU.Need16x8Mulitply = false; PPU.MouseSpeed[0] = PPU.MouseSpeed[1] = 0; @@ -2182,7 +1946,7 @@ static void CommonPPUReset() IPPU.HDMA = 0; IPPU.HDMAStarted = false; IPPU.MaxBrightness = 0; - IPPU.LatchedBlanking = 0; + IPPU.LatchedBlanking = false; IPPU.OBJChanged = true; IPPU.RenderThisFrame = true; IPPU.DirectColourMapsNeedRebuild = true; @@ -2194,11 +1958,7 @@ static void CommonPPUReset() 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); -#ifdef CORRECT_VRAM_READS - IPPU.VRAMReadBuffer = 0; // XXX: FIXME: anything better? -#else IPPU.FirstVRAMRead = false; -#endif IPPU.Interlace = false; IPPU.InterlaceSprites = false; IPPU.DoubleWidthPixels = false; @@ -2527,10 +2287,9 @@ void S9xUpdateJoypads() uint32_t i; for (i = 0; i < 5; i++) + { IPPU.Joypads [i] = S9xReadJoypad(i); - for (i = 0; i < 5; i++) - { if ((IPPU.Joypads [i] & (SNES_LEFT_MASK | SNES_RIGHT_MASK)) == (SNES_LEFT_MASK | SNES_RIGHT_MASK)) IPPU.Joypads [i] &= ~SNES_RIGHT_MASK; @@ -2543,10 +2302,8 @@ void S9xUpdateJoypads() if (IPPU.Controller == SNES_JOYPAD || IPPU.Controller == SNES_MULTIPLAYER5) { for (i = 0; i < 5; i++) - { if (IPPU.Joypads [i]) IPPU.Joypads [i] |= 0xffff0000; - } } // Read mouse position if enabled @@ -2599,7 +2356,6 @@ void S9xUpdateJoypads() Memory.FillRAM [0x421b] = 0; S9xUpdateJustifiers(); } - } @@ -2681,17 +2437,16 @@ void REGISTER_2104(uint8_t byte) IPPU.OBJChanged = true; } } - else - { - if (PPU.OAMPriorityRotation && (PPU.OAMAddr & 1)) IPPU.OBJChanged = true; - } + else if (PPU.OAMPriorityRotation && (PPU.OAMAddr & 1)) + IPPU.OBJChanged = true; } else if (!(PPU.OAMFlip & 1)) { PPU.OAMWriteRegister &= 0xff00; PPU.OAMWriteRegister |= byte; PPU.OAMFlip |= 1; - if (PPU.OAMPriorityRotation && (PPU.OAMAddr & 1)) IPPU.OBJChanged = true; + if (PPU.OAMPriorityRotation && (PPU.OAMAddr & 1)) + IPPU.OBJChanged = true; } else { @@ -2853,22 +2608,19 @@ void REGISTER_2122(uint8_t Byte) } PPU.CGADD++; } - else + else if (Byte != (uint8_t)(PPU.CGDATA[PPU.CGADD] & 0xff)) { - if (Byte != (uint8_t)(PPU.CGDATA[PPU.CGADD] & 0xff)) - { - FLUSH_REDRAW(); - PPU.CGDATA[PPU.CGADD] &= 0x7F00; - PPU.CGDATA[PPU.CGADD] |= Byte; - IPPU.ColorsChanged = true; - IPPU.Red [PPU.CGADD] = IPPU.XB [Byte & 0x1f]; - IPPU.Green [PPU.CGADD] = IPPU.XB [(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; - IPPU.ScreenColors [PPU.CGADD] = (uint16_t) BUILD_PIXEL(IPPU.Red [PPU.CGADD], - IPPU.Green [PPU.CGADD], - IPPU.Blue [PPU.CGADD]); - } + FLUSH_REDRAW(); + PPU.CGDATA[PPU.CGADD] &= 0x7F00; + PPU.CGDATA[PPU.CGADD] |= Byte; + IPPU.ColorsChanged = true; + IPPU.Red [PPU.CGADD] = IPPU.XB [Byte & 0x1f]; + IPPU.Green [PPU.CGADD] = IPPU.XB [(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; + IPPU.ScreenColors [PPU.CGADD] = (uint16_t) BUILD_PIXEL(IPPU.Red [PPU.CGADD], + IPPU.Green [PPU.CGADD], + IPPU.Blue [PPU.CGADD]); } - PPU.CGFLIP ^= 1; + PPU.CGFLIP = !PPU.CGFLIP; } void REGISTER_2180(uint8_t Byte) diff --git a/source/ppu.h b/source/ppu.h index 1a83d6f..5101f02 100644 --- a/source/ppu.h +++ b/source/ppu.h @@ -18,9 +18,9 @@ extern uint16_t SignExtend [2]; #define PPU_H_BEAM_IRQ_SOURCE (1 << 0) #define PPU_V_BEAM_IRQ_SOURCE (1 << 1) -#define GSU_IRQ_SOURCE (1 << 2) -#define SA1_IRQ_SOURCE (1 << 7) -#define SA1_DMA_IRQ_SOURCE (1 << 5) +#define GSU_IRQ_SOURCE (1 << 2) +#define SA1_DMA_IRQ_SOURCE (1 << 5) +#define SA1_IRQ_SOURCE (1 << 7) struct ClipData { @@ -31,26 +31,22 @@ struct ClipData typedef struct { - bool ColorsChanged; - uint8_t HDMA; - bool HDMAStarted; - uint8_t MaxBrightness; - bool LatchedBlanking; - bool OBJChanged; - bool RenderThisFrame; - bool DirectColourMapsNeedRebuild; - uint32_t FrameCount; - uint32_t RenderedFramesCount; - uint32_t DisplayedRenderedFrameCount; - uint32_t SkippedFrames; - uint32_t FrameSkip; - uint8_t* TileCache [3]; - uint8_t* TileCached [3]; -#ifdef CORRECT_VRAM_READS - uint16_t VRAMReadBuffer; -#else - bool FirstVRAMRead; -#endif + bool ColorsChanged; + uint8_t HDMA; + bool HDMAStarted; + uint8_t MaxBrightness; + bool LatchedBlanking; + bool OBJChanged; + bool RenderThisFrame; + bool DirectColourMapsNeedRebuild; + uint32_t FrameCount; + uint32_t RenderedFramesCount; + uint32_t DisplayedRenderedFrameCount; + uint32_t SkippedFrames; + uint32_t FrameSkip; + uint8_t* TileCache [3]; + uint8_t* TileCached [3]; + bool FirstVRAMRead; bool DoubleHeightPixels; bool Interlace; bool InterlaceSprites; @@ -176,7 +172,7 @@ typedef struct bool ClipWindow1Inside [6]; bool ClipWindow2Inside [6]; bool RecomputeClipWindows; - uint8_t CGFLIPRead; + bool CGFLIPRead; uint16_t OBJNameSelect; bool Need16x8Mulitply; uint8_t Joypad3ButtonReadPos; diff --git a/source/sa1.c b/source/sa1.c index f7324b5..54ed836 100644 --- a/source/sa1.c +++ b/source/sa1.c @@ -13,7 +13,7 @@ static void S9xSA1ReadVariableLengthData(bool inc, bool no_shift); void S9xSA1Init() { SA1.NMIActive = false; - SA1.IRQActive = false; + SA1.IRQActive = 0; SA1.WaitingForInterrupt = false; SA1.Waiting = false; SA1.Flags = 0; @@ -413,7 +413,7 @@ void S9xSetSA1(uint8_t byte, uint32_t address) break; case 0x2231: if (byte & 0x80) - SA1.in_char_dma = false; + SA1.in_char_dma = 0; break; case 0x2236: Memory.FillRAM [address] = byte; @@ -426,7 +426,7 @@ void S9xSetSA1(uint8_t byte, uint32_t address) Memory.FillRAM [0x2300] |= 0x20; if (Memory.FillRAM [0x2201] & 0x20) S9xSetIRQ(SA1_DMA_IRQ_SOURCE); - SA1.in_char_dma = true; + SA1.in_char_dma = 1; } return; case 0x2237: @@ -476,7 +476,7 @@ void S9xSetSA1(uint8_t byte, uint32_t address) SA1.sum = SA1.op1 << 16; else { - uint64_t x = (SA1.op1 / (uint16_t) SA1.op2); + uint32_t x = (SA1.op1 / (uint16_t) SA1.op2); SA1.sum = x | ((SA1.op1 - (x * (uint16_t) SA1.op2)) << 16); } break; @@ -614,8 +614,7 @@ void S9xSA1ReadVariableLengthData(bool inc, bool no_shift) addr += (s >> 4) << 1; s &= 15; } - uint32_t data = S9xSA1GetWord(addr) | - (S9xSA1GetWord(addr + 2) << 16); + uint32_t data = S9xSA1GetWord(addr) | (S9xSA1GetWord(addr + 2) << 16); data >>= s; Memory.FillRAM [0x230c] = (uint8_t) data; diff --git a/source/sa1.h b/source/sa1.h index 2b83eb3..6eb9935 100644 --- a/source/sa1.h +++ b/source/sa1.h @@ -51,7 +51,7 @@ typedef struct int64_t sum; bool overflow; uint8_t VirtualBitmapFormat; - bool in_char_dma; + uint8_t in_char_dma; uint8_t variable_bit_pos; SSA1Registers Registers; } SSA1; @@ -78,6 +78,7 @@ void S9xSA1SetPCBase(uint32_t); uint8_t S9xGetSA1(uint32_t); void S9xSetSA1(uint8_t, uint32_t); +extern SOpcodes S9xSA1OpcodesE1 [256]; extern SOpcodes S9xSA1OpcodesM1X1 [256]; extern SOpcodes S9xSA1OpcodesM1X0 [256]; extern SOpcodes S9xSA1OpcodesM0X1 [256]; @@ -92,7 +93,7 @@ void S9xFixSA1AfterSnapshotLoad(); #define TIMER_IRQ_SOURCE (1 << 6) #define DMA_IRQ_SOURCE (1 << 5) -static inline void S9xSA1UnpackStatus(void) +static inline void S9xSA1UnpackStatus() { SA1._Zero = (SA1.Registers.PL & Zero) == 0; SA1._Negative = (SA1.Registers.PL & Negative); @@ -100,17 +101,17 @@ static inline void S9xSA1UnpackStatus(void) SA1._Overflow = (SA1.Registers.PL & Overflow) >> 6; } -static inline void S9xSA1PackStatus(void) +static inline void S9xSA1PackStatus() { SA1.Registers.PL &= ~(Zero | Negative | Carry | Overflow); SA1.Registers.PL |= SA1._Carry | ((SA1._Zero == 0) << 1) | (SA1._Negative & 0x80) | (SA1._Overflow << 6); } -static inline void S9xSA1FixCycles(void) +static inline void S9xSA1FixCycles() { if (SA1CheckEmulation()) - SA1.S9xOpcodes = S9xSA1OpcodesM1X1; + SA1.S9xOpcodes = S9xSA1OpcodesE1; else if (SA1CheckMemory()) { if (SA1CheckIndex()) diff --git a/source/sa1cpu.c b/source/sa1cpu.c index 478df1e..272eb52 100644 --- a/source/sa1cpu.c +++ b/source/sa1cpu.c @@ -8,6 +8,7 @@ #include "sa1.h" #define CPU SA1 #define ICPU SA1 + #define S9xGetByte S9xSA1GetByte #define S9xGetWord S9xSA1GetWord #define S9xSetByte S9xSA1SetByte @@ -46,69 +47,6 @@ #define StackRelative SA1StackRelative #define StackRelativeIndirectIndexed SA1StackRelativeIndirectIndexed -#define SetZN16 SA1SetZN16 -#define SetZN8 SA1SetZN8 -#define ADC8 SA1ADC8 -#define ADC16 SA1ADC16 -#define AND16 SA1AND16 -#define AND8 SA1AND8 -#define A_ASL16 SA1A_ASL16 -#define A_ASL8 SA1A_ASL8 -#define ASL16 SA1ASL16 -#define ASL8 SA1ASL8 -#define BIT16 SA1BIT16 -#define BIT8 SA1BIT8 -#define CMP16 SA1CMP16 -#define CMP8 SA1CMP8 -#define CMX16 SA1CMX16 -#define CMX8 SA1CMX8 -#define CMY16 SA1CMY16 -#define CMY8 SA1CMY8 -#define A_DEC16 SA1A_DEC16 -#define A_DEC8 SA1A_DEC8 -#define DEC16 SA1DEC16 -#define DEC8 SA1DEC8 -#define EOR16 SA1EOR16 -#define EOR8 SA1EOR8 -#define A_INC16 SA1A_INC16 -#define A_INC8 SA1A_INC8 -#define INC16 SA1INC16 -#define INC8 SA1INC8 -#define LDA16 SA1LDA16 -#define LDA8 SA1LDA8 -#define LDX16 SA1LDX16 -#define LDX8 SA1LDX8 -#define LDY16 SA1LDY16 -#define LDY8 SA1LDY8 -#define A_LSR16 SA1A_LSR16 -#define A_LSR8 SA1A_LSR8 -#define LSR16 SA1LSR16 -#define LSR8 SA1LSR8 -#define ORA16 SA1ORA16 -#define ORA8 SA1ORA8 -#define A_ROL16 SA1A_ROL16 -#define A_ROL8 SA1A_ROL8 -#define ROL16 SA1ROL16 -#define ROL8 SA1ROL8 -#define A_ROR16 SA1A_ROR16 -#define A_ROR8 SA1A_ROR8 -#define ROR16 SA1ROR16 -#define ROR8 SA1ROR8 -#define SBC16 SA1SBC16 -#define SBC8 SA1SBC8 -#define STA16 SA1STA16 -#define STA8 SA1STA8 -#define STX16 SA1STX16 -#define STX8 SA1STX8 -#define STY16 SA1STY16 -#define STY8 SA1STY8 -#define STZ16 SA1STZ16 -#define STZ8 SA1STZ8 -#define TSB16 SA1TSB16 -#define TSB8 SA1TSB8 -#define TRB16 SA1TRB16 -#define TRB8 SA1TRB8 - #undef VAR_CYCLES #define SA1_OPCODES diff --git a/source/seta011.c b/source/seta011.c index 26a0f54..a005f98 100644 --- a/source/seta011.c +++ b/source/seta011.c @@ -66,17 +66,9 @@ void S9xSetST011(uint32_t Address, uint8_t Byte) ST011.in_count = 4; break; case 0x04: - ST011.in_count = 0; - break; case 0x05: - ST011.in_count = 0; - break; case 0x06: - ST011.in_count = 0; - break; case 0x07: - ST011.in_count = 0; - break; case 0x0E: ST011.in_count = 0; break; @@ -107,13 +99,11 @@ void S9xSetST011(uint32_t Address, uint8_t Byte) int32_t lcv; for (lcv = 0; lcv < 9; lcv++) memcpy(board[lcv], ST011.parameters + lcv * 10, 9 * 1); + break; } - break; - // unknown case 0x02: break; - // unknown case 0x04: case 0x05: @@ -121,14 +111,12 @@ void S9xSetST011(uint32_t Address, uint8_t Byte) // outputs Memory.SRAM[0x12C] = 0x00; Memory.SRAM[0x12E] = 0x00; + break; } - break; - // unknown case 0x06: case 0x07: break; - // unknown case 0x0E: { diff --git a/source/seta018.c b/source/seta018.c index 00702d1..840e479 100644 --- a/source/seta018.c +++ b/source/seta018.c @@ -32,8 +32,6 @@ uint8_t S9xGetST018(uint32_t Address) else if (address == 0x3800) t = ST018.status; - printf("ST018 R: %06X %02X\n", Address, t); - return t; } @@ -41,9 +39,6 @@ void S9xSetST018(uint8_t Byte, uint32_t Address) { uint16_t address = (uint16_t) Address & 0xFFFF; static bool reset = false; - - printf("ST018 W: %06X %02X\n", Address, Byte); - line++; if (!reset) @@ -75,8 +70,6 @@ void S9xSetST018(uint8_t Byte, uint32_t Address) switch (ST018.command & 0xFFFFFF) { case 0x0100: - ST018.in_count = 0; - break; case 0xFF00: ST018.in_count = 0; break; diff --git a/source/snes9x.h b/source/snes9x.h index 1051af4..a3b6c98 100644 --- a/source/snes9x.h +++ b/source/snes9x.h @@ -9,11 +9,8 @@ #include <libretro.h> -extern int cprintf(const char* fmt, ...); - #include "port.h" #include "65c816.h" -#include "messages.h" #define ROM_NAME_LEN 23 @@ -196,18 +193,18 @@ typedef struct bool SRTC; uint32_t ControllerOption; - bool ShutdownMaster; - bool MultiPlayer5Master; - bool SuperScopeMaster; - bool MouseMaster; - bool SuperFX; - bool DSP1Master; - bool SA1; - bool C4; - bool SDD1; - bool SPC7110; - bool SPC7110RTC; - bool OBC1; + bool ShutdownMaster; + bool MultiPlayer5Master; + bool SuperScopeMaster; + bool MouseMaster; + bool SuperFX; + bool DSP1Master; + bool SA1; + bool C4; + bool SDD1; + bool SPC7110; + bool SPC7110RTC; + bool OBC1; /* Sound options */ uint32_t SoundPlaybackRate; #ifdef USE_BLARGG_APU @@ -247,7 +244,6 @@ typedef struct bool StarfoxHack; bool WinterGold; bool BS; /* Japanese Satellite System games. */ - bool DaffyDuck; uint8_t APURAMInitialValue; bool SampleCatchup; bool JustifierMaster; @@ -265,11 +261,9 @@ typedef struct typedef struct { - uint8_t alienVSpredetorFix; uint8_t APU_OutPorts_ReturnValueFix; uint8_t SoundEnvelopeHeightReading2; uint8_t SRAMInitialValue; - uint8_t Uniracers; bool EchoOnlyOutput; } SSNESGameFixes; @@ -278,7 +272,7 @@ extern SCPUState CPU; extern SSNESGameFixes SNESGameFixes; extern char String [513]; -void S9xMessage(int32_t type, int32_t number, const char* message); +void S9xMessage(const char* message); void S9xSetPause(uint32_t mask); void S9xClearPause(uint32_t mask); diff --git a/source/soundux.c b/source/soundux.c index 237392e..9a2839e 100644 --- a/source/soundux.c +++ b/source/soundux.c @@ -381,8 +381,8 @@ void DecodeBlock(Channel* ch) int8_t* compressed = (int8_t*) &IAPU.RAM [ch->block_pointer]; filter = *compressed; - if ((ch->last_block = filter & 1)) - ch->loop = (filter & 2) != 0; + if ((ch->last_block = (bool) (filter & 1))) + ch->loop = (bool) (filter & 2); int16_t* raw = ch->block = ch->decoded; uint32_t i; @@ -480,7 +480,7 @@ static inline void MixStereo(int32_t sample_count) int32_t VL, VR; uint32_t freq0 = ch->frequency; - bool mod = pitch_mod & (1 << J); + uint8_t mod = pitch_mod & (1 << J); if (ch->needs_decode) { @@ -497,8 +497,7 @@ static inline void MixStereo(int32_t sample_count) ch->interpolate = 0; if (Settings.InterpolatedSound && freq0 < FIXED_POINT && !mod) - ch->interpolate = ((ch->next_sample - ch->sample) * - (int32_t) freq0) / (int32_t) FIXED_POINT; + ch->interpolate = ((ch->next_sample - ch->sample) * (int32_t) freq0) / (int32_t) FIXED_POINT; } VL = (ch->sample * ch-> left_vol_level) / 128; VR = (ch->sample * ch->right_vol_level) / 128; @@ -702,10 +701,8 @@ static inline void MixStereo(int32_t sample_count) { if (Settings.InterpolatedSound && freq < FIXED_POINT && !mod) { - ch->interpolate = ((ch->next_sample - ch->sample) * - (int32_t) freq) / (int32_t) FIXED_POINT; - ch->sample = (int16_t)(ch->sample + (((ch->next_sample - ch->sample) * - (int32_t)(ch->count)) / (int32_t) FIXED_POINT)); + ch->interpolate = ((ch->next_sample - ch->sample) * (int32_t) freq) / (int32_t) FIXED_POINT; + ch->sample = (int16_t)(ch->sample + (((ch->next_sample - ch->sample) * (int32_t)(ch->count)) / (int32_t) FIXED_POINT)); } else ch->interpolate = 0; @@ -931,7 +928,7 @@ bool S9xInitSound() { so.playback_rate = 0; S9xResetSound(true); - return (1); + return true; } bool S9xSetSoundMode(int32_t channel, int32_t mode) @@ -944,7 +941,7 @@ bool S9xSetSoundMode(int32_t channel, int32_t mode) if (ch->mode != MODE_NONE) { ch->mode = MODE_RELEASE; - return (true); + return true; } break; case MODE_DECREASE_LINEAR: @@ -957,18 +954,18 @@ bool S9xSetSoundMode(int32_t channel, int32_t mode) ch->mode = mode; if (ch->state != SOUND_SILENT) ch->state = mode; - return (true); + return true; } break; case MODE_ADSR: if (ch->mode == MODE_NONE || ch->mode == MODE_ADSR) { ch->mode = mode; - return (true); + return true; } } - return (false); + return false; } void S9xPlaySample(int32_t channel) diff --git a/source/spc700.c b/source/spc700.c index 7b1a8b7..517f606 100644 --- a/source/spc700.c +++ b/source/spc700.c @@ -2465,7 +2465,7 @@ void ApuFB() #include "apumem.h" #endif -void (*S9xApuOpcodes[256])(void) = +void (*S9xApuOpcodes[256])() = { Apu00, Apu01, Apu02, Apu03, Apu04, Apu05, Apu06, Apu07, Apu08, Apu09, Apu0A, Apu0B, Apu0C, Apu0D, Apu0E, Apu0F, diff --git a/source/spc700.h b/source/spc700.h index f1d7046..cbe6637 100644 --- a/source/spc700.h +++ b/source/spc700.h @@ -49,17 +49,14 @@ typedef union { -#ifdef MSB_FIRST struct { +#ifdef MSB_FIRST uint8_t Y, A; - } B; #else - struct - { uint8_t A, Y; - } B; #endif + } B; uint16_t W; } YAndA; @@ -76,11 +73,6 @@ typedef struct // Needed by ILLUSION OF GAIA #define ONE_APU_CYCLE 21 -// Needed by all games written by the software company called Human -#define ONE_APU_CYCLE_HUMAN 21 - -// 1.953us := 1.024065.54MHz - #ifdef SPCTOOL int32_t ESPC(int32_t); @@ -105,8 +97,8 @@ int32_t ESPC(int32_t); #define APU_EXECUTE() \ if (IAPU.APUExecuting) \ {\ - while (APU.Cycles <= CPU.Cycles) \ - APU_EXECUTE1(); \ + while (APU.Cycles <= CPU.Cycles) \ + APU_EXECUTE1(); \ } #endif diff --git a/source/spc7110.c b/source/spc7110.c index 1c87809..ffaf35f 100644 --- a/source/spc7110.c +++ b/source/spc7110.c @@ -40,9 +40,9 @@ char* osd_GetPackDir(); uint16_t cacheMegs = 5; //using function pointers to initialize cache management -void (*CleanUp7110)(void) = NULL; +void (*CleanUp7110)() = NULL; void (*LoadUp7110)(char*) = &SPC7110Load; -void (*Copy7110)(void) = NULL; +void (*Copy7110)() = NULL; //size and offset of the pack data //offset and size of reads from pack @@ -143,8 +143,7 @@ void S9xSpc7110Init() void MovePackData() { //log the last entry - Data7110* log = & - (decompack->tableEnts[decompack->idx].location[decompack->last_idx]); + Data7110* log = &(decompack->tableEnts[decompack->idx].location[decompack->last_idx]); if ((log->used_len + log->used_offset) < (decompack->last_offset + (uint16_t)s7r.bank50Internal)) { @@ -238,11 +237,9 @@ void ReadPackData() return; } - if (table_age_2 == 0 && table_age_3 == 0 && table_age_4 == 0 - && table_age_5 == 0) + if (table_age_2 == 0 && table_age_3 == 0 && table_age_4 == 0 && table_age_5 == 0) table_age_2 = table_age_3 = table_age_4 = table_age_5 = MAX_TABLES; - Data7110* log = & - (decompack->tableEnts[decompack->idx].location[decompack->last_idx]); + Data7110* log = &(decompack->tableEnts[decompack->idx].location[decompack->last_idx]); if ((log->used_len + log->used_offset) < (decompack->last_offset + (uint16_t)s7r.bank50Internal)) { @@ -292,8 +289,7 @@ void ReadPackData() fclose(fp); return; } - if (i != table_age_2 && i != table_age_3 && i != table_age_4 - && i != table_age_5) + if (i != table_age_2 && i != table_age_3 && i != table_age_4 && i != table_age_5) { if (table_age_5 != MAX_TABLES && decompack->binfiles[table_age_5]) { @@ -511,7 +507,6 @@ uint8_t S9xGetSPC7110(uint16_t Address) case 0x480C: s7r.reg480C ^= 0x80; return s7r.reg480C ^ 0x80; - //Data access port //reads from the data ROM (anywhere over the first 8 mbits //behavior is complex, will document later, @@ -764,7 +759,6 @@ uint8_t S9xGetSPC7110(uint16_t Address) //divisor high case 0x4827: return s7r.reg4827; - //result lowest case 0x4828: return s7r.reg4828; @@ -1125,11 +1119,9 @@ void S9xSetSPC7110(uint8_t data, uint16_t Address) } else { - uint32_t mul; uint16_t m1 = (uint16_t)((s7r.reg4824) | (s7r.reg4825 << 8)); uint16_t m2 = (uint16_t)((s7r.reg4820) | (s7r.reg4821 << 8)); - - mul = m1 * m2; + uint32_t mul = m1 * m2; s7r.reg4828 = (uint8_t)(mul & 0x000000FF); s7r.reg4829 = (uint8_t)((mul & 0x0000FF00) >> 8); s7r.reg482A = (uint8_t)((mul & 0x00FF0000) >> 16); @@ -1403,8 +1395,7 @@ void S9xUpdateRTC() // Keep track of game time by computing the number of seconds that pass on the system // clock and adding the same number of seconds to the RTC clock structure. - if (rtc_f9.init && 0 == (rtc_f9.reg[0x0D] & 0x01) - && 0 == (rtc_f9.reg[0x0F] & 0x03)) + if (rtc_f9.init && 0 == (rtc_f9.reg[0x0D] & 0x01) && 0 == (rtc_f9.reg[0x0F] & 0x03)) { cur_systime = time(NULL); @@ -1583,7 +1574,6 @@ bool Load7110Index(char* filename) decompack->tableEnts[i].location[index].size = size; decompack->tableEnts[i].location[index].used_len = 0; decompack->tableEnts[i].location[index].used_offset = 0; - } fclose(fp); return true; @@ -1604,8 +1594,7 @@ void SPC7110Load(char* dirname) memset(decompack, 0, sizeof(Pack7110)); #if !defined(_XBOX) && !defined(VITA) - if (-1 == chdir(dirname)) - S9xMessage(0, 0, "Graphics Pack not found!"); + chdir(dirname); #endif #ifndef _XBOX @@ -1661,8 +1650,7 @@ void SPC7110Open(char* dirname) memset(decompack, 0, sizeof(Pack7110)); #if !defined(_XBOX) && !defined(VITA) - if (-1 == chdir(dirname)) - S9xMessage(0, 0, "Graphics Pack not found!"); + chdir(dirname); #endif #ifndef _XBOX @@ -1701,9 +1689,7 @@ void SPC7110Grab(char* dirname) memset(decompack, 0, sizeof(Pack7110)); #if !defined(_XBOX) && !defined(VITA) - - if (-1 == chdir(dirname)) - S9xMessage(0, 0, "Graphics Pack not found!"); + chdir(dirname); #endif #ifndef _XBOX diff --git a/source/spc7110.h b/source/spc7110.h index 06a594a..351f29d 100644 --- a/source/spc7110.h +++ b/source/spc7110.h @@ -7,14 +7,14 @@ #define DECOMP_BUFFER_SIZE 0x10000 extern void (*LoadUp7110)(char*); -extern void (*CleanUp7110)(void); -extern void (*Copy7110)(void); +extern void (*CleanUp7110)(); +extern void (*Copy7110)(); extern uint16_t cacheMegs; -void Del7110Gfx(void); -void Close7110Gfx(void); -void Drop7110Gfx(void); +void Del7110Gfx(); +void Close7110Gfx(); +void Drop7110Gfx(); uint8_t S9xGetSPC7110(uint16_t Address); uint8_t S9xGetSPC7110Byte(uint32_t Address); uint8_t* Get7110BasePtr(uint32_t); diff --git a/source/srtc.c b/source/srtc.c index 78cb4a7..bbc05ee 100644 --- a/source/srtc.c +++ b/source/srtc.c @@ -285,7 +285,6 @@ void S9xUpdateSrtcTime() /**********************************************************************************************/ void S9xSetSRTC(uint8_t data, uint16_t Address) { - data &= 0x0F; // Data is only 4-bits, mask out unused bits. if (data >= 0xD) @@ -353,7 +352,6 @@ void S9xSetSRTC(uint8_t data, uint16_t Address) rtc.index = -1; rtc.mode = MODE_COMMAND_DONE; break; - case COMMAND_LOAD_RTC: // Disable RTC counter rtc.count_enable = false; @@ -361,7 +359,6 @@ void S9xSetSRTC(uint8_t data, uint16_t Address) rtc.index = 0; // Setup for writing rtc.mode = MODE_LOAD_RTC; break; - default: rtc.mode = MODE_COMMAND_DONE; // unrecognized command - need to implement. diff --git a/source/tile.c b/source/tile.c index ba3a1a7..43bcecb 100644 --- a/source/tile.c +++ b/source/tile.c @@ -17,16 +17,16 @@ static uint8_t ConvertTile(uint8_t* pCache, uint32_t TileAddr) uint32_t* p = (uint32_t*) pCache; uint32_t non_zero = 0; uint8_t line; + uint32_t p1; + uint32_t p2; + uint8_t pix; switch (BG.BitShift) { case 8: for (line = 8; line != 0; line--, tp += 2) { - uint32_t p1 = 0; - uint32_t p2 = 0; - uint8_t pix; - + p1 = p2 = 0; if ((pix = *(tp + 0))) { p1 |= odd_high[0][pix >> 4]; @@ -76,9 +76,7 @@ static uint8_t ConvertTile(uint8_t* pCache, uint32_t TileAddr) case 4: for (line = 8; line != 0; line--, tp += 2) { - uint32_t p1 = 0; - uint32_t p2 = 0; - uint8_t pix; + p1 = p2 = 0; if ((pix = *(tp + 0))) { p1 |= odd_high[0][pix >> 4]; @@ -108,9 +106,7 @@ static uint8_t ConvertTile(uint8_t* pCache, uint32_t TileAddr) case 2: for (line = 8; line != 0; line--, tp += 2) { - uint32_t p1 = 0; - uint32_t p2 = 0; - uint8_t pix; + p1 = p2 = 0; if ((pix = *(tp + 0))) { p1 |= odd_high[0][pix >> 4]; |