Viewing file: 20071114-1.c (2.25 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* PR tree-optimization/34046 */ /* Origin: dcb <dcb314@hotmail.com> */
typedef unsigned char bool8; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef uint8_t uint8; typedef uint16_t uint16; typedef uint32_t uint32;
struct SIAPU { uint8 *PC; uint8 *RAM; uint8 Bit; uint32 Address; uint8 *WaitAddress1; uint8 *WaitAddress2; uint8 _Carry; };
struct SAPU { bool8 ShowROM; uint8 OutPorts [4]; uint8 ExtraRAM [64]; uint16 TimerTarget [3]; };
struct SAPU APU; struct SIAPU IAPU;
void S9xSetAPUControl (uint8 byte); void S9xSetAPUDSP (uint8 byte); uint8 S9xGetAPUDSP ();
uint8 S9xAPUGetByte (uint32 Address) { Address &= 0xffff;
if (Address <= 0xff && Address >= 0xf0) { if (Address >= 0xf4 && Address <= 0xf7) { IAPU.WaitAddress2 = IAPU.WaitAddress1; IAPU.WaitAddress1 = IAPU.PC; return (IAPU.RAM [Address]); } else if (Address == 0xf3) return (S9xGetAPUDSP ());
if (Address >= 0xfd) { IAPU.WaitAddress2 = IAPU.WaitAddress1; IAPU.WaitAddress1 = IAPU.PC; uint8 t = IAPU.RAM [Address]; IAPU.RAM [Address] = 0; return (t); }
return (IAPU.RAM [Address]); } else return (IAPU.RAM [Address]); }
void S9xAPUSetByte (uint8 byte, uint32 Address) { Address &= 0xffff;
if (Address <= 0xff && Address >= 0xf0) { if (Address == 0xf3) S9xSetAPUDSP (byte); else if (Address >= 0xf4 && Address <= 0xf7) APU.OutPorts [Address - 0xf4] = byte; else if (Address == 0xf1) S9xSetAPUControl (byte); else if (Address < 0xfd) { IAPU.RAM [Address] = byte; if (Address >= 0xfa) { if (byte == 0) APU.TimerTarget [Address - 0xfa] = 0x100; else APU.TimerTarget [Address - 0xfa] = byte; } } } else { if (Address < 0xffc0) IAPU.RAM [Address] = byte; else { APU.ExtraRAM [Address - 0xffc0] = byte; if (!APU.ShowROM) IAPU.RAM [Address] = byte; } } }
void ApuCA () { IAPU.Address = *(uint16 *) (IAPU.PC + 1); IAPU.Bit = (uint8)(IAPU.Address >> 13); if ((IAPU._Carry)) S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) | (1 << IAPU.Bit), IAPU.Address); else S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) & ~(1 << IAPU.Bit), IAPU.Address); }
|