static UINT32 opINCB(void) /* TRUSTED */ { UINT8 appb; modAdd=PC+1; modDim=0; amLength1=ReadAMAddress(); if (amFlag) appb=(UINT8)v60.reg[amOut]; else appb=MemRead8(amOut); ADDB(appb, 1); if (amFlag) SETREG8(v60.reg[amOut], appb); else MemWrite8(amOut, appb); return amLength1+1; } static UINT32 opINCH(void) /* TRUSTED */ { UINT16 apph; modAdd=PC+1; modDim=1; amLength1=ReadAMAddress(); if (amFlag) apph=(UINT16)v60.reg[amOut]; else apph=MemRead16(amOut); ADDW(apph, 1); if (amFlag) SETREG16(v60.reg[amOut], apph); else MemWrite16(amOut, apph); return amLength1+1; } static UINT32 opINCW(void) /* TRUSTED */ { UINT32 appw; modAdd=PC+1; modDim=2; amLength1=ReadAMAddress(); if (amFlag) appw=v60.reg[amOut]; else appw=MemRead32(amOut); ADDL(appw, 1); if (amFlag) v60.reg[amOut]=appw; else MemWrite32(amOut,appw); return amLength1+1; } static UINT32 opDECB(void) /* TRUSTED */ { UINT8 appb; modAdd=PC+1; modDim=0; amLength1=ReadAMAddress(); if (amFlag) appb=(UINT8)v60.reg[amOut]; else appb=MemRead8(amOut); SUBB(appb, 1); if (amFlag) SETREG8(v60.reg[amOut], appb); else MemWrite8(amOut, appb); return amLength1+1; } static UINT32 opDECH(void) /* TRUSTED */ { UINT16 apph; modAdd=PC+1; modDim=1; amLength1=ReadAMAddress(); if (amFlag) apph=(UINT16)v60.reg[amOut]; else apph=MemRead16(amOut); SUBW(apph, 1); if (amFlag) SETREG16(v60.reg[amOut], apph); else MemWrite16(amOut, apph); return amLength1+1; } static UINT32 opDECW(void) /* TRUSTED */ { UINT32 appw; modAdd=PC+1; modDim=2; amLength1=ReadAMAddress(); if (amFlag) appw=v60.reg[amOut]; else appw=MemRead32(amOut); SUBL(appw, 1); if (amFlag) v60.reg[amOut]=appw; else MemWrite32(amOut,appw); return amLength1+1; } static UINT32 opJMP(void) /* TRUSTED */ { modAdd=PC+1; modDim=0; // Read the address of the operand ReadAMAddress(); // It cannot be a register!! assert(amFlag==0); // Jump there PC=amOut; ChangePC(PC); return 0; } static UINT32 opJSR(void) /* TRUSTED */ { modAdd=PC + 1; modDim=0; // Read the address of the operand amLength1=ReadAMAddress(); // It cannot be a register!! assert(amFlag==0); // Save NextPC into the stack SP -= 4; MemWrite32(SP, PC + amLength1 + 1); // Jump there PC=amOut; ChangePC(PC); return 0; } static UINT32 opPREPARE(void) /* somewhat TRUSTED */ { modAdd=PC+1; modDim=2; // Read the operand amLength1=ReadAM(); // step 1: save frame pointer on the stack SP -= 4; MemWrite32(SP, FP); // step 2: FP = new SP FP = SP; // step 3: SP -= operand SP -= amOut; return amLength1 + 1; } static UINT32 opRET(void) /* TRUSTED */ { modAdd=PC + 1; modDim=2; // Read the operand ReadAM(); // Read return address from stack PC=MemRead32(SP); SP+=4; ChangePC(PC); // Restore AP from stack AP=MemRead32(SP); SP+=4; // Skip stack frame SP += amOut; return 0; } static UINT32 opTRAP(void) { UINT32 oldPSW; modAdd=PC + 1; modDim=0; // Read the operand amLength1=ReadAM(); // Normalize the flags NORMALIZEFLAGS(); switch ((amOut >> 4) & 0xF) { case 0: if (!_OV) return amLength1+1; else break; case 1: if (_OV) return amLength1+1; else break; case 2: if (!_CY) return amLength1+1; else break; case 3: if (_CY) return amLength1+1; else break; case 4: if (!_Z) return amLength1+1; else break; case 5: if (_Z) return amLength1+1; else break; case 6: if (!(_CY | _Z)) return amLength1+1; else break; case 7: if ((_CY | _Z)) return amLength1+1; else break; case 8: if (!_S) return amLength1+1; else break; case 9: if (_S) return amLength1+1; else break; case 10: break; case 11: return amLength1+1; case 12: if (!(_S^_OV)) return amLength1+1; else break; case 13: if ((_S^_OV)) return amLength1+1; else break; case 14: if (!((_S^_OV)|_Z)) return amLength1+1; else break; case 15: if (((_S^_OV)|_Z)) return amLength1+1; else break; } oldPSW = v60_update_psw_for_exception(0, 0); // Issue the software trap with interrupts SP -= 4; MemWrite32(SP, EXCEPTION_CODE_AND_SIZE(0x3000 + 0x100 * (amOut&0xF), 4)); SP -= 4; MemWrite32(SP, oldPSW); SP -= 4; MemWrite32(SP, PC + amLength1 + 1); PC = GETINTVECT(48 + (amOut&0xF)); ChangePC(PC); return 0; } static UINT32 opRETIU(void) /* TRUSTED */ { UINT32 newPSW; modAdd=PC + 1; modDim=1; // Read the operand ReadAM(); // Restore PC and PSW from stack PC = MemRead32(SP); SP += 4; ChangePC(PC); newPSW = MemRead32(SP); SP += 4; // Destroy stack frame SP += amOut; v60WritePSW(newPSW); return 0; } static UINT32 opRETIS(void) { UINT32 newPSW; modAdd=PC + 1; modDim=1; // Read the operand ReadAM(); // Restore PC and PSW from stack PC = MemRead32(SP); SP += 4; ChangePC(PC); newPSW = MemRead32(SP); SP += 4; // Destroy stack frame SP += amOut; v60WritePSW(newPSW); return 0; } static UINT32 opSTTASK(void) { int i; UINT32 adr; modAdd=PC + 1; modDim=2; amLength1 = ReadAM(); adr = TR; v60WritePSW(v60ReadPSW() | 0x10000000); v60SaveStack(); MemWrite32(adr, TKCW); adr += 4; if(SYCW & 0x100) { MemWrite32(adr, L0SP); adr += 4; } if(SYCW & 0x200) { MemWrite32(adr, L1SP); adr += 4; } if(SYCW & 0x400) { MemWrite32(adr, L2SP); adr += 4; } if(SYCW & 0x800) { MemWrite32(adr, L3SP); adr += 4; } // 31 registers supported, _not_ 32 for(i=0; i<31; i++) if(amOut & (1<