From 5ebd9b54e4de3f3d411cf0483963301dee518dba Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Fri, 10 Apr 2020 21:54:03 +0200 Subject: [PATCH] added some more optimized array assignments --- .../target/c64/codegen/AssignmentAsmGen.kt | 380 +++++++++++++++--- docs/source/todo.rst | 2 +- examples/compiled/balloonflight.prg | Bin 2796 -> 2796 bytes examples/compiled/bdmusic-irq.prg | Bin 987 -> 951 bytes examples/compiled/bdmusic.prg | Bin 949 -> 925 bytes examples/compiled/cube3d-float.prg | Bin 3113 -> 3152 bytes examples/compiled/cube3d-sprites.prg | Bin 7370 -> 7370 bytes examples/compiled/cube3d.prg | Bin 3439 -> 3332 bytes examples/compiled/fibonacci.prg | Bin 525 -> 525 bytes examples/compiled/hello.prg | Bin 1312 -> 1286 bytes examples/compiled/line-circle-gfx.prg | Bin 4699 -> 4273 bytes examples/compiled/line-circle-txt.prg | Bin 3454 -> 3377 bytes examples/compiled/mandelbrot.prg | Bin 1715 -> 1713 bytes examples/compiled/numbergame.prg | Bin 1348 -> 1324 bytes examples/compiled/primes.prg | Bin 1180 -> 1174 bytes examples/compiled/rasterbars.prg | Bin 892 -> 825 bytes examples/compiled/sprites.prg | Bin 1063 -> 1063 bytes examples/compiled/swirl-float.prg | Bin 741 -> 744 bytes examples/compiled/swirl.prg | Bin 893 -> 826 bytes examples/compiled/tehtriz.prg | Bin 6798 -> 6292 bytes examples/compiled/turtle-gfx.prg | Bin 4440 -> 4191 bytes examples/compiled/wizzine.prg | Bin 1455 -> 1433 bytes 22 files changed, 334 insertions(+), 48 deletions(-) diff --git a/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt b/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt index 32b2dcf6f..af5c60e52 100644 --- a/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt +++ b/compiler/src/prog8/compiler/target/c64/codegen/AssignmentAsmGen.kt @@ -77,13 +77,13 @@ internal class AssignmentAsmGen(private val program: Program, private val errors else asmgen.translateArrayIndexIntoA(targetArray) asmgen.out(""" - asl a - tay - lda #<$hexValue - sta $targetName,y - lda #>$hexValue - sta $targetName+1,y - """) + asl a + tay + lda #<$hexValue + sta $targetName,y + lda #>$hexValue + sta $targetName+1,y + """) } DataType.ARRAY_F -> { assignFromFloatConstant(assign.target, constValue.toDouble()) @@ -100,11 +100,65 @@ internal class AssignmentAsmGen(private val program: Program, private val errors // !!! DON'T FORGET : CAN BE AUGMENTED ASSIGNMENT !!! when (assign.value) { is RegisterExpr -> { - TODO() + when(assign.aug_op) { + "setvalue" -> { + val reg = (assign.value as RegisterExpr).register + if(reg!=Register.Y) { + if (arrayIndex is NumericLiteralValue) + asmgen.out(" ldy #${arrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoY(targetArray) + } + when (reg) { + Register.A -> asmgen.out(" sta (${C64Zeropage.SCRATCH_W1}),y") + Register.X -> asmgen.out(" stx (${C64Zeropage.SCRATCH_W1}),y") + Register.Y -> { + if (arrayIndex is NumericLiteralValue) + asmgen.out(" lda #${arrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoA(targetArray) + asmgen.out(""" + sta ${C64Zeropage.SCRATCH_REG} + tya + ldy ${C64Zeropage.SCRATCH_REG} + sta (${C64Zeropage.SCRATCH_W1}),y + """) + } + } + } + else -> TODO("$assign") + } + return true } is IdentifierReference -> { val sourceName = asmgen.asmIdentifierName(assign.value as IdentifierReference) - TODO("$assign") + when(arrayDt) { + DataType.ARRAY_B, DataType.ARRAY_UB, DataType.STR -> { + asmgen.out(" lda $sourceName") + if (arrayIndex is NumericLiteralValue) + asmgen.out(" ldy #${arrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoY(targetArray) + asmgen.out(" sta $targetName,y") + } + DataType.ARRAY_W, DataType.ARRAY_UW -> { + if (arrayIndex is NumericLiteralValue) + asmgen.out(" lda #${arrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoA(targetArray) + asmgen.out(""" + asl a + tay + lda $sourceName + sta $targetName,y + lda $sourceName+1 + sta $targetName+1,y + """) + } + DataType.ARRAY_F -> return false // TODO optimize? + else -> throw AssemblyError("invalid array dt $arrayDt") + } + return true } is AddressOf -> { TODO("$assign") @@ -113,7 +167,36 @@ internal class AssignmentAsmGen(private val program: Program, private val errors TODO("$assign") } is ArrayIndexedExpression -> { - TODO("$assign") + val valueArrayExpr = assign.value as ArrayIndexedExpression + val valueArrayIndex = valueArrayExpr.arrayspec.index + val valueVariablename = asmgen.asmIdentifierName(valueArrayExpr.identifier) + val valueDt = valueArrayExpr.identifier.inferType(program).typeOrElse(DataType.STRUCT) + when(arrayDt) { + DataType.ARRAY_UB -> { + if (arrayDt != DataType.ARRAY_B && arrayDt != DataType.ARRAY_UB && arrayDt != DataType.STR) + throw AssemblyError("expected byte array or string") + if (assign.aug_op == "setvalue") { + if (valueArrayIndex is NumericLiteralValue) + asmgen.out(" ldy #${valueArrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoY(valueArrayExpr) + asmgen.out(" lda $valueVariablename,y") + if (arrayIndex is NumericLiteralValue) + asmgen.out(" ldy #${arrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoY(targetArray) + asmgen.out(" sta $targetName,y") + } else { + return false // TODO optimize + } + } + DataType.ARRAY_B -> TODO() + DataType.ARRAY_UW -> TODO() + DataType.ARRAY_W -> TODO() + DataType.ARRAY_F -> TODO() + else -> throw AssemblyError("invalid array dt") + } + return true } else -> { fallbackAssignment(assign) @@ -125,7 +208,9 @@ internal class AssignmentAsmGen(private val program: Program, private val errors } private fun inplaceAssignToMemoryByte(assign: Assignment): Boolean { - val address = assign.target.memoryAddress?.addressExpression?.constValue(program)?.number ?: return false + val address = assign.target.memoryAddress?.addressExpression?.constValue(program)?.number + ?: return inplaceAssignToNonConstMemoryByte(assign) + val hexAddr = address.toHex() val constValue = assign.value.constValue(program) if (constValue != null) { @@ -226,6 +311,140 @@ internal class AssignmentAsmGen(private val program: Program, private val errors return false } + private fun inplaceAssignToNonConstMemoryByte(assign: Assignment): Boolean { + // target address is not constant, so evaluate it on the stack + asmgen.translateExpression(assign.target.memoryAddress!!.addressExpression) + asmgen.out(""" + inx + lda $ESTACK_LO_HEX,x + sta ${C64Zeropage.SCRATCH_W1} + lda $ESTACK_HI_HEX,x + sta ${C64Zeropage.SCRATCH_W1}+1 + """) + + val constValue = assign.value.constValue(program) + if (constValue != null) { + val hexValue = constValue.number.toHex() + asmgen.out(" ldy #0") + when (assign.aug_op) { + "setvalue" -> asmgen.out(" lda #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") + "+=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | clc | adc #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") + "-=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | sec | sbc #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") + "/=" -> TODO("/=") + "*=" -> TODO("*=") + "**=" -> TODO("**=") + "&=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | and #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") + "|=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | ora #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") + "^=" -> asmgen.out(" lda (${C64Zeropage.SCRATCH_W1}),y | eor #$hexValue | sta (${C64Zeropage.SCRATCH_W1}),y") + "%=" -> TODO("%=") + "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") + ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") + else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") + } + return true + } + + // non-const value. + // !!! DON'T FORGET : CAN BE AUGMENTED ASSIGNMENT !!! + when (assign.value) { + is RegisterExpr -> { + when (assign.aug_op) { + "setvalue" -> { + when ((assign.value as RegisterExpr).register) { + Register.A -> asmgen.out(" ldy #0 | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.X -> asmgen.out(" ldy #0 | stx (${C64Zeropage.SCRATCH_W1}),y") + Register.Y -> asmgen.out(" tya | ldy #0 | sta (${C64Zeropage.SCRATCH_W1}),y") + } + } + "+=" -> { + when ((assign.value as RegisterExpr).register) { + Register.A -> asmgen.out(" ldy #0 | clc | adc (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.X -> asmgen.out(" ldy #0 | txa | clc | adc (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.Y -> asmgen.out(" tya | ldy #0 | clc | adc (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + } + } + "-=" -> { + when ((assign.value as RegisterExpr).register) { + Register.A -> asmgen.out(" ldy #0 | sta ${C64Zeropage.SCRATCH_B1} | lda (${C64Zeropage.SCRATCH_W1}),y | sec | sbc ${C64Zeropage.SCRATCH_B1} | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.X -> asmgen.out(" ldy #0 | stx ${C64Zeropage.SCRATCH_B1} | lda (${C64Zeropage.SCRATCH_W1}),y | sec | sbc ${C64Zeropage.SCRATCH_B1} | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.Y -> asmgen.out(" tya | ldy #0 | sta ${C64Zeropage.SCRATCH_B1} | lda (${C64Zeropage.SCRATCH_W1}),y | sec | sbc ${C64Zeropage.SCRATCH_B1} | sta (${C64Zeropage.SCRATCH_W1}),y") + } + } + "/=" -> TODO("/=") + "*=" -> TODO("*=") + "**=" -> TODO("**=") + "&=" -> { + when ((assign.value as RegisterExpr).register) { + Register.A -> asmgen.out(" ldy #0 | and (${C64Zeropage.SCRATCH_W1}),y| sta (${C64Zeropage.SCRATCH_W1}),y") + Register.X -> asmgen.out(" ldy #0 | txa | and (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.Y -> asmgen.out(" tya | ldy #0 | and (${C64Zeropage.SCRATCH_W1}),y| sta (${C64Zeropage.SCRATCH_W1}),y") + } + } + "|=" -> { + when ((assign.value as RegisterExpr).register) { + Register.A -> asmgen.out(" ldy #0 | ora (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.X -> asmgen.out(" ldy #0 | txa | ora (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.Y -> asmgen.out(" tya | ldy #0 | ora (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + } + } + "^=" -> { + when ((assign.value as RegisterExpr).register) { + Register.A -> asmgen.out(" ldy #0 | eor (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.X -> asmgen.out(" ldy #0 | txa | eor (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + Register.Y -> asmgen.out(" tya | ldy #0 | eor (${C64Zeropage.SCRATCH_W1}),y | sta (${C64Zeropage.SCRATCH_W1}),y") + } + } + "%=" -> TODO("%=") + "<<=" -> throw AssemblyError("<<= should have been replaced by lsl()") + ">>=" -> throw AssemblyError("<<= should have been replaced by lsr()") + else -> throw AssemblyError("invalid aug_op ${assign.aug_op}") + } + return true + } + is IdentifierReference -> { + val sourceName = asmgen.asmIdentifierName(assign.value as IdentifierReference) + TODO("$assign") + } + is AddressOf -> { + TODO("$assign") + } + is DirectMemoryRead -> { + TODO("$assign") + } + is ArrayIndexedExpression -> { + if (assign.aug_op == "setvalue") { + val arrayExpr = assign.value as ArrayIndexedExpression + val arrayIndex = arrayExpr.arrayspec.index + val variablename = asmgen.asmIdentifierName(arrayExpr.identifier) + val arrayDt = arrayExpr.identifier.inferType(program).typeOrElse(DataType.STRUCT) + if (arrayDt != DataType.ARRAY_B && arrayDt != DataType.ARRAY_UB && arrayDt != DataType.STR) + throw AssemblyError("expected byte array or string") + if (arrayIndex is NumericLiteralValue) + asmgen.out(" ldy #${arrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoY(arrayExpr) + asmgen.out(""" + lda $variablename,y + ldy #0 + sta (${C64Zeropage.SCRATCH_W1}),y + """) + } else { + // TODO optimize more augmented assignment cases + val normalAssign = assign.asDesugaredNonaugmented() + asmgen.translateExpression(normalAssign.value) + assignFromEvalResult(normalAssign.target) + } + return true + } + else -> { + fallbackAssignment(assign) + return true + } + } + + return false // TODO optimized + } + private fun inplaceAssignToIdentifier(assign: Assignment): Boolean { val targetType = assign.target.inferType(program, assign) val constNumber = assign.value.constValue(program)?.number @@ -258,7 +477,17 @@ internal class AssignmentAsmGen(private val program: Program, private val errors // !!! DON'T FORGET : CAN BE AUGMENTED ASSIGNMENT !!! when (assign.value) { is RegisterExpr -> { - TODO("$assign") + when(assign.aug_op) { + "setvalue" -> { + when ((assign.value as RegisterExpr).register) { + Register.A -> asmgen.out(" sta $targetName") + Register.X -> asmgen.out(" stx $targetName") + Register.Y -> asmgen.out(" sty $targetName") + } + } + else -> TODO("$assign") + } + return true } is IdentifierReference -> { val sourceName = asmgen.asmIdentifierName(assign.value as IdentifierReference) @@ -285,21 +514,16 @@ internal class AssignmentAsmGen(private val program: Program, private val errors is ArrayIndexedExpression -> { if (assign.aug_op == "setvalue") { val arrayExpr = assign.value as ArrayIndexedExpression - val arrayDt = arrayExpr.identifier.inferType(program).typeOrElse(DataType.STRUCT) - if (arrayDt != DataType.ARRAY_B && arrayDt != DataType.ARRAY_UB) - throw AssemblyError("expected byte array") val arrayIndex = arrayExpr.arrayspec.index val variablename = asmgen.asmIdentifierName(arrayExpr.identifier) + val arrayDt = arrayExpr.identifier.inferType(program).typeOrElse(DataType.STRUCT) + if (arrayDt != DataType.ARRAY_B && arrayDt != DataType.ARRAY_UB && arrayDt != DataType.STR) + throw AssemblyError("expected byte array or string") if (arrayIndex is NumericLiteralValue) asmgen.out(" ldy #${arrayIndex.number.toHex()}") else asmgen.translateArrayIndexIntoY(arrayExpr) - asmgen.out(""" - lda $variablename,y - sta $targetName - lda $variablename+1,y - sta $targetName+1 - """) + asmgen.out(" lda $variablename,y | sta $targetName") } else { // TODO optimize more augmented assignment cases val normalAssign = assign.asDesugaredNonaugmented() @@ -320,26 +544,33 @@ internal class AssignmentAsmGen(private val program: Program, private val errors when (assign.aug_op) { "setvalue" -> { asmgen.out(""" - lda #<$hexNumber - sta $targetName - lda #>$hexNumber - sta $targetName+1 - """) + lda #<$hexNumber + sta $targetName + lda #>$hexNumber + sta $targetName+1 + """) } "+=" -> { asmgen.out(""" - lda $targetName - clc - adc #<$hexNumber - sta $targetName - lda $targetName+1 - adc #>$hexNumber - sta $targetName+1 - """) - return true + lda $targetName + clc + adc #<$hexNumber + sta $targetName + lda $targetName+1 + adc #>$hexNumber + sta $targetName+1 + """) } "-=" -> { - return false // TODO("optimized word -= const") + asmgen.out(""" + lda $targetName + sec + sbc #<$hexNumber + sta $targetName + lda $targetName+1 + sbc #>$hexNumber + sta $targetName+1 + """) } else -> TODO("$assign") } @@ -402,23 +633,23 @@ internal class AssignmentAsmGen(private val program: Program, private val errors is ArrayIndexedExpression -> { if (assign.aug_op == "setvalue") { val arrayExpr = assign.value as ArrayIndexedExpression + val arrayIndex = arrayExpr.arrayspec.index + val variablename = asmgen.asmIdentifierName(arrayExpr.identifier) val arrayDt = arrayExpr.identifier.inferType(program).typeOrElse(DataType.STRUCT) if (arrayDt != DataType.ARRAY_W && arrayDt != DataType.ARRAY_UW) throw AssemblyError("expected word array") - val arrayIndex = arrayExpr.arrayspec.index - val variablename = asmgen.asmIdentifierName(arrayExpr.identifier) if (arrayIndex is NumericLiteralValue) asmgen.out(" lda #${arrayIndex.number.toHex()}") else asmgen.translateArrayIndexIntoA(arrayExpr) asmgen.out(""" - asl a - tay - lda $variablename,y - sta $targetName - lda $variablename+1,y - sta $targetName+1 - """) + asl a + tay + lda $variablename,y + sta $targetName + lda $variablename+1,y + sta $targetName+1 + """) } else { // TODO optimize more augmented assignment cases val normalAssign = assign.asDesugaredNonaugmented() @@ -503,7 +734,40 @@ internal class AssignmentAsmGen(private val program: Program, private val errors return true } is ArrayIndexedExpression -> { - TODO("$assign") + when(assign.aug_op) { + "setvalue" -> { + val arrayExpr = assign.value as ArrayIndexedExpression + val arrayIndex = arrayExpr.arrayspec.index + val variablename = asmgen.asmIdentifierName(arrayExpr.identifier) + val arrayDt = arrayExpr.identifier.inferType(program).typeOrElse(DataType.STRUCT) + if (arrayDt != DataType.ARRAY_F) + throw AssemblyError("expected float array") + if (arrayIndex is NumericLiteralValue) + asmgen.out(" lda #${arrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoA(arrayExpr) + asmgen.out(""" + sta c64.SCRATCH_ZPB1 + asl a + asl a + clc + adc c64.SCRATCH_ZPB1 + tay + lda $variablename,y + sta $targetName + lda $variablename+1,y + sta $targetName+1 + lda $variablename+2,y + sta $targetName+2 + lda $variablename+3,y + sta $targetName+3 + lda $variablename+4,y + sta $targetName+4 + """) + } + else -> TODO("$assign") + } + return true } else -> { fallbackAssignment(assign) @@ -816,7 +1080,29 @@ internal class AssignmentAsmGen(private val program: Program, private val errors TODO("$assign") } is ArrayIndexedExpression -> { - TODO("$assign") + if (assign.aug_op == "setvalue") { + val arrayExpr = assign.value as ArrayIndexedExpression + val arrayIndex = arrayExpr.arrayspec.index + val variablename = asmgen.asmIdentifierName(arrayExpr.identifier) + val arrayDt = arrayExpr.identifier.inferType(program).typeOrElse(DataType.STRUCT) + if (arrayDt != DataType.ARRAY_B && arrayDt != DataType.ARRAY_UB && arrayDt != DataType.STR) + throw AssemblyError("expected byte array or string") + if (arrayIndex is NumericLiteralValue) + asmgen.out(" ldy #${arrayIndex.number.toHex()}") + else + asmgen.translateArrayIndexIntoY(arrayExpr) + when(assign.target.register!!) { + Register.A -> asmgen.out(" lda $variablename,y") + Register.X -> asmgen.out(" ldx $variablename,y") + Register.Y -> asmgen.out(" lda $variablename,y | tay") + } + } else { + // TODO optimize more augmented assignment cases + val normalAssign = assign.asDesugaredNonaugmented() + asmgen.translateExpression(normalAssign.value) + assignFromEvalResult(normalAssign.target) + } + return true } else -> { fallbackAssignment(assign) diff --git a/docs/source/todo.rst b/docs/source/todo.rst index badaadb20..26d55653a 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -2,7 +2,7 @@ TODO ==== -- finalize (most) of the still missing "new" assignment asm code generation (several example code files even refuse to compile currently) +- finalize (most) of the still missing "new" assignment asm code generation - aliases for imported symbols for example perhaps '%alias print = c64scr.print' - option to load library files from a directory instead of the embedded ones (easier library development/debugging) diff --git a/examples/compiled/balloonflight.prg b/examples/compiled/balloonflight.prg index a4434b53e5a1483aabe54bde14dfcc1272975279..c944c87e97f804d20d28eb94a9650de03b3808fb 100644 GIT binary patch delta 261 zcmaDO`bKnurt?iMg_-;kK873%7*^WM{K3AGu~+oMO1@t83qXN@nG6>eFs@7iQftL7 zXnyY%yRedR0fT~wz)G&xDJvyfr>GilIN6@jnbCf7Gh-~{ z+{q7tq}*hCCJVD-uBCh+4J#SJ+NMIZv9EM&W%DWKQg|%1vI#5!wUvD(Z!4=$&*ZgC ml8nnHA7|3zzRKm3&5;0f23NvnMrKBq$pXwuo0-^OF#`bkP-wsa delta 289 zcmaDO`bKnuX38%vg_-;kK874Cxmu^JlxUs0lCgF9N`|=%=k_q1TWK@%2m4CKUeOCH z`Fhnaz=Z>5GF({62vw5;um*HHm7*Ndu1_cp;i8(4NoSaLi zf+Uwt0V}x%R`P*&<;zxF|llBVt>U909O5X-T(jq diff --git a/examples/compiled/bdmusic-irq.prg b/examples/compiled/bdmusic-irq.prg index 090c7611c61acb2ad5517cf03acd55a5179e19bd..e166081b03ca07ffbc7145cb751c6285eeab62ac 100644 GIT binary patch delta 293 zcmY*SJ4?e*7`@F+o8+Fpttg0i)m;!A^AobTxtX8f*sWc@MYtkOa4V>A!6;X7Q0d?w z5Q!Z+2(BXH?$VbgI(dfkfWtYj&b@QIzH$qBfb(y8B9? z@xam{4|*bDWK%KY62;M)wc(RJ=(<#V7uxQ#R2Tc~IqOm>cPYiXBrXOWPqERU>#4#> z$A8($b9834Iz5rfVVErns)p_4Qnh#@)FR&t<(-gUo_rI*_U93xEmel*sscS$Rp^PT zK~Gg3dZrrCbJfJ-FJ3}Z23e*8;-(53n;K|h>Y%AY5Z&BfxXTWRilSiQYOnc@O?sRA0V(fiq>CWa2qQx7%76$9Zn1)m5+Q#; zB|{$E3C+;OJVqF6*4=gXJ3W^4Py8NB?FB{ymSX%aRAglpFV*~fOVCw$aoz6} z7707&31XRzP%cyMf6rTZex_H+%?L8R_RF?LB8Q=^BCxX(wsk@qTnpOdtx&!S`BjiU z1m(~3A}EJSpg5I5ji>@@OjS@5s)3qP9n_2(@VLNpXi9*NDFbp-0UVhs;MmjvC#DWK bH4VVoO%X!2L|e8%AJe-141Yg&5BS*+F^!4} diff --git a/examples/compiled/bdmusic.prg b/examples/compiled/bdmusic.prg index 77cc397f7f0ab28173a0579d5731186d0dc892d8..ea5de7011b40f35dab7141bc0aab610dba222e07 100644 GIT binary patch delta 206 zcmdnWK9_xhBFk)Ug|LmPOBh)T7H}z8Pd>+}!I(YyJENl4|D~*R8P2tGF8$B7Vy6XX zFT<6cmYlteSC(=@`0QXl$CZ@=y)0LHxv#7ggwRX>_gZl;vqh7!p?YDqQ-%)`}aXCXVsk ei#-hIR!S)NaIa+VZDU$_5hQ7eE;-qqIS&AEPFAk~ delta 259 zcmbQszLkA~BFkoOg}jZbOBh)@7H}y9Pd>+}!Pq?cJELMf=Tg?W4Ch+^FXiM~vD1PR z$lhrQB+u_T?WiP||UdAg+|6|IrgXK7`tQ6>FxzfvhWu+j5Udq`U#J%)?Zy>jV z5Vyi3t~JeECr%t-_`u@xg_FVO24_OJr;m?9fRAIOLWqZ}!sL3U&}aefwL%wwHlJF_ z03sEpalZgs|AE=(E!Q~#?hkCwxPUB%gq6Jtm;SE};s&XSV?6g_55u{Y5(+8YE7^P7 Rm{wi{Nd}@zPS$760{{!}Yc2o) diff --git a/examples/compiled/cube3d-float.prg b/examples/compiled/cube3d-float.prg index 6e55cd1a5cca3f14010ab3d902189891ad199c39..62d96c7a41015191f4a6a8e3e0115f57758d00da 100644 GIT binary patch literal 3152 zcmc&$eQaA-6@Phl?7Sp8dG9)-UR&7B*0o7mQl~A=XQ55ge7J_D?KV0($b&Yt={~eS zC!|6Oc@Zj{)n#l=HWgXc9P%<{+O$b)mIbB>B&Uj8vlWCuNE6$-^q*qJM^R$Qobz7e z*rAmW0%7Uhckb`}&hMUczn)9V)|Y+g|B2idYHF6P=VafZ1KrKC<6+s`8CDeK&8Ih3 z%ijg;Av~|zf5KW%JSSfY1m$M!v25qR!H2hebqV51p5%Nu#BJc!E5q=V;KGtv$D zlkpjQQ>8D{_~xe?|T88i}}k#<1UUY`guUlDeFTb1TQta1ihi;9}S9P{5s$_0FMD42YVm}vR}wpz&6RcAeMn=1NPBEz}`ZuNW_)^ zb04~ci=qw|xf%xHzX$gzqZib2=`+*~K}G_^j&Uw*)u? zw}|?Hy}gK=cR6(z2FrB;yTRq&l35wA&c!*M!VqUN3CN4G#)cwp-nGolCo3tpdt5G0 zCgs}`u-CePJ90r`cNO6)qPmMKR?f=VWe8yN)bxu)j?b3e7Aun@yqeA|@N&(0 z&kqVbj)o)i8lm&T=2^%ySERY%JX|Er<>fuMm;Svg&2{IQE7Dwc9xjsR!t&ca^LD#dWx#%pf-Z=JmS4RQ;b64M$h&VjLPiA3S>?Bwyck8y@M>m7q8!^rq5|85 z-GHsjL#RB^teOg*E=et1q=!_oMM%G(L{rf!S^+Kc0?-G+DgT`QAC`Z3xqK@>G5@#n z5B^)_TYBo8?v($0RpADVh0@2&;Uz0OIvEbX|I@(|+77fC!u*>YE$6L~wX$aimaL^y z;fe6%Y_l<0Ust7t@KNI|amYAjB(lFyL*9&UaO?FoRyMJ8U8(a-&Z+fUXd;n4y~B9L zJC}@llgaDJx#Lk!^7`>YohNST{O~aYA2(ip!Z3%kkxz7`xw2C!Q9a%=t-PXAH$t)To_id=HtKYmO)VOW?j^>uuw)Wk7I`($<^oI9G+%pwZ#uV?EQaYyi#uj|Z z^q);j9rnbOSJjM9zMD&?|89;f$`|yWw?mnVQ9@4A6M4lrITy-!$UIBW_@X)NDW91B zje+kO)4w)?10H+SPC<&Alh-i$X`y1VpbX|(iG>HDQ+zL4*T zZ^$>{OZ)!ell~t6lm1cv+y1FG;R-g2!K>ILSoQICfgyoAMbvkrQQT+}Q>}v3r&_pm zE{c)G$)L<|K2CA+XM%FS`NsI-MdivU?|0K$8qQL2OVmknd*!n8D(<*6Sy?UB>crBE z*+{=|;=FuD&M$qRURUV#uN~9=BqsP%O|M9NhJy-J2)~(kGmCn}a@T>|I7eTd;pp*2 z8dUy)@^>VwW+K^w?uko9-M->(?VId%YJdIbYz_wIa+#)d0~;lohB+lupRQSz3lB~I z2q~ozk39O;xW}{=XU6Q3^i5an(Ld&OkF!a)Ww*c{fxQC50{08r1(r$~EAcX)TK`K= zRQ<@aQN5i0>x(Ka$y2|zw_1w5$tsb8>)BZ%5|m=f6|?w|CABb-!Hwt<&87o}@XndbnY0 Hn5};T7ugwn literal 3113 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 f?FfO6NFSnf?^dn46`?IM%^%0A#`I&k@00%@bNvdp diff --git a/examples/compiled/cube3d.prg b/examples/compiled/cube3d.prg index 6636b1a78375941d202d18ebc803d8101f085d6b..f8bc292cee7970ecb4125c9693ec657fb9d443fc 100644 GIT binary patch delta 1744 zcmbW1PfXiZ7{G0u7&{4xpB>sHF2RJBvF;y-O@dHbXbVF$6>!_7Q>4+UnKsm_r(G6J z!qe2%QYLFsJ1JWg=~b92tPI)-snOa?6>@NvnU1`eH!d~owXPZ~);|)dmTTm1)b_5b7)q$M} zMs;F7kXTT8>`Kt83%dh}uT(eokcj6NWl+jb$aw1(uT%w`QCg6pSZ(73aTag}?#gRY zDMy(Ql(&PFn$a)NUnaBdUJKap=V+5p_B0t(nl1vYp2<-~^=uvZLD~ll0dP7SeyQOU z0E2bl0K-5Mh?Cj2mn!-JI8g@FWrvTQ0k3#I2rR#%cbO*EN>4yN>i|um$73&p+L6K~?I~q{C zqd~5$?mCWuqs>kpSZxR}8AqU!PN)Reg-NR_`*IsyI6sJS*WatiN5aIb{zy z7^@;a0t0RO_f8p33K?L@fNK^G%*_doSZ+>oI0TTan+_Qq0q6y7jzchT7#vQ^q5te` zW&JSNTA$;Co?x5P0s~%{GrlkHWh?I$&Xm3D>=QPY^iXk%B44?R)M0gmJl|DE$$d*b zry{bthz}#z?DAz!9bUe|>EAU6U-{Ph*neSS0UsWQR3m9Pecy=24Cxt+)ms(y-SQ(Hntv$lwo&k=E%5g(}t#rnNgH6*tr?8|+% zo|_l`NA8Z@+>`d)ykJU#mHT!5GwyBwkHXyXSABes_NQ=dY;24){t)!XT=<=N;jUvP zpK|2$PxC8NDJK7PYHTjIirVvjFJZnU#Am9pkM$t`L2s)t`mkr+eM9+m>k_$Q z$I+#go^^&auaWC^IX=UXw>*Kg^JsY-1uimL45gU0^ZF7Wed8YN0Eyi}iQlvZ3;5(d z(&mtM7p2&>J7{eIWtWh)wUu2&y6lp>%SfxBj4)FDu#)m-%S5=Tl~J~WF4jIGk?As; z-aymOk^a7`J2Ea_pAf$&lTF`LYZ-y9bXB`HyJ~o|_u05Oi)+s&^jX&wozPp{pT749 z-7aUJqcm-1H^{vhFFl}4^6OTr=mr^#=bDNa=pvV+ivpt*$mh4yAc$Ha9krUH%m-9a e35oHlLxKKmm*h%apPU;96Hxx=ApvGD`E!0HB zhlWtA6zP(BL1k%44u)Wu;0-7w1lsr^=&8s$XhR6}mSb_Cbq&2GZrtx%Tk^_rAU*7A z_M6}S_CGr_t4#RsaIVwU8f1-u9}ZqhCw<&ACzLhS#~biB;bSwh!Ptj{P5QVKO58Ok zm?dKknuY_L>{MW_Ae6Jtf?#G{Tt)^Qz}!Vfv@+s2C+p$Z8Miw1pg5a0gseNC^jScnsUVi+bYGnz z%!#Izv=JZRs{rBP3xFR1C9l5J5JaG<0_-)UVGzwowB!>nRfG^|tpIx!UY-o3Yt~O_mC<6>1Hp4Y79a$3A5nOYg^ZAQ!dkf`~Qk(J{n2c^me%Te>hdBRiP= zIU($5t=#`T_-=SBU^QQ5xUlZc?1&w!$xy+L zBX$B;w;^fg^|Z5FP6c=uj=o!e+ZAbmWpOINd$4dof9#6jI)Q>43Z4aAF4xaW;J7|6 z@k0m==#8!jIu7I2pv^Iag(Ler;+Erci62GiSj91nS0gsZaV(rbN7oBEE?SP1R6g(9 zaR1?s{ia9U(T}hAIq@tkUX$itHJ_1!b+1@-z6$sPUE- zrAEEhLD`=K{N*ct$Vy`0`QY1>B`^mw%Ky&$_@K2iAn>&EYJo>yJ@B|a@U&8%QLMmO zJs`akY$vx~f6XuVX=lmRv9U2|yifE`q>lbpa>uz^%sGq2C&kr7&QW}l7`s)d;^%ho z*>R$MKyIHS@yurIcm1|B@$R?E>0kRcyw}*ntqX9(ek2!G`!*cVyb8z7r}2yfrgNES z_sQZC38@b47m{kuZ(UcpXGdcm4?)RHI?R*RDJ#>^h~LADnX|vsQ!=K>s+F<%X-w)QolqO z`18M(^&w9}e5B8NE`Rg}z4bD6^FHx scN&0XpFuUd3F~D=Fj)p2aEsZiIAZ+){gQXMt|xf!XYXmzod}}pKe37aGXMYp diff --git a/examples/compiled/fibonacci.prg b/examples/compiled/fibonacci.prg index 74483ed0a1c5283383333a788151be71497b913b..3fd652b6bfb0f941b9c22e5da03735fd837caa0b 100644 GIT binary patch delta 24 gcmeBW>1CO)khhg(>C{%%rOR8VEM3vMaa}wk0DGYdqyPW_ delta 24 gcmeBW>1CO)kax+{R+bjlrOTJBXr0osaa}wk0DV6Spa1{> diff --git a/examples/compiled/hello.prg b/examples/compiled/hello.prg index 21ffda94449e4eafb47f376e398eb3d6d4365e05..c0ed6476f1ded69a36a1493b37402b2a9b985ab9 100644 GIT binary patch delta 883 zcmZ9LO=uHA7>2i-rEX@XX{!~}`Zv9lwu**o(_giM1q};UYY}h77Jm+U@Z!Z1!6ZWL zr-8j#ZDkE?=rpYKs7)#!JftFR2!dX`7K2c7u!3nMew(%_abb7nedn2PX5ZO0NQgw5 z{p*a+vuKgOVs7o2DkSJ2aDu=|0-XfB1dT2N-2{3F^b+W^jeY{B2%IKxhQI(3H4u_5 zciJg~J1y1?Cm*3g3c5s-K_H+`234zA%R{vW{!NTOG zn1$iJU>4^0l35txG_(2$%rO3#iC%s+Q?xK~#4vQkFn7c-dc?dt7*d!zQW!i^m_1S$ zKT-qR6kv3s0rxdRwX?b+UpxGb{aBQib8d0J9$x9S2(>KF(G*HmK5~-V=ld5EgqB;p>b@jXVG`Jg^_Ui+Vp8AL6{0C2t zKF1fhg}3%d4?B2WOKJB>X(g2B6HIH-7aT+W19;GQyx3^bglH}++eC$?RKB7%{3T(- zvAl+#!7dic+ltpFv=+7_Z@#UNLzS|1!5;lXaT}jIlh_Yj4~|76-P(mDmYc$I(FFg# f$PdM1`O(ti_>Y7sJfSd20Vq7x-z!J-U&_&c$p$`s delta 883 zcmZ9LPiPZC6vnqnkj>0AsYoRX+9_UIDA+?eQ@!-XSm)atf;4ujC&9+U63%j%5d%yS1?t8l_k|UY^ zgtwc2VEGoem`@DrQiBl!X9=7maGrocFfdBs0)a6CK>{Ha7$+bIOc0nPFol7nM|MNX zVfpG=t@c?u)Rq5Y8_QY^e0Ax{5gw;spd74piv@B**dt~Fk!g`5iT=T!FOy7?mIHyMvG z*}E+aCP#4dpVVF!sXV+J=l7T#RjEWfr{o@jJ~RJUw_R2Bc!#l4SiD2n#R}Tlonbak zEo@|wS=dX-ENo|qSwWJ3GP6PiUNZiW$@Z^3WW=z~NKJK6I3}cUQb^&j zkivN(W$aRbUhbJ_gl=nD+cH?Eax##OCuR#)N~XLU0kDlNC^ z*bbeJQn*TA#b|W)uUIz^IWO+NPsTp_8}t!A=XE^A1M{|%_XO-`S<=>0O`c{VV3wWX z#88f@DdHmX73ps)6-0$Wt$pMb{H>zkg{Hty;vh>kmEzut2(UeQ?Olfqcglf9mDRD9 ze+ew%{cJ2blh2$I!6mdSqFuhie=PH(<%MR{-W>mo#}uAWcuL_Jg{=A7HRN{Gj&#*F LvRyUvyKDF#M}|e0 diff --git a/examples/compiled/line-circle-gfx.prg b/examples/compiled/line-circle-gfx.prg index f3f9551feefeaf6e8afb57f20b8b9a43107a5ba3..8e662499984ed21a2e5d3fa08bcc6bbc8e397300 100644 GIT binary patch literal 4273 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 V`^)I>A(e5Z`5IT9{c&^#{0qn`|3d%( literal 3454 zcmbVOU1%It6uz@NJG-4`lKWtzlIz^d4;h>#+R_@EUO zqjr2yu1093`%n$S(7l0yDke=*1ADTFSaV zL4d83??z2D0Evq82@<7ii1P+%!3PaT#|I4bV6v1?R5v?%>JYVBk0k(E;1TFzjbL=C zM$o8&wnG{>Y0|jUCY~_S3kLZo)JwtXB++qulH84VCP@mnCDD&M;V`Vj5f6sUTV=5B z_uj!^gTXBf2A=nAqmX9Os7u9Voh0x@oovS?o!o&h=rrQIj^5ftHB(y)vu$HG$ZU#d z)2WSGDDIEYSOj1ZMj*nXY`|`{RrkDp0+gyRyBFAd&b`Q96fTKnnJ-(NR(umWDy~3s zAHD&dR_5!d>^T!DrQT6Wl@s(g14?)vqHn3gRi#vo&9_?4ri!DAg=&4isbZbe!?@|b zlAI>*anL=fthKo0R`g0h_8fY8E7MSY!-I+9DePDg3PpNzb=|oh6p14GRFRYs}W{qxLcTq+PU$J!X%)JCjU_o8~WCGARhPbH#SdZ4(~t>v?ES zj8SY8Wwwtxntyq0{T=>^?*id3FW-1ekBCiW6rpx3#?a@2aY#UZQ^WA!76 zc}GQfb|Ojih&Ti_Z(ZB$aEo)2*&8~=CeAp6onv7}Vd5#H7X{&?&KUPEhWU?qWJf)t zEHKY~+!|`J+|AYl$@LQ8%wC0j34GbIkv#+5Bog3uVZZ>lVg_*}S92z_Mr|1npuN^+5jZ}Ws z%~D0ess2M%U?-_68cr4PU7KLQEUDBWRcJ9*spJ6!L`y1fN@T4hRbbmDskHy4DzKAO zB`-Ix8JbiTO6A?y^GnVmYb*kI$MuM@eOQ2^4e9l@=JIW5F?-Q^);K%ikE(a7+`T!P z=aOt-=)5fBGbWxg@wDkqnD(+aG|Nn-?=EIn1$A^d?oOFJiTdR?Zn~2k5_X?xfiv=H zllA;*?&cBr{5Zd?zMP-%5SeEnM9#^y$^HPfg=y0|XH+~@^{UFyMzs>>lpE73r)mRQ z<@ETpzInUUy0$doC0tYKKsn@8`Bl{;0@=!%%i-~fYTZ&7B~Eu$TY#dWVD)`M=Uq-# z^UAydq776(+TxbV!j$Qr;ms7Bs9hfFX>DQ{Xj@y~m}i%Rf%Pn8s!cL|X7E2E0QP0O z+xq*my@R+bo9nVN74%@BP{G-}xg^y*Tv&#KUmveVBSFir2?L~yN^2kJd)zj|05 zRcFtgqaJ z_$tJ|!x3%a8eF&z-5ZdyyYuYH>or5CR!?hmQk7Dk)Y$XzWzuc~vcp!;ksA7_hTf|Y z4Wlys^87GDzuWIBj}=ps`||{_BVrLVN-2FSPj8j0N~s(t3j6M+=ISE5XjYU`e)EAz=MGGfDOPu*}Bn2xDv4=Ly=g7MYM>4=Ulz)%UG3a9~=f>3k= z?g13F(ez@vgOV)y`-n~e;jSChl zsSnK)V}wk$>sj|KGY89*$qs31=Cv{<9xFaae5h#fp{=4twQ+k3P3%DVOUDuYt1G0o z6<%X36aKp}3rR5{I!lTn0hSbVQb$-)%nD`62GJ&FtWy5BKr|bzFD2cL!NL<}z5I$0 zYa;_9rE!LEv*4K*tc&W|s&yD{KISR+VJjI31OmcnvEpju$rX65rBhKYm6}VXJELl9 zt}`$^vCZ}u*$+<;^pRJ75)5yc@2xfU@~Ine?xQaYPmQ1XF0ss;q$};qs=^!)E0GI^ zRsF?iKfy2=?IYe>D&8kibvbO^(@q~>Bu;FG+?mEqfzY!=@E5^9B~S{XnXxft`-@3@dQ65BIaAESRoa&;kUe8&?+*9&$S(KN zZujU18U0Sv`E2u46W@{ZNHKS8Orm|NaeX|Y2Du`89OSO46_HN2@};$OmEan|9Km&h J8`dHBqyPI)XvY8m delta 1106 zcmY*YL2MI86kU54*WUkUorKVsK*B^^AVQ7X2#NF@+A3@-Zk6C-QBa`*apA(DG6x(r zQNQYHdw>Jg;%Y-Cl@V2?w!uWIDv)fdS`p&f6DXb`Hw!^nwWxLGJMFi6uj zlhdopPRrQUS}H#hF(hYi#0Ht;vl#Vx2R zM+v{*-mtZAs9my!YAu|DGS3J)WgZjZlzCEy9jDCGl6K0HpUIJJp8pi z;T5(r>QfdwjPu-5et_zeFmpflj+saEZ(wQsU^4=B{?! zU%@zn(?%?ATFI0R*w;U>b1<`ec#oI1rjF#`qu;YFxF#QU&+_MfhG%QpmdW8fe+%v0 zRnuNvos%Ui9lqc^km^o$WsmQ6=>c89$c^FC+`S*$({gE#r VG{=9tHqvXP4$>Q>bx$U~{U6UweER?Z diff --git a/examples/compiled/numbergame.prg b/examples/compiled/numbergame.prg index 6f67ab1fa472f597a7749809867e2a3747bc8e83..005117b418b3f04321b9aaa16ef485c3af34f5c6 100644 GIT binary patch delta 614 zcmYjO&1(}u6rbIl)Xc}GtrlGyq!TSdThzr%ixBi+u!cPd{sRGfs8BEB!HeWz0#duM zvX@>0L0sqrTMAxUX+$B&#>3k7(xd39dvg1MqNa^AyQO-0U-Nsv_j~hN_%(KNgXeX& zN?&#jYb?z{HN!6G{9X+NpV-$Id7~^!aM4&ts%@f7g*fdyw6seD5fh#9WE#PwU%F5JWmJu+1*ND~$Ca%{OBp-%3Vom4*L71b)5- zJ_~pi%U&-dEz=SP!WDZ1SvQb%3Gq}c!}}lhi^hX6&&F>OH4sO^IEs2cLhD%?aF9?e zZXiJ&VP1=MSXZYJf0}5|$UQDgt+q64iBS0$V*BH|_3e$L%qTO=r$1*`1u zjWa9bX0<~39che?^di&VA+yC|Q3Mh3IxW?NQP2G=;hAd3`xAl@t)QYT delta 601 zcmYLH&ubGw7@f(ECNn#`8WmiurIUl87D7FEi6|%u=rYoSUOXrPtN0Ii5hMuirF3Cs z5poFxA%`zm5kv$v;K9~S#kGj%dhyUA=w5|toF5Pm`_1>gdHdem*?G#|v!vE(cw(JD znFMma0x0q$BF=blvxo8x@tXtI&8UR_usrfq}29n6Uyb;CPG5%TzWf9I!r9T1WA!mdD_@+0?X}>GCEm z_O288xPky#jnyrxv(8j`sIe|%n^T{KiaW*SFBX4YTof11H*4b4 zHSyvRzJce;HbDT#`mUlcD+{f5)J$?F^_|wikM8i~iG6e-{_8G>VW^rv>1}83^auAj z8D|N}vYl+alsMVWQaBt<*_d1Q%EXNke};Mc;jWC**UmYzpRZKYUFQfsl^!N%t9AF{ zyM@B-s`PjCVc$z{k(Rf{i#@C$N$JvTyq3Nq^M}-Rn6i&%m%!Z!W{Rl^k;!&YxPz0Ae!2nWq#& zc~-7oz^Sm2dnH3F3lQ@uJm-9|m*HG1A5bMk{V4@U9+1!nHlInHK6RW+`4kRuuhdbv z^naxSka))86T!K%7sNdVHfbpfNFF5MGlOgL8parLsD3W6^`{biB)NRvaxUSTtjc7> zs5?1=$-s#ZY(p#SUWW6nY(AD;OSwSSCv<@w@gGDgC_@|}vGUvkE}(lsQXqSdf_Xki zCZA&R60YQ4rKQQwY0$fdyUWYV3&>bKS)Ezlw3K@T%gGZHSWcXHdE#Ws1m+VjQ@mE~ zg{xiA z6rOXw*voLPm2WP?xl=0{K%{~@4@l?(o6jUppE}N^d z3*sIFo3fMzBo7ksnKyYgW2`JxI~T;X1RqH*pSPS#xqwFRVK_Hgp2>*OcybVv0lx^? znpW1m4ChI;#>{h63&t~r4E!^w2awoL>@v)p-${Z;8h|A-E!3XXc VKsRTA-2HU&b>>-&wUdijQ~+bidtd+n diff --git a/examples/compiled/rasterbars.prg b/examples/compiled/rasterbars.prg index 4329a07dea1f87d2444e1859564e5ddbf88551c6..ab8072865dc08684d0c0aa4194ef6eeb0b0d5dea 100644 GIT binary patch delta 353 zcmZXNy-Px27{%{L$UTsQl420?N{c}a<+rU3QPLbFao3g^gW(SZjJhx44D7ixvhlPm9Fw~!}PH{^g)=C#irtpwY! zjyzvQ+~om9T$#Gk*eS}}^~yrcMZc{%pYa>NwQCV`Rn$!!&QR3t`Q-;oYC**P9(oXH zYEFlJ;6Qie;?%bdCvmJh{bq2%M({Hw)B=JnHSTlRRry47rnD$#?%C|sV*3`GMS1P* zEDd2$2BKzC7Gg*_h!N!>JSsqpsR%Kl5;{NX+A0HXs4Tdta^ORi2Op^dxTlKXV^sp5 z+@)b_zpAndaJb#u@`$ZY>RbyJWxeqyMb2t|0{8=i|( z2XXHZGdhV=DK2%L9R3P*N}j0(l(udn{%J4soLved zoeZuGzpDl_=C;#+Fnme|D&02tBMOJ!-s;*ytiEStblW+yr$OR@p8x)v^V+GEUQ~Fo zl`)k?)I$#vaa-2$uGUXxr;7Qv-c^Q(1l*=_Xwg!jCF{WDDez;P=TXSMofjcZDnVLQ zh8$7_azs_gkZO=)szXkwfo_avSC=46U52o91!AbH5F=fK2z4D>Vyqhwle;2Z;|EQC m33c{&xwX%BQd8^cAFIu_Vfwqw?_V>&6|hY+=iGm=Jo^IWUXP^! diff --git a/examples/compiled/sprites.prg b/examples/compiled/sprites.prg index b488de92a896d709e5f126d90593e678000c5d55..d6bef45b8c0a8bdb7c6eb158a50ab2074f81d568 100644 GIT binary patch delta 62 zcmZ3^v7BRquJGms917F9S2DD6wQ{ZG=v~IKglnQl9LF+_4{Xo4d~7$a3t^nZ$T69T S$&US;!Udo@md)-=4;TTOs}%tN delta 67 zcmZ3^v7BRqt~5g{*UH@sI25LHuLLnUde?C*<(kWIZV$t`i4Jib>o`8JJ>&AR-?%J< WaWWH=9Xn7J%Q=M$o86fnFaiK9xEL1z diff --git a/examples/compiled/swirl-float.prg b/examples/compiled/swirl-float.prg index 824e5987f42e7ce0675f3b1739999e54dba1cb30..2f1486206e34222c2293e613b4042822938fd143 100644 GIT binary patch delta 488 zcmZ8eJ4ixN7``S(-x-@65>EEe(jId)v=kIdwKh2vA=Tby5xV_h+_gb2D4j$|eB`UW z79DbEX%Px1+Zryx?VK*xpfjBFy?*}xob&GKd(xAMC&n{OoYVD)_@toQu=o}8^3}1E zZ%b$t1}%UVK}(=z2rbE^=m$-Kra?2HSt(Kg6a>wI=0PEqvXT(t40s3pj0wL)UydN2 zGfe4m#xI!&By3MbIuLEg6E8N}XS{{}qt;GZB4B4;hnctk8DuT0A`7ZO>`@t6MkVkI zyS332Jy~#6OPPk6t=r6*A55QcdB=A_QPg+fJ#E#jcQt>x% zS_R#K?vWlHf|OimoxW`8u;P}C<~e%u?v0|n(*Jb-GTI;a71HT9d3tsl5Av|RuI delta 488 zcmZ8eyGue*7{6CB{GBlf#KogoU3>fkJ(iYGZctOJLl2@FThqms_`qo)1qtn7C*Bgoz{_yTlh6?wrMsn2*nS zcfT#6Q3NyzngUIOW+1c_lhaCp0w4|wf<4Gn0StOLFA}xqV+Y`^fXpQj(I=9+W3M#8IFHYw5f5ys#YRFqug;=Eu@{G#h z2TtoZyI^p*9zL15;?0Egk>O=f3=I>$4L3!Rc6Vc$s6IPi1uHb9SHO0gN`t^&4Rj7F zB0bbCpj$$*0x+9^9X~)8mN+*->6kZf34279FNU$)so(Xj)E%+f5Zd>zne4 q40hO8jBnM=CH6;+8%6!nGjO1EBXWTx34$= diff --git a/examples/compiled/swirl.prg b/examples/compiled/swirl.prg index db745e53e4ba07c3b09a72310fb102a5a6746667..603b6b6ede2d98f906d35b2bc23903e1f4f57af9 100644 GIT binary patch delta 286 zcmYk1ze>YU6vppuAfB(jKn92FAUFtF^$i@fMX>bW(#0X5&!B=C55#uPA{5MUr%sXf z1su|Uc?1Qg)S{zuy&;QdI3Ik!!}oE1-4{37zkP$6BDv$oTC(9o=gD~Ln67_JB6vZ( zB&#dpb*Z^sp$Vav6pQRty(1B^oU0*bavsaJqKTpf-2oe;+oO9q+!0fmr5jBA+NpH?x_xEv2TzW5 A2LJ#7 delta 355 zcmZXPF-yZx6oubQAmltZrwn3WUF_iGApQgg9i)FCi-Vv`XG6uBwhk9kowEo5-|(hR z5d+R0lEoiUL?Z6m=S#W>-r?R0-{IVIpS>S1=?-^=e22QGnWH|b=RTT19{LyGMlo9X zWPCdrh{I0Dw%Ekb#!p$fkUgPT$}9Pbf>$Xomjx>=b=Qj>wE$P7)OPH7B1 zbU-m=A9~f8w${}`NxLgIWz|A%ipJN5DOhFmXx7-bN33rCPsh;cIBEySCw|D9x^=}< zz60tY?;<#JX&Z@KcaS+W`#RX0V2vZ3ztO1GTuwn(pc^D!9ibjUk3q)h_@U45x0ZoT d6!FsjY>!3F^Hs=Rc$x2u`3FDZ-auFu{sQ1gj(`9F diff --git a/examples/compiled/tehtriz.prg b/examples/compiled/tehtriz.prg index 081347ad12816f0aa22072c68914c22aec4f7967..3b24170dfac11e7f7e2fbbe08a8f3480a6e8916a 100644 GIT binary patch literal 6292 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 QUv&vd<8#Mm5;Nid0qvR_aR2}S literal 6798 zcmb7JeQ*=U6MkklB+Kx_dfXH0B|IGIkWw9p}he0ADs zW*S=P_(+EFC8mFwgb&5_IbOGF=yWE*op^?{4I?=-vXYq8K-~#5;Fz?bN}DE(ZBXCt zo#Z=zr0I=swfnob@4fxKw;y*l+5Pq_wv%{G&9`fD-OG4qOY_!ReBZ;kv0*zx=npR~ zsl;1DgHD9Y#yYamq zrRM}n4wDVERPtz9VM@Z^5SOgIX-ZC>FeS0Oa&ibIQ)bcY0DV0QFK_fH8F_<;V0pa< zpDqDpmtV;+O(t4GZ|?!MH|;7v=*NHb(OSA}BBSdcRr`xY4gg0$g`D)`hx|;^0iKGj zc6f&W6u<>8Th&XOV@K8fciSbb=Qze?z6;m|*Kf zM!ZLu?(zh#aDT6-==xkH&AZzBv^dCYbmhS=$i4*BN606eHi9mW)Vs&~&q7dqLq?ad- zLLH}TC@r!jcM0{?y34J$1G65lrIed&d-0j0Z%sTwNQtI%LysvY3PABT{ zBHauQ&+P^d&vskL;e6mMy&F3#6dJl=VxuMgL`{=#LDm&65CjaUOJ3>5oLecBTp*P% zT3ia27Kj+kdwg4oD7b*02m;Yksf;AR3IWq2!=!{(Ve&&&T>_dai5Wyn$T$cs{EQ6EoGGO?@7>R*3Jq@ahV%+@r0u)ZH9EW-&nr z-$N47eEC1F&M#e2)LETBn90BZkW`|1tBnG`pt9-&58n!4Pe2Uj|E4-WezqiS5kCiS zETCJlQYtie&SrrbdLeQBZphzPh z|2{;rs`MEp<OEDeXp!E<6n`_@yJVr>vwO)fkzho_cwA-LEbcCdoL%HXa0L1ZPlnPKQYr*ZMG%Q z*1g$QK5d0ri{w#NKEh%qs*saHe!{}FE8B;K>$_?zKs;2#KDFf|%<_-3&&uetpR*Qm z!7PTk3$r*wXE9P|u?nMkuyS5>1NUl{^>V>nG&|lJU>sG!9UZ( zWl}k;PW44fIrVg&ODfE|g=sgZwrJHCrTKH^qO%B*QqWK$OGS(VkO%J{)`=48y$ZMK z;H0E#XaWru&|sB4#gL3%VuhQRg<{1^vy8B9Qxt4r}6BV^UaX4HO=bY?hM=o&c z2Vh+(?;m`j7zDIo2*ofAuXwx&B|WrSF1}oZ#LnWzmZtEI+geduc-xh>mc~cWwq~)R z4z=zKha2iJ+7WJVt3zVrj&Li0_028eI#l1hqphV`1Yp%_jGLNwh0!DJ7`HUHZEg#r zJ1}ktx7LSuG=P$NXtXr%MDR=XBHnJZS|Fz&M=OXEa!s-HTCoy@Rsn4}dIj2Yu&h+_ z#6v+~YKi0{7;cMY}e*m^%Py$D9 z?GU9bfhQuY3rGqO0d9-DzeEX8TTJODy)6dYs4YF5+)r%<#I>-5EV76D!3jU?*s2pY z>IAQM!mmCN-zcH0Rge_G?UvVhpi!X&`vFiXco|XDNv8amC zoj!*hS20eHv52ct&dDjN96hDvu-8-!4lT3T2^FKuN>1*WiqX?$4(n4fyB_ONF?!0$ z$(>X&dREC{uc#PZh;rELDn{RebJ(v`jLwT3c1p$Q0V#*Qs$%q2G>egbXlP{5+G)qXoeb7>#g45H!LKLC^>{1VJO$ zK)6P(fpCpnJ>mKxElfsa;XK^EB&Km|7_Jrr!*I1&8HTIHlv13dN^{RZfi?^S1=?^8 z6lghT$U}`P11%b*23j=g^|ZvaIbp~{Eo_E7)WU1XLv1b^@=%+z|4$x1>svSvpY`d3 zwoo2wL>dC45orjFMx-Gy8fk_gER=^DX@($Z1Q`g|2r>|^5u_(vKct27@L3<-!9wuT z8$0HMk1nxp-|S}~z(4gWA;_iS2%?)qCA4GjFuAjOxk~7-RL;s(!H!r3J7SYxsnT}C z;n*%e6;P^ZncEI^$EeA-Q8Mrv?=o|-fABHr`l2LE=oU)WER1GhK z_w8kHqRk8RE{nnYxnTs_2fUp7Tp*bjfcNcX;SV5j+AiP}vt$X8z38SknCCtFM(wGs^Tew9-6~;Hn)p{mRUNwZYSt zM7+xqk6()?c6XWM*LLgmJf-RB+#i&m4F2}1V5DP4{8t64&1*m=&TO$e1ZSSRu&B7i zTfW5S$Dzuqr7Koe-@dBm&NX+ftzB2Qe#55C_tiISYutXnsGg%FuEQKfzvI$8d{&63 zzKp=@@v9Zv&eo)z-GJ~MIqQQN^bYY?a*%X5~fC2mPuyw*+D zz1A-48SBSZJ72@M^9T8UKE>bQv2B~}8C$pQtgVAn_1%S;K2BbPLEl|C2HKddHY`7Y z2U{_T&ba%V(C~Tz*TrS^L@AP``5Pv%5oGymYJM=EU@H>asH3I|IECifsv{twP$; z#We=xEul!=b7N$+gvf1@33p`hkqkbRfmaxuVqZNVu|uhWe(#y~$Pj$Z=7_1$1poMm zz*@0U{VxWsQe5IRfn^;1*GOd2JA{%4Oi8H2x3L4J5%}O1nFJYWddM^)&A`*Q(FneU zL7MZ$(MY|-M9;(s-t{=Y*`1ai81)}bO!~`Z zcIKP!`J36DR(+vDe3_Od_;fWvg{~63%RklbrZ&O)|Y~HT2#j?3lWlLmpmCBaN z=4zF-%H|y^TPB-#s%*Jz-leiO*}Pk2?Qn#$4wbOyMg1rdH_FdHW0AFoD@T#db*z*Z z{3^CqRspdU+i0EeXw;u;D}i9bHVoS9G24LI{g^#~*@GAa8!>wbvxhNz1hYrEU=wDK zVfHv?Phj>WHX|53nCqZT#L01NY>Hu0r+9Mwh`ma z-Ba%kq+tcNL$UEN&2*2)(Ayap4D&V-cOLlzp;pM<^<}ofBLR=|2VtO2ffeNsZP)ui z_{4|{VFbdnH0sLS?I?Lj6EJ4QSs~8aY~==OoXTf&pw1$TZYByIwxC&t}%>F`O=QlguDeXeZy57CiQHA@e)NA-$kaI9)uAI+t z=2Th>RZ*YW6rg2O{7f+;IVXR+Ks!~f7xTiL)rk{hLLRAxRLO#X?&Gn_c&vPOUUL~J z3~S?6y3h6;DLdlRRW(vhRlPPM(^_5SmbKh+N)qHp*RDY@p;z$eQ*N-%ZV3f+wfUsN zU7f6?wc5Sa+80&Yum3!!-s&;PX{_vD%jlPCEmEyr5peTAm%W(ZWiNlZ$-YU>LVkxsb=X@RNre$JEES0My)k(piO*unO7^zlQyg z=-(uC$p6!Sl+c`j7W0dfd{0kWFQaEx(5&ujpIx$de`Adr$T7l~YkmM;SEGjN(S-fOv>$2r-U0b$3-%Wd7`0&t2hd=)0$fy68 zc{p->v@G1doy-VsAZ5XD3`J346ct5LaWq*xZ2#g&Mxy9=6rG4BPjJc8BSr&7#w;q4 z?i_hBN4DgQVn%GEg!RCtW;5-*d(?fa!f-NN=bos%J41An>JYLvOIE*R!Is}FCE#Cg zIN3ZTSy|)=r9>7vLJ*C5EW3V4N{o6EHc17+4L_tiJsn*kpMqgHDp@w%4Eg_OxRRw# zxuVpsZ~fSta_xG*wZ~jfy~p1A+U>zi){}7D99D*1n;}mkD>*Xd&Ct6j*^>r2&48GW zgBA50loF8nfQMYE4y2RGaF3_EAch7CQog>-u$>tjkK4cP_N0oo^=0f#cpHH){R{2T F`~e0XxETNd literal 4440 zcmeHLdu$X%7@xgf+p}T2TiPCXiRgfVUTKj^Kq@K}XlaWJR8%6MauHA>-~%6^1qAID zVi;|c)^IU3N8`2K#!*Ok6}UtNk=!4<`-h2$Jff235+gaIvE|B9zuBE$dqpe%m|)T` zm)V(bzUS|oS59!<>AI5nF`iyBs}#@v0M{&AT3L$cufWyiix5J`-yh?}K2K{uZk6z_ zGX8y>N15T$keY@2WxPaWJ+jh8$C@ojkEJOUE`6mdmeHLBJ;Wxpb)?-D%7WR5mdDz# zL-%YK^k|EqYp6vqqG6BmNx4WL^O6dY zKJFz8Mf!x7REl)DmsG)7N~%S&NFsuRvpH9h16rBHecG9ua-=ngw{k>0_C1IT1DddvlOWmCxk zXYkd^2P|s7;kp7a26X)(y-6Z3O5`PpyeyGdBw%co$g2{0O(L&LLd!)kLn}nEL>G!+ zj8=+Zk5-9bk^^8_5@fB~4!%pqoig4lTeCiy=QK>{v?cVBJ?oQkml(=scr4d8Ls&^r z$rLxcor>JrmK1h@I~9E5v*Zfhg9uue+hjL>Do1%i^53+Cc(gQVp|XDf6>M0cLn?|- zMsSV7l7jUFiwRZ|EF)k5B!CBi0Z9Da%0X(j?T$ro5*hVz{IjfVlkrj+x;;nR;!uHo zkZi=S_SIbvqJw=fILlfiVtrBvT+GSLHTLa+j{%>X2Y!G~hKjO}(s}|A8yGPrjDR@^ zLn{;h_5>4diz@*5(-56y;rU}M*yOM#b?7^uOl8AQ$?n=@SG&aAGNIb+_{_0&&#G%$ z8%mYxlYrcLiTogu3lg~~kxP=F=CGGbM8mAbt2``0l4DYj&5l{@8jt20I`1*9ZON2i zhn2yUcDL1Kn>B((uOL7!tk{?vA6t0UCI=6Z+CX>6_& z^7*vLtv1y)53w*r0ry&wn`z39yif*9$*NBTw+`?RW(68x7$cIIEb%@djER#xXHuda^zc&J&uu}DpXnyLyjJG+X;dDbP=MAsVkx*O_^ z^@Y712NUC0xf>I0asSRTEW4Zz0dtzbX(Fe4I8EX-nNtBLAEzmtiZ~T>n#yS!rxH&0 zahlF)2B(>v?&ma%(*vAlb9#`|L!9PtLV_dBnVykZHgEod@`{C(J9oYFZk<}c`-?BX zI(7Q%GvEAQ=HU`*Qk(r%`>@-y9y>k$APOL70Hp^|Mj)DT*8I)loC~1u1L%ApdY*B% zp3|nONGnhUT-T4^>&LtLwG4tyEtAy4P9YP_&JNG9C;f1|J#60=tUI1}qn`Y9FxG>!77NP6`G@-sZs5ylwGl)L-wYOADg5v{+VS-&wP-`+CIu^AkrbeNSVb P+2`Mb;c>IO3YxzFq#;D- diff --git a/examples/compiled/wizzine.prg b/examples/compiled/wizzine.prg index 6dcfa696f41588760625e6b183f3c136ba2a20d4..23eea7f55bb02c1a07efcd03ddc55cd803fa36c1 100644 GIT binary patch delta 389 zcmZWiJxc>Y6x_Q@F6X`Dh+srSVN)3k18Si*TBwB~2!e%;aQ*{JyMVCe2IbOR5m0fH zY?6(Lb^HM-?zXhhHmH@QW7ol^b2rB8Fqh9-91)w?+@d+_ z-sYL$I}zrrFSBdsw=BfRG$r}#4a&FR@$6Q+KA-Y+eS0y)vg>k0laiEpLXAZ;pps%F z&XIqrFD>sm9F?_*ua!}#7>YVL>%6y7NMdaikvMbJp@Vzi3w=Q=`W=0K#bhxhviRhi znTo0aR#MxpO`HLe${J|WO-dH`r;XXdv5f?ln;!{^rKkE`?}G2s8G{2&87Ce-0=#46 z0_0aeixprxtpYP>4OowIV0~H#HlPh)L)rv3q5?X)+9G=L05 m6Ua~qAfr|V(jNN51&)9}|8Mr+j7#nC$%`FmX3;5Yq4xvAlbDYH delta 414 zcmZWjJ4*vW5Z-&_a@-stf)SAjYh^4Hv{4HY!6uR-mH0q7LGUl66ND{Sgo{OrfJzqJ zVimE?q}BnI)4WViAj* zG;1=eh=MW-c&hLn4YKB!(Y7+{CgLNS2>JUp$~?p4@r~k+l&x8*%Lh1Y$2g+#kVi>g zdZa*(brNxp)cJ)2o1>!A;w#csBGmHnw%zeiKq4M$5rf6#!pCvj6>3r`xxPBHsI!P1 zGGokUx`fhzxT;rL>@gv3SS~cS4&w+qICup=9_xI