1 //////////////////////////////////////////////////
2 //                                              //
3 // Emu64                                        //
4 // von Thorsten Kattanek                        //
5 //                                              //
6 // #file: mmu_class.h                           //
7 //                                              //
8 // Dieser Sourcecode ist Copyright geschützt!   //
9 // Geistiges Eigentum von Th.Kattanek           //
10 //                                              //
11 // Letzte Änderung am 13.09.2019                //
12 // www.emu64.de                                 //
13 //                                              //
14 //////////////////////////////////////////////////
15 
16 #ifndef MMU_CLASS_H
17 #define MMU_CLASS_H
18 
19 #include <functional>
20 
21 #include "./structs.h"
22 #include "./mos6510_class.h"
23 
24 class MMU
25 {
26 public:
27     /// Funktionen ///
28     MMU(void);
29     ~MMU(void);
30     void Reset();
31 
32     void ChangeMemMap(void);
33     unsigned char* GetFarbramPointer(void);
34     unsigned char* GetRAMPointer(void);
35     bool LoadKernalRom(const char *filename);
36     bool LoadBasicRom(const char *filename);
37     bool LoadCharRom(const char *filename);
38     unsigned char GetReadSource(unsigned char page);
39     unsigned char GetWriteDestination(unsigned char page);
40     //bool SaveFreez(FILE* File);
41     //bool LoadFreez(FILE *File,unsigned short Version);
42     /// Variablen ///
43 
44     MOS6510_PORT *CPU_PORT;
45 
46     // Zeiger für Read / Write Funktionen ///
47     // Diese werden Teilweise Intern und Extern gesetzt ///
48     // Ein Aufruf erfolg immer ohne Überprüfung auf gültigen Zeiger !!! //
49 
50     std::function<unsigned char(unsigned short)> CPUReadProcTbl[0x100];
51     std::function<void(unsigned short,unsigned char)> CPUWriteProcTbl[0x100];
52     std::function<unsigned char(unsigned short)> VICReadProcTbl[0x100];
53 
54     std::function<unsigned char(unsigned short)>* GetCPUReadProcTable;
55     std::function<unsigned char(unsigned short)>* GetVICReadProcTable;
56     std::function<void(unsigned short, unsigned char)>* GetCPUWriteProcTable();
57     std::function<void(unsigned short,unsigned char)> VicIOWriteProc;
58     std::function<void(unsigned short,unsigned char)> SidIOWriteProc;
59     std::function<void(unsigned short,unsigned char)> Cia1IOWriteProc;
60     std::function<void(unsigned short,unsigned char)> Cia2IOWriteProc;
61     std::function<void(unsigned short,unsigned char)> IO1WriteProc;
62     std::function<void(unsigned short,unsigned char)> IO2WriteProc;
63     std::function<void(unsigned short,unsigned char)> CRTRom1WriteProc;
64     std::function<void(unsigned short,unsigned char)> CRTRom2WriteProc;
65     std::function<void(unsigned short,unsigned char)> CRTRom3WriteProc;
66     std::function<unsigned char(unsigned short)> CRTRom1ReadProc;
67     std::function<unsigned char(unsigned short)> CRTRom2ReadProc;
68     std::function<unsigned char(unsigned short)> CRTRom3ReadProc;
69     std::function<unsigned char(unsigned short)> VicIOReadProc;
70     std::function<unsigned char(unsigned short)> SidIOReadProc;
71     std::function<unsigned char(unsigned short)> Cia1IOReadProc;
72     std::function<unsigned char(unsigned short)> Cia2IOReadProc;
73     std::function<unsigned char(unsigned short)> IO1ReadProc;
74     std::function<unsigned char(unsigned short)> IO2ReadProc;
75 
76     bool *GAME;
77     bool *EXROM;
78     bool *RAM_H;
79     bool *RAM_L;
80 
81     unsigned char MEMORY_MAP;
82     unsigned char MEMORY_MAP_OLD;
83 
84     bool	*EasyFlashDirty1;
85     unsigned char *EasyFlashByte1;
86     bool	*EasyFlashDirty2;
87     unsigned char *EasyFlashByte2;
88 
89 private:
90     /// Funktionen ///
91     void InitProcTables(void);
92     unsigned char ReadZeroPage(unsigned short adresse);
93     void WriteZeroPage(unsigned short adresse, unsigned char wert);
94     unsigned char ReadRam(unsigned short adresse);
95     void WriteRam(unsigned short adresse, unsigned char wert);
96     unsigned char ReadFarbRam(unsigned short adresse);
97     void WriteFarbRam(unsigned short adresse, unsigned char wert);
98     unsigned char ReadKernalRom(unsigned short adresse);
99     unsigned char ReadBasicRom(unsigned short adresse);
100     unsigned char ReadCharRom(unsigned short adresse);
101     unsigned char ReadCRT1(unsigned short adresse);
102     void WriteCRT1(unsigned short adresse, unsigned char wert);
103     unsigned char ReadCRT2(unsigned short adresse);
104     void WriteCRT2(unsigned short adresse, unsigned char wert);
105     unsigned char ReadCRT3(unsigned short adresse);
106     void WriteCRT3(unsigned short adresse, unsigned char wert);
107     unsigned char ReadVicCharRomBank0(unsigned short adresse);
108     unsigned char ReadVicCharRomBank2(unsigned short adresse);
109     unsigned char ReadVicRam(unsigned short adresse);
110     unsigned char ReadOpenAdress(unsigned short adresse);
111     void WriteOpenAdress(unsigned short adresse, unsigned char wert);
112 
113     /// Variablen ///
114     unsigned char RAM[0x10000];			// 64KB
115     unsigned char BASIC_ROM[0x2000];		// 8KB ab 0xA000
116     unsigned char CHAR_ROM[0x1000];		// 4KB ab 0xD000
117     unsigned char FARB_RAM[0x0400];		// 1KB ab 0xD800
118     unsigned char KERNAL_ROM[0x2000];		// 8KB ab 0xE000
119 
120     /// AktMemoryMap Visuall ///
121     unsigned char MapReadSource[0x100];
122     unsigned char MapWriteDestination[0x100];
123 };
124 #endif // MMU_CLASS_H
125