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