OSDN Git Service

[VM] Add PC-8001/mk2/8801/mk2.
[csp-qt/common_source_project-fm7.git] / source / src / vm / upd7801.cpp
1 /*
2         Skelton for retropc emulator
3
4         Origin : MESS UPD7810 Core
5         Author : Takeda.Toshiya
6         Date   : 2006.08.21 -
7
8         [ uPD7801 ]
9 */
10
11 #include "upd7801.h"
12 //#ifdef USE_DEBUGGER
13 #include "debugger.h"
14 //#endif
15
16 #define PRESCALER       16
17
18 #define VA      regs[0].w.l
19 #define BC      regs[1].w.l
20 #define DE      regs[2].w.l
21 #define HL      regs[3].w.l
22
23 #define _V      regs[0].b.h
24 #define _A      regs[0].b.l
25 #define _B      regs[1].b.h
26 #define _C      regs[1].b.l
27 #define _D      regs[2].b.h
28 #define _E      regs[2].b.l
29 #define _H      regs[3].b.h
30 #define _L      regs[3].b.l
31
32 #define altVA   regs[4].w.l
33 #define altBC   regs[5].w.l
34 #define altDE   regs[6].w.l
35 #define altHL   regs[7].w.l
36
37 #define altV    regs[4].b.h
38 #define altA    regs[4].b.l
39 #define altB    regs[5].b.h
40 #define altC    regs[5].b.l
41 #define altD    regs[6].b.h
42 #define altE    regs[6].b.l
43 #define altH    regs[7].b.h
44 #define altL    regs[7].b.l
45
46 #define F_CY    0x01
47 #define F_L0    0x04
48 #define F_L1    0x08
49 #define F_HC    0x10
50 #define F_SK    0x20
51 #define F_Z     0x40
52
53 #define INTF0   0x01
54 #define INTFT   0x02
55 #define INTF1   0x04
56 #define INTF2   0x08
57 #define INTFS   0x10
58
59 #define SIO_DISABLED    (!(MC & 4) && (IN8(P_C) & 4))
60 #define SIO_EXTCLOCK    (MC & 0x80)
61
62 static const uint8_t irq_bits[5] = {
63         INTF0, INTFT, INTF1, INTF2, INTFS
64 };
65
66 static const uint16_t irq_addr[5] = {
67         0x0004, 0x0008, 0x0010, 0x0020, 0x0040
68 };
69
70 typedef struct {
71         int oplen;      // bytes of opecode
72         int clock;      // clock
73 } op_t;
74
75 static const op_t op[256] = {
76         {1, 4}, {1, 6}, {1, 7}, {1, 7}, {3,10}, {3,16}, {1, 4}, {2, 7}, {1,11}, {1, 4}, {1, 4}, {1, 4}, {1, 4}, {1, 4}, {1, 4}, {1, 4},
77         {1, 4}, {1, 4}, {1, 7}, {1, 7}, {3,10}, {3,16}, {2, 7}, {2, 7}, {1,11}, {1, 4}, {1, 4}, {1, 4}, {1, 4}, {1, 4}, {1, 4}, {1, 4},
78         {2,13}, {1,19}, {1, 7}, {1, 7}, {3,10}, {3,13}, {2, 7}, {2, 7}, {2,10}, {1, 7}, {1, 7}, {1, 7}, {1, 7}, {1, 7}, {1, 7}, {1, 7},
79         {2,13}, {1,13}, {1, 7}, {1, 7}, {3,10}, {3,13}, {2, 7}, {2, 7}, {2,10}, {1, 7}, {1, 7}, {1, 7}, {1, 7}, {1, 7}, {1, 7}, {1, 7},
80         {1, 4}, {1, 4}, {1, 4}, {1, 4}, {3,16}, {3,13}, {2, 7}, {2, 7}, {0, 0}, {2,10}, {2,10}, {2,10}, {0, 0}, {0, 0}, {2,17}, {2,17},
81         {1, 4}, {1, 4}, {1, 4}, {1, 4}, {3,10}, {3,13}, {2, 7}, {2, 7}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
82         {0, 0}, {1, 4}, {1,15}, {1,13}, {0, 0}, {3,13}, {2, 7}, {2, 7}, {2, 7}, {2, 7}, {2, 7}, {2, 7}, {2, 7}, {2, 7}, {2, 7}, {2, 7},
83         {0, 0}, {3,13}, {1,19}, {1, 4}, {0, 0}, {3,13}, {2, 7}, {2, 7}, {2,16}, {2,16}, {2,16}, {2,16}, {2,16}, {2,16}, {2,16}, {2,16},
84         {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19},
85         {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19},
86         {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19},
87         {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19}, {1,19},
88         {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13},
89         {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13},
90         {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13},
91         {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}, {1,13}
92
93 };
94 static const op_t op48[256] = {
95         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2,17}, {2,15},
96         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2,17}, {2,15},
97         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2,11}, {2,11}, {2,17}, {2,15},
98         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2,17}, {2,17}, {2, 8}, {2, 8}, {2,11}, {2, 8}, {2,17}, {2,15},
99         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
100         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
101         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
102         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
103         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
104         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
105         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
106         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
107         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
108         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
109         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
110         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}
111 };
112 static const op_t op4c[256] = {
113         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
114         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
115         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
116         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
117         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
118         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
119         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
120         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
121         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
122         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
123         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
124         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
125         {2,10}, {2,10}, {2,10}, {2,10}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2,10}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
126         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
127         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
128         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}
129 };
130 static const op_t op4d[256] = {
131         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
132         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
133         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
134         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
135         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
136         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
137         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
138         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
139         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
140         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
141         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
142         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10},
143         {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2,10}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
144         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
145         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
146         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}
147 };
148 static const op_t op60[256] = {
149         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
150         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
151         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
152         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
153         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
154         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
155         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
156         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
157         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
158         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
159         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
160         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
161         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
162         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
163         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
164         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}
165 };
166 static const op_t op64[256] = {
167         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11},
168         {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11},
169         {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11},
170         {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11},
171         {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11},
172         {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11},
173         {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11},
174         {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11}, {3,11},
175         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
176         {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
177         {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {3,14}, {3,14}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
178         {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {3,14}, {3,14}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
179         {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {3,14}, {3,14}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
180         {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {3,14}, {3,14}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
181         {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {3,14}, {3,14}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
182         {3,17}, {3,17}, {3,17}, {3,17}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {3,14}, {3,14}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}
183 };
184 static const op_t op70[256] = {
185         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {4,20}, {4,20},
186         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {4,20}, {4,20},
187         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {4,20}, {4,20},
188         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {4,20}, {4,20},
189         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
190         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
191         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {4,17}, {4,17}, {4,17}, {4,17}, {4,17}, {4,17}, {4,17}, {4,17},
192         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {4,17}, {4,17}, {4,17}, {4,17}, {4,17}, {4,17}, {4,17}, {4,17},
193         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11},
194         {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11},
195         {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11},
196         {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11},
197         {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11},
198         {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11},
199         {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11},
200         {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2, 8}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}, {2,11}
201 };
202 static const op_t op74[256] = {
203         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
204         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
205         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
206         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
207         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
208         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
209         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
210         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
211         {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
212         {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
213         {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
214         {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
215         {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
216         {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
217         {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8},
218         {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {3,14}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}, {2, 8}
219 };
220
221 // flag control
222
223 #define ZHC_ADD(a, b, c) { \
224         if(a) { \
225                 PSW &= ~F_Z; \
226         } else { \
227                 PSW |= F_Z; \
228         } \
229         if(a == b) { \
230                 PSW = (PSW & ~F_CY) | (c); \
231         } else if(a < b) { \
232                 PSW |= F_CY; \
233         } else { \
234                 PSW &= ~F_CY; \
235         } \
236         if((a & 15) < (b & 15)) { \
237                 PSW |= F_HC; \
238         } else { \
239                 PSW &= ~F_HC; \
240         } \
241 }
242 #define ZHC_SUB(a, b, c) { \
243         if(a) { \
244                 PSW &= ~F_Z; \
245         } else { \
246                 PSW |= F_Z; \
247         } \
248         if(a == b) { \
249                 PSW = (PSW & ~F_CY) | (c); \
250         } else if(a > b) { \
251                 PSW |= F_CY; \
252         } else { \
253                 PSW &= ~F_CY; \
254         } \
255         if((a & 15) > (b & 15)) { \
256                 PSW |= F_HC; \
257         } else { \
258                 PSW &= ~F_HC; \
259         } \
260 }
261 #define SET_Z(n) { \
262         if(n) { \
263                 PSW &= ~F_Z; \
264         } else { \
265                 PSW |= F_Z; \
266         } \
267 }
268 #define SKIP_CY { \
269         if(PSW & F_CY) { \
270                 PSW |= F_SK; \
271         } \
272 }
273 #define SKIP_NC { \
274         if(!(PSW & F_CY)) { \
275                 PSW |= F_SK; \
276         } \
277 }
278 #define SKIP_Z { \
279         if(PSW & F_Z) { \
280                 PSW |= F_SK; \
281         } \
282 }
283 #define SKIP_NZ { \
284         if(!(PSW & F_Z)) { \
285                 PSW |= F_SK; \
286         } \
287 }
288
289 // memory
290
291 inline uint8_t UPD7801::RM8(uint16_t addr)
292 {
293 //#ifdef UPD7801_MEMORY_WAIT
294         if(__UPD7801_MEMORY_WAIT) {
295                 int wait;
296                 uint8_t val = d_mem->read_data8w(addr, &wait);
297                 period += wait;
298                 return val;
299         } else {
300 //#else
301                 return d_mem->read_data8(addr);
302         }
303 //#endif
304 }
305
306 inline void UPD7801::WM8(uint16_t addr, uint8_t val)
307 {
308 //#ifdef UPD7801_MEMORY_WAIT
309         if(__UPD7801_MEMORY_WAIT) {
310                 int wait;
311                 d_mem->write_data8w(addr, val, &wait);
312                 period += wait;
313         } else {
314 //#else
315                 d_mem->write_data8(addr, val);
316         }
317 //#endif
318 }
319
320 inline uint16_t UPD7801::RM16(uint16_t addr)
321 {
322 //#ifdef UPD7801_MEMORY_WAIT
323         if(__UPD7801_MEMORY_WAIT) {
324                 int wait;
325                 uint16_t val = d_mem->read_data16w(addr, &wait);
326                 period += wait;
327                 return val;
328         } else {
329 //#else
330                 return d_mem->read_data16(addr);
331         }
332 //#endif
333 }
334
335 inline void UPD7801::WM16(uint16_t addr, uint16_t val)
336 {
337 //#ifdef UPD7801_MEMORY_WAIT
338         if(__UPD7801_MEMORY_WAIT) {
339                 int wait;
340                 d_mem->write_data16w(addr, val, &wait);
341                 period += wait;
342         } else {
343 //#else
344                 d_mem->write_data16(addr, val);
345         }
346 //#endif
347 }
348
349 inline uint8_t UPD7801::FETCH8()
350 {
351 //#ifdef UPD7801_MEMORY_WAIT
352         if(__UPD7801_MEMORY_WAIT) {
353                 int wait;
354                 uint8_t val = d_mem->read_data8w(PC++, &wait);
355                 period += wait;
356                 return val;
357         } else {
358 //#else
359                 return d_mem->read_data8(PC++);
360         }
361 //#endif
362 }
363
364 inline uint16_t UPD7801::FETCH16()
365 {
366         uint16_t val;
367 //#ifdef UPD7801_MEMORY_WAIT
368         if(__UPD7801_MEMORY_WAIT) {
369                 int wait;
370                 val = d_mem->read_data16w(PC, &wait);
371                 period += wait;
372         } else {
373 //#else
374                 val = d_mem->read_data16(PC);
375         }
376 //#endif
377         PC += 2;
378         return val;
379 }
380
381 inline uint16_t UPD7801::FETCHWA()
382 {
383 //#ifdef UPD7801_MEMORY_WAIT
384         if(__UPD7801_MEMORY_WAIT) {
385                 int wait;
386                 uint16_t val = (_V << 8) | d_mem->read_data8w(PC++, &wait);
387                 period += wait;
388                 return val;
389         } else {
390 //#else
391                 return (_V << 8) | d_mem->read_data8(PC++);
392         }
393 //#endif
394 }
395
396 inline uint8_t UPD7801::POP8()
397 {
398 //#ifdef UPD7801_MEMORY_WAIT
399         if(__UPD7801_MEMORY_WAIT) {
400                 int wait;
401                 uint8_t val = d_mem->read_data8w(SP++, &wait);
402                 period += wait;
403                 return val;
404         } else {
405 //#else
406                 return d_mem->read_data8(SP++);
407         }
408 //#endif
409 }
410
411 inline void UPD7801::PUSH8(uint8_t val)
412 {
413 //#ifdef UPD7801_MEMORY_WAIT
414         if(__UPD7801_MEMORY_WAIT) {
415                 int wait;
416                 d_mem->write_data8w(--SP, val, &wait);
417                 period += wait;
418         } else {
419 //#else
420                 d_mem->write_data8(--SP, val);
421         }
422 //#endif
423 }
424
425 inline uint16_t UPD7801::POP16()
426 {
427         uint16_t val;
428 //#ifdef UPD7801_MEMORY_WAIT
429         if(__UPD7801_MEMORY_WAIT) {
430                 int wait;
431                 val = d_mem->read_data16w(SP, &wait);
432                 period += wait;
433         } else {
434 //#else
435                 val = d_mem->read_data16(SP);
436         }
437 //#endif
438         SP += 2;
439         return val;
440 }
441
442 inline void UPD7801::PUSH16(uint16_t val)
443 {
444         SP -= 2;
445 //#ifdef UPD7801_MEMORY_WAIT
446         if(__UPD7801_MEMORY_WAIT) {
447                 int wait;
448                 d_mem->write_data16w(SP, val, &wait);
449                 period += wait;
450         } else {
451 //#else
452                 d_mem->write_data16(SP, val);
453         }
454 //#endif
455 }
456
457 // io
458
459 inline uint8_t UPD7801::IN8(int port)
460 {
461         if(port == P_C) {
462                 return (d_io->read_io8(P_C) & 0x87) | (PORTC & 0x78);
463         }
464         return d_io->read_io8(port);
465 }
466
467 inline void UPD7801::OUT8(int port, uint8_t val)
468 {
469         if(port == P_C) {
470                 PORTC = val;
471         }
472         d_io->write_io8(port, val);
473 }
474
475 // IOM : 0x20 = I/O, 0 = MEMORY
476 inline void UPD7801::UPDATE_PORTC(uint8_t IOM)
477 {
478         uint8_t MC2 = (MC & 0x7f) | ((MC & 0x40) << 1);
479         d_io->write_io8(P_C, (PORTC & MC2) | ((SAK | TO | IOM | HLDA) & ~MC2));
480 }
481
482 // opecode
483
484 #define ACI(r) { \
485         uint8_t tmp = r + FETCH8() + (PSW & F_CY); \
486         ZHC_ADD(tmp, r, (PSW & F_CY)); \
487         r = tmp; \
488 }
489 #define ACI_IO(p) { \
490         uint8_t old = IN8(p); \
491         uint8_t tmp = old + FETCH8() + (PSW & F_CY); \
492         ZHC_ADD(tmp, old, (PSW & F_CY)); \
493         OUT8(p, tmp); \
494 }
495 #define ADC(r, n) { \
496         uint8_t tmp = r + n + (PSW & F_CY); \
497         ZHC_ADD(tmp, r, (PSW & F_CY)); \
498         r = tmp; \
499 }
500 #define ADCW() { \
501         uint8_t tmp = _A + RM8(FETCHWA()) + (PSW & F_CY); \
502         ZHC_ADD(tmp, _A, (PSW & F_CY)); \
503         _A = tmp; \
504 }
505 #define ADCX(r) { \
506         uint8_t tmp = _A + RM8(r) + (PSW & F_CY); \
507         ZHC_ADD(tmp, _A, (PSW & F_CY)); \
508         _A = tmp; \
509 }
510 #define ADD(r, n) { \
511         uint8_t tmp = r + n; \
512         ZHC_ADD(tmp, r, 0); \
513         r = tmp; \
514 }
515 #define ADDNC(r, n) { \
516         uint8_t tmp = r + n; \
517         ZHC_ADD(tmp, r, 0); \
518         r = tmp; \
519         SKIP_NC; \
520 }
521 #define ADDNCW() { \
522         uint8_t tmp = _A + RM8(FETCHWA()); \
523         ZHC_ADD(tmp, _A, 0); \
524         _A = tmp; \
525         SKIP_NC; \
526 }
527 #define ADDNCX(r) { \
528         uint8_t tmp = _A + RM8(r); \
529         ZHC_ADD(tmp, _A, 0); \
530         _A = tmp; \
531         SKIP_NC; \
532 }
533 #define ADDW() { \
534         uint8_t tmp = _A + RM8(FETCHWA()); \
535         ZHC_ADD(tmp, _A, 0); \
536         _A = tmp; \
537 }
538 #define ADDX(r) { \
539         uint8_t tmp = _A + RM8(r); \
540         ZHC_ADD(tmp, _A, 0); \
541         _A = tmp; \
542 }
543 #define ADI(r) { \
544         uint8_t tmp = r + FETCH8(); \
545         ZHC_ADD(tmp, r, 0); \
546         r = tmp; \
547 }
548 #define ADI_IO(p) { \
549         uint8_t old = IN8(p); \
550         uint8_t tmp = old + FETCH8(); \
551         ZHC_ADD(tmp, old, 0); \
552         OUT8(p, tmp); \
553 }
554 #define ADINC(r) { \
555         uint8_t tmp = r + FETCH8(); \
556         ZHC_ADD(tmp, r, 0); \
557         r = tmp; \
558         SKIP_NC; \
559 }
560 #define ADINC_IO(p) { \
561         uint8_t old = IN8(p); \
562         uint8_t tmp = old + FETCH8(); \
563         ZHC_ADD(tmp, old, 0); \
564         OUT8(p, tmp); \
565         SKIP_NC; \
566 }
567 #define ANA(r, n) { \
568         r &= n; \
569         SET_Z(r); \
570 }
571 #define ANAW() { \
572         _A &= RM8(FETCHWA()); \
573         SET_Z(_A); \
574 }
575 #define ANAX(r) { \
576         _A &= RM8(r); \
577         SET_Z(_A); \
578 }
579 #define ANI(r) { \
580         r &= FETCH8(); \
581         SET_Z(r); \
582 }
583 #define ANI_IO(p) { \
584         uint8_t tmp = IN8(p) & FETCH8(); \
585         OUT8(p, tmp); \
586         SET_Z(tmp); \
587 }
588 #define ANIW() { \
589         uint16_t dst = FETCHWA(); \
590         uint8_t tmp = RM8(dst) & FETCH8(); \
591         WM8(dst, tmp); \
592         SET_Z(tmp); \
593 }
594 #define BIT(b) { \
595         if(RM8(FETCHWA()) & (1 << b)) { \
596                 PSW |= F_SK; \
597         } \
598 }
599 #define BLOCK() { \
600         WM8(DE++, RM8(HL++)); \
601         if(_C--) { \
602                 PSW &= ~F_CY; \
603                 PC--; \
604         } else { \
605                 PSW |= F_CY; \
606         } \
607 }
608 #define CALF(o) { \
609         uint16_t dst = 0x800 + ((o & 7) << 8) + FETCH8(); \
610         PUSH16(PC); \
611         PC = dst; \
612 }
613 #define CALL() { \
614         uint16_t dst = FETCH16(); \
615         PUSH16(PC); \
616         PC = dst; \
617 }
618 #define CALT(o) { \
619         uint16_t dst = RM16(0x80 + ((o & 0x3f) << 1)); \
620         PUSH16(PC); \
621         PC = dst; \
622 }
623 #define DAA() { \
624         uint8_t lo = _A & 0xf, hi = _A >> 4, diff = 0; \
625         if(lo <= 9 && !(PSW & F_HC)) { \
626                 diff = (hi >= 10 || (PSW & F_CY)) ? 0x60 : 0x00; \
627         } else if(lo >= 10 && !(PSW & F_HC)) { \
628                 diff = (hi >= 9 || (PSW & F_CY)) ? 0x66 : 0x06; \
629         } else if(lo <= 2 && (PSW & F_HC)) { \
630                 diff = (hi >= 10 || (PSW & F_CY)) ? 0x66 : 0x06; \
631         } \
632         _A += diff; \
633         if(_A) { \
634                 PSW &= ~F_Z; \
635         } else { \
636                 PSW |= F_Z; \
637         } \
638         if((PSW & F_CY) || (lo <= 9 ? hi >= 10 : hi >= 9)) { \
639                 PSW |= F_CY; \
640         } else { \
641                 PSW &= ~F_CY; \
642         } \
643         if(lo >= 10) { \
644                 PSW |= F_HC; \
645         } else { \
646                 PSW &= ~F_HC; \
647         } \
648 }
649 #define DCR(r) { \
650         uint8_t carry = PSW & F_CY; \
651         uint8_t tmp = r - 1; \
652         ZHC_SUB(tmp, r, 0); \
653         r = tmp; \
654         SKIP_CY; \
655         PSW = (PSW & ~F_CY) | carry; \
656 }
657 #define DCRW() { \
658         uint8_t carry = PSW & F_CY; \
659         uint16_t dst = FETCHWA(); \
660         uint8_t old = RM8(dst); \
661         uint8_t tmp = old - 1; \
662         ZHC_SUB(tmp, old, 0); \
663         WM8(dst, tmp); \
664         SKIP_CY; \
665         PSW = (PSW & ~F_CY) | carry; \
666 }
667 #define EQA(r, n) { \
668         uint8_t tmp = r - n; \
669         ZHC_SUB(tmp, r, 0); \
670         SKIP_Z; \
671 }
672 #define EQAW() { \
673         uint8_t tmp = _A - RM8(FETCHWA()); \
674         ZHC_SUB(tmp, _A, 0); \
675         SKIP_Z; \
676 }
677 #define EQAX(r) { \
678         uint8_t tmp = _A - RM8(r); \
679         ZHC_SUB(tmp, _A, 0); \
680         SKIP_Z; \
681 }
682 #define EQI(r) { \
683         uint8_t tmp = r - FETCH8(); \
684         ZHC_SUB(tmp, r, 0); \
685         SKIP_Z; \
686 }
687 #define EQI_IO(p) { \
688         uint8_t old = IN8(p); \
689         uint8_t tmp = old - FETCH8(); \
690         ZHC_SUB(tmp, old, 0); \
691         SKIP_Z; \
692 }
693 #define EQIW() { \
694         uint8_t old = RM8(FETCHWA()); \
695         uint8_t tmp = old - FETCH8(); \
696         ZHC_SUB(tmp, old, 0); \
697         SKIP_Z; \
698 }
699 #define EX() { \
700         uint16_t tmp; \
701         tmp = VA; VA = altVA; altVA = tmp; \
702 }
703 #define EXX() { \
704         uint16_t tmp; \
705         tmp = BC; BC = altBC; altBC = tmp; \
706         tmp = DE; DE = altDE; altDE = tmp; \
707         tmp = HL; HL = altHL; altHL = tmp; \
708 }
709 #define GTA(r, n) { \
710         uint8_t tmp = r - n - 1; \
711         ZHC_SUB(tmp, r, 1); \
712         SKIP_NC; \
713 }
714 #define GTAW() { \
715         uint8_t tmp = _A - RM8(FETCHWA()) - 1; \
716         ZHC_SUB(tmp, _A, 1); \
717         SKIP_NC; \
718 }
719 #define GTAX(r) { \
720         uint8_t tmp = _A - RM8(r) - 1; \
721         ZHC_SUB(tmp, _A, 1); \
722         SKIP_NC; \
723 }
724 #define GTI(r) { \
725         uint8_t tmp = r - FETCH8() - 1; \
726         ZHC_SUB(tmp, r, 1); \
727         SKIP_NC; \
728 }
729 #define GTI_IO(p) { \
730         uint8_t old = IN8(p); \
731         uint8_t tmp = old - FETCH8() - 1; \
732         ZHC_SUB(tmp, old, 1); \
733         SKIP_NC; \
734 }
735 #define GTIW() { \
736         uint8_t old = RM8(FETCHWA()); \
737         uint8_t tmp = old - FETCH8() - 1; \
738         ZHC_SUB(tmp, old, 1); \
739         SKIP_NC; \
740 }
741 #define INR(r) { \
742         uint8_t carry = PSW & F_CY; \
743         uint8_t tmp = r + 1; \
744         ZHC_ADD(tmp, r, 0); \
745         r = tmp; \
746         SKIP_CY; \
747         PSW = (PSW & ~F_CY) | carry; \
748 }
749 #define INRW() { \
750         uint8_t carry = PSW & F_CY; \
751         uint16_t dst = FETCHWA(); \
752         uint8_t old = RM8(dst); \
753         uint8_t tmp = old + 1; \
754         ZHC_ADD(tmp, old, 0); \
755         WM8(dst, tmp); \
756         SKIP_CY; \
757         PSW = (PSW & ~F_CY) | carry; \
758 }
759 #define JRE(o) { \
760         uint8_t tmp = FETCH8(); \
761         if(o & 1) { \
762                 PC -= 256 - tmp; \
763         } else { \
764                 PC += tmp; \
765         } \
766 }
767 #define LTA(r, n) { \
768         uint8_t tmp = r - n; \
769         ZHC_SUB(tmp, r, 0); \
770         SKIP_CY; \
771 }
772 #define LTAW() { \
773         uint8_t tmp = _A - RM8(FETCHWA()); \
774         ZHC_SUB(tmp, _A, 0); \
775         SKIP_CY; \
776 }
777 #define LTAX(r) { \
778         uint8_t tmp = _A - RM8(r); \
779         ZHC_SUB(tmp, _A, 0); \
780         SKIP_CY; \
781 }
782 #define LTI(r) { \
783         uint8_t tmp = r - FETCH8(); \
784         ZHC_SUB(tmp, r, 0); \
785         SKIP_CY; \
786 }
787 #define LTI_IO(p) { \
788         uint8_t old = IN8(p); \
789         uint8_t tmp = old - FETCH8(); \
790         ZHC_SUB(tmp, old, 0); \
791         SKIP_CY; \
792 }
793 #define LTIW() { \
794         uint8_t old = RM8(FETCHWA()); \
795         uint8_t tmp = old - FETCH8(); \
796         ZHC_SUB(tmp, old, 0); \
797         SKIP_CY; \
798 }
799 #define MVIW() { \
800         uint16_t dst = FETCHWA(); \
801         WM8(dst, FETCH8()); \
802 }
803 #define NEA(r, n) { \
804         uint8_t tmp = r - n; \
805         ZHC_SUB(tmp, r, 0); \
806         SKIP_NZ; \
807 }
808 #define NEAW() { \
809         uint8_t tmp = _A - RM8(FETCHWA()); \
810         ZHC_SUB(tmp, _A, 0); \
811         SKIP_NZ; \
812 }
813 #define NEAX(r) { \
814         uint8_t tmp = _A - RM8(r); \
815         ZHC_SUB(tmp, _A, 0); \
816         SKIP_NZ; \
817 }
818 #define NEI(r) { \
819         uint8_t tmp = r - FETCH8(); \
820         ZHC_SUB(tmp, r, 0); \
821         SKIP_NZ; \
822 }
823 #define NEI_IO(p) { \
824         uint8_t old = IN8(p); \
825         uint8_t tmp = old - FETCH8(); \
826         ZHC_SUB(tmp, old, 0); \
827         SKIP_NZ; \
828 }
829 #define NEIW() { \
830         uint8_t old = RM8(FETCHWA()); \
831         uint8_t tmp = old - FETCH8(); \
832         ZHC_SUB(tmp, old, 0); \
833         SKIP_NZ; \
834 }
835 #define OFFA(r, n) { \
836         if(r & n) { \
837                 PSW &= ~F_Z; \
838         } else { \
839                 PSW |= F_Z | F_SK; \
840         } \
841 }
842 #define OFFAW() { \
843         if(_A & RM8(FETCHWA())) { \
844                 PSW &= ~F_Z; \
845         } else { \
846                 PSW |= F_Z | F_SK; \
847         } \
848 }
849 #define OFFAX(r) { \
850         if(_A & RM8(r)) { \
851                 PSW &= ~F_Z; \
852         } else { \
853                 PSW |= F_Z | F_SK; \
854         } \
855 }
856 #define OFFI(r) { \
857         if(r & FETCH8()) { \
858                 PSW &= ~F_Z; \
859         } else { \
860                 PSW |= F_Z | F_SK; \
861         } \
862 }
863 #define OFFI_IO(p) { \
864         if(IN8(p) & FETCH8()) { \
865                 PSW &= ~F_Z; \
866         } else { \
867                 PSW |= F_Z | F_SK; \
868         } \
869 }
870 #define OFFIW() { \
871         uint8_t tmp = RM8(FETCHWA()); \
872         if(tmp & FETCH8()) { \
873                 PSW &= ~F_Z; \
874         } else { \
875                 PSW |= F_Z | F_SK; \
876         } \
877 }
878 #define ONA(r, n) { \
879         if(r & n) { \
880                 PSW = (PSW & ~F_Z) | F_SK; \
881         } else { \
882                 PSW |= F_Z; \
883         } \
884 }
885 #define ONAW() { \
886         if(_A & RM8(FETCHWA())) { \
887                 PSW = (PSW & ~F_Z) | F_SK; \
888         } else { \
889                 PSW |= F_Z; \
890         } \
891 }
892 #define ONAX(r) { \
893         if(_A & RM8(r)) { \
894                 PSW = (PSW & ~F_Z) | F_SK; \
895         } else { \
896                 PSW |= F_Z; \
897         } \
898 }
899 #define ONI(r) { \
900         if(r & FETCH8()) { \
901                 PSW = (PSW & ~F_Z) | F_SK; \
902         } else { \
903                 PSW |= F_Z; \
904         } \
905 }
906 #define ONI_IO(p) { \
907         if(IN8(p) & FETCH8()) { \
908                 PSW = (PSW & ~F_Z) | F_SK; \
909         } else { \
910                 PSW |= F_Z; \
911         } \
912 }
913 #define ONIW() { \
914         uint8_t tmp = RM8(FETCHWA()); \
915         if(tmp & FETCH8()) { \
916                 PSW = (PSW & ~F_Z) | F_SK; \
917         } else { \
918                 PSW |= F_Z; \
919         } \
920 }
921 #define ORA(r, n) { \
922         r |= n; \
923         SET_Z(r); \
924 }
925 #define ORAW() { \
926         _A |= RM8(FETCHWA()); \
927         SET_Z(_A); \
928 }
929 #define ORAX(r) { \
930         _A |= RM8(r); \
931         SET_Z(_A); \
932 }
933 #define ORI(r) { \
934         r |= FETCH8(); \
935         SET_Z(r); \
936 }
937 #define ORI_IO(p) { \
938         uint8_t tmp = IN8(p) | FETCH8(); \
939         OUT8(p, tmp); \
940         SET_Z(tmp); \
941 }
942 #define ORIW() { \
943         uint16_t dst = FETCHWA(); \
944         uint8_t tmp = RM8(dst) | FETCH8(); \
945         WM8(dst, tmp); \
946         SET_Z(tmp); \
947 }
948 #define PEN() { \
949 }
950 #define PER() { \
951 }
952 #define PEX() { \
953 }
954 #define RLD() { \
955         uint8_t old = RM8(HL); \
956         uint8_t tmp = (old << 4) | (_A & 0x0f); \
957         _A = (_A & 0xf0) | (old >> 4); \
958         WM8(HL, tmp); \
959 }
960 #define RLL(r) { \
961         uint8_t carry = PSW & F_CY; \
962         PSW = (PSW & ~F_CY) | ((r >> 7) & F_CY); \
963         r = (r << 1) | carry; \
964 }
965 #define RLR(r) { \
966         uint8_t carry = (PSW & F_CY) << 7; \
967         PSW = (PSW & ~F_CY) | (r & F_CY); \
968         r = (r >> 1) | carry; \
969 }
970 #define RRD() { \
971         uint8_t old = RM8(HL); \
972         uint8_t tmp = (_A << 4) | (old >> 4); \
973         _A = (_A & 0xf0) | (old & 0x0f); \
974         WM8(HL, tmp); \
975 }
976 #define SBB(r, n) { \
977         uint8_t tmp = r - n - (PSW & F_CY); \
978         ZHC_SUB(tmp, r, (PSW & F_CY)); \
979         r = tmp; \
980 }
981 #define SBBW() { \
982         uint8_t tmp = _A - RM8(FETCHWA()) - (PSW & F_CY); \
983         ZHC_SUB(tmp, _A, (PSW & F_CY)); \
984         _A = tmp; \
985 }
986 #define SBBX(r) { \
987         uint8_t tmp = _A - RM8(r) - (PSW & F_CY); \
988         ZHC_SUB(tmp, _A, (PSW & F_CY)); \
989         _A = tmp; \
990 }
991 #define SBI(r) { \
992         uint8_t tmp = r - FETCH8() - (PSW & F_CY); \
993         ZHC_SUB(tmp, r, (PSW & F_CY)); \
994         r = tmp; \
995 }
996 #define SBI_IO(p) { \
997         uint8_t old = IN8(p); \
998         uint8_t tmp = old - FETCH8() - (PSW & F_CY); \
999         ZHC_SUB(tmp, old, (PSW & F_CY)); \
1000         OUT8(p, tmp); \
1001 }
1002 #define SIO() { \
1003         scount = 4; \
1004         sio_count = 0; \
1005 }
1006 #define SK(f) { \
1007         if(PSW & f) { \
1008                 PSW |= F_SK; \
1009         } \
1010 }
1011 #define SKIT(f) { \
1012         if(IRR & f) { \
1013                 PSW |= F_SK; \
1014         } \
1015         IRR &= ~f; \
1016 }
1017 #define SKN(f) { \
1018         if(!(PSW & f)) { \
1019                 PSW |= F_SK; \
1020         } \
1021 }
1022 #define SKNIT(f) { \
1023         if(!(IRR & f)) { \
1024                 PSW |= F_SK; \
1025         } \
1026         IRR &= ~f; \
1027 }
1028 #define SLL(r) { \
1029         PSW = (PSW & ~F_CY) | ((r >> 7) & F_CY); \
1030         r <<= 1; \
1031 }
1032 #define SLR(r) { \
1033         PSW = (PSW & ~F_CY) | (r & F_CY); \
1034         r >>= 1; \
1035 }
1036 #define STM() { \
1037         tcount = (((TM0 | (TM1 << 8)) & 0xfff) + 1) * PRESCALER; \
1038 }
1039 #define SUB(r, n) { \
1040         uint8_t tmp = r - n; \
1041         ZHC_SUB(tmp, r, 0); \
1042         r = tmp; \
1043 }
1044 #define SUBNB(r, n) { \
1045         uint8_t tmp = r - n; \
1046         ZHC_SUB(tmp, r, 0); \
1047         r = tmp; \
1048         SKIP_NC; \
1049 }
1050 #define SUBNBW() { \
1051         uint8_t tmp = _A - RM8(FETCHWA()); \
1052         ZHC_SUB(tmp, _A, 0); \
1053         _A = tmp; \
1054         SKIP_NC; \
1055 }
1056 #define SUBNBX(r) { \
1057         uint8_t tmp = _A - RM8(r); \
1058         ZHC_SUB(tmp, _A, 0); \
1059         _A = tmp; \
1060         SKIP_NC; \
1061 }
1062 #define SUBW() { \
1063         uint8_t tmp = _A - RM8(FETCHWA()); \
1064         ZHC_SUB(tmp, _A, 0); \
1065         _A = tmp; \
1066 }
1067 #define SUBX(r) { \
1068         uint8_t tmp = _A - RM8(r); \
1069         ZHC_SUB(tmp, _A, 0); \
1070         _A = tmp; \
1071 }
1072 #define SUI(r) { \
1073         uint8_t tmp = r - FETCH8(); \
1074         ZHC_SUB(tmp, r, 0); \
1075         r = tmp; \
1076 }
1077 #define SUI_IO(p) { \
1078         uint8_t old = IN8(p); \
1079         uint8_t tmp = old - FETCH8(); \
1080         ZHC_SUB(tmp, old, 0); \
1081         OUT8(p, tmp); \
1082 }
1083 #define SUINB(r) { \
1084         uint8_t tmp = r - FETCH8(); \
1085         ZHC_SUB(tmp, r, 0); \
1086         r = tmp; \
1087         SKIP_NC; \
1088 }
1089 #define SUINB_IO(p) { \
1090         uint8_t old = IN8(p); \
1091         uint8_t tmp = old - FETCH8(); \
1092         ZHC_SUB(tmp, old, 0); \
1093         OUT8(p, tmp); \
1094         SKIP_NC; \
1095 }
1096 #define XRA(r, n) { \
1097         r ^= n; \
1098         SET_Z(r); \
1099 }
1100 #define XRAW() { \
1101         _A ^= RM8(FETCHWA()); \
1102         SET_Z(_A); \
1103 }
1104 #define XRAX(r) { \
1105         _A ^= RM8(r); \
1106         SET_Z(_A); \
1107 }
1108 #define XRI(r) { \
1109         r ^= FETCH8(); \
1110         SET_Z(r); \
1111 }
1112 #define XRI_IO(p) { \
1113         uint8_t tmp = IN8(p) ^ FETCH8(); \
1114         OUT8(p, tmp); \
1115         SET_Z(tmp); \
1116 }
1117
1118 void UPD7801::initialize()
1119 {
1120         DEVICE::initialize();
1121         __UPD7801_MEMORY_WAIT = osd->check_feature(_T("UPD7801_MEMORY_WAIT"));
1122         __USE_DEBUGGER = osd->check_feature(_T("USE_DEBUGGER"));
1123
1124 //#ifdef USE_DEBUGGER
1125         if((__USE_DEBUGGER) && (d_debugger != NULL)) {
1126                 d_mem_stored = d_mem;
1127                 d_io_stored = d_io;
1128                 d_debugger->set_context_mem(d_mem);
1129                 d_debugger->set_context_io(d_io);
1130         }
1131 //#endif
1132 }
1133
1134 void UPD7801::reset()
1135 {
1136         PC = SP = 0;
1137 //      VA = BC = DE = HL = altVA = altBC = altDE = altHL = 0;
1138         PSW = IRR = IFF = SIRQ = HALT = 0;
1139         _V = MB = MC = TM0 = TM1 = SR = 0xff;
1140         altVA = VA;
1141         MK = 0x1f;
1142         PORTC = TO = SAK = HLDA = 0;
1143         count = 0;
1144         scount = tcount = 0;
1145         wait = false;
1146         sio_count = 0;
1147 }
1148
1149 int UPD7801::run(int clock)
1150 {
1151         // run cpu
1152         if(clock == -1) {
1153                 // run only one opcode
1154                 count = 0;
1155 //#ifdef USE_DEBUGGER
1156                 if(__USE_DEBUGGER) {
1157                         run_one_opecode_debugger();
1158                 } else {
1159 //#else
1160                         run_one_opecode();
1161                 }
1162 //#endif
1163                 return -count;
1164         } else {
1165                 // run cpu while given clocks
1166                 count += clock;
1167                 int first_count = count;
1168                 
1169                 while(count > 0) {
1170 //#ifdef USE_DEBUGGER
1171                         if(__USE_DEBUGGER) {
1172                                 run_one_opecode_debugger();
1173                         } else { 
1174 //#else
1175                                 run_one_opecode();
1176                         }
1177 //#endif
1178                 }
1179                 return first_count - count;
1180         }
1181 }
1182
1183 void UPD7801::run_one_opecode()
1184 {
1185         if(!(MC & 0x40) && (IN8(P_C) & 0x80)) {
1186                 if(!HLDA) {
1187                         HLDA = 0x40;
1188                         UPDATE_PORTC(0);
1189                 }
1190         } else {
1191                 if(HLDA) {
1192                         HLDA = 0;
1193                         UPDATE_PORTC(0);
1194                 }
1195         }
1196         if(HLDA || wait) {
1197                 period = 1;
1198         } else {
1199                 // interrupt is enabled after next opecode of ei
1200                 if(IFF & 2) {
1201                         IFF--;
1202                 }
1203                 
1204                 // run 1 opecode
1205 //#ifdef USE_DEBUGGER
1206                 if(__USE_DEBUGGER) {
1207                         d_debugger->add_cpu_trace(PC);
1208                 }
1209 //#endif
1210                 period = 0;
1211                 prevPC = PC;
1212                 OP();
1213         }
1214
1215         total_count += period;
1216
1217         count -= period;
1218         
1219         // update serial count
1220         if(scount) {
1221                 scount -= period;
1222                 while(scount <= 0) {
1223                         if(!SIO_DISABLED && !SIO_EXTCLOCK) {
1224                                 write_signals(&outputs_so, (SR & 0x80) ? 0xffffffff : 0);
1225                                 SR <<= 1;
1226                                 if(SI) SR |= 1;
1227                                 if(++sio_count == 8) {
1228                                         IRR |= INTFS;
1229                                         if(SAK) {
1230                                                 SAK = 0;
1231                                                 UPDATE_PORTC(0);
1232                                         }
1233                                         scount = sio_count = 0;
1234                                         break;
1235                                 }
1236                         }
1237                         scount += 4;
1238                 }
1239         }
1240         
1241         // update timer
1242         if(tcount && (tcount -= period) <= 0) {
1243                 tcount += (((TM0 | (TM1 << 8)) & 0xfff) + 1) * PRESCALER;
1244                 IRR |= INTFT;
1245                 if(TO) {
1246                         TO = 0;
1247                         UPDATE_PORTC(0);
1248                 }
1249         }
1250         
1251         // check interrupt
1252         if(IFF == 1 && !SIRQ) {
1253                 for(int i = 0; i < 5; i++) {
1254                         uint8_t bit = irq_bits[i];
1255                         if((IRR & bit) && !(MK & bit)) {
1256                                 if(HALT) {
1257                                         HALT = 0;
1258                                         PC++;
1259                                 }
1260                                 PUSH8(PSW);
1261                                 PUSH16(PC);
1262                                 
1263                                 PC = irq_addr[i];
1264                                 PSW &= ~(F_SK | F_L0 | F_L1);
1265                                 IFF = 0;
1266                                 IRR &= ~bit;
1267                                 break;
1268                         }
1269                 }
1270         }
1271 }
1272
1273 //#ifdef USE_DEBUGGER
1274 void UPD7801::run_one_opecode_debugger()
1275 {
1276         if(d_debugger == NULL) return;
1277         bool now_debugging = d_debugger->now_debugging;
1278         if(now_debugging) {
1279                 d_debugger->check_break_points(PC);
1280                 if(d_debugger->now_suspended) {
1281                         emu->mute_sound();
1282                         d_debugger->now_waiting = true;
1283                         while(d_debugger->now_debugging && d_debugger->now_suspended) {
1284                                 emu->sleep(10);
1285                         }
1286                         d_debugger->now_waiting = false;
1287                 }
1288                 if(d_debugger->now_debugging) {
1289                         d_mem = d_io = d_debugger;
1290                 } else {
1291                         now_debugging = false;
1292                 }
1293                 run_one_opecode();
1294                 if(now_debugging) {
1295                         if(!d_debugger->now_going) {
1296                                 d_debugger->now_suspended = true;
1297                         }
1298                         d_mem = d_mem_stored;
1299                         d_io = d_io_stored;
1300                 }
1301         } else {
1302                 run_one_opecode();
1303         }
1304 }
1305
1306 void UPD7801::write_debug_data8(uint32_t addr, uint32_t data)
1307 {
1308         int wait;
1309         d_mem_stored->write_data8w(addr, data, &wait);
1310 }
1311
1312 uint32_t UPD7801::read_debug_data8(uint32_t addr)
1313 {
1314         int wait;
1315         return d_mem_stored->read_data8w(addr, &wait);
1316 }
1317
1318 void UPD7801::write_debug_io8(uint32_t addr, uint32_t data)
1319 {
1320         int wait;
1321         d_io_stored->write_io8w(addr, data, &wait);
1322 }
1323
1324 uint32_t UPD7801::read_debug_io8(uint32_t addr) {
1325         int wait;
1326         return d_io_stored->read_io8w(addr, &wait);
1327 }
1328
1329 bool UPD7801::write_debug_reg(const _TCHAR *reg, uint32_t data)
1330 {
1331         if(_tcsicmp(reg, _T("PC")) == 0) {
1332                 PC = data;
1333         } else if(_tcsicmp(reg, _T("SP")) == 0) {
1334                 SP = data;
1335         } else if(_tcsicmp(reg, _T("VA")) == 0) {
1336                 VA = data;
1337         } else if(_tcsicmp(reg, _T("BC")) == 0) {
1338                 BC = data;
1339         } else if(_tcsicmp(reg, _T("DE")) == 0) {
1340                 DE = data;
1341         } else if(_tcsicmp(reg, _T("HL")) == 0) {
1342                 HL = data;
1343         } else if(_tcsicmp(reg, _T("V")) == 0) {
1344                 _V = data;
1345         } else if(_tcsicmp(reg, _T("A")) == 0) {
1346                 _A = data;
1347         } else if(_tcsicmp(reg, _T("B")) == 0) {
1348                 _B = data;
1349         } else if(_tcsicmp(reg, _T("C")) == 0) {
1350                 _C = data;
1351         } else if(_tcsicmp(reg, _T("D")) == 0) {
1352                 _D = data;
1353         } else if(_tcsicmp(reg, _T("E")) == 0) {
1354                 _E = data;
1355         } else if(_tcsicmp(reg, _T("H")) == 0) {
1356                 _H = data;
1357         } else if(_tcsicmp(reg, _T("L")) == 0) {
1358                 _L = data;
1359         } else if(_tcsicmp(reg, _T("VA'")) == 0) {
1360                 altVA = data;
1361         } else if(_tcsicmp(reg, _T("BC'")) == 0) {
1362                 altBC = data;
1363         } else if(_tcsicmp(reg, _T("DE'")) == 0) {
1364                 altDE = data;
1365         } else if(_tcsicmp(reg, _T("HL'")) == 0) {
1366                 altHL = data;
1367         } else if(_tcsicmp(reg, _T("V'")) == 0) {
1368                 altV = data;
1369         } else if(_tcsicmp(reg, _T("A'")) == 0) {
1370                 altA = data;
1371         } else if(_tcsicmp(reg, _T("B'")) == 0) {
1372                 altB = data;
1373         } else if(_tcsicmp(reg, _T("C'")) == 0) {
1374                 altC = data;
1375         } else if(_tcsicmp(reg, _T("D'")) == 0) {
1376                 altD = data;
1377         } else if(_tcsicmp(reg, _T("E'")) == 0) {
1378                 altE = data;
1379         } else if(_tcsicmp(reg, _T("H'")) == 0) {
1380                 altH = data;
1381         } else if(_tcsicmp(reg, _T("L'")) == 0) {
1382                 altL = data;
1383         } else {
1384                 return false;
1385         }
1386         return true;
1387 }
1388
1389 void UPD7801::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
1390 {
1391 /*
1392 VA = 0000  BC = 0000  DE = 0000 HL = 0000  PSW= 00 [Z SK HC L1 L0 CY]
1393 VA'= 0000  BC'= 0000  DE'= 0000 HL'= 0000  SP = 0000  PC = 0000
1394           (BC)= 0000 (DE)=0000 (HL)= 0000 (SP)= 0000 <DI>
1395 Clocks = 0 (0)  Since Scanline = 0/0 (0/0)
1396 */
1397         int wait;
1398         my_stprintf_s(buffer, buffer_len,
1399         _T("VA = %04X  BC = %04X  DE = %04X HL = %04X  PSW= %02x [%s %s %s %s %s %s]\nVA'= %04X  BC'= %04X  DE'= %04X HL'= %04X  SP = %04X  PC = %04X\n          (BC)= %04X (DE)=%04X (HL)= %04X (SP)= %04X <%s>\nClocks = %llu (%llu) Since Scanline = %d/%d (%d/%d)"),
1400         VA, BC, DE, HL, PSW,
1401         (PSW & F_Z) ? _T("Z") : _T("-"), (PSW & F_SK) ? _T("SK") : _T("--"), (PSW & F_HC) ? _T("HC") : _T("--"), (PSW & F_L1) ? _T("L1") : _T("--"), (PSW & F_L0) ? _T("L0") : _T("--"), (PSW & F_CY) ? _T("CY") : _T("--"),
1402         altVA, altBC, altDE, altHL, SP, PC,
1403         d_mem_stored->read_data16w(BC, &wait), d_mem_stored->read_data16w(DE, &wait), d_mem_stored->read_data16w(HL, &wait), d_mem_stored->read_data16w(SP, &wait),
1404         IFF ? _T("EI") : _T("DI"),
1405         total_count, total_count - prev_total_count,
1406         get_passed_clock_since_vline(), get_cur_vline_clocks(), get_cur_vline(), get_lines_per_frame());
1407         prev_total_count = total_count;
1408 }
1409
1410 // disassembler
1411
1412 uint8_t upd7801_dasm_ops[4];
1413 int upd7801_dasm_ptr;
1414
1415 uint8_t getb()
1416 {
1417         return upd7801_dasm_ops[upd7801_dasm_ptr++];
1418 }
1419
1420 uint16_t getw()
1421 {
1422         uint16_t l = getb();
1423         return l | (getb() << 8);
1424 }
1425
1426 uint8_t getwa()
1427 {
1428         return getb();
1429 }
1430
1431 int UPD7801::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
1432 {
1433         if(d_debugger == NULL) return 0;
1434         for(int i = 0; i < 4; i++) {
1435                 int wait;
1436                 upd7801_dasm_ops[i] = d_mem_stored->read_data8w(pc + i, &wait);
1437         }
1438         upd7801_dasm_ptr = 0;
1439         
1440         uint8_t b;
1441         uint16_t wa;
1442         
1443         switch(b = getb()) {
1444         case 0x00: my_stprintf_s(buffer, buffer_len, _T("nop")); break;
1445         case 0x01: my_stprintf_s(buffer, buffer_len, _T("hlt")); break;
1446         case 0x02: my_stprintf_s(buffer, buffer_len, _T("inx sp")); break;
1447         case 0x03: my_stprintf_s(buffer, buffer_len, _T("dcx sp")); break;
1448         case 0x04: my_stprintf_s(buffer, buffer_len, _T("lxi sp,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
1449         case 0x05: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("aniw v.%02xh,%02xh"), wa, getb()); break;
1450 //      case 0x06:
1451         case 0x07: my_stprintf_s(buffer, buffer_len, _T("ani a,%02xh"), getb()); break;
1452         case 0x08: my_stprintf_s(buffer, buffer_len, _T("ret")); break;
1453         case 0x09: my_stprintf_s(buffer, buffer_len, _T("sio")); break;
1454         case 0x0a: my_stprintf_s(buffer, buffer_len, _T("mov a,b")); break;
1455         case 0x0b: my_stprintf_s(buffer, buffer_len, _T("mov a,c")); break;
1456         case 0x0c: my_stprintf_s(buffer, buffer_len, _T("mov a,d")); break;
1457         case 0x0d: my_stprintf_s(buffer, buffer_len, _T("mov a,e")); break;
1458         case 0x0e: my_stprintf_s(buffer, buffer_len, _T("mov a,h")); break;
1459         case 0x0f: my_stprintf_s(buffer, buffer_len, _T("mov a,l")); break;
1460         
1461         case 0x10: my_stprintf_s(buffer, buffer_len, _T("ex")); break;
1462         case 0x11: my_stprintf_s(buffer, buffer_len, _T("exx")); break;
1463         case 0x12: my_stprintf_s(buffer, buffer_len, _T("inx b")); break;
1464         case 0x13: my_stprintf_s(buffer, buffer_len, _T("dcx b")); break;
1465         case 0x14: my_stprintf_s(buffer, buffer_len, _T("lxi b,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
1466         case 0x15: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("oriw v.%02xh,%02xh"), wa, getb()); break;
1467         case 0x16: my_stprintf_s(buffer, buffer_len, _T("xri a,%02xh"), getb()); break;
1468         case 0x17: my_stprintf_s(buffer, buffer_len, _T("ori a,%02xh"), getb()); break;
1469         case 0x18: my_stprintf_s(buffer, buffer_len, _T("rets")); break;
1470         case 0x19: my_stprintf_s(buffer, buffer_len, _T("stm")); break;
1471         case 0x1a: my_stprintf_s(buffer, buffer_len, _T("mov b,a")); break;
1472         case 0x1b: my_stprintf_s(buffer, buffer_len, _T("mov c,a")); break;
1473         case 0x1c: my_stprintf_s(buffer, buffer_len, _T("mov d,a")); break;
1474         case 0x1d: my_stprintf_s(buffer, buffer_len, _T("mov e,a")); break;
1475         case 0x1e: my_stprintf_s(buffer, buffer_len, _T("mov h,a")); break;
1476         case 0x1f: my_stprintf_s(buffer, buffer_len, _T("mov l,a")); break;
1477         
1478         case 0x20: my_stprintf_s(buffer, buffer_len, _T("inrw v.%02xh"), getwa()); break;
1479         case 0x21: my_stprintf_s(buffer, buffer_len, _T("table")); break;
1480         case 0x22: my_stprintf_s(buffer, buffer_len, _T("inx d")); break;
1481         case 0x23: my_stprintf_s(buffer, buffer_len, _T("dcx d")); break;
1482         case 0x24: my_stprintf_s(buffer, buffer_len, _T("lxi d,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
1483         case 0x25: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("gtiw v.%02xh,%02xh"), wa, getb()); break;
1484         case 0x26: my_stprintf_s(buffer, buffer_len, _T("adinc a,%02xh"), getb()); break;
1485         case 0x27: my_stprintf_s(buffer, buffer_len, _T("gti a,%02xh"), getb()); break;
1486         case 0x28: my_stprintf_s(buffer, buffer_len, _T("ldaw v.%02xh"), getwa()); break;
1487         case 0x29: my_stprintf_s(buffer, buffer_len, _T("ldax b")); break;
1488         case 0x2a: my_stprintf_s(buffer, buffer_len, _T("ldax d")); break;
1489         case 0x2b: my_stprintf_s(buffer, buffer_len, _T("ldax h")); break;
1490         case 0x2c: my_stprintf_s(buffer, buffer_len, _T("ldax d+")); break;
1491         case 0x2d: my_stprintf_s(buffer, buffer_len, _T("ldax h+")); break;
1492         case 0x2e: my_stprintf_s(buffer, buffer_len, _T("ldax d-")); break;
1493         case 0x2f: my_stprintf_s(buffer, buffer_len, _T("ldax h-")); break;
1494         
1495         case 0x30: my_stprintf_s(buffer, buffer_len, _T("dcrw v.%02xh"), getwa()); break;
1496         case 0x31: my_stprintf_s(buffer, buffer_len, _T("block")); break;
1497         case 0x32: my_stprintf_s(buffer, buffer_len, _T("inx h")); break;
1498         case 0x33: my_stprintf_s(buffer, buffer_len, _T("dcx h")); break;
1499         case 0x34: my_stprintf_s(buffer, buffer_len, _T("lxi h,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
1500         case 0x35: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("ltiw v.%02xh,%02xh"), wa, getb()); break;
1501         case 0x36: my_stprintf_s(buffer, buffer_len, _T("suinb a,%02xh"), getb()); break;
1502         case 0x37: my_stprintf_s(buffer, buffer_len, _T("lti a,%02xh"), getb()); break;
1503         case 0x38: my_stprintf_s(buffer, buffer_len, _T("staw v.%02xh"), getwa()); break;
1504         case 0x39: my_stprintf_s(buffer, buffer_len, _T("stax b")); break;
1505         case 0x3a: my_stprintf_s(buffer, buffer_len, _T("stax d")); break;
1506         case 0x3b: my_stprintf_s(buffer, buffer_len, _T("stax h")); break;
1507         case 0x3c: my_stprintf_s(buffer, buffer_len, _T("stax d+")); break;
1508         case 0x3d: my_stprintf_s(buffer, buffer_len, _T("stax h+")); break;
1509         case 0x3e: my_stprintf_s(buffer, buffer_len, _T("stax d-")); break;
1510         case 0x3f: my_stprintf_s(buffer, buffer_len, _T("stax h-")); break;
1511         
1512 //      case 0x40:
1513         case 0x41: my_stprintf_s(buffer, buffer_len, _T("inr a")); break;
1514         case 0x42: my_stprintf_s(buffer, buffer_len, _T("inr b")); break;
1515         case 0x43: my_stprintf_s(buffer, buffer_len, _T("inr c")); break;
1516         case 0x44: my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
1517         case 0x45: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("oniw v.%02xh,%02xh"), wa, getb()); break;
1518         case 0x46: my_stprintf_s(buffer, buffer_len, _T("adi a,%02xh"), getb()); break;
1519         case 0x47: my_stprintf_s(buffer, buffer_len, _T("oni a,%02xh"), getb()); break;
1520         case 0x48:
1521                 switch(b = getb()) {
1522                 case 0x00: my_stprintf_s(buffer, buffer_len, _T("skit intf0")); break;
1523                 case 0x01: my_stprintf_s(buffer, buffer_len, _T("skit intft")); break;
1524                 case 0x02: my_stprintf_s(buffer, buffer_len, _T("skit intf1")); break;
1525                 case 0x03: my_stprintf_s(buffer, buffer_len, _T("skit intf2")); break;
1526                 case 0x04: my_stprintf_s(buffer, buffer_len, _T("skit intfs")); break;
1527                 case 0x0a: my_stprintf_s(buffer, buffer_len, _T("sk cy")); break;
1528                 case 0x0c: my_stprintf_s(buffer, buffer_len, _T("sk z")); break;
1529                 case 0x0e: my_stprintf_s(buffer, buffer_len, _T("push v")); break;
1530                 case 0x0f: my_stprintf_s(buffer, buffer_len, _T("pop v")); break;
1531                 case 0x10: my_stprintf_s(buffer, buffer_len, _T("sknit f0")); break;
1532                 case 0x11: my_stprintf_s(buffer, buffer_len, _T("sknit ft")); break;
1533                 case 0x12: my_stprintf_s(buffer, buffer_len, _T("sknit f1")); break;
1534                 case 0x13: my_stprintf_s(buffer, buffer_len, _T("sknit f2")); break;
1535                 case 0x14: my_stprintf_s(buffer, buffer_len, _T("sknit fs")); break;
1536                 case 0x1a: my_stprintf_s(buffer, buffer_len, _T("skn cy")); break;
1537                 case 0x1c: my_stprintf_s(buffer, buffer_len, _T("skn z")); break;
1538                 case 0x1e: my_stprintf_s(buffer, buffer_len, _T("push b")); break;
1539                 case 0x1f: my_stprintf_s(buffer, buffer_len, _T("pop b")); break;
1540                 case 0x20: my_stprintf_s(buffer, buffer_len, _T("ei")); break;
1541                 case 0x24: my_stprintf_s(buffer, buffer_len, _T("di")); break;
1542                 case 0x2a: my_stprintf_s(buffer, buffer_len, _T("clc")); break;
1543                 case 0x2b: my_stprintf_s(buffer, buffer_len, _T("stc")); break;
1544                 case 0x2c: my_stprintf_s(buffer, buffer_len, _T("pen")); break;
1545                 case 0x2d: my_stprintf_s(buffer, buffer_len, _T("pex")); break;
1546                 case 0x2e: my_stprintf_s(buffer, buffer_len, _T("push d")); break;
1547                 case 0x2f: my_stprintf_s(buffer, buffer_len, _T("pop d")); break;
1548                 case 0x30: my_stprintf_s(buffer, buffer_len, _T("rll a")); break;
1549                 case 0x31: my_stprintf_s(buffer, buffer_len, _T("rlr a")); break;
1550                 case 0x32: my_stprintf_s(buffer, buffer_len, _T("rll c")); break;
1551                 case 0x33: my_stprintf_s(buffer, buffer_len, _T("rlr c")); break;
1552                 case 0x34: my_stprintf_s(buffer, buffer_len, _T("sll a")); break;
1553                 case 0x35: my_stprintf_s(buffer, buffer_len, _T("slr a")); break;
1554                 case 0x36: my_stprintf_s(buffer, buffer_len, _T("sll c")); break;
1555                 case 0x37: my_stprintf_s(buffer, buffer_len, _T("sll c")); break;
1556                 case 0x38: my_stprintf_s(buffer, buffer_len, _T("rld")); break;
1557                 case 0x39: my_stprintf_s(buffer, buffer_len, _T("rrd")); break;
1558                 case 0x3c: my_stprintf_s(buffer, buffer_len, _T("per")); break;
1559                 case 0x3e: my_stprintf_s(buffer, buffer_len, _T("push h")); break;
1560                 case 0x3f: my_stprintf_s(buffer, buffer_len, _T("pop h")); break;
1561                 default: my_stprintf_s(buffer, buffer_len, _T("db 48h,%02xh"), b);
1562                 }
1563                 break;
1564         case 0x49: my_stprintf_s(buffer, buffer_len, _T("mvix b,%02xh"), getb()); break;
1565         case 0x4a: my_stprintf_s(buffer, buffer_len, _T("mvix d,%02xh"), getb()); break;
1566         case 0x4b: my_stprintf_s(buffer, buffer_len, _T("mvix h,%02xh"), getb()); break;
1567         case 0x4c:
1568                 switch(b = getb()) {
1569                 case 0xc0: my_stprintf_s(buffer, buffer_len, _T("mov a,pa")); break;
1570                 case 0xc1: my_stprintf_s(buffer, buffer_len, _T("mov a,pb")); break;
1571                 case 0xc2: my_stprintf_s(buffer, buffer_len, _T("mov a,pc")); break;
1572                 case 0xc3: my_stprintf_s(buffer, buffer_len, _T("mov a,mk")); break;
1573                 case 0xc4: my_stprintf_s(buffer, buffer_len, _T("mov a,mb")); break;    // \96¢\92è\8b`?
1574                 case 0xc5: my_stprintf_s(buffer, buffer_len, _T("mov a,mc")); break;    // \96¢\92è\8b`?
1575                 case 0xc6: my_stprintf_s(buffer, buffer_len, _T("mov a,tm0")); break;   // \96¢\92è\8b`?
1576                 case 0xc7: my_stprintf_s(buffer, buffer_len, _T("mov a,tm1")); break;   // \96¢\92è\8b`?
1577                 case 0xc8: my_stprintf_s(buffer, buffer_len, _T("mov a,s")); break;
1578                 default:
1579                         if(b < 0xc0) {
1580                                 my_stprintf_s(buffer, buffer_len, _T("in %02xh"), getb()); break;
1581                         }
1582                         my_stprintf_s(buffer, buffer_len, _T("db 4ch,%02xh"), b);
1583                 }
1584                 break;
1585         case 0x4d:
1586                 switch(b = getb()) {
1587                 case 0xc0: my_stprintf_s(buffer, buffer_len, _T("mov pa,a")); break;
1588                 case 0xc1: my_stprintf_s(buffer, buffer_len, _T("mov pb,a")); break;
1589                 case 0xc2: my_stprintf_s(buffer, buffer_len, _T("mov pc,a")); break;
1590                 case 0xc3: my_stprintf_s(buffer, buffer_len, _T("mov mk,a")); break;
1591                 case 0xc4: my_stprintf_s(buffer, buffer_len, _T("mov mb,a")); break;
1592                 case 0xc5: my_stprintf_s(buffer, buffer_len, _T("mov mc,a")); break;
1593                 case 0xc6: my_stprintf_s(buffer, buffer_len, _T("mov tm0,a")); break;
1594                 case 0xc7: my_stprintf_s(buffer, buffer_len, _T("mov tm1,a")); break;
1595                 case 0xc8: my_stprintf_s(buffer, buffer_len, _T("mov s,a")); break;
1596                 default:
1597                         if(b < 0xc0) {
1598                                 my_stprintf_s(buffer, buffer_len, _T("out %02xh"), getb()); break;
1599                         }
1600                         my_stprintf_s(buffer, buffer_len, _T("db 4dh,%02xh"), b);
1601                 }
1602                 break;
1603         case 0x4e: b = getb(); my_stprintf_s(buffer, buffer_len, _T("jre %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), pc + upd7801_dasm_ptr + b)); break;
1604         case 0x4f: b = getb(); my_stprintf_s(buffer, buffer_len, _T("jre %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), (pc + upd7801_dasm_ptr + b - 256) & 0xffff)); break;
1605         
1606 //      case 0x50:
1607         case 0x51: my_stprintf_s(buffer, buffer_len, _T("dcr a")); break;
1608         case 0x52: my_stprintf_s(buffer, buffer_len, _T("dcr b")); break;
1609         case 0x53: my_stprintf_s(buffer, buffer_len, _T("dcr c")); break;
1610         case 0x54: my_stprintf_s(buffer, buffer_len, _T("jmp %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
1611         case 0x55: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("offiw v.%02xh,%02xh"), wa, getb()); break;
1612         case 0x56: my_stprintf_s(buffer, buffer_len, _T("aci a,%02xh"), getb()); break;
1613         case 0x57: my_stprintf_s(buffer, buffer_len, _T("offi a,%02xh"), getb()); break;
1614         case 0x58: my_stprintf_s(buffer, buffer_len, _T("bit 0,v.%02xh"), getwa()); break;
1615         case 0x59: my_stprintf_s(buffer, buffer_len, _T("bit 1,v.%02xh"), getwa()); break;
1616         case 0x5a: my_stprintf_s(buffer, buffer_len, _T("bit 2,v.%02xh"), getwa()); break;
1617         case 0x5b: my_stprintf_s(buffer, buffer_len, _T("bit 3,v.%02xh"), getwa()); break;
1618         case 0x5c: my_stprintf_s(buffer, buffer_len, _T("bit 4,v.%02xh"), getwa()); break;
1619         case 0x5d: my_stprintf_s(buffer, buffer_len, _T("bit 5,v.%02xh"), getwa()); break;
1620         case 0x5e: my_stprintf_s(buffer, buffer_len, _T("bit 6,v.%02xh"), getwa()); break;
1621         case 0x5f: my_stprintf_s(buffer, buffer_len, _T("bit 7,v.%02xh"), getwa()); break;
1622         
1623         case 0x60:
1624                 switch(b = getb()) {
1625                 case 0x08: my_stprintf_s(buffer, buffer_len, _T("ana v,a")); break;
1626                 case 0x09: my_stprintf_s(buffer, buffer_len, _T("ana a,a")); break;
1627                 case 0x0a: my_stprintf_s(buffer, buffer_len, _T("ana b,a")); break;
1628                 case 0x0b: my_stprintf_s(buffer, buffer_len, _T("ana c,a")); break;
1629                 case 0x0c: my_stprintf_s(buffer, buffer_len, _T("ana d,a")); break;
1630                 case 0x0d: my_stprintf_s(buffer, buffer_len, _T("ana e,a")); break;
1631                 case 0x0e: my_stprintf_s(buffer, buffer_len, _T("ana h,a")); break;
1632                 case 0x0f: my_stprintf_s(buffer, buffer_len, _T("ana l,a")); break;
1633                 case 0x10: my_stprintf_s(buffer, buffer_len, _T("xra v,a")); break;
1634                 case 0x11: my_stprintf_s(buffer, buffer_len, _T("xra a,a")); break;
1635                 case 0x12: my_stprintf_s(buffer, buffer_len, _T("xra b,a")); break;
1636                 case 0x13: my_stprintf_s(buffer, buffer_len, _T("xra c,a")); break;
1637                 case 0x14: my_stprintf_s(buffer, buffer_len, _T("xra d,a")); break;
1638                 case 0x15: my_stprintf_s(buffer, buffer_len, _T("xra e,a")); break;
1639                 case 0x16: my_stprintf_s(buffer, buffer_len, _T("xra h,a")); break;
1640                 case 0x17: my_stprintf_s(buffer, buffer_len, _T("xra l,a")); break;
1641                 case 0x18: my_stprintf_s(buffer, buffer_len, _T("ora v,a")); break;
1642                 case 0x19: my_stprintf_s(buffer, buffer_len, _T("ora a,a")); break;
1643                 case 0x1a: my_stprintf_s(buffer, buffer_len, _T("ora b,a")); break;
1644                 case 0x1b: my_stprintf_s(buffer, buffer_len, _T("ora c,a")); break;
1645                 case 0x1c: my_stprintf_s(buffer, buffer_len, _T("ora d,a")); break;
1646                 case 0x1d: my_stprintf_s(buffer, buffer_len, _T("ora e,a")); break;
1647                 case 0x1e: my_stprintf_s(buffer, buffer_len, _T("ora h,a")); break;
1648                 case 0x1f: my_stprintf_s(buffer, buffer_len, _T("ora l,a")); break;
1649                 case 0x20: my_stprintf_s(buffer, buffer_len, _T("addnc v,a")); break;
1650                 case 0x21: my_stprintf_s(buffer, buffer_len, _T("addnc a,a")); break;
1651                 case 0x22: my_stprintf_s(buffer, buffer_len, _T("addnc b,a")); break;
1652                 case 0x23: my_stprintf_s(buffer, buffer_len, _T("addnc c,a")); break;
1653                 case 0x24: my_stprintf_s(buffer, buffer_len, _T("addnc d,a")); break;
1654                 case 0x25: my_stprintf_s(buffer, buffer_len, _T("addnc e,a")); break;
1655                 case 0x26: my_stprintf_s(buffer, buffer_len, _T("addnc h,a")); break;
1656                 case 0x27: my_stprintf_s(buffer, buffer_len, _T("addnc l,a")); break;
1657                 case 0x28: my_stprintf_s(buffer, buffer_len, _T("gta v,a")); break;
1658                 case 0x29: my_stprintf_s(buffer, buffer_len, _T("gta a,a")); break;
1659                 case 0x2a: my_stprintf_s(buffer, buffer_len, _T("gta b,a")); break;
1660                 case 0x2b: my_stprintf_s(buffer, buffer_len, _T("gta c,a")); break;
1661                 case 0x2c: my_stprintf_s(buffer, buffer_len, _T("gta d,a")); break;
1662                 case 0x2d: my_stprintf_s(buffer, buffer_len, _T("gta e,a")); break;
1663                 case 0x2e: my_stprintf_s(buffer, buffer_len, _T("gta h,a")); break;
1664                 case 0x2f: my_stprintf_s(buffer, buffer_len, _T("gta l,a")); break;
1665                 case 0x30: my_stprintf_s(buffer, buffer_len, _T("subnb v,a")); break;
1666                 case 0x31: my_stprintf_s(buffer, buffer_len, _T("subnb a,a")); break;
1667                 case 0x32: my_stprintf_s(buffer, buffer_len, _T("subnb b,a")); break;
1668                 case 0x33: my_stprintf_s(buffer, buffer_len, _T("subnb c,a")); break;
1669                 case 0x34: my_stprintf_s(buffer, buffer_len, _T("subnb d,a")); break;
1670                 case 0x35: my_stprintf_s(buffer, buffer_len, _T("subnb e,a")); break;
1671                 case 0x36: my_stprintf_s(buffer, buffer_len, _T("subnb h,a")); break;
1672                 case 0x37: my_stprintf_s(buffer, buffer_len, _T("subnb l,a")); break;
1673                 case 0x38: my_stprintf_s(buffer, buffer_len, _T("lta v,a")); break;
1674                 case 0x39: my_stprintf_s(buffer, buffer_len, _T("lta a,a")); break;
1675                 case 0x3a: my_stprintf_s(buffer, buffer_len, _T("lta b,a")); break;
1676                 case 0x3b: my_stprintf_s(buffer, buffer_len, _T("lta c,a")); break;
1677                 case 0x3c: my_stprintf_s(buffer, buffer_len, _T("lta d,a")); break;
1678                 case 0x3d: my_stprintf_s(buffer, buffer_len, _T("lta e,a")); break;
1679                 case 0x3e: my_stprintf_s(buffer, buffer_len, _T("lta h,a")); break;
1680                 case 0x3f: my_stprintf_s(buffer, buffer_len, _T("lta l,a")); break;
1681                 case 0x40: my_stprintf_s(buffer, buffer_len, _T("add v,a")); break;
1682                 case 0x41: my_stprintf_s(buffer, buffer_len, _T("add a,a")); break;
1683                 case 0x42: my_stprintf_s(buffer, buffer_len, _T("add b,a")); break;
1684                 case 0x43: my_stprintf_s(buffer, buffer_len, _T("add c,a")); break;
1685                 case 0x44: my_stprintf_s(buffer, buffer_len, _T("add d,a")); break;
1686                 case 0x45: my_stprintf_s(buffer, buffer_len, _T("add e,a")); break;
1687                 case 0x46: my_stprintf_s(buffer, buffer_len, _T("add h,a")); break;
1688                 case 0x47: my_stprintf_s(buffer, buffer_len, _T("add l,a")); break;
1689                 case 0x50: my_stprintf_s(buffer, buffer_len, _T("adc v,a")); break;
1690                 case 0x51: my_stprintf_s(buffer, buffer_len, _T("adc a,a")); break;
1691                 case 0x52: my_stprintf_s(buffer, buffer_len, _T("adc b,a")); break;
1692                 case 0x53: my_stprintf_s(buffer, buffer_len, _T("adc c,a")); break;
1693                 case 0x54: my_stprintf_s(buffer, buffer_len, _T("adc d,a")); break;
1694                 case 0x55: my_stprintf_s(buffer, buffer_len, _T("adc e,a")); break;
1695                 case 0x56: my_stprintf_s(buffer, buffer_len, _T("adc h,a")); break;
1696                 case 0x57: my_stprintf_s(buffer, buffer_len, _T("adc l,a")); break;
1697                 case 0x60: my_stprintf_s(buffer, buffer_len, _T("sub v,a")); break;
1698                 case 0x61: my_stprintf_s(buffer, buffer_len, _T("sub a,a")); break;
1699                 case 0x62: my_stprintf_s(buffer, buffer_len, _T("sub b,a")); break;
1700                 case 0x63: my_stprintf_s(buffer, buffer_len, _T("sub c,a")); break;
1701                 case 0x64: my_stprintf_s(buffer, buffer_len, _T("sub d,a")); break;
1702                 case 0x65: my_stprintf_s(buffer, buffer_len, _T("sub e,a")); break;
1703                 case 0x66: my_stprintf_s(buffer, buffer_len, _T("sub h,a")); break;
1704                 case 0x67: my_stprintf_s(buffer, buffer_len, _T("sub l,a")); break;
1705                 case 0x68: my_stprintf_s(buffer, buffer_len, _T("nea v,a")); break;
1706                 case 0x69: my_stprintf_s(buffer, buffer_len, _T("nea a,a")); break;
1707                 case 0x6a: my_stprintf_s(buffer, buffer_len, _T("nea b,a")); break;
1708                 case 0x6b: my_stprintf_s(buffer, buffer_len, _T("nea c,a")); break;
1709                 case 0x6c: my_stprintf_s(buffer, buffer_len, _T("nea d,a")); break;
1710                 case 0x6d: my_stprintf_s(buffer, buffer_len, _T("nea e,a")); break;
1711                 case 0x6e: my_stprintf_s(buffer, buffer_len, _T("nea h,a")); break;
1712                 case 0x6f: my_stprintf_s(buffer, buffer_len, _T("nea l,a")); break;
1713                 case 0x70: my_stprintf_s(buffer, buffer_len, _T("sbb v,a")); break;
1714                 case 0x71: my_stprintf_s(buffer, buffer_len, _T("sbb a,a")); break;
1715                 case 0x72: my_stprintf_s(buffer, buffer_len, _T("sbb b,a")); break;
1716                 case 0x73: my_stprintf_s(buffer, buffer_len, _T("sbb c,a")); break;
1717                 case 0x74: my_stprintf_s(buffer, buffer_len, _T("sbb d,a")); break;
1718                 case 0x75: my_stprintf_s(buffer, buffer_len, _T("sbb e,a")); break;
1719                 case 0x76: my_stprintf_s(buffer, buffer_len, _T("sbb h,a")); break;
1720                 case 0x77: my_stprintf_s(buffer, buffer_len, _T("sbb l,a")); break;
1721                 case 0x78: my_stprintf_s(buffer, buffer_len, _T("eqa v,a")); break;
1722                 case 0x79: my_stprintf_s(buffer, buffer_len, _T("eqa a,a")); break;
1723                 case 0x7a: my_stprintf_s(buffer, buffer_len, _T("eqa b,a")); break;
1724                 case 0x7b: my_stprintf_s(buffer, buffer_len, _T("eqa c,a")); break;
1725                 case 0x7c: my_stprintf_s(buffer, buffer_len, _T("eqa d,a")); break;
1726                 case 0x7d: my_stprintf_s(buffer, buffer_len, _T("eqa e,a")); break;
1727                 case 0x7e: my_stprintf_s(buffer, buffer_len, _T("eqa h,a")); break;
1728                 case 0x7f: my_stprintf_s(buffer, buffer_len, _T("eqa l,a")); break;
1729                 case 0x88: my_stprintf_s(buffer, buffer_len, _T("ana a,v")); break;
1730                 case 0x89: my_stprintf_s(buffer, buffer_len, _T("ana a,a")); break;
1731                 case 0x8a: my_stprintf_s(buffer, buffer_len, _T("ana a,b")); break;
1732                 case 0x8b: my_stprintf_s(buffer, buffer_len, _T("ana a,c")); break;
1733                 case 0x8c: my_stprintf_s(buffer, buffer_len, _T("ana a,d")); break;
1734                 case 0x8d: my_stprintf_s(buffer, buffer_len, _T("ana a,e")); break;
1735                 case 0x8e: my_stprintf_s(buffer, buffer_len, _T("ana a,h")); break;
1736                 case 0x8f: my_stprintf_s(buffer, buffer_len, _T("ana a,l")); break;
1737                 case 0x90: my_stprintf_s(buffer, buffer_len, _T("xra a,v")); break;
1738                 case 0x91: my_stprintf_s(buffer, buffer_len, _T("xra a,a")); break;
1739                 case 0x92: my_stprintf_s(buffer, buffer_len, _T("xra a,b")); break;
1740                 case 0x93: my_stprintf_s(buffer, buffer_len, _T("xra a,c")); break;
1741                 case 0x94: my_stprintf_s(buffer, buffer_len, _T("xra a,d")); break;
1742                 case 0x95: my_stprintf_s(buffer, buffer_len, _T("xra a,e")); break;
1743                 case 0x96: my_stprintf_s(buffer, buffer_len, _T("xra a,h")); break;
1744                 case 0x97: my_stprintf_s(buffer, buffer_len, _T("xra a,l")); break;
1745                 case 0x98: my_stprintf_s(buffer, buffer_len, _T("ora a,v")); break;
1746                 case 0x99: my_stprintf_s(buffer, buffer_len, _T("ora a,a")); break;
1747                 case 0x9a: my_stprintf_s(buffer, buffer_len, _T("ora a,b")); break;
1748                 case 0x9b: my_stprintf_s(buffer, buffer_len, _T("ora a,c")); break;
1749                 case 0x9c: my_stprintf_s(buffer, buffer_len, _T("ora a,d")); break;
1750                 case 0x9d: my_stprintf_s(buffer, buffer_len, _T("ora a,e")); break;
1751                 case 0x9e: my_stprintf_s(buffer, buffer_len, _T("ora a,h")); break;
1752                 case 0x9f: my_stprintf_s(buffer, buffer_len, _T("ora a,l")); break;
1753                 case 0xa0: my_stprintf_s(buffer, buffer_len, _T("addnc a,v")); break;
1754                 case 0xa1: my_stprintf_s(buffer, buffer_len, _T("addnc a,a")); break;
1755                 case 0xa2: my_stprintf_s(buffer, buffer_len, _T("addnc a,b")); break;
1756                 case 0xa3: my_stprintf_s(buffer, buffer_len, _T("addnc a,c")); break;
1757                 case 0xa4: my_stprintf_s(buffer, buffer_len, _T("addnc a,d")); break;
1758                 case 0xa5: my_stprintf_s(buffer, buffer_len, _T("addnc a,e")); break;
1759                 case 0xa6: my_stprintf_s(buffer, buffer_len, _T("addnc a,h")); break;
1760                 case 0xa7: my_stprintf_s(buffer, buffer_len, _T("addnc a,l")); break;
1761                 case 0xa8: my_stprintf_s(buffer, buffer_len, _T("gta a,v")); break;
1762                 case 0xa9: my_stprintf_s(buffer, buffer_len, _T("gta a,a")); break;
1763                 case 0xaa: my_stprintf_s(buffer, buffer_len, _T("gta a,b")); break;
1764                 case 0xab: my_stprintf_s(buffer, buffer_len, _T("gta a,c")); break;
1765                 case 0xac: my_stprintf_s(buffer, buffer_len, _T("gta a,d")); break;
1766                 case 0xad: my_stprintf_s(buffer, buffer_len, _T("gta a,e")); break;
1767                 case 0xae: my_stprintf_s(buffer, buffer_len, _T("gta a,h")); break;
1768                 case 0xaf: my_stprintf_s(buffer, buffer_len, _T("gta a,l")); break;
1769                 case 0xb0: my_stprintf_s(buffer, buffer_len, _T("subnb a,v")); break;
1770                 case 0xb1: my_stprintf_s(buffer, buffer_len, _T("subnb a,a")); break;
1771                 case 0xb2: my_stprintf_s(buffer, buffer_len, _T("subnb a,b")); break;
1772                 case 0xb3: my_stprintf_s(buffer, buffer_len, _T("subnb a,c")); break;
1773                 case 0xb4: my_stprintf_s(buffer, buffer_len, _T("subnb a,d")); break;
1774                 case 0xb5: my_stprintf_s(buffer, buffer_len, _T("subnb a,e")); break;
1775                 case 0xb6: my_stprintf_s(buffer, buffer_len, _T("subnb a,h")); break;
1776                 case 0xb7: my_stprintf_s(buffer, buffer_len, _T("subnb a,l")); break;
1777                 case 0xb8: my_stprintf_s(buffer, buffer_len, _T("lta a,v")); break;
1778                 case 0xb9: my_stprintf_s(buffer, buffer_len, _T("lta a,a")); break;
1779                 case 0xba: my_stprintf_s(buffer, buffer_len, _T("lta a,b")); break;
1780                 case 0xbb: my_stprintf_s(buffer, buffer_len, _T("lta a,c")); break;
1781                 case 0xbc: my_stprintf_s(buffer, buffer_len, _T("lta a,d")); break;
1782                 case 0xbd: my_stprintf_s(buffer, buffer_len, _T("lta a,e")); break;
1783                 case 0xbe: my_stprintf_s(buffer, buffer_len, _T("lta a,h")); break;
1784                 case 0xbf: my_stprintf_s(buffer, buffer_len, _T("lta a,l")); break;
1785                 case 0xc0: my_stprintf_s(buffer, buffer_len, _T("add a,v")); break;
1786                 case 0xc1: my_stprintf_s(buffer, buffer_len, _T("add a,a")); break;
1787                 case 0xc2: my_stprintf_s(buffer, buffer_len, _T("add a,b")); break;
1788                 case 0xc3: my_stprintf_s(buffer, buffer_len, _T("add a,c")); break;
1789                 case 0xc4: my_stprintf_s(buffer, buffer_len, _T("add a,d")); break;
1790                 case 0xc5: my_stprintf_s(buffer, buffer_len, _T("add a,e")); break;
1791                 case 0xc6: my_stprintf_s(buffer, buffer_len, _T("add a,h")); break;
1792                 case 0xc7: my_stprintf_s(buffer, buffer_len, _T("add a,l")); break;
1793                 case 0xc8: my_stprintf_s(buffer, buffer_len, _T("ona a,v")); break;
1794                 case 0xc9: my_stprintf_s(buffer, buffer_len, _T("ona a,a")); break;
1795                 case 0xca: my_stprintf_s(buffer, buffer_len, _T("ona a,b")); break;
1796                 case 0xcb: my_stprintf_s(buffer, buffer_len, _T("ona a,c")); break;
1797                 case 0xcc: my_stprintf_s(buffer, buffer_len, _T("ona a,d")); break;
1798                 case 0xcd: my_stprintf_s(buffer, buffer_len, _T("ona a,e")); break;
1799                 case 0xce: my_stprintf_s(buffer, buffer_len, _T("ona a,h")); break;
1800                 case 0xcf: my_stprintf_s(buffer, buffer_len, _T("ona a,l")); break;
1801                 case 0xd0: my_stprintf_s(buffer, buffer_len, _T("adc a,v")); break;
1802                 case 0xd1: my_stprintf_s(buffer, buffer_len, _T("adc a,a")); break;
1803                 case 0xd2: my_stprintf_s(buffer, buffer_len, _T("adc a,b")); break;
1804                 case 0xd3: my_stprintf_s(buffer, buffer_len, _T("adc a,c")); break;
1805                 case 0xd4: my_stprintf_s(buffer, buffer_len, _T("adc a,d")); break;
1806                 case 0xd5: my_stprintf_s(buffer, buffer_len, _T("adc a,e")); break;
1807                 case 0xd6: my_stprintf_s(buffer, buffer_len, _T("adc a,h")); break;
1808                 case 0xd7: my_stprintf_s(buffer, buffer_len, _T("adc a,l")); break;
1809                 case 0xd8: my_stprintf_s(buffer, buffer_len, _T("offa a,v")); break;
1810                 case 0xd9: my_stprintf_s(buffer, buffer_len, _T("offa a,a")); break;
1811                 case 0xda: my_stprintf_s(buffer, buffer_len, _T("offa a,b")); break;
1812                 case 0xdb: my_stprintf_s(buffer, buffer_len, _T("offa a,c")); break;
1813                 case 0xdc: my_stprintf_s(buffer, buffer_len, _T("offa a,d")); break;
1814                 case 0xdd: my_stprintf_s(buffer, buffer_len, _T("offa a,e")); break;
1815                 case 0xde: my_stprintf_s(buffer, buffer_len, _T("offa a,h")); break;
1816                 case 0xdf: my_stprintf_s(buffer, buffer_len, _T("offa a,l")); break;
1817                 case 0xe0: my_stprintf_s(buffer, buffer_len, _T("sub a,v")); break;
1818                 case 0xe1: my_stprintf_s(buffer, buffer_len, _T("sub a,a")); break;
1819                 case 0xe2: my_stprintf_s(buffer, buffer_len, _T("sub a,b")); break;
1820                 case 0xe3: my_stprintf_s(buffer, buffer_len, _T("sub a,c")); break;
1821                 case 0xe4: my_stprintf_s(buffer, buffer_len, _T("sub a,d")); break;
1822                 case 0xe5: my_stprintf_s(buffer, buffer_len, _T("sub a,e")); break;
1823                 case 0xe6: my_stprintf_s(buffer, buffer_len, _T("sub a,h")); break;
1824                 case 0xe7: my_stprintf_s(buffer, buffer_len, _T("sub a,l")); break;
1825                 case 0xe8: my_stprintf_s(buffer, buffer_len, _T("nea a,v")); break;
1826                 case 0xe9: my_stprintf_s(buffer, buffer_len, _T("nea a,a")); break;
1827                 case 0xea: my_stprintf_s(buffer, buffer_len, _T("nea a,b")); break;
1828                 case 0xeb: my_stprintf_s(buffer, buffer_len, _T("nea a,c")); break;
1829                 case 0xec: my_stprintf_s(buffer, buffer_len, _T("nea a,d")); break;
1830                 case 0xed: my_stprintf_s(buffer, buffer_len, _T("nea a,e")); break;
1831                 case 0xee: my_stprintf_s(buffer, buffer_len, _T("nea a,h")); break;
1832                 case 0xef: my_stprintf_s(buffer, buffer_len, _T("nea a,l")); break;
1833                 case 0xf0: my_stprintf_s(buffer, buffer_len, _T("sbb a,v")); break;
1834                 case 0xf1: my_stprintf_s(buffer, buffer_len, _T("sbb a,a")); break;
1835                 case 0xf2: my_stprintf_s(buffer, buffer_len, _T("sbb a,b")); break;
1836                 case 0xf3: my_stprintf_s(buffer, buffer_len, _T("sbb a,c")); break;
1837                 case 0xf4: my_stprintf_s(buffer, buffer_len, _T("sbb a,d")); break;
1838                 case 0xf5: my_stprintf_s(buffer, buffer_len, _T("sbb a,e")); break;
1839                 case 0xf6: my_stprintf_s(buffer, buffer_len, _T("sbb a,h")); break;
1840                 case 0xf7: my_stprintf_s(buffer, buffer_len, _T("sbb a,l")); break;
1841                 case 0xf8: my_stprintf_s(buffer, buffer_len, _T("eqa a,v")); break;
1842                 case 0xf9: my_stprintf_s(buffer, buffer_len, _T("eqa a,a")); break;
1843                 case 0xfa: my_stprintf_s(buffer, buffer_len, _T("eqa a,b")); break;
1844                 case 0xfb: my_stprintf_s(buffer, buffer_len, _T("eqa a,c")); break;
1845                 case 0xfc: my_stprintf_s(buffer, buffer_len, _T("eqa a,d")); break;
1846                 case 0xfd: my_stprintf_s(buffer, buffer_len, _T("eqa a,e")); break;
1847                 case 0xfe: my_stprintf_s(buffer, buffer_len, _T("eqa a,h")); break;
1848                 case 0xff: my_stprintf_s(buffer, buffer_len, _T("eqa a,l")); break;
1849                 default: my_stprintf_s(buffer, buffer_len, _T("db 60h,%02xh"), b);
1850                 }
1851                 break;
1852         case 0x61: my_stprintf_s(buffer, buffer_len, _T("daa")); break;
1853         case 0x62: my_stprintf_s(buffer, buffer_len, _T("reti")); break;
1854         case 0x63: my_stprintf_s(buffer, buffer_len, _T("calb")); break;
1855         case 0x64:
1856                 switch(b = getb()) {
1857                 case 0x08: my_stprintf_s(buffer, buffer_len, _T("ani v,%02xh"), getb()); break;
1858                 case 0x09: my_stprintf_s(buffer, buffer_len, _T("ani a,%02xh"), getb()); break;
1859                 case 0x0a: my_stprintf_s(buffer, buffer_len, _T("ani b,%02xh"), getb()); break;
1860                 case 0x0b: my_stprintf_s(buffer, buffer_len, _T("ani c,%02xh"), getb()); break;
1861                 case 0x0c: my_stprintf_s(buffer, buffer_len, _T("ani d,%02xh"), getb()); break;
1862                 case 0x0d: my_stprintf_s(buffer, buffer_len, _T("ani e,%02xh"), getb()); break;
1863                 case 0x0e: my_stprintf_s(buffer, buffer_len, _T("ani h,%02xh"), getb()); break;
1864                 case 0x0f: my_stprintf_s(buffer, buffer_len, _T("ani l,%02xh"), getb()); break;
1865                 case 0x10: my_stprintf_s(buffer, buffer_len, _T("xri v,%02xh"), getb()); break;
1866                 case 0x11: my_stprintf_s(buffer, buffer_len, _T("xri a,%02xh"), getb()); break;
1867                 case 0x12: my_stprintf_s(buffer, buffer_len, _T("xri b,%02xh"), getb()); break;
1868                 case 0x13: my_stprintf_s(buffer, buffer_len, _T("xri c,%02xh"), getb()); break;
1869                 case 0x14: my_stprintf_s(buffer, buffer_len, _T("xri d,%02xh"), getb()); break;
1870                 case 0x15: my_stprintf_s(buffer, buffer_len, _T("xri e,%02xh"), getb()); break;
1871                 case 0x16: my_stprintf_s(buffer, buffer_len, _T("xri h,%02xh"), getb()); break;
1872                 case 0x17: my_stprintf_s(buffer, buffer_len, _T("xri l,%02xh"), getb()); break;
1873                 case 0x18: my_stprintf_s(buffer, buffer_len, _T("ori v,%02xh"), getb()); break;
1874                 case 0x19: my_stprintf_s(buffer, buffer_len, _T("ori a,%02xh"), getb()); break;
1875                 case 0x1a: my_stprintf_s(buffer, buffer_len, _T("ori b,%02xh"), getb()); break;
1876                 case 0x1b: my_stprintf_s(buffer, buffer_len, _T("ori c,%02xh"), getb()); break;
1877                 case 0x1c: my_stprintf_s(buffer, buffer_len, _T("ori d,%02xh"), getb()); break;
1878                 case 0x1d: my_stprintf_s(buffer, buffer_len, _T("ori e,%02xh"), getb()); break;
1879                 case 0x1e: my_stprintf_s(buffer, buffer_len, _T("ori h,%02xh"), getb()); break;
1880                 case 0x1f: my_stprintf_s(buffer, buffer_len, _T("ori l,%02xh"), getb()); break;
1881                 case 0x20: my_stprintf_s(buffer, buffer_len, _T("adinc v,%02xh"), getb()); break;
1882                 case 0x21: my_stprintf_s(buffer, buffer_len, _T("adinc a,%02xh"), getb()); break;
1883                 case 0x22: my_stprintf_s(buffer, buffer_len, _T("adinc b,%02xh"), getb()); break;
1884                 case 0x23: my_stprintf_s(buffer, buffer_len, _T("adinc c,%02xh"), getb()); break;
1885                 case 0x24: my_stprintf_s(buffer, buffer_len, _T("adinc d,%02xh"), getb()); break;
1886                 case 0x25: my_stprintf_s(buffer, buffer_len, _T("adinc e,%02xh"), getb()); break;
1887                 case 0x26: my_stprintf_s(buffer, buffer_len, _T("adinc h,%02xh"), getb()); break;
1888                 case 0x27: my_stprintf_s(buffer, buffer_len, _T("adinc l,%02xh"), getb()); break;
1889                 case 0x28: my_stprintf_s(buffer, buffer_len, _T("gti v,%02xh"), getb()); break;
1890                 case 0x29: my_stprintf_s(buffer, buffer_len, _T("gti a,%02xh"), getb()); break;
1891                 case 0x2a: my_stprintf_s(buffer, buffer_len, _T("gti b,%02xh"), getb()); break;
1892                 case 0x2b: my_stprintf_s(buffer, buffer_len, _T("gti c,%02xh"), getb()); break;
1893                 case 0x2c: my_stprintf_s(buffer, buffer_len, _T("gti d,%02xh"), getb()); break;
1894                 case 0x2d: my_stprintf_s(buffer, buffer_len, _T("gti e,%02xh"), getb()); break;
1895                 case 0x2e: my_stprintf_s(buffer, buffer_len, _T("gti h,%02xh"), getb()); break;
1896                 case 0x2f: my_stprintf_s(buffer, buffer_len, _T("gti l,%02xh"), getb()); break;
1897                 case 0x30: my_stprintf_s(buffer, buffer_len, _T("suinb v,%02xh"), getb()); break;
1898                 case 0x31: my_stprintf_s(buffer, buffer_len, _T("suinb a,%02xh"), getb()); break;
1899                 case 0x32: my_stprintf_s(buffer, buffer_len, _T("suinb b,%02xh"), getb()); break;
1900                 case 0x33: my_stprintf_s(buffer, buffer_len, _T("suinb c,%02xh"), getb()); break;
1901                 case 0x34: my_stprintf_s(buffer, buffer_len, _T("suinb d,%02xh"), getb()); break;
1902                 case 0x35: my_stprintf_s(buffer, buffer_len, _T("suinb e,%02xh"), getb()); break;
1903                 case 0x36: my_stprintf_s(buffer, buffer_len, _T("suinb h,%02xh"), getb()); break;
1904                 case 0x37: my_stprintf_s(buffer, buffer_len, _T("suinb l,%02xh"), getb()); break;
1905                 case 0x38: my_stprintf_s(buffer, buffer_len, _T("lti v,%02xh"), getb()); break;
1906                 case 0x39: my_stprintf_s(buffer, buffer_len, _T("lti a,%02xh"), getb()); break;
1907                 case 0x3a: my_stprintf_s(buffer, buffer_len, _T("lti b,%02xh"), getb()); break;
1908                 case 0x3b: my_stprintf_s(buffer, buffer_len, _T("lti c,%02xh"), getb()); break;
1909                 case 0x3c: my_stprintf_s(buffer, buffer_len, _T("lti d,%02xh"), getb()); break;
1910                 case 0x3d: my_stprintf_s(buffer, buffer_len, _T("lti e,%02xh"), getb()); break;
1911                 case 0x3e: my_stprintf_s(buffer, buffer_len, _T("lti h,%02xh"), getb()); break;
1912                 case 0x3f: my_stprintf_s(buffer, buffer_len, _T("lti l,%02xh"), getb()); break;
1913                 case 0x40: my_stprintf_s(buffer, buffer_len, _T("adi v,%02xh"), getb()); break;
1914                 case 0x41: my_stprintf_s(buffer, buffer_len, _T("adi a,%02xh"), getb()); break;
1915                 case 0x42: my_stprintf_s(buffer, buffer_len, _T("adi b,%02xh"), getb()); break;
1916                 case 0x43: my_stprintf_s(buffer, buffer_len, _T("adi c,%02xh"), getb()); break;
1917                 case 0x44: my_stprintf_s(buffer, buffer_len, _T("adi d,%02xh"), getb()); break;
1918                 case 0x45: my_stprintf_s(buffer, buffer_len, _T("adi e,%02xh"), getb()); break;
1919                 case 0x46: my_stprintf_s(buffer, buffer_len, _T("adi h,%02xh"), getb()); break;
1920                 case 0x47: my_stprintf_s(buffer, buffer_len, _T("adi l,%02xh"), getb()); break;
1921                 case 0x48: my_stprintf_s(buffer, buffer_len, _T("oni v,%02xh"), getb()); break;
1922                 case 0x49: my_stprintf_s(buffer, buffer_len, _T("oni a,%02xh"), getb()); break;
1923                 case 0x4a: my_stprintf_s(buffer, buffer_len, _T("oni b,%02xh"), getb()); break;
1924                 case 0x4b: my_stprintf_s(buffer, buffer_len, _T("oni c,%02xh"), getb()); break;
1925                 case 0x4c: my_stprintf_s(buffer, buffer_len, _T("oni d,%02xh"), getb()); break;
1926                 case 0x4d: my_stprintf_s(buffer, buffer_len, _T("oni e,%02xh"), getb()); break;
1927                 case 0x4e: my_stprintf_s(buffer, buffer_len, _T("oni h,%02xh"), getb()); break;
1928                 case 0x4f: my_stprintf_s(buffer, buffer_len, _T("oni l,%02xh"), getb()); break;
1929                 case 0x50: my_stprintf_s(buffer, buffer_len, _T("aci v,%02xh"), getb()); break;
1930                 case 0x51: my_stprintf_s(buffer, buffer_len, _T("aci a,%02xh"), getb()); break;
1931                 case 0x52: my_stprintf_s(buffer, buffer_len, _T("aci b,%02xh"), getb()); break;
1932                 case 0x53: my_stprintf_s(buffer, buffer_len, _T("aci c,%02xh"), getb()); break;
1933                 case 0x54: my_stprintf_s(buffer, buffer_len, _T("aci d,%02xh"), getb()); break;
1934                 case 0x55: my_stprintf_s(buffer, buffer_len, _T("aci e,%02xh"), getb()); break;
1935                 case 0x56: my_stprintf_s(buffer, buffer_len, _T("aci h,%02xh"), getb()); break;
1936                 case 0x57: my_stprintf_s(buffer, buffer_len, _T("aci l,%02xh"), getb()); break;
1937                 case 0x58: my_stprintf_s(buffer, buffer_len, _T("offi v,%02xh"), getb()); break;
1938                 case 0x59: my_stprintf_s(buffer, buffer_len, _T("offi a,%02xh"), getb()); break;
1939                 case 0x5a: my_stprintf_s(buffer, buffer_len, _T("offi b,%02xh"), getb()); break;
1940                 case 0x5b: my_stprintf_s(buffer, buffer_len, _T("offi c,%02xh"), getb()); break;
1941                 case 0x5c: my_stprintf_s(buffer, buffer_len, _T("offi d,%02xh"), getb()); break;
1942                 case 0x5d: my_stprintf_s(buffer, buffer_len, _T("offi e,%02xh"), getb()); break;
1943                 case 0x5e: my_stprintf_s(buffer, buffer_len, _T("offi h,%02xh"), getb()); break;
1944                 case 0x5f: my_stprintf_s(buffer, buffer_len, _T("offi l,%02xh"), getb()); break;
1945                 case 0x60: my_stprintf_s(buffer, buffer_len, _T("sui v,%02xh"), getb()); break;
1946                 case 0x61: my_stprintf_s(buffer, buffer_len, _T("sui a,%02xh"), getb()); break;
1947                 case 0x62: my_stprintf_s(buffer, buffer_len, _T("sui b,%02xh"), getb()); break;
1948                 case 0x63: my_stprintf_s(buffer, buffer_len, _T("sui c,%02xh"), getb()); break;
1949                 case 0x64: my_stprintf_s(buffer, buffer_len, _T("sui d,%02xh"), getb()); break;
1950                 case 0x65: my_stprintf_s(buffer, buffer_len, _T("sui e,%02xh"), getb()); break;
1951                 case 0x66: my_stprintf_s(buffer, buffer_len, _T("sui h,%02xh"), getb()); break;
1952                 case 0x67: my_stprintf_s(buffer, buffer_len, _T("sui l,%02xh"), getb()); break;
1953                 case 0x68: my_stprintf_s(buffer, buffer_len, _T("nei v,%02xh"), getb()); break;
1954                 case 0x69: my_stprintf_s(buffer, buffer_len, _T("nei a,%02xh"), getb()); break;
1955                 case 0x6a: my_stprintf_s(buffer, buffer_len, _T("nei b,%02xh"), getb()); break;
1956                 case 0x6b: my_stprintf_s(buffer, buffer_len, _T("nei c,%02xh"), getb()); break;
1957                 case 0x6c: my_stprintf_s(buffer, buffer_len, _T("nei d,%02xh"), getb()); break;
1958                 case 0x6d: my_stprintf_s(buffer, buffer_len, _T("nei e,%02xh"), getb()); break;
1959                 case 0x6e: my_stprintf_s(buffer, buffer_len, _T("nei h,%02xh"), getb()); break;
1960                 case 0x6f: my_stprintf_s(buffer, buffer_len, _T("nei l,%02xh"), getb()); break;
1961                 case 0x70: my_stprintf_s(buffer, buffer_len, _T("sbi v,%02xh"), getb()); break;
1962                 case 0x71: my_stprintf_s(buffer, buffer_len, _T("sbi a,%02xh"), getb()); break;
1963                 case 0x72: my_stprintf_s(buffer, buffer_len, _T("sbi b,%02xh"), getb()); break;
1964                 case 0x73: my_stprintf_s(buffer, buffer_len, _T("sbi c,%02xh"), getb()); break;
1965                 case 0x74: my_stprintf_s(buffer, buffer_len, _T("sbi d,%02xh"), getb()); break;
1966                 case 0x75: my_stprintf_s(buffer, buffer_len, _T("sbi e,%02xh"), getb()); break;
1967                 case 0x76: my_stprintf_s(buffer, buffer_len, _T("sbi h,%02xh"), getb()); break;
1968                 case 0x77: my_stprintf_s(buffer, buffer_len, _T("sbi l,%02xh"), getb()); break;
1969                 case 0x78: my_stprintf_s(buffer, buffer_len, _T("eqi v,%02xh"), getb()); break;
1970                 case 0x79: my_stprintf_s(buffer, buffer_len, _T("eqi a,%02xh"), getb()); break;
1971                 case 0x7a: my_stprintf_s(buffer, buffer_len, _T("eqi b,%02xh"), getb()); break;
1972                 case 0x7b: my_stprintf_s(buffer, buffer_len, _T("eqi c,%02xh"), getb()); break;
1973                 case 0x7c: my_stprintf_s(buffer, buffer_len, _T("eqi d,%02xh"), getb()); break;
1974                 case 0x7d: my_stprintf_s(buffer, buffer_len, _T("eqi e,%02xh"), getb()); break;
1975                 case 0x7e: my_stprintf_s(buffer, buffer_len, _T("eqi h,%02xh"), getb()); break;
1976                 case 0x7f: my_stprintf_s(buffer, buffer_len, _T("eqi l,%02xh"), getb()); break;
1977                 case 0x88: my_stprintf_s(buffer, buffer_len, _T("ani pa,%02xh"), getb()); break;
1978                 case 0x89: my_stprintf_s(buffer, buffer_len, _T("ani pb,%02xh"), getb()); break;
1979                 case 0x8a: my_stprintf_s(buffer, buffer_len, _T("ani pc,%02xh"), getb()); break;
1980                 case 0x8b: my_stprintf_s(buffer, buffer_len, _T("ani mk,%02xh"), getb()); break;
1981                 case 0x90: my_stprintf_s(buffer, buffer_len, _T("xri pa,%02xh"), getb()); break;
1982                 case 0x91: my_stprintf_s(buffer, buffer_len, _T("xri pb,%02xh"), getb()); break;
1983                 case 0x92: my_stprintf_s(buffer, buffer_len, _T("xri pc,%02xh"), getb()); break;
1984                 case 0x93: my_stprintf_s(buffer, buffer_len, _T("xri mk,%02xh"), getb()); break;
1985                 case 0x98: my_stprintf_s(buffer, buffer_len, _T("ori pa,%02xh"), getb()); break;
1986                 case 0x99: my_stprintf_s(buffer, buffer_len, _T("ori pb,%02xh"), getb()); break;
1987                 case 0x9a: my_stprintf_s(buffer, buffer_len, _T("ori pc,%02xh"), getb()); break;
1988                 case 0x9b: my_stprintf_s(buffer, buffer_len, _T("ori mk,%02xh"), getb()); break;
1989                 case 0xa0: my_stprintf_s(buffer, buffer_len, _T("adinc pa,%02xh"), getb()); break;
1990                 case 0xa1: my_stprintf_s(buffer, buffer_len, _T("adinc pb,%02xh"), getb()); break;
1991                 case 0xa2: my_stprintf_s(buffer, buffer_len, _T("adinc pc,%02xh"), getb()); break;
1992                 case 0xa3: my_stprintf_s(buffer, buffer_len, _T("adinc mk,%02xh"), getb()); break;
1993                 case 0xa8: my_stprintf_s(buffer, buffer_len, _T("gti pa,%02xh"), getb()); break;
1994                 case 0xa9: my_stprintf_s(buffer, buffer_len, _T("gti pb,%02xh"), getb()); break;
1995                 case 0xaa: my_stprintf_s(buffer, buffer_len, _T("gti pc,%02xh"), getb()); break;
1996                 case 0xab: my_stprintf_s(buffer, buffer_len, _T("gti mk,%02xh"), getb()); break;
1997                 case 0xb0: my_stprintf_s(buffer, buffer_len, _T("suinb pa,%02xh"), getb()); break;
1998                 case 0xb1: my_stprintf_s(buffer, buffer_len, _T("suinb pb,%02xh"), getb()); break;
1999                 case 0xb2: my_stprintf_s(buffer, buffer_len, _T("suinb pc,%02xh"), getb()); break;
2000                 case 0xb3: my_stprintf_s(buffer, buffer_len, _T("suinb mk,%02xh"), getb()); break;
2001                 case 0xb8: my_stprintf_s(buffer, buffer_len, _T("lti pa,%02xh"), getb()); break;
2002                 case 0xb9: my_stprintf_s(buffer, buffer_len, _T("lti pb,%02xh"), getb()); break;
2003                 case 0xba: my_stprintf_s(buffer, buffer_len, _T("lti pc,%02xh"), getb()); break;
2004                 case 0xbb: my_stprintf_s(buffer, buffer_len, _T("lti mk,%02xh"), getb()); break;
2005                 case 0xc0: my_stprintf_s(buffer, buffer_len, _T("adi pa,%02xh"), getb()); break;
2006                 case 0xc1: my_stprintf_s(buffer, buffer_len, _T("adi pb,%02xh"), getb()); break;
2007                 case 0xc2: my_stprintf_s(buffer, buffer_len, _T("adi pc,%02xh"), getb()); break;
2008                 case 0xc3: my_stprintf_s(buffer, buffer_len, _T("adi mk,%02xh"), getb()); break;
2009                 case 0xc8: my_stprintf_s(buffer, buffer_len, _T("oni pa,%02xh"), getb()); break;
2010                 case 0xc9: my_stprintf_s(buffer, buffer_len, _T("oni pb,%02xh"), getb()); break;
2011                 case 0xca: my_stprintf_s(buffer, buffer_len, _T("oni pc,%02xh"), getb()); break;
2012                 case 0xcb: my_stprintf_s(buffer, buffer_len, _T("oni mk,%02xh"), getb()); break;
2013                 case 0xd0: my_stprintf_s(buffer, buffer_len, _T("aci pa,%02xh"), getb()); break;
2014                 case 0xd1: my_stprintf_s(buffer, buffer_len, _T("aci pb,%02xh"), getb()); break;
2015                 case 0xd2: my_stprintf_s(buffer, buffer_len, _T("aci pc,%02xh"), getb()); break;
2016                 case 0xd3: my_stprintf_s(buffer, buffer_len, _T("aci mk,%02xh"), getb()); break;
2017                 case 0xd8: my_stprintf_s(buffer, buffer_len, _T("offi pa,%02xh"), getb()); break;
2018                 case 0xd9: my_stprintf_s(buffer, buffer_len, _T("offi pb,%02xh"), getb()); break;
2019                 case 0xda: my_stprintf_s(buffer, buffer_len, _T("offi pc,%02xh"), getb()); break;
2020                 case 0xdb: my_stprintf_s(buffer, buffer_len, _T("offi mk,%02xh"), getb()); break;
2021                 case 0xe0: my_stprintf_s(buffer, buffer_len, _T("sui pa,%02xh"), getb()); break;
2022                 case 0xe1: my_stprintf_s(buffer, buffer_len, _T("sui pb,%02xh"), getb()); break;
2023                 case 0xe2: my_stprintf_s(buffer, buffer_len, _T("sui pc,%02xh"), getb()); break;
2024                 case 0xe3: my_stprintf_s(buffer, buffer_len, _T("sui mk,%02xh"), getb()); break;
2025                 case 0xe8: my_stprintf_s(buffer, buffer_len, _T("nei pa,%02xh"), getb()); break;
2026                 case 0xe9: my_stprintf_s(buffer, buffer_len, _T("nei pb,%02xh"), getb()); break;
2027                 case 0xea: my_stprintf_s(buffer, buffer_len, _T("nei pc,%02xh"), getb()); break;
2028                 case 0xeb: my_stprintf_s(buffer, buffer_len, _T("nei mk,%02xh"), getb()); break;
2029                 case 0xf0: my_stprintf_s(buffer, buffer_len, _T("sbi pa,%02xh"), getb()); break;
2030                 case 0xf1: my_stprintf_s(buffer, buffer_len, _T("sbi pb,%02xh"), getb()); break;
2031                 case 0xf2: my_stprintf_s(buffer, buffer_len, _T("sbi pc,%02xh"), getb()); break;
2032                 case 0xf3: my_stprintf_s(buffer, buffer_len, _T("sbi mk,%02xh"), getb()); break;
2033                 case 0xf8: my_stprintf_s(buffer, buffer_len, _T("eqi pa,%02xh"), getb()); break;
2034                 case 0xf9: my_stprintf_s(buffer, buffer_len, _T("eqi pb,%02xh"), getb()); break;
2035                 case 0xfa: my_stprintf_s(buffer, buffer_len, _T("eqi pc,%02xh"), getb()); break;
2036                 case 0xfb: my_stprintf_s(buffer, buffer_len, _T("eqi mk,%02xh"), getb()); break;
2037                 default: my_stprintf_s(buffer, buffer_len, _T("db 64h,%02xh"), b);
2038                 }
2039                 break;
2040         case 0x65: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("neiw v.%02xh,%02xh"), wa, getb()); break;
2041         case 0x66: my_stprintf_s(buffer, buffer_len, _T("sui a,%02xh"), getb()); break;
2042         case 0x67: my_stprintf_s(buffer, buffer_len, _T("nei a,%02xh"), getb()); break;
2043         case 0x68: my_stprintf_s(buffer, buffer_len, _T("mvi v,%02xh"), getb()); break;
2044         case 0x69: my_stprintf_s(buffer, buffer_len, _T("mvi a,%02xh"), getb()); break;
2045         case 0x6a: my_stprintf_s(buffer, buffer_len, _T("mvi b,%02xh"), getb()); break;
2046         case 0x6b: my_stprintf_s(buffer, buffer_len, _T("mvi c,%02xh"), getb()); break;
2047         case 0x6c: my_stprintf_s(buffer, buffer_len, _T("mvi d,%02xh"), getb()); break;
2048         case 0x6d: my_stprintf_s(buffer, buffer_len, _T("mvi e,%02xh"), getb()); break;
2049         case 0x6e: my_stprintf_s(buffer, buffer_len, _T("mvi h,%02xh"), getb()); break;
2050         case 0x6f: my_stprintf_s(buffer, buffer_len, _T("mvi l,%02xh"), getb()); break;
2051         
2052         case 0x70:
2053                 switch(b = getb()) {
2054                 case 0x0e: my_stprintf_s(buffer, buffer_len, _T("sspd %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2055                 case 0x0f: my_stprintf_s(buffer, buffer_len, _T("lspd %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2056                 case 0x1e: my_stprintf_s(buffer, buffer_len, _T("sbcd %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2057                 case 0x1f: my_stprintf_s(buffer, buffer_len, _T("lbcd %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2058                 case 0x2e: my_stprintf_s(buffer, buffer_len, _T("sded %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2059                 case 0x2f: my_stprintf_s(buffer, buffer_len, _T("lded %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2060                 case 0x3e: my_stprintf_s(buffer, buffer_len, _T("shld %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2061                 case 0x3f: my_stprintf_s(buffer, buffer_len, _T("lhld %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2062                 case 0x68: my_stprintf_s(buffer, buffer_len, _T("mov v,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2063                 case 0x69: my_stprintf_s(buffer, buffer_len, _T("mov a,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2064                 case 0x6a: my_stprintf_s(buffer, buffer_len, _T("mov b,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2065                 case 0x6b: my_stprintf_s(buffer, buffer_len, _T("mov c,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2066                 case 0x6c: my_stprintf_s(buffer, buffer_len, _T("mov d,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2067                 case 0x6d: my_stprintf_s(buffer, buffer_len, _T("mov e,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2068                 case 0x6e: my_stprintf_s(buffer, buffer_len, _T("mov h,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2069                 case 0x6f: my_stprintf_s(buffer, buffer_len, _T("mov l,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2070                 case 0x78: my_stprintf_s(buffer, buffer_len, _T("mov %s,v"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2071                 case 0x79: my_stprintf_s(buffer, buffer_len, _T("mov %s,a"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2072                 case 0x7a: my_stprintf_s(buffer, buffer_len, _T("mov %s,b"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2073                 case 0x7b: my_stprintf_s(buffer, buffer_len, _T("mov %s,c"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2074                 case 0x7c: my_stprintf_s(buffer, buffer_len, _T("mov %s,d"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2075                 case 0x7d: my_stprintf_s(buffer, buffer_len, _T("mov %s,e"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2076                 case 0x7e: my_stprintf_s(buffer, buffer_len, _T("mov %s,h"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2077                 case 0x7f: my_stprintf_s(buffer, buffer_len, _T("mov %s,l"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), getw())); break;
2078                 case 0x89: my_stprintf_s(buffer, buffer_len, _T("anax b")); break;
2079                 case 0x8a: my_stprintf_s(buffer, buffer_len, _T("anax d")); break;
2080                 case 0x8b: my_stprintf_s(buffer, buffer_len, _T("anax h")); break;
2081                 case 0x8c: my_stprintf_s(buffer, buffer_len, _T("anax d+")); break;
2082                 case 0x8d: my_stprintf_s(buffer, buffer_len, _T("anax h+")); break;
2083                 case 0x8e: my_stprintf_s(buffer, buffer_len, _T("anax d-")); break;
2084                 case 0x8f: my_stprintf_s(buffer, buffer_len, _T("anax h-")); break;
2085                 case 0x91: my_stprintf_s(buffer, buffer_len, _T("xrax b")); break;
2086                 case 0x92: my_stprintf_s(buffer, buffer_len, _T("xrax d")); break;
2087                 case 0x93: my_stprintf_s(buffer, buffer_len, _T("xrax h")); break;
2088                 case 0x94: my_stprintf_s(buffer, buffer_len, _T("xrax d+")); break;
2089                 case 0x95: my_stprintf_s(buffer, buffer_len, _T("xrax h+")); break;
2090                 case 0x96: my_stprintf_s(buffer, buffer_len, _T("xrax d-")); break;
2091                 case 0x97: my_stprintf_s(buffer, buffer_len, _T("xrax h-")); break;
2092                 case 0x99: my_stprintf_s(buffer, buffer_len, _T("orax b")); break;
2093                 case 0x9a: my_stprintf_s(buffer, buffer_len, _T("orax d")); break;
2094                 case 0x9b: my_stprintf_s(buffer, buffer_len, _T("orax h")); break;
2095                 case 0x9c: my_stprintf_s(buffer, buffer_len, _T("orax d+")); break;
2096                 case 0x9d: my_stprintf_s(buffer, buffer_len, _T("orax h+")); break;
2097                 case 0x9e: my_stprintf_s(buffer, buffer_len, _T("orax d-")); break;
2098                 case 0x9f: my_stprintf_s(buffer, buffer_len, _T("orax h-")); break;
2099                 case 0xa1: my_stprintf_s(buffer, buffer_len, _T("addncx b")); break;
2100                 case 0xa2: my_stprintf_s(buffer, buffer_len, _T("addncx d")); break;
2101                 case 0xa3: my_stprintf_s(buffer, buffer_len, _T("addncx h")); break;
2102                 case 0xa4: my_stprintf_s(buffer, buffer_len, _T("addncx d+")); break;
2103                 case 0xa5: my_stprintf_s(buffer, buffer_len, _T("addncx h+")); break;
2104                 case 0xa6: my_stprintf_s(buffer, buffer_len, _T("addncx d-")); break;
2105                 case 0xa7: my_stprintf_s(buffer, buffer_len, _T("addncx h-")); break;
2106                 case 0xa9: my_stprintf_s(buffer, buffer_len, _T("gtax b")); break;
2107                 case 0xaa: my_stprintf_s(buffer, buffer_len, _T("gtax d")); break;
2108                 case 0xab: my_stprintf_s(buffer, buffer_len, _T("gtax h")); break;
2109                 case 0xac: my_stprintf_s(buffer, buffer_len, _T("gtax d+")); break;
2110                 case 0xad: my_stprintf_s(buffer, buffer_len, _T("gtax h+")); break;
2111                 case 0xae: my_stprintf_s(buffer, buffer_len, _T("gtax d-")); break;
2112                 case 0xaf: my_stprintf_s(buffer, buffer_len, _T("gtax h-")); break;
2113                 case 0xb1: my_stprintf_s(buffer, buffer_len, _T("subnbx b")); break;
2114                 case 0xb2: my_stprintf_s(buffer, buffer_len, _T("subnbx d")); break;
2115                 case 0xb3: my_stprintf_s(buffer, buffer_len, _T("subnbx h")); break;
2116                 case 0xb4: my_stprintf_s(buffer, buffer_len, _T("subnbx d+")); break;
2117                 case 0xb5: my_stprintf_s(buffer, buffer_len, _T("subnbx h+")); break;
2118                 case 0xb6: my_stprintf_s(buffer, buffer_len, _T("subnbx d-")); break;
2119                 case 0xb7: my_stprintf_s(buffer, buffer_len, _T("subnbx h-")); break;
2120                 case 0xb9: my_stprintf_s(buffer, buffer_len, _T("ltax b")); break;
2121                 case 0xba: my_stprintf_s(buffer, buffer_len, _T("ltax d")); break;
2122                 case 0xbb: my_stprintf_s(buffer, buffer_len, _T("ltax h")); break;
2123                 case 0xbc: my_stprintf_s(buffer, buffer_len, _T("ltax d+")); break;
2124                 case 0xbd: my_stprintf_s(buffer, buffer_len, _T("ltax h+")); break;
2125                 case 0xbe: my_stprintf_s(buffer, buffer_len, _T("ltax d-")); break;
2126                 case 0xbf: my_stprintf_s(buffer, buffer_len, _T("ltax h-")); break;
2127                 case 0xc1: my_stprintf_s(buffer, buffer_len, _T("addx b")); break;
2128                 case 0xc2: my_stprintf_s(buffer, buffer_len, _T("addx d")); break;
2129                 case 0xc3: my_stprintf_s(buffer, buffer_len, _T("addx h")); break;
2130                 case 0xc4: my_stprintf_s(buffer, buffer_len, _T("addx d+")); break;
2131                 case 0xc5: my_stprintf_s(buffer, buffer_len, _T("addx h+")); break;
2132                 case 0xc6: my_stprintf_s(buffer, buffer_len, _T("addx d-")); break;
2133                 case 0xc7: my_stprintf_s(buffer, buffer_len, _T("addx h-")); break;
2134                 case 0xc9: my_stprintf_s(buffer, buffer_len, _T("onax b")); break;
2135                 case 0xca: my_stprintf_s(buffer, buffer_len, _T("onax d")); break;
2136                 case 0xcb: my_stprintf_s(buffer, buffer_len, _T("onax h")); break;
2137                 case 0xcc: my_stprintf_s(buffer, buffer_len, _T("onax d+")); break;
2138                 case 0xcd: my_stprintf_s(buffer, buffer_len, _T("onax h+")); break;
2139                 case 0xce: my_stprintf_s(buffer, buffer_len, _T("onax d-")); break;
2140                 case 0xcf: my_stprintf_s(buffer, buffer_len, _T("onax h-")); break;
2141                 case 0xd1: my_stprintf_s(buffer, buffer_len, _T("adcx b")); break;
2142                 case 0xd2: my_stprintf_s(buffer, buffer_len, _T("adcx d")); break;
2143                 case 0xd3: my_stprintf_s(buffer, buffer_len, _T("adcx h")); break;
2144                 case 0xd4: my_stprintf_s(buffer, buffer_len, _T("adcx d+")); break;
2145                 case 0xd5: my_stprintf_s(buffer, buffer_len, _T("adcx h+")); break;
2146                 case 0xd6: my_stprintf_s(buffer, buffer_len, _T("adcx d-")); break;
2147                 case 0xd7: my_stprintf_s(buffer, buffer_len, _T("adcx h-")); break;
2148                 case 0xd9: my_stprintf_s(buffer, buffer_len, _T("offax b")); break;
2149                 case 0xda: my_stprintf_s(buffer, buffer_len, _T("offax d")); break;
2150                 case 0xdb: my_stprintf_s(buffer, buffer_len, _T("offax h")); break;
2151                 case 0xdc: my_stprintf_s(buffer, buffer_len, _T("offax d+")); break;
2152                 case 0xdd: my_stprintf_s(buffer, buffer_len, _T("offax h+")); break;
2153                 case 0xde: my_stprintf_s(buffer, buffer_len, _T("offax d-")); break;
2154                 case 0xdf: my_stprintf_s(buffer, buffer_len, _T("offax h-")); break;
2155                 case 0xe1: my_stprintf_s(buffer, buffer_len, _T("subx b")); break;
2156                 case 0xe2: my_stprintf_s(buffer, buffer_len, _T("subx d")); break;
2157                 case 0xe3: my_stprintf_s(buffer, buffer_len, _T("subx h")); break;
2158                 case 0xe4: my_stprintf_s(buffer, buffer_len, _T("subx d+")); break;
2159                 case 0xe5: my_stprintf_s(buffer, buffer_len, _T("subx h+")); break;
2160                 case 0xe6: my_stprintf_s(buffer, buffer_len, _T("subx d-")); break;
2161                 case 0xe7: my_stprintf_s(buffer, buffer_len, _T("subx h-")); break;
2162                 case 0xe9: my_stprintf_s(buffer, buffer_len, _T("neax b")); break;
2163                 case 0xea: my_stprintf_s(buffer, buffer_len, _T("neax d")); break;
2164                 case 0xeb: my_stprintf_s(buffer, buffer_len, _T("neax h")); break;
2165                 case 0xec: my_stprintf_s(buffer, buffer_len, _T("neax d+")); break;
2166                 case 0xed: my_stprintf_s(buffer, buffer_len, _T("neax h+")); break;
2167                 case 0xee: my_stprintf_s(buffer, buffer_len, _T("neax d-")); break;
2168                 case 0xef: my_stprintf_s(buffer, buffer_len, _T("neax h-")); break;
2169                 case 0xf1: my_stprintf_s(buffer, buffer_len, _T("sbbx b")); break;
2170                 case 0xf2: my_stprintf_s(buffer, buffer_len, _T("sbbx d")); break;
2171                 case 0xf3: my_stprintf_s(buffer, buffer_len, _T("sbbx h")); break;
2172                 case 0xf4: my_stprintf_s(buffer, buffer_len, _T("sbbx d+")); break;
2173                 case 0xf5: my_stprintf_s(buffer, buffer_len, _T("sbbx h+")); break;
2174                 case 0xf6: my_stprintf_s(buffer, buffer_len, _T("sbbx d-")); break;
2175                 case 0xf7: my_stprintf_s(buffer, buffer_len, _T("sbbx h-")); break;
2176                 case 0xf9: my_stprintf_s(buffer, buffer_len, _T("eqax b")); break;
2177                 case 0xfa: my_stprintf_s(buffer, buffer_len, _T("eqax d")); break;
2178                 case 0xfb: my_stprintf_s(buffer, buffer_len, _T("eqax h")); break;
2179                 case 0xfc: my_stprintf_s(buffer, buffer_len, _T("eqax d+")); break;
2180                 case 0xfd: my_stprintf_s(buffer, buffer_len, _T("eqax h+")); break;
2181                 case 0xfe: my_stprintf_s(buffer, buffer_len, _T("eqax d-")); break;
2182                 case 0xff: my_stprintf_s(buffer, buffer_len, _T("eqax h-")); break;
2183                 default: my_stprintf_s(buffer, buffer_len, _T("db 70h,%02xh"), b);
2184                 }
2185                 break;
2186         case 0x71: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("mviw v.%02xh,%02xh"), wa, getb()); break;
2187         case 0x72: my_stprintf_s(buffer, buffer_len, _T("softi")); break;
2188         case 0x73: my_stprintf_s(buffer, buffer_len, _T("jb")); break;
2189         case 0x74:
2190                 switch(b = getb()) {
2191                 case 0x88: my_stprintf_s(buffer, buffer_len, _T("anaw v.%02xh"), getwa()); break;
2192                 case 0x90: my_stprintf_s(buffer, buffer_len, _T("xraw v.%02xh"), getwa()); break;
2193                 case 0x98: my_stprintf_s(buffer, buffer_len, _T("oraw v.%02xh"), getwa()); break;
2194                 case 0xa0: my_stprintf_s(buffer, buffer_len, _T("addncw v.%02xh"), getwa()); break;
2195                 case 0xa8: my_stprintf_s(buffer, buffer_len, _T("gtaw v.%02xh"), getwa()); break;
2196                 case 0xb0: my_stprintf_s(buffer, buffer_len, _T("subnbw v.%02xh"), getwa()); break;
2197                 case 0xb8: my_stprintf_s(buffer, buffer_len, _T("ltaw v.%02xh"), getwa()); break;
2198                 case 0xc0: my_stprintf_s(buffer, buffer_len, _T("addw v.%02xh"), getwa()); break;
2199                 case 0xc8: my_stprintf_s(buffer, buffer_len, _T("onaw v.%02xh"), getwa()); break;
2200                 case 0xd0: my_stprintf_s(buffer, buffer_len, _T("adcw v.%02xh"), getwa()); break;
2201                 case 0xd8: my_stprintf_s(buffer, buffer_len, _T("offaw v.%02xh"), getwa()); break;
2202                 case 0xe0: my_stprintf_s(buffer, buffer_len, _T("subw v.%02xh"), getwa()); break;
2203                 case 0xe8: my_stprintf_s(buffer, buffer_len, _T("neaw v.%02xh"), getwa()); break;
2204                 case 0xf0: my_stprintf_s(buffer, buffer_len, _T("sbbw v.%02xh"), getwa()); break;
2205                 case 0xf8: my_stprintf_s(buffer, buffer_len, _T("eqaw v.%02xh"), getwa()); break;
2206                 default: my_stprintf_s(buffer, buffer_len, _T("db 74h,%02xh"), b);
2207                 }
2208                 break;
2209         case 0x75: wa = getwa(); my_stprintf_s(buffer, buffer_len, _T("eqiw v.%02xh,%02xh"), wa, getb()); break;
2210         case 0x76: my_stprintf_s(buffer, buffer_len, _T("sbi a,%02xh"), getb()); break;
2211         case 0x77: my_stprintf_s(buffer, buffer_len, _T("eqi a,%02xh"), getb()); break;
2212         case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
2213                 my_stprintf_s(buffer, buffer_len, _T("calf %3x"), 0x800 | ((b & 7) << 8) | getb()); break;
2214         
2215         case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
2216         case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
2217         case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
2218         case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
2219         case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7:
2220         case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
2221         case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
2222         case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
2223                 my_stprintf_s(buffer, buffer_len, _T("calt %02xh"), 0x80 | ((b & 0x3f) << 1)); break;
2224                 
2225         case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7:
2226         case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf:
2227         case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7:
2228         case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf:
2229                 my_stprintf_s(buffer, buffer_len, _T("jr %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), pc + upd7801_dasm_ptr + (b & 0x1f))); break;
2230         
2231         case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
2232         case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
2233         case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7:
2234         case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff:
2235                 my_stprintf_s(buffer, buffer_len, _T("jr %s"), get_value_or_symbol(d_debugger->first_symbol, _T("%04xh"), pc + upd7801_dasm_ptr + ((b & 0x1f) - 0x20))); break;
2236         
2237         default: my_stprintf_s(buffer, buffer_len, _T("db %02xh"), b); break;
2238         }
2239         return upd7801_dasm_ptr;
2240 }
2241 //#endif
2242
2243 void UPD7801::write_signal(int id, uint32_t data, uint32_t mask)
2244 {
2245         if(id == SIG_UPD7801_INTF0) {
2246                 if(data & mask) {
2247                         IRR |= INTF0;
2248                 } else {
2249                         IRR &= ~INTF0;
2250                 }
2251         } else if(id == SIG_UPD7801_INTF1) {
2252                 if(data & mask) {
2253                         IRR |= INTF1;
2254                 } else {
2255                         IRR &= ~INTF1;
2256                 }
2257         } else if(id == SIG_UPD7801_INTF2) {
2258                 if((data & mask) && (MK & 0x20)) {
2259                         IRR |= INTF2;
2260                 } else if(!(data & mask) && !(MK & 0x20)) {
2261                         IRR |= INTF2;
2262                 }
2263         } else if(id == SIG_UPD7801_WAIT) {
2264                 wait = ((data & mask) != 0);
2265         } else if(id == SIG_UPD7801_SI) {
2266                 SI = ((data & mask) != 0);
2267         } else if(id == SIG_UPD7801_SCK) {
2268                 bool newSCK = ((data & mask) != 0);
2269                 if(SCK != newSCK) {
2270                         if(!SIO_DISABLED && SIO_EXTCLOCK) {
2271                                 if(SCK && !newSCK) {
2272                                         write_signals(&outputs_so, (SR & 0x80) ? 0xffffffff : 0);
2273                                 } else if(!SCK && newSCK) {
2274                                         SR <<= 1;
2275                                         if(SI) SR |= 1;
2276                                         if(++sio_count == 8) {
2277                                                 IRR |= INTFS;
2278                                                 if(SAK) {
2279                                                         SAK = 0;
2280                                                         UPDATE_PORTC(0);
2281                                                 }
2282                                                 scount = sio_count = 0;
2283                                         }
2284                                 }
2285                         }
2286                         SCK = newSCK;
2287                 }
2288         }
2289 }
2290
2291 void UPD7801::OP()
2292 {
2293         uint8_t ope = FETCH8();
2294         
2295         if((PSW & F_SK) && ope != 0x72) {
2296                 // skip this mnemonic
2297                 switch(ope) {
2298                 case 0x48: PSW &= ~(F_SK | F_L0 | F_L1); ope = FETCH8(); PC += op48[ope].oplen - 2; period += op48[ope].clock; break;
2299                 case 0x4c: PSW &= ~(F_SK | F_L0 | F_L1); ope = FETCH8(); PC += op4c[ope].oplen - 2; period += op4c[ope].clock; break;
2300                 case 0x4d: PSW &= ~(F_SK | F_L0 | F_L1); ope = FETCH8(); PC += op4d[ope].oplen - 2; period += op4d[ope].clock; break;
2301                 case 0x60: PSW &= ~(F_SK | F_L0 | F_L1); ope = FETCH8(); PC += op60[ope].oplen - 2; period += op60[ope].clock; break;
2302                 case 0x64: PSW &= ~(F_SK | F_L0 | F_L1); ope = FETCH8(); PC += op64[ope].oplen - 2; period += op64[ope].clock; break;
2303                 case 0x70: PSW &= ~(F_SK | F_L0 | F_L1); ope = FETCH8(); PC += op70[ope].oplen - 2; period += op70[ope].clock; break;
2304                 case 0x74: PSW &= ~(F_SK | F_L0 | F_L1); ope = FETCH8(); PC += op74[ope].oplen - 2; period += op74[ope].clock; break;
2305                 case 0x34: PSW &= ~(F_SK        | F_L1);                 PC += op[ope].oplen - 1;   period += op[ope].clock;   break;
2306                 case 0x69: PSW &= ~(F_SK | F_L0       );                 PC += op[ope].oplen - 1;   period += op[ope].clock;   break;
2307                 case 0x6f: PSW &= ~(F_SK        | F_L1);                 PC += op[ope].oplen - 1;   period += op[ope].clock;   break;
2308                 default:   PSW &= ~(F_SK | F_L0 | F_L1);                 PC += op[ope].oplen - 1;   period += op[ope].clock;   break;
2309                 }
2310                 return;
2311         }
2312         period += op[ope].clock;
2313         
2314         switch(ope) {
2315         case 0x00:      // nop
2316                 break;
2317         case 0x01:      // hlt
2318                 HALT = 1; PC--; break;
2319         case 0x02:      // inx sp
2320                 SP++; break;
2321         case 0x03:      // dcx sp
2322                 SP--; break;
2323         case 0x04:      // lxi sp,word
2324                 SP = FETCH16(); break;
2325         case 0x05:      // aniw wa,byte
2326                 ANIW(); break;
2327         case 0x06:
2328                 break;
2329         case 0x07:      // ani a,byte
2330                 ANI(_A); break;
2331         case 0x08:      // ret
2332                 PC = POP16(); break;
2333         case 0x09:      // sio
2334                 SIO(); break;
2335         case 0x0a:      // mov a,b
2336                 _A = _B; break;
2337         case 0x0b:      // mov a,c
2338                 _A = _C; break;
2339         case 0x0c:      // mov a,d
2340                 _A = _D; break;
2341         case 0x0d:      // mov a,e
2342                 _A = _E; break;
2343         case 0x0e:      // mov a,h
2344                 _A = _H; break;
2345         case 0x0f:      // mov a,l
2346                 _A = _L; break;
2347         case 0x10:      // ex
2348                 EX(); break;
2349         case 0x11:      // exx
2350                 EXX(); break;
2351         case 0x12:      // inx b
2352                 BC++; break;
2353         case 0x13:      // dcx b
2354                 BC--; break;
2355         case 0x14:      // lxi b,word
2356                 BC = FETCH16(); break;
2357         case 0x15:      // oriw wa,byte
2358                 ORIW(); break;
2359         case 0x16:      // xri a,byte
2360                 XRI(_A); break;
2361         case 0x17:      // ori a,byte
2362                 ORI(_A); break;
2363         case 0x18:      // rets
2364                 PC = POP16(); PSW |= F_SK; break;
2365         case 0x19:      // stm
2366                 if(!TO) {
2367                         TO = 0x10; UPDATE_PORTC(0);
2368                 }
2369                 STM(); break;
2370         case 0x1a:      // mov b, a
2371                 _B = _A; break;
2372         case 0x1b:      // mov c, a
2373                 _C = _A; break;
2374         case 0x1c:      // mov d, a
2375                 _D = _A; break;
2376         case 0x1d:      // mov e, a
2377                 _E = _A; break;
2378         case 0x1e:      // mov h, a
2379                 _H = _A; break;
2380         case 0x1f:      // mov l, a
2381                 _L = _A; break;
2382         case 0x20:      // inrw wa
2383                 INRW(); break;
2384         case 0x21:      // table
2385                 BC = RM16(PC + _A + 1); break;
2386         case 0x22:      // inx d
2387                 DE++; break;
2388         case 0x23:      // dcx d
2389                 DE--; break;
2390         case 0x24:      // lxi d,word
2391                 DE = FETCH16(); break;
2392         case 0x25:      // gtiw wa,byte
2393                 GTIW(); break;
2394         case 0x26:      // adinc a,byte
2395                 ADINC(_A); break;
2396         case 0x27:      // gti a,byte
2397                 GTI(_A); break;
2398         case 0x28:      // ldaw wa
2399                 _A = RM8(FETCHWA()); break;
2400         case 0x29:      // ldax b
2401                 _A = RM8(BC); break;
2402         case 0x2a:      // ldax d
2403                 _A = RM8(DE); break;
2404         case 0x2b:      // ldax h
2405                 _A = RM8(HL); break;
2406         case 0x2c:      // ldax d+
2407                 _A = RM8(DE++);; break;
2408         case 0x2d:      // ldax h+
2409                 _A = RM8(HL++); break;
2410         case 0x2e:      // ldax d-
2411                 _A = RM8(DE--); break;
2412         case 0x2f:      // ldax h-
2413                 _A = RM8(HL--); break;
2414         case 0x30:      // dcrw wa
2415                 DCRW(); break;
2416         case 0x31:      // block
2417                 BLOCK(); break;
2418         case 0x32:      // inx h
2419                 HL++; break;
2420         case 0x33:      // dcx h
2421                 HL--; break;
2422         case 0x34:      // lxi h,word
2423                 if(PSW & F_L0) {
2424                         PC += 2;
2425                 } else {
2426                         HL = FETCH16();
2427                 }
2428                 PSW = (PSW & ~F_L1) | F_L0; return;
2429         case 0x35:      // ltiw wa,byte
2430                 LTIW(); break;
2431         case 0x36:      // suinb a,byte
2432                 SUINB(_A); break;
2433         case 0x37:      // lti a,byte
2434                 LTI(_A); break;
2435         case 0x38:      // staw wa
2436                 WM8(FETCHWA(), _A); break;
2437         case 0x39:      // stax b
2438                 WM8(BC, _A); break;
2439         case 0x3a:      // stax d
2440                 WM8(DE, _A); break;
2441         case 0x3b:      // stax h
2442                 WM8(HL, _A); break;
2443         case 0x3c:      // stax d+
2444                 WM8(DE++, _A); break;
2445         case 0x3d:      // stax h+
2446                 WM8(HL++, _A); break;
2447         case 0x3e:      // stax d-
2448                 WM8(DE--, _A); break;
2449         case 0x3f:      // stax h-
2450                 WM8(HL--, _A); break;
2451         case 0x40:
2452                 break;
2453         case 0x41:      // inr a
2454                 INR(_A); break;
2455         case 0x42:      // inr b
2456                 INR(_B); break;
2457         case 0x43:      // inr c
2458                 INR(_C); break;
2459         case 0x44:      // call word
2460                 CALL(); break;
2461         case 0x45:      // oniw wa,byte
2462                 ONIW(); break;
2463         case 0x46:      // adi a,byte
2464                 ADI(_A); break;
2465         case 0x47:      // oni a,byte
2466                 ONI(_A); break;
2467         case 0x48:      // 48 xx
2468                 OP48(); break;
2469         case 0x49:      // mvix b,byte
2470                 WM8(BC, FETCH8()); break;
2471         case 0x4a:      // mvix d,byte
2472                 WM8(DE, FETCH8()); break;
2473         case 0x4b:      // mvix h,byte
2474                 WM8(HL, FETCH8()); break;
2475         case 0x4c:      // 4c xx
2476                 OP4C(); break;
2477         case 0x4d:      // 4d xx
2478                 OP4D(); break;
2479         case 0x4e:      // jre
2480         case 0x4f:      // jre
2481                 JRE(ope); break;
2482         case 0x50:
2483                 break;
2484         case 0x51:      // dcr a
2485                 DCR(_A); break;
2486         case 0x52:      // dcr b
2487                 DCR(_B); break;
2488         case 0x53:      // dcr c
2489                 DCR(_C); break;
2490         case 0x54:      // jmp word
2491                 PC = FETCH16(); break;
2492         case 0x55:      // offiw wa,byte
2493                 OFFIW(); break;
2494         case 0x56:      // aci a,byte
2495                 ACI(_A); break;
2496         case 0x57:      // offi a,byte
2497                 OFFI(_A); break;
2498         case 0x58:      // bit 0,wa
2499                 BIT(0); break;
2500         case 0x59:      // bit 1,wa
2501                 BIT(1); break;
2502         case 0x5a:      // bit 2,wa
2503                 BIT(2); break;
2504         case 0x5b:      // bit 3,wa
2505                 BIT(3); break;
2506         case 0x5c:      // bit 4,wa
2507                 BIT(4); break;
2508         case 0x5d:      // bit 5,wa
2509                 BIT(5); break;
2510         case 0x5e:      // bit 6,wa
2511                 BIT(6); break;
2512         case 0x5f:      // bit 7,wa
2513                 BIT(7); break;
2514         case 0x60:      // 60 xx
2515                 OP60(); break;
2516         case 0x61:      // daa
2517                 DAA(); break;
2518         case 0x62:      // reti
2519                 PC = POP16(); PSW = POP8(); SIRQ = 0; return;
2520         case 0x63:      // calb
2521                 PUSH16(PC); PC = BC; break;
2522         case 0x64:      // 64 xx
2523                 OP64(); break;
2524         case 0x65:      // neiw wa,byte
2525                 NEIW(); break;
2526         case 0x66:      // sui a,byte
2527                 SUI(_A); break;
2528         case 0x67:      // nei a,byte
2529                 NEI(_A); break;
2530         case 0x68:      // mvi v,byte
2531                 _V = FETCH8(); 
2532                 break;
2533         case 0x69:      // mvi a,byte
2534                 if(PSW & F_L1) {
2535                         PC++;
2536                 } else {
2537                         _A = FETCH8();
2538                 }
2539                 PSW = (PSW & ~F_L0) | F_L1; return;
2540         case 0x6a:      // mvi b,byte
2541                 _B = FETCH8(); break;
2542         case 0x6b:      // mvi c,byte
2543                 _C = FETCH8(); break;
2544         case 0x6c:      // mvi d,byte
2545                 _D = FETCH8(); break;
2546         case 0x6d:      // mvi e,byte
2547                 _E = FETCH8(); break;
2548         case 0x6e:      // mvi h,byte
2549                 _H = FETCH8(); break;
2550         case 0x6f:      // mvi l,byte
2551                 if(PSW & F_L0) {
2552                         PC++;
2553                 } else {
2554                         _L = FETCH8();
2555                 }
2556                 PSW = (PSW & ~F_L1) | F_L0; return;
2557         case 0x70:      // 70 xx
2558                 OP70(); break;
2559         case 0x71:      // mviw wa,byte
2560                 MVIW(); break;
2561         case 0x72:      // softi
2562                 PUSH8(PSW); PUSH16(PC); PSW &= ~F_SK; SIRQ = 1; PC = 0x0060; break;
2563         case 0x73:      // jb
2564                 PC = BC; break;
2565         case 0x74:      // 74xx
2566                 OP74(); break;
2567         case 0x75:      // eqiw wa,byte
2568                 EQIW(); break;
2569         case 0x76:      // sbi a,byte
2570                 SBI(_A); break;
2571         case 0x77:      // eqi a,byte
2572                 EQI(_A); break;
2573         case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: // calf
2574                 CALF(ope); break;
2575         case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
2576         case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
2577         case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
2578         case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
2579         case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7:
2580         case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
2581         case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
2582         case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: // calt
2583                 CALT(ope); break;
2584         case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7:
2585         case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf:
2586         case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7:
2587         case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: // jr
2588                 PC += ope & 0x1f; break;
2589         case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
2590         case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
2591         case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7:
2592         case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: // jr
2593                 PC -= 0x20 - (ope & 0x1f); break;
2594 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
2595         default:
2596                 __assume(0);
2597 #endif
2598         }
2599         PSW &= ~(F_L0 | F_L1);
2600 }
2601
2602 void UPD7801::OP48()
2603 {
2604         uint8_t ope = FETCH8();
2605         period += op48[ope].clock;
2606         
2607         switch(ope) {
2608         case 0x00:      // skit intf0
2609                 SKIT(INTF0); break;
2610         case 0x01:      // skit intft
2611                 SKIT(INTFT); break;
2612         case 0x02:      // skit intf1
2613                 SKIT(INTF1); break;
2614         case 0x03:      // skit intf2
2615                 SKIT(INTF2); break;
2616         case 0x04:      // skit intfs
2617                 SKIT(INTFS); break;
2618         case 0x0a:      // sk cy
2619                 SK(F_CY); break;
2620         case 0x0c:      // sk z
2621                 SK(F_Z); break;
2622         case 0x0e:      // push v
2623                 PUSH16(VA); break;
2624         case 0x0f:      // pop v
2625                 VA = POP16(); break;
2626         case 0x10:      // sknit intf0
2627                 SKNIT(INTF0); break;
2628         case 0x11:      // sknit intft
2629                 SKNIT(INTFT); break;
2630         case 0x12:      // sknit intf1
2631                 SKNIT(INTF1); break;
2632         case 0x13:      // sknit intf2
2633                 SKNIT(INTF2); break;
2634         case 0x14:      // sknit intfs
2635                 SKNIT(INTFS); break;
2636         case 0x1a:      // skn cy
2637                 SKN(F_CY); break;
2638         case 0x1c:      // skn z
2639                 SKN(F_Z); break;
2640         case 0x1e:      // push b
2641                 PUSH16(BC); break;
2642         case 0x1f:      // pop b
2643                 BC = POP16(); break;
2644         case 0x20:      // ei
2645                 IFF = 3; break;
2646         case 0x24:      // di
2647                 IFF = 0; break;
2648         case 0x2a:      // clc
2649                 PSW &= ~F_CY; break;
2650         case 0x2b:      // stc
2651                 PSW |= F_CY; break;
2652         case 0x2c:      // pen
2653                 PEN(); break;
2654         case 0x2d:      // pex
2655                 PEX(); break;
2656         case 0x2e:      // push d
2657                 PUSH16(DE); break;
2658         case 0x2f:      // pop d
2659                 DE = POP16(); break;
2660         case 0x30:      // rll a
2661                 RLL(_A); break;
2662         case 0x31:      // rlr a
2663                 RLR(_A); break;
2664         case 0x32:      // rll c
2665                 RLL(_C); break;
2666         case 0x33:      // rlr c
2667                 RLR(_C); break;
2668         case 0x34:      // sll a
2669                 SLL(_A); break;
2670         case 0x35:      // slr a
2671                 SLR(_A); break;
2672         case 0x36:      // sll c
2673                 SLL(_C); break;
2674         case 0x37:      // slr c
2675                 SLR(_C); break;
2676         case 0x38:      // rld
2677                 RLD(); break;
2678         case 0x39:      // rrd
2679                 RRD(); break;
2680         case 0x3c:      // per
2681                 PER(); break;
2682         case 0x3e:      // push h
2683                 PUSH16(HL); break;
2684         case 0x3f:      // pop h
2685                 HL = POP16(); break;
2686         default:
2687                 this->out_debug_log(_T("PC=%4x\tCPU\tUNKNOWN OP : 48 %2x\n"), prevPC, ope);
2688         }
2689 }
2690
2691 void UPD7801::OP4C()
2692 {
2693         uint8_t ope = FETCH8();
2694         period += op4c[ope].clock;
2695         
2696         switch(ope) {
2697         case 0xc0:      // mov a,pa
2698                 _A = IN8(P_A); break;
2699         case 0xc1:      // mov a,pb
2700                 _A = IN8(P_B); break;
2701         case 0xc2:      // mov a,pc
2702                 _A = IN8(P_C); break;
2703         case 0xc3:      // mov a,mk
2704                 _A = MK; break;
2705         case 0xc4:      // mov a,mb ?
2706                 _A = MB; break;
2707         case 0xc5:      // mov a,mc ?
2708                 _A = MC; break;
2709         case 0xc6:      // mov a,tm0 ?
2710                 _A = TM0; break;
2711         case 0xc7:      // mov a,tm1 ?
2712                 _A = TM1; break;
2713         case 0xc8:      // mov a,s
2714                 if(!SAK) {
2715                         SAK = 8; UPDATE_PORTC(0);
2716                 }
2717                 _A = SR; break;
2718         default:
2719                 if(ope < 0xc0) {
2720                         // in byte
2721                         UPDATE_PORTC(0x20);
2722                         _A = RM8((_B << 8) | ope);
2723                         UPDATE_PORTC(0);
2724                 } else {
2725                         this->out_debug_log(_T("PC=%4x\tCPU\tUNKNOWN OP : 4c %2x\n"), prevPC, ope);
2726                 }
2727         }
2728 }
2729
2730 void UPD7801::OP4D()
2731 {
2732         uint8_t ope = FETCH8();
2733         period += op4d[ope].clock;
2734         
2735         switch(ope) {
2736         case 0xc0:      // mov pa,a
2737                 OUT8(P_A, _A); break;
2738         case 0xc1:      // mov pb,a
2739                 OUT8(P_B, _A); break;
2740         case 0xc2:      // mov pc,a
2741                 OUT8(P_C, _A); break;
2742         case 0xc3:      // mov mk,a
2743                 MK = _A; break;
2744         case 0xc4:      // mov mb,a
2745                 MB = _A; break;
2746         case 0xc5:      // mov mc,a
2747                 if(MC != _A) {
2748                         MC = _A; UPDATE_PORTC(0); break;
2749                 }
2750                 MC = _A; break;
2751         case 0xc6:      // mov tm0,a
2752                 TM0 = _A; break;
2753         case 0xc7:      // mov tm1,a
2754                 TM1 = _A; break;
2755         case 0xc8:      // mov s,a
2756                 if(!SAK) {
2757                         SAK = 8; UPDATE_PORTC(0);
2758                 }
2759                 SR = _A; break;
2760         default:
2761                 if(ope < 0xc0) {
2762                         // out byte
2763                         UPDATE_PORTC(0x20);
2764                         WM8((_B << 8) | ope, _A);
2765                         UPDATE_PORTC(0);
2766                 } else {
2767                         this->out_debug_log(_T("PC=%4x\tCPU\tUNKNOWN OP : 4d %2x\n"), prevPC, ope);
2768                 }
2769         }
2770 }
2771
2772 void UPD7801::OP60()
2773 {
2774         uint8_t ope = FETCH8();
2775         period += op60[ope].clock;
2776         
2777         switch(ope) {
2778         case 0x08:      // ana v,a
2779                 ANA(_V, _A); break;
2780         case 0x09:      // ana a,a
2781                 ANA(_A, _A); break;
2782         case 0x0a:      // ana b,a
2783                 ANA(_B, _A); break;
2784         case 0x0b:      // ana c,a
2785                 ANA(_C, _A); break;
2786         case 0x0c:      // ana d,a
2787                 ANA(_D, _A); break;
2788         case 0x0d:      // ana e,a
2789                 ANA(_E, _A); break;
2790         case 0x0e:      // ana h,a
2791                 ANA(_H, _A); break;
2792         case 0x0f:      // ana l,a
2793                 ANA(_L, _A); break;
2794         case 0x10:      // xra v,a
2795                 XRA(_V, _A); break;
2796         case 0x11:      // xra a,a
2797                 XRA(_A, _A); break;
2798         case 0x12:      // xra b,a
2799                 XRA(_B, _A); break;
2800         case 0x13:      // xra c,a
2801                 XRA(_C, _A); break;
2802         case 0x14:      // xra d,a
2803                 XRA(_D, _A); break;
2804         case 0x15:      // xra e,a
2805                 XRA(_E, _A); break;
2806         case 0x16:      // xra h,a
2807                 XRA(_H, _A); break;
2808         case 0x17:      // xra l,a
2809                 XRA(_L, _A); break;
2810         case 0x18:      // ora v,a
2811                 ORA(_V, _A); break;
2812         case 0x19:      // ora a,a
2813                 ORA(_A, _A); break;
2814         case 0x1a:      // ora b,a
2815                 ORA(_B, _A); break;
2816         case 0x1b:      // ora c,a
2817                 ORA(_C, _A); break;
2818         case 0x1c:      // ora d,a
2819                 ORA(_D, _A); break;
2820         case 0x1d:      // ora e,a
2821                 ORA(_E, _A); break;
2822         case 0x1e:      // ora h,a
2823                 ORA(_H, _A); break;
2824         case 0x1f:      // ora l,a
2825                 ORA(_L, _A); break;
2826         case 0x20:      // addnc v,a
2827                 ADDNC(_V, _A); break;
2828         case 0x21:      // addnc a,a
2829                 ADDNC(_A, _A); break;
2830         case 0x22:      // addnc b,a
2831                 ADDNC(_B, _A); break;
2832         case 0x23:      // addnc c,a
2833                 ADDNC(_C, _A); break;
2834         case 0x24:      // addnc d,a
2835                 ADDNC(_D, _A); break;
2836         case 0x25:      // addnc e,a
2837                 ADDNC(_E, _A); break;
2838         case 0x26:      // addnc h,a
2839                 ADDNC(_H, _A); break;
2840         case 0x27:      // addnc l,a
2841                 ADDNC(_L, _A); break;
2842         case 0x28:      // gta v,a
2843                 GTA(_V, _A); break;
2844         case 0x29:      // gta a,a
2845                 GTA(_A, _A); break;
2846         case 0x2a:      // gta b,a
2847                 GTA(_B, _A); break;
2848         case 0x2b:      // gta c,a
2849                 GTA(_C, _A); break;
2850         case 0x2c:      // gta d,a
2851                 GTA(_D, _A); break;
2852         case 0x2d:      // gta e,a
2853                 GTA(_E, _A); break;
2854         case 0x2e:      // gta h,a
2855                 GTA(_H, _A); break;
2856         case 0x2f:      // gta l,a
2857                 GTA(_L, _A); break;
2858         case 0x30:      // subnb v,a
2859                 SUBNB(_V, _A); break;
2860         case 0x31:      // subnb a,a
2861                 SUBNB(_A, _A); break;
2862         case 0x32:      // subnb b,a
2863                 SUBNB(_B, _A); break;
2864         case 0x33:      // subnb c,a
2865                 SUBNB(_C, _A); break;
2866         case 0x34:      // subnb d,a
2867                 SUBNB(_D, _A); break;
2868         case 0x35:      // subnb e,a
2869                 SUBNB(_E, _A); break;
2870         case 0x36:      // subnb h,a
2871                 SUBNB(_H, _A); break;
2872         case 0x37:      // subnb l,a
2873                 SUBNB(_L, _A); break;
2874         case 0x38:      // lta v,a
2875                 LTA(_V, _A); break;
2876         case 0x39:      // lta a,a
2877                 LTA(_A, _A); break;
2878         case 0x3a:      // lta b,a
2879                 LTA(_B, _A); break;
2880         case 0x3b:      // lta c,a
2881                 LTA(_C, _A); break;
2882         case 0x3c:      // lta d,a
2883                 LTA(_D, _A); break;
2884         case 0x3d:      // lta e,a
2885                 LTA(_E, _A); break;
2886         case 0x3e:      // lta h,a
2887                 LTA(_H, _A); break;
2888         case 0x3f:      // lta l,a
2889                 LTA(_L, _A); break;
2890         case 0x40:      // add v,a
2891                 ADD(_V, _A); break;
2892         case 0x41:      // add a,a
2893                 ADD(_A, _A); break;
2894         case 0x42:      // add b,a
2895                 ADD(_B, _A); break;
2896         case 0x43:      // add c,a
2897                 ADD(_C, _A); break;
2898         case 0x44:      // add d,a
2899                 ADD(_D, _A); break;
2900         case 0x45:      // add e,a
2901                 ADD(_E, _A); break;
2902         case 0x46:      // add h,a
2903                 ADD(_H, _A); break;
2904         case 0x47:      // add l,a
2905                 ADD(_L, _A); break;
2906         case 0x50:      // adc v,a
2907                 ADC(_V, _A); break;
2908         case 0x51:      // adc a,a
2909                 ADC(_A, _A); break;
2910         case 0x52:      // adc b,a
2911                 ADC(_B, _A); break;
2912         case 0x53:      // adc c,a
2913                 ADC(_C, _A); break;
2914         case 0x54:      // adc d,a
2915                 ADC(_D, _A); break;
2916         case 0x55:      // adc e,a
2917                 ADC(_E, _A); break;
2918         case 0x56:      // adc h,a
2919                 ADC(_H, _A); break;
2920         case 0x57:      // adc l,a
2921                 ADC(_L, _A); break;
2922         case 0x60:      // sub v,a
2923                 SUB(_V, _A); break;
2924         case 0x61:      // sub a,a
2925                 SUB(_A, _A); break;
2926         case 0x62:      // sub b,a
2927                 SUB(_B, _A); break;
2928         case 0x63:      // sub c,a
2929                 SUB(_C, _A); break;
2930         case 0x64:      // sub d,a
2931                 SUB(_D, _A); break;
2932         case 0x65:      // sub e,a
2933                 SUB(_E, _A); break;
2934         case 0x66:      // sub h,a
2935                 SUB(_H, _A); break;
2936         case 0x67:      // sub l,a
2937                 SUB(_L, _A); break;
2938         case 0x68:      // nea v,a
2939                 NEA(_V, _A); break;
2940         case 0x69:      // nea a,a
2941                 NEA(_A, _A); break;
2942         case 0x6a:      // nea b,a
2943                 NEA(_B, _A); break;
2944         case 0x6b:      // nea c,a
2945                 NEA(_C, _A); break;
2946         case 0x6c:      // nea d,a
2947                 NEA(_D, _A); break;
2948         case 0x6d:      // nea e,a
2949                 NEA(_E, _A); break;
2950         case 0x6e:      // nea h,a
2951                 NEA(_H, _A); break;
2952         case 0x6f:      // nea l,a
2953                 NEA(_L, _A); break;
2954         case 0x70:      // sbb v,a
2955                 SBB(_V, _A); break;
2956         case 0x71:      // sbb a,a
2957                 SBB(_A, _A); break;
2958         case 0x72:      // sbb b,a
2959                 SBB(_B, _A); break;
2960         case 0x73:      // sbb c,a
2961                 SBB(_C, _A); break;
2962         case 0x74:      // sbb d,a
2963                 SBB(_D, _A); break;
2964         case 0x75:      // sbb e,a
2965                 SBB(_E, _A); break;
2966         case 0x76:      // sbb h,a
2967                 SBB(_H, _A); break;
2968         case 0x77:      // sbb l,a
2969                 SBB(_L, _A); break;
2970         case 0x78:      // eqa v,a
2971                 EQA(_V, _A); break;
2972         case 0x79:      // eqa a,a
2973                 EQA(_A, _A); break;
2974         case 0x7a:      // eqa b,a
2975                 EQA(_B, _A); break;
2976         case 0x7b:      // eqa c,a
2977                 EQA(_C, _A); break;
2978         case 0x7c:      // eqa d,a
2979                 EQA(_D, _A); break;
2980         case 0x7d:      // eqa e,a
2981                 EQA(_E, _A); break;
2982         case 0x7e:      // eqa h,a
2983                 EQA(_H, _A); break;
2984         case 0x7f:      // eqa l,a
2985                 EQA(_L, _A); break;
2986         case 0x88:      // ana a,v
2987                 ANA(_A, _V); break;
2988         case 0x89:      // ana a,a
2989                 ANA(_A, _A); break;
2990         case 0x8a:      // ana a,b
2991                 ANA(_A, _B); break;
2992         case 0x8b:      // ana a,c
2993                 ANA(_A, _C); break;
2994         case 0x8c:      // ana a,d
2995                 ANA(_A, _D); break;
2996         case 0x8d:      // ana a,e
2997                 ANA(_A, _E); break;
2998         case 0x8e:      // ana a,h
2999                 ANA(_A, _H); break;
3000         case 0x8f:      // ana a,l
3001                 ANA(_A, _L); break;
3002         case 0x90:      // xra a,v
3003                 XRA(_A, _V); break;
3004         case 0x91:      // xra a,a
3005                 XRA(_A, _A); break;
3006         case 0x92:      // xra a,b
3007                 XRA(_A, _B); break;
3008         case 0x93:      // xra a,c
3009                 XRA(_A, _C); break;
3010         case 0x94:      // xra a,d
3011                 XRA(_A, _D); break;
3012         case 0x95:      // xra a,e
3013                 XRA(_A, _E); break;
3014         case 0x96:      // xra a,h
3015                 XRA(_A, _H); break;
3016         case 0x97:      // xra a,l
3017                 XRA(_A, _L); break;
3018         case 0x98:      // ora a,v
3019                 ORA(_A, _V); break;
3020         case 0x99:      // ora a,a
3021                 ORA(_A, _A); break;
3022         case 0x9a:      // ora a,b
3023                 ORA(_A, _B); break;
3024         case 0x9b:      // ora a,c
3025                 ORA(_A, _C); break;
3026         case 0x9c:      // ora a,d
3027                 ORA(_A, _D); break;
3028         case 0x9d:      // ora a,e
3029                 ORA(_A, _E); break;
3030         case 0x9e:      // ora a,h
3031                 ORA(_A, _H); break;
3032         case 0x9f:      // ora a,l
3033                 ORA(_A, _L); break;
3034         case 0xa0:      // addnc a,v
3035                 ADDNC(_A, _V); break;
3036         case 0xa1:      // addnc a,a
3037                 ADDNC(_A, _A); break;
3038         case 0xa2:      // addnc a,b
3039                 ADDNC(_A, _B); break;
3040         case 0xa3:      // addnc a,c
3041                 ADDNC(_A, _C); break;
3042         case 0xa4:      // addnc a,d
3043                 ADDNC(_A, _D); break;
3044         case 0xa5:      // addnc a,e
3045                 ADDNC(_A, _E); break;
3046         case 0xa6:      // addnc a,h
3047                 ADDNC(_A, _H); break;
3048         case 0xa7:      // addnc a,l
3049                 ADDNC(_A, _L); break;
3050         case 0xa8:      // gta a,v
3051                 GTA(_A, _V); break;
3052         case 0xa9:      // gta a,a
3053                 GTA(_A, _A); break;
3054         case 0xaa:      // gta a,b
3055                 GTA(_A, _B); break;
3056         case 0xab:      // gta a,c
3057                 GTA(_A, _C); break;
3058         case 0xac:      // gta a,d
3059                 GTA(_A, _D); break;
3060         case 0xad:      // gta a,e
3061                 GTA(_A, _E); break;
3062         case 0xae:      // gta a,h
3063                 GTA(_A, _H); break;
3064         case 0xaf:      // gta a,l
3065                 GTA(_A, _L); break;
3066         case 0xb0:      // subnb a,v
3067                 SUBNB(_A, _V); break;
3068         case 0xb1:      // subnb a,a
3069                 SUBNB(_A, _A); break;
3070         case 0xb2:      // subnb a,b
3071                 SUBNB(_A, _B); break;
3072         case 0xb3:      // subnb a,c
3073                 SUBNB(_A, _C); break;
3074         case 0xb4:      // subnb a,d
3075                 SUBNB(_A, _D); break;
3076         case 0xb5:      // subnb a,e
3077                 SUBNB(_A, _E); break;
3078         case 0xb6:      // subnb a,h
3079                 SUBNB(_A, _H); break;
3080         case 0xb7:      // subnb a,l
3081                 SUBNB(_A, _L); break;
3082         case 0xb8:      // lta a,v
3083                 LTA(_A, _V); break;
3084         case 0xb9:      // lta a,a
3085                 LTA(_A, _A); break;
3086         case 0xba:      // lta a,b
3087                 LTA(_A, _B); break;
3088         case 0xbb:      // lta a,c
3089                 LTA(_A, _C); break;
3090         case 0xbc:      // lta a,d
3091                 LTA(_A, _D); break;
3092         case 0xbd:      // lta a,e
3093                 LTA(_A, _E); break;
3094         case 0xbe:      // lta a,h
3095                 LTA(_A, _H); break;
3096         case 0xbf:      // lta a,l
3097                 LTA(_A, _L); break;
3098         case 0xc0:      // add a,v
3099                 ADD(_A, _V); break;
3100         case 0xc1:      // add a,a
3101                 ADD(_A, _A); break;
3102         case 0xc2:      // add a,b
3103                 ADD(_A, _B); break;
3104         case 0xc3:      // add a,c
3105                 ADD(_A, _C); break;
3106         case 0xc4:      // add a,d
3107                 ADD(_A, _D); break;
3108         case 0xc5:      // add a,e
3109                 ADD(_A, _E); break;
3110         case 0xc6:      // add a,h
3111                 ADD(_A, _H); break;
3112         case 0xc7:      // add a,l
3113                 ADD(_A, _L); break;
3114         case 0xc8:      // ona a,v
3115                 ONA(_A, _V); break;
3116         case 0xc9:      // ona a,a
3117                 ONA(_A, _A); break;
3118         case 0xca:      // ona a,b
3119                 ONA(_A, _B); break;
3120         case 0xcb:      // ona a,c
3121                 ONA(_A, _C); break;
3122         case 0xcc:      // ona a,d
3123                 ONA(_A, _D); break;
3124         case 0xcd:      // ona a,e
3125                 ONA(_A, _E); break;
3126         case 0xce:      // ona a,h
3127                 ONA(_A, _H); break;
3128         case 0xcf:      // ona a,l
3129                 ONA(_A, _L); break;
3130         case 0xd0:      // adc a,v
3131                 ADC(_A, _V); break;
3132         case 0xd1:      // adc a,a
3133                 ADC(_A, _A); break;
3134         case 0xd2:      // adc a,b
3135                 ADC(_A, _B); break;
3136         case 0xd3:      // adc a,c
3137                 ADC(_A, _C); break;
3138         case 0xd4:      // adc a,d
3139                 ADC(_A, _D); break;
3140         case 0xd5:      // adc a,e
3141                 ADC(_A, _E); break;
3142         case 0xd6:      // adc a,h
3143                 ADC(_A, _H); break;
3144         case 0xd7:      // adc a,l
3145                 ADC(_A, _L); break;
3146         case 0xd8:      // offa a,v
3147                 OFFA(_A, _V); break;
3148         case 0xd9:      // offa a,a
3149                 OFFA(_A, _A); break;
3150         case 0xda:      // offa a,b
3151                 OFFA(_A, _B); break;
3152         case 0xdb:      // offa a,c
3153                 OFFA(_A, _C); break;
3154         case 0xdc:      // offa a,d
3155                 OFFA(_A, _D); break;
3156         case 0xdd:      // offa a,e
3157                 OFFA(_A, _E); break;
3158         case 0xde:      // offa a,h
3159                 OFFA(_A, _H); break;
3160         case 0xdf:      // offa a,l
3161                 OFFA(_A, _L); break;
3162         case 0xe0:      // sub a,v
3163                 SUB(_A, _V); break;
3164         case 0xe1:      // sub a,a
3165                 SUB(_A, _A); break;
3166         case 0xe2:      // sub a,b
3167                 SUB(_A, _B); break;
3168         case 0xe3:      // sub a,c
3169                 SUB(_A, _C); break;
3170         case 0xe4:      // sub a,d
3171                 SUB(_A, _D); break;
3172         case 0xe5:      // sub a,e
3173                 SUB(_A, _E); break;
3174         case 0xe6:      // sub a,h
3175                 SUB(_A, _H); break;
3176         case 0xe7:      // sub a,l
3177                 SUB(_A, _L); break;
3178         case 0xe8:      // nea a,v
3179                 NEA(_A, _V); break;
3180         case 0xe9:      // nea a,a
3181                 NEA(_A, _A); break;
3182         case 0xea:      // nea a,b
3183                 NEA(_A, _B); break;
3184         case 0xeb:      // nea a,c
3185                 NEA(_A, _C); break;
3186         case 0xec:      // nea a,d
3187                 NEA(_A, _D); break;
3188         case 0xed:      // nea a,e
3189                 NEA(_A, _E); break;
3190         case 0xee:      // nea a,h
3191                 NEA(_A, _H); break;
3192         case 0xef:      // nea a,l
3193                 NEA(_A, _L); break;
3194         case 0xf0:      // sbb a,v
3195                 SBB(_A, _V); break;
3196         case 0xf1:      // sbb a,a
3197                 SBB(_A, _A); break;
3198         case 0xf2:      // sbb a,b
3199                 SBB(_A, _B); break;
3200         case 0xf3:      // sbb a,c
3201                 SBB(_A, _C); break;
3202         case 0xf4:      // sbb a,d
3203                 SBB(_A, _D); break;
3204         case 0xf5:      // sbb a,e
3205                 SBB(_A, _E); break;
3206         case 0xf6:      // sbb a,h
3207                 SBB(_A, _H); break;
3208         case 0xf7:      // sbb a,l
3209                 SBB(_A, _L); break;
3210         case 0xf8:      // eqa a,v
3211                 EQA(_A, _V); break;
3212         case 0xf9:      // eqa a,a
3213                 EQA(_A, _A); break;
3214         case 0xfa:      // eqa a,b
3215                 EQA(_A, _B); break;
3216         case 0xfb:      // eqa a,c
3217                 EQA(_A, _C); break;
3218         case 0xfc:      // eqa a,d
3219                 EQA(_A, _D); break;
3220         case 0xfd:      // eqa a,e
3221                 EQA(_A, _E); break;
3222         case 0xfe:      // eqa a,h
3223                 EQA(_A, _H); break;
3224         case 0xff:      // eqa a,l
3225                 EQA(_A, _L); break;
3226         default:
3227                 this->out_debug_log(_T("PC=%4x\tCPU\tUNKNOWN OP : 60 %2x\n"), prevPC, ope);
3228         }
3229 }
3230
3231 void UPD7801::OP64()
3232 {
3233         uint8_t ope = FETCH8();
3234         period += op64[ope].clock;
3235         
3236         switch(ope) {
3237         case 0x08:      // ani v,byte
3238                 ANI(_V); break;
3239         case 0x09:      // ani a,byte
3240                 ANI(_A); break;
3241         case 0x0a:      // ani b,byte
3242                 ANI(_B); break;
3243         case 0x0b:      // ani c,byte
3244                 ANI(_C); break;
3245         case 0x0c:      // ani d,byte
3246                 ANI(_D); break;
3247         case 0x0d:      // ani e,byte
3248                 ANI(_E); break;
3249         case 0x0e:      // ani h,byte
3250                 ANI(_H); break;
3251         case 0x0f:      // ani l,byte
3252                 ANI(_L); break;
3253         case 0x10:      // xri v,byte
3254                 XRI(_V); break;
3255         case 0x11:      // xri a,byte
3256                 XRI(_A); break;
3257         case 0x12:      // xri b,byte
3258                 XRI(_B); break;
3259         case 0x13:      // xri c,byte
3260                 XRI(_C); break;
3261         case 0x14:      // xri d,byte
3262                 XRI(_D); break;
3263         case 0x15:      // xri e,byte
3264                 XRI(_E); break;
3265         case 0x16:      // xri h,byte
3266                 XRI(_H); break;
3267         case 0x17:      // xri l,byte
3268                 XRI(_L); break;
3269         case 0x18:      // ori v,byte
3270                 ORI(_V); break;
3271         case 0x19:      // ori a,byte
3272                 ORI(_A); break;
3273         case 0x1a:      // ori b,byte
3274                 ORI(_B); break;
3275         case 0x1b:      // ori c,byte
3276                 ORI(_C); break;
3277         case 0x1c:      // ori d,byte
3278                 ORI(_D); break;
3279         case 0x1d:      // ori e,byte
3280                 ORI(_E); break;
3281         case 0x1e:      // ori h,byte
3282                 ORI(_H); break;
3283         case 0x1f:      // ori l,byte
3284                 ORI(_L); break;
3285         case 0x20:      // adinc v,byte
3286                 ADINC(_V); break;
3287         case 0x21:      // adinc a,byte
3288                 ADINC(_A); break;
3289         case 0x22:      // adinc b,byte
3290                 ADINC(_B); break;
3291         case 0x23:      // adinc c,byte
3292                 ADINC(_C); break;
3293         case 0x24:      // adinc d,byte
3294                 ADINC(_D); break;
3295         case 0x25:      // adinc e,byte
3296                 ADINC(_E); break;
3297         case 0x26:      // adinc h,byte
3298                 ADINC(_H); break;
3299         case 0x27:      // adinc l,byte
3300                 ADINC(_L); break;
3301         case 0x28:      // gti v,byte
3302                 GTI(_V); break;
3303         case 0x29:      // gti a,byte
3304                 GTI(_A); break;
3305         case 0x2a:      // gti b,byte
3306                 GTI(_B); break;
3307         case 0x2b:      // gti c,byte
3308                 GTI(_C); break;
3309         case 0x2c:      // gti d,byte
3310                 GTI(_D); break;
3311         case 0x2d:      // gti e,byte
3312                 GTI(_E); break;
3313         case 0x2e:      // gti h,byte
3314                 GTI(_H); break;
3315         case 0x2f:      // gti l,byte
3316                 GTI(_L); break;
3317         case 0x30:      // suinb v,byte
3318                 SUINB(_V); break;
3319         case 0x31:      // suinb a,byte
3320                 SUINB(_A); break;
3321         case 0x32:      // suinb b,byte
3322                 SUINB(_B); break;
3323         case 0x33:      // suinb c,byte
3324                 SUINB(_C); break;
3325         case 0x34:      // suinb d,byte
3326                 SUINB(_D); break;
3327         case 0x35:      // suinb e,byte
3328                 SUINB(_E); break;
3329         case 0x36:      // suinb h,byte
3330                 SUINB(_H); break;
3331         case 0x37:      // suinb l,byte
3332                 SUINB(_L); break;
3333         case 0x38:      // lti v,byte
3334                 LTI(_V); break;
3335         case 0x39:      // lti a,byte
3336                 LTI(_A); break;
3337         case 0x3a:      // lti b,byte
3338                 LTI(_B); break;
3339         case 0x3b:      // lti c,byte
3340                 LTI(_C); break;
3341         case 0x3c:      // lti d,byte
3342                 LTI(_D); break;
3343         case 0x3d:      // lti e,byte
3344                 LTI(_E); break;
3345         case 0x3e:      // lti h,byte
3346                 LTI(_H); break;
3347         case 0x3f:      // lti l,byte
3348                 LTI(_L); break;
3349         case 0x40:      // adi v,byte
3350                 ADI(_V); break;
3351         case 0x41:      // adi a,byte
3352                 ADI(_A); break;
3353         case 0x42:      // adi b,byte
3354                 ADI(_B); break;
3355         case 0x43:      // adi c,byte
3356                 ADI(_C); break;
3357         case 0x44:      // adi d,byte
3358                 ADI(_D); break;
3359         case 0x45:      // adi e,byte
3360                 ADI(_E); break;
3361         case 0x46:      // adi h,byte
3362                 ADI(_H); break;
3363         case 0x47:      // adi l,byte
3364                 ADI(_L); break;
3365         case 0x48:      // oni v,byte
3366                 ONI(_V); break;
3367         case 0x49:      // oni a,byte
3368                 ONI(_A); break;
3369         case 0x4a:      // oni b,byte
3370                 ONI(_B); break;
3371         case 0x4b:      // oni c,byte
3372                 ONI(_C); break;
3373         case 0x4c:      // oni d,byte
3374                 ONI(_D); break;
3375         case 0x4d:      // oni e,byte
3376                 ONI(_E); break;
3377         case 0x4e:      // oni h,byte
3378                 ONI(_H); break;
3379         case 0x4f:      // oni l,byte
3380                 ONI(_L); break;
3381         case 0x50:      // aci v,byte
3382                 ACI(_V); break;
3383         case 0x51:      // aci a,byte
3384                 ACI(_A); break;
3385         case 0x52:      // aci b,byte
3386                 ACI(_B); break;
3387         case 0x53:      // aci c,byte
3388                 ACI(_C); break;
3389         case 0x54:      // aci d,byte
3390                 ACI(_D); break;
3391         case 0x55:      // aci e,byte
3392                 ACI(_E); break;
3393         case 0x56:      // aci h,byte
3394                 ACI(_H); break;
3395         case 0x57:      // aci l,byte
3396                 ACI(_L); break;
3397         case 0x58:      // offi v,byte
3398                 OFFI(_V); break;
3399         case 0x59:      // offi a,byte
3400                 OFFI(_A); break;
3401         case 0x5a:      // offi b,byte
3402                 OFFI(_B); break;
3403         case 0x5b:      // offi c,byte
3404                 OFFI(_C); break;
3405         case 0x5c:      // offi d,byte
3406                 OFFI(_D); break;
3407         case 0x5d:      // offi e,byte
3408                 OFFI(_E); break;
3409         case 0x5e:      // offi h,byte
3410                 OFFI(_H); break;
3411         case 0x5f:      // offi l,byte
3412                 OFFI(_L); break;
3413         case 0x60:      // sui v,byte
3414                 SUI(_V); break;
3415         case 0x61:      // sui a,byte
3416                 SUI(_A); break;
3417         case 0x62:      // sui b,byte
3418                 SUI(_B); break;
3419         case 0x63:      // sui c,byte
3420                 SUI(_C); break;
3421         case 0x64:      // sui d,byte
3422                 SUI(_D); break;
3423         case 0x65:      // sui e,byte
3424                 SUI(_E); break;
3425         case 0x66:      // sui h,byte
3426                 SUI(_H); break;
3427         case 0x67:      // sui l,byte
3428                 SUI(_L); break;
3429         case 0x68:      // nei v,byte
3430                 NEI(_V); break;
3431         case 0x69:      // nei a,byte
3432                 NEI(_A); break;
3433         case 0x6a:      // nei b,byte
3434                 NEI(_B); break;
3435         case 0x6b:      // nei c,byte
3436                 NEI(_C); break;
3437         case 0x6c:      // nei d,byte
3438                 NEI(_D); break;
3439         case 0x6d:      // nei e,byte
3440                 NEI(_E); break;
3441         case 0x6e:      // nei h,byte
3442                 NEI(_H); break;
3443         case 0x6f:      // nei l,byte
3444                 NEI(_L); break;
3445         case 0x70:      // sbi v,byte
3446                 SBI(_V); break;
3447         case 0x71:      // sbi a,byte
3448                 SBI(_A); break;
3449         case 0x72:      // sbi b,byte
3450                 SBI(_B); break;
3451         case 0x73:      // sbi c,byte
3452                 SBI(_C); break;
3453         case 0x74:      // sbi d,byte
3454                 SBI(_D); break;
3455         case 0x75:      // sbi e,byte
3456                 SBI(_E); break;
3457         case 0x76:      // sbi h,byte
3458                 SBI(_H); break;
3459         case 0x77:      // sbi l,byte
3460                 SBI(_L); break;
3461         case 0x78:      // eqi v,byte
3462                 EQI(_V); break;
3463         case 0x79:      // eqi a,byte
3464                 EQI(_A); break;
3465         case 0x7a:      // eqi b,byte
3466                 EQI(_B); break;
3467         case 0x7b:      // eqi c,byte
3468                 EQI(_C); break;
3469         case 0x7c:      // eqi d,byte
3470                 EQI(_D); break;
3471         case 0x7d:      // eqi e,byte
3472                 EQI(_E); break;
3473         case 0x7e:      // eqi h,byte
3474                 EQI(_H); break;
3475         case 0x7f:      // eqi l,byte
3476                 EQI(_L); break;
3477         case 0x88:      // ani pa,byte
3478                 ANI_IO(P_A); break;
3479         case 0x89:      // ani pb,byte
3480                 ANI_IO(P_B); break;
3481         case 0x8a:      // ani pc,byte
3482                 ANI_IO(P_C); break;
3483         case 0x8b:      // ani mk,byte
3484                 ANI(MK); break;
3485         case 0x90:      // xri pa,byte
3486                 XRI_IO(P_A); break;
3487         case 0x91:      // xri pb,byte
3488                 XRI_IO(P_B); break;
3489         case 0x92:      // xri pc,byte
3490                 XRI_IO(P_C); break;
3491         case 0x93:      // xri mk,byte
3492                 XRI(MK); break;
3493         case 0x98:      // ori pa,byte
3494                 ORI_IO(P_A); break;
3495         case 0x99:      // ori pb,byte
3496                 ORI_IO(P_B); break;
3497         case 0x9a:      // ori pc,byte
3498                 ORI_IO(P_C); break;
3499         case 0x9b:      // ori mk,byte
3500                 ORI(MK); break;
3501         case 0xa0:      // adinc pa,byte
3502                 ADINC_IO(P_A); break;
3503         case 0xa1:      // adinc pb,byte
3504                 ADINC_IO(P_B); break;
3505         case 0xa2:      // adinc pc,byte
3506                 ADINC_IO(P_C); break;
3507         case 0xa3:      // adinc mk,byte
3508                 ADINC(MK); break;
3509         case 0xa8:      // gti pa,byte
3510                 GTI_IO(P_A); break;
3511         case 0xa9:      // gti pb,byte
3512                 GTI_IO(P_B); break;
3513         case 0xaa:      // gti pc,byte
3514                 GTI_IO(P_C); break;
3515         case 0xab:      // gti mk,byte
3516                 GTI(MK); break;
3517         case 0xb0:      // suinb pa,byte
3518                 SUINB_IO(P_A); break;
3519         case 0xb1:      // suinb pb,byte
3520                 SUINB_IO(P_B); break;
3521         case 0xb2:      // suinb pc,byte
3522                 SUINB_IO(P_C); break;
3523         case 0xb3:      // suinb mk,byte
3524                 SUINB(MK); break;
3525         case 0xb8:      // lti pa,byte
3526                 LTI_IO(P_A); break;
3527         case 0xb9:      // lti pb,byte
3528                 LTI_IO(P_B); break;
3529         case 0xba:      // lti pc,byte
3530                 LTI_IO(P_C); break;
3531         case 0xbb:      // lti mk,byte
3532                 LTI(MK); break;
3533         case 0xc0:      // adi pa,byte
3534                 ADI_IO(P_A); break;
3535         case 0xc1:      // adi pb,byte
3536                 ADI_IO(P_B); break;
3537         case 0xc2:      // adi pc,byte
3538                 ADI_IO(P_C); break;
3539         case 0xc3:      // adi mk,byte
3540                 ADI(MK); break;
3541         case 0xc8:      // oni pa,byte
3542                 ONI_IO(P_A); break;
3543         case 0xc9:      // oni pb,byte
3544                 ONI_IO(P_B); break;
3545         case 0xca:      // oni pc,byte
3546                 ONI_IO(P_C); break;
3547         case 0xcb:      // oni mk,byte
3548                 ONI(MK); break;
3549         case 0xd0:      // aci pa,byte
3550                 ACI_IO(P_A); break;
3551         case 0xd1:      // aci pb,byte
3552                 ACI_IO(P_B); break;
3553         case 0xd2:      // aci pc,byte
3554                 ACI_IO(P_C); break;
3555         case 0xd3:      // aci mk,byte
3556                 ACI(MK); break;
3557         case 0xd8:      // offi pa,byte
3558                 OFFI_IO(P_A); break;
3559         case 0xd9:      // offi pb,byte
3560                 OFFI_IO(P_B); break;
3561         case 0xda:      // offi pc,byte
3562                 OFFI_IO(P_C); break;
3563         case 0xdb:      // offi mk,byte
3564                 OFFI(MK); break;
3565         case 0xe0:      // sui pa,byte
3566                 SUI_IO(P_A); break;
3567         case 0xe1:      // sui pb,byte
3568                 SUI_IO(P_B); break;
3569         case 0xe2:      // sui pc,byte
3570                 SUI_IO(P_C); break;
3571         case 0xe3:      // sui mk,byte
3572                 SUI(MK); break;
3573         case 0xe8:      // nei pa,byte
3574                 NEI_IO(P_A); break;
3575         case 0xe9:      // nei pb,byte
3576                 NEI_IO(P_B); break;
3577         case 0xea:      // nei pc,byte
3578                 NEI_IO(P_C); break;
3579         case 0xeb:      // nei mk,byte
3580                 NEI(MK); break;
3581         case 0xf0:      // sbi pa,byte
3582                 SBI_IO(P_A); break;
3583         case 0xf1:      // sbi pb,byte
3584                 SBI_IO(P_B); break;
3585         case 0xf2:      // sbi pc,byte
3586                 SBI_IO(P_C); break;
3587         case 0xf3:      // sbi mk,byte
3588                 SBI(MK); break;
3589         case 0xf8:      // eqi pa,byte
3590                 EQI_IO(P_A); break;
3591         case 0xf9:      // eqi pb,byte
3592                 EQI_IO(P_B); break;
3593         case 0xfa:      // eqi pc,byte
3594                 EQI_IO(P_C); break;
3595         case 0xfb:      // eqi mk,byte
3596                 EQI(MK); break;
3597         default:
3598                 this->out_debug_log(_T("PC=%4x\tCPU\tUNKNOWN OP : 64 %2x\n"), prevPC, ope);
3599         }
3600 }
3601
3602 void UPD7801::OP70()
3603 {
3604         uint8_t ope = FETCH8();
3605         period += op70[ope].clock;
3606         
3607         switch(ope) {
3608         case 0x0e:      // sspd word
3609                 WM16(FETCH16(), SP); break;
3610         case 0x0f:      // lspd word
3611                 SP = RM16(FETCH16()); break;
3612         case 0x1e:      // sbcd word
3613                 WM16(FETCH16(), BC); break;
3614         case 0x1f:      // lbcd word
3615                 BC = RM16(FETCH16()); break;
3616         case 0x2e:      // sded word
3617                 WM16(FETCH16(), DE); break;
3618         case 0x2f:      // lded word
3619                 DE = RM16(FETCH16()); break;
3620         case 0x3e:      // shld word
3621                 WM16(FETCH16(), HL); break;
3622         case 0x3f:      // lhld word
3623                 HL = RM16(FETCH16()); break;
3624         case 0x68:      // mov v,word
3625                 _V = RM8(FETCH16()); 
3626                 break;
3627         case 0x69:      // mov a,word
3628                 _A = RM8(FETCH16()); break;
3629         case 0x6a:      // mov b,word
3630                 _B = RM8(FETCH16()); break;
3631         case 0x6b:      // mov c,word
3632                 _C = RM8(FETCH16()); break;
3633         case 0x6c:      // mov d,word
3634                 _D = RM8(FETCH16()); break;
3635         case 0x6d:      // mov e,word
3636                 _E = RM8(FETCH16()); break;
3637         case 0x6e:      // mov h,word
3638                 _H = RM8(FETCH16()); break;
3639         case 0x6f:      // mov l,word
3640                 _L = RM8(FETCH16()); break;
3641         case 0x78:      // mov word,v
3642                 WM8(FETCH16(), _V); break;
3643         case 0x79:      // mov word,a
3644                 WM8(FETCH16(), _A); break;
3645         case 0x7a:      // mov word,b
3646                 WM8(FETCH16(), _B); break;
3647         case 0x7b:      // mov word,c
3648                 WM8(FETCH16(), _C); break;
3649         case 0x7c:      // mov word,d
3650                 WM8(FETCH16(), _D); break;
3651         case 0x7d:      // mov word,e
3652                 WM8(FETCH16(), _E); break;
3653         case 0x7e:      // mov word,h
3654                 WM8(FETCH16(), _H); break;
3655         case 0x7f:      // mov word,l
3656                 WM8(FETCH16(), _L); break;
3657         case 0x89:      // anax b
3658                 ANAX(BC); break;
3659         case 0x8a:      // anax d
3660                 ANAX(DE); break;
3661         case 0x8b:      // anax h
3662                 ANAX(HL); break;
3663         case 0x8c:      // anax d+
3664                 ANAX(DE++); break;
3665         case 0x8d:      // anax h+
3666                 ANAX(HL++); break;
3667         case 0x8e:      // anax d-
3668                 ANAX(DE--); break;
3669         case 0x8f:      // anax h-
3670                 ANAX(HL--); break;
3671         case 0x91:      // xrax b
3672                 XRAX(BC); break;
3673         case 0x92:      // xrax d
3674                 XRAX(DE); break;
3675         case 0x93:      // xrax h
3676                 XRAX(HL); break;
3677         case 0x94:      // xrax d+
3678                 XRAX(DE++); break;
3679         case 0x95:      // xrax h+
3680                 XRAX(HL++); break;
3681         case 0x96:      // xrax d-
3682                 XRAX(DE--); break;
3683         case 0x97:      // xrax h-
3684                 XRAX(HL--); break;
3685         case 0x99:      // orax b
3686                 ORAX(BC); break;
3687         case 0x9a:      // orax d
3688                 ORAX(DE); break;
3689         case 0x9b:      // orax h
3690                 ORAX(HL); break;
3691         case 0x9c:      // orax d+
3692                 ORAX(DE++); break;
3693         case 0x9d:      // orax h+
3694                 ORAX(HL++); break;
3695         case 0x9e:      // orax d-
3696                 ORAX(DE--); break;
3697         case 0x9f:      // orax h-
3698                 ORAX(HL--); break;
3699         case 0xa1:      // addncx b
3700                 ADDNCX(BC); break;
3701         case 0xa2:      // addncx d
3702                 ADDNCX(DE); break;
3703         case 0xa3:      // addncx h
3704                 ADDNCX(HL); break;
3705         case 0xa4:      // addncx d+
3706                 ADDNCX(DE++); break;
3707         case 0xa5:      // addncx h+
3708                 ADDNCX(HL++); break;
3709         case 0xa6:      // addncx d-
3710                 ADDNCX(DE--); break;
3711         case 0xa7:      // addncx h-
3712                 ADDNCX(HL--); break;
3713         case 0xa9:      // gtax b
3714                 GTAX(BC); break;
3715         case 0xaa:      // gtax d
3716                 GTAX(DE); break;
3717         case 0xab:      // gtax h
3718                 GTAX(HL); break;
3719         case 0xac:      // gtax d+
3720                 GTAX(DE++); break;
3721         case 0xad:      // gtax h+
3722                 GTAX(HL++); break;
3723         case 0xae:      // gtax d-
3724                 GTAX(DE--); break;
3725         case 0xaf:      // gtax h-
3726                 GTAX(HL--); break;
3727         case 0xb1:      // subnbx b
3728                 SUBNBX(BC); break;
3729         case 0xb2:      // subnbx d
3730                 SUBNBX(DE); break;
3731         case 0xb3:      // subnbx h
3732                 SUBNBX(HL); break;
3733         case 0xb4:      // subnbx d+
3734                 SUBNBX(DE++); break;
3735         case 0xb5:      // subnbx h+
3736                 SUBNBX(HL++); break;
3737         case 0xb6:      // subnbx d-
3738                 SUBNBX(DE--); break;
3739         case 0xb7:      // subnbx h-
3740                 SUBNBX(HL--); break;
3741         case 0xb9:      // ltax b
3742                 LTAX(BC); break;
3743         case 0xba:      // ltax d
3744                 LTAX(DE); break;
3745         case 0xbb:      // ltax h
3746                 LTAX(HL); break;
3747         case 0xbc:      // ltax d+
3748                 LTAX(DE++); break;
3749         case 0xbd:      // ltax h+
3750                 LTAX(HL++); break;
3751         case 0xbe:      // ltax d-
3752                 LTAX(DE--); break;
3753         case 0xbf:      // ltax h-
3754                 LTAX(HL--); break;
3755         case 0xc1:      // addx b
3756                 ADDX(BC); break;
3757         case 0xc2:      // addx d
3758                 ADDX(DE); break;
3759         case 0xc3:      // addx h
3760                 ADDX(HL); break;
3761         case 0xc4:      // addx d+
3762                 ADDX(DE++); break;
3763         case 0xc5:      // addx h+
3764                 ADDX(HL++); break;
3765         case 0xc6:      // addx d-
3766                 ADDX(DE--); break;
3767         case 0xc7:      // addx h-
3768                 ADDX(HL--); break;
3769         case 0xc9:      // onax b
3770                 ONAX(BC); break;
3771         case 0xca:      // onax d
3772                 ONAX(DE); break;
3773         case 0xcb:      // onax h
3774                 ONAX(HL); break;
3775         case 0xcc:      // onax d+
3776                 ONAX(DE++); break;
3777         case 0xcd:      // onax h+
3778                 ONAX(HL++); break;
3779         case 0xce:      // onax d-
3780                 ONAX(DE--); break;
3781         case 0xcf:      // onax h-
3782                 ONAX(HL--); break;
3783         case 0xd1:      // adcx b
3784                 ADCX(BC); break;
3785         case 0xd2:      // adcx d
3786                 ADCX(DE); break;
3787         case 0xd3:      // adcx h
3788                 ADCX(HL); break;
3789         case 0xd4:      // adcx d+
3790                 ADCX(DE++); break;
3791         case 0xd5:      // adcx h+
3792                 ADCX(HL++); break;
3793         case 0xd6:      // adcx d-
3794                 ADCX(DE--); break;
3795         case 0xd7:      // adcx h-
3796                 ADCX(HL--); break;
3797         case 0xd9:      // offax b
3798                 OFFAX(BC); break;
3799         case 0xda:      // offax d
3800                 OFFAX(DE); break;
3801         case 0xdb:      // offax h
3802                 OFFAX(HL); break;
3803         case 0xdc:      // offax d+
3804                 OFFAX(DE++); break;
3805         case 0xdd:      // offax h+
3806                 OFFAX(HL++); break;
3807         case 0xde:      // offax d-
3808                 OFFAX(DE--); break;
3809         case 0xdf:      // offax h-
3810                 OFFAX(HL--); break;
3811         case 0xe1:      // subx b
3812                 SUBX(BC); break;
3813         case 0xe2:      // subx d
3814                 SUBX(DE); break;
3815         case 0xe3:      // subx h
3816                 SUBX(HL); break;
3817         case 0xe4:      // subx d+
3818                 SUBX(DE++); break;
3819         case 0xe5:      // subx h+
3820                 SUBX(HL++); break;
3821         case 0xe6:      // subx d-
3822                 SUBX(DE--); break;
3823         case 0xe7:      // subx h-
3824                 SUBX(HL--); break;
3825         case 0xe9:      // neax b
3826                 NEAX(BC); break;
3827         case 0xea:      // neax d
3828                 NEAX(DE); break;
3829         case 0xeb:      // neax h
3830                 NEAX(HL); break;
3831         case 0xec:      // neax d+
3832                 NEAX(DE++); break;
3833         case 0xed:      // neax h+
3834                 NEAX(HL++); break;
3835         case 0xee:      // neax d-
3836                 NEAX(DE--); break;
3837         case 0xef:      // neax h-
3838                 NEAX(HL--); break;
3839         case 0xf1:      // sbbx b
3840                 SBBX(BC); break;
3841         case 0xf2:      // sbbx d
3842                 SBBX(DE); break;
3843         case 0xf3:      // sbbx h
3844                 SBBX(HL); break;
3845         case 0xf4:      // sbbx d+
3846                 SBBX(DE++); break;
3847         case 0xf5:      // sbbx h+
3848                 SBBX(HL++); break;
3849         case 0xf6:      // sbbx d-
3850                 SBBX(DE--); break;
3851         case 0xf7:      // sbbx h-
3852                 SBBX(HL--); break;
3853         case 0xf9:      // eqax b
3854                 EQAX(BC); break;
3855         case 0xfa:      // eqax d
3856                 EQAX(DE); break;
3857         case 0xfb:      // eqax h
3858                 EQAX(HL); break;
3859         case 0xfc:      // eqax d+
3860                 EQAX(DE++); break;
3861         case 0xfd:      // eqax h+
3862                 EQAX(HL++); break;
3863         case 0xfe:      // eqax d-
3864                 EQAX(DE--); break;
3865         case 0xff:      // eqax h-
3866                 EQAX(HL--); break;
3867         default:
3868                 this->out_debug_log(_T("PC=%4x\tCPU\tUNKNOWN OP : 70 %2x\n"), prevPC, ope);
3869         }
3870 }
3871
3872 void UPD7801::OP74()
3873 {
3874         uint8_t ope = FETCH8();
3875         period += op74[ope].clock;
3876         
3877         switch(ope) {
3878         case 0x88:      // anaw wa
3879                 ANAW(); break;
3880         case 0x90:      // xraw wa
3881                 XRAW(); break;
3882         case 0x98:      // oraw wa
3883                 ORAW(); break;
3884         case 0xa0:      // addncw wa
3885                 ADDNCW(); break;
3886         case 0xa8:      // gtaw wa
3887                 GTAW(); break;
3888         case 0xb0:      // subnbw wa
3889                 SUBNBW(); break;
3890         case 0xb8:      // ltaw wa
3891                 LTAW(); break;
3892         case 0xc0:      // addw wa
3893                 ADDW(); break;
3894         case 0xc8:      // onaw wa
3895                 ONAW(); break;
3896         case 0xd0:      // adcw wa
3897                 ADCW(); break;
3898         case 0xd8:      // offaw wa
3899                 OFFAW(); break;
3900         case 0xe0:      // subw wa
3901                 SUBW(); break;
3902         case 0xe8:      // neaw wa
3903                 NEAW(); break;
3904         case 0xf0:      // sbbw wa
3905                 SBBW(); break;
3906         case 0xf8:      // eqaw wa
3907                 EQAW(); break;
3908         default:
3909                 this->out_debug_log(_T("PC=%4x\tCPU\tUNKNOWN OP : 74 %2x\n"), prevPC, ope);
3910         }
3911 }
3912
3913 #define STATE_VERSION   4
3914
3915 bool UPD7801::process_state(FILEIO* state_fio, bool loading)
3916 {
3917         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
3918                 return false;
3919         }
3920         if(!state_fio->StateCheckInt32(this_device_id)) {
3921                 return false;
3922         }
3923         if(__USE_DEBUGGER) {
3924                 state_fio->StateValue(total_count);
3925         }
3926         state_fio->StateValue(count);
3927         state_fio->StateValue(period);
3928         state_fio->StateValue(scount);
3929         state_fio->StateValue(tcount);
3930         state_fio->StateValue(wait);
3931         state_fio->StateArray(regs, sizeof(regs), 1);
3932         state_fio->StateValue(SP);
3933         state_fio->StateValue(PC);
3934         state_fio->StateValue(prevPC);
3935         state_fio->StateValue(PSW);
3936         state_fio->StateValue(IRR);
3937         state_fio->StateValue(IFF);
3938         state_fio->StateValue(SIRQ);
3939         state_fio->StateValue(HALT);
3940         state_fio->StateValue(MK);
3941         state_fio->StateValue(MB);
3942         state_fio->StateValue(MC);
3943         state_fio->StateValue(TM0);
3944         state_fio->StateValue(TM1);
3945         state_fio->StateValue(SR);
3946         state_fio->StateValue(SAK);
3947         state_fio->StateValue(TO);
3948         state_fio->StateValue(HLDA);
3949         state_fio->StateValue(PORTC);
3950         state_fio->StateValue(SI);
3951         state_fio->StateValue(SCK);
3952         state_fio->StateValue(sio_count);
3953         
3954         // post process
3955         if(__USE_DEBUGGER) {
3956                 if(loading) {
3957                         prev_total_count = total_count;
3958                 }
3959         }
3960         return true;
3961 }