mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Merge branch 'master' into HEAD
This commit is contained in:
125
src/asm/asmy.y
125
src/asm/asmy.y
@@ -20,6 +20,49 @@
|
||||
char *tzNewMacro;
|
||||
ULONG ulNewMacroSize;
|
||||
|
||||
void
|
||||
bankrangecheck(char *name, ULONG secttype, SLONG org, SLONG bank)
|
||||
{
|
||||
SLONG minbank, maxbank;
|
||||
char *stype;
|
||||
switch (secttype) {
|
||||
case SECT_ROMX:
|
||||
stype = "ROMX";
|
||||
minbank = 1;
|
||||
maxbank = 0x1ff;
|
||||
break;
|
||||
case SECT_SRAM:
|
||||
stype = "SRAM";
|
||||
minbank = 0;
|
||||
maxbank = 0x1ff;
|
||||
break;
|
||||
case SECT_WRAMX:
|
||||
stype = "WRAMX";
|
||||
minbank = 1;
|
||||
maxbank = 7;
|
||||
break;
|
||||
case SECT_VRAM:
|
||||
stype = "VRAM";
|
||||
minbank = 0;
|
||||
maxbank = 1;
|
||||
break;
|
||||
default:
|
||||
yyerror("BANK only allowed for "
|
||||
"ROMX, WRAMX, SRAM, or VRAM sections");
|
||||
}
|
||||
|
||||
if (bank < minbank || bank > maxbank) {
|
||||
yyerror("%s bank value $%x out of range ($%x to $%x)",
|
||||
stype, bank, minbank, maxbank);
|
||||
}
|
||||
|
||||
if (secttype == SECT_WRAMX) {
|
||||
bank -= minbank;
|
||||
}
|
||||
|
||||
out_NewAbsSection(name, secttype, org, bank);
|
||||
}
|
||||
|
||||
size_t symvaluetostring(char *dest, size_t maxLength, char *sym)
|
||||
{
|
||||
size_t length;
|
||||
@@ -497,22 +540,16 @@ void if_skip_to_endc( void )
|
||||
|
||||
%%
|
||||
|
||||
asmfile : lines lastline;
|
||||
|
||||
lastline : /* empty */
|
||||
| line {
|
||||
nLineNo += 1;
|
||||
nTotalLines += 1;
|
||||
};
|
||||
asmfile : lines;
|
||||
|
||||
/* Note: The lexer add '\n' at the end of the input */
|
||||
lines : /* empty */
|
||||
| lines line '\n' {
|
||||
nLineNo += 1;
|
||||
nTotalLines += 1;
|
||||
};
|
||||
|
||||
line : /* empty */
|
||||
| label
|
||||
line : label
|
||||
| label cpu_command
|
||||
| label macro
|
||||
| label simple_pseudoop
|
||||
@@ -1060,76 +1097,14 @@ section:
|
||||
}
|
||||
| T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' const ']'
|
||||
{
|
||||
if( $4==SECT_ROMX ) {
|
||||
if( $8>=1 && $8<=0x1ff )
|
||||
out_NewAbsSection($2,$4,-1,$8);
|
||||
else
|
||||
yyerror("ROM bank value $%x out of range (1 to $1ff)", $8);
|
||||
} else if ($4 == SECT_SRAM) {
|
||||
if ($8 >= 0 && $8 <= 3) {
|
||||
out_NewAbsSection($2, $4, -1, $8);
|
||||
} else {
|
||||
yyerror("SRAM bank value $%x out of range (0 to 3)", $8);
|
||||
}
|
||||
} else if ($4 == SECT_WRAMX) {
|
||||
if ($8 >= 1 && $8 <= 7) {
|
||||
out_NewAbsSection($2, $4, -1, $8 - 1);
|
||||
} else {
|
||||
yyerror("WRAMX bank value $%x out of range (1 to 7)", $8);
|
||||
}
|
||||
} else if ($4 == SECT_VRAM) {
|
||||
if ($8 >= 0 && $8 <= 1) {
|
||||
out_NewAbsSection($2, $4, -1, $8);
|
||||
} else {
|
||||
yyerror("VRAM bank value $%x out of range (0 to 1)", $8);
|
||||
}
|
||||
} else {
|
||||
yyerror("BANK only allowed for ROMX, WRAMX, SRAM, or VRAM sections");
|
||||
}
|
||||
bankrangecheck($2, $4, -1, $8);
|
||||
}
|
||||
| T_POP_SECTION string ',' sectiontype '[' const ']' ',' T_OP_BANK '[' const ']'
|
||||
{
|
||||
if( $4==SECT_ROMX ) {
|
||||
if( $6>=0 && $6<0x10000 ) {
|
||||
if( $11>=1 && $11<=0x1ff )
|
||||
out_NewAbsSection($2,$4,$6,$11);
|
||||
else
|
||||
yyerror("ROM bank value $%x out of range (1 to $1ff)", $11);
|
||||
} else
|
||||
yyerror("Address $%x not 16-bit", $6);
|
||||
} else if ($4 == SECT_SRAM) {
|
||||
if ($6 >= 0 && $6 < 0x10000) {
|
||||
if ($11 >= 0 && $11 <= 3) {
|
||||
out_NewAbsSection($2, $4, $6, $11);
|
||||
} else {
|
||||
yyerror("SRAM bank value $%x out of range (0 to 3)", $11);
|
||||
}
|
||||
} else {
|
||||
yyerror("Address $%x not 16-bit", $6);
|
||||
}
|
||||
} else if ($4 == SECT_WRAMX) {
|
||||
if ($6 >= 0 && $6 < 0x10000) {
|
||||
if ($11 >= 1 && $11 <= 7) {
|
||||
out_NewAbsSection($2, $4, $6, $11 - 1);
|
||||
} else {
|
||||
yyerror("WRAMX bank value $%x out of range (1 to 7)", $11);
|
||||
}
|
||||
} else {
|
||||
yyerror("Address $%x not 16-bit", $6);
|
||||
}
|
||||
} else if ($4 == SECT_VRAM) {
|
||||
if ($6 >= 0 && $6 < 0x10000) {
|
||||
if ($11 >= 0 && $11 <= 1) {
|
||||
out_NewAbsSection($2,$4,$6,$11);
|
||||
} else {
|
||||
yyerror("VRAM bank value $%x out of range (0 to 1)", $11);
|
||||
}
|
||||
} else {
|
||||
yyerror("Address $%x not 16-bit", $6);
|
||||
}
|
||||
} else {
|
||||
yyerror("BANK only allowed for ROMX, WRAMX, SRAM, or VRAM sections");
|
||||
if ($6 < 0 || $6 > 0x10000) {
|
||||
yyerror("Address $%x not 16-bit", $6);
|
||||
}
|
||||
bankrangecheck($2, $4, $6, $11);
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ ParseSymbol(char *src, ULONG size)
|
||||
if (*src == '@')
|
||||
marg = sym_FindMacroArg(-1);
|
||||
else if (*src >= '0' && *src <= '9')
|
||||
marg = sym_FindMacroArg(*src);
|
||||
marg = sym_FindMacroArg(*src - '0');
|
||||
else {
|
||||
fatalerror("Malformed ID");
|
||||
return (0);
|
||||
|
||||
@@ -389,7 +389,10 @@ createpatch(ULONG type, struct Expression * expr)
|
||||
rpnexpr[rpnptr++] = value >> 16;
|
||||
rpnexpr[rpnptr++] = value >> 24;
|
||||
} else {
|
||||
symptr = addsymbol(sym_FindSymbol(tzSym));
|
||||
struct sSymbol *sym;
|
||||
if ((sym = sym_FindSymbol(tzSym)) == NULL)
|
||||
break;
|
||||
symptr = addsymbol(sym);
|
||||
rpnexpr[rpnptr++] = RPN_SYM;
|
||||
rpnexpr[rpnptr++] = symptr & 0xFF;
|
||||
rpnexpr[rpnptr++] = symptr >> 8;
|
||||
@@ -397,15 +400,19 @@ createpatch(ULONG type, struct Expression * expr)
|
||||
rpnexpr[rpnptr++] = symptr >> 24;
|
||||
}
|
||||
break;
|
||||
case RPN_BANK:
|
||||
case RPN_BANK: {
|
||||
struct sSymbol *sym;
|
||||
symptr = 0;
|
||||
while ((tzSym[symptr++] = rpn_PopByte(expr)) != 0);
|
||||
symptr = addsymbol(sym_FindSymbol(tzSym));
|
||||
if ((sym = sym_FindSymbol(tzSym)) == NULL)
|
||||
break;
|
||||
symptr = addsymbol(sym);
|
||||
rpnexpr[rpnptr++] = RPN_BANK;
|
||||
rpnexpr[rpnptr++] = symptr & 0xFF;
|
||||
rpnexpr[rpnptr++] = symptr >> 8;
|
||||
rpnexpr[rpnptr++] = symptr >> 16;
|
||||
rpnexpr[rpnptr++] = symptr >> 24;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
rpnexpr[rpnptr++] = rpndata;
|
||||
|
||||
@@ -22,7 +22,7 @@ enum eBlockType {
|
||||
|
||||
SLONG options = 0;
|
||||
SLONG fillchar = 0;
|
||||
char smartlinkstartsymbol[256];
|
||||
char *smartlinkstartsymbol;
|
||||
|
||||
char *progname;
|
||||
|
||||
@@ -79,7 +79,7 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case 's':
|
||||
options |= OPT_SMART_C_LINK;
|
||||
strcpy(smartlinkstartsymbol, optarg);
|
||||
smartlinkstartsymbol = optarg;
|
||||
break;
|
||||
case 't':
|
||||
options |= OPT_SMALL;
|
||||
|
||||
@@ -76,7 +76,7 @@ sym_GetBank(char *tzName)
|
||||
}
|
||||
|
||||
void
|
||||
sym_CreateSymbol(char *tzName, SLONG nValue, SBYTE nBank)
|
||||
sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank)
|
||||
{
|
||||
if (strcmp(tzName, "@") == 0)
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user