X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=procln.c;h=be57b7d7f366f53db548a34a7b16bf4d450711d5;hp=8917004b258d4cc6e74b7f2f6ecb751723486222;hb=39dff26a3bec02d03f6283657c45f33070ff7d7a;hpb=29fa5dcf504b966803063a1c2891f58f97126d04 diff --git a/procln.c b/procln.c index 8917004..be57b7d 100644 --- a/procln.c +++ b/procln.c @@ -1,7 +1,7 @@ // // RMAC - Reboot's Macro Assembler for all Atari computers // PROCLN.C - Line Processing -// Copyright (C) 199x Landon Dyer, 2011-2019 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -53,6 +53,7 @@ int disabled; // Assembly conditionally disabled int just_bss; // 1, ds.b in microprocessor mode uint32_t pcloc; // Value of "PC" at beginning of line SYM * lab_sym; // Label on line (or NULL) +char * label_defined; // The name of the last label defined in current line (if any) const char extra_stuff[] = "extra (unexpected) text found after addressing mode"; const char comma_error[] = "missing comma"; @@ -186,6 +187,7 @@ DEBUG { printf("Assemble: Found TKEOF flag...\n"); } state = -3; // No keyword (just EOL) label = NULL; // No label + label_defined = NULL; // No label defined yet lab_sym = NULL; // No (exported) label equate = NULL; // No equate tk = tok; // Save first token in line @@ -233,6 +235,8 @@ as68label: if (HandleLabel(label, labtyp) != 0) goto loop; + label_defined = label; + goto as68label; } } @@ -363,6 +367,8 @@ as68label: { if (HandleLabel(label, labtyp) != 0) goto loop; + + label_defined = label; } HandleRept(); @@ -597,6 +603,8 @@ When checking to see if it's already been equated, issue a warning. // Non-zero == error occurred if (HandleLabel(label, labtyp) != 0) goto loop; + + label_defined = label; } // Punt on EOL @@ -782,24 +790,11 @@ When checking to see if it's already been equated, issue a warning. parcode = 0; } -#if 1 while ((dsp_am0 & md->mn0) == 0 || (dsp_am1 & md->mn1) == 0) md = &dsp56k_machtab[md->mncont]; (*md->mnfunc)(md->mninst | (parcode << 8)); goto loop; -#else - for(;;) - { - if ((dsp_am0 & md->mn0) != 0 && (dsp_am1 & md->mn1) != 0) - { - (*md->mnfunc)(md->mninst|(parcode << 8)); - goto loop; - } - - md = &dsp56k_machtab[md->mncont]; - } -#endif } } @@ -850,8 +845,13 @@ When checking to see if it's already been equated, issue a warning. if (amode(1) < 0) // Parse 0, 1 or 2 addr modes goto loop; - if (*tok != EOL) - error(extra_stuff); + // Check that we're at EOL + // The only exception is ptestr/ptestw instructions + // that have 3 or 4 operands and are not handled by + // amode(). (yes, we're taking a performance hit here sadly) + if (m->mnfunc != m_ptestr && m->mnfunc != m_ptestw) + if (*tok != EOL) + error(extra_stuff); amsk0 = amsktab[am0]; amsk1 = amsktab[am1];