X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=token.h;h=251a503f424036a705edf559b3ecd9302b85d56b;hp=be3c1e392ca4890490b46d873261588e0b3e05a9;hb=HEAD;hpb=3385b366632d03745033fa6b19faabf60219bc6b diff --git a/token.h b/token.h index be3c1e3..3154118 100644 --- a/token.h +++ b/token.h @@ -1,79 +1,96 @@ // -// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System +// RMAC - Renamed Macro Assembler for all Atari computers // TOKEN.H - Token Handling -// Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2021 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 -// Source Utilised with the Kind Permission of Landon Dyer +// Source utilised with the kind permission of Landon Dyer // #ifndef __TOKEN_H__ #define __TOKEN_H__ #include "rmac.h" -//#include "risca.h" // Include Files and Macros -#define SRC_IFILE 0 // Input source is IFILE -#define SRC_IMACRO 1 // Input source is IMACRO -#define SRC_IREPT 2 // Input source is IREPT +#define SRC_IFILE 0 // Input source is IFILE +#define SRC_IMACRO 1 // Input source is IMACRO +#define SRC_IREPT 2 // Input source is IREPT // Macros -#define INOBJ struct _inobj -#define IUNION union _iunion -#define IFILE struct _incldfile -#define IMACRO struct _imacro -#define IREPT struct _irept -#define IFENT struct _ifent +#define INOBJ struct _inobj +#define IUNION union _iunion +#define IFILE struct _incldfile +#define TOKENSTREAM struct _tokenstream +#define IMACRO struct _imacro +#define IREPT struct _irept +#define IFENT struct _ifent // Tunable definitions -#define LNSIZ 256 // Maximum size of a line of text -#define TOKBUFSIZE 400 // Size of token-line buffer -#define QUANTUM 4096L // #bytes to eat at a time from a file -#define LNBUFSIZ (QUANTUM*2) // Size of file's buffer -#define KWSIZE 7 // Maximum size of keyword in kwtab.h +#define LNSIZ 1024 // Maximum size of a line of text +#define TOKBUFSIZE 4096 // Size of token-line buffer +#define QUANTUM 4096L // # bytes to eat at a time from a file +#define LNBUFSIZ (QUANTUM*2) // Size of file's buffer +#define KWSIZE 10 // Maximum size of keyword in kwtab.h // (Normally) non-printable tokens -#define COLON ':' // : (grumble: GNUmacs hates ':') -#define CONST 'a' // CONST -#define ACONST 'A' // ACONST -#define STRING 'b' // STRING
-#define SYMBOL 'c' // SYMBOL
-#define EOL 'e' // End of line -#define TKEOF 'f' // End of file (or macro) -#define DEQUALS 'g' // == -#define SET 149 // Set -#define REG 'R' // Reg -#define DCOLON 'h' // :: -#define GE 'i' // >= -#define LE 'j' // <= -#define NE 'k' // <> or != -#define SHR 'l' // >> -#define SHL 'm' // << -#define UNMINUS 'n' // Unary '-' -#define DOTB 'B' // .b or .B or .s or .S -#define DOTW 'W' // .w or .W -#define DOTL 'L' // .l or .L -#define DOTI 'I' // .l or .L -#define ENDEXPR 'E' // End of expression +#define COLON ':' // : (grumble: GNUmacs hates ':') +#define CONST 'a' // CONST +#define FCONST 'r' // Floating CONST +#define ACONST 'A' // ACONST +#define STRING 'b' // STRING
+#define STRINGA8 'S' // Atari 800 internal STRING
+#define SYMBOL 'c' // SYMBOL
+#define EOL 'e' // End of line +#define TKEOF 'f' // End of file (or macro) +#define DEQUALS 'g' // == +#define SET 0x95 // Set +#define REG 'R' // Reg +#define EQUREG 'U' // equreg (must be synchronised with the equate in kw.tab) +#define CCDEF 0xB7 // ccdef +#define DCOLON 'h' // :: +#define GE 'i' // >= +#define LE 'j' // <= +#define NE 'k' // <> or != +#define SHR 'l' // >> +#define SHL 'm' // << +#define UNMINUS 'n' // Unary '-' +#define DOTB 'B' // .b or .B or .s or .S +#define DOTW 'W' // .w or .W +#define DOTL 'L' // .l or .L +#define DOTI 'I' // .l or .L +#define DOTX 'X' // .x or .X +#define DOTD 'D' // .d or .D +#define DOTP 'P' // .p or .P +#define DOTQ 'Q' // .q or .Q (essentially an alias for P) +#define DOTS 'S' // .s or .S (FPU Single) +#define ENDEXPR 'E' // End of expression +#define UNLT 0x81 // Unary '<' (low byte) +#define UNGT 0x82 // Unary '>' (high byte) // ^^ operators -#define CR_DEFINED 'p' // ^^defined - is symbol defined? -#define CR_REFERENCED 'q' // ^^referenced - was symbol referenced? -#define CR_STREQ 'v' // ^^streq - compare two strings -#define CR_MACDEF 'w' // ^^macdef - is macro defined? -#define CR_TIME 'x' // ^^time - DOS format time -#define CR_DATE 'y' // ^^date - DOS format date +#define CR_DEFINED 'p' // ^^defined - is symbol defined? +#define CR_REFERENCED 'q' // ^^referenced - was symbol referenced? +#define CR_STREQ 'v' // ^^streq - compare two strings +#define CR_MACDEF 'w' // ^^macdef - is macro defined? +#define CR_TIME 'x' // ^^time - DOS format time +#define CR_DATE 'y' // ^^date - DOS format date +#define CR_ABSCOUNT 'z' // ^^abscount - count the number of bytes + // defined in current .abs section +#define CR_FILESIZE 'F' // ^^filesize - return the size in bytes of a file // Character Attributes -#define ILLEG 0 // Illegal character (unused) -#define DIGIT 1 // 0-9 -#define HDIGIT 2 // A-F, a-f -#define STSYM 4 // A-Z, a-z, _~. -#define CTSYM 8 // A-Z, a-z, 0-9, _~$? -#define SELF 16 // Single-character tokens: ( ) [ ] etc -#define WHITE 32 // Whitespace (space, tab, etc.) -#define MULTX 64 // Multiple-character tokens -#define DOT 128 // [bwlsBWSL] for what follows a `.' +#define ILLEG 0 // Illegal character (unused) +#define DIGIT 1 // 0-9 +#define HDIGIT 2 // A-F, a-f +#define STSYM 4 // A-Z, a-z, _~. +#define CTSYM 8 // A-Z, a-z, 0-9, _~$? +#define SELF 16 // Single-character tokens: ( ) [ ] etc +#define WHITE 32 // Whitespace (space, tab, etc.) +#define MULTX 64 // Multiple-character tokens +#define DOT 128 // [bwlsBWSL] for what follows a '.' + +// Macro to check for specific optimizations or override +#define CHECK_OPTS(x) (optim_flags[x] && !optimizeOff) // Conditional assembly structures IFENT { @@ -81,7 +98,7 @@ IFENT { WORD if_state; // 0:enabled, 1:disabled }; -// Pointer to IFILE or IMACRO +// Pointer to IFILE or IMACRO or IREPT IUNION { IFILE * ifile; IMACRO * imacro; @@ -90,12 +107,12 @@ IUNION { // Ptr to IFILEs, IMACROs, and so on; back-ptr to previous input objects INOBJ { - WORD in_type; // 0=IFILE, 1=IMACRO ... + WORD in_type; // 0=IFILE, 1=IMACRO, 2=IREPT IFENT * in_ifent; // Pointer to .if context on entry INOBJ * in_link; // Pointer to previous INOBJ TOKEN * in_otok; // Old `tok' value TOKEN * in_etok; // Old `etok' value - IUNION inobj; // IFILE or IMACRO ... + IUNION inobj; // IFILE or IMACRO or IREPT }; // Information about a file @@ -104,33 +121,53 @@ IFILE { char * ifoldfname; // Old file's name int ifoldlineno; // Old line number int ifind; // Position in file buffer - int ifcnt; // #chars left in file buffer + int ifcnt; // #chars left in file buffer int ifhandle; // File's descriptor WORD ifno; // File number char ifbuf[LNBUFSIZ]; // Line buffer }; +// Consts for maximums in TOKENSTREAM +#define TS_MAXTOKENS 64 // 32 ought to be enough for anybody (including XiA!) +#define TS_MAXSTRINGS 32 // same for attached strings +#define TS_MAXARGS 20 // Assume no more than 20 arguments in an invocation + +TOKENSTREAM { + TOKEN token[TS_MAXTOKENS]; + char * string[TS_MAXSTRINGS]; +}; + // Information about a macro invocation IMACRO { IMACRO * im_link; // Pointer to ancient IMACROs - LONG * im_nextln; // Next line to include + LLIST * im_nextln; // Next line to include WORD im_nargs; // # of arguments supplied on invocation WORD im_siz; // Size suffix supplied on invocation LONG im_olduniq; // Old value of 'macuniq' SYM * im_macro; // Pointer to macro we're in char im_lnbuf[LNSIZ]; // Line buffer + TOKENSTREAM argument[TS_MAXARGS]; }; // Information about a .rept invocation IREPT { - LONG * ir_firstln; // Pointer to first line - LONG * ir_nextln; // Pointer to next line - VALUE ir_count; // Repeat count (decrements) + LLIST * ir_firstln; // Pointer to first line + LLIST * ir_nextln; // Pointer to next line + uint32_t ir_count; // Repeat count (decrements) + uint32_t lineno; // Repeat line number (Convert this to global instead of putting it here?) }; -// Globals, externals etc +// File record, used to maintain a list of every include file ever visited +#define FILEREC struct _filerec +FILEREC +{ + FILEREC * frec_next; + char * frec_name; +}; + +// Exported variables extern int lnsave; -extern int curlineno; +extern uint32_t curlineno; extern char * curfname; extern WORD cfileno; extern TOKEN * tok; @@ -138,19 +175,21 @@ extern char lnbuf[]; extern char lntag; extern char tolowertab[]; extern INOBJ * cur_inobj; -extern unsigned orgactive; -extern unsigned orgaddr; -extern LONG sloc; extern int mjump_align; +extern char * string[]; +extern int optimizeOff; +extern FILEREC * filerec; -// Prototypes +// Exported functions int include(int, char *); -void init_token(void); -void setfnum(WORD); -int tokln(void); +void InitTokenizer(void); +void SetFilenameForErrorReporting(void); +int TokenizeLine(void); int fpop(void); -//int d_goto(WORD); -int d_goto(void); +int d_goto(WORD); INOBJ * a_inobj(int); +void DumpToken(TOKEN); +void DumpTokenBuffer(void); #endif // __TOKEN_H__ +