Fixed more sloppy coding
This commit is contained in:
parent
65115556ad
commit
86d96569a0
4 changed files with 87 additions and 114 deletions
|
|
@ -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)
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue