X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=7447553694944895c62c5e94dd428ba34c62ca4f;hp=7c480357c4e801b9420dd1ea1ad4b873a211a454;hb=3b063cd8b11b5e868efec02f9e281a1e04f2707b;hpb=582df8950c285e1746d0c4a9e3ead6545c962dc8 diff --git a/direct.c b/direct.c index 7c48035..7447553 100644 --- a/direct.c +++ b/direct.c @@ -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,12 +21,11 @@ #include "sect.h" #include "symbol.h" #include "token.h" -#include "math.h" -#include "sect.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 @@ -998,15 +998,12 @@ int d_ds(WORD siz) // -// 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) { WORD eattr; uint64_t eval; - WORD tdb; - WORD defined; - uint64_t val64; uint8_t * p; if ((scattr & SBSS) != 0) @@ -1061,26 +1058,14 @@ int d_dc(WORD siz) siz = SIZL; } - if (siz != SIZQ) - { // dc.x SYM * esym = 0; if (expr(exprbuf, &eval, &eattr, &esym) != OK) return 0; - } - else - { - val64 = *(uint64_t *)(tok); - tok = tok + 2; - D_long((uint32_t)(val64 >> 32)); - D_long((uint32_t)val64); - - goto comma; - } - tdb = (WORD)(eattr & TDB); - defined = (WORD)(eattr & DEFINED); + uint16_t tdb = eattr & TDB; + uint16_t defined = eattr & DEFINED; if ((challoc - ch_size) < 4) chcheck(4); @@ -1153,70 +1138,85 @@ int d_dc(WORD siz) D_long(eval); } break; + case SIZQ: + // 64-bit size + 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) { - 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 { - double vv; if (tdb) MarkRelocatable(cursect, sloc, tdb, MDOUBLE, NULL); - vv = *(double *)&eval; - D_double(vv); + 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) { - double vv = 0; AddFixup(FU_FLOATEXT, sloc, exprbuf); - - D_extend(vv); + D_extend(extDbl); } else { - float vv; if (tdb) MarkRelocatable(cursect, sloc, tdb, MEXTEND, NULL); - vv = *(double *)&eval; - D_extend(vv); + PTR ptr; + ptr.u64 = &eval; + DoubleToExtended(*ptr.dp, extDbl); + D_extend(extDbl); } + break; } - comma: if (*tok != ',') break; @@ -1285,7 +1285,7 @@ int d_init(WORD def_siz) // Get repeat count (defaults to 1) if (*tok == '#') { - ++tok; + tok++; if (abs_expr(&count) != OK) return 0; @@ -1300,7 +1300,7 @@ int d_init(WORD def_siz) 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; @@ -1313,7 +1313,7 @@ int d_init(WORD def_siz) dep_block((uint32_t)count, siz, (uint32_t)eval, eattr, exprbuf); - switch ((int)*tok) + switch (*tok) { case EOL: return 0; @@ -1593,14 +1593,12 @@ int d_gpu(void) 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