Changed GFX tracking stuff in M6502 m4 script to #defines instead of

embedding actual code.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2151 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2010-10-11 15:11:10 +00:00
parent 47f7be341e
commit 82bae93337
2 changed files with 74 additions and 50 deletions

View File

@ -14,7 +14,7 @@
// See the file "License.txt" for information on usage and redistribution of // See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: M6502.m4 2147 2010-10-11 00:44:25Z stephena $ // $Id: M6502.m4 2150 2010-10-11 14:51:48Z stephena $
//============================================================================ //============================================================================
/** /**
@ -24,13 +24,28 @@
'm4 M6502.m4 > M6502.ins' 'm4 M6502.m4 > M6502.ins'
@author Bradford W. Mott @author Bradford W. Mott
@version $Id: M6502.m4 2147 2010-10-11 00:44:25Z stephena $ @version $Id: M6502.m4 2150 2010-10-11 14:51:48Z stephena $
*/ */
#ifndef NOTSAMEPAGE #ifndef NOTSAMEPAGE
#define NOTSAMEPAGE(_addr1, _addr2) (((_addr1) ^ (_addr2)) & 0xff00) #define NOTSAMEPAGE(_addr1, _addr2) (((_addr1) ^ (_addr2)) & 0xff00)
#endif #endif
#ifndef SET_LAST_PEEK
#define SET_LAST_PEEK(_addr) _addr = intermediateAddress;
#endif
#ifndef CLEAR_LAST_PEEK
#define CLEAR_LAST_PEEK(_addr) _addr = 0;
#endif
#ifndef CHECK_GFX_WRITE
#define CHECK_GFX_WRITE(_addr) \
if((operandAddress == 0x1B || operandAddress == 0x1C) && _addr) \
mySystem->setAddressDisasmType(_addr, DISASM_GFX);
#endif
@ -2223,7 +2238,7 @@ case 0xa9:
{ {
operand = peek(PC++, DISASM_DATA); operand = peek(PC++, DISASM_DATA);
} }
myLastPeekAddressA = 0; CLEAR_LAST_PEEK(myLastPeekAddressA)
{ {
A = operand; A = operand;
notZ = A; notZ = A;
@ -2235,7 +2250,7 @@ case 0xa5:
{ {
operand = peek(peek(PC++, DISASM_CODE), DISASM_DATA); operand = peek(peek(PC++, DISASM_CODE), DISASM_DATA);
} }
myLastPeekAddressA = 0; CLEAR_LAST_PEEK(myLastPeekAddressA)
{ {
A = operand; A = operand;
notZ = A; notZ = A;
@ -2250,7 +2265,7 @@ case 0xb5:
address += X; address += X;
operand = peek(address, DISASM_DATA); operand = peek(address, DISASM_DATA);
} }
myLastPeekAddressA = 0; CLEAR_LAST_PEEK(myLastPeekAddressA)
{ {
A = operand; A = operand;
notZ = A; notZ = A;
@ -2264,7 +2279,7 @@ case 0xad:
intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8); intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8);
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
{ {
A = operand; A = operand;
notZ = A; notZ = A;
@ -2284,7 +2299,7 @@ case 0xbd:
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
} }
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
{ {
A = operand; A = operand;
notZ = A; notZ = A;
@ -2304,7 +2319,7 @@ case 0xb9:
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
} }
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
{ {
A = operand; A = operand;
notZ = A; notZ = A;
@ -2321,7 +2336,7 @@ case 0xa1:
intermediateAddress |= ((uInt16)peek(pointer, DISASM_DATA) << 8); intermediateAddress |= ((uInt16)peek(pointer, DISASM_DATA) << 8);
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
{ {
A = operand; A = operand;
notZ = A; notZ = A;
@ -2342,7 +2357,7 @@ case 0xb1:
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
} }
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
{ {
A = operand; A = operand;
notZ = A; notZ = A;
@ -2358,7 +2373,7 @@ case 0xa2:
{ {
operand = peek(PC++, DISASM_DATA); operand = peek(PC++, DISASM_DATA);
} }
myLastPeekAddressX = 0; CLEAR_LAST_PEEK(myLastPeekAddressX)
{ {
X = operand; X = operand;
notZ = X; notZ = X;
@ -2370,7 +2385,7 @@ case 0xa6:
{ {
operand = peek(peek(PC++, DISASM_CODE), DISASM_DATA); operand = peek(peek(PC++, DISASM_CODE), DISASM_DATA);
} }
myLastPeekAddressX = 0; CLEAR_LAST_PEEK(myLastPeekAddressX)
{ {
X = operand; X = operand;
notZ = X; notZ = X;
@ -2385,7 +2400,7 @@ case 0xb6:
address += Y; address += Y;
operand = peek(address, DISASM_DATA); operand = peek(address, DISASM_DATA);
} }
myLastPeekAddressX = 0; CLEAR_LAST_PEEK(myLastPeekAddressX)
{ {
X = operand; X = operand;
notZ = X; notZ = X;
@ -2399,7 +2414,7 @@ case 0xae:
intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8); intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8);
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
myLastPeekAddressX = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressX)
{ {
X = operand; X = operand;
notZ = X; notZ = X;
@ -2419,7 +2434,7 @@ case 0xbe:
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
} }
myLastPeekAddressX = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressX)
{ {
X = operand; X = operand;
notZ = X; notZ = X;
@ -2435,7 +2450,7 @@ case 0xa0:
{ {
operand = peek(PC++, DISASM_DATA); operand = peek(PC++, DISASM_DATA);
} }
myLastPeekAddressY = 0; CLEAR_LAST_PEEK(myLastPeekAddressY)
{ {
Y = operand; Y = operand;
notZ = Y; notZ = Y;
@ -2447,7 +2462,7 @@ case 0xa4:
{ {
operand = peek(peek(PC++, DISASM_CODE), DISASM_DATA); operand = peek(peek(PC++, DISASM_CODE), DISASM_DATA);
} }
myLastPeekAddressY = 0; CLEAR_LAST_PEEK(myLastPeekAddressY)
{ {
Y = operand; Y = operand;
notZ = Y; notZ = Y;
@ -2462,7 +2477,7 @@ case 0xb4:
address += X; address += X;
operand = peek(address, DISASM_DATA); operand = peek(address, DISASM_DATA);
} }
myLastPeekAddressY = 0; CLEAR_LAST_PEEK(myLastPeekAddressY)
{ {
Y = operand; Y = operand;
notZ = Y; notZ = Y;
@ -2476,7 +2491,7 @@ case 0xac:
intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8); intermediateAddress |= ((uInt16)peek(PC++, DISASM_CODE) << 8);
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
myLastPeekAddressY = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressY)
{ {
Y = operand; Y = operand;
notZ = Y; notZ = Y;
@ -2496,7 +2511,7 @@ case 0xbc:
operand = peek(intermediateAddress, DISASM_DATA); operand = peek(intermediateAddress, DISASM_DATA);
} }
} }
myLastPeekAddressY = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressY)
{ {
Y = operand; Y = operand;
notZ = Y; notZ = Y;
@ -4354,8 +4369,7 @@ case 0x85:
{ {
operandAddress = peek(PC++, DISASM_CODE); operandAddress = peek(PC++, DISASM_CODE);
} }
if((operandAddress == 0x1B || operandAddress == 0x1C) && myLastPeekAddressA) CHECK_GFX_WRITE(myLastPeekAddressA)
mySystem->setAddressDisasmType(myLastPeekAddressA, DISASM_GFX);
{ {
poke(operandAddress, A); poke(operandAddress, A);
} }
@ -4440,8 +4454,7 @@ case 0x86:
{ {
operandAddress = peek(PC++, DISASM_CODE); operandAddress = peek(PC++, DISASM_CODE);
} }
if((operandAddress == 0x1B || operandAddress == 0x1C) && myLastPeekAddressX) CHECK_GFX_WRITE(myLastPeekAddressX)
mySystem->setAddressDisasmType(myLastPeekAddressX, DISASM_GFX);
{ {
poke(operandAddress, X); poke(operandAddress, X);
} }
@ -4476,8 +4489,7 @@ case 0x84:
{ {
operandAddress = peek(PC++, DISASM_CODE); operandAddress = peek(PC++, DISASM_CODE);
} }
if((operandAddress == 0x1B || operandAddress == 0x1C) && myLastPeekAddressY) CHECK_GFX_WRITE(myLastPeekAddressY)
mySystem->setAddressDisasmType(myLastPeekAddressY, DISASM_GFX);
{ {
poke(operandAddress, Y); poke(operandAddress, Y);
} }

View File

@ -31,6 +31,21 @@
#define NOTSAMEPAGE(_addr1, _addr2) (((_addr1) ^ (_addr2)) & 0xff00) #define NOTSAMEPAGE(_addr1, _addr2) (((_addr1) ^ (_addr2)) & 0xff00)
#endif #endif
#ifndef SET_LAST_PEEK
#define SET_LAST_PEEK(_addr) _addr = intermediateAddress;
#endif
#ifndef CLEAR_LAST_PEEK
#define CLEAR_LAST_PEEK(_addr) _addr = 0;
#endif
#ifndef CHECK_GFX_WRITE
#define CHECK_GFX_WRITE(_addr) \
if((operandAddress == 0x1B || operandAddress == 0x1C) && _addr) \
mySystem->setAddressDisasmType(_addr, DISASM_GFX);
#endif
define(M6502_IMPLIED, `{ define(M6502_IMPLIED, `{
peek(PC, DISASM_NONE); peek(PC, DISASM_NONE);
}') }')
@ -1504,49 +1519,49 @@ break;
// LDA // LDA
case 0xa9: case 0xa9:
M6502_IMMEDIATE_READ M6502_IMMEDIATE_READ
myLastPeekAddressA = 0; CLEAR_LAST_PEEK(myLastPeekAddressA)
M6502_LDA M6502_LDA
break; break;
case 0xa5: case 0xa5:
M6502_ZERO_READ M6502_ZERO_READ
myLastPeekAddressA = 0; CLEAR_LAST_PEEK(myLastPeekAddressA)
M6502_LDA M6502_LDA
break; break;
case 0xb5: case 0xb5:
M6502_ZEROX_READ M6502_ZEROX_READ
myLastPeekAddressA = 0; CLEAR_LAST_PEEK(myLastPeekAddressA)
M6502_LDA M6502_LDA
break; break;
case 0xad: case 0xad:
M6502_ABSOLUTE_READ M6502_ABSOLUTE_READ
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
M6502_LDA M6502_LDA
break; break;
case 0xbd: case 0xbd:
M6502_ABSOLUTEX_READ M6502_ABSOLUTEX_READ
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
M6502_LDA M6502_LDA
break; break;
case 0xb9: case 0xb9:
M6502_ABSOLUTEY_READ M6502_ABSOLUTEY_READ
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
M6502_LDA M6502_LDA
break; break;
case 0xa1: case 0xa1:
M6502_INDIRECTX_READ M6502_INDIRECTX_READ
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
M6502_LDA M6502_LDA
break; break;
case 0xb1: case 0xb1:
M6502_INDIRECTY_READ M6502_INDIRECTY_READ
myLastPeekAddressA = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressA)
M6502_LDA M6502_LDA
break; break;
////////////////////////////////////////////////// //////////////////////////////////////////////////
@ -1556,31 +1571,31 @@ break;
// LDX // LDX
case 0xa2: case 0xa2:
M6502_IMMEDIATE_READ M6502_IMMEDIATE_READ
myLastPeekAddressX = 0; CLEAR_LAST_PEEK(myLastPeekAddressX)
M6502_LDX M6502_LDX
break; break;
case 0xa6: case 0xa6:
M6502_ZERO_READ M6502_ZERO_READ
myLastPeekAddressX = 0; CLEAR_LAST_PEEK(myLastPeekAddressX)
M6502_LDX M6502_LDX
break; break;
case 0xb6: case 0xb6:
M6502_ZEROY_READ M6502_ZEROY_READ
myLastPeekAddressX = 0; CLEAR_LAST_PEEK(myLastPeekAddressX)
M6502_LDX M6502_LDX
break; break;
case 0xae: case 0xae:
M6502_ABSOLUTE_READ M6502_ABSOLUTE_READ
myLastPeekAddressX = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressX)
M6502_LDX M6502_LDX
break; break;
case 0xbe: case 0xbe:
M6502_ABSOLUTEY_READ M6502_ABSOLUTEY_READ
myLastPeekAddressX = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressX)
M6502_LDX M6502_LDX
break; break;
////////////////////////////////////////////////// //////////////////////////////////////////////////
@ -1590,31 +1605,31 @@ break;
// LDY // LDY
case 0xa0: case 0xa0:
M6502_IMMEDIATE_READ M6502_IMMEDIATE_READ
myLastPeekAddressY = 0; CLEAR_LAST_PEEK(myLastPeekAddressY)
M6502_LDY M6502_LDY
break; break;
case 0xa4: case 0xa4:
M6502_ZERO_READ M6502_ZERO_READ
myLastPeekAddressY = 0; CLEAR_LAST_PEEK(myLastPeekAddressY)
M6502_LDY M6502_LDY
break; break;
case 0xb4: case 0xb4:
M6502_ZEROX_READ M6502_ZEROX_READ
myLastPeekAddressY = 0; CLEAR_LAST_PEEK(myLastPeekAddressY)
M6502_LDY M6502_LDY
break; break;
case 0xac: case 0xac:
M6502_ABSOLUTE_READ M6502_ABSOLUTE_READ
myLastPeekAddressY = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressY)
M6502_LDY M6502_LDY
break; break;
case 0xbc: case 0xbc:
M6502_ABSOLUTEX_READ M6502_ABSOLUTEX_READ
myLastPeekAddressY = intermediateAddress; SET_LAST_PEEK(myLastPeekAddressY)
M6502_LDY M6502_LDY
break; break;
////////////////////////////////////////////////// //////////////////////////////////////////////////
@ -2100,8 +2115,7 @@ break;
// STA // STA
case 0x85: case 0x85:
M6502_ZERO_WRITE M6502_ZERO_WRITE
if((operandAddress == 0x1B || operandAddress == 0x1C) && myLastPeekAddressA) CHECK_GFX_WRITE(myLastPeekAddressA)
mySystem->setAddressDisasmType(myLastPeekAddressA, DISASM_GFX);
M6502_STA M6502_STA
break; break;
@ -2141,8 +2155,7 @@ break;
// STX // STX
case 0x86: case 0x86:
M6502_ZERO_WRITE M6502_ZERO_WRITE
if((operandAddress == 0x1B || operandAddress == 0x1C) && myLastPeekAddressX) CHECK_GFX_WRITE(myLastPeekAddressX)
mySystem->setAddressDisasmType(myLastPeekAddressX, DISASM_GFX);
M6502_STX M6502_STX
break; break;
@ -2162,8 +2175,7 @@ break;
// STY // STY
case 0x84: case 0x84:
M6502_ZERO_WRITE M6502_ZERO_WRITE
if((operandAddress == 0x1B || operandAddress == 0x1C) && myLastPeekAddressY) CHECK_GFX_WRITE(myLastPeekAddressY)
mySystem->setAddressDisasmType(myLastPeekAddressY, DISASM_GFX);
M6502_STY M6502_STY
break; break;