/* * opcodes.h * * This file is part of Emu48 * * Copyright (C) 1995 Sebastien Carlier * */ o00: // RTNSXM { w.pc = rstkpop(); w.HST |= XM; continue; } o01: // RTN { w.pc = rstkpop(); continue; } o02: // RTNSC { w.pc = rstkpop(); w.carry = TRUE; continue; } o03: // RTNCC { w.pc = rstkpop(); w.carry = FALSE; continue; } o04: // SETHEX { w.pc+=2; w.mode_dec=FALSE; continue; } o05: // SETDEC { w.pc+=2; w.mode_dec = TRUE; continue; } o06: // RSTK=C { w.pc+=2; rstkpush(Npack(w.C,5)); continue; } o07: // C=RSTK { w.pc+=2; Nunpack(w.C,rstkpop(),5); continue; } o08: // CLRST { w.pc+=2; memset(w.ST, 0, 3); continue; } o09: // C=ST { w.pc+=2; memcpy(w.C, w.ST, 3); continue; } o0A: // ST=C { w.pc+=2; memcpy(w.ST, w.C, 3); continue; } o0B: // CSTEX { w.pc+=2; Nxchg(w.C, w.ST, 3); continue; } o0C: // P=P+1 { w.pc+=2; if (w.P<15) { w.P++; w.carry=FALSE; } else { w.P=0; w.carry=TRUE; } PCHANGED; continue; } o0D: // P=P-1 { w.pc+=2; if (w.P) { w.P--; w.carry=FALSE; } else { w.P=0xF; w.carry=TRUE; } PCHANGED; continue; } o0Ef0: // A=A&B f { w.pc+=4; NFand(w.A,w.B,I[2]); continue; } o0Ef1: // B=B&C f { w.pc+=4; NFand(w.B,w.C,I[2]); continue; } o0Ef2: // C=C&A f { w.pc+=4; NFand(w.C,w.A,I[2]); continue; } o0Ef3: // D=D&C f { w.pc+=4; NFand(w.D,w.C,I[2]); continue; } o0Ef4: // B=B&A f { w.pc+=4; NFand(w.B,w.A,I[2]); continue; } o0Ef5: // C=C&B f { w.pc+=4; NFand(w.C,w.B,I[2]); continue; } o0Ef6: // A=A&C f { w.pc+=4; NFand(w.A,w.C,I[2]); continue; } o0Ef7: // C=C&D f { w.pc+=4; NFand(w.C,w.D,I[2]); continue; } o0Ef8: // A=A!B f { w.pc+=4; NFor(w.A,w.B,I[2]); continue; } o0Ef9: // B=B!C f { w.pc+=4; NFor(w.B,w.C,I[2]); continue; } o0EfA: // C=C!A f { w.pc+=4; NFor(w.C,w.A,I[2]); continue; } o0EfB: // D=D!C f { w.pc+=4; NFor(w.D,w.C,I[2]); continue; } o0EfC: // B=B!A f { w.pc+=4; NFor(w.B,w.A,I[2]); continue; } o0EfD: // C=C!B f { w.pc+=4; NFor(w.C,w.B,I[2]); continue; } o0EfE: // A=A!C f { w.pc+=4; NFor(w.A,w.C,I[2]); continue; } o0EfF: // C=A!D f { w.pc+=4; NFor(w.C,w.D,I[2]); continue; } o0F: // RTI { w.pc = rstkpop(); w.inte = TRUE; if (w.IR15X) INTERRUPT; if (w.intd) { w.intd = FALSE; INTERRUPT; } continue; } o100: // R0=A W { w.pc+=3; memcpy(w.R0, w.A, 16); continue; } o101: // R1=A W { w.pc+=3; memcpy(w.R1, w.A, 16); continue; } o102: // R2=A W { w.pc+=3; memcpy(w.R2, w.A, 16); continue; } o103: // R3=A W { w.pc+=3; memcpy(w.R3, w.A, 16); continue; } o104: // R4=A W { w.pc+=3; memcpy(w.R4, w.A, 16); continue; } o108: // R0=C W { w.pc+=3; memcpy(w.R0, w.C, 16); continue; } o109: // R1=C W { w.pc+=3; memcpy(w.R1, w.C, 16); continue; } o10A: // R2=C W { w.pc+=3; memcpy(w.R2, w.C, 16); continue; } o10B: // R3=C W { w.pc+=3; memcpy(w.R3, w.C, 16); continue; } o10C: // R4=C W { w.pc+=3; memcpy(w.R4, w.C, 16); continue; } o110: // A=R0 W { w.pc+=3; memcpy(w.A, w.R0, 16); continue; } o111: // A=R1 W { w.pc+=3; memcpy(w.A, w.R1, 16); continue; } o112: // A=R2 W { w.pc+=3; memcpy(w.A, w.R2, 16); continue; } o113: // A=R3 W { w.pc+=3; memcpy(w.A, w.R3, 16); continue; } o114: // A=R4 W { w.pc+=3; memcpy(w.A, w.R4, 16); continue; } o118: // C=R0 W { w.pc+=3; memcpy(w.C, w.R0, 16); continue; } o119: // C=R1 W { w.pc+=3; memcpy(w.C, w.R1, 16); continue; } o11A: // C=R2 W { w.pc+=3; memcpy(w.C, w.R2, 16); continue; } o11B: // C=R3 W { w.pc+=3; memcpy(w.C, w.R3, 16); continue; } o11C: // C=R4 W { w.pc+=3; memcpy(w.C, w.R4, 16); continue; } o120: // AR0EX W { w.pc+=3; Nxchg(w.A, w.R0, 16); continue; } o121: // AR1EX W { w.pc+=3; Nxchg(w.A, w.R1, 16); continue; } o122: // AR2EX W { w.pc+=3; Nxchg(w.A, w.R2, 16); continue; } o123: // AR3EX W { w.pc+=3; Nxchg(w.A, w.R3, 16); continue; } o124: // AR4EX W { w.pc+=3; Nxchg(w.A, w.R4, 16); continue; } o128: // CR0EX W { w.pc+=3; Nxchg(w.C, w.R0, 16); continue; } o129: // CR1EX W { w.pc+=3; Nxchg(w.C, w.R1, 16); continue; } o12A: // CR2EX W { w.pc+=3; Nxchg(w.C, w.R2, 16); continue; } o12B: // CR3EX W { w.pc+=3; Nxchg(w.C, w.R3, 16); continue; } o12C: // CR4EX W { w.pc+=3; Nxchg(w.C, w.R4, 16); continue; } o130: // D0=A { w.pc+=3; w.d0=Npack(w.A,5); continue; } o131: // D1=A { w.pc+=3; w.d1=Npack(w.A,5); continue; } o132: // AD0EX { DWORD d = w.d0; w.d0=Npack(w.A,5); Nunpack(w.A,d,5); w.pc+=3; continue; } o133: // AD1EX { DWORD d=w.d1; w.d1=Npack(w.A,5); Nunpack(w.A,d,5); w.pc+=3; continue; } o134: // D0=C { w.pc+=3; w.d0=Npack(w.C,5); continue; } o135: // D1=C { w.pc+=3; w.d1=Npack(w.C,5); continue; } o136: // CD0EX { DWORD d=w.d0; w.d0=Npack(w.C,5); Nunpack(w.C,d,5); w.pc+=3; continue; } o137: // CD1EX { DWORD d=w.d1; w.d1=Npack(w.C,5); Nunpack(w.C,d,5); w.pc+=3; continue; } o138:// D0=AS { w.pc+=3; *((WORD*)&w.d0)=(WORD)Npack(w.A,4); continue; } o139: // D1=AS { w.pc+=3; *((WORD*)&w.d1)=(WORD)Npack(w.A,4); continue; } o13A: // AD0XS { DWORD d=w.d0; *((WORD*)&w.d0)=(WORD)Npack(w.A,4); Nunpack(w.A,d,4); w.pc+=3; continue; } o13B: // AD1XS { DWORD d=w.d1; *((WORD*)&w.d1)=(WORD)Npack(w.A,4); Nunpack(w.A,d,4); w.pc+=3; continue; } o13C: // D0=CS { w.pc+=3; *((WORD*)&w.d0)=(WORD)Npack(w.C,4); continue; } o13D: // D1=CS { w.pc+=3; *((WORD*)&w.d1)=(WORD)Npack(w.C,4); continue; } o13E: // AD0XS { DWORD d=w.d0; *((WORD*)&w.d0)=(WORD)Npack(w.C,4); Nunpack(w.C,d,4); w.pc+=3; continue; } o13F: // AD1XS { DWORD d=w.d1; *((WORD*)&w.d1)=(WORD)Npack(w.C,4); Nunpack(w.C,d,4); w.pc+=3; continue; } o140: w.pc+=3; Nwrite5(w.A, w.d0); continue; // DAT0=A A o141: w.pc+=3; Nwrite5(w.A, w.d1); continue; // DAT1=A A o144: w.pc+=3; Nwrite5(w.C, w.d0); continue; // DAT0=C A o145: w.pc+=3; Nwrite5(w.C, w.d1); continue; // DAT1=C A o148: w.pc+=3; Nwrite2(w.A, w.d0); continue; // DAT0=A B o149: w.pc+=3; Nwrite2(w.A, w.d1); continue; // DAT1=A B o14C: w.pc+=3; Nwrite2(w.C, w.d0); continue; // DAT0=C B o14D: w.pc+=3; Nwrite2(w.C, w.d1); continue; // DAT1=C B o142: w.pc+=3; Nread5(w.A, w.d0); continue; // A=DAT0 A o143: w.pc+=3; Nread5(w.A, w.d1); continue; // A=DAT1 A o146: w.pc+=3; Nread5(w.C, w.d0); continue; // C=DAT0 A o147: w.pc+=3; Nread5(w.C, w.d1); continue; // C=DAT1 A o14A: w.pc+=3; Nread2(w.A, w.d0); continue; // A=DAT0 B o14B: w.pc+=3; Nread2(w.A, w.d1); continue; // A=DAT1 B o14E: w.pc+=3; Nread2(w.C, w.d0); continue; // C=DAT0 B o14F: w.pc+=3; Nread2(w.C, w.d1); continue; // C=DAT0 B o150a: w.pc+=4; NFwrite(w.A, w.d0, I[3]); continue;// DAT0=A a o151a: w.pc+=4; NFwrite(w.A, w.d1, I[3]); continue;// DAT1=A a o154a: w.pc+=4; NFwrite(w.C, w.d0, I[3]); continue;// DAT0=C a o155a: w.pc+=4; NFwrite(w.C, w.d1, I[3]); continue;// DAT1=C a o152a: w.pc+=4; NFread(w.A, w.d0, I[3]); continue;// A=DAT0 a o153a: w.pc+=4; NFread(w.A, w.d1, I[3]); continue;// A=DAT1 a o156a: w.pc+=4; NFread(w.C, w.d0, I[3]); continue;// C=DAT0 a o157a: w.pc+=4; NFread(w.C, w.d1, I[3]); continue;// C=DAT1 a o158x: w.pc+=4; Nwrite(w.A, w.d0, I[3]+1); continue;// DAT0=A x o159x: w.pc+=4; Nwrite(w.A, w.d1, I[3]+1); continue;// DAT1=A x o15Cx: w.pc+=4; Nwrite(w.C, w.d0, I[3]+1); continue;// DAT0=C x o15Dx: w.pc+=4; Nwrite(w.C, w.d1, I[3]+1); continue;// DAT1=C x o15Ax: w.pc+=4; Nread(w.A, w.d0, I[3]+1); continue;// A=DAT0 x o15Bx: w.pc+=4; Nread(w.A, w.d1, I[3]+1); continue;// A=DAT1 x o15Ex: w.pc+=4; Nread(w.C, w.d0, I[3]+1); continue;// C=DAT0 x o15Fx: w.pc+=4; Nread(w.C, w.d1, I[3]+1); continue; // C=DAT1 x o16x: // D0=D0+ (n+1) { w.pc+=3; w.d0+=I[2]+1; if (w.d0>0xfffff) { w.d0&=0xfffff; w.carry=TRUE; } else { w.carry=FALSE; } continue; } o17x: // D1=D1+ (n+1) { w.pc+=3; w.d1+=I[2]+1; if (w.d1>0xfffff) { w.d1&=0xfffff; w.carry=TRUE; } else { w.carry=FALSE; } continue; } o18x: // D0=D0- (n+1) { w.pc+=3; w.d0-=I[2]+1; if (w.d0>0xfffff) { w.d0&=0xfffff; w.carry=TRUE; } else { w.carry=FALSE; } continue; } o19d2: // D0=(2) #dd { w.pc+=4; *((BYTE*)&w.d0)=(BYTE)Npack(I+2,2); continue; } o1Ad4: // D0=(4) #dddd { w.pc+=6; *((WORD*)&w.d0)=(WORD)Npack(I+2,4); continue; } o1Bd5: // D0=(5) #ddddd { w.pc+=7; w.d0=Npack(I+2,5); continue; } o1Cx: // D1=D1- (n+1) { w.pc+=3; w.d1-=I[2]+1; if (w.d1>0xfffff) { w.d1&=0xfffff; w.carry=TRUE; } else { w.carry=FALSE; } continue; } o1Dd2: // D1=(2) #dd { w.pc+=4; *((BYTE*)&w.d1)=(BYTE)Npack(I+2,2); continue; } o1Ed4: // D1=(4) #dddd { w.pc+=6; *((WORD*)&w.d1)=(WORD)Npack(I+2,4); continue; } o1Fd5: // D1=(5) #ddddd { w.pc+=7; w.d1=Npack(I+2,5); continue; } o2n: // P= n { w.pc+=2; w.P=I[1]; PCHANGED; continue; } o3X: // LCHEX { UINT n=I[1]+1; UINT d=16-w.P; w.pc+=2; I+=2; // UNSAFE if (n<=d) { memcpy(w.C+w.P,I,n); //Nread(C+P,w.pc,n); } else { memcpy(w.C+w.P,I,d); //Nread(C+P,w.pc,d); memcpy(w.C,I+d,n-d); //Nread(C,w.pc+d,n-d); } w.pc+=n; continue; } o4d2: // GOC #dd { if (!w.carry) { w.pc+=3; } else { signed char jmp=I[1]+(I[2]<<4); if (jmp) w.pc+=jmp+1; else w.pc=rstkpop(); w.pc&=0xFFFFF; } continue; } o5d2: // GONC { if (w.carry) { w.pc+=3; } else { signed char jmp=I[1]+(I[2]<<4); if (jmp) w.pc+=jmp+1; else w.pc=rstkpop(); w.pc&=0xFFFFF; } continue; } o6d3: // GOTO { DWORD d=Npack(I+1,3); if (d&0x800) w.pc-=0xFFF-d; else w.pc+=d+1; w.pc&=0xFFFFF; continue; } o7d3: // GOSUB { DWORD d=Npack(I+1,3); rstkpush(w.pc+4); if (d&0x800) w.pc-=0xFFC-d; else w.pc+=d+4; w.pc&=0xFFFFF; continue; } o800: // OUT=CS { w.pc+=3; w.out = (w.out&0xff0) | w.C[0]; ScanKeyboard(); continue; } o801: // OUT=C { w.pc+=3; w.out = (WORD)Npack(w.C, 3); ScanKeyboard(); continue; } o802: // A=IN { w.pc+=3; Nunpack(w.A, w.in, 4); continue; } o803: // C=IN { w.pc+=3; Nunpack(w.C, w.in, 4); continue; } o804: // UNCNFG { w.pc+=3; Uncnfg(); continue; } o805: // CONFIG { w.pc+=3; Config(); continue; } o806: // C=ID { w.pc+=3; C_Eq_Id(); continue; } o807: // SHUTDN { w.pc+=3; if (w.in==0) { bInterrupt = TRUE; w.Shutdn = TRUE; } continue; } o8080: // INTON { w.pc+=4; w.intk = TRUE; ScanKeyboard(); continue; } o80810: // RSI { w.pc+=5; w.intk = TRUE; ScanKeyboard(); continue; } o8082X: // LA { UINT n=I[4]+1; UINT d=16-w.P; w.pc+=5+n; I+=5; // UNSAFE if (n<=d) { memcpy(w.A+w.P,I,n); } else { memcpy(w.A+w.P,I,d); memcpy(w.A,I+d,n-d); } continue; } o8083: // BUSCB { w.pc+=4; continue; } o8084n: // ABIT=0 n { w.pc+=5; Nbit0(w.A, I[4]); continue; } o8085n: // ABIT=1 n { w.pc+=5; Nbit1(w.A, I[4]); continue; } o8086n: // ?ABIT=0 n { w.pc+=5; Tbit0(w.A, I[4]); GOYES5; } o8087n: // ?ABIT=1 n { w.pc+=5; Tbit1(w.A, I[4]); GOYES5; } o8088n: // CBIT=0 n { w.pc+=5; Nbit0(w.C, I[4]); continue; } o8089n: // CBIT=1 n { w.pc+=5; Nbit1(w.C, I[4]); continue; } o808An: // ?CBIT=0 n { w.pc+=5; Tbit0(w.C, I[4]); GOYES5; } o808Bn: // ?CBIT=1 n { w.pc+=5; Tbit1(w.C, I[4]); GOYES5; } o808C: // PC=(A) { w.pc=Read5(Npack(w.A,5)); continue; } o808D: // BUSCD { w.pc+=4; InfoMessage("BUSCD instruction executed."); continue; } o808E: // PC=(C) { w.pc=Read5(Npack(w.C,5)); continue; } o808F: // INTOFF { w.pc+=4; w.intk = FALSE; ScanKeyboard(); continue; } o809: // C+P+1 - HEX MODE { w.pc+=3; w.C[0]+=w.P; Nincx(w.C,5); continue; } o80A: // RESET { w.pc+=3; Reset(); continue; } o80B: // BUSCC { w.pc+=3; InfoMessage("BUSCC instruction executed."); continue; } o80Cn: // C=P n { w.pc+=4; w.C[I[3]] = w.P; continue; } o80Dn: // P=C n { w.pc+=4; w.P = w.C[I[3]]; PCHANGED; continue; } o80E: // SREQ { w.pc+=3; w.C[0]=0; InfoMessage("SREQ? instruction executed."); continue; } o80Fn: // CPEX n { BYTE n = w.P; w.P = w.C[I[3]]; w.C[I[3]] = n; PCHANGED; w.pc+=4; continue; } o810: // ASLC { w.pc+=3; Nslc(w.A, 16); continue; } o811: // BSLC { w.pc+=3; Nslc(w.B, 16); continue; } o812: // CSLC { w.pc+=3; Nslc(w.C, 16); continue; } o813: // DSLC { w.pc+=3; Nslc(w.D, 16); continue; } o814: // ASRC { w.pc+=3; Nsrc(w.A, 16); continue; } o815: // BSRC { w.pc+=3; Nsrc(w.B, 16); continue; } o816: // CSRC { w.pc+=3; Nsrc(w.C, 16); continue; } o817: // DSRC { w.pc+=3; Nsrc(w.D, 16); continue; } o818f0x: // A=A+x+1 f { w.pc+=6; w.A[F_s[I[3]]]+=I[5]; NFinc(w.A,I[3]); continue; } o818f1x: // B=B+x+1 f { w.pc+=6; w.B[F_s[I[3]]]+=I[5]; NFinc(w.B,I[3]); continue; } o818f2x: // C=C+x+1 f { w.pc+=6; w.C[F_s[I[3]]]+=I[5]; NFinc(w.C,I[3]); continue; } o818f3x: // D=D+x+1 f { w.pc+=6; w.D[F_s[I[3]]]+=I[5]; NFinc(w.D,I[3]); continue; } o818f8x: // A=A-x-1 f { w.pc+=6; w.A[F_s[I[3]]]-=I[5]; NFdec(w.A,I[3]); continue; } o818f9x: // B=B-x-1 f { w.pc+=6; w.B[F_s[I[3]]]-=I[5]; NFdec(w.B,I[3]); continue; } o818fAx: // C=C-x-1 f { w.pc+=6; w.C[F_s[I[3]]]-=I[5]; NFdec(w.C,I[3]); continue; } o818fBx: // D=D-x-1 f { w.pc+=6; w.D[F_s[I[3]]]-=I[5]; NFdec(w.D,I[3]); continue; } o819f0: // ASRB { w.pc+=5; NFsrb(w.A, I[3]); continue; } o819f1: // BSRB { w.pc+=5; NFsrb(w.B, I[3]); continue; } o819f2: // CSRB { w.pc+=5; NFsrb(w.C, I[3]); continue; } o819f3: // DSRB { w.pc+=5; NFsrb(w.D, I[3]); continue; } o81Af00: // R0=A f { w.pc+=6; NFcopy(w.R0, w.A, I[3]); continue; } o81Af01: // R1=A f { w.pc+=6; NFcopy(w.R1, w.A, I[3]); continue; } o81Af02: // R2=A f { w.pc+=6; NFcopy(w.R2, w.A, I[3]); continue; } o81Af03: // R3=A f { w.pc+=6; NFcopy(w.R3, w.A, I[3]); continue; } o81Af04: // R4=A f { w.pc+=6; NFcopy(w.R4, w.A, I[3]); continue; } o81Af08: // R0=C f { w.pc+=6; NFcopy(w.R0, w.C, I[3]); continue; } o81Af09: // R1=C f { w.pc+=6; NFcopy(w.R1, w.C, I[3]); continue; } o81Af0A: // R2=C f { w.pc+=6; NFcopy(w.R2, w.C, I[3]); continue; } o81Af0B: // R3=C f { w.pc+=6; NFcopy(w.R3, w.C, I[3]); continue; } o81Af0C: // R4=C f { w.pc+=6; NFcopy(w.R4, w.C, I[3]); continue; } o81Af10: // A=R0 f { w.pc+=6; NFcopy(w.A, w.R0, I[3]); continue; } o81Af11: // A=R1 f { w.pc+=6; NFcopy(w.A, w.R1, I[3]); continue; } o81Af12: // A=R2 f { w.pc+=6; NFcopy(w.A, w.R2, I[3]); continue; } o81Af13: // A=R3 f { w.pc+=6; NFcopy(w.A, w.R3, I[3]); continue; } o81Af14: // A=R4 f { w.pc+=6; NFcopy(w.A, w.R4, I[3]); continue; } o81Af18: // C=R0 f { w.pc+=6; NFcopy(w.C, w.R0, I[3]); continue; } o81Af19: // C=R1 f { w.pc+=6; NFcopy(w.C, w.R1, I[3]); continue; } o81Af1A: // C=R2 f { w.pc+=6; NFcopy(w.C, w.R2, I[3]); continue; } o81Af1B: // C=R3 f { w.pc+=6; NFcopy(w.C, w.R3, I[3]); continue; } o81Af1C: // C=R4 f { w.pc+=6; NFcopy(w.C, w.R4, I[3]); continue; } o81Af20: // AR0EX f { w.pc+=6; NFxchg(w.A, w.R0, I[3]); continue; } o81Af21: // AR1EX f { w.pc+=6; NFxchg(w.A, w.R1, I[3]); continue; } o81Af22: // AR2EX f { w.pc+=6; NFxchg(w.A, w.R2, I[3]); continue; } o81Af23: // AR3EX f { w.pc+=6; NFxchg(w.A, w.R3, I[3]); continue; } o81Af24: // AR4EX f { w.pc+=6; NFxchg(w.A, w.R4, I[3]); continue; } o81Af28: // CR0EX f { w.pc+=6; NFxchg(w.C, w.R0, I[3]); continue; } o81Af29: // CR1EX f { w.pc+=6; NFxchg(w.C, w.R1, I[3]); continue; } o81Af2A: // CR2EX f { w.pc+=6; NFxchg(w.C, w.R2, I[3]); continue; } o81Af2B: // CR3EX f { w.pc+=6; NFxchg(w.C, w.R3, I[3]); continue; } o81Af2C: // CR4EX f { w.pc+=6; NFxchg(w.C, w.R4, I[3]); continue; } o81B2: // PC=A { w.pc = Npack(w.A,5); continue; } o81B3: // PC=C { w.pc = Npack(w.C,5); continue; } o81B4: // A=PC { w.pc+=4; Nunpack(w.A,w.pc,5); continue; } o81B5: // C=PC { w.pc+=4; Nunpack(w.C,w.pc,5); continue; } o81B6: // APCEX { DWORD d=w.pc+4; w.pc=Npack(w.A,5); Nunpack(w.A,d,5); continue; } o81B7: // CPCEX { DWORD d=w.pc+4; w.pc=Npack(w.C,5); Nunpack(w.C,d,5); continue; } o81C: // ASRB { w.pc+=3; Nsrb(w.A, 16); continue; } o81D: // BSRB { w.pc+=3; Nsrb(w.B, 16); continue; } o81E: // CSRB { w.pc+=3; Nsrb(w.C, 16); continue; } o81F: // DSRB { w.pc+=3; Nsrb(w.D, 16); continue; } o82n: // HST=0 m { w.pc+=3; w.HST&=~I[2]; continue; } o83n: // ?HST=0 m { w.pc+=3; if ((w.HST&I[2])==0) w.carry=TRUE; else w.carry=FALSE; GOYES3; } o84n: // ST=0 n { w.pc+=3; Nbit0(w.ST, I[2]); continue; } o85n: // ST=1 n { w.pc+=3; Nbit1(w.ST, I[2]); continue; } o86n: // ?ST=0 n { w.pc+=3; Tbit0(w.ST, I[2]); GOYES3; } o87n: // ?ST=1 n { w.pc+=3; Tbit1(w.ST, I[2]); GOYES3; } o88n: // ?P# n { w.pc+=3; if (w.P!=I[2]) w.carry=TRUE; else w.carry=FALSE; GOYES3; } o89n: // ?P= n { w.pc+=3; if (w.P==I[2]) w.carry=TRUE; else w.carry=FALSE; GOYES3; } o8A0: // ?A=B A { w.pc+=3; Te(w.A, w.B, 5); GOYES3; } o8A1: // ?B=C A { w.pc+=3; Te(w.B, w.C, 5); GOYES3; } o8A2: // ?C=A A { w.pc+=3; Te(w.C, w.A, 5); GOYES3; } o8A3: // ?D=C A { w.pc+=3; Te(w.D, w.C, 5); GOYES3; } o8A4: // ?A#B A { w.pc+=3; Tne(w.A, w.B, 5); GOYES3; } o8A5: // ?B#C A { w.pc+=3; Tne(w.B, w.C, 5); GOYES3; } o8A6: // ?C#A A { w.pc+=3; Tne(w.C, w.A, 5); GOYES3; } o8A7: // ?D#C A { w.pc+=3; Tne(w.D, w.C, 5); GOYES3; } o8A8: // ?A=0 A { w.pc+=3; Tz(w.A, 5); GOYES3; } o8A9: // ?B=0 A { w.pc+=3; Tz(w.B, 5); GOYES3; } o8AA: // ?C=0 A { w.pc+=3; Tz(w.C, 5); GOYES3; } o8AB: // ?D=0 A { w.pc+=3; Tz(w.D, 5); GOYES3; } o8AC: // ?A#0 A { w.pc+=3; Tnz(w.A, 5); GOYES3; } o8AD: // ?B#0 A { w.pc+=3; Tnz(w.B, 5); GOYES3; } o8AE: // ?C#0 A { w.pc+=3; Tnz(w.C, 5); GOYES3; } o8AF: // ?D#0 A { w.pc+=3; Tnz(w.D, 5); GOYES3; } o8B0: // ?A>B A { w.pc+=3; Ta(w.A, w.B, 5); GOYES3; } o8B1: // ?B>C A { w.pc+=3; Ta(w.B, w.C, 5); GOYES3; } o8B2: // ?C>A A { w.pc+=3; Ta(w.C, w.A, 5); GOYES3; } o8B3: // ?D>C A { w.pc+=3; Ta(w.D, w.C, 5); GOYES3; } o8B4: // ?A=B A { w.pc+=3; Tae(w.A, w.B, 5); GOYES3; } o8B9: // ?B>=C A { w.pc+=3; Tae(w.B, w.C, 5); GOYES3; } o8BA: // ?C>=A A { w.pc+=3; Tae(w.C, w.A, 5); GOYES3; } o8BB: // ?D>=C A { w.pc+=3; Tae(w.D, w.C, 5); GOYES3; } o8BC: // ?A<=B A { w.pc+=3; Tbe(w.A, w.B, 5); GOYES3; } o8BD: // ?B<=C A { w.pc+=3; Tbe(w.B, w.C, 5); GOYES3; } o8BE: // ?C<=A A { w.pc+=3; Tbe(w.C, w.A, 5); GOYES3; } o8BF: // ?D<=C A { w.pc+=3; Tbe(w.D, w.C, 5); GOYES3; } o8Cd4: // GOLONG #dddd { DWORD d=Npack(I+2, 4); if (d&0x8000) w.pc-=0xfffe-d; else w.pc+=d+2; w.pc&=0xFFFFF; continue; } o8Dd5: // GOVLNG #ddddd { w.pc = Npack(I+2, 5); continue; } o8Ed4: // GOSUBL #dddd { DWORD d=Npack(I+2,4); rstkpush(w.pc+6); if (d&0x8000) w.pc-=0xfffa-d; else w.pc+=d+6; w.pc&=0xFFFFF; continue; } o8Fd5: // GOSBVL #ddddd { rstkpush(w.pc+7); w.pc=Npack(I+2, 5); continue; } // ?r=s f o9a0: w.pc+=3; TFe(w.A, w.B, I[1]); GOYES3; o9a1: w.pc+=3; TFe(w.B, w.C, I[1]); GOYES3; o9a2: w.pc+=3; TFe(w.C, w.A, I[1]); GOYES3; o9a3: w.pc+=3; TFe(w.D, w.C, I[1]); GOYES3; // ?r#s f o9a4: w.pc+=3; TFne(w.A, w.B, I[1]); GOYES3; o9a5: w.pc+=3; TFne(w.B, w.C, I[1]); GOYES3; o9a6: w.pc+=3; TFne(w.C, w.A, I[1]); GOYES3; o9a7: w.pc+=3; TFne(w.D, w.C, I[1]); GOYES3; // ?r=0 f o9a8: w.pc+=3; TFz(w.A, I[1]); GOYES3; o9a9: w.pc+=3; TFz(w.B, I[1]); GOYES3; o9aA: w.pc+=3; TFz(w.C, I[1]); GOYES3; o9aB: w.pc+=3; TFz(w.D, I[1]); GOYES3; // ?r#0 f o9aC: w.pc+=3; TFnz(w.A, I[1]); GOYES3; o9aD: w.pc+=3; TFnz(w.B, I[1]); GOYES3; o9aE: w.pc+=3; TFnz(w.C, I[1]); GOYES3; o9aF: w.pc+=3; TFnz(w.D, I[1]); GOYES3; // ?s>r f o9b0: w.pc+=3; TFa(w.A, w.B, I[1]&7); GOYES3; o9b1: w.pc+=3; TFa(w.B, w.C, I[1]&7); GOYES3; o9b2: w.pc+=3; TFa(w.C, w.A, I[1]&7); GOYES3; o9b3: w.pc+=3; TFa(w.D, w.C, I[1]&7); GOYES3; // ?r=s f o9b8: w.pc+=3; TFae(w.A, w.B, I[1]&7); GOYES3; o9b9: w.pc+=3; TFae(w.B, w.C, I[1]&7); GOYES3; o9bA: w.pc+=3; TFae(w.C, w.A, I[1]&7); GOYES3; o9bB: w.pc+=3; TFae(w.D, w.C, I[1]&7); GOYES3; // ?r<=s f o9bC: w.pc+=3; TFbe(w.A, w.B, I[1]&7); GOYES3; o9bD: w.pc+=3; TFbe(w.B, w.C, I[1]&7); GOYES3; o9bE: w.pc+=3; TFbe(w.C, w.A, I[1]&7); GOYES3; o9bF: w.pc+=3; TFbe(w.D, w.C, I[1]&7); GOYES3; // r=r+s f oAa0: w.pc+=3; NFadd(w.A, w.B, I[1]); continue; oAa1: w.pc+=3; NFadd(w.B, w.C, I[1]); continue; oAa2: w.pc+=3; NFadd(w.C, w.A, I[1]); continue; oAa3: w.pc+=3; NFadd(w.D, w.C, I[1]); continue; // r=r+r f oAa4: w.pc+=3; NFdbl(w.A, I[1]); continue; oAa5: w.pc+=3; NFdbl(w.B, I[1]); continue; oAa6: w.pc+=3; NFdbl(w.C, I[1]); continue; oAa7: w.pc+=3; NFdbl(w.D, I[1]); continue; // s=s+r f oAa8: w.pc+=3; NFadd(w.B, w.A, I[1]); continue; oAa9: w.pc+=3; NFadd(w.C, w.B, I[1]); continue; oAaA: w.pc+=3; NFadd(w.A, w.C, I[1]); continue; oAaB: w.pc+=3; NFadd(w.C, w.D, I[1]); continue; // r=r-1 f oAaC: w.pc+=3; NFdec(w.A, I[1]); continue; oAaD: w.pc+=3; NFdec(w.B, I[1]); continue; oAaE: w.pc+=3; NFdec(w.C, I[1]); continue; oAaF: w.pc+=3; NFdec(w.D, I[1]); continue; // r=0 f oAb0: w.pc+=3; NFzero(w.A, I[1]&7); continue; oAb1: w.pc+=3; NFzero(w.B, I[1]&7); continue; oAb2: w.pc+=3; NFzero(w.C, I[1]&7); continue; oAb3: w.pc+=3; NFzero(w.D, I[1]&7); continue; // r=s f oAb4: w.pc+=3; NFcopy(w.A, w.B, I[1]&7); continue; oAb5: w.pc+=3; NFcopy(w.B, w.C, I[1]&7); continue; oAb6: w.pc+=3; NFcopy(w.C, w.A, I[1]&7); continue; oAb7: w.pc+=3; NFcopy(w.D, w.C, I[1]&7); continue; // s=r f oAb8: w.pc+=3; NFcopy(w.B, w.A, I[1]&7); continue; oAb9: w.pc+=3; NFcopy(w.C, w.B, I[1]&7); continue; oAbA: w.pc+=3; NFcopy(w.A, w.C, I[1]&7); continue; oAbB: w.pc+=3; NFcopy(w.C, w.D, I[1]&7); continue; // rsEX f oAbC: w.pc+=3; NFxchg(w.A, w.B, I[1]&7); continue; oAbD: w.pc+=3; NFxchg(w.B, w.C, I[1]&7); continue; oAbE: w.pc+=3; NFxchg(w.C, w.A, I[1]&7); continue; oAbF: w.pc+=3; NFxchg(w.D, w.C, I[1]&7); continue; // r=r-s f oBa0: w.pc+=3; NFsub(w.A, w.B, I[1]); continue; oBa1: w.pc+=3; NFsub(w.B, w.C, I[1]); continue; oBa2: w.pc+=3; NFsub(w.C, w.A, I[1]); continue; oBa3: w.pc+=3; NFsub(w.D, w.C, I[1]); continue; // r=r+1 f oBa4: w.pc+=3; NFinc(w.A, I[1]); continue; oBa5: w.pc+=3; NFinc(w.B, I[1]); continue; oBa6: w.pc+=3; NFinc(w.C, I[1]); continue; oBa7: w.pc+=3; NFinc(w.D, I[1]); continue; // s=s-r f oBa8: w.pc+=3; NFsub(w.B, w.A, I[1]); continue; oBa9: w.pc+=3; NFsub(w.C, w.B, I[1]); continue; oBaA: w.pc+=3; NFsub(w.A, w.C, I[1]); continue; oBaB: w.pc+=3; NFsub(w.C, w.D, I[1]); continue; // r=s-r f oBaC: w.pc+=3; NFrsub(w.A, w.B, I[1]); continue; oBaD: w.pc+=3; NFrsub(w.B, w.C, I[1]); continue; oBaE: w.pc+=3; NFrsub(w.C, w.A, I[1]); continue; oBaF: w.pc+=3; NFrsub(w.D, w.C, I[1]); continue; // rSL f oBb0: w.pc+=3; NFsl(w.A, I[1]&7); continue; oBb1: w.pc+=3; NFsl(w.B, I[1]&7); continue; oBb2: w.pc+=3; NFsl(w.C, I[1]&7); continue; oBb3: w.pc+=3; NFsl(w.D, I[1]&7); continue; // rSR f oBb4: w.pc+=3; NFsr(w.A, I[1]&7); continue; oBb5: w.pc+=3; NFsr(w.B, I[1]&7); continue; oBb6: w.pc+=3; NFsr(w.C, I[1]&7); continue; oBb7: w.pc+=3; NFsr(w.D, I[1]&7); continue; // r=-r f oBb8: w.pc+=3; NFneg(w.A, I[1]&7); continue; oBb9: w.pc+=3; NFneg(w.B, I[1]&7); continue; oBbA: w.pc+=3; NFneg(w.C, I[1]&7); continue; oBbB: w.pc+=3; NFneg(w.D, I[1]&7); continue; // r=-r-1 f oBbC: w.pc+=3; NFnot(w.A, I[1]&7); continue; oBbD: w.pc+=3; NFnot(w.B, I[1]&7); continue; oBbE: w.pc+=3; NFnot(w.C, I[1]&7); continue; oBbF: w.pc+=3; NFnot(w.D, I[1]&7); continue; // r=r+s oC0: w.pc+=2; Nadd(w.A, w.B, 5); continue; oC1: w.pc+=2; Nadd(w.B, w.C, 5); continue; oC2: w.pc+=2; Nadd(w.C, w.A, 5); continue; oC3: w.pc+=2; Nadd(w.D, w.C, 5); continue; // r=r+r A oC4: w.pc+=2; Ndbl(w.A, 5); continue; oC5: w.pc+=2; Ndbl(w.B, 5); continue; oC6: w.pc+=2; Ndbl(w.C, 5); continue; oC7: w.pc+=2; Ndbl(w.D, 5); continue; // s=s+r A oC8: w.pc+=2; Nadd(w.B, w.A, 5); continue; oC9: w.pc+=2; Nadd(w.C, w.B, 5); continue; oCA: w.pc+=2; Nadd(w.A, w.C, 5); continue; oCB: w.pc+=2; Nadd(w.C, w.D, 5); continue; // r=r-1 A oCC: w.pc+=2; Ndec(w.A, 5); continue; oCD: w.pc+=2; Ndec(w.B, 5); continue; oCE: w.pc+=2; Ndec(w.C, 5); continue; oCF: w.pc+=2; Ndec(w.D, 5); continue; // r=0 A oD0: w.pc+=2; memset(w.A, 0, 5); continue; oD1: w.pc+=2; memset(w.B, 0, 5); continue; oD2: w.pc+=2; memset(w.C, 0, 5); continue; oD3: w.pc+=2; memset(w.D, 0, 5); continue; // r=s A oD4: w.pc+=2; memcpy(w.A, w.B, 5); continue; oD5: w.pc+=2; memcpy(w.B, w.C, 5); continue; oD6: w.pc+=2; memcpy(w.C, w.A, 5); continue; oD7: w.pc+=2; memcpy(w.D, w.C, 5); continue; // s=r A oD8: w.pc+=2; memcpy(w.B, w.A, 5); continue; oD9: w.pc+=2; memcpy(w.C, w.B, 5); continue; oDA: w.pc+=2; memcpy(w.A, w.C, 5); continue; oDB: w.pc+=2; memcpy(w.C, w.D, 5); continue; // rsEX oDC: w.pc+=2; Nxchg(w.A, w.B, 5); continue; oDD: w.pc+=2; Nxchg(w.B, w.C, 5); continue; oDE: w.pc+=2; Nxchg(w.C, w.A, 5); continue; oDF: w.pc+=2; Nxchg(w.D, w.C, 5); continue; // r=r-s A oE0: w.pc+=2; Nsub(w.A, w.B, 5); continue; oE1: w.pc+=2; Nsub(w.B, w.C, 5); continue; oE2: w.pc+=2; Nsub(w.C, w.A, 5); continue; oE3: w.pc+=2; Nsub(w.D, w.C, 5); continue; // r=r+1 A oE4: w.pc+=2; Ninc(w.A, 5); continue; oE5: w.pc+=2; Ninc(w.B, 5); continue; oE6: w.pc+=2; Ninc(w.C, 5); continue; oE7: w.pc+=2; Ninc(w.D, 5); continue; // s=s-r A oE8: w.pc+=2; Nsub(w.B, w.A, 5); continue; oE9: w.pc+=2; Nsub(w.C, w.B, 5); continue; oEA: w.pc+=2; Nsub(w.A, w.C, 5); continue; oEB: w.pc+=2; Nsub(w.C, w.D, 5); continue; // r=s-r A oEC: w.pc+=2; Nrsub(w.A, w.B, 5); continue; oED: w.pc+=2; Nrsub(w.B, w.C, 5); continue; oEE: w.pc+=2; Nrsub(w.C, w.A, 5); continue; oEF: w.pc+=2; Nrsub(w.D, w.C, 5); continue; // rSL A oF0: w.pc+=2; Nsl(w.A, 5); continue; oF1: w.pc+=2; Nsl(w.B, 5); continue; oF2: w.pc+=2; Nsl(w.C, 5); continue; oF3: w.pc+=2; Nsl(w.D, 5); continue; // rSR A oF4: w.pc+=2; Nsr(w.A, 5); continue; oF5: w.pc+=2; Nsr(w.B, 5); continue; oF6: w.pc+=2; Nsr(w.C, 5); continue; oF7: w.pc+=2; Nsr(w.D, 5); continue; // r=-r A oF8: w.pc+=2; Nneg(w.A, 5); continue; oF9: w.pc+=2; Nneg(w.B, 5); continue; oFA: w.pc+=2; Nneg(w.C, 5); continue; oFB: w.pc+=2; Nneg(w.D, 5); continue; // r=-r-1 A oFC: w.pc+=2; Nnot(w.A, 5); continue; oFD: w.pc+=2; Nnot(w.B, 5); continue; oFE: w.pc+=2; Nnot(w.C, 5); continue; oFF: w.pc+=2; Nnot(w.D, 5); continue; // invalid, unknown length : reset o_invalid: { w.pc=0; continue; } // length is guessed, just skip o_invalid3: { w.pc+=3; continue; } o_invalid4: { w.pc+=4; continue; } o_invalid5: { w.pc+=5; continue; } o_invalid6: { w.pc+=6; continue; } o_goyes3: { signed char jmp = I[3]+(I[4]<<4); if (jmp) w.pc=(w.pc+jmp)&0xFFFFF; else w.pc=rstkpop(); continue; } o_goyes5: { signed char jmp = I[5]+(I[6]<<4); if (jmp) w.pc=(w.pc+jmp)&0xFFFFF; else w.pc=rstkpop(); continue; } //////// EXTENSIONS //////// o81B0: // ?Win48 w.HST |= SB; w.pc+=4; continue; o81B1: External(&w); continue; ////////////////////////////