shithub: rgbds

Download patch

ref: ca36422ac94e1a1313ff508987f494c7ffaa7520
parent: 8e4ba8d2e436a985c77e08212b65dd31157dea3f
author: Rangi <[email protected]>
date: Fri Apr 30 14:00:31 EDT 2021

Parse 'ld hl, sp - <e8>' correctly

Fixes #864

--- a/src/asm/parser.y
+++ b/src/asm/parser.y
@@ -487,6 +487,7 @@
 %type	<constValue>	const_3bit
 %type	<expr>		reloc_8bit
 %type	<expr>		reloc_8bit_no_str
+%type	<expr>		reloc_8bit_offset
 %type	<expr>		reloc_16bit
 %type	<expr>		reloc_16bit_no_str
 %type	<constValue>	sectiontype
@@ -1344,6 +1345,16 @@
 		}
 ;
 
+reloc_8bit_offset : T_OP_ADD relocexpr {
+			rpn_CheckNBit(&$2, 8);
+			$$ = $2;
+		}
+		| T_OP_SUB relocexpr {
+			rpn_UNNEG(&$$, &$2);
+			rpn_CheckNBit(&$$, 8);
+		}
+;
+
 reloc_16bit	: relocexpr {
 			rpn_CheckNBit(&$1, 16);
 			$$ = $1;
@@ -1863,9 +1874,9 @@
 		| z80_ld_a
 ;
 
-z80_ld_hl	: T_Z80_LD T_MODE_HL T_COMMA T_MODE_SP T_OP_ADD reloc_8bit {
+z80_ld_hl	: T_Z80_LD T_MODE_HL T_COMMA T_MODE_SP reloc_8bit_offset {
 			out_AbsByte(0xF8);
-			out_RelByte(&$6, 1);
+			out_RelByte(&$5, 1);
 		}
 		| T_Z80_LD T_MODE_HL T_COMMA reloc_16bit {
 			out_AbsByte(0x01 | (REG_HL << 4));
--- a/test/link/all-instructions.asm
+++ b/test/link/all-instructions.asm
@@ -220,6 +220,7 @@
     add sp,$DB
     ld  [$ABCD],sp
     ld  hl,sp+$DB
+    ld  hl,sp-$25
     ld  sp,hl
 
     pop af
@@ -243,8 +244,6 @@
     nop
     scf
     stop
-BYTE = 0
-REPT 256
+FOR BYTE, 256
     stop BYTE
-BYTE = BYTE + 1
 ENDR
binary files a/test/link/all-instructions.out.bin b/test/link/all-instructions.out.bin differ