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> TEST
|
||||||
%token <y_word> MOV
|
%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 */
|
/* Intel 8087 coprocessor tokens */
|
||||||
%token <y_word> FNOOP
|
%token <y_word> FNOOP
|
||||||
%token <y_word> FMEM
|
%token <y_word> FMEM
|
||||||
|
|
|
@ -52,14 +52,19 @@
|
||||||
0, NOOP_1, 0237, "lahf",
|
0, NOOP_1, 0237, "lahf",
|
||||||
0, NOOP_1, 0244, "movsb",
|
0, NOOP_1, 0244, "movsb",
|
||||||
0, NOOP_1, 0245, "movs",
|
0, NOOP_1, 0245, "movs",
|
||||||
|
0, NOOP_1, 0245, "movsw",
|
||||||
0, NOOP_1, 0246, "cmpsb",
|
0, NOOP_1, 0246, "cmpsb",
|
||||||
0, NOOP_1, 0247, "cmps",
|
0, NOOP_1, 0247, "cmps",
|
||||||
|
0, NOOP_1, 0247, "cmpsw",
|
||||||
0, NOOP_1, 0252, "stosb",
|
0, NOOP_1, 0252, "stosb",
|
||||||
0, NOOP_1, 0253, "stos",
|
0, NOOP_1, 0253, "stos",
|
||||||
|
0, NOOP_1, 0253, "stosw",
|
||||||
0, NOOP_1, 0254, "lodsb",
|
0, NOOP_1, 0254, "lodsb",
|
||||||
0, NOOP_1, 0255, "lods",
|
0, NOOP_1, 0255, "lods",
|
||||||
|
0, NOOP_1, 0255, "lodsw",
|
||||||
0, NOOP_1, 0256, "scasb",
|
0, NOOP_1, 0256, "scasb",
|
||||||
0, NOOP_1, 0257, "scas",
|
0, NOOP_1, 0257, "scas",
|
||||||
|
0, NOOP_1, 0257, "scasw",
|
||||||
0, NOOP_1, 0316, "into",
|
0, NOOP_1, 0316, "into",
|
||||||
0, NOOP_1, 0317, "iret",
|
0, NOOP_1, 0317, "iret",
|
||||||
0, NOOP_1, 0327, "xlat",
|
0, NOOP_1, 0327, "xlat",
|
||||||
|
@ -111,8 +116,10 @@
|
||||||
0, PUSHOP, 1, "pop",
|
0, PUSHOP, 1, "pop",
|
||||||
0, IOOP, 0344, "inb",
|
0, IOOP, 0344, "inb",
|
||||||
0, IOOP, 0345, "in",
|
0, IOOP, 0345, "in",
|
||||||
|
0, IOOP, 0345, "inw",
|
||||||
0, IOOP, 0346, "outb",
|
0, IOOP, 0346, "outb",
|
||||||
0, IOOP, 0347, "out",
|
0, IOOP, 0347, "out",
|
||||||
|
0, IOOP, 0347, "outw",
|
||||||
0, ADDOP, 000, "addb",
|
0, ADDOP, 000, "addb",
|
||||||
0, ADDOP, 001, "add",
|
0, ADDOP, 001, "add",
|
||||||
0, ADDOP, 010, "orb",
|
0, ADDOP, 010, "orb",
|
||||||
|
@ -156,7 +163,7 @@
|
||||||
0, NOTOP, 040, "mulb",
|
0, NOTOP, 040, "mulb",
|
||||||
0, NOTOP, 041, "mul",
|
0, NOTOP, 041, "mul",
|
||||||
0, NOTOP, 050, "imulb",
|
0, NOTOP, 050, "imulb",
|
||||||
0, NOTOP, 051, "imul",
|
0, IMUL, 051, "imul", /* for 80286 */
|
||||||
0, NOTOP, 060, "divb",
|
0, NOTOP, 060, "divb",
|
||||||
0, NOTOP, 061, "div",
|
0, NOTOP, 061, "div",
|
||||||
0, NOTOP, 070, "idivb",
|
0, NOTOP, 070, "idivb",
|
||||||
|
@ -178,6 +185,7 @@
|
||||||
0, TEST, 1, "test",
|
0, TEST, 1, "test",
|
||||||
0, MOV, 0, "movb",
|
0, MOV, 0, "movb",
|
||||||
0, MOV, 1, "mov",
|
0, MOV, 1, "mov",
|
||||||
|
0, MOV, 1, "movw",
|
||||||
|
|
||||||
/* Intel 8087 coprocessor keywords */
|
/* Intel 8087 coprocessor keywords */
|
||||||
|
|
||||||
|
@ -207,7 +215,7 @@
|
||||||
0, FNOOP, FESC+1+(0xFC<<8), "frndint",
|
0, FNOOP, FESC+1+(0xFC<<8), "frndint",
|
||||||
0, FNOOP, FESC+1+(0xFD<<8), "fscale",
|
0, FNOOP, FESC+1+(0xFD<<8), "fscale",
|
||||||
0, FNOOP, FESC+1+(0xFA<<8), "fsqrt",
|
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+(0xE4<<8), "ftst",
|
||||||
0, FNOOP, FESC+1+(0xE5<<8), "fxam",
|
0, FNOOP, FESC+1+(0xE5<<8), "fxam",
|
||||||
0, FNOOP, FESC+1+(0xF4<<8), "fxtract",
|
0, FNOOP, FESC+1+(0xF4<<8), "fxtract",
|
||||||
|
@ -292,3 +300,35 @@
|
||||||
0, FST_ST2, FESC+2+(0xE0<<8), "fsubp",
|
0, FST_ST2, FESC+2+(0xE0<<8), "fsubp",
|
||||||
0, FST_ST2, FESC+0+(0xE8<<8), "fsubr",
|
0, FST_ST2, FESC+0+(0xE8<<8), "fsubr",
|
||||||
0, FST_ST2, FESC+2+(0xE8<<8), "fsubrp",
|
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);}
|
{ rolop($1);}
|
||||||
| INCOP ea_1
|
| INCOP ea_1
|
||||||
{ incop($1);}
|
{ incop($1);}
|
||||||
|
| IMUL ea_ea
|
||||||
|
{ imul($1);}
|
||||||
|
| IMUL ea_1
|
||||||
|
{ regsize($1); emit1(0366|($1&1)); ea_1($1&070);}
|
||||||
| NOTOP ea_1
|
| NOTOP ea_1
|
||||||
{ regsize($1); emit1(0366|($1&1)); ea_1($1&070);}
|
{ regsize($1); emit1(0366|($1&1)); ea_1($1&070);}
|
||||||
| CALLOP ea_1
|
| CALLOP ea_1
|
||||||
|
@ -55,8 +59,20 @@ oper : NOOP_1
|
||||||
}
|
}
|
||||||
| CALFOP mem
|
| CALFOP mem
|
||||||
{ emit1(0377); ea_2($1&0xFF);}
|
{ 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
|
| LEAOP R16 ',' mem
|
||||||
{ emit1($1); ea_2($2<<3);}
|
{ 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
|
| ESC absexp ',' mem
|
||||||
{ fit(fit6($2));
|
{ fit(fit6($2));
|
||||||
emit1(0330 | $2>>3);
|
emit1(0330 | $2>>3);
|
||||||
|
|
|
@ -10,8 +10,9 @@
|
||||||
|
|
||||||
ea_1(param) {
|
ea_1(param) {
|
||||||
|
|
||||||
if ((mrg_1 & 070) || (param & ~070))
|
if ((mrg_1 & 070) || (param & ~070)) {
|
||||||
serror("bad operand");
|
serror("bad operand");
|
||||||
|
}
|
||||||
emit1(mrg_1 | param);
|
emit1(mrg_1 | param);
|
||||||
switch(mrg_1 >> 6) {
|
switch(mrg_1 >> 6) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -129,7 +130,21 @@ pushop(opc) register opc; {
|
||||||
} else if (mrg_1 >= 0300) {
|
} else if (mrg_1 >= 0300) {
|
||||||
emit1(0120 | opc<<3 | (mrg_1&7));
|
emit1(0120 | opc<<3 | (mrg_1&7));
|
||||||
} else if (opc == 0) {
|
} else if (opc == 0) {
|
||||||
emit1(0377); ea_1(6<<3);
|
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 {
|
} else {
|
||||||
emit1(0217); ea_1(0<<3);
|
emit1(0217); ea_1(0<<3);
|
||||||
}
|
}
|
||||||
|
@ -177,8 +192,14 @@ rolop(opc) register opc; {
|
||||||
regsize(opc);
|
regsize(opc);
|
||||||
if (cmrg == 0301) {
|
if (cmrg == 0301) {
|
||||||
emit1(0322 | (opc&1)); ea_1(opc&070);
|
emit1(0322 | (opc&1)); ea_1(opc&070);
|
||||||
} else if ((cmrg & 040) && exp_2.val == 1) {
|
} else if (cmrg & 040) {
|
||||||
emit1(0320 | (opc&1)); ea_1(opc&070);
|
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
|
} else
|
||||||
badsyntax();
|
badsyntax();
|
||||||
}
|
}
|
||||||
|
@ -295,6 +316,30 @@ mov(opc) register opc; {
|
||||||
emit1(0210 | opc); ea_1((mrg_2&7)<<3);
|
emit1(0210 | opc); ea_1((mrg_2&7)<<3);
|
||||||
} else if (mrg_1 >= 0300) {
|
} else if (mrg_1 >= 0300) {
|
||||||
emit1(0212 | opc); ea_2((mrg_1&7)<<3);
|
emit1(0212 | opc); ea_2((mrg_1&7)<<3);
|
||||||
} else
|
} else {
|
||||||
badsyntax();
|
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