X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=symbol.c;h=f8a43d6ff62e189492914cf0646354ed1c994b58;hp=b89cd8091587571de30190d93d932a025fe6ce36;hb=4205233c8397c581b4d27ab36ab81ec896ef3dd0;hpb=ba392fd1c677a8aeb55cbaf81bc529f16c02e804 diff --git a/symbol.c b/symbol.c index b89cd80..f8a43d6 100644 --- a/symbol.c +++ b/symbol.c @@ -1,12 +1,13 @@ // -// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System +// RMAC - Reboot's Macro Assembler for all Atari computers // SYMBOL.C - Symbol Handling -// Copyright (C) 199x Landon Dyer, 2011-2012 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // #include "symbol.h" +#include "dsp56k.h" #include "error.h" #include "listing.h" #include "object.h" @@ -35,6 +36,9 @@ static uint8_t tdb_text[8] = { 'a', 't', 'd', '!', 'b', SPACE, SPACE, SPACE }; +// Internal function prototypes +static uint16_t WriteLODSection(int, uint16_t); + // // Initialize symbol table @@ -260,22 +264,6 @@ uint32_t sy_assign(uint8_t * buf, uint8_t *(* construct)()) } } - // For ELF object mode run through all symbols in reference order - // and export all global-referenced labels. Not sure if this is - // required but it's here nonetheless -/* why?? when you have sy_assign_ELF ??? - if (obj_format == ELF) - { - for(sy=sdecl; sy!=NULL; sy=sy->sorder) - { - if ((sy->sattr == (GLOBAL | REFERENCED)) && (buf != NULL)) - { - buf = (*construct)(buf, sy, 0); - scount++; - } - } - }*/ - return scount; } @@ -305,27 +293,12 @@ uint32_t sy_assign_ELF(uint8_t * buf, uint8_t *(* construct)()) // them. We also pick which symbols should be global or not here. for(SYM * sy=sdecl; sy!=NULL; sy=sy->sdecl) { - // Export or import external references, and export COMMON blocks. - //if ((sy->stype == LABEL) - // && ((sy->sattr & (GLOBAL | DEFINED)) == (GLOBAL | DEFINED) - // || (sy->sattr & (GLOBAL | REFERENCED)) == (GLOBAL | REFERENCED)) - // || (sy->sattr & COMMON)) - //{ - // sy->senv = (WORD)scount++; - // - // if (buf != NULL) - // buf = (*construct)(buf, sy, 1); - //} // Export vanilla labels (but don't make them global). An exception is // made for equates, which are not exported unless they are referenced. if (sy->stype == LABEL && lsym_flag && (sy->sattr & (DEFINED | REFERENCED)) != 0 && (*sy->sname != '.') && (sy->sattr & GLOBAL) == 0) - //if (sy->stype == 0) - // if (lsym_flag) - // if ((sy->sattr & (DEFINED | REFERENCED)) != 0) - // if ((!as68_flag || *sy->sname != 'L')) { sy->senv = scount++; @@ -340,7 +313,6 @@ uint32_t sy_assign_ELF(uint8_t * buf, uint8_t *(* construct)()) // and export all global-referenced labels. Not sure if this is // required but it's here nonetheless - //for(sy=sdecl; sy!=NULL; sy=sy->sorder) for(SYM * sy=sdecl; sy!=NULL; sy=sy->sdecl) { if ((sy->stype == LABEL) @@ -364,6 +336,53 @@ uint32_t sy_assign_ELF(uint8_t * buf, uint8_t *(* construct)()) } +// +// Helper function for dsp_lod_symbols +// +static uint16_t WriteLODSection(int section, uint16_t symbolCount) +{ + for(SYM * sy=sdecl; sy!=NULL; sy=sy->sdecl) + { + // Export vanilla labels (but don't make them global). An exception is + // made for equates, which are not exported unless they are referenced. + if (sy->stype == LABEL && lsym_flag + && (sy->sattr & (DEFINED | REFERENCED)) != 0 + && (*sy->sname != '.') + && (sy->sattr & GLOBAL) == 0 + && (sy->sattr & (section))) + { + sy->senv = symbolCount++; + D_printf("%-19s I %.6" PRIX64 "\n", sy->sname, sy->svalue); + } + } + + return symbolCount; +} + + +// +// Dump LOD style symbols into the passed in buffer +// +void DumpLODSymbols(void) +{ + D_printf("_SYMBOL P\n"); + uint16_t count = WriteLODSection(M56001P, 0); + + D_printf("_SYMBOL X\n"); + count = WriteLODSection(M56001X, count); + + D_printf("_SYMBOL Y\n"); + count = WriteLODSection(M56001Y, count); + + D_printf("_SYMBOL L\n"); + count = WriteLODSection(M56001L, count); + + // TODO: I've seen _SYMBOL N in there but no idea what symbols it needs... + //D_printf("_SYMBOL N\n"); + //WriteLODSection(M56001?, count); +} + + // // Convert string to uppercase // @@ -382,7 +401,6 @@ void ToUppercase(uint8_t * s) // int symtable(void) { - extern int pagelen; int i; int j; SYM * q = NULL; @@ -390,8 +408,8 @@ int symtable(void) SYM * r; SYM * k; SYM * colptr[4]; - char ln[200]; - char ln1[200]; + char ln[1024]; + char ln1[1024]; char ln2[20]; char c, c1; WORD w; @@ -514,7 +532,7 @@ int symtable(void) strcpy(ln2, "external"); else { - sprintf(ln2, "%08X", q->svalue); + sprintf(ln2, "%016lX", q->svalue); ToUppercase(ln2); }