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)
|
X86CPU.prototype.getEAByte = function(seg, off)
|
||||||
{
|
{
|
||||||
this.segEA = seg;
|
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;
|
if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
|
||||||
var b = this.getByte(this.regEA);
|
var b = this.getByte(this.regEA);
|
||||||
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMem0;
|
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMem0;
|
||||||
|
|
@ -3315,7 +3316,7 @@ X86CPU.prototype.getEAByte = function(seg, off)
|
||||||
*/
|
*/
|
||||||
X86CPU.prototype.getEAByteData = function(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)
|
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}
|
* @this {X86CPU}
|
||||||
* @param {number} off is a segment-relative offset
|
* @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)
|
X86CPU.prototype.getEAShortData = function(off)
|
||||||
{
|
{
|
||||||
|
|
@ -3356,7 +3379,7 @@ X86CPU.prototype.getEAShortData = function(off)
|
||||||
*
|
*
|
||||||
* @this {X86CPU}
|
* @this {X86CPU}
|
||||||
* @param {number} off is a segment-relative offset
|
* @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)
|
X86CPU.prototype.getEAShortStack = function(off)
|
||||||
{
|
{
|
||||||
|
|
@ -3377,12 +3400,13 @@ X86CPU.prototype.getEAShortStack = function(off)
|
||||||
*
|
*
|
||||||
* @this {X86CPU}
|
* @this {X86CPU}
|
||||||
* @param {number} off is a segment-relative offset
|
* @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)
|
X86CPU.prototype.getEALongData = function(off)
|
||||||
{
|
{
|
||||||
this.segEA = this.segData;
|
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;
|
if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
|
||||||
var w = this.getLong(this.regEA);
|
var w = this.getLong(this.regEA);
|
||||||
if (BACKTRACK) {
|
if (BACKTRACK) {
|
||||||
|
|
@ -3397,12 +3421,13 @@ X86CPU.prototype.getEALongData = function(off)
|
||||||
*
|
*
|
||||||
* @this {X86CPU}
|
* @this {X86CPU}
|
||||||
* @param {number} off is a segment-relative offset
|
* @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)
|
X86CPU.prototype.getEALongStack = function(off)
|
||||||
{
|
{
|
||||||
this.segEA = this.segStack;
|
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;
|
if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
|
||||||
var w = this.getLong(this.regEA);
|
var w = this.getLong(this.regEA);
|
||||||
if (BACKTRACK) {
|
if (BACKTRACK) {
|
||||||
|
|
@ -3412,51 +3437,6 @@ X86CPU.prototype.getEALongStack = function(off)
|
||||||
return w;
|
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)
|
* setEAByte(b)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -572,9 +572,6 @@ X86.fnCMPb = function(dst, src)
|
||||||
{
|
{
|
||||||
var b = (dst - src)|0;
|
var b = (dst - src)|0;
|
||||||
this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
|
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.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;
|
this.opFlags |= X86.OPFLAG.NOWRITE;
|
||||||
return dst;
|
return dst;
|
||||||
|
|
@ -592,9 +589,6 @@ X86.fnCMPw = function(dst, src)
|
||||||
{
|
{
|
||||||
var w = (dst - src)|0;
|
var w = (dst - src)|0;
|
||||||
this.setArithResult(dst, src, w, this.typeData | X86.RESULT.ALL, true);
|
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.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;
|
this.opFlags |= X86.OPFLAG.NOWRITE;
|
||||||
return dst;
|
return dst;
|
||||||
|
|
|
||||||
|
|
@ -3696,99 +3696,99 @@ X86.decodeModMemLong32 = function(fn)
|
||||||
|
|
||||||
switch(bModRM) {
|
switch(bModRM) {
|
||||||
case 0x00:
|
case 0x00:
|
||||||
dst = this.getEAByteData(this.regEAX);
|
dst = this.getEALongData(this.regEAX);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x01:
|
case 0x01:
|
||||||
dst = this.getEAByteData(this.regECX);
|
dst = this.getEALongData(this.regECX);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 0x02:
|
||||||
dst = this.getEAByteData(this.regEDX);
|
dst = this.getEALongData(this.regEDX);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x03:
|
case 0x03:
|
||||||
dst = this.getEAByteData(this.regEBX);
|
dst = this.getEALongData(this.regEBX);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x04:
|
case 0x04:
|
||||||
dst = this.getEAByteData(X86.decodeSIB.call(this, 0));
|
dst = this.getEALongData(X86.decodeSIB.call(this, 0));
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x05:
|
case 0x05:
|
||||||
dst = this.getEAByteData(this.getIPAddr());
|
dst = this.getEALongData(this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x06:
|
case 0x06:
|
||||||
dst = this.getEAByteData(this.regESI);
|
dst = this.getEALongData(this.regESI);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x07:
|
case 0x07:
|
||||||
dst = this.getEAByteData(this.regEDI);
|
dst = this.getEALongData(this.regEDI);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x40:
|
case 0x40:
|
||||||
dst = this.getEAByteData(this.regEAX + this.getIPDisp());
|
dst = this.getEALongData(this.regEAX + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x41:
|
case 0x41:
|
||||||
dst = this.getEAByteData(this.regECX + this.getIPDisp());
|
dst = this.getEALongData(this.regECX + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x42:
|
case 0x42:
|
||||||
dst = this.getEAByteData(this.regEDX + this.getIPDisp());
|
dst = this.getEALongData(this.regEDX + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x43:
|
case 0x43:
|
||||||
dst = this.getEAByteData(this.regEBX + this.getIPDisp());
|
dst = this.getEALongData(this.regEBX + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x44:
|
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;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x45:
|
case 0x45:
|
||||||
dst = this.getEAByteStack(this.regEBP + this.getIPDisp());
|
dst = this.getEALongStack(this.regEBP + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x46:
|
case 0x46:
|
||||||
dst = this.getEAByteData(this.regESI + this.getIPDisp());
|
dst = this.getEALongData(this.regESI + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x47:
|
case 0x47:
|
||||||
dst = this.getEAByteData(this.regEDI + this.getIPDisp());
|
dst = this.getEALongData(this.regEDI + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x80:
|
case 0x80:
|
||||||
dst = this.getEAByteData(this.regEAX + this.getIPAddr());
|
dst = this.getEALongData(this.regEAX + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x81:
|
case 0x81:
|
||||||
dst = this.getEAByteData(this.regECX + this.getIPAddr());
|
dst = this.getEALongData(this.regECX + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x82:
|
case 0x82:
|
||||||
dst = this.getEAByteData(this.regEDX + this.getIPAddr());
|
dst = this.getEALongData(this.regEDX + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x83:
|
case 0x83:
|
||||||
dst = this.getEAByteData(this.regEBX + this.getIPAddr());
|
dst = this.getEALongData(this.regEBX + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x84:
|
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;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x85:
|
case 0x85:
|
||||||
dst = this.getEAByteStack(this.regEBP + this.getIPAddr());
|
dst = this.getEALongStack(this.regEBP + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x86:
|
case 0x86:
|
||||||
dst = this.getEAByteData(this.regESI + this.getIPAddr());
|
dst = this.getEALongData(this.regESI + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x87:
|
case 0x87:
|
||||||
dst = this.getEAByteData(this.regEDI + this.getIPAddr());
|
dst = this.getEALongData(this.regEDI + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0xC0:
|
case 0xC0:
|
||||||
|
|
@ -3944,99 +3944,99 @@ X86.decodeModGrpLong32 = function(afnGrp, fnSrc) {
|
||||||
|
|
||||||
switch(bModRM) {
|
switch(bModRM) {
|
||||||
case 0x00:
|
case 0x00:
|
||||||
dst = this.getEAByteData(this.regEAX);
|
dst = this.getEALongData(this.regEAX);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x01:
|
case 0x01:
|
||||||
dst = this.getEAByteData(this.regECX);
|
dst = this.getEALongData(this.regECX);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 0x02:
|
||||||
dst = this.getEAByteData(this.regEDX);
|
dst = this.getEALongData(this.regEDX);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x03:
|
case 0x03:
|
||||||
dst = this.getEAByteData(this.regEBX);
|
dst = this.getEALongData(this.regEBX);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x04:
|
case 0x04:
|
||||||
dst = this.getEAByteData(X86.decodeSIB.call(this, 0));
|
dst = this.getEALongData(X86.decodeSIB.call(this, 0));
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x05:
|
case 0x05:
|
||||||
dst = this.getEAByteData(this.getIPAddr());
|
dst = this.getEALongData(this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x06:
|
case 0x06:
|
||||||
dst = this.getEAByteData(this.regESI);
|
dst = this.getEALongData(this.regESI);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x07:
|
case 0x07:
|
||||||
dst = this.getEAByteData(this.regEDI);
|
dst = this.getEALongData(this.regEDI);
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x40:
|
case 0x40:
|
||||||
dst = this.getEAByteData(this.regEAX + this.getIPDisp());
|
dst = this.getEALongData(this.regEAX + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x41:
|
case 0x41:
|
||||||
dst = this.getEAByteData(this.regECX + this.getIPDisp());
|
dst = this.getEALongData(this.regECX + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x42:
|
case 0x42:
|
||||||
dst = this.getEAByteData(this.regEDX + this.getIPDisp());
|
dst = this.getEALongData(this.regEDX + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x43:
|
case 0x43:
|
||||||
dst = this.getEAByteData(this.regEBX + this.getIPDisp());
|
dst = this.getEALongData(this.regEBX + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x44:
|
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;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x45:
|
case 0x45:
|
||||||
dst = this.getEAByteStack(this.regEBP + this.getIPDisp());
|
dst = this.getEALongStack(this.regEBP + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x46:
|
case 0x46:
|
||||||
dst = this.getEAByteData(this.regESI + this.getIPDisp());
|
dst = this.getEALongData(this.regESI + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x47:
|
case 0x47:
|
||||||
dst = this.getEAByteData(this.regEDI + this.getIPDisp());
|
dst = this.getEALongData(this.regEDI + this.getIPDisp());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x80:
|
case 0x80:
|
||||||
dst = this.getEAByteData(this.regEAX + this.getIPAddr());
|
dst = this.getEALongData(this.regEAX + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x81:
|
case 0x81:
|
||||||
dst = this.getEAByteData(this.regECX + this.getIPAddr());
|
dst = this.getEALongData(this.regECX + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x82:
|
case 0x82:
|
||||||
dst = this.getEAByteData(this.regEDX + this.getIPAddr());
|
dst = this.getEALongData(this.regEDX + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x83:
|
case 0x83:
|
||||||
dst = this.getEAByteData(this.regEBX + this.getIPAddr());
|
dst = this.getEALongData(this.regEBX + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x84:
|
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;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x85:
|
case 0x85:
|
||||||
dst = this.getEAByteStack(this.regEBP + this.getIPAddr());
|
dst = this.getEALongStack(this.regEBP + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x86:
|
case 0x86:
|
||||||
dst = this.getEAByteData(this.regESI + this.getIPAddr());
|
dst = this.getEALongData(this.regESI + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0x87:
|
case 0x87:
|
||||||
dst = this.getEAByteData(this.regEDI + this.getIPAddr());
|
dst = this.getEALongData(this.regEDI + this.getIPAddr());
|
||||||
this.regEAWrite = this.regEA;
|
this.regEAWrite = this.regEA;
|
||||||
break;
|
break;
|
||||||
case 0xC0:
|
case 0xC0:
|
||||||
|
|
|
||||||
|
|
@ -2800,8 +2800,8 @@ X86.opCMPSb = function()
|
||||||
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0;
|
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0;
|
||||||
}
|
}
|
||||||
if (nReps--) {
|
if (nReps--) {
|
||||||
var bDst = this.getEAByte(this.segData, this.regESI & maskAddr);
|
var bDst = this.getEAByte(this.segData, this.regESI);
|
||||||
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?
|
this.regEAWrite = this.regEA; // TODO: Is this necessary?
|
||||||
/*
|
/*
|
||||||
* fnFault() throws exceptions now, so inline checks of X86.OPFLAG.FAULT should no longer be 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--) {
|
if (nReps--) {
|
||||||
var bDst = this.regEAX & 0xff;
|
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?
|
this.regEAWrite = this.regEA; // TODO: Is this necessary?
|
||||||
X86.fnCMPb.call(this, bDst, bSrc);
|
X86.fnCMPb.call(this, bDst, bSrc);
|
||||||
/*
|
/*
|
||||||
|
|
@ -3802,10 +3802,9 @@ X86.opSALC = function()
|
||||||
X86.opXLAT = function()
|
X86.opXLAT = function()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* NOTE: I have no idea whether XLAT actually wraps the 16-bit address calculation;
|
* TODO: Verify whether XLAT wraps its address calculation....
|
||||||
* I'm masking it as if it does, but I need to run a test on real hardware to be sure.
|
|
||||||
*/
|
*/
|
||||||
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;
|
this.nStepCycles -= this.cycleCounts.nOpCyclesXLAT;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue