shithub: rgbds

Download patch

ref: 720ae59af856641babb2da019cc64b2dbfeabe92
parent: 2abdc9c59db277aa203f28da343f3b65ec47df8e
parent: f431b384a2b8c1d90e5de30a270b73e1776e8cec
author: AntonioND <[email protected]>
date: Tue Apr 4 17:42:20 EDT 2017

Merge pull request #154 from AntonioND/an/tiny-contwram

Make the options -t and -w of rgblink consistent

--- a/include/link/mylink.h
+++ b/include/link/mylink.h
@@ -8,7 +8,7 @@
 #include "types.h"
 
 extern SLONG options;
-#define OPT_SMALL		0x01
+#define OPT_TINY		0x01
 #define OPT_SMART_C_LINK	0x02
 #define OPT_OVERLAY		0x04
 #define OPT_CONTWRAM		0x08
--- a/src/link/assign.c
+++ b/src/link/assign.c
@@ -390,7 +390,7 @@
 		if (i == BANK_ROM0) {
 			/* ROM0 bank */
 			BankFree[i]->nOrg = 0x0000;
-			if (options & OPT_SMALL) {
+			if (options & OPT_TINY) {
 				BankFree[i]->nSize = 0x8000;
 			} else {
 				BankFree[i]->nSize = 0x4000;
@@ -398,15 +398,7 @@
 		} else if (i >= BANK_ROMX && i < BANK_ROMX + BANK_COUNT_ROMX) {
 			/* Swappable ROM bank */
 			BankFree[i]->nOrg = 0x4000;
-			/*
-			 * Now, this shouldn't really be necessary... but for
-			 * good measure we'll do it anyway.
-			 */
-			if (options & OPT_SMALL) {
-				BankFree[i]->nSize = 0;
-			} else {
-				BankFree[i]->nSize = 0x4000;
-			}
+			BankFree[i]->nSize = 0x4000;
 		} else if (i == BANK_WRAM0) {
 			/* WRAM */
 			BankFree[i]->nOrg = 0xC000;
@@ -462,10 +454,6 @@
 		if ((pSection->nOrg != -1 || pSection->nBank != -1)
 		    && 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:
--- a/src/link/main.c
+++ b/src/link/main.c
@@ -89,7 +89,7 @@
 			smartlinkstartsymbol = optarg;
 			break;
 		case 't':
-			options |= OPT_SMALL;
+			options |= OPT_TINY;
 			break;
 		case 'w':
 			/* Set to set WRAM as a single continuous block as on DMG.
--- a/src/link/object.c
+++ b/src/link/object.c
@@ -156,11 +156,13 @@
 	pSection->nBank = -1;
 	pSection->nAlign = 1;
 
-	/* does the user want the -s mode? */
-
-	if ((options & OPT_SMALL) && (pSection->Type == SECT_ROMX)) {
-		pSection->Type = SECT_ROM0;
+	if ((options & OPT_TINY) && (pSection->Type == SECT_ROMX)) {
+		errx(1, "ROMX sections can't be used with option -t.");
 	}
+	if ((options & OPT_CONTWRAM) && (pSection->Type == SECT_WRAMX)) {
+		errx(1, "WRAMX sections can't be used with option -w.");
+	}
+
 	if ((pSection->Type == SECT_ROMX) || (pSection->Type == SECT_ROM0)) {
 		/*
 		 * These sectiontypes contain data...
@@ -306,7 +308,7 @@
 	pSection->Type = (enum eSectionType) fgetc(f);
 	pSection->nOrg = readlong(f);
 	pSection->nBank = readlong(f);
-	
+
 	if (contents & CONTAINS_SECTION_ALIGNMENT) {
 		pSection->nAlign = readlong(f);
 	} else {
@@ -313,11 +315,13 @@
 		pSection->nAlign = 1;
 	}
 
-	/* does the user want the -s mode? */
-
-	if ((options & OPT_SMALL) && (pSection->Type == SECT_ROMX)) {
-		pSection->Type = SECT_ROM0;
+	if ((options & OPT_TINY) && (pSection->Type == SECT_ROMX)) {
+		errx(1,  "ROMX sections can't be used with option -t.");
 	}
+	if ((options & OPT_CONTWRAM) && (pSection->Type == SECT_WRAMX)) {
+		errx(1, "WRAMX sections can't be used with option -w.");
+	}
+
 	if ((pSection->Type == SECT_ROMX) || (pSection->Type == SECT_ROM0)) {
 		/*
 		 * These sectiontypes contain data...
--- a/src/link/rgblink.1
+++ b/src/link/rgblink.1
@@ -29,6 +29,12 @@
 .Fl t
 option to override this.
 .Pp
+Similarly, WRAM0 sections are placed in the first 4KiB of WRAM bank 0 and WRAMX
+sections are placed in any bank except bank 0.
+If your ROM is designed for DMG, you can use the
+.Fl w
+option to override this.
+.Pp
 The arguments are as follows:
 .Bl -tag -width Ds
 .It Fl m Ar mapfile
@@ -47,14 +53,13 @@
 .It Fl s Ar symbol
 ???
 .It Fl w
-Expand WRAM0 to the whole space assigned to WRAM and prevent the use of WRAMX
-sections.
+Expand the WRAM0 section size from 4KiB to the full 8KiB assigned to WRAM and
+prohibit the use of WRAMX sections.
+Useful for ROMs designed for DMG.
 .It Fl t
-Write a tiny
-.Pq 32KiB
-ROM file.
-This forces all ROMX sections to be of type ROM0, and increases the ROM0
-section size from 16KiB to 32KiB.
+Expand the ROM0 section size from 16KiB to the full 32KiB assigned to ROM and
+prohibit the use of ROMX sections.
+Useful for ROMs that fit in 32 KiB.
 .It Fl l Ar linkerscript
 Specify a linkerscript file that tells the linker how sections must be placed in
 the ROM.
--- a/src/link/script.c
+++ b/src/link/script.c
@@ -35,7 +35,7 @@
 		if (i == BANK_ROM0) {
 			/* ROM0 bank */
 			bank[i].address = 0x0000;
-			if (options & OPT_SMALL) {
+			if (options & OPT_TINY) {
 				bank[i].top_address = 0x8000;
 			} else {
 				bank[i].top_address = 0x4000;
@@ -44,15 +44,7 @@
 		} else if (i >= BANK_ROMX && i < BANK_ROMX + BANK_COUNT_ROMX) {
 			/* Swappable ROM bank */
 			bank[i].address = 0x4000;
-			/*
-			 * Now, this shouldn't really be necessary... but for
-			 * good measure we'll do it anyway.
-			 */
-			if (options & OPT_SMALL) {
-				bank[i].top_address = 0x4000;
-			} else {
-				bank[i].top_address = 0x8000;
-			}
+			bank[i].top_address = 0x8000;
 			bank[i].type = SECT_ROMX;
 		} else if (i == BANK_WRAM0) {
 			/* WRAM */
--- /dev/null
+++ b/test/link/romx-tiny-no-t.out
@@ -1,0 +1,1 @@
+rgblink:error:Unable to place 'r0b' (ROM0 section) anywhere
--- /dev/null
+++ b/test/link/romx-tiny-t.out
@@ -1,0 +1,1 @@
+rgblink:error:ROMX sections can't be used with option -t.
--- /dev/null
+++ b/test/link/romx-tiny.asm
@@ -1,0 +1,8 @@
+SECTION "r0a", ROM0
+DS $4000
+
+SECTION "rx", ROMX
+DS $4000
+
+SECTION "r0b", ROM0
+DS $4000
--- a/test/link/test.sh
+++ b/test/link/test.sh
@@ -10,3 +10,17 @@
 diff bank-numbers.out $outtemp
 head -c 20 $gbtemp > $otemp 2>&1
 diff bank-numbers.out.bin $otemp
+
+$RGBASM -o $otemp wramx-contwram.asm
+$RGBLINK -o $gbtemp $otemp > $outtemp 2>&1
+diff wramx-contwram-no-w.out $outtemp
+$RGBLINK -w -o $gbtemp $otemp > $outtemp 2>&1
+diff wramx-contwram-w.out $outtemp
+
+$RGBASM -o $otemp romx-tiny.asm
+$RGBLINK -o $gbtemp $otemp > $outtemp 2>&1
+diff romx-tiny-no-t.out $outtemp
+$RGBLINK -t -o $gbtemp $otemp > $outtemp 2>&1
+diff romx-tiny-t.out $outtemp
+
+exit 0
--- a/test/link/update-refs.sh
+++ b/test/link/update-refs.sh
@@ -7,3 +7,13 @@
 $RGBASM -o $otemp bank-numbers.asm
 $RGBLINK -o $gbtemp $otemp > bank-numbers.out 2>&1
 head -c 20 $gbtemp > bank-numbers.out.bin 2>&1
+
+$RGBASM -o $otemp wramx-contwram.asm
+$RGBLINK -o $gbtemp $otemp > wramx-contwram-no-w.out 2>&1
+$RGBLINK -w -o $gbtemp $otemp > wramx-contwram-w.out 2>&1
+
+$RGBASM -o $otemp romx-tiny.asm
+$RGBLINK -o $gbtemp $otemp > romx-tiny-no-t.out 2>&1
+$RGBLINK -t -o $gbtemp $otemp > romx-tiny-t.out 2>&1
+
+exit 0
--- /dev/null
+++ b/test/link/wramx-contwram-no-w.out
@@ -1,0 +1,1 @@
+rgblink:error:Unable to place 'w0b' (WRAM0 section) anywhere
--- /dev/null
+++ b/test/link/wramx-contwram-w.out
@@ -1,0 +1,1 @@
+rgblink:error:WRAMX sections can't be used with option -w.
--- /dev/null
+++ b/test/link/wramx-contwram.asm
@@ -1,0 +1,8 @@
+SECTION "w0a", WRAM0
+DS $1000
+
+SECTION "wx", WRAMX
+DS $1000
+
+SECTION "w0b", WRAM0
+DS $1000