Fixed more sloppy coding

This commit is contained in:
Jeff Parsons 2016-03-07 17:11:27 -08:00
commit 86d96569a0
4 changed files with 87 additions and 114 deletions

View file

@ -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)
*

View file

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

View file

@ -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:

View file

@ -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;
};