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