]> Shamusworld >> Repos - rmac/blobdiff - direct.c
Fix for "*" getting bad section attributes, reported by A. Seed.
[rmac] / direct.c
index 77fda019a62dd459a106f98959aac8be486a769b..3146c5345599c18d9703daa1c787ce157e961ceb 100644 (file)
--- a/direct.c
+++ b/direct.c
@@ -3,7 +3,7 @@
 // DIRECT.C - Directive Handling
 // Copyright (C) 199x Landon Dyer, 2011 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
 //
 
 #include "direct.h"
@@ -116,19 +116,19 @@ int d_org(void)
 
 
 //
-// Print Directive
+// Print directive
 //
 int d_print(void)
 {
-       char prntstr[LNSIZ];                                    // String for PRINT directive
-       char format[LNSIZ];                                             // Format for PRINT directive
-       int formatting = 0;                                             // Formatting on/off
-       int wordlong = 0;                                               // WORD = 0, LONG = 1
-       int outtype = 0;                                                // 0:hex, 1:decimal, 2:unsigned
-
-       VALUE eval;                                                             // Expression value
-       WORD eattr;                                                             // Expression attributes
-       SYM * esym;                                                             // External symbol involved in expr.
+       char prntstr[LNSIZ];            // String for PRINT directive
+       char format[LNSIZ];                     // Format for PRINT directive
+       int formatting = 0;                     // Formatting on/off
+       int wordlong = 0;                       // WORD = 0, LONG = 1
+       int outtype = 0;                        // 0:hex, 1:decimal, 2:unsigned
+
+       VALUE eval;                                     // Expression value
+       WORD eattr;                                     // Expression attributes
+       SYM * esym;                                     // External symbol involved in expr.
        TOKEN r_expr[EXPRSIZE];
 
        while (*tok != EOL)
@@ -136,7 +136,6 @@ int d_print(void)
                switch(*tok)
                {
                case STRING:
-//                     sprintf(prntstr, "%s", (char *)tok[1]);
                        sprintf(prntstr, "%s", string[tok[1]]);
                        printf("%s", prntstr);
 
@@ -203,7 +202,6 @@ int d_print(void)
        }
 
        printf("\n");
-//     println("\n");
 
        return 0;
 
@@ -214,7 +212,7 @@ token_err:
 
 
 //
-// Undefine an Equated Condition Code
+// Undefine an equated condition code
 //
 int d_ccundef(void)
 {
@@ -229,12 +227,10 @@ int d_ccundef(void)
 
        if (*tok != SYMBOL)
        {
-//             error(syntax_error);
                error("syntax error; expected symbol");
                return ERROR;
        }
 
-//     ccname = lookup((char *)tok[1], LABEL, 0);
        ccname = lookup(string[tok[1]], LABEL, 0);
 
        // Make sure symbol is a valid ccdef
@@ -251,7 +247,7 @@ int d_ccundef(void)
 
 
 //
-// Undefine an Equated Register
+// Undefine an equated register
 //
 int d_equrundef(void)
 {
@@ -275,7 +271,12 @@ int d_equrundef(void)
                regname = lookup(string[tok[1]], LABEL, 0);
 
                if (regname && (regname->sattre & EQUATEDREG))
+               {
+                       // Reset the attributes of this symbol...
+                       regname->sattr = 0;
+                       regname->sattre &= ~(EQUATEDREG | BANK_0 | BANK_1);
                        regname->sattre |= UNDEF_EQUR;
+               }
 
                // Skip over symbol token and address
                tok += 2;
@@ -286,7 +287,7 @@ int d_equrundef(void)
 
 
 //
-// Do Not Allow the Use of the CLR.L Opcode
+// Do not allow use of the CLR.L opcode
 //
 int d_noclear(void)
 {
@@ -295,7 +296,7 @@ int d_noclear(void)
 
 
 // 
-// Include Binary File
+// Include binary file
 //
 int d_incbin(void)
 {
@@ -354,7 +355,7 @@ int d_incbin(void)
 
 
 // 
-// Set RISC Register Banks
+// Set RISC register banks
 //
 int d_regbank0(void)
 {
@@ -396,13 +397,12 @@ static inline void SkipBytes(unsigned bytesToSkip)
 
 
 //
-// Adjust Location to an EVEN Value
+// Adjust location to an EVEN value
 //
 int d_even(void)
 {
        unsigned skip = (rgpu || rdsp ? orgaddr : sloc) & 0x01;
        
-//     if (sloc & 1)
        if (skip)
        {
                if ((scattr & SBSS) == 0)
@@ -424,7 +424,7 @@ int d_even(void)
 
 
 //
-// Adjust Location to an LONG Value
+// Adjust location to a LONG value
 //
 int d_long(void)
 {
@@ -437,7 +437,7 @@ int d_long(void)
 
 
 //
-// Adjust Location to an PHRASE Value
+// Adjust location to a PHRASE value
 //
 // N.B.: We have to handle the GPU/DSP cases separately because you can embed
 //       RISC code in the middle of a regular 68K section. Also note that all
@@ -459,7 +459,7 @@ int d_phrase(void)
 
 
 //
-// Adjust Location to an DPHRASE Value
+// Adjust location to a DPHRASE value
 //
 int d_dphrase(void)
 {
@@ -472,7 +472,7 @@ int d_dphrase(void)
 
 
 //
-// Adjust Location to an QPHRASE Value
+// Adjust location to a QPHRASE value
 //
 int d_qphrase(void)
 {
@@ -497,17 +497,17 @@ int d_qphrase(void)
 void auto_even(void)
 {
        if (scattr & SBSS)
-               sloc++;                           // Bump BSS section
+               sloc++;                         // Bump BSS section
        else
-               D_byte(0);                        // Deposit 0.b in non-BSS
+               D_byte(0);                      // Deposit 0.b in non-BSS
 
-       if (lab_sym != NULL)                  // Bump label if we have to
-               ++lab_sym->svalue;
+       if (lab_sym != NULL)    // Bump label if we have to
+               lab_sym->svalue++;
 }
 
 
 //
-// Unimplemened Directive Error
+// Unimplemened directive error
 //
 int d_unimpl(void)
 {
@@ -576,23 +576,15 @@ int d_include(void)
        char buf[128];
        char buf1[128];
 
-       if (*tok == STRING)                                                     // Leave strings ALONE 
-#if 0
-               fn = (char *)*++tok;
-#else
+       if (*tok == STRING)                     // Leave strings ALONE 
                fn = string[*++tok];
-#endif
-       else if (*tok == SYMBOL)                                        // Try to append ".s" to symbols
+       else if (*tok == SYMBOL)        // Try to append ".s" to symbols
        {
-#if 0
-               strcpy(buf, (char *)*++tok);
-#else
                strcpy(buf, string[*++tok]);
-#endif
                fext(buf, ".s", 0);
                fn = &buf[0];
        }
-       else                                                                            // Punt if no STRING or SYMBOL 
+       else                                            // Punt if no STRING or SYMBOL 
                return error("missing filename");
 
        // Make sure the user didn't try anything like:
@@ -704,9 +696,8 @@ int d_abs(void)
 
 
 //
-// Switch Segments
+// Switch segments
 //
-
 int d_text(void)
 {
        if (rgpu || rdsp)
@@ -1110,7 +1101,6 @@ int d_comm(void)
        if (*tok != SYMBOL)
                return error("missing symbol");
 
-//     p = (char *)tok[1];
        p = string[tok[1]];
        tok += 2;
 
@@ -1179,7 +1169,7 @@ int d_68000(void)
 
 
 //
-// .gpu - Switch to GPU Assembler
+// .gpu - Switch to GPU assembler
 //
 int d_gpu(void)
 {
@@ -1206,7 +1196,7 @@ int d_gpu(void)
 
 
 //
-// .dsp - Switch to DSP Assembler
+// .dsp - Switch to DSP assembler
 //
 int d_dsp(void)
 {
@@ -1269,18 +1259,10 @@ int d_cargs(void)
        {
                if (*tok == SYMBOL)
                {
-//                     p = (char *)tok[1];
                        p = string[tok[1]];
 
-#if 0
-                       if (*p == '.')
-                               env = curenv;                   // Label is local
-                       else
-                               env = 0;                                // Label is global
-#else
                        // Set env to either local (dot prefixed) or global scope
                        env = (*p == '.' ? curenv : 0);
-#endif
                        symbol = lookup(p, LABEL, env);
 
                        if (symbol == NULL)
@@ -1292,8 +1274,7 @@ int d_cargs(void)
                                return errors("multiply-defined label '%s'", p);
 
                        // Put symbol in "order of definition" list
-                       if (!(symbol->sattr & SDECLLIST))
-                               AddToSymbolOrderList(symbol);
+                       AddToSymbolDeclarationList(symbol);
 
                        symbol->sattr |= (ABS | DEFINED | EQUATED);
                        symbol->svalue = eval;
@@ -1318,7 +1299,6 @@ int d_cargs(void)
                        if (reglist(&rlist) < 0)
                                return 0;
 
-//                     for(i=0; i++<16; rlist>>=1)
                        for(i=0; i<16; i++, rlist>>=1)
                        {
                                if (rlist & 1)
@@ -1410,8 +1390,7 @@ int d_cstruct(void)
                                return errors("multiply-defined label '%s'", symbolName);
 
                        // Put symbol in "order of definition" list
-                       if (!(symbol->sattr & SDECLLIST))
-                               AddToSymbolOrderList(symbol);
+                       AddToSymbolDeclarationList(symbol);
 
                        tok += 2;