mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Merge branch 'master' into HEAD
This commit is contained in:
@@ -4,6 +4,6 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
extern SLONG fillchar;
|
extern SLONG fillchar;
|
||||||
extern char smartlinkstartsymbol[256];
|
extern char *smartlinkstartsymbol;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
void sym_Init(void);
|
void sym_Init(void);
|
||||||
void sym_CreateSymbol(char *tzName, SLONG nValue, SBYTE nBank);
|
void sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank);
|
||||||
SLONG sym_GetValue(char *tzName);
|
SLONG sym_GetValue(char *tzName);
|
||||||
SLONG sym_GetBank(char *tzName);
|
SLONG sym_GetBank(char *tzName);
|
||||||
|
|
||||||
|
|||||||
123
src/asm/asmy.y
123
src/asm/asmy.y
@@ -20,6 +20,49 @@
|
|||||||
char *tzNewMacro;
|
char *tzNewMacro;
|
||||||
ULONG ulNewMacroSize;
|
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 symvaluetostring(char *dest, size_t maxLength, char *sym)
|
||||||
{
|
{
|
||||||
size_t length;
|
size_t length;
|
||||||
@@ -497,22 +540,16 @@ void if_skip_to_endc( void )
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
asmfile : lines lastline;
|
asmfile : lines;
|
||||||
|
|
||||||
lastline : /* empty */
|
|
||||||
| line {
|
|
||||||
nLineNo += 1;
|
|
||||||
nTotalLines += 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
/* Note: The lexer add '\n' at the end of the input */
|
||||||
lines : /* empty */
|
lines : /* empty */
|
||||||
| lines line '\n' {
|
| lines line '\n' {
|
||||||
nLineNo += 1;
|
nLineNo += 1;
|
||||||
nTotalLines += 1;
|
nTotalLines += 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
line : /* empty */
|
line : label
|
||||||
| label
|
|
||||||
| label cpu_command
|
| label cpu_command
|
||||||
| label macro
|
| label macro
|
||||||
| label simple_pseudoop
|
| label simple_pseudoop
|
||||||
@@ -1060,76 +1097,14 @@ section:
|
|||||||
}
|
}
|
||||||
| T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' const ']'
|
| T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' const ']'
|
||||||
{
|
{
|
||||||
if( $4==SECT_ROMX ) {
|
bankrangecheck($2, $4, -1, $8);
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
| T_POP_SECTION string ',' sectiontype '[' const ']' ',' T_OP_BANK '[' const ']'
|
| T_POP_SECTION string ',' sectiontype '[' const ']' ',' T_OP_BANK '[' const ']'
|
||||||
{
|
{
|
||||||
if( $4==SECT_ROMX ) {
|
if ($6 < 0 || $6 > 0x10000) {
|
||||||
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);
|
yyerror("Address $%x not 16-bit", $6);
|
||||||
}
|
}
|
||||||
} else if ($4 == SECT_WRAMX) {
|
bankrangecheck($2, $4, $6, $11);
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ ParseSymbol(char *src, ULONG size)
|
|||||||
if (*src == '@')
|
if (*src == '@')
|
||||||
marg = sym_FindMacroArg(-1);
|
marg = sym_FindMacroArg(-1);
|
||||||
else if (*src >= '0' && *src <= '9')
|
else if (*src >= '0' && *src <= '9')
|
||||||
marg = sym_FindMacroArg(*src);
|
marg = sym_FindMacroArg(*src - '0');
|
||||||
else {
|
else {
|
||||||
fatalerror("Malformed ID");
|
fatalerror("Malformed ID");
|
||||||
return (0);
|
return (0);
|
||||||
|
|||||||
@@ -389,7 +389,10 @@ createpatch(ULONG type, struct Expression * expr)
|
|||||||
rpnexpr[rpnptr++] = value >> 16;
|
rpnexpr[rpnptr++] = value >> 16;
|
||||||
rpnexpr[rpnptr++] = value >> 24;
|
rpnexpr[rpnptr++] = value >> 24;
|
||||||
} else {
|
} 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++] = RPN_SYM;
|
||||||
rpnexpr[rpnptr++] = symptr & 0xFF;
|
rpnexpr[rpnptr++] = symptr & 0xFF;
|
||||||
rpnexpr[rpnptr++] = symptr >> 8;
|
rpnexpr[rpnptr++] = symptr >> 8;
|
||||||
@@ -397,15 +400,19 @@ createpatch(ULONG type, struct Expression * expr)
|
|||||||
rpnexpr[rpnptr++] = symptr >> 24;
|
rpnexpr[rpnptr++] = symptr >> 24;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RPN_BANK:
|
case RPN_BANK: {
|
||||||
|
struct sSymbol *sym;
|
||||||
symptr = 0;
|
symptr = 0;
|
||||||
while ((tzSym[symptr++] = rpn_PopByte(expr)) != 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++] = RPN_BANK;
|
||||||
rpnexpr[rpnptr++] = symptr & 0xFF;
|
rpnexpr[rpnptr++] = symptr & 0xFF;
|
||||||
rpnexpr[rpnptr++] = symptr >> 8;
|
rpnexpr[rpnptr++] = symptr >> 8;
|
||||||
rpnexpr[rpnptr++] = symptr >> 16;
|
rpnexpr[rpnptr++] = symptr >> 16;
|
||||||
rpnexpr[rpnptr++] = symptr >> 24;
|
rpnexpr[rpnptr++] = symptr >> 24;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rpnexpr[rpnptr++] = rpndata;
|
rpnexpr[rpnptr++] = rpndata;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ enum eBlockType {
|
|||||||
|
|
||||||
SLONG options = 0;
|
SLONG options = 0;
|
||||||
SLONG fillchar = 0;
|
SLONG fillchar = 0;
|
||||||
char smartlinkstartsymbol[256];
|
char *smartlinkstartsymbol;
|
||||||
|
|
||||||
char *progname;
|
char *progname;
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
options |= OPT_SMART_C_LINK;
|
options |= OPT_SMART_C_LINK;
|
||||||
strcpy(smartlinkstartsymbol, optarg);
|
smartlinkstartsymbol = optarg;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
options |= OPT_SMALL;
|
options |= OPT_SMALL;
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ sym_GetBank(char *tzName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sym_CreateSymbol(char *tzName, SLONG nValue, SBYTE nBank)
|
sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank)
|
||||||
{
|
{
|
||||||
if (strcmp(tzName, "@") == 0)
|
if (strcmp(tzName, "@") == 0)
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user