1 ////////////////////////////////////////////////// 2 // // 3 // Emu64 // 4 // von Thorsten Kattanek // 5 // // 6 // #file: mos6502_class.h // 7 // // 8 // Dieser Sourcecode ist Copyright geschützt! // 9 // Geistiges Eigentum von Th.Kattanek // 10 // // 11 // Letzte Änderung am 17.09.2019 // 12 // www.emu64.de // 13 // // 14 ////////////////////////////////////////////////// 15 16 #ifndef MOS6502_CLASS_H 17 #define MOS6502_CLASS_H 18 19 #include <functional> 20 21 #include "./structs.h" 22 23 class MOS6502 24 { 25 public: 26 27 /// Funktionen /// 28 29 MOS6502(void); 30 ~MOS6502(void); 31 32 bool OneZyklus(void); 33 void Phi1(); 34 void Reset(void); 35 void ClearJAMFlag(void); 36 void GetRegister(REG_STRUCT *reg); 37 void SetRegister(REG_STRUCT *reg); 38 void GetInterneRegister(IREG_STRUCT *ireg); 39 void SET_SR_BIT6(void); 40 41 void TriggerInterrupt(int typ); 42 void ClearInterrupt(int typ); 43 44 std::function<unsigned char(unsigned short)> *ReadProcTbl; 45 std::function<void(unsigned short,unsigned char)> *WriteProcTbl; 46 47 /// Variablen /// 48 49 // Signale von Außen 50 51 bool *RESET; 52 bool *ResetReady; // Wird bei einem Reset False und beim erreichen einer 53 // Adresse wird es True 54 unsigned short ResetReadyAdr; 55 unsigned short *BreakStatus; 56 unsigned short *Breakpoints; 57 unsigned short *BreakWerte; 58 unsigned short *History; 59 unsigned char *HistoryPointer; 60 61 private: 62 63 /// Funktionen /// 64 65 inline void SET_SR_NZ(unsigned char wert); 66 inline void SET_SIGN(unsigned char wert); 67 inline void SET_ZERO(unsigned char wert); 68 inline void SET_CARRY(unsigned char status); 69 inline bool IF_CARRY(void); 70 inline bool IF_DECIMAL(void); 71 inline void SET_OVERFLOW(bool status); 72 inline unsigned char Read(unsigned short adresse); 73 inline void Write(unsigned short adresse, unsigned char wert); 74 75 /// Variablen /// 76 77 unsigned char *MCT; // Zeigt immer an die aktuelle stelle in derMicro Code Tabel 78 unsigned char Pointer; 79 unsigned short Adresse; 80 unsigned short BranchAdresse; 81 unsigned short AktOpcode; 82 unsigned short AktOpcodePC; 83 bool JAMFlag; 84 unsigned char TMPByte; 85 86 unsigned short PC; 87 unsigned char AC; 88 unsigned char XR; 89 unsigned char YR; 90 unsigned char SP; 91 unsigned char SR; 92 93 unsigned char irq_state; // if Größer 0 ist die Leitung low 94 bool irq_is_low_pegel; 95 bool irq_is_active; 96 97 bool irq_delay; 98 uint8_t irq_delay_sr_value; 99 100 /// Für OneZyklus /// 101 102 unsigned int tmp,tmp1; 103 unsigned short tmp2; 104 unsigned short src; 105 bool carry_tmp; 106 unsigned char idxReg; 107 }; 108 109 #define SetAdresseLo(wert) Adresse = ((Adresse&0xFF00)|wert) 110 #define SetAdresseHi(wert) Adresse = ((Adresse&0x00FF)|(wert<<8)) 111 112 #define SetPCLo(wert) PC=((PC&0xFF00)|wert) 113 #define SetPCHi(wert) PC=((PC&0x00FF)|(wert<<8)) 114 115 #define GetPCLo ((unsigned char)PC) 116 #define GetPCHi ((unsigned char)(PC>>8)) 117 118 #endif // MOS6502_CLASS_H 119