ref: bfdbd000927825cb9bb68d9802ddf95f19c6a35e
parent: d0278d86638bc7b2beb621a6e16be42735779eac
author: ISSOtm <[email protected]>
date: Mon Feb 3 17:52:46 EST 2020
Do some misc cleanup of `output.c`
--- a/include/asm/output.h
+++ b/include/asm/output.h
@@ -13,9 +13,11 @@
#include "asm/rpn.h"
+#include "linkdefs.h"
+
struct Section {
char *pzName;
- uint8_t nType;
+ enum SectionType nType;
uint32_t nPC;
uint32_t nOrg;
uint32_t nBank;
--- a/src/asm/output.c
+++ b/src/asm/output.c
@@ -110,31 +110,6 @@
free(pSect);
}
-static uint32_t getmaxsectionsize(uint32_t secttype, char *sectname)
-{
- switch (secttype) {
- case SECTTYPE_ROM0:
- return 0x8000; /* If ROMX sections not used */
- case SECTTYPE_ROMX:
- return 0x4000;
- case SECTTYPE_VRAM:
- return 0x2000;
- case SECTTYPE_SRAM:
- return 0x2000;
- case SECTTYPE_WRAM0:
- return 0x2000; /* If WRAMX sections not used */
- case SECTTYPE_WRAMX:
- return 0x1000;
- case SECTTYPE_OAM:
- return 0xA0;
- case SECTTYPE_HRAM:
- return 0x7F;
- default:
- break;
- }
- errx(1, "Section \"%s\" has an invalid section type.", sectname);
-}
-
/*
* Count the number of symbols used in this object
*/
@@ -144,13 +119,12 @@
uint32_t count = 0;
pSym = pPatchSymbols;
-
while (pSym) {
count++;
pSym = pSym->pNext;
}
- return (count);
+ return count;
}
/*
@@ -162,13 +136,12 @@
uint32_t count = 0;
pSect = pSectionList;
-
while (pSect) {
count++;
pSect = pSect->pNext;
}
- return (count);
+ return count;
}
/*
@@ -185,7 +158,7 @@
pPatch = pPatch->pNext;
}
- return (r);
+ return r;
}
/*
@@ -226,8 +199,7 @@
sec = sec->pNext;
}
- fatalerror("%s: Unknown section", __func__);
- return (uint32_t)(-1);
+ fatalerror("Unknown section '%s'", pSect->pzName);
}
/*
@@ -513,12 +485,12 @@
static void checkcodesection(void)
{
checksection();
- if (!sect_HasData(pCurrentSection->nType)) {
+
+ if (!sect_HasData(pCurrentSection->nType))
fatalerror("Section '%s' cannot contain code or data (not ROM0 or ROMX)",
pCurrentSection->pzName);
- } else if (nUnionDepth > 0) {
+ else if (nUnionDepth > 0)
fatalerror("UNIONs cannot contain code or data");
- }
}
/*
@@ -526,8 +498,7 @@
*/
static void checksectionoverflow(uint32_t delta_size)
{
- uint32_t maxSize = getmaxsectionsize(pCurrentSection->nType,
- pCurrentSection->pzName);
+ uint32_t maxSize = maxsize[pCurrentSection->nType];
uint32_t newSize = pCurrentSection->nPC + delta_size;
if (newSize > maxSize) {
@@ -623,8 +594,8 @@
/*
* Find a section by name and type. If it doesn't exist, create it
*/
-struct Section *out_FindSection(char *pzName, uint32_t secttype, int32_t org,
- int32_t bank, int32_t alignment)
+struct Section *out_FindSection(char *pzName, enum SectionType secttype,
+ int32_t org, int32_t bank, int32_t alignment)
{
struct Section *pSect = out_FindSectionByName(pzName);
@@ -638,7 +609,7 @@
fatalerror("Section already exists but with a different type");
}
- pSect = malloc(sizeof(struct Section));
+ pSect = malloc(sizeof(*pSect));
if (pSect == NULL)
fatalerror("Not enough memory for section");
@@ -646,14 +617,8 @@
if (pSect->pzName == NULL)
fatalerror("Not enough memory for sectionname");
- // Force the bank to be 0 if that's the only possibility
- switch (secttype) {
- case SECTTYPE_ROM0:
- case SECTTYPE_WRAM0:
- case SECTTYPE_OAM:
- case SECTTYPE_HRAM:
- bank = 0;
- }
+ if (nbbanks(secttype) == 1)
+ bank = bankranges[secttype][0];
pSect->nType = secttype;
pSect->nPC = 0;
@@ -667,7 +632,7 @@
if (sect_HasData(secttype)) {
uint32_t sectsize;
- sectsize = getmaxsectionsize(secttype, pzName);
+ sectsize = maxsize[secttype];
pSect->tData = malloc(sectsize);
if (pSect->tData == NULL)
fatalerror("Not enough memory for section");