Skip to content

Commit 39a3f34

Browse files
committed
Fix wrong opcode allowed
This fixes issue #172
1 parent 3be2a13 commit 39a3f34

10 files changed

Lines changed: 61 additions & 10 deletions

File tree

src/libzxbasm/asmlex.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from src.api.errmsg import error
1919

2020
_tokens = ('STRING', 'NEWLINE', 'CO',
21-
'ID', 'COMMA', 'PLUS', 'MINUS', 'LP', 'RP', 'LPP', 'RPP', 'MUL', 'DIV', 'POW', 'MOD',
21+
'ID', 'COMMA', 'PLUS', 'MINUS', 'LB', 'RB', 'LP', 'RP', 'LPP', 'RPP', 'MUL', 'DIV', 'POW', 'MOD',
2222
'UMINUS', 'APO', 'INTEGER', 'ADDR',
2323
'LSHIFT', 'RSHIFT', 'BAND', 'BOR', 'BXOR'
2424
)
@@ -325,14 +325,22 @@ def t_ADDR(self, t):
325325
r'\$'
326326
return t
327327

328+
def t_LB(self, t):
329+
r'\['
330+
return t
331+
332+
def t_RB(self, t):
333+
r'\]'
334+
return t
335+
328336
def t_LP(self, t):
329-
r'[\[(]'
337+
r'\('
330338
if t.value != '[' and OPTIONS.bracket:
331339
t.type = 'LPP'
332340
return t
333341

334342
def t_RP(self, t):
335-
r'[])]'
343+
r'\)'
336344
if t.value != ']' and OPTIONS.bracket:
337345
t.type = 'RPP'
338346
return t

src/libzxbasm/asmparse.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,7 @@ def p_asm_ldr8_ind(p):
825825

826826
def p_reg8_hl(p):
827827
""" reg8_hl : LP HL RP
828+
| LB HL RB
828829
"""
829830
p[0] = '(HL)'
830831

@@ -836,6 +837,12 @@ def p_ind8_I(p):
836837
| LP IX MINUS pexpr RP
837838
| LP IY PLUS pexpr RP
838839
| LP IY MINUS pexpr RP
840+
| LB IX expr RB
841+
| LB IY expr RB
842+
| LB IX PLUS pexpr RB
843+
| LB IX MINUS pexpr RB
844+
| LB IY PLUS pexpr RB
845+
| LB IY MINUS pexpr RB
839846
"""
840847
if len(p) == 6:
841848
expr = p[4]
@@ -965,9 +972,10 @@ def p_LD_regI_val(p):
965972
def p_JP_hl(p):
966973
""" asm : JP reg8_hl
967974
| JP LP reg16i RP
975+
| JP LB reg16i RB
968976
"""
969977
s = 'JP '
970-
if p[2] == '(HL)':
978+
if p[2] in ('(HL)', '[HL]'):
971979
s += p[2]
972980
else:
973981
s += '(%s)' % p[3]
@@ -1073,6 +1081,9 @@ def p_LD_addr_reg(p): # Load address,reg
10731081
""" asm : LD pexpr COMMA A
10741082
| LD pexpr COMMA reg16
10751083
| LD pexpr COMMA SP
1084+
| LD mem_indir COMMA A
1085+
| LD mem_indir reg16
1086+
| LD mem_indir SP
10761087
"""
10771088
p[0] = Asm(p.lineno(1), 'LD (NN),%s' % p[4], p[2])
10781089

@@ -1081,6 +1092,9 @@ def p_LD_reg_addr(p): # Load address,reg
10811092
""" asm : LD A COMMA pexpr
10821093
| LD reg16 COMMA pexpr
10831094
| LD SP COMMA pexpr
1095+
| LD A COMMA mem_indir
1096+
| LD reg16 COMMA mem_indir
1097+
| LD SP COMMA mem_indir
10841098
"""
10851099
p[0] = Asm(p.lineno(1), 'LD %s,(NN)' % p[2], p[4])
10861100

@@ -1410,6 +1424,12 @@ def p_expr_lprp(p):
14101424
p[0] = p[2]
14111425

14121426

1427+
def p_mem_indir(p):
1428+
""" mem_indir : LB expr RB
1429+
"""
1430+
p[0] = p[2]
1431+
1432+
14131433
def p_expr_uminus(p):
14141434
""" expr : MINUS expr %prec UMINUS
14151435
| PLUS expr %prec UMINUS

src/parsetab/tabs.dbm.bak

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
'zxbpp', (0, 72580)
2-
'asmparse', (72704, 254311)
3-
'zxnext_asmparse', (327168, 285299)
4-
'zxbparser', (612864, 711440)
2+
'asmparse', (72704, 270388)
3+
'zxnext_asmparse', (343552, 301035)
4+
'zxbparser', (644608, 711440)

src/parsetab/tabs.dbm.dat

31 KB
Binary file not shown.

src/parsetab/tabs.dbm.dir

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
'zxbpp', (0, 72580)
2-
'asmparse', (72704, 254311)
3-
'zxnext_asmparse', (327168, 285299)
4-
'zxbparser', (612864, 711440)
2+
'asmparse', (72704, 270388)
3+
'zxnext_asmparse', (343552, 301035)
4+
'zxbparser', (644608, 711440)

tests/functional/asm_lb_ix_rb.asm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
LD a, [ix + 0]
3+
LD [ix + 0], a
4+
5+
LD a, [iy + 0]
6+
LD [iy + 0], a
7+

tests/functional/asm_lb_ix_rb.bin

12 Bytes
Binary file not shown.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
ld d, [.c]
3+
4+
.c:
5+

tests/functional/jphl.asm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
JP (HL)
3+
JP [HL]
4+
5+
JP (IX)
6+
JP [IX]
7+
8+
JP (IY)
9+
JP [IY]
10+

tests/functional/jphl.bin

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
����������

0 commit comments

Comments
 (0)