diff options
Diffstat (limited to 'gearboy/src/Processor.h')
| -rw-r--r-- | gearboy/src/Processor.h | 691 |
1 files changed, 691 insertions, 0 deletions
diff --git a/gearboy/src/Processor.h b/gearboy/src/Processor.h new file mode 100644 index 00000000..4525d5d0 --- /dev/null +++ b/gearboy/src/Processor.h @@ -0,0 +1,691 @@ +/* + * Gearboy - Nintendo Game Boy Emulator + * Copyright (C) 2012 Ignacio Sanchez + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * 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, see http://www.gnu.org/licenses/ + * + */ + +#ifndef PROCESSOR_H +#define PROCESSOR_H + +#include <list> +#include "definitions.h" +#include "SixteenBitRegister.h" + +class Memory; + +class Processor +{ +public: + enum Interrupts + { + None_Interrupt = 0x00, + VBlank_Interrupt = 0x01, + LCDSTAT_Interrupt = 0x02, + Timer_Interrupt = 0x04, + Serial_Interrupt = 0x08, + Joypad_Interrupt = 0x10 + }; + + struct ProcessorState + { + SixteenBitRegister* AF; + SixteenBitRegister* BC; + SixteenBitRegister* DE; + SixteenBitRegister* HL; + SixteenBitRegister* SP; + SixteenBitRegister* PC; + bool* IME; + bool* Halt; + }; + +public: + Processor(Memory* pMemory); + ~Processor(); + void Init(); + void Reset(bool bCGB, bool bGBA); + u8 RunFor(u8 ticks); + void RequestInterrupt(Interrupts interrupt); + void ResetTIMACycles(); + void ResetDIVCycles(); + bool Halted() const; + bool DuringOpCode() const; + bool CGBSpeed() const; + void AddCycles(unsigned int cycles); + bool InterruptIsAboutToRaise(); + void SaveState(std::ostream& stream); + void LoadState(std::istream& stream); + void SetGameSharkCheat(const char* szCheat); + void ClearGameSharkCheats(); + ProcessorState* GetState(); + bool Disassemble(u16 address); + bool BreakpointHit(); + void RequestMemoryBreakpoint(); + void UpdateTimers(u8 ticks); + void UpdateSerial(u8 ticks); + +private: + typedef void (Processor::*OPCptr) (void); + OPCptr m_OPCodes[256]; + OPCptr m_OPCodesCB[256]; + Memory* m_pMemory; + SixteenBitRegister AF; + SixteenBitRegister BC; + SixteenBitRegister DE; + SixteenBitRegister HL; + SixteenBitRegister SP; + SixteenBitRegister PC; + bool m_bIME; + bool m_bHalt; + bool m_bBranchTaken; + bool m_bSkipPCBug; + unsigned int m_iCurrentClockCycles; + unsigned int m_iDIVCycles; + unsigned int m_iTIMACycles; + int m_iSerialBit; + int m_iSerialCycles; + int m_iIMECycles; + int m_iUnhaltCycles; + bool m_bCGB; + int m_iInterruptDelayCycles; + bool m_bCGBSpeed; + int m_iSpeedMultiplier; + int m_iAccurateOPCodeState; + u8 m_iReadCache; + bool m_bBreakpointHit; + bool m_bRequestMemBreakpoint; + + struct GameSharkCode + { + u8 type; + u16 address; + u8 value; + }; + std::list<GameSharkCode> m_GameSharkList; + + ProcessorState m_ProcessorState; + +private: + Processor::Interrupts InterruptPending(); + void ServeInterrupt(Interrupts interrupt); + void UpdateGameShark(); + void ClearAllFlags(); + void ToggleZeroFlagFromResult(u8 result); + void SetFlag(u8 flag); + void FlipFlag(u8 flag); + void ToggleFlag(u8 flag); + void UntoggleFlag(u8 flag); + bool IsSetFlag(u8 flag); + void StackPush(SixteenBitRegister* reg); + void StackPop(SixteenBitRegister* reg); + int AdjustedCycles(int cycles); + void InvalidOPCode(); + void OPCodes_LD(u8* reg1, u8 reg2); + void OPCodes_LD(u8* reg, u16 address); + void OPCodes_LD(u16 address, u8 reg); + void OPCodes_OR(u8 number); + void OPCodes_XOR(u8 number); + void OPCodes_AND(u8 number); + void OPCodes_CP(u8 number); + void OPCodes_INC(u8* reg); + void OPCodes_INC_HL(); + void OPCodes_DEC(u8* reg); + void OPCodes_DEC_HL(); + void OPCodes_ADD(u8 number); + void OPCodes_ADC(u8 number); + void OPCodes_SUB(u8 number); + void OPCodes_SBC(u8 number); + void OPCodes_ADD_HL(u16 number); + void OPCodes_ADD_SP(s8 number); + void OPCodes_SWAP_Register(u8* reg); + void OPCodes_SWAP_HL(); + void OPCodes_SLA(u8* reg); + void OPCodes_SLA_HL(); + void OPCodes_SRA(u8* reg); + void OPCodes_SRA_HL(); + void OPCodes_SRL(u8* reg); + void OPCodes_SRL_HL(); + void OPCodes_RLC(u8* reg, bool isRegisterA = false); + void OPCodes_RLC_HL(); + void OPCodes_RL(u8* reg, bool isRegisterA = false); + void OPCodes_RL_HL(); + void OPCodes_RRC(u8* reg, bool isRegisterA = false); + void OPCodes_RRC_HL(); + void OPCodes_RR(u8* reg, bool isRegisterA = false); + void OPCodes_RR_HL(); + void OPCodes_BIT(u8* reg, int bit); + void OPCodes_BIT_HL(int bit); + void OPCodes_SET(u8* reg, int bit); + void OPCodes_SET_HL(int bit); + void OPCodes_RES(u8* reg, int bit); + void OPCodes_RES_HL(int bit); + void InitOPCodeFunctors(); + void OPCode0x00(); + void OPCode0x01(); + void OPCode0x02(); + void OPCode0x03(); + void OPCode0x04(); + void OPCode0x05(); + void OPCode0x06(); + void OPCode0x07(); + void OPCode0x08(); + void OPCode0x09(); + void OPCode0x0A(); + void OPCode0x0B(); + void OPCode0x0C(); + void OPCode0x0D(); + void OPCode0x0E(); + void OPCode0x0F(); + void OPCode0x10(); + void OPCode0x11(); + void OPCode0x12(); + void OPCode0x13(); + void OPCode0x14(); + void OPCode0x15(); + void OPCode0x16(); + void OPCode0x17(); + void OPCode0x18(); + void OPCode0x19(); + void OPCode0x1A(); + void OPCode0x1B(); + void OPCode0x1C(); + void OPCode0x1D(); + void OPCode0x1E(); + void OPCode0x1F(); + void OPCode0x20(); + void OPCode0x21(); + void OPCode0x22(); + void OPCode0x23(); + void OPCode0x24(); + void OPCode0x25(); + void OPCode0x26(); + void OPCode0x27(); + void OPCode0x28(); + void OPCode0x29(); + void OPCode0x2A(); + void OPCode0x2B(); + void OPCode0x2C(); + void OPCode0x2D(); + void OPCode0x2E(); + void OPCode0x2F(); + void OPCode0x30(); + void OPCode0x31(); + void OPCode0x32(); + void OPCode0x33(); + void OPCode0x34(); + void OPCode0x35(); + void OPCode0x36(); + void OPCode0x37(); + void OPCode0x38(); + void OPCode0x39(); + void OPCode0x3A(); + void OPCode0x3B(); + void OPCode0x3C(); + void OPCode0x3D(); + void OPCode0x3E(); + void OPCode0x3F(); + void OPCode0x40(); + void OPCode0x41(); + void OPCode0x42(); + void OPCode0x43(); + void OPCode0x44(); + void OPCode0x45(); + void OPCode0x46(); + void OPCode0x47(); + void OPCode0x48(); + void OPCode0x49(); + void OPCode0x4A(); + void OPCode0x4B(); + void OPCode0x4C(); + void OPCode0x4D(); + void OPCode0x4E(); + void OPCode0x4F(); + void OPCode0x50(); + void OPCode0x51(); + void OPCode0x52(); + void OPCode0x53(); + void OPCode0x54(); + void OPCode0x55(); + void OPCode0x56(); + void OPCode0x57(); + void OPCode0x58(); + void OPCode0x59(); + void OPCode0x5A(); + void OPCode0x5B(); + void OPCode0x5C(); + void OPCode0x5D(); + void OPCode0x5E(); + void OPCode0x5F(); + void OPCode0x60(); + void OPCode0x61(); + void OPCode0x62(); + void OPCode0x63(); + void OPCode0x64(); + void OPCode0x65(); + void OPCode0x66(); + void OPCode0x67(); + void OPCode0x68(); + void OPCode0x69(); + void OPCode0x6A(); + void OPCode0x6B(); + void OPCode0x6C(); + void OPCode0x6D(); + void OPCode0x6E(); + void OPCode0x6F(); + void OPCode0x70(); + void OPCode0x71(); + void OPCode0x72(); + void OPCode0x73(); + void OPCode0x74(); + void OPCode0x75(); + void OPCode0x76(); + void OPCode0x77(); + void OPCode0x78(); + void OPCode0x79(); + void OPCode0x7A(); + void OPCode0x7B(); + void OPCode0x7C(); + void OPCode0x7D(); + void OPCode0x7E(); + void OPCode0x7F(); + void OPCode0x80(); + void OPCode0x81(); + void OPCode0x82(); + void OPCode0x83(); + void OPCode0x84(); + void OPCode0x85(); + void OPCode0x86(); + void OPCode0x87(); + void OPCode0x88(); + void OPCode0x89(); + void OPCode0x8A(); + void OPCode0x8B(); + void OPCode0x8C(); + void OPCode0x8D(); + void OPCode0x8E(); + void OPCode0x8F(); + void OPCode0x90(); + void OPCode0x91(); + void OPCode0x92(); + void OPCode0x93(); + void OPCode0x94(); + void OPCode0x95(); + void OPCode0x96(); + void OPCode0x97(); + void OPCode0x98(); + void OPCode0x99(); + void OPCode0x9A(); + void OPCode0x9B(); + void OPCode0x9C(); + void OPCode0x9D(); + void OPCode0x9E(); + void OPCode0x9F(); + void OPCode0xA0(); + void OPCode0xA1(); + void OPCode0xA2(); + void OPCode0xA3(); + void OPCode0xA4(); + void OPCode0xA5(); + void OPCode0xA6(); + void OPCode0xA7(); + void OPCode0xA8(); + void OPCode0xA9(); + void OPCode0xAA(); + void OPCode0xAB(); + void OPCode0xAC(); + void OPCode0xAD(); + void OPCode0xAE(); + void OPCode0xAF(); + void OPCode0xB0(); + void OPCode0xB1(); + void OPCode0xB2(); + void OPCode0xB3(); + void OPCode0xB4(); + void OPCode0xB5(); + void OPCode0xB6(); + void OPCode0xB7(); + void OPCode0xB8(); + void OPCode0xB9(); + void OPCode0xBA(); + void OPCode0xBB(); + void OPCode0xBC(); + void OPCode0xBD(); + void OPCode0xBE(); + void OPCode0xBF(); + void OPCode0xC0(); + void OPCode0xC1(); + void OPCode0xC2(); + void OPCode0xC3(); + void OPCode0xC4(); + void OPCode0xC5(); + void OPCode0xC6(); + void OPCode0xC7(); + void OPCode0xC8(); + void OPCode0xC9(); + void OPCode0xCA(); + void OPCode0xCB(); + void OPCode0xCC(); + void OPCode0xCD(); + void OPCode0xCE(); + void OPCode0xCF(); + void OPCode0xD0(); + void OPCode0xD1(); + void OPCode0xD2(); + void OPCode0xD3(); + void OPCode0xD4(); + void OPCode0xD5(); + void OPCode0xD6(); + void OPCode0xD7(); + void OPCode0xD8(); + void OPCode0xD9(); + void OPCode0xDA(); + void OPCode0xDB(); + void OPCode0xDC(); + void OPCode0xDD(); + void OPCode0xDE(); + void OPCode0xDF(); + void OPCode0xE0(); + void OPCode0xE1(); + void OPCode0xE2(); + void OPCode0xE3(); + void OPCode0xE4(); + void OPCode0xE5(); + void OPCode0xE6(); + void OPCode0xE7(); + void OPCode0xE8(); + void OPCode0xE9(); + void OPCode0xEA(); + void OPCode0xEB(); + void OPCode0xEC(); + void OPCode0xED(); + void OPCode0xEE(); + void OPCode0xEF(); + void OPCode0xF0(); + void OPCode0xF1(); + void OPCode0xF2(); + void OPCode0xF3(); + void OPCode0xF4(); + void OPCode0xF5(); + void OPCode0xF6(); + void OPCode0xF7(); + void OPCode0xF8(); + void OPCode0xF9(); + void OPCode0xFA(); + void OPCode0xFB(); + void OPCode0xFC(); + void OPCode0xFD(); + void OPCode0xFE(); + void OPCode0xFF(); + void OPCodeCB0x00(); + void OPCodeCB0x01(); + void OPCodeCB0x02(); + void OPCodeCB0x03(); + void OPCodeCB0x04(); + void OPCodeCB0x05(); + void OPCodeCB0x06(); + void OPCodeCB0x07(); + void OPCodeCB0x08(); + void OPCodeCB0x09(); + void OPCodeCB0x0A(); + void OPCodeCB0x0B(); + void OPCodeCB0x0C(); + void OPCodeCB0x0D(); + void OPCodeCB0x0E(); + void OPCodeCB0x0F(); + void OPCodeCB0x10(); + void OPCodeCB0x11(); + void OPCodeCB0x12(); + void OPCodeCB0x13(); + void OPCodeCB0x14(); + void OPCodeCB0x15(); + void OPCodeCB0x16(); + void OPCodeCB0x17(); + void OPCodeCB0x18(); + void OPCodeCB0x19(); + void OPCodeCB0x1A(); + void OPCodeCB0x1B(); + void OPCodeCB0x1C(); + void OPCodeCB0x1D(); + void OPCodeCB0x1E(); + void OPCodeCB0x1F(); + void OPCodeCB0x20(); + void OPCodeCB0x21(); + void OPCodeCB0x22(); + void OPCodeCB0x23(); + void OPCodeCB0x24(); + void OPCodeCB0x25(); + void OPCodeCB0x26(); + void OPCodeCB0x27(); + void OPCodeCB0x28(); + void OPCodeCB0x29(); + void OPCodeCB0x2A(); + void OPCodeCB0x2B(); + void OPCodeCB0x2C(); + void OPCodeCB0x2D(); + void OPCodeCB0x2E(); + void OPCodeCB0x2F(); + void OPCodeCB0x30(); + void OPCodeCB0x31(); + void OPCodeCB0x32(); + void OPCodeCB0x33(); + void OPCodeCB0x34(); + void OPCodeCB0x35(); + void OPCodeCB0x36(); + void OPCodeCB0x37(); + void OPCodeCB0x38(); + void OPCodeCB0x39(); + void OPCodeCB0x3A(); + void OPCodeCB0x3B(); + void OPCodeCB0x3C(); + void OPCodeCB0x3D(); + void OPCodeCB0x3E(); + void OPCodeCB0x3F(); + void OPCodeCB0x40(); + void OPCodeCB0x41(); + void OPCodeCB0x42(); + void OPCodeCB0x43(); + void OPCodeCB0x44(); + void OPCodeCB0x45(); + void OPCodeCB0x46(); + void OPCodeCB0x47(); + void OPCodeCB0x48(); + void OPCodeCB0x49(); + void OPCodeCB0x4A(); + void OPCodeCB0x4B(); + void OPCodeCB0x4C(); + void OPCodeCB0x4D(); + void OPCodeCB0x4E(); + void OPCodeCB0x4F(); + void OPCodeCB0x50(); + void OPCodeCB0x51(); + void OPCodeCB0x52(); + void OPCodeCB0x53(); + void OPCodeCB0x54(); + void OPCodeCB0x55(); + void OPCodeCB0x56(); + void OPCodeCB0x57(); + void OPCodeCB0x58(); + void OPCodeCB0x59(); + void OPCodeCB0x5A(); + void OPCodeCB0x5B(); + void OPCodeCB0x5C(); + void OPCodeCB0x5D(); + void OPCodeCB0x5E(); + void OPCodeCB0x5F(); + void OPCodeCB0x60(); + void OPCodeCB0x61(); + void OPCodeCB0x62(); + void OPCodeCB0x63(); + void OPCodeCB0x64(); + void OPCodeCB0x65(); + void OPCodeCB0x66(); + void OPCodeCB0x67(); + void OPCodeCB0x68(); + void OPCodeCB0x69(); + void OPCodeCB0x6A(); + void OPCodeCB0x6B(); + void OPCodeCB0x6C(); + void OPCodeCB0x6D(); + void OPCodeCB0x6E(); + void OPCodeCB0x6F(); + void OPCodeCB0x70(); + void OPCodeCB0x71(); + void OPCodeCB0x72(); + void OPCodeCB0x73(); + void OPCodeCB0x74(); + void OPCodeCB0x75(); + void OPCodeCB0x76(); + void OPCodeCB0x77(); + void OPCodeCB0x78(); + void OPCodeCB0x79(); + void OPCodeCB0x7A(); + void OPCodeCB0x7B(); + void OPCodeCB0x7C(); + void OPCodeCB0x7D(); + void OPCodeCB0x7E(); + void OPCodeCB0x7F(); + void OPCodeCB0x80(); + void OPCodeCB0x81(); + void OPCodeCB0x82(); + void OPCodeCB0x83(); + void OPCodeCB0x84(); + void OPCodeCB0x85(); + void OPCodeCB0x86(); + void OPCodeCB0x87(); + void OPCodeCB0x88(); + void OPCodeCB0x89(); + void OPCodeCB0x8A(); + void OPCodeCB0x8B(); + void OPCodeCB0x8C(); + void OPCodeCB0x8D(); + void OPCodeCB0x8E(); + void OPCodeCB0x8F(); + void OPCodeCB0x90(); + void OPCodeCB0x91(); + void OPCodeCB0x92(); + void OPCodeCB0x93(); + void OPCodeCB0x94(); + void OPCodeCB0x95(); + void OPCodeCB0x96(); + void OPCodeCB0x97(); + void OPCodeCB0x98(); + void OPCodeCB0x99(); + void OPCodeCB0x9A(); + void OPCodeCB0x9B(); + void OPCodeCB0x9C(); + void OPCodeCB0x9D(); + void OPCodeCB0x9E(); + void OPCodeCB0x9F(); + void OPCodeCB0xA0(); + void OPCodeCB0xA1(); + void OPCodeCB0xA2(); + void OPCodeCB0xA3(); + void OPCodeCB0xA4(); + void OPCodeCB0xA5(); + void OPCodeCB0xA6(); + void OPCodeCB0xA7(); + void OPCodeCB0xA8(); + void OPCodeCB0xA9(); + void OPCodeCB0xAA(); + void OPCodeCB0xAB(); + void OPCodeCB0xAC(); + void OPCodeCB0xAD(); + void OPCodeCB0xAE(); + void OPCodeCB0xAF(); + void OPCodeCB0xB0(); + void OPCodeCB0xB1(); + void OPCodeCB0xB2(); + void OPCodeCB0xB3(); + void OPCodeCB0xB4(); + void OPCodeCB0xB5(); + void OPCodeCB0xB6(); + void OPCodeCB0xB7(); + void OPCodeCB0xB8(); + void OPCodeCB0xB9(); + void OPCodeCB0xBA(); + void OPCodeCB0xBB(); + void OPCodeCB0xBC(); + void OPCodeCB0xBD(); + void OPCodeCB0xBE(); + void OPCodeCB0xBF(); + void OPCodeCB0xC0(); + void OPCodeCB0xC1(); + void OPCodeCB0xC2(); + void OPCodeCB0xC3(); + void OPCodeCB0xC4(); + void OPCodeCB0xC5(); + void OPCodeCB0xC6(); + void OPCodeCB0xC7(); + void OPCodeCB0xC8(); + void OPCodeCB0xC9(); + void OPCodeCB0xCA(); + void OPCodeCB0xCB(); + void OPCodeCB0xCC(); + void OPCodeCB0xCD(); + void OPCodeCB0xCE(); + void OPCodeCB0xCF(); + void OPCodeCB0xD0(); + void OPCodeCB0xD1(); + void OPCodeCB0xD2(); + void OPCodeCB0xD3(); + void OPCodeCB0xD4(); + void OPCodeCB0xD5(); + void OPCodeCB0xD6(); + void OPCodeCB0xD7(); + void OPCodeCB0xD8(); + void OPCodeCB0xD9(); + void OPCodeCB0xDA(); + void OPCodeCB0xDB(); + void OPCodeCB0xDC(); + void OPCodeCB0xDD(); + void OPCodeCB0xDE(); + void OPCodeCB0xDF(); + void OPCodeCB0xE0(); + void OPCodeCB0xE1(); + void OPCodeCB0xE2(); + void OPCodeCB0xE3(); + void OPCodeCB0xE4(); + void OPCodeCB0xE5(); + void OPCodeCB0xE6(); + void OPCodeCB0xE7(); + void OPCodeCB0xE8(); + void OPCodeCB0xE9(); + void OPCodeCB0xEA(); + void OPCodeCB0xEB(); + void OPCodeCB0xEC(); + void OPCodeCB0xED(); + void OPCodeCB0xEE(); + void OPCodeCB0xEF(); + void OPCodeCB0xF0(); + void OPCodeCB0xF1(); + void OPCodeCB0xF2(); + void OPCodeCB0xF3(); + void OPCodeCB0xF4(); + void OPCodeCB0xF5(); + void OPCodeCB0xF6(); + void OPCodeCB0xF7(); + void OPCodeCB0xF8(); + void OPCodeCB0xF9(); + void OPCodeCB0xFA(); + void OPCodeCB0xFB(); + void OPCodeCB0xFC(); + void OPCodeCB0xFD(); + void OPCodeCB0xFE(); + void OPCodeCB0xFF(); +}; + +#include "Processor_inline.h" + +#endif /* PROCESSOR_H */ |
