Merge pull request #160 from AntonioND/an/high-low

Implement HIGH() and LOW() operators
This commit is contained in:
AntonioND
2017-04-08 13:30:10 +01:00
committed by GitHub
8 changed files with 139 additions and 17 deletions

View File

@@ -69,6 +69,8 @@ rpn_DIV(struct Expression * expr, struct Expression * src1,
void void
rpn_MOD(struct Expression * expr, struct Expression * src1, rpn_MOD(struct Expression * expr, struct Expression * src1,
struct Expression * src2); struct Expression * src2);
void rpn_HIGH(struct Expression * expr, struct Expression * src);
void rpn_LOW(struct Expression * expr, struct Expression * src);
void rpn_UNNEG(struct Expression * expr, struct Expression * src); void rpn_UNNEG(struct Expression * expr, struct Expression * src);
void rpn_UNNOT(struct Expression * expr, struct Expression * src); void rpn_UNNOT(struct Expression * expr, struct Expression * src);
UWORD rpn_PopByte(struct Expression * expr); UWORD rpn_PopByte(struct Expression * expr);

View File

@@ -473,6 +473,7 @@ void if_skip_to_endc( void )
%left T_OP_CEIL %left T_OP_CEIL
%left T_OP_FLOOR %left T_OP_FLOOR
%token T_OP_HIGH T_OP_LOW
%left T_OP_STRCMP %left T_OP_STRCMP
%left T_OP_STRIN %left T_OP_STRIN
@@ -537,11 +538,12 @@ void if_skip_to_endc( void )
%token T_Z80_SLA T_Z80_SRA T_Z80_SRL T_Z80_SUB T_Z80_SWAP %token T_Z80_SLA T_Z80_SRA T_Z80_SRL T_Z80_SUB T_Z80_SWAP
%token T_Z80_XOR %token T_Z80_XOR
%token T_MODE_A T_MODE_B T_MODE_C T_MODE_C_IND T_MODE_D T_MODE_E T_MODE_H T_MODE_L %token T_TOKEN_A T_TOKEN_B T_TOKEN_C T_TOKEN_D T_TOKEN_E T_TOKEN_H T_TOKEN_L
%token T_MODE_AF %token T_MODE_AF
%token T_MODE_BC T_MODE_BC_IND %token T_MODE_BC T_MODE_BC_IND
%token T_MODE_DE T_MODE_DE_IND %token T_MODE_DE T_MODE_DE_IND
%token T_MODE_SP T_MODE_SP_IND %token T_MODE_SP T_MODE_SP_IND
%token T_MODE_C_IND
%token T_MODE_HL T_MODE_HL_IND T_MODE_HL_INDDEC T_MODE_HL_INDINC %token T_MODE_HL T_MODE_HL_IND T_MODE_HL_INDDEC T_MODE_HL_INDINC
%token T_CC_NZ T_CC_Z T_CC_NC %token T_CC_NZ T_CC_Z T_CC_NC
@@ -992,6 +994,10 @@ relocconst : T_ID
{ rpn_UNNEG(&$$,&$2); } { rpn_UNNEG(&$$,&$2); }
| T_OP_NOT relocconst %prec NEG | T_OP_NOT relocconst %prec NEG
{ rpn_UNNOT(&$$,&$2); } { rpn_UNNOT(&$$,&$2); }
| T_OP_HIGH '(' relocconst ')'
{ rpn_HIGH(&$$, &$3); }
| T_OP_LOW '(' relocconst ')'
{ rpn_LOW(&$$, &$3); }
| T_OP_BANK '(' T_ID ')' | T_OP_BANK '(' T_ID ')'
{ rpn_Bank(&$$,$3); $$.nVal = 0; } { rpn_Bank(&$$,$3); $$.nVal = 0; }
| T_OP_DEF { oDontExpandStrings = true; } '(' T_ID ')' | T_OP_DEF { oDontExpandStrings = true; } '(' T_ID ')'
@@ -1611,10 +1617,33 @@ op_a_n : const_8bit { $$ = $1; }
comma : ',' comma : ','
; ;
T_MODE_A : T_TOKEN_A
| T_OP_HIGH '(' T_MODE_AF ')'
;
T_MODE_B : T_TOKEN_B
| T_OP_HIGH '(' T_MODE_BC ')'
;
T_MODE_C : T_TOKEN_C
| T_OP_LOW '(' T_MODE_BC ')'
;
T_MODE_D : T_TOKEN_D
| T_OP_HIGH '(' T_MODE_DE ')'
;
T_MODE_E : T_TOKEN_E
| T_OP_LOW '(' T_MODE_DE ')'
;
T_MODE_H : T_TOKEN_H
| T_OP_HIGH '(' T_MODE_HL ')'
;
T_MODE_L : T_TOKEN_L
| T_OP_LOW '(' T_MODE_HL ')'
;
ccode : T_CC_NZ { $$ = CC_NZ; } ccode : T_CC_NZ { $$ = CC_NZ; }
| T_CC_Z { $$ = CC_Z; } | T_CC_Z { $$ = CC_Z; }
| T_CC_NC { $$ = CC_NC; } | T_CC_NC { $$ = CC_NC; }
| T_MODE_C { $$ = CC_C; } | T_TOKEN_C { $$ = CC_C; }
; ;
reg_r : T_MODE_B { $$ = REG_B; } reg_r : T_MODE_B { $$ = REG_B; }

View File

@@ -282,6 +282,9 @@ struct sLexInitString staticstrings[] = {
{"atan", T_OP_ATAN}, {"atan", T_OP_ATAN},
{"atan2", T_OP_ATAN2}, {"atan2", T_OP_ATAN2},
{"high", T_OP_HIGH},
{"low", T_OP_LOW},
{"strcmp", T_OP_STRCMP}, {"strcmp", T_OP_STRCMP},
{"strin", T_OP_STRIN}, {"strin", T_OP_STRIN},
{"strsub", T_OP_STRSUB}, {"strsub", T_OP_STRSUB},

View File

@@ -60,30 +60,31 @@ struct sLexInitString localstrings[] = {
{"nz", T_CC_NZ}, {"nz", T_CC_NZ},
{"z", T_CC_Z}, {"z", T_CC_Z},
{"nc", T_CC_NC}, {"nc", T_CC_NC},
/* { "c", T_MODE_C }, */ /* { "c", T_TOKEN_C }, */
{"[bc]", T_MODE_BC_IND},
{"[de]", T_MODE_DE_IND},
{"[hl]", T_MODE_HL_IND}, {"[hl]", T_MODE_HL_IND},
{"[hl+]", T_MODE_HL_INDINC}, {"[hl+]", T_MODE_HL_INDINC},
{"[hl-]", T_MODE_HL_INDDEC}, {"[hl-]", T_MODE_HL_INDDEC},
{"[hli]", T_MODE_HL_INDINC}, {"[hli]", T_MODE_HL_INDINC},
{"[hld]", T_MODE_HL_INDDEC}, {"[hld]", T_MODE_HL_INDDEC},
{"hl", T_MODE_HL},
{"af", T_MODE_AF},
{"[bc]", T_MODE_BC_IND},
{"bc", T_MODE_BC},
{"[de]", T_MODE_DE_IND},
{"de", T_MODE_DE},
{"[sp]", T_MODE_SP_IND}, {"[sp]", T_MODE_SP_IND},
{"af", T_MODE_AF},
{"bc", T_MODE_BC},
{"de", T_MODE_DE},
{"hl", T_MODE_HL},
{"sp", T_MODE_SP}, {"sp", T_MODE_SP},
{"a", T_MODE_A},
{"b", T_MODE_B},
{"[$ff00+c]", T_MODE_C_IND},
{"[c]", T_MODE_C_IND}, {"[c]", T_MODE_C_IND},
{"c", T_MODE_C}, {"[$ff00+c]", T_MODE_C_IND},
{"d", T_MODE_D},
{"e", T_MODE_E}, {"a", T_TOKEN_A},
{"h", T_MODE_H}, {"b", T_TOKEN_B},
{"l", T_MODE_L}, {"c", T_TOKEN_C},
{"d", T_TOKEN_D},
{"e", T_TOKEN_E},
{"h", T_TOKEN_H},
{"l", T_TOKEN_L},
{NULL, 0} {NULL, 0}
}; };

View File

@@ -182,6 +182,46 @@ rpn_LOGAND(struct Expression * expr, struct Expression * src1,
pushbyte(expr, RPN_LOGAND); pushbyte(expr, RPN_LOGAND);
} }
void
rpn_HIGH(struct Expression * expr, struct Expression * src)
{
*expr = *src;
expr->nVal = (expr->nVal >> 8) & 0xFF;
pushbyte(expr, RPN_CONST);
pushbyte(expr, 8);
pushbyte(expr, 0);
pushbyte(expr, 0);
pushbyte(expr, 0);
pushbyte(expr, RPN_SHR);
pushbyte(expr, RPN_CONST);
pushbyte(expr, 0xFF);
pushbyte(expr, 0);
pushbyte(expr, 0);
pushbyte(expr, 0);
pushbyte(expr, RPN_AND);
}
void
rpn_LOW(struct Expression * expr, struct Expression * src)
{
*expr = *src;
expr->nVal = expr->nVal & 0xFF;
pushbyte(expr, RPN_CONST);
pushbyte(expr, 0xFF);
pushbyte(expr, 0);
pushbyte(expr, 0);
pushbyte(expr, 0);
pushbyte(expr, RPN_AND);
}
void void
rpn_LOGEQU(struct Expression * expr, struct Expression * src1, rpn_LOGEQU(struct Expression * expr, struct Expression * src1,
struct Expression * src2) struct Expression * src2)

22
test/link/high-low-a.asm Normal file
View File

@@ -0,0 +1,22 @@
ldhilo : MACRO
ld HIGH(\1),LOW(\2)
ENDM
SECTION "r0", ROM0[$0]
ld HIGH(af),a
ld HIGH(bc),LOW(bc)
ld LOW(bc),HIGH(bc)
ld HIGH(de),LOW(de)
ld LOW(de),HIGH(de)
ldhilo hl, hl
ld LOW(hl),HIGH(hl)
db HIGH(label+$AB)
db LOW(label+$AB)
db HIGH($1234)
db LOW($1234)
SECTION "o",OAM
DS $10
label:

18
test/link/high-low-b.asm Normal file
View File

@@ -0,0 +1,18 @@
SECTION "r0", ROM0[$0]
ld a,a
ld b,c
ld c,b
ld d,e
ld e,d
ld h,l
ld l,h
db ((label+$AB) >> 8) & $FF
db (label+$AB) & $FF
db ($1234 >> 8) & $FF
db $1234 & $FF
SECTION "o",OAM
DS $10
label:

View File

@@ -1,5 +1,6 @@
otemp=$(mktemp) otemp=$(mktemp)
gbtemp=$(mktemp) gbtemp=$(mktemp)
gbtemp2=$(mktemp)
outtemp=$(mktemp) outtemp=$(mktemp)
RGBASM=../../rgbasm RGBASM=../../rgbasm
@@ -23,4 +24,10 @@ diff romx-tiny-no-t.out $outtemp
$RGBLINK -t -o $gbtemp $otemp > $outtemp 2>&1 $RGBLINK -t -o $gbtemp $otemp > $outtemp 2>&1
diff romx-tiny-t.out $outtemp diff romx-tiny-t.out $outtemp
$RGBASM -o $otemp high-low-a.asm
$RGBLINK -o $gbtemp $otemp
$RGBASM -o $otemp high-low-b.asm
$RGBLINK -o $gbtemp2 $otemp
diff $gbtemp $gbtemp2
exit 0 exit 0