Skip to content

Commit 0a3c748

Browse files
committed
fix code gen bug for certain goto array[idx]
1 parent ebf79ef commit 0a3c748

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

codeGenCpu6502/src/prog8/codegen/cpu6502/AsmGen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,7 @@ $repeatLabel""")
10331033
val target = getJumpTarget(jump)
10341034
require(!target.needsExpressionEvaluation)
10351035
if(target.indirect) {
1036+
require(!target.indexedX)
10361037
val complementedInstruction = branchInstruction(stmt.condition, true)
10371038
out("""
10381039
$complementedInstruction +

codeGenCpu6502/src/prog8/codegen/cpu6502/IfElseAsmGen.kt

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ internal class IfElseAsmGen(private val program: PtProgram,
3838
// use a BIT instruction to test for bit 7 or 6 set/clear
3939
val (testBitSet, variable, bitmask) = useBIT
4040
return translateIfBIT(stmt, jumpAfterIf, testBitSet, variable, bitmask)
41-
return
4241
}
4342

4443
val rightDt = compareCond.right.type
@@ -87,13 +86,15 @@ internal class IfElseAsmGen(private val program: PtProgram,
8786
if(testForBitSet) {
8887
if(jumpAfterIf!=null) {
8988
val target = asmgen.getJumpTarget(jumpAfterIf)
89+
require(!target.indexedX)
9090
branch("bmi", target)
9191
}
9292
else
9393
translateIfElseBodies("bpl", ifElse)
9494
} else {
9595
if(jumpAfterIf!=null) {
9696
val target = asmgen.getJumpTarget(jumpAfterIf)
97+
require(!target.indexedX)
9798
branch("bpl", target)
9899
}
99100
else
@@ -107,13 +108,15 @@ internal class IfElseAsmGen(private val program: PtProgram,
107108
if(testForBitSet) {
108109
if(jumpAfterIf!=null) {
109110
val target = asmgen.getJumpTarget(jumpAfterIf)
111+
require(!target.indexedX)
110112
branch("bvs", target)
111113
}
112114
else
113115
translateIfElseBodies("bvc", ifElse)
114116
} else {
115117
if(jumpAfterIf!=null) {
116118
val target = asmgen.getJumpTarget(jumpAfterIf)
119+
require(!target.indexedX)
117120
branch("bvc", target)
118121
}
119122
else
@@ -172,9 +175,8 @@ internal class IfElseAsmGen(private val program: PtProgram,
172175
asmgen.out(" $falseBranch +")
173176
if(target.needsExpressionEvaluation)
174177
target = asmgen.getJumpTarget(jump)
175-
asmgen.out("""
176-
jmp (${target.asmLabel})
177-
+""")
178+
asmgen.jmp(target.asmLabel, target.indirect, target.indexedX)
179+
asmgen.out("+")
178180
} else {
179181
require(!target.needsExpressionEvaluation)
180182
asmgen.out(" $branchInstr ${target.asmLabel}")
@@ -287,6 +289,7 @@ internal class IfElseAsmGen(private val program: PtProgram,
287289
asmgen.out(" bmi + | beq +")
288290
if(target.needsExpressionEvaluation)
289291
target = asmgen.getJumpTarget(jumpAfterIf)
292+
require(!target.indexedX)
290293
asmgen.out("""
291294
jmp (${target.asmLabel})
292295
+""")
@@ -354,6 +357,7 @@ internal class IfElseAsmGen(private val program: PtProgram,
354357
asmgen.out(" bmi + | bne ++")
355358
if(target.needsExpressionEvaluation)
356359
target = asmgen.getJumpTarget(jumpAfterIf)
360+
require(!target.indexedX)
357361
asmgen.out("""
358362
+ jmp (${target.asmLabel})
359363
+""")
@@ -435,6 +439,7 @@ internal class IfElseAsmGen(private val program: PtProgram,
435439
asmgen.out(" bcc + | beq +")
436440
if(target.needsExpressionEvaluation)
437441
target = asmgen.getJumpTarget(jumpAfterIf)
442+
require(!target.indexedX)
438443
asmgen.out("""
439444
jmp (${target.asmLabel})
440445
+""")
@@ -536,6 +541,7 @@ internal class IfElseAsmGen(private val program: PtProgram,
536541
+ bpl +""")
537542
if(target.needsExpressionEvaluation)
538543
target = asmgen.getJumpTarget(jump)
544+
require(!target.indexedX)
539545
asmgen.out("""
540546
jmp (${target.asmLabel})
541547
+""")
@@ -591,6 +597,7 @@ internal class IfElseAsmGen(private val program: PtProgram,
591597
bcs +""")
592598
if(target.needsExpressionEvaluation)
593599
target = asmgen.getJumpTarget(jump)
600+
require(!target.indexedX)
594601
asmgen.out("""
595602
_jump jmp (${target.asmLabel})
596603
+""")
@@ -668,6 +675,7 @@ _jump jmp (${target.asmLabel})
668675
+ bpl +""")
669676
if(target.needsExpressionEvaluation)
670677
target = asmgen.getJumpTarget(jump)
678+
require(!target.indexedX)
671679
asmgen.out("""
672680
jmp (${target.asmLabel})
673681
+""")
@@ -722,6 +730,7 @@ _jump jmp (${target.asmLabel})
722730
bcc +""")
723731
if(target.needsExpressionEvaluation)
724732
target = asmgen.getJumpTarget(jump)
733+
require(!target.indexedX)
725734
asmgen.out("""
726735
jmp (${target.asmLabel})
727736
+""")
@@ -830,6 +839,7 @@ _jump jmp (${target.asmLabel})
830839
bne ++""")
831840
if(target.needsExpressionEvaluation)
832841
target = asmgen.getJumpTarget(jump)
842+
require(!target.indexedX)
833843
asmgen.out("""
834844
+ jmp (${target.asmLabel})
835845
+""")
@@ -909,6 +919,7 @@ _jump jmp (${target.asmLabel})
909919
bne ++""")
910920
if(target.needsExpressionEvaluation)
911921
target = asmgen.getJumpTarget(jump)
922+
require(!target.indexedX)
912923
asmgen.out("""
913924
+ jmp (${target.asmLabel})
914925
+""")
@@ -974,6 +985,7 @@ _jump jmp (${target.asmLabel})
974985
beq ++""")
975986
if(target.needsExpressionEvaluation)
976987
target = asmgen.getJumpTarget(jump)
988+
require(!target.indexedX)
977989
asmgen.out("""
978990
+ jmp (${target.asmLabel})
979991
+""")
@@ -1054,6 +1066,7 @@ _jump jmp (${target.asmLabel})
10541066
beq ++""")
10551067
if(target.needsExpressionEvaluation)
10561068
target = asmgen.getJumpTarget(jump)
1069+
require(!target.indexedX)
10571070
asmgen.out("""
10581071
+ jmp (${target.asmLabel})
10591072
+""")
@@ -1197,6 +1210,7 @@ _jump jmp (${target.asmLabel})
11971210
beq ++""")
11981211
if(target.needsExpressionEvaluation)
11991212
target = asmgen.getJumpTarget(jump)
1213+
require(!target.indexedX)
12001214
asmgen.out("""
12011215
+ jmp (${target.asmLabel})
12021216
+""")
@@ -1249,6 +1263,7 @@ _jump jmp (${target.asmLabel})
12491263
bne +""")
12501264
if(target.needsExpressionEvaluation)
12511265
target = asmgen.getJumpTarget(jump)
1266+
require(!target.indexedX)
12521267
asmgen.out("""
12531268
jmp (${target.asmLabel})
12541269
+""")
@@ -1303,6 +1318,7 @@ _jump jmp (${target.asmLabel})
13031318
beq ++""")
13041319
if(target.needsExpressionEvaluation)
13051320
target = asmgen.getJumpTarget(jump)
1321+
require(!target.indexedX)
13061322
asmgen.out("""
13071323
+ jmp (${target.asmLabel})
13081324
+""")
@@ -1362,6 +1378,7 @@ _jump jmp (${target.asmLabel})
13621378
bne +""")
13631379
if(target.needsExpressionEvaluation)
13641380
target = asmgen.getJumpTarget(jump)
1381+
require(!target.indexedX)
13651382
asmgen.out("""
13661383
jmp (${target.asmLabel})
13671384
+""")
@@ -1424,6 +1441,7 @@ _jump jmp (${target.asmLabel})
14241441
beq ++""")
14251442
if(target.needsExpressionEvaluation)
14261443
target = asmgen.getJumpTarget(jump)
1444+
require(!target.indexedX)
14271445
asmgen.out("""
14281446
+ jmp (${target.asmLabel})
14291447
+""")
@@ -1482,6 +1500,7 @@ _jump jmp (${target.asmLabel})
14821500
bne +""")
14831501
if(target.needsExpressionEvaluation)
14841502
target = asmgen.getJumpTarget(jump)
1503+
require(!target.indexedX)
14851504
asmgen.out("""
14861505
jmp (${target.asmLabel})
14871506
+""")

examples/test.p8

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,33 @@
1+
%import textio
12
%zeropage basicsafe
23

34
main {
45
sub start() {
5-
const uword cbuffer = $2000
6-
cx16.r1 = &cbuffer[cx16.r0] ; ERROR
6+
cx16.r9L = 2
7+
8+
if cx16.r9L < len(jumplist)
9+
goto jumplist[cx16.r9L]
10+
11+
uword[] @nosplit jumplist = [thing.func1, thing.func2, thing.func3]
12+
}
13+
}
14+
15+
thing {
16+
sub func1() {
17+
cx16.r10++
18+
txt.print("one\n")
719
}
20+
sub func2() {
21+
cx16.r10++
22+
txt.print("two\n")
23+
}
24+
sub func3() {
25+
cx16.r10++
26+
txt.print("three\n")
27+
}
28+
sub other() {
29+
cx16.r10++
30+
txt.print("other\n")
31+
}
32+
833
}

0 commit comments

Comments
 (0)