added 80286 instructions
This commit is contained in:
parent
5625842582
commit
b40425786c
4 changed files with 114 additions and 7 deletions
|
@ -31,6 +31,12 @@
|
|||
%token <y_word> TEST
|
||||
%token <y_word> MOV
|
||||
|
||||
/* Intel 80268 tokens */
|
||||
%token <y_word> IMUL
|
||||
%token <y_word> ENTER
|
||||
%token <y_word> EXTOP
|
||||
%token <y_word> EXTOP1
|
||||
|
||||
/* Intel 8087 coprocessor tokens */
|
||||
%token <y_word> FNOOP
|
||||
%token <y_word> FMEM
|
||||
|
|
|
@ -52,14 +52,19 @@
|
|||
0, NOOP_1, 0237, "lahf",
|
||||
0, NOOP_1, 0244, "movsb",
|
||||
0, NOOP_1, 0245, "movs",
|
||||
0, NOOP_1, 0245, "movsw",
|
||||
0, NOOP_1, 0246, "cmpsb",
|
||||
0, NOOP_1, 0247, "cmps",
|
||||
0, NOOP_1, 0247, "cmpsw",
|
||||
0, NOOP_1, 0252, "stosb",
|
||||
0, NOOP_1, 0253, "stos",
|
||||
0, NOOP_1, 0253, "stosw",
|
||||
0, NOOP_1, 0254, "lodsb",
|
||||
0, NOOP_1, 0255, "lods",
|
||||
0, NOOP_1, 0255, "lodsw",
|
||||
0, NOOP_1, 0256, "scasb",
|
||||
0, NOOP_1, 0257, "scas",
|
||||
0, NOOP_1, 0257, "scasw",
|
||||
0, NOOP_1, 0316, "into",
|
||||
0, NOOP_1, 0317, "iret",
|
||||
0, NOOP_1, 0327, "xlat",
|
||||
|
@ -111,8 +116,10 @@
|
|||
0, PUSHOP, 1, "pop",
|
||||
0, IOOP, 0344, "inb",
|
||||
0, IOOP, 0345, "in",
|
||||
0, IOOP, 0345, "inw",
|
||||
0, IOOP, 0346, "outb",
|
||||
0, IOOP, 0347, "out",
|
||||
0, IOOP, 0347, "outw",
|
||||
0, ADDOP, 000, "addb",
|
||||
0, ADDOP, 001, "add",
|
||||
0, ADDOP, 010, "orb",
|
||||
|
@ -156,7 +163,7 @@
|
|||
0, NOTOP, 040, "mulb",
|
||||
0, NOTOP, 041, "mul",
|
||||
0, NOTOP, 050, "imulb",
|
||||
0, NOTOP, 051, "imul",
|
||||
0, IMUL, 051, "imul", /* for 80286 */
|
||||
0, NOTOP, 060, "divb",
|
||||
0, NOTOP, 061, "div",
|
||||
0, NOTOP, 070, "idivb",
|
||||
|
@ -178,6 +185,7 @@
|
|||
0, TEST, 1, "test",
|
||||
0, MOV, 0, "movb",
|
||||
0, MOV, 1, "mov",
|
||||
0, MOV, 1, "movw",
|
||||
|
||||
/* Intel 8087 coprocessor keywords */
|
||||
|
||||
|
@ -207,7 +215,7 @@
|
|||
0, FNOOP, FESC+1+(0xFC<<8), "frndint",
|
||||
0, FNOOP, FESC+1+(0xFD<<8), "fscale",
|
||||
0, FNOOP, FESC+1+(0xFA<<8), "fsqrt",
|
||||
/* 0, FNOOP, FESC+7+(0xE0<<8), "fstswax", /* 80287 */
|
||||
0, FNOOP, FESC+7+(0xE0<<8), "fstswax", /* 80287 */
|
||||
0, FNOOP, FESC+1+(0xE4<<8), "ftst",
|
||||
0, FNOOP, FESC+1+(0xE5<<8), "fxam",
|
||||
0, FNOOP, FESC+1+(0xF4<<8), "fxtract",
|
||||
|
@ -292,3 +300,35 @@
|
|||
0, FST_ST2, FESC+2+(0xE0<<8), "fsubp",
|
||||
0, FST_ST2, FESC+0+(0xE8<<8), "fsubr",
|
||||
0, FST_ST2, FESC+2+(0xE8<<8), "fsubrp",
|
||||
|
||||
/* 80286 keywords */
|
||||
0, NOOP_1, 0140, "pusha",
|
||||
0, NOOP_1, 0141, "popa",
|
||||
0, NOOP_1, 0156, "outsb",
|
||||
0, NOOP_1, 0157, "outs",
|
||||
0, NOOP_1, 0157, "outsw",
|
||||
0, NOOP_1, 0246, "insb",
|
||||
0, NOOP_1, 0247, "ins",
|
||||
0, NOOP_1, 0247, "insw",
|
||||
|
||||
0, ENTER, 0310, "enter",
|
||||
0, NOOP_1, 0311, "leave",
|
||||
0, LEAOP, 0142, "bound",
|
||||
|
||||
0, NOOP_2, 017+06<<8, "clts",
|
||||
|
||||
0, EXTOP, 0002, "lar",
|
||||
0, EXTOP, 0003, "lsl",
|
||||
|
||||
0, EXTOP1, 0021, "lgdt",
|
||||
0, EXTOP1, 0001, "sgdt",
|
||||
0, EXTOP1, 0031, "lidt",
|
||||
0, EXTOP1, 0011, "sidt",
|
||||
0, EXTOP1, 0020, "lldt",
|
||||
0, EXTOP1, 0000, "sldt",
|
||||
0, EXTOP1, 0030, "ltr",
|
||||
0, EXTOP1, 0010, "str",
|
||||
0, EXTOP1, 0061, "lmsw",
|
||||
0, EXTOP1, 0041, "smsw",
|
||||
0, EXTOP1, 0050, "verw",
|
||||
0, EXTOP1, 0040, "verr",
|
||||
|
|
|
@ -38,6 +38,10 @@ oper : NOOP_1
|
|||
{ rolop($1);}
|
||||
| INCOP ea_1
|
||||
{ incop($1);}
|
||||
| IMUL ea_ea
|
||||
{ imul($1);}
|
||||
| IMUL ea_1
|
||||
{ regsize($1); emit1(0366|($1&1)); ea_1($1&070);}
|
||||
| NOTOP ea_1
|
||||
{ regsize($1); emit1(0366|($1&1)); ea_1($1&070);}
|
||||
| CALLOP ea_1
|
||||
|
@ -55,8 +59,20 @@ oper : NOOP_1
|
|||
}
|
||||
| CALFOP mem
|
||||
{ emit1(0377); ea_2($1&0xFF);}
|
||||
| ENTER absexp ',' absexp
|
||||
{ fit(fitw($2)); fit(fitb($4));
|
||||
emit1($1); emit2((int)$2); emit1((int)$4);
|
||||
}
|
||||
| LEAOP R16 ',' mem
|
||||
{ emit1($1); ea_2($2<<3);}
|
||||
| EXTOP R16 ',' ea_2
|
||||
{ emit1(0xF); emit1($1);
|
||||
ea_2($2<<3);
|
||||
}
|
||||
| EXTOP1 ea_1
|
||||
{ regsize(1); emit1(0xF); emit1($1&07);
|
||||
ea_1($1&070);
|
||||
}
|
||||
| ESC absexp ',' mem
|
||||
{ fit(fit6($2));
|
||||
emit1(0330 | $2>>3);
|
||||
|
|
|
@ -10,8 +10,9 @@
|
|||
|
||||
ea_1(param) {
|
||||
|
||||
if ((mrg_1 & 070) || (param & ~070))
|
||||
if ((mrg_1 & 070) || (param & ~070)) {
|
||||
serror("bad operand");
|
||||
}
|
||||
emit1(mrg_1 | param);
|
||||
switch(mrg_1 >> 6) {
|
||||
case 0:
|
||||
|
@ -129,7 +130,21 @@ pushop(opc) register opc; {
|
|||
} else if (mrg_1 >= 0300) {
|
||||
emit1(0120 | opc<<3 | (mrg_1&7));
|
||||
} else if (opc == 0) {
|
||||
if (mrg_1 & 040) { /* 070 ??? */
|
||||
if (small(exp_1.typ == S_ABS && fitb(exp_1.val),1)) {
|
||||
emit1(0152);
|
||||
emit1((int) exp_1.val);
|
||||
} else {
|
||||
emit1(0150);
|
||||
RELOMOVE(relonami, rel_1);
|
||||
#ifdef RELOCATION
|
||||
newrelo(exp_1.typ, RELO2);
|
||||
emit2((int) exp_1.val);
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
emit1(0377); ea_1(6<<3);
|
||||
}
|
||||
} else {
|
||||
emit1(0217); ea_1(0<<3);
|
||||
}
|
||||
|
@ -177,8 +192,14 @@ rolop(opc) register opc; {
|
|||
regsize(opc);
|
||||
if (cmrg == 0301) {
|
||||
emit1(0322 | (opc&1)); ea_1(opc&070);
|
||||
} else if ((cmrg & 040) && exp_2.val == 1) {
|
||||
} else if (cmrg & 040) {
|
||||
if (exp_2.val == 1) {
|
||||
emit1(0320 | (opc&1)); ea_1(opc&070);
|
||||
} else {
|
||||
fit(fitb(exp_2.val));
|
||||
emit1(0300|(opc&1)); ea_1(opc&070);
|
||||
emit1((int)exp_2.val);
|
||||
}
|
||||
} else
|
||||
badsyntax();
|
||||
}
|
||||
|
@ -295,6 +316,30 @@ mov(opc) register opc; {
|
|||
emit1(0210 | opc); ea_1((mrg_2&7)<<3);
|
||||
} else if (mrg_1 >= 0300) {
|
||||
emit1(0212 | opc); ea_2((mrg_1&7)<<3);
|
||||
} else
|
||||
} else {
|
||||
badsyntax();
|
||||
}
|
||||
}
|
||||
|
||||
imul(opc)
|
||||
int opc;
|
||||
{
|
||||
regsize(opc);
|
||||
if (exp_2.typ != S_ABS || ((mrg_2 & 040) == 0)) {
|
||||
serror("bad operand");
|
||||
} else {
|
||||
if (small(exp_2.typ == S_ABS && fitb(exp_2.val),1)) {
|
||||
emit1(0153);
|
||||
ea_1((mrg_2&7)<<3);
|
||||
emit1((int)exp_2.val);
|
||||
} else {
|
||||
emit1(0151);
|
||||
ea_1((mrg_2&7)<<3);
|
||||
RELOMOVE(relonami, rel_2);
|
||||
#ifdef RELOCATION
|
||||
newrelo(exp_2.typ, RELO2);
|
||||
emit2((int) exp_2.val);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue