1 #include "m6800/m6800.h"
2
3 typedef UINT8 (*pReadByteHandler)(UINT16 a);
4 typedef void (*pWriteByteHandler)(UINT16 a, UINT8 d);
5 typedef UINT8 (*pReadOpHandler)(UINT16 a);
6 typedef UINT8 (*pReadOpArgHandler)(UINT16 a);
7 typedef UINT8 (*pReadPortHandler)(UINT16 a);
8 typedef void (*pWritePortHandler)(UINT16 a, UINT8 d);
9
10 struct M6800Ext {
11
12 m6800_Regs reg;
13
14 UINT8* pMemMap[0x100 * 3];
15
16 pReadByteHandler ReadByte;
17 pWriteByteHandler WriteByte;
18 pReadOpHandler ReadOp;
19 pReadOpArgHandler ReadOpArg;
20 pReadPortHandler ReadPort;
21 pWritePortHandler WritePort;
22
23 INT32 nCpuType;
24 INT32 nCyclesTotal;
25 INT32 nCyclesSegment;
26 INT32 nCyclesLeft;
27 };
28
29
30 #define HD63701_INPUT_LINE_NMI M6800_INPUT_LINE_NMI
31 #define HD63701_IRQ_LINE M6800_IRQ_LINE
32 #define HD63701_TIN_LINE M6800_TIN_LINE
33
34 #define M6801_INPUT_LINE_NMI M6800_INPUT_LINE_NMI
35 #define M6801_IRQ_LINE M6800_IRQ_LINE
36 #define M6801_TIN_LINE M6800_TIN_LINE
37
38 #define M6803_INPUT_LINE_NMI M6800_INPUT_LINE_NMI
39 #define M6803_IRQ_LINE M6800_IRQ_LINE
40 #define M6803_TIN_LINE M6800_TIN_LINE
41
42 #define NSC8105_INPUT_LINE_NMI M6800_INPUT_LINE_NMI
43 #define NSC8105_IRQ_LINE M6800_IRQ_LINE
44 #define NSC8105_TIN_LINE M6800_TIN_LINE
45
46 #define CPU_TYPE_M6800 1
47 #define CPU_TYPE_HD63701 2
48 #define CPU_TYPE_M6803 3
49 #define CPU_TYPE_M6801 4
50 #define CPU_TYPE_NSC8105 5
51
52 extern INT32 nM6800Count;
53
54 extern INT32 nM6800CyclesTotal;
55
56 void M6800Reset();
57 #define HD63701Reset M6800Reset
58 #define M6803Reset M6800Reset
59 #define M6801Reset M6800Reset
60 #define NSC8105Reset M6800Reset
61
62 void M6800ResetSoft();
63 #define HD63701ResetSoft M6800ResetSoft
64 #define M6803ResetSoft M6800ResetSoft
65 #define M6801ResetSoft M6800ResetSoft
66 #define NSC8105ResetSoft M6800ResetSoft
67
68 void M6800NewFrame();
69 #define HD63701NewFrame M6800NewFrame
70 #define M6803NewFrame M6800NewFrame
71 #define M6801NewFrame M6800NewFrame
72 #define NSC8105NewFrame M6800NewFrame
73
74 INT32 M6800CoreInit(INT32 num, INT32 type);
75 INT32 M6800Init(INT32 num);
76 INT32 HD63701Init(INT32 num);
77 INT32 M6803Init(INT32 num);
78 INT32 M6801Init(INT32 num);
79 INT32 NSC8105Init(INT32 num);
80
81 void M6800Exit();
82 #define HD63701Exit M6800Exit
83 #define M6803Exit M6800Exit
84 #define M6801Exit M6800Exit
85 #define NSC8105Exit M6800Exit
86
87 void M6800SetIRQLine(INT32 vector, INT32 status);
88 #define M6801SetIRQLine M6800SetIRQLine
89 #define HD63701SetIRQLine M6800SetIRQLine
90 #define M6803SetIRQLine M6800SetIRQLine
91 #define NSC8105SetIRQLine M6800SetIRQLine
92
93 INT32 M6800Run(INT32 cycles);
94 #define M6801Run M6800Run
95 #define HD63701Run M6800Run
96 #define M6803Run M6800Run
97 #define NSC8105Run M6800Run
98
99 void M6800RunEnd();
100 #define HD63701RunEnd M6800RunEnd
101 #define M6803RunEnd M6800RunEnd
102 #define M6801RunEnd M6800RunEnd
103 #define NSC8105RunEnd M6800RunEnd
104
105 UINT32 M6800GetPC(INT32);
106 #define HD63701GetPC M6800GetPC
107 #define M6803GetPC M6800GetPC
108 #define M6801GetPC M6800GetPC
109 #define NSC8105GetPC M6800GetPC
110
111 INT32 M6800MapMemory(UINT8* pMemory, UINT16 nStart, UINT16 nEnd, INT32 nType);
112 #define HD63701MapMemory M6800MapMemory
113 #define M6803MapMemory M6800MapMemory
114 #define M6801MapMemory M6800MapMemory
115 #define NSC8105MapMemory M6800MapMemory
116
117 void M6800SetReadHandler(UINT8 (*pHandler)(UINT16));
118 #define HD63701SetReadHandler M6800SetReadHandler
119 #define M6803SetReadHandler M6800SetReadHandler
120 #define M6801SetReadHandler M6800SetReadHandler
121 #define NSC8105SetReadHandler M6800SetReadHandler
122
123 void M6800SetWriteHandler(void (*pHandler)(UINT16, UINT8));
124 #define HD63701SetWriteHandler M6800SetWriteHandler
125 #define M6803SetWriteHandler M6800SetWriteHandler
126 #define M6801SetWriteHandler M6800SetWriteHandler
127 #define NSC8105SetWriteHandler M6800SetWriteHandler
128
129 void M6800SetReadOpHandler(UINT8 (*pHandler)(UINT16));
130 #define HD63701SetReadOpHandler M6800SetReadOpHandler
131 #define M6803SetReadOpHandler M6800SetReadOpHandler
132 #define M6801SetReadOpHandler M6800SetReadOpHandler
133 #define NSC8105SetReadOpHandler M6800SetReadOpHandler
134
135 void M6800SetReadOpArgHandler(UINT8 (*pHandler)(UINT16));
136 #define HD63701SetReadOpArgHandler M6800SetReadOpArgHandler
137 #define M6803SetReadOpArgHandler M6800SetReadOpArgHandler
138 #define M6801SetReadOpArgHandler M6800SetReadOpArgHandler
139 #define NSC8105SetReadOpArgHandler M6800SetReadOpArgHandler
140
141 void M6800SetReadPortHandler(UINT8 (*pHandler)(UINT16));
142 #define HD63701SetReadPortHandler M6800SetReadPortHandler
143 #define M6803SetReadPortHandler M6800SetReadPortHandler
144 #define M6801SetReadPortHandler M6800SetReadPortHandler
145 #define NSC8105SetReadPortHandler M6800SetReadPortHandler
146
147 void M6800SetWritePortHandler(void (*pHandler)(UINT16, UINT8));
148 #define HD63701SetWritePortHandler M6800SetWritePortHandler
149 #define M6803SetWritePortHandler M6800SetWritePortHandler
150 #define M6801SetWritePortHandler M6800SetWritePortHandler
151 #define NSC8105SetWritePortHandler M6800SetWritePortHandler
152
153 INT32 M6800Scan(INT32 nAction);
154 #define HD63701Scan M6800Scan
155 #define M6803Scan M6800Scan
156 #define M6801Scan M6800Scan
157 #define NSC8105Scan M6800Scan
158
M6800TotalCycles()159 inline static INT32 M6800TotalCycles()
160 {
161 #if defined FBNEO_DEBUG
162 if (!DebugCPU_M6800Initted) bprintf(PRINT_ERROR, _T("M6800TotalCycles called without init\n"));
163 #endif
164
165 return nM6800CyclesTotal + m6800_get_segmentcycles();
166 }
167 #define HD63701TotalCycles M6800TotalCycles
168 #define M6803TotalCycles M6800TotalCycles
169 #define M6801TotalCycles M6800TotalCycles
170 #define NSC8105TotalCycles M6800TotalCycles
171
M6800Idle(INT32 cycles)172 inline static INT32 M6800Idle(INT32 cycles)
173 {
174 #if defined FBNEO_DEBUG
175 if (!DebugCPU_M6800Initted) bprintf(PRINT_ERROR, _T("M6800Idle called without init\n"));
176 #endif
177
178 nM6800CyclesTotal += cycles;
179
180 return cycles;
181 }
182 #define HD63701Idle M6800Idle
183 #define M6803Idle M6800Idle
184 #define M6801Idle M6800Idle
185 #define NSC8105Idle M6800Idle
186
187 void M6800WriteRom(UINT32 Address, UINT8 Data); // cheat core
188 UINT8 M6800CheatRead(UINT32 Address);
189
190 void M6800Open(INT32 num);
191 #define HD63701Open M6800Open
192 #define M6803Open M6800Open
193 #define M6801Open M6800Open
194 #define NSC8105Open M6800Open
195
196 void M6800Close();
197 #define HD63701Close M6800Close
198 #define M6803Close M6800Close
199 #define M6801Close M6800Close
200 #define NSC8105Close M6800Close
201
202 INT32 M6800GetActive();
203 #define HD63701GetActive M6800GetActive
204 #define M6803GetActive M6800GetActive
205 #define M6801GetActive M6800GetActive
206 #define NSC8105GetActive M6800GetActive
207
208 extern struct cpu_core_config M6800Config;
209 extern struct cpu_core_config HD63701Config;
210 extern struct cpu_core_config M6803Config;
211 extern struct cpu_core_config NSC8105Config;
212
213 // depreciate this and use BurnTimerAttach directly!
214 #define BurnTimerAttachM6800(clock) \
215 BurnTimerAttach(&M6800Config, clock)
216
217 // depreciate this and use BurnTimerAttach directly!
218 #define BurnTimerAttachHD63701(clock) \
219 BurnTimerAttach(&HD63701Config, clock)
220
221 // depreciate this and use BurnTimerAttach directly!
222 #define BurnTimerAttachM6803(clock) \
223 BurnTimerAttach(&M6803Config, clock)
224
225 // depreciate this and use BurnTimerAttach directly!
226 #define BurnTimerAttachNSC8105(clock) \
227 BurnTimerAttach(&NSC8105Config, clock)
228