Added CPU register tracking for illegal opcodes LAX, TAX, TAY, TXA, and TYA.

Still TODO is add support for PHA, PHP, PLA and PLP, and to somehow track
accesses that are stored in zero-page RAM first.  These latter items may
end up being pushed after the 3.3 release.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2175 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2010-11-08 22:25:19 +00:00
parent 14d1c17acc
commit c319e2ba82
2 changed files with 90 additions and 38 deletions

View File

@ -33,9 +33,9 @@
#ifndef SET_LAST_PEEK
#ifdef DEBUGGER_SUPPORT
#define SET_LAST_PEEK(_addr) _addr = intermediateAddress;
#define SET_LAST_PEEK(_addr1, _addr2) _addr1 = _addr2;
#else
#define SET_LAST_PEEK(_addr)
#define SET_LAST_PEEK(_addr1, _addr2)
#endif
#endif
@ -2149,12 +2149,16 @@ case 0xbb:
break;
//////////////////////////////////////////////////
// LAX
case 0xaf:
{
intermediateAddress = peek(PC++, DISASM_CODE);
intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
{
A = operand;
X = operand;
@ -2175,6 +2179,8 @@ case 0xbf:
operand = peek(intermediateAddress, DISASM_DATA);
}
}
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
{
A = operand;
X = operand;
@ -2188,6 +2194,8 @@ case 0xa7:
intermediateAddress = peek(PC++, DISASM_CODE);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
{
A = operand;
X = operand;
@ -2203,6 +2211,8 @@ case 0xb7:
intermediateAddress += Y;
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress) // TODO - check this
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
{
A = operand;
X = operand;
@ -2220,6 +2230,8 @@ case 0xa3:
intermediateAddress |= ((uInt16)peek(pointer, DISASM_DATA) << 8);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress) // TODO - check this
{
A = operand;
X = operand;
@ -2241,6 +2253,8 @@ case 0xb3:
operand = peek(intermediateAddress, DISASM_DATA);
}
}
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress) // TODO - check this
{
A = operand;
X = operand;
@ -2248,6 +2262,7 @@ case 0xb3:
N = A & 0x80;
}
break;
//////////////////////////////////////////////////
//////////////////////////////////////////////////
@ -2269,7 +2284,7 @@ case 0xa5:
intermediateAddress = peek(PC++, DISASM_CODE);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
{
A = operand;
notZ = A;
@ -2284,7 +2299,7 @@ case 0xb5:
intermediateAddress += X;
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
{
A = operand;
notZ = A;
@ -2298,7 +2313,7 @@ case 0xad:
intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
{
A = operand;
notZ = A;
@ -2318,7 +2333,7 @@ case 0xbd:
operand = peek(intermediateAddress, DISASM_DATA);
}
}
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
{
A = operand;
notZ = A;
@ -2338,7 +2353,7 @@ case 0xb9:
operand = peek(intermediateAddress, DISASM_DATA);
}
}
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
{
A = operand;
notZ = A;
@ -2355,7 +2370,7 @@ case 0xa1:
intermediateAddress |= ((uInt16)peek(pointer, DISASM_DATA) << 8);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
{
A = operand;
notZ = A;
@ -2376,7 +2391,7 @@ case 0xb1:
operand = peek(intermediateAddress, DISASM_DATA);
}
}
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
{
A = operand;
notZ = A;
@ -2405,7 +2420,7 @@ case 0xa6:
intermediateAddress = peek(PC++, DISASM_CODE);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressX)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
{
X = operand;
notZ = X;
@ -2420,7 +2435,7 @@ case 0xb6:
intermediateAddress += Y;
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressX)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
{
X = operand;
notZ = X;
@ -2434,7 +2449,7 @@ case 0xae:
intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressX)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
{
X = operand;
notZ = X;
@ -2454,7 +2469,7 @@ case 0xbe:
operand = peek(intermediateAddress, DISASM_DATA);
}
}
SET_LAST_PEEK(myLastSrcAddressX)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
{
X = operand;
notZ = X;
@ -2483,7 +2498,7 @@ case 0xa4:
intermediateAddress = peek(PC++, DISASM_CODE);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressY)
SET_LAST_PEEK(myLastSrcAddressY, intermediateAddress)
{
Y = operand;
notZ = Y;
@ -2498,7 +2513,7 @@ case 0xb4:
intermediateAddress += X;
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressY)
SET_LAST_PEEK(myLastSrcAddressY, intermediateAddress)
{
Y = operand;
notZ = Y;
@ -2512,7 +2527,7 @@ case 0xac:
intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8);
operand = peek(intermediateAddress, DISASM_DATA);
}
SET_LAST_PEEK(myLastSrcAddressY)
SET_LAST_PEEK(myLastSrcAddressY, intermediateAddress)
{
Y = operand;
notZ = Y;
@ -2532,7 +2547,7 @@ case 0xbc:
operand = peek(intermediateAddress, DISASM_DATA);
}
}
SET_LAST_PEEK(myLastSrcAddressY)
SET_LAST_PEEK(myLastSrcAddressY, intermediateAddress)
{
Y = operand;
notZ = Y;
@ -2866,6 +2881,7 @@ case 0x48:
{
peek(PC, DISASM_NONE);
}
// TODO - add tracking for this opcode
{
poke(0x0100 + SP--, A);
}
@ -2876,6 +2892,7 @@ case 0x08:
{
peek(PC, DISASM_NONE);
}
// TODO - add tracking for this opcode
{
poke(0x0100 + SP--, PS());
}
@ -2886,6 +2903,7 @@ case 0x68:
{
peek(PC, DISASM_NONE);
}
// TODO - add tracking for this opcode
{
peek(0x0100 + SP++, DISASM_NONE);
A = peek(0x0100 + SP, DISASM_NONE);
@ -2899,6 +2917,7 @@ case 0x28:
{
peek(PC, DISASM_NONE);
}
// TODO - add tracking for this opcode
{
peek(0x0100 + SP++, DISASM_NONE);
PS(peek(0x0100 + SP, DISASM_NONE));
@ -4542,10 +4561,13 @@ break;
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// Remaining MOVE opcodes
case 0xaa:
{
peek(PC, DISASM_NONE);
}
SET_LAST_PEEK(myLastSrcAddressX, myLastSrcAddressA)
{
X = A;
notZ = X;
@ -4558,6 +4580,7 @@ case 0xa8:
{
peek(PC, DISASM_NONE);
}
SET_LAST_PEEK(myLastSrcAddressY, myLastSrcAddressA)
{
Y = A;
notZ = Y;
@ -4570,6 +4593,7 @@ case 0xba:
{
peek(PC, DISASM_NONE);
}
// TODO - add tracking for this opcode
{
X = SP;
notZ = X;
@ -4582,6 +4606,7 @@ case 0x8a:
{
peek(PC, DISASM_NONE);
}
SET_LAST_PEEK(myLastSrcAddressA, myLastSrcAddressX)
{
A = X;
notZ = A;
@ -4594,6 +4619,7 @@ case 0x9a:
{
peek(PC, DISASM_NONE);
}
// TODO - add tracking for this opcode
{
SP = X;
}
@ -4604,11 +4630,11 @@ case 0x98:
{
peek(PC, DISASM_NONE);
}
SET_LAST_PEEK(myLastSrcAddressA, myLastSrcAddressY)
{
A = Y;
notZ = A;
N = A & 0x80;
}
break;
//////////////////////////////////////////////////

View File

@ -33,9 +33,9 @@
#ifndef SET_LAST_PEEK
#ifdef DEBUGGER_SUPPORT
#define SET_LAST_PEEK(_addr) _addr = intermediateAddress;
#define SET_LAST_PEEK(_addr1, _addr2) _addr1 = _addr2;
#else
#define SET_LAST_PEEK(_addr)
#define SET_LAST_PEEK(_addr1, _addr2)
#endif
#endif
@ -1495,35 +1495,50 @@ M6502_LAS
break;
//////////////////////////////////////////////////
// LAX
case 0xaf:
M6502_ABSOLUTE_READ
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
M6502_LAX
break;
case 0xbf:
M6502_ABSOLUTEY_READ
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
M6502_LAX
break;
case 0xa7:
M6502_ZERO_READ
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
M6502_LAX
break;
case 0xb7:
M6502_ZEROY_READ
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress) // TODO - check this
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
M6502_LAX
break;
case 0xa3:
M6502_INDIRECTX_READ
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress) // TODO - check this
M6502_LAX
break;
case 0xb3:
M6502_INDIRECTY_READ
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress) // TODO - check this
M6502_LAX
break;
//////////////////////////////////////////////////
//////////////////////////////////////////////////
@ -1536,43 +1551,43 @@ break;
case 0xa5:
M6502_ZERO_READ
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
M6502_LDA
break;
case 0xb5:
M6502_ZEROX_READ
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
M6502_LDA
break;
case 0xad:
M6502_ABSOLUTE_READ
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
M6502_LDA
break;
case 0xbd:
M6502_ABSOLUTEX_READ
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
M6502_LDA
break;
case 0xb9:
M6502_ABSOLUTEY_READ
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
M6502_LDA
break;
case 0xa1:
M6502_INDIRECTX_READ
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
M6502_LDA
break;
case 0xb1:
M6502_INDIRECTY_READ
SET_LAST_PEEK(myLastSrcAddressA)
SET_LAST_PEEK(myLastSrcAddressA, intermediateAddress)
M6502_LDA
break;
//////////////////////////////////////////////////
@ -1588,25 +1603,25 @@ break;
case 0xa6:
M6502_ZERO_READ
SET_LAST_PEEK(myLastSrcAddressX)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
M6502_LDX
break;
case 0xb6:
M6502_ZEROY_READ
SET_LAST_PEEK(myLastSrcAddressX)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
M6502_LDX
break;
case 0xae:
M6502_ABSOLUTE_READ
SET_LAST_PEEK(myLastSrcAddressX)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
M6502_LDX
break;
case 0xbe:
M6502_ABSOLUTEY_READ
SET_LAST_PEEK(myLastSrcAddressX)
SET_LAST_PEEK(myLastSrcAddressX, intermediateAddress)
M6502_LDX
break;
//////////////////////////////////////////////////
@ -1622,25 +1637,25 @@ break;
case 0xa4:
M6502_ZERO_READ
SET_LAST_PEEK(myLastSrcAddressY)
SET_LAST_PEEK(myLastSrcAddressY, intermediateAddress)
M6502_LDY
break;
case 0xb4:
M6502_ZEROX_READ
SET_LAST_PEEK(myLastSrcAddressY)
SET_LAST_PEEK(myLastSrcAddressY, intermediateAddress)
M6502_LDY
break;
case 0xac:
M6502_ABSOLUTE_READ
SET_LAST_PEEK(myLastSrcAddressY)
SET_LAST_PEEK(myLastSrcAddressY, intermediateAddress)
M6502_LDY
break;
case 0xbc:
M6502_ABSOLUTEX_READ
SET_LAST_PEEK(myLastSrcAddressY)
SET_LAST_PEEK(myLastSrcAddressY, intermediateAddress)
M6502_LDY
break;
//////////////////////////////////////////////////
@ -1775,24 +1790,28 @@ break;
case 0x48:
M6502_IMPLIED
// TODO - add tracking for this opcode
M6502_PHA
break;
case 0x08:
M6502_IMPLIED
// TODO - add tracking for this opcode
M6502_PHP
break;
case 0x68:
M6502_IMPLIED
// TODO - add tracking for this opcode
M6502_PLA
break;
case 0x28:
M6502_IMPLIED
// TODO - add tracking for this opcode
M6502_PLP
break;
@ -2202,39 +2221,46 @@ break;
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// Remaining MOVE opcodes
case 0xaa:
M6502_IMPLIED
SET_LAST_PEEK(myLastSrcAddressX, myLastSrcAddressA)
M6502_TAX
break;
case 0xa8:
M6502_IMPLIED
SET_LAST_PEEK(myLastSrcAddressY, myLastSrcAddressA)
M6502_TAY
break;
case 0xba:
M6502_IMPLIED
// TODO - add tracking for this opcode
M6502_TSX
break;
case 0x8a:
M6502_IMPLIED
SET_LAST_PEEK(myLastSrcAddressA, myLastSrcAddressX)
M6502_TXA
break;
case 0x9a:
M6502_IMPLIED
// TODO - add tracking for this opcode
M6502_TXS
break;
case 0x98:
M6502_IMPLIED
SET_LAST_PEEK(myLastSrcAddressA, myLastSrcAddressY)
M6502_TYA
break;
//////////////////////////////////////////////////