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