X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=sect.c;h=d4277fcc0aad7f501d4b2b89d179945ab3b60033;hp=21591a0219146b127a7321dbd07dcea4cab0ba1f;hb=062214e62031c26d372edc2e68473ebb64f6a506;hpb=9fb8931331db981c04e062a3ad36c0d79acb30ae diff --git a/sect.c b/sect.c index 21591a0..d4277fc 100644 --- a/sect.c +++ b/sect.c @@ -13,11 +13,15 @@ #include "listing.h" #include "mach.h" #include "mark.h" -#include "risca.h" +#include "riscasm.h" #include "symbol.h" #include "token.h" +// Function prototypes +void MakeSection(int, WORD); +void SwitchSection(int); + // Section descriptors SECT sect[NSECTS]; // All sections... int cursect; // Current section number @@ -38,10 +42,6 @@ LONG fchalloc; // # bytes alloc'd to fixup chunk LONG fchsize; // # bytes used in fixup chunk PTR fchptr; // Deposit point in fixup chunk buffer -// BOLLOCKS -//unsigned fwdjump[MAXFWDJUMPS]; // forward jump check table -//unsigned fwindex = 0; // forward jump index - // Return a size (SIZB, SIZW, SIZL) or 0, depending on what kind of fixup is // associated with a location. static char fusiztab[] = { @@ -68,10 +68,32 @@ static char fusizoffs[] = { }; +// +// Initialize Sections; Setup initial ABS, TEXT, DATA and BSS sections +// +void InitSection(void) +{ + int i; + + // Cleanup all sections + for(i=0; iscattr = attr; @@ -82,10 +104,10 @@ void mksect(int sno, WORD attr) // -// Switch to Another Section (Copy Section & Chunk Descriptors to Global Vars -// for Fast Access) +// Switch to another section (copy section & chunk descriptors to global vars +// for fast access) // -void switchsect(int sno) +void SwitchSection(int sno) { CHUNK * cp; // Chunk pointer cursect = sno; @@ -119,9 +141,9 @@ void switchsect(int sno) // -// Save Current Section +// Save current section // -void savsect(void) +void SaveSection(void) { SECT * p = §[cursect]; @@ -136,28 +158,6 @@ void savsect(void) } -// -// Initialize Sections; Setup initial ABS, TEXT, DATA and BSS sections -// -void init_sect(void) -{ - int i; - - // Cleanup all sections - for(i=0; i 0) - ship_ln(buf); - - if (err_flag) - write(err_fd, buf, (LONG)strlen(buf)); - else - printf("%s\n", buf); - } - } -#endif - return 0; } @@ -444,9 +422,11 @@ int ResolveFixups(int sno) if (ch == NULL) return 0; - CHUNK * cch = sc->sfcode; // "cache" first chunk + // "Cache" first chunk + CHUNK * cch = sc->sfcode; - if (cch == NULL) // Can't fixup a sect with nothing in it + // Can't fixup a sect with nothing in it + if (cch == NULL) return 0; do @@ -481,7 +461,8 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } if (cch == NULL) { - interror(7); // Fixup (loc) out of range + // Fixup (loc) out of range + interror(7); // NOTREACHED } } @@ -522,14 +503,20 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } // If the expression is undefined and no external symbol is // involved, then it's an error. - if (!(eattr & DEFINED) && esym == NULL) + if (!(eattr & DEFINED) && (esym == NULL)) { error(undef_error); continue; } - if (((w & 0x0F00) == FU_MOVEI) && esym) +// It seems that this is completely unnecessary! +#if 0 + if (((w & FUMASKRISC) == FU_MOVEI) && esym) +//{ +//printf("DoFixups: Setting symbol attre to RISCSYM...\n"); esym->sattre |= RISCSYM; +//} +#endif // Do the fixup // @@ -625,7 +612,7 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } // the word could be unaligned in the section buffer, so we have to // be careful. case FU_WORD: - if ((w & 0x0F00) == FU_JR)// || ((w & 0x0F00) == FU_MJR)) + if ((w & FUMASKRISC) == FU_JR)// || ((w & 0x0F00) == FU_MJR)) { oaddr = *fup.lp++; @@ -685,7 +672,7 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } break; } - if ((w & 0x0F00) == FU_NUM15) + if ((w & FUMASKRISC) == FU_NUM15) { if (eval < -16 || eval > 15) { @@ -699,7 +686,7 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } break; } - if ((w & 0x0F00) == FU_NUM31) + if ((w & FUMASKRISC) == FU_NUM31) { if (eval < 0 || eval > 31) { @@ -713,7 +700,7 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } break; } - if ((w & 0x0F00) == FU_NUM32) + if ((w & FUMASKRISC) == FU_NUM32) { if (eval < 1 || eval > 32) { @@ -731,7 +718,7 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } break; } - if ((w & 0x0F00) == FU_REGONE) + if ((w & FUMASKRISC) == FU_REGONE) { if (eval < 0 || eval > 31) { @@ -745,7 +732,7 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } break; } - if ((w & 0x0F00) == FU_REGTWO) + if ((w & FUMASKRISC) == FU_REGTWO) { if (eval < 0 || eval > 31) { @@ -797,7 +784,7 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } // the long could be unaligned in the section buffer, so be careful // (again). case FU_LONG: - if ((w & 0x0F00) == FU_MOVEI) + if ((w & FUMASKRISC) == FU_MOVEI) { #if 0 address = loc + 4; @@ -851,6 +838,7 @@ DEBUG { printf("ResolveFixups: cfileno=%u\n", cfileno); } } #endif + // Long constant in MOVEI # is word-swapped, so fix it here eval = ((eval >> 16) & 0x0000FFFF) | ((eval << 16) & 0xFFFF0000); flags = (MLONG | MMOVEI); }