From 86d96569a029911589b7f061c7facbc0335292fd Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Mon, 7 Mar 2016 17:11:27 -0800 Subject: [PATCH] Fixed more sloppy coding --- modules/pcjs/lib/x86cpu.js | 88 +++++++++++++--------------------- modules/pcjs/lib/x86func.js | 6 --- modules/pcjs/lib/x86mods.js | 96 ++++++++++++++++++------------------- modules/pcjs/lib/x86ops.js | 11 ++--- 4 files changed, 87 insertions(+), 114 deletions(-) diff --git a/modules/pcjs/lib/x86cpu.js b/modules/pcjs/lib/x86cpu.js index 7efa27dfd..11bac3348 100644 --- a/modules/pcjs/lib/x86cpu.js +++ b/modules/pcjs/lib/x86cpu.js @@ -3299,7 +3299,8 @@ X86CPU.prototype.setLong = function setLong(addr, l) X86CPU.prototype.getEAByte = function(seg, off) { this.segEA = seg; - this.regEA = seg.checkRead(this.offEA = off, 1); + this.offEA = off & (I386? this.maskAddr : 0xffff); + this.regEA = seg.checkRead(this.offEA, 1); if (this.opFlags & X86.OPFLAG.NOREAD) return 0; var b = this.getByte(this.regEA); if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMem0; @@ -3315,7 +3316,7 @@ X86CPU.prototype.getEAByte = function(seg, off) */ X86CPU.prototype.getEAByteData = function(off) { - return this.getEAByte(this.segData, off & (I386? this.maskAddr : 0xffff)); + return this.getEAByte(this.segData, off); }; /** @@ -3327,7 +3328,29 @@ X86CPU.prototype.getEAByteData = function(off) */ X86CPU.prototype.getEAByteStack = function(off) { - return this.getEAByte(this.segStack, off & (I386? this.maskAddr : 0xffff)); + return this.getEAByte(this.segStack, off); +}; + +/** + * getEAWord(seg, off) + * + * @this {X86CPU} + * @param {X86Seg} seg register (eg, segDS) + * @param {number} off is a segment-relative offset + * @return {number} word (16-bit) value at that address + */ +X86CPU.prototype.getEAWord = function(seg, off) +{ + this.segEA = seg; + this.offEA = off & (I386? this.maskAddr : 0xffff); + this.regEA = seg.checkRead(this.offEA, (I386? this.sizeData : 2)); + if (this.opFlags & X86.OPFLAG.NOREAD) return 0; + var w = this.getWord(this.regEA); + if (BACKTRACK) { + this.backTrack.btiEALo = this.backTrack.btiMem0; + this.backTrack.btiEAHi = this.backTrack.btiMem1; + } + return w; }; /** @@ -3335,7 +3358,7 @@ X86CPU.prototype.getEAByteStack = function(off) * * @this {X86CPU} * @param {number} off is a segment-relative offset - * @return {number} word (16-bit) value at that address + * @return {number} short (16-bit) value at that address */ X86CPU.prototype.getEAShortData = function(off) { @@ -3356,7 +3379,7 @@ X86CPU.prototype.getEAShortData = function(off) * * @this {X86CPU} * @param {number} off is a segment-relative offset - * @return {number} word (16-bit) value at that address + * @return {number} short (16-bit) value at that address */ X86CPU.prototype.getEAShortStack = function(off) { @@ -3377,12 +3400,13 @@ X86CPU.prototype.getEAShortStack = function(off) * * @this {X86CPU} * @param {number} off is a segment-relative offset - * @return {number} word (16-bit) value at that address + * @return {number} long (32-bit) value at that address */ X86CPU.prototype.getEALongData = function(off) { this.segEA = this.segData; - this.regEA = this.segEA.checkRead(this.offEA = off, 4); + this.offEA = off & (I386? this.maskAddr : 0xffff); + this.regEA = this.segEA.checkRead(this.offEA, 4); if (this.opFlags & X86.OPFLAG.NOREAD) return 0; var w = this.getLong(this.regEA); if (BACKTRACK) { @@ -3397,12 +3421,13 @@ X86CPU.prototype.getEALongData = function(off) * * @this {X86CPU} * @param {number} off is a segment-relative offset - * @return {number} word (16-bit) value at that address + * @return {number} long (32-bit) value at that address */ X86CPU.prototype.getEALongStack = function(off) { this.segEA = this.segStack; - this.regEA = this.segEA.checkRead(this.offEA = off, 4); + this.offEA = off & (I386? this.maskAddr : 0xffff); + this.regEA = this.segEA.checkRead(this.offEA, 4); if (this.opFlags & X86.OPFLAG.NOREAD) return 0; var w = this.getLong(this.regEA); if (BACKTRACK) { @@ -3412,51 +3437,6 @@ X86CPU.prototype.getEALongStack = function(off) return w; }; -/** - * getEAWord(seg, off) - * - * @this {X86CPU} - * @param {X86Seg} seg register (eg, segDS) - * @param {number} off is a segment-relative offset - * @return {number} word (16-bit) value at that address - */ -X86CPU.prototype.getEAWord = function(seg, off) -{ - this.segEA = seg; - this.regEA = seg.checkRead(this.offEA = off, (I386? this.sizeData : 2)); - if (this.opFlags & X86.OPFLAG.NOREAD) return 0; - var w = this.getWord(this.regEA); - if (BACKTRACK) { - this.backTrack.btiEALo = this.backTrack.btiMem0; - this.backTrack.btiEAHi = this.backTrack.btiMem1; - } - return w; -}; - -/** - * getEAWordData(off) - * - * @this {X86CPU} - * @param {number} off is a segment-relative offset - * @return {number} word (16-bit) value at that address - */ -X86CPU.prototype.getEAWordData = function(off) -{ - return this.getEAWord(this.segData, off & (I386? this.maskAddr : 0xffff)); -}; - -/** - * getEAWordStack(off) - * - * @this {X86CPU} - * @param {number} off is a segment-relative offset - * @return {number} word (16-bit) value at that address - */ -X86CPU.prototype.getEAWordStack = function(off) -{ - return this.getEAWord(this.segStack, off & (I386? this.maskAddr : 0xffff)); -}; - /** * setEAByte(b) * diff --git a/modules/pcjs/lib/x86func.js b/modules/pcjs/lib/x86func.js index 483253f91..06b2e06ba 100644 --- a/modules/pcjs/lib/x86func.js +++ b/modules/pcjs/lib/x86func.js @@ -572,9 +572,6 @@ X86.fnCMPb = function(dst, src) { var b = (dst - src)|0; this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true); - /* - * TODO: Verify that it makes sense for any fnCMPb() callers to be setting regEAWrite... - */ this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesCompareRM) : this.cycleCounts.nOpCyclesArithRM); this.opFlags |= X86.OPFLAG.NOWRITE; return dst; @@ -592,9 +589,6 @@ X86.fnCMPw = function(dst, src) { var w = (dst - src)|0; this.setArithResult(dst, src, w, this.typeData | X86.RESULT.ALL, true); - /* - * TODO: Verify that it makes sense for any fnCMPw() callers to be setting regEAWrite... - */ this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesCompareRM) : this.cycleCounts.nOpCyclesArithRM); this.opFlags |= X86.OPFLAG.NOWRITE; return dst; diff --git a/modules/pcjs/lib/x86mods.js b/modules/pcjs/lib/x86mods.js index d7c7001a6..5153921d6 100644 --- a/modules/pcjs/lib/x86mods.js +++ b/modules/pcjs/lib/x86mods.js @@ -3696,99 +3696,99 @@ X86.decodeModMemLong32 = function(fn) switch(bModRM) { case 0x00: - dst = this.getEAByteData(this.regEAX); + dst = this.getEALongData(this.regEAX); this.regEAWrite = this.regEA; break; case 0x01: - dst = this.getEAByteData(this.regECX); + dst = this.getEALongData(this.regECX); this.regEAWrite = this.regEA; break; case 0x02: - dst = this.getEAByteData(this.regEDX); + dst = this.getEALongData(this.regEDX); this.regEAWrite = this.regEA; break; case 0x03: - dst = this.getEAByteData(this.regEBX); + dst = this.getEALongData(this.regEBX); this.regEAWrite = this.regEA; break; case 0x04: - dst = this.getEAByteData(X86.decodeSIB.call(this, 0)); + dst = this.getEALongData(X86.decodeSIB.call(this, 0)); this.regEAWrite = this.regEA; break; case 0x05: - dst = this.getEAByteData(this.getIPAddr()); + dst = this.getEALongData(this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x06: - dst = this.getEAByteData(this.regESI); + dst = this.getEALongData(this.regESI); this.regEAWrite = this.regEA; break; case 0x07: - dst = this.getEAByteData(this.regEDI); + dst = this.getEALongData(this.regEDI); this.regEAWrite = this.regEA; break; case 0x40: - dst = this.getEAByteData(this.regEAX + this.getIPDisp()); + dst = this.getEALongData(this.regEAX + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x41: - dst = this.getEAByteData(this.regECX + this.getIPDisp()); + dst = this.getEALongData(this.regECX + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x42: - dst = this.getEAByteData(this.regEDX + this.getIPDisp()); + dst = this.getEALongData(this.regEDX + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x43: - dst = this.getEAByteData(this.regEBX + this.getIPDisp()); + dst = this.getEALongData(this.regEBX + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x44: - dst = this.getEAByteData(X86.decodeSIB.call(this, 1) + this.getIPDisp()); + dst = this.getEALongData(X86.decodeSIB.call(this, 1) + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x45: - dst = this.getEAByteStack(this.regEBP + this.getIPDisp()); + dst = this.getEALongStack(this.regEBP + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x46: - dst = this.getEAByteData(this.regESI + this.getIPDisp()); + dst = this.getEALongData(this.regESI + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x47: - dst = this.getEAByteData(this.regEDI + this.getIPDisp()); + dst = this.getEALongData(this.regEDI + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x80: - dst = this.getEAByteData(this.regEAX + this.getIPAddr()); + dst = this.getEALongData(this.regEAX + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x81: - dst = this.getEAByteData(this.regECX + this.getIPAddr()); + dst = this.getEALongData(this.regECX + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x82: - dst = this.getEAByteData(this.regEDX + this.getIPAddr()); + dst = this.getEALongData(this.regEDX + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x83: - dst = this.getEAByteData(this.regEBX + this.getIPAddr()); + dst = this.getEALongData(this.regEBX + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x84: - dst = this.getEAByteData(X86.decodeSIB.call(this, 2) + this.getIPAddr()); + dst = this.getEALongData(X86.decodeSIB.call(this, 2) + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x85: - dst = this.getEAByteStack(this.regEBP + this.getIPAddr()); + dst = this.getEALongStack(this.regEBP + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x86: - dst = this.getEAByteData(this.regESI + this.getIPAddr()); + dst = this.getEALongData(this.regESI + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x87: - dst = this.getEAByteData(this.regEDI + this.getIPAddr()); + dst = this.getEALongData(this.regEDI + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0xC0: @@ -3944,99 +3944,99 @@ X86.decodeModGrpLong32 = function(afnGrp, fnSrc) { switch(bModRM) { case 0x00: - dst = this.getEAByteData(this.regEAX); + dst = this.getEALongData(this.regEAX); this.regEAWrite = this.regEA; break; case 0x01: - dst = this.getEAByteData(this.regECX); + dst = this.getEALongData(this.regECX); this.regEAWrite = this.regEA; break; case 0x02: - dst = this.getEAByteData(this.regEDX); + dst = this.getEALongData(this.regEDX); this.regEAWrite = this.regEA; break; case 0x03: - dst = this.getEAByteData(this.regEBX); + dst = this.getEALongData(this.regEBX); this.regEAWrite = this.regEA; break; case 0x04: - dst = this.getEAByteData(X86.decodeSIB.call(this, 0)); + dst = this.getEALongData(X86.decodeSIB.call(this, 0)); this.regEAWrite = this.regEA; break; case 0x05: - dst = this.getEAByteData(this.getIPAddr()); + dst = this.getEALongData(this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x06: - dst = this.getEAByteData(this.regESI); + dst = this.getEALongData(this.regESI); this.regEAWrite = this.regEA; break; case 0x07: - dst = this.getEAByteData(this.regEDI); + dst = this.getEALongData(this.regEDI); this.regEAWrite = this.regEA; break; case 0x40: - dst = this.getEAByteData(this.regEAX + this.getIPDisp()); + dst = this.getEALongData(this.regEAX + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x41: - dst = this.getEAByteData(this.regECX + this.getIPDisp()); + dst = this.getEALongData(this.regECX + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x42: - dst = this.getEAByteData(this.regEDX + this.getIPDisp()); + dst = this.getEALongData(this.regEDX + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x43: - dst = this.getEAByteData(this.regEBX + this.getIPDisp()); + dst = this.getEALongData(this.regEBX + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x44: - dst = this.getEAByteData(X86.decodeSIB.call(this, 1) + this.getIPDisp()); + dst = this.getEALongData(X86.decodeSIB.call(this, 1) + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x45: - dst = this.getEAByteStack(this.regEBP + this.getIPDisp()); + dst = this.getEALongStack(this.regEBP + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x46: - dst = this.getEAByteData(this.regESI + this.getIPDisp()); + dst = this.getEALongData(this.regESI + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x47: - dst = this.getEAByteData(this.regEDI + this.getIPDisp()); + dst = this.getEALongData(this.regEDI + this.getIPDisp()); this.regEAWrite = this.regEA; break; case 0x80: - dst = this.getEAByteData(this.regEAX + this.getIPAddr()); + dst = this.getEALongData(this.regEAX + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x81: - dst = this.getEAByteData(this.regECX + this.getIPAddr()); + dst = this.getEALongData(this.regECX + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x82: - dst = this.getEAByteData(this.regEDX + this.getIPAddr()); + dst = this.getEALongData(this.regEDX + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x83: - dst = this.getEAByteData(this.regEBX + this.getIPAddr()); + dst = this.getEALongData(this.regEBX + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x84: - dst = this.getEAByteData(X86.decodeSIB.call(this, 2) + this.getIPAddr()); + dst = this.getEALongData(X86.decodeSIB.call(this, 2) + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x85: - dst = this.getEAByteStack(this.regEBP + this.getIPAddr()); + dst = this.getEALongStack(this.regEBP + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x86: - dst = this.getEAByteData(this.regESI + this.getIPAddr()); + dst = this.getEALongData(this.regESI + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0x87: - dst = this.getEAByteData(this.regEDI + this.getIPAddr()); + dst = this.getEALongData(this.regEDI + this.getIPAddr()); this.regEAWrite = this.regEA; break; case 0xC0: diff --git a/modules/pcjs/lib/x86ops.js b/modules/pcjs/lib/x86ops.js index 4e248af62..03a723b78 100644 --- a/modules/pcjs/lib/x86ops.js +++ b/modules/pcjs/lib/x86ops.js @@ -2800,8 +2800,8 @@ X86.opCMPSb = function() if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0; } if (nReps--) { - var bDst = this.getEAByte(this.segData, this.regESI & maskAddr); - var bSrc = this.getEAByte(this.segES, this.regEDI & maskAddr); + var bDst = this.getEAByte(this.segData, this.regESI); + var bSrc = this.getEAByte(this.segES, this.regEDI); this.regEAWrite = this.regEA; // TODO: Is this necessary? /* * fnFault() throws exceptions now, so inline checks of X86.OPFLAG.FAULT should no longer be necessary. @@ -3093,7 +3093,7 @@ X86.opSCASb = function() } if (nReps--) { var bDst = this.regEAX & 0xff; - var bSrc = this.getEAByte(this.segES, this.regEDI & maskAddr); + var bSrc = this.getEAByte(this.segES, this.regEDI); this.regEAWrite = this.regEA; // TODO: Is this necessary? X86.fnCMPb.call(this, bDst, bSrc); /* @@ -3802,10 +3802,9 @@ X86.opSALC = function() X86.opXLAT = function() { /* - * NOTE: I have no idea whether XLAT actually wraps the 16-bit address calculation; - * I'm masking it as if it does, but I need to run a test on real hardware to be sure. + * TODO: Verify whether XLAT wraps its address calculation.... */ - this.regEAX = (this.regEAX & ~0xff) | this.getEAByte(this.segData, ((this.regEBX + (this.regEAX & 0xff)) & 0xffff)); + this.regEAX = (this.regEAX & ~0xff) | this.getEAByte(this.segData, (this.regEBX + (this.regEAX & 0xff))); this.nStepCycles -= this.cycleCounts.nOpCyclesXLAT; };