added .IFM740 and .PM470, and while at it also .IFP02X and .P02X. Updated regression test to use these

This commit is contained in:
mrdudz
2025-06-16 22:55:58 +02:00
parent 0b74ae8c2d
commit 2e27ee1702
6 changed files with 142 additions and 89 deletions

View File

@@ -394,6 +394,16 @@ void DoConditionals (void)
CalcOverallIfCond (); CalcOverallIfCond ();
break; break;
case TOK_IFP02X:
D = AllocIf (".IFP02X", 1);
NextTok ();
if (IfCond) {
SetIfCond (D, GetCPU() == CPU_6502X);
}
ExpectSep ();
CalcOverallIfCond ();
break;
case TOK_IFP4510: case TOK_IFP4510:
D = AllocIf (".IFP4510", 1); D = AllocIf (".IFP4510", 1);
NextTok (); NextTok ();
@@ -495,6 +505,7 @@ int CheckConditionals (void)
case TOK_IFNDEF: case TOK_IFNDEF:
case TOK_IFNREF: case TOK_IFNREF:
case TOK_IFP02: case TOK_IFP02:
case TOK_IFP02X:
case TOK_IFP4510: case TOK_IFP4510:
case TOK_IFP816: case TOK_IFP816:
case TOK_IFPC02: case TOK_IFPC02:

View File

@@ -1562,6 +1562,14 @@ static void DoP02 (void)
static void DoP02X (void)
/* Switch to 6502X CPU */
{
SetCPU (CPU_6502X);
}
static void DoPC02 (void) static void DoPC02 (void)
/* Switch to 65C02 CPU */ /* Switch to 65C02 CPU */
{ {
@@ -1594,6 +1602,14 @@ static void DoPDTV (void)
static void DoPM740 (void)
/* Switch to M740 CPU */
{
SetCPU (CPU_M740);
}
static void DoPageLength (void) static void DoPageLength (void)
/* Set the page length for the listing */ /* Set the page length for the listing */
{ {
@@ -2057,70 +2073,72 @@ struct CtrlDesc {
void (*Handler) (void); /* Command handler */ void (*Handler) (void); /* Command handler */
}; };
/* NOTE: .AND, .BITAND, .BITNOT, .BITOR, .BITXOR, .MOD, .NOT, .OR, .SHL, .SHR
and .XOR do NOT go into this table */
#define PSEUDO_COUNT (sizeof (CtrlCmdTab) / sizeof (CtrlCmdTab [0])) #define PSEUDO_COUNT (sizeof (CtrlCmdTab) / sizeof (CtrlCmdTab [0]))
static CtrlDesc CtrlCmdTab [] = { static CtrlDesc CtrlCmdTab [] = {
{ ccNone, DoA16 }, { ccNone, DoA16 }, /* .A16 */
{ ccNone, DoA8 }, { ccNone, DoA8 }, /* .A8 */
{ ccNone, DoAddr }, /* .ADDR */ { ccNone, DoAddr }, /* .ADDR */
{ ccNone, DoUnexpected }, /* .ADDRSIZE */ { ccNone, DoUnexpected }, /* .ADDRSIZE */
{ ccNone, DoAlign }, { ccNone, DoAlign }, /* .ALIGN */
{ ccNone, DoASCIIZ }, { ccNone, DoASCIIZ }, /* .ASCIIZ */
{ ccNone, DoUnexpected }, /* .ASIZE */ { ccNone, DoUnexpected }, /* .ASIZE */
{ ccNone, DoAssert }, { ccNone, DoAssert }, /* .ASSERT */
{ ccNone, DoAutoImport }, { ccNone, DoAutoImport }, /* .AUTOIMPORT */
{ ccNone, DoUnexpected }, /* .BANK */ { ccNone, DoUnexpected }, /* .BANK */
{ ccNone, DoUnexpected }, /* .BANKBYTE */ { ccNone, DoUnexpected }, /* .BANKBYTE */
{ ccNone, DoBankBytes }, { ccNone, DoBankBytes }, /* .BANKBYTES */
{ ccNone, DoUnexpected }, /* .BLANK */ { ccNone, DoUnexpected }, /* .BLANK */
{ ccNone, DoBss }, { ccNone, DoBss }, /* .BSS */
{ ccNone, DoByte }, { ccNone, DoByte }, /* .BYT, .BYTE */
{ ccNone, DoCase }, { ccNone, DoCase }, /* .CASE */
{ ccNone, DoCharMap }, { ccNone, DoCharMap }, /* .CHARMAP */
{ ccNone, DoCode }, { ccNone, DoCode }, /* .CODE */
{ ccNone, DoUnexpected, }, /* .CONCAT */ { ccNone, DoUnexpected, }, /* .CONCAT */
{ ccNone, DoConDes }, { ccNone, DoConDes }, /* .CONDES */
{ ccNone, DoUnexpected }, /* .CONST */ { ccNone, DoUnexpected }, /* .CONST */
{ ccNone, DoConstructor }, { ccNone, DoConstructor }, /* .CONSTRUCTOR */
{ ccNone, DoUnexpected }, /* .CPU */ { ccNone, DoUnexpected }, /* .CPU */
{ ccNone, DoData }, { ccNone, DoData }, /* .DATA */
{ ccNone, DoDbg, }, { ccNone, DoDbg, }, /* .DBG */
{ ccNone, DoDByt }, { ccNone, DoDByt }, /* .DBYT */
{ ccNone, DoDebugInfo }, { ccNone, DoDebugInfo }, /* .DEBUGINFO */
{ ccKeepToken, DoDefine }, { ccKeepToken, DoDefine }, /* .DEF, .DEFINE */
{ ccNone, DoUnexpected }, /* .DEFINED */ { ccNone, DoUnexpected }, /* .DEFINED */
{ ccNone, DoUnexpected }, /* .DEFINEDMACRO */ { ccNone, DoUnexpected }, /* .DEFINEDMACRO */
{ ccNone, DoDelMac }, { ccNone, DoDelMac }, /* .DELMAC, .DELMACRO */
{ ccNone, DoDestructor }, { ccNone, DoDestructor }, /* .DESTRUCTOR */
{ ccNone, DoDWord }, { ccNone, DoDWord }, /* .DWORD */
{ ccKeepToken, DoConditionals }, /* .ELSE */ { ccKeepToken, DoConditionals }, /* .ELSE */
{ ccKeepToken, DoConditionals }, /* .ELSEIF */ { ccKeepToken, DoConditionals }, /* .ELSEIF */
{ ccKeepToken, DoEnd }, { ccKeepToken, DoEnd }, /* .END */
{ ccNone, DoUnexpected }, /* .ENDENUM */ { ccNone, DoUnexpected }, /* .ENDENUM */
{ ccKeepToken, DoConditionals }, /* .ENDIF */ { ccKeepToken, DoConditionals }, /* .ENDIF */
{ ccNone, DoUnexpected }, /* .ENDMACRO */ { ccNone, DoUnexpected }, /* .ENDMAC, .ENDMACRO */
{ ccNone, DoEndProc }, { ccNone, DoEndProc }, /* .ENDPROC */
{ ccNone, DoUnexpected }, /* .ENDREPEAT */ { ccNone, DoUnexpected }, /* .ENDREP, .ENDREPEAT */
{ ccNone, DoEndScope }, { ccNone, DoEndScope }, /* .ENDSCOPE */
{ ccNone, DoUnexpected }, /* .ENDSTRUCT */ { ccNone, DoUnexpected }, /* .ENDSTRUCT */
{ ccNone, DoUnexpected }, /* .ENDUNION */ { ccNone, DoUnexpected }, /* .ENDUNION */
{ ccNone, DoEnum }, { ccNone, DoEnum }, /* .ENUM */
{ ccNone, DoError }, { ccNone, DoError }, /* .ERROR */
{ ccNone, DoExitMacro }, { ccNone, DoExitMacro }, /* .EXITMAC, .EXITMACRO */
{ ccNone, DoExport }, { ccNone, DoExport }, /* .EXPORT */
{ ccNone, DoExportZP }, { ccNone, DoExportZP }, /* .EXPORTZP */
{ ccNone, DoFarAddr }, { ccNone, DoFarAddr }, /* .FARADDR */
{ ccNone, DoFatal }, { ccNone, DoFatal }, /* .FATAL */
{ ccNone, DoFeature }, { ccNone, DoFeature }, /* .FEATURE */
{ ccNone, DoFileOpt }, { ccNone, DoFileOpt }, /* .FOPT, .FILEOPT */
{ ccNone, DoForceImport }, { ccNone, DoForceImport }, /* .FORCEIMPORT */
{ ccNone, DoUnexpected }, /* .FORCEWORD */ { ccNone, DoUnexpected }, /* .FORCEWORD */
{ ccNone, DoGlobal }, { ccNone, DoGlobal }, /* .GLOBAL */
{ ccNone, DoGlobalZP }, { ccNone, DoGlobalZP }, /* .GLOBALZP */
{ ccNone, DoUnexpected }, /* .HIBYTE */ { ccNone, DoUnexpected }, /* .HIBYTE */
{ ccNone, DoHiBytes }, { ccNone, DoHiBytes }, /* .HIBYTES */
{ ccNone, DoUnexpected }, /* .HIWORD */ { ccNone, DoUnexpected }, /* .HIWORD */
{ ccNone, DoI16 }, { ccNone, DoI16 }, /* .I16 */
{ ccNone, DoI8 }, { ccNone, DoI8 }, /* .I8 */
{ ccNone, DoUnexpected }, /* .IDENT */ { ccNone, DoUnexpected }, /* .IDENT */
{ ccKeepToken, DoConditionals }, /* .IF */ { ccKeepToken, DoConditionals }, /* .IF */
{ ccKeepToken, DoConditionals }, /* .IFBLANK */ { ccKeepToken, DoConditionals }, /* .IFBLANK */
@@ -2131,6 +2149,7 @@ static CtrlDesc CtrlCmdTab [] = {
{ ccKeepToken, DoConditionals }, /* .IFNDEF */ { ccKeepToken, DoConditionals }, /* .IFNDEF */
{ ccKeepToken, DoConditionals }, /* .IFNREF */ { ccKeepToken, DoConditionals }, /* .IFNREF */
{ ccKeepToken, DoConditionals }, /* .IFP02 */ { ccKeepToken, DoConditionals }, /* .IFP02 */
{ ccKeepToken, DoConditionals }, /* .IFP02X */
{ ccKeepToken, DoConditionals }, /* .IFP4510 */ { ccKeepToken, DoConditionals }, /* .IFP4510 */
{ ccKeepToken, DoConditionals }, /* .IFP816 */ { ccKeepToken, DoConditionals }, /* .IFP816 */
{ ccKeepToken, DoConditionals }, /* .IFPC02 */ { ccKeepToken, DoConditionals }, /* .IFPC02 */
@@ -2138,75 +2157,77 @@ static CtrlDesc CtrlCmdTab [] = {
{ ccKeepToken, DoConditionals }, /* .IFPM740 */ { ccKeepToken, DoConditionals }, /* .IFPM740 */
{ ccKeepToken, DoConditionals }, /* .IFPSC02 */ { ccKeepToken, DoConditionals }, /* .IFPSC02 */
{ ccKeepToken, DoConditionals }, /* .IFREF */ { ccKeepToken, DoConditionals }, /* .IFREF */
{ ccNone, DoImport }, { ccNone, DoImport }, /* .IMPORT */
{ ccNone, DoImportZP }, { ccNone, DoImportZP }, /* .IMPORTZP */
{ ccNone, DoIncBin }, { ccNone, DoIncBin }, /* .INCBIN */
{ ccNone, DoInclude }, { ccNone, DoInclude }, /* .INCLUDE */
{ ccNone, DoInterruptor }, { ccNone, DoInterruptor }, /* .INTERRUPTPOR */
{ ccNone, DoUnexpected }, /* .ISIZE */ { ccNone, DoUnexpected }, /* .ISIZE */
{ ccNone, DoUnexpected }, /* .ISMNEMONIC */ { ccNone, DoUnexpected }, /* .ISMNEMONIC */
{ ccNone, DoInvalid }, /* .LEFT */ { ccNone, DoInvalid }, /* .LEFT */
{ ccNone, DoLineCont }, { ccNone, DoLineCont }, /* .LINECONT */
{ ccNone, DoList }, { ccNone, DoList }, /* .LIST */
{ ccNone, DoListBytes }, { ccNone, DoListBytes }, /* .LISTBYTES */
{ ccNone, DoLiteral }, { ccNone, DoLiteral }, /* .LITERAL */
{ ccNone, DoUnexpected }, /* .LOBYTE */ { ccNone, DoUnexpected }, /* .LOBYTE */
{ ccNone, DoLoBytes }, { ccNone, DoLoBytes }, /* .LOBYTES */
{ ccNone, DoUnexpected }, /* .LOCAL */ { ccNone, DoUnexpected }, /* .LOCAL */
{ ccNone, DoLocalChar }, { ccNone, DoLocalChar }, /* .LOCALCHAR */
{ ccNone, DoUnexpected }, /* .LOWORD */ { ccNone, DoUnexpected }, /* .LOWORD */
{ ccNone, DoMacPack }, { ccNone, DoMacPack }, /* .MACPACK */
{ ccNone, DoMacro }, { ccNone, DoMacro }, /* .MAC, .MACRO */
{ ccNone, DoUnexpected }, /* .MATCH */ { ccNone, DoUnexpected }, /* .MATCH */
{ ccNone, DoUnexpected }, /* .MAX */ { ccNone, DoUnexpected }, /* .MAX */
{ ccNone, DoInvalid }, /* .MID */ { ccNone, DoInvalid }, /* .MID */
{ ccNone, DoUnexpected }, /* .MIN */ { ccNone, DoUnexpected }, /* .MIN */
{ ccNone, DoNull }, { ccNone, DoNull }, /* .NULL */
{ ccNone, DoOrg }, { ccNone, DoOrg }, /* .ORG */
{ ccNone, DoOut }, { ccNone, DoOut }, /* .OUT */
{ ccNone, DoP02 }, { ccNone, DoP02 }, /* .P02 */
{ ccNone, DoP4510 }, { ccNone, DoP02X }, /* .P02X */
{ ccNone, DoP816 }, { ccNone, DoP4510 }, /* .P4510 */
{ ccNone, DoPageLength }, { ccNone, DoP816 }, /* .P816 */
{ ccNone, DoPageLength }, /* .PAGELEN, .PAGELENGTH */
{ ccNone, DoUnexpected }, /* .PARAMCOUNT */ { ccNone, DoUnexpected }, /* .PARAMCOUNT */
{ ccNone, DoPC02 }, { ccNone, DoPC02 }, /* .PSC02 */
{ ccNone, DoPDTV }, { ccNone, DoPDTV }, /* .PDTV */
{ ccNone, DoPopCharmap }, { ccNone, DoPM740 }, /* .PM740 */
{ ccNone, DoPopCPU }, { ccNone, DoPopCharmap }, /* .POPCHARMAP */
{ ccNone, DoPopSeg }, { ccNone, DoPopCPU }, /* .POPCPU */
{ ccNone, DoProc }, { ccNone, DoPopSeg }, /* .POPSEG */
{ ccNone, DoPSC02 }, { ccNone, DoProc }, /* .PROC */
{ ccNone, DoPushCharmap }, { ccNone, DoPSC02 }, /* .PSC02 */
{ ccNone, DoPushCPU }, { ccNone, DoPushCharmap }, /* .PUSHCHARMAP */
{ ccNone, DoPushSeg }, { ccNone, DoPushCPU }, /* .PUSHCPU */
{ ccNone, DoUnexpected }, /* .REFERENCED */ { ccNone, DoPushSeg }, /* .PUSHSEG */
{ ccNone, DoReferTo }, /* .REFERTO */ { ccNone, DoUnexpected }, /* .REF, .REFERENCED */
{ ccNone, DoReloc }, { ccNone, DoReferTo }, /* .REFTO, .REFERTO */
{ ccNone, DoRepeat }, { ccNone, DoReloc }, /* .RELOC */
{ ccNone, DoRes }, { ccNone, DoRepeat }, /* .REPEAT */
{ ccNone, DoRes }, /* .RES */
{ ccNone, DoInvalid }, /* .RIGHT */ { ccNone, DoInvalid }, /* .RIGHT */
{ ccNone, DoROData }, { ccNone, DoROData }, /* .RODATA */
{ ccNone, DoScope }, { ccNone, DoScope }, /* .SCOPE */
{ ccNone, DoSegment }, { ccNone, DoSegment }, /* .SEGMENT */
{ ccNone, DoUnexpected }, /* .SET */ { ccNone, DoUnexpected }, /* .SET */
{ ccNone, DoSetCPU }, { ccNone, DoSetCPU }, /* .SETCPU */
{ ccNone, DoUnexpected }, /* .SIZEOF */ { ccNone, DoUnexpected }, /* .SIZEOF */
{ ccNone, DoSmart }, { ccNone, DoSmart }, /* .SMART */
{ ccNone, DoUnexpected }, /* .SPRINTF */ { ccNone, DoUnexpected }, /* .SPRINTF */
{ ccNone, DoUnexpected }, /* .STRAT */ { ccNone, DoUnexpected }, /* .STRAT */
{ ccNone, DoUnexpected }, /* .STRING */ { ccNone, DoUnexpected }, /* .STRING */
{ ccNone, DoUnexpected }, /* .STRLEN */ { ccNone, DoUnexpected }, /* .STRLEN */
{ ccNone, DoStruct }, { ccNone, DoStruct }, /* .STRUCT */
{ ccNone, DoTag }, { ccNone, DoTag }, /* .TAG */
{ ccNone, DoUnexpected }, /* .TCOUNT */ { ccNone, DoUnexpected }, /* .TCOUNT */
{ ccNone, DoUnexpected }, /* .TIME */ { ccNone, DoUnexpected }, /* .TIME */
{ ccKeepToken, DoUnDef }, { ccKeepToken, DoUnDef }, /* .UNDEF, .UNDEFINE */
{ ccNone, DoUnion }, { ccNone, DoUnion }, /* .UNION */
{ ccNone, DoUnexpected }, /* .VERSION */ { ccNone, DoUnexpected }, /* .VERSION */
{ ccNone, DoWarning }, { ccNone, DoWarning }, /* .WARNING */
{ ccNone, DoWord }, { ccNone, DoWord }, /* .WORD */
{ ccNone, DoUnexpected }, /* .XMATCH */ { ccNone, DoUnexpected }, /* .XMATCH */
{ ccNone, DoZeropage }, { ccNone, DoZeropage }, /* .ZEROPAGE */
}; };

View File

@@ -221,6 +221,7 @@ struct DotKeyword {
{ ".IFNDEF", TOK_IFNDEF }, { ".IFNDEF", TOK_IFNDEF },
{ ".IFNREF", TOK_IFNREF }, { ".IFNREF", TOK_IFNREF },
{ ".IFP02", TOK_IFP02 }, { ".IFP02", TOK_IFP02 },
{ ".IFP02X", TOK_IFP02X },
{ ".IFP4510", TOK_IFP4510 }, { ".IFP4510", TOK_IFP4510 },
{ ".IFP816", TOK_IFP816 }, { ".IFP816", TOK_IFP816 },
{ ".IFPC02", TOK_IFPC02 }, { ".IFPC02", TOK_IFPC02 },
@@ -260,6 +261,7 @@ struct DotKeyword {
{ ".ORG", TOK_ORG }, { ".ORG", TOK_ORG },
{ ".OUT", TOK_OUT }, { ".OUT", TOK_OUT },
{ ".P02", TOK_P02 }, { ".P02", TOK_P02 },
{ ".P02X", TOK_P02X },
{ ".P4510", TOK_P4510 }, { ".P4510", TOK_P4510 },
{ ".P816", TOK_P816 }, { ".P816", TOK_P816 },
{ ".PAGELEN", TOK_PAGELENGTH }, { ".PAGELEN", TOK_PAGELENGTH },
@@ -267,6 +269,7 @@ struct DotKeyword {
{ ".PARAMCOUNT", TOK_PARAMCOUNT }, { ".PARAMCOUNT", TOK_PARAMCOUNT },
{ ".PC02", TOK_PC02 }, { ".PC02", TOK_PC02 },
{ ".PDTV", TOK_PDTV }, { ".PDTV", TOK_PDTV },
{ ".PM740", TOK_PM740 },
{ ".POPCHARMAP", TOK_POPCHARMAP }, { ".POPCHARMAP", TOK_POPCHARMAP },
{ ".POPCPU", TOK_POPCPU }, { ".POPCPU", TOK_POPCPU },
{ ".POPSEG", TOK_POPSEG }, { ".POPSEG", TOK_POPSEG },

View File

@@ -193,6 +193,7 @@ typedef enum token_t {
TOK_IFNDEF, TOK_IFNDEF,
TOK_IFNREF, TOK_IFNREF,
TOK_IFP02, TOK_IFP02,
TOK_IFP02X,
TOK_IFP4510, TOK_IFP4510,
TOK_IFP816, TOK_IFP816,
TOK_IFPC02, TOK_IFPC02,
@@ -227,12 +228,14 @@ typedef enum token_t {
TOK_ORG, TOK_ORG,
TOK_OUT, TOK_OUT,
TOK_P02, TOK_P02,
TOK_P02X,
TOK_P4510, TOK_P4510,
TOK_P816, TOK_P816,
TOK_PAGELENGTH, TOK_PAGELENGTH,
TOK_PARAMCOUNT, TOK_PARAMCOUNT,
TOK_PC02, TOK_PC02,
TOK_PDTV, TOK_PDTV,
TOK_PM740,
TOK_POPCHARMAP, TOK_POPCHARMAP,
TOK_POPCPU, TOK_POPCPU,
TOK_POPSEG, TOK_POPSEG,

View File

@@ -8,6 +8,10 @@
lda #$ea lda #$ea
.endif .endif
.ifp02X
lax #$ea
.endif
.ifpsc02 .ifpsc02
jmp ($1234,x) jmp ($1234,x)
.endif .endif
@@ -80,3 +84,14 @@
.byte 0,"CPU_ISET_M740" .byte 0,"CPU_ISET_M740"
.endif .endif
; step 3: switch through all supported cpus to verify the pseudo-op is there
.p02
.p02X
.psc02
.pc02
.p816
.p4510
.pdtv
.pm740