diff --git a/include/link/mylink.h b/include/link/mylink.h index 707d5fbf..dcf8d696 100644 --- a/include/link/mylink.h +++ b/include/link/mylink.h @@ -10,6 +10,7 @@ extern SLONG options; #define OPT_SMALL 0x01 #define OPT_SMART_C_LINK 0x02 +#define OPT_CONTWRAM 0x04 enum eRpnData { RPN_ADD = 0, diff --git a/src/link/assign.c b/src/link/assign.c index e602ebd7..333b0d75 100644 --- a/src/link/assign.c +++ b/src/link/assign.c @@ -60,7 +60,7 @@ ensureSectionTypeIsValid(enum eSectionType type) } } -SLONG +SLONG area_Avail(SLONG bank) { SLONG r; @@ -131,7 +131,7 @@ area_AllocAbsAnyBank(SLONG org, SLONG size, enum eSectionType type) SLONG startBank = SECT_ATTRIBUTES[type].bank; SLONG bankCount = SECT_ATTRIBUTES[type].bankCount; - + for (int i = 0; i < bankCount; i++) { if (area_AllocAbs(&BankFree[startBank + i], org, size) != -1) { return startBank + i; @@ -141,7 +141,7 @@ area_AllocAbsAnyBank(SLONG org, SLONG size, enum eSectionType type) return -1; } -SLONG +SLONG area_Alloc(struct sFreeArea ** ppArea, SLONG size) { struct sFreeArea *pArea; @@ -170,7 +170,7 @@ area_AllocAnyBank(SLONG size, enum eSectionType type) { SLONG startBank = SECT_ATTRIBUTES[type].bank; SLONG bankCount = SECT_ATTRIBUTES[type].bankCount; - + for (int i = 0; i < bankCount; i++) { SLONG org = area_Alloc(&BankFree[startBank + i], size); if (org != -1) { @@ -231,7 +231,7 @@ VerifyAndSetBank(struct sSection *pSection) && pSection->nBank < SECT_ATTRIBUTES[pSection->Type].minBank + SECT_ATTRIBUTES[pSection->Type].bankCount) { pSection->nBank += SECT_ATTRIBUTES[pSection->Type].bank + SECT_ATTRIBUTES[pSection->Type].offset; return true; - + } else { return false; } @@ -280,7 +280,11 @@ AssignSections(void) } else if (i == BANK_WRAM0) { /* WRAM */ BankFree[i]->nOrg = 0xC000; - BankFree[i]->nSize = 0x1000; + if (options & OPT_CONTWRAM) { + BankFree[i]->nSize = 0x2000; + } else { + BankFree[i]->nSize = 0x1000; + } } else if (i >= BANK_SRAM && i < BANK_SRAM + BANK_COUNT_SRAM) { /* Swappable SRAM bank */ BankFree[i]->nOrg = 0xA000; @@ -300,7 +304,7 @@ AssignSections(void) } else { errx(1, "(INTERNAL) Unknown bank type!"); } - + MaxAvail[i] = BankFree[i]->nSize; BankFree[i]->pPrev = NULL; BankFree[i]->pNext = NULL; @@ -318,6 +322,10 @@ AssignSections(void) && pSection->oAssigned == 0) { /* User wants to have a say... */ + if (pSection->Type == SECT_WRAMX && options & OPT_CONTWRAM) { + errx(1, "WRAMX not compatible with -w!"); + } + switch (pSection->Type) { case SECT_WRAM0: case SECT_HRAM: @@ -407,7 +415,7 @@ AssignSections(void) pSection->oAssigned = 1; DOMAXBANK(pSection->Type, pSection->nBank); break; - + default: // Handle other sections later break; } @@ -458,7 +466,7 @@ AssignSections(void) AssignBankedSections(SECT_SRAM); } -void +void CreateSymbolTable(void) { struct sSection *pSect; diff --git a/src/link/main.c b/src/link/main.c index 8eda44a8..05e4418e 100644 --- a/src/link/main.c +++ b/src/link/main.c @@ -31,11 +31,11 @@ char *progname; * */ -static void +static void usage(void) { printf( -"usage: rgblink [-t] [-m mapfile] [-n symfile] [-o outfile] [-p pad_value]\n" +"usage: rgblink [-tw] [-m mapfile] [-n symfile] [-o outfile] [-p pad_value]\n" " [-s symbol] file [...]\n"); exit(1); } @@ -45,7 +45,7 @@ usage(void) * */ -int +int main(int argc, char *argv[]) { int ch; @@ -56,7 +56,7 @@ main(int argc, char *argv[]) progname = argv[0]; - while ((ch = getopt(argc, argv, "m:n:o:p:s:t")) != -1) { + while ((ch = getopt(argc, argv, "m:n:o:p:s:t:w")) != -1) { switch (ch) { case 'm': SetMapfileName(optarg); @@ -84,6 +84,12 @@ main(int argc, char *argv[]) case 't': options |= OPT_SMALL; break; + case 'w': + /* Set to set WRAM as a single continuous block as on DMG. + All WRAM sections must be WRAM0 as bankable WRAM sections do + not exist in this mode. A WRAMX section will raise an error. */ + options |= OPT_CONTWRAM; + break; default: usage(); /* NOTREACHED */