Support BANK() correctly when given WRAMX/SRAM/VRAM labels.

(Mostly) from Antonio Niño Díaz.
This commit is contained in:
Anthony J. Bentley
2015-02-22 03:33:18 -07:00
parent 9d0203a4ee
commit bc60b85785
3 changed files with 55 additions and 8 deletions

View File

@@ -1073,7 +1073,7 @@ section:
} }
} else if ($4 == SECT_WRAMX) { } else if ($4 == SECT_WRAMX) {
if ($8 >= 1 && $8 <= 7) { if ($8 >= 1 && $8 <= 7) {
out_NewAbsSection($2, $4, -1, $8); out_NewAbsSection($2, $4, -1, $8 - 1);
} else { } else {
yyerror("WRAMX bank value $%x out of range (1 to 7)", $8); yyerror("WRAMX bank value $%x out of range (1 to 7)", $8);
} }
@@ -1110,7 +1110,7 @@ section:
} else if ($4 == SECT_WRAMX) { } else if ($4 == SECT_WRAMX) {
if ($6 >= 0 && $6 < 0x10000) { if ($6 >= 0 && $6 < 0x10000) {
if ($11 >= 1 && $11 <= 7) { if ($11 >= 1 && $11 <= 7) {
out_NewAbsSection($2, $4, $6, $11); out_NewAbsSection($2, $4, $6, $11 - 1);
} else { } else {
yyerror("WRAMX bank value $%x out of range (1 to 7)", $11); yyerror("WRAMX bank value $%x out of range (1 to 7)", $11);
} }

View File

@@ -3,6 +3,7 @@
#include <string.h> #include <string.h>
#include "extern/err.h" #include "extern/err.h"
#include "link/assign.h"
#include "link/mylink.h" #include "link/mylink.h"
#include "link/symbol.h" #include "link/symbol.h"
#include "link/main.h" #include "link/main.h"
@@ -53,20 +54,30 @@ getsymvalue(SLONG symid)
SLONG SLONG
getsymbank(SLONG symid) getsymbank(SLONG symid)
{ {
SLONG nBank;
switch (pCurrentSection->tSymbols[symid]->Type) { switch (pCurrentSection->tSymbols[symid]->Type) {
case SYM_IMPORT: case SYM_IMPORT:
return (sym_GetBank(pCurrentSection->tSymbols[symid]->pzName)); nBank = sym_GetBank(pCurrentSection->tSymbols[symid]->pzName);
break; break;
case SYM_EXPORT: case SYM_EXPORT:
case SYM_LOCAL: case SYM_LOCAL:
return (pCurrentSection->tSymbols[symid]->pSection->nBank); nBank = pCurrentSection->tSymbols[symid]->pSection->nBank;
//return (pCurrentSection->nBank);
default:
break; break;
} default:
errx(1, "*INTERNAL* UNKNOWN SYMBOL TYPE"); errx(1, "*INTERNAL* UNKNOWN SYMBOL TYPE");
} }
if (nBank >= BANK_WRAMX && nBank <= (BANK_WRAMX+6))
return nBank - BANK_WRAMX + 1;
if (nBank >= BANK_VRAM && nBank <= (BANK_VRAM+1))
return nBank - BANK_VRAM;
if (nBank >= BANK_SRAM && nBank <= (BANK_SRAM+3))
return nBank - BANK_SRAM;
return nBank;
}
SLONG SLONG
calcrpn(struct sPatch * pPatch) calcrpn(struct sPatch * pPatch)
{ {

View File

@@ -0,0 +1,36 @@
; this should generate a rom consisting of the following bytes:
; 01 02 03 04 05 06 07 00 01 02 03 00 01
section "x",rom0
db bank(w1),bank(w2),bank(w3),bank(w4),bank(w5),bank(w6),bank(w7)
db bank(s0),bank(s1),bank(s2),bank(s3)
db bank(v0),bank(v1)
section "wa",wramx,bank[1]
w1:
section "wb",wramx,bank[2]
w2:
section "wc",wramx,bank[3]
w3:
section "wd",wramx,bank[4]
w4:
section "we",wramx,bank[5]
w5:
section "wf",wramx,bank[6]
w6:
section "wg",wramx,bank[7]
w7:
section "sa",sram,bank[0]
s0:
section "sb",sram,bank[1]
s1:
section "sc",sram,bank[2]
s2:
section "sd",sram,bank[3]
s3:
section "v00",vram,bank[0]
v0:
section "v01",vram,bank[1]
v1: