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); | |