Created
July 11, 2015 08:25
-
-
Save luser-dr00g/e907e5beb79fb1edafda to your computer and use it in GitHub Desktop.
Indented version of https://gist.github.com/luser-dr00g/aef0342cb4a63d682c13
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
typedef intptr_t I; | |
typedef uintptr_t U; | |
typedef short S; | |
typedef unsigned short US; | |
typedef signed char C; | |
typedef unsigned char UC; | |
typedef void V; | |
U o, w, d, f; | |
U x, y, z; | |
void *p; | |
UC halt, debug = 0, trace = 2, reg[28], null[2], mem[0xffff] = { | |
1, (3 << 6), | |
1, (3 << 6) + (4 << 3), | |
3, (3 << 6) + (4 << 3), | |
0xf4 | |
}; | |
UC *al; | |
UC *ah; | |
UC *cl; | |
UC *ch; | |
UC *dl; | |
UC *dh; | |
UC *bl; | |
UC *bh; | |
US *ax; | |
US *cx; | |
US *dx; | |
US *bx; | |
US *sp; | |
US *bp; | |
US *si; | |
US *di; | |
US *ip; | |
US *fl; | |
US *cs; | |
US *ds; | |
US *ss; | |
US *es; | |
V | |
init () | |
{ | |
I i = 0; | |
al = (UC *) (reg + i++); | |
ah = (UC *) (reg + i++); | |
cl = (UC *) (reg + i++); | |
ch = (UC *) (reg + i++); | |
dl = (UC *) (reg + i++); | |
dh = (UC *) (reg + i++); | |
bl = (UC *) (reg + i++); | |
bh = (UC *) (reg + i++); | |
i = 0; | |
ax = (US *) (reg + i); | |
i += 2; | |
cx = (US *) (reg + i); | |
i += 2; | |
dx = (US *) (reg + i); | |
i += 2; | |
bx = (US *) (reg + i); | |
i += 2; | |
sp = (US *) (reg + i); | |
i += 2; | |
bp = (US *) (reg + i); | |
i += 2; | |
si = (US *) (reg + i); | |
i += 2; | |
di = (US *) (reg + i); | |
i += 2; | |
ip = (US *) (reg + i); | |
i += 2; | |
fl = (US *) (reg + i); | |
i += 2; | |
cs = (US *) (reg + i); | |
i += 2; | |
ds = (US *) (reg + i); | |
i += 2; | |
ss = (US *) (reg + i); | |
i += 2; | |
es = (US *) (reg + i); | |
i += 2; | |
} | |
enum | |
{ CF = 1, AF = 1 << 4, ZF = 1 << 6, SF = 1 << 7, OF = 1 << 11 }; | |
V | |
dump () | |
{ | |
printf ("\n"); | |
printf ("ax" ":%04x ", *ax); | |
printf ("cx" ":%04x ", *cx); | |
printf ("dx" ":%04x ", *dx); | |
printf ("bx" ":%04x ", *bx); | |
printf ("sp" ":%04x ", *sp); | |
printf ("bp" ":%04x ", *bp); | |
printf ("si" ":%04x ", *si); | |
printf ("di" ":%04x ", *di); | |
printf ("ip" ":%04x ", *ip); | |
printf ("fl" ":%04x ", *fl); | |
if (trace) | |
printf ("%s %s %s %s ", *fl & CF ? "CA" : "NC", *fl & OF ? "OV" : "NO", | |
*fl & SF ? "SN" : "NS", *fl & ZF ? "ZR" : "NZ"); | |
printf ("\n"); | |
} | |
I | |
get_ (void *p, U w) | |
{ | |
return w ? *(UC *) p + (((UC *) p)[1] << 8) : *(UC *) p; | |
} | |
V | |
put_ (void *p, U x, U w) | |
{ | |
if (w) | |
{ | |
*(UC *) p = x; | |
((UC *) p)[1] = x >> 8; | |
} | |
else | |
*(UC *) p = x; | |
} | |
UC | |
fetchb () | |
{ | |
U x = get_ (mem + (*ip)++, 0); | |
if (trace) | |
printf ("%02x(%03o) ", x, x); | |
return x; | |
} | |
US | |
fetchw () | |
{ | |
I w = fetchb (); | |
return w | (fetchb () << 8); | |
} | |
typedef struct rm | |
{ | |
U mod, reg, r_m; | |
} rm; | |
rm | |
mrm (U m) | |
{ | |
return (rm) | |
{ | |
(m >> 6) & 3, (m >> 3) & 7, m & 7}; | |
} | |
U | |
decreg (U reg, U w) | |
{ | |
if (w) | |
return (U) ((US *[]) | |
{ | |
ax, cx, dx, bx, sp, bp, si, di} | |
[reg]); | |
else | |
return (U) ((UC *[]) | |
{ | |
al, cl, dl, bl, ah, ch, dh, bh} | |
[reg]); | |
} | |
U | |
decrm (rm r, U w) | |
{ | |
U x = (U[]){ *bx + *si, *bx + *di, *bp + *si, *bp + *di, *si, *di, *bp, *bx } | |
[r.r_m]; | |
switch (r.mod) | |
{ | |
case 0: | |
if (r.r_m == 6) | |
return (U) (mem + fetchw ()); | |
break; | |
case 1: | |
x += fetchb (); | |
break; | |
case 2: | |
x += fetchw (); | |
break; | |
case 3: | |
return decreg (r.r_m, w); | |
} | |
return (U) (mem + x); | |
} | |
void | |
addbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
addwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
addbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
addwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
addbi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
addwi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
pushes () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(es), 1); | |
} | |
void | |
popes () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(es) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
orbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
orwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
orbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
orwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
orbi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
orwi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
pushcs () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(cs), 1); | |
} | |
void | |
nop0 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
adcbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
adcwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
adcbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
adcwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
adcbi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
adcwi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
pushss () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(ss), 1); | |
} | |
void | |
popss () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(ss) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
sbbbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
sbbwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
sbbbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
sbbwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
sbbbi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
sbbwi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
pushds () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(ds), 1); | |
} | |
void | |
popds () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(ds) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
andbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
andwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
andbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
andwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
andbi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
andwi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
esseg () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
daa () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
subbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
subwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
subbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
subwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
subbi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
subwi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
csseg () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
das () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
xorbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
xorwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
xorbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
xorwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
xorbi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
xorwi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
ssseg () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
aaa () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
cmpbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
cmpwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
cmpbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
cmpwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
cmpbi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
cmpwi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
dsseg () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
aas () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
incax () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) ax; | |
x = (S) * ax; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
inccx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) cx; | |
x = (S) * cx; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
incdx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) dx; | |
x = (S) * dx; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
incbx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) bx; | |
x = (S) * bx; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
incsp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) sp; | |
x = (S) * sp; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
incbp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) bp; | |
x = (S) * bp; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
incsi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) si; | |
x = (S) * si; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
incdi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) di; | |
x = (S) * di; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
decax () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) ax; | |
x = (S) * ax; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
deccx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) cx; | |
x = (S) * cx; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
decdx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) dx; | |
x = (S) * dx; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
decbx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) bx; | |
x = (S) * bx; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
decsp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) sp; | |
x = (S) * sp; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
decbp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) bp; | |
x = (S) * bp; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
decsi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) si; | |
x = (S) * si; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
decdi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
d = 1; | |
p = (V *) di; | |
x = (S) * di; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
} | |
void | |
pushax () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(ax), 1); | |
} | |
void | |
pushcx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(cx), 1); | |
} | |
void | |
pushdx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(dx), 1); | |
} | |
void | |
pushbx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(bx), 1); | |
} | |
void | |
pushsp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(sp), 1); | |
} | |
void | |
pushbp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(bp), 1); | |
} | |
void | |
pushsi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(si), 1); | |
} | |
void | |
pushdi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(di), 1); | |
} | |
void | |
popax () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(ax) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
popcx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(cx) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
popdx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(dx) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
popbx () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(bx) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
popsp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(sp) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
popbp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(bp) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
popsi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(si) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
popdi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(di) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
nop1 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nop2 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nop3 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nop4 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nop5 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nop6 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nop7 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nop8 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nop9 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopA () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopB () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopC () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopD () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopE () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopF () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopG () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
jo () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", of); | |
if (of) | |
*ip += (S) y;; | |
} | |
void | |
jno () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", !(of)); | |
if (!(of)) | |
*ip += (S) y;; | |
} | |
void | |
jb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", cf); | |
if (cf) | |
*ip += (S) y;; | |
} | |
void | |
jnb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", !(cf)); | |
if (!(cf)) | |
*ip += (S) y;; | |
} | |
void | |
jz () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", zf); | |
if (zf) | |
*ip += (S) y;; | |
} | |
void | |
jnz () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", !(zf)); | |
if (!(zf)) | |
*ip += (S) y;; | |
} | |
void | |
jbe () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", cf | zf); | |
if (cf | zf) | |
*ip += (S) y;; | |
} | |
void | |
jnbe () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", !(cf | zf)); | |
if (!(cf | zf)) | |
*ip += (S) y;; | |
} | |
void | |
js () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", sf); | |
if (sf) | |
*ip += (S) y;; | |
} | |
void | |
jns () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", !(sf)); | |
if (!(sf)) | |
*ip += (S) y;; | |
} | |
void | |
jp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
jnp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
jl () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", sf ^ of); | |
if (sf ^ of) | |
*ip += (S) y;; | |
} | |
void | |
jnl_ () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", !(sf ^ of)); | |
if (!(sf ^ of)) | |
*ip += (S) y;; | |
} | |
void | |
jle () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", (sf ^ of) | zf); | |
if ((sf ^ of) | zf) | |
*ip += (S) y;; | |
} | |
void | |
jnle () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
U cf = ! !(*fl & CF), of = ! !(*fl & OF), sf = ! !(*fl & SF), zf = | |
! !(*fl & ZF); | |
y = (S) (C) fetchb (); | |
if (trace) | |
printf ("<%d> ", !((sf ^ of) | zf)); | |
if (!((sf ^ of) | zf)) | |
*ip += (S) y;; | |
} | |
void | |
immb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
p = (void *) (y = decrm (r, w)); | |
x = w ? fetchw () : fetchb (); | |
d = 0; | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (trace) | |
{ | |
printf ("%s ", (C *[]) | |
{ | |
"ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"} | |
[r.reg]); | |
} | |
switch (r.reg) | |
{ | |
case 0: | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 1: | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 2: | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 3: | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 4: | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 5: | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 6: | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 7: | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
}; | |
} | |
void | |
immw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
p = (void *) (y = decrm (r, w)); | |
x = w ? fetchw () : fetchb (); | |
d = 0; | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (trace) | |
{ | |
printf ("%s ", (C *[]) | |
{ | |
"ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"} | |
[r.reg]); | |
} | |
switch (r.reg) | |
{ | |
case 0: | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 1: | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 2: | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 3: | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 4: | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 5: | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 6: | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 7: | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
}; | |
} | |
void | |
immb1 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
p = (void *) (y = decrm (r, w)); | |
x = w ? fetchw () : fetchb (); | |
d = 0; | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (trace) | |
{ | |
printf ("%s ", (C *[]) | |
{ | |
"ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"} | |
[r.reg]); | |
} | |
switch (r.reg) | |
{ | |
case 0: | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 1: | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 2: | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 3: | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 4: | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 5: | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 6: | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 7: | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
}; | |
} | |
void | |
immis () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
p = (void *) (y = decrm (r, w)); | |
w = 0; | |
x = w ? fetchw () : fetchb (); | |
w = 1; | |
x = (S) (C) x; | |
d = 0; | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (trace) | |
{ | |
printf ("%s ", (C *[]) | |
{ | |
"ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"} | |
[r.reg]); | |
} | |
switch (r.reg) | |
{ | |
case 0: | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 1: | |
z = x | y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 2: | |
x += (*fl & CF); | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 3: | |
d ? y += *fl & CF : (x += *fl & CF); | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 4: | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 5: | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 6: | |
z = x ^ y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
case 7: | |
p = null; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
break; | |
}; | |
} | |
void | |
testb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0);; | |
} | |
void | |
testw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0);; | |
} | |
void | |
xchgb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
xchgw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
movbf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = d ? y : x; | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
movwf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = d ? y : x; | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
movbt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = d ? y : x; | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
movwt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
z = d ? y : x; | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
movsegf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
}; | |
} | |
void | |
lea () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
z = ((UC *) y) - mem; | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w);; | |
} | |
void | |
movsegt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
}; | |
} | |
void | |
poprm () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
*((US *) p) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
nopH () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
xchgac () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) ax; | |
y = (U) (cx); | |
w = 1; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
xchgad () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) ax; | |
y = (U) (dx); | |
w = 1; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
xchgab () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) ax; | |
y = (U) (bx); | |
w = 1; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
xchgasp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) ax; | |
y = (U) (sp); | |
w = 1; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
xchabp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) ax; | |
y = (U) (bp); | |
w = 1; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
xchgasi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) ax; | |
y = (U) (si); | |
w = 1; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
xchadi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) ax; | |
y = (U) (di); | |
w = 1; | |
f = x; | |
z = y; | |
x = get_ ((void *) x, w); | |
y = get_ ((void *) y, w); | |
if (trace) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
if (w) | |
{ | |
*(US *) f = y; | |
*(US *) z = x; | |
} | |
else | |
{ | |
*(UC *) f = y; | |
*(UC *) z = x; | |
}; | |
} | |
void | |
cbw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*ax = (S) (C) * al;; | |
} | |
void | |
cwd () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
z = (I) (S) * ax; | |
*dx = z >> 16;; | |
} | |
void | |
farcall () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
wait () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
pushf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
put_ (mem + (*sp -= 2), *(fl), 1); | |
} | |
void | |
popf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(fl) = get_ (mem + (*sp += 2) - 2, 1); | |
} | |
void | |
sahf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
lahf () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
movalb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
if (d) | |
{ | |
x = get_ (mem + fetchw (), w); | |
if (w) | |
*ax = x; | |
else | |
*al = x; | |
} | |
else | |
{ | |
put_ (mem + fetchw (), w ? *ax : *al, w); | |
}; | |
} | |
void | |
movaxw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
if (d) | |
{ | |
x = get_ (mem + fetchw (), w); | |
if (w) | |
*ax = x; | |
else | |
*al = x; | |
} | |
else | |
{ | |
put_ (mem + fetchw (), w ? *ax : *al, w); | |
}; | |
} | |
void | |
movbal () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
if (d) | |
{ | |
x = get_ (mem + fetchw (), w); | |
if (w) | |
*ax = x; | |
else | |
*al = x; | |
} | |
else | |
{ | |
put_ (mem + fetchw (), w ? *ax : *al, w); | |
}; | |
} | |
void | |
movwax () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
if (d) | |
{ | |
x = get_ (mem + fetchw (), w); | |
if (w) | |
*ax = x; | |
else | |
*al = x; | |
} | |
else | |
{ | |
put_ (mem + fetchw (), w ? *ax : *al, w); | |
}; | |
} | |
void | |
movsb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
movsw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
cmpsb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
cmpsw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
testaib () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0);; | |
} void | |
testaiw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (U) (p = w ? (UC *) ax : al); | |
x = get_ ((void *) x, w); | |
y = w ? fetchw () : fetchb (); | |
z = x & y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0);; | |
} void | |
stosb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
stosw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
lodsb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
lodsw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
scasb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
scasw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
movali () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*al) = fetchb ();; | |
} | |
void | |
movcli () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*cl) = fetchb ();; | |
} | |
void | |
movdli () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*dl) = fetchb ();; | |
} | |
void | |
movbli () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*bl) = fetchb ();; | |
} | |
void | |
movahi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*ah) = fetchb ();; | |
} | |
void | |
movchi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*ch) = fetchb ();; | |
} | |
void | |
movdhi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*dh) = fetchb ();; | |
} | |
void | |
movbhi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*bh) = fetchb ();; | |
} | |
void | |
movaxi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*ax) = fetchw ();; | |
} | |
void | |
movcxi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*cx) = fetchw ();; | |
} | |
void | |
movdxi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*dx) = fetchw ();; | |
} | |
void | |
movbxi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*bx) = fetchw ();; | |
} | |
void | |
movspi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*sp) = fetchw ();; | |
} | |
void | |
movbpi () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*bp) = fetchw ();; | |
} | |
void | |
movsii () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*si) = fetchw ();; | |
} | |
void | |
movdii () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
(*di) = fetchw ();; | |
} | |
void | |
nopI () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopJ () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
reti () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(ip) = get_ (mem + (*sp += 2) - 2, 1); | |
if (fetchw ()) | |
*sp += fetchw () * 2;; | |
} | |
void | |
retz () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(ip) = get_ (mem + (*sp += 2) - 2, 1); | |
if (0) | |
*sp += 0 * 2;; | |
} | |
void | |
les () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
lds () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
movimb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
if (w) | |
{ | |
(*(US *) y) = fetchw (); | |
} | |
else | |
{ | |
(*(UC *) y) = fetchb (); | |
}; | |
} | |
void | |
movimw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
x = decreg (r.reg, w); | |
y = decrm (r, w); | |
if (trace > 1) | |
{ | |
printf ("x:%d\n", x); | |
printf ("y:%d\n", y); | |
} | |
p = d ? (void *) x : (void *) y; | |
if (w) | |
{ | |
(*(US *) y) = fetchw (); | |
} | |
else | |
{ | |
(*(UC *) y) = fetchb (); | |
}; | |
} | |
void | |
nopK () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopL () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
freti () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(cs) = get_ (mem + (*sp += 2) - 2, 1); | |
*(ip) = get_ (mem + (*sp += 2) - 2, 1); | |
if (fetchw ()) | |
*sp += fetchw () * 2;; | |
} | |
void | |
fretz () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*(cs) = get_ (mem + (*sp += 2) - 2, 1); | |
*(ip) = get_ (mem + (*sp += 2) - 2, 1); | |
if (0) | |
*sp += 0 * 2;; | |
} | |
void | |
int3 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
inti () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
int0 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
iret () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
shiftb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
shiftw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
shiftbv () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
shiftwv () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
aam () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
aad () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopM () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
xlat () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
esc0 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
esc1 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
esc2 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
esc3 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
esc4 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
esc5 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
esc6 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
esc7 () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
loopnz () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
loopz () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
loop () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
jcxz () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
inb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
inw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
outb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
outw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
call () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
w = 1; | |
x = w ? fetchw () : (S) (C) fetchb (); | |
put_ (mem + (*sp -= 2), *(ip), 1); | |
(*ip) += (S) x;; | |
} | |
void | |
jmp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = fetchw (); | |
*ip += (S) x;; | |
} | |
void | |
farjmp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
sjmp () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
x = (S) (C) fetchb (); | |
*ip += (S) x;; | |
} | |
void | |
invb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
invw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
outvb () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
outvw () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
lock () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
nopN () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
rep () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
repz () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
hlt () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
halt = 1; | |
} | |
void | |
cmc () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*fl = (*fl & ~CF) | ((*fl & CF) ^ 1);; | |
} | |
void | |
grp1b () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
grp1w () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
clc () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*fl = *fl & ~CF;; | |
} | |
void | |
stc () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
*fl = *fl | CF;; | |
} | |
void | |
cli () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
sti () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
cld () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
std () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1;; | |
} | |
void | |
grp2b () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
y = decrm (r, w); | |
if (trace) | |
printf ("%s ", (C *[]) | |
{ | |
"INC", "DEC", "CALL", "CALL", "JMP", "JMP", "PUSH"} | |
[r.reg]); | |
switch (r.reg) | |
{ | |
case 0: | |
w = 1; | |
d = 1; | |
p = (V *) (S *) y; | |
x = (S) * (S *) y; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
break; | |
case 1: | |
w = 1; | |
d = 1; | |
p = (V *) (S *) y; | |
x = (S) * (S *) y; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
break; | |
case 2: | |
x = w ? fetchw () : (S) (C) fetchb (); | |
put_ (mem + (*sp -= 2), *(ip), 1); | |
(*ip) += (S) x;; | |
break; | |
case 3: | |
x = w ? fetchw () : (S) (C) fetchb (); | |
put_ (mem + (*sp -= 2), *(ip), 1); | |
(*ip) += (S) x;; | |
break; | |
case 4: | |
*ip += (S) y; | |
break; | |
case 5: | |
x = fetchw (); | |
*ip += (S) x;; | |
break; | |
case 6: | |
put_ (mem + (*sp -= 2), *((S *) y), 1); | |
break; | |
}; | |
} | |
void | |
grp2w () | |
{ | |
if (trace) | |
{ | |
printf ("%s:\n", __func__); | |
} | |
d = ! !(o & 2); | |
w = o & 1; | |
rm r = mrm (fetchb ()); | |
y = decrm (r, w); | |
if (trace) | |
printf ("%s ", (C *[]) | |
{ | |
"INC", "DEC", "CALL", "CALL", "JMP", "JMP", "PUSH"} | |
[r.reg]); | |
switch (r.reg) | |
{ | |
case 0: | |
w = 1; | |
d = 1; | |
p = (V *) (S *) y; | |
x = (S) * (S *) y; | |
y = 1; | |
f = *fl & CF; | |
z = x + y; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
break; | |
case 1: | |
w = 1; | |
d = 1; | |
p = (V *) (S *) y; | |
x = (S) * (S *) y; | |
y = 1; | |
f = *fl & CF; | |
z = d ? x - y : y - x; | |
*fl = 0; | |
*fl |= | |
((z & (w ? 0x8000 : 0x80)) ? SF : 0) | ((z & (w ? 0xffff : 0xff)) == | |
0 ? ZF : 0); | |
*fl |= | |
((z & (w ? 0xffff0000 : 0xff00)) ? CF : 0) | | |
(((z ^ x) & (z ^ y) & (w ? 0x8000 : 0x80)) ? OF : 0) | | |
(((x ^ y ^ z) & 0x10) ? AF : 0); | |
if (trace) | |
printf (w ? "->%04x " : "->%02x ", z); | |
put_ (p, z, w); | |
*fl = (*fl & ~CF) | f;; | |
break; | |
case 2: | |
x = w ? fetchw () : (S) (C) fetchb (); | |
put_ (mem + (*sp -= 2), *(ip), 1); | |
(*ip) += (S) x;; | |
break; | |
case 3: | |
x = w ? fetchw () : (S) (C) fetchb (); | |
put_ (mem + (*sp -= 2), *(ip), 1); | |
(*ip) += (S) x;; | |
break; | |
case 4: | |
*ip += (S) y; | |
break; | |
case 5: | |
x = fetchw (); | |
*ip += (S) x;; | |
break; | |
case 6: | |
put_ (mem + (*sp -= 2), *((S *) y), 1); | |
break; | |
}; | |
} | |
void (*tab[]) () = | |
{ | |
addbf, addwf, addbt, addwt, addbi, addwi, pushes, popes, orbf, orwf, orbt, | |
orwt, orbi, orwi, pushcs, nop0, adcbf, adcwf, adcbt, adcwt, adcbi, | |
adcwi, pushss, popss, sbbbf, sbbwf, sbbbt, sbbwt, sbbbi, sbbwi, pushds, | |
popds, andbf, andwf, andbt, andwt, andbi, andwi, esseg, daa, subbf, | |
subwf, subbt, subwt, subbi, subwi, csseg, das, xorbf, xorwf, xorbt, | |
xorwt, xorbi, xorwi, ssseg, aaa, cmpbf, cmpwf, cmpbt, cmpwt, cmpbi, | |
cmpwi, dsseg, aas, incax, inccx, incdx, incbx, incsp, incbp, incsi, | |
incdi, decax, deccx, decdx, decbx, decsp, decbp, decsi, decdi, pushax, | |
pushcx, pushdx, pushbx, pushsp, pushbp, pushsi, pushdi, popax, popcx, | |
popdx, popbx, popsp, popbp, popsi, popdi, nop1, nop2, nop3, nop4, nop5, | |
nop6, nop7, nop8, nop9, nopA, nopB, nopC, nopD, nopE, nopF, nopG, jo, | |
jno, jb, jnb, jz, jnz, jbe, jnbe, js, jns, jp, jnp, jl, jnl_, jle, jnle, | |
immb, immw, immb1, immis, testb, testw, xchgb, xchgw, movbf, movwf, | |
movbt, movwt, movsegf, lea, movsegt, poprm, nopH, xchgac, xchgad, | |
xchgab, xchgasp, xchabp, xchgasi, xchadi, cbw, cwd, farcall, wait, | |
pushf, popf, sahf, lahf, movalb, movaxw, movbal, movwax, movsb, movsw, | |
cmpsb, cmpsw, testaib, testaiw, stosb, stosw, lodsb, lodsw, scasb, | |
scasw, movali, movcli, movdli, movbli, movahi, movchi, movdhi, movbhi, | |
movaxi, movcxi, movdxi, movbxi, movspi, movbpi, movsii, movdii, nopI, | |
nopJ, reti, retz, les, lds, movimb, movimw, nopK, nopL, freti, fretz, | |
int3, inti, int0, iret, shiftb, shiftw, shiftbv, shiftwv, aam, aad, | |
nopM, xlat, esc0, esc1, esc2, esc3, esc4, esc5, esc6, esc7, loopnz, | |
loopz, loop, jcxz, inb, inw, outb, outw, call, jmp, farjmp, sjmp, invb, | |
invw, outvb, outvw, lock, nopN, rep, repz, hlt, cmc, grp1b, grp1w, clc, | |
stc, cli, sti, cld, std, grp2b, grp2w,}; | |
V | |
clean (C * s) | |
{ | |
I i; | |
for (i = 0; i < 80; i++) | |
if (!isprint (s[i])) | |
s[i] = ' '; | |
} | |
V | |
video () | |
{ | |
I i; | |
C buf[81] = ""; | |
for (i = 0; i < 28; i++) | |
memcpy (buf, mem + 0x8000 + i * 80, 80), | |
clean (buf), printf ("\n%s", buf); | |
printf ("\n"); | |
} | |
static I ct; | |
V | |
run () | |
{ | |
while (!halt) | |
{ | |
if (trace) | |
dump (); | |
if (!ct--) | |
{ | |
ct = 10; | |
video (); | |
} | |
tab[o = fetchb ()](); | |
} | |
} | |
V | |
dbg () | |
{ | |
while (!halt) | |
{ | |
C c; | |
if (!ct--) | |
{ | |
ct = 10; | |
video (); | |
} | |
if (trace) | |
dump (); | |
fgetc (stdin); | |
tab[o = fetchb ()](); | |
} | |
} | |
I | |
load (C * f) | |
{ | |
struct stat s; | |
FILE *fp; | |
return (fp = fopen (f, "rb")) | |
&& fstat (fileno (fp), &s) || fread (mem, s.st_size, 1, fp); | |
} | |
I | |
main (I c, C ** v) | |
{ | |
init (); | |
if (c > 1) | |
{ | |
load (v[1]); | |
} | |
*sp = 0x100; | |
if (debug) | |
dbg (); | |
else | |
run (); | |
video (); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment