//
// 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
//
#include "amode.h"
#include "error.h"
#include "expr.h"
+#include "fltpoint.h"
#include "listing.h"
#include "mach.h"
#include "macro.h"
#define DEF_KW
#include "kwtab.h"
+
TOKEN exprbuf[128]; // Expression buffer
SYM * symbolPtr[1000000]; // Symbol pointers table
static long unused; // For supressing 'write' warnings
// 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);
return error("PRGFLAGS requires value");
else if (abs_expr(&eval) == OK)
{
- PRGFLAGS=eval;
+ PRGFLAGS = (uint32_t)eval;
return 0;
}
else
return 0;
SwitchSection(ABS);
- sloc = eval;
+ sloc = (uint32_t)eval;
return 0;
}
// of zeroed memory....
if ((scattr & SBSS) || cursect == M6502)
{
- listvalue(eval);
+ listvalue((uint32_t)eval);
eval *= siz;
- sloc += eval;
+ sloc += (uint32_t)eval;
if (cursect == M6502)
chptr += eval;
//
-// dc.b, dc.w / dc, dc.l, dc.i
+// dc.b, dc.w / dc, dc.l, dc.i, dc.q, dc.d
//
int d_dc(WORD siz)
{
D_long(eval);
}
break;
- case SIZD:
+ case SIZQ:
// 64-bit size
- // N.B.: May have to come up with section/fixup markers for this;
- // ATM it's only used in dc.d statements...
- D_long(eval >> 32);
- D_long(eval & 0xFFFFFFFF);
+ if (m6502)
+ return error(in_6502mode);
+
+ // Shamus: We only handle DC.Q type stuff, will have to add fixups
+ // and stuff later (maybe... might not be needed...)
+ D_quad(eval);
+ break;
+ case SIZS:
+ // 32-bit float size
+ if (m6502)
+ return error(in_6502mode);
+
+ if (!defined)
+ {
+ AddFixup(FU_FLOATSING, sloc, exprbuf);
+ D_long(0);
+ }
+ else
+ {
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MSINGLE, NULL);
+
+ 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)
+ {
+ AddFixup(FU_FLOATDOUB, sloc, exprbuf);
+ D_quad(0LL);
+ }
+ else
+ {
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MDOUBLE, NULL);
+
+ PTR ptr;
+ ptr.u64 = &eval;
+ uint64_t ieee754 = DoubleToIEEE754(*ptr.dp);
+ D_quad(ieee754);
+ }
+
+ break;
+ case SIZX:
+ if (m6502)
+ return error(in_6502mode);
+
+ uint8_t extDbl[12];
+ memset(extDbl, 0, 12);
+
+ if (!defined)
+ {
+ AddFixup(FU_FLOATEXT, sloc, exprbuf);
+ D_extend(extDbl);
+ }
+ else
+ {
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MEXTEND, NULL);
+
+ PTR ptr;
+ ptr.u64 = &eval;
+ DoubleToExtended(*ptr.dp, extDbl);
+ D_extend(extDbl);
+ }
+
break;
}
if (cursect != M6502 && (siz != SIZB) && (sloc & 1))
auto_even();
- dep_block(evalc, siz, eval, eattr, exprbuf);
+ dep_block((uint32_t)evalc, siz, (uint32_t)eval, eattr, exprbuf);
return 0;
}
// Get repeat count (defaults to 1)
if (*tok == '#')
{
- ++tok;
+ tok++;
if (abs_expr(&count) != OK)
return 0;
if (expr(exprbuf, &eval, &eattr, NULL) < 0)
return 0;
- switch ((int)*tok++)
+ switch (*tok++)
{ // Determine size of object to deposit
case DOTB: siz = SIZB; break;
case DOTW: siz = SIZB; break;
break;
}
- dep_block(count, siz, eval, eattr, exprbuf);
+ dep_block((uint32_t)count, siz, (uint32_t)eval, eattr, exprbuf);
- switch ((int)*tok)
+ switch (*tok)
{
case EOL:
return 0;
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)
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 = eval; // Install common symbol's size
+ sym->svalue = eval; // Install common symbol's size
at_eol();
return 0;
}
{
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;
}
return ERROR;
}
- // If previous section was dsp or 68000 then we need to reset ORG'd Addresses
+ // If previous section was DSP or 68000 then we need to reset ORG'd Addresses
if (!rgpu)
{
-//printf("Resetting ORG...\n");
orgactive = 0;
orgwarning = 0;
}
-//else printf("NOT resetting ORG!\n");
rgpu = 1; // Set GPU assembly
rdsp = 0; // Unset DSP assembly