4 * Copyright (C) 2013 Rainer Keuchel
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #define IS_DIRECT_MEM(V) (((V) & 0xFF00) == 0xFF00)
26 // these fail on negative numbers..
27 //#define IS_8BIT_IMMED(V) (((V) & 0xFF00) == 0x0)
28 //#define IS_16BIT_IMMED(V) (((V) & 0xFFFF0000) == 0x0)
30 #define IS_8BIT_IMMED(V) 1
31 #define IS_16BIT_IMMED(V) 1
32 #define IS_REG_INDIRECT(T) ((T) >= S_IDBC && (T) <= S_IDSP)
33 #define GET_IND_REG(T) ((T) - S_IDBC)
34 #define GET_COND_FROM_MODE(V) ((V) & 0xFF)
36 char *cpu
= "Toshiba TLCS90";
40 * Opcode Cycle Definitions (not yet)
42 #define OPCY_SDP ((char) (0xFF))
43 #define OPCY_ERR ((char) (0xFE))
45 /* OPCY_NONE ((char) (0x80)) */
46 /* OPCY_MASK ((char) (0x7F)) */
48 #define OPCY_CPU ((char) (0xFD))
50 #define UN ((char) (OPCY_NONE | 0x00))
51 #define P2 ((char) (OPCY_NONE | 0x01))
52 #define P3 ((char) (OPCY_NONE | 0x02))
53 #define P4 ((char) (OPCY_NONE | 0x03))
54 #define P5 ((char) (OPCY_NONE | 0x04))
55 #define P6 ((char) (OPCY_NONE | 0x05))
56 #define P7 ((char) (OPCY_NONE | 0x06))
59 * TLCS-90 Opcode Cycle Pages (NOT CHANGED FROM Z80 YET!)
62 static char t90pg1
[256] = {
63 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
64 /*--*--* - - - - - - - - - - - - - - - - */
65 /*00*/ 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4,
66 /*10*/ 13,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4,
67 /*20*/ 12,10,16, 6, 4, 4, 7, 4,12,11,16, 6, 4, 4, 7, 4,
68 /*30*/ 12,10,13, 6,11,11,10, 4,12,11,13, 6, 4, 4, 7, 4,
69 /*40*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
70 /*50*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
71 /*60*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
72 /*70*/ 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4,
73 /*80*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
74 /*90*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
75 /*A0*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
76 /*B0*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
77 /*C0*/ 11,10,10,10,17,11, 7,11,11,10,10,P2
,17,17, 7,11,
78 /*D0*/ 11,10,10,11,17,11, 7,11,11, 4,10,11,17,P3
, 7,11,
79 /*E0*/ 11,10,10,19,17,11, 7,11,11, 4,10, 4,17,P4
, 7,11,
80 /*F0*/ 11,10,10, 4,17,11, 7,11,11, 6,10, 4,17,P5
, 7,11
83 static char t90pg2
[256] = { /* P2 == CB */
84 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
85 /*--*--* - - - - - - - - - - - - - - - - */
86 /*00*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
87 /*10*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
88 /*20*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
89 /*30*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
, 8, 8, 8, 8, 8, 8,15, 8,
90 /*40*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
91 /*50*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
92 /*60*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
93 /*70*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
94 /*80*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
95 /*90*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
96 /*A0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
97 /*B0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
98 /*C0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
99 /*D0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
100 /*E0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
101 /*F0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8
104 static char t90pg3
[256] = { /* P3 == DD */
105 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
106 /*--*--* - - - - - - - - - - - - - - - - */
107 /*00*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,15,UN
,UN
,UN
,UN
,UN
,UN
,
108 /*10*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,15,UN
,UN
,UN
,UN
,UN
,UN
,
109 /*20*/ UN
,14,20,10,UN
,UN
,UN
,UN
,UN
,15,20,10,UN
,UN
,UN
,UN
,
110 /*30*/ UN
,UN
,UN
,UN
,23,23,19,UN
,UN
,15,UN
,UN
,UN
,UN
,UN
,UN
,
111 /*40*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
112 /*50*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
113 /*60*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
114 /*70*/ 19,19,19,19,19,19,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
115 /*80*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
116 /*90*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
117 /*A0*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
118 /*B0*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
119 /*C0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,P6
,UN
,UN
,UN
,UN
,
120 /*D0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
121 /*E0*/ UN
,14,UN
,23,UN
,15,UN
,UN
,UN
, 8,UN
,UN
,UN
,UN
,UN
,UN
,
122 /*F0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,10,UN
,UN
,UN
,UN
,UN
,UN
125 static char t90pg4
[256] = { /* P4 == ED */
126 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
127 /*--*--* - - - - - - - - - - - - - - - - */
128 /*00*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
129 /*10*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
130 /*20*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
131 /*30*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
132 /*40*/ 12,12,15,20, 8,14, 8, 9,12,12,15,20,UN
,14,UN
, 9,
133 /*50*/ 12,12,15,20,UN
,UN
, 8, 9,12,12,15,20,UN
,UN
, 8, 9,
134 /*60*/ 12,12,15,20,UN
,UN
,UN
,18,12,12,15,20,UN
,UN
,UN
,18,
135 /*70*/ UN
,UN
,15,20,UN
,UN
,UN
,UN
,12,12,15,20,UN
,UN
,UN
,UN
,
136 /*80*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
137 /*90*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
138 /*A0*/ 16,16,16,16,UN
,UN
,UN
,UN
,16,16,16,16,UN
,UN
,UN
,UN
,
139 /*B0*/ 21,21,21,21,UN
,UN
,UN
,UN
,21,21,21,21,UN
,UN
,UN
,UN
,
140 /*C0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
141 /*D0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
142 /*E0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
143 /*F0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
146 static char t90pg5
[256] = { /* P5 == FD */
147 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
148 /*--*--* - - - - - - - - - - - - - - - - */
149 /*00*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,15,UN
,UN
,UN
,UN
,UN
,UN
,
150 /*10*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,15,UN
,UN
,UN
,UN
,UN
,UN
,
151 /*20*/ UN
,14,20,10,UN
,UN
,UN
,UN
,UN
,15,20,10,UN
,UN
,UN
,UN
,
152 /*30*/ UN
,UN
,UN
,UN
,23,23,19,UN
,UN
,15,UN
,UN
,UN
,UN
,UN
,UN
,
153 /*40*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
154 /*50*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
155 /*60*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
156 /*70*/ 19,19,19,19,19,19,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
157 /*80*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
158 /*90*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
159 /*A0*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
160 /*B0*/ UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,UN
,UN
,UN
,UN
,UN
,UN
,19,UN
,
161 /*C0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,P7
,UN
,UN
,UN
,UN
,
162 /*D0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,
163 /*E0*/ UN
,14,UN
,23,UN
,15,UN
,UN
,UN
, 8,UN
,UN
,UN
,UN
,UN
,UN
,
164 /*F0*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,10,UN
,UN
,UN
,UN
,UN
,UN
167 static char t90pg6
[256] = { /* P6 == DD CB */
168 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
169 /*--*--* - - - - - - - - - - - - - - - - */
170 /*00*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
171 /*10*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
172 /*20*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
173 /*30*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
174 /*40*/ UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,
175 /*50*/ UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,
176 /*60*/ UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,
177 /*70*/ UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,
178 /*80*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
179 /*90*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
180 /*A0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
181 /*B0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
182 /*C0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
183 /*D0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
184 /*E0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
185 /*F0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
188 static char t90pg7
[256] = { /* P7 == FD CB */
189 /*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
190 /*--*--* - - - - - - - - - - - - - - - - */
191 /*00*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
192 /*10*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
193 /*20*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
194 /*30*/ UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
195 /*40*/ UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,
196 /*50*/ UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,
197 /*60*/ UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,
198 /*70*/ UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,UN
,UN
,UN
,UN
,UN
,UN
,20,UN
,
199 /*80*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
200 /*90*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
201 /*A0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
202 /*B0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
203 /*C0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
204 /*D0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
205 /*E0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,
206 /*F0*/ UN
,UN
,UN
,UN
,UN
,UN
,23,UN
,UN
,UN
,UN
,UN
,UN
,UN
,23,UN
209 static char *t90Page
[7] = {
210 t90pg1
, t90pg2
, t90pg3
, t90pg4
,
211 t90pg5
, t90pg6
, t90pg7
215 gen_xop_arith(int rf
, int op
, int t1
, int t2
, int v1
, int v2
, struct expr
*e1
, struct expr
*e2
)
217 if(IS_REG_INDIRECT(t1
) && t2
== S_IMMED
)
219 int r
= GET_IND_REG(t1
);
238 outab(e1
->e_addr
& 0xFF);
247 if(IS_REG_INDIRECT(t1
) && t2
== S_R8
)
255 if(IS_REG_INDIRECT(t1
) && t2
== S_R16
)
262 if(t1
== S_R8
&& IS_REG_INDIRECT(t2
))
269 if(t1
== S_R16
&& IS_REG_INDIRECT(t2
))
309 outab((0xf0 - IX
) + r
);
321 if(t1
== S_R16
&& t2
== S_R16
)
337 if(t1
== S_R8
&& t2
== S_INDM
)
341 if(IS_DIRECT_MEM(v2
))
344 outab(e2
->e_addr
& 0xFF);
350 outrw(e2
, 0); // reloc..
361 if(t1
== S_R8
&& t2
== S_IMMED
)
369 if(t1
== S_R16
&& t2
== S_INDM
)
371 if(IS_DIRECT_MEM(v2
))
390 outrw(e2
, 0); // reloc..
402 if(t1
== S_R8
&& t2
== S_R8
)
413 if(t1
== S_INDM
&& t2
== S_IMMED
)
415 if(IS_DIRECT_MEM(v1
))
443 machine(struct mne
*mp
)
452 op
= (int) mp
->m_valu
;
455 // NOTE: S_CPU must be max!?
464 v1
= (int) e1
.e_addr
;
468 outab(op
| (v1
& 0x0F));
475 //////////////////////////////////////////////////////////////////////
479 v1
= (int) e1
.e_addr
;
482 v2
= (int) e2
.e_addr
;
485 v3
= (int) e2
.e_addr
;
487 if (t1
== S_R16
&& (t2
== S_R16
) && (v2
==IX
|| v2
==IY
|| v2
==SP
) && t3
== S_IMMED
)
491 outab(0x38 + (v1
& 0x0F));
494 if (t1
== S_R16
&& (t2
== S_R16
) && (v2
==HL
) && t3
== S_R8
&& v3
== A
)
497 outab(0x38 + (v1
& 0x0F));
506 v1
= (unsigned short) e1
.e_addr
;
510 if ((t1
== S_INDM
) && (IS_DIRECT_MEM(v1
)))
520 //////////////////////////////////////////////////////////////////////
526 if ((v1
= admode(CND
)) != 0)
530 outab(0xD0 | GET_COND_FROM_MODE(v1
));
548 //////////////////////////////////////////////////////////////////////
551 if ((v1
= admode(CND
)) != 0)
563 outab(0xD0 + GET_COND_FROM_MODE(v1
));
579 else if (IS_REG_INDIRECT(t1
))
581 int r
= GET_IND_REG(t1
);
593 //////////////////////////////////////////////////////////////////////
600 //////////////////////////////////////////////////////////////////////
603 if ((v1
= admode(CND
)) != 0)
614 op
|= GET_COND_FROM_MODE(v1
);
619 else if(t1
== S_USER
)
622 outrw(&e1
, 0); // jmp, reloc
623 outab(0xC0 | GET_COND_FROM_MODE(v1
));
638 outrw(&e1
, 0); // jmp, reloc..
641 else if (IS_REG_INDIRECT(t1
)) // also S_R16?
643 int r
= GET_IND_REG(t1
);
654 //////////////////////////////////////////////////////////////////////
661 if((v1
= admode(CND
)) != 0)
663 op
= 0xC0 | GET_COND_FROM_MODE(v1
);
672 else if(rf
== S_CALLR
)
681 // signed 16-bit pcrel
685 else if(rf
== S_DJNZ
)
709 if (e2
.e_mode
!= S_USER
)
716 v2
= (int) (e2
.e_addr
- dot
.s_addr
- 1);
718 // SDCC currently generates jr cc, xxxx calls that exceeds the pc rel limit, i.e. 132..
719 if (pass
== 2 && ((v2
< -128) || (v2
> 127)))
734 //////////////////////////////////////////////////////////////////////
741 v1
= (int) e1
.e_addr
;
742 v2
= (int) e2
.e_addr
;
744 if (t1
== S_R16
&& t2
== S_R16
)
746 if ((v1
== DE
) && (v2
== HL
))
751 if ((v2
== DE
) && (v1
== HL
))
757 if((v1
& 0xF) == AF
&& (v2
& 0xF) == AF
)
767 if(IS_REG_INDIRECT(t1
) && t2
== S_R16
)
769 int r
= GET_IND_REG(t1
);
787 outab(0xF0 + (r
- IX
));
795 if(t1
== S_R16
&& IS_REG_INDIRECT(t2
))
797 int r
= GET_IND_REG(t2
);
815 outab(0xF0 + (r
- IX
));
826 //////////////////////////////////////////////////////////////////////
831 v1
= (int) e1
.e_addr
;
833 if(IS_REG_INDIRECT(t1
))
871 outab(op
+ 0x10 + v1
);
877 if(IS_DIRECT_MEM(v1
))
886 outrw(&e1
, 0); // reloc
895 //////////////////////////////////////////////////////////////////////
900 v1
= (int) e1
.e_addr
;
904 if((IS_DIRECT_MEM(v1
)))
918 else if(IS_REG_INDIRECT(t1
))
920 int r
= GET_IND_REG(t1
);
938 outab(0xf0 + (r
- IX
));
949 //////////////////////////////////////////////////////////////////////
954 v1
= (int) e1
.e_addr
;
957 v2
= (int) e2
.e_addr
;
959 if(t1
== S_R16
&& t2
== S_R8
)
969 if(t1
== S_R16
&& t2
== S_INDM
)
971 if(v1
== HL
&& (IS_DIRECT_MEM(v2
)))
982 if(t1
== S_R16
&& t2
== S_IMMED
)
984 if(v1
== HL
&& (IS_8BIT_IMMED(v2
)))
994 if(t1
== S_R16
&& IS_REG_INDIRECT(t2
))
996 int r
= GET_IND_REG(t2
);
1014 outab(0xF0 + (r
- IX
));
1015 outab(e2
.e_addr
& 0xFF);
1026 //////////////////////////////////////////////////////////////////////
1033 v1
= (int) e1
.e_addr
;
1036 v2
= (int) e2
.e_addr
;
1038 if(t1
== S_USER
&& t2
== S_R8
)
1045 if ((t1
== S_USER
&& t2
== S_INDM
))
1047 if(v1
< 0 || v1
> 7)
1050 if((IS_DIRECT_MEM(v2
)))
1066 if ((t1
== S_USER
&& IS_REG_INDIRECT(t2
)))
1068 int r
= GET_IND_REG(t2
);
1070 if(v1
< 0 || v1
> 7)
1097 outab(e2
.e_addr
& 0xFF);
1106 //////////////////////////////////////////////////////////////////////
1117 v1
= (int) e1
.e_addr
;
1120 v2
= (int) e2
.e_addr
;
1123 if(t1
== S_R8
&& t2
== S_R8
)
1125 gen_xop_arith(rf
, op
, t1
, t2
, v1
, v2
, &e1
, &e2
);
1130 if(t1
== S_INDM
&& t2
== S_IMMED
)
1132 gen_xop_arith(rf
, op
+ 0x8, t1
, t2
, v1
, v2
, &e1
, &e2
);
1137 if(t1
== S_R8
&& t2
== S_INDM
)
1141 if(IS_DIRECT_MEM(v2
))
1149 gen_xop_arith(rf
, op
, t1
, t2
, v1
, v2
, &e1
, &e2
);
1161 if(t1
== S_R8
&& IS_REG_INDIRECT(t2
))
1163 int r
= GET_IND_REG(t2
);
1174 outab((op
- 6) + v1
);
1187 outab(e2
.e_addr
& 0xFF);
1188 outab((op
- 6) + v1
);
1194 if(t1
== S_R16
&& IS_REG_INDIRECT(t2
))
1197 if(v1
== BC
|| v1
== DE
)
1203 if(rf
!= S_ADD
&& v1
!= HL
)
1210 gen_xop_arith(rf
, op
+ 0x10, t1
, t2
, v1
, v2
, &e1
, &e2
);
1212 gen_xop_arith(rf
, 0x10, t1
, t2
, v1
, v2
, &e1
, &e2
);
1218 if(IS_REG_INDIRECT(t1
) && t2
== S_R8
)
1220 gen_xop_arith(rf
, op
, t1
, t2
, v1
, v2
, &e1
, &e2
);
1225 if(IS_REG_INDIRECT(t1
) && t2
== S_IMMED
)
1227 gen_xop_arith(rf
, op
+ 0x8, t1
, t2
, v1
, v2
, &e1
, &e2
);
1232 if(t1
== S_R8
&& t2
== S_IMMED
)
1234 if((v1
== A
) && (IS_8BIT_IMMED(v2
)))
1242 gen_xop_arith(rf
, op
+ 8, t1
, t2
, v1
, v2
, &e1
, &e2
);
1248 if(t1
== S_R16
&& t2
== S_INDM
)
1250 // bc, de not allowed..
1251 if(v1
== BC
|| v1
== DE
)
1256 if(IS_DIRECT_MEM(v2
))
1264 gen_xop_arith(rf
, op
+ 0x10, t1
, t2
, v1
, v2
, &e1
, &e2
);
1270 gen_xop_arith(rf
, 0x10, t1
, t2
, v1
, v2
, &e1
, &e2
);
1276 if(t1
== S_R16
&& t2
== S_R16
)
1278 gen_xop_arith(rf
, op
, t1
, t2
, v1
, v2
, &e1
, &e2
);
1283 if(t1
== S_R16
&& t2
== S_IMMED
)
1285 // sub not allowed on sp, ix, iy
1286 // de, bc not allowed at all!?
1324 outab(op
+ 0x16 + v1
);
1333 //////////////////////////////////////////////////////////////////////
1344 v1
= (int) e1
.e_addr
;
1345 // can have a as first op or not..
1348 if(t1
== S_R8
&& v1
== A
)
1355 v1
= (int) e1
.e_addr
;
1364 if(IS_DIRECT_MEM(v1
) && v1
> 0)
1368 outab(0xA0 + (rf
- S_RLC
));
1372 if(IS_REG_INDIRECT(t1
))
1374 int r
= GET_IND_REG(t1
);
1379 outab(0xA0 + (rf
- S_RLC
));
1387 outab(0xA0 + (rf
- S_RLC
));
1391 outab(0xF0 + (r
- IX
));
1393 outab(0xA0 + (rf
- S_RLC
));
1401 // TODO: not used by asl assembler..
1404 outab(0xA0 + (rf
- S_RLC
));
1411 outab(0xA0 + (rf
- S_RLC
));
1419 //////////////////////////////////////////////////////////////////////
1461 //////////////////////////////////////////////////////////////////////
1466 v1
= (int) e1
.e_addr
;
1469 v2
= (int) e2
.e_addr
;
1471 if(t1
== S_R16
&& t2
== S_USER
)
1479 // signed 16-bit pcrel
1489 //////////////////////////////////////////////////////////////////////
1493 v1
= (int) e1
.e_addr
;
1496 v2
= (int) e2
.e_addr
;
1498 if(t1
== S_INDM
&& t2
== S_IMMED
)
1500 if(IS_DIRECT_MEM(v1
))
1510 outrw(&e2
, 0); // addr
1512 outrw(&e2
, 0); // immd
1519 if(IS_REG_INDIRECT(t1
) && t2
== S_IMMED
)
1523 r
= GET_IND_REG(t1
);
1543 outab(e1
.e_addr
& 0xFF);
1553 //////////////////////////////////////////////////////////////////////
1557 v1
= (int) e1
.e_addr
;
1560 v2
= (int) e2
.e_addr
;
1562 if(t1
== S_R8
&& t2
== S_R8
)
1582 if(IS_REG_INDIRECT(t1
) && t2
== S_R8
)
1586 r
= GET_IND_REG(t1
);
1604 outab(0xf7); // HL+A
1617 if(t1
== S_R8
&& IS_REG_INDIRECT(t2
))
1621 r
= GET_IND_REG(t2
);
1636 else if(r
== HL
) // HL+A
1652 if(IS_REG_INDIRECT(t1
) && t2
== S_R16
)
1656 r
= GET_IND_REG(t1
);
1680 if(IS_REG_INDIRECT(t1
) && t2
== S_IMMED
)
1684 r
= GET_IND_REG(t1
);
1711 if(t1
== S_R16
&& IS_REG_INDIRECT(t2
))
1715 r
= GET_IND_REG(t2
);
1730 else if(r
== HL
) // HL+A
1746 if(t1
== S_R8
&& t2
== S_IMMED
)
1753 if(t1
== S_R8
&& t2
== S_INDM
)
1755 if(IS_DIRECT_MEM(v2
) && v1
== A
)
1762 if(IS_DIRECT_MEM(v2
))
1773 outrw(&e2
, 0); // reloc!?
1782 // alternate encodings or disassmbler bug?
1783 if(t1
== S_R8
&& t2
== S_INDM
)
1816 if(t1
== S_R16
&& t2
== S_R16
)
1835 if(t1
== S_R16
&& t2
== S_IMMED
)
1837 if(IS_16BIT_IMMED(v2
))
1845 if(t1
== S_R16
&& t2
== S_INDM
)
1847 if(IS_DIRECT_MEM(v2
))
1866 outrw(&e2
, 0); // reloc!?
1872 if(t1
== S_INDM
&& t2
== S_R8
)
1874 if(IS_DIRECT_MEM(v1
) && v2
== A
)
1880 else if(IS_DIRECT_MEM(v1
))
1898 if(t1
== S_INDM
&& t2
== S_R16
)
1900 if(IS_DIRECT_MEM(v1
))
1924 if(t1
== S_INDM
&& t2
== S_IMMED
)
1926 if(IS_DIRECT_MEM(v1
))
1948 //////////////////////////////////////////////////////////////////////
1953 // implicit (hl) operand
1958 //////////////////////////////////////////////////////////////////////
1961 opcycles
= OPCY_CPU
;
1967 //////////////////////////////////////////////////////////////////////
1970 opcycles
= OPCY_ERR
;
1975 if (opcycles
== OPCY_NONE
)
1977 opcycles
= t90pg1
[cb
[0] & 0xFF];
1978 while ((opcycles
& OPCY_NONE
) && (opcycles
& OPCY_MASK
))
1981 case P2
: /* CB xx */
1982 case P3
: /* DD xx */
1983 case P4
: /* ED xx */
1984 case P5
: /* FD xx */
1985 opcycles
= t90Page
[opcycles
& OPCY_MASK
][cb
[1] & 0xFF];
1987 case P6
: /* DD CB -- xx */
1988 case P7
: /* FD CB -- xx */
1989 opcycles
= t90Page
[opcycles
& OPCY_MASK
][cb
[3] & 0xFF];
1992 opcycles
= OPCY_NONE
;
2000 * Branch/Jump PCR Mode Check
2004 mchpcr(struct expr
*esp
)
2006 if (esp
->e_base
.e_ap
== dot
.s_area
)
2011 if (esp
->e_flag
==0 && esp
->e_base
.e_ap
==NULL
)
2014 * Absolute Destination
2016 * Use the global symbol '.__.ABS.'
2017 * of value zero and force the assembler
2018 * to use this absolute constant as the
2019 * base value for the relocation.
2022 esp
->e_base
.e_sp
= &sym
[1];
2029 * Machine dependent initialization
2042 sym
[2].s_addr
= X_T90
;