shithub: rgbds

Download patch

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();