Un-inline a bunch of stuff.

With the MIPS instruction cache, this means that two consecutive SNES CPU instructions using e.g. the same addressing style or the same opcode have a chance that the second one will use the first one's code and that it will be cached.
This commit is contained in:
Nebuleon Fumika 2012-12-18 22:53:49 -05:00
parent 286bfd5805
commit e708c127fa
10 changed files with 483 additions and 406 deletions

View File

@ -63,7 +63,8 @@ OBJECTS = $(C_OBJECTS) $(CPP_OBJECTS)
# - - - Compilation flags - - -
CFLAGS := -mips32 -Os -mno-abicalls -fno-pic -fno-builtin \
-fno-exceptions -fno-function-sections -mlong-calls \
-fomit-frame-pointer -msoft-float -G 4
-fomit-frame-pointer -msoft-float -G 4 \
-fno-inline -fno-early-inlining
DEFS := -DSPC700_C -DEXECUTE_SUPERFX_PER_LINE -DSDD1_DECOMP \
-DVAR_CYCLES -DCPU_SHUTDOWN -DSPC700_SHUTDOWN \

View File

@ -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;

View File

@ -100,19 +100,19 @@ typedef enum {
JUMP = 4
} AccessMode;
STATIC inline void Immediate8 (AccessMode a)
void Immediate8 (AccessMode a)
{
OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase;
CPU.PC++;
}
STATIC inline void Immediate16 (AccessMode a)
void Immediate16 (AccessMode a)
{
OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase;
CPU.PC += 2;
}
STATIC inline void Relative (AccessMode a)
void Relative (AccessMode a)
{
Int8 = *CPU.PC++;
#ifndef SA1_OPCODES
@ -121,7 +121,7 @@ STATIC inline void Relative (AccessMode a)
OpAddress = ((int) (CPU.PC - CPU.PCBase) + Int8) & 0xffff;
}
STATIC inline void RelativeLong (AccessMode a)
void RelativeLong (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = *(uint16 *) CPU.PC;
@ -136,7 +136,7 @@ STATIC inline void RelativeLong (AccessMode a)
OpAddress &= 0xffff;
}
STATIC inline void AbsoluteIndexedIndirect (AccessMode a)
void AbsoluteIndexedIndirect (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = (Registers.X.W + *(uint16 *) CPU.PC) & 0xffff;
@ -152,7 +152,7 @@ STATIC inline void AbsoluteIndexedIndirect (AccessMode a)
if(a&READ) OpenBus = (uint8)(OpAddress>>8);
}
STATIC inline void AbsoluteIndirectLong (AccessMode a)
void AbsoluteIndirectLong (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = *(uint16 *) CPU.PC;
@ -172,7 +172,7 @@ STATIC inline void AbsoluteIndirectLong (AccessMode a)
}
}
STATIC inline void AbsoluteIndirect (AccessMode a)
void AbsoluteIndirect (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = *(uint16 *) CPU.PC;
@ -190,7 +190,7 @@ STATIC inline void AbsoluteIndirect (AccessMode a)
OpAddress += ICPU.ShiftedPB;
}
STATIC inline void Absolute (AccessMode a)
void Absolute (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = *(uint16 *) CPU.PC + ICPU.ShiftedDB;
@ -204,7 +204,7 @@ STATIC inline void Absolute (AccessMode a)
#endif
}
STATIC inline void AbsoluteLong (AccessMode a)
void AbsoluteLong (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = (*(uint32 *) CPU.PC) & 0xffffff;
@ -218,7 +218,7 @@ STATIC inline void AbsoluteLong (AccessMode a)
#endif
}
STATIC inline void Direct(AccessMode a)
void Direct(AccessMode a)
{
if(a&READ) OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff;
@ -228,7 +228,7 @@ STATIC inline void Direct(AccessMode a)
// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE;
}
STATIC inline void DirectIndirectIndexed (AccessMode a)
void DirectIndirectIndexed (AccessMode a)
{
OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff;
@ -245,7 +245,7 @@ STATIC inline void DirectIndirectIndexed (AccessMode a)
// XXX: else Add one cycle if crosses page boundary
}
STATIC inline void DirectIndirectIndexedLong (AccessMode a)
void DirectIndirectIndexedLong (AccessMode a)
{
OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff;
@ -261,7 +261,7 @@ STATIC inline void DirectIndirectIndexedLong (AccessMode a)
// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE;
}
STATIC inline void DirectIndexedIndirect(AccessMode a)
void DirectIndexedIndirect(AccessMode a)
{
OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.D.W + Registers.X.W) & 0xffff;
@ -281,7 +281,7 @@ STATIC inline void DirectIndexedIndirect(AccessMode a)
#endif
}
STATIC inline void DirectIndexedX (AccessMode a)
void DirectIndexedX (AccessMode a)
{
if(a&READ) OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.D.W + Registers.X.W);
@ -299,7 +299,7 @@ STATIC inline void DirectIndexedX (AccessMode a)
#endif
}
STATIC inline void DirectIndexedY (AccessMode a)
void DirectIndexedY (AccessMode a)
{
if(a&READ) OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.D.W + Registers.Y.W);
@ -316,7 +316,7 @@ STATIC inline void DirectIndexedY (AccessMode a)
#endif
}
STATIC inline void AbsoluteIndexedX (AccessMode a)
void AbsoluteIndexedX (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = ICPU.ShiftedDB + *(uint16 *) CPU.PC + Registers.X.W;
@ -333,7 +333,7 @@ STATIC inline void AbsoluteIndexedX (AccessMode a)
// XXX: else is cross page boundary add one cycle
}
STATIC inline void AbsoluteIndexedY (AccessMode a)
void AbsoluteIndexedY (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = ICPU.ShiftedDB + *(uint16 *) CPU.PC + Registers.Y.W;
@ -350,7 +350,7 @@ STATIC inline void AbsoluteIndexedY (AccessMode a)
// XXX: else is cross page boundary add one cycle
}
STATIC inline void AbsoluteLongIndexedX (AccessMode a)
void AbsoluteLongIndexedX (AccessMode a)
{
#ifdef FAST_LSB_WORD_ACCESS
OpAddress = (*(uint32 *) CPU.PC + Registers.X.W) & 0xffffff;
@ -364,7 +364,7 @@ STATIC inline void AbsoluteLongIndexedX (AccessMode a)
#endif
}
STATIC inline void DirectIndirect (AccessMode a)
void DirectIndirect (AccessMode a)
{
OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff;
@ -378,7 +378,7 @@ STATIC inline void DirectIndirect (AccessMode a)
// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE;
}
STATIC inline void DirectIndirectLong (AccessMode a)
void DirectIndirectLong (AccessMode a)
{
OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff;
@ -393,7 +393,7 @@ STATIC inline void DirectIndirectLong (AccessMode a)
// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE;
}
STATIC inline void StackRelative (AccessMode a)
void StackRelative (AccessMode a)
{
if(a&READ) OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.S.W) & 0xffff;
@ -403,7 +403,7 @@ STATIC inline void StackRelative (AccessMode a)
#endif
}
STATIC inline void StackRelativeIndirectIndexed (AccessMode a)
void StackRelativeIndirectIndexed (AccessMode a)
{
OpenBus = *CPU.PC;
OpAddress = (*CPU.PC++ + Registers.S.W) & 0xffff;

View File

@ -90,19 +90,19 @@
#ifndef _CPUMACRO_H_
#define _CPUMACRO_H_
STATIC inline void SetZN16 (uint16 Work)
void SetZN16 (uint16 Work)
{
ICPU._Zero = Work != 0;
ICPU._Negative = (uint8) (Work >> 8);
}
STATIC inline void SetZN8 (uint8 Work)
void SetZN8 (uint8 Work)
{
ICPU._Zero = Work;
ICPU._Negative = Work;
}
STATIC inline void ADC8 ()
void ADC8 ()
{
Work8 = S9xGetByte (OpAddress);
@ -159,7 +159,7 @@ STATIC inline void ADC8 ()
}
}
STATIC inline void ADC16 ()
void ADC16 ()
{
Work16 = S9xGetWord (OpAddress);
@ -235,19 +235,19 @@ STATIC inline void ADC16 ()
}
}
STATIC inline void AND16 ()
void AND16 ()
{
Registers.A.W &= S9xGetWord (OpAddress);
SetZN16 (Registers.A.W);
}
STATIC inline void AND8 ()
void AND8 ()
{
Registers.AL &= S9xGetByte (OpAddress);
SetZN8 (Registers.AL);
}
STATIC inline void A_ASL16 ()
void A_ASL16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -257,7 +257,7 @@ STATIC inline void A_ASL16 ()
SetZN16 (Registers.A.W);
}
STATIC inline void A_ASL8 ()
void A_ASL8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -267,7 +267,7 @@ STATIC inline void A_ASL8 ()
SetZN8 (Registers.AL);
}
STATIC inline void ASL16 ()
void ASL16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -281,7 +281,7 @@ STATIC inline void ASL16 ()
SetZN16 (Work16);
}
STATIC inline void ASL8 ()
void ASL8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -293,7 +293,7 @@ STATIC inline void ASL8 ()
SetZN8 (Work8);
}
STATIC inline void BIT16 ()
void BIT16 ()
{
Work16 = S9xGetWord (OpAddress);
ICPU._Overflow = (Work16 & 0x4000) != 0;
@ -301,7 +301,7 @@ STATIC inline void BIT16 ()
ICPU._Zero = (Work16 & Registers.A.W) != 0;
}
STATIC inline void BIT8 ()
void BIT8 ()
{
Work8 = S9xGetByte (OpAddress);
ICPU._Overflow = (Work8 & 0x40) != 0;
@ -309,7 +309,7 @@ STATIC inline void BIT8 ()
ICPU._Zero = Work8 & Registers.AL;
}
STATIC inline void CMP16 ()
void CMP16 ()
{
Int32 = (long) Registers.A.W -
(long) S9xGetWord (OpAddress);
@ -317,7 +317,7 @@ STATIC inline void CMP16 ()
SetZN16 ((uint16) Int32);
}
STATIC inline void CMP8 ()
void CMP8 ()
{
Int16 = (short) Registers.AL -
(short) S9xGetByte (OpAddress);
@ -325,7 +325,7 @@ STATIC inline void CMP8 ()
SetZN8 ((uint8) Int16);
}
STATIC inline void CMX16 ()
void CMX16 ()
{
Int32 = (long) Registers.X.W -
(long) S9xGetWord (OpAddress);
@ -333,7 +333,7 @@ STATIC inline void CMX16 ()
SetZN16 ((uint16) Int32);
}
STATIC inline void CMX8 ()
void CMX8 ()
{
Int16 = (short) Registers.XL -
(short) S9xGetByte (OpAddress);
@ -341,7 +341,7 @@ STATIC inline void CMX8 ()
SetZN8 ((uint8) Int16);
}
STATIC inline void CMY16 ()
void CMY16 ()
{
Int32 = (long) Registers.Y.W -
(long) S9xGetWord (OpAddress);
@ -349,7 +349,7 @@ STATIC inline void CMY16 ()
SetZN16 ((uint16) Int32);
}
STATIC inline void CMY8 ()
void CMY8 ()
{
Int16 = (short) Registers.YL -
(short) S9xGetByte (OpAddress);
@ -357,7 +357,7 @@ STATIC inline void CMY8 ()
SetZN8 ((uint8) Int16);
}
STATIC inline void A_DEC16 ()
void A_DEC16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -370,7 +370,7 @@ STATIC inline void A_DEC16 ()
SetZN16 (Registers.A.W);
}
STATIC inline void A_DEC8 ()
void A_DEC8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -383,7 +383,7 @@ STATIC inline void A_DEC8 ()
SetZN8 (Registers.AL);
}
STATIC inline void DEC16 ()
void DEC16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -399,7 +399,7 @@ STATIC inline void DEC16 ()
SetZN16 (Work16);
}
STATIC inline void DEC8 ()
void DEC8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -413,19 +413,19 @@ STATIC inline void DEC8 ()
SetZN8 (Work8);
}
STATIC inline void EOR16 ()
void EOR16 ()
{
Registers.A.W ^= S9xGetWord (OpAddress);
SetZN16 (Registers.A.W);
}
STATIC inline void EOR8 ()
void EOR8 ()
{
Registers.AL ^= S9xGetByte (OpAddress);
SetZN8 (Registers.AL);
}
STATIC inline void A_INC16 ()
void A_INC16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -438,7 +438,7 @@ STATIC inline void A_INC16 ()
SetZN16 (Registers.A.W);
}
STATIC inline void A_INC8 ()
void A_INC8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -451,7 +451,7 @@ STATIC inline void A_INC8 ()
SetZN8 (Registers.AL);
}
STATIC inline void INC16 ()
void INC16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -467,7 +467,7 @@ STATIC inline void INC16 ()
SetZN16 (Work16);
}
STATIC inline void INC8 ()
void INC8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -481,43 +481,43 @@ STATIC inline void INC8 ()
SetZN8 (Work8);
}
STATIC inline void LDA16 ()
void LDA16 ()
{
Registers.A.W = S9xGetWord (OpAddress);
SetZN16 (Registers.A.W);
}
STATIC inline void LDA8 ()
void LDA8 ()
{
Registers.AL = S9xGetByte (OpAddress);
SetZN8 (Registers.AL);
}
STATIC inline void LDX16 ()
void LDX16 ()
{
Registers.X.W = S9xGetWord (OpAddress);
SetZN16 (Registers.X.W);
}
STATIC inline void LDX8 ()
void LDX8 ()
{
Registers.XL = S9xGetByte (OpAddress);
SetZN8 (Registers.XL);
}
STATIC inline void LDY16 ()
void LDY16 ()
{
Registers.Y.W = S9xGetWord (OpAddress);
SetZN16 (Registers.Y.W);
}
STATIC inline void LDY8 ()
void LDY8 ()
{
Registers.YL = S9xGetByte (OpAddress);
SetZN8 (Registers.YL);
}
STATIC inline void A_LSR16 ()
void A_LSR16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -527,7 +527,7 @@ STATIC inline void A_LSR16 ()
SetZN16 (Registers.A.W);
}
STATIC inline void A_LSR8 ()
void A_LSR8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -537,7 +537,7 @@ STATIC inline void A_LSR8 ()
SetZN8 (Registers.AL);
}
STATIC inline void LSR16 ()
void LSR16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -551,7 +551,7 @@ STATIC inline void LSR16 ()
SetZN16 (Work16);
}
STATIC inline void LSR8 ()
void LSR8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -563,19 +563,19 @@ STATIC inline void LSR8 ()
SetZN8 (Work8);
}
STATIC inline void ORA16 ()
void ORA16 ()
{
Registers.A.W |= S9xGetWord (OpAddress);
SetZN16 (Registers.A.W);
}
STATIC inline void ORA8 ()
void ORA8 ()
{
Registers.AL |= S9xGetByte (OpAddress);
SetZN8 (Registers.AL);
}
STATIC inline void A_ROL16 ()
void A_ROL16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -586,7 +586,7 @@ STATIC inline void A_ROL16 ()
SetZN16 ((uint16) Work32);
}
STATIC inline void A_ROL8 ()
void A_ROL8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -599,7 +599,7 @@ STATIC inline void A_ROL8 ()
SetZN8 ((uint8) Work16);
}
STATIC inline void ROL16 ()
void ROL16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -614,7 +614,7 @@ STATIC inline void ROL16 ()
SetZN16 ((uint16) Work32);
}
STATIC inline void ROL8 ()
void ROL8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -627,7 +627,7 @@ STATIC inline void ROL8 ()
SetZN8 ((uint8) Work16);
}
STATIC inline void A_ROR16 ()
void A_ROR16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -640,7 +640,7 @@ STATIC inline void A_ROR16 ()
SetZN16 ((uint16) Work32);
}
STATIC inline void A_ROR8 ()
void A_ROR8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -652,7 +652,7 @@ STATIC inline void A_ROR8 ()
SetZN8 ((uint8) Work16);
}
STATIC inline void ROR16 ()
void ROR16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -667,7 +667,7 @@ STATIC inline void ROR16 ()
SetZN16 ((uint16) Work32);
}
STATIC inline void ROR8 ()
void ROR8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -680,7 +680,7 @@ STATIC inline void ROR8 ()
SetZN8 ((uint8) Work16);
}
STATIC inline void SBC16 ()
void SBC16 ()
{
Work16 = S9xGetWord (OpAddress);
@ -750,7 +750,7 @@ STATIC inline void SBC16 ()
}
}
STATIC inline void SBC8 ()
void SBC8 ()
{
Work8 = S9xGetByte (OpAddress);
if (CheckDecimal ())
@ -801,47 +801,47 @@ STATIC inline void SBC8 ()
}
}
STATIC inline void STA16 ()
void STA16 ()
{
S9xSetWord (Registers.A.W, OpAddress);
}
STATIC inline void STA8 ()
void STA8 ()
{
S9xSetByte (Registers.AL, OpAddress);
}
STATIC inline void STX16 ()
void STX16 ()
{
S9xSetWord (Registers.X.W, OpAddress);
}
STATIC inline void STX8 ()
void STX8 ()
{
S9xSetByte (Registers.XL, OpAddress);
}
STATIC inline void STY16 ()
void STY16 ()
{
S9xSetWord (Registers.Y.W, OpAddress);
}
STATIC inline void STY8 ()
void STY8 ()
{
S9xSetByte (Registers.YL, OpAddress);
}
STATIC inline void STZ16 ()
void STZ16 ()
{
S9xSetWord (0, OpAddress);
}
STATIC inline void STZ8 ()
void STZ8 ()
{
S9xSetByte (0, OpAddress);
}
STATIC inline void TSB16 ()
void TSB16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -854,7 +854,7 @@ STATIC inline void TSB16 ()
S9xSetByte (Work16&0xFF, OpAddress);
}
STATIC inline void TSB8 ()
void TSB8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -865,7 +865,7 @@ STATIC inline void TSB8 ()
S9xSetByte (Work8, OpAddress);
}
STATIC inline void TRB16 ()
void TRB16 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;
@ -878,7 +878,7 @@ STATIC inline void TRB16 ()
S9xSetByte (Work16&0xFF, OpAddress);
}
STATIC inline void TRB8 ()
void TRB8 ()
{
#ifndef SA1_OPCODES
CPU.Cycles += ONE_CYCLE;

View File

@ -103,7 +103,7 @@ extern "C"
extern uint8 OpenBus;
}
INLINE uint8 S9xGetByte (uint32 Address)
uint8 S9xGetByte (uint32 Address)
{
int block;
uint8 *GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK];
@ -197,7 +197,7 @@ INLINE uint8 S9xGetByte (uint32 Address)
}
}
INLINE uint16 S9xGetWord (uint32 Address)
uint16 S9xGetWord (uint32 Address)
{
if ((Address & 0x0fff) == 0x0fff)
{
@ -320,7 +320,7 @@ INLINE uint16 S9xGetWord (uint32 Address)
}
}
INLINE void S9xSetByte (uint8 Byte, uint32 Address)
void S9xSetByte (uint8 Byte, uint32 Address)
{
#if defined(CPU_SHUTDOWN)
CPU.WaitAddress = NULL;
@ -436,7 +436,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 +594,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 +660,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 +714,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];

View File

@ -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,10 +395,11 @@ 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 ()
{
// memset? Really? We could just memcpy after the first allocation... [Neb]
RAM = (uint8 *) malloc (0x20000);
SRAM = (uint8 *) malloc (0x20000);
VRAM = (uint8 *) malloc (0x10000);
@ -1213,7 +1214,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++)
{

View File

@ -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;
@ -3297,3 +3297,286 @@ printf ("%06x: %d\n", t, FxEmulate (2000000));
}
#endif
// Register reads and writes...
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);
}
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))
{
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;
}
void REGISTER_2180(uint8 Byte)
{
Memory.RAM[PPU.WRAM++] = Byte;
PPU.WRAM &= 0x1FFFF;
Memory.FillRAM [0x2180] = Byte;
}

View File

@ -342,288 +342,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&);

View File

@ -134,6 +134,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

View File

@ -216,7 +216,7 @@ uint8 ConvertTile (uint8 *pCache, uint32 TileAddr)
return (non_zero ? TRUE : BLANK_TILE);
}
inline void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels)
{
uint8 Pixel;
uint8 *Screen = GFX.S + Offset;
@ -236,7 +236,7 @@ inline void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels)
{
uint8 Pixel;
uint8 *Screen = GFX.S + Offset;
@ -256,7 +256,7 @@ inline void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELSx2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELSx2 (uint32 Offset, uint8 *Pixels)
{
uint8 Pixel;
uint8 *Screen = GFX.S + Offset;
@ -276,7 +276,7 @@ inline void WRITE_4PIXELSx2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS_FLIPPEDx2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS_FLIPPEDx2 (uint32 Offset, uint8 *Pixels)
{
uint8 Pixel;
uint8 *Screen = GFX.S + Offset;
@ -296,7 +296,7 @@ inline void WRITE_4PIXELS_FLIPPEDx2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELSx2x2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELSx2x2 (uint32 Offset, uint8 *Pixels)
{
uint8 Pixel;
uint8 *Screen = GFX.S + Offset;
@ -318,7 +318,7 @@ inline void WRITE_4PIXELSx2x2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels)
{
uint8 Pixel;
uint8 *Screen = GFX.S + Offset;
@ -417,7 +417,7 @@ void DrawLargePixel (uint32 Tile, uint32 Offset,
RENDER_TILE_LARGE (((uint8) GFX.ScreenColors [pixel]), PLOT_PIXEL)
}
inline void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -437,7 +437,7 @@ inline void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -457,7 +457,7 @@ inline void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -477,7 +477,7 @@ inline void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -497,7 +497,7 @@ inline void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -519,7 +519,7 @@ inline void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -614,7 +614,7 @@ void DrawLargePixel16 (uint32 Tile, uint32 Offset,
RENDER_TILE_LARGE (GFX.ScreenColors [pixel], PLOT_PIXEL)
}
inline void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -646,7 +646,7 @@ inline void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -678,7 +678,7 @@ inline void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -710,7 +710,7 @@ inline void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -742,7 +742,7 @@ inline void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -774,7 +774,7 @@ inline void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -806,7 +806,7 @@ inline void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -838,7 +838,7 @@ inline void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPED_SUB1_2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPED_SUB1_2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -951,7 +951,7 @@ 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)
void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -977,7 +977,7 @@ inline void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -1003,7 +1003,7 @@ inline void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;
@ -1029,7 +1029,7 @@ inline void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels)
#undef FN
}
inline void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (uint32 Offset, uint8 *Pixels)
void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (uint32 Offset, uint8 *Pixels)
{
uint32 Pixel;
uint16 *Screen = (uint16 *) GFX.S + Offset;