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
|
#pragma once
#ifndef __UPD7810_H__
#define __UPD7810_H__
#include "cpuintrf.h"
/*
all types have internal ram at 0xff00-0xffff
7810
7811 (4kbyte),7812(8),7814(16) have internal rom at 0x0000
*/
// unfortunatly memory configuration differs with internal rom size
typedef enum
{
TYPE_7801,
TYPE_78C05,
TYPE_78C06,
TYPE_7810,
TYPE_7810_GAMEMASTER, // a few modifications until internal rom dumped
TYPE_7807
// TYPE_78C10, // stop instruction added
// TYPE_78IV,
// TYPE_78K0,
// TYPE_78K0S
// millions of subtypes
} UPD7810_TYPE;
/* Supply an instance of this function in your driver code:
* It will be called whenever an output signal changes or a new
* input line state is to be sampled.
*/
typedef int (*upd7810_io_callback)(int ioline, int state);
// use it as reset parameter in the Machine struct
typedef struct {
UPD7810_TYPE type;
upd7810_io_callback io_callback;
} UPD7810_CONFIG;
enum
{
UPD7810_PC=1, UPD7810_SP, UPD7810_PSW,
UPD7810_EA, UPD7810_V, UPD7810_A, UPD7810_VA,
UPD7810_BC, UPD7810_B, UPD7810_C, UPD7810_DE, UPD7810_D, UPD7810_E, UPD7810_HL, UPD7810_H, UPD7810_L,
UPD7810_EA2, UPD7810_V2, UPD7810_A2, UPD7810_VA2,
UPD7810_BC2, UPD7810_B2, UPD7810_C2, UPD7810_DE2, UPD7810_D2, UPD7810_E2, UPD7810_HL2, UPD7810_H2, UPD7810_L2,
UPD7810_CNT0, UPD7810_CNT1, UPD7810_TM0, UPD7810_TM1, UPD7810_ECNT, UPD7810_ECPT, UPD7810_ETM0, UPD7810_ETM1,
UPD7810_MA, UPD7810_MB, UPD7810_MCC, UPD7810_MC, UPD7810_MM, UPD7810_MF,
UPD7810_TMM, UPD7810_ETMM, UPD7810_EOM, UPD7810_SML, UPD7810_SMH,
UPD7810_ANM, UPD7810_MKL, UPD7810_MKH, UPD7810_ZCM,
UPD7810_TXB, UPD7810_RXB, UPD7810_CR0, UPD7810_CR1, UPD7810_CR2, UPD7810_CR3,
UPD7810_TXD, UPD7810_RXD, UPD7810_SCK, UPD7810_TI, UPD7810_TO, UPD7810_CI, UPD7810_CO0, UPD7810_CO1
};
/* port numbers for PA,PB,PC,PD and PF */
enum
{
UPD7810_PORTA, UPD7810_PORTB, UPD7810_PORTC, UPD7810_PORTD, UPD7810_PORTF
};
enum
{
UPD7807_PORTA, UPD7807_PORTB, UPD7807_PORTC, UPD7807_PORTD, UPD7807_PORTF,
UPD7807_PORTT
};
/* IRQ lines */
#define UPD7810_INTF1 0
#define UPD7810_INTF2 1
#define UPD7810_INTFE1 4
CPU_GET_INFO( upd7810 );
CPU_GET_INFO( upd7807 );
CPU_GET_INFO( upd7801 );
CPU_GET_INFO( upd78c05 );
CPU_GET_INFO( upd78c06 );
typedef struct {
PAIR ppc; /* previous program counter */
PAIR pc; /* program counter */
PAIR sp; /* stack pointer */
UINT8 op; /* opcode */
UINT8 op2; /* opcode part 2 */
UINT8 iff; /* interrupt enable flip flop */
UINT8 psw; /* processor status word */
PAIR ea; /* extended accumulator */
PAIR va; /* accumulator + vector register */
PAIR bc; /* 8bit B and C registers / 16bit BC register */
PAIR de; /* 8bit D and E registers / 16bit DE register */
PAIR hl; /* 8bit H and L registers / 16bit HL register */
PAIR ea2; /* alternate register set */
PAIR va2;
PAIR bc2;
PAIR de2;
PAIR hl2;
PAIR cnt; /* 8 bit timer counter */
PAIR tm; /* 8 bit timer 0/1 comparator inputs */
PAIR ecnt; /* timer counter register / capture register */
PAIR etm; /* timer 0/1 comparator inputs */
UINT8 ma; /* port A input or output mask */
UINT8 mb; /* port B input or output mask */
UINT8 mcc; /* port C control/port select */
UINT8 mc; /* port C input or output mask */
UINT8 mm; /* memory mapping */
UINT8 mf; /* port F input or output mask */
UINT8 tmm; /* timer 0 and timer 1 operating parameters */
UINT8 etmm; /* 16-bit multifunction timer/event counter */
UINT8 eom; /* 16-bit timer/event counter output control */
UINT8 sml; /* serial interface parameters low */
UINT8 smh; /* -"- high */
UINT8 anm; /* analog to digital converter operating parameters */
UINT8 mkl; /* interrupt mask low */
UINT8 mkh; /* -"- high */
UINT8 zcm; /* bias circuitry for ac zero-cross detection */
UINT8 pa_in; /* port A,B,C,D,F inputs */
UINT8 pb_in;
UINT8 pc_in;
UINT8 pd_in;
UINT8 pf_in;
UINT8 pa_out; /* port A,B,C,D,F outputs */
UINT8 pb_out;
UINT8 pc_out;
UINT8 pd_out;
UINT8 pf_out;
UINT8 cr0; /* analog digital conversion register 0 */
UINT8 cr1; /* analog digital conversion register 1 */
UINT8 cr2; /* analog digital conversion register 2 */
UINT8 cr3; /* analog digital conversion register 3 */
UINT8 txb; /* transmitter buffer */
UINT8 rxb; /* receiver buffer */
UINT8 txd; /* port C control line states */
UINT8 rxd;
UINT8 sck;
UINT8 ti;
UINT8 to;
UINT8 ci;
UINT8 co0;
UINT8 co1;
UINT16 irr; /* interrupt request register */
UINT16 itf; /* interrupt test flag register */
/* internal helper variables */
UINT16 txs; /* transmitter shift register */
UINT16 rxs; /* receiver shift register */
UINT8 txcnt; /* transmitter shift register bit count */
UINT8 rxcnt; /* receiver shift register bit count */
UINT8 txbuf; /* transmitter buffer was written */
INT32 ovc0; /* overflow counter for timer 0 (for clock div 12/384) */
INT32 ovc1; /* overflow counter for timer 0 (for clock div 12/384) */
INT32 ovce; /* overflow counter for ecnt */
INT32 ovcf; /* overflow counter for fixed clock div 3 mode */
INT32 ovcs; /* overflow counter for serial I/O */
UINT8 edges; /* rising/falling edge flag for serial I/O */
const struct opcode_s *opXX; /* opcode table */
const struct opcode_s *op48;
const struct opcode_s *op4C;
const struct opcode_s *op4D;
const struct opcode_s *op60;
const struct opcode_s *op64;
const struct opcode_s *op70;
const struct opcode_s *op74;
void (*handle_timers)(int cycles);
UPD7810_CONFIG config;
cpu_irq_callback irq_callback;
const device_config *device;
} UPD7810;
CPU_DISASSEMBLE( upd7810 );
CPU_DISASSEMBLE( upd7807 );
CPU_DISASSEMBLE( upd7801 );
CPU_DISASSEMBLE( upd78c05 );
#endif /* __UPD7810_H__ */
|