diff options
Diffstat (limited to 'source')
53 files changed, 5980 insertions, 6128 deletions
diff --git a/source/65c816.h b/source/65c816.h index a82de8d..04b591c 100644 --- a/source/65c816.h +++ b/source/65c816.h @@ -117,14 +117,14 @@ #define SetCarry() (ICPU._Carry = 1) #define SetZero() (ICPU._Zero = 0) #define ClearZero() (ICPU._Zero = 1) -#define SetIRQ() (Registers.PL |= IRQ) -#define ClearIRQ() (Registers.PL &= ~IRQ) -#define SetDecimal() (Registers.PL |= Decimal) -#define ClearDecimal() (Registers.PL &= ~Decimal) -#define SetIndex() (Registers.PL |= IndexFlag) -#define ClearIndex() (Registers.PL &= ~IndexFlag) -#define SetMemory() (Registers.PL |= MemoryFlag) -#define ClearMemory() (Registers.PL &= ~MemoryFlag) +#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) @@ -132,17 +132,17 @@ #define CheckZero() (ICPU._Zero == 0) #define CheckCarry() (ICPU._Carry) -#define CheckIRQ() (Registers.PL & IRQ) -#define CheckDecimal() (Registers.PL & Decimal) -#define CheckIndex() (Registers.PL & IndexFlag) -#define CheckMemory() (Registers.PL & MemoryFlag) +#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() (Registers.P.W & Emulation) +#define CheckEmulation() (ICPU.Registers.P.W & Emulation) -#define ClearFlags(f) (Registers.P.W &= ~(f)) -#define SetFlags(f) (Registers.P.W |= (f)) -#define CheckFlag(f) (Registers.PL & (f)) +#define ClearFlags(f) (ICPU.Registers.P.W &= ~(f)) +#define SetFlags(f) (ICPU.Registers.P.W |= (f)) +#define CheckFlag(f) (ICPU.Registers.PL & (f)) typedef union { @@ -166,7 +166,5 @@ struct SRegisters{ uint16 PC; }; -EXTERN_C struct SRegisters Registers; - #endif diff --git a/source/apu.cpp b/source/apu.cpp index 3abb669..3c1a5d3 100644 --- a/source/apu.cpp +++ b/source/apu.cpp @@ -181,12 +181,12 @@ void S9xResetAPU () memmove (APU.ExtraRAM, APUROM, sizeof (APUROM)); IAPU.PC = IAPU.RAM + IAPU.RAM [0xfffe] + (IAPU.RAM [0xffff] << 8); APU.Cycles = 0; - APURegisters.YA.W = 0; - APURegisters.X = 0; - APURegisters.S = 0xff; - APURegisters.P = 0; + IAPU.Registers.YA.W = 0; + IAPU.Registers.X = 0; + IAPU.Registers.S = 0xff; + IAPU.Registers.P = 0; S9xAPUUnpackStatus (); - APURegisters.PC = 0; + IAPU.Registers.PC = 0; IAPU.APUExecuting = Settings.APUEnabled; #ifdef SPC700_SHUTDOWN IAPU.WaitAddress1 = NULL; @@ -419,7 +419,7 @@ void S9xSetAPUDSP (uint8 byte) { if (byte & ~spc_is_dumping_temp) { - APURegisters.PC = IAPU.PC - IAPU.RAM; + IAPU.Registers.PC = IAPU.PC - IAPU.RAM; S9xAPUPackStatus(); S9xSPCDump (S9xGetFilenameInc (".spc")); spc_is_dumping = 0; diff --git a/source/apu.h b/source/apu.h index 0a64e34..67b2525 100644 --- a/source/apu.h +++ b/source/apu.h @@ -95,6 +95,7 @@ struct SIAPU { uint8 *PC; + struct SAPURegisters Registers; uint8 *RAM; uint8 *DirectPage; bool8 APUExecuting; @@ -136,15 +137,15 @@ extern int spc_is_dumping_temp; extern uint8 spc_dump_dsp[0x100]; STATIC inline void S9xAPUUnpackStatus() { - IAPU._Zero = ((APURegisters.P & Zero) == 0) | (APURegisters.P & Negative); - IAPU._Carry = (APURegisters.P & Carry); - IAPU._Overflow = (APURegisters.P & Overflow) >> 6; + 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() { - APURegisters.P &= ~(Zero | Negative | Carry | Overflow); - APURegisters.P |= IAPU._Carry | ((IAPU._Zero == 0) << 1) | + IAPU.Registers.P &= ~(Zero | Negative | Carry | Overflow); + IAPU.Registers.P |= IAPU._Carry | ((IAPU._Zero == 0) << 1) | (IAPU._Zero & 0x80) | (IAPU._Overflow << 6); } @@ -162,8 +163,8 @@ void S9xSetAPUTimer (uint16 Address, uint8 byte); bool8 S9xInitSound (int quality, bool8 stereo, int buffer_size); void S9xOpenCloseSoundTracingFile (bool8); void S9xPrintAPUState (); -extern int32 S9xAPUCycles [256]; // Scaled cycle lengths -extern int32 S9xAPUCycleLengths [256]; // Raw data. +extern uint16 S9xAPUCycles [256]; // Scaled cycle lengths +extern uint16 S9xAPUCycleLengths [256]; // Raw data. extern void (*S9xApuOpcodes [256]) (void); END_EXTERN_C diff --git a/source/apumem.h b/source/apumem.h index 8f6dfa4..573b52c 100644 --- a/source/apumem.h +++ b/source/apumem.h @@ -95,7 +95,7 @@ extern uint8 W4; extern uint8 APUROM[64]; END_EXTERN_C -INLINE uint8 S9xAPUGetByteZ (uint8 Address) +uint8 S9xAPUGetByteZ (uint8 Address) { if (Address >= 0xf0 && IAPU.DirectPage == IAPU.RAM) { @@ -127,7 +127,7 @@ INLINE uint8 S9xAPUGetByteZ (uint8 Address) return (IAPU.DirectPage [Address]); } -INLINE void S9xAPUSetByteZ (uint8 byte, uint8 Address) +void S9xAPUSetByteZ (uint8 byte, uint8 Address) { if (Address >= 0xf0 && IAPU.DirectPage == IAPU.RAM) { @@ -156,7 +156,7 @@ INLINE void S9xAPUSetByteZ (uint8 byte, uint8 Address) IAPU.DirectPage [Address] = byte; } -INLINE uint8 S9xAPUGetByte (uint32 Address) +uint8 S9xAPUGetByte (uint32 Address) { Address &= 0xffff; @@ -189,7 +189,7 @@ INLINE uint8 S9xAPUGetByte (uint32 Address) return (IAPU.RAM [Address]); } -INLINE void S9xAPUSetByte (uint8 byte, uint32 Address) +void S9xAPUSetByte (uint8 byte, uint32 Address) { Address &= 0xffff; diff --git a/source/autom4te.cache/output.0 b/source/autom4te.cache/output.0 deleted file mode 100644 index e69de29..0000000 --- a/source/autom4te.cache/output.0 +++ /dev/null diff --git a/source/autom4te.cache/requests b/source/autom4te.cache/requests deleted file mode 100644 index bec4e12..0000000 --- a/source/autom4te.cache/requests +++ /dev/null @@ -1,67 +0,0 @@ -# This file was generated by Autom4te Tue Dec 22 07:01:21 UTC 2009. -# It contains the lists of macros which have been traced. -# It can be safely removed. - -@request = ( - bless( [ - '0', - 1, - [ - '/usr/share/autoconf' - ], - [ - '/usr/share/autoconf/autoconf/autoconf.m4f', - 'Makefile.in' - ], - { - '_LT_AC_TAGCONFIG' => 1, - 'AM_PROG_F77_C_O' => 1, - 'AC_INIT' => 1, - 'm4_pattern_forbid' => 1, - '_AM_COND_IF' => 1, - 'AC_CANONICAL_TARGET' => 1, - 'AC_SUBST' => 1, - 'AC_CONFIG_LIBOBJ_DIR' => 1, - 'AC_FC_SRCEXT' => 1, - 'AC_CANONICAL_HOST' => 1, - 'AC_PROG_LIBTOOL' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'AC_CONFIG_SUBDIRS' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, - 'AC_REQUIRE_AUX_FILE' => 1, - 'AC_CONFIG_LINKS' => 1, - 'm4_sinclude' => 1, - 'LT_SUPPORTED_TAG' => 1, - 'AM_MAINTAINER_MODE' => 1, - 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, - '_m4_warn' => 1, - 'AM_PROG_CXX_C_O' => 1, - '_AM_COND_ENDIF' => 1, - 'AM_ENABLE_MULTILIB' => 1, - 'AM_SILENT_RULES' => 1, - 'AC_CONFIG_FILES' => 1, - 'include' => 1, - 'LT_INIT' => 1, - 'AM_GNU_GETTEXT' => 1, - 'AC_LIBSOURCE' => 1, - 'AM_PROG_FC_C_O' => 1, - 'AC_CANONICAL_BUILD' => 1, - 'AC_FC_FREEFORM' => 1, - 'AH_OUTPUT' => 1, - '_AM_SUBST_NOTMAKE' => 1, - 'AC_CONFIG_AUX_DIR' => 1, - 'sinclude' => 1, - 'm4_pattern_allow' => 1, - 'AM_PROG_CC_C_O' => 1, - 'AC_CANONICAL_SYSTEM' => 1, - 'AM_CONDITIONAL' => 1, - 'AC_CONFIG_HEADERS' => 1, - 'AC_DEFINE_TRACE_LITERAL' => 1, - 'm4_include' => 1, - '_AM_COND_ELSE' => 1, - 'AC_SUBST_TRACE' => 1 - } - ], 'Autom4te::Request' ) - ); - diff --git a/source/autom4te.cache/traces.0 b/source/autom4te.cache/traces.0 deleted file mode 100644 index e69de29..0000000 --- a/source/autom4te.cache/traces.0 +++ /dev/null diff --git a/source/cheats.cpp b/source/cheats.cpp index 922e08d..dc388d2 100644 --- a/source/cheats.cpp +++ b/source/cheats.cpp @@ -104,20 +104,20 @@ static bool8 S9xAllHex (const char *code, int len) return (TRUE); } -const char *S9xProActionReplayToRaw (const char *code, uint32 &address, uint8 &byte) +const char *S9xProActionReplayToRaw (const char *code, uint32 *address, uint8 *byte) { uint32 data = 0; if (strlen (code) != 8 || !S9xAllHex (code, 8) || sscanf (code, "%x", &data) != 1) return ("Invalid Pro Action Replay code - should be 8 hex digits in length."); - address = data >> 8; - byte = (uint8) data; + *address = data >> 8; + *byte = (uint8) data; return (NULL); } -const char *S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram, - uint8 &num_bytes, uint8 bytes[3]) +const char *S9xGoldFingerToRaw (const char *code, uint32 *address, bool8 *sram, + uint8 *num_bytes, uint8 bytes[3]) { char tmp [15]; if (strlen (code) != 14) @@ -125,7 +125,7 @@ const char *S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram, strncpy (tmp, code, 5); tmp [5] = 0; - if (sscanf (tmp, "%x", &address) != 1) + if (sscanf (tmp, "%x", address) != 1) return ("Invalid Gold Finger code."); int i; @@ -138,12 +138,12 @@ const char *S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram, break; bytes [i] = (uint8) byte; } - num_bytes = i; - sram = code [13] == '1'; + *num_bytes = i; + *sram = code [13] == '1'; return (NULL); } -const char *S9xGameGenieToRaw (const char *code, uint32 &address, uint8 &byte) +const char *S9xGameGenieToRaw (const char *code, uint32 *address, uint8 *byte) { char new_code [12]; @@ -176,15 +176,14 @@ const char *S9xGameGenieToRaw (const char *code, uint32 &address, uint8 &byte) } uint32 data = 0; sscanf (new_code, "%x", &data); - byte = (uint8)(data >> 24); - address = data & 0xffffff; - address = ((address & 0x003c00) << 10) + - ((address & 0x00003c) << 14) + - ((address & 0xf00000) >> 8) + - ((address & 0x000003) << 10) + - ((address & 0x00c000) >> 6) + - ((address & 0x0f0000) >> 12) + - ((address & 0x0003c0) >> 6); + *byte = (uint8)(data >> 24); + *address = ((data & 0x003c00) << 10) + + ((data & 0x00003c) << 14) + + ((data & 0xf00000) >> 8) + + ((data & 0x000003) << 10) + + ((data & 0x00c000) >> 6) + + ((data & 0x0f0000) >> 12) + + ((data & 0x0003c0) >> 6); return (NULL); } diff --git a/source/cheats.h b/source/cheats.h index c8bd716..bb2646f 100644 --- a/source/cheats.h +++ b/source/cheats.h @@ -93,21 +93,17 @@ extern "C" { #endif -#define MAX_SFCCHEAT_NAME 24 -#define MAX_CHEATS_T 200 +#define MAX_SFCCHEAT_NAME 48 +#define MAX_CHEATS_T 800 struct SCheat { uint32 address; uint8 byte; uint8 saved_byte; - bool8 enabled; + // bool8 enabled; + uint32 enabled; // THIS IS A TOTAL HACK FOR THE NDSSFC GUI, YOU HAVE BEEN WARNED [Neb] bool8 saved; - uint8 total_part; - uint8 part_id; - uint8 part_len; - uint8 cheat_type; - uint32 name_id; char name[MAX_SFCCHEAT_NAME]; }; @@ -140,10 +136,10 @@ typedef enum void S9xInitCheatData (); -const char *S9xGameGenieToRaw (const char *code, uint32 &address, uint8 &byte); -const char *S9xProActionReplayToRaw (const char *code, uint32 &address, uint8 &byte); -const char *S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram, - uint8 &num_bytes, uint8 bytes[3]); +const char *S9xGameGenieToRaw (const char *code, uint32 *address, uint8 *byte); +const char *S9xProActionReplayToRaw (const char *code, uint32 *address, uint8 *byte); +const char *S9xGoldFingerToRaw (const char *code, uint32 *address, bool8 *sram, + uint8 *num_bytes, uint8 bytes[3]); void S9xApplyCheats (); void S9xApplyCheat (uint32 which1); void S9xRemoveCheats (); @@ -158,25 +154,13 @@ void S9xDeleteCheat (uint32 which1); bool8 S9xLoadCheatFile (const char *filename); bool8 S9xSaveCheatFile (const char *filename); -void S9xStartCheatSearch (SCheatData *); -void S9xSearchForChange (SCheatData *, S9xCheatComparisonType cmp, +void S9xStartCheatSearch (struct SCheatData *cheats); +void S9xSearchForChange (struct SCheatData *cheats, S9xCheatComparisonType cmp, S9xCheatDataSize size, bool8 is_signed, bool8 update); -void S9xSearchForValue (SCheatData *, S9xCheatComparisonType cmp, +void S9xSearchForValue (struct SCheatData *cheats, S9xCheatComparisonType cmp, S9xCheatDataSize size, uint32 value, bool8 is_signed, bool8 update); -void S9xOutputCheatSearchResults (SCheatData *); - - -int S9xAddCheat_ex (unsigned int address, unsigned char* cheat_dat, unsigned int cheat_dat_len, - unsigned int cheat_cell_num, unsigned int part_id, unsigned int str_num); -void S9xAddCheat_ov(unsigned int cheat_cell_num, unsigned int total_part); -unsigned int S9xGetCheat_nameid(unsigned int start, unsigned int part); -void S9xCheat_switch(unsigned int start, unsigned int sub_part, unsigned int enable); -void S9xApplyCheats_ex(void); -void S9xCheat_Disable(void); -void S9xCheat_Enable(void); - -void S9x_dumpcheat(unsigned int id); +void S9xOutputCheatSearchResults (struct SCheatData *cheats); #ifdef __cplusplus } diff --git a/source/cheats2.cpp b/source/cheats2.cpp index 346a9b1..e5a7b0f 100644 --- a/source/cheats2.cpp +++ b/source/cheats2.cpp @@ -105,17 +105,19 @@ void S9xInitCheatData () void S9xAddCheat (bool8 enable, bool8 save_current_value, uint32 address, uint8 byte) { - if (Cheat.num_cheats < sizeof (Cheat.c) / sizeof (Cheat. c [0])) + if (Cheat.num_cheats < sizeof (Cheat.c) / sizeof (Cheat.c [0])) { Cheat.c [Cheat.num_cheats].address = address; Cheat.c [Cheat.num_cheats].byte = byte; - Cheat.c [Cheat.num_cheats].enabled = TRUE; + Cheat.c [Cheat.num_cheats].enabled = enable; if (save_current_value) { Cheat.c [Cheat.num_cheats].saved_byte = S9xGetByte (address); Cheat.c [Cheat.num_cheats].saved = TRUE; } Cheat.num_cheats++; + if (enable) + S9xApplyCheat(Cheat.num_cheats - 1); } } @@ -169,6 +171,8 @@ void S9xRemoveCheat (uint32 which1) *(ptr + (address & 0xffff)) = Cheat.c [which1].saved_byte; else S9xSetByte (Cheat.c [which1].saved_byte, address); + // Unsave the address for the next call to S9xRemoveCheat. + Cheat.c [which1].saved = FALSE; } } @@ -211,20 +215,24 @@ bool8 S9xLoadCheatFile (const char *filename) Cheat.num_cheats = 0; FILE *fs = fopen (filename, "rb"); - uint8 data [28]; + uint8 data [8 + MAX_SFCCHEAT_NAME]; if (!fs) return (FALSE); - while (fread ((void *) data, 1, 28, fs) == 28) + while (fread ((void *) data, 1, 8 + MAX_SFCCHEAT_NAME, fs) == 8 + MAX_SFCCHEAT_NAME) { + if (data[6] != 254 || data[7] != 252) { + fclose (fs); + return (FALSE); + } Cheat.c [Cheat.num_cheats].enabled = (data [0] & 4) == 0; Cheat.c [Cheat.num_cheats].byte = data [1]; Cheat.c [Cheat.num_cheats].address = data [2] | (data [3] << 8) | (data [4] << 16); Cheat.c [Cheat.num_cheats].saved_byte = data [5]; Cheat.c [Cheat.num_cheats].saved = (data [0] & 8) != 0; - memmove (Cheat.c [Cheat.num_cheats].name, &data [8], 20); - Cheat.c [Cheat.num_cheats++].name [20] = 0; + memcpy (Cheat.c [Cheat.num_cheats].name, &data [8], MAX_SFCCHEAT_NAME - 1); + Cheat.c [Cheat.num_cheats++].name [MAX_SFCCHEAT_NAME - 1] = 0; } fclose (fs); @@ -240,7 +248,7 @@ bool8 S9xSaveCheatFile (const char *filename) } FILE *fs = fopen (filename, "wb"); - uint8 data [28]; + uint8 data [8 + MAX_SFCCHEAT_NAME]; if (!fs) return (FALSE); @@ -248,12 +256,9 @@ bool8 S9xSaveCheatFile (const char *filename) uint32 i; for (i = 0; i < Cheat.num_cheats; i++) { - memset (data, 0, 28); - if (i == 0) - { - data [6] = 254; - data [7] = 252; - } + memset (data, 0, 8 + MAX_SFCCHEAT_NAME); + data [6] = 254; + data [7] = 252; if (!Cheat.c [i].enabled) data [0] |= 4; @@ -266,8 +271,8 @@ bool8 S9xSaveCheatFile (const char *filename) data [4] = (uint8) (Cheat.c [i].address >> 16); data [5] = Cheat.c [i].saved_byte; - memmove (&data [8], Cheat.c [i].name, 19); - if (fwrite (data, 28, 1, fs) != 1) + memcpy (&data [8], Cheat.c [i].name, MAX_SFCCHEAT_NAME - 1); + if (fwrite (data, 8 + MAX_SFCCHEAT_NAME, 1, fs) != 1) { fclose (fs); return (FALSE); @@ -277,5 +282,3 @@ bool8 S9xSaveCheatFile (const char *filename) fclose (fs); return (TRUE); } - - diff --git a/source/cpu.cpp b/source/cpu.cpp index 80e387f..d6e8f53 100644 --- a/source/cpu.cpp +++ b/source/cpu.cpp @@ -117,15 +117,15 @@ void S9xResetSuperFX () void S9xResetCPU () { - Registers.PB = 0; - Registers.PC = S9xGetWord (0xFFFC); - Registers.D.W = 0; - Registers.DB = 0; - Registers.SH = 1; - Registers.SL = 0xFF; - Registers.XH = 0; - Registers.YH = 0; - Registers.P.W = 0; + ICPU.Registers.PB = 0; + ICPU.Registers.PC = S9xGetWord (0xFFFC); + ICPU.Registers.D.W = 0; + ICPU.Registers.DB = 0; + ICPU.Registers.SH = 1; + ICPU.Registers.SL = 0xFF; + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; + ICPU.Registers.P.W = 0; ICPU.ShiftedPB = 0; ICPU.ShiftedDB = 0; @@ -157,7 +157,7 @@ void S9xResetCPU () //CPU.TriedInterleavedMode2 = FALSE; // Reset when ROM image loaded CPU.NMICycleCount = 0; CPU.IRQCycleCount = 0; - S9xSetPCBase (Registers.PC); + S9xSetPCBase (ICPU.Registers.PC); ICPU.S9xOpcodes = S9xOpcodesE1; ICPU.CPUExecuting = TRUE; diff --git a/source/cpuaddr.h b/source/cpuaddr.h index a4c0ff4..34fb41b 100644 --- a/source/cpuaddr.h +++ b/source/cpuaddr.h @@ -90,8 +90,6 @@ #ifndef _CPUADDR_H_ #define _CPUADDR_H_ -EXTERN_C long OpAddress; - typedef enum { NONE = 0, READ = 1, @@ -100,321 +98,424 @@ typedef enum { JUMP = 4 } AccessMode; -STATIC inline void Immediate8 (AccessMode a) +EXTERN_C long OpAddress; + +// The type for a function that can run after the addressing mode is resolved: +// void NAME (long Addr) {...} +typedef void (*InternalOp) (long); + +/* + * The addressing modes in this file do not update the OpAddress variable. + * Rather, they pass the address they calculate to the operation that needs to + * be done with it. If you need the calculated value, set a passthrough + * that gets the calculated address from the internal op and then updates the + * OpAddress variable. + * + * Not updating the OpAddress variable saves a few memory storage instructions + * per SNES instruction. + * Calling the operation at the end of the addressing mode calculation saves + * one return instruction per SNES instruction, because the code can just + * jump from one to the other. + */ + +static void Immediate8 (AccessMode a, InternalOp op) { - OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase; + long Addr = ICPU.ShiftedPB + CPU.PC - CPU.PCBase; CPU.PC++; + (*op)(Addr); } -STATIC inline void Immediate16 (AccessMode a) +static void Immediate16 (AccessMode a, InternalOp op) { - OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase; + long Addr = ICPU.ShiftedPB + CPU.PC - CPU.PCBase; CPU.PC += 2; + (*op)(Addr); } -STATIC inline void Relative (AccessMode a) +static void Relative (AccessMode a, InternalOp op) { - Int8 = *CPU.PC++; + int8 Int8 = *CPU.PC++; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - OpAddress = ((int) (CPU.PC - CPU.PCBase) + Int8) & 0xffff; + long Addr = ((int) (CPU.PC - CPU.PCBase) + Int8) & 0xffff; + (*op)(Addr); } -STATIC inline void RelativeLong (AccessMode a) +static void RelativeLong (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = *(uint16 *) CPU.PC; + Addr = *(uint16 *) CPU.PC; #else - OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8); + Addr = *CPU.PC + (*(CPU.PC + 1) << 8); #endif #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; #endif CPU.PC += 2; - OpAddress += (CPU.PC - CPU.PCBase); - OpAddress &= 0xffff; + Addr += (CPU.PC - CPU.PCBase); + Addr &= 0xffff; + (*op)(Addr); } -STATIC inline void AbsoluteIndexedIndirect (AccessMode a) +static void AbsoluteIndexedIndirect (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = (Registers.X.W + *(uint16 *) CPU.PC) & 0xffff; + Addr = (ICPU.Registers.X.W + *(uint16 *) CPU.PC) & 0xffff; #else - OpAddress = (Registers.X.W + *CPU.PC + (*(CPU.PC + 1) << 8)) & 0xffff; + Addr = (ICPU.Registers.X.W + *CPU.PC + (*(CPU.PC + 1) << 8)) & 0xffff; #endif #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif +#ifndef NO_OPEN_BUS OpenBus = *(CPU.PC + 1); +#endif CPU.PC += 2; - OpAddress = S9xGetWord (ICPU.ShiftedPB + OpAddress); - if(a&READ) OpenBus = (uint8)(OpAddress>>8); + Addr = S9xGetWord (ICPU.ShiftedPB + Addr); +#ifndef NO_OPEN_BUS + if(a&READ) OpenBus = (uint8)(Addr>>8); +#endif + (*op)(Addr); } -STATIC inline void AbsoluteIndirectLong (AccessMode a) +static void AbsoluteIndirectLong (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = *(uint16 *) CPU.PC; + Addr = *(uint16 *) CPU.PC; #else - OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8); + Addr = *CPU.PC + (*(CPU.PC + 1) << 8); #endif #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif +#ifndef NO_OPEN_BUS OpenBus = *(CPU.PC + 1); +#endif CPU.PC += 2; +#ifndef NO_OPEN_BUS if(a&READ) { - OpAddress = S9xGetWord (OpAddress) | ((OpenBus=S9xGetByte (OpAddress + 2)) << 16); + Addr = S9xGetWord (Addr) | ((OpenBus=S9xGetByte (Addr + 2)) << 16); } else { - OpAddress = S9xGetWord (OpAddress) | (S9xGetByte (OpAddress + 2) << 16); +#endif + Addr = S9xGetWord (Addr) | (S9xGetByte (Addr + 2) << 16); +#ifndef NO_OPEN_BUS } +#endif + (*op)(Addr); } -STATIC inline void AbsoluteIndirect (AccessMode a) +static void AbsoluteIndirect (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = *(uint16 *) CPU.PC; + Addr = *(uint16 *) CPU.PC; #else - OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8); + Addr = *CPU.PC + (*(CPU.PC + 1) << 8); #endif #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif +#ifndef NO_OPEN_BUS OpenBus = *(CPU.PC + 1); +#endif CPU.PC += 2; - OpAddress = S9xGetWord (OpAddress); - if(a&READ) OpenBus = (uint8)(OpAddress>>8); - OpAddress += ICPU.ShiftedPB; + Addr = S9xGetWord (Addr); +#ifndef NO_OPEN_BUS + if(a&READ) OpenBus = (uint8)(Addr>>8); +#endif + Addr += ICPU.ShiftedPB; + (*op)(Addr); } -STATIC inline void Absolute (AccessMode a) +static void Absolute (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = *(uint16 *) CPU.PC + ICPU.ShiftedDB; + Addr = *(uint16 *) CPU.PC + ICPU.ShiftedDB; #else - OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8) + ICPU.ShiftedDB; + Addr = *CPU.PC + (*(CPU.PC + 1) << 8) + ICPU.ShiftedDB; #endif +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *(CPU.PC+1); +#endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif + (*op)(Addr); } -STATIC inline void AbsoluteLong (AccessMode a) +static void AbsoluteLong (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = (*(uint32 *) CPU.PC) & 0xffffff; + Addr = (*(uint32 *) CPU.PC) & 0xffffff; #else - OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8) + (*(CPU.PC + 2) << 16); + Addr = *CPU.PC + (*(CPU.PC + 1) << 8) + (*(CPU.PC + 2) << 16); #endif +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *(CPU.PC+2); +#endif CPU.PC += 3; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; #endif + (*op)(Addr); } -STATIC inline void Direct(AccessMode a) +static void Direct(AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#endif + long Addr = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif -// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +// if (ICPU.Registers.DL != 0) CPU.Cycles += ONE_CYCLE; + (*op)(Addr); } -STATIC inline void DirectIndirectIndexed (AccessMode a) +static void DirectIndirectIndexed (AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#endif + long Addr = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - OpAddress = S9xGetWord (OpAddress); - if(a&READ) OpenBus = (uint8)(OpAddress>>8); - OpAddress += ICPU.ShiftedDB + Registers.Y.W; + Addr = S9xGetWord (Addr); +#ifndef NO_OPEN_BUS + if(a&READ) OpenBus = (uint8)(Addr>>8); +#endif + Addr += ICPU.ShiftedDB + ICPU.Registers.Y.W; -// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +// if (ICPU.Registers.DL != 0) CPU.Cycles += ONE_CYCLE; // XXX: always add one if STA // XXX: else Add one cycle if crosses page boundary + (*op)(Addr); } -STATIC inline void DirectIndirectIndexedLong (AccessMode a) +static void DirectIndirectIndexedLong (AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#endif + long Addr = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif +#ifndef NO_OPEN_BUS if(a&READ){ - OpAddress = S9xGetWord (OpAddress) + ((OpenBus = S9xGetByte (OpAddress + 2)) << 16) + Registers.Y.W; + Addr = S9xGetWord (Addr) + ((OpenBus = S9xGetByte (Addr + 2)) << 16) + ICPU.Registers.Y.W; } else { - OpAddress = S9xGetWord (OpAddress) + (S9xGetByte (OpAddress + 2) << 16) + Registers.Y.W; +#endif + Addr = S9xGetWord (Addr) + (S9xGetByte (Addr + 2) << 16) + ICPU.Registers.Y.W; +#ifndef NO_OPEN_BUS } -// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +#endif +// if (ICPU.Registers.DL != 0) CPU.Cycles += ONE_CYCLE; + (*op)(Addr); } -STATIC inline void DirectIndexedIndirect(AccessMode a) +static void DirectIndexedIndirect(AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.D.W + Registers.X.W) & 0xffff; +#endif + long Addr = (*CPU.PC++ + ICPU.Registers.D.W + ICPU.Registers.X.W) & 0xffff; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - OpAddress = S9xGetWord (OpAddress); - if(a&READ) OpenBus = (uint8)(OpAddress>>8); - OpAddress += ICPU.ShiftedDB; + Addr = S9xGetWord (Addr); +#ifndef NO_OPEN_BUS + if(a&READ) OpenBus = (uint8)(Addr>>8); +#endif + Addr += ICPU.ShiftedDB; #ifndef SA1_OPCODES -// if (Registers.DL != 0) +// if (ICPU.Registers.DL != 0) // CPU.Cycles += TWO_CYCLES; // else CPU.Cycles += ONE_CYCLE; #endif + (*op)(Addr); } -STATIC inline void DirectIndexedX (AccessMode a) +static void DirectIndexedX (AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.D.W + Registers.X.W); - OpAddress &= CheckEmulation() ? 0xff : 0xffff; - -#ifndef SA1_OPCODES - CPU.Cycles += CPU.MemSpeed; #endif + long Addr = (*CPU.PC++ + ICPU.Registers.D.W + ICPU.Registers.X.W); + Addr &= CheckEmulation() ? 0xff : 0xffff; #ifndef SA1_OPCODES -// if (Registers.DL != 0) + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) // CPU.Cycles += TWO_CYCLES; // else - CPU.Cycles += ONE_CYCLE; +// CPU.Cycles += ONE_CYCLE; #endif + (*op)(Addr); } -STATIC inline void DirectIndexedY (AccessMode a) +static void DirectIndexedY (AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.D.W + Registers.Y.W); - OpAddress &= CheckEmulation() ? 0xff : 0xffff; -#ifndef SA1_OPCODES - CPU.Cycles += CPU.MemSpeed; #endif - + long Addr = (*CPU.PC++ + ICPU.Registers.D.W + ICPU.Registers.Y.W); + Addr &= CheckEmulation() ? 0xff : 0xffff; #ifndef SA1_OPCODES -// if (Registers.DL != 0) + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; +// if (ICPU.Registers.DL != 0) // CPU.Cycles += TWO_CYCLES; // else - CPU.Cycles += ONE_CYCLE; +// CPU.Cycles += ONE_CYCLE; #endif + (*op)(Addr); } -STATIC inline void AbsoluteIndexedX (AccessMode a) +static void AbsoluteIndexedX (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = ICPU.ShiftedDB + *(uint16 *) CPU.PC + Registers.X.W; + Addr = ICPU.ShiftedDB + *(uint16 *) CPU.PC + ICPU.Registers.X.W; #else - OpAddress = ICPU.ShiftedDB + *CPU.PC + (*(CPU.PC + 1) << 8) + - Registers.X.W; + Addr = ICPU.ShiftedDB + *CPU.PC + (*(CPU.PC + 1) << 8) + + ICPU.Registers.X.W; #endif +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *(CPU.PC+1); +#endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif // XXX: always add one cycle for ROL, LSR, etc // XXX: else is cross page boundary add one cycle + (*op)(Addr); } -STATIC inline void AbsoluteIndexedY (AccessMode a) +static void AbsoluteIndexedY (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = ICPU.ShiftedDB + *(uint16 *) CPU.PC + Registers.Y.W; + Addr = ICPU.ShiftedDB + *(uint16 *) CPU.PC + ICPU.Registers.Y.W; #else - OpAddress = ICPU.ShiftedDB + *CPU.PC + (*(CPU.PC + 1) << 8) + - Registers.Y.W; + Addr = ICPU.ShiftedDB + *CPU.PC + (*(CPU.PC + 1) << 8) + + ICPU.Registers.Y.W; #endif +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *(CPU.PC+1); +#endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif // XXX: always add cycle for STA // XXX: else is cross page boundary add one cycle + (*op)(Addr); } -STATIC inline void AbsoluteLongIndexedX (AccessMode a) +static void AbsoluteLongIndexedX (AccessMode a, InternalOp op) { + long Addr; #ifdef FAST_LSB_WORD_ACCESS - OpAddress = (*(uint32 *) CPU.PC + Registers.X.W) & 0xffffff; + Addr = (*(uint32 *) CPU.PC + ICPU.Registers.X.W) & 0xffffff; #else - OpAddress = (*CPU.PC + (*(CPU.PC + 1) << 8) + (*(CPU.PC + 2) << 16) + Registers.X.W) & 0xffffff; + Addr = (*CPU.PC + (*(CPU.PC + 1) << 8) + (*(CPU.PC + 2) << 16) + ICPU.Registers.X.W) & 0xffffff; #endif +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *(CPU.PC+2); +#endif CPU.PC += 3; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; #endif + (*op)(Addr); } -STATIC inline void DirectIndirect (AccessMode a) +static void DirectIndirect (AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#endif + long Addr = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - OpAddress = S9xGetWord (OpAddress); - if(a&READ) OpenBus = (uint8)(OpAddress>>8); - OpAddress += ICPU.ShiftedDB; + Addr = S9xGetWord (Addr); +#ifndef NO_OPEN_BUS + if(a&READ) OpenBus = (uint8)(Addr>>8); +#endif + Addr += ICPU.ShiftedDB; -// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +// if (ICPU.Registers.DL != 0) CPU.Cycles += ONE_CYCLE; + (*op)(Addr); } -STATIC inline void DirectIndirectLong (AccessMode a) +static void DirectIndirectLong (AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#endif + long Addr = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif +#ifndef NO_OPEN_BUS if(a&READ){ - OpAddress = S9xGetWord (OpAddress) + ((OpenBus=S9xGetByte (OpAddress + 2)) << 16); + Addr = S9xGetWord (Addr) + ((OpenBus=S9xGetByte (Addr + 2)) << 16); } else { - OpAddress = S9xGetWord (OpAddress) + (S9xGetByte (OpAddress + 2) << 16); +#endif + Addr = S9xGetWord (Addr) + (S9xGetByte (Addr + 2) << 16); +#ifndef NO_OPEN_BUS } -// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +#endif +// if (ICPU.Registers.DL != 0) CPU.Cycles += ONE_CYCLE; + (*op)(Addr); } -STATIC inline void StackRelative (AccessMode a) +static void StackRelative (AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS if(a&READ) OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.S.W) & 0xffff; +#endif + long Addr = (*CPU.PC++ + ICPU.Registers.S.W) & 0xffff; #ifndef SA1_OPCODES - CPU.Cycles += CPU.MemSpeed; - CPU.Cycles += ONE_CYCLE; + CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; #endif + (*op)(Addr); } -STATIC inline void StackRelativeIndirectIndexed (AccessMode a) +static void StackRelativeIndirectIndexed (AccessMode a, InternalOp op) { +#ifndef NO_OPEN_BUS OpenBus = *CPU.PC; - OpAddress = (*CPU.PC++ + Registers.S.W) & 0xffff; +#endif + long Addr = (*CPU.PC++ + ICPU.Registers.S.W) & 0xffff; #ifndef SA1_OPCODES - CPU.Cycles += CPU.MemSpeed; - CPU.Cycles += TWO_CYCLES; + CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; +#endif + Addr = S9xGetWord (Addr); +#ifndef NO_OPEN_BUS + if(a&READ) OpenBus = (uint8)(Addr>>8); #endif - OpAddress = S9xGetWord (OpAddress); - if(a&READ) OpenBus = (uint8)(OpAddress>>8); - OpAddress = (OpAddress + ICPU.ShiftedDB + - Registers.Y.W) & 0xffffff; + Addr = (Addr + ICPU.ShiftedDB + + ICPU.Registers.Y.W) & 0xffffff; + (*op)(Addr); } #endif diff --git a/source/cpuexec.cpp b/source/cpuexec.cpp index 21b1574..66bb8da 100644 --- a/source/cpuexec.cpp +++ b/source/cpuexec.cpp @@ -105,6 +105,10 @@ #include "sa1.h" #include "spc7110.h" +#ifdef SYNC_JOYPAD_AT_HBLANK +#include "display.h" +#endif + extern void S9xProcessSound (unsigned int); void S9xMainLoop (void) @@ -167,9 +171,9 @@ void S9xMainLoop (void) DO_HBLANK_CHECK(); } - Registers.PC = CPU.PC - CPU.PCBase; + ICPU.Registers.PC = CPU.PC - CPU.PCBase; S9xPackStatus (); - APURegisters.PC = IAPU.PC - IAPU.RAM; + IAPU.Registers.PC = IAPU.PC - IAPU.RAM; S9xAPUPackStatus (); if (CPU.Flags & SCAN_KEYS_FLAG) { @@ -226,6 +230,16 @@ void S9xDoHBlankProcessing () switch (CPU.WhichEvent) { case HBLANK_START_EVENT: +#ifdef SYNC_JOYPAD_AT_HBLANK + // Re-get the controls every hblank. A resolution algorithm in + // ppu.cpp will determine with greater accuracy whether a key was + // pressed or released during the frame. + uint32 i; + for (i = 0; i < 5; i++) + { + IPPU.JoypadsAtHBlanks [i][CPU.V_Counter] = S9xReadJoypad (i); + } +#endif if (IPPU.HDMA && CPU.V_Counter <= PPU.ScreenHeight) IPPU.HDMA = S9xDoHDMA (IPPU.HDMA); diff --git a/source/cpuexec.h b/source/cpuexec.h index 9a26081..a094220 100644 --- a/source/cpuexec.h +++ b/source/cpuexec.h @@ -109,6 +109,7 @@ struct SICPU { uint8 *Speed; struct SOpcodes *S9xOpcodes; + struct SRegisters Registers; uint8 _Carry; uint8 _Zero; uint8 _Negative; @@ -140,16 +141,16 @@ END_EXTERN_C STATIC inline void S9xUnpackStatus() { - ICPU._Zero = (Registers.PL & Zero) == 0; - ICPU._Negative = (Registers.PL & Negative); - ICPU._Carry = (Registers.PL & Carry); - ICPU._Overflow = (Registers.PL & Overflow) >> 6; + ICPU._Zero = (ICPU.Registers.PL & Zero) == 0; + ICPU._Negative = (ICPU.Registers.PL & Negative); + ICPU._Carry = (ICPU.Registers.PL & Carry); + ICPU._Overflow = (ICPU.Registers.PL & Overflow) >> 6; } STATIC inline void S9xPackStatus() { - Registers.PL &= ~(Zero | Negative | Carry | Overflow); - Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | + ICPU.Registers.PL &= ~(Zero | Negative | Carry | Overflow); + ICPU.Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | (ICPU._Negative & 0x80) | (ICPU._Overflow << 6); } diff --git a/source/cpumacro.h b/source/cpumacro.h index d97aa53..c70c2ba 100644 --- a/source/cpumacro.h +++ b/source/cpumacro.h @@ -90,28 +90,28 @@ #ifndef _CPUMACRO_H_ #define _CPUMACRO_H_ -STATIC inline void SetZN16 (uint16 Work) +static void SetZN16 (uint16 Work) { ICPU._Zero = Work != 0; ICPU._Negative = (uint8) (Work >> 8); } -STATIC inline void SetZN8 (uint8 Work) +static void SetZN8 (uint8 Work) { ICPU._Zero = Work; ICPU._Negative = Work; } -STATIC inline void ADC8 () +static void ADC8 (long Addr) { - Work8 = S9xGetByte (OpAddress); + uint8 Work8 = S9xGetByte (Addr); if (CheckDecimal ()) { - A1 = (Registers.A.W) & 0xF; - A2 = (Registers.A.W >> 4) & 0xF; - W1 = Work8 & 0xF; - W2 = (Work8 >> 4) & 0xF; + uint8 A1 = (ICPU.Registers.A.W) & 0xF; + uint8 A2 = (ICPU.Registers.A.W >> 4) & 0xF; + uint8 W1 = Work8 & 0xF; + uint8 W2 = (Work8 >> 4) & 0xF; A1 += W1 + CheckCarry(); if (A1 > 9) @@ -133,46 +133,46 @@ STATIC inline void ADC8 () ClearCarry (); } - Ans8 = (A2 << 4) | A1; - if (~(Registers.AL ^ Work8) & + int8 Ans8 = (A2 << 4) | A1; + if (~(ICPU.Registers.AL ^ Work8) & (Work8 ^ Ans8) & 0x80) SetOverflow(); else ClearOverflow(); - Registers.AL = Ans8; - SetZN8 (Registers.AL); + ICPU.Registers.AL = Ans8; + SetZN8 (ICPU.Registers.AL); } else { - Ans16 = Registers.AL + Work8 + CheckCarry(); + int16 Ans16 = ICPU.Registers.AL + Work8 + CheckCarry(); ICPU._Carry = Ans16 >= 0x100; - if (~(Registers.AL ^ Work8) & + if (~(ICPU.Registers.AL ^ Work8) & (Work8 ^ (uint8) Ans16) & 0x80) SetOverflow(); else ClearOverflow(); - Registers.AL = (uint8) Ans16; - SetZN8 (Registers.AL); + ICPU.Registers.AL = (uint8) Ans16; + SetZN8 (ICPU.Registers.AL); } } -STATIC inline void ADC16 () +static void ADC16 (long Addr) { - Work16 = S9xGetWord (OpAddress); + uint16 Work16 = S9xGetWord (Addr); if (CheckDecimal ()) { - A1 = (Registers.A.W) & 0xF; - A2 = (Registers.A.W >> 4) & 0xF; - A3 = (Registers.A.W >> 8) & 0xF; - A4 = (Registers.A.W >> 12) & 0xF; - W1 = Work16 & 0xF; - W2 = (Work16 >> 4) & 0xF; - W3 = (Work16 >> 8) & 0xF; - W4 = (Work16 >> 12) & 0xF; + uint8 A1 = (ICPU.Registers.A.W) & 0xF; + uint8 A2 = (ICPU.Registers.A.W >> 4) & 0xF; + uint8 A3 = (ICPU.Registers.A.W >> 8) & 0xF; + uint8 A4 = (ICPU.Registers.A.W >> 12) & 0xF; + uint8 W1 = Work16 & 0xF; + uint8 W2 = (Work16 >> 4) & 0xF; + uint8 W3 = (Work16 >> 8) & 0xF; + uint8 W4 = (Work16 >> 12) & 0xF; A1 += W1 + CheckCarry (); if (A1 > 9) @@ -210,154 +210,154 @@ STATIC inline void ADC16 () ClearCarry (); } - Ans16 = (A4 << 12) | (A3 << 8) | (A2 << 4) | (A1); - if (~(Registers.A.W ^ Work16) & + uint16 Ans16 = (A4 << 12) | (A3 << 8) | (A2 << 4) | (A1); + if (~(ICPU.Registers.A.W ^ Work16) & (Work16 ^ Ans16) & 0x8000) SetOverflow(); else ClearOverflow(); - Registers.A.W = Ans16; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = Ans16; + SetZN16 (ICPU.Registers.A.W); } else { - Ans32 = Registers.A.W + Work16 + CheckCarry(); + uint32 Ans32 = ICPU.Registers.A.W + Work16 + CheckCarry(); ICPU._Carry = Ans32 >= 0x10000; - if (~(Registers.A.W ^ Work16) & + if (~(ICPU.Registers.A.W ^ Work16) & (Work16 ^ (uint16) Ans32) & 0x8000) SetOverflow(); else ClearOverflow(); - Registers.A.W = (uint16) Ans32; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = (uint16) Ans32; + SetZN16 (ICPU.Registers.A.W); } } -STATIC inline void AND16 () +static void AND16 (long Addr) { - Registers.A.W &= S9xGetWord (OpAddress); - SetZN16 (Registers.A.W); + ICPU.Registers.A.W &= S9xGetWord (Addr); + SetZN16 (ICPU.Registers.A.W); } -STATIC inline void AND8 () +static void AND8 (long Addr) { - Registers.AL &= S9xGetByte (OpAddress); - SetZN8 (Registers.AL); + ICPU.Registers.AL &= S9xGetByte (Addr); + SetZN8 (ICPU.Registers.AL); } -STATIC inline void A_ASL16 () +static inline void A_ASL16 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - ICPU._Carry = (Registers.AH & 0x80) != 0; - Registers.A.W <<= 1; - SetZN16 (Registers.A.W); + ICPU._Carry = (ICPU.Registers.AH & 0x80) != 0; + ICPU.Registers.A.W <<= 1; + SetZN16 (ICPU.Registers.A.W); } -STATIC inline void A_ASL8 () +static inline void A_ASL8 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - ICPU._Carry = (Registers.AL & 0x80) != 0; - Registers.AL <<= 1; - SetZN8 (Registers.AL); + ICPU._Carry = (ICPU.Registers.AL & 0x80) != 0; + ICPU.Registers.AL <<= 1; + SetZN8 (ICPU.Registers.AL); } -STATIC inline void ASL16 () +static void ASL16 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work16 = S9xGetWord (OpAddress); + uint16 Work16 = S9xGetWord (Addr); ICPU._Carry = (Work16 & 0x8000) != 0; Work16 <<= 1; - //S9xSetWord (Work16, OpAddress); - S9xSetByte(Work16>>8, OpAddress+1); - S9xSetByte(Work16&0xFF, OpAddress); + //S9xSetWord (Work16, Addr); + S9xSetByte(Work16>>8, Addr+1); + S9xSetByte(Work16&0xFF, Addr); SetZN16 (Work16); } -STATIC inline void ASL8 () +static void ASL8 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work8 = S9xGetByte (OpAddress); + uint8 Work8 = S9xGetByte (Addr); ICPU._Carry = (Work8 & 0x80) != 0; Work8 <<= 1; - S9xSetByte (Work8, OpAddress); + S9xSetByte (Work8, Addr); SetZN8 (Work8); } -STATIC inline void BIT16 () +static void BIT16 (long Addr) { - Work16 = S9xGetWord (OpAddress); + uint16 Work16 = S9xGetWord (Addr); ICPU._Overflow = (Work16 & 0x4000) != 0; ICPU._Negative = (uint8) (Work16 >> 8); - ICPU._Zero = (Work16 & Registers.A.W) != 0; + ICPU._Zero = (Work16 & ICPU.Registers.A.W) != 0; } -STATIC inline void BIT8 () +static void BIT8 (long Addr) { - Work8 = S9xGetByte (OpAddress); + uint8 Work8 = S9xGetByte (Addr); ICPU._Overflow = (Work8 & 0x40) != 0; ICPU._Negative = Work8; - ICPU._Zero = Work8 & Registers.AL; + ICPU._Zero = Work8 & ICPU.Registers.AL; } -STATIC inline void CMP16 () +static void CMP16 (long Addr) { - Int32 = (long) Registers.A.W - - (long) S9xGetWord (OpAddress); + int32 Int32 = (long) ICPU.Registers.A.W - + (long) S9xGetWord (Addr); ICPU._Carry = Int32 >= 0; SetZN16 ((uint16) Int32); } -STATIC inline void CMP8 () +static void CMP8 (long Addr) { - Int16 = (short) Registers.AL - - (short) S9xGetByte (OpAddress); + int16 Int16 = (short) ICPU.Registers.AL - + (short) S9xGetByte (Addr); ICPU._Carry = Int16 >= 0; SetZN8 ((uint8) Int16); } -STATIC inline void CMX16 () +static void CMX16 (long Addr) { - Int32 = (long) Registers.X.W - - (long) S9xGetWord (OpAddress); + int32 Int32 = (long) ICPU.Registers.X.W - + (long) S9xGetWord (Addr); ICPU._Carry = Int32 >= 0; SetZN16 ((uint16) Int32); } -STATIC inline void CMX8 () +static void CMX8 (long Addr) { - Int16 = (short) Registers.XL - - (short) S9xGetByte (OpAddress); + int16 Int16 = (short) ICPU.Registers.XL - + (short) S9xGetByte (Addr); ICPU._Carry = Int16 >= 0; SetZN8 ((uint8) Int16); } -STATIC inline void CMY16 () +static void CMY16 (long Addr) { - Int32 = (long) Registers.Y.W - - (long) S9xGetWord (OpAddress); + int32 Int32 = (long) ICPU.Registers.Y.W - + (long) S9xGetWord (Addr); ICPU._Carry = Int32 >= 0; SetZN16 ((uint16) Int32); } -STATIC inline void CMY8 () +static void CMY8 (long Addr) { - Int16 = (short) Registers.YL - - (short) S9xGetByte (OpAddress); + int16 Int16 = (short) ICPU.Registers.YL - + (short) S9xGetByte (Addr); ICPU._Carry = Int16 >= 0; SetZN8 ((uint8) Int16); } -STATIC inline void A_DEC16 () +static inline void A_DEC16 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -366,11 +366,11 @@ STATIC inline void A_DEC16 () CPU.WaitAddress = NULL; #endif - Registers.A.W--; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W--; + SetZN16 (ICPU.Registers.A.W); } -STATIC inline void A_DEC8 () +static inline void A_DEC8 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -379,11 +379,11 @@ STATIC inline void A_DEC8 () CPU.WaitAddress = NULL; #endif - Registers.AL--; - SetZN8 (Registers.AL); + ICPU.Registers.AL--; + SetZN8 (ICPU.Registers.AL); } -STATIC inline void DEC16 () +static void DEC16 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -392,14 +392,14 @@ STATIC inline void DEC16 () CPU.WaitAddress = NULL; #endif - Work16 = S9xGetWord (OpAddress) - 1; - //S9xSetWord (Work16, OpAddress); - S9xSetByte (Work16>>8, OpAddress+1); - S9xSetByte (Work16&0xFF, OpAddress); + uint16 Work16 = S9xGetWord (Addr) - 1; + //S9xSetWord (Work16, Addr); + S9xSetByte (Work16>>8, Addr+1); + S9xSetByte (Work16&0xFF, Addr); SetZN16 (Work16); } -STATIC inline void DEC8 () +static void DEC8 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -408,24 +408,24 @@ STATIC inline void DEC8 () CPU.WaitAddress = NULL; #endif - Work8 = S9xGetByte (OpAddress) - 1; - S9xSetByte (Work8, OpAddress); + uint8 Work8 = S9xGetByte (Addr) - 1; + S9xSetByte (Work8, Addr); SetZN8 (Work8); } -STATIC inline void EOR16 () +static void EOR16 (long Addr) { - Registers.A.W ^= S9xGetWord (OpAddress); - SetZN16 (Registers.A.W); + ICPU.Registers.A.W ^= S9xGetWord (Addr); + SetZN16 (ICPU.Registers.A.W); } -STATIC inline void EOR8 () +static void EOR8 (long Addr) { - Registers.AL ^= S9xGetByte (OpAddress); - SetZN8 (Registers.AL); + ICPU.Registers.AL ^= S9xGetByte (Addr); + SetZN8 (ICPU.Registers.AL); } -STATIC inline void A_INC16 () +static inline void A_INC16 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -434,11 +434,11 @@ STATIC inline void A_INC16 () CPU.WaitAddress = NULL; #endif - Registers.A.W++; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W++; + SetZN16 (ICPU.Registers.A.W); } -STATIC inline void A_INC8 () +static inline void A_INC8 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -447,11 +447,11 @@ STATIC inline void A_INC8 () CPU.WaitAddress = NULL; #endif - Registers.AL++; - SetZN8 (Registers.AL); + ICPU.Registers.AL++; + SetZN8 (ICPU.Registers.AL); } -STATIC inline void INC16 () +static void INC16 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -460,14 +460,14 @@ STATIC inline void INC16 () CPU.WaitAddress = NULL; #endif - Work16 = S9xGetWord (OpAddress) + 1; - //S9xSetWord (Work16, OpAddress); - S9xSetByte (Work16>>8, OpAddress+1); - S9xSetByte (Work16&0xFF, OpAddress); + uint16 Work16 = S9xGetWord (Addr) + 1; + //S9xSetWord (Work16, Addr); + S9xSetByte (Work16>>8, Addr+1); + S9xSetByte (Work16&0xFF, Addr); SetZN16 (Work16); } -STATIC inline void INC8 () +static void INC8 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -476,224 +476,224 @@ STATIC inline void INC8 () CPU.WaitAddress = NULL; #endif - Work8 = S9xGetByte (OpAddress) + 1; - S9xSetByte (Work8, OpAddress); + uint8 Work8 = S9xGetByte (Addr) + 1; + S9xSetByte (Work8, Addr); SetZN8 (Work8); } -STATIC inline void LDA16 () +static void LDA16 (long Addr) { - Registers.A.W = S9xGetWord (OpAddress); - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = S9xGetWord (Addr); + SetZN16 (ICPU.Registers.A.W); } -STATIC inline void LDA8 () +static void LDA8 (long Addr) { - Registers.AL = S9xGetByte (OpAddress); - SetZN8 (Registers.AL); + ICPU.Registers.AL = S9xGetByte (Addr); + SetZN8 (ICPU.Registers.AL); } -STATIC inline void LDX16 () +static void LDX16 (long Addr) { - Registers.X.W = S9xGetWord (OpAddress); - SetZN16 (Registers.X.W); + ICPU.Registers.X.W = S9xGetWord (Addr); + SetZN16 (ICPU.Registers.X.W); } -STATIC inline void LDX8 () +static void LDX8 (long Addr) { - Registers.XL = S9xGetByte (OpAddress); - SetZN8 (Registers.XL); + ICPU.Registers.XL = S9xGetByte (Addr); + SetZN8 (ICPU.Registers.XL); } -STATIC inline void LDY16 () +static void LDY16 (long Addr) { - Registers.Y.W = S9xGetWord (OpAddress); - SetZN16 (Registers.Y.W); + ICPU.Registers.Y.W = S9xGetWord (Addr); + SetZN16 (ICPU.Registers.Y.W); } -STATIC inline void LDY8 () +static void LDY8 (long Addr) { - Registers.YL = S9xGetByte (OpAddress); - SetZN8 (Registers.YL); + ICPU.Registers.YL = S9xGetByte (Addr); + SetZN8 (ICPU.Registers.YL); } -STATIC inline void A_LSR16 () +static inline void A_LSR16 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - ICPU._Carry = Registers.AL & 1; - Registers.A.W >>= 1; - SetZN16 (Registers.A.W); + ICPU._Carry = ICPU.Registers.AL & 1; + ICPU.Registers.A.W >>= 1; + SetZN16 (ICPU.Registers.A.W); } -STATIC inline void A_LSR8 () +static inline void A_LSR8 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - ICPU._Carry = Registers.AL & 1; - Registers.AL >>= 1; - SetZN8 (Registers.AL); + ICPU._Carry = ICPU.Registers.AL & 1; + ICPU.Registers.AL >>= 1; + SetZN8 (ICPU.Registers.AL); } -STATIC inline void LSR16 () +static void LSR16 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work16 = S9xGetWord (OpAddress); + uint16 Work16 = S9xGetWord (Addr); ICPU._Carry = Work16 & 1; Work16 >>= 1; - //S9xSetWord (Work16, OpAddress); - S9xSetByte (Work16>>8, OpAddress+1); - S9xSetByte (Work16&0xFF, OpAddress); + //S9xSetWord (Work16, Addr); + S9xSetByte (Work16>>8, Addr+1); + S9xSetByte (Work16&0xFF, Addr); SetZN16 (Work16); } -STATIC inline void LSR8 () +static void LSR8 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work8 = S9xGetByte (OpAddress); + uint8 Work8 = S9xGetByte (Addr); ICPU._Carry = Work8 & 1; Work8 >>= 1; - S9xSetByte (Work8, OpAddress); + S9xSetByte (Work8, Addr); SetZN8 (Work8); } -STATIC inline void ORA16 () +static void ORA16 (long Addr) { - Registers.A.W |= S9xGetWord (OpAddress); - SetZN16 (Registers.A.W); + ICPU.Registers.A.W |= S9xGetWord (Addr); + SetZN16 (ICPU.Registers.A.W); } -STATIC inline void ORA8 () +static void ORA8 (long Addr) { - Registers.AL |= S9xGetByte (OpAddress); - SetZN8 (Registers.AL); + ICPU.Registers.AL |= S9xGetByte (Addr); + SetZN8 (ICPU.Registers.AL); } -STATIC inline void A_ROL16 () +static inline void A_ROL16 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work32 = (Registers.A.W << 1) | CheckCarry(); + uint32 Work32 = (ICPU.Registers.A.W << 1) | CheckCarry(); ICPU._Carry = Work32 >= 0x10000; - Registers.A.W = (uint16) Work32; + ICPU.Registers.A.W = (uint16) Work32; SetZN16 ((uint16) Work32); } -STATIC inline void A_ROL8 () +static inline void A_ROL8 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work16 = Registers.AL; + uint16 Work16 = ICPU.Registers.AL; Work16 <<= 1; Work16 |= CheckCarry(); ICPU._Carry = Work16 >= 0x100; - Registers.AL = (uint8) Work16; + ICPU.Registers.AL = (uint8) Work16; SetZN8 ((uint8) Work16); } -STATIC inline void ROL16 () +static void ROL16 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work32 = S9xGetWord (OpAddress); + uint32 Work32 = S9xGetWord (Addr); Work32 <<= 1; Work32 |= CheckCarry(); ICPU._Carry = Work32 >= 0x10000; - //S9xSetWord ((uint16) Work32, OpAddress); - S9xSetByte((Work32>>8)&0xFF, OpAddress+1); - S9xSetByte(Work32&0xFF, OpAddress); + //S9xSetWord ((uint16) Work32, Addr); + S9xSetByte((Work32>>8)&0xFF, Addr+1); + S9xSetByte(Work32&0xFF, Addr); SetZN16 ((uint16) Work32); } -STATIC inline void ROL8 () +static void ROL8 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work16 = S9xGetByte (OpAddress); + uint16 Work16 = S9xGetByte (Addr); Work16 <<= 1; Work16 |= CheckCarry (); ICPU._Carry = Work16 >= 0x100; - S9xSetByte ((uint8) Work16, OpAddress); + S9xSetByte ((uint8) Work16, Addr); SetZN8 ((uint8) Work16); } -STATIC inline void A_ROR16 () +static inline void A_ROR16 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work32 = Registers.A.W; + uint32 Work32 = ICPU.Registers.A.W; Work32 |= (int) CheckCarry() << 16; ICPU._Carry = (uint8) (Work32 & 1); Work32 >>= 1; - Registers.A.W = (uint16) Work32; + ICPU.Registers.A.W = (uint16) Work32; SetZN16 ((uint16) Work32); } -STATIC inline void A_ROR8 () +static inline void A_ROR8 () { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work16 = Registers.AL | ((uint16) CheckCarry() << 8); + uint16 Work16 = ICPU.Registers.AL | ((uint16) CheckCarry() << 8); ICPU._Carry = (uint8) Work16 & 1; Work16 >>= 1; - Registers.AL = (uint8) Work16; + ICPU.Registers.AL = (uint8) Work16; SetZN8 ((uint8) Work16); } -STATIC inline void ROR16 () +static void ROR16 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work32 = S9xGetWord (OpAddress); + uint32 Work32 = S9xGetWord (Addr); Work32 |= (int) CheckCarry() << 16; ICPU._Carry = (uint8) (Work32 & 1); Work32 >>= 1; - //S9xSetWord ((uint16) Work32, OpAddress); - S9xSetByte ( (Work32>>8)&0x00FF, OpAddress+1); - S9xSetByte (Work32&0x00FF, OpAddress); + //S9xSetWord ((uint16) Work32, Addr); + S9xSetByte ( (Work32>>8)&0x00FF, Addr+1); + S9xSetByte (Work32&0x00FF, Addr); SetZN16 ((uint16) Work32); } -STATIC inline void ROR8 () +static void ROR8 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work16 = S9xGetByte (OpAddress); + uint16 Work16 = S9xGetByte (Addr); Work16 |= (int) CheckCarry () << 8; ICPU._Carry = (uint8) (Work16 & 1); Work16 >>= 1; - S9xSetByte ((uint8) Work16, OpAddress); + S9xSetByte ((uint8) Work16, Addr); SetZN8 ((uint8) Work16); } -STATIC inline void SBC16 () +static void SBC16 (long Addr) { - Work16 = S9xGetWord (OpAddress); + uint16 Work16 = S9xGetWord (Addr); if (CheckDecimal ()) { - A1 = (Registers.A.W) & 0xF; - A2 = (Registers.A.W >> 4) & 0xF; - A3 = (Registers.A.W >> 8) & 0xF; - A4 = (Registers.A.W >> 12) & 0xF; - W1 = Work16 & 0xF; - W2 = (Work16 >> 4) & 0xF; - W3 = (Work16 >> 8) & 0xF; - W4 = (Work16 >> 12) & 0xF; + uint8 A1 = (ICPU.Registers.A.W) & 0xF; + uint8 A2 = (ICPU.Registers.A.W >> 4) & 0xF; + uint8 A3 = (ICPU.Registers.A.W >> 8) & 0xF; + uint8 A4 = (ICPU.Registers.A.W >> 12) & 0xF; + uint8 W1 = Work16 & 0xF; + uint8 W2 = (Work16 >> 4) & 0xF; + uint8 W3 = (Work16 >> 8) & 0xF; + uint8 W4 = (Work16 >> 12) & 0xF; A1 -= W1 + !CheckCarry (); A2 -= W2; @@ -724,41 +724,41 @@ STATIC inline void SBC16 () SetCarry (); } - Ans16 = (A4 << 12) | (A3 << 8) | (A2 << 4) | (A1); - if ((Registers.A.W ^ Work16) & - (Registers.A.W ^ Ans16) & 0x8000) + uint16 Ans16 = (A4 << 12) | (A3 << 8) | (A2 << 4) | (A1); + if ((ICPU.Registers.A.W ^ Work16) & + (ICPU.Registers.A.W ^ Ans16) & 0x8000) SetOverflow(); else ClearOverflow(); - Registers.A.W = Ans16; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = Ans16; + SetZN16 (ICPU.Registers.A.W); } else { - Int32 = (long) Registers.A.W - (long) Work16 + (long) CheckCarry() - 1; + int32 Int32 = (long) ICPU.Registers.A.W - (long) Work16 + (long) CheckCarry() - 1; ICPU._Carry = Int32 >= 0; - if ((Registers.A.W ^ Work16) & - (Registers.A.W ^ (uint16) Int32) & 0x8000) + if ((ICPU.Registers.A.W ^ Work16) & + (ICPU.Registers.A.W ^ (uint16) Int32) & 0x8000) SetOverflow(); else ClearOverflow (); - Registers.A.W = (uint16) Int32; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = (uint16) Int32; + SetZN16 (ICPU.Registers.A.W); } } -STATIC inline void SBC8 () +static void SBC8 (long Addr) { - Work8 = S9xGetByte (OpAddress); + uint8 Work8 = S9xGetByte (Addr); if (CheckDecimal ()) { - A1 = (Registers.A.W) & 0xF; - A2 = (Registers.A.W >> 4) & 0xF; - W1 = Work8 & 0xF; - W2 = (Work8 >> 4) & 0xF; + uint8 A1 = (ICPU.Registers.A.W) & 0xF; + uint8 A2 = (ICPU.Registers.A.W >> 4) & 0xF; + uint8 W1 = Work8 & 0xF; + uint8 W2 = (Work8 >> 4) & 0xF; A1 -= W1 + !CheckCarry (); A2 -= W2; @@ -777,116 +777,116 @@ STATIC inline void SBC8 () SetCarry (); } - Ans8 = (A2 << 4) | A1; - if ((Registers.AL ^ Work8) & - (Registers.AL ^ Ans8) & 0x80) + uint8 Ans8 = (A2 << 4) | A1; + if ((ICPU.Registers.AL ^ Work8) & + (ICPU.Registers.AL ^ Ans8) & 0x80) SetOverflow (); else ClearOverflow (); - Registers.AL = Ans8; - SetZN8 (Registers.AL); + ICPU.Registers.AL = Ans8; + SetZN8 (ICPU.Registers.AL); } else { - Int16 = (short) Registers.AL - (short) Work8 + (short) CheckCarry() - 1; + int16 Int16 = (short) ICPU.Registers.AL - (short) Work8 + (short) CheckCarry() - 1; ICPU._Carry = Int16 >= 0; - if ((Registers.AL ^ Work8) & - (Registers.AL ^ (uint8) Int16) & 0x80) + if ((ICPU.Registers.AL ^ Work8) & + (ICPU.Registers.AL ^ (uint8) Int16) & 0x80) SetOverflow (); else ClearOverflow (); - Registers.AL = (uint8) Int16; - SetZN8 (Registers.AL); + ICPU.Registers.AL = (uint8) Int16; + SetZN8 (ICPU.Registers.AL); } } -STATIC inline void STA16 () +static void STA16 (long Addr) { - S9xSetWord (Registers.A.W, OpAddress); + S9xSetWord (ICPU.Registers.A.W, Addr); } -STATIC inline void STA8 () +static void STA8 (long Addr) { - S9xSetByte (Registers.AL, OpAddress); + S9xSetByte (ICPU.Registers.AL, Addr); } -STATIC inline void STX16 () +static void STX16 (long Addr) { - S9xSetWord (Registers.X.W, OpAddress); + S9xSetWord (ICPU.Registers.X.W, Addr); } -STATIC inline void STX8 () +static void STX8 (long Addr) { - S9xSetByte (Registers.XL, OpAddress); + S9xSetByte (ICPU.Registers.XL, Addr); } -STATIC inline void STY16 () +static void STY16 (long Addr) { - S9xSetWord (Registers.Y.W, OpAddress); + S9xSetWord (ICPU.Registers.Y.W, Addr); } -STATIC inline void STY8 () +static void STY8 (long Addr) { - S9xSetByte (Registers.YL, OpAddress); + S9xSetByte (ICPU.Registers.YL, Addr); } -STATIC inline void STZ16 () +static void STZ16 (long Addr) { - S9xSetWord (0, OpAddress); + S9xSetWord (0, Addr); } -STATIC inline void STZ8 () +static void STZ8 (long Addr) { - S9xSetByte (0, OpAddress); + S9xSetByte (0, Addr); } -STATIC inline void TSB16 () +static void TSB16 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work16 = S9xGetWord (OpAddress); - ICPU._Zero = (Work16 & Registers.A.W) != 0; - Work16 |= Registers.A.W; - //S9xSetWord (Work16, OpAddress); - S9xSetByte (Work16>>8, OpAddress+1); - S9xSetByte (Work16&0xFF, OpAddress); + uint16 Work16 = S9xGetWord (Addr); + ICPU._Zero = (Work16 & ICPU.Registers.A.W) != 0; + Work16 |= ICPU.Registers.A.W; + //S9xSetWord (Work16, Addr); + S9xSetByte (Work16>>8, Addr+1); + S9xSetByte (Work16&0xFF, Addr); } -STATIC inline void TSB8 () +static void TSB8 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work8 = S9xGetByte (OpAddress); - ICPU._Zero = Work8 & Registers.AL; - Work8 |= Registers.AL; - S9xSetByte (Work8, OpAddress); + uint8 Work8 = S9xGetByte (Addr); + ICPU._Zero = Work8 & ICPU.Registers.AL; + Work8 |= ICPU.Registers.AL; + S9xSetByte (Work8, Addr); } -STATIC inline void TRB16 () +static void TRB16 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work16 = S9xGetWord (OpAddress); - ICPU._Zero = (Work16 & Registers.A.W) != 0; - Work16 &= ~Registers.A.W; - //S9xSetWord (Work16, OpAddress); - S9xSetByte (Work16>>8, OpAddress+1); - S9xSetByte (Work16&0xFF, OpAddress); + uint16 Work16 = S9xGetWord (Addr); + ICPU._Zero = (Work16 & ICPU.Registers.A.W) != 0; + Work16 &= ~ICPU.Registers.A.W; + //S9xSetWord (Work16, Addr); + S9xSetByte (Work16>>8, Addr+1); + S9xSetByte (Work16&0xFF, Addr); } -STATIC inline void TRB8 () +static void TRB8 (long Addr) { #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Work8 = S9xGetByte (OpAddress); - ICPU._Zero = Work8 & Registers.AL; - Work8 &= ~Registers.AL; - S9xSetByte (Work8, OpAddress); + uint8 Work8 = S9xGetByte (Addr); + ICPU._Zero = Work8 & ICPU.Registers.AL; + Work8 &= ~ICPU.Registers.AL; + S9xSetByte (Work8, Addr); } #endif diff --git a/source/cpuops.cpp b/source/cpuops.cpp index c5adc67..b01bce5 100644 --- a/source/cpuops.cpp +++ b/source/cpuops.cpp @@ -100,204 +100,167 @@ #include "sa1.h" #include "spc7110.h" -START_EXTERN_C -extern uint8 A1, A2, A3, A4, W1, W2, W3, W4; -extern uint8 Ans8; -extern uint16 Ans16; -extern uint32 Ans32; -extern uint8 Work8; -extern uint16 Work16; -extern uint32 Work32; -extern signed char Int8; -extern short Int16; -extern long Int32; -END_EXTERN_C - #include "cpuexec.h" #include "cpuaddr.h" #include "cpuops.h" #include "cpumacro.h" #include "apu.h" +// For use with the opcodes whose functions here examine the OpAddress. +static void OpAddressPassthrough (long Addr) +{ + OpAddress = Addr; +} + /* ADC *************************************************************************************** */ static void Op69M1 (void) { - Immediate8 (READ); - ADC8 (); + Immediate8 (READ, ADC8); } static void Op69M0 (void) { - Immediate16 (READ); - ADC16 (); + Immediate16 (READ, ADC16); } static void Op65M1 (void) { - Direct (READ); - ADC8 (); + Direct (READ, ADC8); } static void Op65M0 (void) { - Direct (READ); - ADC16 (); + Direct (READ, ADC16); } static void Op75M1 (void) { - DirectIndexedX (READ); - ADC8 (); + DirectIndexedX (READ, ADC8); } static void Op75M0 (void) { - DirectIndexedX (READ); - ADC16 (); + DirectIndexedX (READ, ADC16); } static void Op72M1 (void) { - DirectIndirect (READ); - ADC8 (); + DirectIndirect (READ, ADC8); } static void Op72M0 (void) { - DirectIndirect (READ); - ADC16 (); + DirectIndirect (READ, ADC16); } static void Op61M1 (void) { - DirectIndexedIndirect (READ); - ADC8 (); + DirectIndexedIndirect (READ, ADC8); } static void Op61M0 (void) { - DirectIndexedIndirect (READ); - ADC16 (); + DirectIndexedIndirect (READ, ADC16); } static void Op71M1 (void) { - DirectIndirectIndexed (READ); - ADC8 (); + DirectIndirectIndexed (READ, ADC8); } static void Op71M0 (void) { - DirectIndirectIndexed (READ); - ADC16 (); + DirectIndirectIndexed (READ, ADC16); } static void Op67M1 (void) { - DirectIndirectLong (READ); - ADC8 (); + DirectIndirectLong (READ, ADC8); } static void Op67M0 (void) { - DirectIndirectLong (READ); - ADC16 (); + DirectIndirectLong (READ, ADC16); } static void Op77M1 (void) { - DirectIndirectIndexedLong (READ); - ADC8 (); + DirectIndirectIndexedLong (READ, ADC8); } static void Op77M0 (void) { - DirectIndirectIndexedLong (READ); - ADC16 (); + DirectIndirectIndexedLong (READ, ADC16); } static void Op6DM1 (void) { - Absolute (READ); - ADC8 (); + Absolute (READ, ADC8); } static void Op6DM0 (void) { - Absolute (READ); - ADC16 (); + Absolute (READ, ADC16); } static void Op7DM1 (void) { - AbsoluteIndexedX (READ); - ADC8 (); + AbsoluteIndexedX (READ, ADC8); } static void Op7DM0 (void) { - AbsoluteIndexedX (READ); - ADC16 (); + AbsoluteIndexedX (READ, ADC16); } static void Op79M1 (void) { - AbsoluteIndexedY (READ); - ADC8 (); + AbsoluteIndexedY (READ, ADC8); } static void Op79M0 (void) { - AbsoluteIndexedY (READ); - ADC16 (); + AbsoluteIndexedY (READ, ADC16); } static void Op6FM1 (void) { - AbsoluteLong (READ); - ADC8 (); + AbsoluteLong (READ, ADC8); } static void Op6FM0 (void) { - AbsoluteLong (READ); - ADC16 (); + AbsoluteLong (READ, ADC16); } static void Op7FM1 (void) { - AbsoluteLongIndexedX (READ); - ADC8 (); + AbsoluteLongIndexedX (READ, ADC8); } static void Op7FM0 (void) { - AbsoluteLongIndexedX (READ); - ADC16 (); + AbsoluteLongIndexedX (READ, ADC16); } static void Op63M1 (void) { - StackRelative (READ); - ADC8 (); + StackRelative (READ, ADC8); } static void Op63M0 (void) { - StackRelative (READ); - ADC16 (); + StackRelative (READ, ADC16); } static void Op73M1 (void) { - StackRelativeIndirectIndexed (READ); - ADC8 (); + StackRelativeIndirectIndexed (READ, ADC8); } static void Op73M0 (void) { - StackRelativeIndirectIndexed (READ); - ADC16 (); + StackRelativeIndirectIndexed (READ, ADC16); } /**********************************************************************************************/ @@ -305,193 +268,165 @@ static void Op73M0 (void) /* AND *************************************************************************************** */ static void Op29M1 (void) { - Registers.AL &= *CPU.PC++; + ICPU.Registers.AL &= *CPU.PC++; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - SetZN8 (Registers.AL); + SetZN8 (ICPU.Registers.AL); } static void Op29M0 (void) { #ifdef FAST_LSB_WORD_ACCESS - Registers.A.W &= *(uint16 *) CPU.PC; + ICPU.Registers.A.W &= *(uint16 *) CPU.PC; #else - Registers.A.W &= *CPU.PC + (*(CPU.PC + 1) << 8); + ICPU.Registers.A.W &= *CPU.PC + (*(CPU.PC + 1) << 8); #endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif - SetZN16 (Registers.A.W); + SetZN16 (ICPU.Registers.A.W); } static void Op25M1 (void) { - Direct (READ); - AND8 (); + Direct (READ, AND8); } static void Op25M0 (void) { - Direct (READ); - AND16 (); + Direct (READ, AND16); } static void Op35M1 (void) { - DirectIndexedX (READ); - AND8 (); + DirectIndexedX (READ, AND8); } static void Op35M0 (void) { - DirectIndexedX (READ); - AND16 (); + DirectIndexedX (READ, AND16); } static void Op32M1 (void) { - DirectIndirect (READ); - AND8 (); + DirectIndirect (READ, AND8); } static void Op32M0 (void) { - DirectIndirect (READ); - AND16 (); + DirectIndirect (READ, AND16); } static void Op21M1 (void) { - DirectIndexedIndirect (READ); - AND8 (); + DirectIndexedIndirect (READ, AND8); } static void Op21M0 (void) { - DirectIndexedIndirect (READ); - AND16 (); + DirectIndexedIndirect (READ, AND16); } static void Op31M1 (void) { - DirectIndirectIndexed (READ); - AND8 (); + DirectIndirectIndexed (READ, AND8); } static void Op31M0 (void) { - DirectIndirectIndexed (READ); - AND16 (); + DirectIndirectIndexed (READ, AND16); } static void Op27M1 (void) { - DirectIndirectLong (READ); - AND8 (); + DirectIndirectLong (READ, AND8); } static void Op27M0 (void) { - DirectIndirectLong (READ); - AND16 (); + DirectIndirectLong (READ, AND16); } static void Op37M1 (void) { - DirectIndirectIndexedLong (READ); - AND8 (); + DirectIndirectIndexedLong (READ, AND8); } static void Op37M0 (void) { - DirectIndirectIndexedLong (READ); - AND16 (); + DirectIndirectIndexedLong (READ, AND16); } static void Op2DM1 (void) { - Absolute (READ); - AND8 (); + Absolute (READ, AND8); } static void Op2DM0 (void) { - Absolute (READ); - AND16 (); + Absolute (READ, AND16); } static void Op3DM1 (void) { - AbsoluteIndexedX (READ); - AND8 (); + AbsoluteIndexedX (READ, AND8); } static void Op3DM0 (void) { - AbsoluteIndexedX (READ); - AND16 (); + AbsoluteIndexedX (READ, AND16); } static void Op39M1 (void) { - AbsoluteIndexedY (READ); - AND8 (); + AbsoluteIndexedY (READ, AND8); } static void Op39M0 (void) { - AbsoluteIndexedY (READ); - AND16 (); + AbsoluteIndexedY (READ, AND16); } static void Op2FM1 (void) { - AbsoluteLong (READ); - AND8 (); + AbsoluteLong (READ, AND8); } static void Op2FM0 (void) { - AbsoluteLong (READ); - AND16 (); + AbsoluteLong (READ, AND16); } static void Op3FM1 (void) { - AbsoluteLongIndexedX (READ); - AND8 (); + AbsoluteLongIndexedX (READ, AND8); } static void Op3FM0 (void) { - AbsoluteLongIndexedX (READ); - AND16 (); + AbsoluteLongIndexedX (READ, AND16); } static void Op23M1 (void) { - StackRelative (READ); - AND8 (); + StackRelative (READ, AND8); } static void Op23M0 (void) { - StackRelative (READ); - AND16 (); + StackRelative (READ, AND16); } static void Op33M1 (void) { - StackRelativeIndirectIndexed (READ); - AND8 (); + StackRelativeIndirectIndexed (READ, AND8); } static void Op33M0 (void) { - StackRelativeIndirectIndexed (READ); - AND16 (); + StackRelativeIndirectIndexed (READ, AND16); } /**********************************************************************************************/ @@ -508,57 +443,49 @@ static void Op0AM0 (void) static void Op06M1 (void) { - Direct (MODIFY); - ASL8 (); + Direct (MODIFY, ASL8); } static void Op06M0 (void) { - Direct (MODIFY); - ASL16 (); + Direct (MODIFY, ASL16); } static void Op16M1 (void) { - DirectIndexedX (MODIFY); - ASL8 (); + DirectIndexedX (MODIFY, ASL8); } static void Op16M0 (void) { - DirectIndexedX (MODIFY); - ASL16 (); + DirectIndexedX (MODIFY, ASL16); } static void Op0EM1 (void) { - Absolute (MODIFY); - ASL8 (); + Absolute (MODIFY, ASL8); } static void Op0EM0 (void) { - Absolute (MODIFY); - ASL16 (); + Absolute (MODIFY, ASL16); } static void Op1EM1 (void) { - AbsoluteIndexedX (MODIFY); - ASL8 (); + AbsoluteIndexedX (MODIFY, ASL8); } static void Op1EM0 (void) { - AbsoluteIndexedX (MODIFY); - ASL16 (); + AbsoluteIndexedX (MODIFY, ASL16); } /**********************************************************************************************/ /* BIT *************************************************************************************** */ static void Op89M1 (void) { - ICPU._Zero = Registers.AL & *CPU.PC++; + ICPU._Zero = ICPU.Registers.AL & *CPU.PC++; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif @@ -567,9 +494,9 @@ static void Op89M1 (void) static void Op89M0 (void) { #ifdef FAST_LSB_WORD_ACCESS - ICPU._Zero = (Registers.A.W & *(uint16 *) CPU.PC) != 0; + ICPU._Zero = (ICPU.Registers.A.W & *(uint16 *) CPU.PC) != 0; #else - ICPU._Zero = (Registers.A.W & (*CPU.PC + (*(CPU.PC + 1) << 8))) != 0; + ICPU._Zero = (ICPU.Registers.A.W & (*CPU.PC + (*(CPU.PC + 1) << 8))) != 0; #endif #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; @@ -579,57 +506,49 @@ static void Op89M0 (void) static void Op24M1 (void) { - Direct (READ); - BIT8 (); + Direct (READ, BIT8); } static void Op24M0 (void) { - Direct (READ); - BIT16 (); + Direct (READ, BIT16); } static void Op34M1 (void) { - DirectIndexedX (READ); - BIT8 (); + DirectIndexedX (READ, BIT8); } static void Op34M0 (void) { - DirectIndexedX (READ); - BIT16 (); + DirectIndexedX (READ, BIT16); } static void Op2CM1 (void) { - Absolute (READ); - BIT8 (); + Absolute (READ, BIT8); } static void Op2CM0 (void) { - Absolute (READ); - BIT16 (); + Absolute (READ, BIT16); } static void Op3CM1 (void) { - AbsoluteIndexedX (READ); - BIT8 (); + AbsoluteIndexedX (READ, BIT8); } static void Op3CM0 (void) { - AbsoluteIndexedX (READ); - BIT16 (); + AbsoluteIndexedX (READ, BIT16); } /**********************************************************************************************/ /* CMP *************************************************************************************** */ static void OpC9M1 (void) { - Int32 = (int) Registers.AL - (int) *CPU.PC++; + int32 Int32 = (int) ICPU.Registers.AL - (int) *CPU.PC++; ICPU._Carry = Int32 >= 0; SetZN8 ((uint8) Int32); #ifndef SA1_OPCODES @@ -639,10 +558,11 @@ static void OpC9M1 (void) static void OpC9M0 (void) { + int32 Int32; #ifdef FAST_LSB_WORD_ACCESS - Int32 = (long) Registers.A.W - (long) *(uint16 *) CPU.PC; + Int32 = (long) ICPU.Registers.A.W - (long) *(uint16 *) CPU.PC; #else - Int32 = (long) Registers.A.W - + Int32 = (long) ICPU.Registers.A.W - (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); #endif ICPU._Carry = Int32 >= 0; @@ -655,170 +575,142 @@ static void OpC9M0 (void) static void OpC5M1 (void) { - Direct (READ); - CMP8 (); + Direct (READ, CMP8); } static void OpC5M0 (void) { - Direct (READ); - CMP16 (); + Direct (READ, CMP16); } static void OpD5M1 (void) { - DirectIndexedX (READ); - CMP8 (); + DirectIndexedX (READ, CMP8); } static void OpD5M0 (void) { - DirectIndexedX (READ); - CMP16 (); + DirectIndexedX (READ, CMP16); } static void OpD2M1 (void) { - DirectIndirect (READ); - CMP8 (); + DirectIndirect (READ, CMP8); } static void OpD2M0 (void) { - DirectIndirect (READ); - CMP16 (); + DirectIndirect (READ, CMP16); } static void OpC1M1 (void) { - DirectIndexedIndirect (READ); - CMP8 (); + DirectIndexedIndirect (READ, CMP8); } static void OpC1M0 (void) { - DirectIndexedIndirect (READ); - CMP16 (); + DirectIndexedIndirect (READ, CMP16); } static void OpD1M1 (void) { - DirectIndirectIndexed (READ); - CMP8 (); + DirectIndirectIndexed (READ, CMP8); } static void OpD1M0 (void) { - DirectIndirectIndexed (READ); - CMP16 (); + DirectIndirectIndexed (READ, CMP16); } static void OpC7M1 (void) { - DirectIndirectLong (READ); - CMP8 (); + DirectIndirectLong (READ, CMP8); } static void OpC7M0 (void) { - DirectIndirectLong (READ); - CMP16 (); + DirectIndirectLong (READ, CMP16); } static void OpD7M1 (void) { - DirectIndirectIndexedLong (READ); - CMP8 (); + DirectIndirectIndexedLong (READ, CMP8); } static void OpD7M0 (void) { - DirectIndirectIndexedLong (READ); - CMP16 (); + DirectIndirectIndexedLong (READ, CMP16); } static void OpCDM1 (void) { - Absolute (READ); - CMP8 (); + Absolute (READ, CMP8); } static void OpCDM0 (void) { - Absolute (READ); - CMP16 (); + Absolute (READ, CMP16); } static void OpDDM1 (void) { - AbsoluteIndexedX (READ); - CMP8 (); + AbsoluteIndexedX (READ, CMP8); } static void OpDDM0 (void) { - AbsoluteIndexedX (READ); - CMP16 (); + AbsoluteIndexedX (READ, CMP16); } static void OpD9M1 (void) { - AbsoluteIndexedY (READ); - CMP8 (); + AbsoluteIndexedY (READ, CMP8); } static void OpD9M0 (void) { - AbsoluteIndexedY (READ); - CMP16 (); + AbsoluteIndexedY (READ, CMP16); } static void OpCFM1 (void) { - AbsoluteLong (READ); - CMP8 (); + AbsoluteLong (READ, CMP8); } static void OpCFM0 (void) { - AbsoluteLong (READ); - CMP16 (); + AbsoluteLong (READ, CMP16); } static void OpDFM1 (void) { - AbsoluteLongIndexedX (READ); - CMP8 (); + AbsoluteLongIndexedX (READ, CMP8); } static void OpDFM0 (void) { - AbsoluteLongIndexedX (READ); - CMP16 (); + AbsoluteLongIndexedX (READ, CMP16); } static void OpC3M1 (void) { - StackRelative (READ); - CMP8 (); + StackRelative (READ, CMP8); } static void OpC3M0 (void) { - StackRelative (READ); - CMP16 (); + StackRelative (READ, CMP16); } static void OpD3M1 (void) { - StackRelativeIndirectIndexed (READ); - CMP8 (); + StackRelativeIndirectIndexed (READ, CMP8); } static void OpD3M0 (void) { - StackRelativeIndirectIndexed (READ); - CMP16 (); + StackRelativeIndirectIndexed (READ, CMP16); } /**********************************************************************************************/ @@ -826,7 +718,7 @@ static void OpD3M0 (void) /* CMX *************************************************************************************** */ static void OpE0X1 (void) { - Int32 = (int) Registers.XL - (int) *CPU.PC++; + int32 Int32 = (int) ICPU.Registers.XL - (int) *CPU.PC++; ICPU._Carry = Int32 >= 0; SetZN8 ((uint8) Int32); #ifndef SA1_OPCODES @@ -836,10 +728,11 @@ static void OpE0X1 (void) static void OpE0X0 (void) { + int32 Int32; #ifdef FAST_LSB_WORD_ACCESS - Int32 = (long) Registers.X.W - (long) *(uint16 *) CPU.PC; + Int32 = (long) ICPU.Registers.X.W - (long) *(uint16 *) CPU.PC; #else - Int32 = (long) Registers.X.W - + Int32 = (long) ICPU.Registers.X.W - (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); #endif ICPU._Carry = Int32 >= 0; @@ -852,26 +745,22 @@ static void OpE0X0 (void) static void OpE4X1 (void) { - Direct (READ); - CMX8 (); + Direct (READ, CMX8); } static void OpE4X0 (void) { - Direct (READ); - CMX16 (); + Direct (READ, CMX16); } static void OpECX1 (void) { - Absolute (READ); - CMX8 (); + Absolute (READ, CMX8); } static void OpECX0 (void) { - Absolute (READ); - CMX16 (); + Absolute (READ, CMX16); } /**********************************************************************************************/ @@ -879,7 +768,7 @@ static void OpECX0 (void) /* CMY *************************************************************************************** */ static void OpC0X1 (void) { - Int32 = (int) Registers.YL - (int) *CPU.PC++; + int32 Int32 = (int) ICPU.Registers.YL - (int) *CPU.PC++; ICPU._Carry = Int32 >= 0; SetZN8 ((uint8) Int32); #ifndef SA1_OPCODES @@ -889,10 +778,11 @@ static void OpC0X1 (void) static void OpC0X0 (void) { + int32 Int32; #ifdef FAST_LSB_WORD_ACCESS - Int32 = (long) Registers.Y.W - (long) *(uint16 *) CPU.PC; + Int32 = (long) ICPU.Registers.Y.W - (long) *(uint16 *) CPU.PC; #else - Int32 = (long) Registers.Y.W - + Int32 = (long) ICPU.Registers.Y.W - (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); #endif ICPU._Carry = Int32 >= 0; @@ -905,26 +795,22 @@ static void OpC0X0 (void) static void OpC4X1 (void) { - Direct (READ); - CMY8 (); + Direct (READ, CMY8); } static void OpC4X0 (void) { - Direct (READ); - CMY16 (); + Direct (READ, CMY16); } static void OpCCX1 (void) { - Absolute (READ); - CMY8 (); + Absolute (READ, CMY8); } static void OpCCX0 (void) { - Absolute (READ); - CMY16 (); + Absolute (READ, CMY16); } /**********************************************************************************************/ @@ -942,50 +828,42 @@ static void Op3AM0 (void) static void OpC6M1 (void) { - Direct (MODIFY); - DEC8 (); + Direct (MODIFY, DEC8); } static void OpC6M0 (void) { - Direct (MODIFY); - DEC16 (); + Direct (MODIFY, DEC16); } static void OpD6M1 (void) { - DirectIndexedX (MODIFY); - DEC8 (); + DirectIndexedX (MODIFY, DEC8); } static void OpD6M0 (void) { - DirectIndexedX (MODIFY); - DEC16 (); + DirectIndexedX (MODIFY, DEC16); } static void OpCEM1 (void) { - Absolute (MODIFY); - DEC8 (); + Absolute (MODIFY, DEC8); } static void OpCEM0 (void) { - Absolute (MODIFY); - DEC16 (); + Absolute (MODIFY, DEC16); } static void OpDEM1 (void) { - AbsoluteIndexedX (MODIFY); - DEC8 (); + AbsoluteIndexedX (MODIFY, DEC8); } static void OpDEM0 (void) { - AbsoluteIndexedX (MODIFY); - DEC16 (); + AbsoluteIndexedX (MODIFY, DEC16); } /**********************************************************************************************/ @@ -993,193 +871,165 @@ static void OpDEM0 (void) /* EOR *************************************************************************************** */ static void Op49M1 (void) { - Registers.AL ^= *CPU.PC++; + ICPU.Registers.AL ^= *CPU.PC++; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - SetZN8 (Registers.AL); + SetZN8 (ICPU.Registers.AL); } static void Op49M0 (void) { #ifdef FAST_LSB_WORD_ACCESS - Registers.A.W ^= *(uint16 *) CPU.PC; + ICPU.Registers.A.W ^= *(uint16 *) CPU.PC; #else - Registers.A.W ^= *CPU.PC + (*(CPU.PC + 1) << 8); + ICPU.Registers.A.W ^= *CPU.PC + (*(CPU.PC + 1) << 8); #endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif - SetZN16 (Registers.A.W); + SetZN16 (ICPU.Registers.A.W); } static void Op45M1 (void) { - Direct (READ); - EOR8 (); + Direct (READ, EOR8); } static void Op45M0 (void) { - Direct (READ); - EOR16 (); + Direct (READ, EOR16); } static void Op55M1 (void) { - DirectIndexedX (READ); - EOR8 (); + DirectIndexedX (READ, EOR8); } static void Op55M0 (void) { - DirectIndexedX (READ); - EOR16 (); + DirectIndexedX (READ, EOR16); } static void Op52M1 (void) { - DirectIndirect (READ); - EOR8 (); + DirectIndirect (READ, EOR8); } static void Op52M0 (void) { - DirectIndirect (READ); - EOR16 (); + DirectIndirect (READ, EOR16); } static void Op41M1 (void) { - DirectIndexedIndirect (READ); - EOR8 (); + DirectIndexedIndirect (READ, EOR8); } static void Op41M0 (void) { - DirectIndexedIndirect (READ); - EOR16 (); + DirectIndexedIndirect (READ, EOR16); } static void Op51M1 (void) { - DirectIndirectIndexed (READ); - EOR8 (); + DirectIndirectIndexed (READ, EOR8); } static void Op51M0 (void) { - DirectIndirectIndexed (READ); - EOR16 (); + DirectIndirectIndexed (READ, EOR16); } static void Op47M1 (void) { - DirectIndirectLong (READ); - EOR8 (); + DirectIndirectLong (READ, EOR8); } static void Op47M0 (void) { - DirectIndirectLong (READ); - EOR16 (); + DirectIndirectLong (READ, EOR16); } static void Op57M1 (void) { - DirectIndirectIndexedLong (READ); - EOR8 (); + DirectIndirectIndexedLong (READ, EOR8); } static void Op57M0 (void) { - DirectIndirectIndexedLong (READ); - EOR16 (); + DirectIndirectIndexedLong (READ, EOR16); } static void Op4DM1 (void) { - Absolute (READ); - EOR8 (); + Absolute (READ, EOR8); } static void Op4DM0 (void) { - Absolute (READ); - EOR16 (); + Absolute (READ, EOR16); } static void Op5DM1 (void) { - AbsoluteIndexedX (READ); - EOR8 (); + AbsoluteIndexedX (READ, EOR8); } static void Op5DM0 (void) { - AbsoluteIndexedX (READ); - EOR16 (); + AbsoluteIndexedX (READ, EOR16); } static void Op59M1 (void) { - AbsoluteIndexedY (READ); - EOR8 (); + AbsoluteIndexedY (READ, EOR8); } static void Op59M0 (void) { - AbsoluteIndexedY (READ); - EOR16 (); + AbsoluteIndexedY (READ, EOR16); } static void Op4FM1 (void) { - AbsoluteLong (READ); - EOR8 (); + AbsoluteLong (READ, EOR8); } static void Op4FM0 (void) { - AbsoluteLong (READ); - EOR16 (); + AbsoluteLong (READ, EOR16); } static void Op5FM1 (void) { - AbsoluteLongIndexedX (READ); - EOR8 (); + AbsoluteLongIndexedX (READ, EOR8); } static void Op5FM0 (void) { - AbsoluteLongIndexedX (READ); - EOR16 (); + AbsoluteLongIndexedX (READ, EOR16); } static void Op43M1 (void) { - StackRelative (READ); - EOR8 (); + StackRelative (READ, EOR8); } static void Op43M0 (void) { - StackRelative (READ); - EOR16 (); + StackRelative (READ, EOR16); } static void Op53M1 (void) { - StackRelativeIndirectIndexed (READ); - EOR8 (); + StackRelativeIndirectIndexed (READ, EOR8); } static void Op53M0 (void) { - StackRelativeIndirectIndexed (READ); - EOR16 (); + StackRelativeIndirectIndexed (READ, EOR16); } /**********************************************************************************************/ @@ -1197,244 +1047,208 @@ static void Op1AM0 (void) static void OpE6M1 (void) { - Direct (MODIFY); - INC8 (); + Direct (MODIFY, INC8); } static void OpE6M0 (void) { - Direct (MODIFY); - INC16 (); + Direct (MODIFY, INC16); } static void OpF6M1 (void) { - DirectIndexedX (MODIFY); - INC8 (); + DirectIndexedX (MODIFY, INC8); } static void OpF6M0 (void) { - DirectIndexedX (MODIFY); - INC16 (); + DirectIndexedX (MODIFY, INC16); } static void OpEEM1 (void) { - Absolute (MODIFY); - INC8 (); + Absolute (MODIFY, INC8); } static void OpEEM0 (void) { - Absolute (MODIFY); - INC16 (); + Absolute (MODIFY, INC16); } static void OpFEM1 (void) { - AbsoluteIndexedX (MODIFY); - INC8 (); + AbsoluteIndexedX (MODIFY, INC8); } static void OpFEM0 (void) { - AbsoluteIndexedX (MODIFY); - INC16 (); + AbsoluteIndexedX (MODIFY, INC16); } /**********************************************************************************************/ /* LDA *************************************************************************************** */ static void OpA9M1 (void) { - Registers.AL = *CPU.PC++; + ICPU.Registers.AL = *CPU.PC++; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - SetZN8 (Registers.AL); + SetZN8 (ICPU.Registers.AL); } static void OpA9M0 (void) { #ifdef FAST_LSB_WORD_ACCESS - Registers.A.W = *(uint16 *) CPU.PC; + ICPU.Registers.A.W = *(uint16 *) CPU.PC; #else - Registers.A.W = *CPU.PC + (*(CPU.PC + 1) << 8); + ICPU.Registers.A.W = *CPU.PC + (*(CPU.PC + 1) << 8); #endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif - SetZN16 (Registers.A.W); + SetZN16 (ICPU.Registers.A.W); } static void OpA5M1 (void) { - Direct (READ); - LDA8 (); + Direct (READ, LDA8); } static void OpA5M0 (void) { - Direct (READ); - LDA16 (); + Direct (READ, LDA16); } static void OpB5M1 (void) { - DirectIndexedX (READ); - LDA8 (); + DirectIndexedX (READ, LDA8); } static void OpB5M0 (void) { - DirectIndexedX (READ); - LDA16 (); + DirectIndexedX (READ, LDA16); } static void OpB2M1 (void) { - DirectIndirect (READ); - LDA8 (); + DirectIndirect (READ, LDA8); } static void OpB2M0 (void) { - DirectIndirect (READ); - LDA16 (); + DirectIndirect (READ, LDA16); } static void OpA1M1 (void) { - DirectIndexedIndirect (READ); - LDA8 (); + DirectIndexedIndirect (READ, LDA8); } static void OpA1M0 (void) { - DirectIndexedIndirect (READ); - LDA16 (); + DirectIndexedIndirect (READ, LDA16); } static void OpB1M1 (void) { - DirectIndirectIndexed (READ); - LDA8 (); + DirectIndirectIndexed (READ, LDA8); } static void OpB1M0 (void) { - DirectIndirectIndexed (READ); - LDA16 (); + DirectIndirectIndexed (READ, LDA16); } static void OpA7M1 (void) { - DirectIndirectLong (READ); - LDA8 (); + DirectIndirectLong (READ, LDA8); } static void OpA7M0 (void) { - DirectIndirectLong (READ); - LDA16 (); + DirectIndirectLong (READ, LDA16); } static void OpB7M1 (void) { - DirectIndirectIndexedLong (READ); - LDA8 (); + DirectIndirectIndexedLong (READ, LDA8); } static void OpB7M0 (void) { - DirectIndirectIndexedLong (READ); - LDA16 (); + DirectIndirectIndexedLong (READ, LDA16); } static void OpADM1 (void) { - Absolute (READ); - LDA8 (); + Absolute (READ, LDA8); } static void OpADM0 (void) { - Absolute (READ); - LDA16 (); + Absolute (READ, LDA16); } static void OpBDM1 (void) { - AbsoluteIndexedX (READ); - LDA8 (); + AbsoluteIndexedX (READ, LDA8); } static void OpBDM0 (void) { - AbsoluteIndexedX (READ); - LDA16 (); + AbsoluteIndexedX (READ, LDA16); } static void OpB9M1 (void) { - AbsoluteIndexedY (READ); - LDA8 (); + AbsoluteIndexedY (READ, LDA8); } static void OpB9M0 (void) { - AbsoluteIndexedY (READ); - LDA16 (); + AbsoluteIndexedY (READ, LDA16); } static void OpAFM1 (void) { - AbsoluteLong (READ); - LDA8 (); + AbsoluteLong (READ, LDA8); } static void OpAFM0 (void) { - AbsoluteLong (READ); - LDA16 (); + AbsoluteLong (READ, LDA16); } static void OpBFM1 (void) { - AbsoluteLongIndexedX (READ); - LDA8 (); + AbsoluteLongIndexedX (READ, LDA8); } static void OpBFM0 (void) { - AbsoluteLongIndexedX (READ); - LDA16 (); + AbsoluteLongIndexedX (READ, LDA16); } static void OpA3M1 (void) { - StackRelative (READ); - LDA8 (); + StackRelative (READ, LDA8); } static void OpA3M0 (void) { - StackRelative (READ); - LDA16 (); + StackRelative (READ, LDA16); } static void OpB3M1 (void) { - StackRelativeIndirectIndexed (READ); - LDA8 (); + StackRelativeIndirectIndexed (READ, LDA8); } static void OpB3M0 (void) { - StackRelativeIndirectIndexed (READ); - LDA16 (); + StackRelativeIndirectIndexed (READ, LDA16); } /**********************************************************************************************/ @@ -1442,147 +1256,131 @@ static void OpB3M0 (void) /* LDX *************************************************************************************** */ static void OpA2X1 (void) { - Registers.XL = *CPU.PC++; + ICPU.Registers.XL = *CPU.PC++; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - SetZN8 (Registers.XL); + SetZN8 (ICPU.Registers.XL); } static void OpA2X0 (void) { #ifdef FAST_LSB_WORD_ACCESS - Registers.X.W = *(uint16 *) CPU.PC; + ICPU.Registers.X.W = *(uint16 *) CPU.PC; #else - Registers.X.W = *CPU.PC + (*(CPU.PC + 1) << 8); + ICPU.Registers.X.W = *CPU.PC + (*(CPU.PC + 1) << 8); #endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif - SetZN16 (Registers.X.W); + SetZN16 (ICPU.Registers.X.W); } static void OpA6X1 (void) { - Direct (READ); - LDX8 (); + Direct (READ, LDX8); } static void OpA6X0 (void) { - Direct (READ); - LDX16 (); + Direct (READ, LDX16); } static void OpB6X1 (void) { - DirectIndexedY (READ); - LDX8 (); + DirectIndexedY (READ, LDX8); } static void OpB6X0 (void) { - DirectIndexedY (READ); - LDX16 (); + DirectIndexedY (READ, LDX16); } static void OpAEX1 (void) { - Absolute (READ); - LDX8 (); + Absolute (READ, LDX8); } static void OpAEX0 (void) { - Absolute (READ); - LDX16 (); + Absolute (READ, LDX16); } static void OpBEX1 (void) { - AbsoluteIndexedY (READ); - LDX8 (); + AbsoluteIndexedY (READ, LDX8); } static void OpBEX0 (void) { - AbsoluteIndexedY (READ); - LDX16 (); + AbsoluteIndexedY (READ, LDX16); } /**********************************************************************************************/ /* LDY *************************************************************************************** */ static void OpA0X1 (void) { - Registers.YL = *CPU.PC++; + ICPU.Registers.YL = *CPU.PC++; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - SetZN8 (Registers.YL); + SetZN8 (ICPU.Registers.YL); } static void OpA0X0 (void) { #ifdef FAST_LSB_WORD_ACCESS - Registers.Y.W = *(uint16 *) CPU.PC; + ICPU.Registers.Y.W = *(uint16 *) CPU.PC; #else - Registers.Y.W = *CPU.PC + (*(CPU.PC + 1) << 8); + ICPU.Registers.Y.W = *CPU.PC + (*(CPU.PC + 1) << 8); #endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif - SetZN16 (Registers.Y.W); + SetZN16 (ICPU.Registers.Y.W); } static void OpA4X1 (void) { - Direct (READ); - LDY8 (); + Direct (READ, LDY8); } static void OpA4X0 (void) { - Direct (READ); - LDY16 (); + Direct (READ, LDY16); } static void OpB4X1 (void) { - DirectIndexedX (READ); - LDY8 (); + DirectIndexedX (READ, LDY8); } static void OpB4X0 (void) { - DirectIndexedX (READ); - LDY16 (); + DirectIndexedX (READ, LDY16); } static void OpACX1 (void) { - Absolute (READ); - LDY8 (); + Absolute (READ, LDY8); } static void OpACX0 (void) { - Absolute (READ); - LDY16 (); + Absolute (READ, LDY16); } static void OpBCX1 (void) { - AbsoluteIndexedX (READ); - LDY8 (); + AbsoluteIndexedX (READ, LDY8); } static void OpBCX0 (void) { - AbsoluteIndexedX (READ); - LDY16 (); + AbsoluteIndexedX (READ, LDY16); } /**********************************************************************************************/ @@ -1599,50 +1397,42 @@ static void Op4AM0 (void) static void Op46M1 (void) { - Direct (MODIFY); - LSR8 (); + Direct (MODIFY, LSR8); } static void Op46M0 (void) { - Direct (MODIFY); - LSR16 (); + Direct (MODIFY, LSR16); } static void Op56M1 (void) { - DirectIndexedX (MODIFY); - LSR8 (); + DirectIndexedX (MODIFY, LSR8); } static void Op56M0 (void) { - DirectIndexedX (MODIFY); - LSR16 (); + DirectIndexedX (MODIFY, LSR16); } static void Op4EM1 (void) { - Absolute (MODIFY); - LSR8 (); + Absolute (MODIFY, LSR8); } static void Op4EM0 (void) { - Absolute (MODIFY); - LSR16 (); + Absolute (MODIFY, LSR16); } static void Op5EM1 (void) { - AbsoluteIndexedX (MODIFY); - LSR8 (); + AbsoluteIndexedX (MODIFY, LSR8); } static void Op5EM0 (void) { - AbsoluteIndexedX (MODIFY); - LSR16 (); + AbsoluteIndexedX (MODIFY, LSR16); } /**********************************************************************************************/ @@ -1650,193 +1440,165 @@ static void Op5EM0 (void) /* ORA *************************************************************************************** */ static void Op09M1 (void) { - Registers.AL |= *CPU.PC++; + ICPU.Registers.AL |= *CPU.PC++; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeed; #endif - SetZN8 (Registers.AL); + SetZN8 (ICPU.Registers.AL); } static void Op09M0 (void) { #ifdef FAST_LSB_WORD_ACCESS - Registers.A.W |= *(uint16 *) CPU.PC; + ICPU.Registers.A.W |= *(uint16 *) CPU.PC; #else - Registers.A.W |= *CPU.PC + (*(CPU.PC + 1) << 8); + ICPU.Registers.A.W |= *CPU.PC + (*(CPU.PC + 1) << 8); #endif CPU.PC += 2; #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2; #endif - SetZN16 (Registers.A.W); + SetZN16 (ICPU.Registers.A.W); } static void Op05M1 (void) { - Direct (READ); - ORA8 (); + Direct (READ, ORA8); } static void Op05M0 (void) { - Direct (READ); - ORA16 (); + Direct (READ, ORA16); } static void Op15M1 (void) { - DirectIndexedX (READ); - ORA8 (); + DirectIndexedX (READ, ORA8); } static void Op15M0 (void) { - DirectIndexedX (READ); - ORA16 (); + DirectIndexedX (READ, ORA16); } static void Op12M1 (void) { - DirectIndirect (READ); - ORA8 (); + DirectIndirect (READ, ORA8); } static void Op12M0 (void) { - DirectIndirect (READ); - ORA16 (); + DirectIndirect (READ, ORA16); } static void Op01M1 (void) { - DirectIndexedIndirect (READ); - ORA8 (); + DirectIndexedIndirect (READ, ORA8); } static void Op01M0 (void) { - DirectIndexedIndirect (READ); - ORA16 (); + DirectIndexedIndirect (READ, ORA16); } static void Op11M1 (void) { - DirectIndirectIndexed (READ); - ORA8 (); + DirectIndirectIndexed (READ, ORA8); } static void Op11M0 (void) { - DirectIndirectIndexed (READ); - ORA16 (); + DirectIndirectIndexed (READ, ORA16); } static void Op07M1 (void) { - DirectIndirectLong (READ); - ORA8 (); + DirectIndirectLong (READ, ORA8); } static void Op07M0 (void) { - DirectIndirectLong (READ); - ORA16 (); + DirectIndirectLong (READ, ORA16); } static void Op17M1 (void) { - DirectIndirectIndexedLong (READ); - ORA8 (); + DirectIndirectIndexedLong (READ, ORA8); } static void Op17M0 (void) { - DirectIndirectIndexedLong (READ); - ORA16 (); + DirectIndirectIndexedLong (READ, ORA16); } static void Op0DM1 (void) { - Absolute (READ); - ORA8 (); + Absolute (READ, ORA8); } static void Op0DM0 (void) { - Absolute (READ); - ORA16 (); + Absolute (READ, ORA16); } static void Op1DM1 (void) { - AbsoluteIndexedX (READ); - ORA8 (); + AbsoluteIndexedX (READ, ORA8); } static void Op1DM0 (void) { - AbsoluteIndexedX (READ); - ORA16 (); + AbsoluteIndexedX (READ, ORA16); } static void Op19M1 (void) { - AbsoluteIndexedY (READ); - ORA8 (); + AbsoluteIndexedY (READ, ORA8); } static void Op19M0 (void) { - AbsoluteIndexedY (READ); - ORA16 (); + AbsoluteIndexedY (READ, ORA16); } static void Op0FM1 (void) { - AbsoluteLong (READ); - ORA8 (); + AbsoluteLong (READ, ORA8); } static void Op0FM0 (void) { - AbsoluteLong (READ); - ORA16 (); + AbsoluteLong (READ, ORA16); } static void Op1FM1 (void) { - AbsoluteLongIndexedX (READ); - ORA8 (); + AbsoluteLongIndexedX (READ, ORA8); } static void Op1FM0 (void) { - AbsoluteLongIndexedX (READ); - ORA16 (); + AbsoluteLongIndexedX (READ, ORA16); } static void Op03M1 (void) { - StackRelative (READ); - ORA8 (); + StackRelative (READ, ORA8); } static void Op03M0 (void) { - StackRelative (READ); - ORA16 (); + StackRelative (READ, ORA16); } static void Op13M1 (void) { - StackRelativeIndirectIndexed (READ); - ORA8 (); + StackRelativeIndirectIndexed (READ, ORA8); } static void Op13M0 (void) { - StackRelativeIndirectIndexed (READ); - ORA16 (); + StackRelativeIndirectIndexed (READ, ORA16); } /**********************************************************************************************/ @@ -1854,50 +1616,42 @@ static void Op2AM0 (void) static void Op26M1 (void) { - Direct (MODIFY); - ROL8 (); + Direct (MODIFY, ROL8); } static void Op26M0 (void) { - Direct (MODIFY); - ROL16 (); + Direct (MODIFY, ROL16); } static void Op36M1 (void) { - DirectIndexedX (MODIFY); - ROL8 (); + DirectIndexedX (MODIFY, ROL8); } static void Op36M0 (void) { - DirectIndexedX (MODIFY); - ROL16 (); + DirectIndexedX (MODIFY, ROL16); } static void Op2EM1 (void) { - Absolute (MODIFY); - ROL8 (); + Absolute (MODIFY, ROL8); } static void Op2EM0 (void) { - Absolute (MODIFY); - ROL16 (); + Absolute (MODIFY, ROL16); } static void Op3EM1 (void) { - AbsoluteIndexedX (MODIFY); - ROL8 (); + AbsoluteIndexedX (MODIFY, ROL8); } static void Op3EM0 (void) { - AbsoluteIndexedX (MODIFY); - ROL16 (); + AbsoluteIndexedX (MODIFY, ROL16); } /**********************************************************************************************/ @@ -1914,276 +1668,231 @@ static void Op6AM0 (void) static void Op66M1 (void) { - Direct (MODIFY); - ROR8 (); + Direct (MODIFY, ROR8); } static void Op66M0 (void) { - Direct (MODIFY); - ROR16 (); + Direct (MODIFY, ROR16); } static void Op76M1 (void) { - DirectIndexedX (MODIFY); - ROR8 (); + DirectIndexedX (MODIFY, ROR8); } static void Op76M0 (void) { - DirectIndexedX (MODIFY); - ROR16 (); + DirectIndexedX (MODIFY, ROR16); } static void Op6EM1 (void) { - Absolute (MODIFY); - ROR8 (); + Absolute (MODIFY, ROR8); } static void Op6EM0 (void) { - Absolute (MODIFY); - ROR16 (); + Absolute (MODIFY, ROR16); } static void Op7EM1 (void) { - AbsoluteIndexedX (MODIFY); - ROR8 (); + AbsoluteIndexedX (MODIFY, ROR8); } static void Op7EM0 (void) { - AbsoluteIndexedX (MODIFY); - ROR16 (); + AbsoluteIndexedX (MODIFY, ROR16); } /**********************************************************************************************/ /* SBC *************************************************************************************** */ static void OpE9M1 (void) { - Immediate8 (READ); - SBC8 (); + Immediate8 (READ, SBC8); } static void OpE9M0 (void) { - Immediate16 (READ); - SBC16 (); + Immediate16 (READ, SBC16); } static void OpE5M1 (void) { - Direct (READ); - SBC8 (); + Direct (READ, SBC8); } static void OpE5M0 (void) { - Direct (READ); - SBC16 (); + Direct (READ, SBC16); } static void OpF5M1 (void) { - DirectIndexedX (READ); - SBC8 (); + DirectIndexedX (READ, SBC8); } static void OpF5M0 (void) { - DirectIndexedX (READ); - SBC16 (); + DirectIndexedX (READ, SBC16); } static void OpF2M1 (void) { - DirectIndirect (READ); - SBC8 (); + DirectIndirect (READ, SBC8); } static void OpF2M0 (void) { - DirectIndirect (READ); - SBC16 (); + DirectIndirect (READ, SBC16); } static void OpE1M1 (void) { - DirectIndexedIndirect (READ); - SBC8 (); + DirectIndexedIndirect (READ, SBC8); } static void OpE1M0 (void) { - DirectIndexedIndirect (READ); - SBC16 (); + DirectIndexedIndirect (READ, SBC16); } static void OpF1M1 (void) { - DirectIndirectIndexed (READ); - SBC8 (); + DirectIndirectIndexed (READ, SBC8); } static void OpF1M0 (void) { - DirectIndirectIndexed (READ); - SBC16 (); + DirectIndirectIndexed (READ, SBC16); } static void OpE7M1 (void) { - DirectIndirectLong (READ); - SBC8 (); + DirectIndirectLong (READ, SBC8); } static void OpE7M0 (void) { - DirectIndirectLong (READ); - SBC16 (); + DirectIndirectLong (READ, SBC16); } static void OpF7M1 (void) { - DirectIndirectIndexedLong (READ); - SBC8 (); + DirectIndirectIndexedLong (READ, SBC8); } static void OpF7M0 (void) { - DirectIndirectIndexedLong (READ); - SBC16 (); + DirectIndirectIndexedLong (READ, SBC16); } static void OpEDM1 (void) { - Absolute (READ); - SBC8 (); + Absolute (READ, SBC8); } static void OpEDM0 (void) { - Absolute (READ); - SBC16 (); + Absolute (READ, SBC16); } static void OpFDM1 (void) { - AbsoluteIndexedX (READ); - SBC8 (); + AbsoluteIndexedX (READ, SBC8); } static void OpFDM0 (void) { - AbsoluteIndexedX (READ); - SBC16 (); + AbsoluteIndexedX (READ, SBC16); } static void OpF9M1 (void) { - AbsoluteIndexedY (READ); - SBC8 (); + AbsoluteIndexedY (READ, SBC8); } static void OpF9M0 (void) { - AbsoluteIndexedY (READ); - SBC16 (); + AbsoluteIndexedY (READ, SBC16); } static void OpEFM1 (void) { - AbsoluteLong (READ); - SBC8 (); + AbsoluteLong (READ, SBC8); } static void OpEFM0 (void) { - AbsoluteLong (READ); - SBC16 (); + AbsoluteLong (READ, SBC16); } static void OpFFM1 (void) { - AbsoluteLongIndexedX (READ); - SBC8 (); + AbsoluteLongIndexedX (READ, SBC8); } static void OpFFM0 (void) { - AbsoluteLongIndexedX (READ); - SBC16 (); + AbsoluteLongIndexedX (READ, SBC16); } static void OpE3M1 (void) { - StackRelative (READ); - SBC8 (); + StackRelative (READ, SBC8); } static void OpE3M0 (void) { - StackRelative (READ); - SBC16 (); + StackRelative (READ, SBC16); } static void OpF3M1 (void) { - StackRelativeIndirectIndexed (READ); - SBC8 (); + StackRelativeIndirectIndexed (READ, SBC8); } static void OpF3M0 (void) { - StackRelativeIndirectIndexed (READ); - SBC16 (); + StackRelativeIndirectIndexed (READ, SBC16); } /**********************************************************************************************/ /* STA *************************************************************************************** */ static void Op85M1 (void) { - Direct (WRITE); - STA8 (); + Direct (WRITE, STA8); } static void Op85M0 (void) { - Direct (WRITE); - STA16 (); + Direct (WRITE, STA16); } static void Op95M1 (void) { - DirectIndexedX (WRITE); - STA8 (); + DirectIndexedX (WRITE, STA8); } static void Op95M0 (void) { - DirectIndexedX (WRITE); - STA16 (); + DirectIndexedX (WRITE, STA16); } static void Op92M1 (void) { - DirectIndirect (WRITE); - STA8 (); + DirectIndirect (WRITE, STA8); } static void Op92M0 (void) { - DirectIndirect (WRITE); - STA16 (); + DirectIndirect (WRITE, STA16); } static void Op81M1 (void) { - DirectIndexedIndirect (WRITE); - STA8 (); + DirectIndexedIndirect (WRITE, STA8); #ifdef noVAR_CYCLES if (CheckIndex ()) CPU.Cycles += ONE_CYCLE; @@ -2192,8 +1901,7 @@ static void Op81M1 (void) static void Op81M0 (void) { - DirectIndexedIndirect (WRITE); - STA16 (); + DirectIndexedIndirect (WRITE, STA16); #ifdef noVAR_CYCLES if (CheckIndex ()) CPU.Cycles += ONE_CYCLE; @@ -2202,248 +1910,208 @@ static void Op81M0 (void) static void Op91M1 (void) { - DirectIndirectIndexed (WRITE); - STA8 (); + DirectIndirectIndexed (WRITE, STA8); } static void Op91M0 (void) { - DirectIndirectIndexed (WRITE); - STA16 (); + DirectIndirectIndexed (WRITE, STA16); } static void Op87M1 (void) { - DirectIndirectLong (WRITE); - STA8 (); + DirectIndirectLong (WRITE, STA8); } static void Op87M0 (void) { - DirectIndirectLong (WRITE); - STA16 (); + DirectIndirectLong (WRITE, STA16); } static void Op97M1 (void) { - DirectIndirectIndexedLong (WRITE); - STA8 (); + DirectIndirectIndexedLong (WRITE, STA8); } static void Op97M0 (void) { - DirectIndirectIndexedLong (WRITE); - STA16 (); + DirectIndirectIndexedLong (WRITE, STA16); } static void Op8DM1 (void) { - Absolute (WRITE); - STA8 (); + Absolute (WRITE, STA8); } static void Op8DM0 (void) { - Absolute (WRITE); - STA16 (); + Absolute (WRITE, STA16); } static void Op9DM1 (void) { - AbsoluteIndexedX (WRITE); - STA8 (); + AbsoluteIndexedX (WRITE, STA8); } static void Op9DM0 (void) { - AbsoluteIndexedX (WRITE); - STA16 (); + AbsoluteIndexedX (WRITE, STA16); } static void Op99M1 (void) { - AbsoluteIndexedY (WRITE); - STA8 (); + AbsoluteIndexedY (WRITE, STA8); } static void Op99M0 (void) { - AbsoluteIndexedY (WRITE); - STA16 (); + AbsoluteIndexedY (WRITE, STA16); } static void Op8FM1 (void) { - AbsoluteLong (WRITE); - STA8 (); + AbsoluteLong (WRITE, STA8); } static void Op8FM0 (void) { - AbsoluteLong (WRITE); - STA16 (); + AbsoluteLong (WRITE, STA16); } static void Op9FM1 (void) { - AbsoluteLongIndexedX (WRITE); - STA8 (); + AbsoluteLongIndexedX (WRITE, STA8); } static void Op9FM0 (void) { - AbsoluteLongIndexedX (WRITE); - STA16 (); + AbsoluteLongIndexedX (WRITE, STA16); } static void Op83M1 (void) { - StackRelative (WRITE); - STA8 (); + StackRelative (WRITE, STA8); } static void Op83M0 (void) { - StackRelative (WRITE); - STA16 (); + StackRelative (WRITE, STA16); } static void Op93M1 (void) { - StackRelativeIndirectIndexed (WRITE); - STA8 (); + StackRelativeIndirectIndexed (WRITE, STA8); } static void Op93M0 (void) { - StackRelativeIndirectIndexed (WRITE); - STA16 (); + StackRelativeIndirectIndexed (WRITE, STA16); } /**********************************************************************************************/ /* STX *************************************************************************************** */ static void Op86X1 (void) { - Direct (WRITE); - STX8 (); + Direct (WRITE, STX8); } static void Op86X0 (void) { - Direct (WRITE); - STX16 (); + Direct (WRITE, STX16); } static void Op96X1 (void) { - DirectIndexedY (WRITE); - STX8 (); + DirectIndexedY (WRITE, STX8); } static void Op96X0 (void) { - DirectIndexedY (WRITE); - STX16 (); + DirectIndexedY (WRITE, STX16); } static void Op8EX1 (void) { - Absolute (WRITE); - STX8 (); + Absolute (WRITE, STX8); } static void Op8EX0 (void) { - Absolute (WRITE); - STX16 (); + Absolute (WRITE, STX16); } /**********************************************************************************************/ /* STY *************************************************************************************** */ static void Op84X1 (void) { - Direct (WRITE); - STY8 (); + Direct (WRITE, STY8); } static void Op84X0 (void) { - Direct (WRITE); - STY16 (); + Direct (WRITE, STY16); } static void Op94X1 (void) { - DirectIndexedX (WRITE); - STY8 (); + DirectIndexedX (WRITE, STY8); } static void Op94X0 (void) { - DirectIndexedX (WRITE); - STY16 (); + DirectIndexedX (WRITE, STY16); } static void Op8CX1 (void) { - Absolute (WRITE); - STY8 (); + Absolute (WRITE, STY8); } static void Op8CX0 (void) { - Absolute (WRITE); - STY16 (); + Absolute (WRITE, STY16); } /**********************************************************************************************/ /* STZ *************************************************************************************** */ static void Op64M1 (void) { - Direct (WRITE); - STZ8 (); + Direct (WRITE, STZ8); } static void Op64M0 (void) { - Direct (WRITE); - STZ16 (); + Direct (WRITE, STZ16); } static void Op74M1 (void) { - DirectIndexedX (WRITE); - STZ8 (); + DirectIndexedX (WRITE, STZ8); } static void Op74M0 (void) { - DirectIndexedX (WRITE); - STZ16 (); + DirectIndexedX (WRITE, STZ16); } static void Op9CM1 (void) { - Absolute (WRITE); - STZ8 (); + Absolute (WRITE, STZ8); } static void Op9CM0 (void) { - Absolute (WRITE); - STZ16 (); + Absolute (WRITE, STZ16); } static void Op9EM1 (void) { - AbsoluteIndexedX (WRITE); - STZ8 (); + AbsoluteIndexedX (WRITE, STZ8); } static void Op9EM0 (void) { - AbsoluteIndexedX (WRITE); - STZ16 (); + AbsoluteIndexedX (WRITE, STZ16); } /**********************************************************************************************/ @@ -2451,52 +2119,44 @@ static void Op9EM0 (void) /* TRB *************************************************************************************** */ static void Op14M1 (void) { - Direct (MODIFY); - TRB8 (); + Direct (MODIFY, TRB8); } static void Op14M0 (void) { - Direct (MODIFY); - TRB16 (); + Direct (MODIFY, TRB16); } static void Op1CM1 (void) { - Absolute (MODIFY); - TRB8 (); + Absolute (MODIFY, TRB8); } static void Op1CM0 (void) { - Absolute (MODIFY); - TRB16 (); + Absolute (MODIFY, TRB16); } /**********************************************************************************************/ /* TSB *************************************************************************************** */ static void Op04M1 (void) { - Direct (MODIFY); - TSB8 (); + Direct (MODIFY, TSB8); } static void Op04M0 (void) { - Direct (MODIFY); - TSB16 (); + Direct (MODIFY, TSB16); } static void Op0CM1 (void) { - Absolute (MODIFY); - TSB8 (); + Absolute (MODIFY, TSB8); } static void Op0CM0 (void) { - Absolute (MODIFY); - TSB16 (); + Absolute (MODIFY, TSB16); } /**********************************************************************************************/ @@ -2608,7 +2268,7 @@ inline void CPUShutdown() /* BCC */ static void Op90 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); BranchCheck0 (); if (!CheckCarry ()) { @@ -2616,14 +2276,14 @@ static void Op90 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - CPUShutdown (); + CPUShutdown(); } } /* BCS */ static void OpB0 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); BranchCheck0 (); if (CheckCarry ()) { @@ -2638,7 +2298,7 @@ static void OpB0 (void) /* BEQ */ static void OpF0 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); BranchCheck2 (); if (CheckZero ()) { @@ -2653,7 +2313,7 @@ static void OpF0 (void) /* BMI */ static void Op30 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); BranchCheck1 (); if (CheckNegative ()) { @@ -2668,7 +2328,7 @@ static void Op30 (void) /* BNE */ static void OpD0 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); BranchCheck1 (); if (!CheckZero ()) { @@ -2684,7 +2344,7 @@ static void OpD0 (void) /* BPL */ static void Op10 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); BranchCheck1 (); if (!CheckNegative ()) { @@ -2699,7 +2359,7 @@ static void Op10 (void) /* BRA */ static void Op80 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); CPU.PC = CPU.PCBase + OpAddress; #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -2710,7 +2370,7 @@ static void Op80 (void) /* BVC */ static void Op50 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); BranchCheck0 (); if (!CheckOverflow ()) { @@ -2725,7 +2385,7 @@ static void Op50 (void) /* BVS */ static void Op70 (void) { - Relative (JUMP); + Relative (JUMP, OpAddressPassthrough); BranchCheck0 (); if (CheckOverflow ()) { @@ -2787,8 +2447,8 @@ static void OpCAX1 (void) CPU.WaitAddress = NULL; #endif - Registers.XL--; - SetZN8 (Registers.XL); + ICPU.Registers.XL--; + SetZN8 (ICPU.Registers.XL); } static void OpCAX0 (void) @@ -2800,8 +2460,8 @@ static void OpCAX0 (void) CPU.WaitAddress = NULL; #endif - Registers.X.W--; - SetZN16 (Registers.X.W); + ICPU.Registers.X.W--; + SetZN16 (ICPU.Registers.X.W); } static void Op88X1 (void) @@ -2813,8 +2473,8 @@ static void Op88X1 (void) CPU.WaitAddress = NULL; #endif - Registers.YL--; - SetZN8 (Registers.YL); + ICPU.Registers.YL--; + SetZN8 (ICPU.Registers.YL); } static void Op88X0 (void) @@ -2826,8 +2486,8 @@ static void Op88X0 (void) CPU.WaitAddress = NULL; #endif - Registers.Y.W--; - SetZN16 (Registers.Y.W); + ICPU.Registers.Y.W--; + SetZN16 (ICPU.Registers.Y.W); } /**********************************************************************************************/ @@ -2841,8 +2501,8 @@ static void OpE8X1 (void) CPU.WaitAddress = NULL; #endif - Registers.XL++; - SetZN8 (Registers.XL); + ICPU.Registers.XL++; + SetZN8 (ICPU.Registers.XL); } static void OpE8X0 (void) @@ -2854,8 +2514,8 @@ static void OpE8X0 (void) CPU.WaitAddress = NULL; #endif - Registers.X.W++; - SetZN16 (Registers.X.W); + ICPU.Registers.X.W++; + SetZN16 (ICPU.Registers.X.W); } static void OpC8X1 (void) @@ -2867,8 +2527,8 @@ static void OpC8X1 (void) CPU.WaitAddress = NULL; #endif - Registers.YL++; - SetZN8 (Registers.YL); + ICPU.Registers.YL++; + SetZN8 (ICPU.Registers.YL); } static void OpC8X0 (void) @@ -2880,8 +2540,8 @@ static void OpC8X0 (void) CPU.WaitAddress = NULL; #endif - Registers.Y.W++; - SetZN16 (Registers.Y.W); + ICPU.Registers.Y.W++; + SetZN16 (ICPU.Registers.Y.W); } /**********************************************************************************************/ @@ -2898,69 +2558,69 @@ static void OpEA (void) /* PUSH Instructions ************************************************************************* */ /* #define PushW(w) \ - * S9xSetWord (w, Registers.S.W - 1);\ - * Registers.S.W -= 2; + * S9xSetWord (w, ICPU.Registers.S.W - 1);\ + * ICPU.Registers.S.W -= 2; */ #define PushB(b)\ - S9xSetByte (b, Registers.S.W--); + S9xSetByte (b, ICPU.Registers.S.W--); #define PushBE(b)\ - S9xSetByte (b, Registers.S.W--);\ - Registers.SH=0x01; + S9xSetByte (b, ICPU.Registers.S.W--);\ + ICPU.Registers.SH=0x01; #define PushW(w) \ - S9xSetByte ((w)>>8, Registers.S.W);\ - S9xSetByte ((w)&0xff, (Registers.S.W - 1)&0xFFFF);\ - Registers.S.W -= 2; + S9xSetByte ((w)>>8, ICPU.Registers.S.W);\ + S9xSetByte ((w)&0xff, (ICPU.Registers.S.W - 1)&0xFFFF);\ + ICPU.Registers.S.W -= 2; #define PushWE(w) \ - S9xSetByte ((w)>>8, Registers.S.W--);\ - Registers.SH=0x01;\ - S9xSetByte ((w)&0xff, (Registers.S.W--)&0xFFFF);\ - Registers.SH = 0x01; + S9xSetByte ((w)>>8, ICPU.Registers.S.W--);\ + ICPU.Registers.SH=0x01;\ + S9xSetByte ((w)&0xff, (ICPU.Registers.S.W--)&0xFFFF);\ + ICPU.Registers.SH = 0x01; #define PushWENew(w) \ - S9xSetByte ((w)>>8, Registers.S.W--);\ - S9xSetByte ((w)&0xff, (Registers.S.W--)&0xFFFF);\ - Registers.SH = 0x01; + S9xSetByte ((w)>>8, ICPU.Registers.S.W--);\ + S9xSetByte ((w)&0xff, (ICPU.Registers.S.W--)&0xFFFF);\ + ICPU.Registers.SH = 0x01; //PEA NL static void OpF4E1 (void) { - Absolute (NONE); + Absolute (NONE, OpAddressPassthrough); PushWENew ((unsigned short)OpAddress); } static void OpF4 (void) { - Absolute (NONE); + Absolute (NONE, OpAddressPassthrough); PushW ((unsigned short)OpAddress); } //PEI NL static void OpD4E1 (void) { - DirectIndirect (NONE); + DirectIndirect (NONE, OpAddressPassthrough); PushWENew ((unsigned short)OpAddress); } static void OpD4 (void) { - DirectIndirect (NONE); + DirectIndirect (NONE, OpAddressPassthrough); PushW ((unsigned short)OpAddress); } //PER NL static void Op62E1 (void) { - RelativeLong (NONE); + RelativeLong (NONE, OpAddressPassthrough); PushWENew ((unsigned short)OpAddress); } static void Op62 (void) { - RelativeLong (NONE); + RelativeLong (NONE, OpAddressPassthrough); PushW ((unsigned short)OpAddress); } @@ -2968,7 +2628,7 @@ static void Op62 (void) //PHA static void Op48E1 (void) { - PushBE (Registers.AL); + PushBE (ICPU.Registers.AL); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -2976,7 +2636,7 @@ static void Op48E1 (void) static void Op48M1 (void) { - PushB (Registers.AL); + PushB (ICPU.Registers.AL); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -2984,7 +2644,7 @@ static void Op48M1 (void) static void Op48M0 (void) { - PushW (Registers.A.W); + PushW (ICPU.Registers.A.W); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -2993,14 +2653,14 @@ static void Op48M0 (void) //PHB static void Op8BE1 (void) { - PushBE (Registers.DB); + PushBE (ICPU.Registers.DB); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif } static void Op8B (void) { - PushB (Registers.DB); + PushB (ICPU.Registers.DB); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3009,7 +2669,7 @@ static void Op8B (void) //PHD NL static void Op0BE1 (void) { - PushWENew (Registers.D.W); + PushWENew (ICPU.Registers.D.W); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3017,7 +2677,7 @@ static void Op0BE1 (void) static void Op0B (void) { - PushW (Registers.D.W); + PushW (ICPU.Registers.D.W); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3026,7 +2686,7 @@ static void Op0B (void) //PHK static void Op4BE1 (void) { - PushBE (Registers.PB); + PushBE (ICPU.Registers.PB); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3034,7 +2694,7 @@ static void Op4BE1 (void) static void Op4B (void) { - PushB (Registers.PB); + PushB (ICPU.Registers.PB); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3044,7 +2704,7 @@ static void Op4B (void) static void Op08E1 (void) { S9xPackStatus (); - PushBE (Registers.PL); + PushBE (ICPU.Registers.PL); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3053,7 +2713,7 @@ static void Op08E1 (void) static void Op08 (void) { S9xPackStatus (); - PushB (Registers.PL); + PushB (ICPU.Registers.PL); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3062,7 +2722,7 @@ static void Op08 (void) //PHX static void OpDAE1 (void) { - PushBE (Registers.XL); + PushBE (ICPU.Registers.XL); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3070,7 +2730,7 @@ static void OpDAE1 (void) static void OpDAX1 (void) { - PushB (Registers.XL); + PushB (ICPU.Registers.XL); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3078,7 +2738,7 @@ static void OpDAX1 (void) static void OpDAX0 (void) { - PushW (Registers.X.W); + PushW (ICPU.Registers.X.W); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3087,7 +2747,7 @@ static void OpDAX0 (void) //PHY static void Op5AE1 (void) { - PushBE (Registers.YL); + PushBE (ICPU.Registers.YL); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3095,7 +2755,7 @@ static void Op5AE1 (void) static void Op5AX1 (void) { - PushB (Registers.YL); + PushB (ICPU.Registers.YL); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3103,7 +2763,7 @@ static void Op5AX1 (void) static void Op5AX0 (void) { - PushW (Registers.Y.W); + PushW (ICPU.Registers.Y.W); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif @@ -3112,32 +2772,32 @@ static void Op5AX0 (void) /* PULL Instructions ************************************************************************* */ #define PullW(w) \ - w = S9xGetByte (++Registers.S.W); \ - w |= (S9xGetByte (++Registers.S.W)<<8); + w = S9xGetByte (++ICPU.Registers.S.W); \ + w |= (S9xGetByte (++ICPU.Registers.S.W)<<8); -/* w = S9xGetWord (Registers.S.W + 1); \ - Registers.S.W += 2; +/* w = S9xGetWord (ICPU.Registers.S.W + 1); \ + ICPU.Registers.S.W += 2; */ #define PullB(b)\ - b = S9xGetByte (++Registers.S.W); + b = S9xGetByte (++ICPU.Registers.S.W); #define PullBE(b)\ - Registers.S.W++;\ - Registers.SH=0x01;\ - b = S9xGetByte (Registers.S.W); + ICPU.Registers.S.W++;\ + ICPU.Registers.SH=0x01;\ + b = S9xGetByte (ICPU.Registers.S.W); #define PullWE(w) \ - Registers.S.W++;\ - Registers.SH=0x01;\ - w = S9xGetByte (Registers.S.W); \ - Registers.S.W++; \ - Registers.SH=0x01;\ - w |= (S9xGetByte (Registers.S.W)<<8); + ICPU.Registers.S.W++;\ + ICPU.Registers.SH=0x01;\ + w = S9xGetByte (ICPU.Registers.S.W); \ + ICPU.Registers.S.W++; \ + ICPU.Registers.SH=0x01;\ + w |= (S9xGetByte (ICPU.Registers.S.W)<<8); #define PullWENew(w) \ PullW(w);\ - Registers.SH=0x01; + ICPU.Registers.SH=0x01; //PLA static void Op68E1 (void) @@ -3145,8 +2805,8 @@ static void Op68E1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullBE (Registers.AL); - SetZN8 (Registers.AL); + PullBE (ICPU.Registers.AL); + SetZN8 (ICPU.Registers.AL); } static void Op68M1 (void) @@ -3154,8 +2814,8 @@ static void Op68M1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullB (Registers.AL); - SetZN8 (Registers.AL); + PullB (ICPU.Registers.AL); + SetZN8 (ICPU.Registers.AL); } static void Op68M0 (void) @@ -3163,8 +2823,8 @@ static void Op68M0 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullW (Registers.A.W); - SetZN16 (Registers.A.W); + PullW (ICPU.Registers.A.W); + SetZN16 (ICPU.Registers.A.W); } //PLB @@ -3173,9 +2833,9 @@ static void OpABE1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullBE (Registers.DB); - SetZN8 (Registers.DB); - ICPU.ShiftedDB = Registers.DB << 16; + PullBE (ICPU.Registers.DB); + SetZN8 (ICPU.Registers.DB); + ICPU.ShiftedDB = ICPU.Registers.DB << 16; } static void OpAB (void) @@ -3183,9 +2843,9 @@ static void OpAB (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullB (Registers.DB); - SetZN8 (Registers.DB); - ICPU.ShiftedDB = Registers.DB << 16; + PullB (ICPU.Registers.DB); + SetZN8 (ICPU.Registers.DB); + ICPU.ShiftedDB = ICPU.Registers.DB << 16; } /* PHP */ @@ -3195,8 +2855,8 @@ static void Op2BE1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullWENew (Registers.D.W); - SetZN16 (Registers.D.W); + PullWENew (ICPU.Registers.D.W); + SetZN16 (ICPU.Registers.D.W); } static void Op2B (void) @@ -3204,8 +2864,8 @@ static void Op2B (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullW (Registers.D.W); - SetZN16 (Registers.D.W); + PullW (ICPU.Registers.D.W); + SetZN16 (ICPU.Registers.D.W); } /* PLP */ @@ -3214,13 +2874,13 @@ static void Op28E1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullBE (Registers.PL); + PullBE (ICPU.Registers.PL); S9xUnpackStatus (); if (CheckIndex ()) { - Registers.XH = 0; - Registers.YH = 0; + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; } S9xFixCycles(); /* CHECK_FOR_IRQ();*/ @@ -3231,13 +2891,13 @@ static void Op28 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullB (Registers.PL); + PullB (ICPU.Registers.PL); S9xUnpackStatus (); if (CheckIndex ()) { - Registers.XH = 0; - Registers.YH = 0; + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; } S9xFixCycles(); /* CHECK_FOR_IRQ();*/ @@ -3249,8 +2909,8 @@ static void OpFAE1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullBE (Registers.XL); - SetZN8 (Registers.XL); + PullBE (ICPU.Registers.XL); + SetZN8 (ICPU.Registers.XL); } static void OpFAX1 (void) @@ -3258,8 +2918,8 @@ static void OpFAX1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullB (Registers.XL); - SetZN8 (Registers.XL); + PullB (ICPU.Registers.XL); + SetZN8 (ICPU.Registers.XL); } static void OpFAX0 (void) @@ -3267,8 +2927,8 @@ static void OpFAX0 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullW (Registers.X.W); - SetZN16 (Registers.X.W); + PullW (ICPU.Registers.X.W); + SetZN16 (ICPU.Registers.X.W); } //PLY @@ -3277,8 +2937,8 @@ static void Op7AE1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullBE (Registers.YL); - SetZN8 (Registers.YL); + PullBE (ICPU.Registers.YL); + SetZN8 (ICPU.Registers.YL); } static void Op7AX1 (void) @@ -3286,8 +2946,8 @@ static void Op7AX1 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullB (Registers.YL); - SetZN8 (Registers.YL); + PullB (ICPU.Registers.YL); + SetZN8 (ICPU.Registers.YL); } static void Op7AX0 (void) @@ -3295,8 +2955,8 @@ static void Op7AX0 (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif - PullW (Registers.Y.W); - SetZN16 (Registers.Y.W); + PullW (ICPU.Registers.Y.W); + SetZN16 (ICPU.Registers.Y.W); } /**********************************************************************************************/ @@ -3338,8 +2998,8 @@ static void OpAAX1 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.XL = Registers.AL; - SetZN8 (Registers.XL); + ICPU.Registers.XL = ICPU.Registers.AL; + SetZN8 (ICPU.Registers.XL); } /* TAX16 */ @@ -3348,8 +3008,8 @@ static void OpAAX0 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.X.W = Registers.A.W; - SetZN16 (Registers.X.W); + ICPU.Registers.X.W = ICPU.Registers.A.W; + SetZN16 (ICPU.Registers.X.W); } /* TAY8 */ @@ -3358,8 +3018,8 @@ static void OpA8X1 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.YL = Registers.AL; - SetZN8 (Registers.YL); + ICPU.Registers.YL = ICPU.Registers.AL; + SetZN8 (ICPU.Registers.YL); } /* TAY16 */ @@ -3368,8 +3028,8 @@ static void OpA8X0 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.Y.W = Registers.A.W; - SetZN16 (Registers.Y.W); + ICPU.Registers.Y.W = ICPU.Registers.A.W; + SetZN16 (ICPU.Registers.Y.W); } static void Op5B (void) @@ -3377,8 +3037,8 @@ static void Op5B (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.D.W = Registers.A.W; - SetZN16 (Registers.D.W); + ICPU.Registers.D.W = ICPU.Registers.A.W; + SetZN16 (ICPU.Registers.D.W); } static void Op1B (void) @@ -3386,9 +3046,9 @@ static void Op1B (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.S.W = Registers.A.W; + ICPU.Registers.S.W = ICPU.Registers.A.W; if (CheckEmulation()) - Registers.SH = 1; + ICPU.Registers.SH = 1; } static void Op7B (void) @@ -3396,8 +3056,8 @@ static void Op7B (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.A.W = Registers.D.W; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = ICPU.Registers.D.W; + SetZN16 (ICPU.Registers.A.W); } static void Op3B (void) @@ -3405,8 +3065,8 @@ static void Op3B (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.A.W = Registers.S.W; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = ICPU.Registers.S.W; + SetZN16 (ICPU.Registers.A.W); } static void OpBAX1 (void) @@ -3414,8 +3074,8 @@ static void OpBAX1 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.XL = Registers.SL; - SetZN8 (Registers.XL); + ICPU.Registers.XL = ICPU.Registers.SL; + SetZN8 (ICPU.Registers.XL); } static void OpBAX0 (void) @@ -3423,8 +3083,8 @@ static void OpBAX0 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.X.W = Registers.S.W; - SetZN16 (Registers.X.W); + ICPU.Registers.X.W = ICPU.Registers.S.W; + SetZN16 (ICPU.Registers.X.W); } static void Op8AM1 (void) @@ -3432,8 +3092,8 @@ static void Op8AM1 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.AL = Registers.XL; - SetZN8 (Registers.AL); + ICPU.Registers.AL = ICPU.Registers.XL; + SetZN8 (ICPU.Registers.AL); } static void Op8AM0 (void) @@ -3441,8 +3101,8 @@ static void Op8AM0 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.A.W = Registers.X.W; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = ICPU.Registers.X.W; + SetZN16 (ICPU.Registers.A.W); } static void Op9A (void) @@ -3450,9 +3110,9 @@ static void Op9A (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.S.W = Registers.X.W; + ICPU.Registers.S.W = ICPU.Registers.X.W; if (CheckEmulation()) - Registers.SH = 1; + ICPU.Registers.SH = 1; } static void Op9BX1 (void) @@ -3460,8 +3120,8 @@ static void Op9BX1 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.YL = Registers.XL; - SetZN8 (Registers.YL); + ICPU.Registers.YL = ICPU.Registers.XL; + SetZN8 (ICPU.Registers.YL); } static void Op9BX0 (void) @@ -3469,8 +3129,8 @@ static void Op9BX0 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.Y.W = Registers.X.W; - SetZN16 (Registers.Y.W); + ICPU.Registers.Y.W = ICPU.Registers.X.W; + SetZN16 (ICPU.Registers.Y.W); } static void Op98M1 (void) @@ -3478,8 +3138,8 @@ static void Op98M1 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.AL = Registers.YL; - SetZN8 (Registers.AL); + ICPU.Registers.AL = ICPU.Registers.YL; + SetZN8 (ICPU.Registers.AL); } static void Op98M0 (void) @@ -3487,8 +3147,8 @@ static void Op98M0 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.A.W = Registers.Y.W; - SetZN16 (Registers.A.W); + ICPU.Registers.A.W = ICPU.Registers.Y.W; + SetZN16 (ICPU.Registers.A.W); } static void OpBBX1 (void) @@ -3496,8 +3156,8 @@ static void OpBBX1 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.XL = Registers.YL; - SetZN8 (Registers.XL); + ICPU.Registers.XL = ICPU.Registers.YL; + SetZN8 (ICPU.Registers.XL); } static void OpBBX0 (void) @@ -3505,8 +3165,8 @@ static void OpBBX0 (void) #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; #endif - Registers.X.W = Registers.Y.W; - SetZN16 (Registers.X.W); + ICPU.Registers.X.W = ICPU.Registers.Y.W; + SetZN16 (ICPU.Registers.X.W); } /**********************************************************************************************/ @@ -3518,21 +3178,21 @@ static void OpFB (void) CPU.Cycles += ONE_CYCLE; #endif - A1 = ICPU._Carry; - A2 = Registers.PH; + uint8 A1 = ICPU._Carry; + uint8 A2 = ICPU.Registers.PH; ICPU._Carry = A2 & 1; - Registers.PH = A1; + ICPU.Registers.PH = A1; if (CheckEmulation()) { SetFlags (MemoryFlag | IndexFlag); - Registers.SH = 1; + ICPU.Registers.SH = 1; missing.emulate6502 = 1; } if (CheckIndex ()) { - Registers.XH = 0; - Registers.YH = 0; + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; } S9xFixCycles(); } @@ -3552,15 +3212,17 @@ static void Op00 (void) if (!CheckEmulation()) { - PushB (Registers.PB); + PushB (ICPU.Registers.PB); PushW (CPU.PC - CPU.PCBase + 1); S9xPackStatus (); - PushB (Registers.PL); - OpenBus = Registers.PL; + PushB (ICPU.Registers.PL); +#ifndef NO_OPEN_BUS + OpenBus = ICPU.Registers.PL; +#endif ClearDecimal (); SetIRQ (); - Registers.PB = 0; + ICPU.Registers.PB = 0; ICPU.ShiftedPB = 0; S9xSetPCBase (S9xGetWord (0xFFE6)); #ifndef SA1_OPCODES @@ -3571,12 +3233,14 @@ static void Op00 (void) { PushW (CPU.PC - CPU.PCBase); S9xPackStatus (); - PushB (Registers.PL); - OpenBus = Registers.PL; + PushB (ICPU.Registers.PL); +#ifndef NO_OPEN_BUS + OpenBus = ICPU.Registers.PL; +#endif ClearDecimal (); SetIRQ (); - Registers.PB = 0; + ICPU.Registers.PB = 0; ICPU.ShiftedPB = 0; S9xSetPCBase (S9xGetWord (0xFFFE)); #ifndef SA1_OPCODES @@ -3589,7 +3253,7 @@ static void Op00 (void) /* BRL ************************************************************************************** */ static void Op82 (void) { - RelativeLong (JUMP); + RelativeLong (JUMP, OpAddressPassthrough); S9xSetPCBase (ICPU.ShiftedPB + OpAddress); } /**********************************************************************************************/ @@ -3603,15 +3267,17 @@ void S9xOpcode_IRQ (void) #endif if (!CheckEmulation()) { - PushB (Registers.PB); + PushB (ICPU.Registers.PB); PushW (CPU.PC - CPU.PCBase); S9xPackStatus (); - PushB (Registers.PL); - OpenBus = Registers.PL; + PushB (ICPU.Registers.PL); +#ifndef NO_OPEN_BUS + OpenBus = ICPU.Registers.PL; +#endif ClearDecimal (); SetIRQ (); - Registers.PB = 0; + ICPU.Registers.PB = 0; ICPU.ShiftedPB = 0; #ifdef SA1_OPCODES S9xSA1SetPCBase (Memory.FillRAM [0x2207] | @@ -3631,12 +3297,14 @@ void S9xOpcode_IRQ (void) { PushW (CPU.PC - CPU.PCBase); S9xPackStatus (); - PushB (Registers.PL); - OpenBus = Registers.PL; + PushB (ICPU.Registers.PL); +#ifndef NO_OPEN_BUS + OpenBus = ICPU.Registers.PL; +#endif ClearDecimal (); SetIRQ (); - Registers.PB = 0; + ICPU.Registers.PB = 0; ICPU.ShiftedPB = 0; #ifdef SA1_OPCODES S9xSA1SetPCBase (Memory.FillRAM [0x2207] | @@ -3665,15 +3333,17 @@ void S9xOpcode_NMI (void) #endif if (!CheckEmulation()) { - PushB (Registers.PB); + PushB (ICPU.Registers.PB); PushW (CPU.PC - CPU.PCBase); S9xPackStatus (); - PushB (Registers.PL); - OpenBus = Registers.PL; + PushB (ICPU.Registers.PL); +#ifndef NO_OPEN_BUS + OpenBus = ICPU.Registers.PL; +#endif ClearDecimal (); SetIRQ (); - Registers.PB = 0; + ICPU.Registers.PB = 0; ICPU.ShiftedPB = 0; #ifdef SA1_OPCODES S9xSA1SetPCBase (Memory.FillRAM [0x2205] | @@ -3693,12 +3363,14 @@ void S9xOpcode_NMI (void) { PushW (CPU.PC - CPU.PCBase); S9xPackStatus (); - PushB (Registers.PL); - OpenBus = Registers.PL; + PushB (ICPU.Registers.PL); +#ifndef NO_OPEN_BUS + OpenBus = ICPU.Registers.PL; +#endif ClearDecimal (); SetIRQ (); - Registers.PB = 0; + ICPU.Registers.PB = 0; ICPU.ShiftedPB = 0; #ifdef SA1_OPCODES S9xSA1SetPCBase (Memory.FillRAM [0x2205] | @@ -3726,15 +3398,17 @@ static void Op02 (void) #endif if (!CheckEmulation()) { - PushB (Registers.PB); + PushB (ICPU.Registers.PB); PushW (CPU.PC - CPU.PCBase + 1); S9xPackStatus (); - PushB (Registers.PL); - OpenBus = Registers.PL; + PushB (ICPU.Registers.PL); +#ifndef NO_OPEN_BUS + OpenBus = ICPU.Registers.PL; +#endif ClearDecimal (); SetIRQ (); - Registers.PB = 0; + ICPU.Registers.PB = 0; ICPU.ShiftedPB = 0; S9xSetPCBase (S9xGetWord (0xFFE4)); #ifndef SA1_OPCODES @@ -3745,12 +3419,14 @@ static void Op02 (void) { PushW (CPU.PC - CPU.PCBase); S9xPackStatus (); - PushB (Registers.PL); - OpenBus = Registers.PL; + PushB (ICPU.Registers.PL); +#ifndef NO_OPEN_BUS + OpenBus = ICPU.Registers.PL; +#endif ClearDecimal (); SetIRQ (); - Registers.PB = 0; + ICPU.Registers.PB = 0; ICPU.ShiftedPB = 0; S9xSetPCBase (S9xGetWord (0xFFF4)); #ifndef SA1_OPCODES @@ -3763,8 +3439,8 @@ static void Op02 (void) /* JML *************************************************************************************** */ static void OpDC (void) { - AbsoluteIndirectLong (JUMP); - Registers.PB = (uint8) (OpAddress >> 16); + AbsoluteIndirectLong (JUMP, OpAddressPassthrough); + ICPU.Registers.PB = (uint8) (OpAddress >> 16); ICPU.ShiftedPB = OpAddress & 0xff0000; S9xSetPCBase (OpAddress); #ifndef SA1_OPCODES @@ -3774,8 +3450,8 @@ static void OpDC (void) static void Op5C (void) { - AbsoluteLong (JUMP); - Registers.PB = (uint8) (OpAddress >> 16); + AbsoluteLong (JUMP, OpAddressPassthrough); + ICPU.Registers.PB = (uint8) (OpAddress >> 16); ICPU.ShiftedPB = OpAddress & 0xff0000; S9xSetPCBase (OpAddress); } @@ -3784,7 +3460,7 @@ static void Op5C (void) /* JMP *************************************************************************************** */ static void Op4C (void) { - Absolute (JUMP); + Absolute (JUMP, OpAddressPassthrough); S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); #if defined(CPU_SHUTDOWN) && defined(SA1_OPCODES) CPUShutdown (); @@ -3793,13 +3469,13 @@ static void Op4C (void) static void Op6C (void) { - AbsoluteIndirect (JUMP); + AbsoluteIndirect (JUMP, OpAddressPassthrough); S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); } static void Op7C (void) { - AbsoluteIndexedIndirect (JUMP); + AbsoluteIndexedIndirect (JUMP, OpAddressPassthrough); S9xSetPCBase (ICPU.ShiftedPB + OpAddress); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE; @@ -3810,30 +3486,30 @@ static void Op7C (void) /* JSL/RTL *********************************************************************************** */ static void Op22E1 (void) { - AbsoluteLong (JUMP); - PushB (Registers.PB); + AbsoluteLong (JUMP, OpAddressPassthrough); + PushB (ICPU.Registers.PB); PushWENew (CPU.PC - CPU.PCBase - 1); - Registers.PB = (uint8) (OpAddress >> 16); + ICPU.Registers.PB = (uint8) (OpAddress >> 16); ICPU.ShiftedPB = OpAddress & 0xff0000; S9xSetPCBase (OpAddress); } static void Op22 (void) { - AbsoluteLong (JUMP); - PushB (Registers.PB); + AbsoluteLong (JUMP, OpAddressPassthrough); + PushB (ICPU.Registers.PB); PushW (CPU.PC - CPU.PCBase - 1); - Registers.PB = (uint8) (OpAddress >> 16); + ICPU.Registers.PB = (uint8) (OpAddress >> 16); ICPU.ShiftedPB = OpAddress & 0xff0000; S9xSetPCBase (OpAddress); } static void Op6BE1 (void) { - PullWENew (Registers.PC); - PullB (Registers.PB); - ICPU.ShiftedPB = Registers.PB << 16; - S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff)); + PullWENew (ICPU.Registers.PC); + PullB (ICPU.Registers.PB); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ((ICPU.Registers.PC + 1) & 0xffff)); #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif @@ -3841,10 +3517,10 @@ static void Op6BE1 (void) static void Op6B (void) { - PullW (Registers.PC); - PullB (Registers.PB); - ICPU.ShiftedPB = Registers.PB << 16; - S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff)); + PullW (ICPU.Registers.PC); + PullB (ICPU.Registers.PB); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ((ICPU.Registers.PC + 1) & 0xffff)); #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif @@ -3854,7 +3530,7 @@ static void Op6B (void) /* JSR/RTS *********************************************************************************** */ static void Op20 (void) { - Absolute (JUMP); + Absolute (JUMP, OpAddressPassthrough); PushW (CPU.PC - CPU.PCBase - 1); S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); #ifndef SA1_OPCODES @@ -3865,7 +3541,7 @@ static void Op20 (void) //JSR a,x static void OpFCE1 (void) { - AbsoluteIndexedIndirect (JUMP); + AbsoluteIndexedIndirect (JUMP, OpAddressPassthrough); PushWENew (CPU.PC - CPU.PCBase - 1); S9xSetPCBase (ICPU.ShiftedPB + OpAddress); #ifndef SA1_OPCODES @@ -3875,7 +3551,7 @@ static void OpFCE1 (void) static void OpFC (void) { - AbsoluteIndexedIndirect (JUMP); + AbsoluteIndexedIndirect (JUMP, OpAddressPassthrough); PushW (CPU.PC - CPU.PCBase - 1); S9xSetPCBase (ICPU.ShiftedPB + OpAddress); #ifndef SA1_OPCODES @@ -3885,8 +3561,8 @@ static void OpFC (void) static void Op60 (void) { - PullW (Registers.PC); - S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff)); + PullW (ICPU.Registers.PC); + S9xSetPCBase (ICPU.ShiftedPB + ((ICPU.Registers.PC + 1) & 0xffff)); #ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE * 3; #endif @@ -3903,17 +3579,20 @@ static void Op54X1 (void) CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; #endif - Registers.DB = *CPU.PC++; - ICPU.ShiftedDB = Registers.DB << 16; - OpenBus = SrcBank = *CPU.PC++; + ICPU.Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; +#ifndef NO_OPEN_BUS + OpenBus = +#endif + SrcBank = *CPU.PC++; - S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), - ICPU.ShiftedDB + Registers.Y.W); + S9xSetByte (S9xGetByte ((SrcBank << 16) + ICPU.Registers.X.W), + ICPU.ShiftedDB + ICPU.Registers.Y.W); - Registers.XL++; - Registers.YL++; - Registers.A.W--; - if (Registers.A.W != 0xffff) + ICPU.Registers.XL++; + ICPU.Registers.YL++; + ICPU.Registers.A.W--; + if (ICPU.Registers.A.W != 0xffff) CPU.PC -= 3; } @@ -3925,17 +3604,20 @@ static void Op54X0 (void) CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; #endif - Registers.DB = *CPU.PC++; - ICPU.ShiftedDB = Registers.DB << 16; - OpenBus = SrcBank = *CPU.PC++; + ICPU.Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; +#ifndef NO_OPEN_BUS + OpenBus = +#endif + SrcBank = *CPU.PC++; - S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), - ICPU.ShiftedDB + Registers.Y.W); + S9xSetByte (S9xGetByte ((SrcBank << 16) + ICPU.Registers.X.W), + ICPU.ShiftedDB + ICPU.Registers.Y.W); - Registers.X.W++; - Registers.Y.W++; - Registers.A.W--; - if (Registers.A.W != 0xffff) + ICPU.Registers.X.W++; + ICPU.Registers.Y.W++; + ICPU.Registers.A.W--; + if (ICPU.Registers.A.W != 0xffff) CPU.PC -= 3; } @@ -3946,16 +3628,19 @@ static void Op44X1 (void) #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; #endif - Registers.DB = *CPU.PC++; - ICPU.ShiftedDB = Registers.DB << 16; - OpenBus = SrcBank = *CPU.PC++; - S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), - ICPU.ShiftedDB + Registers.Y.W); - - Registers.XL--; - Registers.YL--; - Registers.A.W--; - if (Registers.A.W != 0xffff) + ICPU.Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; +#ifndef NO_OPEN_BUS + OpenBus = +#endif + SrcBank = *CPU.PC++; + S9xSetByte (S9xGetByte ((SrcBank << 16) + ICPU.Registers.X.W), + ICPU.ShiftedDB + ICPU.Registers.Y.W); + + ICPU.Registers.XL--; + ICPU.Registers.YL--; + ICPU.Registers.A.W--; + if (ICPU.Registers.A.W != 0xffff) CPU.PC -= 3; } @@ -3966,16 +3651,19 @@ static void Op44X0 (void) #ifndef SA1_OPCODES CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES; #endif - Registers.DB = *CPU.PC++; - ICPU.ShiftedDB = Registers.DB << 16; - OpenBus = SrcBank = *CPU.PC++; - S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), - ICPU.ShiftedDB + Registers.Y.W); - - Registers.X.W--; - Registers.Y.W--; - Registers.A.W--; - if (Registers.A.W != 0xffff) + ICPU.Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; +#ifndef NO_OPEN_BUS + OpenBus = +#endif + SrcBank = *CPU.PC++; + S9xSetByte (S9xGetByte ((SrcBank << 16) + ICPU.Registers.X.W), + ICPU.ShiftedDB + ICPU.Registers.Y.W); + + ICPU.Registers.X.W--; + ICPU.Registers.Y.W--; + ICPU.Registers.A.W--; + if (ICPU.Registers.A.W != 0xffff) CPU.PC -= 3; } @@ -3984,8 +3672,8 @@ static void Op44X0 (void) /* REP/SEP *********************************************************************************** */ static void OpC2 (void) { - Work8 = ~*CPU.PC++; - Registers.PL &= Work8; + uint8 Work8 = ~*CPU.PC++; + ICPU.Registers.PL &= Work8; ICPU._Carry &= Work8; ICPU._Overflow &= (Work8 >> 6); ICPU._Negative &= Work8; @@ -4001,8 +3689,8 @@ static void OpC2 (void) } if (CheckIndex ()) { - Registers.XH = 0; - Registers.YH = 0; + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; } S9xFixCycles(); /* CHECK_FOR_IRQ(); */ @@ -4010,8 +3698,8 @@ static void OpC2 (void) static void OpE2 (void) { - Work8 = *CPU.PC++; - Registers.PL |= Work8; + uint8 Work8 = *CPU.PC++; + ICPU.Registers.PL |= Work8; ICPU._Carry |= Work8 & 1; ICPU._Overflow |= (Work8 >> 6) & 1; ICPU._Negative |= Work8; @@ -4027,8 +3715,8 @@ static void OpE2 (void) } if (CheckIndex ()) { - Registers.XH = 0; - Registers.YH = 0; + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; } S9xFixCycles(); } @@ -4037,11 +3725,11 @@ static void OpE2 (void) /* XBA *************************************************************************************** */ static void OpEB (void) { - Work8 = Registers.AL; - Registers.AL = Registers.AH; - Registers.AH = Work8; + uint8 Work8 = ICPU.Registers.AL; + ICPU.Registers.AL = ICPU.Registers.AH; + ICPU.Registers.AH = Work8; - SetZN8 (Registers.AL); + SetZN8 (ICPU.Registers.AL); #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif @@ -4051,25 +3739,24 @@ static void OpEB (void) /* RTI *************************************************************************************** */ static void Op40 (void) { - PullB (Registers.PL); + PullB (ICPU.Registers.PL); S9xUnpackStatus (); - PullW (Registers.PC); + PullW (ICPU.Registers.PC); if (!CheckEmulation()) { - PullB (Registers.PB); - ICPU.ShiftedPB = Registers.PB << 16; + PullB (ICPU.Registers.PB); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; } else { SetFlags (MemoryFlag | IndexFlag); missing.emulate6502 = 1; } - S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); - + S9xSetPCBase (ICPU.ShiftedPB + ICPU.Registers.PC); if (CheckIndex ()) { - Registers.XH = 0; - Registers.YH = 0; + ICPU.Registers.XH = 0; + ICPU.Registers.YH = 0; } #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; @@ -4098,9 +3785,7 @@ static void OpCB (void) SA1.Executing = FALSE; do { - APU_EXECUTE1 (); - } while (APU.Cycles < SA1.NextEvent); - SA1.Executing = TRUE; + APU_EXECUTE1 (, } while (APU.Cycles < SA1.NextEvent, SA1.Executing = TRUE; } } #endif @@ -4138,8 +3823,8 @@ static void OpCB (void) #ifndef SA1_OPCODES CPU.Cycles += TWO_CYCLES; #endif -#endif } +#endif } #endif // SA1_OPCODES } diff --git a/source/font/Pictochat-16.bdf b/source/font/Pictochat-16.bdf new file mode 100644 index 0000000..06117a2 --- /dev/null +++ b/source/font/Pictochat-16.bdf @@ -0,0 +1,2682 @@ +STARTFONT 2.1 +FONT -FontForge-Pictochat-Book-R-Normal--16-150-75-75-P-53-ISO10646-1 +SIZE 15 75 75 +FONTBOUNDINGBOX 9 13 0 -1 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +STARTPROPERTIES 37 +FAMILY_NAME "Pictochat" +WEIGHT_NAME "Book" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 16 +POINT_SIZE 150 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 53 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONTNAME_REGISTRY "" +CHARSET_COLLECTIONS "ISO10646-1" +FONT_NAME "Pictochat" +FACE_NAME "Pictochat Regular" +FONT_VERSION "1.0" +FONT_ASCENT 13 +FONT_DESCENT 3 +UNDERLINE_POSITION 2 +UNDERLINE_THICKNESS 1 +X_HEIGHT 5 +CAP_HEIGHT 8 +RAW_ASCENT 799 +RAW_DESCENT 200 +NORM_SPACE 2 +RELATIVE_WEIGHT 40 +RELATIVE_SETWIDTH 50 +SUPERSCRIPT_X 0 +SUPERSCRIPT_Y 8 +SUPERSCRIPT_SIZE 8 +SUBSCRIPT_X 0 +SUBSCRIPT_Y 0 +SUBSCRIPT_SIZE 8 +AVG_LOWERCASE_WIDTH 55 +AVG_UPPERCASE_WIDTH 56 +ENDPROPERTIES +CHARS 176 +STARTCHAR space +ENCODING 32 +SWIDTH 187 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 125 0 +DWIDTH 2 0 +BBX 1 9 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +28 +50 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 9 0 0 +BITMAP +14 +14 +7E +28 +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 9 0 0 +BITMAP +44 +A4 +A8 +48 +10 +24 +2A +4A +44 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 437 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +50 +50 +50 +20 +54 +88 +88 +74 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 187 0 +DWIDTH 3 0 +BBX 1 2 1 7 +BITMAP +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 9 0 0 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 9 0 0 +BITMAP +80 +40 +40 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 1 +BITMAP +10 +92 +54 +38 +54 +92 +10 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 2 2 0 -1 +BITMAP +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 1 0 4 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +98 +98 +A8 +C8 +C8 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 187 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +08 +08 +08 +70 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +08 +08 +08 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 437 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +88 +88 +88 +88 +88 +7C +08 +08 +08 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +80 +80 +80 +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +80 +80 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +08 +08 +10 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +88 +88 +78 +08 +08 +08 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 125 0 +DWIDTH 2 0 +BBX 1 5 0 2 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 187 0 +DWIDTH 3 0 +BBX 2 6 0 1 +BITMAP +40 +00 +00 +00 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 5 0 2 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 5 0 2 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +E0 +10 +10 +20 +40 +40 +00 +40 +40 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 9 0 0 +BITMAP +38 +44 +9A +AA +AA +AA +9C +40 +3C +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +50 +50 +50 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +F0 +80 +80 +80 +F0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +F0 +80 +80 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +80 +80 +80 +B8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 125 0 +DWIDTH 2 0 +BBX 1 9 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +90 +A0 +C0 +A0 +90 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +A8 +70 +18 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +88 +88 +F0 +90 +90 +88 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +70 +80 +80 +80 +60 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +50 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +A8 +A8 +A8 +A8 +50 +50 +50 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +F0 +10 +20 +20 +60 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 9 0 0 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 9 0 0 +BITMAP +80 +80 +80 +40 +40 +40 +20 +20 +20 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 9 0 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 2 0 7 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 187 0 +DWIDTH 3 0 +BBX 2 2 0 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +30 +40 +40 +F0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +78 +88 +88 +88 +78 +08 +F0 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 125 0 +DWIDTH 2 0 +BBX 1 8 0 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 9 0 -1 +BITMAP +20 +00 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +80 +80 +80 +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 187 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +FC +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +B0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +70 +80 +60 +10 +10 +E0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +40 +40 +F0 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +A8 +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +88 +50 +50 +20 +20 +C0 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +30 +40 +40 +40 +80 +40 +40 +40 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 187 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +C0 +20 +20 +20 +10 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 625 0 +DWIDTH 10 0 +BBX 9 2 0 4 +BITMAP +7880 +8700 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 125 0 +DWIDTH 2 0 +BBX 1 9 0 0 +BITMAP +80 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 437 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +10 +78 +94 +A0 +A0 +A0 +C4 +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +40 +20 +F8 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 125 0 +DWIDTH 2 0 +BBX 1 9 0 0 +BITMAP +80 +80 +80 +80 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 625 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 625 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +BC80 +A280 +BC80 +A480 +A280 +4100 +3E00 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 3 0 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 187 0 +DWIDTH 3 0 +BBX 2 2 0 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +20 +20 +00 +20 +20 +40 +80 +80 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +20 +10 +00 +20 +50 +50 +50 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +20 +40 +00 +20 +50 +50 +50 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 0 +BITMAP +20 +50 +00 +20 +20 +50 +50 +50 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +28 +50 +00 +20 +50 +50 +50 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +50 +00 +20 +20 +50 +50 +50 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 0 +BITMAP +20 +50 +20 +00 +20 +50 +50 +50 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 10 0 -1 +BITMAP +70 +80 +80 +80 +80 +80 +80 +70 +20 +40 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 1000 0 +DWIDTH 5 0 +BBX 4 11 0 0 +BITMAP +40 +20 +00 +F0 +80 +80 +F0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 1000 0 +DWIDTH 5 0 +BBX 4 11 0 0 +BITMAP +20 +40 +00 +F0 +80 +80 +F0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 1000 0 +DWIDTH 5 0 +BBX 4 11 0 0 +BITMAP +20 +50 +00 +F0 +80 +80 +F0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 1000 0 +DWIDTH 5 0 +BBX 4 10 0 0 +BITMAP +50 +00 +F0 +80 +80 +F0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 2 11 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 2 11 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 11 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 10 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +28 +50 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +50 +00 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +88 +B0 +88 +88 +88 +B0 +80 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +00 +F0 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F0 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +F0 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +F0 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +F0 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +00 +F0 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 7 0 -1 +BITMAP +70 +80 +80 +80 +70 +20 +40 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 2 9 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 9 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 3 8 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +20 +00 +88 +88 +50 +50 +20 +20 +C0 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +50 +00 +88 +88 +50 +50 +20 +20 +C0 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 9 0 0 +BITMAP +6E +90 +90 +90 +9E +90 +90 +90 +6E +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +6C +92 +9E +90 +90 +6E +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 2 0 7 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 2 0 7 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 312 0 +DWIDTH 5 0 +BBX 4 4 0 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 437 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +18 +24 +40 +F0 +40 +F0 +40 +24 +18 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 625 0 +DWIDTH 10 0 +BBX 9 4 0 5 +BITMAP +E880 +4D80 +4A80 +4880 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 625 0 +DWIDTH 10 0 +BBX 9 5 0 2 +BITMAP +2000 +4000 +FF80 +4000 +2000 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 375 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 9 5 0 2 +BITMAP +0200 +0100 +FF80 +0100 +0200 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +ENDFONT diff --git a/source/font/README.txt b/source/font/README.txt new file mode 100644 index 0000000..c417cb8 --- /dev/null +++ b/source/font/README.txt @@ -0,0 +1,40 @@ +In this directory, you will find the source file for the main font used by +CATSFC. It's an Adobe BDF file, which is fed into the emulator when running +in "font dump" mode to produce a more efficient representation in an "ODF" +format. The font is based on the one used by Pictochat, with a few more +characters that Pictochat does not have (but no Japanese characters). + +You can edit the font in an application that reads BDF bitmap fonts, such as +FontForge. Open the font in the application then export it again as BDF. +One case where you would want to do this is to add new glyphs to support a +new language. + +To include the more efficient representation (ODF) in CATSFC/system after +editing the BDF file: + + 1. If your font added characters beyond U+2193 DOWNWARDS ARROW, adjust the + maximum codepoint in source/nds/bdf_font.c, after the first instance of + > #ifndef HAVE_ODF + 2. In source/nds/bdf_font.c, + > #define DUMP_ODF + and + > // #define HAVE_ODF + This will make the plugin read the BDF source and write an ODF file. + 3. make + 4. Copy the new plugin to your card, under /_dstwoplug. + 5. Copy the .bdf file to your card, under /CATSFC/system, as Pictochat-16.bdf. + 6. Run the plugin on the Supercard DSTWO. It will briefly load, then display + "Font library initialisation error -1, press any key to exit". This is + because it tries to load the Chinese font's source, Song.bdf, which you + don't have. Regardless, it does dump an ODF file for Pictochat-16.bdf. + 7. Copy the .odf font somewhere on your hard drive if you want to keep a copy + of it. Delete the .bdf file from your card. + 8. Reverse the changes made in step 2. + 9. make +10. Copy the new plugin to your card, under /_dstwoplug. + +And you can use your new font! + +Finally, you may want to send your .bdf source file to a CATSFC developer +or commit it to a fork on Github, for inclusion in the plugin. You may also +want to send your changes to CATSFC/system/language.msg for the same reason.
\ No newline at end of file diff --git a/source/getset.h b/source/getset.h index 2368ac2..9b94b22 100644 --- a/source/getset.h +++ b/source/getset.h @@ -98,12 +98,14 @@ #include "obc1.h" #include "seta.h" +#ifndef NO_OPEN_BUS extern "C" { extern uint8 OpenBus; } +#endif -INLINE uint8 S9xGetByte (uint32 Address) +uint8 S9xGetByte (uint32 Address) { int block; uint8 *GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; @@ -178,8 +180,11 @@ INLINE uint8 S9xGetByte (uint32 Address) #ifdef DEBUGGER printf ("DEBUG R(B) %06x\n", Address); #endif - return OpenBus; - +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif default: @@ -193,16 +198,25 @@ INLINE uint8 S9xGetByte (uint32 Address) #ifdef DEBUGGER printf ("R(B) %06x\n", Address); #endif +#ifndef NO_OPEN_BUS return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif } } -INLINE uint16 S9xGetWord (uint32 Address) +uint16 S9xGetWord (uint32 Address) { if ((Address & 0x0fff) == 0x0fff) { - OpenBus=S9xGetByte (Address); +#ifndef NO_OPEN_BUS + OpenBus = S9xGetByte (Address); return (OpenBus | (S9xGetByte (Address + 1) << 8)); +#else + uint8 Split = S9xGetByte (Address); + return (Split | (S9xGetByte (Address + 1) << 8)); +#endif } int block; uint8 *GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; @@ -302,8 +316,11 @@ INLINE uint16 S9xGetWord (uint32 Address) #ifdef DEBUGGER printf ("DEBUG R(W) %06x\n", Address); #endif - return (OpenBus | (OpenBus<<8)); - +#ifndef NO_OPEN_BUS + return (OpenBus | (OpenBus<<8)); +#else + return 0; // Arbitrarily chosen value [Neb] +#endif default: case CMemory::MAP_NONE: @@ -316,11 +333,15 @@ INLINE uint16 S9xGetWord (uint32 Address) #ifdef DEBUGGER printf ("R(W) %06x\n", Address); #endif +#ifndef NO_OPEN_BUS return (OpenBus | (OpenBus<<8)); +#else + return 0; // Arbitrarily chosen value [Neb] +#endif } } -INLINE void S9xSetByte (uint8 Byte, uint32 Address) +void S9xSetByte (uint8 Byte, uint32 Address) { #if defined(CPU_SHUTDOWN) CPU.WaitAddress = NULL; @@ -436,7 +457,7 @@ INLINE void S9xSetByte (uint8 Byte, uint32 Address) } } -INLINE void S9xSetWord (uint16 Word, uint32 Address) +void S9xSetWord (uint16 Word, uint32 Address) { if((Address & 0x0FFF)==0x0FFF) { @@ -594,7 +615,7 @@ INLINE void S9xSetWord (uint16 Word, uint32 Address) } } -INLINE uint8 *GetBasePointer (uint32 Address) +uint8 *GetBasePointer (uint32 Address) { uint8 *GetAddress = Memory.Map [(Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; if (GetAddress >= (uint8 *) CMemory::MAP_LAST) @@ -660,7 +681,7 @@ INLINE uint8 *GetBasePointer (uint32 Address) } } -INLINE uint8 *S9xGetMemPointer (uint32 Address) +uint8 *S9xGetMemPointer (uint32 Address) { uint8 *GetAddress = Memory.Map [(Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; if (GetAddress >= (uint8 *) CMemory::MAP_LAST) @@ -714,7 +735,7 @@ INLINE uint8 *S9xGetMemPointer (uint32 Address) } } -INLINE void S9xSetPCBase (uint32 Address) +void S9xSetPCBase (uint32 Address) { int block; uint8 *GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; diff --git a/source/gfx.cpp b/source/gfx.cpp index 14e28a5..5e6c650 100644 --- a/source/gfx.cpp +++ b/source/gfx.cpp @@ -167,6 +167,7 @@ extern uint8 Mode7Depths [2]; #define BLACK BUILD_PIXEL(0,0,0) +#ifndef FOREVER_16_BIT void DrawTile (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount); void DrawClippedTile (uint32 Tile, uint32 Offset, @@ -185,6 +186,7 @@ void DrawClippedTilex2x2 (uint32 Tile, uint32 Offset, void DrawLargePixel (uint32 Tile, uint32 Offset, uint32 StartPixel, uint32 Pixels, uint32 StartLine, uint32 LineCount); +#endif void DrawTile16 (uint32 Tile, uint32 Offset, uint32 StartLine, uint32 LineCount); @@ -365,7 +367,9 @@ bool8 S9xGraphicsInit () GFX.RealPitch = GFX.Pitch2 = GFX.Pitch; GFX.ZPitch = GFX.Pitch; +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) +#endif GFX.ZPitch >>= 1; GFX.Delta = (GFX.SubScreen - GFX.Screen) >> 1; GFX.DepthDelta = GFX.SubZBuffer - GFX.ZBuffer; @@ -374,13 +378,17 @@ bool8 S9xGraphicsInit () PPU.BG_Forced = 0; IPPU.OBJChanged = TRUE; +#ifndef FOREVER_16_BIT if (Settings.Transparency) Settings.SixteenBit = TRUE; +#endif IPPU.DirectColourMapsNeedRebuild = TRUE; GFX.PixSize = 1; +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif DrawTilePtr = DrawTile16; DrawClippedTilePtr = DrawClippedTile16; DrawLargePixelPtr = DrawLargePixel16; @@ -388,6 +396,7 @@ bool8 S9xGraphicsInit () DrawHiResClippedTilePtr = DrawClippedTile16; GFX.PPL = GFX.Pitch >> 1; GFX.PPLx2 = GFX.Pitch; +#ifndef FOREVER_16_BIT } else { @@ -399,10 +408,13 @@ bool8 S9xGraphicsInit () GFX.PPL = GFX.Pitch; GFX.PPLx2 = GFX.Pitch * 2; } +#endif S9xFixColourBrightness (); +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif if (!(GFX.X2 = (uint16 *) malloc (sizeof (uint16) * 0x10000))) return (FALSE); @@ -549,6 +561,7 @@ bool8 S9xGraphicsInit () } } } +#ifndef FOREVER_16_BIT } else { @@ -556,6 +569,7 @@ bool8 S9xGraphicsInit () GFX.ZERO_OR_X2 = NULL; GFX.ZERO = NULL; } +#endif return (TRUE); } @@ -634,20 +648,28 @@ void S9xStartScreenRefresh () IPPU.DoubleHeightPixels = TRUE; GFX.Pitch2 = GFX.RealPitch; GFX.Pitch = GFX.RealPitch * 2; +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) +#endif GFX.PPL = GFX.PPLx2 = GFX.RealPitch; +#ifndef FOREVER_16_BIT else GFX.PPL = GFX.PPLx2 = GFX.RealPitch << 1; +#endif } else { IPPU.RenderedScreenHeight = PPU.ScreenHeight; GFX.Pitch2 = GFX.Pitch = GFX.RealPitch; IPPU.DoubleHeightPixels = FALSE; +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) +#endif GFX.PPL = GFX.Pitch >> 1; +#ifndef FOREVER_16_BIT else GFX.PPL = GFX.Pitch; +#endif GFX.PPLx2 = GFX.PPL << 1; } } @@ -661,7 +683,9 @@ void S9xStartScreenRefresh () GFX.Pitch2 = GFX.Pitch = GFX.RealPitch; GFX.PPL = GFX.PPLx2 >> 1; GFX.ZPitch = GFX.RealPitch; +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) +#endif GFX.ZPitch >>= 1; } } @@ -731,9 +755,10 @@ void S9xEndScreenRefresh () FLUSH_REDRAW (); if (IPPU.ColorsChanged) { - uint32 saved = PPU.CGDATA[0]; + uint32 saved = PPU.CGDATA[0]; +#ifndef FOREVER_16_BIT if (!Settings.SixteenBit) - { + { // Hack for Super Mario World - to get its sky blue // (It uses Fixed colour addition on the backdrop colour) if (!(Memory.FillRAM [0x2131] & 0x80) && (Memory.FillRAM[0x2131] & 0x20) && @@ -742,7 +767,8 @@ void S9xEndScreenRefresh () PPU.CGDATA[0] = PPU.FixedColourRed | (PPU.FixedColourGreen << 5) | (PPU.FixedColourBlue << 10); } - } + } +#endif IPPU.ColorsChanged = FALSE; PPU.CGDATA[0] = saved; } @@ -768,11 +794,15 @@ void S9xEndScreenRefresh () } #endif S9xDeinitUpdate (IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight, - Settings.SixteenBit); +#ifndef FOREVER_16_BIT + Settings.SixteenBit +#else + TRUE +#endif + ); } - //S9xApplyCheats (); - S9xApplyCheats_ex (); + S9xApplyCheats (); #ifdef DEBUGGER if (CPU.Flags & FRAME_ADVANCE_FLAG) { @@ -1084,7 +1114,7 @@ void S9xSetupOBJ () IPPU.OBJChanged = FALSE; } -void DrawOBJS (bool8 OnMain = FALSE, uint8 D = 0) +static void DrawOBJS (bool8 OnMain = FALSE, uint8 D = 0) { #ifdef MK_DEBUG_RTO if(Settings.BGLayering) fprintf(stderr, "Entering DrawOBJS() for %d-%d\n", GFX.StartY, GFX.EndY); @@ -1159,45 +1189,56 @@ if(Settings.BGLayering) { OnMain = FALSE; GFX.PixSize = 2; if (IPPU.DoubleHeightPixels) - { +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif DrawTilePtr = DrawTile16x2x2; DrawClippedTilePtr = DrawClippedTile16x2x2; +#ifndef FOREVER_16_BIT } else { DrawTilePtr = DrawTilex2x2; DrawClippedTilePtr = DrawClippedTilex2x2; } +#endif } else { +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif DrawTilePtr = DrawTile16x2; DrawClippedTilePtr = DrawClippedTile16x2; +#ifndef FOREVER_16_BIT } else { DrawTilePtr = DrawTilex2; DrawClippedTilePtr = DrawClippedTilex2; } +#endif } } else { +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif DrawTilePtr = DrawTile16; DrawClippedTilePtr = DrawClippedTile16; +#ifndef FOREVER_16_BIT } else { DrawTilePtr = DrawTile; DrawClippedTilePtr = DrawClippedTile; } +#endif } } GFX.Z1 = D + 2; @@ -1295,7 +1336,7 @@ if(Settings.BGLayering) { #endif } -void DrawBackgroundMosaic (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) +static void DrawBackgroundMosaic (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) { CHECK_SOUND(); @@ -1523,7 +1564,7 @@ void DrawBackgroundMosaic (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) } } -void DrawBackgroundOffset (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) +static void DrawBackgroundOffset (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) { CHECK_SOUND(); @@ -1860,7 +1901,7 @@ void DrawBackgroundOffset (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) } } -void DrawBackgroundMode5 (uint32 /* BGMODE */, uint32 bg, uint8 Z1, uint8 Z2) +static void DrawBackgroundMode5 (uint32 /* BGMODE */, uint32 bg, uint8 Z1, uint8 Z2) { CHECK_SOUND(); @@ -2191,7 +2232,7 @@ void DrawBackgroundMode5 (uint32 /* BGMODE */, uint32 bg, uint8 Z1, uint8 Z2) } -void DrawBackground (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) +static void DrawBackground (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) { GFX.PixSize = 1; @@ -2688,17 +2729,17 @@ void DrawBackground (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) } \ } -void DrawBGMode7Background (uint8 *Screen, int bg) +static void DrawBGMode7Background (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7 (uint8, (uint8) (b & GFX.Mode7Mask)) } -void DrawBGMode7Background16 (uint8 *Screen, int bg) +static void DrawBGMode7Background16 (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7 (uint16, GFX.ScreenColors [b & GFX.Mode7Mask]); } -void DrawBGMode7Background16Add (uint8 *Screen, int bg) +static void DrawBGMode7Background16Add (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7 (uint16, *(d + GFX.DepthDelta) ? (*(d + GFX.DepthDelta) != 1 ? @@ -2709,7 +2750,7 @@ void DrawBGMode7Background16Add (uint8 *Screen, int bg) GFX.ScreenColors [b & GFX.Mode7Mask]); } -void DrawBGMode7Background16Add1_2 (uint8 *Screen, int bg) +static void DrawBGMode7Background16Add1_2 (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7 (uint16, *(d + GFX.DepthDelta) ? (*(d + GFX.DepthDelta) != 1 ? @@ -2720,7 +2761,7 @@ void DrawBGMode7Background16Add1_2 (uint8 *Screen, int bg) GFX.ScreenColors [b & GFX.Mode7Mask]); } -void DrawBGMode7Background16Sub (uint8 *Screen, int bg) +static void DrawBGMode7Background16Sub (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7 (uint16, *(d + GFX.DepthDelta) ? (*(d + GFX.DepthDelta) != 1 ? @@ -2731,7 +2772,7 @@ void DrawBGMode7Background16Sub (uint8 *Screen, int bg) GFX.ScreenColors [b & GFX.Mode7Mask]); } -void DrawBGMode7Background16Sub1_2 (uint8 *Screen, int bg) +static void DrawBGMode7Background16Sub1_2 (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7 (uint16, *(d + GFX.DepthDelta) ? (*(d + GFX.DepthDelta) != 1 ? @@ -3124,12 +3165,12 @@ STATIC uint32 Q_INTERPOLATE(uint32 A, uint32 B, uint32 C, uint32 D) return x+y; } -void DrawBGMode7Background16_i (uint8 *Screen, int bg) +static void DrawBGMode7Background16_i (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7_i (uint16, theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); } -void DrawBGMode7Background16Add_i (uint8 *Screen, int bg) +static void DrawBGMode7Background16Add_i (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7_i (uint16, *(d + GFX.DepthDelta) ? (*(d + GFX.DepthDelta) != 1 ? @@ -3140,7 +3181,7 @@ void DrawBGMode7Background16Add_i (uint8 *Screen, int bg) theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); } -void DrawBGMode7Background16Add1_2_i (uint8 *Screen, int bg) +static void DrawBGMode7Background16Add1_2_i (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7_i (uint16, *(d + GFX.DepthDelta) ? (*(d + GFX.DepthDelta) != 1 ? @@ -3151,7 +3192,7 @@ void DrawBGMode7Background16Add1_2_i (uint8 *Screen, int bg) theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); } -void DrawBGMode7Background16Sub_i (uint8 *Screen, int bg) +static void DrawBGMode7Background16Sub_i (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7_i (uint16, *(d + GFX.DepthDelta) ? (*(d + GFX.DepthDelta) != 1 ? @@ -3162,7 +3203,7 @@ void DrawBGMode7Background16Sub_i (uint8 *Screen, int bg) theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); } -void DrawBGMode7Background16Sub1_2_i (uint8 *Screen, int bg) +static void DrawBGMode7Background16Sub1_2_i (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7_i (uint16, *(d + GFX.DepthDelta) ? (*(d + GFX.DepthDelta) != 1 ? @@ -3207,7 +3248,7 @@ TWO_LOW_BITS_MASK = RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 1); \ HIGH_BITS_SHIFTED_TWO_MASK = (( (FIRST_COLOR_MASK | SECOND_COLOR_MASK | THIRD_COLOR_MASK) & \ ~TWO_LOW_BITS_MASK ) >> 2); -void RenderScreen (uint8 *Screen, bool8 sub, bool8 force_no_add, uint8 D) +static void RenderScreen (uint8 *Screen, bool8 sub, bool8 force_no_add, uint8 D) { bool8 BG0; bool8 BG1; @@ -3237,9 +3278,10 @@ void RenderScreen (uint8 *Screen, bool8 sub, bool8 force_no_add, uint8 D) } sub |= force_no_add; - - if (PPU.BGMode <= 1) - { + + switch (PPU.BGMode) { + case 0: + case 1: if (OB) { SelectTileRenderer (sub || !SUB_OR_ADD(4)); @@ -3266,9 +3308,12 @@ void RenderScreen (uint8 *Screen, bool8 sub, bool8 force_no_add, uint8 D) SelectTileRenderer (sub || !SUB_OR_ADD(3)); DrawBackground (PPU.BGMode, 3, D + 2, D + 5); } - } - else if (PPU.BGMode != 7) - { + break; + case 2: + case 3: + case 4: + case 5: + case 6: if (OB) { SelectTileRenderer (sub || !SUB_OR_ADD(4)); @@ -3279,14 +3324,13 @@ void RenderScreen (uint8 *Screen, bool8 sub, bool8 force_no_add, uint8 D) SelectTileRenderer (sub || !SUB_OR_ADD(0)); DrawBackground (PPU.BGMode, 0, D + 5, D + 13); } - if (PPU.BGMode != 6 && BG1) + if (BG1 && PPU.BGMode != 6) { SelectTileRenderer (sub || !SUB_OR_ADD(1)); DrawBackground (PPU.BGMode, 1, D + 2, D + 9); } - } - else - { + break; + case 7: if (OB) { SelectTileRenderer (sub || !SUB_OR_ADD(4)); @@ -3357,7 +3401,10 @@ void RenderScreen (uint8 *Screen, bool8 sub, bool8 force_no_add, uint8 D) } } } - } + break; + default: + break; + } } #include "font.h" @@ -3366,8 +3413,10 @@ void DisplayChar (uint8 *Screen, uint8 c) { int line = (((c & 0x7f) - 32) >> 4) * font_height; int offset = (((c & 0x7f) - 32) & 15) * font_width; +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif int h, w; uint16 *s = (uint16 *) Screen; for (h = 0; h < font_height; h++, line++, @@ -3397,6 +3446,7 @@ void DisplayChar (uint8 *Screen, uint8 c) *s = BLACK; } } +#ifndef FOREVER_16_BIT } else { @@ -3417,6 +3467,7 @@ void DisplayChar (uint8 *Screen, uint8 c) } } } +#endif } static void S9xDisplayFrameRate () @@ -3433,8 +3484,12 @@ static void S9xDisplayFrameRate () for (i = 0; i < len; i++) { DisplayChar (Screen, string [i]); +#ifndef FOREVER_16_BIT Screen += Settings.SixteenBit ? (font_width - 1) * sizeof (uint16) : (font_width - 1); +#else + Screen += (font_width - 1) * sizeof (uint16); +#endif } } @@ -3451,9 +3506,13 @@ static void S9xDisplayString (const char *string) { if (char_count >= max_chars || string [i] < 32) { +#ifndef FOREVER_16_BIT Screen -= Settings.SixteenBit ? (font_width - 1) * sizeof (uint16) * max_chars : (font_width - 1) * max_chars; +#else + Screen -= (font_width - 1) * max_chars * sizeof (uint16); +#endif Screen += font_height * GFX.Pitch; if (Screen >= GFX.Screen + GFX.Pitch * IPPU.RenderedScreenHeight) break; @@ -3462,8 +3521,12 @@ static void S9xDisplayString (const char *string) if (string [i] < 32) continue; DisplayChar (Screen, string [i]); +#ifndef FOREVER_16_BIT Screen += Settings.SixteenBit ? (font_width - 1) * sizeof (uint16) : (font_width - 1); +#else + Screen += (font_width - 1) * sizeof (uint16); +#endif } } @@ -3529,8 +3592,10 @@ void S9xUpdateScreen () { // The game has switched from lo-res to hi-res mode part way down // the screen. Scale any existing lo-res pixels on screen +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif for (register uint32 y = 0; y < starty; y++) { register uint16 *p = (uint16 *) (GFX.Screen + y * GFX.Pitch2) + 255; @@ -3539,6 +3604,7 @@ void S9xUpdateScreen () for (register int x = 255; x >= 0; x--, p--, q -= 2) *q = *(q + 1) = *p; } +#ifndef FOREVER_16_BIT } else { @@ -3550,6 +3616,7 @@ void S9xUpdateScreen () *q = *(q + 1) = *p; } } +#endif IPPU.DoubleWidthPixels = TRUE; } // BJ: And we have to change the height if Interlace gets set, @@ -3562,10 +3629,14 @@ void S9xUpdateScreen () IPPU.DoubleHeightPixels = TRUE; GFX.Pitch2 = GFX.RealPitch; GFX.Pitch = GFX.RealPitch * 2; +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) +#endif GFX.PPL = GFX.PPLx2 = GFX.RealPitch; +#ifndef FOREVER_16_BIT else GFX.PPL = GFX.PPLx2 = GFX.RealPitch << 1; +#endif // The game has switched from non-interlaced to interlaced mode // part way down the screen. Scale everything. @@ -3583,7 +3654,11 @@ void S9xUpdateScreen () uint32 black = BLACK | (BLACK << 16); - if (Settings.Transparency && Settings.SixteenBit) + if (Settings.Transparency +#ifndef FOREVER_16_BIT + && Settings.SixteenBit +#endif + ) { if (GFX.Pseudo) { @@ -3994,8 +4069,10 @@ void S9xUpdateScreen () { // Mixure of background modes used on screen - scale width // of all non-mode 5 and 6 pixels. +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif for (register uint32 y = starty; y <= endy; y++) { register uint16 *p = (uint16 *) (GFX.Screen + y * GFX.Pitch2) + 255; @@ -4003,6 +4080,7 @@ void S9xUpdateScreen () for (register int x = 255; x >= 0; x--, p--, q -= 2) *q = *(q + 1) = *p; } +#ifndef FOREVER_16_BIT } else { @@ -4014,6 +4092,7 @@ void S9xUpdateScreen () *q = *(q + 1) = *p; } } +#endif } // Double the height of the pixels just drawn diff --git a/source/globals.cpp b/source/globals.cpp index 0103f7e..c804318 100644 --- a/source/globals.cpp +++ b/source/globals.cpp @@ -113,20 +113,14 @@ struct SICPU ICPU; struct SCPUState CPU; -struct SRegisters Registers; - struct SAPU APU; struct SIAPU IAPU; -struct SAPURegisters APURegisters; - struct SSettings Settings; struct SDSP1 DSP1; -struct SSA1Registers SA1Registers; - struct SSA1 SA1; SSoundData SoundData; @@ -147,6 +141,7 @@ CMemory Memory; struct SSNESGameFixes SNESGameFixes; +#if 0 uint8 A1 = 0, A2 = 0, A3 = 0, A4 = 0, W1 = 0, W2 = 0, W3 = 0, W4 = 0; uint8 Ans8 = 0; uint16 Ans16 = 0; @@ -157,7 +152,10 @@ uint32 Work32 = 0; signed char Int8 = 0; short Int16 = 0; long Int32 = 0; -unsigned char OpenBus = 0; +#endif +#ifndef NO_OPEN_BUS +uint8 OpenBus = 0; +#endif END_EXTERN_C @@ -230,7 +228,6 @@ uint32 HIGH_BITS_SHIFTED_TWO_MASK = 0; uint32 current_graphic_format = RGB565; #endif -uint8 GetBank = 0; struct SCheatData Cheat; volatile SoundStatus so; @@ -357,7 +354,7 @@ struct SNetPlay NetPlay; #endif // Raw SPC700 instruction cycle lengths -int32 S9xAPUCycleLengths [256] = +uint16 S9xAPUCycleLengths [256] = { /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, */ /* 00 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 6, 8, @@ -380,7 +377,7 @@ int32 S9xAPUCycleLengths [256] = // Actual data used by CPU emulation, will be scaled by APUReset routine // to be relative to the 65c816 instruction lengths. -int32 S9xAPUCycles [256] = +uint16 S9xAPUCycles [256] = { /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, */ /* 00 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 6, 8, diff --git a/source/memmap.cpp b/source/memmap.cpp index 65b8739..04bc621 100644 --- a/source/memmap.cpp +++ b/source/memmap.cpp @@ -146,7 +146,7 @@ int is_bsx(unsigned char *); int bs_name(unsigned char *); int check_char(unsigned); void S9xDeinterleaveType2 (bool8 reset=TRUE); -inline uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32 = 0xFFFFFFFF); +uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32 = 0xFFFFFFFF); extern char *rom_filename; @@ -395,7 +395,7 @@ char *CMemory::Safe (const char *s) /**********************************************************************************************/ /* Init() */ -/* This function allocates all the memory needed by the emulator */ +/* This function allocates and zeroes all the memory needed by the emulator */ /**********************************************************************************************/ bool8 CMemory::Init () { @@ -1213,7 +1213,7 @@ void S9xDeinterleaveType2 (bool8 reset) } //CRC32 for char arrays -inline uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32) +uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32) { for (register uint32 i = 0; i < size; i++) { diff --git a/source/memmap.h b/source/memmap.h index 58f0c9f..f838065 100644 --- a/source/memmap.h +++ b/source/memmap.h @@ -276,7 +276,7 @@ bool8 LoadZip(const char* zipname, END_EXTERN_C extern "C" { -void S9xAutoSaveSRAM (); + void S9xAutoSaveSRAM (); } #ifdef NO_INLINE_SET_GET @@ -288,9 +288,12 @@ void S9xSetPCBase (uint32 Address); uint8 *S9xGetMemPointer (uint32 Address); uint8 *GetBasePointer (uint32 Address); -extern "C"{ -extern uint8 OpenBus; +#ifndef NO_OPEN_BUS +extern "C" { + extern uint8 OpenBus; } +#endif + #else #define INLINE inline #include "getset.h" diff --git a/source/nds/bdf_font.c b/source/nds/bdf_font.c index 5da57e3..773403a 100644 --- a/source/nds/bdf_font.c +++ b/source/nds/bdf_font.c @@ -18,6 +18,7 @@ */ //v1.1 +#include "port.h" #include <string.h> #include "ds2_types.h" #include "ds2_malloc.h" @@ -27,13 +28,13 @@ #include "gui.h" -#define BDF_VERDANA "SYSTEM/verdana.bdf" +#define BDF_PICTOCHAT "SYSTEM/Pictochat-16.bdf" #define BDF_SONG "SYSTEM/song.bdf" -#define ODF_VERDANA "SYSTEM/verdana.odf" +#define ODF_PICTOCHAT "SYSTEM/Pictochat-16.odf" #define ODF_SONG "SYSTEM/song.odf" -#define HAVE_ODF -//#define DUMP_ODF +#define HAVE_ODF // Define this if you have generated Pictochat-16.odf [Neb] +// #define DUMP_ODF // Define this if you want to regenerate Pictochat-16.odf [Neb] #define BDF_LIB_NUM 2 #define ODF_VERSION "1.0" @@ -49,21 +50,24 @@ static u32 fonts_max_height; static u32 bitmap_code(unsigned char *code, unsigned char *bitmap) { unsigned char *map; - u32 a, b, len; + u8 a, b; + u32 len; len= 0; map= (unsigned char*)bitmap; while(*map) { - //character to number, we assume the character can convert to number! + // One hex character represents the state of 4 successive pixels if(*map != 0x0A) { - if(*map <= 0x39) a= *map - 0x30; - else a= *map - 0x37; + if (*map <= '9') a= *map - '0'; + else if (*map <= 'F') a= *map - 'A' + 10; + else if (*map <= 'f') a= *map - 'a' + 10; map++; - if(*map <= 0x39) b= *map - 0x30; - else b= *map - 0x37; + if (*map <= '9') b= *map - '0'; + else if (*map <= 'F') b= *map - 'A' + 10; + else if (*map <= 'f') b= *map - 'a' + 10; *code++ = (a << 4) | b; len++; @@ -108,7 +112,7 @@ static u32 hatoi(char *string) /* * example * -* STARTCHAR 2264 +* STARTCHAR <arbitrary number or name> * ENCODING 8804 * SWIDTH 840 0 * DWIDTH 14 0 @@ -202,8 +206,17 @@ static int parse_bdf(char *filename, u32 start, u32 span, struct bdflibinfo *bdf pt += 6; ret= atoi(pt); - bdflibinfop -> start= start; - bdflibinfop -> span= span; + if (method == 1) + bdflibinfop -> start= start; + switch (method) { + case 0: + default: + bdflibinfop -> span= span + start; + break; + case 1: + bdflibinfop -> span= span; + break; + } //construct bdf font information bdffontp= (struct bdffont*)malloc(span * sizeof(struct bdffont)); @@ -241,14 +254,7 @@ static int parse_bdf(char *filename, u32 start, u32 span, struct bdflibinfo *bdf } if(!(strncasecmp(string, "STARTCHAR ", 10))) { - i= hatoi(pt +10); - if(i < start) continue; - else if(i < end) break; - else //Not found the start - { - ret= -7; - goto parse_bdf_error; - } + break; } } @@ -266,7 +272,7 @@ static int parse_bdf(char *filename, u32 start, u32 span, struct bdflibinfo *bdf pt= string + 9; index= atoi(pt); - if(index >= end) break; + if(index < start || index >= end) break; if(method == 0) i= index; else if(method == 1) i= index-start; @@ -534,15 +540,15 @@ int BDF_font_init(void) fonts_max_height= 0; #ifndef HAVE_ODF - sprintf(tmp_path, "%s/%s", main_path, BDF_VERDANA); - err= parse_bdf(tmp_path, 0, 128, &bdflib_info[0], 0); + sprintf(tmp_path, "%s/%s", main_path, BDF_PICTOCHAT); + err= parse_bdf(tmp_path, 32 /* from SPACE */, 8564 /* to one past the last character, "DOWNWARDS ARROW" */, &bdflib_info[0], 1); if(err < 0) { printf("BDF 0 initial error: %d\n", err); return -1; } #else - sprintf(tmp_path, "%s/%s", main_path, ODF_VERDANA); + sprintf(tmp_path, "%s/%s", main_path, ODF_PICTOCHAT); err= init_from_odf(tmp_path, &bdflib_info[0]); if(err < 0) { @@ -556,7 +562,7 @@ int BDF_font_init(void) fonts_max_height = bdflib_info[0].height; #ifdef DUMP_ODF - sprintf(tmp_path, "%s/%s", main_path, BDF_VERDANA); + sprintf(tmp_path, "%s/%s", main_path, BDF_PICTOCHAT); err= dump2odf(tmp_path, &bdflib_info[0]); if(err < 0) { @@ -613,7 +619,7 @@ void BDF_font_release(void) } } -/*----------------------------------------------------------------------------- +/*---------------------------------------------------------------------------- //16-bit color // Unicode Character // back is background, 0x8000 is transparence, other are visable colors @@ -626,26 +632,25 @@ u32 BDF_render16_ucs(void* screen_address, u32 screen_w, u32 v_align, u32 back, unsigned char cc; struct bdffont *bdffontp; - if(ch < 128) - { - bdffontp= bdflib_info[0].fonts; - fonts_height= bdflib_info[0].height; - } - else if(bdflib_info[1].fonts != NULL) - { - k= bdflib_info[1].start; - m= k + bdflib_info[1].span; - if(ch >= k && ch < m) - { + int font_num; + bool found = 0; + for (font_num = 0; font_num < BDF_LIB_NUM && !found; font_num++) { + if(bdflib_info[font_num].fonts != NULL) + { + k = bdflib_info[font_num].start; + if (ch < k) + continue; + m = k + bdflib_info[font_num].span; + if (ch >= m) + continue; ch -= k; - bdffontp= bdflib_info[1].fonts; - fonts_height= bdflib_info[0].height; - } - else - return 8; - } - else - return 8; + bdffontp= bdflib_info[font_num].fonts; + fonts_height= bdflib_info[font_num].height; + found = 1; + } + } + if (!found) + return 8; // the width of an undefined character, not an error code width= bdffontp[ch].dwidth >> 16; ret= width; @@ -715,6 +720,27 @@ u32 BDF_render16_ucs(void* screen_address, u32 screen_w, u32 v_align, u32 back, return ret; } +/* Returns the width, in pixels, of a character given its UCS-16 codepoint. */ +u32 BDF_width16_ucs(u16 ch) +{ + u32 k, ret; + + int font_num; + for (font_num = 0; font_num < BDF_LIB_NUM; font_num++) { + if(bdflib_info[font_num].fonts != NULL) + { + k = bdflib_info[font_num].start; + if (ch < k) + continue; + if (ch > k + bdflib_info[font_num].span) + continue; + ch -= k; + return bdflib_info[font_num].fonts[ch].dwidth >> 16; + } + } + return 8; // the width of an undefined character, not an error code +} + /*----------------------------------------------------------------------------- //16-bit color // ASCII Character @@ -837,101 +863,101 @@ void BDF_render_string(void* screen_address, u32 x, u32 y, u32 back, u32 front, /*----------------------------------------------------------------------------- ------------------------------------------------------------------------------*/ -char* utf8decode(char *utf8, u16 *ucs)
-{
- unsigned char c = *utf8++;
- unsigned long code;
- int tail = 0;
-
- if ((c <= 0x7f) || (c >= 0xc2)) {
- /* Start of new character. */
- if (c < 0x80) { /* U-00000000 - U-0000007F, 1 byte */
- code = c;
- } else if (c < 0xe0) { /* U-00000080 - U-000007FF, 2 bytes */
- tail = 1;
- code = c & 0x1f;
- } else if (c < 0xf0) { /* U-00000800 - U-0000FFFF, 3 bytes */
- tail = 2;
- code = c & 0x0f;
- } else if (c < 0xf5) { /* U-00010000 - U-001FFFFF, 4 bytes */
- tail = 3;
- code = c & 0x07;
- } else {
- /* Invalid size. */
- code = 0;
- }
-
- while (tail-- && ((c = *utf8++) != 0)) {
- if ((c & 0xc0) == 0x80) {
- /* Valid continuation character. */
- code = (code << 6) | (c & 0x3f);
-
- } else {
- /* Invalid continuation char */
- code = 0xfffd;
- utf8--;
- break;
- }
- }
- } else {
- /* Invalid UTF-8 char */
- code = 0;
- }
- /* currently we don't support chars above U-FFFF */
- *ucs = (code < 0x10000) ? code : 0;
- return utf8;
-}
-
-static u8 utf8_ucs2(const char *utf8, u16 *ucs)
+char* utf8decode(char *utf8, u16 *ucs) +{ + unsigned char c = *utf8++; + unsigned long code; + int tail = 0; + + if ((c <= 0x7f) || (c >= 0xc2)) { + /* Start of new character. */ + if (c < 0x80) { /* U-00000000 - U-0000007F, 1 byte */ + code = c; + } else if (c < 0xe0) { /* U-00000080 - U-000007FF, 2 bytes */ + tail = 1; + code = c & 0x1f; + } else if (c < 0xf0) { /* U-00000800 - U-0000FFFF, 3 bytes */ + tail = 2; + code = c & 0x0f; + } else if (c < 0xf5) { /* U-00010000 - U-001FFFFF, 4 bytes */ + tail = 3; + code = c & 0x07; + } else { + /* Invalid size. */ + code = 0; + } + + while (tail-- && ((c = *utf8++) != 0)) { + if ((c & 0xc0) == 0x80) { + /* Valid continuation character. */ + code = (code << 6) | (c & 0x3f); + + } else { + /* Invalid continuation char */ + code = 0xfffd; + utf8--; + break; + } + } + } else { + /* Invalid UTF-8 char */ + code = 0; + } + /* currently we don't support chars above U-FFFF */ + *ucs = (code < 0x10000) ? code : 0; + return utf8; +} + +static u8 utf8_ucs2(const char *utf8, u16 *ucs) { char *pt = (char*)utf8; -
- while(*pt !='\0')
- {
- pt = utf8decode(pt, ucs++);
- }
- *ucs = '\0';
- return 0;
-}
-
-static u32 ucslen(const u16 *ucs)
-{
+ + while(*pt !='\0') + { + pt = utf8decode(pt, ucs++); + } + *ucs = '\0'; + return 0; +} + +static u32 ucslen(const u16 *ucs) +{ u32 len = 0; -
- while(ucs[len] != '\0')
- len++;
- return len;
+ + while(ucs[len] != '\0') + len++; + return len; } unsigned char* skip_utf8_unit(unsigned char* utf8, unsigned int num) { while(num--) { - unsigned char c = *utf8++;
- int tail = 0;
- if ((c <= 0x7f) || (c >= 0xc2)) {
- /* Start of new character. */
- if (c < 0x80) { /* U-00000000 - U-0000007F, 1 byte */
- } else if (c < 0xe0) { /* U-00000080 - U-000007FF, 2 bytes */
- tail = 1;
- } else if (c < 0xf0) { /* U-00000800 - U-0000FFFF, 3 bytes */
- tail = 2;
- } else if (c < 0xf5) { /* U-00010000 - U-001FFFFF, 4 bytes */
- tail = 3;
- } else { /* Invalid size. */
- }
-
- while (tail-- && ((c = *utf8++) != 0)) {
- if ((c & 0xc0) != 0x80) {
- /* Invalid continuation char */
- utf8--;
- break;
- }
- }
+ unsigned char c = *utf8++; + int tail = 0; + if ((c <= 0x7f) || (c >= 0xc2)) { + /* Start of new character. */ + if (c < 0x80) { /* U-00000000 - U-0000007F, 1 byte */ + } else if (c < 0xe0) { /* U-00000080 - U-000007FF, 2 bytes */ + tail = 1; + } else if (c < 0xf0) { /* U-00000800 - U-0000FFFF, 3 bytes */ + tail = 2; + } else if (c < 0xf5) { /* U-00010000 - U-001FFFFF, 4 bytes */ + tail = 3; + } else { /* Invalid size. */ + } + + while (tail-- && ((c = *utf8++) != 0)) { + if ((c & 0xc0) != 0x80) { + /* Invalid continuation char */ + utf8--; + break; + } + } } } - /* currently we don't support chars above U-FFFF */
+ /* currently we don't support chars above U-FFFF */ return utf8; } @@ -971,10 +997,9 @@ void BDF_render_mix(void* screen_address, u32 screen_w, u32 x, u32 y, u32 v_alig continue; } - if(unicode < 128) - cmp = bdf_fontp[0][unicode].dwidth>>16; - else if(unicode >= start && unicode < end) - cmp = bdf_fontp[1][unicode -start].dwidth>>16; + /* If the text would go beyond the end of the line, go back to the + * start instead. */ + cmp = BDF_width16_ucs(unicode); if((screenp+cmp) >= line_start) { @@ -1074,10 +1099,7 @@ u32 BDF_cut_unicode(u16 *unicodes, u32 len, u32 width, u32 direction) while(len > 0) { unicode= unicodes[i]; - if(unicode < 128) - xw += bdf_fontp[0][unicode].dwidth>>16; - else if(unicode >= start && unicode < end) - xw += bdf_fontp[1][unicode -start].dwidth>>16; + xw += BDF_width16_ucs(unicode); if(xw >= width) break; i += direction; @@ -1096,10 +1118,7 @@ u32 BDF_cut_unicode(u16 *unicodes, u32 len, u32 width, u32 direction) while(len-- > 0) { unicode= unicodes[i]; - if(unicode < 128) - xw += bdf_fontp[0][unicode].dwidth>>16; - else if(unicode >= start && unicode < end) - xw += bdf_fontp[1][unicode -start].dwidth>>16; + xw += BDF_width16_ucs(unicode); i += direction; } diff --git a/source/nds/cheats3.cpp b/source/nds/cheats3.cpp deleted file mode 100644 index bdb5545..0000000 --- a/source/nds/cheats3.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/* cheats3.cpp - * - * Copyright (C) 2010 dking <dking024@gmail.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licens e as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <stdio.h> -#include <ctype.h> -#include <string.h> -#include "snes9x.h" -#include "cheats.h" -#include "memmap.h" -#include "gcheat.h" - -extern SCheatData Cheat; - -int S9xAddCheat_ex (unsigned int address, unsigned char* cheat_dat, unsigned int cheat_dat_len, - unsigned int cheat_cell_num, unsigned int part_id, unsigned int str_num) -{ - if(cheat_cell_num < MAX_CHEATS_T) - { - Cheat.c[cheat_cell_num].address = address; - Cheat.c[cheat_cell_num].enabled = FALSE; - - if(cheat_dat_len > 1) - memcpy(Cheat.c[cheat_cell_num].name, cheat_dat, cheat_dat_len); - else - Cheat.c[cheat_cell_num].byte = cheat_dat[0]; - - Cheat.c[cheat_cell_num].total_part = 0; //default are sub-part - Cheat.c[cheat_cell_num].part_id = part_id; - Cheat.c[cheat_cell_num].part_len = cheat_dat_len; - Cheat.c[cheat_cell_num].cheat_type = 0; //default are sub-part - Cheat.c[cheat_cell_num].name_id = str_num; - - return 0; - } - - return -1; -} - -void S9xAddCheat_ov(unsigned int cheat_cell_num, unsigned int total_part) -{ - if(cheat_cell_num < MAX_CHEATS_T) - { - Cheat.c[cheat_cell_num].total_part = total_part; //default are sub-part - Cheat.c[cheat_cell_num].cheat_type = 0x80; - } -} - -static unsigned int S9xGetSub_id(unsigned int start, unsigned int sub_part) -{ - unsigned int i, m, n; - - if(0 == sub_part) - return start; - - if((start+1) >= g_cheat_cell_num) - return start; - - m = 0; - for(i= start; i < g_cheat_cell_num; ) - { - n = Cheat.c[i].total_part; - i += n; - m += 1; - if(m == sub_part) break; - } - - return i; -} - -unsigned int S9xGetCheat_nameid(unsigned int start, unsigned int part) -{ -#if 0 - unsigned int m, n, i; - unsigned int ret; - unsigned int cell_num; - - cell_num = g_cheat_cell_num; - - ret = Cheat.c[start].name_id; - if((start+1) >= cell_num) - return ret; - - m = 0; - for(i = start; i < cell_num; ) { - if(m == part) break; - n = Cheat.c[i].total_part; - i += n; - m += 1; - } - - if(i < cell_num) - ret = Cheat.c[i].name_id; - - return ret; -#else - unsigned int i; - - i = S9xGetSub_id(start, part); - return Cheat.c[i].name_id; -#endif -} - -void S9xCheat_switch(unsigned int start, unsigned int sub_part, unsigned int enable) -{ - unsigned int i, m, n; - - if((start+1) >= g_cheat_cell_num) - return; - - i = S9xGetSub_id(start, sub_part); - m = Cheat.c[i].total_part; - for(n = 0; n < m; n++) - Cheat.c[i+n].enabled = enable; -} - -static inline void S9xApplyCheat_ex(unsigned int start, unsigned int num) -{ - unsigned int i, m; - unsigned int address, len; - - for(i = 0; i < num; i++) - { - address = Cheat.c[start+i].address; - len = Cheat.c[start+i].part_len; - - int block = (address >> MEMMAP_SHIFT) & MEMMAP_MASK; - unsigned char *ptr = Memory.Map [block]; - - if(1 == len) - { - if (ptr >= (uint8 *) CMemory::MAP_LAST) - *(ptr + (address & 0xffff)) = Cheat.c[start+i].byte; - else - S9xSetByte (Cheat.c[start+i].byte, address); - } - else - { - for(m= 0; m < len; m++) - { - if (ptr >= (uint8 *) CMemory::MAP_LAST) - *(ptr + (address & 0xffff)) = Cheat.c[start+i].name[m]; - else - S9xSetByte (Cheat.c[start+i].name[m], address); - } - } - } -} - -void S9xApplyCheats_ex(void) -{ - unsigned int i, m, n; - - if (Settings.ApplyCheats) - { - for(i= 0; i < g_cheat_cell_num; i++) - { - m = Cheat.c[i].total_part; - if(Cheat.c[i].enabled) - S9xApplyCheat_ex(i, m); - i += m; - } - } -} - -#if 1 -extern "C" void dump_mem(unsigned char* addr, unsigned int len); - -void S9x_dumpcheat(unsigned int id) -{ - cprintf("\nid %d------------\n", id); - cprintf("total %d; part %d\n", Cheat.c[id].total_part, Cheat.c[id].part_id); - cprintf("address: %08x; data: %d\n", Cheat.c[id].address, Cheat.c[id].part_len); - if(Cheat.c[id].part_len == 1) - cprintf("data: %02x\n", Cheat.c[id].byte); - else - dump_mem((unsigned char*)Cheat.c[id].name, Cheat.c[id].part_len); - cprintf(" ------\n"); -} -#endif - -void S9xCheat_Disable(void) -{ - Settings.ApplyCheats = FALSE; -} - -void S9xCheat_Enable(void) -{ - Settings.ApplyCheats = TRUE; -} - diff --git a/source/nds/draw.c b/source/nds/draw.c index 6223c6e..2a9e440 100644 --- a/source/nds/draw.c +++ b/source/nds/draw.c @@ -22,6 +22,7 @@ * draw.cpp * basic program to draw some graphic ******************************************************************************/ +#include "port.h" #include <string.h> #include <stdio.h> #include "ds2_malloc.h" @@ -810,7 +811,7 @@ u32 draw_yesno_dialog(enum SCREEN_ID screen, u32 sy, char *yes, char *no) // draw_string_vcenter(screen_address, i+1, sy+1, box_width, COLOR_WHITE, no); draw_string_vcenter((unsigned short*)screen_addr, 138, 130, 58, COLOR_WHITE, no); - ds2_flipScreen(screen, 1); + ds2_flipScreen(screen, 2); gui_action_type gui_action = CURSOR_NONE; while((gui_action != CURSOR_SELECT) && (gui_action != CURSOR_BACK)) @@ -859,7 +860,7 @@ void init_progress(enum SCREEN_ID screen, u32 total, char *text) drawboxfill((unsigned short*)screen_addr, progress_sx, progress_sy, progress_ex, progress_ey, COLOR16(15, 15, 15)); - ds2_flipScreen(_progress_screen_id, 1); + ds2_flipScreen(_progress_screen_id, 2); } // update progress bar @@ -882,7 +883,7 @@ void update_progress(void) drawboxfill(screen_addr, progress_sx, progress_sy, progress_sx+width, progress_ey, COLOR16(30, 19, 7)); - ds2_flipScreen(_progress_screen_id, 1); + ds2_flipScreen(_progress_screen_id, 2); } // display progress string @@ -907,7 +908,7 @@ void show_progress(char *text) // if (text[0] != '\0') // print_string_center(progress_sy - 21, COLOR_PROGRESS_TEXT, COLOR_DIALOG, text); - ds2_flipScreen(_progress_screen_id, 1); + ds2_flipScreen(_progress_screen_id, 2); // OSTimeDly(progress_wait); mdelay(500); @@ -1273,57 +1274,11 @@ void show_log(void* screen_addr) } /*************************************************************/ -extern const unsigned char font_map[128][8]; - -//font size 8*8 -static inline void drawfont(unsigned short *addr, unsigned short f_color, unsigned short b_color, unsigned char ch) -{ - unsigned char *dot_map; - unsigned int j, k; - unsigned char dot; - unsigned short *dst; - - dot_map = (unsigned char*)font_map[ch&0x7F]; - - for(j= 0; j < 8; j++) - { - dot = *dot_map++; - dst = addr + j*SCREEN_WIDTH; - for(k = 0; k < 8; k++) - *dst++ = (dot & (0x80>>k)) ? f_color : b_color; - } -} - -static void drawstring(unsigned int x, unsigned int y, enum SCREEN_ID screen, char *string, - unsigned short f_color, unsigned short b_color) -{ - unsigned short *scr_addr, *dst; - - if(screen & UP_MASK) - scr_addr = up_screen_addr; - else - scr_addr = down_screen_addr; - - if(x>= 32 || y>= 24) return; - - while(*string) - { - dst = scr_addr + (y*8)*SCREEN_WIDTH + x*8; - drawfont(dst, f_color, b_color, *string++); - - x += 1; - if(x>= 32) - { - x = 0; - y+= 1; - if(y >= 24) break; - } - } -} - void err_msg(enum SCREEN_ID screen, char *msg) { - drawstring(0, 0, screen, msg, COLOR16(16, 16, 16), COLOR16(0, 0, 0)); + // A wild console appeared! + ConsoleInit(RGB15(31, 31, 31), RGB15(0, 0, 0), UP_SCREEN, 512); + printf(msg); } /* @@ -1372,5 +1327,3 @@ void blit_to_screen(void* screen_addr, u16 *src, u32 w, u32 h, u32 dest_x, u32 d *dst++ = *src++; } } - - diff --git a/source/nds/draw.h b/source/nds/draw.h index 3bdf5be..f40aa23 100644 --- a/source/nds/draw.h +++ b/source/nds/draw.h @@ -17,8 +17,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __DRAW_H__
-#define __DRAW_H__
+#ifndef __DRAW_H__ +#define __DRAW_H__ #include "ds2_types.h" #include "ds2io.h" @@ -27,12 +27,12 @@ #define NDS_SCREEN_WIDTH 256 #define NDS_SCREEN_HEIGHT 192 #define NDS_SCREEN_SIZE (NDS_SCREEN_WIDTH*NDS_SCREEN_HEIGHT) -
-#define COLOR16(red, green, blue) ((blue << 10) | (green << 5) | red)
-#define GET_R16(color) (color & 0x1f)
-#define GET_G16(color) ((color >> 5) & 0x1f)
-#define GET_B16(color) ((color >> 10)& 0x1f)
-#define COLOR32(red, green, blue) (0xff000000 | ((blue & 0xff) << 16) | ((green & 0xff) << 8) | (red & 0xff))
+ +#define COLOR16(red, green, blue) ((blue << 10) | (green << 5) | red) +#define GET_R16(color) (color & 0x1f) +#define GET_G16(color) ((color >> 5) & 0x1f) +#define GET_B16(color) ((color >> 10)& 0x1f) +#define COLOR32(red, green, blue) (0xff000000 | ((blue & 0xff) << 16) | ((green & 0xff) << 8) | (red & 0xff)) #define RGB24_15(pixel) ((((*pixel) & 0xF8) << 7) |\ (((*(pixel+1)) & 0xF8) << 2) |\ @@ -44,36 +44,36 @@ #define PRINT_STRING(screen, str, fg_color, x, y) \ - BDF_render_string(screen, x, y, COLOR_TRANS, fg_color, str) \ + BDF_render_mix(screen, SCREEN_WIDTH, x, y, 0, COLOR_TRANS, fg_color, str) \ #define PRINT_STRING_SHADOW(screen, str, fg_color, x, y) \ - BDF_render_string(screen, x+1, y+1, 0, 0, str); \ - BDF_render_string(screen, x, y, 0, 0, str) \ + BDF_render_mix(screen, SCREEN_WIDTH, x+1, y+1, 0, 0, 0, str); \ + BDF_render_mix(screen, SCREEN_WIDTH, x, y, 0, 0, 0, str) \ #define PRINT_STRING_BG(screen, str, fg_color, bg_color, x, y) \ - BDF_render_string(screen, x, y, bg_color, fg_color, str) \ + BDF_render_mix(screen, SCREEN_WIDTH, x, y, 0, bg_color, fg_color, str) \ + +// #define PRINT_STRING_BG_UTF8(screen, utf8, fg_color, bg_color, x, y) \ +// BDF_render_mix(screen, SCREEN_WIDTH, x, y, 0, bg_color, fg_color, utf8) \ -#define PRINT_STRING_BG_UTF8(screen, utf8, fg_color, bg_color, x, y) \ - BDF_render_mix(screen, SCREEN_WIDTH, x, y, 0, bg_color, fg_color, utf8) \ -
//colors -#define COLOR_TRANS COLOR16(31, 31, 63)
-#define COLOR_WHITE COLOR16(31, 31, 31)
-#define COLOR_BLACK COLOR16( 0, 0, 0)
-#define COLOR_TEXT COLOR16(31, 31, 31)
-#define COLOR_PROGRESS_TEXT COLOR16( 0, 0, 0)
-#define COLOR_PROGRESS_BAR COLOR16(15, 15, 15)
-#define COLOR_ERROR COLOR16(31, 0, 0)
-#define COLOR_BG COLOR16(2, 4, 10)
-#define COLOR_BG32 COLOR32(2*8, 4*8, 10*8)
-#define COLOR_ROM_INFO COLOR16(22, 18, 26)
-#define COLOR_ACTIVE_ITEM COLOR16(31, 31, 31)
-#define COLOR_INACTIVE_ITEM COLOR16(13, 20, 18)
-#define COLOR_HELP_TEXT COLOR16(16, 20, 24)
-#define COLOR_DIALOG COLOR16(31, 31, 31)
-#define COLOR_DIALOG_SHADOW COLOR16( 0, 2, 8)
-#define COLOR_FRAME COLOR16( 0, 0, 0)
+#define COLOR_TRANS COLOR16(31, 31, 63) +#define COLOR_WHITE COLOR16(31, 31, 31) +#define COLOR_BLACK COLOR16( 0, 0, 0) +#define COLOR_TEXT COLOR16(31, 31, 31) +#define COLOR_PROGRESS_TEXT COLOR16( 0, 0, 0) +#define COLOR_PROGRESS_BAR COLOR16(15, 15, 15) +#define COLOR_ERROR COLOR16(31, 0, 0) +#define COLOR_BG COLOR16(2, 4, 10) +#define COLOR_BG32 COLOR32(2*8, 4*8, 10*8) +#define COLOR_ROM_INFO COLOR16(22, 18, 26) +#define COLOR_ACTIVE_ITEM COLOR16(31, 31, 31) +#define COLOR_INACTIVE_ITEM COLOR16(13, 20, 18) +#define COLOR_HELP_TEXT COLOR16(16, 20, 24) +#define COLOR_DIALOG COLOR16(31, 31, 31) +#define COLOR_DIALOG_SHADOW COLOR16( 0, 2, 8) +#define COLOR_FRAME COLOR16( 0, 0, 0) #define COLOR_YESNO_TEXT COLOR16( 0, 0, 0) #define COLOR_GREEN COLOR16( 0, 31, 0 ) #define COLOR_GREEN1 COLOR16( 0, 24, 0 ) @@ -81,14 +81,14 @@ #define COLOR_GREEN3 COLOR16( 0, 12, 0 ) #define COLOR_GREEN4 COLOR16( 0, 6, 0 ) #define COLOR_RED COLOR16( 31, 0, 0 ) -#define COLOR_MSSG COLOR16( 16, 8, 29)
-/******************************************************************************
- *
+#define COLOR_MSSG COLOR16( 16, 8, 29) +/****************************************************************************** + * ******************************************************************************/ #ifdef __cplusplus extern "C" { #endif -
+ struct background{ char bgname[128]; char bgbuffer[256*192*2]; @@ -151,17 +151,17 @@ extern struct gui_iconlist gui_icon_list[]; #define ICON_CHTFILE gui_icon_list[38] #define ICON_MSG gui_icon_list[39] #define ICON_BUTTON gui_icon_list[40] -
-/******************************************************************************
- *
- ******************************************************************************/
+ +/****************************************************************************** + * + ******************************************************************************/ extern void print_string_center(void* screen_addr, u32 sy, u32 color, u32 bg_color, char *str); -extern void print_string_shadow_center(void* screen_addr, u32 sy, u32 color, char *str);
-extern void hline(u32 sx, u32 ex, u32 y, u32 color);
-extern void hline_alpha(u32 sx, u32 ex, u32 y, u32 color, u32 alpha);
-extern void vline(u32 x, u32 sy, u32 ey, u32 color);
-extern void vline_alpha(u32 x, u32 sy, u32 ey, u32 color, u32 alpha);
-extern void drawbox(void* screen_address, u32 sx, u32 sy, u32 ex, u32 ey, u32 color);
+extern void print_string_shadow_center(void* screen_addr, u32 sy, u32 color, char *str); +extern void hline(u32 sx, u32 ex, u32 y, u32 color); +extern void hline_alpha(u32 sx, u32 ex, u32 y, u32 color, u32 alpha); +extern void vline(u32 x, u32 sy, u32 ey, u32 color); +extern void vline_alpha(u32 x, u32 sy, u32 ey, u32 color, u32 alpha); +extern void drawbox(void* screen_address, u32 sx, u32 sy, u32 ex, u32 ey, u32 color); extern void drawboxfill(void* screen_address, u32 sx, u32 sy, u32 ex, u32 ey, u32 color); extern void draw_selitem(void* screen_address, u32 x, u32 y, u32 color, u32 active); extern void draw_message(void* screen_address, u16 *screen_bg, u32 sx, u32 sy, u32 ex, u32 ey, @@ -173,19 +173,19 @@ extern void draw_string_vcenter(void* screen_address, u32 sx, u32 sy, u32 width, extern u32 draw_hscroll_init(void* screen_address, u32 sx, u32 sy, u32 width, u32 color_bg, u32 color_fg, char *string); extern u32 draw_hscroll(u32 index, s32 scroll_val); -extern void draw_hscroll_over(u32 index);
-extern void boxfill_alpha(u32 sx, u32 sy, u32 ex, u32 ey, u32 color, u32 alpha);
-extern void init_progress(enum SCREEN_ID screen, u32 total, char *text);
-extern void update_progress(void);
-extern void show_progress(char *text);
-extern void scrollbar(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey, u32 all, u32 view, u32 now);
+extern void draw_hscroll_over(u32 index); +extern void boxfill_alpha(u32 sx, u32 sy, u32 ex, u32 ey, u32 color, u32 alpha); +extern void init_progress(enum SCREEN_ID screen, u32 total, char *text); +extern void update_progress(void); +extern void show_progress(char *text); +extern void scrollbar(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey, u32 all, u32 view, u32 now); extern u32 yesno_dialog(char *text); -extern u32 draw_yesno_dialog(enum SCREEN_ID screen, u32 sy, char *yes, char *no);
-extern void msg_screen_init(const char *title);
-extern void msg_screen_draw();
-extern void msg_printf(const char *text, ...);
-extern void msg_screen_clear(void);
-extern void msg_set_text_color(u32 color);
+extern u32 draw_yesno_dialog(enum SCREEN_ID screen, u32 sy, char *yes, char *no); +extern void msg_screen_init(const char *title); +extern void msg_screen_draw(); +extern void msg_printf(const char *text, ...); +extern void msg_screen_clear(void); +extern void msg_set_text_color(u32 color); extern int icon_init(u32 language_id); extern int gui_change_icon(u32 language_id); @@ -203,5 +203,5 @@ extern void blit_to_screen(void* screen_addr, u16 *src, u32 w, u32 h, u32 dest_x } #endif -#endif //__DRAW_H__
-
+#endif //__DRAW_H__ + diff --git a/source/nds/ds2_main.c b/source/nds/ds2_main.c index 710215b..7229727 100644 --- a/source/nds/ds2_main.c +++ b/source/nds/ds2_main.c @@ -15,19 +15,20 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */
-
-#include <stdio.h>
-#include "console.h"
-#include "fs_api.h"
+ */ + +#include <stdio.h> +#include "console.h" +#include "fs_api.h" #include "ds2io.h" #include "ds2_timer.h" #include "ds2_malloc.h" -
-#define BLACK_COLOR RGB15(0, 0, 0)
-#define WHITE_COLOR RGB15(31, 31, 31)
-
-extern int sfc_main (int argc, char **argv);
+#include "ds2sound.h" + +#define BLACK_COLOR RGB15(0, 0, 0) +#define WHITE_COLOR RGB15(31, 31, 31) + +extern int sfc_main (int argc, char **argv); #if 0 void ddump_mem(unsigned char* addr, unsigned int len) @@ -42,24 +43,22 @@ void ddump_mem(unsigned char* addr, unsigned int len) } #endif +void ds2_main(void) +{ + int err; + ds2_setCPUclocklevel(13); + //Initial video and audio and other input and output + err = ds2io_initb(DS2_BUFFER_SIZE, SND_SAMPLE_RATE, 0, 0); + if(err) goto _failure; -
-void ds2_main(void)
-{
- int err;
-ds2_setCPUclocklevel(13);
- //Initial video and audio and other input and output
- err = ds2io_initb(512, 22050, 0, 0);
- if(err) goto _failure;
+ //Initial file system + err = fat_init(); + if(err) goto _failure; - //Initial file system
- err = fat_init();
- if(err) goto _failure;
+ //go to user main funtion + sfc_main (0, 0); - //go to user main funtion
- sfc_main (0, 0);
-
_failure: - ds2_plug_exit();
-}
-
+ ds2_plug_exit(); +} + diff --git a/source/nds/ds2sound.h b/source/nds/ds2sound.h new file mode 100644 index 0000000..cf37f6f --- /dev/null +++ b/source/nds/ds2sound.h @@ -0,0 +1,24 @@ +// The sound buffer sizes used on the DS2's side, for each value of +// Settings.SoundPlaybackRate. +#define DS2_BUFFER_SIZE_1 256 +#define DS2_BUFFER_SIZE_2 256 +#define DS2_BUFFER_SIZE_3 256 +#define DS2_BUFFER_SIZE_4 512 +#define DS2_BUFFER_SIZE_5 512 +#define DS2_BUFFER_SIZE_6 1024 +#define DS2_BUFFER_SIZE_7 1024 + +// The sampling rate for the sound, in Hz, for each value of +// Settings.SoundPlaybackRate. +#define SND_SAMPLE_RATE_1 8000 +#define SND_SAMPLE_RATE_2 11025 +#define SND_SAMPLE_RATE_3 16000 +#define SND_SAMPLE_RATE_4 22050 +#define SND_SAMPLE_RATE_5 32000 +#define SND_SAMPLE_RATE_6 44100 +#define SND_SAMPLE_RATE_7 48000 + +// Settings in use. The number should match in all three settings. +#define DS2_BUFFER_SIZE DS2_BUFFER_SIZE_7 +#define SND_SAMPLE_RATE SND_SAMPLE_RATE_7 +#define SNES9X_SRATE_ID 7 diff --git a/source/nds/entry.cpp b/source/nds/entry.cpp index d3dbae3..33566d5 100644 --- a/source/nds/entry.cpp +++ b/source/nds/entry.cpp @@ -20,6 +20,7 @@ #include "draw.h" #include "gui.h" +#include "ds2sound.h" void S9xProcessSound (unsigned int); @@ -90,13 +91,15 @@ void S9xParseDisplayArg (char **argv, int &ind, int) void S9xExit () { + ds2_setCPUclocklevel(13); // Crank it up to exit quickly if(Settings.SPC7110) (*CleanUp7110)(); S9xSetSoundMute (TRUE); S9xDeinitDisplay (); Memory.SaveSRAM (S9xGetFilename (".srm")); - S9xSaveCheatFile (S9xGetFilename (".cht")); + // S9xSaveCheatFile (S9xGetFilename (".chb")); // cheat binary file + // Do this when loading a cheat file! Memory.Deinit (); S9xDeinitAPU (); @@ -172,12 +175,10 @@ bool8 S9xDeinitUpdate (int Width, int Height, bool8 /*sixteen_bit*/) break; } - -// memcpy(up_screen_addr, GFX.Screen, 256*192*2); -// memcpy(down_screen_addr, GFX.Screen+256*192*2, 256*(224-192)*2); - - ds2_flipScreen(UP_SCREEN, 0); -// ds2_flipScreen(DOWN_SCREEN, 0); + ds2_flipScreen(UP_SCREEN, UP_SCREEN_UPDATE_METHOD); + // A problem with update method 1 (wait, double buffer) means that, after + // about 15 minutes of play time, the screen starts to half-redraw every + // frame. With update method 0, this is mitigated. (Method 2 is too slow.) return (TRUE); } @@ -262,7 +263,6 @@ const char *S9xGetSnapshotDirectory () return ((const char*)DEFAULT_RTS_DIR); } - const char *S9xGetFilename (const char *ex) { static char filename [PATH_MAX + 1]; @@ -341,12 +341,10 @@ void game_disableAudio() { if( game_enable_audio == 1) { - Settings.APUEnabled = Settings.NextAPUEnabled = TRUE; S9xSetSoundMute (FALSE); } else { - Settings.APUEnabled = Settings.NextAPUEnabled = FALSE; S9xSetSoundMute (TRUE); } } @@ -360,9 +358,9 @@ void init_sfc_setting(void) Settings.JoystickEnabled = FALSE; #endif - Settings.SoundPlaybackRate = 4; //2 = 11025, 4 = 22050, 6 = 44100 + Settings.SoundPlaybackRate = SNES9X_SRATE_ID; // -> ds2sound.h for defs Settings.Stereo = TRUE; - Settings.SoundBufferSize = 0; + Settings.SoundBufferSize = DS2_BUFFER_SIZE; Settings.CyclesPercentage = 100; Settings.DisableSoundEcho = FALSE; //sound settings @@ -384,17 +382,20 @@ void init_sfc_setting(void) Settings.ControllerOption = SNES_JOYPAD; Settings.Transparency = TRUE; +#ifndef FOREVER_16_BIT Settings.SixteenBit = TRUE; +#endif Settings.SupportHiRes = FALSE; - Settings.NetPlay = FALSE; - Settings.ServerName [0] = 0; Settings.ThreadSound = FALSE; + Settings.SoundSync = TRUE; Settings.AutoSaveDelay = 0; #ifdef _NETPLAY_SUPPORT + Settings.NetPlay = FALSE; + Settings.ServerName [0] = 0; Settings.Port = NP_DEFAULT_PORT; #endif - Settings.ApplyCheats =FALSE; + Settings.ApplyCheats = TRUE; Settings.TurboMode = FALSE; Settings.TurboSkipFrames = 40; Settings.StretchScreenshots = 1; @@ -454,14 +455,13 @@ int load_gamepak(char* file) CPU.Flags = 0; S9xReset (); - mdelay(50); + // mdelay(50); // Delete this delay if (!Memory.LoadROM (file)) return -1; Memory.LoadSRAM (S9xGetFilename (".srm")); - mdelay(50); - //S9xLoadCheatFile (S9xGetFilename (".cht")); - S9xCheat_Disable(); + // mdelay(50); // Delete this delay + S9xLoadCheatFile (S9xGetFilename (".chb")); // cheat binary file, as opposed to text #ifdef _NETPLAY_SUPPORT if (strlen (Settings.ServerName) == 0) @@ -507,9 +507,7 @@ int load_gamepak(char* file) } */ - mdelay(50); - if (!Settings.APUEnabled) - S9xSetSoundMute (FALSE); + // mdelay(50); // Delete this delay return 0; } @@ -533,9 +531,6 @@ int sfc_main (int argc, char **argv) S9xInitSound (Settings.SoundPlaybackRate, Settings.Stereo, Settings.SoundBufferSize); - if (!Settings.APUEnabled) - S9xSetSoundMute (TRUE); - #ifdef GFX_MULTI_FORMAT // S9xSetRenderPixelFormat (RGB565); S9xSetRenderPixelFormat (BGR555); @@ -586,9 +581,9 @@ int sfc_main (int argc, char **argv) { if (!Settings.Paused #ifdef DEBUGGER - || (CPU.Flags & (DEBUG_MODE_FLAG | SINGLE_STEP_FLAG)) + || (CPU.Flags & (DEBUG_MODE_FLAG | SINGLE_STEP_FLAG) #endif - ) + ) S9xMainLoop (); @@ -602,7 +597,6 @@ int sfc_main (int argc, char **argv) if (Settings.Paused) { S9xSetSoundMute (TRUE); - mdelay(50); unsigned short screen[256*192]; copy_screen((void*)screen, up_screen_addr, 0, 0, 256, 192); @@ -769,28 +763,15 @@ void S9xSyncSpeed () #endif } -/* -* Open sound device -*/ -static int Rates[8] = -{ - 0, 8000, 11025, 16000, 22050, 32000, 44100, 48000 -}; - -static int BufferSizes [8] = -{ - 0, 256, 256, 256, 512, 512, 1024, 1024 -}; - bool8 S9xOpenSoundDevice (int mode, bool8 stereo, int buffer_size) { so.sixteen_bit = TRUE; so.stereo = stereo; - so.playback_rate = Rates[mode & 0x07]; + so.playback_rate = SND_SAMPLE_RATE; S9xSetPlaybackRate (so.playback_rate); if (buffer_size == 0) - buffer_size = BufferSizes [mode & 7]; + buffer_size = DS2_BUFFER_SIZE; if (buffer_size > MAX_BUFFER_SIZE / 4) buffer_size = MAX_BUFFER_SIZE / 4; @@ -873,7 +854,7 @@ void S9xProcessSound (unsigned int) { unsigned short *audiobuff; - if (!Settings.APUEnabled || so.mute_sound ) + if (so.mute_sound || !game_enable_audio) return; if(ds2_checkAudiobuff() > 4) @@ -938,7 +919,7 @@ void S9xProcessSound (unsigned int) // block_generate_sound = FALSE; unsigned short *dst_pt = audiobuff; - unsigned short *dst_pt1 = dst_pt + 512; + unsigned short *dst_pt1 = dst_pt + DS2_BUFFER_SIZE; /* Feed the samples to the soundcard until nothing is left */ for(;;) @@ -996,7 +977,7 @@ const unsigned int keymap[12] = { unsigned int S9xReadJoypad (int which1) { - struct key_buf inputdata;
+ struct key_buf inputdata; ds2_getrawInput(&inputdata); if(inputdata.key & KEY_TOUCH) //Active menu @@ -1013,7 +994,8 @@ unsigned int S9xReadJoypad (int which1) key |= (inputdata.key & (1<<i)) ? keymap[i] : 0; } - return (key | 0x80000000); + // return (key | 0x80000000); + return key; // ??? [Neb] } else return 0; diff --git a/source/nds/gcheat.c b/source/nds/gcheat.c index 062ce9d..d0ada43 100644 --- a/source/nds/gcheat.c +++ b/source/nds/gcheat.c @@ -1,9 +1,9 @@ /* gcheat.c * - * Copyright (C) 2010 dking <dking024@gmail.com> + * Copyright (C) 2012 GBAtemp user Nebuleon. * * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public Licens e as + * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * @@ -17,511 +17,113 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "port.h" #include "string.h" #include "fs_api.h" #include "ds2_malloc.h" #include "gcheat.h" #include "charsets.h" +#include "cheats.h" -#define MAX_SFCCHEAT_NAME 24 +extern struct SCheatData Cheat; - -//GCHEAT_STRUCT gcheat[MAX_CHEATS]; -unsigned int g_cheat_cell_num; -unsigned int g_cheat_num; -
-#define SKIP_SPACE(pt) while(' ' == *pt) pt++
- -static unsigned char* check_is_cht(unsigned char *str) -{ - unsigned char *pt, *pt1; - - if(*str == '\0') return NULL; - - pt = str; - while(*pt == ' ') pt++; //Skip leading space - if(*pt != '[') return NULL; //valid entry should be:[string] - - pt1 = strrchr(str, ']'); - if(pt1 == NULL) return NULL; - - while(*(--pt1) == ' '); - *(pt1+1) = '\0'; //Cut trailing space between string and ']' - - while(*(++pt) == ' '); //Cut space between '[' and string - - return pt; -} - -static unsigned int sscanf_hex_value(unsigned char* str, unsigned int *value) -{ - unsigned char *pt; - unsigned int tmp; - unsigned char ch; - unsigned int len; - - pt = str; - len = 0; - tmp = 0; - while(*pt && len < 8) - { - ch = *pt; - if(ch >= 'a' && ch <= 'f') ch = ch - 'a' + 0xa; - else if(ch >= 'A' && ch <= 'F') ch = ch - 'A' + 0xa; - else if(ch >= '0' && ch <= '9') ch = ch - '0'; - else if(ch == ' ') continue; - else break; - - tmp = (tmp << 4) | ch; - pt++; - len += 1; - } - - *value = tmp; - return len; -} - -/* -* Convert the src string to UTF8 coding dst string, and cut to length -*/ -int string2utf8(unsigned char *src, unsigned char* dst, unsigned int length) +// Reads a cheat text file in BSNES's format. +int NDSSFCLoadCheatFile(const char* filename) { - unsigned char *pt; - unsigned char ch; - unsigned short ucode; - unsigned int type; - unsigned int len; + FILE* fp = fopen(filename, "r"); + if (fp == NULL) + return -1; - len = 0; - type = 0; - pt = src; - while(*pt) + S9xDeleteCheats(); + + // The construction is "a","b","c" <newline>. + // a is ignored. In BSNES, it decides whether the code is enabled. + // b is a series of codes separated by +. Each of the codes is in the form + // accepted by the Game Genie, Pro Action Replay, or the GoldFinger. + // c is the cheat's description. + char line[256], code[24]; + char *description, *codes_ptr; + uint32 address; + uint8 byte; + uint8 bytes [3]; + bool8 sram; + uint8 num_bytes; + + while (fgets(line, sizeof(line), fp)) { - pt = utf8decode(pt, &ucode); - if(ucode < 0x4e00) { - if(ucode == 0 || ucode > 0x7F) { - type = 1; - break; - } - } else if(ucode > 0x9FCF) { - type = 1; - break; + char* ptr = &line[0]; + // Ignore a. + while (*ptr && *ptr != ',') + ptr++; + // If there was no comma, declare a bad file. + if (*ptr == '\0') { + fclose(fp); + return -2; } - else - len++; - - if(len >= 3) break; //There is enough UTF8, so it is, to save time(>_*) - } + *ptr++; // Past the comma + + if (*ptr && *ptr == '"') + ptr++; // Starting quote of b. + codes_ptr = ptr; // Save this for later. + while (*ptr && *ptr != ',') + ptr++; + // If there was no comma, declare a bad file. + if (*ptr == '\0') { + fclose(fp); + return -2; + } + *ptr = '\0'; // End the codes there + *ptr++; // Past the comma + + uint32 i = 0; + description = ptr; // Skip starting " in description + while (*description && *description == '"') + description++; + ptr = description; + while (*ptr && !(*ptr == '\r' || *ptr == '\n' || *ptr == '"') && i < MAX_SFCCHEAT_NAME - 1) { + ptr++; // Remove trailing newline/quote in description + i++; // Clip the cheat name to MAX_SFCCHEAT_NAME chars + } + *ptr = '\0'; - if(type == 0) //UTF8 - { - while(*src) - { - ch = *src++; - *dst++ = ch; + uint32 c; + // n is the number of cheat codes. Beware of MAX_CHEATS_T. - if(ch < 0x80) { - if(length > 1) length -= 1; - else break; - } else if (ch < 0xe0) { /* U-00000080 - U-000007FF, 2 bytes */ - if(length > 2) length -= 2; - else break;
- *dst++ = *src++;
- } else if (ch < 0xf0) { /* U-00000800 - U-0000FFFF, 3 bytes */ - if(length > 3) length -= 3; - else break; - *dst++ = *src++;
- *dst++ = *src++;
- } else if (ch < 0xf5) { /* U-00010000 - U-001FFFFF, 4 bytes */ - if(length > 4) length -= 4; - else break; - *dst++ = *src++;
- *dst++ = *src++; - *dst++ = *src++;
- } else {
- break;
+ // List of cheat codes having the same description. + ptr = codes_ptr; + while (*ptr && !(*ptr == ',' || *ptr == '"')) { + if (Cheat.num_cheats >= MAX_CHEATS_T) { + fclose(fp); + return 0; } - } - *dst = '\0'; - } - else //assume it is GBK code - { - //GBK to UTF8 - while(*src) - { - ch = *src; - if(ch < 0x80) - { - if(length > 1) length -= 1; - else break; - - *dst++= ch; - src ++; + i = 0; + while (*ptr && !(*ptr == '+' || *ptr == ',' || *ptr == '"') && i < sizeof(code) - 1) + code[i++] = *ptr++; + if (*ptr) + ptr++; // Go past the + , or " + code[i] = '\0'; + if (!S9xGameGenieToRaw (code, &address, &byte)) { + S9xAddCheat (FALSE, FALSE, address, byte); + strncpy (Cheat.c[Cheat.num_cheats - 1].name, description, MAX_SFCCHEAT_NAME); + } + else if (!S9xProActionReplayToRaw (code, &address, &byte)) { + S9xAddCheat (FALSE, FALSE, address, byte); + strncpy (Cheat.c[Cheat.num_cheats - 1].name, description, MAX_SFCCHEAT_NAME); } - else + else if (!S9xGoldFingerToRaw (code, &address, &sram, &num_bytes, bytes)) { - ucode = charsets_gbk_to_ucs(src); - - if (ucode < 0x800) //2 bytes - { - if(length > 2) length -= 2; - else break; - - *dst++ = 0xC0 | ((ucode >> 6) & 0x1F); - *dst++ = 0x80 | (ucode & 0x3F); - } - else //3 bytes - { - if(length > 3) length -= 3; - else break; - - *dst++ = 0xE0 | (ucode >> 12); - *dst++ = 0x80 | ((ucode >>6) & 0x3F); - *dst++ = 0x80 | (ucode & 0x3F); + for (c = 0; c < num_bytes; c++) { + S9xAddCheat (FALSE, FALSE, address + c, bytes[c]); + strncpy (Cheat.c[Cheat.num_cheats - 1].name, description, MAX_SFCCHEAT_NAME); } - - src += 2; } - } - *dst = '\0'; - } - - return 0; -} - -int load_cheatname(const char* filename, unsigned int string_num, unsigned int string_len, MSG_TABLE* mssg_table) -{ - FILE *fp; - unsigned char current_line[256]; - unsigned char current_line_tmp[256];
- int len, m; - unsigned char** indexp; - unsigned char* msg; - unsigned char* pt; - - mssg_table->msg_index = (unsigned char**)malloc(string_num*4); - if(NULL == mssg_table->msg_index) - return -1; - - string_len = string_len + string_len/2; - mssg_table->msg_pool = (unsigned char*)malloc((string_len+31)&(~31)); - if(NULL == mssg_table->msg_pool) { - free((void*)mssg_table->msg_index); - return -1; - } - - fp = fopen(filename, "r"); - if(fp == NULL) { - free((void*)mssg_table->msg_index); - free((void*)mssg_table->msg_pool); - return -1; - } - - len = 0; - m= 0; - indexp = mssg_table->msg_index; - msg = mssg_table->msg_pool; - while(fgets(current_line, 256, fp))
- { - unsigned int str_len; - - if((pt = check_is_cht(current_line)) != NULL) - { - if(!strcasecmp(pt, "gameinfo")) - continue; - - string2utf8(pt, current_line_tmp, 255); - - str_len = strlen(current_line_tmp); - strncpy(msg+len, current_line_tmp, str_len); - - indexp[m++] = msg+len; - len += str_len; - msg[len] = '\0'; - len += 1; - - if(len >= string_len) break; - if(m >= string_num) break; - - while(fgets(current_line, 256, fp)) - { - str_len = strlen(current_line); - if(str_len < 4) break; - - if((pt = strchr(current_line, '=')) == NULL) //valid cheat item - break; - - *pt = '\0'; - pt = current_line; - - string2utf8(pt, current_line_tmp, 255); - - str_len = strlen(current_line_tmp); - strncpy(msg+len, current_line_tmp, str_len); - - indexp[m++] = msg+len; - len += str_len; - msg[len] = '\0'; - len += 1; - - if(len >= string_len) break; - if(m >= string_num) break; + else { + fclose(fp); + return -3; // Bad cheat format } - - if(len >= string_len) break; - if(m >= string_num) break; - }
- }
- - mssg_table -> msg_num = m;
- fclose(fp); - -#if 0 -cprintf("string_len %d; len %d\n", string_len, len); -for(m= 0; m<mssg_table -> msg_num; m++) -{ -cprintf("msg%d:%s\n", m, indexp[m]); -} -#endif - - return 0; -} - -#define MAX_CHEAT_DATE_LEN (MAX_SFCCHEAT_NAME/2) //other part hold the saved data -
-/* -* Load cheat file -*/ -int load_cheatfile(const char* filename, unsigned int *string_num, unsigned int *string_len, - GCHEAT_STRUCT *gcheat)
-{
- FILE *cheats_file;
- unsigned char current_line[256]; - unsigned char current_line_tmp[256]; - unsigned int current_line_len; - unsigned char *pt;
- int gcheat_num; -
- unsigned int str_num; - unsigned int str_len; - unsigned int cheat_cell_num; - int flag; -
- cheats_file = fopen(filename, "r"); - if(NULL == cheats_file) - return -1;
- g_cheat_cell_num = 0; - g_cheat_num = 0; - cheat_cell_num = 0; - gcheat_num = 0; - str_num = 0; - str_len = 0; - flag = 0; - - while(fgets(current_line, 256, cheats_file))
- { - if((pt = check_is_cht(current_line)) == NULL) //Check valid cht cheat - continue; - - if(!strcasecmp(pt, "gameinfo")) //maybe file end - continue; - - gcheat[gcheat_num].name_id = str_num; - gcheat[gcheat_num].item_id = cheat_cell_num; - gcheat[gcheat_num].item_num = 0; - - string2utf8(pt, current_line_tmp, CHEAT_NAME_LENGTH); - strcpy(gcheat[gcheat_num].name_shot, current_line_tmp); //store a cut name shot - //Initialize other parameter of gcheat - gcheat[gcheat_num].active = 0; - gcheat[gcheat_num].sub_active = 0; - - current_line_len = strlen(pt); - str_len += current_line_len +1; - str_num++; - - //Cheat items - while(fgets(current_line, 256, cheats_file) != NULL) - { - if(strlen(current_line) < 4) - break; - - if((pt = strchr(current_line, '=')) == NULL) //No valid content - break; - - //one sub item each pass - unsigned int first_part; //first part of a cheat item - unsigned int first_part_id; - unsigned int sub_part_id; - unsigned int hex_len; - - unsigned int cheat_addr; - unsigned char cheat_dat[MAX_CHEAT_DATE_LEN]; - unsigned int cheat_dat_len; - unsigned int str_num_saved; - - str_num_saved = str_num; - str_len += pt - current_line +1; - str_num++; - - first_part = 1; - first_part_id = cheat_cell_num; - sub_part_id = 0; - - //skip name part - pt += 1; - current_line_len = strlen(pt); - - //data part - while(1) - { - //fill current_line buffer as full as possible - if(current_line_len < (MAX_CHEAT_DATE_LEN*3+8)) - { //the data length can fill a cheat cell - if(NULL == strchr(pt, 0x0A)) { //this line not end - memmove(current_line, pt, current_line_len+1); - fgets(current_line+current_line_len, 256-current_line_len, cheats_file); - pt = current_line; - current_line_len = strlen(pt); - } - } -#if 0 -cprintf("------\n"); -cprintf("new %d:[%s]\n", current_line_len, pt); -dump_mem(pt, strlen(pt)); -cprintf("\n------\n"); -#endif - //get address - if(first_part) - { - hex_len = sscanf_hex_value(pt, &cheat_addr); - if(0 == hex_len) { - goto load_cheatfile_error; - } - - pt += hex_len; - current_line_len -= hex_len +1; - // strict to follow the formate - if(',' != *pt++ || '\0' == *pt || 0x0D == *pt || 0x0A == *pt) { - goto load_cheatfile_error; - } - - if(cheat_addr < 0x10000) - cheat_addr |= 0x7e0000; - else { - cheat_addr &= 0xffff; - cheat_addr |= 0x7f0000; - } - } - - //get data - unsigned int tmp, m; - - m = 0; - cheat_dat_len = 0; - while(m++ < MAX_CHEAT_DATE_LEN) - { - hex_len = sscanf_hex_value(pt, &tmp); - if(0 == hex_len) break; - - cheat_dat[cheat_dat_len++] = (unsigned char)tmp; - - pt += hex_len; - current_line_len -= hex_len +1; - if(',' == *pt) pt++; - } - - //In first part, get data error - if(0 == cheat_dat_len) { - if(0 == sub_part_id) - goto load_cheatfile_error; - } - else { - //record data - flag = S9xAddCheat_ex(cheat_addr, cheat_dat, cheat_dat_len, cheat_cell_num++, sub_part_id++, str_num_saved); - if(0 != flag) { - cheat_cell_num -= sub_part_id; - break; - } - } - - if(0 == *pt || 0x0D == *pt || 0x0A == *pt) break; //a line over - - first_part = 0; - if(';' == *pt) first_part = 1, pt += 1; //other address of the cheat cell - else cheat_addr += cheat_dat_len; //more data - } //data part - - //have no enough cheat_cell struct to store cheat - if(0 != flag) break; - - S9xAddCheat_ov(first_part_id, sub_part_id); - gcheat[gcheat_num].item_num += 1; - } //Cheat items - - if(0 != flag) break; - - gcheat_num += 1; - if(gcheat_num >= MAX_CHEATS) - break; - }
- - g_cheat_cell_num = cheat_cell_num; - g_cheat_num = gcheat_num; - *string_num = str_num; - *string_len = str_len; - fclose(cheats_file); - -#if 0 -cprintf("g_cheat_num %d; g_cheat_cell_num %d\n", g_cheat_num, g_cheat_cell_num); - -int i; -for(i= 0; i < g_cheat_cell_num; i++) -S9x_dumpcheat(i); - -for(i= 0; i < g_cheat_num; i++) -{ - cprintf("cheat %d\n", i); - cprintf("item num %d; item id %d\n", gcheat[i].item_num, gcheat[i].item_id); -} -#endif - - return 0; - -load_cheatfile_error:
- fclose(cheats_file); - return -1;
-}
- -void gcheat_Managment(GCHEAT_STRUCT *gcheat) -{ - unsigned int i, enable, m, en_flag; - unsigned int active, item_id, sub_active, item_num; - - //no cheat - if(0 == g_cheat_num || 0 == g_cheat_cell_num) { - S9xCheat_Disable(); - return; - } - - enable = 0; - for(i = 0; i < g_cheat_num; i++) - { - active = gcheat[i].active & 0x1; - item_id = gcheat[i].item_id; - item_num = gcheat[i].item_num; - sub_active = gcheat[i].sub_active; - - for(m = 0; m < item_num; m++) - { - en_flag = sub_active == m ? active : 0; - S9xCheat_switch(item_id, m, en_flag); } - - if(active) enable = 1; } - if(enable) - S9xCheat_Enable(); + fclose(fp); + return 0; } - diff --git a/source/nds/gcheat.h b/source/nds/gcheat.h index e5131f6..3c9e440 100644 --- a/source/nds/gcheat.h +++ b/source/nds/gcheat.h @@ -15,51 +15,24 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */
-
-#ifndef __GCHEAT_H__
-#define __GCHEAT_H__
+ */ + +#ifndef __GCHEAT_H__ +#define __GCHEAT_H__ #ifdef __cplusplus extern "C" { #endif -
-#define CHEAT_NAME_LENGTH (32)
-#define MAX_CHEATS_PAGE 10 -#define CHEATS_PER_PAGE 4
-#define MAX_CHEATS (MAX_CHEATS_PAGE * CHEATS_PER_PAGE)
-//Support EMU Cheat(emulator cheat) code
-typedef struct
-{
- u32 name_id; //name ID in another table
- u32 active; //status - u16 item_num; //sub-item number - u16 sub_active; - u32 item_id; //There is another struct array to store the cheat data - char name_shot[CHEAT_NAME_LENGTH]; - u32 reserved;
-} GCHEAT_STRUCT;
+#include "cheats.h" -typedef struct -{ - unsigned char** msg_index; - unsigned char* msg_pool; - unsigned int msg_num; -} MSG_TABLE; -
-extern GCHEAT_STRUCT gcheat[MAX_CHEATS]; -extern unsigned int g_cheat_cell_num; -extern unsigned int g_cheat_num; +#define CHEATS_PER_PAGE 4 +#define MAX_CHEATS_PAGE (MAX_CHEATS_T / CHEATS_PER_PAGE) -extern int load_cheatfile(const char* filename, unsigned int *string_num, - unsigned int *string_len, GCHEAT_STRUCT *gcheat); -extern int load_cheatname(const char* filename, unsigned int string_num, - unsigned int string_len, MSG_TABLE* mssg_table); -extern void gcheat_Managment(GCHEAT_STRUCT *gcheat); +extern int NDSSFCLoadCheatFile(const char* filename); #ifdef __cplusplus } #endif -
-#endif //__GCHEAT_H__
+ +#endif //__GCHEAT_H__ diff --git a/source/nds/gui.c b/source/nds/gui.c index f8cd03b..9aa16bb 100644 --- a/source/nds/gui.c +++ b/source/nds/gui.c @@ -23,6 +23,7 @@ #include <string.h> #include <sys/stat.h> +#include "port.h" #include "ds2_types.h" #include "ds2io.h" #include "ds2_malloc.h" @@ -35,23 +36,30 @@ #include "bitmap.h" #include "gcheat.h" +extern struct SCheatData Cheat; + char main_path[MAX_PATH]; char rom_path[MAX_PATH]; char gamepak_name[MAX_PATH]; char gcheat_filename[MAX_PATH]; -char *lang[2] = +// If adding a language, make sure you update the size of the array in +// message.h too. +char *lang[3] = { "English", // 0 "简体ä¸æ–‡", // 1 + "Français", // 2 }; +char *language_options[] = { (char *) &lang[0], (char *) &lang[1], (char *) &lang[2] }; + /****************************************************************************** * Macro definition ******************************************************************************/ #define SUBMENU_ROW_NUM 6 -#define NDSSFC_VERSION "1.07" +#define NDSSFC_VERSION "1.10" #define SAVE_STATE_SLOT_NUM 10 @@ -64,7 +72,7 @@ char *lang[2] = EMU_CONFIG emu_config; //game configure file's header -#define GAME_CONFIG_HEADER "GSFC1.0" +#define GAME_CONFIG_HEADER "GSFC1.1" // 1.1 removed cheat names #define GAME_CONFIG_HEADER_SIZE 7 GAME_CONFIG game_config; @@ -103,9 +111,9 @@ static unsigned int savestate_index; action_function, \ passive_function, \ NULL, \ - &cheat_format_ptr[number], \ + &cheat_data_ptr[number], \ enable_disable_options, \ - &(game_config.cheats_flag[number].active), \ + &(Cheat.c[number].enabled), \ 2, \ NULL, \ line_number, \ @@ -266,7 +274,7 @@ u32 game_enable_audio = 1; /****************************************************************************** ******************************************************************************/ static u32 menu_cheat_page = 0; -static u32 clock_speed_number = 2; +static u32 clock_speed_number = 5; u32 gamepad_config_menu; /****************************************************************************** @@ -400,13 +408,14 @@ static int sort_function(const void *dest_str_ptr, const void *src_str_ptr) char *dest_str = *((char **)dest_str_ptr); char *src_str = *((char **)src_str_ptr); + // For files and directories, . and .. sort first. if(src_str[0] == '.') return 1; if(dest_str[0] == '.') return -1; - return strcasecmp(dest_str, src_str); + return strcasecmp(dest_str, src_str); } static int my_array_partion(void *array, int left, int right) @@ -461,9 +470,9 @@ static void strupr(char *str) } } -//****************************************************************************** +// ****************************************************************************** // get file list -//****************************************************************************** +// ****************************************************************************** #define FILE_LIST_MAX 512 #define DIR_LIST_MAX 64 #define NAME_MEM_SIZE (320*64) @@ -625,7 +634,7 @@ static int load_file_list(struct FILE_LIST_INFO *filelist_infop) strcpy(current_dir_name, filelist_infop -> current_path); - //* path formate should be: "fat:/" or "fat:/dir0" or "fat:", not "fat:/dir0/" + // path formate should be: "fat:/" or "fat:/dir0" or "fat:", not "fat:/dir0/" current_dir = opendir(current_dir_name); //Open directory faiure if(current_dir == NULL) { @@ -789,31 +798,23 @@ s32 load_file(char **wildcards, char *result, char *default_dir_name) { case CURSOR_TOUCH: ds2_getrawInput(&inputdata); - if(inputdata.y <= 33) + // ___ 33 This screen has 6 possible rows. Touches + // ___ 60 above or below these are ignored. + // . . . (+27) + // ___ 192 + if(inputdata.y <= 33 || inputdata.y > 192) break; - else if(inputdata.y <= 60) - mod = 0; - else if(inputdata.y <= 87) - mod = 1; - else if(inputdata.y <= 114) - mod = 2; - else if(inputdata.y <= 141) - mod = 3; - else if(inputdata.y <= 168) - mod = 4; - else if(inputdata.y <= 192) - mod = 5; else - break; - + mod = (inputdata.y - 33) / 27; + if(selected_item_on_list - selected_item_on_screen + mod >= total_items_num) break; - + selected_item_on_list = selected_item_on_list - selected_item_on_screen + mod; - + if(selected_item_on_list + 1 <= num_files) { - //The ".." directory + //The ".." directory is the parent if(!strcasecmp(file_list[selected_item_on_list], "..")) { char *ext_pos; @@ -849,7 +850,7 @@ s32 load_file(char **wildcards, char *result, char *default_dir_name) case CURSOR_UP: redraw = 1; if(selected_item_on_screen > 0) - { + { //Not the first item on list selected_item_on_list -= 1; //Selected item on screen center @@ -1113,7 +1114,7 @@ s32 load_file(char **wildcards, char *result, char *default_dir_name) } redraw = 0; - ds2_flipScreen(DOWN_SCREEN, 2); //not switch down screen buffer + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); } //end if(0 != redraw) else if(0 != redraw) { unsigned int m, n; @@ -1141,7 +1142,7 @@ s32 load_file(char **wildcards, char *result, char *default_dir_name) } draw_hscroll(m+1, redraw); - ds2_flipScreen(DOWN_SCREEN, 2); //not switch down screen buffer + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); redraw = 0; } @@ -1161,7 +1162,7 @@ s32 load_file(char **wildcards, char *result, char *default_dir_name) { if(draw_hscroll(0, 1) <= 1) path_scroll = 0x8000; //scroll left } - ds2_flipScreen(DOWN_SCREEN, 2); //not switch down screen buffer + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); } mdelay(50); //about 50ms @@ -1175,7 +1176,7 @@ s32 load_file(char **wildcards, char *result, char *default_dir_name) manage_filelist_info(&filelist_info, -1); ds2_clearScreen(DOWN_SCREEN, COLOR_BLACK); - ds2_flipScreen(DOWN_SCREEN, 2); //not switch down screen buffer + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); return return_value; } @@ -1232,7 +1233,7 @@ u32 play_screen_snapshot(void) { draw_message(down_screen_addr, screenp, 28, 31, 227, 165, color_bg); draw_string_vcenter(down_screen_addr, 36, 55, 190, COLOR_MSSG, msg[MSG_NO_SLIDE]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); if(screenp) free((void*)screenp); //construct filelist_info struct @@ -1259,7 +1260,7 @@ u32 play_screen_snapshot(void) draw_string_vcenter(down_screen_addr, 36, 115, 190, COLOR_MSSG, msg[MSG_PLAY_SLIDE4]); draw_string_vcenter(down_screen_addr, 36, 130, 190, COLOR_MSSG, msg[MSG_PLAY_SLIDE5]); draw_string_vcenter(down_screen_addr, 36, 145, 190, COLOR_MSSG, msg[MSG_PLAY_SLIDE6]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); repeat= 1; i= 0; @@ -1650,7 +1651,7 @@ unsigned int frame_interval; --------------------------------------------------------*/ u32 menu(u16 *screen) { - mdelay(50); + mdelay(50); // to prevent the touch key from being applied too soon? gui_action_type gui_action; u32 i; u32 repeat; @@ -1658,8 +1659,9 @@ u32 menu(u16 *screen) u32 first_load = 0; char tmp_filename[MAX_FILE]; char line_buffer[512]; - char cheat_format_str[MAX_CHEATS][41*4]; - char *cheat_format_ptr[MAX_CHEATS]; + char cheat_data_str[MAX_CHEATS_T][5]; + // ^ Holds the index inside Cheat, as a number in an ASCIIZ string + char* cheat_data_ptr[MAX_CHEATS_T]; MENU_TYPE *current_menu; MENU_OPTION_TYPE *current_option; @@ -1716,12 +1718,13 @@ u32 menu(u16 *screen) void menu_exit() { + ds2_setCPUclocklevel(13); // Crank it up, leave quickly if(gamepak_name[0] != 0) { game_config.clock_speed_number = clock_speed_number; reorder_latest_file(); - //S9xAutoSaveSRAM (); + S9xAutoSaveSRAM (); save_game_config_file(); } save_emu_config_file(); @@ -1734,7 +1737,7 @@ u32 menu(u16 *screen) if(gamepak_name[0] != 0) { - //S9xAutoSaveSRAM (); + S9xAutoSaveSRAM (); save_game_config_file(); } @@ -1746,9 +1749,12 @@ u32 menu(u16 *screen) draw_message(down_screen_addr, bg_screenp, 28, 31, 227, 165, bg_screenp_color); draw_string_vcenter(down_screen_addr, 36, 100, 190, COLOR_MSSG, msg[MSG_LOADING_GAME]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); - if(load_gamepak(line_buffer) == -1) + ds2_setCPUclocklevel(13); + int load_result = load_gamepak(&line_buffer); + ds2_setCPUclocklevel(0); + if(load_result == -1) { first_load = 1; gamepak_name[0] = '\0'; @@ -1811,9 +1817,13 @@ u32 menu(u16 *screen) draw_message(down_screen_addr, bg_screenp, 28, 31, 227, 165, bg_screenp_color); draw_string_vcenter(down_screen_addr, 36, 100, 190, COLOR_MSSG, msg[MSG_LOADING_GAME]); - ds2_flipScreen(DOWN_SCREEN, 2); - - if(load_gamepak(args[1]) == -1) + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); + + ds2_setCPUclocklevel(13); + int load_result = load_gamepak(args[1]); + ds2_setCPUclocklevel(0); + + if(load_result == -1) { first_load = 1; gamepak_name[0] = '\0'; @@ -1930,7 +1940,7 @@ u32 menu(u16 *screen) else color= COLOR_INACTIVE_ITEM; - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, color, COLOR_TRANS, 23, 40 + line[i]*27); + PRINT_STRING_BG(down_screen_addr, line_buffer, color, COLOR_TRANS, 23, 40 + line[i]*27); } int slot_index; @@ -1941,7 +1951,7 @@ u32 menu(u16 *screen) slot_index= get_savestate_slot(); sprintf(line_buffer, "%d", (slot_index+2) > SAVE_STATE_SLOT_NUM ? SAVE_STATE_SLOT_NUM : (slot_index+2)); - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, COLOR_INACTIVE_ITEM, COLOR_TRANS, 146, 40 + 0*27); + PRINT_STRING_BG(down_screen_addr, line_buffer, COLOR_INACTIVE_ITEM, COLOR_TRANS, 146, 40 + 0*27); if(current_option_num == 1) selected = slot_index+1; @@ -1999,7 +2009,7 @@ u32 menu(u16 *screen) else color= COLOR_INACTIVE_ITEM; - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, color, COLOR_TRANS, 23, 40 + line[i]*27); + PRINT_STRING_BG(down_screen_addr, line_buffer, color, COLOR_TRANS, 23, 40 + line[i]*27); } if(current_option_num == 2) @@ -2037,7 +2047,7 @@ u32 menu(u16 *screen) draw_message(down_screen_addr, NULL, 28, 31, 227, 165, 0); draw_string_vcenter(down_screen_addr, 36, 100, 190, COLOR_MSSG, msg[MSG_SAVESTATE_DOING]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); int flag = save_state(tmp_filename, (void*)screen); //clear message @@ -2053,13 +2063,13 @@ u32 menu(u16 *screen) savestate_index = slot_index; } - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); //save game config reorder_latest_file(); save_game_config_file(); - mdelay(500); + // mdelay(500); // Delete this delay } } } @@ -2090,7 +2100,7 @@ u32 menu(u16 *screen) { draw_message(down_screen_addr, bg_screenp, 28, 31, 227, 165, bg_screenp_color); draw_string_vcenter(down_screen_addr, 36, 80, 190, COLOR_MSSG, msg[MSG_SAVESTATE_FILE_BAD]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); wait_Allkey_release(0); if(gui_action == CURSOR_SELECT) @@ -2160,6 +2170,7 @@ u32 menu(u16 *screen) { if(draw_yesno_dialog(DOWN_SCREEN, 115, "Yes(A)", "No(B)")) { + wait_Allkey_release(0); for(i= 0; i < SAVE_STATE_SLOT_NUM; i++) { get_savestate_filename(i, tmp_filename); @@ -2175,7 +2186,7 @@ u32 menu(u16 *screen) { draw_message(down_screen_addr, bg_screenp, 28, 31, 227, 165, bg_screenp_color); draw_string_vcenter(down_screen_addr, 36, 90, 190, COLOR_MSSG, msg[MSG_DELETTE_SAVESTATE_NOTHING]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); mdelay(500); } } @@ -2188,13 +2199,15 @@ u32 menu(u16 *screen) sprintf(line_buffer, msg[MSG_DELETTE_SINGLE_SAVESTATE_WARING], delette_savestate_num); draw_string_vcenter(down_screen_addr, 36, 75, 190, COLOR_MSSG, line_buffer); - if(draw_yesno_dialog(DOWN_SCREEN, 115, "Yes(A)", "No(B)")) + if(draw_yesno_dialog(DOWN_SCREEN, 115, "Yes(A)", "No(B)")) { + wait_Allkey_release(0); clear_savestate_slot(delette_savestate_num); +} } else { draw_string_vcenter(down_screen_addr, 36, 90, 190, COLOR_MSSG, msg[MSG_DELETTE_SAVESTATE_NOTHING]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); mdelay(500); } } @@ -2208,22 +2221,13 @@ u32 menu(u16 *screen) unsigned char **dynamic_cheat_pt = NULL; unsigned int dynamic_cheat_active; int dynamic_cheat_scroll_value= 0; - MSG_TABLE cheat_msg= {NULL, NULL}; void cheat_menu_init() { - for(i = 0; i < MAX_CHEATS; i++) + for(i = 0; i < MAX_CHEATS_T; i++) { - if(i >= g_cheat_num) - { - sprintf(cheat_format_str[i], msg[MSG_CHEAT_MENU_NON_LOAD], i); - } - else - { - sprintf(cheat_format_str[i], msg[MSG_CHEAT_MENU_LOADED], i, game_config.cheats_flag[i].name_shot); - } - - cheat_format_ptr[i]= cheat_format_str[i]; + sprintf(cheat_data_str[i], "%d", i); + cheat_data_ptr[i] = &cheat_data_str[i][0]; } reload_cheats_page(); @@ -2231,13 +2235,22 @@ u32 menu(u16 *screen) void cheat_menu_end() { - if(!first_load) - gcheat_Managment(game_config.cheats_flag); + // Honour current cheat selections. + uint32 i; + for (i = 0; i < Cheat.num_cheats; i++) { + if (Cheat.c[i].enabled) + S9xApplyCheat(i); + else + S9xRemoveCheat(i); + } + // Save current cheat selections to the cheat binary file. + strcpy(line_buffer, (char *) S9xGetFilename (".chb")); + S9xSaveCheatFile (line_buffer); // cheat binary } void dynamic_cheat_key() { - unsigned int m, n; + unsigned int m, n; switch(gui_action) { @@ -2446,97 +2459,13 @@ u32 menu(u16 *screen) void cheat_option_action() { - unsigned int nums; - - nums = (CHEATS_PER_PAGE * menu_cheat_page) + current_option_num -1; - if(gui_action == CURSOR_SELECT && nums < g_cheat_num) - { - unsigned int m; - - nums = game_config.cheats_flag[(CHEATS_PER_PAGE * menu_cheat_page) + current_option_num -1].item_num; - - if(dynamic_cheat_options) - { - free((void*)dynamic_cheat_options); - dynamic_cheat_options = NULL; - } - - if(dynamic_cheat_menu) - { - free((void*)dynamic_cheat_menu); - dynamic_cheat_menu = NULL; - } - - dynamic_cheat_options = (MENU_OPTION_TYPE*)malloc(sizeof(MENU_OPTION_TYPE)*(nums+1)); - if(dynamic_cheat_options == NULL) return; - - dynamic_cheat_menu = (MENU_TYPE*)malloc(sizeof(MENU_TYPE)); - if(dynamic_cheat_menu == NULL) - { - free((void*)dynamic_cheat_options); - dynamic_cheat_options = NULL; - return; - } - - //menu - dynamic_cheat_menu->init_function = NULL; - dynamic_cheat_menu->passive_function = dynamic_cheat_menu_passive; - dynamic_cheat_menu->key_function = dynamic_cheat_key; - dynamic_cheat_menu->end_function = dynamic_cheat_menu_end; - dynamic_cheat_menu->options = dynamic_cheat_options; - dynamic_cheat_menu->num_options = nums+1; - dynamic_cheat_menu->focus_option = 0; - dynamic_cheat_menu->screen_focus = 0; - //back option - dynamic_cheat_options[0].action_function = NULL; - dynamic_cheat_options[0].passive_function = NULL; - dynamic_cheat_options[0].sub_menu = &cheats_menu; - dynamic_cheat_options[0].display_string = (char**)(dynamic_cheat_pt + game_config.cheats_flag[(CHEATS_PER_PAGE * menu_cheat_page) + current_option_num -1].name_id); - dynamic_cheat_options[0].options = NULL; - dynamic_cheat_options[0].current_option = NULL; - dynamic_cheat_options[0].num_options = 0; - dynamic_cheat_options[0].help_string = NULL; - dynamic_cheat_options[0].line_number = 0; - dynamic_cheat_options[0].option_type = SUBMENU_TYPE; - - m = game_config.cheats_flag[(CHEATS_PER_PAGE * menu_cheat_page) + current_option_num -1].item_id; - for(i= 0; i < nums; i++) - { - dynamic_cheat_options[i+1].action_function = dynamic_cheat_action; - dynamic_cheat_options[i+1].passive_function = NULL; - dynamic_cheat_options[i+1].sub_menu = NULL; - dynamic_cheat_options[i+1].display_string = (char**)(dynamic_cheat_pt + S9xGetCheat_nameid(m, i, g_cheat_cell_num)); - dynamic_cheat_options[i+1].options = NULL; - dynamic_cheat_options[i+1].current_option = NULL; - dynamic_cheat_options[i+1].num_options = 2; - dynamic_cheat_options[i+1].help_string = NULL; - dynamic_cheat_options[i+1].line_number = i+1; - dynamic_cheat_options[i+1].option_type = ACTION_TYPE; - } - - dynamic_cheat_active = game_config.cheats_flag[(CHEATS_PER_PAGE * menu_cheat_page) + - current_option_num -1].active & 0x1; - dynamic_cheat_active |= game_config.cheats_flag[(CHEATS_PER_PAGE * menu_cheat_page) + - current_option_num -1].sub_active << 16; - - //Initial srollable options - int k; - - draw_hscroll_init(down_screen_addr, 50, 9, 180, COLOR_TRANS, - COLOR_ACTIVE_ITEM, *dynamic_cheat_options[0].display_string); - - if(nums>5) nums = SUBMENU_ROW_NUM; - for(k= 0; k < nums; k++) - { - draw_hscroll_init(down_screen_addr, 23, 40 + k*27, 200, - COLOR_TRANS, COLOR_INACTIVE_ITEM, *dynamic_cheat_options[k+1].display_string); - } - dynamic_cheat_scroll_value= 0; - - choose_menu(dynamic_cheat_menu); - } } +#define CHEAT_NUMBER_X 26 +#define CHEAT_DESC_X 52 +#define CHEAT_DESC_SX 163 +#define CHEAT_ACTIVE_X 225 + void cheat_option_passive() { unsigned short color; @@ -2551,27 +2480,33 @@ u32 menu(u16 *screen) //sprintf("%A") will have problem ? strcpy(tmp_buf, *(display_option->display_string)); - pt = strrchr(tmp_buf, ':'); - if(pt != NULL) - sprintf(pt+1, "%s", *((u32*)(((u32 *)display_option->options)[*(display_option->current_option)]))); + // This is the number of the cheat to display - strcpy(line_buffer, tmp_buf); - pt = strrchr(line_buffer, ')'); - *pt = '\0'; - pt = strchr(line_buffer, '('); + int i = atoi(tmp_buf); - len = BDF_cut_string(pt+1, 0, 2); - if(len > 90) - { - len = BDF_cut_string(pt+1, 90, 1); - *(pt+1+len) = '\0'; - strcat(line_buffer, "..."); - } + sprintf(line_buffer, "%d.", i + 1); + PRINT_STRING_BG(down_screen_addr, line_buffer, color, COLOR_TRANS, CHEAT_NUMBER_X, 40 + display_option-> line_number*27); - pt = strrchr(tmp_buf, ')'); - strcat(line_buffer, pt); + if (i >= Cheat.num_cheats) { + PRINT_STRING_BG(down_screen_addr, msg[MSG_CHEAT_MENU_NON_LOAD], color, COLOR_TRANS, CHEAT_DESC_X, 40 + display_option-> line_number*27); + } + else { + strcpy(line_buffer, Cheat.c[i].name); + len = BDF_cut_string(line_buffer, 0, 2); + if(len > CHEAT_DESC_SX) + { + len = BDF_cut_string(line_buffer, CHEAT_DESC_SX, 1); + line_buffer[len] = '\0'; + strcat(line_buffer, "..."); + } + PRINT_STRING_BG(down_screen_addr, line_buffer, color, COLOR_TRANS, CHEAT_DESC_X, 40 + display_option-> line_number*27); - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, color, COLOR_TRANS, 26, 40 + display_option-> line_number*27); + if (Cheat.c[i].enabled) + strcpy(line_buffer, "+"); + else + strcpy(line_buffer, "-"); + PRINT_STRING_BG(down_screen_addr, line_buffer, color, COLOR_TRANS, CHEAT_ACTIVE_X, 40 + display_option-> line_number*27); + } } void dynamic_cheat_menu_end() @@ -2579,7 +2514,8 @@ u32 menu(u16 *screen) unsigned int m, k; m = cheats_menu.focus_option-1; - game_config.cheats_flag[(CHEATS_PER_PAGE * menu_cheat_page) + m].sub_active = dynamic_cheat_active >> 16; + // game_config.cheats_flag[(CHEATS_PER_PAGE * menu_cheat_page) + m].sub_active = dynamic_cheat_active >> 16; + // REVISIT [Neb] k = SUBMENU_ROW_NUM +1; for(m= 0; m<k; m++) @@ -2606,44 +2542,24 @@ u32 menu(u16 *screen) if(load_file(file_ext, tmp_filename, DEFAULT_CHEAT_DIR) != -1) { - if(NULL != cheat_msg.msg_index) free((void*)cheat_msg.msg_index); - if(NULL != cheat_msg.msg_pool) free((void*)cheat_msg.msg_pool); - sprintf(line_buffer, "%s/%s", DEFAULT_CHEAT_DIR, tmp_filename); + flag = NDSSFCLoadCheatFile(line_buffer); - flag = load_cheatfile(line_buffer, &string_num, &string_len, game_config.cheats_flag); - if(0 != flag) - { //load cheat file failure - game_config.cheat_str_num = 0; - game_config.cheat_str_size = 0; - game_config.cheat_filename[0] = '\0'; - g_cheat_num = 0; - - cheat_menu_init(); - return; - } + strcpy(line_buffer, (char *) S9xGetFilename (".chb")); + S9xSaveCheatFile (line_buffer); // cheat binary - flag = load_cheatname(line_buffer, string_num, string_len, &cheat_msg); if(0 != flag) - { //load cheat string information failure - game_config.cheat_str_num = 0; - game_config.cheat_str_size = 0; - game_config.cheat_filename[0] = '\0'; - g_cheat_num = 0; + { //load cheat file failure + S9xDeleteCheats(); cheat_menu_init(); return; } - game_config.cheat_str_num = string_num; - game_config.cheat_str_size = string_len; - strcpy(game_config.cheat_filename, line_buffer); - - dynamic_cheat_msg = cheat_msg.msg_pool; - dynamic_cheat_pt = cheat_msg.msg_index;; menu_cheat_page = 0; cheat_menu_init(); - } + + } } void save_screen_snapshot() @@ -2662,18 +2578,18 @@ u32 menu(u16 *screen) if(!first_load) { draw_string_vcenter(down_screen_addr, 36, 70, 190, COLOR_MSSG, msg[MSG_SAVE_SNAPSHOT]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); if(save_ss_bmp(screen)) draw_string_vcenter(down_screen_addr, 36, 90, 190, COLOR_MSSG, msg[MSG_SAVE_SNAPSHOT_COMPLETE]); else draw_string_vcenter(down_screen_addr, 36, 90, 190, COLOR_MSSG, msg[MSG_SAVE_SNAPSHOT_FAILURE]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); mdelay(500); } else { draw_string_vcenter(down_screen_addr, 36, 90, 190, COLOR_MSSG, msg[MSG_SAVESTATE_SLOT_EMPTY]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); mdelay(500); } } @@ -2794,7 +2710,7 @@ u32 menu(u16 *screen) mm = *(display_option->current_option); sprintf(line_buffer, *(display_option->display_string), str[mm]); - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, color, COLOR_TRANS, 27, + PRINT_STRING_BG(down_screen_addr, line_buffer, color, COLOR_TRANS, 27, 38 + (display_option-> line_number)*32); } @@ -2827,9 +2743,10 @@ u32 menu(u16 *screen) if(draw_yesno_dialog(DOWN_SCREEN, 115, "Yes", "No")) { + wait_Allkey_release(0); draw_message(down_screen_addr, bg_screenp, 28, 31, 227, 165, bg_screenp_color); draw_string_vcenter(down_screen_addr, 36, 80, 190, COLOR_MSSG, msg[MSG_DEFAULT_LOADING]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); sprintf(line_buffer, "%s/%s", main_path, EMU_CONFIG_FILENAME); remove(line_buffer); @@ -2842,7 +2759,7 @@ u32 menu(u16 *screen) draw_string_vcenter(up_screen_addr, 0, 80, 256, COLOR_WHITE, msg[MSG_NON_LOAD_GAME]); ds2_flipScreen(UP_SCREEN, 1); - mdelay(500); + // mdelay(500); // Delete this delay } } @@ -2858,9 +2775,9 @@ u32 menu(u16 *screen) draw_message(down_screen_addr, bg_screenp, 28, 31, 227, 165, bg_screenp_color); draw_string_vcenter(down_screen_addr, 36, 80, 190, COLOR_MSSG, msg[MSG_EMU_VERSION0]); - sprintf(line_buffer, "%s %s", msg[MSG_EMU_VERSION1], NDSSFC_VERSION); + sprintf(line_buffer, "%s %s", msg[MSG_EMU_VERSION1], NDSSFC_VERSION); draw_string_vcenter(down_screen_addr, 36, 95, 190, COLOR_MSSG, line_buffer); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); wait_Anykey_press(0); } @@ -2880,7 +2797,7 @@ u32 menu(u16 *screen) draw_message(down_screen_addr, bg_screenp, 28, 31, 227, 165, bg_screenp_color); draw_string_vcenter(down_screen_addr, 36, 75, 190, COLOR_MSSG, msg[MSG_CHANGE_LANGUAGE]); draw_string_vcenter(down_screen_addr, 36, 95, 190, COLOR_MSSG, msg[MSG_CHANGE_LANGUAGE_WAITING]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); load_language_msg(LANGUAGE_PACK, emu_config.language); gui_change_icon(emu_config.language); @@ -2890,11 +2807,10 @@ u32 menu(u16 *screen) ds2_clearScreen(UP_SCREEN, 0); draw_string_vcenter(up_screen_addr, 0, 80, 256, COLOR_WHITE, msg[MSG_NON_LOAD_GAME]); ds2_flipScreen(UP_SCREEN, 1); - mdelay(10); //FIXME: Stranger? } save_emu_config_file(); - mdelay(500); + wait_Allkey_release(0); } } @@ -2906,7 +2822,7 @@ u32 menu(u16 *screen) strcpy(line_buffer, *(display_option->display_string)); line_num= display_option-> line_number; - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, COLOR_INACTIVE_ITEM, COLOR_TRANS, 27, + PRINT_STRING_BG(down_screen_addr, line_buffer, COLOR_INACTIVE_ITEM, COLOR_TRANS, 27, 40 + (display_option->line_number)*27); num_byte = freespace; @@ -2938,7 +2854,7 @@ u32 menu(u16 *screen) strcat(line_buffer, ".0 GB"); } - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, COLOR_INACTIVE_ITEM, COLOR_TRANS, 147, + PRINT_STRING_BG(down_screen_addr, line_buffer, COLOR_INACTIVE_ITEM, COLOR_TRANS, 147, 40 + (display_option->line_number)*27); } @@ -2958,8 +2874,6 @@ u32 menu(u16 *screen) char *enable_disable_options[] = { (char*)&msg[MSG_EN_DIS_ABLE_0], (char*)&msg[MSG_EN_DIS_ABLE_1] }; - char *language_options[] = { (char*)&lang[0], (char*)&lang[1] }; - char *keyremap_options[] = {(char*)&msg[MSG_KEY_MAP_NONE], (char*)&msg[MSG_KEY_MAP_A], (char*)&msg[MSG_KEY_MAP_B], (char*)&msg[MSG_KEY_MAP_SL], (char*)&msg[MSG_KEY_MAP_ST], (char*)&msg[MSG_KEY_MAP_RT], (char*)&msg[MSG_KEY_MAP_LF], (char*)&msg[MSG_KEY_MAP_UP], (char*)&msg[MSG_KEY_MAP_DW], @@ -3117,7 +3031,7 @@ u32 menu(u16 *screen) /* 01 */ NUMERIC_SELECTION_OPTION(NULL, &msg[MSG_SUB_MENU_42], &clock_speed_number, 6, NULL, 1), /* 02 */ STRING_SELECTION_OPTION(language_set, NULL, &msg[MSG_SUB_MENU_41], language_options, - &emu_config.language, 2, NULL, ACTION_TYPE, 2), + &emu_config.language, sizeof(language_options) / sizeof(language_options[0]) /* number of possible languages */, NULL, ACTION_TYPE, 2), /* 03 */ STRING_SELECTION_OPTION(NULL, show_card_space, &msg[MSG_SUB_MENU_43], NULL, &desert, 2, NULL, PASSIVE_TYPE | HIDEN_TYPE, 3), @@ -3453,7 +3367,7 @@ u32 menu(u16 *screen) { draw_hscroll_over(current_option_num-1); ext_pos= strrchr(emu_config.latest_file[current_option_num-1], '/'); - draw_hscroll_init(down_screen_addr, 26, 35 + (current_option_num-1)*27, 200, + draw_hscroll_init(down_screen_addr, 26, 40 + (current_option_num-1)*27, 200, COLOR_TRANS, COLOR_INACTIVE_ITEM, ext_pos+1); } @@ -3491,11 +3405,11 @@ u32 menu(u16 *screen) draw_message(down_screen_addr, bg_screenp, 28, 31, 227, 165, 0); draw_string_vcenter(down_screen_addr, 36, 100, 190, COLOR_MSSG, msg[MSG_LOADING_GAME]); - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); if(gamepak_name[0] != 0) { - //S9xAutoSaveSRAM (); + S9xAutoSaveSRAM (); save_game_config_file(); } @@ -3511,7 +3425,12 @@ u32 menu(u16 *screen) *ext_pos= '/'; ext_pos = emu_config.latest_file[current_option_num -1]; - if(load_gamepak(ext_pos) == -1) { + + ds2_setCPUclocklevel(13); + int load_result = load_gamepak(ext_pos); + ds2_setCPUclocklevel(0); + + if(load_result == -1) { first_load = 1; return; } @@ -3570,7 +3489,7 @@ u32 menu(u16 *screen) else color= COLOR_INACTIVE_ITEM; - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, color, COLOR_TRANS, 26, 37 + line_num*32); + PRINT_STRING_BG(down_screen_addr, line_buffer, color, COLOR_TRANS, 26, 37 + line_num*32); } void game_fastforward() @@ -3583,8 +3502,8 @@ u32 menu(u16 *screen) { for(i = 0; i < CHEATS_PER_PAGE; i++) { - cheats_options[i+1].display_string = &cheat_format_ptr[(CHEATS_PER_PAGE * menu_cheat_page) + i]; - cheats_options[i+1].current_option = &(game_config.cheats_flag[(CHEATS_PER_PAGE * menu_cheat_page) + i].active); + cheats_options[i+1].display_string = &cheat_data_ptr[(CHEATS_PER_PAGE * menu_cheat_page) + i]; + cheats_options[i+1].current_option = &(Cheat.c[(CHEATS_PER_PAGE * menu_cheat_page) + i].enabled); } } @@ -3617,7 +3536,7 @@ u32 menu(u16 *screen) //----------------------------------------------------------------------------// // Menu Start ds2_setCPUclocklevel(0); - mdelay(200); + // mdelay(200); // Delete this delay ds2_setBacklight(3); @@ -3640,6 +3559,11 @@ u32 menu(u16 *screen) } else { + /* + * It's pretty complicated. These two flips are needed because, + * otherwise, the menu freezes if S9xAutoSaveSRAM was called after + * loading from a save state. + */ ds2_flipScreen(UP_SCREEN, 1); ds2_flipScreen(UP_SCREEN, 1); } @@ -3647,7 +3571,6 @@ u32 menu(u16 *screen) choose_menu(&main_menu); // Menu loop - mdelay(200); while(repeat) { @@ -3746,7 +3669,7 @@ u32 menu(u16 *screen) else color= COLOR_INACTIVE_ITEM; - PRINT_STRING_BG_UTF8(down_screen_addr, line_buffer, color, COLOR_TRANS, 23, 40 + i*27); + PRINT_STRING_BG(down_screen_addr, line_buffer, color, COLOR_TRANS, 23, 40 + i*27); } } } @@ -3767,26 +3690,13 @@ u32 menu(u16 *screen) /* Main menu */ if(current_menu == &main_menu) { - if(inputdata.x <= 86 && inputdata.y <= 80) - current_option_num = 0; - else if(inputdata.x <= 172 && inputdata.y <= 80) - current_option_num = 1; - else if(inputdata.x <= 256 && inputdata.y <= 80) - current_option_num = 2; - else if(inputdata.x <= 86 && inputdata.y <= 160) - current_option_num = 3; - else if(inputdata.x <= 172 && inputdata.y <= 160) - current_option_num = 4; - else if(inputdata.x <= 256 && inputdata.y <= 160) - current_option_num = 5; - else if(inputdata.x <= 86 && inputdata.y <= 192) - current_option_num = 6; - else if(inputdata.x <= 172 && inputdata.y <= 192) - current_option_num = 7; - else if(inputdata.x <= 256 && inputdata.y <= 192) - current_option_num = 8; - else - break; + // 0 86 172 256 + // _____ _____ _____ 0 + // |0VID_|1SAV_|2CHT_| 80 + // |3TLS_|4OPT_|5EXI_| 160 + // |6NEW_|7RET_|8RST_| 192 + + current_option_num = (inputdata.y / 80) * 3 + (inputdata.x / 86); current_option = current_menu->options + current_option_num; if(current_option -> option_type & HIDEN_TYPE) @@ -3805,31 +3715,22 @@ u32 menu(u16 *screen) && current_menu != (main_menu.options +6)->sub_menu && current_menu != ((main_menu.options +6)->sub_menu->options + 2)->sub_menu) { - if(inputdata.y <= 33) + if (inputdata.y <= 33 || inputdata.y > 192) break; - else if(inputdata.y <= 60) - current_option_num = 1; - else if(inputdata.y <= 87) - current_option_num = 2; - else if(inputdata.y <= 114) - current_option_num = 3; - else if(inputdata.y <= 141) - current_option_num = 4; - else if(inputdata.y <= 168) - current_option_num = 5; - else if(inputdata.y <= 192) - current_option_num = 6; - else - break; - + // ___ 33 This screen has 6 possible rows. Touches + // ___ 60 above or below these are ignored. + // . . . (+27) The row between 33 and 60 is [1], though! + // ___ 192 + current_option_num = (inputdata.y - 33) / 27 + 1; + current_option = current_menu->options + current_option_num; - + if(current_option -> option_type & HIDEN_TYPE) break; - + if(!current_option) break; - + if(current_menu->key_function) { gui_action = CURSOR_RIGHT; @@ -3872,33 +3773,16 @@ u32 menu(u16 *screen) u32 current_option_val = *(current_option->current_option); u32 old_option_val = current_option_val; - if(inputdata.x <= 25) - break; - else if(inputdata.x <= 45) - current_option_val = 0; - else if(inputdata.x <= 65) - current_option_val = 1; - else if(inputdata.x <= 86) - current_option_val = 2; - else if(inputdata.x <= 107) - current_option_val = 3; - else if(inputdata.x <= 128) - current_option_val = 4; - else if(inputdata.x <= 149) - current_option_val = 5; - else if(inputdata.x <= 170) - current_option_val = 6; - else if(inputdata.x <= 191) - current_option_val = 7; - else if(inputdata.x <= 212) - current_option_val = 8; - else if(inputdata.x <= 233) - current_option_val = 9; - else + if(inputdata.x <= 23 || inputdata.x > 233) break; - + // | | | | | | | | | | | + // 23 44 65 86 ... (+21) 233 + // This row has 10 cells for save states, each 21 + // pixels wide. + current_option_val = (inputdata.x - 23) / 21; + *(current_option->current_option) = current_option_val; - + if(current_option_val == old_option_val) { gui_action = CURSOR_SELECT; @@ -3939,33 +3823,16 @@ u32 menu(u16 *screen) u32 current_option_val = *(current_option->current_option); u32 old_option_val = current_option_val; - if(inputdata.x <= 25) - break; - else if(inputdata.x <= 45) - current_option_val = 0; - else if(inputdata.x <= 65) - current_option_val = 1; - else if(inputdata.x <= 86) - current_option_val = 2; - else if(inputdata.x <= 107) - current_option_val = 3; - else if(inputdata.x <= 128) - current_option_val = 4; - else if(inputdata.x <= 149) - current_option_val = 5; - else if(inputdata.x <= 170) - current_option_val = 6; - else if(inputdata.x <= 191) - current_option_val = 7; - else if(inputdata.x <= 212) - current_option_val = 8; - else if(inputdata.x <= 233) - current_option_val = 9; - else + if(inputdata.x <= 23 || inputdata.x > 233) break; - + // | | | | | | | | | | | + // 23 44 65 86 ... (+21) 233 + // This row has 10 cells for save states, each 21 + // pixels wide. + current_option_val = (inputdata.x - 23) / 21; + *(current_option->current_option) = current_option_val; - + if(current_option_val == old_option_val) { gui_action = CURSOR_SELECT; @@ -3991,25 +3858,16 @@ u32 menu(u16 *screen) || current_menu == (main_menu.options + 6)->sub_menu || current_menu == ((main_menu.options +6)->sub_menu->options + 2)->sub_menu) { - if(inputdata.y <= 33) - break; - else if(inputdata.y <= 60) - current_option_num = 1; - else if(inputdata.y <= 87) - current_option_num = 2; - else if(inputdata.y <= 114) - current_option_num = 3; - else if(inputdata.y <= 141) - current_option_num = 4; - else if(inputdata.y <= 168) - current_option_num = 5; - else if(inputdata.y <= 192) - current_option_num = 6; - else + if (inputdata.y <= 33 || inputdata.y > 192) break; - + // ___ 33 This screen has 6 possible rows. Touches + // ___ 60 above or below these are ignored. + // . . . (+27) The row between 33 and 60 is [1], though! + // ___ 192 + current_option_num = (inputdata.y - 33) / 27 + 1; + current_option = current_menu->options + current_option_num; - + if(current_option -> option_type & HIDEN_TYPE) break; else if(current_option->option_type & ACTION_TYPE) @@ -4119,7 +3977,7 @@ u32 menu(u16 *screen) break; } // end swith - ds2_flipScreen(DOWN_SCREEN, 2); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); } // end while destroy_dynamic_cheats(); if(bg_screenp != NULL) free((void*)bg_screenp); @@ -4129,28 +3987,18 @@ u32 menu(u16 *screen) game_config.clock_speed_number = clock_speed_number; reorder_latest_file(); - //S9xAutoSaveSRAM (); + S9xAutoSaveSRAM (); save_game_config_file(); } save_emu_config_file(); - mdelay(100); set_cpu_clock(clock_speed_number); - mdelay(200); ds2_clearScreen(DOWN_SCREEN, 0); ds2_flipScreen(DOWN_SCREEN, 1); - ds2_clearScreen(UP_SCREEN, 0); - ds2_flipScreen(UP_SCREEN, 1); - ds2_clearScreen(UP_SCREEN, 0); - ds2_flipScreen(UP_SCREEN, 1); + copy_screen(up_screen_addr, (void*) screen, 0, 0, 256, 192); + ds2_flipScreen(UP_SCREEN, UP_SCREEN_UPDATE_METHOD); ds2_setBacklight(2); -//save game config -// save_game_config_file(); -// save_emu_config_file(); - - -// ds2_setCPUclocklevel(12); wait_Allkey_release(0); return return_value; @@ -4192,6 +4040,7 @@ int load_language_msg(char *filename, u32 language) switch(language) { case ENGLISH: + default: strcpy(start, "STARTENGLISH"); strcpy(end, "ENDENGLISH"); cmplen= 12; @@ -4201,10 +4050,10 @@ int load_language_msg(char *filename, u32 language) strcpy(end, "ENDCHINESESIM"); cmplen= 15; break; - default: - strcpy(start, "STARTENGLISH"); - strcpy(end, "ENDENGLISH"); - cmplen= 12; + case FRENCH: + strcpy(start, "STARTFRENCH"); + strcpy(end, "ENDFRENCH"); + cmplen= 11; break; } //find the start flag @@ -4308,21 +4157,13 @@ void init_game_config(void) { u32 i; - game_config.clock_speed_number = 2; //360MHz - clock_speed_number = 2; - game_config.graphic = 0; + game_config.clock_speed_number = 5; // 396 MHz by default + clock_speed_number = 5; + game_config.graphic = 3; // By default, have a good-looking aspect ratio game_config.gamepad_config_menu = BUTTON_ID_TOUCH; memcpy(game_config.gamepad_config_map, gamepad_config_map_init, sizeof(gamepad_config_map_init)); - for(i = 0; i < MAX_CHEATS; i++) - { - game_config.cheats_flag[i].active = 0; - game_config.cheats_flag[i].name_shot[0] = '\0'; - } - - memset(game_config.cheat_filename, 0x0, MAX_PATH); - game_config.backward = 0; //time backward disable game_config.backward_time = 2; //time backward granularity 1s @@ -4841,7 +4682,7 @@ void gui_init(u32 lang_id) { int flag; - ds2_setCPUclocklevel(11); + ds2_setCPUclocklevel(13); // Crank it up. When the menu starts, -> 0. printf_clock(); //Find the "CATSFC" system directory @@ -4862,23 +4703,23 @@ void gui_init(u32 lang_id) strcpy(main_path, "fat:"); if(search_dir("CATSFC", main_path) == 0) { - printf("Dirctory find: %s\n", main_path); + printf("Found CATSFC directory\r\nDossier CATSFC trouve\r\n\r\n%s\r\n", main_path); } else { - err_msg(DOWN_SCREEN, "Can't fine CATSFC directory, press any key to exit\n"); + err_msg(DOWN_SCREEN, "/CATSFC: Directory missing\r\nPress any key to return to\r\nthe menu\r\n\r\n/CATSFC: Dossier manquant\r\nAppuyer sur une touche pour\r\nretourner au menu"); goto gui_init_err; } } } show_log(down_screen_addr); - ds2_flipScreen(DOWN_SCREEN, 1); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); flag = icon_init(lang_id); if(0 != flag) { - err_msg(DOWN_SCREEN, "some icon can't open when initial GUI, press any key to exit\n"); + err_msg(DOWN_SCREEN, "Some icons are missing\r\nLoad them onto your card\r\nPress any key to return to\r\nthe menu\r\n\r\nDes icones sont manquantes\r\nChargez-les sur votre carte\r\nAppuyer sur une touche pour\r\nretourner au menu"); goto gui_init_err; } @@ -4886,7 +4727,9 @@ void gui_init(u32 lang_id) flag = load_font(); if(0 != flag) { - err_msg(DOWN_SCREEN, "initial font library error, press any key to exit\n"); + char message[512]; + sprintf(message, "Font library initialisation\r\nerror (%d)\r\nPress any key to return to\r\nthe menu\r\n\r\nErreur d'initalisation de la\r\npolice de caracteres (%d)\r\nAppuyer sur une touche pour\r\nretourner au menu", flag, flag); + err_msg(DOWN_SCREEN, message); goto gui_init_err; } @@ -4896,21 +4739,18 @@ void gui_init(u32 lang_id) flag = load_language_msg(LANGUAGE_PACK, lang_id); if(0 != flag) { - err_msg(DOWN_SCREEN, "initial language package error, press any key to exit\n"); + char message[512]; + sprintf(message, "Language pack initialisation\r\nerror (%d)\r\nPress any key to return to\r\nthe menu\r\n\r\nErreur d'initalisation du\r\npack de langue (%d)\r\nAppuyer sur une touche pour\r\nretourner au menu", flag, flag); + err_msg(DOWN_SCREEN, message); goto gui_init_err; } initial_path_config(); - return; gui_init_err: - ds2_flipScreen(DOWN_SCREEN, 1); + ds2_flipScreen(DOWN_SCREEN, DOWN_SCREEN_UPDATE_METHOD); wait_Anykey_press(0); quit(); - while(1); } - - - diff --git a/source/nds/gui.h b/source/nds/gui.h index e845994..9ebaf26 100644 --- a/source/nds/gui.h +++ b/source/nds/gui.h @@ -15,47 +15,46 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */
-
-#ifndef __GUI_H__
-#define __GUI_H__
+ */ + +#ifndef __GUI_H__ +#define __GUI_H__ #include "ds2_types.h" #include "fs_api.h" #include "gcheat.h" -
+ +#define UP_SCREEN_UPDATE_METHOD 0 +#define DOWN_SCREEN_UPDATE_METHOD 2 + #define MAX_GAMEPAD_MAP 16 -
+ #ifdef __cplusplus extern "C" { #endif -
-//
-struct _EMU_CONFIG
-{
- u32 language;
+ +// +struct _EMU_CONFIG +{ + u32 language; char rom_file[256]; char rom_path[256]; char latest_file[5][512]; -};
-
-struct _GAME_CONFIG
-{
+}; + +struct _GAME_CONFIG +{ u32 clock_speed_number; u32 frameskip_type; u32 frameskip_value; u32 graphic; - u32 enable_audio;
- u32 gamepad_config_menu;
+ u32 enable_audio; + u32 gamepad_config_menu; u32 backward; u32 backward_time; - u32 reserve[32];
+ u32 reserve[32]; u32 gamepad_config_map[MAX_GAMEPAD_MAP]; - GCHEAT_STRUCT cheats_flag[MAX_CHEATS]; - char cheat_filename[MAX_PATH]; - unsigned int cheat_str_num; - unsigned int cheat_str_size; -};
+}; typedef enum { @@ -98,28 +97,29 @@ extern char main_path[MAX_PATH]; extern char rom_path[MAX_PATH]; extern u32 game_enable_audio; -
-/******************************************************************************
- ******************************************************************************/
extern char g_default_rom_dir[MAX_PATH];
-extern char DEFAULT_RTS_DIR[MAX_PATH];
-extern char DEFAULT_CFG_DIR[MAX_PATH];
-extern char DEFAULT_SS_DIR[MAX_PATH];
-extern char DEFAULT_CHEAT_DIR[MAX_PATH];
+ +/****************************************************************************** + ******************************************************************************/ +extern char g_default_rom_dir[MAX_PATH]; +extern char DEFAULT_RTS_DIR[MAX_PATH]; +extern char DEFAULT_CFG_DIR[MAX_PATH]; +extern char DEFAULT_SS_DIR[MAX_PATH]; +extern char DEFAULT_CHEAT_DIR[MAX_PATH]; typedef struct _EMU_CONFIG EMU_CONFIG; typedef struct _GAME_CONFIG GAME_CONFIG; -
-extern EMU_CONFIG emu_config;
-extern GAME_CONFIG game_config;
-/******************************************************************************
- ******************************************************************************/
-extern void gui_init(u32 lang_id);
+extern EMU_CONFIG emu_config; +extern GAME_CONFIG game_config; + +/****************************************************************************** + ******************************************************************************/ +extern void gui_init(u32 lang_id); extern u32 menu(u16 *original_screen); extern void game_disableAudio(); #ifdef __cplusplus } #endif -
-#endif //__GUI_H__
+ +#endif //__GUI_H__ diff --git a/source/nds/message.h b/source/nds/message.h index fc6bd33..4a0acd2 100644 --- a/source/nds/message.h +++ b/source/nds/message.h @@ -165,9 +165,11 @@ enum MSG enum LANGUAGE{ ENGLISH, CHINESE_SIMPLIFIED, - CHINESE_TRADITIONAL + FRENCH }; +extern char* lang[3]; // Allocated in gui.c, needs to match the languages ^ + char *msg[MSG_END+1]; char msg_data[16 * 1024]; diff --git a/source/offsets.cpp b/source/offsets.cpp deleted file mode 100644 index 3438488..0000000 --- a/source/offsets.cpp +++ /dev/null @@ -1,421 +0,0 @@ -/******************************************************************************* - Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - - (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and - Jerremy Koot (jkoot@snes9x.com) - - (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) - - (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), - funkyass (funkyass@spam.shaw.ca), - Joel Yliluoma (http://iki.fi/bisqwit/) - Kris Bleakley (codeviolation@hotmail.com), - Matthew Kendora, - Nach (n-a-c-h@users.sourceforge.net), - Peter Bortas (peter@bortas.org) and - zones (kasumitokoduck@yahoo.com) - - C4 x86 assembler and some C emulation code - (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), - _Demo_ (_demo_@zsnes.com), and Nach - - C4 C++ code - (c) Copyright 2003 Brad Jorsch - - DSP-1 emulator code - (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, - John Weidman, neviksti (neviksti@hotmail.com), - Kris Bleakley, Andreas Naive - - DSP-2 emulator code - (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and - Lord Nightmare (lord_nightmare@users.sourceforge.net - - OBC1 emulator code - (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and - Kris Bleakley - Ported from x86 assembler to C by sanmaiwashi - - SPC7110 and RTC C++ emulator code - (c) Copyright 2002 Matthew Kendora with research by - zsKnight, John Weidman, and Dark Force - - S-DD1 C emulator code - (c) Copyright 2003 Brad Jorsch with research by - Andreas Naive and John Weidman - - S-RTC C emulator code - (c) Copyright 2001 John Weidman - - ST010 C++ emulator code - (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - - Super FX C emulator code - (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman - - - SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) - - - Specific ports contains the works of other authors. See headers in - individual files. - - Snes9x homepage: http://www.snes9x.com - - Permission to use, copy, modify and distribute Snes9x in both binary and - source form, for non-commercial purposes, is hereby granted without fee, - providing that this license information and copyright notice appear with - all copies and any derived work. - - This software is provided 'as-is', without any express or implied - warranty. In no event shall the authors be held liable for any damages - arising from the use of this software. - - Snes9x is freeware for PERSONAL USE only. Commercial users should - seek permission of the copyright holders first. Commercial use includes - charging money for Snes9x or software derived from Snes9x. - - The copyright holders request that bug fixes and improvements to the code - should be forwarded to them so everyone can benefit from the modifications - in future versions. - - Super NES and Super Nintendo Entertainment System are trademarks of - Nintendo Co., Limited and its subsidiary companies. -*******************************************************************************/ - -#include "snes9x.h" -#include "65c816.h" -#include "memmap.h" -#include "ppu.h" -#include "apu.h" -#include "cpuexec.h" -#include "sa1.h" - -#ifndef S9xSTREAM -#define S9xSTREAM stdout -#endif - -#define OFFSET(N,F) \ -fprintf (S9xSTREAM, "#define " #N " CPU + %d\n", (int) &((struct SCPUState *) 0)->F); -#define OFFSET2(N,F) \ -fprintf (S9xSTREAM, "#define " #N " Registers + %d\n", (int) &((struct SRegisters *) 0)->F); -#define OFFSET3(F) \ -fprintf (S9xSTREAM, "#define " #F " Memory + %d\n", (int) &((class CMemory *) 0)->F); -#define OFFSET4(N,F) \ -fprintf (S9xSTREAM, "#define " #N " APU + %d\n", (int) &((struct SAPU *) 0)->F); -#define OFFSET5(N,F) \ -fprintf (S9xSTREAM, "#define " #N " IAPU + %d\n", (int) &((struct SIAPU *) 0)->F); -#define OFFSET6(N,F) \ -fprintf (S9xSTREAM, "#define " #N " ICPU + %d\n", (int) &((struct SICPU *) 0)->F); -#define OFFSET7(N,F) \ -fprintf (S9xSTREAM, "#define " #N " Settings + %d\n", (int) &((struct SSettings *) 0)->F); -#define OFFSET8(N, F) \ -fprintf (S9xSTREAM, "#define " #N " APURegisters + %d\n", (int) &((struct SAPURegisters *) 0)->F); - -#define OFFSET9(N, F) \ -fprintf (S9xSTREAM, "#define " #N " PPU + %d\n", (int) &((struct SPPU *) 0)->F); -#define OFFSET10(N, F) \ -fprintf (S9xSTREAM, "#define " #N " IPPU + %d\n", (int) &((struct InternalPPU *) 0)->F); -#define OFFSET11(N, F) \ -fprintf (S9xSTREAM, "#define " #N " SA1 + %d\n", (int) &((struct SSA1 *) 0)->F); -#define OFFSET12(N, F) \ -fprintf (S9xSTREAM, "#define " #N " SA1Registers + %d\n", (int) &((struct SSA1Registers *) 0)->F); - -int main (int /*argc*/, char ** /*argv*/) -{ - OFFSET(Flags,Flags) - OFFSET(BranchSkip,BranchSkip) - OFFSET(NMIActive,NMIActive) - OFFSET(IRQActive,IRQActive) - OFFSET(WaitingForInterrupt,WaitingForInterrupt) - OFFSET(InDMA,InDMA) - OFFSET(WhichEvent,WhichEvent) - OFFSET(PCS,PC) - OFFSET(PCBase,PCBase) - OFFSET(PCAtOpcodeStart,PCAtOpcodeStart) - OFFSET(WaitAddress,WaitAddress) - OFFSET(WaitCounter,WaitCounter) - OFFSET(Cycles,Cycles) - OFFSET(NextEvent,NextEvent) - OFFSET(V_Counter,V_Counter) - OFFSET(MemSpeed,MemSpeed) - OFFSET(MemSpeedx2,MemSpeedx2) - OFFSET(FastROMSpeed,FastROMSpeed) - OFFSET(AutoSaveTimer,AutoSaveTimer) - OFFSET(SRAMModified,SRAMModified) - OFFSET(NMITriggerPoint,NMITriggerPoint) - OFFSET(TriedInterleavedMode2,TriedInterleavedMode2) - OFFSET(BRKTriggered,BRKTriggered) - OFFSET(NMICycleCount,NMICycleCount) - OFFSET(IRQCycleCount,IRQCycleCount) - - OFFSET2(PB,PB) - OFFSET2(DB,DB) - OFFSET2(PP,P.W) - OFFSET2(PL,P.W) - fprintf (S9xSTREAM, "#define PH PL + 1\n"); - OFFSET2(AA,A.W) - OFFSET2(AL,A.W) - fprintf (S9xSTREAM, "#define AH AL + 1\n"); - OFFSET2(DD,D.W) - OFFSET2(DL,D.W) - fprintf (S9xSTREAM, "#define DH DL + 1\n"); - OFFSET2(SS,S.W) - OFFSET2(SL,S.W) - fprintf (S9xSTREAM, "#define SH SL + 1\n"); - OFFSET2(XX,X.W) - OFFSET2(XL,X.W) - fprintf (S9xSTREAM, "#define XH XL + 1\n"); - OFFSET2(YY,Y.W) - OFFSET2(YL,Y.W) - fprintf (S9xSTREAM, "#define YH YL + 1\n"); - OFFSET2(PCR, PC) - - OFFSET3(RAM) - OFFSET3(ROM) - OFFSET3(VRAM) - OFFSET3(SRAM) - OFFSET3(BWRAM) - OFFSET3(FillRAM) - OFFSET3(C4RAM) - OFFSET3(HiROM) - OFFSET3(LoROM) - OFFSET3(SRAMMask) - OFFSET3(SRAMSize) - OFFSET3(Map) - OFFSET3(WriteMap) - OFFSET3(MemorySpeed) - OFFSET3(BlockIsRAM) - OFFSET3(BlockIsROM) - OFFSET3(ROMFilename) - - OFFSET5(APUPCS,PC) - OFFSET5(APURAM,RAM) - OFFSET5(APUExecuting,APUExecuting) - OFFSET5(APUDirectPage,DirectPage) - OFFSET5(APUBit,Bit) - OFFSET5(APUAddress,Address) - OFFSET5(APUWaitAddress1,WaitAddress1) - OFFSET5(APUWaitAddress2,WaitAddress2) - OFFSET5(APUWaitCounter,WaitCounter) - OFFSET5(APUShadowRAM,ShadowRAM) - OFFSET5(APUCachedSamples,CachedSamples) - OFFSET5(APU_Carry,_Carry) - OFFSET5(APU_Zero,_Zero) - OFFSET5(APU_Overflow,_Overflow) - OFFSET5(APUTimerErrorCounter,TimerErrorCounter) - - OFFSET4(APUCycles,Cycles) - OFFSET4(APUShowROM,ShowROM) - OFFSET4(APUFlags,Flags) - OFFSET4(APUKeyedChannels,KeyedChannels) - OFFSET4(APUOutPorts,OutPorts) - OFFSET4(APUDSP,DSP) - OFFSET4(APUExtraRAM,ExtraRAM) - OFFSET4(APUTimer,Timer) - OFFSET4(APUTimerTarget,TimerTarget) - OFFSET4(APUTimerEnabled,TimerEnabled) - OFFSET4(TimerValueWritten,TimerValueWritten) - - OFFSET6(CPUSpeed,Speed) - OFFSET6(CPUOpcodes,S9xOpcodes) - OFFSET6(_Carry,_Carry) - OFFSET6(_Zero,_Zero) - OFFSET6(_Negative,_Negative) - OFFSET6(_Overflow,_Overflow) - OFFSET6(ShiftedDB,ShiftedDB) - OFFSET6(ShiftedPB,ShiftedPB) - OFFSET6(CPUExecuting,CPUExecuting) - OFFSET6(Scanline,Scanline) - OFFSET6(Frame,Frame) - - OFFSET7(APUEnabled,APUEnabled) - OFFSET7(Shutdown,Shutdown) - OFFSET7(SoundSkipMethod,SoundSkipMethod) - OFFSET7(H_Max,H_Max) - OFFSET7(HBlankStart,HBlankStart) - OFFSET7(CyclesPercentage,CyclesPercentage) - OFFSET7(DisableIRQ,DisableIRQ) - OFFSET7(Paused,Paused) - OFFSET7(PAL,PAL) - OFFSET7(SoundSync,SoundSync) - OFFSET7(SA1Enabled,SA1) - OFFSET7(SuperFXEnabled,SuperFX) - - OFFSET8(ApuP,P) - OFFSET8(ApuYA,YA.W) - OFFSET8(ApuA,YA.B.A) - OFFSET8(ApuY,YA.B.Y) - OFFSET8(ApuX,X) - OFFSET8(ApuS,S) - OFFSET8(ApuPC,PC) - OFFSET8(APUPCR,PC) - - OFFSET9(BGMode,BGMode) - OFFSET9(BG3Priority,BG3Priority) - OFFSET9(Brightness,Brightness) - OFFSET9(GHight,VMA.High) - OFFSET9(GInc,VMA.Increment) - OFFSET9(GAddress,VMA.Address) - OFFSET9(GMask1,VMA.Mask1) - OFFSET9(GFullGraphicCount,VMA.FullGraphicCount) - OFFSET9(GShift,VMA.Shift) - OFFSET9(CGFLIP,CGFLIP) - OFFSET9(CGDATA,CGDATA) - OFFSET9(FirstSprite,FirstSprite) - OFFSET9(LastSprite,LastSprite) - OFFSET9(OBJ,OBJ) - OFFSET9(OAMPriorityRotation,OAMPriorityRotation) - OFFSET9(OAMAddr,OAMAddr) - OFFSET9(OAMFlip,OAMFlip) - OFFSET9(OAMTileAddress,OAMTileAddress) - OFFSET9(IRQVBeamPos,IRQVBeamPos) - OFFSET9(IRQHBeamPos,IRQHBeamPos) - OFFSET9(VBeamPosLatched,VBeamPosLatched) - OFFSET9(HBeamPosLatched,HBeamPosLatched) - OFFSET9(HBeamFlip,HBeamFlip) - OFFSET9(VBeamFlip,VBeamFlip) - OFFSET9(HVBeamCounterLatched,HVBeamCounterLatched) - OFFSET9(MatrixA,MatrixA) - OFFSET9(MatrixB,MatrixB) - OFFSET9(MatrixC,MatrixC) - OFFSET9(MatrixD,MatrixD) - OFFSET9(CentreX,CentreX) - OFFSET9(CentreY,CentreY) - OFFSET9(Joypad1ButtonReadPos,Joypad1ButtonReadPos) - OFFSET9(Joypad2ButtonReadPos,Joypad2ButtonReadPos) - OFFSET9(CGADD,CGADD) - OFFSET9(FixedColourGreen,FixedColourGreen) - OFFSET9(FixedColourRed,FixedColourRed) - OFFSET9(FixedColourBlue,FixedColourBlue) - OFFSET9(SavedOAMAddr,SavedOAMAddr) - OFFSET9(ScreenHeight,ScreenHeight) - OFFSET9(WRAM,WRAM) - OFFSET9(BG_Forced,BG_Forced) - OFFSET9(ForcedBlanking,ForcedBlanking) - OFFSET9(OBJThroughMain,OBJThroughMain) - OFFSET9(OBJThroughSub,OBJThroughSub) - OFFSET9(OBJSizeSelect,OBJSizeSelect) - OFFSET9(OBJNameBase,OBJNameBase) - OFFSET9(OAMReadFlip,OAMReadFlip) - OFFSET9(OAMData,OAMData) - OFFSET9(VTimerEnabled,VTimerEnabled) - OFFSET9(HTimerEnabled,HTimerEnabled) - OFFSET9(HTimerPosition,HTimerPosition) - OFFSET9(Mosaic,Mosaic) - OFFSET9(BGMosaic,BGMosaic) - OFFSET9(Mode7HFlip,Mode7HFlip) - OFFSET9(Mode7VFlip,Mode7VFlip) - OFFSET9(Mode7Repeat,Mode7Repeat) - OFFSET9(Window1Left,Window1Left) - OFFSET9(Window1Right,Window1Right) - OFFSET9(Window2Left,Window2Left) - OFFSET9(Window2Right,Window2Right) - OFFSET9(ClipWindowOverlapLogic,ClipWindowOverlapLogic) - OFFSET9(ClipWindow1Enable,ClipWindow1Enable) - OFFSET9(ClipWindow2Enable,ClipWindow2Enable) - OFFSET9(ClipWindow1Inside,ClipWindow1Inside) - OFFSET9(ClipWindow2Inside,ClipWindow2Inside) - OFFSET9(RecomputeClipWindows,RecomputeClipWindows) - OFFSET9(CGFLIPRead,CGFLIPRead) - OFFSET9(OBJNameSelect,OBJNameSelect) - OFFSET9(Need16x8Mulitply,Need16x8Mulitply) - OFFSET9(Joypad3ButtonReadPos,Joypad3ButtonReadPos) - OFFSET9(MouseSpeed,MouseSpeed) - OFFSET9(RangeTimeOver,RangeTimeOver) - - OFFSET10(ColorsChanged,ColorsChanged) - OFFSET10(HDMA,HDMA) - OFFSET10(HDMAStarted,HDMAStarted) - OFFSET10(MaxBrightness,MaxBrightness) - OFFSET10(LatchedBlanking,LatchedBlanking) - OFFSET10(OBJChanged,OBJChanged) - OFFSET10(RenderThisFrame,RenderThisFrame) - OFFSET10(SkippedFrames,SkippedFrames) - OFFSET10(FrameSkip,FrameSkip) - OFFSET10(TileCache,TileCache) - OFFSET10(TileCached,TileCached) -#ifdef CORRECT_VRAM_READS - OFFSET10(VRAMReadBuffer,VRAMReadBuffer) -#else - OFFSET10(FirstVRAMRead,FirstVRAMRead) -#endif - OFFSET10(Interlace,Interlace) - OFFSET10(DoubleWidthPixels,DoubleWidthPixels) - OFFSET10(RenderedScreenHeight,RenderedScreenHeight) - OFFSET10(RenderedScreenWidth,RenderedScreenWidth) - OFFSET10(Red,Red) - OFFSET10(Green,Green) - OFFSET10(Blue,Blue) - OFFSET10(XB,XB) - OFFSET10(ScreenColors,ScreenColors) - OFFSET10(PreviousLine,PreviousLine) - OFFSET10(CurrentLine,CurrentLine) - OFFSET10(Joypads,Joypads) - OFFSET10(SuperScope,SuperScope) - OFFSET10(Mouse,Mouse) - OFFSET10(PrevMouseX,PrevMouseX) - OFFSET10(PrevMouseY,PrevMouseY) - OFFSET10(Clip,Clip) - - OFFSET11(SA1Opcodes,S9xOpcodes) - OFFSET11(SA1_Carry,_Carry) - OFFSET11(SA1_Zero,_Zero) - OFFSET11(SA1_Negative,_Negative) - OFFSET11(SA1_Overflow,_Overflow) - OFFSET11(SA1CPUExecuting,CPUExecuting) - OFFSET11(SA1ShiftedPB,ShiftedPB) - OFFSET11(SA1ShiftedDB,ShiftedDB) - OFFSET11(SA1Flags,Flags) - OFFSET11(SA1Executing,Executing) - OFFSET11(SA1NMIActive,NMIActive) - OFFSET11(SA1IRQActive,IRQActive) - OFFSET11(SA1WaitingForInterrupt,WaitingForInterrupt) - OFFSET11(SA1PCS,PC) - OFFSET11(SA1PCBase,PCBase) - OFFSET11(SA1PCAtOpcodeStart,PCAtOpcodeStart) - OFFSET11(SA1WaitAddress,WaitAddress) - OFFSET11(SA1WaitCounter,WaitCounter) - OFFSET11(SA1WaitByteAddress1,WaitByteAddress1) - OFFSET11(SA1WaitByteAddress2,WaitByteAddress2) - OFFSET11(SA1BWRAM,BWRAM) - OFFSET11(SA1Map,Map) - OFFSET11(SA1WriteMap,WriteMap) - OFFSET11(SA1op1,op1) - OFFSET11(SA1op2,op2) - OFFSET11(SA1arithmetic_op,arithmetic_op) - OFFSET11(SA1sum,sum) - OFFSET11(SA1overflow,overflow) - OFFSET11(VirtualBitmapFormat,VirtualBitmapFormat) - OFFSET11(SA1_in_char_dma,in_char_dma) - OFFSET11(SA1variable_bit_pos,variable_bit_pos) - - OFFSET12(SA1PB,PB) - OFFSET12(SA1DB,DB) - OFFSET12(SA1PP,P.W) - OFFSET12(SA1PL,P.W) - fprintf (S9xSTREAM, "#define SA1PH SA1PL + 1\n"); - OFFSET12(SA1AA,A.W) - OFFSET12(SA1AL,A.W) - fprintf (S9xSTREAM, "#define SA1AH SA1AL + 1\n"); - OFFSET12(SA1DD,D.W) - OFFSET12(SA1DL,D.W) - fprintf (S9xSTREAM, "#define SA1DH SA1DL + 1\n"); - OFFSET12(SA1SS,S.W) - OFFSET12(SA1SL,S.W) - fprintf (S9xSTREAM, "#define SA1SH SA1SL + 1\n"); - OFFSET12(SA1XX,X.W) - OFFSET12(SA1XL,X.W) - fprintf (S9xSTREAM, "#define SA1XH SA1XL + 1\n"); - OFFSET12(SA1YY,Y.W) - OFFSET12(SA1YL,Y.W) - fprintf (S9xSTREAM, "#define SA1YH SA1YL + 1\n"); - OFFSET12(SA1PCR, PC) - - return (0); -} - diff --git a/source/port.h b/source/port.h index ac241b6..5b94d06 100644 --- a/source/port.h +++ b/source/port.h @@ -112,6 +112,10 @@ /* #define PIXEL_FORMAT RGB565 */ #define PIXEL_FORMAT BGR555 +#define FOREVER_16_BIT +// The above is used to disable the 16-bit graphics mode checks sprinkled +// throughout the code, if the pixel format is always 16-bit. + // #define GFX_MULTI_FORMAT #if defined(TARGET_OS_MAC) && TARGET_OS_MAC diff --git a/source/ppu.cpp b/source/ppu.cpp index fc0bd51..def55e9 100644 --- a/source/ppu.cpp +++ b/source/ppu.cpp @@ -117,7 +117,7 @@ uint8 in_bit=0; extern uint8 *HDMAMemPointers [8]; -static inline void S9xLatchCounters (bool force) +void S9xLatchCounters (bool force) { if(!force && !(Memory.FillRAM[0x4213] & 0x80)) return; @@ -204,8 +204,10 @@ void S9xUpdateHTimer () void S9xFixColourBrightness () { IPPU.XB = mul_brightness [PPU.Brightness]; +#ifndef FOREVER_16_BIT if (Settings.SixteenBit) { +#endif for (int i = 0; i < 256; i++) { IPPU.Red [i] = IPPU.XB [PPU.CGDATA [i] & 0x1f]; @@ -214,7 +216,9 @@ void S9xFixColourBrightness () IPPU.ScreenColors [i] = BUILD_PIXEL (IPPU.Red [i], IPPU.Green [i], IPPU.Blue [i]); } +#ifndef FOREVER_16_BIT } +#endif } /******************************************************************************/ @@ -472,8 +476,6 @@ void S9xSetPPU (uint8 Byte, uint16 Address) PPU.VMA.Increment = 32; break; case 2: - PPU.VMA.Increment = 128; - break; case 3: PPU.VMA.Increment = 128; break; @@ -882,28 +884,20 @@ void S9xSetPPU (uint8 Byte, uint16 Address) case 0x2135: case 0x2136: // Matrix 16bit x 8bit multiply result (read-only) - return; - case 0x2137: // Software latch for horizontal and vertical timers (read-only) - return; case 0x2138: // OAM read data (read-only) - return; case 0x2139: case 0x213a: // VRAM read data (read-only) - return; case 0x213b: // CG-RAM read data (read-only) - return; case 0x213c: case 0x213d: // Horizontal and vertical (low/high) read counter (read-only) - return; case 0x213e: // PPU status (time over and range over) - return; case 0x213f: // NTSC/PAL select and field (read-only) return; @@ -969,7 +963,7 @@ void S9xSetPPU (uint8 Byte, uint16 Address) if (Address == 0x2801 && Settings.SRTC) S9xSetSRTC (Byte, Address); else - if (Address < 0x3000 || Address >= 0x3000 + 768) + if (Address < 0x3000 || Address >= 0x3300) { #ifdef DEBUGGER missing.unknownppu_write = Address; @@ -1010,39 +1004,27 @@ void S9xSetPPU (uint8 Byte, uint16 Address) break; case 0x3031: - Memory.FillRAM [Address] = Byte; - break; case 0x3033: + case 0x3037: + case 0x3039: + case 0x303a: + case 0x303f: Memory.FillRAM [Address] = Byte; break; case 0x3034: - Memory.FillRAM [Address] = Byte & 0x7f; - break; case 0x3036: Memory.FillRAM [Address] = Byte & 0x7f; break; - case 0x3037: - Memory.FillRAM [Address] = Byte; - break; case 0x3038: Memory.FillRAM [Address] = Byte; fx_dirtySCBR(); break; - case 0x3039: - Memory.FillRAM [Address] = Byte; - break; - case 0x303a: - Memory.FillRAM [Address] = Byte; - break; case 0x303b: break; case 0x303c: Memory.FillRAM [Address] = Byte; fx_updateRamBank(Byte); break; - case 0x303f: - Memory.FillRAM [Address] = Byte; - break; case 0x301f: Memory.FillRAM [Address] = Byte; Memory.FillRAM [0x3000 + GSU_SFR] |= FLG_G; @@ -1071,10 +1053,17 @@ void S9xSetPPU (uint8 Byte, uint16 Address) /******************************************************************************/ uint8 S9xGetPPU (uint16 Address) { +#ifndef NO_OPEN_BUS uint8 byte = OpenBus; - +#else + uint8 byte = 0; // Arbitrarily chosen value [Neb] +#endif if(Address<0x2100)//not a real PPU reg +#ifndef NO_OPEN_BUS return OpenBus; //treat as unmapped memory returning last byte on the bus +#else + return 0; // Arbitrarily chosen value [Neb] +#endif if (Address <= 0x2190) { switch (Address) @@ -1086,18 +1075,34 @@ uint8 S9xGetPPU (uint16 Address) #ifdef DEBUGGER missing.oam_address_read = 1; #endif - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2104: case 0x2105: case 0x2106: +#ifndef NO_OPEN_BUS return PPU.OpenBus1; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2107: +#ifndef NO_OPEN_BUS return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2108: case 0x2109: case 0x210a: +#ifndef NO_OPEN_BUS return PPU.OpenBus1; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x210b: case 0x210c: case 0x210d: @@ -1107,8 +1112,14 @@ uint8 S9xGetPPU (uint16 Address) case 0x2111: case 0x2112: case 0x2113: - missing.bg_offset_read = 1; - return OpenBus; +#ifdef DEBUGGER + missing.bg_offset_read = 1; +#endif +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2114: #ifdef DEBUGGER @@ -1116,15 +1127,27 @@ uint8 S9xGetPPU (uint16 Address) #endif case 0x2115: case 0x2116: - return PPU.OpenBus1; +#ifndef NO_OPEN_BUS + return PPU.OpenBus1; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2117: - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2118: case 0x2119: case 0x211a: - return PPU.OpenBus1; +#ifndef NO_OPEN_BUS + return PPU.OpenBus1; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x211b: case 0x211c: @@ -1135,26 +1158,16 @@ uint8 S9xGetPPU (uint16 Address) #ifdef DEBUGGER missing.matrix_read = 1; #endif - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2121: case 0x2122: case 0x2123: - return OpenBus; - - case 0x2124: - case 0x2125: - case 0x2126: - return PPU.OpenBus1; - case 0x2127: - return OpenBus; - - case 0x2128: - case 0x2129: - case 0x212a: - return PPU.OpenBus1; - case 0x212b: case 0x212c: case 0x212d: @@ -1164,7 +1177,23 @@ uint8 S9xGetPPU (uint16 Address) case 0x2131: case 0x2132: case 0x2133: - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif + + case 0x2124: + case 0x2125: + case 0x2126: + case 0x2128: + case 0x2129: + case 0x212a: +#ifndef NO_OPEN_BUS + return PPU.OpenBus1; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2134: case 0x2135: @@ -1182,10 +1211,18 @@ uint8 S9xGetPPU (uint16 Address) #ifdef DEBUGGER missing.matrix_multiply = 1; #endif - return (PPU.OpenBus1 = Memory.FillRAM[Address]); + return ( +#ifndef NO_OPEN_BUS + PPU.OpenBus1 = +#endif + Memory.FillRAM[Address]); case 0x2137: S9xLatchCounters(0); +#ifndef NO_OPEN_BUS return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2138: // Read OAM (sprite) control data @@ -1230,7 +1267,11 @@ uint8 S9xGetPPU (uint16 Address) #ifdef DEBUGGER missing.oam_read = 1; #endif - return (PPU.OpenBus1 = byte); + return ( +#ifndef NO_OPEN_BUS + PPU.OpenBus1 = +#endif + byte); case 0x2139: // Read vram low byte @@ -1275,7 +1316,9 @@ uint8 S9xGetPPU (uint16 Address) IPPU.FirstVRAMRead = FALSE; } #endif +#ifndef NO_OPEN_BUS PPU.OpenBus1 = byte; +#endif break; case 0x213A: // Read vram high byte @@ -1319,7 +1362,9 @@ uint8 S9xGetPPU (uint16 Address) IPPU.FirstVRAMRead = FALSE; } #endif +#ifndef NO_OPEN_BUS PPU.OpenBus1 = byte; +#endif break; case 0x213B: @@ -1333,7 +1378,11 @@ uint8 S9xGetPPU (uint16 Address) byte = PPU.CGDATA [PPU.CGADD] & 0xff; PPU.CGFLIPRead ^= 1; - return (PPU.OpenBus2 = byte); + return ( +#ifndef NO_OPEN_BUS + PPU.OpenBus2 = +#endif + byte); case 0x213C: // Horizontal counter value 0-339 @@ -1341,10 +1390,19 @@ uint8 S9xGetPPU (uint16 Address) missing.h_counter_read = 1; #endif if (PPU.HBeamFlip) - byte = (PPU.OpenBus2 & 0xfe) | ((PPU.HBeamPosLatched >> 8) & 0x01); + byte = +#ifndef NO_OPEN_BUS + (PPU.OpenBus2 & 0xfe) +#else + 0 // Arbitrarily chosen value [Neb] +#endif + | ((PPU.HBeamPosLatched >> 8) & 0x01); + else byte = (uint8)PPU.HBeamPosLatched; +#ifndef NO_OPEN_BUS PPU.OpenBus2 = byte; +#endif PPU.HBeamFlip ^= 1; break; @@ -1354,10 +1412,18 @@ uint8 S9xGetPPU (uint16 Address) missing.v_counter_read = 1; #endif if (PPU.VBeamFlip) - byte = (PPU.OpenBus2 & 0xfe) | ((PPU.VBeamPosLatched >> 8) & 0x01); + byte = +#ifndef NO_OPEN_BUS + (PPU.OpenBus2 & 0xfe) +#else + 0 // Arbitrarily chosen value [Neb] +#endif + | ((PPU.VBeamPosLatched >> 8) & 0x01); else byte = (uint8)PPU.VBeamPosLatched; +#ifndef NO_OPEN_BUS PPU.OpenBus2 = byte; +#endif PPU.VBeamFlip ^= 1; break; @@ -1366,14 +1432,22 @@ uint8 S9xGetPPU (uint16 Address) FLUSH_REDRAW (); //so far, 5c77 version is always 1. - return (PPU.OpenBus1 = (Model->_5C77 | PPU.RangeTimeOver)); + return ( +#ifndef NO_OPEN_BUS + PPU.OpenBus1 = +#endif + (Model->_5C77 | PPU.RangeTimeOver)); 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); + return ((Settings.PAL ? 0x10 : 0) | (Memory.FillRAM[0x213f] & 0xc0)| Model->_5C78) +#ifndef NO_OPEN_BUS + | (~PPU.OpenBus2 & 0x20) +#endif + ; case 0x2140: case 0x2141: case 0x2142: case 0x2143: case 0x2144: case 0x2145: case 0x2146: case 0x2147: @@ -1403,7 +1477,7 @@ uint8 S9xGetPPU (uint16 Address) { #ifdef CPU_SHUTDOWN // CPU.WaitAddress = CPU.PCAtOpcodeStart; -#endif +#endif if (SNESGameFixes.APU_OutPorts_ReturnValueFix && Address >= 0x2140 && Address <= 0x2143 && !CPU.V_Counter) { @@ -1418,13 +1492,11 @@ uint8 S9xGetPPU (uint16 Address) { case 0: case 1: + case 3: CPU.BranchSkip = TRUE; break; case 2: break; - case 3: - CPU.BranchSkip = TRUE; - break; } if ((Address & 3) < 2) { @@ -1457,10 +1529,12 @@ uint8 S9xGetPPU (uint16 Address) case 0x2181: case 0x2182: case 0x2183: - return OpenBus; - - default: - return OpenBus; + default: +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif } } else @@ -1474,15 +1548,23 @@ uint8 S9xGetPPU (uint16 Address) { case 0x21c2: if(Model->_5C77 ==2) - return (0x20); + return (0x20); // fprintf(stderr, "Read from $21c2!\n"); - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x21c3: - if(Model->_5C77 ==2) + if(Model->_5C77 ==2) return (0); // fprintf(stderr, "Read from $21c3!\n"); - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x2800: // For Dai Kaijyu Monogatari II if (Settings.SRTC) @@ -1498,12 +1580,20 @@ uint8 S9xGetPPU (uint16 Address) S9xMessage (S9X_TRACE, S9X_PPU_TRACE, String); } #endif - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif } } if (!Settings.SuperFX) - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif #ifdef ZSNES_FX if (Address < 0x3040) byte = S9xSuperFXReadReg (Address); @@ -1804,7 +1894,6 @@ void S9xSetCPU (uint8 byte, uint16 Address) case 0x4216: case 0x4217: // Multiply product (read-only) - return; case 0x4218: case 0x4219: case 0x421a: @@ -2165,7 +2254,11 @@ uint8 S9xGetCPU (uint16 Address) S9xMessage (S9X_TRACE, S9X_PPU_TRACE, String); } #endif - return OpenBus; +#ifndef NO_OPEN_BUS + return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif } // return (Memory.FillRAM [Address]); @@ -2189,7 +2282,11 @@ uint8 S9xGetCPU (uint16 Address) case 0x420d: case 0x420e: case 0x420f: +#ifndef NO_OPEN_BUS return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif case 0x4210: #ifdef CPU_SHUTDOWN @@ -2198,7 +2295,11 @@ uint8 S9xGetCPU (uint16 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) +#ifndef NO_OPEN_BUS + |(OpenBus&0x70) +#endif + |Model->_5A22); case 0x4211: byte = (CPU.IRQActive & (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE)) ? 0x80 : 0; @@ -2207,7 +2308,9 @@ uint8 S9xGetCPU (uint16 Address) CLEAR_IRQ_SOURCE (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE); // Maybe? Register Scan indicated open bus... +#ifndef NO_OPEN_BUS byte |= OpenBus&0x3f; +#endif return (byte); @@ -2216,7 +2319,11 @@ uint8 S9xGetCPU (uint16 Address) #ifdef CPU_SHUTDOWN CPU.WaitAddress = CPU.PCAtOpcodeStart; #endif - return (REGISTER_4212()|(OpenBus&0x3E)); + return (REGISTER_4212() +#ifndef NO_OPEN_BUS + |(OpenBus&0x3E) +#endif + ); case 0x4213: // I/O port input - returns 0 wherever $4201 is 0, and 1 elsewhere @@ -2230,7 +2337,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4217: // Multiplcation result (for multiply) or remainder of // divison. - return (Memory.FillRAM[Address]); case 0x4218: case 0x4219: case 0x421a: @@ -2240,7 +2346,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x421e: case 0x421f: // Joypads 1-4 button and direction state. - return (Memory.FillRAM [Address]); case 0x4300: case 0x4310: @@ -2251,7 +2356,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4360: case 0x4370: // DMA direction, address type, fixed flag, - return (Memory.FillRAM[Address]); case 0x4301: case 0x4311: @@ -2261,7 +2365,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4351: case 0x4361: case 0x4371: - return (Memory.FillRAM[Address]); case 0x4302: case 0x4312: @@ -2271,7 +2374,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4352: case 0x4362: case 0x4372: - return (Memory.FillRAM[Address]); case 0x4303: case 0x4313: @@ -2281,7 +2383,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4353: case 0x4363: case 0x4373: - return (Memory.FillRAM[Address]); case 0x4304: case 0x4314: @@ -2291,7 +2392,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4354: case 0x4364: case 0x4374: - return (Memory.FillRAM[Address]); case 0x4305: case 0x4315: @@ -2301,7 +2401,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4355: case 0x4365: case 0x4375: - return (Memory.FillRAM[Address]); case 0x4306: case 0x4316: @@ -2311,17 +2410,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4356: case 0x4366: case 0x4376: - 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); case 0x4308: case 0x4318: @@ -2331,7 +2419,6 @@ uint8 S9xGetCPU (uint16 Address) case 0x4358: case 0x4368: case 0x4378: - return (Memory.FillRAM[Address]); case 0x4309: case 0x4319: @@ -2343,6 +2430,16 @@ uint8 S9xGetCPU (uint16 Address) 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); + case 0x430A: case 0x431A: case 0x432A: @@ -2401,12 +2498,16 @@ uint8 S9xGetCPU (uint16 Address) return Memory.FillRAM[Address]; } +#ifndef NO_OPEN_BUS return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif } // return (Memory.FillRAM[Address]); } -void S9xResetPPU () +static void CommonPPUReset () { PPU.BGMode = 0; PPU.BG3Priority = 0; @@ -2414,6 +2515,7 @@ void S9xResetPPU () PPU.VMA.High = 0; PPU.VMA.Increment = 1; PPU.VMA.Address = 0; + PPU.VMA.FullGraphicCount = 0; PPU.VMA.Shift = 0; @@ -2437,13 +2539,11 @@ void S9xResetPPU () PPU.ClipCounts[4] = 0; PPU.ClipCounts[5] = 0; PPU.ClipWindowOverlapLogic[4] = PPU.ClipWindowOverlapLogic[5] = CLIP_OR; - PPU.ClipWindow1Enable[4] = PPU.ClipWindow1Enable[5] = FALSE; - PPU.ClipWindow2Enable[4] = PPU.ClipWindow2Enable[5] = FALSE; - PPU.ClipWindow1Inside[4] = PPU.ClipWindow1Inside[5] = TRUE; - PPU.ClipWindow2Inside[4] = PPU.ClipWindow2Inside[5] = TRUE; + PPU.ClipWindow1Enable[4] = PPU.ClipWindow1Enable[5] = PPU.ClipWindow2Enable[4] = PPU.ClipWindow2Enable[5] = FALSE; + PPU.ClipWindow1Inside[4] = PPU.ClipWindow1Inside[5] = PPU.ClipWindow2Inside[4] = PPU.ClipWindow2Inside[5] = TRUE; PPU.CGFLIP = 0; - int c; + uint16 c; for (c = 0; c < 256; c++) { IPPU.Red [c] = (c & 7) << 2; @@ -2469,8 +2569,10 @@ void S9xResetPPU () PPU.OAMPriorityRotation = 0; PPU.OAMWriteRegister = 0; PPU.RangeTimeOver = 0; +#ifndef NO_OPEN_BUS PPU.OpenBus1 = 0; PPU.OpenBus2 = 0; +#endif PPU.OAMFlip = 0; PPU.OAMTileAddress = 0; @@ -2486,9 +2588,6 @@ void S9xResetPPU () PPU.MatrixA = PPU.MatrixB = PPU.MatrixC = PPU.MatrixD = 0; PPU.CentreX = PPU.CentreY = 0; - PPU.Joypad1ButtonReadPos = 0; - PPU.Joypad2ButtonReadPos = 0; - PPU.Joypad3ButtonReadPos = 0; PPU.CGADD = 0; PPU.FixedColourRed = PPU.FixedColourGreen = PPU.FixedColourBlue = 0; @@ -2510,9 +2609,9 @@ void S9xResetPPU () PPU.VTimerEnabled = FALSE; PPU.HTimerEnabled = FALSE; PPU.HTimerPosition = Settings.H_Max + 1; + PPU.Mosaic = 0; - PPU.BGMosaic [0] = PPU.BGMosaic [1] = FALSE; - PPU.BGMosaic [2] = PPU.BGMosaic [3] = FALSE; + PPU.BGMosaic [0] = PPU.BGMosaic [1] = PPU.BGMosaic [2] = PPU.BGMosaic [3] = FALSE; PPU.Mode7HFlip = FALSE; PPU.Mode7VFlip = FALSE; PPU.Mode7Repeat = 0; @@ -2521,6 +2620,7 @@ void S9xResetPPU () PPU.Window2Left = 1; PPU.Window2Right = 0; PPU.RecomputeClipWindows = TRUE; + PPU.CGFLIPRead = 0; PPU.Need16x8Mulitply = FALSE; PPU.MouseSpeed[0] = PPU.MouseSpeed[1] = 0; @@ -2538,6 +2638,7 @@ void S9xResetPPU () IPPU.DisplayedRenderedFrameCount = 0; IPPU.SkippedFrames = 0; IPPU.FrameSkip = 0; + ZeroMemory (IPPU.TileCached [TILE_2BIT], MAX_2BIT_TILES); ZeroMemory (IPPU.TileCached [TILE_4BIT], MAX_4BIT_TILES); ZeroMemory (IPPU.TileCached [TILE_8BIT], MAX_8BIT_TILES); @@ -2553,16 +2654,11 @@ void S9xResetPPU () IPPU.RenderedScreenWidth = SNES_WIDTH; IPPU.RenderedScreenHeight = SNES_HEIGHT; IPPU.XB = NULL; + for (c = 0; c < 256; c++) IPPU.ScreenColors [c] = c; S9xFixColourBrightness (); IPPU.PreviousLine = IPPU.CurrentLine = 0; - IPPU.Joypads[0] = IPPU.Joypads[1] = IPPU.Joypads[2] = 0; - IPPU.Joypads[3] = IPPU.Joypads[4] = 0; - IPPU.SuperScope = 0; - IPPU.Mouse[0] = IPPU.Mouse[1] = 0; - IPPU.PrevMouseX[0] = IPPU.PrevMouseX[1] = 256 / 2; - IPPU.PrevMouseY[0] = IPPU.PrevMouseY[1] = 224 / 2; if (Settings.ControllerOption == 0) IPPU.Controller = SNES_MAX_CONTROLLER_OPTIONS - 1; @@ -2578,7 +2674,31 @@ void S9xResetPPU () S9xProcessMouse (0); S9xProcessMouse (1); } - for (c = 0; c < 0x8000; c += 0x100) + + ZeroMemory (&Memory.FillRAM [0x2100], 0x100); + ZeroMemory (&Memory.FillRAM [0x4200], 0x100); + ZeroMemory (&Memory.FillRAM [0x4000], 0x100); + // For BS Suttehakkun 2... + ZeroMemory (&Memory.FillRAM [0x1000], 0x1000); + + Memory.FillRAM[0x4201]=Memory.FillRAM[0x4213]=0xFF; +} + +void S9xResetPPU () +{ + CommonPPUReset (); + PPU.Joypad1ButtonReadPos = 0; + PPU.Joypad2ButtonReadPos = 0; + PPU.Joypad3ButtonReadPos = 0; + + IPPU.Joypads[0] = IPPU.Joypads[1] = IPPU.Joypads[2] = 0; + IPPU.Joypads[3] = IPPU.Joypads[4] = 0; + IPPU.SuperScope = 0; + IPPU.Mouse[0] = IPPU.Mouse[1] = 0; + IPPU.PrevMouseX[0] = IPPU.PrevMouseX[1] = 256 / 2; + IPPU.PrevMouseY[0] = IPPU.PrevMouseY[1] = 224 / 2; + + for (uint16 c = 0; c < 0x8000; c += 0x100) { if ( !Settings.SuperFX ) { @@ -2592,166 +2712,15 @@ void S9xResetPPU () memset (&Memory.FillRAM [c], c >> 8, 0x100); } } - - ZeroMemory (&Memory.FillRAM [0x2100], 0x100); - ZeroMemory (&Memory.FillRAM [0x4200], 0x100); - ZeroMemory (&Memory.FillRAM [0x4000], 0x100); - // For BS Suttehakkun 2... - ZeroMemory (&Memory.FillRAM [0x1000], 0x1000); - - Memory.FillRAM[0x4201]=Memory.FillRAM[0x4213]=0xFF; } void S9xSoftResetPPU () { - PPU.BGMode = 0; - PPU.BG3Priority = 0; - PPU.Brightness = 0; - PPU.VMA.High = 0; - PPU.VMA.Increment = 1; - PPU.VMA.Address = 0; - PPU.VMA.FullGraphicCount = 0; - PPU.VMA.Shift = 0; - - for (uint8 B = 0; B != 4; B++) - { - PPU.BG[B].SCBase = 0; - PPU.BG[B].VOffset = 0; - PPU.BG[B].HOffset = 0; - PPU.BG[B].BGSize = 0; - PPU.BG[B].NameBase = 0; - PPU.BG[B].SCSize = 0; - - PPU.ClipCounts[B] = 0; - PPU.ClipWindowOverlapLogic [B] = CLIP_OR; - PPU.ClipWindow1Enable[B] = FALSE; - PPU.ClipWindow2Enable[B] = FALSE; - PPU.ClipWindow1Inside[B] = TRUE; - PPU.ClipWindow2Inside[B] = TRUE; - } - - PPU.ClipCounts[4] = 0; - PPU.ClipCounts[5] = 0; - PPU.ClipWindowOverlapLogic[4] = PPU.ClipWindowOverlapLogic[5] = CLIP_OR; - PPU.ClipWindow1Enable[4] = PPU.ClipWindow1Enable[5] = FALSE; - PPU.ClipWindow2Enable[4] = PPU.ClipWindow2Enable[5] = FALSE; - PPU.ClipWindow1Inside[4] = PPU.ClipWindow1Inside[5] = TRUE; - PPU.ClipWindow2Inside[4] = PPU.ClipWindow2Inside[5] = TRUE; - - PPU.CGFLIP = 0; - int 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.FirstSprite = 0; - PPU.LastSprite = 127; - for (int Sprite = 0; Sprite < 128; Sprite++) - { - PPU.OBJ[Sprite].HPos = 0; - PPU.OBJ[Sprite].VPos = 0; - PPU.OBJ[Sprite].VFlip = 0; - PPU.OBJ[Sprite].HFlip = 0; - PPU.OBJ[Sprite].Priority = 0; - PPU.OBJ[Sprite].Palette = 0; - PPU.OBJ[Sprite].Name = 0; - PPU.OBJ[Sprite].Size = 0; - } - PPU.OAMPriorityRotation = 0; - PPU.OAMWriteRegister = 0; - PPU.RangeTimeOver = 0; - PPU.OpenBus1 = 0; - PPU.OpenBus2 = 0; - - PPU.OAMFlip = 0; - PPU.OAMTileAddress = 0; - PPU.OAMAddr = 0; - PPU.IRQVBeamPos = 0; - PPU.IRQHBeamPos = 0; - PPU.VBeamPosLatched = 0; - PPU.HBeamPosLatched = 0; - - PPU.HBeamFlip = 0; - PPU.VBeamFlip = 0; - PPU.HVBeamCounterLatched = 0; - - PPU.MatrixA = PPU.MatrixB = PPU.MatrixC = PPU.MatrixD = 0; - PPU.CentreX = PPU.CentreY = 0; + CommonPPUReset (); // PPU.Joypad1ButtonReadPos = 0; // PPU.Joypad2ButtonReadPos = 0; // PPU.Joypad3ButtonReadPos = 0; - PPU.CGADD = 0; - PPU.FixedColourRed = PPU.FixedColourGreen = PPU.FixedColourBlue = 0; - PPU.SavedOAMAddr = 0; - PPU.ScreenHeight = SNES_HEIGHT; - 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; - ZeroMemory (PPU.OAMData, 512 + 32); - - PPU.VTimerEnabled = FALSE; - PPU.HTimerEnabled = FALSE; - PPU.HTimerPosition = Settings.H_Max + 1; - PPU.Mosaic = 0; - PPU.BGMosaic [0] = PPU.BGMosaic [1] = FALSE; - PPU.BGMosaic [2] = PPU.BGMosaic [3] = FALSE; - PPU.Mode7HFlip = FALSE; - PPU.Mode7VFlip = FALSE; - PPU.Mode7Repeat = 0; - PPU.Window1Left = 1; - PPU.Window1Right = 0; - PPU.Window2Left = 1; - PPU.Window2Right = 0; - PPU.RecomputeClipWindows = TRUE; - PPU.CGFLIPRead = 0; - PPU.Need16x8Mulitply = FALSE; - PPU.MouseSpeed[0] = PPU.MouseSpeed[1] = 0; - IPPU.ColorsChanged = TRUE; - IPPU.HDMA = 0; - IPPU.HDMAStarted = FALSE; - IPPU.MaxBrightness = 0; - IPPU.LatchedBlanking = 0; - IPPU.OBJChanged = TRUE; - IPPU.RenderThisFrame = TRUE; - IPPU.DirectColourMapsNeedRebuild = TRUE; - IPPU.FrameCount = 0; - IPPU.RenderedFramesCount = 0; - IPPU.DisplayedRenderedFrameCount = 0; - IPPU.SkippedFrames = 0; - IPPU.FrameSkip = 0; - ZeroMemory (IPPU.TileCached [TILE_2BIT], MAX_2BIT_TILES); - ZeroMemory (IPPU.TileCached [TILE_4BIT], MAX_4BIT_TILES); - ZeroMemory (IPPU.TileCached [TILE_8BIT], 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; - IPPU.DoubleHeightPixels = FALSE; - IPPU.RenderedScreenWidth = SNES_WIDTH; - IPPU.RenderedScreenHeight = SNES_HEIGHT; - IPPU.XB = NULL; - for (c = 0; c < 256; c++) - IPPU.ScreenColors [c] = c; - S9xFixColourBrightness (); - IPPU.PreviousLine = IPPU.CurrentLine = 0; // IPPU.Joypads[0] = IPPU.Joypads[1] = IPPU.Joypads[2] = 0; // IPPU.Joypads[3] = IPPU.Joypads[4] = 0; // IPPU.SuperScope = 0; @@ -2759,30 +2728,8 @@ void S9xSoftResetPPU () // IPPU.PrevMouseX[0] = IPPU.PrevMouseX[1] = 256 / 2; // IPPU.PrevMouseY[0] = IPPU.PrevMouseY[1] = 224 / 2; - if (Settings.ControllerOption == 0) - IPPU.Controller = SNES_MAX_CONTROLLER_OPTIONS - 1; - else - IPPU.Controller = Settings.ControllerOption - 1; - S9xNextController (); - - for (c = 0; c < 2; c++) - memset (&IPPU.Clip [c], 0, sizeof (struct ClipData)); - - if (Settings.MouseMaster) - { - S9xProcessMouse (0); - S9xProcessMouse (1); - } - for (c = 0; c < 0x8000; c += 0x100) + for (uint16 c = 0; c < 0x8000; c += 0x100) memset (&Memory.FillRAM [c], c >> 8, 0x100); - - ZeroMemory (&Memory.FillRAM [0x2100], 0x100); - ZeroMemory (&Memory.FillRAM [0x4200], 0x100); - ZeroMemory (&Memory.FillRAM [0x4000], 0x100); - // For BS Suttehakkun 2... - ZeroMemory (&Memory.FillRAM [0x1000], 0x1000); - - Memory.FillRAM[0x4201]=Memory.FillRAM[0x4213]=0xFF; } void S9xProcessMouse (int which1) @@ -3042,20 +2989,53 @@ void S9xUpdateJustifiers() void S9xUpdateJoypads () { - int i; + uint32 i; +#ifdef SYNC_JOYPAD_AT_HBLANK + uint32 j, k, KeyValue; + bool8 StartedPressed; + + // For each joypad + for (i = 0; i < 5; i++) + { + IPPU.Joypads [i] = 0; + // Sync each key + for (k = SNES_TR_MASK /* lowest value */; k != SNES_B_MASK << 1 /* one bit past the highest value */; k <<= 1) + { + KeyValue = IPPU.JoypadsAtHBlanks[i][0] & k; + StartedPressed = KeyValue != 0; + // from each line. + // If, initially, the key is NOT pressed, one line of it being + // pressed means that the key MUST be pressed. + // Otherwise, the key MUST be pressed if it doesn't start as such. + for (j = 1; j < (Settings.PAL ? SNES_MAX_PAL_VCOUNTER : SNES_MAX_NTSC_VCOUNTER); j++) + { + if ((StartedPressed) && ((IPPU.JoypadsAtHBlanks[i][j] & k) == 0)) { + KeyValue = 0; + break; + } + else if ((!StartedPressed) && ((IPPU.JoypadsAtHBlanks[i][j] & k) != 0)) { + KeyValue = k; + break; + } + } + IPPU.Joypads [i] |= KeyValue; + } + } +#else for (i = 0; i < 5; i++) { IPPU.Joypads [i] = S9xReadJoypad (i); } +#endif // S9xMovieUpdate(); for (i = 0; i < 5; i++) { - if (IPPU.Joypads [i] & SNES_LEFT_MASK) + if ((IPPU.Joypads [i] & (SNES_LEFT_MASK | SNES_RIGHT_MASK)) == (SNES_LEFT_MASK | SNES_RIGHT_MASK)) IPPU.Joypads [i] &= ~SNES_RIGHT_MASK; - if (IPPU.Joypads [i] & SNES_UP_MASK) + if ((IPPU.Joypads [i] & (SNES_UP_MASK | SNES_DOWN_MASK)) == (SNES_UP_MASK | SNES_DOWN_MASK)) IPPU.Joypads [i] &= ~SNES_DOWN_MASK; } @@ -3297,3 +3277,298 @@ printf ("%06x: %d\n", t, FxEmulate (2000000)); } #endif +// Register reads and writes... + +uint8 REGISTER_4212() +{ + uint8 GetBank = 0; + if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE && + CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE + 3) + GetBank = 1; + + GetBank |= CPU.Cycles >= Settings.HBlankStart ? 0x40 : 0; + if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) + GetBank |= 0x80; /* XXX: 0x80 or 0xc0 ? */ + + return (GetBank); +} + +void FLUSH_REDRAW () +{ + if (IPPU.PreviousLine != IPPU.CurrentLine) + S9xUpdateScreen (); +} + +void REGISTER_2104 (uint8 byte) +{ + if (PPU.OAMAddr & 0x100) + { + int addr = ((PPU.OAMAddr & 0x10f) << 1) + (PPU.OAMFlip & 1); + if (byte != PPU.OAMData [addr]){ + FLUSH_REDRAW (); + PPU.OAMData [addr] = byte; + IPPU.OBJChanged = TRUE; + + // X position high bit, and sprite size (x4) + struct SOBJ *pObj = &PPU.OBJ [(addr & 0x1f) * 4]; + + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 0) & 1]; + pObj++->Size = byte & 2; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 2) & 1]; + pObj++->Size = byte & 8; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 4) & 1]; + pObj++->Size = byte & 32; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 6) & 1]; + pObj->Size = byte & 128; + } + PPU.OAMFlip ^= 1; + if(!(PPU.OAMFlip & 1)){ + ++PPU.OAMAddr; + PPU.OAMAddr &= 0x1ff; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 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; + } else { + PPU.OAMWriteRegister &= 0x00ff; + uint8 lowbyte = (uint8)(PPU.OAMWriteRegister); + uint8 highbyte = byte; + PPU.OAMWriteRegister |= byte << 8; + + int addr = (PPU.OAMAddr << 1); + + if (lowbyte != PPU.OAMData [addr] || + highbyte != PPU.OAMData [addr+1]) + { + FLUSH_REDRAW (); + PPU.OAMData [addr] = lowbyte; + PPU.OAMData [addr+1] = highbyte; + IPPU.OBJChanged = TRUE; + if (addr & 2) + { + // Tile + PPU.OBJ[addr = PPU.OAMAddr >> 1].Name = PPU.OAMWriteRegister & 0x1ff; + + // priority, h and v flip. + PPU.OBJ[addr].Palette = (highbyte >> 1) & 7; + PPU.OBJ[addr].Priority = (highbyte >> 4) & 3; + PPU.OBJ[addr].HFlip = (highbyte >> 6) & 1; + PPU.OBJ[addr].VFlip = (highbyte >> 7) & 1; + } + else + { + // X position (low) + PPU.OBJ[addr = PPU.OAMAddr >> 1].HPos &= 0xFF00; + PPU.OBJ[addr].HPos |= lowbyte; + + // Sprite Y position + PPU.OBJ[addr].VPos = highbyte; + } + } + PPU.OAMFlip &= ~1; + ++PPU.OAMAddr; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 1; + IPPU.OBJChanged = TRUE; + } + } + + Memory.FillRAM [0x2104] = byte; +} + +void REGISTER_2118 (uint8 Byte) +{ + uint32 address; + if (PPU.VMA.FullGraphicCount) + { + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; + Memory.VRAM [address] = Byte; + } + else + { + Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xFFFF] = Byte; + } + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (!PPU.VMA.High) + { +#ifdef DEBUGGER + if (Settings.TraceVRAM && !CPU.InDMA) + { + printf ("VRAM write byte: $%04X (%d,%d)\n", PPU.VMA.Address, + Memory.FillRAM[0x2115] & 3, + (Memory.FillRAM [0x2115] & 0x0c) >> 2); + } +#endif + PPU.VMA.Address += PPU.VMA.Increment; + } +// Memory.FillRAM [0x2118] = Byte; +} + +void REGISTER_2118_tile (uint8 Byte) +{ + uint32 address; + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; + Memory.VRAM [address] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (!PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +// Memory.FillRAM [0x2118] = Byte; +} + +void REGISTER_2118_linear (uint8 Byte) +{ + uint32 address; + Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xFFFF] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (!PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +// Memory.FillRAM [0x2118] = Byte; +} + +void REGISTER_2119 (uint8 Byte) +{ + uint32 address; + if (PPU.VMA.FullGraphicCount) + { + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; + Memory.VRAM [address] = Byte; + } + else + { + Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF] = Byte; + } + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (PPU.VMA.High) + { +#ifdef DEBUGGER + if (Settings.TraceVRAM && !CPU.InDMA) + { + printf ("VRAM write word: $%04X (%d,%d)\n", PPU.VMA.Address, + Memory.FillRAM[0x2115] & 3, + (Memory.FillRAM [0x2115] & 0x0c) >> 2); + } +#endif + PPU.VMA.Address += PPU.VMA.Increment; + } +// Memory.FillRAM [0x2119] = Byte; +} + +void REGISTER_2119_tile (uint8 Byte) +{ + uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + uint32 address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; + Memory.VRAM [address] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +// Memory.FillRAM [0x2119] = Byte; +} + +void REGISTER_2119_linear (uint8 Byte) +{ + uint32 address; + Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF] = Byte; + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; + if (PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +// Memory.FillRAM [0x2119] = Byte; +} + +void REGISTER_2122(uint8 Byte) +{ + // CG-RAM (palette) write + + if (PPU.CGFLIP) + { + if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) + { +#ifndef FOREVER_16_BIT + if (Settings.SixteenBit) +#endif + FLUSH_REDRAW (); + PPU.CGDATA[PPU.CGADD] &= 0x00FF; + PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8; + IPPU.ColorsChanged = TRUE; +#ifndef FOREVER_16_BIT + if (Settings.SixteenBit) + { +#endif + IPPU.Blue [PPU.CGADD] = IPPU.XB [(Byte >> 2) & 0x1f]; + IPPU.Green [PPU.CGADD] = IPPU.XB [(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; + IPPU.ScreenColors [PPU.CGADD] = (uint16) BUILD_PIXEL (IPPU.Red [PPU.CGADD], + IPPU.Green [PPU.CGADD], + IPPU.Blue [PPU.CGADD]); +#ifndef FOREVER_16_BIT + } +#endif + } + PPU.CGADD++; + } + else + { + if (Byte != (uint8) (PPU.CGDATA[PPU.CGADD] & 0xff)) + { +#ifndef FOREVER_16_BIT + if (Settings.SixteenBit) +#endif + FLUSH_REDRAW (); + PPU.CGDATA[PPU.CGADD] &= 0x7F00; + PPU.CGDATA[PPU.CGADD] |= Byte; + IPPU.ColorsChanged = TRUE; +#ifndef FOREVER_16_BIT + if (Settings.SixteenBit) + { +#endif + 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) BUILD_PIXEL (IPPU.Red [PPU.CGADD], + IPPU.Green [PPU.CGADD], + IPPU.Blue [PPU.CGADD]); +#ifndef FOREVER_16_BIT + } +#endif + } + } + PPU.CGFLIP ^= 1; +// Memory.FillRAM [0x2122] = Byte; +} + +void REGISTER_2180(uint8 Byte) +{ + Memory.RAM[PPU.WRAM++] = Byte; + PPU.WRAM &= 0x1FFFF; + Memory.FillRAM [0x2180] = Byte; +} diff --git a/source/ppu.h b/source/ppu.h index 99dde34..065ad5f 100644 --- a/source/ppu.h +++ b/source/ppu.h @@ -151,6 +151,9 @@ struct InternalPPU { int CurrentLine; int Controller; uint32 Joypads[5]; +#ifdef SYNC_JOYPAD_AT_HBLANK + uint32 JoypadsAtHBlanks[5][SNES_MAX_PAL_VCOUNTER]; +#endif uint32 SuperScope; uint32 Mouse[2]; int PrevMouseX[2]; @@ -266,8 +269,10 @@ struct SPPU { // XXX Do these need to be added to snapshot.cpp? uint16 OAMWriteRegister; uint8 BGnxOFSbyte; +#ifndef NO_OPEN_BUS uint8 OpenBus1; uint8 OpenBus2; +#endif }; #define CLIP_OR 0 @@ -342,288 +347,17 @@ END_EXTERN_C #define MAX_5C78_VERSION 0x03 #define MAX_5A22_VERSION 0x02 -STATIC inline uint8 REGISTER_4212() -{ - GetBank = 0; - if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE && - CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE + 3) - GetBank = 1; - - GetBank |= CPU.Cycles >= Settings.HBlankStart ? 0x40 : 0; - if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) - GetBank |= 0x80; /* XXX: 0x80 or 0xc0 ? */ - - return (GetBank); -} - -STATIC inline void FLUSH_REDRAW () -{ - if (IPPU.PreviousLine != IPPU.CurrentLine) - S9xUpdateScreen (); -} - -STATIC inline void REGISTER_2104 (uint8 byte) -{ - if (PPU.OAMAddr & 0x100) - { - int addr = ((PPU.OAMAddr & 0x10f) << 1) + (PPU.OAMFlip & 1); - if (byte != PPU.OAMData [addr]){ - FLUSH_REDRAW (); - PPU.OAMData [addr] = byte; - IPPU.OBJChanged = TRUE; - - // X position high bit, and sprite size (x4) - struct SOBJ *pObj = &PPU.OBJ [(addr & 0x1f) * 4]; - - pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 0) & 1]; - pObj++->Size = byte & 2; - pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 2) & 1]; - pObj++->Size = byte & 8; - pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 4) & 1]; - pObj++->Size = byte & 32; - pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 6) & 1]; - pObj->Size = byte & 128; - } - PPU.OAMFlip ^= 1; - if(!(PPU.OAMFlip & 1)){ - ++PPU.OAMAddr; - PPU.OAMAddr &= 0x1ff; - if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) - { - PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 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; - } else { - PPU.OAMWriteRegister &= 0x00ff; - uint8 lowbyte = (uint8)(PPU.OAMWriteRegister); - uint8 highbyte = byte; - PPU.OAMWriteRegister |= byte << 8; - - int addr = (PPU.OAMAddr << 1); - - if (lowbyte != PPU.OAMData [addr] || - highbyte != PPU.OAMData [addr+1]) - { - FLUSH_REDRAW (); - PPU.OAMData [addr] = lowbyte; - PPU.OAMData [addr+1] = highbyte; - IPPU.OBJChanged = TRUE; - if (addr & 2) - { - // Tile - PPU.OBJ[addr = PPU.OAMAddr >> 1].Name = PPU.OAMWriteRegister & 0x1ff; - - // priority, h and v flip. - PPU.OBJ[addr].Palette = (highbyte >> 1) & 7; - PPU.OBJ[addr].Priority = (highbyte >> 4) & 3; - PPU.OBJ[addr].HFlip = (highbyte >> 6) & 1; - PPU.OBJ[addr].VFlip = (highbyte >> 7) & 1; - } - else - { - // X position (low) - PPU.OBJ[addr = PPU.OAMAddr >> 1].HPos &= 0xFF00; - PPU.OBJ[addr].HPos |= lowbyte; - - // Sprite Y position - PPU.OBJ[addr].VPos = highbyte; - } - } - PPU.OAMFlip &= ~1; - ++PPU.OAMAddr; - if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) - { - PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 1; - IPPU.OBJChanged = TRUE; - } - } - - Memory.FillRAM [0x2104] = byte; -} - -STATIC inline void REGISTER_2118 (uint8 Byte) -{ - uint32 address; - if (PPU.VMA.FullGraphicCount) - { - uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; - address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; - Memory.VRAM [address] = Byte; - } - else - { - Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xFFFF] = Byte; - } - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (!PPU.VMA.High) - { -#ifdef DEBUGGER - if (Settings.TraceVRAM && !CPU.InDMA) - { - printf ("VRAM write byte: $%04X (%d,%d)\n", PPU.VMA.Address, - Memory.FillRAM[0x2115] & 3, - (Memory.FillRAM [0x2115] & 0x0c) >> 2); - } -#endif - PPU.VMA.Address += PPU.VMA.Increment; - } -// Memory.FillRAM [0x2118] = Byte; -} - -STATIC inline void REGISTER_2118_tile (uint8 Byte) -{ - uint32 address; - uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; - address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; - Memory.VRAM [address] = Byte; - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (!PPU.VMA.High) - PPU.VMA.Address += PPU.VMA.Increment; -// Memory.FillRAM [0x2118] = Byte; -} - -STATIC inline void REGISTER_2118_linear (uint8 Byte) -{ - uint32 address; - Memory.VRAM[address = (PPU.VMA.Address << 1) & 0xFFFF] = Byte; - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (!PPU.VMA.High) - PPU.VMA.Address += PPU.VMA.Increment; -// Memory.FillRAM [0x2118] = Byte; -} - -STATIC inline void REGISTER_2119 (uint8 Byte) -{ - uint32 address; - if (PPU.VMA.FullGraphicCount) - { - uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; - address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; - Memory.VRAM [address] = Byte; - } - else - { - Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF] = Byte; - } - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (PPU.VMA.High) - { -#ifdef DEBUGGER - if (Settings.TraceVRAM && !CPU.InDMA) - { - printf ("VRAM write word: $%04X (%d,%d)\n", PPU.VMA.Address, - Memory.FillRAM[0x2115] & 3, - (Memory.FillRAM [0x2115] & 0x0c) >> 2); - } -#endif - PPU.VMA.Address += PPU.VMA.Increment; - } -// Memory.FillRAM [0x2119] = Byte; -} - -STATIC inline void REGISTER_2119_tile (uint8 Byte) -{ - uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; - uint32 address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + - (rem >> PPU.VMA.Shift) + - ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; - Memory.VRAM [address] = Byte; - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (PPU.VMA.High) - PPU.VMA.Address += PPU.VMA.Increment; -// Memory.FillRAM [0x2119] = Byte; -} - -STATIC inline void REGISTER_2119_linear (uint8 Byte) -{ - uint32 address; - Memory.VRAM[address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF] = Byte; - IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; - IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; - IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; - if (PPU.VMA.High) - PPU.VMA.Address += PPU.VMA.Increment; -// Memory.FillRAM [0x2119] = Byte; -} - -STATIC inline void REGISTER_2122(uint8 Byte) -{ - // CG-RAM (palette) write - - if (PPU.CGFLIP) - { - if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) - { - if (Settings.SixteenBit) - FLUSH_REDRAW (); - PPU.CGDATA[PPU.CGADD] &= 0x00FF; - PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8; - IPPU.ColorsChanged = TRUE; - if (Settings.SixteenBit) - { - IPPU.Blue [PPU.CGADD] = IPPU.XB [(Byte >> 2) & 0x1f]; - IPPU.Green [PPU.CGADD] = IPPU.XB [(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; - IPPU.ScreenColors [PPU.CGADD] = (uint16) BUILD_PIXEL (IPPU.Red [PPU.CGADD], - IPPU.Green [PPU.CGADD], - IPPU.Blue [PPU.CGADD]); - } - } - PPU.CGADD++; - } - else - { - if (Byte != (uint8) (PPU.CGDATA[PPU.CGADD] & 0xff)) - { - if (Settings.SixteenBit) - FLUSH_REDRAW (); - PPU.CGDATA[PPU.CGADD] &= 0x7F00; - PPU.CGDATA[PPU.CGADD] |= Byte; - IPPU.ColorsChanged = TRUE; - if (Settings.SixteenBit) - { - 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) BUILD_PIXEL (IPPU.Red [PPU.CGADD], - IPPU.Green [PPU.CGADD], - IPPU.Blue [PPU.CGADD]); - } - } - } - PPU.CGFLIP ^= 1; -// Memory.FillRAM [0x2122] = Byte; -} - -STATIC inline void REGISTER_2180(uint8 Byte) -{ - Memory.RAM[PPU.WRAM++] = Byte; - PPU.WRAM &= 0x1FFFF; - Memory.FillRAM [0x2180] = Byte; -} - +extern uint8 REGISTER_4212(); +extern void FLUSH_REDRAW (); +extern void REGISTER_2104 (uint8 byte); +extern void REGISTER_2118 (uint8 Byte); +extern void REGISTER_2118_tile (uint8 Byte); +extern void REGISTER_2118_linear (uint8 Byte); +extern void REGISTER_2119 (uint8 Byte); +extern void REGISTER_2119_tile (uint8 Byte); +extern void REGISTER_2119_linear (uint8 Byte); +extern void REGISTER_2122(uint8 Byte); +extern void REGISTER_2180(uint8 Byte); //Platform specific input functions used by PPU.CPP void JustifierButtons(uint32&); diff --git a/source/sa1.cpp b/source/sa1.cpp index 39b08bb..1f6b13f 100644 --- a/source/sa1.cpp +++ b/source/sa1.cpp @@ -122,16 +122,16 @@ void S9xSA1Init () void S9xSA1Reset () { - SA1Registers.PB = 0; - SA1Registers.PC = Memory.FillRAM [0x2203] | + SA1.Registers.PB = 0; + SA1.Registers.PC = Memory.FillRAM [0x2203] | (Memory.FillRAM [0x2204] << 8); - SA1Registers.D.W = 0; - SA1Registers.DB = 0; - SA1Registers.SH = 1; - SA1Registers.SL = 0xFF; - SA1Registers.XH = 0; - SA1Registers.YH = 0; - SA1Registers.P.W = 0; + SA1.Registers.D.W = 0; + SA1.Registers.DB = 0; + SA1.Registers.SH = 1; + SA1.Registers.SL = 0xFF; + SA1.Registers.XH = 0; + SA1.Registers.YH = 0; + SA1.Registers.P.W = 0; SA1.ShiftedPB = 0; SA1.ShiftedDB = 0; @@ -141,7 +141,7 @@ void S9xSA1Reset () SA1.WaitingForInterrupt = FALSE; SA1.PC = NULL; SA1.PCBase = NULL; - S9xSA1SetPCBase (SA1Registers.PC); + S9xSA1SetPCBase (SA1.Registers.PC); SA1.S9xOpcodes = S9xSA1OpcodesM1X1; S9xSA1UnpackStatus(); @@ -181,10 +181,10 @@ void S9xSA1SetBWRAMMemMap (uint8 val) void S9xFixSA1AfterSnapshotLoad () { - SA1.ShiftedPB = (uint32) SA1Registers.PB << 16; - SA1.ShiftedDB = (uint32) SA1Registers.DB << 16; + SA1.ShiftedPB = (uint32) SA1.Registers.PB << 16; + SA1.ShiftedDB = (uint32) SA1.Registers.DB << 16; - S9xSA1SetPCBase (SA1.ShiftedPB + SA1Registers.PC); + S9xSA1SetPCBase (SA1.ShiftedPB + SA1.Registers.PC); S9xSA1UnpackStatus (); S9xSA1FixCycles (); SA1.VirtualBitmapFormat = (Memory.FillRAM [0x223f] & 0x80) ? 2 : 4; @@ -228,14 +228,23 @@ uint8 S9xSA1GetByte (uint32 address) #ifdef DEBUGGER // printf ("R(B) %06x\n", address); #endif +#ifndef NO_OPEN_BUS return OpenBus; +#else + return 0; // Arbitrarily chosen value [Neb] +#endif } } uint16 S9xSA1GetWord (uint32 address) { +#ifndef NO_OPEN_BUS OpenBus = S9xSA1GetByte (address); return (OpenBus | (S9xSA1GetByte (address + 1) << 8)); +#else + uint8 Split = S9xSA1GetByte (address); + return (Split | (S9xSA1GetByte (address + 1) << 8)); +#endif } void S9xSA1SetByte (uint8 byte, uint32 address) diff --git a/source/sa1.h b/source/sa1.h index 21353d5..708fb68 100644 --- a/source/sa1.h +++ b/source/sa1.h @@ -141,21 +141,22 @@ struct SSA1 { uint8 VirtualBitmapFormat; bool8 in_char_dma; uint8 variable_bit_pos; + struct SSA1Registers Registers; }; #define SA1CheckZero() (SA1._Zero == 0) #define SA1CheckCarry() (SA1._Carry) -#define SA1CheckIRQ() (SA1Registers.PL & IRQ) -#define SA1CheckDecimal() (SA1Registers.PL & Decimal) -#define SA1CheckIndex() (SA1Registers.PL & IndexFlag) -#define SA1CheckMemory() (SA1Registers.PL & MemoryFlag) +#define SA1CheckIRQ() (SA1.Registers.PL & IRQ) +#define SA1CheckDecimal() (SA1.Registers.PL & Decimal) +#define SA1CheckIndex() (SA1.Registers.PL & IndexFlag) +#define SA1CheckMemory() (SA1.Registers.PL & MemoryFlag) #define SA1CheckOverflow() (SA1._Overflow) #define SA1CheckNegative() (SA1._Negative & 0x80) -#define SA1CheckEmulation() (SA1Registers.P.W & Emulation) +#define SA1CheckEmulation() (SA1.Registers.P.W & Emulation) -#define SA1ClearFlags(f) (SA1Registers.P.W &= ~(f)) -#define SA1SetFlags(f) (SA1Registers.P.W |= (f)) -#define SA1CheckFlag(f) (SA1Registers.PL & (f)) +#define SA1ClearFlags(f) (SA1.Registers.P.W &= ~(f)) +#define SA1SetFlags(f) (SA1.Registers.P.W |= (f)) +#define SA1CheckFlag(f) (SA1.Registers.PL & (f)) START_EXTERN_C @@ -171,7 +172,6 @@ extern struct SOpcodes S9xSA1OpcodesM1X1 [256]; extern struct SOpcodes S9xSA1OpcodesM1X0 [256]; extern struct SOpcodes S9xSA1OpcodesM0X1 [256]; extern struct SOpcodes S9xSA1OpcodesM0X0 [256]; -extern struct SSA1Registers SA1Registers; extern struct SSA1 SA1; void S9xSA1MainLoop (); @@ -186,16 +186,16 @@ END_EXTERN_C STATIC inline void S9xSA1UnpackStatus() { - SA1._Zero = (SA1Registers.PL & Zero) == 0; - SA1._Negative = (SA1Registers.PL & Negative); - SA1._Carry = (SA1Registers.PL & Carry); - SA1._Overflow = (SA1Registers.PL & Overflow) >> 6; + SA1._Zero = (SA1.Registers.PL & Zero) == 0; + SA1._Negative = (SA1.Registers.PL & Negative); + SA1._Carry = (SA1.Registers.PL & Carry); + SA1._Overflow = (SA1.Registers.PL & Overflow) >> 6; } STATIC inline void S9xSA1PackStatus() { - SA1Registers.PL &= ~(Zero | Negative | Carry | Overflow); - SA1Registers.PL |= SA1._Carry | ((SA1._Zero == 0) << 1) | + SA1.Registers.PL &= ~(Zero | Negative | Carry | Overflow); + SA1.Registers.PL |= SA1._Carry | ((SA1._Zero == 0) << 1) | (SA1._Negative & 0x80) | (SA1._Overflow << 6); } diff --git a/source/sa1cpu.cpp b/source/sa1cpu.cpp index 1532f57..5382528 100644 --- a/source/sa1cpu.cpp +++ b/source/sa1cpu.cpp @@ -95,7 +95,6 @@ #include "sa1.h" #define CPU SA1 #define ICPU SA1 -#define Registers SA1Registers #define S9xGetByte S9xSA1GetByte #define S9xGetWord S9xSA1GetWord #define S9xSetByte S9xSA1SetByte @@ -134,6 +133,69 @@ #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 CPU_SHUTDOWN #undef VAR_CYCLES #define SA1_OPCODES diff --git a/source/snaporig.cpp b/source/snaporig.cpp index 090c378..219f67f 100644 --- a/source/snaporig.cpp +++ b/source/snaporig.cpp @@ -230,7 +230,7 @@ static int ReadOrigSnapshot (STREAM snap) if ((result = ReadBlock ("REG:", &OrigRegisters, sizeof (OrigRegisters), snap)) != SUCCESS) return (result); - Registers = *(struct SRegisters *) &OrigRegisters; + ICPU.Registers = *(struct SRegisters *) &OrigRegisters; if ((result = ReadBlock ("PPU:", &OrigPPU, sizeof (OrigPPU), snap)) != SUCCESS) return (result); @@ -379,7 +379,7 @@ static int ReadOrigSnapshot (STREAM snap) if ((result = ReadBlock ("ARE:", &OrigAPURegisters, sizeof (OrigAPURegisters), snap)) != SUCCESS) return (result); - APURegisters = *(struct SAPURegisters *) &OrigAPURegisters; + IAPU.Registers = *(struct SAPURegisters *) &OrigAPURegisters; if ((result = ReadBlock ("ARA:", IAPU.RAM, 0x10000, snap)) != SUCCESS) return (result); if ((result = ReadBlock ("SOU:", &OrigSoundData, @@ -437,7 +437,7 @@ static int ReadOrigSnapshot (STREAM snap) } S9xSetSoundMute (FALSE); - IAPU.PC = IAPU.RAM + APURegisters.PC; + IAPU.PC = IAPU.RAM + IAPU.Registers.PC; S9xAPUUnpackStatus (); if (APUCheckDirectPage ()) IAPU.DirectPage = IAPU.RAM + 0x100; @@ -453,9 +453,9 @@ static int ReadOrigSnapshot (STREAM snap) S9xSetSoundMute (TRUE); } S9xFixSoundAfterSnapshotLoad (); - ICPU.ShiftedPB = Registers.PB << 16; - ICPU.ShiftedDB = Registers.DB << 16; - S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ICPU.Registers.PC); S9xUnpackStatus (); S9xFixCycles (); S9xReschedule (); diff --git a/source/snapshot.cpp b/source/snapshot.cpp index fda8d62..8dd7f8c 100644 --- a/source/snapshot.cpp +++ b/source/snapshot.cpp @@ -658,7 +658,7 @@ void S9xFreezeToStream (STREAM stream) Memory.ROMFilename, 0); WRITE_STREAM (buffer, strlen (buffer) + 1, stream); FreezeStruct (stream, "CPU", &CPU, SnapCPU, COUNT (SnapCPU)); - FreezeStruct (stream, "REG", &Registers, SnapRegisters, COUNT (SnapRegisters)); + FreezeStruct (stream, "REG", &ICPU.Registers, SnapRegisters, COUNT (SnapRegisters)); FreezeStruct (stream, "PPU", &PPU, SnapPPU, COUNT (SnapPPU)); FreezeStruct (stream, "DMA", DMA, SnapDMA, COUNT (SnapDMA)); @@ -671,7 +671,7 @@ void S9xFreezeToStream (STREAM stream) { // APU FreezeStruct (stream, "APU", &APU, SnapAPU, COUNT (SnapAPU)); - FreezeStruct (stream, "ARE", &APURegisters, SnapAPURegisters, + FreezeStruct (stream, "ARE", &IAPU.Registers, SnapAPURegisters, COUNT (SnapAPURegisters)); FreezeBlock (stream, "ARA", IAPU.RAM, 0x10000); FreezeStruct (stream, "SOU", &SoundData, SnapSoundData, @@ -679,10 +679,10 @@ void S9xFreezeToStream (STREAM stream) } if (Settings.SA1) { - SA1Registers.PC = SA1.PC - SA1.PCBase; + SA1.Registers.PC = SA1.PC - SA1.PCBase; S9xSA1PackStatus (); FreezeStruct (stream, "SA1", &SA1, SnapSA1, COUNT (SnapSA1)); - FreezeStruct (stream, "SAR", &SA1Registers, SnapSA1Registers, + FreezeStruct (stream, "SAR", &SA1.Registers, SnapSA1Registers, COUNT (SnapSA1Registers)); } @@ -841,7 +841,7 @@ int S9xUnfreezeFromStream (STREAM stream) S9xSetSoundMute (TRUE); UnfreezeStructFromCopy (&CPU, SnapCPU, COUNT (SnapCPU), local_cpu); - UnfreezeStructFromCopy (&Registers, SnapRegisters, COUNT (SnapRegisters), local_registers); + UnfreezeStructFromCopy (&ICPU.Registers, SnapRegisters, COUNT (SnapRegisters), local_registers); UnfreezeStructFromCopy (&PPU, SnapPPU, COUNT (SnapPPU), local_ppu); UnfreezeStructFromCopy (DMA, SnapDMA, COUNT (SnapDMA), local_dma); memcpy (Memory.VRAM, local_vram, 0x10000); @@ -851,14 +851,14 @@ int S9xUnfreezeFromStream (STREAM stream) if(local_apu) { UnfreezeStructFromCopy (&APU, SnapAPU, COUNT (SnapAPU), local_apu); - UnfreezeStructFromCopy (&APURegisters, SnapAPURegisters, COUNT (SnapAPURegisters), local_apu_registers); + UnfreezeStructFromCopy (&IAPU.Registers, SnapAPURegisters, COUNT (SnapAPURegisters), local_apu_registers); memcpy (IAPU.RAM, local_apu_ram, 0x10000); UnfreezeStructFromCopy (&SoundData, SnapSoundData, COUNT (SnapSoundData), local_apu_sounddata); } if(local_sa1) { UnfreezeStructFromCopy (&SA1, SnapSA1, COUNT (SnapSA1), local_sa1); - UnfreezeStructFromCopy (&SA1Registers, SnapSA1Registers, COUNT (SnapSA1Registers), local_sa1_registers); + UnfreezeStructFromCopy (&SA1.Registers, SnapSA1Registers, COUNT (SnapSA1Registers), local_sa1_registers); } if(local_spc) { @@ -882,7 +882,7 @@ int S9xUnfreezeFromStream (STREAM stream) if (local_apu) { S9xSetSoundMute (FALSE); - IAPU.PC = IAPU.RAM + APURegisters.PC; + IAPU.PC = IAPU.RAM + IAPU.Registers.PC; S9xAPUUnpackStatus (); if (APUCheckDirectPage ()) IAPU.DirectPage = IAPU.RAM + 0x100; @@ -921,9 +921,9 @@ int S9xUnfreezeFromStream (STREAM stream) Memory.FillRAM[0x4213]=Memory.FillRAM[0x4201]=0xFF; } - ICPU.ShiftedPB = Registers.PB << 16; - ICPU.ShiftedDB = Registers.DB << 16; - S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ICPU.Registers.PC); S9xUnpackStatus (); S9xFixCycles (); // S9xReschedule (); // <-- this causes desync when recording or playing movies @@ -1390,15 +1390,15 @@ bool8 S9xUnfreezeZSNES (const char *filename) // 34 bcycpl cycles per scanline // 35 cycphb cyclers per hblank - Registers.A.W = READ_WORD (&t [41]); - Registers.DB = t [43]; - Registers.PB = t [44]; - Registers.S.W = READ_WORD (&t [45]); - Registers.D.W = READ_WORD (&t [47]); - Registers.X.W = READ_WORD (&t [49]); - Registers.Y.W = READ_WORD (&t [51]); - Registers.P.W = READ_WORD (&t [53]); - Registers.PC = READ_WORD (&t [55]); + ICPU.Registers.A.W = READ_WORD (&t [41]); + ICPU.Registers.DB = t [43]; + ICPU.Registers.PB = t [44]; + ICPU.Registers.S.W = READ_WORD (&t [45]); + ICPU.Registers.D.W = READ_WORD (&t [47]); + ICPU.Registers.X.W = READ_WORD (&t [49]); + ICPU.Registers.Y.W = READ_WORD (&t [51]); + ICPU.Registers.P.W = READ_WORD (&t [53]); + ICPU.Registers.PC = READ_WORD (&t [55]); fread ((char*)t, 1, 8, fs); fread ((char*)t, 1, 3019, fs); @@ -1552,12 +1552,12 @@ bool8 S9xUnfreezeZSNES (const char *filename) // SNES SPC700 state and internal ZSNES SPC700 emulation state fread ((char*)t, 1, 304, fs); - APURegisters.PC = READ_DWORD (&t [0]); - APURegisters.YA.B.A = t [4]; - APURegisters.X = t [8]; - APURegisters.YA.B.Y = t [12]; - APURegisters.P = t [16]; - APURegisters.S = t [24]; + IAPU.Registers.PC = READ_DWORD (&t [0]); + IAPU.Registers.YA.B.A = t [4]; + IAPU.Registers.X = t [8]; + IAPU.Registers.YA.B.Y = t [12]; + IAPU.Registers.P = t [16]; + IAPU.Registers.S = t [24]; APU.Cycles = READ_DWORD (&t [32]); APU.ShowROM = (IAPU.RAM [0xf1] & 0x80) != 0; @@ -1606,7 +1606,7 @@ bool8 S9xUnfreezeZSNES (const char *filename) IAPU.RAM [0xf2] = saved; S9xSetSoundMute (FALSE); - IAPU.PC = IAPU.RAM + APURegisters.PC; + IAPU.PC = IAPU.RAM + IAPU.Registers.PC; S9xAPUUnpackStatus (); if (APUCheckDirectPage ()) IAPU.DirectPage = IAPU.RAM + 0x100; @@ -1642,15 +1642,15 @@ bool8 S9xUnfreezeZSNES (const char *filename) S9xSetSA1 (t [36], 0x2201); S9xSetSA1 (t [41], 0x2209); - SA1Registers.A.W = READ_DWORD (&t [592]); - SA1Registers.X.W = READ_DWORD (&t [596]); - SA1Registers.Y.W = READ_DWORD (&t [600]); - SA1Registers.D.W = READ_DWORD (&t [604]); - SA1Registers.DB = t [608]; - SA1Registers.PB = t [612]; - SA1Registers.S.W = READ_DWORD (&t [616]); - SA1Registers.PC = READ_DWORD (&t [636]); - SA1Registers.P.W = t [620] | (t [624] << 8); + SA1.Registers.A.W = READ_DWORD (&t [592]); + SA1.Registers.X.W = READ_DWORD (&t [596]); + SA1.Registers.Y.W = READ_DWORD (&t [600]); + SA1.Registers.D.W = READ_DWORD (&t [604]); + SA1.Registers.DB = t [608]; + SA1.Registers.PB = t [612]; + SA1.Registers.S.W = READ_DWORD (&t [616]); + SA1.Registers.PC = READ_DWORD (&t [636]); + SA1.Registers.P.W = t [620] | (t [624] << 8); memmove (&Memory.FillRAM [0x3000], t + 692, 2 * 1024); @@ -1806,9 +1806,9 @@ fread(&temp, 1, 4, fs); IPPU.RenderThisFrame = FALSE; S9xFixSoundAfterSnapshotLoad (); - ICPU.ShiftedPB = Registers.PB << 16; - ICPU.ShiftedDB = Registers.DB << 16; - S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); + ICPU.ShiftedPB = ICPU.Registers.PB << 16; + ICPU.ShiftedDB = ICPU.Registers.DB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ICPU.Registers.PC); S9xUnpackStatus (); S9xFixCycles (); S9xReschedule (); diff --git a/source/snes9x.cpp b/source/snes9x.cpp deleted file mode 100644 index fd0ee0e..0000000 --- a/source/snes9x.cpp +++ /dev/null @@ -1,808 +0,0 @@ -/******************************************************************************* - Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - - (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and - Jerremy Koot (jkoot@snes9x.com) - - (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) - - (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), - funkyass (funkyass@spam.shaw.ca), - Joel Yliluoma (http://iki.fi/bisqwit/) - Kris Bleakley (codeviolation@hotmail.com), - Matthew Kendora, - Nach (n-a-c-h@users.sourceforge.net), - Peter Bortas (peter@bortas.org) and - zones (kasumitokoduck@yahoo.com) - - C4 x86 assembler and some C emulation code - (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), - _Demo_ (_demo_@zsnes.com), and Nach - - C4 C++ code - (c) Copyright 2003 Brad Jorsch - - DSP-1 emulator code - (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, - John Weidman, neviksti (neviksti@hotmail.com), - Kris Bleakley, Andreas Naive - - DSP-2 emulator code - (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and - Lord Nightmare (lord_nightmare@users.sourceforge.net - - OBC1 emulator code - (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and - Kris Bleakley - Ported from x86 assembler to C by sanmaiwashi - - SPC7110 and RTC C++ emulator code - (c) Copyright 2002 Matthew Kendora with research by - zsKnight, John Weidman, and Dark Force - - S-DD1 C emulator code - (c) Copyright 2003 Brad Jorsch with research by - Andreas Naive and John Weidman - - S-RTC C emulator code - (c) Copyright 2001 John Weidman - - ST010 C++ emulator code - (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - - Super FX C emulator code - (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman - - - SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) - - - Specific ports contains the works of other authors. See headers in - individual files. - - Snes9x homepage: http://www.snes9x.com - - Permission to use, copy, modify and distribute Snes9x in both binary and - source form, for non-commercial purposes, is hereby granted without fee, - providing that this license information and copyright notice appear with - all copies and any derived work. - - This software is provided 'as-is', without any express or implied - warranty. In no event shall the authors be held liable for any damages - arising from the use of this software. - - Snes9x is freeware for PERSONAL USE only. Commercial users should - seek permission of the copyright holders first. Commercial use includes - charging money for Snes9x or software derived from Snes9x. - - The copyright holders request that bug fixes and improvements to the code - should be forwarded to them so everyone can benefit from the modifications - in future versions. - - Super NES and Super Nintendo Entertainment System are trademarks of - Nintendo Co., Limited and its subsidiary companies. -*******************************************************************************/ -#include <stdlib.h> -#include <stdio.h> -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif - -#include "snes9x.h" -#include "memmap.h" -#include "display.h" -#include "cheats.h" - -#ifdef DEBUGGER -extern FILE *trace; -#endif - -void S9xUsage () -{ - S9xMessage (S9X_INFO, S9X_USAGE, "snes9x: S9xUsage: snes9x <options> <rom image filename>\n\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "Where <options> can be:\n"); - - S9xMessage (S9X_INFO, S9X_USAGE, "\ --cycles or -h <num> Percentage of CPU cycles to execute every scan line (default 90)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --frameskip or -f <num> Screen update frame skip rate (default 2)\n"); - S9xExtraUsage (); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --hirom or -fh or -hr Force Hi-ROM memory map, useful for hacked ROM images.\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --lorom or -fl or -lr Force Lo-ROM memory map, useful for hacked ROM images.\n"); - //FIXME: -old bsolete? - S9xMessage (S9X_INFO, S9X_USAGE, "\ --old or -o Enable old-style SNES joypad emulation\n"); - //FIXME: -noold obsolete? - S9xMessage (S9X_INFO, S9X_USAGE, "\ --noold or -no Disbale old-style SNES joypad emulation\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --soundskip or -ss <num> Sound CPU skip-waiting method, 0 - 3 (default 0)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --sound or -s Enable digital sound output (default: enabled)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --nosound or -ns Disable digital sound output\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --soundquality or -r <num> Sound sample playback rate/quality, 0-7 (default 4)\n"); - -#ifdef __sgi -/* BS: changed the sample rate values to match the IRIX options */ - S9xMessage (S9X_INFO, S9X_USAGE, "\ - 0 - off, 1 - 8192, 2 - 11025, 3 - 16000,\n\ - 4 - 22050 (default), 5 - 32000, 6 - 44100,\n\ - 7 - 48000\n"); -#else - S9xMessage (S9X_INFO, S9X_USAGE, "\ - 0 - off, 1 - 8192, 2 - 11025, 3 - 16500,\n\ - 4 - 22050 (default), 5 - 29300, 6 - 36600,\n\ - 7 - 44000\n"); -#endif - - S9xMessage (S9X_INFO, S9X_USAGE, "\ --stereo Enable stereo sound (default: mono sound)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --mono Enable mono sound (default: mono sound)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --buffersize or -B Sound playback buffer size (default auto for playback rate)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --nospeedhacks or -N Disable some internal speed ups that break a few ROMs\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --speedhacks or -SH Enable some internal speed ups that break a few ROMs\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --loadsnapshot or -l <filename>\n\ - Load saved game position snapshot file & required ROM\n\ - image.\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --swapjoypads or -s Swap joypad 1 and 2 around\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --pal or -p Fool ROM into thinking that this is a PAL SNES system\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --ntsc or -n Fool ROM into thinking that this is a NTCS SNES system\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --interleaved or -i ROM image is in interleaved format.\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --interleaved2 or -i2 ROM image is in interleaved 2 format\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --interleavedgd24 or -gd24 ROM image is in Game Doctor 24 Mbit format\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --nohdma or -H Disable H-DMA emulation (default: enabled)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --hdma or -NH Enable H-DMA emulation (default: enabled)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --layering or -L Swap some background priority levels - helps some games\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --graphicwindows Enable graphic window effects (default: enabled)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --nographicwindows or -nw Disable graphic window effects (default: enabled)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --nopatch Disable IPS autopatching\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --nocheat Disable the cheat system\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --cheat Enables the cheat system\n"); -#ifdef DEBUGGER - S9xMessage (S9X_INFO, S9X_USAGE, "\ --noirq or -I Disable processor IRQ (for debugging)\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --debug or -d Enter debug mode once ROM has loaded\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --trace or -t Trace CPU instructions to file (WARNING: file gets very large!)\n"); -#endif - -#ifdef JOYSTICK_SUPPORT -#ifdef __linux - S9xMessage (S9X_INFO, S9X_USAGE, "\ --joydevX /dev/jsY Use joystick device /dev/jsY for emulation of gamepad X\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --joymapX 0 1 2 3 4 5 6 7 Joystick buttons which should be assigned to gamepad X - A B X Y TL TR Start and Select\n"); -#else - S9xMessage (S9X_INFO, S9X_USAGE, "\ --four or -4 Single standard PC joystick has four buttons\n"); - S9xMessage (S9X_INFO, S9X_USAGE, "\ --six or -6 Single standard PC joystick has six buttons\n"); -#endif - S9xMessage (S9X_INFO, S9X_USAGE, "\ --nojoy or -j Disable joystick support\n"); -#endif - - S9xMessage (S9X_INFO, S9X_USAGE, "\ -\nROM image needs to be in Super MagiCom (*.smc), Super FamiCom (*.sfc),\n\ -*.fig, or split (*.1, *.2, or sf32527a, sf32527b, etc) format and can be\n\ -compressed with gzip or compress.\n"); - - exit (1); -} - -#ifdef STORM -extern int dofps; -extern int hicolor; -extern int secondjoy; -extern int minimal; -int prelude=0; -extern int unit; -#endif - -char *S9xParseArgs (char **argv, int argc) -{ - char *rom_filename = NULL; - - for (int i = 1; i < argc; i++) - { - if (*argv[i] == '-') - { - if (strcasecmp (argv [i], "--selftest") == 0) - { - // FIXME: Probable missuse of S9X_USAGE - // FIXME: Actual tests. But at least this checks for coredumps. - S9xMessage (S9X_INFO, S9X_USAGE, "Running selftest ..."); - S9xMessage (S9X_INFO, S9X_USAGE, "snes9x started:\t[OK]"); - S9xMessage (S9X_INFO, S9X_USAGE, "All tests ok."); - exit(0); - } - if (strcasecmp (argv [i], "-so") == 0 || - strcasecmp (argv [i], "-sound") == 0) - { - Settings.NextAPUEnabled = TRUE; - } - else if (strcasecmp (argv [i], "-ns") == 0 || - strcasecmp (argv [i], "-nosound") == 0) - { - Settings.NextAPUEnabled = FALSE; - } - else if (strcasecmp (argv [i], "-soundskip") == 0 || - strcasecmp (argv [i], "-sk") == 0) - { - if (i + 1 < argc) - Settings.SoundSkipMethod = atoi (argv [++i]); - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-ra") == 0 || - strcasecmp (argv [i], "-ratio") == 0) - { - if ((i + 1) < argc) - { - } - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-h") == 0 || - strcasecmp (argv [i], "-cycles") == 0) - { - if (i + 1 < argc) - { - int p = atoi (argv [++i]); - if (p > 0 && p < 200) - Settings.CyclesPercentage = p; - } - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-nh") == 0 || - strcasecmp (argv [i], "-nohdma") == 0) - { - Settings.DisableHDMA = TRUE; - } - else if (strcasecmp (argv [i], "-ha") == 0 || - strcasecmp (argv [i], "-hdma") == 0) - { - Settings.DisableHDMA = FALSE; - } - else if (strcasecmp (argv [i], "-n") == 0 || - strcasecmp (argv [i], "-nospeedhacks") == 0) - { - Settings.ShutdownMaster = FALSE; - } - else if (strcasecmp (argv [i], "-sh") == 0 || - strcasecmp (argv [i], "-speedhacks") == 0) - { - Settings.ShutdownMaster = TRUE; - } - else if (strcasecmp (argv [i], "-p") == 0 || - strcasecmp (argv [i], "-pal") == 0) - { - Settings.ForcePAL = TRUE; - } - else if (strcasecmp (argv [i], "-n") == 0 || - strcasecmp (argv [i], "-ntsc") == 0) - { - Settings.ForceNTSC = TRUE; - } - else if (strcasecmp (argv [i], "-f") == 0 || - strcasecmp (argv [i], "-frameskip") == 0) - { - if (i + 1 < argc) - Settings.SkipFrames = atoi (argv [++i]) + 1; - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-fh") == 0 || - strcasecmp (argv [i], "-hr") == 0 || - strcasecmp (argv [i], "-hirom") == 0) - Settings.ForceHiROM = TRUE; - else if (strcasecmp (argv [i], "-fl") == 0 || - strcasecmp (argv [i], "-lr") == 0 || - strcasecmp (argv [i], "-lorom") == 0) - Settings.ForceLoROM = TRUE; - else if (strcasecmp (argv [i], "-hd") == 0 || - strcasecmp (argv [i], "-header") == 0 || - strcasecmp (argv [i], "-he") == 0) - { - Settings.ForceHeader = TRUE; - } - else if (strcasecmp (argv [i], "-nhd") == 0 || - strcasecmp (argv [i], "-noheader") == 0) - { - Settings.ForceNoHeader = TRUE; - } - else if (strcasecmp (argv [i], "-bs") == 0) - { - Settings.BS = TRUE; - } -#ifdef DEBUGGER - else if (strcasecmp (argv [i], "-d") == 0 || - strcasecmp (argv [i], "-debug") == 0) - { - CPU.Flags |= DEBUG_MODE_FLAG; - } - else if (strcasecmp (argv [i], "-t") == 0 || - strcasecmp (argv [i], "-trace") == 0) - { - trace = fopen ("trace.log", "wb"); - CPU.Flags |= TRACE_FLAG; - } -#endif - else if (strcasecmp (argv [i], "-L") == 0 || - strcasecmp (argv [i], "-layering") == 0) - Settings.BGLayering = TRUE; - else if (strcasecmp (argv [i], "-nl") == 0 || - strcasecmp (argv [i], "-nolayering") == 0) - Settings.BGLayering = FALSE; - else if (strcasecmp (argv [i], "-O") == 0 || - strcasecmp (argv [i], "-tileredraw") == 0) - { - } - else if (strcasecmp (argv [i], "-no") == 0 || - strcasecmp (argv [i], "-lineredraw") == 0) - { - } - else if (strcasecmp (argv [i], "-tr") == 0 || - strcasecmp (argv [i], "-transparency") == 0) - { - Settings.ForceTransparency = TRUE; - Settings.ForceNoTransparency = FALSE; - } - else if (strcasecmp (argv [i], "-nt") == 0 || - strcasecmp (argv [i], "-notransparency") == 0) - { - Settings.ForceNoTransparency = TRUE; - Settings.ForceTransparency = FALSE; - } - else if (strcasecmp (argv [i], "-hi") == 0 || - strcasecmp (argv [i], "-hires") == 0) - { - Settings.SupportHiRes = TRUE; - } - else if (strcasecmp (argv [i], "-16") == 0 || - strcasecmp (argv [i], "-sixteen") == 0) - { - Settings.SixteenBit = TRUE; - } - else if (strcasecmp (argv [i], "-displayframerate") == 0 || - strcasecmp (argv [i], "-dfr") == 0) - { - Settings.DisplayFrameRate = TRUE; - } - else if (strcasecmp (argv [i], "-s") == 0 || - strcasecmp (argv [i], "-swapjoypads") == 0 || - strcasecmp (argv [i], "-sw") == 0) - Settings.SwapJoypads = TRUE; - else if (strcasecmp (argv [i], "-i") == 0 || - strcasecmp (argv [i], "-interleaved") == 0) - Settings.ForceInterleaved = TRUE; - else if (strcasecmp (argv [i], "-i2") == 0 || - strcasecmp (argv [i], "-interleaved2") == 0) - Settings.ForceInterleaved2=TRUE; - else if (strcasecmp (argv [i], "-gd24") == 0 || - strcasecmp (argv [i], "-interleavedgd24") == 0) - Settings.ForceInterleaveGD24 = TRUE; - else if (strcasecmp (argv [i], "-ni") == 0 || - strcasecmp (argv [i], "-nointerleave") == 0) - Settings.ForceNotInterleaved = TRUE; - else if (strcasecmp (argv [i], "-noirq") == 0) - Settings.DisableIRQ = TRUE; - else if (strcasecmp (argv [i], "-nw") == 0 || - strcasecmp (argv [i], "-nowindows") == 0) - { - Settings.DisableGraphicWindows = TRUE; - } - else if (strcasecmp (argv [i], "-nopatch") == 0) - { - Settings.NoPatch=TRUE; - } - else if (strcasecmp (argv [i], "-nocheat") == 0) - { - Settings.ApplyCheats=FALSE; - } - else if (strcasecmp (argv [i], "-cheat") == 0) - { - Settings.ApplyCheats=TRUE; - } - else if (strcasecmp (argv [i], "-windows") == 0) - { - Settings.DisableGraphicWindows = FALSE; - } - else if (strcasecmp (argv [i], "-aidoshm") == 0) - { - if (i + 1 < argc) - { - Settings.AIDOShmId = atoi (argv [++i]); - fprintf(stderr, "Snes9X running in AIDO mode. shmid: %d\n", - Settings.AIDOShmId); - } else - S9xUsage (); - } -#ifdef DEBUG_MAXCOUNT - else if (strcasecmp (argv [i], "-maxcount") == 0) - { - if (i + 1 < argc) - { - Settings.MaxCount = atol (argv [++i]); - fprintf(stderr, "Running for a maximum of %d loops.\n", - Settings.MaxCount); - } else - S9xUsage (); - } -#endif - else if (strcasecmp (argv [i], "-im7") == 0) - { - Settings.Mode7Interpolate = TRUE; - } - else if (strcasecmp (argv [i], "-gg") == 0 || - strcasecmp (argv [i], "-gamegenie") == 0) - { - if (i + 1 < argc) - { - uint32 address; - uint8 byte; - const char *error; - if ((error = S9xGameGenieToRaw (argv [++i], address, byte)) == NULL) - S9xAddCheat (TRUE, FALSE, address, byte); - else - S9xMessage (S9X_ERROR, S9X_GAME_GENIE_CODE_ERROR, - error); - } - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-ar") == 0 || - strcasecmp (argv [i], "-actionreplay") == 0) - { - if (i + 1 < argc) - { - uint32 address; - uint8 byte; - const char *error; - if ((error = S9xProActionReplayToRaw (argv [++i], address, byte)) == NULL) - S9xAddCheat (TRUE, FALSE, address, byte); - else - S9xMessage (S9X_ERROR, S9X_ACTION_REPLY_CODE_ERROR, - error); - } - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-gf") == 0 || - strcasecmp (argv [i], "-goldfinger") == 0) - { - if (i + 1 < argc) - { - uint32 address; - uint8 bytes [3]; - bool8 sram; - uint8 num_bytes; - const char *error; - if ((error = S9xGoldFingerToRaw (argv [++i], address, sram, - num_bytes, bytes)) == NULL) - { - for (int c = 0; c < num_bytes; c++) - S9xAddCheat (TRUE, FALSE, address + c, bytes [c]); - } - else - S9xMessage (S9X_ERROR, S9X_GOLD_FINGER_CODE_ERROR, - error); - } - else - S9xUsage (); - } - else if (strcasecmp (argv[i], "-ft") == 0 || - strcasecmp (argv [i], "-frametime") == 0) - { - if (i + 1 < argc) - { - double ft; - if (sscanf (argv [++i], "%lf", &ft) == 1) - { -#ifdef __WIN32__ - Settings.FrameTimePAL = (int32) (ft * 1000); - Settings.FrameTimeNTSC = (int32) (ft * 1000); -#else - Settings.FrameTimePAL = (int32) ft; - Settings.FrameTimeNTSC = (int32) ft; -#endif - - } - } - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-e") == 0 || - strcasecmp (argv [i], "-echo") == 0) - Settings.DisableSoundEcho = FALSE; - else if (strcasecmp (argv [i], "-ne") == 0 || - strcasecmp (argv [i], "-noecho") == 0) - Settings.DisableSoundEcho = TRUE; - else if (strcasecmp (argv [i], "-r") == 0 || - strcasecmp (argv [i], "-soundquality") == 0 || - strcasecmp (argv [i], "-sq") == 0) - { - if (i + 1 < argc) - Settings.SoundPlaybackRate = atoi (argv [++i]) & 7; - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-stereo") == 0 || - strcasecmp (argv [i], "-st") == 0) - { - Settings.Stereo = TRUE; - Settings.APUEnabled = TRUE; - Settings.NextAPUEnabled = TRUE; - } - else if (strcasecmp (argv [i], "-mono") == 0) - { - Settings.Stereo = FALSE; - Settings.NextAPUEnabled = TRUE; - } - else if (strcasecmp (argv [i], "-envx") == 0 || - strcasecmp (argv [i], "-ex") == 0) - { - Settings.SoundEnvelopeHeightReading = TRUE; - } - else if (strcasecmp (argv [i], "-nosamplecaching") == 0 || - strcasecmp (argv [i], "-nsc") == 0 || - strcasecmp (argv [i], "-nc") == 0) - { - Settings.DisableSampleCaching = TRUE; - } - else if (strcasecmp (argv [i], "-nomastervolume") == 0 || - strcasecmp (argv [i], "-nmv") == 0) - { - Settings.DisableMasterVolume = TRUE; - } - else if (strcasecmp (argv [i], "-soundsync") == 0 || - strcasecmp (argv [i], "-sy") == 0) - { - Settings.SoundSync = TRUE; - Settings.SoundEnvelopeHeightReading = TRUE; - Settings.InterpolatedSound = TRUE; - } - else if (strcasecmp (argv [i], "-soundsync2") == 0 || - strcasecmp (argv [i], "-sy2") == 0) - { - Settings.SoundSync = 2; - Settings.SoundEnvelopeHeightReading = TRUE; - Settings.InterpolatedSound = TRUE; - } - else if (strcasecmp (argv [i], "-interpolatedsound") == 0 || - strcasecmp (argv [i], "-is") == 0) - { - Settings.InterpolatedSound = TRUE; - } -#ifdef USE_THREADS - else if (strcasecmp (argv [i], "-threadsound") == 0 || - strcasecmp (argv [i], "-ts") == 0) - { - Settings.ThreadSound = TRUE; - } -#endif - else if (strcasecmp (argv [i], "-alt") == 0 || - strcasecmp (argv [i], "-altsampledecode") == 0) - { - Settings.AltSampleDecode = 1; - } - else if (strcasecmp (argv [i], "-fix") == 0) - { - Settings.FixFrequency = 1; - } - else if (strcasecmp (argv [i], "-nosuperfx") == 0 || - strcasecmp (argv [i], "-nosfx") == 0) - Settings.ForceNoSuperFX = TRUE; - else if (strcasecmp (argv [i], "-superfx") == 0 || - strcasecmp (argv [i], "-sfx") == 0) - Settings.ForceSuperFX = TRUE; - else if (strcasecmp (argv [i], "-dsp1") == 0) - Settings.ForceDSP1 = TRUE; - else if (strcasecmp (argv [i], "-nodsp1") == 0) - Settings.ForceNoDSP1 = TRUE; - else if (strcasecmp (argv [i], "-nomultiplayer5") == 0 || - strcasecmp (argv [i], "-nmp") == 0) - Settings.MultiPlayer5 = FALSE; - else if (strcasecmp (argv [i], "-multiplayer5") == 0 || - strcasecmp (argv [i], "-mp") == 0) - { - Settings.MultiPlayer5 = TRUE; - Settings.ControllerOption = SNES_MULTIPLAYER5; - } - else if (strcasecmp (argv [i], "-mouse") == 0 || - strcasecmp (argv [i], "-mo") == 0) - { - Settings.ControllerOption = SNES_MOUSE_SWAPPED; - Settings.Mouse = TRUE; - } - else if (strcasecmp (argv [i], "-nomouse") == 0 || - strcasecmp (argv [i], "-nm") == 0) - { - Settings.Mouse = FALSE; - } - else if (strcasecmp (argv [i], "-superscope") == 0 || - strcasecmp (argv [i], "-ss") == 0) - { - Settings.SuperScope = TRUE; - Settings.ControllerOption = SNES_SUPERSCOPE; - } - else if (strcasecmp (argv [i], "-nosuperscope") == 0 || - strcasecmp (argv [i], "-nss") == 0) - { - Settings.SuperScope = FALSE; - } -#ifdef NETPLAY_SUPPORT - else if (strcasecmp (argv [i], "-port") == 0 || - strcasecmp (argv [i], "-po") == 0) - { - if (i + 1 < argc) - { - Settings.NetPlay = TRUE; - Settings.Port = -atoi (argv [++i]); - } - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-server") == 0 || - strcasecmp (argv [i], "-srv") == 0) - { - if (i + 1 < argc) - { - Settings.NetPlay = TRUE; - strncpy (Settings.ServerName, argv [++i], 127); - Settings.ServerName [127] = 0; - } - else - S9xUsage (); - } - else if (strcasecmp (argv [i], "-net") == 0) - { - Settings.NetPlay = TRUE; - } -#endif -#ifdef STORM - else if (strcasecmp(argv[i],"-nosecondjoy")==0){secondjoy=0;} - else if (strcasecmp(argv[i],"-showfps")==0){dofps=1;} - else if (strcasecmp(argv[i],"-hicolor")==0){hicolor=1;} - else if (strcasecmp(argv[i],"-minimal")==0){minimal=1;printf("Keyboard with exception of ESC switched off!\n");} - else if (strcasecmp(argv[i],"-ahiunit")==0) - { - if (i+1<argc) - { - fprintf(stderr,"AHI Unit set to: Unit %i\n",atoi(argv[++i])); - unit=atoi(argv[++i]); - } - } -#endif - - else - S9xParseArg (argv, i, argc); - } - else - rom_filename = argv [i]; - } - - return (rom_filename); -} - -#if 0 -//static char* fgets(char *buffer, int num, FILE *stream) -char* fgets(char *buffer, int num, FILE *stream) -{ - int m; - char *s; - -// printf("In fgets\n"); - - if(num <= 0) - return (NULL); - - num--; - m= fread(buffer, 1, num, stream); - *(buffer +m) = '\0'; - -// printf("fread= %s\n", buffer); - - if(m == 0) - return (NULL); - - s = strchr(buffer, '\n'); - - if(m < num) //at the end of file - { - if(s == NULL) - return (buffer); - - *(++s)= '\0'; //string include '\n' - m -= s - buffer; - fseek(stream, -m, SEEK_CUR);//fix fread pointer - return (buffer); - } - else - { - if(s) - { - *(++s)= '\0'; //string include '\n' - m -= s - buffer; - fseek(stream, -m, SEEK_CUR);//fix fread pointer - } - - return (buffer); - } -} -#endif - -void S9xParseCheatsFile (const char *rom_filename) -{ - FILE *f; - char dir [_MAX_DIR]; - char drive [_MAX_DRIVE]; - char name [_MAX_FNAME]; - char ext [_MAX_EXT]; - char fname [_MAX_PATH]; - char buf [80]; - uint32 address; - uint8 byte; - uint8 bytes [3]; - bool8 sram; - uint8 num_bytes; - const char *error; - char *p; - - _splitpath (rom_filename, drive, dir, name, ext); - _makepath (fname, drive, dir, name, "pat"); - - if ((f = fopen(fname, "r")) != NULL) - { - while(fgets(buf, 80, f) != NULL) - { - if ((p = strrchr (buf, '\n')) != NULL) - *p = '\0'; - if (((error = S9xGameGenieToRaw (buf, address, byte)) == NULL) || - ((error = S9xProActionReplayToRaw (buf, address, byte)) == NULL)) - { - S9xAddCheat (TRUE, FALSE, address, byte); - } - else - if ((error = S9xGoldFingerToRaw (buf, address, sram, - num_bytes, bytes)) == NULL) - { - for (int c = 0; c < num_bytes; c++) - S9xAddCheat (TRUE, FALSE, address + c, bytes [c]); - } - else - S9xMessage (S9X_ERROR, S9X_GAME_GENIE_CODE_ERROR, error); - } - fclose(f); - } -} - diff --git a/source/snes9x.h b/source/snes9x.h index 61281aa..e9ed479 100644 --- a/source/snes9x.h +++ b/source/snes9x.h @@ -342,7 +342,9 @@ struct SSettings{ bool8 FixFrequency; /* Graphics options */ +#ifndef FOREVER_16_BIT bool8 SixteenBit; +#endif bool8 Transparency; bool8 SupportHiRes; bool8 Mode7Interpolate; diff --git a/source/sound.cpp b/source/sound.cpp deleted file mode 100644 index e69a1fb..0000000 --- a/source/sound.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/******************************************************************************* - Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - - (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and - Jerremy Koot (jkoot@snes9x.com) - - (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) - - (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), - funkyass (funkyass@spam.shaw.ca), - Joel Yliluoma (http://iki.fi/bisqwit/) - Kris Bleakley (codeviolation@hotmail.com), - Matthew Kendora, - Nach (n-a-c-h@users.sourceforge.net), - Peter Bortas (peter@bortas.org) and - zones (kasumitokoduck@yahoo.com) - - C4 x86 assembler and some C emulation code - (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), - _Demo_ (_demo_@zsnes.com), and Nach - - C4 C++ code - (c) Copyright 2003 Brad Jorsch - - DSP-1 emulator code - (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, - John Weidman, neviksti (neviksti@hotmail.com), - Kris Bleakley, Andreas Naive - - DSP-2 emulator code - (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and - Lord Nightmare (lord_nightmare@users.sourceforge.net - - OBC1 emulator code - (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and - Kris Bleakley - Ported from x86 assembler to C by sanmaiwashi - - SPC7110 and RTC C++ emulator code - (c) Copyright 2002 Matthew Kendora with research by - zsKnight, John Weidman, and Dark Force - - S-DD1 C emulator code - (c) Copyright 2003 Brad Jorsch with research by - Andreas Naive and John Weidman - - S-RTC C emulator code - (c) Copyright 2001 John Weidman - - ST010 C++ emulator code - (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - - Super FX C emulator code - (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman - - - SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) - - - Specific ports contains the works of other authors. See headers in - individual files. - - Snes9x homepage: http://www.snes9x.com - - Permission to use, copy, modify and distribute Snes9x in both binary and - source form, for non-commercial purposes, is hereby granted without fee, - providing that this license information and copyright notice appear with - all copies and any derived work. - - This software is provided 'as-is', without any express or implied - warranty. In no event shall the authors be held liable for any damages - arising from the use of this software. - - Snes9x is freeware for PERSONAL USE only. Commercial users should - seek permission of the copyright holders first. Commercial use includes - charging money for Snes9x or software derived from Snes9x. - - The copyright holders request that bug fixes and improvements to the code - should be forwarded to them so everyone can benefit from the modifications - in future versions. - - Super NES and Super Nintendo Entertainment System are trademarks of - Nintendo Co., Limited and its subsidiary companies. -*******************************************************************************/ -#include <devices/ahi.h> -#include <exec/exec.h> -#include <proto/ahi.h> -#include <proto/dos.h> -#include <proto/exec.h> -#include <clib/ahippc_protos.h> -#include <stdio.h> - -#define EQ == -#define MINBUFFLEN 10000 - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> - -#include "snes9x.h" -#include "soundux.h" - -extern SoundStatus so; - -extern int AudioOpen(unsigned long freq, unsigned long bufsize, unsigned long bitrate, unsigned long stereo); -extern void AudioClose(void); - -extern int OpenPrelude(ULONG Type, ULONG DefaultFreq, ULONG MinBuffSize); -extern void ClosePrelude(void); - -extern int SoundSignal; -unsigned long DoubleBuffer; -//extern struct AHISampleInfo Sample0; -//extern struct AHISampleInfo Sample1; -//extern unsigned long BufferSize; - -struct Library *AHIPPCBase; -struct Library *AHIBase; -struct MsgPort *AHImp=NULL; -struct AHIRequest *AHIio=NULL; -BYTE AHIDevice=-1; - -struct AHIData *AHIData; - -unsigned long Frequency = 0; -//unsigned long BufferSize = 0; -unsigned long BitRate = 0; -unsigned long Stereo = 0; -//unsigned long AHIError = 9; - -BYTE InternSignal=-1; - -int mixsamples; -extern int prelude; - -#define REALSIZE (BitRate*Stereo) - -struct AHIAudioModeRequester *req=NULL; -struct AHIAudioCtrl *actrl=NULL; - -ULONG BufferLen=NULL; - - -/* this really should be dynamically allocated... */ -#undef MAX_BUFFER_SIZE -#define MAX_BUFFER_SIZE 65536 -#define MIN_BUFFER_SIZE 65536 - -#define MODE_MONO 0 -#define MODE_STEREO 1 - -#define QUAL_8BIT 8 -#define QUAL_16BIT 16 - - -int test=0; -int test2=0; - -int AudioOpen(unsigned long freq, unsigned long minbufsize, unsigned long bitrate, unsigned long stereo) -{ - ULONG Type; - - Frequency = freq; - - so.playback_rate = Frequency; - - if(stereo) so.stereo = TRUE; - else so.stereo = FALSE; - - switch(bitrate) - { - case 8: - so.sixteen_bit = FALSE; - BitRate=1; - if(stereo) - { - Stereo=2; - Type = AHIST_S8S; - } - else - { - Stereo=1; - Type = AHIST_M8S; - } - - break; - - default: //defaulting to 16bit, because it means it won't crash atleast - case QUAL_16BIT: - so.sixteen_bit = TRUE; - BitRate=2; - if(stereo) - { - Stereo=2; - Type = AHIST_S16S; - } - else - { - Stereo=1; - Type = AHIST_M16S; - } - break; - } - - if(prelude) prelude = OpenPrelude(Type, freq, minbufsize); - - - if(prelude) return 1; else printf("Defaulting to AHI...\n"); - - /* only 1 channel right? */ - /* NOTE: The buffersize will not always be what you requested - * it finds the minimun AHI requires and then rounds it up to - * nearest 32 bytes. Check AHIData->BufferSize or Samples[n].something_Length - */ - if(AHIData = OpenAHI(1, Type, AHI_INVALID_ID, AHI_DEFAULT_FREQ, 0, minbufsize)) - { - printf("AHI opened\n"); - printf("BuffSize %d\n", AHIData->BufferSize); - } - else - { - printf("AHI failed to open: %d\n", AHIData); - return 0; - } - - so.buffer_size = AHIData->BufferSize; // in bytes - if (so.buffer_size > MAX_BUFFER_SIZE) so.buffer_size = MAX_BUFFER_SIZE; - - /* Lots of useful fields in the AHIData struct, have a look */ - AHIBase = AHIData->AHIBase; - actrl = AHIData->AudioCtrl; - Frequency = AHIData->MixingFreq; - - printf("signal %ld\n", AHIData->SoundFuncSignal); - - Wait(AHIData->SoundFuncSignal); - - /* I don't think it should start playing until there is something - * In the buffer, however to set off the SoundFunc it should - * probably go through the buffer at least once, just silently. - */ - AHI_SetFreq(0, Frequency, actrl, AHISF_IMM); - - Wait(AHIData->SoundFuncSignal); - - AHI_SetVol(0, 0x10000, 0x8000, actrl, AHISF_IMM); - - mixsamples=AHIData->BufferSamples; - - SoundSignal = AHIData->SoundFuncSignal; - - return 1; -} - -void AudioClose( void ) -{ - if(prelude) ClosePrelude(); - else ;//CloseAHI(AHIData); -} - - -#include <wbstartup.h> - -extern int main(int argc, char **argv); - -void wbmain(struct WBStartup * argmsg) -{ - char argv[1][]={"WarpSNES"}; - int argc=1; - main(argc,(char **)argv); -} - - diff --git a/source/spc.cpp b/source/spc.cpp deleted file mode 100644 index c12c831..0000000 --- a/source/spc.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/******************************************************************************* - Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - - (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and - Jerremy Koot (jkoot@snes9x.com) - - (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) - - (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), - funkyass (funkyass@spam.shaw.ca), - Joel Yliluoma (http://iki.fi/bisqwit/) - Kris Bleakley (codeviolation@hotmail.com), - Matthew Kendora, - Nach (n-a-c-h@users.sourceforge.net), - Peter Bortas (peter@bortas.org) and - zones (kasumitokoduck@yahoo.com) - - C4 x86 assembler and some C emulation code - (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), - _Demo_ (_demo_@zsnes.com), and Nach - - C4 C++ code - (c) Copyright 2003 Brad Jorsch - - DSP-1 emulator code - (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, - John Weidman, neviksti (neviksti@hotmail.com), - Kris Bleakley, Andreas Naive - - DSP-2 emulator code - (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and - Lord Nightmare (lord_nightmare@users.sourceforge.net - - OBC1 emulator code - (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and - Kris Bleakley - Ported from x86 assembler to C by sanmaiwashi - - SPC7110 and RTC C++ emulator code - (c) Copyright 2002 Matthew Kendora with research by - zsKnight, John Weidman, and Dark Force - - S-DD1 C emulator code - (c) Copyright 2003 Brad Jorsch with research by - Andreas Naive and John Weidman - - S-RTC C emulator code - (c) Copyright 2001 John Weidman - - ST010 C++ emulator code - (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - - Super FX C emulator code - (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman - - - SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) - - - Specific ports contains the works of other authors. See headers in - individual files. - - Snes9x homepage: http://www.snes9x.com - - Permission to use, copy, modify and distribute Snes9x in both binary and - source form, for non-commercial purposes, is hereby granted without fee, - providing that this license information and copyright notice appear with - all copies and any derived work. - - This software is provided 'as-is', without any express or implied - warranty. In no event shall the authors be held liable for any damages - arising from the use of this software. - - Snes9x is freeware for PERSONAL USE only. Commercial users should - seek permission of the copyright holders first. Commercial use includes - charging money for Snes9x or software derived from Snes9x. - - The copyright holders request that bug fixes and improvements to the code - should be forwarded to them so everyone can benefit from the modifications - in future versions. - - Super NES and Super Nintendo Entertainment System are trademarks of - Nintendo Co., Limited and its subsidiary companies. -*******************************************************************************/ -void S9xSPCDump (const char *filename) -{ - FILE *fs; - - bool8 read_only = FALSE; - char def [PATH_MAX]; - char title [PATH_MAX]; - char drive [_MAX_DRIVE]; - char dir [_MAX_DIR]; - char ext [_MAX_EXT]; - - S9xSetSoundMute (TRUE); - -#if 0 - _splitpath (Memory.ROMFilename, drive, dir, def, ext); - strcat (def, ".spc"); - sprintf (title, "%s SPC filename", - read_only ? "Select load" : "Choose save"); - const char *filename; - - filename = S9xSelectFilename (def, ".", "spc", title); -#endif - - fs = fopen (filename, "wb"); - fputs ("SNES-SPC700 Sound File Data 0.10", fs); - fseek (fs, 37, SEEK_SET); - fwrite (&APURegisters.PC, 2, 1, fs); - - fputc (APURegisters.YA.B.A, fs); - fputc (APURegisters.X, fs); - fputc (APURegisters.YA.B.Y, fs); - fputc (APURegisters.P, fs); - fputc (APURegisters.S - 0x100, fs); // ??? - fseek (fs, 256, SEEK_SET); - - fwrite (IAPU.RAM, 1, 65536, fs); - - fwrite (APU.DSP, 1, 192, fs); - fwrite (APU.ExtraRAM, 1, 64, fs); - - fclose (fs); - - S9xSetSoundMute (FALSE); -} - diff --git a/source/spc700.cpp b/source/spc700.cpp index fe13ae8..69ed120 100644 --- a/source/spc700.cpp +++ b/source/spc700.cpp @@ -107,19 +107,6 @@ void S9xAPUSetByte (uint8, uint32 address); #include "apumem.h" #endif -START_EXTERN_C -extern uint8 Work8; -extern uint16 Work16; -extern uint32 Work32; -extern signed char Int8; -extern short Int16; -extern long Int32; -extern short Int16; -extern uint8 W1; -extern uint8 W2; - -END_EXTERN_C - #define OP1 (*(IAPU.PC + 1)) #define OP2 (*(IAPU.PC + 2)) @@ -179,7 +166,7 @@ void STOP (char *s) // XXX: HalfCarry - BJ fixed? #define SBC(a,b)\ -Int16 = (short) (a) - (short) (b) + (short) (APUCheckCarry ()) - 1;\ +int16 Int16 = (short) (a) - (short) (b) + (short) (APUCheckCarry ()) - 1;\ IAPU._Carry = Int16 >= 0;\ if ((((a) ^ (b)) & 0x80) && (((a) ^ (uint8) Int16) & 0x80))\ APUSetOverflow ();\ @@ -192,21 +179,22 @@ if(((a) ^ (b) ^ (uint8) Int16) & 0x10)\ APUSetZN8 ((uint8) Int16); // XXX: HalfCarry - BJ fixed? +// XXX: HalfCarry used Int16 before; trying to fix it with Work16 [Neb] #define ADC(a,b)\ -Work16 = (a) + (b) + APUCheckCarry();\ +uint16 Work16 = (a) + (b) + APUCheckCarry();\ IAPU._Carry = Work16 >= 0x100; \ if (~((a) ^ (b)) & ((b) ^ (uint8) Work16) & 0x80)\ APUSetOverflow ();\ else \ APUClearOverflow (); \ APUClearHalfCarry ();\ -if(((a) ^ (b) ^ (uint8) Int16) & 0x10)\ +if(((a) ^ (b) ^ (uint8) Work16) & 0x10)\ APUSetHalfCarry ();\ (a) = (uint8) Work16;\ APUSetZN8 ((uint8) Work16); #define CMP(a,b)\ -Int16 = (short) (a) - (short) (b);\ +int16 Int16 = (short) (a) - (short) (b);\ IAPU._Carry = Int16 >= 0;\ APUSetZN8 ((uint8) Int16); @@ -219,62 +207,62 @@ APUSetZN8 ((uint8) Int16); (b) >>= 1;\ APUSetZN8 (b); #define ROL(b)\ - Work16 = ((b) << 1) | APUCheckCarry (); \ + uint16 Work16 = ((b) << 1) | APUCheckCarry (); \ IAPU._Carry = Work16 >= 0x100; \ (b) = (uint8) Work16; \ APUSetZN8 (b); #define ROR(b)\ - Work16 = (b) | ((uint16) APUCheckCarry () << 8); \ + uint16 Work16 = (b) | ((uint16) APUCheckCarry () << 8); \ IAPU._Carry = (uint8) Work16 & 1; \ Work16 >>= 1; \ (b) = (uint8) Work16; \ APUSetZN8 (b); #define Push(b)\ - *(IAPU.RAM + 0x100 + APURegisters.S) = b;\ - APURegisters.S--; + *(IAPU.RAM + 0x100 + IAPU.Registers.S) = b;\ + IAPU.Registers.S--; #define Pop(b)\ - APURegisters.S++;\ - (b) = *(IAPU.RAM + 0x100 + APURegisters.S); + IAPU.Registers.S++;\ + (b) = *(IAPU.RAM + 0x100 + IAPU.Registers.S); #ifdef FAST_LSB_WORD_ACCESS #define PushW(w)\ - *(uint16 *) (IAPU.RAM + 0xff + APURegisters.S) = w;\ - APURegisters.S -= 2; + *(uint16 *) (IAPU.RAM + 0xff + IAPU.Registers.S) = w;\ + IAPU.Registers.S -= 2; #define PopW(w)\ - APURegisters.S += 2;\ - w = *(uint16 *) (IAPU.RAM + 0xff + APURegisters.S); + IAPU.Registers.S += 2;\ + w = *(uint16 *) (IAPU.RAM + 0xff + IAPU.Registers.S); #else #define PushW(w)\ - *(IAPU.RAM + 0xff + APURegisters.S) = w;\ - *(IAPU.RAM + 0x100 + APURegisters.S) = (w >> 8);\ - APURegisters.S -= 2; + *(IAPU.RAM + 0xff + IAPU.Registers.S) = w;\ + *(IAPU.RAM + 0x100 + IAPU.Registers.S) = (w >> 8);\ + IAPU.Registers.S -= 2; #define PopW(w)\ - APURegisters.S += 2; \ - (w) = *(IAPU.RAM + 0xff + APURegisters.S) + (*(IAPU.RAM + 0x100 + APURegisters.S) << 8); + IAPU.Registers.S += 2; \ + (w) = *(IAPU.RAM + 0xff + IAPU.Registers.S) + (*(IAPU.RAM + 0x100 + IAPU.Registers.S) << 8); #endif #define Relative()\ - Int8 = OP1;\ - Int16 = (int) (IAPU.PC + 2 - IAPU.RAM) + Int8; + int8 Int8 = OP1;\ + int16 Int16 = (int) (IAPU.PC + 2 - IAPU.RAM) + Int8; #define Relative2()\ - Int8 = OP2;\ - Int16 = (int) (IAPU.PC + 3 - IAPU.RAM) + Int8; + int8 Int8 = OP2;\ + int16 Int16 = (int) (IAPU.PC + 3 - IAPU.RAM) + Int8; #ifdef FAST_LSB_WORD_ACCESS #define IndexedXIndirect()\ - IAPU.Address = *(uint16 *) (IAPU.DirectPage + ((OP1 + APURegisters.X) & 0xff)); + IAPU.Address = *(uint16 *) (IAPU.DirectPage + ((OP1 + IAPU.Registers.X) & 0xff)); #define Absolute()\ IAPU.Address = *(uint16 *) (IAPU.PC + 1); #define AbsoluteX()\ - IAPU.Address = *(uint16 *) (IAPU.PC + 1) + APURegisters.X; + IAPU.Address = *(uint16 *) (IAPU.PC + 1) + IAPU.Registers.X; #define AbsoluteY()\ - IAPU.Address = *(uint16 *) (IAPU.PC + 1) + APURegisters.YA.B.Y; + IAPU.Address = *(uint16 *) (IAPU.PC + 1) + IAPU.Registers.YA.B.Y; #define MemBit()\ IAPU.Address = *(uint16 *) (IAPU.PC + 1);\ @@ -282,19 +270,19 @@ APUSetZN8 ((uint8) Int16); IAPU.Address &= 0x1fff; #define IndirectIndexedY()\ - IAPU.Address = *(uint16 *) (IAPU.DirectPage + OP1) + APURegisters.YA.B.Y; + IAPU.Address = *(uint16 *) (IAPU.DirectPage + OP1) + IAPU.Registers.YA.B.Y; #else #define IndexedXIndirect()\ - IAPU.Address = *(IAPU.DirectPage + ((OP1 + APURegisters.X) & 0xff)) + \ - (*(IAPU.DirectPage + ((OP1 + APURegisters.X + 1) & 0xff)) << 8); + IAPU.Address = *(IAPU.DirectPage + ((OP1 + IAPU.Registers.X) & 0xff)) + \ + (*(IAPU.DirectPage + ((OP1 + IAPU.Registers.X + 1) & 0xff)) << 8); #define Absolute()\ IAPU.Address = OP1 + (OP2 << 8); #define AbsoluteX()\ - IAPU.Address = OP1 + (OP2 << 8) + APURegisters.X; + IAPU.Address = OP1 + (OP2 << 8) + IAPU.Registers.X; #define AbsoluteY()\ - IAPU.Address = OP1 + (OP2 << 8) + APURegisters.YA.B.Y; + IAPU.Address = OP1 + (OP2 << 8) + IAPU.Registers.YA.B.Y; #define MemBit()\ IAPU.Address = OP1 + (OP2 << 8);\ @@ -304,7 +292,7 @@ APUSetZN8 ((uint8) Int16); #define IndirectIndexedY()\ IAPU.Address = *(IAPU.DirectPage + OP1) + \ (*(IAPU.DirectPage + OP1 + 1) << 8) + \ - APURegisters.YA.B.Y; + IAPU.Registers.YA.B.Y; #endif void Apu00 () @@ -355,7 +343,7 @@ void Apu3F () // CALL absolute void Apu4F () // PCALL $XX { - Work8 = OP1; + uint8 Work8 = OP1; PushW (IAPU.PC + 2 - IAPU.RAM); IAPU.PC = IAPU.RAM + 0xff00 + Work8; } @@ -449,7 +437,7 @@ void ApuF2 () } #define BBS(b) \ -Work8 = OP1; \ +uint8 Work8 = OP1; \ Relative2 (); \ if (S9xAPUGetByteZ (Work8) & (1 << (b))) \ { \ @@ -500,7 +488,7 @@ void ApuE3 () } #define BBC(b) \ -Work8 = OP1; \ +uint8 Work8 = OP1; \ Relative2 (); \ if (!(S9xAPUGetByteZ (Work8) & (1 << (b)))) \ { \ @@ -553,8 +541,8 @@ void ApuF3 () void Apu04 () { // OR A,dp - APURegisters.YA.B.A |= S9xAPUGetByteZ (OP1); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= S9xAPUGetByteZ (OP1); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -562,16 +550,16 @@ void Apu05 () { // OR A,abs Absolute (); - APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } void Apu06 () { // OR A,(X) - APURegisters.YA.B.A |= S9xAPUGetByteZ (APURegisters.X); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= S9xAPUGetByteZ (IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } @@ -579,23 +567,23 @@ void Apu07 () { // OR A,(dp+X) IndexedXIndirect (); - APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu08 () { // OR A,#00 - APURegisters.YA.B.A |= OP1; - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= OP1; + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu09 () { // OR dp(dest),dp(src) - Work8 = S9xAPUGetByteZ (OP1); + uint8 Work8 = S9xAPUGetByteZ (OP1); Work8 |= S9xAPUGetByteZ (OP2); S9xAPUSetByteZ (Work8, OP2); APUSetZN8 (Work8); @@ -605,8 +593,8 @@ void Apu09 () void Apu14 () { // OR A,dp+X - APURegisters.YA.B.A |= S9xAPUGetByteZ (OP1 + APURegisters.X); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= S9xAPUGetByteZ (OP1 + IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -614,8 +602,8 @@ void Apu15 () { // OR A,abs+X AbsoluteX (); - APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } @@ -623,8 +611,8 @@ void Apu16 () { // OR A,abs+Y AbsoluteY (); - APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } @@ -632,15 +620,15 @@ void Apu17 () { // OR A,(dp)+Y IndirectIndexedY (); - APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu18 () { // OR dp,#00 - Work8 = OP1; + uint8 Work8 = OP1; Work8 |= S9xAPUGetByteZ (OP2); S9xAPUSetByteZ (Work8, OP2); APUSetZN8 (Work8); @@ -650,9 +638,9 @@ void Apu18 () void Apu19 () { // OR (X),(Y) - Work8 = S9xAPUGetByteZ (APURegisters.X) | S9xAPUGetByteZ (APURegisters.YA.B.Y); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.X) | S9xAPUGetByteZ (IAPU.Registers.YA.B.Y); APUSetZN8 (Work8); - S9xAPUSetByteZ (Work8, APURegisters.X); + S9xAPUSetByteZ (Work8, IAPU.Registers.X); IAPU.PC++; } @@ -758,7 +746,7 @@ void ApuEA () void Apu0B () { // ASL dp - Work8 = S9xAPUGetByteZ (OP1); + uint8 Work8 = S9xAPUGetByteZ (OP1); ASL (Work8); S9xAPUSetByteZ (Work8, OP1); IAPU.PC += 2; @@ -768,7 +756,7 @@ void Apu0C () { // ASL abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); ASL (Work8); S9xAPUSetByte (Work8, IAPU.Address); IAPU.PC += 3; @@ -777,16 +765,16 @@ void Apu0C () void Apu1B () { // ASL dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); ASL (Work8); - S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + S9xAPUSetByteZ (Work8, OP1 + IAPU.Registers.X); IAPU.PC += 2; } void Apu1C () { // ASL A - ASL (APURegisters.YA.B.A); + ASL (IAPU.Registers.YA.B.A); IAPU.PC++; } @@ -794,35 +782,35 @@ void Apu0D () { // PUSH PSW S9xAPUPackStatus (); - Push (APURegisters.P); + Push (IAPU.Registers.P); IAPU.PC++; } void Apu2D () { // PUSH A - Push (APURegisters.YA.B.A); + Push (IAPU.Registers.YA.B.A); IAPU.PC++; } void Apu4D () { // PUSH X - Push (APURegisters.X); + Push (IAPU.Registers.X); IAPU.PC++; } void Apu6D () { // PUSH Y - Push (APURegisters.YA.B.Y); + Push (IAPU.Registers.YA.B.Y); IAPU.PC++; } void Apu8E () { // POP PSW - Pop (APURegisters.P); + Pop (IAPU.Registers.P); S9xAPUUnpackStatus (); if (APUCheckDirectPage ()) IAPU.DirectPage = IAPU.RAM + 0x100; @@ -834,21 +822,21 @@ void Apu8E () void ApuAE () { // POP A - Pop (APURegisters.YA.B.A); + Pop (IAPU.Registers.YA.B.A); IAPU.PC++; } void ApuCE () { // POP X - Pop (APURegisters.X); + Pop (IAPU.Registers.X); IAPU.PC++; } void ApuEE () { // POP Y - Pop (APURegisters.YA.B.Y); + Pop (IAPU.Registers.YA.B.Y); IAPU.PC++; } @@ -856,9 +844,9 @@ void Apu0E () { // TSET1 abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); - S9xAPUSetByte (Work8 | APURegisters.YA.B.A, IAPU.Address); - Work8 &= APURegisters.YA.B.A; + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + S9xAPUSetByte (Work8 | IAPU.Registers.YA.B.A, IAPU.Address); + Work8 &= IAPU.Registers.YA.B.A; APUSetZN8 (Work8); IAPU.PC += 3; } @@ -867,9 +855,9 @@ void Apu4E () { // TCLR1 abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); - S9xAPUSetByte (Work8 & ~APURegisters.YA.B.A, IAPU.Address); - Work8 &= APURegisters.YA.B.A; + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + S9xAPUSetByte (Work8 & ~IAPU.Registers.YA.B.A, IAPU.Address); + Work8 &= IAPU.Registers.YA.B.A; APUSetZN8 (Work8); IAPU.PC += 3; } @@ -883,7 +871,7 @@ void Apu0F () #else PushW (IAPU.PC + 1 - IAPU.RAM); S9xAPUPackStatus (); - Push (APURegisters.P); + Push (IAPU.Registers.P); APUSetBreak (); APUClearInterrupt (); // XXX:Where is the BRK vector ??? @@ -1050,7 +1038,7 @@ void Apu40 () void Apu1A () { // DECW dp - Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + uint16 Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); Work16--; S9xAPUSetByteZ ((uint8) Work16, OP1); S9xAPUSetByteZ (Work16 >> 8, OP1 + 1); @@ -1061,8 +1049,8 @@ void Apu1A () void Apu5A () { // CMPW YA,dp - Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); - Int32 = (long) APURegisters.YA.W - (long) Work16; + uint16 Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + int32 Int32 = (long) IAPU.Registers.YA.W - (long) Work16; IAPU._Carry = Int32 >= 0; APUSetZN16 ((uint16) Int32); IAPU.PC += 2; @@ -1071,7 +1059,7 @@ void Apu5A () void Apu3A () { // INCW dp - Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + uint16 Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); Work16++; S9xAPUSetByteZ ((uint8) Work16, OP1); S9xAPUSetByteZ (Work16 >> 8, OP1 + 1); @@ -1083,68 +1071,69 @@ void Apu3A () void Apu7A () { // ADDW YA,dp - Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); - Work32 = (uint32) APURegisters.YA.W + Work16; + uint16 Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + uint32 Work32 = (uint32) IAPU.Registers.YA.W + Work16; IAPU._Carry = Work32 >= 0x10000; - if (~(APURegisters.YA.W ^ Work16) & (Work16 ^ (uint16) Work32) & 0x8000) + if (~(IAPU.Registers.YA.W ^ Work16) & (Work16 ^ (uint16) Work32) & 0x8000) APUSetOverflow (); else APUClearOverflow (); APUClearHalfCarry (); - if((APURegisters.YA.W ^ Work16 ^ (uint16) Work32) & 0x10) + if((IAPU.Registers.YA.W ^ Work16 ^ (uint16) Work32) & 0x10) APUSetHalfCarry (); - APURegisters.YA.W = (uint16) Work32; - APUSetZN16 (APURegisters.YA.W); + IAPU.Registers.YA.W = (uint16) Work32; + APUSetZN16 (IAPU.Registers.YA.W); IAPU.PC += 2; } // XXX: BJ: i think the old HalfCarry behavior was wrong... // XXX: Or is it between bits 7 and 8 for ADDW/SUBW? +// XXX: Used Work32 instead of Int32 before. Fixed? [Neb] void Apu9A () { // SUBW YA,dp - Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); - Int32 = (long) APURegisters.YA.W - (long) Work16; + uint16 Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + int32 Int32 = (long) IAPU.Registers.YA.W - (long) Work16; APUClearHalfCarry (); IAPU._Carry = Int32 >= 0; - if (((APURegisters.YA.W ^ Work16) & 0x8000) && - ((APURegisters.YA.W ^ (uint16) Int32) & 0x8000)) + if (((IAPU.Registers.YA.W ^ Work16) & 0x8000) && + ((IAPU.Registers.YA.W ^ (uint16) Int32) & 0x8000)) APUSetOverflow (); else APUClearOverflow (); - if (((APURegisters.YA.W ^ Work16) & 0x0080) && - ((APURegisters.YA.W ^ (uint16) Int32) & 0x0080)) + if (((IAPU.Registers.YA.W ^ Work16) & 0x0080) && + ((IAPU.Registers.YA.W ^ (uint16) Int32) & 0x0080)) APUSetHalfCarry (); APUSetHalfCarry (); - if((APURegisters.YA.W ^ Work16 ^ (uint16) Work32) & 0x10) + if((IAPU.Registers.YA.W ^ Work16 ^ (uint16) Int32) & 0x10) APUClearHalfCarry (); - APURegisters.YA.W = (uint16) Int32; - APUSetZN16 (APURegisters.YA.W); + IAPU.Registers.YA.W = (uint16) Int32; + APUSetZN16 (IAPU.Registers.YA.W); IAPU.PC += 2; } void ApuBA () { // MOVW YA,dp - APURegisters.YA.B.A = S9xAPUGetByteZ (OP1); - APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1 + 1); - APUSetZN16 (APURegisters.YA.W); + IAPU.Registers.YA.B.A = S9xAPUGetByteZ (OP1); + IAPU.Registers.YA.B.Y = S9xAPUGetByteZ (OP1 + 1); + APUSetZN16 (IAPU.Registers.YA.W); IAPU.PC += 2; } void ApuDA () { // MOVW dp,YA - S9xAPUSetByteZ (APURegisters.YA.B.A, OP1); - S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1 + 1); + S9xAPUSetByteZ (IAPU.Registers.YA.B.A, OP1); + S9xAPUSetByteZ (IAPU.Registers.YA.B.Y, OP1 + 1); IAPU.PC += 2; } void Apu64 () { // CMP A,dp - Work8 = S9xAPUGetByteZ (OP1); - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (OP1); + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } @@ -1152,16 +1141,16 @@ void Apu65 () { // CMP A,abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } void Apu66 () { // CMP A,(X) - Work8 = S9xAPUGetByteZ (APURegisters.X); - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.X); + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC++; } @@ -1169,24 +1158,24 @@ void Apu67 () { // CMP A,(dp+X) IndexedXIndirect (); - Work8 = S9xAPUGetByte (IAPU.Address); - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void Apu68 () { // CMP A,#00 - Work8 = OP1; - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = OP1; + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void Apu69 () { // CMP dp(dest), dp(src) - W1 = S9xAPUGetByteZ (OP1); - Work8 = S9xAPUGetByteZ (OP2); + uint8 W1 = S9xAPUGetByteZ (OP1); + uint8 Work8 = S9xAPUGetByteZ (OP2); CMP (Work8, W1); IAPU.PC += 3; } @@ -1194,8 +1183,8 @@ void Apu69 () void Apu74 () { // CMP A, dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } @@ -1203,8 +1192,8 @@ void Apu75 () { // CMP A,abs+X AbsoluteX (); - Work8 = S9xAPUGetByte (IAPU.Address); - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } @@ -1212,8 +1201,8 @@ void Apu76 () { // CMP A, abs+Y AbsoluteY (); - Work8 = S9xAPUGetByte (IAPU.Address); - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } @@ -1221,16 +1210,16 @@ void Apu77 () { // CMP A,(dp)+Y IndirectIndexedY (); - Work8 = S9xAPUGetByte (IAPU.Address); - CMP (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + CMP (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void Apu78 () { // CMP dp,#00 - Work8 = OP1; - W1 = S9xAPUGetByteZ (OP2); + uint8 Work8 = OP1; + uint8 W1 = S9xAPUGetByteZ (OP2); CMP (W1, Work8); IAPU.PC += 3; } @@ -1238,8 +1227,8 @@ void Apu78 () void Apu79 () { // CMP (X),(Y) - W1 = S9xAPUGetByteZ (APURegisters.X); - Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y); + uint8 W1 = S9xAPUGetByteZ (IAPU.Registers.X); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.YA.B.Y); CMP (W1, Work8); IAPU.PC++; } @@ -1248,23 +1237,23 @@ void Apu1E () { // CMP X,abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); - CMP (APURegisters.X, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + CMP (IAPU.Registers.X, Work8); IAPU.PC += 3; } void Apu3E () { // CMP X,dp - Work8 = S9xAPUGetByteZ (OP1); - CMP (APURegisters.X, Work8); + uint8 Work8 = S9xAPUGetByteZ (OP1); + CMP (IAPU.Registers.X, Work8); IAPU.PC += 2; } void ApuC8 () { // CMP X,#00 - CMP (APURegisters.X, OP1); + CMP (IAPU.Registers.X, OP1); IAPU.PC += 2; } @@ -1272,24 +1261,24 @@ void Apu5E () { // CMP Y,abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); - CMP (APURegisters.YA.B.Y, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + CMP (IAPU.Registers.YA.B.Y, Work8); IAPU.PC += 3; } void Apu7E () { // CMP Y,dp - Work8 = S9xAPUGetByteZ (OP1); - CMP (APURegisters.YA.B.Y, Work8); + uint8 Work8 = S9xAPUGetByteZ (OP1); + CMP (IAPU.Registers.YA.B.Y, Work8); IAPU.PC += 2; } void ApuAD () { // CMP Y,#00 - Work8 = OP1; - CMP (APURegisters.YA.B.Y, Work8); + uint8 Work8 = OP1; + CMP (IAPU.Registers.YA.B.Y, Work8); IAPU.PC += 2; } @@ -1297,8 +1286,8 @@ void Apu1F () { // JMP (abs+X) Absolute (); - IAPU.PC = IAPU.RAM + S9xAPUGetByte (IAPU.Address + APURegisters.X) + - (S9xAPUGetByte (IAPU.Address + APURegisters.X + 1) << 8); + IAPU.PC = IAPU.RAM + S9xAPUGetByte (IAPU.Address + IAPU.Registers.X) + + (S9xAPUGetByte (IAPU.Address + IAPU.Registers.X + 1) << 8); // XXX: HERE: // APU.Flags |= TRACE_FLAG; } @@ -1336,8 +1325,8 @@ void ApuE0 () void Apu24 () { // AND A,dp - APURegisters.YA.B.A &= S9xAPUGetByteZ (OP1); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= S9xAPUGetByteZ (OP1); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -1345,16 +1334,16 @@ void Apu25 () { // AND A,abs Absolute (); - APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } void Apu26 () { // AND A,(X) - APURegisters.YA.B.A &= S9xAPUGetByteZ (APURegisters.X); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= S9xAPUGetByteZ (IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } @@ -1362,23 +1351,23 @@ void Apu27 () { // AND A,(dp+X) IndexedXIndirect (); - APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu28 () { // AND A,#00 - APURegisters.YA.B.A &= OP1; - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= OP1; + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu29 () { // AND dp(dest),dp(src) - Work8 = S9xAPUGetByteZ (OP1); + uint8 Work8 = S9xAPUGetByteZ (OP1); Work8 &= S9xAPUGetByteZ (OP2); S9xAPUSetByteZ (Work8, OP2); APUSetZN8 (Work8); @@ -1388,8 +1377,8 @@ void Apu29 () void Apu34 () { // AND A,dp+X - APURegisters.YA.B.A &= S9xAPUGetByteZ (OP1 + APURegisters.X); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= S9xAPUGetByteZ (OP1 + IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -1397,8 +1386,8 @@ void Apu35 () { // AND A,abs+X AbsoluteX (); - APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } @@ -1406,8 +1395,8 @@ void Apu36 () { // AND A,abs+Y AbsoluteY (); - APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } @@ -1415,15 +1404,15 @@ void Apu37 () { // AND A,(dp)+Y IndirectIndexedY (); - APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu38 () { // AND dp,#00 - Work8 = OP1; + uint8 Work8 = OP1; Work8 &= S9xAPUGetByteZ (OP2); S9xAPUSetByteZ (Work8, OP2); APUSetZN8 (Work8); @@ -1433,16 +1422,16 @@ void Apu38 () void Apu39 () { // AND (X),(Y) - Work8 = S9xAPUGetByteZ (APURegisters.X) & S9xAPUGetByteZ (APURegisters.YA.B.Y); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.X) & S9xAPUGetByteZ (IAPU.Registers.YA.B.Y); APUSetZN8 (Work8); - S9xAPUSetByteZ (Work8, APURegisters.X); + S9xAPUSetByteZ (Work8, IAPU.Registers.X); IAPU.PC++; } void Apu2B () { // ROL dp - Work8 = S9xAPUGetByteZ (OP1); + uint8 Work8 = S9xAPUGetByteZ (OP1); ROL (Work8); S9xAPUSetByteZ (Work8, OP1); IAPU.PC += 2; @@ -1452,7 +1441,7 @@ void Apu2C () { // ROL abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); ROL (Work8); S9xAPUSetByte (Work8, IAPU.Address); IAPU.PC += 3; @@ -1461,26 +1450,26 @@ void Apu2C () void Apu3B () { // ROL dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); ROL (Work8); - S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + S9xAPUSetByteZ (Work8, OP1 + IAPU.Registers.X); IAPU.PC += 2; } void Apu3C () { // ROL A - ROL (APURegisters.YA.B.A); + ROL (IAPU.Registers.YA.B.A); IAPU.PC++; } void Apu2E () { // CBNE dp,rel - Work8 = OP1; + uint8 Work8 = OP1; Relative2 (); - if (S9xAPUGetByteZ (Work8) != APURegisters.YA.B.A) + if (S9xAPUGetByteZ (Work8) != IAPU.Registers.YA.B.A) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; @@ -1493,10 +1482,10 @@ void Apu2E () void ApuDE () { // CBNE dp+X,rel - Work8 = OP1 + APURegisters.X; + uint8 Work8 = OP1 + IAPU.Registers.X; Relative2 (); - if (S9xAPUGetByteZ (Work8) != APURegisters.YA.B.A) + if (S9xAPUGetByteZ (Work8) != IAPU.Registers.YA.B.A) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; @@ -1509,8 +1498,8 @@ void ApuDE () void Apu3D () { // INC X - APURegisters.X++; - APUSetZN8 (APURegisters.X); + IAPU.Registers.X++; + APUSetZN8 (IAPU.Registers.X); #ifdef SPC700_SHUTDOWN IAPU.WaitCounter++; @@ -1522,8 +1511,8 @@ void Apu3D () void ApuFC () { // INC Y - APURegisters.YA.B.Y++; - APUSetZN8 (APURegisters.YA.B.Y); + IAPU.Registers.YA.B.Y++; + APUSetZN8 (IAPU.Registers.YA.B.Y); #ifdef SPC700_SHUTDOWN IAPU.WaitCounter++; @@ -1535,8 +1524,8 @@ void ApuFC () void Apu1D () { // DEC X - APURegisters.X--; - APUSetZN8 (APURegisters.X); + IAPU.Registers.X--; + APUSetZN8 (IAPU.Registers.X); #ifdef SPC700_SHUTDOWN IAPU.WaitCounter++; @@ -1548,8 +1537,8 @@ void Apu1D () void ApuDC () { // DEC Y - APURegisters.YA.B.Y--; - APUSetZN8 (APURegisters.YA.B.Y); + IAPU.Registers.YA.B.Y--; + APUSetZN8 (IAPU.Registers.YA.B.Y); #ifdef SPC700_SHUTDOWN IAPU.WaitCounter++; @@ -1561,7 +1550,7 @@ void ApuDC () void ApuAB () { // INC dp - Work8 = S9xAPUGetByteZ (OP1) + 1; + uint8 Work8 = S9xAPUGetByteZ (OP1) + 1; S9xAPUSetByteZ (Work8, OP1); APUSetZN8 (Work8); @@ -1576,7 +1565,7 @@ void ApuAC () { // INC abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address) + 1; + uint8 Work8 = S9xAPUGetByte (IAPU.Address) + 1; S9xAPUSetByte (Work8, IAPU.Address); APUSetZN8 (Work8); @@ -1590,8 +1579,8 @@ void ApuAC () void ApuBB () { // INC dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X) + 1; - S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X) + 1; + S9xAPUSetByteZ (Work8, OP1 + IAPU.Registers.X); APUSetZN8 (Work8); #ifdef SPC700_SHUTDOWN @@ -1604,8 +1593,8 @@ void ApuBB () void ApuBC () { // INC A - APURegisters.YA.B.A++; - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A++; + APUSetZN8 (IAPU.Registers.YA.B.A); #ifdef SPC700_SHUTDOWN IAPU.WaitCounter++; @@ -1617,7 +1606,7 @@ void ApuBC () void Apu8B () { // DEC dp - Work8 = S9xAPUGetByteZ (OP1) - 1; + uint8 Work8 = S9xAPUGetByteZ (OP1) - 1; S9xAPUSetByteZ (Work8, OP1); APUSetZN8 (Work8); @@ -1632,7 +1621,7 @@ void Apu8C () { // DEC abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address) - 1; + uint8 Work8 = S9xAPUGetByte (IAPU.Address) - 1; S9xAPUSetByte (Work8, IAPU.Address); APUSetZN8 (Work8); @@ -1646,8 +1635,8 @@ void Apu8C () void Apu9B () { // DEC dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X) - 1; - S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X) - 1; + S9xAPUSetByteZ (Work8, OP1 + IAPU.Registers.X); APUSetZN8 (Work8); #ifdef SPC700_SHUTDOWN @@ -1660,8 +1649,8 @@ void Apu9B () void Apu9C () { // DEC A - APURegisters.YA.B.A--; - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A--; + APUSetZN8 (IAPU.Registers.YA.B.A); #ifdef SPC700_SHUTDOWN IAPU.WaitCounter++; @@ -1673,8 +1662,8 @@ void Apu9C () void Apu44 () { // EOR A,dp - APURegisters.YA.B.A ^= S9xAPUGetByteZ (OP1); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= S9xAPUGetByteZ (OP1); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -1682,16 +1671,16 @@ void Apu45 () { // EOR A,abs Absolute (); - APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } void Apu46 () { // EOR A,(X) - APURegisters.YA.B.A ^= S9xAPUGetByteZ (APURegisters.X); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= S9xAPUGetByteZ (IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } @@ -1699,23 +1688,23 @@ void Apu47 () { // EOR A,(dp+X) IndexedXIndirect (); - APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu48 () { // EOR A,#00 - APURegisters.YA.B.A ^= OP1; - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= OP1; + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu49 () { // EOR dp(dest),dp(src) - Work8 = S9xAPUGetByteZ (OP1); + uint8 Work8 = S9xAPUGetByteZ (OP1); Work8 ^= S9xAPUGetByteZ (OP2); S9xAPUSetByteZ (Work8, OP2); APUSetZN8 (Work8); @@ -1725,8 +1714,8 @@ void Apu49 () void Apu54 () { // EOR A,dp+X - APURegisters.YA.B.A ^= S9xAPUGetByteZ (OP1 + APURegisters.X); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= S9xAPUGetByteZ (OP1 + IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -1734,8 +1723,8 @@ void Apu55 () { // EOR A,abs+X AbsoluteX (); - APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } @@ -1743,8 +1732,8 @@ void Apu56 () { // EOR A,abs+Y AbsoluteY (); - APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } @@ -1752,15 +1741,15 @@ void Apu57 () { // EOR A,(dp)+Y IndirectIndexedY (); - APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void Apu58 () { // EOR dp,#00 - Work8 = OP1; + uint8 Work8 = OP1; Work8 ^= S9xAPUGetByteZ (OP2); S9xAPUSetByteZ (Work8, OP2); APUSetZN8 (Work8); @@ -1770,16 +1759,16 @@ void Apu58 () void Apu59 () { // EOR (X),(Y) - Work8 = S9xAPUGetByteZ (APURegisters.X) ^ S9xAPUGetByteZ (APURegisters.YA.B.Y); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.X) ^ S9xAPUGetByteZ (IAPU.Registers.YA.B.Y); APUSetZN8 (Work8); - S9xAPUSetByteZ (Work8, APURegisters.X); + S9xAPUSetByteZ (Work8, IAPU.Registers.X); IAPU.PC++; } void Apu4B () { // LSR dp - Work8 = S9xAPUGetByteZ (OP1); + uint8 Work8 = S9xAPUGetByteZ (OP1); LSR (Work8); S9xAPUSetByteZ (Work8, OP1); IAPU.PC += 2; @@ -1789,7 +1778,7 @@ void Apu4C () { // LSR abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); LSR (Work8); S9xAPUSetByte (Work8, IAPU.Address); IAPU.PC += 3; @@ -1798,70 +1787,70 @@ void Apu4C () void Apu5B () { // LSR dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); LSR (Work8); - S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + S9xAPUSetByteZ (Work8, OP1 + IAPU.Registers.X); IAPU.PC += 2; } void Apu5C () { // LSR A - LSR (APURegisters.YA.B.A); + LSR (IAPU.Registers.YA.B.A); IAPU.PC++; } void Apu7D () { // MOV A,X - APURegisters.YA.B.A = APURegisters.X; - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = IAPU.Registers.X; + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } void ApuDD () { // MOV A,Y - APURegisters.YA.B.A = APURegisters.YA.B.Y; - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = IAPU.Registers.YA.B.Y; + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } void Apu5D () { // MOV X,A - APURegisters.X = APURegisters.YA.B.A; - APUSetZN8 (APURegisters.X); + IAPU.Registers.X = IAPU.Registers.YA.B.A; + APUSetZN8 (IAPU.Registers.X); IAPU.PC++; } void ApuFD () { // MOV Y,A - APURegisters.YA.B.Y = APURegisters.YA.B.A; - APUSetZN8 (APURegisters.YA.B.Y); + IAPU.Registers.YA.B.Y = IAPU.Registers.YA.B.A; + APUSetZN8 (IAPU.Registers.YA.B.Y); IAPU.PC++; } void Apu9D () { //MOV X,SP - APURegisters.X = APURegisters.S; - APUSetZN8 (APURegisters.X); + IAPU.Registers.X = IAPU.Registers.S; + APUSetZN8 (IAPU.Registers.X); IAPU.PC++; } void ApuBD () { // MOV SP,X - APURegisters.S = APURegisters.X; + IAPU.Registers.S = IAPU.Registers.X; IAPU.PC++; } void Apu6B () { // ROR dp - Work8 = S9xAPUGetByteZ (OP1); + uint8 Work8 = S9xAPUGetByteZ (OP1); ROR (Work8); S9xAPUSetByteZ (Work8, OP1); IAPU.PC += 2; @@ -1871,7 +1860,7 @@ void Apu6C () { // ROR abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); ROR (Work8); S9xAPUSetByte (Work8, IAPU.Address); IAPU.PC += 3; @@ -1880,25 +1869,25 @@ void Apu6C () void Apu7B () { // ROR dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); ROR (Work8); - S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + S9xAPUSetByteZ (Work8, OP1 + IAPU.Registers.X); IAPU.PC += 2; } void Apu7C () { // ROR A - ROR (APURegisters.YA.B.A); + ROR (IAPU.Registers.YA.B.A); IAPU.PC++; } void Apu6E () { // DBNZ dp,rel - Work8 = OP1; + uint8 Work8 = OP1; Relative2 (); - W1 = S9xAPUGetByteZ (Work8) - 1; + uint8 W1 = S9xAPUGetByteZ (Work8) - 1; S9xAPUSetByteZ (W1, Work8); if (W1 != 0) { @@ -1913,8 +1902,8 @@ void ApuFE () { // DBNZ Y,rel Relative (); - APURegisters.YA.B.Y--; - if (APURegisters.YA.B.Y != 0) + IAPU.Registers.YA.B.Y--; + if (IAPU.Registers.YA.B.Y != 0) { IAPU.PC = IAPU.RAM + (uint16) Int16; APU.Cycles += IAPU.TwoCycles; @@ -1926,25 +1915,25 @@ void ApuFE () void Apu6F () { // RET - PopW (APURegisters.PC); - IAPU.PC = IAPU.RAM + APURegisters.PC; + PopW (IAPU.Registers.PC); + IAPU.PC = IAPU.RAM + IAPU.Registers.PC; } void Apu7F () { // RETI // STOP ("RETI"); - Pop (APURegisters.P); + Pop (IAPU.Registers.P); S9xAPUUnpackStatus (); - PopW (APURegisters.PC); - IAPU.PC = IAPU.RAM + APURegisters.PC; + PopW (IAPU.Registers.PC); + IAPU.PC = IAPU.RAM + IAPU.Registers.PC; } void Apu84 () { // ADC A,dp - Work8 = S9xAPUGetByteZ (OP1); - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (OP1); + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } @@ -1952,16 +1941,16 @@ void Apu85 () { // ADC A, abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } void Apu86 () { // ADC A,(X) - Work8 = S9xAPUGetByteZ (APURegisters.X); - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.X); + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC++; } @@ -1969,24 +1958,24 @@ void Apu87 () { // ADC A,(dp+X) IndexedXIndirect (); - Work8 = S9xAPUGetByte (IAPU.Address); - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void Apu88 () { // ADC A,#00 - Work8 = OP1; - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = OP1; + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void Apu89 () { // ADC dp(dest),dp(src) - Work8 = S9xAPUGetByteZ (OP1); - W1 = S9xAPUGetByteZ (OP2); + uint8 Work8 = S9xAPUGetByteZ (OP1); + uint8 W1 = S9xAPUGetByteZ (OP2); ADC (W1, Work8); S9xAPUSetByteZ (W1, OP2); IAPU.PC += 3; @@ -1995,8 +1984,8 @@ void Apu89 () void Apu94 () { // ADC A,dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } @@ -2004,8 +1993,8 @@ void Apu95 () { // ADC A, abs+X AbsoluteX (); - Work8 = S9xAPUGetByte (IAPU.Address); - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } @@ -2013,8 +2002,8 @@ void Apu96 () { // ADC A, abs+Y AbsoluteY (); - Work8 = S9xAPUGetByte (IAPU.Address); - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } @@ -2022,16 +2011,16 @@ void Apu97 () { // ADC A, (dp)+Y IndirectIndexedY (); - Work8 = S9xAPUGetByte (IAPU.Address); - ADC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + ADC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void Apu98 () { // ADC dp,#00 - Work8 = OP1; - W1 = S9xAPUGetByteZ (OP2); + uint8 Work8 = OP1; + uint8 W1 = S9xAPUGetByteZ (OP2); ADC (W1, Work8); S9xAPUSetByteZ (W1, OP2); IAPU.PC += 3; @@ -2040,25 +2029,25 @@ void Apu98 () void Apu99 () { // ADC (X),(Y) - W1 = S9xAPUGetByteZ (APURegisters.X); - Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y); + uint8 W1 = S9xAPUGetByteZ (IAPU.Registers.X); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.YA.B.Y); ADC (W1, Work8); - S9xAPUSetByteZ (W1, APURegisters.X); + S9xAPUSetByteZ (W1, IAPU.Registers.X); IAPU.PC++; } void Apu8D () { // MOV Y,#00 - APURegisters.YA.B.Y = OP1; - APUSetZN8 (APURegisters.YA.B.Y); + IAPU.Registers.YA.B.Y = OP1; + APUSetZN8 (IAPU.Registers.YA.B.Y); IAPU.PC += 2; } void Apu8F () { // MOV dp,#00 - Work8 = OP1; + uint8 Work8 = OP1; S9xAPUSetByteZ (Work8, OP2); IAPU.PC += 3; } @@ -2066,38 +2055,38 @@ void Apu8F () void Apu9E () { // DIV YA,X - if (APURegisters.X == 0) + if (IAPU.Registers.X == 0) { APUSetOverflow (); - APURegisters.YA.B.Y = 0xff; - APURegisters.YA.B.A = 0xff; + IAPU.Registers.YA.B.Y = 0xff; + IAPU.Registers.YA.B.A = 0xff; } else { APUClearOverflow (); - Work8 = APURegisters.YA.W / APURegisters.X; - APURegisters.YA.B.Y = APURegisters.YA.W % APURegisters.X; - APURegisters.YA.B.A = Work8; + uint8 Work8 = IAPU.Registers.YA.W / IAPU.Registers.X; + IAPU.Registers.YA.B.Y = IAPU.Registers.YA.W % IAPU.Registers.X; + IAPU.Registers.YA.B.A = Work8; } // XXX How should Overflow, Half Carry, Zero and Negative flags be set?? - // APUSetZN16 (APURegisters.YA.W); - APUSetZN8 (APURegisters.YA.B.A); + // APUSetZN16 (IAPU.Registers.YA.W); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } void Apu9F () { // XCN A - APURegisters.YA.B.A = (APURegisters.YA.B.A >> 4) | (APURegisters.YA.B.A << 4); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = (IAPU.Registers.YA.B.A >> 4) | (IAPU.Registers.YA.B.A << 4); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } void ApuA4 () { // SBC A, dp - Work8 = S9xAPUGetByteZ (OP1); - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (OP1); + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } @@ -2105,16 +2094,16 @@ void ApuA5 () { // SBC A, abs Absolute (); - Work8 = S9xAPUGetByte (IAPU.Address); - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } void ApuA6 () { // SBC A, (X) - Work8 = S9xAPUGetByteZ (APURegisters.X); - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.X); + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC++; } @@ -2122,24 +2111,24 @@ void ApuA7 () { // SBC A,(dp+X) IndexedXIndirect (); - Work8 = S9xAPUGetByte (IAPU.Address); - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void ApuA8 () { // SBC A,#00 - Work8 = OP1; - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = OP1; + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void ApuA9 () { // SBC dp(dest), dp(src) - Work8 = S9xAPUGetByteZ (OP1); - W1 = S9xAPUGetByteZ (OP2); + uint8 Work8 = S9xAPUGetByteZ (OP1); + uint8 W1 = S9xAPUGetByteZ (OP2); SBC (W1, Work8); S9xAPUSetByteZ (W1, OP2); IAPU.PC += 3; @@ -2148,8 +2137,8 @@ void ApuA9 () void ApuB4 () { // SBC A, dp+X - Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } @@ -2157,8 +2146,8 @@ void ApuB5 () { // SBC A,abs+X AbsoluteX (); - Work8 = S9xAPUGetByte (IAPU.Address); - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } @@ -2166,8 +2155,8 @@ void ApuB6 () { // SBC A,abs+Y AbsoluteY (); - Work8 = S9xAPUGetByte (IAPU.Address); - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 3; } @@ -2175,16 +2164,16 @@ void ApuB7 () { // SBC A,(dp)+Y IndirectIndexedY (); - Work8 = S9xAPUGetByte (IAPU.Address); - SBC (APURegisters.YA.B.A, Work8); + uint8 Work8 = S9xAPUGetByte (IAPU.Address); + SBC (IAPU.Registers.YA.B.A, Work8); IAPU.PC += 2; } void ApuB8 () { // SBC dp,#00 - Work8 = OP1; - W1 = S9xAPUGetByteZ (OP2); + uint8 Work8 = OP1; + uint8 W1 = S9xAPUGetByteZ (OP2); SBC (W1, Work8); S9xAPUSetByteZ (W1, OP2); IAPU.PC += 3; @@ -2193,42 +2182,42 @@ void ApuB8 () void ApuB9 () { // SBC (X),(Y) - W1 = S9xAPUGetByteZ (APURegisters.X); - Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y); + uint8 W1 = S9xAPUGetByteZ (IAPU.Registers.X); + uint8 Work8 = S9xAPUGetByteZ (IAPU.Registers.YA.B.Y); SBC (W1, Work8); - S9xAPUSetByteZ (W1, APURegisters.X); + S9xAPUSetByteZ (W1, IAPU.Registers.X); IAPU.PC++; } void ApuAF () { // MOV (X)+, A - S9xAPUSetByteZ (APURegisters.YA.B.A, APURegisters.X++); + S9xAPUSetByteZ (IAPU.Registers.YA.B.A, IAPU.Registers.X++); IAPU.PC++; } void ApuBE () { // DAS - if ((APURegisters.YA.B.A & 0x0f) > 9 || !APUCheckHalfCarry()) + if ((IAPU.Registers.YA.B.A & 0x0f) > 9 || !APUCheckHalfCarry()) { - APURegisters.YA.B.A -= 6; + IAPU.Registers.YA.B.A -= 6; } - if (APURegisters.YA.B.A > 0x9f || !IAPU._Carry) + if (IAPU.Registers.YA.B.A > 0x9f || !IAPU._Carry) { - APURegisters.YA.B.A -= 0x60; + IAPU.Registers.YA.B.A -= 0x60; APUClearCarry (); } else { APUSetCarry (); } - APUSetZN8 (APURegisters.YA.B.A); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } void ApuBF () { // MOV A,(X)+ - APURegisters.YA.B.A = S9xAPUGetByteZ (APURegisters.X++); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByteZ (IAPU.Registers.X++); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } @@ -2249,7 +2238,7 @@ void ApuA0 () void ApuC4 () { // MOV dp,A - S9xAPUSetByteZ (APURegisters.YA.B.A, OP1); + S9xAPUSetByteZ (IAPU.Registers.YA.B.A, OP1); IAPU.PC += 2; } @@ -2257,14 +2246,14 @@ void ApuC5 () { // MOV abs,A Absolute (); - S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + S9xAPUSetByte (IAPU.Registers.YA.B.A, IAPU.Address); IAPU.PC += 3; } void ApuC6 () { // MOV (X), A - S9xAPUSetByteZ (APURegisters.YA.B.A, APURegisters.X); + S9xAPUSetByteZ (IAPU.Registers.YA.B.A, IAPU.Registers.X); IAPU.PC++; } @@ -2272,7 +2261,7 @@ void ApuC7 () { // MOV (dp+X),A IndexedXIndirect (); - S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + S9xAPUSetByte (IAPU.Registers.YA.B.A, IAPU.Address); IAPU.PC += 2; } @@ -2280,14 +2269,14 @@ void ApuC9 () { // MOV abs,X Absolute (); - S9xAPUSetByte (APURegisters.X, IAPU.Address); + S9xAPUSetByte (IAPU.Registers.X, IAPU.Address); IAPU.PC += 3; } void ApuCB () { // MOV dp,Y - S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1); + S9xAPUSetByteZ (IAPU.Registers.YA.B.Y, OP1); IAPU.PC += 2; } @@ -2295,30 +2284,30 @@ void ApuCC () { // MOV abs,Y Absolute (); - S9xAPUSetByte (APURegisters.YA.B.Y, IAPU.Address); + S9xAPUSetByte (IAPU.Registers.YA.B.Y, IAPU.Address); IAPU.PC += 3; } void ApuCD () { // MOV X,#00 - APURegisters.X = OP1; - APUSetZN8 (APURegisters.X); + IAPU.Registers.X = OP1; + APUSetZN8 (IAPU.Registers.X); IAPU.PC += 2; } void ApuCF () { // MUL YA - APURegisters.YA.W = (uint16) APURegisters.YA.B.A * APURegisters.YA.B.Y; - APUSetZN16 (APURegisters.YA.W); + IAPU.Registers.YA.W = (uint16) IAPU.Registers.YA.B.A * IAPU.Registers.YA.B.Y; + APUSetZN16 (IAPU.Registers.YA.W); IAPU.PC++; } void ApuD4 () { // MOV dp+X, A - S9xAPUSetByteZ (APURegisters.YA.B.A, OP1 + APURegisters.X); + S9xAPUSetByteZ (IAPU.Registers.YA.B.A, OP1 + IAPU.Registers.X); IAPU.PC += 2; } @@ -2326,7 +2315,7 @@ void ApuD5 () { // MOV abs+X,A AbsoluteX (); - S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + S9xAPUSetByte (IAPU.Registers.YA.B.A, IAPU.Address); IAPU.PC += 3; } @@ -2334,7 +2323,7 @@ void ApuD6 () { // MOV abs+Y,A AbsoluteY (); - S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + S9xAPUSetByte (IAPU.Registers.YA.B.A, IAPU.Address); IAPU.PC += 3; } @@ -2342,56 +2331,56 @@ void ApuD7 () { // MOV (dp)+Y,A IndirectIndexedY (); - S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + S9xAPUSetByte (IAPU.Registers.YA.B.A, IAPU.Address); IAPU.PC += 2; } void ApuD8 () { // MOV dp,X - S9xAPUSetByteZ (APURegisters.X, OP1); + S9xAPUSetByteZ (IAPU.Registers.X, OP1); IAPU.PC += 2; } void ApuD9 () { // MOV dp+Y,X - S9xAPUSetByteZ (APURegisters.X, OP1 + APURegisters.YA.B.Y); + S9xAPUSetByteZ (IAPU.Registers.X, OP1 + IAPU.Registers.YA.B.Y); IAPU.PC += 2; } void ApuDB () { // MOV dp+X,Y - S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1 + APURegisters.X); + S9xAPUSetByteZ (IAPU.Registers.YA.B.Y, OP1 + IAPU.Registers.X); IAPU.PC += 2; } void ApuDF () { // DAA - if ((APURegisters.YA.B.A & 0x0f) > 9 || APUCheckHalfCarry()) + if ((IAPU.Registers.YA.B.A & 0x0f) > 9 || APUCheckHalfCarry()) { - if(APURegisters.YA.B.A > 0xf0) APUSetCarry (); - APURegisters.YA.B.A += 6; + if(IAPU.Registers.YA.B.A > 0xf0) APUSetCarry (); + IAPU.Registers.YA.B.A += 6; //APUSetHalfCarry (); Intel procs do this, but this is a Sony proc... } //else { APUClearHalfCarry (); } ditto as above - if (APURegisters.YA.B.A > 0x9f || IAPU._Carry) + if (IAPU.Registers.YA.B.A > 0x9f || IAPU._Carry) { - APURegisters.YA.B.A += 0x60; + IAPU.Registers.YA.B.A += 0x60; APUSetCarry (); } else { APUClearCarry (); } - APUSetZN8 (APURegisters.YA.B.A); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } void ApuE4 () { // MOV A, dp - APURegisters.YA.B.A = S9xAPUGetByteZ (OP1); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByteZ (OP1); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -2399,16 +2388,16 @@ void ApuE5 () { // MOV A,abs Absolute (); - APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } void ApuE6 () { // MOV A,(X) - APURegisters.YA.B.A = S9xAPUGetByteZ (APURegisters.X); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByteZ (IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC++; } @@ -2416,16 +2405,16 @@ void ApuE7 () { // MOV A,(dp+X) IndexedXIndirect (); - APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void ApuE8 () { // MOV A,#00 - APURegisters.YA.B.A = OP1; - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = OP1; + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -2433,16 +2422,16 @@ void ApuE9 () { // MOV X, abs Absolute (); - APURegisters.X = S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.X); + IAPU.Registers.X = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.X); IAPU.PC += 3; } void ApuEB () { // MOV Y,dp - APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1); - APUSetZN8 (APURegisters.YA.B.Y); + IAPU.Registers.YA.B.Y = S9xAPUGetByteZ (OP1); + APUSetZN8 (IAPU.Registers.YA.B.Y); IAPU.PC += 2; } @@ -2450,16 +2439,16 @@ void ApuEC () { // MOV Y,abs Absolute (); - APURegisters.YA.B.Y = S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.Y); + IAPU.Registers.YA.B.Y = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.Y); IAPU.PC += 3; } void ApuF4 () { // MOV A, dp+X - APURegisters.YA.B.A = S9xAPUGetByteZ (OP1 + APURegisters.X); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } @@ -2467,8 +2456,8 @@ void ApuF5 () { // MOV A, abs+X AbsoluteX (); - APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } @@ -2476,8 +2465,8 @@ void ApuF6 () { // MOV A, abs+Y AbsoluteY (); - APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 3; } @@ -2485,24 +2474,24 @@ void ApuF7 () { // MOV A, (dp)+Y IndirectIndexedY (); - APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); - APUSetZN8 (APURegisters.YA.B.A); + IAPU.Registers.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (IAPU.Registers.YA.B.A); IAPU.PC += 2; } void ApuF8 () { // MOV X,dp - APURegisters.X = S9xAPUGetByteZ (OP1); - APUSetZN8 (APURegisters.X); + IAPU.Registers.X = S9xAPUGetByteZ (OP1); + APUSetZN8 (IAPU.Registers.X); IAPU.PC += 2; } void ApuF9 () { // MOV X,dp+Y - APURegisters.X = S9xAPUGetByteZ (OP1 + APURegisters.YA.B.Y); - APUSetZN8 (APURegisters.X); + IAPU.Registers.X = S9xAPUGetByteZ (OP1 + IAPU.Registers.YA.B.Y); + APUSetZN8 (IAPU.Registers.X); IAPU.PC += 2; } @@ -2516,8 +2505,8 @@ void ApuFA () void ApuFB () { // MOV Y,dp+X - APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1 + APURegisters.X); - APUSetZN8 (APURegisters.YA.B.Y); + IAPU.Registers.YA.B.Y = S9xAPUGetByteZ (OP1 + IAPU.Registers.X); + APUSetZN8 (IAPU.Registers.YA.B.Y); IAPU.PC += 2; } diff --git a/source/spc700.h b/source/spc700.h index 3d09fee..abb413e 100644 --- a/source/spc700.h +++ b/source/spc700.h @@ -107,29 +107,29 @@ #define APUClearCarry() (IAPU._Carry = 0) #define APUSetCarry() (IAPU._Carry = 1) -#define APUSetInterrupt() (APURegisters.P |= Interrupt) -#define APUClearInterrupt() (APURegisters.P &= ~Interrupt) -#define APUSetHalfCarry() (APURegisters.P |= HalfCarry) -#define APUClearHalfCarry() (APURegisters.P &= ~HalfCarry) -#define APUSetBreak() (APURegisters.P |= BreakFlag) -#define APUClearBreak() (APURegisters.P &= ~BreakFlag) -#define APUSetDirectPage() (APURegisters.P |= DirectPageFlag) -#define APUClearDirectPage() (APURegisters.P &= ~DirectPageFlag) +#define APUSetInterrupt() (IAPU.Registers.P |= Interrupt) +#define APUClearInterrupt() (IAPU.Registers.P &= ~Interrupt) +#define APUSetHalfCarry() (IAPU.Registers.P |= HalfCarry) +#define APUClearHalfCarry() (IAPU.Registers.P &= ~HalfCarry) +#define APUSetBreak() (IAPU.Registers.P |= BreakFlag) +#define APUClearBreak() (IAPU.Registers.P &= ~BreakFlag) +#define APUSetDirectPage() (IAPU.Registers.P |= DirectPageFlag) +#define APUClearDirectPage() (IAPU.Registers.P &= ~DirectPageFlag) #define APUSetOverflow() (IAPU._Overflow = 1) #define APUClearOverflow() (IAPU._Overflow = 0) #define APUCheckZero() (IAPU._Zero == 0) #define APUCheckCarry() (IAPU._Carry) -#define APUCheckInterrupt() (APURegisters.P & Interrupt) -#define APUCheckHalfCarry() (APURegisters.P & HalfCarry) -#define APUCheckBreak() (APURegisters.P & BreakFlag) -#define APUCheckDirectPage() (APURegisters.P & DirectPageFlag) +#define APUCheckInterrupt() (IAPU.Registers.P & Interrupt) +#define APUCheckHalfCarry() (IAPU.Registers.P & HalfCarry) +#define APUCheckBreak() (IAPU.Registers.P & BreakFlag) +#define APUCheckDirectPage() (IAPU.Registers.P & DirectPageFlag) #define APUCheckOverflow() (IAPU._Overflow) #define APUCheckNegative() (IAPU._Zero & 0x80) -#define APUClearFlags(f) (APURegisters.P &= ~(f)) -#define APUSetFlags(f) (APURegisters.P |= (f)) -#define APUCheckFlag(f) (APURegisters.P & (f)) +#define APUClearFlags(f) (IAPU.Registers.P &= ~(f)) +#define APUSetFlags(f) (IAPU.Registers.P |= (f)) +#define APUCheckFlag(f) (IAPU.Registers.P & (f)) typedef union { @@ -149,8 +149,6 @@ struct SAPURegisters{ uint16 PC; }; -EXTERN_C struct SAPURegisters APURegisters; - // Needed by ILLUSION OF GAIA //#define ONE_APU_CYCLE 14 #define ONE_APU_CYCLE 21 diff --git a/source/spccycles.cpp b/source/spccycles.cpp deleted file mode 100644 index 3cb572e..0000000 --- a/source/spccycles.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - - (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and - Jerremy Koot (jkoot@snes9x.com) - - (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) - - (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), - funkyass (funkyass@spam.shaw.ca), - Joel Yliluoma (http://iki.fi/bisqwit/) - Kris Bleakley (codeviolation@hotmail.com), - Matthew Kendora, - Nach (n-a-c-h@users.sourceforge.net), - Peter Bortas (peter@bortas.org) and - zones (kasumitokoduck@yahoo.com) - - C4 x86 assembler and some C emulation code - (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), - _Demo_ (_demo_@zsnes.com), and Nach - - C4 C++ code - (c) Copyright 2003 Brad Jorsch - - DSP-1 emulator code - (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, - John Weidman, neviksti (neviksti@hotmail.com), - Kris Bleakley, Andreas Naive - - DSP-2 emulator code - (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and - Lord Nightmare (lord_nightmare@users.sourceforge.net - - OBC1 emulator code - (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and - Kris Bleakley - Ported from x86 assembler to C by sanmaiwashi - - SPC7110 and RTC C++ emulator code - (c) Copyright 2002 Matthew Kendora with research by - zsKnight, John Weidman, and Dark Force - - S-DD1 C emulator code - (c) Copyright 2003 Brad Jorsch with research by - Andreas Naive and John Weidman - - S-RTC C emulator code - (c) Copyright 2001 John Weidman - - ST010 C++ emulator code - (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - - Super FX C emulator code - (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman - - - SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) - - - Specific ports contains the works of other authors. See headers in - individual files. - - Snes9x homepage: http://www.snes9x.com - - Permission to use, copy, modify and distribute Snes9x in both binary and - source form, for non-commercial purposes, is hereby granted without fee, - providing that this license information and copyright notice appear with - all copies and any derived work. - - This software is provided 'as-is', without any express or implied - warranty. In no event shall the authors be held liable for any damages - arising from the use of this software. - - Snes9x is freeware for PERSONAL USE only. Commercial users should - seek permission of the copyright holders first. Commercial use includes - charging money for Snes9x or software derived from Snes9x. - - The copyright holders request that bug fixes and improvements to the code - should be forwarded to them so everyone can benefit from the modifications - in future versions. - - Super NES and Super Nintendo Entertainment System are trademarks of - Nintendo Co., Limited and its subsidiary companies. -*******************************************************************************/ - -static uint8 spc700cycles [256] = -{ - /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, */ - /* 00 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 6, 8, - /* 10 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 4, 6, - /* 20 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 5, 4, - /* 30 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 3, 8, - /* 40 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 6, 6, - /* 50 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 4, 5, 2, 2, 4, 3, - /* 60 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 5, 5, - /* 70 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 6, - /* 80 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 2, 4, 5, - /* 90 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2,12, 5, - /* a0 */ 3, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 2, 4, 4, - /* b0 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 4, - /* c0 */ 3, 8, 4, 5, 4, 5, 4, 7, 2, 5, 6, 4, 5, 2, 4, 9, - /* d0 */ 2, 8, 4, 5, 5, 6, 6, 7, 4, 5, 4, 5, 2, 2, 6, 3, - /* e0 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 4, 5, 3, 4, 3, 4, 3, - /* f0 */ 2, 8, 4, 5, 4, 5, 5, 6, 3, 4, 5, 4, 2, 2, 4, 3 -}; - diff --git a/source/spctool.cpp b/source/spctool.cpp deleted file mode 100644 index 011498c..0000000 --- a/source/spctool.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/******************************************************************************* - Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - - (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and - Jerremy Koot (jkoot@snes9x.com) - - (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) - - (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), - funkyass (funkyass@spam.shaw.ca), - Joel Yliluoma (http://iki.fi/bisqwit/) - Kris Bleakley (codeviolation@hotmail.com), - Matthew Kendora, - Nach (n-a-c-h@users.sourceforge.net), - Peter Bortas (peter@bortas.org) and - zones (kasumitokoduck@yahoo.com) - - C4 x86 assembler and some C emulation code - (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), - _Demo_ (_demo_@zsnes.com), and Nach - - C4 C++ code - (c) Copyright 2003 Brad Jorsch - - DSP-1 emulator code - (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, - John Weidman, neviksti (neviksti@hotmail.com), - Kris Bleakley, Andreas Naive - - DSP-2 emulator code - (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and - Lord Nightmare (lord_nightmare@users.sourceforge.net - - OBC1 emulator code - (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and - Kris Bleakley - Ported from x86 assembler to C by sanmaiwashi - - SPC7110 and RTC C++ emulator code - (c) Copyright 2002 Matthew Kendora with research by - zsKnight, John Weidman, and Dark Force - - S-DD1 C emulator code - (c) Copyright 2003 Brad Jorsch with research by - Andreas Naive and John Weidman - - S-RTC C emulator code - (c) Copyright 2001 John Weidman - - ST010 C++ emulator code - (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - - Super FX C emulator code - (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman - - - SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) - - - Specific ports contains the works of other authors. See headers in - individual files. - - Snes9x homepage: http://www.snes9x.com - - Permission to use, copy, modify and distribute Snes9x in both binary and - source form, for non-commercial purposes, is hereby granted without fee, - providing that this license information and copyright notice appear with - all copies and any derived work. - - This software is provided 'as-is', without any express or implied - warranty. In no event shall the authors be held liable for any damages - arising from the use of this software. - - Snes9x is freeware for PERSONAL USE only. Commercial users should - seek permission of the copyright holders first. Commercial use includes - charging money for Snes9x or software derived from Snes9x. - - The copyright holders request that bug fixes and improvements to the code - should be forwarded to them so everyone can benefit from the modifications - in future versions. - - Super NES and Super Nintendo Entertainment System are trademarks of - Nintendo Co., Limited and its subsidiary companies. -*******************************************************************************/ -#include "snes9x.h" -#include "spctool/dsp.h" -#include "spctool/spc700.h" -#include "spctool/soundmod.h" -#include "apu.h" - -bool8 S9xOpenSoundDevice (int, bool8, int); - -void S9xSetPlaybackRate (uint32 rate) -{ - DOpt SmpOpt; - - SmpOpt.Smp8bit=false; - SmpOpt.SmpMono=false; - SmpOpt.IntType=IntC; - SmpOpt.OldBRE=false; - SmpOpt.MixRout=1; - SetSPUOpt (rate, SmpOpt); - -// so.playback_rate = playback_rate; -// so.err_rate = (uint32) (SNES_SCANLINE_TIME * FIXED_POINT / (1.0 / (double) so.playback_rate)); - } - -bool8 S9xSetSoundMute (bool8 mute) -{ - return (TRUE); -} - -START_EXTERN_C -bool8 S9xInitSound (int mode, bool8 stereo, int buffer_size) -{ - if (!(mode & 7)) - return (TRUE); - - S9xSetSoundMute (TRUE); - if (!S9xOpenSoundDevice (mode, stereo, buffer_size)) - { - S9xMessage (S9X_ERROR, S9X_SOUND_DEVICE_OPEN_FAILED, - "Sound device open failed"); - return (FALSE); - } - return (TRUE); -} - -void TraceSPC (unsigned char *PC, unsigned short YA, unsigned char X, - SPCFlags PS, unsigned char *SP) -{ - APURegisters.YA.W = YA; - APURegisters.X = X; - APURegisters.S = SP - IAPU.RAM; - IAPU.PC = PC; - IAPU._Carry = PS.C; - IAPU._Zero = !PS.Z | (PS.N << 7); - IAPU._Overflow = PS.V; - APURegisters.P = *(uint8 *) &PS; - S9xTraceAPU (); -} - -bool8 S9xInitAPU () -{ - void *SPCBase; //Base pointer and aligned pointer to SPC RAM - - SPCBase=malloc(131072); //Allocate memory for SPC RAM - memset(SPCBase, 0, 131072); - - IAPU.RAM=(uint8 *) InitSPU(SPCBase); //Initialize SPU w/ ptr to SPC RAM (Call only once) - - S9xSetPlaybackRate (22050); - ResetSPU(20); //Reset SPU with pre-amp level of 30 -// _SetSPCDbg(TraceSPC); //Install debug handler - return (TRUE); -} - -void S9xResetAPU () -{ - ResetSPU(20); - IAPU.RAM [0xf1] = 0x80; - _FixSPC (0xffc0, 0, 0, 0, 0, 0xff); -// FixDSP (); -} - -extern "C" void EDSP (uint8 *, int32); - -void S9xMixSamplesO (uint8 *buffer, int sample_count, int byte_offset) -{ -// _EmuDSP (buffer + byte_offset, sample_count / 2); - - EDSP (buffer + byte_offset, sample_count / 2); -#if 0 -for (int i = 0; i < 32; i++) -printf ("%02x,", *(buffer + byte_offset + i)); -printf ("\n"); -#endif -} -END_EXTERN_C - -void S9xFixSoundAfterSnapshotLoad () -{ -} - -void S9xSetSoundControl (int) -{ -} - -#ifdef DEBUGGER -START_EXTERN_C -void S9xDeinitAPU () -{ -} - -END_EXTERN_C -#endif - diff --git a/source/tile.cpp b/source/tile.cpp index 27e61f0..7e996a9 100644 --- a/source/tile.cpp +++ b/source/tile.cpp @@ -97,7 +97,7 @@ extern uint32 HeadMask [4]; extern uint32 TailMask [5]; -uint8 ConvertTile (uint8 *pCache, uint32 TileAddr) +static uint8 ConvertTile (uint8 *pCache, uint32 TileAddr) { register uint8 *tp = &Memory.VRAM[TileAddr]; uint32 *p = (uint32 *) pCache; @@ -215,8 +215,10 @@ uint8 ConvertTile (uint8 *pCache, uint32 TileAddr) } return (non_zero ? TRUE : BLANK_TILE); } +#define PLOT_PIXEL(screen, pixel) (pixel) -inline void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels) +#ifndef FOREVER_16_BIT +static void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels) { uint8 Pixel; uint8 *Screen = GFX.S + Offset; @@ -236,7 +238,7 @@ inline void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels) { uint8 Pixel; uint8 *Screen = GFX.S + Offset; @@ -256,7 +258,7 @@ inline void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELSx2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELSx2 (uint32 Offset, uint8 *Pixels) { uint8 Pixel; uint8 *Screen = GFX.S + Offset; @@ -276,7 +278,7 @@ inline void WRITE_4PIXELSx2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) { uint8 Pixel; uint8 *Screen = GFX.S + Offset; @@ -296,7 +298,7 @@ inline void WRITE_4PIXELS_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELSx2x2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELSx2x2 (uint32 Offset, uint8 *Pixels) { uint8 Pixel; uint8 *Screen = GFX.S + Offset; @@ -318,7 +320,7 @@ inline void WRITE_4PIXELSx2x2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels) { uint8 Pixel; uint8 *Screen = GFX.S + Offset; @@ -412,14 +414,14 @@ void DrawLargePixel (uint32 Tile, uint32 Offset, register uint8 *sp = GFX.S + Offset; uint8 *Depth = GFX.DB + Offset; uint8 pixel; -#define PLOT_PIXEL(screen, pixel) (pixel) RENDER_TILE_LARGE (((uint8) GFX.ScreenColors [pixel]), PLOT_PIXEL) } +#endif -inline void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.DB + Offset; @@ -437,9 +439,9 @@ inline void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.DB + Offset; @@ -457,9 +459,9 @@ inline void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.DB + Offset; @@ -477,9 +479,9 @@ inline void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.DB + Offset; @@ -497,9 +499,9 @@ inline void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.DB + Offset; @@ -519,9 +521,9 @@ inline void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.DB + Offset; @@ -614,9 +616,9 @@ void DrawLargePixel16 (uint32 Tile, uint32 Offset, RENDER_TILE_LARGE (GFX.ScreenColors [pixel], PLOT_PIXEL) } -inline void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -646,9 +648,9 @@ inline void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -678,9 +680,9 @@ inline void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -710,9 +712,9 @@ inline void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -742,9 +744,9 @@ inline void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -774,9 +776,9 @@ inline void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -806,9 +808,9 @@ inline void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -838,9 +840,9 @@ inline void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPED_SUB1_2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPED_SUB1_2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -951,9 +953,9 @@ void DrawClippedTile16Sub1_2 (uint32 Tile, uint32 Offset, RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4) } -inline void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -977,9 +979,9 @@ inline void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -1003,9 +1005,9 @@ inline void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; @@ -1029,9 +1031,9 @@ inline void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels) #undef FN } -inline void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (uint32 Offset, uint8 *Pixels) +static void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (uint32 Offset, uint8 *Pixels) { - uint32 Pixel; + uint8 Pixel; uint16 *Screen = (uint16 *) GFX.S + Offset; uint8 *Depth = GFX.ZBuffer + Offset; uint8 *SubDepth = GFX.SubZBuffer + Offset; |