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