From 523b7538f06934ab0d23f4745741f94ebb8534df Mon Sep 17 00:00:00 2001 From: Ben10do Date: Fri, 10 Mar 2017 19:24:54 +0000 Subject: [PATCH 1/2] Replace magic numbers with BANK_COUNT_* constants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, some instances of the number of banks for each section remained hardcoded. These have been replaced with BANK_COUNT_* constants. As a side-effect, this could fix a theoretical bug when using BANK(label) when the label is in a high SRAM bank (≥ 4). --- include/link/assign.h | 20 ++++++++++---------- src/link/patch.c | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/link/assign.h b/include/link/assign.h index 7ffa3ce8..8284d8eb 100644 --- a/include/link/assign.h +++ b/include/link/assign.h @@ -3,16 +3,6 @@ #include "types.h" -enum eBankDefine { - BANK_ROM0 = 0, - BANK_ROMX, - BANK_WRAM0 = 512, - BANK_WRAMX, - BANK_VRAM = 520, - BANK_HRAM = 522, - BANK_SRAM = 523 -}; - enum eBankCount { BANK_COUNT_ROM0 = 1, BANK_COUNT_ROMX = 511, @@ -23,6 +13,16 @@ enum eBankCount { BANK_COUNT_SRAM = 16 }; +enum eBankDefine { + BANK_ROM0 = 0, + BANK_ROMX = BANK_ROM0 + BANK_COUNT_ROM0, + BANK_WRAM0 = BANK_ROMX + BANK_COUNT_ROMX, + BANK_WRAMX = BANK_WRAM0 + BANK_COUNT_WRAM0, + BANK_VRAM = BANK_WRAMX + BANK_COUNT_WRAMX, + BANK_HRAM = BANK_VRAM + BANK_COUNT_VRAM, + BANK_SRAM = BANK_HRAM + BANK_COUNT_HRAM +}; + #define MAXBANKS (BANK_COUNT_ROM0 + BANK_COUNT_ROMX + BANK_COUNT_WRAM0 + BANK_COUNT_WRAMX \ + BANK_COUNT_VRAM + BANK_COUNT_HRAM + BANK_COUNT_SRAM) diff --git a/src/link/patch.c b/src/link/patch.c index 25e59ed3..07f53e93 100644 --- a/src/link/patch.c +++ b/src/link/patch.c @@ -69,11 +69,11 @@ getsymbank(SLONG symid) } if (nBank == BANK_WRAM0) return 0; - if (nBank >= BANK_WRAMX && nBank <= (BANK_WRAMX+6)) + if (nBank >= BANK_WRAMX && nBank < (BANK_WRAMX + BANK_COUNT_WRAMX)) return nBank - BANK_WRAMX + 1; - if (nBank >= BANK_VRAM && nBank <= (BANK_VRAM+1)) + if (nBank >= BANK_VRAM && nBank < (BANK_VRAM + BANK_COUNT_VRAM)) return nBank - BANK_VRAM; - if (nBank >= BANK_SRAM && nBank <= (BANK_SRAM+3)) + if (nBank >= BANK_SRAM && nBank < (BANK_SRAM + BANK_COUNT_SRAM)) return nBank - BANK_SRAM; return nBank; From 3dcfe2b9f647dba25fdc1c3490073c5f4d20be61 Mon Sep 17 00:00:00 2001 From: Ben10do Date: Fri, 10 Mar 2017 22:18:14 +0000 Subject: [PATCH 2/2] Add support for OAM Sections MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allows sections (and labels within) to be defined that correspond to the Game Boy’s Object Attributes Memory. --- include/asm/mylink.h | 3 ++- include/link/assign.h | 6 ++++-- include/link/mylink.h | 3 ++- src/asm/asmy.y | 3 ++- src/asm/globlex.c | 1 + src/asm/output.c | 2 +- src/link/assign.c | 9 +++++++-- src/link/mapfile.c | 4 ++++ src/link/object.c | 4 ++-- src/link/patch.c | 2 +- 10 files changed, 26 insertions(+), 11 deletions(-) diff --git a/include/asm/mylink.h b/include/asm/mylink.h index 93bc1348..14f548c6 100644 --- a/include/asm/mylink.h +++ b/include/asm/mylink.h @@ -101,7 +101,8 @@ enum { SECT_ROM0, SECT_HRAM, SECT_WRAMX, - SECT_SRAM + SECT_SRAM, + SECT_OAM }; enum { diff --git a/include/link/assign.h b/include/link/assign.h index 8284d8eb..5624b2f1 100644 --- a/include/link/assign.h +++ b/include/link/assign.h @@ -9,6 +9,7 @@ enum eBankCount { BANK_COUNT_WRAM0 = 1, BANK_COUNT_WRAMX = 7, BANK_COUNT_VRAM = 2, + BANK_COUNT_OAM = 1, BANK_COUNT_HRAM = 1, BANK_COUNT_SRAM = 16 }; @@ -19,12 +20,13 @@ enum eBankDefine { BANK_WRAM0 = BANK_ROMX + BANK_COUNT_ROMX, BANK_WRAMX = BANK_WRAM0 + BANK_COUNT_WRAM0, BANK_VRAM = BANK_WRAMX + BANK_COUNT_WRAMX, - BANK_HRAM = BANK_VRAM + BANK_COUNT_VRAM, + BANK_OAM = BANK_VRAM + BANK_COUNT_VRAM, + BANK_HRAM = BANK_OAM + BANK_COUNT_OAM, BANK_SRAM = BANK_HRAM + BANK_COUNT_HRAM }; #define MAXBANKS (BANK_COUNT_ROM0 + BANK_COUNT_ROMX + BANK_COUNT_WRAM0 + BANK_COUNT_WRAMX \ - + BANK_COUNT_VRAM + BANK_COUNT_HRAM + BANK_COUNT_SRAM) + + BANK_COUNT_VRAM + BANK_COUNT_OAM + BANK_COUNT_HRAM + BANK_COUNT_SRAM) extern SLONG area_Avail(SLONG bank); extern void AssignSections(void); diff --git a/include/link/mylink.h b/include/link/mylink.h index 9ce6e4e4..0d3c9c52 100644 --- a/include/link/mylink.h +++ b/include/link/mylink.h @@ -57,7 +57,8 @@ enum eSectionType { SECT_ROM0, SECT_HRAM, SECT_WRAMX, - SECT_SRAM + SECT_SRAM, + SECT_OAM }; struct sSection { diff --git a/src/asm/asmy.y b/src/asm/asmy.y index c54d41d6..7e6047e1 100644 --- a/src/asm/asmy.y +++ b/src/asm/asmy.y @@ -513,7 +513,7 @@ void if_skip_to_endc( void ) %token T_POP_POPO %token T_POP_PUSHO %token T_POP_OPT -%token T_SECT_WRAM0 T_SECT_VRAM T_SECT_ROMX T_SECT_ROM0 T_SECT_HRAM T_SECT_WRAMX T_SECT_SRAM +%token T_SECT_WRAM0 T_SECT_VRAM T_SECT_ROMX T_SECT_ROM0 T_SECT_HRAM T_SECT_WRAMX T_SECT_SRAM T_SECT_OAM %token T_Z80_ADC T_Z80_ADD T_Z80_AND %token T_Z80_BIT @@ -1146,6 +1146,7 @@ sectiontype: | T_SECT_HRAM { $$=SECT_HRAM; } | T_SECT_WRAMX { $$=SECT_WRAMX; } | T_SECT_SRAM { $$=SECT_SRAM; } + | T_SECT_OAM { $$=SECT_OAM; } ; diff --git a/src/asm/globlex.c b/src/asm/globlex.c index dd379277..676ec4e5 100644 --- a/src/asm/globlex.c +++ b/src/asm/globlex.c @@ -342,6 +342,7 @@ struct sLexInitString staticstrings[] = { {"hram", T_SECT_HRAM}, {"wramx", T_SECT_WRAMX}, {"sram", T_SECT_SRAM}, + {"oam", T_SECT_OAM}, {NAME_RB, T_POP_RB}, {NAME_RW, T_POP_RW}, diff --git a/src/asm/output.c b/src/asm/output.c index 92340fa8..58b6697b 100644 --- a/src/asm/output.c +++ b/src/asm/output.c @@ -491,7 +491,7 @@ out_WriteObject(void) struct PatchSymbol *pSym; struct Section *pSect; - fwrite("RGB3", 1, 4, f); + fwrite("RGB4", 1, 4, f); fputlong(countsymbols(), f); fputlong(countsections(), f); diff --git a/src/link/assign.c b/src/link/assign.c index 91192578..12813b35 100644 --- a/src/link/assign.c +++ b/src/link/assign.c @@ -30,7 +30,7 @@ SLONG MaxSBankUsed; SLONG MaxVBankUsed; const enum eSectionType SECT_MIN = SECT_WRAM0; -const enum eSectionType SECT_MAX = SECT_SRAM; +const enum eSectionType SECT_MAX = SECT_OAM; const struct sSectionAttributes SECT_ATTRIBUTES[] = { {"WRAM0", BANK_WRAM0, 0, 0, BANK_COUNT_WRAM0}, {"VRAM", BANK_VRAM, 0, 0, BANK_COUNT_VRAM}, @@ -38,7 +38,8 @@ const struct sSectionAttributes SECT_ATTRIBUTES[] = { {"ROM0", BANK_ROM0, 0, 0, BANK_COUNT_ROM0}, {"HRAM", BANK_HRAM, 0, 0, BANK_COUNT_HRAM}, {"WRAMX", BANK_WRAMX, 0, 0, BANK_COUNT_WRAMX}, - {"SRAM", BANK_SRAM, 0, 0, BANK_COUNT_SRAM} + {"SRAM", BANK_SRAM, 0, 0, BANK_COUNT_SRAM}, + {"OAM", BANK_OAM, 0, 0, BANK_COUNT_OAM} }; #define DOMAXBANK(x, y) {switch (x) { \ @@ -326,6 +327,9 @@ AssignSections(void) /* Swappable VRAM bank */ BankFree[i]->nOrg = 0x8000; BankFree[i]->nSize = 0x2000; + } else if (i == BANK_OAM) { + BankFree[i]->nOrg = 0xFE00; + BankFree[i]->nSize = 0x00A0; } else if (i == BANK_HRAM) { /* HRAM */ BankFree[i]->nOrg = 0xFF80; @@ -355,6 +359,7 @@ AssignSections(void) case SECT_WRAM0: case SECT_HRAM: case SECT_ROM0: + case SECT_OAM: pSection->nBank = SECT_ATTRIBUTES[pSection->Type].bank; if (area_AllocAbs(&BankFree[pSection->nBank], pSection->nOrg, pSection->nByteSize) == -1) { diff --git a/src/link/mapfile.c b/src/link/mapfile.c index 56058dee..a315ebc0 100644 --- a/src/link/mapfile.c +++ b/src/link/mapfile.c @@ -65,6 +65,8 @@ MapfileInitBank(SLONG bank) fprintf(mf, "HRAM:\n"); else if (bank == BANK_VRAM || bank == BANK_VRAM + 1) fprintf(mf, "VRAM Bank #%ld:\n", bank - BANK_VRAM); + else if (bank == BANK_OAM) + fprintf(mf, "OAM:\n"); else if (bank < MAXBANKS) fprintf(mf, "SRAM Bank #%ld:\n", bank - BANK_SRAM); } @@ -79,6 +81,8 @@ MapfileInitBank(SLONG bank) sfbank = 0; else if (bank == BANK_VRAM || bank == BANK_VRAM + 1) sfbank = bank - BANK_VRAM; + else if (bank == BANK_OAM) + sfbank = 0; else if (bank < MAXBANKS) sfbank = bank - BANK_SRAM; else diff --git a/src/link/object.c b/src/link/object.c index 5d0e7195..c0ae5136 100644 --- a/src/link/object.c +++ b/src/link/object.c @@ -446,8 +446,8 @@ obj_ReadOpenFile(FILE * pObjfile, char *tzObjectfile) //V2 is really the same but the are new patch types obj_ReadRGB(pObjfile, 0); break; - case '3': - // V3 is very similiar, but contains section names and byte alignment + case '3': // V3 is very similiar, but contains section names and byte alignment + case '4': // V4 supports OAM sections, but is otherwise identical obj_ReadRGB(pObjfile, CONTAINS_SECTION_NAME | CONTAINS_SECTION_ALIGNMENT); break; default: diff --git a/src/link/patch.c b/src/link/patch.c index 07f53e93..edb227bb 100644 --- a/src/link/patch.c +++ b/src/link/patch.c @@ -68,7 +68,7 @@ getsymbank(SLONG symid) errx(1, "*INTERNAL* UNKNOWN SYMBOL TYPE"); } - if (nBank == BANK_WRAM0) return 0; + if (nBank == BANK_WRAM0 || nBank == BANK_OAM) return 0; if (nBank >= BANK_WRAMX && nBank < (BANK_WRAMX + BANK_COUNT_WRAMX)) return nBank - BANK_WRAMX + 1; if (nBank >= BANK_VRAM && nBank < (BANK_VRAM + BANK_COUNT_VRAM))