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