1
2 /*****************************************************************/
3 /* Memory accesses for 16-bit data bus, 24-bit address bus (V60) */
4 /*****************************************************************/
5
6 #define MemRead8_16 program_read_byte_16le
7 #define MemWrite8_16 program_write_byte_16le
8
MemRead16_16(offs_t address)9 static UINT16 MemRead16_16(offs_t address)
10 {
11 if (!(address & 1))
12 return program_read_word_16le(address);
13 else
14 {
15 UINT16 result = program_read_byte_16le(address);
16 return result | program_read_byte_16le(address + 1) << 8;
17 }
18 }
19
MemWrite16_16(offs_t address,UINT16 data)20 static void MemWrite16_16(offs_t address, UINT16 data)
21 {
22 if (!(address & 1))
23 program_write_word_16le(address, data);
24 else
25 {
26 program_write_byte_16le(address, data);
27 program_write_byte_16le(address + 1, data >> 8);
28 }
29 }
30
MemRead32_16(offs_t address)31 static UINT32 MemRead32_16(offs_t address)
32 {
33 if (!(address & 1))
34 {
35 UINT32 result = program_read_word_16le(address);
36 return result | (program_read_word_16le(address + 2) << 16);
37 }
38 else
39 {
40 UINT32 result = program_read_byte_16le(address);
41 result |= program_read_word_16le(address + 1) << 8;
42 return result | program_read_byte_16le(address + 3) << 24;
43 }
44 }
45
MemWrite32_16(offs_t address,UINT32 data)46 static void MemWrite32_16(offs_t address, UINT32 data)
47 {
48 if (!(address & 1))
49 {
50 program_write_word_16le(address, data);
51 program_write_word_16le(address + 2, data >> 16);
52 }
53 else
54 {
55 program_write_byte_16le(address, data);
56 program_write_word_16le(address + 1, data >> 8);
57 program_write_byte_16le(address + 3, data >> 24);
58 }
59 }
60
61
62 /***************************************************************/
63 /* Port accesses for 16-bit data bus, 24-bit address bus (V60) */
64 /***************************************************************/
65
66 #define PortRead8_16 io_read_byte_16le
67 #define PortWrite8_16 io_write_byte_16le
68
PortRead16_16(offs_t address)69 static UINT16 PortRead16_16(offs_t address)
70 {
71 if (!(address & 1))
72 return io_read_word_16le(address);
73 else
74 {
75 UINT16 result = io_read_byte_16le(address);
76 return result | io_read_byte_16le(address + 1) << 8;
77 }
78 }
79
PortWrite16_16(offs_t address,UINT16 data)80 static void PortWrite16_16(offs_t address, UINT16 data)
81 {
82 if (!(address & 1))
83 io_write_word_16le(address, data);
84 else
85 {
86 io_write_byte_16le(address, data);
87 io_write_byte_16le(address + 1, data >> 8);
88 }
89 }
90
PortRead32_16(offs_t address)91 static UINT32 PortRead32_16(offs_t address)
92 {
93 if (!(address & 1))
94 {
95 UINT32 result = io_read_word_16le(address);
96 return result | (io_read_word_16le(address + 2) << 16);
97 }
98 else
99 {
100 UINT32 result = io_read_byte_16le(address);
101 result |= io_read_word_16le(address + 1) << 8;
102 return result | io_read_byte_16le(address + 3) << 24;
103 }
104 }
105
PortWrite32_16(offs_t address,UINT32 data)106 static void PortWrite32_16(offs_t address, UINT32 data)
107 {
108 if (!(address & 1))
109 {
110 io_write_word_16le(address, data);
111 io_write_word_16le(address + 2, data >> 16);
112 }
113 else
114 {
115 io_write_byte_16le(address, data);
116 io_write_word_16le(address + 1, data >> 8);
117 io_write_byte_16le(address + 3, data >> 24);
118 }
119 }
120
121
122
123 /*****************************************************************/
124 /* Opcode accesses for 16-bit data bus, 24-bit address bus (V60) */
125 /*****************************************************************/
126
OpRead8_16(offs_t address)127 static UINT8 OpRead8_16(offs_t address)
128 {
129 return cpu_readop(BYTE_XOR_LE(address));
130 }
131
OpRead16_16(offs_t address)132 static UINT16 OpRead16_16(offs_t address)
133 {
134 return cpu_readop(BYTE_XOR_LE(address)) | (cpu_readop(BYTE_XOR_LE(address+1)) << 8);
135 }
136
OpRead32_16(offs_t address)137 static UINT32 OpRead32_16(offs_t address)
138 {
139 return cpu_readop(BYTE_XOR_LE(address)) | (cpu_readop(BYTE_XOR_LE(address+1)) << 8) |
140 (cpu_readop(BYTE_XOR_LE(address+2)) << 16) | (cpu_readop(BYTE_XOR_LE(address+3)) << 24);
141 }
142
ChangePC_16(offs_t pc)143 static void ChangePC_16(offs_t pc)
144 {
145 change_pc(pc);
146 }
147
148
149
150 /*****************************************************************/
151 /* Memory accesses for 32-bit data bus, 32-bit address bus (V70) */
152 /*****************************************************************/
153
154 #define MemRead8_32 program_read_byte_32le
155 #define MemWrite8_32 program_write_byte_32le
156
MemRead16_32(offs_t address)157 static UINT16 MemRead16_32(offs_t address)
158 {
159 if (!(address & 1))
160 return program_read_word_32le(address);
161 else
162 {
163 UINT16 result = program_read_byte_32le(address);
164 return result | program_read_byte_32le(address + 1) << 8;
165 }
166 }
167
MemWrite16_32(offs_t address,UINT16 data)168 static void MemWrite16_32(offs_t address, UINT16 data)
169 {
170 if (!(address & 1))
171 program_write_word_32le(address, data);
172 else
173 {
174 program_write_byte_32le(address, data);
175 program_write_byte_32le(address + 1, data >> 8);
176 }
177 }
178
MemRead32_32(offs_t address)179 static UINT32 MemRead32_32(offs_t address)
180 {
181 if (!(address & 3))
182 return program_read_dword_32le(address);
183 else if (!(address & 1))
184 {
185 UINT32 result = program_read_word_32le(address);
186 return result | (program_read_word_32le(address + 2) << 16);
187 }
188 else
189 {
190 UINT32 result = program_read_byte_32le(address);
191 result |= program_read_word_32le(address + 1) << 8;
192 return result | program_read_byte_32le(address + 3) << 24;
193 }
194 }
195
MemWrite32_32(offs_t address,UINT32 data)196 static void MemWrite32_32(offs_t address, UINT32 data)
197 {
198 if (!(address & 3))
199 program_write_dword_32le(address, data);
200 else if (!(address & 1))
201 {
202 program_write_word_32le(address, data);
203 program_write_word_32le(address + 2, data >> 16);
204 }
205 else
206 {
207 program_write_byte_32le(address, data);
208 program_write_word_32le(address + 1, data >> 8);
209 program_write_byte_32le(address + 3, data >> 24);
210 }
211 }
212
213
214
215 /***************************************************************/
216 /* Port accesses for 32-bit data bus, 32-bit address bus (V70) */
217 /***************************************************************/
218
219 #define PortRead8_32 io_read_byte_32le
220 #define PortWrite8_32 io_write_byte_32le
221
PortRead16_32(offs_t address)222 static UINT16 PortRead16_32(offs_t address)
223 {
224 if (!(address & 1))
225 {
226 return io_read_word_32le(address);
227 }
228 else
229 {
230 UINT16 result = io_read_byte_32le(address);
231 return result | io_read_byte_32le(address + 1) << 8;
232 }
233 }
234
PortWrite16_32(offs_t address,UINT16 data)235 static void PortWrite16_32(offs_t address, UINT16 data)
236 {
237 if (!(address & 1))
238 {
239 io_write_word_32le(address, data);
240 }
241 else
242 {
243 io_write_byte_32le(address, data);
244 io_write_byte_32le(address + 1, data >> 8);
245 }
246 }
247
PortRead32_32(offs_t address)248 static UINT32 PortRead32_32(offs_t address)
249 {
250 if (!(address & 3))
251 return io_read_dword_32le(address);
252 else if (!(address & 1))
253 {
254 UINT32 result = io_read_word_32le(address);
255 return result | (io_read_word_32le(address + 2) << 16);
256 }
257 else
258 {
259 UINT32 result = io_read_byte_32le(address);
260 result |= io_read_word_32le(address + 1) << 8;
261 return result | io_read_byte_32le(address + 3) << 24;
262 }
263 }
264
PortWrite32_32(offs_t address,UINT32 data)265 static void PortWrite32_32(offs_t address, UINT32 data)
266 {
267 if (!(address & 3))
268 io_write_dword_32le(address, data);
269 else if (!(address & 1))
270 {
271 io_write_word_32le(address, data);
272 io_write_word_32le(address + 2, data >> 16);
273 }
274 else
275 {
276 io_write_byte_32le(address, data);
277 io_write_word_32le(address + 1, data >> 8);
278 io_write_byte_32le(address + 3, data >> 24);
279 }
280 }
281
282
283
284 /*****************************************************************/
285 /* Opcode accesses for 32-bit data bus, 32-bit address bus (V60) */
286 /*****************************************************************/
287
OpRead8_32(offs_t address)288 static UINT8 OpRead8_32(offs_t address)
289 {
290 return cpu_readop(BYTE4_XOR_LE(address));
291 }
292
OpRead16_32(offs_t address)293 static UINT16 OpRead16_32(offs_t address)
294 {
295 return cpu_readop(BYTE4_XOR_LE(address)) | (cpu_readop(BYTE4_XOR_LE(address+1)) << 8);
296 }
297
OpRead32_32(offs_t address)298 static UINT32 OpRead32_32(offs_t address)
299 {
300 return cpu_readop(BYTE4_XOR_LE(address)) | (cpu_readop(BYTE4_XOR_LE(address+1)) << 8) |
301 (cpu_readop(BYTE4_XOR_LE(address+2)) << 16) | (cpu_readop(BYTE4_XOR_LE(address+3)) << 24);
302 }
303
ChangePC_32(offs_t pc)304 static void ChangePC_32(offs_t pc)
305 {
306 change_pc(pc);
307 }
308
309
310
311 /************************************************/
312 /* Structures pointing to various I/O functions */
313 /************************************************/
314
315 static struct cpu_info v60_i =
316 {
317 MemRead8_16, MemWrite8_16, MemRead16_16, MemWrite16_16, MemRead32_16, MemWrite32_16,
318 PortRead8_16, PortWrite8_16, PortRead16_16, PortWrite16_16, PortRead32_16, PortWrite32_16,
319 OpRead8_16, OpRead16_16, OpRead32_16,
320 ChangePC_16,
321 0xfffff0
322 };
323
324 static struct cpu_info v70_i =
325 {
326 MemRead8_32, MemWrite8_32, MemRead16_32, MemWrite16_32, MemRead32_32, MemWrite32_32,
327 PortRead8_32, PortWrite8_32, PortRead16_32, PortWrite16_32, PortRead32_32, PortWrite32_32,
328 OpRead8_32, OpRead16_32, OpRead32_32,
329 ChangePC_32,
330 0xfffffff0
331 };
332
333
334
335 /**************************************/
336 /* Macro shorthands for I/O functions */
337 /**************************************/
338
339 #define MemRead8 v60.info.mr8
340 #define MemWrite8 v60.info.mw8
341 #define MemRead16 v60.info.mr16
342 #define MemWrite16 v60.info.mw16
343 #define MemRead32 v60.info.mr32
344 #define MemWrite32 v60.info.mw32
345
346 #define PortRead8 v60.info.pr8
347 #define PortWrite8 v60.info.pw8
348 #define PortRead16 v60.info.pr16
349 #define PortWrite16 v60.info.pw16
350 #define PortRead32 v60.info.pr32
351 #define PortWrite32 v60.info.pw32
352
353 #if defined(LSB_FIRST) && !defined(ALIGN_INTS)
354 #define OpRead8(a) (cpu_readop(a))
355 #define OpRead16(a) (cpu_readop16(a))
356 #define OpRead32(a) (cpu_readop32(a))
357 #else
358 #define OpRead8 v60.info.mr8
359 #define OpRead16 v60.info.mr16
360 #define OpRead32 v60.info.mr32
361 #endif
362
363 #define ChangePC v60.info.chpc
364