]> Shamusworld >> Repos - rmac/blobdiff - direct.c
Cleanups for the RISC assembler. Now at version 1.12.3.
[rmac] / direct.c
index 155fa3fb360821bc945bb0e8e3a79ffd6fe973a9..9e397198465be703203a32f2a16bf6d76e865fe6 100644 (file)
--- a/direct.c
+++ b/direct.c
@@ -1,7 +1,7 @@
 //
 // RMAC - Reboot's Macro Assembler for all Atari computers
 // DIRECT.C - Directive Handling
-// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends
 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
 // Source utilised with the kind permission of Landon Dyer
 //
@@ -11,6 +11,7 @@
 #include "amode.h"
 #include "error.h"
 #include "expr.h"
+#include "fltpoint.h"
 #include "listing.h"
 #include "mach.h"
 #include "macro.h"
@@ -20,8 +21,6 @@
 #include "sect.h"
 #include "symbol.h"
 #include "token.h"
-#include "math.h"
-#include "sect.h"
 
 #define DEF_KW
 #include "kwtab.h"
@@ -36,7 +35,6 @@ int largestAlign[3] = { 2, 2, 2 };    // Largest alignment value seen per section
 // Function prototypes
 int d_unimpl(void);
 int d_68000(void);
-int d_68000(void);
 int d_68020(void);
 int d_68030(void);
 int d_68040(void);
@@ -1149,43 +1147,46 @@ int d_dc(WORD siz)
                        D_quad(eval);
                        break;
                case SIZS:
+                       // 32-bit float size
                        if (m6502)
                                return error(in_6502mode);
 
                        if (!defined)
                        {
-                               float vv = 0;
                                AddFixup(FU_FLOATSING, sloc, exprbuf);
-
-                               D_single(vv);
+                               D_long(0);
                        }
                        else
                        {
                                if (tdb)
                                        MarkRelocatable(cursect, sloc, tdb, MSINGLE, NULL);
 
-                               D_single(eval);
+                               PTR ptr;
+                               ptr.u64 = &eval;
+                               uint32_t ieee754 = FloatToIEEE754((float)*ptr.dp);
+                               D_long(ieee754);
                        }
 
                        break;
                case SIZD:
+                       // 64-bit double size
                        if (m6502)
                                return error(in_6502mode);
 
                        if (!defined)
                        {
-                               double vv = 0;
                                AddFixup(FU_FLOATDOUB, sloc, exprbuf);
-
-                               D_double(vv);
+                               D_quad(0LL);
                        }
                        else
                        {
                                if (tdb)
                                        MarkRelocatable(cursect, sloc, tdb, MDOUBLE, NULL);
 
-                               double vv = *(double *)&eval;
-                               D_double(vv);
+                               PTR ptr;
+                               ptr.u64 = &eval;
+                               uint64_t ieee754 = DoubleToIEEE754(*ptr.dp);
+                               D_quad(ieee754);
                        }
 
                        break;
@@ -1193,20 +1194,23 @@ int d_dc(WORD siz)
                        if (m6502)
                                return error(in_6502mode);
 
+                       uint8_t extDbl[12];
+                       memset(extDbl, 0, 12);
+
                        if (!defined)
                        {
-                               double vv = 0;
                                AddFixup(FU_FLOATEXT, sloc, exprbuf);
-
-                               D_extend(vv);
+                               D_extend(extDbl);
                        }
                        else
                        {
                                if (tdb)
                                        MarkRelocatable(cursect, sloc, tdb, MEXTEND, NULL);
 
-                               float vv = *(double *)&eval;
-                               D_extend(vv);
+                               PTR ptr;
+                               ptr.u64 = &eval;
+                               DoubleToExtended(*ptr.dp, extDbl);
+                               D_extend(extDbl);
                        }
 
                        break;
@@ -1425,7 +1429,7 @@ int d_comm(void)
        p = string[tok[1]];
        tok += 2;
 
-       if (*p == '.')                                                  // Cannot .comm a local symbol
+       if (*p == '.')                                          // Cannot .comm a local symbol
                return error(locgl_error);
 
        if ((sym = lookup(p, LABEL, 0)) == NULL)
@@ -1441,10 +1445,10 @@ int d_comm(void)
        if (*tok++ != ',')
                return error(comma_error);
 
-       if (abs_expr(&eval) != OK)                              // Parse size of common region
+       if (abs_expr(&eval) != OK)                      // Parse size of common region
                return 0;
 
-       sym->svalue = (uint32_t)eval;                   // Install common symbol's size
+       sym->svalue = eval;                                     // Install common symbol's size
        at_eol();
        return 0;
 }
@@ -1531,29 +1535,29 @@ int d_68060(void)
 {
        d_68000();
        activecpu = CPU_68060;
-       activefpu = FPU_68040;
+       activefpu = FPU_68060;
        return 0;
 }
 
 
 //
-// .68881 - Back to 68000 TEXT segment and select 68881 FPU
+// .68881 - Back to 680x0 TEXT segment and select 68881 FPU
 //
 int d_68881(void)
 {
-       d_68000();
+       //d_68000();
        activefpu = FPU_68881;
        return 0;
 }
 
 
 //
-// .68882 - Back to 68000 TEXT segment and select 68882 FPU
+// .68882 - Back to 680x0 TEXT segment and select 68882 FPU
 //
 int d_68882(void)
 {
-       d_68000();
-       activefpu = FPU_68881;
+       //d_68000();
+       activefpu = FPU_68882;
        return 0;
 }
 
@@ -1684,7 +1688,7 @@ int d_cargs(void)
                        AddToSymbolDeclarationList(symbol);
 
                        symbol->sattr |= (ABS | DEFINED | EQUATED);
-                       symbol->svalue = (uint32_t)eval;
+                       symbol->svalue = eval;
                        tok += 2;
 
                        // What this does is eat any dot suffixes attached to a symbol. If
@@ -1811,7 +1815,7 @@ int d_cstruct(void)
                        }
 
                        symbol->sattr |= (ABS | DEFINED | EQUATED);
-                       symbol->svalue = (uint32_t)eval;
+                       symbol->svalue = eval;
 
                        // Check for dot suffixes and adjust space accordingly (longs and
                        // words on an odd boundary get bumped to the next word aligned