X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=token.c;h=03f278ad08795ea7da14fd772fd8cd049e75f678;hp=8726eb4b9ee256ed536f9eff6ae061bb48d27dc0;hb=5f23454f7155f0c77ea1bede3f9e60b39da99fa8;hpb=60f204cb9e3905100da0d89f14bb40db764acd9e diff --git a/token.c b/token.c index 8726eb4..03f278a 100644 --- a/token.c +++ b/token.c @@ -7,9 +7,11 @@ // #include "token.h" +#include "direct.h" #include "error.h" #include "macro.h" #include "procln.h" +#include "sect.h" #include "symbol.h" #define DECL_KW // Declare keyword arrays @@ -18,7 +20,7 @@ int lnsave; // 1; strcpy() text of current line -int curlineno; // Current line number +uint16_t curlineno; // Current line number (64K max currently) int totlines; // Total # of lines int mjump_align = 0; // mjump alignment flag char lntag; // Line tag @@ -79,34 +81,55 @@ char chrtab[] = { MULTX, STSYM+CTSYM+HDIGIT, // @ A (char)((BYTE)DOT)+STSYM+CTSYM+HDIGIT, STSYM+CTSYM+HDIGIT, // B C - STSYM+CTSYM+HDIGIT, STSYM+CTSYM+HDIGIT, // D E + (char)((BYTE)DOT)+STSYM+CTSYM+HDIGIT, STSYM+CTSYM+HDIGIT, // D E STSYM+CTSYM+HDIGIT, STSYM+CTSYM, // F G - STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, // H I J K + STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, // H I J K (char)((BYTE)DOT)+STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, // L M N O - STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, // P Q R S + (char)((BYTE)DOT)+STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, // P Q R S STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, // T U V W STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, SELF, // X Y Z [ SELF, SELF, MULTX, STSYM+CTSYM, // \ ] ^ _ ILLEG, STSYM+CTSYM+HDIGIT, // ` a (char)((BYTE)DOT)+STSYM+CTSYM+HDIGIT, STSYM+CTSYM+HDIGIT, // b c - STSYM+CTSYM+HDIGIT, STSYM+CTSYM+HDIGIT, // d e + (char)((BYTE)DOT)+STSYM+CTSYM+HDIGIT, STSYM+CTSYM+HDIGIT, // d e STSYM+CTSYM+HDIGIT, STSYM+CTSYM, // f g - STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, // h i j k + STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, // h i j k (char)((BYTE)DOT)+STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, // l m n o - STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, // p q r s + (char)((BYTE)DOT)+STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, // p q r s STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, (char)((BYTE)DOT)+STSYM+CTSYM, // t u v w - STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, SELF, // x y z { + (char)((BYTE)DOT)+STSYM+CTSYM, STSYM+CTSYM, STSYM+CTSYM, SELF, // x y z { SELF, SELF, SELF, ILLEG // | } ~ DEL }; // Names of registers static char * regname[] = { - "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", - "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", - "pc", "ssp", "usp", "sr", "ccr" + "d0","d1","d2","d3","d4","d5","d6","d7", // 128,135 + "a0","a1","a2","a3","a4","a5","a6","sp", // 136,143 + "ssp","pc","sr","ccr","regequ","set","reg","r0", // 144,151 + "r1","r2","r3","r4","r5","r6","r7","r8", // 152,159 + "r9","r10","r11","r12","r13","r14","r15","r16", // 160,167 + "r17","r18","r19","r20","r21","r22","r23","r24", // 168,175 + "r25","r26","r27","r28","r29","r30","r31","ccdef", // 176,183 + "usp","ic40","dc40","bc40","sfc","dfc","","vbr", // 184,191 + "cacr","caar","msp","isp","tc","itt0","itt1","dtt0", // 192,199 + "dtt1","mmusr","urp","srp","iacr0","iacr1","dacr0","dacr1", // 200,207 + "tt0","tt1","crp","","","","","", // 208,215 + "","","","","fpiar","fpsr","fpcr","", // 216,223 + "fp0","fp1","fp2","fp3","fp4","fp5","fp6","fp7", // 224,231 + "","","","","","","","", // 232,239 + "","","","","","","","", // 240,247 + "","","","","","","","", // 248,255 + "","","","","x0","x1","y0","y1", // 256,263 + "","b0","","b2","","b1","a","b", // 264,271 + "mr","omr","la","lc","ssh","ssl","ss","", // 272,279 + "n0","n1","n2","n3","n4","n5","n6","n7", // 280,287 + "m0","m1","m2","m3","m4","m5","m6","m7", // 288,295 + "","","","","","","l","p", // 296,303 + "mr","omr","la","lc","ssh","ssl","ss","", // 304,311 + "a10","b10","x","y","","","ab","ba" // 312,319 }; static char * riscregname[] = { @@ -157,14 +180,24 @@ void InitTokenizer(void) // These characters are legal immediately after a period dotxtab['b'] = DOTB; // .b .B .s .S dotxtab['B'] = DOTB; - dotxtab['s'] = DOTB; - dotxtab['S'] = DOTB; + //dotxtab['s'] = DOTB; + //dotxtab['S'] = DOTB; dotxtab['w'] = DOTW; // .w .W dotxtab['W'] = DOTW; dotxtab['l'] = DOTL; // .l .L dotxtab['L'] = DOTL; dotxtab['i'] = DOTI; // .i .I (???) dotxtab['I'] = DOTI; + dotxtab['D'] = DOTD; // .d .D (quad word) + dotxtab['d'] = DOTD; + dotxtab['S'] = DOTS; // .s .S + dotxtab['s'] = DOTS; + dotxtab['Q'] = DOTQ; // .q .Q + dotxtab['q'] = DOTQ; + dotxtab['X'] = DOTX; // .x .x + dotxtab['x'] = DOTX; + dotxtab['P'] = DOTP; // .p .P + dotxtab['p'] = DOTP; } @@ -515,11 +548,11 @@ DEBUG printf("ExM: SYMBOL=\"%s\"", d); *dst++ = '"'; continue; break; -// Shamus: Changing the format specifier from %lx to %ux caused -// the assembler to choke on legitimate code... Need to investigate -// this further before changing anything else here! +// Shamus: Changing the format specifier from %lx to %ux caused the assembler +// to choke on legitimate code... Need to investigate this further +// before changing anything else here! case CONST: - sprintf(numbuf, "$%lx", (LONG)*tk++); + sprintf(numbuf, "$%lx", (long unsigned int)*tk++); d = numbuf; break; case DEQUALS: @@ -646,7 +679,6 @@ char * GetNextMacroLine(void) // char * GetNextRepeatLine(void) { - IREPT * irept = cur_inobj->inobj.irept; LONG * strp = irept->ir_nextln; // initial null @@ -1160,6 +1192,7 @@ if (debug) printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); // Handle multiple-character tokens if (c & MULTX) { + switch (*ln++) { case '!': // ! or != @@ -1173,19 +1206,20 @@ if (debug) printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); continue; case '\'': // 'string' + if (m6502) + { + // Hardcoded for now, maybe this will change in the future + *tk++ = STRINGA8; + goto dostring; + } + // Fall through case '\"': // "string" - c1 = ln[-1]; *tk++ = STRING; -//#warning -// More char * stuffing (8 bytes) into the space of 4 (TOKEN). -// Need to figure out how to fix this crap. -#if 0 - *tk++ = (TOKEN)ln; -#else +dostring: + c1 = ln[-1]; string[stringNum] = ln; *tk++ = stringNum; stringNum++; -#endif for(p=ln; *ln!=EOS && *ln!=c1;) { @@ -1248,32 +1282,6 @@ if (debug) printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); while (hextab[*ln] >= 0) v = (v << 4) + (int)hextab[*ln++]; - // ggn: Okay, some comments here are in order I think.... - // The original madmac sources didn't parse the size at - // this point (i.e. .b/.w/.l). It was probably done at - // another point, although it's unclear to me exactly - // where. So why change this? My understanding (at least - // from what SCPCD said on IRC) is that .w addressing - // formats produce wrong code on jaguar (or doesn't execute - // properly? something like that). So the code was changed - // to mask off the upper bits depending on length (note: I - // don't think .b is valid at all! I only know of .w/.l, so - // this should probably be wiped). Then the code that - // parses the constant and checks to see if it's between - // $ffff0000 and $8000 never got triggered, so yay job - // done! ...now say we want to assemble a st .prg. One of - // the most widely spread optimisations is move.X expr.w,Y - // (or vice versa, or both, anyway...) to access hardware - // registers (which are mapped to $fxxxxx). This botchy - // thing would create "hilarious" code while trying to - // access hardware registers. So I made a condition to see - // if st mode or jaguar is active and apply the both or - // not. One last note: this is hardcoded to get optimised - // for now on ST mode, i.e. it can't generate code like - // move.w $00001234,d0 - it'll always get optimised to - // move.w $1234.w,d0. It's probably ok, but maybe a warning - // should be emitted? Or maybe finding a way to make it not - // auto-optimise? I think it's ok for now... if (*ln == '.') { if (obj_format == BSD) @@ -1300,15 +1308,18 @@ if (debug) printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); if (obj_format == ALCYON) { - if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W')) - { - *tk++ = DOTW; - ln += 2; - } - else if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L')) + if (*ln == '.') { - *tk++ = DOTL; - ln += 2; + if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W')) + { + *tk++ = DOTW; + ln += 2; + } + else if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L')) + { + *tk++ = DOTL; + ln += 2; + } } } } @@ -1563,17 +1574,12 @@ goteol: // expansion, and is NOT subject to macro expansion. The whitespace may also // be EOL. // -//int d_goto(WORD siz) { -//int d_goto(void) int d_goto(WORD unused) { - char * s1, * s2; - // Setup for the search if (*tok != SYMBOL) return error("missing label"); -// sym = (char *)tok[1]; char * sym = string[tok[1]]; tok += 2; @@ -1581,39 +1587,35 @@ int d_goto(WORD unused) return error("goto not in macro"); IMACRO * imacro = cur_inobj->inobj.imacro; -// defln = (LONG *)imacro->im_macro->svalue; struct LineList * defln = imacro->im_macro->lineList; - // Find the label, starting with the first line. + // Attempt to find the label, starting with the first line. for(; defln!=NULL; defln=defln->next) { -// if (*(char *)(defln + 1) == ':') + // Must start with a colon if (defln->line[0] == ':') { // Compare names (sleazo string compare) - // This string compare is not right. Doesn't check for lengths. - // (actually it does, but in a crappy, unclear way.) -WARNING(!!!! Bad string comparison !!!) - s1 = sym; -// s2 = (char *)(defln + 1) + 1; - s2 = defln->line; - - while (*s1 == *s2) + char * s1 = sym; + char * s2 = defln->line; + + // Either we will match the strings to EOS on both, or we will + // match EOS on string 1 to whitespace on string 2. Otherwise, we + // have no match. + while ((*s1 == *s2) || ((*s1 == EOS) && (chrtab[*s2] & WHITE))) { + // If we reached the end of string 1 (sym), we're done. + // Note that we're also checking for the end of string 2 as + // well, since we've established they're equal above. if (*s1 == EOS) - break; - else { - s1++; - s2++; + // Found the label, set new macro next-line and return. + imacro->im_nextln = defln; + return 0; } - } - // Found the label, set new macro next-line and return. - if ((*s2 == EOS) || ((int)chrtab[*s2] & WHITE)) - { - imacro->im_nextln = defln; - return 0; + s1++; + s2++; } } }