aboutsummaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJaedyn Draper2012-12-27 23:19:47 -0800
committerJaedyn Draper2012-12-27 23:19:47 -0800
commit3fff289e60df73b25c483807f5cf73c011804117 (patch)
treed8a44c6256c2a7652b028525054e0e55d756ff15 /source
parent74211924afc184870627c90ce522c4c5743761db (diff)
parentc01a2a42168695233ecc69c4a60ed918e7701fb9 (diff)
downloadsnes9x2005-3fff289e60df73b25c483807f5cf73c011804117.tar.gz
snes9x2005-3fff289e60df73b25c483807f5cf73c011804117.tar.bz2
snes9x2005-3fff289e60df73b25c483807f5cf73c011804117.zip
Merge pull request #26 from Nebuleon/master
Merge to CATSFC 1.10+
Diffstat (limited to 'source')
-rw-r--r--source/65c816.h34
-rw-r--r--source/apu.cpp12
-rw-r--r--source/apu.h15
-rw-r--r--source/apumem.h8
-rw-r--r--source/autom4te.cache/output.00
-rw-r--r--source/autom4te.cache/requests67
-rw-r--r--source/autom4te.cache/traces.00
-rw-r--r--source/cheats.cpp35
-rw-r--r--source/cheats.h40
-rw-r--r--source/cheats2.cpp37
-rw-r--r--source/cpu.cpp20
-rw-r--r--source/cpuaddr.h313
-rw-r--r--source/cpuexec.cpp18
-rw-r--r--source/cpuexec.h13
-rw-r--r--source/cpumacro.h516
-rw-r--r--source/cpuops.cpp1687
-rw-r--r--source/font/Pictochat-16.bdf2682
-rw-r--r--source/font/README.txt40
-rw-r--r--source/getset.h45
-rw-r--r--source/gfx.cpp151
-rw-r--r--source/globals.cpp17
-rw-r--r--source/memmap.cpp6
-rw-r--r--source/memmap.h9
-rw-r--r--source/nds/bdf_font.c301
-rw-r--r--source/nds/cheats3.cpp206
-rw-r--r--source/nds/draw.c63
-rw-r--r--source/nds/draw.h118
-rw-r--r--source/nds/ds2_main.c53
-rw-r--r--source/nds/ds2sound.h24
-rw-r--r--source/nds/entry.cpp76
-rw-r--r--source/nds/gcheat.c576
-rw-r--r--source/nds/gcheat.h47
-rw-r--r--source/nds/gui.c596
-rw-r--r--source/nds/gui.h76
-rw-r--r--source/nds/message.h4
-rw-r--r--source/offsets.cpp421
-rw-r--r--source/port.h4
-rw-r--r--source/ppu.cpp859
-rw-r--r--source/ppu.h298
-rw-r--r--source/sa1.cpp35
-rw-r--r--source/sa1.h30
-rw-r--r--source/sa1cpu.cpp64
-rw-r--r--source/snaporig.cpp12
-rw-r--r--source/snapshot.cpp78
-rw-r--r--source/snes9x.cpp808
-rw-r--r--source/snes9x.h2
-rw-r--r--source/sound.cpp279
-rw-r--r--source/spc.cpp133
-rw-r--r--source/spc700.cpp747
-rw-r--r--source/spc700.h32
-rw-r--r--source/spccycles.cpp110
-rw-r--r--source/spctool.cpp201
-rw-r--r--source/tile.cpp90
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;