X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=9e397198465be703203a32f2a16bf6d76e865fe6;hp=155fa3fb360821bc945bb0e8e3a79ffd6fe973a9;hb=4ca3c2db2690ab998707415f8555ecd2fabc6ef2;hpb=eace4e1b294ccec54a5c476619f616f5da0bf8a9 diff --git a/direct.c b/direct.c index 155fa3f..9e39719 100644 --- 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