diff --git a/src/asm/parser.y b/src/asm/parser.y index 71506a7d..2d0ecdcb 100644 --- a/src/asm/parser.y +++ b/src/asm/parser.y @@ -430,6 +430,7 @@ enum { %type const_no_str %type uconst %type rs_uconst +%type slice_const %type const_1bit %type const_3bit %type reloc_8bit @@ -1623,6 +1624,10 @@ sectattrs : %empty { } ; +slice_const : T_LBRACK T_TOKEN_B T_TOKEN_AT T_COLON const T_RBRACK { + $$ = $5; + } +; cpu_command : T_Z80_LD z80_ld_args | T_Z80_LD T_MODE_A T_COMMA z80_ld_a_comma_args @@ -1900,10 +1905,18 @@ z80_ld_args : T_MODE_PC T_COMMA T_MODE_PC { out_AbsByte(0x00); } // $00: nop ==> } | T_LBRACK T_TOKEN_L T_TOKEN_AT T_COLON optional_ellipsis T_RBRACK T_COMMA constlist_32bit trailing_comma // dl ==> ld [l @:...], - | T_LBRACK T_TOKEN_B T_TOKEN_AT T_COLON uconst T_RBRACK T_COMMA ds_args trailing_comma { + | slice_const T_COMMA ds_args trailing_comma { // ds , ==> ld [b @:], - out_RelBytes($5, $8.args, $8.nbArgs); - freeDsArgList(&$8); + out_RelBytes($1, $3.args, $3.nbArgs); + freeDsArgList(&$3); + } + | slice_const T_POP_EQUAL string T_LBRACK const T_COLON optional_ellipsis T_RBRACK { + // INCBIN "file.bin", , ==> ld [b @:] = "file.bin"[:...] + if ($1 < 0) + fatalerror("Constant mustn't be negative: %d\n", $1); + out_BinaryFileSlice($3, $5, $1); + if (oFailedOnMissingInclude) + YYACCEPT; } ;