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