xref: /netbsd-src/external/gpl3/gdb/dist/sim/h8300/writecode.c (revision 4e98e3e176b5b8ca424663e164635936964c902b)
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