Skip to content

Commit 6fd437d

Browse files
committed
[INS8070] Accept simple label as PC-relative index
1 parent 4899e14 commit 6fd437d

File tree

5 files changed

+155
-113
lines changed

5 files changed

+155
-113
lines changed

src/asm_ins8070.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,10 @@ void AsmIns8070::emitGeneric(AsmInsn &insn, const Operand &op) const {
144144
}
145145
if ((op.mode == M_ADR || op.mode == M_VEC) && op.reg == REG_UNDEF) {
146146
const auto target = op.getError() ? 0xFF00 : op.val16;
147-
if (target < 0xFF00)
148-
insn.setErrorIf(op, OVERFLOW_RANGE);
147+
if (target < 0xFF00) {
148+
emitRelative(insn, op);
149+
return;
150+
}
149151
insn.embed(5);
150152
insn.emitOperand8(target);
151153
return;

src/dis_ins8070.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,6 @@ void DisIns8070::decodeRelative(DisInsn &insn, StrBuffer &out, AddrMode mode, bo
8282
const auto target = base + delta;
8383
insn.setErrorIf(out, checkAddr(target));
8484
outRelAddr(out, target, insn.address(), 8);
85-
if (fetch == 0)
86-
outRegName(out.letter(','), REG_PC);
8785
} else {
8886
outDec(out, delta, -8).letter(',');
8987
outRegName(out, ptr);

test/autogen/gen_ins8070.asm

+42-42
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@
7373
BNZ $
7474
BNZ 127,P2
7575
BNZ -128,P2
76-
LD EA, $-126,PC
77-
LD EA, $,PC
78-
LD EA, $+1,PC
76+
LD EA, $-126
77+
LD EA, $
78+
LD EA, $+1
7979
LD EA, -126,SP
8080
LD EA, 0,SP
8181
LD EA, -125,P2
@@ -84,39 +84,39 @@
8484
LD EA, 0FF86H
8585
LD EA, @-121,P2
8686
LD EA, @0,P2
87-
ST EA, $-118,PC
88-
ST EA, $,PC
89-
ST EA, $+1,PC
87+
ST EA, $-118
88+
ST EA, $
89+
ST EA, $+1
9090
ST EA, -118,SP
9191
ST EA, 0,SP
9292
ST EA, -117,P2
9393
ST EA, 0,P2
9494
ST EA, 0FF8EH
9595
ST EA, @-113,P2
9696
ST EA, @0,P2
97-
ILD A, $-110,PC
98-
ILD A, $,PC
99-
ILD A, $+1,PC
97+
ILD A, $-110
98+
ILD A, $
99+
ILD A, $+1
100100
ILD A, -110,SP
101101
ILD A, 0,SP
102102
ILD A, -109,P2
103103
ILD A, 0,P2
104104
ILD A, 0FF96H
105105
ILD A, @-105,P2
106106
ILD A, @0,P2
107-
DLD A, $-102,PC
108-
DLD A, $,PC
109-
DLD A, $+1,PC
107+
DLD A, $-102
108+
DLD A, $
109+
DLD A, $+1
110110
DLD A, -102,SP
111111
DLD A, 0,SP
112112
DLD A, -101,P2
113113
DLD A, 0,P2
114114
DLD A, 0FF9EH
115115
DLD A, @-97,P2
116116
DLD A, @0,P2
117-
LD T, $-94,PC
118-
LD T, $,PC
119-
LD T, $+1,PC
117+
LD T, $-94
118+
LD T, $
119+
LD T, $+1
120120
LD T, -94,SP
121121
LD T, 0,SP
122122
LD T, -93,P2
@@ -125,9 +125,9 @@
125125
LD T, 0FFA6H
126126
LD T, @-89,P2
127127
LD T, @0,P2
128-
ADD EA, $-78,PC
129-
ADD EA, $,PC
130-
ADD EA, $+1,PC
128+
ADD EA, $-78
129+
ADD EA, $
130+
ADD EA, $+1
131131
ADD EA, -78,SP
132132
ADD EA, 0,SP
133133
ADD EA, -77,P2
@@ -136,9 +136,9 @@
136136
ADD EA, 0FFB6H
137137
ADD EA, @-73,P2
138138
ADD EA, @0,P2
139-
SUB EA, $-70,PC
140-
SUB EA, $,PC
141-
SUB EA, $+1,PC
139+
SUB EA, $-70
140+
SUB EA, $
141+
SUB EA, $+1
142142
SUB EA, -70,SP
143143
SUB EA, 0,SP
144144
SUB EA, -69,P2
@@ -147,9 +147,9 @@
147147
SUB EA, 0FFBEH
148148
SUB EA, @-65,P2
149149
SUB EA, @0,P2
150-
LD A, $-62,PC
151-
LD A, $,PC
152-
LD A, $+1,PC
150+
LD A, $-62
151+
LD A, $
152+
LD A, $+1
153153
LD A, -62,SP
154154
LD A, 0,SP
155155
LD A, -61,P2
@@ -158,19 +158,19 @@
158158
LD A, 0FFC6H
159159
LD A, @-57,P2
160160
LD A, @0,P2
161-
ST A, $-54,PC
162-
ST A, $,PC
163-
ST A, $+1,PC
161+
ST A, $-54
162+
ST A, $
163+
ST A, $+1
164164
ST A, -54,SP
165165
ST A, 0,SP
166166
ST A, -53,P2
167167
ST A, 0,P2
168168
ST A, 0FFCEH
169169
ST A, @-49,P2
170170
ST A, @0,P2
171-
AND A, $-46,PC
172-
AND A, $,PC
173-
AND A, $+1,PC
171+
AND A, $-46
172+
AND A, $
173+
AND A, $+1
174174
AND A, -46,SP
175175
AND A, 0,SP
176176
AND A, -45,P2
@@ -179,9 +179,9 @@
179179
AND A, 0FFD6H
180180
AND A, @-41,P2
181181
AND A, @0,P2
182-
OR A, $-38,PC
183-
OR A, $,PC
184-
OR A, $+1,PC
182+
OR A, $-38
183+
OR A, $
184+
OR A, $+1
185185
OR A, -38,SP
186186
OR A, 0,SP
187187
OR A, -37,P2
@@ -190,9 +190,9 @@
190190
OR A, 0FFDEH
191191
OR A, @-33,P2
192192
OR A, @0,P2
193-
XOR A, $-30,PC
194-
XOR A, $,PC
195-
XOR A, $+1,PC
193+
XOR A, $-30
194+
XOR A, $
195+
XOR A, $+1
196196
XOR A, -30,SP
197197
XOR A, 0,SP
198198
XOR A, -29,P2
@@ -201,9 +201,9 @@
201201
XOR A, 0FFE6H
202202
XOR A, @-25,P2
203203
XOR A, @0,P2
204-
ADD A, $-14,PC
205-
ADD A, $,PC
206-
ADD A, $+1,PC
204+
ADD A, $-14
205+
ADD A, $
206+
ADD A, $+1
207207
ADD A, -14,SP
208208
ADD A, 0,SP
209209
ADD A, -13,P2
@@ -212,9 +212,9 @@
212212
ADD A, 0FFF6H
213213
ADD A, @-9,P2
214214
ADD A, @0,P2
215-
SUB A, $-6,PC
216-
SUB A, $,PC
217-
SUB A, $+1,PC
215+
SUB A, $-6
216+
SUB A, $
217+
SUB A, $+1
218218
SUB A, -6,SP
219219
SUB A, 0,SP
220220
SUB A, -5,P2

test/test_asm_ins8070.cpp

+42
Original file line numberDiff line numberDiff line change
@@ -232,65 +232,83 @@ static void test_indexed() {
232232
ERRT("BRA 128,P3", OVERFLOW_RANGE, "128,P3", 0x77, 0x80);
233233

234234
ATEST(0x1000, "LD EA,0x1000,PC", 0x80, 0xFF);
235+
ATEST(0x1000, "LD EA,0x1000", 0x80, 0xFF);
235236
ATEST(0x1000, "LD EA,0x0F81,PC", 0x80, 0x80);
237+
ATEST(0x1000, "LD EA,0x0F81", 0x80, 0x80);
236238
ATEST(0x1000, "LD EA,0x1080,PC", 0x80, 0x7F);
239+
ATEST(0x1000, "LD EA,0x1080", 0x80, 0x7F);
237240
AERRT(0x1000, "LD EA,0x0F80,PC", OPERAND_TOO_FAR, "0x0F80,PC", 0x80, 0x7F);
241+
AERRT(0x1000, "LD EA,0x0F80", OPERAND_TOO_FAR, "0x0F80", 0x80, 0x7F);
238242
AERRT(0x1000, "LD EA,0x1081,PC", OPERAND_TOO_FAR, "0x1081,PC", 0x80, 0x80);
243+
AERRT(0x1000, "LD EA,0x1081", OPERAND_TOO_FAR, "0x1081", 0x80, 0x80);
239244
TEST( "LD EA,0,SP", 0x81, 0x00);
240245
TEST( "LD EA,-128,P2", 0x82, 0x80);
241246
TEST( "LD EA,127,P3", 0x83, 0x7F);
242247
ERRT( "LD EA,-129,P2", OVERFLOW_RANGE, "-129,P2", 0x82, 0x7F);
243248
ERRT( "LD EA,128,P3", OVERFLOW_RANGE, "128,P3", 0x83, 0x80);
244249
ATEST(0x1100, "ST EA,0x1081,PC", 0x88, 0x80);
250+
ATEST(0x1100, "ST EA,0x1081", 0x88, 0x80);
245251
TEST( "ST EA,0,SP", 0x89, 0x00);
246252
TEST( "ST EA,-128,P2", 0x8A, 0x80);
247253
TEST( "ST EA,127,P3", 0x8B, 0x7F);
248254
ATEST(0x1000, "LD T,0x1080,PC", 0xA0, 0x7F);
255+
ATEST(0x1000, "LD T,0x1080", 0xA0, 0x7F);
249256
TEST( "LD T,0,SP", 0xA1, 0x00);
250257
TEST( "LD T,-128,P2", 0xA2, 0x80);
251258
TEST( "LD T,127,P3", 0xA3, 0x7F);
252259
ATEST(0x1000, "ADD EA,0x1005,PC", 0xB0, 0x04);
260+
ATEST(0x1000, "ADD EA,0x1005", 0xB0, 0x04);
253261
TEST( "ADD EA,0,SP", 0xB1, 0x00);
254262
TEST( "ADD EA,-128,P2", 0xB2, 0x80);
255263
TEST( "ADD EA,127,P3", 0xB3, 0x7F);
256264
ATEST(0x1000, "SUB EA,0x1000,PC", 0xB8, 0xFF);
265+
ATEST(0x1000, "SUB EA,0x1000", 0xB8, 0xFF);
257266
TEST( "SUB EA,0,SP", 0xB9, 0x00);
258267
TEST( "SUB EA,-128,P2", 0xBA, 0x80);
259268
TEST( "SUB EA,127,P3", 0xBB, 0x7F);
260269

261270
ATEST(0x1000, "ILD A,0x1000,PC", 0x90, 0xFF);
271+
ATEST(0x1000, "ILD A,0x1000", 0x90, 0xFF);
262272
TEST( "ILD A,0,SP", 0x91, 0x00);
263273
TEST( "ILD A,-128,P2", 0x92, 0x80);
264274
TEST( "ILD A,127,P3", 0x93, 0x7F);
265275
ATEST(0x1000, "DLD A,0x1000,PC", 0x98, 0xFF);
276+
ATEST(0x1000, "DLD A,0x1000", 0x98, 0xFF);
266277
TEST( "DLD A,0,SP", 0x99, 0x00);
267278
TEST( "DLD A,-128,P2", 0x9A, 0x80);
268279
TEST( "DLD A,127,P3", 0x9B, 0x7F);
269280
ATEST(0x1000, "LD A,0x1000,PC", 0xC0, 0xFF);
281+
ATEST(0x1000, "LD A,0x1000", 0xC0, 0xFF);
270282
TEST( "LD A,0,SP", 0xC1, 0x00);
271283
TEST( "LD A,-128,P2", 0xC2, 0x80);
272284
TEST( "LD A,127,P3", 0xC3, 0x7F);
273285
ATEST(0x1000, "ST A,0x1000,PC", 0xC8, 0xFF);
286+
ATEST(0x1000, "ST A,0x1000", 0xC8, 0xFF);
274287
TEST( "ST A,0,SP", 0xC9, 0x00);
275288
TEST( "ST A,-128,P2", 0xCA, 0x80);
276289
TEST( "ST A,127,P3", 0xCB, 0x7F);
277290
ATEST(0x1000, "AND A,0x1000,PC", 0xD0, 0xFF);
291+
ATEST(0x1000, "AND A,0x1000", 0xD0, 0xFF);
278292
TEST( "AND A,0,SP", 0xD1, 0x00);
279293
TEST( "AND A,-128,P2", 0xD2, 0x80);
280294
TEST( "AND A,127,P3", 0xD3, 0x7F);
281295
ATEST(0x1000, "OR A,0x1000,PC", 0xD8, 0xFF);
296+
ATEST(0x1000, "OR A,0x1000", 0xD8, 0xFF);
282297
TEST( "OR A,0,SP", 0xD9, 0x00);
283298
TEST( "OR A,-128,P2", 0xDA, 0x80);
284299
TEST( "OR A,127,P3", 0xDB, 0x7F);
285300
ATEST(0x1000, "XOR A,0x1000,PC", 0xE0, 0xFF);
301+
ATEST(0x1000, "XOR A,0x1000", 0xE0, 0xFF);
286302
TEST( "XOR A,0,SP", 0xE1, 0x00);
287303
TEST( "XOR A,-128,P2", 0xE2, 0x80);
288304
TEST( "XOR A,127,P3", 0xE3, 0x7F);
289305
ATEST(0x1000, "ADD A,0x1000,PC", 0xF0, 0xFF);
306+
ATEST(0x1000, "ADD A,0x1000", 0xF0, 0xFF);
290307
TEST( "ADD A,0,SP", 0xF1, 0x00);
291308
TEST( "ADD A,-128,P2", 0xF2, 0x80);
292309
TEST( "ADD A,127,P3", 0xF3, 0x7F);
293310
ATEST(0x1000, "SUB A,0x1000,PC", 0xF8, 0xFF);
311+
ATEST(0x1000, "SUB A,0x1000", 0xF8, 0xFF);
294312
TEST( "SUB A,0,SP", 0xF9, 0x00);
295313
TEST( "SUB A,-128,P2", 0xFA, 0x80);
296314
TEST( "SUB A,127,P3", 0xFB, 0x7F);
@@ -305,9 +323,13 @@ static void test_indexed() {
305323
TEST( "BZ neg128,P3", 0x6F, 0x80);
306324
TEST( "BRA pos127,P2", 0x76, 0x7F);
307325
ATEST(0x1000, "LD EA,sym1000,PC", 0x80, 0xFF);
326+
ATEST(0x1000, "LD EA,sym1000", 0x80, 0xFF);
308327
ATEST(0x1100, "ST EA,sym1081,PC", 0x88, 0x80);
328+
ATEST(0x1100, "ST EA,sym1081", 0x88, 0x80);
309329
ATEST(0x1000, "LD T,sym1080,PC", 0xA0, 0x7F);
330+
ATEST(0x1000, "LD T,sym1080", 0xA0, 0x7F);
310331
ATEST(0x1000, "ADD EA,sym1005,PC", 0xB0, 0x04);
332+
ATEST(0x1000, "ADD EA,sym1005", 0xB0, 0x04);
311333
TEST( "SUB A,neg128,SP", 0xF9, 0x80);
312334
TEST( "SUB A,pos127,P2", 0xFA, 0x7F);
313335
}
@@ -345,6 +367,25 @@ static void test_auto_indexed() {
345367
TEST("SUB A,@-128,P2", 0xFE, 0x80);
346368
TEST("SUB A,@127,P3", 0xFF, 0x7F);
347369

370+
TEST("ILD A,-128,@P2", 0x96, 0x80);
371+
TEST("ILD A,127,@P3", 0x97, 0x7F);
372+
TEST("DLD A,-128,@P2", 0x9E, 0x80);
373+
TEST("DLD A,127,@P3", 0x9F, 0x7F);
374+
TEST("LD A,-128,@P2", 0xC6, 0x80);
375+
TEST("LD A,127,@P3", 0xC7, 0x7F);
376+
TEST("ST A,-128,@P2", 0xCE, 0x80);
377+
TEST("ST A,127,@P3", 0xCF, 0x7F);
378+
TEST("AND A,-128,@P2", 0xD6, 0x80);
379+
TEST("AND A,127,@P3", 0xD7, 0x7F);
380+
TEST("OR A,-128,@P2", 0xDE, 0x80);
381+
TEST("OR A,127,@P3", 0xDF, 0x7F);
382+
TEST("XOR A,-128,@P2", 0xE6, 0x80);
383+
TEST("XOR A,127,@P3", 0xE7, 0x7F);
384+
TEST("ADD A,-128,@P2", 0xF6, 0x80);
385+
TEST("ADD A,127,@P3", 0xF7, 0x7F);
386+
TEST("SUB A,-128,@P2", 0xFE, 0x80);
387+
TEST("SUB A,127,@P3", 0xFF, 0x7F);
388+
348389
symtab.intern(-128, "neg128");
349390
symtab.intern(+127, "pos127");
350391
symtab.intern(-1, "neg1");
@@ -399,6 +440,7 @@ static void test_undef() {
399440
ERUS("BP UNDEF,P2", "UNDEF,P2", 0x66, 0x00);
400441
AERUS(0x1100, "BZ UNDEF", "UNDEF", 0x6C, 0x00);
401442
AERUS(0x1000, "LD EA,UNDEF,PC", "UNDEF,PC", 0x80, 0x00);
443+
AERUS(0x1000, "LD EA,UNDEF", "UNDEF", 0x85, 0x00);
402444
AERUS(0x1000, "JSR UNDEF", "UNDEF", 0x20, 0x00, 0x00);
403445
AERUS(0x1000, "JMP UNDEF", "UNDEF", 0x24, 0x00, 0x00);
404446
}

0 commit comments

Comments
 (0)