1*4e98e3e1Schristos /* Code generator for the Hitachi H8/300 architecture simulator.
2*4e98e3e1Schristos
3*4e98e3e1Schristos Written by Steve Chamberlain of Cygnus Support.
4*4e98e3e1Schristos sac@cygnus.com
5*4e98e3e1Schristos
6*4e98e3e1Schristos This file is part of H8/300 sim
7*4e98e3e1Schristos
8*4e98e3e1Schristos
9*4e98e3e1Schristos THIS SOFTWARE IS NOT COPYRIGHTED
10*4e98e3e1Schristos
11*4e98e3e1Schristos Cygnus offers the following for use in the public domain. Cygnus
12*4e98e3e1Schristos makes no warranty with regard to the software or it's performance
13*4e98e3e1Schristos and the user accepts the software "AS IS" with all faults.
14*4e98e3e1Schristos
15*4e98e3e1Schristos CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
16*4e98e3e1Schristos THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*4e98e3e1Schristos MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18*4e98e3e1Schristos
19*4e98e3e1Schristos */
20*4e98e3e1Schristos
21*4e98e3e1Schristos /* This program reads the H8/300 opcode table and writes out
22*4e98e3e1Schristos a large switch statement to understand the opcodes (with ifs if
23*4e98e3e1Schristos there is more than one opcode per case) and code to do the stuff */
24*4e98e3e1Schristos
25*4e98e3e1Schristos #include <stdio.h>
26*4e98e3e1Schristos
27*4e98e3e1Schristos #define DEFINE_TABLE
28*4e98e3e1Schristos #define INSIM
29*4e98e3e1Schristos #include"opcode/h8300.h"
30*4e98e3e1Schristos
31*4e98e3e1Schristos #define MAXSAME 140
32*4e98e3e1Schristos
33*4e98e3e1Schristos #define PTWO 256
34*4e98e3e1Schristos static struct h8_opcode *h8_opcodes_sorted[PTWO][MAXSAME];
35*4e98e3e1Schristos
36*4e98e3e1Schristos char *cs = "/*";
37*4e98e3e1Schristos char *ce = "*/";
38*4e98e3e1Schristos
39*4e98e3e1Schristos /* How to get at nibble n from the instruction */
40*4e98e3e1Schristos char *nibs[] =
41*4e98e3e1Schristos {
42*4e98e3e1Schristos "foo",
43*4e98e3e1Schristos "(b0&0xf)",
44*4e98e3e1Schristos "((b1>>4)&0xf)",
45*4e98e3e1Schristos "((b1)&0xf)",
46*4e98e3e1Schristos "((pc[1]>>12)&0xf)",
47*4e98e3e1Schristos "((pc[1]>>8)&0xf)",
48*4e98e3e1Schristos "((pc[1]>>4)&0xf)",
49*4e98e3e1Schristos "((pc[1])&0xf)",
50*4e98e3e1Schristos 0, 0};
51*4e98e3e1Schristos
52*4e98e3e1Schristos /* how to get at the 3 bit immediate in the instruction */
53*4e98e3e1Schristos char *imm3[] =
54*4e98e3e1Schristos {"foo",
55*4e98e3e1Schristos "foo",
56*4e98e3e1Schristos "((b1>>4)&0x7)",
57*4e98e3e1Schristos "foo",
58*4e98e3e1Schristos "foo",
59*4e98e3e1Schristos "foo",
60*4e98e3e1Schristos "(pc[1]>>4)&0x7"};
61*4e98e3e1Schristos
62*4e98e3e1Schristos /* How to get at a byte register from an index in the instruction at
63*4e98e3e1Schristos nibble n */
64*4e98e3e1Schristos char *breg[] =
65*4e98e3e1Schristos {"foo",
66*4e98e3e1Schristos "*(blow[b0])",
67*4e98e3e1Schristos "*(bhigh[b1])",
68*4e98e3e1Schristos "*(blow[b1])",
69*4e98e3e1Schristos 0, 0,
70*4e98e3e1Schristos "*(bhigh[pc[1]>>8])"};
71*4e98e3e1Schristos
72*4e98e3e1Schristos /* How to get at a word register from an index in the instruction at
73*4e98e3e1Schristos nibble n */
74*4e98e3e1Schristos
75*4e98e3e1Schristos char *wreg[] =
76*4e98e3e1Schristos {"foo",
77*4e98e3e1Schristos "*(wlow[b0])",
78*4e98e3e1Schristos "*(whigh[b1])",
79*4e98e3e1Schristos "*(wlow[b1])"};
80*4e98e3e1Schristos
81*4e98e3e1Schristos #define sorted_key noperands
82*4e98e3e1Schristos
83*4e98e3e1Schristos /* sort the opcode table into h8_opcodes_sorted[0..255] */
84*4e98e3e1Schristos static void
init()85*4e98e3e1Schristos init ()
86*4e98e3e1Schristos {
87*4e98e3e1Schristos unsigned int i;
88*4e98e3e1Schristos struct h8_opcode *p;
89*4e98e3e1Schristos
90*4e98e3e1Schristos for (p = h8_opcodes; p->name; p++)
91*4e98e3e1Schristos {
92*4e98e3e1Schristos int n1 = 0;
93*4e98e3e1Schristos int n2 = 0;
94*4e98e3e1Schristos int j;
95*4e98e3e1Schristos #if 0
96*4e98e3e1Schristos for (j = 0; p->data.nib[j] != E; j++)
97*4e98e3e1Schristos {
98*4e98e3e1Schristos if ((int) p->data.nib[j] == ABS16ORREL8SRC)
99*4e98e3e1Schristos p->data.nib[j] = ABS16SRC;
100*4e98e3e1Schristos if ((int) p->data.nib[j] == ABS16OR8SRC)
101*4e98e3e1Schristos p->data.nib[j] = ABS16SRC;
102*4e98e3e1Schristos if ((int) p->data.nib[j] == ABS16OR8DST)
103*4e98e3e1Schristos p->data.nib[j] = ABS16DST;
104*4e98e3e1Schristos }
105*4e98e3e1Schristos #endif
106*4e98e3e1Schristos
107*4e98e3e1Schristos if ((int) p->data.nib[0] < 16)
108*4e98e3e1Schristos {
109*4e98e3e1Schristos n1 = (int) p->data.nib[0];
110*4e98e3e1Schristos }
111*4e98e3e1Schristos else
112*4e98e3e1Schristos n1 = 0;
113*4e98e3e1Schristos if ((int) p->data.nib[1] < 16)
114*4e98e3e1Schristos {
115*4e98e3e1Schristos n2 = (int) p->data.nib[1];
116*4e98e3e1Schristos }
117*4e98e3e1Schristos else
118*4e98e3e1Schristos n2 = 0;
119*4e98e3e1Schristos for (i = 0; i < MAXSAME; i++)
120*4e98e3e1Schristos {
121*4e98e3e1Schristos int j = /* ((n3 >> 3) * 512) + ((n4 >> 3) * 256) + */ n1 * 16 + n2;
122*4e98e3e1Schristos
123*4e98e3e1Schristos if (h8_opcodes_sorted[j][i] == (struct h8_opcode *) NULL)
124*4e98e3e1Schristos {
125*4e98e3e1Schristos h8_opcodes_sorted[j][i] = p;
126*4e98e3e1Schristos p->sorted_key = j;
127*4e98e3e1Schristos break;
128*4e98e3e1Schristos }
129*4e98e3e1Schristos }
130*4e98e3e1Schristos
131*4e98e3e1Schristos if (i == MAXSAME)
132*4e98e3e1Schristos abort ();
133*4e98e3e1Schristos
134*4e98e3e1Schristos /* Just make sure there are an even number of nibbles in it, and
135*4e98e3e1Schristos that the count is the same s the length */
136*4e98e3e1Schristos for (i = 0; p->data.nib[i] != E; i++)
137*4e98e3e1Schristos /*EMPTY*/ ;
138*4e98e3e1Schristos if (i & 1)
139*4e98e3e1Schristos abort ();
140*4e98e3e1Schristos p->length = i / 2;
141*4e98e3e1Schristos }
142*4e98e3e1Schristos for (i = 0; i < PTWO; i++)
143*4e98e3e1Schristos {
144*4e98e3e1Schristos if (h8_opcodes_sorted[i][0])
145*4e98e3e1Schristos p = h8_opcodes_sorted[i][0];
146*4e98e3e1Schristos else
147*4e98e3e1Schristos h8_opcodes_sorted[i][0] = p;
148*4e98e3e1Schristos }
149*4e98e3e1Schristos }
150*4e98e3e1Schristos
151*4e98e3e1Schristos /* decode the lvalues, creating a pointer in real space to object -
152*4e98e3e1Schristos remember if the thing has to be swapped out of where it is */
153*4e98e3e1Schristos
154*4e98e3e1Schristos
155*4e98e3e1Schristos int swap[2];
156*4e98e3e1Schristos
157*4e98e3e1Schristos lval (p)
158*4e98e3e1Schristos struct h8_opcode *p;
159*4e98e3e1Schristos {
160*4e98e3e1Schristos int i;
161*4e98e3e1Schristos
162*4e98e3e1Schristos for (i = 0; p->data.nib[i] != E; i++)
163*4e98e3e1Schristos {
164*4e98e3e1Schristos int x = p->data.nib[i];
165*4e98e3e1Schristos int size;
166*4e98e3e1Schristos int op;
167*4e98e3e1Schristos op = (x & DST) ? 1 : 0;
168*4e98e3e1Schristos
169*4e98e3e1Schristos switch (x & SIZE)
170*4e98e3e1Schristos {
171*4e98e3e1Schristos case L_32:
172*4e98e3e1Schristos size = 32;
173*4e98e3e1Schristos break;
174*4e98e3e1Schristos case L_16:
175*4e98e3e1Schristos size = 16;
176*4e98e3e1Schristos break;
177*4e98e3e1Schristos case L_8:
178*4e98e3e1Schristos size = 8;
179*4e98e3e1Schristos break;
180*4e98e3e1Schristos default:
181*4e98e3e1Schristos size = 1234;
182*4e98e3e1Schristos }
183*4e98e3e1Schristos
184*4e98e3e1Schristos if (x & REG)
185*4e98e3e1Schristos {
186*4e98e3e1Schristos printf ("ir%d = GET_LVAL_%d_REG(%d);\n", op, size, i);
187*4e98e3e1Schristos }
188*4e98e3e1Schristos else if (x & IMM)
189*4e98e3e1Schristos {
190*4e98e3e1Schristos printf ("/* Imm has no lvalue */\n");
191*4e98e3e1Schristos }
192*4e98e3e1Schristos
193*4e98e3e1Schristos }
194*4e98e3e1Schristos
195*4e98e3e1Schristos
196*4e98e3e1Schristos
197*4e98e3e1Schristos }
198*4e98e3e1Schristos
199*4e98e3e1Schristos void
decode(p,fetch,size)200*4e98e3e1Schristos decode (p, fetch, size)
201*4e98e3e1Schristos struct h8_opcode *p;
202*4e98e3e1Schristos int fetch;
203*4e98e3e1Schristos int size;
204*4e98e3e1Schristos {
205*4e98e3e1Schristos if (fetch)
206*4e98e3e1Schristos {
207*4e98e3e1Schristos lval (p);
208*4e98e3e1Schristos }
209*4e98e3e1Schristos
210*4e98e3e1Schristos }
211*4e98e3e1Schristos
212*4e98e3e1Schristos
213*4e98e3e1Schristos
214*4e98e3e1Schristos static void
esleep()215*4e98e3e1Schristos esleep ()
216*4e98e3e1Schristos {
217*4e98e3e1Schristos printf ("saved_state.exception = SIGSTOP;\n");
218*4e98e3e1Schristos }
219*4e98e3e1Schristos
220*4e98e3e1Schristos static void
mov(p,s,sz)221*4e98e3e1Schristos mov (p, s, sz)
222*4e98e3e1Schristos struct h8_opcode *p;
223*4e98e3e1Schristos char *s;
224*4e98e3e1Schristos int sz;
225*4e98e3e1Schristos {
226*4e98e3e1Schristos printf ("dst = srca;\n");
227*4e98e3e1Schristos }
228*4e98e3e1Schristos
229*4e98e3e1Schristos static void
andc(p)230*4e98e3e1Schristos andc (p)
231*4e98e3e1Schristos struct h8_opcode *p;
232*4e98e3e1Schristos {
233*4e98e3e1Schristos printf ("SET_CCR(GET_CCR() & srca);\n");
234*4e98e3e1Schristos }
235*4e98e3e1Schristos
236*4e98e3e1Schristos static void
addx(p)237*4e98e3e1Schristos addx (p)
238*4e98e3e1Schristos struct h8_opcode *p;
239*4e98e3e1Schristos {
240*4e98e3e1Schristos printf ("dst = srca + srcb+ (c != 0);\n");
241*4e98e3e1Schristos }
242*4e98e3e1Schristos
243*4e98e3e1Schristos static void
subx(p)244*4e98e3e1Schristos subx (p)
245*4e98e3e1Schristos struct h8_opcode *p;
246*4e98e3e1Schristos {
247*4e98e3e1Schristos printf ("dst = srcb - srca - (c != 0);\n");
248*4e98e3e1Schristos }
249*4e98e3e1Schristos
250*4e98e3e1Schristos static void
add(p,s,sz)251*4e98e3e1Schristos add (p, s, sz)
252*4e98e3e1Schristos struct h8_opcode *p;
253*4e98e3e1Schristos char *s;
254*4e98e3e1Schristos int sz;
255*4e98e3e1Schristos {
256*4e98e3e1Schristos printf ("%s;\n", s);
257*4e98e3e1Schristos }
258*4e98e3e1Schristos
259*4e98e3e1Schristos static void
adds(p,s)260*4e98e3e1Schristos adds (p, s)
261*4e98e3e1Schristos struct h8_opcode *p;
262*4e98e3e1Schristos char *s;
263*4e98e3e1Schristos {
264*4e98e3e1Schristos printf ("%s;\n", s);
265*4e98e3e1Schristos }
266*4e98e3e1Schristos
267*4e98e3e1Schristos static void
bra(p,a)268*4e98e3e1Schristos bra (p, a)
269*4e98e3e1Schristos struct h8_opcode *p;
270*4e98e3e1Schristos char *a;
271*4e98e3e1Schristos {
272*4e98e3e1Schristos printf ("if (%s) npc += ((char )b1)>>1;\n", a);
273*4e98e3e1Schristos }
274*4e98e3e1Schristos
275*4e98e3e1Schristos static void
bsr(p,a)276*4e98e3e1Schristos bsr (p, a)
277*4e98e3e1Schristos struct h8_opcode *p;
278*4e98e3e1Schristos char *a;
279*4e98e3e1Schristos {
280*4e98e3e1Schristos printf ("reg[7]-=2;\n");
281*4e98e3e1Schristos printf ("tmp = reg[7];\n");
282*4e98e3e1Schristos printf ("SET_WORD_MEM(tmp, (npc-saved_state.mem)*2);\n");
283*4e98e3e1Schristos printf ("npc += ((char)b1)>>1;\n");
284*4e98e3e1Schristos }
285*4e98e3e1Schristos
286*4e98e3e1Schristos static void
cmp(p,a,s)287*4e98e3e1Schristos cmp (p, a, s)
288*4e98e3e1Schristos struct h8_opcode *p;
289*4e98e3e1Schristos char *a;
290*4e98e3e1Schristos int s;
291*4e98e3e1Schristos {
292*4e98e3e1Schristos decode (p, 1, s);
293*4e98e3e1Schristos printf ("srca = -srca;\n");
294*4e98e3e1Schristos printf ("dst = srca + srcb;\n");
295*4e98e3e1Schristos }
296*4e98e3e1Schristos
297*4e98e3e1Schristos static
298*4e98e3e1Schristos void
jsr(p,a,s)299*4e98e3e1Schristos jsr (p, a, s)
300*4e98e3e1Schristos struct h8_opcode *p;
301*4e98e3e1Schristos char *a;
302*4e98e3e1Schristos int s;
303*4e98e3e1Schristos {
304*4e98e3e1Schristos printf ("if (b1 == 0xc4) {\n");
305*4e98e3e1Schristos printf ("printf(\"%%c\", reg[2]);\n");
306*4e98e3e1Schristos printf ("}\n");
307*4e98e3e1Schristos printf ("else {\n");
308*4e98e3e1Schristos printf ("reg[7]-=2;\n");
309*4e98e3e1Schristos printf ("tmp = reg[7];\n");
310*4e98e3e1Schristos printf ("SET_WORD_MEM(tmp, (npc-saved_state.mem)*2);\n");
311*4e98e3e1Schristos printf ("npc = (lval>>1) + saved_state.mem;\n");
312*4e98e3e1Schristos printf ("}");
313*4e98e3e1Schristos }
314*4e98e3e1Schristos
315*4e98e3e1Schristos static void
jmp(p,a,s)316*4e98e3e1Schristos jmp (p, a, s)
317*4e98e3e1Schristos struct h8_opcode *p;
318*4e98e3e1Schristos char *a;
319*4e98e3e1Schristos int s;
320*4e98e3e1Schristos {
321*4e98e3e1Schristos printf ("npc = (lval>>1) + saved_state.mem;\n");
322*4e98e3e1Schristos }
323*4e98e3e1Schristos
324*4e98e3e1Schristos static void
rts(p,a,s)325*4e98e3e1Schristos rts (p, a, s)
326*4e98e3e1Schristos struct h8_opcode *p;
327*4e98e3e1Schristos char *a;
328*4e98e3e1Schristos int s;
329*4e98e3e1Schristos {
330*4e98e3e1Schristos printf ("tmp = reg[7];\n");
331*4e98e3e1Schristos printf ("reg[7]+=2;\n");
332*4e98e3e1Schristos printf ("npc = saved_state.mem + (WORD_MEM(tmp)>>1);\n");
333*4e98e3e1Schristos }
334*4e98e3e1Schristos
335*4e98e3e1Schristos static void
rte(p,a,s)336*4e98e3e1Schristos rte (p, a, s)
337*4e98e3e1Schristos struct h8_opcode *p;
338*4e98e3e1Schristos char *a;
339*4e98e3e1Schristos int s;
340*4e98e3e1Schristos {
341*4e98e3e1Schristos printf ("reg[7]+=2;\n");
342*4e98e3e1Schristos printf ("tmp = reg[7];\n");
343*4e98e3e1Schristos printf ("reg[7]+=2;\n");
344*4e98e3e1Schristos printf ("SET_CCR(tmp);\n");
345*4e98e3e1Schristos printf ("npc = saved_state.mem + (WORD_MEM(tmp)>>1);\n");
346*4e98e3e1Schristos }
347*4e98e3e1Schristos
348*4e98e3e1Schristos static void
setf(p,a,s)349*4e98e3e1Schristos setf (p, a, s)
350*4e98e3e1Schristos struct h8_opcode *p;
351*4e98e3e1Schristos char *a;
352*4e98e3e1Schristos int s;
353*4e98e3e1Schristos {
354*4e98e3e1Schristos printf ("tmp = GET_CCR();\n");
355*4e98e3e1Schristos printf ("tmp %s= srca;\n", a);
356*4e98e3e1Schristos }
357*4e98e3e1Schristos
358*4e98e3e1Schristos static void
bpt(p,a,s)359*4e98e3e1Schristos bpt (p, a, s)
360*4e98e3e1Schristos struct h8_opcode *p;
361*4e98e3e1Schristos char *a;
362*4e98e3e1Schristos int s;
363*4e98e3e1Schristos {
364*4e98e3e1Schristos printf ("saved_state.exception = SIGTRAP;\n");
365*4e98e3e1Schristos printf ("npc = pc;\n");
366*4e98e3e1Schristos }
367*4e98e3e1Schristos
368*4e98e3e1Schristos static void
log(p,a,s)369*4e98e3e1Schristos log (p, a, s)
370*4e98e3e1Schristos struct h8_opcode *p;
371*4e98e3e1Schristos char *a;
372*4e98e3e1Schristos int s;
373*4e98e3e1Schristos {
374*4e98e3e1Schristos printf ("dst = srcb %s srca;\n", a);
375*4e98e3e1Schristos }
376*4e98e3e1Schristos
377*4e98e3e1Schristos static void
ulog(p,a,s)378*4e98e3e1Schristos ulog (p, a, s)
379*4e98e3e1Schristos struct h8_opcode *p;
380*4e98e3e1Schristos char *a;
381*4e98e3e1Schristos int s;
382*4e98e3e1Schristos {
383*4e98e3e1Schristos printf ("dst = %s srcb ;\n", a);
384*4e98e3e1Schristos }
385*4e98e3e1Schristos
386*4e98e3e1Schristos static void
nop()387*4e98e3e1Schristos nop ()
388*4e98e3e1Schristos {
389*4e98e3e1Schristos }
390*4e98e3e1Schristos
391*4e98e3e1Schristos static void
rotl()392*4e98e3e1Schristos rotl ()
393*4e98e3e1Schristos {
394*4e98e3e1Schristos printf ("c = srcb & 0x80;\n");
395*4e98e3e1Schristos printf ("dst = srcb << 1;\n");
396*4e98e3e1Schristos printf ("if (c) dst|=1;\n");
397*4e98e3e1Schristos }
398*4e98e3e1Schristos
399*4e98e3e1Schristos static void
rotr()400*4e98e3e1Schristos rotr ()
401*4e98e3e1Schristos {
402*4e98e3e1Schristos printf ("c = srcb & 1;\n");
403*4e98e3e1Schristos printf ("dst = srcb >> 1;\n");
404*4e98e3e1Schristos printf ("if (c) dst|=0x80;\n");
405*4e98e3e1Schristos }
406*4e98e3e1Schristos
407*4e98e3e1Schristos static void
rotxl()408*4e98e3e1Schristos rotxl ()
409*4e98e3e1Schristos {
410*4e98e3e1Schristos printf ("tmp = srcb & 0x80;\n");
411*4e98e3e1Schristos printf ("dst = srcb << 1;\n");
412*4e98e3e1Schristos printf ("if (c) dst|=1;\n");
413*4e98e3e1Schristos printf ("c = tmp;\n");
414*4e98e3e1Schristos }
415*4e98e3e1Schristos
416*4e98e3e1Schristos static void
rotxr()417*4e98e3e1Schristos rotxr ()
418*4e98e3e1Schristos {
419*4e98e3e1Schristos printf ("tmp = srcb & 1;\n");
420*4e98e3e1Schristos printf ("dst = srcb >> 1;\n");
421*4e98e3e1Schristos printf ("if (c) dst|=0x80;\n");
422*4e98e3e1Schristos printf ("c = tmp;\n");
423*4e98e3e1Schristos }
424*4e98e3e1Schristos
425*4e98e3e1Schristos static void
shal()426*4e98e3e1Schristos shal ()
427*4e98e3e1Schristos {
428*4e98e3e1Schristos printf ("c = srcb&0x80;\n");
429*4e98e3e1Schristos printf ("dst = srcb << 1;\n");
430*4e98e3e1Schristos }
431*4e98e3e1Schristos
432*4e98e3e1Schristos static
433*4e98e3e1Schristos void
shar()434*4e98e3e1Schristos shar ()
435*4e98e3e1Schristos {
436*4e98e3e1Schristos printf ("c = srcb&0x1;\n");
437*4e98e3e1Schristos printf ("if (srcb&0x80) dst = (srcb>>1) | 0x80;\n");
438*4e98e3e1Schristos printf ("else dst = (srcb>>1) &~ 0x80;\n");
439*4e98e3e1Schristos }
440*4e98e3e1Schristos
441*4e98e3e1Schristos static
442*4e98e3e1Schristos void
shll()443*4e98e3e1Schristos shll ()
444*4e98e3e1Schristos {
445*4e98e3e1Schristos printf ("c = srcb&0x80;\n");
446*4e98e3e1Schristos printf ("dst = srcb << 1;\n");
447*4e98e3e1Schristos }
448*4e98e3e1Schristos
449*4e98e3e1Schristos static
450*4e98e3e1Schristos void
shlr()451*4e98e3e1Schristos shlr ()
452*4e98e3e1Schristos {
453*4e98e3e1Schristos printf ("c = srcb&0x1;\n");
454*4e98e3e1Schristos printf ("dst = (srcb>>1) &~ 0x80;\n");
455*4e98e3e1Schristos }
456*4e98e3e1Schristos
457*4e98e3e1Schristos static
458*4e98e3e1Schristos void
divxu()459*4e98e3e1Schristos divxu ()
460*4e98e3e1Schristos {
461*4e98e3e1Schristos printf ("srca = %s;\n", breg[2]);
462*4e98e3e1Schristos printf ("srcb = %s;\n", wreg[3]);
463*4e98e3e1Schristos printf ("n = srca & 0x80;\n");
464*4e98e3e1Schristos printf ("z = !srca;\n");
465*4e98e3e1Schristos printf ("if (srca) dst = srcb / srca;tmp = srcb %% srca;\n");
466*4e98e3e1Schristos printf ("%s = (dst & 0xff) | (tmp << 8);\n", wreg[3]);
467*4e98e3e1Schristos }
468*4e98e3e1Schristos
469*4e98e3e1Schristos static
470*4e98e3e1Schristos void
mulxu()471*4e98e3e1Schristos mulxu ()
472*4e98e3e1Schristos {
473*4e98e3e1Schristos printf ("srca = %s;\n", breg[2]);
474*4e98e3e1Schristos printf ("srcb = %s;\n", wreg[3]);
475*4e98e3e1Schristos
476*4e98e3e1Schristos printf ("dst = (srcb&0xff) * srca;\n");
477*4e98e3e1Schristos printf ("%s = dst;\n", wreg[3]);
478*4e98e3e1Schristos }
479*4e98e3e1Schristos
480*4e98e3e1Schristos static
481*4e98e3e1Schristos void
inc()482*4e98e3e1Schristos inc ()
483*4e98e3e1Schristos {
484*4e98e3e1Schristos printf ("dst = %s;\n", breg[3]);
485*4e98e3e1Schristos printf ("v = (dst==0x7f);\n");
486*4e98e3e1Schristos printf ("dst++;\n");
487*4e98e3e1Schristos printf ("%s= dst;\n", breg[3]);
488*4e98e3e1Schristos }
489*4e98e3e1Schristos
490*4e98e3e1Schristos static
491*4e98e3e1Schristos void
bit(p,a,s)492*4e98e3e1Schristos bit (p, a, s)
493*4e98e3e1Schristos struct h8_opcode *p;
494*4e98e3e1Schristos char *a;
495*4e98e3e1Schristos int s;
496*4e98e3e1Schristos {
497*4e98e3e1Schristos printf ("%s\n", a);
498*4e98e3e1Schristos }
499*4e98e3e1Schristos
500*4e98e3e1Schristos static
501*4e98e3e1Schristos void
dec()502*4e98e3e1Schristos dec ()
503*4e98e3e1Schristos {
504*4e98e3e1Schristos printf ("dst = %s;\n", breg[3]);
505*4e98e3e1Schristos printf ("v = (dst==0x80);\n");
506*4e98e3e1Schristos printf ("dst--;\n");
507*4e98e3e1Schristos printf ("%s = dst;\n", breg[3]);
508*4e98e3e1Schristos }
509*4e98e3e1Schristos
510*4e98e3e1Schristos char saf[] = "goto setflags;";
511*4e98e3e1Schristos char sf[] = "goto shiftflags;";
512*4e98e3e1Schristos char af8[] = "goto aluflags8;";
513*4e98e3e1Schristos char af16[] = "goto aluflags16;";
514*4e98e3e1Schristos char lf[] = "goto logflags;";
515*4e98e3e1Schristos char icf[] = "goto incflags;";
516*4e98e3e1Schristos char mf8[] = "goto movflags8;";
517*4e98e3e1Schristos char mf16[] = "goto movflags16;";
518*4e98e3e1Schristos char nx[] = "goto next;";
519*4e98e3e1Schristos
520*4e98e3e1Schristos struct
521*4e98e3e1Schristos {
522*4e98e3e1Schristos char *ftype;
523*4e98e3e1Schristos int decode;
524*4e98e3e1Schristos char *name;
525*4e98e3e1Schristos void (*func) ();
526*4e98e3e1Schristos char *arg;
527*4e98e3e1Schristos int size;
528*4e98e3e1Schristos
529*4e98e3e1Schristos }
530*4e98e3e1Schristos
531*4e98e3e1Schristos table[] =
532*4e98e3e1Schristos {
533*4e98e3e1Schristos {
534*4e98e3e1Schristos nx, 1, "bld", bit, "dst = srcb; c = (srcb>>srca)&1;", 8
535*4e98e3e1Schristos }
536*4e98e3e1Schristos ,
537*4e98e3e1Schristos {
538*4e98e3e1Schristos nx, 1, "bild", bit, "dst = srcb; c = !((srcb>>srca)&1);", 8
539*4e98e3e1Schristos }
540*4e98e3e1Schristos ,
541*4e98e3e1Schristos {
542*4e98e3e1Schristos nx, 1, "band", bit, "dst = srcb; c = C &&((srcb>>srca)&1);", 8
543*4e98e3e1Schristos }
544*4e98e3e1Schristos ,
545*4e98e3e1Schristos {
546*4e98e3e1Schristos nx, 1, "biand", bit, "dst = srcb; c = C &&(!((srcb>>srca)&1));", 8
547*4e98e3e1Schristos }
548*4e98e3e1Schristos ,
549*4e98e3e1Schristos {
550*4e98e3e1Schristos nx, 1, "bior", bit, "dst = srcb; c = C ||(!((srcb>>srca)&1));", 8
551*4e98e3e1Schristos }
552*4e98e3e1Schristos ,
553*4e98e3e1Schristos {
554*4e98e3e1Schristos nx, 1, "bor", bit, "dst = srcb; c = C ||(((srcb>>srca)&1));", 8
555*4e98e3e1Schristos }
556*4e98e3e1Schristos ,
557*4e98e3e1Schristos {
558*4e98e3e1Schristos nx, 1, "bixor", bit, "dst = srcb; c = C ^(!((srcb>>srca)&1));", 8
559*4e98e3e1Schristos }
560*4e98e3e1Schristos ,
561*4e98e3e1Schristos {
562*4e98e3e1Schristos nx, 1, "bxor", bit, "dst = srcb; c = C ^(((srcb>>srca)&1));", 8
563*4e98e3e1Schristos }
564*4e98e3e1Schristos ,
565*4e98e3e1Schristos {
566*4e98e3e1Schristos nx, 1, "bnot", bit, "dst = srcb ^ (1<<srca);", 8
567*4e98e3e1Schristos }
568*4e98e3e1Schristos ,
569*4e98e3e1Schristos {
570*4e98e3e1Schristos nx, 1, "bclr", bit, "dst = srcb & ~(1<<srca);", 8
571*4e98e3e1Schristos }
572*4e98e3e1Schristos ,
573*4e98e3e1Schristos {
574*4e98e3e1Schristos nx, 1, "bset", bit, "dst = srcb | (1<<srca);", 8
575*4e98e3e1Schristos }
576*4e98e3e1Schristos ,
577*4e98e3e1Schristos {
578*4e98e3e1Schristos nx, 1, "bst", bit, "dst = (srcb & ~(1<<srca))| ((C)<<srca);", 8
579*4e98e3e1Schristos }
580*4e98e3e1Schristos ,
581*4e98e3e1Schristos {
582*4e98e3e1Schristos nx, 1, "bist", bit, "dst = (srcb & ~(1<<srca))| ((!C)<<srca);", 8
583*4e98e3e1Schristos }
584*4e98e3e1Schristos ,
585*4e98e3e1Schristos {
586*4e98e3e1Schristos nx, 1, "btst", bit, "dst = srcb; z = !((srcb>>srca)&1);", 8
587*4e98e3e1Schristos }
588*4e98e3e1Schristos ,
589*4e98e3e1Schristos {
590*4e98e3e1Schristos icf, 0, "dec", dec, 0, 0
591*4e98e3e1Schristos }
592*4e98e3e1Schristos ,
593*4e98e3e1Schristos {
594*4e98e3e1Schristos icf, 0, "inc", inc, 0, 0
595*4e98e3e1Schristos }
596*4e98e3e1Schristos ,
597*4e98e3e1Schristos {
598*4e98e3e1Schristos saf, 1, "orc", setf, "|", 0
599*4e98e3e1Schristos }
600*4e98e3e1Schristos ,
601*4e98e3e1Schristos {
602*4e98e3e1Schristos saf, 1, "xorc", setf, "^", 0
603*4e98e3e1Schristos }
604*4e98e3e1Schristos ,
605*4e98e3e1Schristos {
606*4e98e3e1Schristos saf, 1, "andc", setf, "&", 0
607*4e98e3e1Schristos }
608*4e98e3e1Schristos ,
609*4e98e3e1Schristos {
610*4e98e3e1Schristos nx, 1, "nop", nop, 0, 0
611*4e98e3e1Schristos }
612*4e98e3e1Schristos ,
613*4e98e3e1Schristos {
614*4e98e3e1Schristos nx, 1, "bra", bra, "1", 0
615*4e98e3e1Schristos }
616*4e98e3e1Schristos ,
617*4e98e3e1Schristos {
618*4e98e3e1Schristos nx, 1, "brn", bra, "0", 0
619*4e98e3e1Schristos }
620*4e98e3e1Schristos ,
621*4e98e3e1Schristos {
622*4e98e3e1Schristos nx, 1, "bhi", bra, "(C||Z)==0", 0
623*4e98e3e1Schristos }
624*4e98e3e1Schristos ,
625*4e98e3e1Schristos {
626*4e98e3e1Schristos nx, 1, "bls", bra, "(C||Z)==1", 0
627*4e98e3e1Schristos }
628*4e98e3e1Schristos ,
629*4e98e3e1Schristos {
630*4e98e3e1Schristos nx, 1, "bcs", bra, "C==1", 0
631*4e98e3e1Schristos }
632*4e98e3e1Schristos ,
633*4e98e3e1Schristos {
634*4e98e3e1Schristos nx, 1, "bcc", bra, "C==0", 0
635*4e98e3e1Schristos }
636*4e98e3e1Schristos ,
637*4e98e3e1Schristos {
638*4e98e3e1Schristos nx, 1, "bpl", bra, "N==0", 0
639*4e98e3e1Schristos }
640*4e98e3e1Schristos ,
641*4e98e3e1Schristos {
642*4e98e3e1Schristos nx, 1, "bmi", bra, "N==1", 0
643*4e98e3e1Schristos }
644*4e98e3e1Schristos ,
645*4e98e3e1Schristos {
646*4e98e3e1Schristos nx, 1, "bvs", bra, "V==1", 0
647*4e98e3e1Schristos }
648*4e98e3e1Schristos ,
649*4e98e3e1Schristos {
650*4e98e3e1Schristos nx, 1, "bvc", bra, "V==0", 0
651*4e98e3e1Schristos }
652*4e98e3e1Schristos ,
653*4e98e3e1Schristos {
654*4e98e3e1Schristos nx, 1, "bge", bra, "(N^V)==0", 0
655*4e98e3e1Schristos }
656*4e98e3e1Schristos ,
657*4e98e3e1Schristos {
658*4e98e3e1Schristos nx, 1, "bgt", bra, "(Z|(N^V))==0", 0
659*4e98e3e1Schristos }
660*4e98e3e1Schristos ,
661*4e98e3e1Schristos {
662*4e98e3e1Schristos nx, 1, "blt", bra, "(N^V)==1", 0
663*4e98e3e1Schristos }
664*4e98e3e1Schristos ,
665*4e98e3e1Schristos {
666*4e98e3e1Schristos nx, 1, "ble", bra, "(Z|(N^V))==1", 0
667*4e98e3e1Schristos }
668*4e98e3e1Schristos ,
669*4e98e3e1Schristos {
670*4e98e3e1Schristos nx, 1, "beq", bra, "Z==1", 0
671*4e98e3e1Schristos }
672*4e98e3e1Schristos ,
673*4e98e3e1Schristos {
674*4e98e3e1Schristos nx, 1, "bne", bra, "Z==0", 0
675*4e98e3e1Schristos }
676*4e98e3e1Schristos ,
677*4e98e3e1Schristos {
678*4e98e3e1Schristos nx, 1, "bsr", bsr, "", 0
679*4e98e3e1Schristos }
680*4e98e3e1Schristos ,
681*4e98e3e1Schristos {
682*4e98e3e1Schristos nx, 1, "jsr", jsr, 0, 0
683*4e98e3e1Schristos }
684*4e98e3e1Schristos ,
685*4e98e3e1Schristos {
686*4e98e3e1Schristos nx, 1, "jmp", jmp, 0, 0
687*4e98e3e1Schristos }
688*4e98e3e1Schristos ,
689*4e98e3e1Schristos {
690*4e98e3e1Schristos nx, 0, "rts", rts, 0, 0
691*4e98e3e1Schristos }
692*4e98e3e1Schristos ,
693*4e98e3e1Schristos {
694*4e98e3e1Schristos nx, 0, "rte", rte, 0, 0
695*4e98e3e1Schristos }
696*4e98e3e1Schristos ,
697*4e98e3e1Schristos {
698*4e98e3e1Schristos nx, 1, "andc", andc, 0, 0
699*4e98e3e1Schristos }
700*4e98e3e1Schristos ,
701*4e98e3e1Schristos {
702*4e98e3e1Schristos sf, 1, "shal", shal, 0, 0
703*4e98e3e1Schristos }
704*4e98e3e1Schristos ,
705*4e98e3e1Schristos {
706*4e98e3e1Schristos sf, 1, "shar", shar, 0, 0
707*4e98e3e1Schristos }
708*4e98e3e1Schristos ,
709*4e98e3e1Schristos {
710*4e98e3e1Schristos sf, 1, "shll", shll, 0, 0
711*4e98e3e1Schristos }
712*4e98e3e1Schristos ,
713*4e98e3e1Schristos {
714*4e98e3e1Schristos sf, 1, "shlr", shlr, 0, 0
715*4e98e3e1Schristos }
716*4e98e3e1Schristos ,
717*4e98e3e1Schristos {
718*4e98e3e1Schristos sf, 1, "rotxl", rotxl, 0, 0
719*4e98e3e1Schristos }
720*4e98e3e1Schristos ,
721*4e98e3e1Schristos {
722*4e98e3e1Schristos sf, 1, "rotxr", rotxr, 0, 0
723*4e98e3e1Schristos }
724*4e98e3e1Schristos ,
725*4e98e3e1Schristos {
726*4e98e3e1Schristos sf, 1, "rotl", rotl, 0, 0
727*4e98e3e1Schristos }
728*4e98e3e1Schristos ,
729*4e98e3e1Schristos {
730*4e98e3e1Schristos sf, 1, "rotr", rotr, 0, 0
731*4e98e3e1Schristos }
732*4e98e3e1Schristos ,
733*4e98e3e1Schristos {
734*4e98e3e1Schristos lf, 1, "xor", log, "^", 0
735*4e98e3e1Schristos }
736*4e98e3e1Schristos ,
737*4e98e3e1Schristos {
738*4e98e3e1Schristos lf, 1, "and", log, "&", 0
739*4e98e3e1Schristos }
740*4e98e3e1Schristos ,
741*4e98e3e1Schristos {
742*4e98e3e1Schristos lf, 1, "or", log, "|", 0
743*4e98e3e1Schristos }
744*4e98e3e1Schristos ,
745*4e98e3e1Schristos {
746*4e98e3e1Schristos lf, 1, "not", ulog, " ~", 0
747*4e98e3e1Schristos }
748*4e98e3e1Schristos ,
749*4e98e3e1Schristos {
750*4e98e3e1Schristos lf, 1, "neg", ulog, " - ", 0
751*4e98e3e1Schristos }
752*4e98e3e1Schristos ,
753*4e98e3e1Schristos {
754*4e98e3e1Schristos nx, 1, "adds", adds, "dst = srca + srcb", 0
755*4e98e3e1Schristos }
756*4e98e3e1Schristos ,
757*4e98e3e1Schristos {
758*4e98e3e1Schristos nx, 1, "subs", adds, "srca = -srca; dst = srcb + srca", 0
759*4e98e3e1Schristos }
760*4e98e3e1Schristos ,
761*4e98e3e1Schristos {
762*4e98e3e1Schristos af8, 1, "add.b", add, "dst = srca + srcb", 8
763*4e98e3e1Schristos }
764*4e98e3e1Schristos ,
765*4e98e3e1Schristos {
766*4e98e3e1Schristos af16, 1, "add.w", add, "dst = srca + srcb", 16
767*4e98e3e1Schristos }
768*4e98e3e1Schristos ,
769*4e98e3e1Schristos {
770*4e98e3e1Schristos af16, 1, "sub.w", add, "srca = -srca; dst = srcb + srca", 16
771*4e98e3e1Schristos }
772*4e98e3e1Schristos ,
773*4e98e3e1Schristos {
774*4e98e3e1Schristos af8, 1, "sub.b", add, "srca = -srca; dst = srcb + srca", 8
775*4e98e3e1Schristos }
776*4e98e3e1Schristos ,
777*4e98e3e1Schristos {
778*4e98e3e1Schristos af8, 1, "addx", addx, 0, 8
779*4e98e3e1Schristos }
780*4e98e3e1Schristos ,
781*4e98e3e1Schristos {
782*4e98e3e1Schristos af8, 1, "subx", subx, 0, 8
783*4e98e3e1Schristos }
784*4e98e3e1Schristos ,
785*4e98e3e1Schristos {
786*4e98e3e1Schristos af8, 0, "cmp.b", cmp, 0, 8
787*4e98e3e1Schristos }
788*4e98e3e1Schristos ,
789*4e98e3e1Schristos {
790*4e98e3e1Schristos af16, 0, "cmp.w", cmp, 0, 16
791*4e98e3e1Schristos }
792*4e98e3e1Schristos ,
793*4e98e3e1Schristos {
794*4e98e3e1Schristos nx, 1, "sleep", esleep, 0, 0
795*4e98e3e1Schristos }
796*4e98e3e1Schristos ,
797*4e98e3e1Schristos {
798*4e98e3e1Schristos nx, 0, "bpt", bpt, 0, 8
799*4e98e3e1Schristos }
800*4e98e3e1Schristos ,
801*4e98e3e1Schristos {
802*4e98e3e1Schristos nx, 0, "divxu", divxu, 0, 0
803*4e98e3e1Schristos }
804*4e98e3e1Schristos ,
805*4e98e3e1Schristos {
806*4e98e3e1Schristos nx, 0, "mulxu", mulxu, 0, 0
807*4e98e3e1Schristos }
808*4e98e3e1Schristos ,
809*4e98e3e1Schristos {
810*4e98e3e1Schristos mf8, 1, "mov.b", mov, 0, 8
811*4e98e3e1Schristos }
812*4e98e3e1Schristos ,
813*4e98e3e1Schristos {
814*4e98e3e1Schristos mf8, 1, "movtpe", mov, 0, 8
815*4e98e3e1Schristos }
816*4e98e3e1Schristos ,
817*4e98e3e1Schristos {
818*4e98e3e1Schristos mf8, 1, "movfpe", mov, 0, 8
819*4e98e3e1Schristos }
820*4e98e3e1Schristos ,
821*4e98e3e1Schristos {
822*4e98e3e1Schristos mf16, 1, "mov.w", mov, 0, 16
823*4e98e3e1Schristos }
824*4e98e3e1Schristos ,
825*4e98e3e1Schristos {
826*4e98e3e1Schristos 0
827*4e98e3e1Schristos }
828*4e98e3e1Schristos };
829*4e98e3e1Schristos
830*4e98e3e1Schristos static
831*4e98e3e1Schristos void
edo(p)832*4e98e3e1Schristos edo (p)
833*4e98e3e1Schristos struct h8_opcode *p;
834*4e98e3e1Schristos {
835*4e98e3e1Schristos int i;
836*4e98e3e1Schristos
837*4e98e3e1Schristos printf ("%s %s %s\n", cs, p->name, ce);
838*4e98e3e1Schristos
839*4e98e3e1Schristos for (i = 0; table[i].name; i++)
840*4e98e3e1Schristos {
841*4e98e3e1Schristos if (strcmp (table[i].name, p->name) == 0)
842*4e98e3e1Schristos {
843*4e98e3e1Schristos printf ("{\n");
844*4e98e3e1Schristos if (table[i].decode)
845*4e98e3e1Schristos decode (p, 1, table[i].size);
846*4e98e3e1Schristos printf ("cycles += %d;\n", p->time);
847*4e98e3e1Schristos printf ("npc = pc + %d;\n", p->length / 2);
848*4e98e3e1Schristos table[i].func (p, table[i].arg, table[i].size);
849*4e98e3e1Schristos if (table[i].decode)
850*4e98e3e1Schristos decode (p, 0, table[i].size);
851*4e98e3e1Schristos if (table[i].ftype)
852*4e98e3e1Schristos printf (table[i].ftype);
853*4e98e3e1Schristos else
854*4e98e3e1Schristos printf ("goto next;\n");
855*4e98e3e1Schristos printf ("}\n");
856*4e98e3e1Schristos return;
857*4e98e3e1Schristos }
858*4e98e3e1Schristos }
859*4e98e3e1Schristos printf ("%s not found %s\n", cs, ce);
860*4e98e3e1Schristos printf ("saved_state.exception = SIGILL;\n");
861*4e98e3e1Schristos printf ("break;\n");
862*4e98e3e1Schristos }
863*4e98e3e1Schristos
864*4e98e3e1Schristos static
865*4e98e3e1Schristos int
owrite(i)866*4e98e3e1Schristos owrite (i)
867*4e98e3e1Schristos int i;
868*4e98e3e1Schristos {
869*4e98e3e1Schristos /* write if statements to select the right opcode */
870*4e98e3e1Schristos struct h8_opcode **p;
871*4e98e3e1Schristos int needand = 1;
872*4e98e3e1Schristos
873*4e98e3e1Schristos p = h8_opcodes_sorted[i];
874*4e98e3e1Schristos printf ("case 0x%03x:\n", i);
875*4e98e3e1Schristos
876*4e98e3e1Schristos if (p[1] == 0)
877*4e98e3e1Schristos {
878*4e98e3e1Schristos /* See if the next few also match */
879*4e98e3e1Schristos while (h8_opcodes_sorted[i + 1][0] == *p)
880*4e98e3e1Schristos {
881*4e98e3e1Schristos i++;
882*4e98e3e1Schristos printf ("case 0x%03x:\n", i);
883*4e98e3e1Schristos }
884*4e98e3e1Schristos
885*4e98e3e1Schristos /* Don't need any if's this is the only one */
886*4e98e3e1Schristos edo (*p);
887*4e98e3e1Schristos }
888*4e98e3e1Schristos else
889*4e98e3e1Schristos {
890*4e98e3e1Schristos while (*p)
891*4e98e3e1Schristos {
892*4e98e3e1Schristos /* start two nibbles in since we know we match in the first byte */
893*4e98e3e1Schristos int c;
894*4e98e3e1Schristos int nib = 2;
895*4e98e3e1Schristos int byte = 1;
896*4e98e3e1Schristos int mask1[5];
897*4e98e3e1Schristos int mask0[5];
898*4e98e3e1Schristos int nibshift = 4;
899*4e98e3e1Schristos int any = 0;
900*4e98e3e1Schristos
901*4e98e3e1Schristos for (c = 0; c < 5; c++)
902*4e98e3e1Schristos {
903*4e98e3e1Schristos mask1[c] = 0;
904*4e98e3e1Schristos mask0[c] = 0;
905*4e98e3e1Schristos }
906*4e98e3e1Schristos printf ("%s %x%x", cs, (*p)->data.nib[0], (*p)->data.nib[1]);
907*4e98e3e1Schristos while ((c = (*p)->data.nib[nib]) != E)
908*4e98e3e1Schristos {
909*4e98e3e1Schristos if (c & B30)
910*4e98e3e1Schristos {
911*4e98e3e1Schristos /* bit 3 must be zero */
912*4e98e3e1Schristos mask0[byte] |= 0x8 << nibshift;
913*4e98e3e1Schristos printf ("0");
914*4e98e3e1Schristos any = 1;
915*4e98e3e1Schristos }
916*4e98e3e1Schristos else if (c & B31)
917*4e98e3e1Schristos {
918*4e98e3e1Schristos /* bit 3 must be one */
919*4e98e3e1Schristos mask1[byte] |= 0x8 << nibshift;
920*4e98e3e1Schristos printf ("8");
921*4e98e3e1Schristos any = 1;
922*4e98e3e1Schristos }
923*4e98e3e1Schristos else if (c <= HexF)
924*4e98e3e1Schristos {
925*4e98e3e1Schristos mask0[byte] |= ((~c) & 0xf) << nibshift;
926*4e98e3e1Schristos mask1[byte] |= (c & 0xf) << nibshift;
927*4e98e3e1Schristos printf ("%x", c);
928*4e98e3e1Schristos any = 1;
929*4e98e3e1Schristos }
930*4e98e3e1Schristos else
931*4e98e3e1Schristos {
932*4e98e3e1Schristos printf ("x");
933*4e98e3e1Schristos }
934*4e98e3e1Schristos nib++;
935*4e98e3e1Schristos if (nibshift == 4)
936*4e98e3e1Schristos {
937*4e98e3e1Schristos nibshift = 0;
938*4e98e3e1Schristos }
939*4e98e3e1Schristos else
940*4e98e3e1Schristos {
941*4e98e3e1Schristos byte++;
942*4e98e3e1Schristos nibshift = 4;
943*4e98e3e1Schristos }
944*4e98e3e1Schristos }
945*4e98e3e1Schristos printf ("*/\n");
946*4e98e3e1Schristos if (any)
947*4e98e3e1Schristos {
948*4e98e3e1Schristos printf ("if (");
949*4e98e3e1Schristos needand = 0;
950*4e98e3e1Schristos for (c = 1; c < byte; c++)
951*4e98e3e1Schristos {
952*4e98e3e1Schristos if (mask0[c] | mask1[c])
953*4e98e3e1Schristos {
954*4e98e3e1Schristos int sh;
955*4e98e3e1Schristos
956*4e98e3e1Schristos if (needand)
957*4e98e3e1Schristos printf ("\n&&");
958*4e98e3e1Schristos if (c & 1)
959*4e98e3e1Schristos sh = 0;
960*4e98e3e1Schristos else
961*4e98e3e1Schristos sh = 8;
962*4e98e3e1Schristos if (c / 2 == 0 && sh == 0)
963*4e98e3e1Schristos printf ("((b1&0x%x)==0x%x)", mask0[c] | mask1[c],
964*4e98e3e1Schristos mask1[c]);
965*4e98e3e1Schristos else
966*4e98e3e1Schristos {
967*4e98e3e1Schristos printf ("((pc[%d]&(0x%02x<<%d))==(0x%x<<%d))",
968*4e98e3e1Schristos c / 2, mask0[c] | mask1[c], sh,
969*4e98e3e1Schristos mask1[c], sh);
970*4e98e3e1Schristos }
971*4e98e3e1Schristos
972*4e98e3e1Schristos needand = 1;
973*4e98e3e1Schristos }
974*4e98e3e1Schristos }
975*4e98e3e1Schristos printf (")\n");
976*4e98e3e1Schristos }
977*4e98e3e1Schristos edo (*p);
978*4e98e3e1Schristos p++;
979*4e98e3e1Schristos
980*4e98e3e1Schristos }
981*4e98e3e1Schristos }
982*4e98e3e1Schristos return i;
983*4e98e3e1Schristos }
984*4e98e3e1Schristos
985*4e98e3e1Schristos static
986*4e98e3e1Schristos void
remove_dups()987*4e98e3e1Schristos remove_dups ()
988*4e98e3e1Schristos {
989*4e98e3e1Schristos struct h8_opcode *s;
990*4e98e3e1Schristos struct h8_opcode *d;
991*4e98e3e1Schristos
992*4e98e3e1Schristos for (d = s = h8_opcodes; s->name; s++)
993*4e98e3e1Schristos {
994*4e98e3e1Schristos int doit = 1;
995*4e98e3e1Schristos
996*4e98e3e1Schristos if (strcmp (s->name, "push") == 0)
997*4e98e3e1Schristos doit = 0;
998*4e98e3e1Schristos if (strcmp (s->name, "bhs") == 0)
999*4e98e3e1Schristos doit = 0;
1000*4e98e3e1Schristos if (strcmp (s->name, "blo") == 0)
1001*4e98e3e1Schristos doit = 0;
1002*4e98e3e1Schristos if (strcmp (s->name, "bt") == 0)
1003*4e98e3e1Schristos doit = 0;
1004*4e98e3e1Schristos if (strcmp (s->name, "bf") == 0)
1005*4e98e3e1Schristos doit = 0;
1006*4e98e3e1Schristos if (strcmp (s->name, "pop") == 0)
1007*4e98e3e1Schristos doit = 0;
1008*4e98e3e1Schristos if (doit)
1009*4e98e3e1Schristos {
1010*4e98e3e1Schristos *d++ = *s;
1011*4e98e3e1Schristos }
1012*4e98e3e1Schristos }
1013*4e98e3e1Schristos *d++ = *s++;
1014*4e98e3e1Schristos }
1015*4e98e3e1Schristos
1016*4e98e3e1Schristos int
main()1017*4e98e3e1Schristos main ()
1018*4e98e3e1Schristos {
1019*4e98e3e1Schristos int i;
1020*4e98e3e1Schristos
1021*4e98e3e1Schristos remove_dups ();
1022*4e98e3e1Schristos init ();
1023*4e98e3e1Schristos
1024*4e98e3e1Schristos printf ("%s do the operation %s\n", cs, ce);
1025*4e98e3e1Schristos printf ("switch (b0) \n{\n");
1026*4e98e3e1Schristos for (i = 0; i < PTWO; i++)
1027*4e98e3e1Schristos {
1028*4e98e3e1Schristos i = owrite (i);
1029*4e98e3e1Schristos }
1030*4e98e3e1Schristos printf ("}\n");
1031*4e98e3e1Schristos
1032*4e98e3e1Schristos return 0;
1033*4e98e3e1Schristos }
1034