summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/h83002/h8.h
blob: d3107efbf25759d20b3e454df7a468044ded2a0f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
/***************************************************************************

 h8.h : Public constants and function defs for the H8/300, H8/300H,
		H8/2000S, and H8/2600S family emulators.

****************************************************************************/

#pragma once

#ifndef __H8SERIES_H__
#define __H8SERIES_H__


#define IFLAG  0x80
#define UIFLAG 0x40
#define HFLAG  0x20
#define UFLAG  0x10
#define NFLAG  0x08
#define ZFLAG  0x04
#define VFLAG  0x02
#define CFLAG  0x01

enum
{
	H8_E0 = 1,
	H8_E1,
	H8_E2,
	H8_E3,
	H8_E4,
	H8_E5,
	H8_E6,
	H8_E7,

	H8_PC,
	H8_CCR,
    H8_EXR
};

// external input lines
enum
{
	H8_IRQ0 = 0,
	H8_IRQ1,
	H8_IRQ2,
	H8_IRQ3,
	H8_IRQ4,
	H8_IRQ5,
	H8_IRQ6,	// IRQs 6+ only available on 8-bit H8/3xx or 16-bit H8S/2394
	H8_IRQ7,
	H8_NMI,

	H8_METRO_TIMER_HACK,	// as described.  this needs to be fixed.

	H8_SCI_0_RX,	// incoming character on SCI 0
	H8_SCI_1_RX,	// incoming character on SCI 1
};

// I/O ports
enum
{
	// digital I/O ports
	// ports 4-B are valid on 16-bit H8/3xx, ports 1-9 on 8-bit H8/3xx
    // H8S/2394 has 12 ports named 1-6 and A-G
	H8_PORT_1 = 0,	// 0
	H8_PORT_2,	// 1
	H8_PORT_3,	// 2
	H8_PORT_4,	// 3
	H8_PORT_5,	// 4
	H8_PORT_6,	// 5
	H8_PORT_7,	// 6
	H8_PORT_8,	// 7
	H8_PORT_9,	// 8
	H8_PORT_A,	// 9
	H8_PORT_B,	// A
	H8_PORT_C,	// B
	H8_PORT_D,	// C
	H8_PORT_E,	// D
	H8_PORT_F,	// E
	H8_PORT_G,	// F

	// analog inputs
	H8_ADC_0_H = 0x20,
	H8_ADC_0_L,
	H8_ADC_1_H,
	H8_ADC_1_L,
	H8_ADC_2_H,
	H8_ADC_2_L,
	H8_ADC_3_H,
	H8_ADC_3_L,
	H8_ADC_4_H,
	H8_ADC_4_L,
	H8_ADC_5_H,
	H8_ADC_5_L,
	H8_ADC_6_H,
	H8_ADC_6_L,
	H8_ADC_7_H,
	H8_ADC_7_L,

	// serial ports
	H8_SERIAL_0 = 0x30,
	H8_SERIAL_1,
    H8_SERIAL_2
};

////////////////////////////
// INTERNAL I/O REGISTERS //
////////////////////////////

#define H8S_IO_OFFS(addr) ((addr) - 0xFFFE40) /* convert address to offset */
#define H8S_IO_ADDR(offs) ((offs) + 0xFFFE40) /* convert offset to address */

#define H8S_IO(xxxx) ((xxxx) - 0xFE40)

// port data direction registers
#define H8S_IO_P1DDR  H8S_IO(0xFEB0)
#define H8S_IO_P2DDR  H8S_IO(0xFEB1)
#define H8S_IO_P3DDR  H8S_IO(0xFEB2)
#define H8S_IO_P4DDR  H8S_IO(0xFEB3)
#define H8S_IO_P5DDR  H8S_IO(0xFEB4)
#define H8S_IO_P6DDR  H8S_IO(0xFEB5)
#define H8S_IO_PADDR  H8S_IO(0xFEB9)
#define H8S_IO_PBDDR  H8S_IO(0xFEBA)
#define H8S_IO_PCDDR  H8S_IO(0xFEBB)
#define H8S_IO_PDDDR  H8S_IO(0xFEBC)
#define H8S_IO_PEDDR  H8S_IO(0xFEBD)
#define H8S_IO_PFDDR  H8S_IO(0xFEBE)
#define H8S_IO_PGDDR  H8S_IO(0xFEBF)
// interrupt controller
#define H8S_IO_ICRA   H8S_IO(0xFEC0)
#define H8S_IO_ICRB   H8S_IO(0xFEC1)
#define H8S_IO_ICRC   H8S_IO(0xFEC2)

#define H8S_IO_ISCRH  H8S_IO(0xFF2C)
#define H8S_IO_ISCRL  H8S_IO(0xFF2D)

// for H8S/2394
#define H8S_IO_IER    H8S_IO(0xFF2E)
#define H8S_IO_IFR    H8S_IO(0xFF2F)

// dtc (data transfer controller)
#define H8S_IO_DTCEA  H8S_IO(0xFF30)
#define H8S_IO_DTCEB  H8S_IO(0xFF31)
#define H8S_IO_DTCEC  H8S_IO(0xFF32)
#define H8S_IO_DTCED  H8S_IO(0xFF33)
#define H8S_IO_DTCEE  H8S_IO(0xFF34)
#define H8S_IO_DTCEF  H8S_IO(0xFF35)

#define H8S_IO_SYSCR  H8S_IO(0xFF39)

// port read registers
#define H8S_IO_PORT1  H8S_IO(0xFF50)
#define H8S_IO_PORT2  H8S_IO(0xFF51)
#define H8S_IO_PORT3  H8S_IO(0xFF52)
#define H8S_IO_PORT4  H8S_IO(0xFF53)
#define H8S_IO_PORT5  H8S_IO(0xFF54)
#define H8S_IO_PORT6  H8S_IO(0xFF55)
#define H8S_IO_PORTA  H8S_IO(0xFF59)
#define H8S_IO_PORTB  H8S_IO(0xFF5A)
#define H8S_IO_PORTC  H8S_IO(0xFF5B)
#define H8S_IO_PORTD  H8S_IO(0xFF5C)
#define H8S_IO_PORTE  H8S_IO(0xFF5D)
#define H8S_IO_PORTF  H8S_IO(0xFF5E)
#define H8S_IO_PORTG  H8S_IO(0xFF5F)
// port data write registers
#define H8S_IO_P1DR   H8S_IO(0xFF60)
#define H8S_IO_P2DR   H8S_IO(0xFF61)
#define H8S_IO_P3DR   H8S_IO(0xFF62)
#define H8S_IO_P4DR   H8S_IO(0xFF63)
#define H8S_IO_P5DR   H8S_IO(0xFF64)
#define H8S_IO_P6DR   H8S_IO(0xFF65)
#define H8S_IO_PADR   H8S_IO(0xFF69)
#define H8S_IO_PBDR   H8S_IO(0xFF6A)
#define H8S_IO_PCDR   H8S_IO(0xFF6B)
#define H8S_IO_PDDR   H8S_IO(0xFF6C)
#define H8S_IO_PEDR   H8S_IO(0xFF6D)
#define H8S_IO_PFDR   H8S_IO(0xFF6E)
#define H8S_IO_PGDR   H8S_IO(0xFF6F)
// SCI0
#define H8S_IO_SMR0   H8S_IO(0xFF78)
#define H8S_IO_BRR0   H8S_IO(0xFF79)
#define H8S_IO_SCR0   H8S_IO(0xFF7A)
#define H8S_IO_TDR0   H8S_IO(0xFF7B)
#define H8S_IO_SSR0   H8S_IO(0xFF7C)
#define H8S_IO_RDR0   H8S_IO(0xFF7D)
#define H8S_IO_SCMR0  H8S_IO(0xFF7E)
// SCI1
#define H8S_IO_SMR1   H8S_IO(0xFF80)
#define H8S_IO_BRR1   H8S_IO(0xFF81)
#define H8S_IO_SCR1   H8S_IO(0xFF82)
#define H8S_IO_TDR1   H8S_IO(0xFF83)
#define H8S_IO_SSR1   H8S_IO(0xFF84)
#define H8S_IO_RDR1   H8S_IO(0xFF85)
#define H8S_IO_SCMR1  H8S_IO(0xFF86)
// SCI2
#define H8S_IO_SMR2   H8S_IO(0xFF88)
#define H8S_IO_BRR2   H8S_IO(0xFF89)
#define H8S_IO_SCR2   H8S_IO(0xFF8A)
#define H8S_IO_TDR2   H8S_IO(0xFF8B)
#define H8S_IO_SSR2   H8S_IO(0xFF8C)
#define H8S_IO_RDR2   H8S_IO(0xFF8D)
#define H8S_IO_SCMR2  H8S_IO(0xFF8E)

// ADC
#define H8S_IO_ADDRA  H8S_IO(0xFF90)
#define H8S_IO_ADDRB  H8S_IO(0xFF92)
#define H8S_IO_ADDRC  H8S_IO(0xFF94)
#define H8S_IO_ADDRD  H8S_IO(0xFF96)
#define H8S_IO_ADDRE  H8S_IO(0xFF98)
#define H8S_IO_ADDRF  H8S_IO(0xFF9A)
#define H8S_IO_ADDRG  H8S_IO(0xFF9C)
#define H8S_IO_ADDRH  H8S_IO(0xFF9E)
#define H8S_IO_ADCSR  H8S_IO(0xFFA0)
#define H8S_IO_ADCR   H8S_IO(0xFFA1)

// 8-bit timer (channel 0 & 1)
#define H8S_IO_TCR0   H8S_IO(0xFFB0)
#define H8S_IO_TCR1   H8S_IO(0xFFB1)
#define H8S_IO_TCSR0  H8S_IO(0xFFB2)
#define H8S_IO_TCSR1  H8S_IO(0xFFB3)
#define H8S_IO_TCORA0 H8S_IO(0xFFB4)
#define H8S_IO_TCORA1 H8S_IO(0xFFB5)
#define H8S_IO_TCORB0 H8S_IO(0xFFB6)
#define H8S_IO_TCORB1 H8S_IO(0xFFB7)
#define H8S_IO_TCNT0  H8S_IO(0xFFB8)
#define H8S_IO_TCNT1  H8S_IO(0xFFB9)
// TPU
#define H8S_IO_TSTR   H8S_IO(0xFFC0)
#define H8S_IO_TSYR   H8S_IO(0xFFC1)
// TPU0
#define H8S_IO_TTCR0		H8S_IO(0xFFD0)
#define H8S_IO_TMDR0		H8S_IO(0xFFD1)
#define H8S_IO_TIOR0_H		H8S_IO(0xFFD2)
#define H8S_IO_TIOR0_L		H8S_IO(0xFFD3)
#define H8S_IO_TIER0		H8S_IO(0xFFD4)
#define H8S_IO_TSR0			H8S_IO(0xFFD5)
#define H8S_IO_TCNT0_H		H8S_IO(0xFFD6)
#define H8S_IO_TCNT0_L		H8S_IO(0xFFD7)
#define H8S_IO_TGR0A_H		H8S_IO(0xFFD8)
#define H8S_IO_TGR0A_L		H8S_IO(0xFFD9)
#define H8S_IO_TGR0B_H		H8S_IO(0xFFDA)
#define H8S_IO_TGR0B_L		H8S_IO(0xFFDB)
#define H8S_IO_TGR0C_H		H8S_IO(0xFFDC)
#define H8S_IO_TGR0C_L		H8S_IO(0xFFDD)
#define H8S_IO_TGR0D_H		H8S_IO(0xFFDE)
#define H8S_IO_TGR0D_L		H8S_IO(0xFFDF)
// TPU1
#define H8S_IO_TTCR1		H8S_IO(0xFFE0)
#define H8S_IO_TMDR1		H8S_IO(0xFFE1)
#define H8S_IO_TIOR1		H8S_IO(0xFFE2)
#define H8S_IO_TIER1		H8S_IO(0xFFE4)
#define H8S_IO_TSR1			H8S_IO(0xFFE5)
#define H8S_IO_TCNT1_H		H8S_IO(0xFFE6)
#define H8S_IO_TCNT1_L		H8S_IO(0xFFE7)
#define H8S_IO_TGR1A_H		H8S_IO(0xFFE8)
#define H8S_IO_TGR1A_L		H8S_IO(0xFFE9)
#define H8S_IO_TGR1B_H		H8S_IO(0xFFEA)
#define H8S_IO_TGR1B_L		H8S_IO(0xFFEB)
// TPU2
#define H8S_IO_TTCR2		H8S_IO(0xFFF0)
#define H8S_IO_TMDR2		H8S_IO(0xFFF1)
#define H8S_IO_TIOR2		H8S_IO(0xFFF2)
#define H8S_IO_TIER2		H8S_IO(0xFFF4)
#define H8S_IO_TSR2			H8S_IO(0xFFF5)
#define H8S_IO_TCNT2_H		H8S_IO(0xFFF6)
#define H8S_IO_TCNT2_L		H8S_IO(0xFFF7)
#define H8S_IO_TGR2A_H		H8S_IO(0xFFF8)
#define H8S_IO_TGR2A_L		H8S_IO(0xFFF9)
#define H8S_IO_TGR2B_H		H8S_IO(0xFFFA)
#define H8S_IO_TGR2B_L		H8S_IO(0xFFFB)
// TPU3
#define H8S_IO_TTCR3		H8S_IO(0xFE80)
#define H8S_IO_TMDR3		H8S_IO(0xFE81)
#define H8S_IO_TIOR3_H		H8S_IO(0xFE82)
#define H8S_IO_TIOR3_L		H8S_IO(0xFE83)
#define H8S_IO_TIER3		H8S_IO(0xFE84)
#define H8S_IO_TSR3			H8S_IO(0xFE85)
#define H8S_IO_TCNT3_H		H8S_IO(0xFE86)
#define H8S_IO_TCNT3_L		H8S_IO(0xFE87)
#define H8S_IO_TGR3A_H		H8S_IO(0xFE88)
#define H8S_IO_TGR3A_L		H8S_IO(0xFE89)
#define H8S_IO_TGR3B_H		H8S_IO(0xFE8A)
#define H8S_IO_TGR3B_L		H8S_IO(0xFE8B)
#define H8S_IO_TGR3C_H		H8S_IO(0xFE8C)
#define H8S_IO_TGR3C_L		H8S_IO(0xFE8D)
#define H8S_IO_TGR3D_H		H8S_IO(0xFE8E)
#define H8S_IO_TGR3D_L		H8S_IO(0xFE8F)
// TPU4
#define H8S_IO_TTCR4		H8S_IO(0xFE90)
#define H8S_IO_TMDR4		H8S_IO(0xFE91)
#define H8S_IO_TIOR4		H8S_IO(0xFE92)
#define H8S_IO_TIER4		H8S_IO(0xFE94)
#define H8S_IO_TSR4			H8S_IO(0xFE95)
#define H8S_IO_TCNT4_H		H8S_IO(0xFE96)
#define H8S_IO_TCNT4_L		H8S_IO(0xFE97)
#define H8S_IO_TGR4A_H		H8S_IO(0xFE98)
#define H8S_IO_TGR4A_L		H8S_IO(0xFE99)
#define H8S_IO_TGR4B_H		H8S_IO(0xFE9A)
#define H8S_IO_TGR4B_L		H8S_IO(0xFE9B)
// TPU5
#define H8S_IO_TTCR5		H8S_IO(0xFEA0)
#define H8S_IO_TMDR5		H8S_IO(0xFEA1)
#define H8S_IO_TIOR5		H8S_IO(0xFEA2)
#define H8S_IO_TIER5		H8S_IO(0xFEA4)
#define H8S_IO_TSR5			H8S_IO(0xFEA5)
#define H8S_IO_TCNT5_H		H8S_IO(0xFEA6)
#define H8S_IO_TCNT5_L		H8S_IO(0xFEA7)
#define H8S_IO_TGR5A_H		H8S_IO(0xFEA8)
#define H8S_IO_TGR5A_L		H8S_IO(0xFEA9)
#define H8S_IO_TGR5B_H		H8S_IO(0xFEAA)
#define H8S_IO_TGR5B_L		H8S_IO(0xFEAB)
// DMA
#define H8S_IO_MAR1AH  H8S_IO(0xFEF0)
#define H8S_IO_MAR1AL  H8S_IO(0xFEF2)
#define H8S_IO_ETCR1A  H8S_IO(0xFEF6)
#define H8S_IO_MAR1BH  H8S_IO(0xFEF8)
#define H8S_IO_MAR1BL  H8S_IO(0xFEFA)
#define H8S_IO_ETCR1B  H8S_IO(0xFEFE)
#define H8S_IO_DMACR0A H8S_IO(0xFF02)
#define H8S_IO_DMACR0B H8S_IO(0xFF03)
#define H8S_IO_DMACR1A H8S_IO(0xFF04)
#define H8S_IO_DMACR1B H8S_IO(0xFF05)
#define H8S_IO_DMABCRH H8S_IO(0xFF06)
#define H8S_IO_DMABCRL H8S_IO(0xFF07)

#define H8S_IO_ADCSR   H8S_IO(0xFFA0)

///////////
// PORTS //
///////////

#define H8S_P1_TIOCB2 0x80
#define H8S_P1_TIOCA2 0x40
#define H8S_P1_TIOCB1 0x20
#define H8S_P1_TIOCA1 0x10
#define H8S_P1_TIOCD0 0x08
#define H8S_P1_TIOCC0 0x04
#define H8S_P1_TIOCB0 0x02
#define H8S_P1_TIOCA0 0x01

#define H8S_P3_SCK1 0x20
#define H8S_P3_SCK0 0x10
#define H8S_P3_RXD1 0x08
#define H8S_P3_RXD0 0x04
#define H8S_P3_TXD1 0x02
#define H8S_P3_TXD0 0x01

#define H8S_P5_SCK2 0x04
#define H8S_P5_RXD2 0x02
#define H8S_P5_TXD2 0x01

#define H8S_PF_PF6 0x40
#define H8S_PF_PF2 0x04
#define H8S_PF_PF1 0x02
#define H8S_PF_PF0 0x01

///////////////
// SCI 0/1/2 //
///////////////

#define H8S_SSR_TDRE 0x80 /* transmit data register empty */
#define H8S_SSR_RDRF 0x40 /* receive data register full */
#define H8S_SSR_ORER 0x20 /* overrun error */
#define H8S_SSR_FER  0x10 /* framing error */
#define H8S_SSR_PER  0x08 /* parity error */
#define H8S_SSR_TEND 0x04 /* transmit end */
#define H8S_SSR_MPB  0x02 /* multiprocessor bit */
#define H8S_SSR_MPBT 0x01 /* multiprocessor bit transfer */

#define H8S_SCR_TIE  0x80 /* transmit interrupt enable */
#define H8S_SCR_RIE  0x40 /* receive interrupt enable */
#define H8S_SCR_TE   0x20 /* transmit enable */
#define H8S_SCR_RE   0x10 /* receive enable */
#define H8S_SCR_MPIE 0x08 /* multiprocessor interrupt enable */
#define H8S_SCR_TEIE 0x04 /* transmit end interrupt enable */
#define H8S_SCR_CKE1 0x02 /* clock enable 1 */
#define H8S_SCR_CKE0 0x01 /* clock enable 0 */

////////////////
// INTERRUPTS //
////////////////

#define H8S_INT_NMI     0x07
#define H8S_INT_IRQ0    0x10
#define H8S_INT_IRQ1    0x11
#define H8S_INT_IRQ2    0x12
#define H8S_INT_IRQ3    0x13
#define H8S_INT_IRQ4    0x14
#define H8S_INT_IRQ5    0x15
#define H8S_INT_IRQ6    0x16
#define H8S_INT_IRQ7    0x17
#define H8S_INT_SWDTEND 0x18
#define H8S_INT_WOVI    0x19
#define H8S_INT_ADI     0x1C
#define H8S_INT_TGI0A   0x20
#define H8S_INT_TGI0B   0x21
#define H8S_INT_TGI0C   0x22
#define H8S_INT_TGI0D   0x23
#define H8S_INT_TCI0V   0x24
#define H8S_INT_TGI1A   0x28
#define H8S_INT_TGI1B   0x29
#define H8S_INT_TCI1V   0x2A
#define H8S_INT_TCI1U   0x2B
#define H8S_INT_TGI2A   0x2C
#define H8S_INT_TGI2B   0x2D
#define H8S_INT_TCI2V   0x2E
#define H8S_INT_TCI2U   0x2F
#define H8S_INT_CMIA0   0x40
#define H8S_INT_CMIB0   0x41
#define H8S_INT_OVI0    0x42
#define H8S_INT_CMIA1   0x44
#define H8S_INT_CMIB1   0x45
#define H8S_INT_OVI1    0x46
#define H8S_INT_ERI0    0x50
#define H8S_INT_RXI0    0x51
#define H8S_INT_TXI0    0x52
#define H8S_INT_TEI0    0x53
#define H8S_INT_ERI1    0x54
#define H8S_INT_RXI1    0x55
#define H8S_INT_TXI1    0x56
#define H8S_INT_TEI1    0x57
#define H8S_INT_ERI2    0x58
#define H8S_INT_RXI2    0x59
#define H8S_INT_TXI2    0x5A
#define H8S_INT_TEI2    0x5B

#define H8S_INT_TGI3A	48
#define H8S_INT_TGI3B	49
#define H8S_INT_TGI3C	50
#define H8S_INT_TGI3D	51
#define H8S_INT_TCI3V	52
#define H8S_INT_TGI4A	56
#define H8S_INT_TGI4B	57
#define H8S_INT_TCI4V	58
#define H8S_INT_TCI4U	59
#define H8S_INT_TGI5A	60
#define H8S_INT_TGI5B	61
#define H8S_INT_TCI5V	62
#define H8S_INT_TCI5U	63

DECLARE_LEGACY_CPU_DEVICE(H83002, h8_3002);
DECLARE_LEGACY_CPU_DEVICE(H83007, h8_3007);
DECLARE_LEGACY_CPU_DEVICE(H83044, h8_3044);
DECLARE_LEGACY_CPU_DEVICE(H83334, h8_3334);

DECLARE_LEGACY_CPU_DEVICE(H8S2241, h8s_2241);
DECLARE_LEGACY_CPU_DEVICE(H8S2246, h8s_2246);
DECLARE_LEGACY_CPU_DEVICE(H8S2323, h8s_2323);
DECLARE_LEGACY_CPU_DEVICE(H8S2394, h8s_2394);
DECLARE_LEGACY_CPU_DEVICE(H8S2655, h8s_2655);

#endif /* __H8SERIES_H__ */