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