xref: /plan9-contrib/sys/src/cmd/aux/realemu/dat.h (revision ccaec48a6a7d481d90233fb80c88e608b0a02604)
1*ccaec48aSDavid du Colombier typedef struct Iarg Iarg;
2*ccaec48aSDavid du Colombier typedef struct Inst Inst;
3*ccaec48aSDavid du Colombier typedef struct Bus Bus;
4*ccaec48aSDavid du Colombier typedef struct Cpu Cpu;
5*ccaec48aSDavid du Colombier typedef struct Pit Pit;
6*ccaec48aSDavid du Colombier 
7*ccaec48aSDavid du Colombier enum {
8*ccaec48aSDavid du Colombier 	RAX,
9*ccaec48aSDavid du Colombier 	RCX,
10*ccaec48aSDavid du Colombier 	RDX,
11*ccaec48aSDavid du Colombier 	RBX,
12*ccaec48aSDavid du Colombier 	RSP,
13*ccaec48aSDavid du Colombier 	RBP,
14*ccaec48aSDavid du Colombier 	RSI,
15*ccaec48aSDavid du Colombier 	RDI,
16*ccaec48aSDavid du Colombier 
17*ccaec48aSDavid du Colombier 	RES,
18*ccaec48aSDavid du Colombier 	RCS,
19*ccaec48aSDavid du Colombier 	RSS,
20*ccaec48aSDavid du Colombier 	RDS,
21*ccaec48aSDavid du Colombier 	RFS,
22*ccaec48aSDavid du Colombier 	RGS,
23*ccaec48aSDavid du Colombier 
24*ccaec48aSDavid du Colombier 	R0S,	/* 0 segment */
25*ccaec48aSDavid du Colombier 
26*ccaec48aSDavid du Colombier 	RIP,
27*ccaec48aSDavid du Colombier 	RFL,
28*ccaec48aSDavid du Colombier 
29*ccaec48aSDavid du Colombier 	NREG,
30*ccaec48aSDavid du Colombier };
31*ccaec48aSDavid du Colombier 
32*ccaec48aSDavid du Colombier struct Iarg
33*ccaec48aSDavid du Colombier {
34*ccaec48aSDavid du Colombier 	Cpu *cpu;
35*ccaec48aSDavid du Colombier 
36*ccaec48aSDavid du Colombier 	uchar tag;
37*ccaec48aSDavid du Colombier 	uchar len;
38*ccaec48aSDavid du Colombier 	uchar atype;
39*ccaec48aSDavid du Colombier 
40*ccaec48aSDavid du Colombier 	union {
41*ccaec48aSDavid du Colombier 		uchar reg;
42*ccaec48aSDavid du Colombier 		struct {
43*ccaec48aSDavid du Colombier 			uchar sreg;
44*ccaec48aSDavid du Colombier 			ulong seg, off;
45*ccaec48aSDavid du Colombier 		};
46*ccaec48aSDavid du Colombier 		ulong val;
47*ccaec48aSDavid du Colombier 	};
48*ccaec48aSDavid du Colombier };
49*ccaec48aSDavid du Colombier 
50*ccaec48aSDavid du Colombier struct Inst
51*ccaec48aSDavid du Colombier {
52*ccaec48aSDavid du Colombier 	uchar op;
53*ccaec48aSDavid du Colombier 	uchar code;
54*ccaec48aSDavid du Colombier 	uchar olen;
55*ccaec48aSDavid du Colombier 	uchar alen;
56*ccaec48aSDavid du Colombier 
57*ccaec48aSDavid du Colombier 	Iarg *a1, *a2, *a3;
58*ccaec48aSDavid du Colombier 
59*ccaec48aSDavid du Colombier 	uchar rep;
60*ccaec48aSDavid du Colombier 
61*ccaec48aSDavid du Colombier 	uchar mod;
62*ccaec48aSDavid du Colombier 	uchar reg;
63*ccaec48aSDavid du Colombier 	uchar rm;
64*ccaec48aSDavid du Colombier 
65*ccaec48aSDavid du Colombier 	uchar scale;
66*ccaec48aSDavid du Colombier 	uchar index;
67*ccaec48aSDavid du Colombier 	uchar base;
68*ccaec48aSDavid du Colombier 
69*ccaec48aSDavid du Colombier 	uchar sreg;
70*ccaec48aSDavid du Colombier 	uchar dsreg;
71*ccaec48aSDavid du Colombier 
72*ccaec48aSDavid du Colombier 	ulong off;
73*ccaec48aSDavid du Colombier 	long disp;
74*ccaec48aSDavid du Colombier };
75*ccaec48aSDavid du Colombier 
76*ccaec48aSDavid du Colombier struct Bus
77*ccaec48aSDavid du Colombier {
78*ccaec48aSDavid du Colombier 	void *aux;
79*ccaec48aSDavid du Colombier 	ulong (*r)(void *aux, ulong off, int len);
80*ccaec48aSDavid du Colombier 	void (*w)(void *aux, ulong off, ulong data, int len);
81*ccaec48aSDavid du Colombier };
82*ccaec48aSDavid du Colombier 
83*ccaec48aSDavid du Colombier struct Cpu
84*ccaec48aSDavid du Colombier {
85*ccaec48aSDavid du Colombier 	ulong reg[NREG];
86*ccaec48aSDavid du Colombier 
87*ccaec48aSDavid du Colombier 	/* instruction counter */
88*ccaec48aSDavid du Colombier 	ulong ic;
89*ccaec48aSDavid du Colombier 
90*ccaec48aSDavid du Colombier 	/* mem[16], one entry for each 64k block */
91*ccaec48aSDavid du Colombier 	Bus *mem;
92*ccaec48aSDavid du Colombier 
93*ccaec48aSDavid du Colombier 	/* port[1], in/out */
94*ccaec48aSDavid du Colombier 	Bus *port;
95*ccaec48aSDavid du Colombier 
96*ccaec48aSDavid du Colombier 	int trap;
97*ccaec48aSDavid du Colombier 	ulong oldip;
98*ccaec48aSDavid du Colombier 	jmp_buf jmp;
99*ccaec48aSDavid du Colombier 
100*ccaec48aSDavid du Colombier 	/* default operand, address and stack pointer length */
101*ccaec48aSDavid du Colombier 	uchar olen, alen, slen;
102*ccaec48aSDavid du Colombier 
103*ccaec48aSDavid du Colombier 	/* argument buffers */
104*ccaec48aSDavid du Colombier 	ulong iabuf;
105*ccaec48aSDavid du Colombier 	Iarg abuf[0x80];
106*ccaec48aSDavid du Colombier };
107*ccaec48aSDavid du Colombier 
108*ccaec48aSDavid du Colombier struct Pit
109*ccaec48aSDavid du Colombier {
110*ccaec48aSDavid du Colombier 	ulong	count;
111*ccaec48aSDavid du Colombier 
112*ccaec48aSDavid du Colombier 	/* set by setgate(), cleared by clockpit() */
113*ccaec48aSDavid du Colombier 	uchar	gateraised;
114*ccaec48aSDavid du Colombier 
115*ccaec48aSDavid du Colombier 	/* signals */
116*ccaec48aSDavid du Colombier 	uchar	gate;
117*ccaec48aSDavid du Colombier 	uchar	out;
118*ccaec48aSDavid du Colombier 
119*ccaec48aSDavid du Colombier 	/* mode and flags */
120*ccaec48aSDavid du Colombier 	uchar	count0;
121*ccaec48aSDavid du Colombier 
122*ccaec48aSDavid du Colombier 	uchar	bcd;
123*ccaec48aSDavid du Colombier 	uchar	amode;
124*ccaec48aSDavid du Colombier 	uchar	omode;
125*ccaec48aSDavid du Colombier 
126*ccaec48aSDavid du Colombier 	/* latch for wpit initial count */
127*ccaec48aSDavid du Colombier 	uchar	wcount;
128*ccaec48aSDavid du Colombier 	uchar	wlatched;
129*ccaec48aSDavid du Colombier 	uchar	wlatch[2];
130*ccaec48aSDavid du Colombier 
131*ccaec48aSDavid du Colombier 	/* latch for rpit status/count */
132*ccaec48aSDavid du Colombier 	uchar	rcount;
133*ccaec48aSDavid du Colombier 	uchar	rlatched;
134*ccaec48aSDavid du Colombier 	uchar	rlatch[2];
135*ccaec48aSDavid du Colombier };
136*ccaec48aSDavid du Colombier 
137*ccaec48aSDavid du Colombier /* processor flags */
138*ccaec48aSDavid du Colombier enum {
139*ccaec48aSDavid du Colombier 	CF = 1<<0,	/* carry flag */
140*ccaec48aSDavid du Colombier 	PF = 1<<2,	/* parity flag */
141*ccaec48aSDavid du Colombier 	AF = 1<<4,	/* aux carry flag */
142*ccaec48aSDavid du Colombier 	ZF = 1<<6,	/* zero flag */
143*ccaec48aSDavid du Colombier 	SF = 1<<7,	/* sign flag */
144*ccaec48aSDavid du Colombier 	TF = 1<<8,	/* trap flag */
145*ccaec48aSDavid du Colombier 	IF = 1<<9, 	/* interrupts enabled flag */
146*ccaec48aSDavid du Colombier 	DF = 1<<10,	/* direction flag */
147*ccaec48aSDavid du Colombier 	OF = 1<<11,	/* overflow flag */
148*ccaec48aSDavid du Colombier 	IOPL= 3<<12,	/* I/O privelege level */
149*ccaec48aSDavid du Colombier 	NT = 1<<14,	/* nested task */
150*ccaec48aSDavid du Colombier 	RF = 1<<16,	/* resume flag */
151*ccaec48aSDavid du Colombier 	VM = 1<<17,	/* virtual-8086 mode */
152*ccaec48aSDavid du Colombier 	AC = 1<<18,	/* alignment check */
153*ccaec48aSDavid du Colombier 	VIF = 1<<19,	/* virtual interrupt flag */
154*ccaec48aSDavid du Colombier 	VIP = 1<<20,	/* virtual interrupt pending */
155*ccaec48aSDavid du Colombier 	ID = 1<<21,	/* ID flag */
156*ccaec48aSDavid du Colombier };
157*ccaec48aSDavid du Colombier 
158*ccaec48aSDavid du Colombier /* interrupts/traps */
159*ccaec48aSDavid du Colombier enum {
160*ccaec48aSDavid du Colombier 	EDIV0,
161*ccaec48aSDavid du Colombier 	EDEBUG,
162*ccaec48aSDavid du Colombier 	ENMI,
163*ccaec48aSDavid du Colombier 	EBRK,
164*ccaec48aSDavid du Colombier 	EINTO,
165*ccaec48aSDavid du Colombier 	EBOUND,
166*ccaec48aSDavid du Colombier 	EBADOP,
167*ccaec48aSDavid du Colombier 	ENOFPU,
168*ccaec48aSDavid du Colombier 	EDBLF,
169*ccaec48aSDavid du Colombier 	EFPUSEG,
170*ccaec48aSDavid du Colombier 	EBADTSS,
171*ccaec48aSDavid du Colombier 	ENP,
172*ccaec48aSDavid du Colombier 	ESTACK,
173*ccaec48aSDavid du Colombier 	EGPF,
174*ccaec48aSDavid du Colombier 	EPF,
175*ccaec48aSDavid du Colombier 
176*ccaec48aSDavid du Colombier 	EHALT = 256,	/* pseudo-interrupts */
177*ccaec48aSDavid du Colombier 	EMEM,
178*ccaec48aSDavid du Colombier 	EIO,
179*ccaec48aSDavid du Colombier };
180*ccaec48aSDavid du Colombier 
181*ccaec48aSDavid du Colombier /* argument tags */
182*ccaec48aSDavid du Colombier enum {
183*ccaec48aSDavid du Colombier 	TREG,
184*ccaec48aSDavid du Colombier 	TMEM,
185*ccaec48aSDavid du Colombier 	TCON,
186*ccaec48aSDavid du Colombier 
187*ccaec48aSDavid du Colombier 	TH = 0x80,	/* special flag for AH,BH,CH,DH */
188*ccaec48aSDavid du Colombier };
189*ccaec48aSDavid du Colombier 
190*ccaec48aSDavid du Colombier /* argument types */
191*ccaec48aSDavid du Colombier enum {
192*ccaec48aSDavid du Colombier 	ANONE,	/* no argument */
193*ccaec48aSDavid du Colombier 	A0,		/* constant 0 */
194*ccaec48aSDavid du Colombier 	A1,		/* constant 1 */
195*ccaec48aSDavid du Colombier 	A2,		/* constant 2 */
196*ccaec48aSDavid du Colombier 	A3,		/* constant 3 */
197*ccaec48aSDavid du Colombier 	A4,		/* constant 4 */
198*ccaec48aSDavid du Colombier 	AAp,	/* 32-bit or 48-bit direct address */
199*ccaec48aSDavid du Colombier 	AEb,	/* r/m8 from modrm byte */
200*ccaec48aSDavid du Colombier 	AEv,	/* r/m16 or r/m32 from modrm byte */
201*ccaec48aSDavid du Colombier 	AEw,	/* r/m16 */
202*ccaec48aSDavid du Colombier 	AFv,	/* flag word */
203*ccaec48aSDavid du Colombier 	AGb,	/* r8 from modrm byte */
204*ccaec48aSDavid du Colombier 	AGv,	/* r16 or r32 from modrm byte */
205*ccaec48aSDavid du Colombier 	AGw, /* r/m16 */
206*ccaec48aSDavid du Colombier 	AIb,	/* immediate byte */
207*ccaec48aSDavid du Colombier 	AIc,	/* immediate byte sign-extended */
208*ccaec48aSDavid du Colombier 	AIw,	/* immediate 16-bit word */
209*ccaec48aSDavid du Colombier 	AIv,	/* immediate 16-bit or 32-bit word */
210*ccaec48aSDavid du Colombier 	AJb,	/* relative offset byte */
211*ccaec48aSDavid du Colombier 	AJv,	/* relative offset 16-bit or 32-bit word */
212*ccaec48aSDavid du Colombier 	AJr,	/* r/m16 or r/m32 register */
213*ccaec48aSDavid du Colombier 	AM,		/* memory address from modrm */
214*ccaec48aSDavid du Colombier 	AMa,	/* something for bound */
215*ccaec48aSDavid du Colombier 	AMa2,
216*ccaec48aSDavid du Colombier 	AMp,	/* 32-bit or 48-bit memory address */
217*ccaec48aSDavid du Colombier 	AOb,	/* immediate word-sized offset to a byte */
218*ccaec48aSDavid du Colombier 	AOv,	/* immediate word-size offset to a word */
219*ccaec48aSDavid du Colombier 	ASw,	/* segment register selected by r field of modrm */
220*ccaec48aSDavid du Colombier 	AXb,	/* byte at DS:SI */
221*ccaec48aSDavid du Colombier 	AXv,	/* word at DS:SI */
222*ccaec48aSDavid du Colombier 	AYb,	/* byte at ES:DI */
223*ccaec48aSDavid du Colombier 	AYv,	/* word at ES:DI */
224*ccaec48aSDavid du Colombier 
225*ccaec48aSDavid du Colombier 	AAL,
226*ccaec48aSDavid du Colombier 	ACL,
227*ccaec48aSDavid du Colombier 	ADL,
228*ccaec48aSDavid du Colombier 	ABL,
229*ccaec48aSDavid du Colombier 	AAH,
230*ccaec48aSDavid du Colombier 	ACH,
231*ccaec48aSDavid du Colombier 	ADH,
232*ccaec48aSDavid du Colombier 	ABH,
233*ccaec48aSDavid du Colombier 
234*ccaec48aSDavid du Colombier 	AAX,
235*ccaec48aSDavid du Colombier 	ACX,
236*ccaec48aSDavid du Colombier 	ADX,
237*ccaec48aSDavid du Colombier 	ABX,
238*ccaec48aSDavid du Colombier 	ASP,
239*ccaec48aSDavid du Colombier 	ABP,
240*ccaec48aSDavid du Colombier 	ASI,
241*ccaec48aSDavid du Colombier 	ADI,
242*ccaec48aSDavid du Colombier 
243*ccaec48aSDavid du Colombier 	AES,
244*ccaec48aSDavid du Colombier 	ACS,
245*ccaec48aSDavid du Colombier 	ASS,
246*ccaec48aSDavid du Colombier 	ADS,
247*ccaec48aSDavid du Colombier 	AFS,
248*ccaec48aSDavid du Colombier 	AGS,
249*ccaec48aSDavid du Colombier 
250*ccaec48aSDavid du Colombier 	NATYPE,
251*ccaec48aSDavid du Colombier };
252*ccaec48aSDavid du Colombier 
253*ccaec48aSDavid du Colombier /* operators */
254*ccaec48aSDavid du Colombier enum {
255*ccaec48aSDavid du Colombier 	OBAD,
256*ccaec48aSDavid du Colombier 	O0F,
257*ccaec48aSDavid du Colombier 	OAAA,
258*ccaec48aSDavid du Colombier 	OAAD,
259*ccaec48aSDavid du Colombier 	OAAM,
260*ccaec48aSDavid du Colombier 	OAAS,
261*ccaec48aSDavid du Colombier 	OADC,
262*ccaec48aSDavid du Colombier 	OADD,
263*ccaec48aSDavid du Colombier 	OAND,
264*ccaec48aSDavid du Colombier 	OARPL,
265*ccaec48aSDavid du Colombier 	OASIZE,
266*ccaec48aSDavid du Colombier 	OBOUND,
267*ccaec48aSDavid du Colombier 	OBT,
268*ccaec48aSDavid du Colombier 	OBTS,
269*ccaec48aSDavid du Colombier 	OBTR,
270*ccaec48aSDavid du Colombier 	OBTC,
271*ccaec48aSDavid du Colombier 	OBSF,
272*ccaec48aSDavid du Colombier 	OBSR,
273*ccaec48aSDavid du Colombier 	OCALL,
274*ccaec48aSDavid du Colombier 	OCBW,
275*ccaec48aSDavid du Colombier 	OCLC,
276*ccaec48aSDavid du Colombier 	OCLD,
277*ccaec48aSDavid du Colombier 	OCLI,
278*ccaec48aSDavid du Colombier 	OCMC,
279*ccaec48aSDavid du Colombier 	OCMOV,
280*ccaec48aSDavid du Colombier 	OCMP,
281*ccaec48aSDavid du Colombier 	OCMPS,
282*ccaec48aSDavid du Colombier 	OCPUID,
283*ccaec48aSDavid du Colombier 	OCWD,
284*ccaec48aSDavid du Colombier 	ODAA,
285*ccaec48aSDavid du Colombier 	ODAS,
286*ccaec48aSDavid du Colombier 	ODEC,
287*ccaec48aSDavid du Colombier 	ODIV,
288*ccaec48aSDavid du Colombier 	OENTER,
289*ccaec48aSDavid du Colombier 	OGP1,
290*ccaec48aSDavid du Colombier 	OGP2,
291*ccaec48aSDavid du Colombier 	OGP3b,
292*ccaec48aSDavid du Colombier 	OGP3v,
293*ccaec48aSDavid du Colombier 	OGP4,
294*ccaec48aSDavid du Colombier 	OGP5,
295*ccaec48aSDavid du Colombier 	OGP8,
296*ccaec48aSDavid du Colombier 	OGP10,
297*ccaec48aSDavid du Colombier 	OGP12,
298*ccaec48aSDavid du Colombier 	OHLT,
299*ccaec48aSDavid du Colombier 	OIDIV,
300*ccaec48aSDavid du Colombier 	OIMUL,
301*ccaec48aSDavid du Colombier 	OIN,
302*ccaec48aSDavid du Colombier 	OINC,
303*ccaec48aSDavid du Colombier 	OINS,
304*ccaec48aSDavid du Colombier 	OINT,
305*ccaec48aSDavid du Colombier 	OIRET,
306*ccaec48aSDavid du Colombier 	OJUMP,
307*ccaec48aSDavid du Colombier 	OLAHF,
308*ccaec48aSDavid du Colombier 	OLEA,
309*ccaec48aSDavid du Colombier 	OLEAVE,
310*ccaec48aSDavid du Colombier 	OLFP,
311*ccaec48aSDavid du Colombier 	OLOCK,
312*ccaec48aSDavid du Colombier 	OLODS,
313*ccaec48aSDavid du Colombier 	OLOOP,
314*ccaec48aSDavid du Colombier 	OLOOPNZ,
315*ccaec48aSDavid du Colombier 	OLOOPZ,
316*ccaec48aSDavid du Colombier 	OMOV,
317*ccaec48aSDavid du Colombier 	OMOVS,
318*ccaec48aSDavid du Colombier 	OMOVZX,
319*ccaec48aSDavid du Colombier 	OMOVSX,
320*ccaec48aSDavid du Colombier 	OMUL,
321*ccaec48aSDavid du Colombier 	ONEG,
322*ccaec48aSDavid du Colombier 	ONOP,
323*ccaec48aSDavid du Colombier 	ONOT,
324*ccaec48aSDavid du Colombier 	OOR,
325*ccaec48aSDavid du Colombier 	OOSIZE,
326*ccaec48aSDavid du Colombier 	OOUT,
327*ccaec48aSDavid du Colombier 	OOUTS,
328*ccaec48aSDavid du Colombier 	OPOP,
329*ccaec48aSDavid du Colombier 	OPOPA,
330*ccaec48aSDavid du Colombier 	OPOPF,
331*ccaec48aSDavid du Colombier 	OPUSH,
332*ccaec48aSDavid du Colombier 	OPUSHA,
333*ccaec48aSDavid du Colombier 	OPUSHF,
334*ccaec48aSDavid du Colombier 	ORCL,
335*ccaec48aSDavid du Colombier 	ORCR,
336*ccaec48aSDavid du Colombier 	OREPE,
337*ccaec48aSDavid du Colombier 	OREPNE,
338*ccaec48aSDavid du Colombier 	ORET,
339*ccaec48aSDavid du Colombier 	ORETF,
340*ccaec48aSDavid du Colombier 	OROL,
341*ccaec48aSDavid du Colombier 	OROR,
342*ccaec48aSDavid du Colombier 	OSAHF,
343*ccaec48aSDavid du Colombier 	OSAR,
344*ccaec48aSDavid du Colombier 	OSBB,
345*ccaec48aSDavid du Colombier 	OSCAS,
346*ccaec48aSDavid du Colombier 	OSEG,
347*ccaec48aSDavid du Colombier 	OSET,
348*ccaec48aSDavid du Colombier 	OSHL,
349*ccaec48aSDavid du Colombier 	OSHLD,
350*ccaec48aSDavid du Colombier 	OSHR,
351*ccaec48aSDavid du Colombier 	OSHRD,
352*ccaec48aSDavid du Colombier 	OSTC,
353*ccaec48aSDavid du Colombier 	OSTD,
354*ccaec48aSDavid du Colombier 	OSTI,
355*ccaec48aSDavid du Colombier 	OSTOS,
356*ccaec48aSDavid du Colombier 	OSUB,
357*ccaec48aSDavid du Colombier 	OTEST,
358*ccaec48aSDavid du Colombier 	OWAIT,
359*ccaec48aSDavid du Colombier 	OXCHG,
360*ccaec48aSDavid du Colombier 	OXLAT,
361*ccaec48aSDavid du Colombier 	OXOR,
362*ccaec48aSDavid du Colombier 	NUMOP,
363*ccaec48aSDavid du Colombier };
364