--- processors/6502.c.sav 2007-11-29 08:56:32.000000000 -0500 +++ processors/6502.c 2007-11-29 08:58:43.000000000 -0500 @@ -28,39 +28,41 @@ // enumerated addressing modes -#define OT_IMPLIED 0 // no operands -#define OT_IMMEDIATE 1 // #xx -#define OT_ZP 2 // xx -#define OT_ZP_OFF_X 3 // xx,X -#define OT_ZP_OFF_Y 4 // xx,Y +#define OT_IMPLIED 0 // no operands +#define OT_IMMEDIATE 1 // #xx +#define OT_ZP 2 // xx +#define OT_ZP_OFF_X 3 // xx,X +#define OT_ZP_OFF_Y 4 // xx,Y #define OT_ZP_INDIRECT_OFF_X 5 // (xx,X) #define OT_ZP_INDIRECT_OFF_Y 6 // (xx),Y -#define OT_ZP_INDIRECT 7 // (xx) -#define OT_EXTENDED 8 // xxxx -#define OT_EXTENDED_OFF_X 9 // xxxx,X -#define OT_EXTENDED_OFF_Y 10 // xxxx,Y +#define OT_ZP_INDIRECT 7 // (xx) +#define OT_EXTENDED 8 // xxxx +#define OT_EXTENDED_OFF_X 9 // xxxx,X +#define OT_EXTENDED_OFF_Y 10 // xxxx,Y #define OT_EXTENDED_INDIRECT 11 // (xxxx) -#define OT_RELATIVE 12 // one byte relative offset -#define OT_IMPLIED_2 13 // two-byte implied opcode (second byte is ignored) +#define OT_RELATIVE 12 // one byte relative offset +#define OT_IMPLIED_2 13 // two-byte implied opcode (second byte is ignored) +#define OT_ZP_RELATIVE 14 // xx, relative offset -#define OT_NUM OT_IMPLIED_2+1 // number of addressing modes +#define OT_NUM OT_ZP_RELATIVE+1 // number of addressing modes // masks for the various addressing modes -#define M_IMPLIED (1<typeMask&M_ZP_RELATIVE) + { + CheckUnsignedByteRange(value,true,true); + if(GenerateByte(opcode->baseOpcode[OT_ZP_RELATIVE],listingRecord)) + { + fail=!GenerateByte(value,listingRecord); + offset=0; + + if(!unresolved2&¤tSegment) + { + offset=value2-(currentSegment->currentPC+currentSegment->codeGenOffset)-1; + Check8RelativeRange(offset,true,true); + } + fail=!GenerateByte(offset,listingRecord); + } + else + { + fail=true; + } + + } + else + { + ReportBadOperands(); + } + return(!fail); +} + + static OPCODE *MatchOpcode(const char *string) // match opcodes for this processor, return NULL if none matched { @@ -909,9 +991,9 @@ unsigned int elementType; int - value; + value, value2; bool - unresolved; + unresolved, unresolved2; result=true; // no hard failure yet *success=false; // no match yet @@ -924,7 +1006,7 @@ *success=true; if(!ParseComment(line,lineIndex)) { - if(ParseOperand(line,lineIndex,&elementType,&value,&unresolved)) + if(ParseOperand(line,lineIndex,&elementType,&value,&value2,&unresolved,&unresolved2)) { switch(elementType) { @@ -949,6 +1031,9 @@ case POT_ZP_INDIRECT_OFF_Y: result=HandleIndirectOffY(opcode,value,unresolved,listingRecord); break; + case POT_ZP_RELATIVE: + result=HandleZeroPageRelative(opcode,value,value2,unresolved,unresolved2,listingRecord); + break; } } else