diff --git a/compiler/res/prog8lib/c64/syslib.p8 b/compiler/res/prog8lib/c64/syslib.p8 index 9615ec8d4..56cce7440 100644 --- a/compiler/res/prog8lib/c64/syslib.p8 +++ b/compiler/res/prog8lib/c64/syslib.p8 @@ -703,4 +703,37 @@ cx16 { &uword r14 = $cf1c &uword r15 = $cf1e + &ubyte r0L = $cf00 + &ubyte r1L = $cf02 + &ubyte r2L = $cf04 + &ubyte r3L = $cf06 + &ubyte r4L = $cf08 + &ubyte r5L = $cf0a + &ubyte r6L = $cf0c + &ubyte r7L = $cf0e + &ubyte r8L = $cf10 + &ubyte r9L = $cf12 + &ubyte r10L = $cf14 + &ubyte r11L = $cf16 + &ubyte r12L = $cf18 + &ubyte r13L = $cf1a + &ubyte r14L = $cf1c + &ubyte r15L = $cf1e + + &ubyte r0H = $cf01 + &ubyte r1H = $cf03 + &ubyte r2H = $cf05 + &ubyte r3H = $cf07 + &ubyte r4H = $cf09 + &ubyte r5H = $cf0b + &ubyte r6H = $cf0d + &ubyte r7H = $cf0f + &ubyte r8H = $cf11 + &ubyte r9H = $cf13 + &ubyte r10H = $cf15 + &ubyte r11H = $cf17 + &ubyte r12H = $cf19 + &ubyte r13H = $cf1b + &ubyte r14H = $cf1d + &ubyte r15H = $cf1f } diff --git a/compiler/res/prog8lib/cx16/syslib.p8 b/compiler/res/prog8lib/cx16/syslib.p8 index 06ea357f6..698e6a616 100644 --- a/compiler/res/prog8lib/cx16/syslib.p8 +++ b/compiler/res/prog8lib/cx16/syslib.p8 @@ -116,6 +116,41 @@ cx16 { &uword r14 = $001e &uword r15 = $0020 + &ubyte r0L = $0002 + &ubyte r1L = $0004 + &ubyte r2L = $0006 + &ubyte r3L = $0008 + &ubyte r4L = $000a + &ubyte r5L = $000c + &ubyte r6L = $000e + &ubyte r7L = $0010 + &ubyte r8L = $0012 + &ubyte r9L = $0014 + &ubyte r10L = $0016 + &ubyte r11L = $0018 + &ubyte r12L = $001a + &ubyte r13L = $001c + &ubyte r14L = $001e + &ubyte r15L = $0020 + + &ubyte r0H = $0003 + &ubyte r1H = $0005 + &ubyte r2H = $0007 + &ubyte r3H = $0009 + &ubyte r4H = $000b + &ubyte r5H = $000d + &ubyte r6H = $000f + &ubyte r7H = $0011 + &ubyte r8H = $0013 + &ubyte r9H = $0015 + &ubyte r10H = $0017 + &ubyte r11H = $0019 + &ubyte r12H = $001b + &ubyte r13H = $001d + &ubyte r14H = $001f + &ubyte r15H = $0021 + + ; VERA registers const uword VERA_BASE = $9F20 diff --git a/compiler/src/prog8/compiler/BeforeAsmGenerationAstChanger.kt b/compiler/src/prog8/compiler/BeforeAsmGenerationAstChanger.kt index 140459af5..d785f75f0 100644 --- a/compiler/src/prog8/compiler/BeforeAsmGenerationAstChanger.kt +++ b/compiler/src/prog8/compiler/BeforeAsmGenerationAstChanger.kt @@ -339,9 +339,11 @@ internal class BeforeAsmGenerationAstChanger(val program: Program, val errors: I private fun getAutoIndexerVarFor(expr: ArrayIndexedExpression): MutableList { val modifications = mutableListOf() val statement = expr.containingStatement() + val dt = expr.indexer.indexExpr.inferType(program) + val register = if(dt.istype(DataType.UBYTE) || dt.istype(DataType.BYTE)) "r9L" else "r9" // replace the indexer with just the variable (simply use a cx16 virtual register r9, that we HOPE is not used for other things in the expression...) // assign the indexing expression to the helper variable, but only if that hasn't been done already - val target = AssignTarget(IdentifierReference(listOf("cx16", "r9"), expr.indexer.position), null, null, expr.indexer.position) + val target = AssignTarget(IdentifierReference(listOf("cx16", register), expr.indexer.position), null, null, expr.indexer.position) val assign = Assignment(target, expr.indexer.indexExpr, expr.indexer.position) modifications.add(IAstModification.InsertBefore(statement, assign, statement.definingScope())) modifications.add(IAstModification.ReplaceNode(expr.indexer.indexExpr, target.identifier!!.copy(), expr.indexer)) diff --git a/examples/test.p8 b/examples/test.p8 index 3c53d99ab..992a59ab3 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,10 +1,23 @@ +%import textio +%zeropage basicsafe +%import test_stack + main { sub start() { - if cx16.r0 { - const ubyte buffer_length = 255 ; less than 256 - ubyte[255] buffer - ubyte[buffer_length] buffer2 + str anim = "1234" + ubyte anim_counter = 0 + + test_stack.test() + + txt.print("loading ") + repeat 100 { + ubyte qq = anim[anim_counter/2] + txt.chrout(qq) + anim_counter = (anim_counter+1) & 7 } + txt.print("done!\n") + + test_stack.test() } }