From ea04535880d27431583d3cf1867b33fa1ad4baf3 Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Mon, 20 Apr 2015 22:43:27 -0700 Subject: [PATCH] Tweaks --- modules/pcjs/lib/x86op0f.js | 2 +- modules/pcjs/lib/x86ops.js | 34 +++++++--------------------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/modules/pcjs/lib/x86op0f.js b/modules/pcjs/lib/x86op0f.js index ec2c8b708..4f6fd392c 100644 --- a/modules/pcjs/lib/x86op0f.js +++ b/modules/pcjs/lib/x86op0f.js @@ -1272,7 +1272,7 @@ X86.aOps0F[0x05] = X86.opLOADALL; X86.aOps0F[0x06] = X86.opCLTS; /* - * On all processors (except the 8086/8088, of course), 0x0F,0x0B is also referred to as "UD2": an + * On all processors (except the 8086/8088, of course), X86.OPCODE.UD2 (0x0F,0x0B), aka "UD2", is an * instruction guaranteed to raise a #UD (Invalid Opcode) exception (INT 0x06) on all future x86 processors. */ X86.aOps0F[0x0B] = X86.opInvalid; diff --git a/modules/pcjs/lib/x86ops.js b/modules/pcjs/lib/x86ops.js index d0df2878a..e723aa277 100644 --- a/modules/pcjs/lib/x86ops.js +++ b/modules/pcjs/lib/x86ops.js @@ -3263,24 +3263,7 @@ X86.opMOVw = function MOVw() }; /** - * op=0xC8 (ENTER imm,imm8) (80186/80188 and up) - * - * Here's the pseudo-code from http://www.pcjs.org/pubs/pc/reference/intel/80286/progref, p.B-40 (p.250): - * - * LEVEL := LEVEL MOD 32 - * Push BP - * Set a temporary value FRAME_PTR := SP - * If LEVEL > 0 then - * Repeat (LEVEL-1) times: - * BP := BP - 2 - * Push the word pointed to by BP - * End repeat - * Push FRAME_PTR - * End if - * BP := FRAME_PTR - * SP := SP - first operand - * - * TODO: Verify that this pseudo-code is identical on the 80186/80188 (eg, is LEVEL MOD 32 performed in both instances?) + * op=0xC8 (ENTER imm16,imm8) (80186/80188 and up) * * @this {X86CPU} */ @@ -3294,24 +3277,22 @@ X86.opENTER = function ENTER() */ this.nStepCycles -= 11; this.pushWord(this.regEBP); - var wFrame = this.getSP() & this.segSS.addrMask; + var wFrame = this.getSP() & this.dataMask; if (bLevel > 0) { this.nStepCycles -= (bLevel << 2) + (bLevel > 1? 1 : 0); while (--bLevel) { - this.regEBP = (this.regEBP & ~this.segSS.addrMask) | ((this.regEBP - this.dataSize) & this.segSS.addrMask); - this.pushWord(this.getSOWord(this.segSS, this.regEBP & this.segSS.addrMask)); + this.regEBP = (this.regEBP & ~this.dataMask) | ((this.regEBP - this.dataSize) & this.dataMask); + this.pushWord(this.getSOWord(this.segSS, this.regEBP & this.dataMask)); } this.pushWord(wFrame); } - this.regEBP = (this.regEBP & ~this.segSS.addrMask) | wFrame; + this.regEBP = (this.regEBP & ~this.dataMask) | wFrame; this.setSP((this.getSP() & ~this.segSS.addrMask) | ((this.getSP() - wLocal) & this.segSS.addrMask)); }; /** * op=0xC9 (LEAVE) (80186/80188 and up) * - * Set SP to BP, then pop BP. - * * @this {X86CPU} */ X86.opLEAVE = function LEAVE() @@ -3489,7 +3470,7 @@ X86.opAAD = function AAD() * * Sets AL to 0xFF if CF=1, 0x00 otherwise; no flags are affected (similar to SBB AL,AL, but without side-effects) * - * WARNING: I have no idea how many clocks this instruction originally consumed, so for now, I'm going with the minimum of 2. + * WARNING: I have no idea how many clocks this instruction originally required, so for now, I'm going with a minimum of 2. * * @this {X86CPU} */ @@ -3581,7 +3562,7 @@ X86.opLOOP = function LOOP() X86.opJCXZ = function JCXZ() { var disp = this.getIPDisp(); - if (!this.regECX) { + if (!(this.regECX & this.addrMask)) { this.setIP(this.getIP() + disp); this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZ; return; @@ -3833,7 +3814,6 @@ X86.opHLT = function HLT() if (!this.getIF()) { if (DEBUGGER && this.dbg) this.advanceIP(-1); this.stopCPU(); - // return; } };