OSDN Git Service

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