ref: 6d1c60b0a6ad8160e92f1739cf5d92cdd61b4237
parent: 5ee058f21718406ff4cd5cd3c0c4811512ed167a
author: scnorton <[email protected]>
date: Mon Feb 6 11:11:17 EST 2017
Contiguous WRAM
--- 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,
--- a/src/link/assign.c
+++ b/src/link/assign.c
@@ -60,7 +60,7 @@
}
}
-SLONG
+SLONG
area_Avail(SLONG bank)
{
SLONG r;
@@ -131,7 +131,7 @@
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 @@
return -1;
}
-SLONG
+SLONG
area_Alloc(struct sFreeArea ** ppArea, SLONG size)
{
struct sFreeArea *pArea;
@@ -170,7 +170,7 @@
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 @@
&& 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 @@
} 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 @@
} else {
errx(1, "(INTERNAL) Unknown bank type!");
}
-
+
MaxAvail[i] = BankFree[i]->nSize;
BankFree[i]->pPrev = NULL;
BankFree[i]->pNext = NULL;
@@ -318,6 +322,10 @@
&& 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 @@
pSection->oAssigned = 1;
DOMAXBANK(pSection->Type, pSection->nBank);
break;
-
+
default: // Handle other sections later
break;
}
@@ -458,7 +466,7 @@
AssignBankedSections(SECT_SRAM);
}
-void
+void
CreateSymbolTable(void)
{
struct sSection *pSect;
--- a/src/link/main.c
+++ b/src/link/main.c
@@ -31,11 +31,11 @@
*
*/
-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 @@
*
*/
-int
+int
main(int argc, char *argv[])
{
int ch;
@@ -56,7 +56,7 @@
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);
@@ -83,6 +83,12 @@
break;
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();