1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-11 11:30:13 +00:00

Added pseudo function .DEFINEDINSTR

This commit is contained in:
JT 2015-05-12 19:28:57 -04:00
parent 1748bb1ab6
commit 5ed3a1a6dc
8 changed files with 204 additions and 157 deletions

View File

@ -62,6 +62,7 @@
#include "symtab.h" #include "symtab.h"
#include "toklist.h" #include "toklist.h"
#include "ulabel.h" #include "ulabel.h"
#include "macro.h"
@ -417,6 +418,33 @@ static ExprNode* FuncDefined (void)
static ExprNode* FuncDefinedInstr (void)
/* Handle the .DEFINEDINSTR builtin function */
{
int Instr = 0;
/* Check for a macro or an instruction depending on UbiquitousIdents */
if (CurTok.Tok == TOK_IDENT) {
if (UbiquitousIdents) {
/* Macros CAN be instructions, so check for them first */
if (FindMacro(&CurTok.SVal) == 0) {
Instr = FindInstruction (&CurTok.SVal);
}
} else {
/* Macros and symbols may NOT use the names of instructions, so just check for the instruction */
Instr = FindInstruction(&CurTok.SVal);
}
NextTok();
} else {
Error("Idenitifier expected.");
}
return GenLiteralExpr(Instr > 0);
}
ExprNode* FuncHiByte (void) ExprNode* FuncHiByte (void)
/* Handle the .HIBYTE builtin function */ /* Handle the .HIBYTE builtin function */
{ {
@ -1065,6 +1093,10 @@ static ExprNode* Factor (void)
N = Function (FuncDefined); N = Function (FuncDefined);
break; break;
case TOK_DEFINEDINSTR:
N = Function (FuncDefinedInstr);
break;
case TOK_HIBYTE: case TOK_HIBYTE:
N = Function (FuncHiByte); N = Function (FuncHiByte);
break; break;

View File

@ -64,6 +64,7 @@ static const char* FeatureKeys[FEAT_COUNT] = {
"force_range", "force_range",
"underline_in_numbers", "underline_in_numbers",
"addrsize", "addrsize",
"definedinstr",
}; };
@ -121,6 +122,7 @@ feature_t SetFeature (const StrBuf* Key)
case FEAT_FORCE_RANGE: ForceRange = 1; break; case FEAT_FORCE_RANGE: ForceRange = 1; break;
case FEAT_UNDERLINE_IN_NUMBERS: UnderlineInNumbers= 1; break; case FEAT_UNDERLINE_IN_NUMBERS: UnderlineInNumbers= 1; break;
case FEAT_ADDRSIZE: AddrSize = 1; break; case FEAT_ADDRSIZE: AddrSize = 1; break;
case FEAT_DEFINEDINSTR: DefinedInstr = 1; break;
default: /* Keep gcc silent */ break; default: /* Keep gcc silent */ break;
} }

View File

@ -66,6 +66,7 @@ typedef enum {
FEAT_FORCE_RANGE, FEAT_FORCE_RANGE,
FEAT_UNDERLINE_IN_NUMBERS, FEAT_UNDERLINE_IN_NUMBERS,
FEAT_ADDRSIZE, FEAT_ADDRSIZE,
FEAT_DEFINEDINSTR,
/* Special value: Number of features available */ /* Special value: Number of features available */
FEAT_COUNT FEAT_COUNT

View File

@ -83,3 +83,4 @@ unsigned char CComments = 0; /* Allow C like comments */
unsigned char ForceRange = 0; /* Force values into expected range */ unsigned char ForceRange = 0; /* Force values into expected range */
unsigned char UnderlineInNumbers = 0; /* Allow underlines in numbers */ unsigned char UnderlineInNumbers = 0; /* Allow underlines in numbers */
unsigned char AddrSize = 0; /* Allow .ADDRSIZE function */ unsigned char AddrSize = 0; /* Allow .ADDRSIZE function */
unsigned char DefinedInstr = 0; /* Allow .DEFINEDINSTR function */

View File

@ -85,6 +85,7 @@ extern unsigned char CComments; /* Allow C like comments */
extern unsigned char ForceRange; /* Force values into expected range */ extern unsigned char ForceRange; /* Force values into expected range */
extern unsigned char UnderlineInNumbers; /* Allow underlines in numbers */ extern unsigned char UnderlineInNumbers; /* Allow underlines in numbers */
extern unsigned char AddrSize; /* Allow .ADDRSIZE function */ extern unsigned char AddrSize; /* Allow .ADDRSIZE function */
extern unsigned char DefinedInstr; /* Allow .DEFINEDINSTR function */

View File

@ -1989,6 +1989,7 @@ static CtrlDesc CtrlCmdTab [] = {
{ ccNone, DoDebugInfo }, { ccNone, DoDebugInfo },
{ ccNone, DoDefine }, { ccNone, DoDefine },
{ ccNone, DoUnexpected }, /* .DEFINED */ { ccNone, DoUnexpected }, /* .DEFINED */
{ ccNone, DoUnexpected }, /* .DEFINEDINSTR */
{ ccNone, DoDelMac }, { ccNone, DoDelMac },
{ ccNone, DoDestructor }, { ccNone, DoDestructor },
{ ccNone, DoDWord }, { ccNone, DoDWord },

View File

@ -132,163 +132,164 @@ struct DotKeyword {
const char* Key; /* MUST be first field */ const char* Key; /* MUST be first field */
token_t Tok; token_t Tok;
} DotKeywords [] = { } DotKeywords [] = {
{ ".A16", TOK_A16 }, { ".A16", TOK_A16 },
{ ".A8", TOK_A8 }, { ".A8", TOK_A8 },
{ ".ADDR", TOK_ADDR }, { ".ADDR", TOK_ADDR },
{ ".ADDRSIZE", TOK_ADDRSIZE }, { ".ADDRSIZE", TOK_ADDRSIZE },
{ ".ALIGN", TOK_ALIGN }, { ".ALIGN", TOK_ALIGN },
{ ".AND", TOK_BOOLAND }, { ".AND", TOK_BOOLAND },
{ ".ASCIIZ", TOK_ASCIIZ }, { ".ASCIIZ", TOK_ASCIIZ },
{ ".ASSERT", TOK_ASSERT }, { ".ASSERT", TOK_ASSERT },
{ ".AUTOIMPORT", TOK_AUTOIMPORT }, { ".AUTOIMPORT", TOK_AUTOIMPORT },
{ ".BANK", TOK_BANK }, { ".BANK", TOK_BANK },
{ ".BANKBYTE", TOK_BANKBYTE }, { ".BANKBYTE", TOK_BANKBYTE },
{ ".BANKBYTES", TOK_BANKBYTES }, { ".BANKBYTES", TOK_BANKBYTES },
{ ".BITAND", TOK_AND }, { ".BITAND", TOK_AND },
{ ".BITNOT", TOK_NOT }, { ".BITNOT", TOK_NOT },
{ ".BITOR", TOK_OR }, { ".BITOR", TOK_OR },
{ ".BITXOR", TOK_XOR }, { ".BITXOR", TOK_XOR },
{ ".BLANK", TOK_BLANK }, { ".BLANK", TOK_BLANK },
{ ".BSS", TOK_BSS }, { ".BSS", TOK_BSS },
{ ".BYT", TOK_BYTE }, { ".BYT", TOK_BYTE },
{ ".BYTE", TOK_BYTE }, { ".BYTE", TOK_BYTE },
{ ".CASE", TOK_CASE }, { ".CASE", TOK_CASE },
{ ".CHARMAP", TOK_CHARMAP }, { ".CHARMAP", TOK_CHARMAP },
{ ".CODE", TOK_CODE }, { ".CODE", TOK_CODE },
{ ".CONCAT", TOK_CONCAT }, { ".CONCAT", TOK_CONCAT },
{ ".CONDES", TOK_CONDES }, { ".CONDES", TOK_CONDES },
{ ".CONST", TOK_CONST }, { ".CONST", TOK_CONST },
{ ".CONSTRUCTOR", TOK_CONSTRUCTOR }, { ".CONSTRUCTOR", TOK_CONSTRUCTOR },
{ ".CPU", TOK_CPU }, { ".CPU", TOK_CPU },
{ ".DATA", TOK_DATA }, { ".DATA", TOK_DATA },
{ ".DBG", TOK_DBG }, { ".DBG", TOK_DBG },
{ ".DBYT", TOK_DBYT }, { ".DBYT", TOK_DBYT },
{ ".DEBUGINFO", TOK_DEBUGINFO }, { ".DEBUGINFO", TOK_DEBUGINFO },
{ ".DEF", TOK_DEFINED }, { ".DEF", TOK_DEFINED },
{ ".DEFINE", TOK_DEFINE }, { ".DEFINE", TOK_DEFINE },
{ ".DEFINED", TOK_DEFINED }, { ".DEFINED", TOK_DEFINED },
{ ".DELMAC", TOK_DELMAC }, { ".DEFINEDINSTR", TOK_DEFINEDINSTR },
{ ".DELMACRO", TOK_DELMAC }, { ".DELMAC", TOK_DELMAC },
{ ".DESTRUCTOR", TOK_DESTRUCTOR }, { ".DELMACRO", TOK_DELMAC },
{ ".DWORD", TOK_DWORD }, { ".DESTRUCTOR", TOK_DESTRUCTOR },
{ ".ELSE", TOK_ELSE }, { ".DWORD", TOK_DWORD },
{ ".ELSEIF", TOK_ELSEIF }, { ".ELSE", TOK_ELSE },
{ ".END", TOK_END }, { ".ELSEIF", TOK_ELSEIF },
{ ".ENDENUM", TOK_ENDENUM }, { ".END", TOK_END },
{ ".ENDIF", TOK_ENDIF }, { ".ENDENUM", TOK_ENDENUM },
{ ".ENDMAC", TOK_ENDMACRO }, { ".ENDIF", TOK_ENDIF },
{ ".ENDMACRO", TOK_ENDMACRO }, { ".ENDMAC", TOK_ENDMACRO },
{ ".ENDPROC", TOK_ENDPROC }, { ".ENDMACRO", TOK_ENDMACRO },
{ ".ENDREP", TOK_ENDREP }, { ".ENDPROC", TOK_ENDPROC },
{ ".ENDREPEAT", TOK_ENDREP }, { ".ENDREP", TOK_ENDREP },
{ ".ENDSCOPE", TOK_ENDSCOPE }, { ".ENDREPEAT", TOK_ENDREP },
{ ".ENDSTRUCT", TOK_ENDSTRUCT }, { ".ENDSCOPE", TOK_ENDSCOPE },
{ ".ENDUNION", TOK_ENDUNION }, { ".ENDSTRUCT", TOK_ENDSTRUCT },
{ ".ENUM", TOK_ENUM }, { ".ENDUNION", TOK_ENDUNION },
{ ".ERROR", TOK_ERROR }, { ".ENUM", TOK_ENUM },
{ ".EXITMAC", TOK_EXITMACRO }, { ".ERROR", TOK_ERROR },
{ ".EXITMACRO", TOK_EXITMACRO }, { ".EXITMAC", TOK_EXITMACRO },
{ ".EXPORT", TOK_EXPORT }, { ".EXITMACRO", TOK_EXITMACRO },
{ ".EXPORTZP", TOK_EXPORTZP }, { ".EXPORT", TOK_EXPORT },
{ ".FARADDR", TOK_FARADDR }, { ".EXPORTZP", TOK_EXPORTZP },
{ ".FATAL", TOK_FATAL }, { ".FARADDR", TOK_FARADDR },
{ ".FEATURE", TOK_FEATURE }, { ".FATAL", TOK_FATAL },
{ ".FILEOPT", TOK_FILEOPT }, { ".FEATURE", TOK_FEATURE },
{ ".FOPT", TOK_FILEOPT }, { ".FILEOPT", TOK_FILEOPT },
{ ".FORCEIMPORT", TOK_FORCEIMPORT }, { ".FOPT", TOK_FILEOPT },
{ ".FORCEWORD", TOK_FORCEWORD }, { ".FORCEIMPORT", TOK_FORCEIMPORT },
{ ".GLOBAL", TOK_GLOBAL }, { ".FORCEWORD", TOK_FORCEWORD },
{ ".GLOBALZP", TOK_GLOBALZP }, { ".GLOBAL", TOK_GLOBAL },
{ ".HIBYTE", TOK_HIBYTE }, { ".GLOBALZP", TOK_GLOBALZP },
{ ".HIBYTES", TOK_HIBYTES }, { ".HIBYTE", TOK_HIBYTE },
{ ".HIWORD", TOK_HIWORD }, { ".HIBYTES", TOK_HIBYTES },
{ ".I16", TOK_I16 }, { ".HIWORD", TOK_HIWORD },
{ ".I8", TOK_I8 }, { ".I16", TOK_I16 },
{ ".IDENT", TOK_MAKEIDENT }, { ".I8", TOK_I8 },
{ ".IF", TOK_IF }, { ".IDENT", TOK_MAKEIDENT },
{ ".IFBLANK", TOK_IFBLANK }, { ".IF", TOK_IF },
{ ".IFCONST", TOK_IFCONST }, { ".IFBLANK", TOK_IFBLANK },
{ ".IFDEF", TOK_IFDEF }, { ".IFCONST", TOK_IFCONST },
{ ".IFNBLANK", TOK_IFNBLANK }, { ".IFDEF", TOK_IFDEF },
{ ".IFNCONST", TOK_IFNCONST }, { ".IFNBLANK", TOK_IFNBLANK },
{ ".IFNDEF", TOK_IFNDEF }, { ".IFNCONST", TOK_IFNCONST },
{ ".IFNREF", TOK_IFNREF }, { ".IFNDEF", TOK_IFNDEF },
{ ".IFP02", TOK_IFP02 }, { ".IFNREF", TOK_IFNREF },
{ ".IFP816", TOK_IFP816 }, { ".IFP02", TOK_IFP02 },
{ ".IFPC02", TOK_IFPC02 }, { ".IFP816", TOK_IFP816 },
{ ".IFPSC02", TOK_IFPSC02 }, { ".IFPC02", TOK_IFPC02 },
{ ".IFREF", TOK_IFREF }, { ".IFPSC02", TOK_IFPSC02 },
{ ".IMPORT", TOK_IMPORT }, { ".IFREF", TOK_IFREF },
{ ".IMPORTZP", TOK_IMPORTZP }, { ".IMPORT", TOK_IMPORT },
{ ".INCBIN", TOK_INCBIN }, { ".IMPORTZP", TOK_IMPORTZP },
{ ".INCLUDE", TOK_INCLUDE }, { ".INCBIN", TOK_INCBIN },
{ ".INTERRUPTOR", TOK_INTERRUPTOR }, { ".INCLUDE", TOK_INCLUDE },
{ ".LEFT", TOK_LEFT }, { ".INTERRUPTOR", TOK_INTERRUPTOR },
{ ".LINECONT", TOK_LINECONT }, { ".LEFT", TOK_LEFT },
{ ".LIST", TOK_LIST }, { ".LINECONT", TOK_LINECONT },
{ ".LISTBYTES", TOK_LISTBYTES }, { ".LIST", TOK_LIST },
{ ".LOBYTE", TOK_LOBYTE }, { ".LISTBYTES", TOK_LISTBYTES },
{ ".LOBYTES", TOK_LOBYTES }, { ".LOBYTE", TOK_LOBYTE },
{ ".LOCAL", TOK_LOCAL }, { ".LOBYTES", TOK_LOBYTES },
{ ".LOCALCHAR", TOK_LOCALCHAR }, { ".LOCAL", TOK_LOCAL },
{ ".LOWORD", TOK_LOWORD }, { ".LOCALCHAR", TOK_LOCALCHAR },
{ ".MAC", TOK_MACRO }, { ".LOWORD", TOK_LOWORD },
{ ".MACPACK", TOK_MACPACK }, { ".MAC", TOK_MACRO },
{ ".MACRO", TOK_MACRO }, { ".MACPACK", TOK_MACPACK },
{ ".MATCH", TOK_MATCH }, { ".MACRO", TOK_MACRO },
{ ".MAX", TOK_MAX }, { ".MATCH", TOK_MATCH },
{ ".MID", TOK_MID }, { ".MAX", TOK_MAX },
{ ".MIN", TOK_MIN }, { ".MID", TOK_MID },
{ ".MOD", TOK_MOD }, { ".MIN", TOK_MIN },
{ ".NOT", TOK_BOOLNOT }, { ".MOD", TOK_MOD },
{ ".NULL", TOK_NULL }, { ".NOT", TOK_BOOLNOT },
{ ".OR", TOK_BOOLOR }, { ".NULL", TOK_NULL },
{ ".ORG", TOK_ORG }, { ".OR", TOK_BOOLOR },
{ ".OUT", TOK_OUT }, { ".ORG", TOK_ORG },
{ ".P02", TOK_P02 }, { ".OUT", TOK_OUT },
{ ".P816", TOK_P816 }, { ".P02", TOK_P02 },
{ ".PAGELEN", TOK_PAGELENGTH }, { ".P816", TOK_P816 },
{ ".PAGELENGTH", TOK_PAGELENGTH }, { ".PAGELEN", TOK_PAGELENGTH },
{ ".PARAMCOUNT", TOK_PARAMCOUNT }, { ".PAGELENGTH", TOK_PAGELENGTH },
{ ".PC02", TOK_PC02 }, { ".PARAMCOUNT", TOK_PARAMCOUNT },
{ ".POPCPU", TOK_POPCPU }, { ".PC02", TOK_PC02 },
{ ".POPSEG", TOK_POPSEG }, { ".POPCPU", TOK_POPCPU },
{ ".PROC", TOK_PROC }, { ".POPSEG", TOK_POPSEG },
{ ".PSC02", TOK_PSC02 }, { ".PROC", TOK_PROC },
{ ".PUSHCPU", TOK_PUSHCPU }, { ".PSC02", TOK_PSC02 },
{ ".PUSHSEG", TOK_PUSHSEG }, { ".PUSHCPU", TOK_PUSHCPU },
{ ".REF", TOK_REFERENCED }, { ".PUSHSEG", TOK_PUSHSEG },
{ ".REFERENCED", TOK_REFERENCED }, { ".REF", TOK_REFERENCED },
{ ".RELOC", TOK_RELOC }, { ".REFERENCED", TOK_REFERENCED },
{ ".REPEAT", TOK_REPEAT }, { ".RELOC", TOK_RELOC },
{ ".RES", TOK_RES }, { ".REPEAT", TOK_REPEAT },
{ ".RIGHT", TOK_RIGHT }, { ".RES", TOK_RES },
{ ".RODATA", TOK_RODATA }, { ".RIGHT", TOK_RIGHT },
{ ".SCOPE", TOK_SCOPE }, { ".RODATA", TOK_RODATA },
{ ".SEGMENT", TOK_SEGMENT }, { ".SCOPE", TOK_SCOPE },
{ ".SET", TOK_SET }, { ".SEGMENT", TOK_SEGMENT },
{ ".SETCPU", TOK_SETCPU }, { ".SET", TOK_SET },
{ ".SHL", TOK_SHL }, { ".SETCPU", TOK_SETCPU },
{ ".SHR", TOK_SHR }, { ".SHL", TOK_SHL },
{ ".SIZEOF", TOK_SIZEOF }, { ".SHR", TOK_SHR },
{ ".SMART", TOK_SMART }, { ".SIZEOF", TOK_SIZEOF },
{ ".SPRINTF", TOK_SPRINTF }, { ".SMART", TOK_SMART },
{ ".STRAT", TOK_STRAT }, { ".SPRINTF", TOK_SPRINTF },
{ ".STRING", TOK_STRING }, { ".STRAT", TOK_STRAT },
{ ".STRLEN", TOK_STRLEN }, { ".STRING", TOK_STRING },
{ ".STRUCT", TOK_STRUCT }, { ".STRLEN", TOK_STRLEN },
{ ".TAG", TOK_TAG }, { ".STRUCT", TOK_STRUCT },
{ ".TCOUNT", TOK_TCOUNT }, { ".TAG", TOK_TAG },
{ ".TIME", TOK_TIME }, { ".TCOUNT", TOK_TCOUNT },
{ ".UNDEF", TOK_UNDEF }, { ".TIME", TOK_TIME },
{ ".UNDEFINE", TOK_UNDEF }, { ".UNDEF", TOK_UNDEF },
{ ".UNION", TOK_UNION }, { ".UNDEFINE", TOK_UNDEF },
{ ".VERSION", TOK_VERSION }, { ".UNION", TOK_UNION },
{ ".WARNING", TOK_WARNING }, { ".VERSION", TOK_VERSION },
{ ".WORD", TOK_WORD }, { ".WARNING", TOK_WARNING },
{ ".XMATCH", TOK_XMATCH }, { ".WORD", TOK_WORD },
{ ".XOR", TOK_BOOLXOR }, { ".XMATCH", TOK_XMATCH },
{ ".ZEROPAGE", TOK_ZEROPAGE }, { ".XOR", TOK_BOOLXOR },
{ ".ZEROPAGE", TOK_ZEROPAGE },
}; };
@ -736,6 +737,13 @@ static token_t FindDotKeyword (void)
} }
break; break;
case TOK_DEFINEDINSTR:
/* Disallow .DEFINEDINSTR function by default */
if (DefinedInstr == 0) {
return TOK_NONE;
}
break;
default: default:
break; break;
} }

View File

@ -148,6 +148,7 @@ typedef enum token_t {
TOK_DEBUGINFO, TOK_DEBUGINFO,
TOK_DEFINE, TOK_DEFINE,
TOK_DEFINED, TOK_DEFINED,
TOK_DEFINEDINSTR,
TOK_DELMAC, TOK_DELMAC,
TOK_DESTRUCTOR, TOK_DESTRUCTOR,
TOK_DWORD, TOK_DWORD,