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