From 25f25a8767ebc9369b14df810827275089e6efdd Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sat, 6 Jul 2024 17:07:58 +0200 Subject: [PATCH] Get rid of sort() and reverse() builtin functions. Sort() had too many gotchas and reverse() is kinda redundant you can loop in decreasing order through an array too. --- .../src/prog8/code/core/BuiltinFunctions.kt | 3 - .../codegen/cpu6502/BuiltinFunctionsAsmGen.kt | 111 - .../codegen/intermediate/BuiltinFuncGen.kt | 61 - compiler/res/prog8lib/c64/floats_funcs.asm | 102 - compiler/test/TestCompilerOnExamples.kt | 1 - compiler/test/TestOptimization.kt | 12 - compiler/test/arithmetic/builtins.p8 | 10 - compiler/test/comparisons/ifelse.asm | 12134 ---------------- compiler/test/vm/TestCompilerVirtual.kt | 5 +- docs/source/index.rst | 2 +- docs/source/libraries.rst | 204 +- docs/source/programming.rst | 222 +- docs/source/todo.rst | 3 +- examples/sorting.p8 | 69 - examples/test.p8 | 50 +- syntax-files/IDEA/Prog8.xml | 2 +- syntax-files/NotepadPlusPlus/Prog8.xml | 2 +- 17 files changed, 217 insertions(+), 12776 deletions(-) delete mode 100644 compiler/test/comparisons/ifelse.asm delete mode 100644 examples/sorting.p8 diff --git a/codeCore/src/prog8/code/core/BuiltinFunctions.kt b/codeCore/src/prog8/code/core/BuiltinFunctions.kt index 7d128ab04..0ffec21ea 100644 --- a/codeCore/src/prog8/code/core/BuiltinFunctions.kt +++ b/codeCore/src/prog8/code/core/BuiltinFunctions.kt @@ -76,8 +76,6 @@ val BuiltinFunctions: Map = mapOf( "ror" to FSignature(false, listOf(FParam("item", arrayOf(DataType.UBYTE, DataType.UWORD))), null), "rol2" to FSignature(false, listOf(FParam("item", arrayOf(DataType.UBYTE, DataType.UWORD))), null), "ror2" to FSignature(false, listOf(FParam("item", arrayOf(DataType.UBYTE, DataType.UWORD))), null), - "sort" to FSignature(false, listOf(FParam("array", ArrayDatatypes)), null), - "reverse" to FSignature(false, listOf(FParam("array", ArrayDatatypes)), null), // cmp returns a status in the carry flag, but not a proper return value "cmp" to FSignature(false, listOf(FParam("value1", IntegerDatatypes), FParam("value2", NumericDatatypes)), null), "prog8_lib_stringcompare" to FSignature(true, listOf(FParam("str1", arrayOf(DataType.STR)), FParam("str2", arrayOf(DataType.STR))), DataType.BYTE), @@ -136,6 +134,5 @@ val BuiltinFunctions: Map = mapOf( val InplaceModifyingBuiltinFunctions = setOf( "setlsb", "setmsb", "rol", "ror", "rol2", "ror2", - "sort", "reverse", "divmod", "divmod__ubyte", "divmod__uword" ) diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt index f83c49e11..a89c226dc 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/BuiltinFunctionsAsmGen.kt @@ -44,8 +44,6 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram, "ror2" -> funcRor2(fcall) "setlsb" -> funcSetLsbMsb(fcall, false) "setmsb" -> funcSetLsbMsb(fcall, true) - "sort" -> funcSort(fcall) - "reverse" -> funcReverse(fcall) "memory" -> funcMemory(fcall, discardResult, resultRegister) "peekw" -> funcPeekW(fcall, resultRegister) "peekf" -> funcPeekF(fcall, resultRegister) @@ -403,115 +401,6 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram, } } - private fun funcReverse(fcall: PtBuiltinFunctionCall) { - val variable = fcall.args.single() as PtIdentifier - val symbol = asmgen.symbolTable.lookup(variable.name) - val (dt, numElements) = when(symbol) { - is StStaticVariable -> symbol.dt to symbol.length!! - is StMemVar -> symbol.dt to symbol.length!! - else -> DataType.UNDEFINED to 0 - } - val varName = asmgen.asmVariableName(variable) - when (dt) { - DataType.ARRAY_UB, DataType.ARRAY_B -> { - asmgen.out(""" - lda #<$varName - ldy #>$varName - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #$numElements - jsr prog8_lib.func_reverse_b""") - } - DataType.ARRAY_UW, DataType.ARRAY_W -> { - asmgen.out(""" - lda #<$varName - ldy #>$varName - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #$numElements - jsr prog8_lib.func_reverse_w""") - } - DataType.STR -> { - asmgen.out(""" - lda #<$varName - ldy #>$varName - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #${numElements-1} - jsr prog8_lib.func_reverse_b""") - } - DataType.ARRAY_F -> { - asmgen.out(""" - lda #<$varName - ldy #>$varName - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #$numElements - jsr floats.func_reverse_f""") - } - in SplitWordArrayTypes -> { - // reverse the lsb and msb arrays both, independently - asmgen.out(""" - lda #<${varName}_lsb - ldy #>${varName}_lsb - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #$numElements - jsr prog8_lib.func_reverse_b - lda #<${varName}_msb - ldy #>${varName}_msb - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #$numElements - jsr prog8_lib.func_reverse_b""") - } - else -> throw AssemblyError("weird type") - } - } - - private fun funcSort(fcall: PtBuiltinFunctionCall) { - val variable = fcall.args.single() as PtIdentifier - val symbol = asmgen.symbolTable.lookup(variable.name) - val varName = asmgen.asmVariableName(variable) - val (dt, numElements) = when(symbol) { - is StStaticVariable -> symbol.dt to symbol.length!! - is StMemVar -> symbol.dt to symbol.length!! - else -> DataType.UNDEFINED to 0 - } - when (dt) { - DataType.ARRAY_UB, DataType.ARRAY_B -> { - asmgen.out(""" - lda #<$varName - ldy #>$varName - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #$numElements""") - asmgen.out(if (dt == DataType.ARRAY_UB) " jsr prog8_lib.func_sort_ub" else " jsr prog8_lib.func_sort_b") - } - DataType.ARRAY_UW, DataType.ARRAY_W -> { - asmgen.out(""" - lda #<$varName - ldy #>$varName - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #$numElements""") - asmgen.out(if (dt == DataType.ARRAY_UW) " jsr prog8_lib.func_sort_uw" else " jsr prog8_lib.func_sort_w") - } - DataType.STR -> { - asmgen.out(""" - lda #<$varName - ldy #>$varName - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #${numElements-1} - jsr prog8_lib.func_sort_ub""") - } - DataType.ARRAY_F -> throw AssemblyError("sorting of floating point array is not supported") - in SplitWordArrayTypes -> TODO("split words sort") - else -> throw AssemblyError("weird type") - } - } - private fun funcRor2(fcall: PtBuiltinFunctionCall) { val what = fcall.args.single() when (what.type) { diff --git a/codeGenIntermediate/src/prog8/codegen/intermediate/BuiltinFuncGen.kt b/codeGenIntermediate/src/prog8/codegen/intermediate/BuiltinFuncGen.kt index abc35f2a8..6f27c7f8f 100644 --- a/codeGenIntermediate/src/prog8/codegen/intermediate/BuiltinFuncGen.kt +++ b/codeGenIntermediate/src/prog8/codegen/intermediate/BuiltinFuncGen.kt @@ -34,8 +34,6 @@ internal class BuiltinFuncGen(private val codeGen: IRCodeGen, private val exprGe "clamp__byte", "clamp__ubyte", "clamp__word", "clamp__uword" -> funcClamp(call) "min__byte", "min__ubyte", "min__word", "min__uword" -> funcMin(call) "max__byte", "max__ubyte", "max__word", "max__uword" -> funcMax(call) - "sort" -> funcSort(call) - "reverse" -> funcReverse(call) "setlsb" -> funcSetLsbMsb(call, false) "setmsb" -> funcSetLsbMsb(call, true) "rol" -> funcRolRor(call) @@ -369,65 +367,6 @@ internal class BuiltinFuncGen(private val codeGen: IRCodeGen, private val exprGe } } - private fun funcReverse(call: PtBuiltinFunctionCall): ExpressionCodeResult { - val arrayName = call.args[0] as PtIdentifier - val arrayLength = codeGen.symbolTable.getLength(arrayName.name) - val lengthReg = codeGen.registers.nextFree() - val result = mutableListOf() - - if(arrayName.type in SplitWordArrayTypes) { - // reverse the lsb and msb arrays both, independently - addInstr(result, IRInstruction(Opcode.PREPARECALL, immediate = 2), null) - val trLsb = exprGen.translateExpression(PtIdentifier(arrayName.name+"_lsb", DataType.ARRAY_UB, call.position)) - addToResult(result, trLsb, trLsb.resultReg, -1) - addInstr(result, IRInstruction(Opcode.LOAD, IRDataType.BYTE, reg1 = lengthReg, immediate = if(arrayName.type==DataType.STR) arrayLength!!-1 else arrayLength), null) - result += codeGen.makeSyscall(IMSyscall.REVERSE_BYTES, listOf(IRDataType.WORD to trLsb.resultReg, IRDataType.BYTE to lengthReg), null) - val trMsb = exprGen.translateExpression(PtIdentifier(arrayName.name+"_msb", DataType.ARRAY_UB, call.position)) - addToResult(result, trMsb, trMsb.resultReg, -1) - addInstr(result, IRInstruction(Opcode.LOAD, IRDataType.BYTE, reg1 = lengthReg, immediate = if(arrayName.type==DataType.STR) arrayLength!!-1 else arrayLength), null) - result += codeGen.makeSyscall(IMSyscall.REVERSE_BYTES, listOf(IRDataType.WORD to trMsb.resultReg, IRDataType.BYTE to lengthReg), null) - return ExpressionCodeResult(result, IRDataType.BYTE, -1, -1) - } - - val syscall = - when(arrayName.type) { - DataType.ARRAY_UB, DataType.ARRAY_B, DataType.STR -> IMSyscall.REVERSE_BYTES - DataType.ARRAY_UW, DataType.ARRAY_W -> IMSyscall.REVERSE_WORDS - DataType.ARRAY_F -> IMSyscall.REVERSE_FLOATS - else -> throw IllegalArgumentException("weird type to reverse") - } - addInstr(result, IRInstruction(Opcode.PREPARECALL, immediate = 2), null) - val tr = exprGen.translateExpression(arrayName) - addToResult(result, tr, tr.resultReg, -1) - addInstr(result, IRInstruction(Opcode.LOAD, IRDataType.BYTE, reg1 = lengthReg, immediate = if(arrayName.type==DataType.STR) arrayLength!!-1 else arrayLength), null) - result += codeGen.makeSyscall(syscall, listOf(IRDataType.WORD to tr.resultReg, IRDataType.BYTE to lengthReg), null) - return ExpressionCodeResult(result, IRDataType.BYTE, -1, -1) - } - - private fun funcSort(call: PtBuiltinFunctionCall): ExpressionCodeResult { - val arrayName = call.args[0] as PtIdentifier - val arrayLength = codeGen.symbolTable.getLength(arrayName.name) - val syscall = - when(arrayName.type) { - DataType.ARRAY_UB -> IMSyscall.SORT_UBYTE - DataType.ARRAY_B -> IMSyscall.SORT_BYTE - DataType.ARRAY_UW -> IMSyscall.SORT_UWORD - DataType.ARRAY_W -> IMSyscall.SORT_WORD - DataType.STR -> IMSyscall.SORT_UBYTE - DataType.ARRAY_F -> throw IllegalArgumentException("sorting a floating point array is not supported") - in SplitWordArrayTypes -> TODO("split word sort") - else -> throw IllegalArgumentException("weird type to sort") - } - val result = mutableListOf() - addInstr(result, IRInstruction(Opcode.PREPARECALL, immediate = 2), null) - val tr = exprGen.translateExpression(arrayName) - addToResult(result, tr, tr.resultReg, -1) - val lengthReg = codeGen.registers.nextFree() - addInstr(result, IRInstruction(Opcode.LOAD, IRDataType.BYTE, reg1 = lengthReg, immediate = if(arrayName.type==DataType.STR) arrayLength!!-1 else arrayLength), null) - result += codeGen.makeSyscall(syscall, listOf(IRDataType.WORD to tr.resultReg, IRDataType.BYTE to lengthReg), null) - return ExpressionCodeResult(result, IRDataType.BYTE, -1, -1) - } - private fun funcMkword(call: PtBuiltinFunctionCall): ExpressionCodeResult { val result = mutableListOf() val resultReg = codeGen.registers.nextFree() diff --git a/compiler/res/prog8lib/c64/floats_funcs.asm b/compiler/res/prog8lib/c64/floats_funcs.asm index 00ca7bcf3..aed00d25a 100644 --- a/compiler/res/prog8lib/c64/floats_funcs.asm +++ b/compiler/res/prog8lib/c64/floats_funcs.asm @@ -6,108 +6,6 @@ func_sign_f_into_A .proc jmp SIGN .pend -func_swap_f .proc - ; -- swap floats pointed to by SCRATCH_ZPWORD1, SCRATCH_ZPWORD2 - ldy #4 -- lda (P8ZP_SCRATCH_W1),y - pha - lda (P8ZP_SCRATCH_W2),y - sta (P8ZP_SCRATCH_W1),y - pla - sta (P8ZP_SCRATCH_W2),y - dey - bpl - - rts - .pend - -func_reverse_f .proc - ; --- reverse an array of floats (array in P8ZP_SCRATCH_W1, num elements in A) -_left_index = P8ZP_SCRATCH_W2 -_right_index = P8ZP_SCRATCH_W2+1 -_loop_count = P8ZP_SCRATCH_REG - pha - jsr a_times_5 - sec - sbc #5 - sta _right_index - lda #0 - sta _left_index - pla - lsr a - sta _loop_count -_loop ; push the left indexed float on the stack - ldy _left_index - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - pha - ; copy right index float to left index float - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - inc _left_index - inc _right_index - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - inc _left_index - inc _right_index - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - inc _left_index - inc _right_index - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - inc _left_index - inc _right_index - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - ; pop the float off the stack into the right index float - ldy _right_index - pla - sta (P8ZP_SCRATCH_W1),y - dey - pla - sta (P8ZP_SCRATCH_W1),y - dey - pla - sta (P8ZP_SCRATCH_W1),y - dey - pla - sta (P8ZP_SCRATCH_W1),y - dey - pla - sta (P8ZP_SCRATCH_W1),y - inc _left_index - lda _right_index - sec - sbc #9 - sta _right_index - dec _loop_count - bne _loop - rts - - .pend - - a_times_5 .proc sta P8ZP_SCRATCH_B1 diff --git a/compiler/test/TestCompilerOnExamples.kt b/compiler/test/TestCompilerOnExamples.kt index 6b549285f..7cc6d3d38 100644 --- a/compiler/test/TestCompilerOnExamples.kt +++ b/compiler/test/TestCompilerOnExamples.kt @@ -174,7 +174,6 @@ class TestCompilerOnExamplesBothC64andCx16: FunSpec({ "queens", "screencodes", "sincos", - "sorting", "swirl", "swirl-float", "tehtriz", diff --git a/compiler/test/TestOptimization.kt b/compiler/test/TestOptimization.kt index 0c047e8a1..7f760f0fb 100644 --- a/compiler/test/TestOptimization.kt +++ b/compiler/test/TestOptimization.kt @@ -688,18 +688,6 @@ main { (statements[7] as Assignment).target.memoryAddress!!.addressExpression.constValue(result.compilerAst)!!.number shouldBe 53281.0 } - test("no crash on sorting unused array") { - val text=""" -main { - ubyte[5] cards = [ 14, 6, 29, 16, 3 ] - - sub start() { - sort(cards) - } -}""" - compileText(C64Target(), true, text, writeAssembly = false) shouldNotBe null - } - test("no string error when inlining") { val text=""" main { diff --git a/compiler/test/arithmetic/builtins.p8 b/compiler/test/arithmetic/builtins.p8 index 11483f6bf..f02c13dcb 100644 --- a/compiler/test/arithmetic/builtins.p8 +++ b/compiler/test/arithmetic/builtins.p8 @@ -406,15 +406,6 @@ main { ub = zero+(all(warr) as ubyte)*1+zero txt.print_ub(ub) txt.nl() - - sort(ubarr) - sort(barr) - sort(uwarr) - sort(warr) - reverse(ubarr) - reverse(barr) - reverse(uwarr) - reverse(warr) } sub floatingpoint() { @@ -449,7 +440,6 @@ main { txt.print_ub(ub) txt.nl() - reverse(flarr) for ub in 0 to len(flarr)-1 { floats.print(flarr[ub]) txt.chrout(',') diff --git a/compiler/test/comparisons/ifelse.asm b/compiler/test/comparisons/ifelse.asm deleted file mode 100644 index 154ed9a7f..000000000 --- a/compiler/test/comparisons/ifelse.asm +++ /dev/null @@ -1,12134 +0,0 @@ -; w65c02 assembly code for 'ifelse' -; generated by prog8.codegen.cpu6502.ProgramAndVarsGen on 2024-03-13T21:14:40 -; assembler syntax is for the 64tasm cross-assembler -; output options: output=PRG launcher=BASIC zp=DONTUSE - -.cpu 'w65c02' -.enc 'none' -P8ZP_SCRATCH_B1 = 122 -P8ZP_SCRATCH_REG = 123 -P8ZP_SCRATCH_W1 = 124 ; word -P8ZP_SCRATCH_W2 = 126 ; word -.weak -.endweak -; ---- basic program with sys call ---- -* = $0801 - .word (+), 2024 - .null $9e, format(' %d ', prog8_entrypoint), $3a, $8f, ' prog8' -+ .word 0 -prog8_entrypoint ; assembly code starts here - jsr sys.init_system_phase2 - lda #4 - sta $01 - jsr p8b_main.p8s_start - jmp sys.cleanup_at_exit - -; ---- block: 'p8b_main' ---- -p8b_main .proc - ; source: ifelse.p8:7 main { - - - ; source: ifelse.p8:8 sub start() { - -p8s_start .proc -; program startup initialization - cld - tsx - stx prog8_lib.orig_stackpointer ; required for sys.exit() - .if prog8_bss_section_size>0 - ; reset all variables in BSS section to zero - lda #prog8_bss_section_start - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldx #prog8_bss_section_size - lda #0 - jsr prog8_lib.memset - .endif -+ - clv - clc -; statements - ; source: ifelse.p8:10 repeat 25 { txt.nl() } - lda #25 - sta label_asm_3_counter -label_asm_2_repeat - ; source: library:/prog8lib/cx16/textio.p8:29 chrout('\n') - lda #13 - jsr txt.chrout - dec label_asm_3_counter - bne label_asm_2_repeat - ; source: ifelse.p8:12 test_stack.test() - jsr test_stack.test - ; source: ifelse.p8:13 broken_word_gt() - jsr p8b_main.p8s_broken_word_gt - ; source: ifelse.p8:14 broken_word_lt() - jsr p8b_main.p8s_broken_word_lt - ; source: ifelse.p8:15 broken_uword_gt() - jsr p8b_main.p8s_broken_uword_gt - ; source: ifelse.p8:16 broken_uword_lt() - jsr p8b_main.p8s_broken_uword_lt - ; source: ifelse.p8:18 test_bool() - jsr p8b_main.p8s_test_bool - ; source: ifelse.p8:19 test_float() - jsr p8b_main.p8s_test_float - ; source: ifelse.p8:20 test_byte() - jsr p8b_main.p8s_test_byte - ; source: ifelse.p8:21 test_ubyte() - jsr p8b_main.p8s_test_ubyte - ; source: ifelse.p8:22 test_word() - jsr p8b_main.p8s_test_word - ; source: ifelse.p8:23 test_uword() - jsr p8b_main.p8s_test_uword - ; source: ifelse.p8:25 test_stack.test() - jsr test_stack.test - ; source: ifelse.p8:28 repeat { } -p8l_label_1_repeat - bra p8l_label_1_repeat - ; source: ifelse.p8:8 sub start() { - rts -; variables - .section BSS -label_asm_3_counter .byte ? - .send BSS - - .pend - ; source: ifelse.p8:31 sub broken_word_gt() { - -p8s_broken_word_gt .proc -; statements - ; source: ifelse.p8:32 txt.print("word >: ") - ldy #>prog8_interned_strings.string_1 - lda #$0457 - sta cx16.r0s - sty cx16.r0s+1 - - ; source: ifelse.p8:34 cx16.r1s = 2222 - lda #<$08ae - ldy #>$08ae - sta cx16.r1s - sty cx16.r1s+1 - - ; source: ifelse.p8:36 if cx16.r0s > 1000 - ldy #>$03e8 - lda #<$03e8 - cmp cx16.r0s - tya - sbc cx16.r0s+1 - bvc + - eor #128 -+ bmi p8l_oklbl - ; source: ifelse.p8:38 txt.print("fail1 ") - ldy #>prog8_interned_strings.string_2 - lda #prog8_interned_strings.string_3 - lda #p8l_ok2lbl - sta cx16.r3 - sty cx16.r3+1 - ; source: ifelse.p8:45 if cx16.r0s > 1000 - ldy #>$03e8 - lda #<$03e8 - cmp cx16.r0s - tya - sbc cx16.r0s+1 - bvc + - eor #128 -+ bpl + - jmp (cx16.r3) -+ - ; source: ifelse.p8:47 txt.print("fail2 ") - ldy #>prog8_interned_strings.string_4 - lda #prog8_interned_strings.string_5 - lda # 1000 - ldy #>$03e8 - lda #<$03e8 - cmp cx16.r0s - tya - sbc cx16.r0s+1 - bvs + - eor #128 -+ bmi label_asm_4_afterif - ; source: ifelse.p8:54 txt.print("ok3 ") - ldy #>prog8_interned_strings.string_6 - lda # 1000 - ldy #>$03e8 - lda #<$03e8 - cmp cx16.r0s - tya - sbc cx16.r0s+1 - bvs + - eor #128 -+ bmi label_asm_6_else - ; source: ifelse.p8:57 txt.print("ok4 ") - ldy #>prog8_interned_strings.string_7 - lda #prog8_interned_strings.string_8 - lda #: ") - ldy #>prog8_interned_strings.string_9 - lda #$0457 - sta cx16.r0 - sty cx16.r0+1 - - ; source: ifelse.p8:67 cx16.r1 = 2222 - lda #<$08ae - ldy #>$08ae - sta cx16.r1 - sty cx16.r1+1 - - ; source: ifelse.p8:69 if cx16.r0 > 1000 - ldy #>$03e8 - lda #<$03e8 - cpy cx16.r0+1 - bcc p8l_oklbl - bne + - cmp cx16.r0 - bcc p8l_oklbl -+ - ; source: ifelse.p8:71 txt.print("fail1 ") - ldy #>prog8_interned_strings.string_2 - lda #prog8_interned_strings.string_3 - lda #p8l_ok2lbl - sta cx16.r3 - sty cx16.r3+1 - ; source: ifelse.p8:78 if cx16.r0 > 1000 - ldy #>$03e8 - lda #<$03e8 - cpy cx16.r0+1 - bcc _jump -+ bne + - cmp cx16.r0 - bcs + -_jump jmp (cx16.r3) -+ - ; source: ifelse.p8:80 txt.print("fail2 ") - ldy #>prog8_interned_strings.string_4 - lda #prog8_interned_strings.string_5 - lda # 1000 - ldy #>$03e8 - lda #<$03e8 - cmp cx16.r0 - tya - sbc cx16.r0+1 - bcs label_asm_7_afterif - ; source: ifelse.p8:87 txt.print("ok3 ") - ldy #>prog8_interned_strings.string_6 - lda # 1000 - ldy #>$03e8 - lda #<$03e8 - cmp cx16.r0 - tya - sbc cx16.r0+1 - bcs label_asm_9_else - ; source: ifelse.p8:90 txt.print("ok4 ") - ldy #>prog8_interned_strings.string_7 - lda #prog8_interned_strings.string_8 - lda #prog8_interned_strings.string_10 - lda #-$07cf - sta cx16.r0s - sty cx16.r0s+1 - - ; source: ifelse.p8:100 cx16.r1s = -1999 - sta cx16.r1s - sty cx16.r1s+1 - - ; source: ifelse.p8:102 if cx16.r0s < 1000 - ldy cx16.r0s+1 - lda cx16.r0s - cmp #<$03e8 - tya - sbc #>$03e8 - bvc + - eor #128 -+ bmi p8l_oklbl - ; source: ifelse.p8:104 txt.print("fail1 ") - ldy #>prog8_interned_strings.string_2 - lda #prog8_interned_strings.string_3 - lda #p8l_ok2lbl - sta cx16.r3 - sty cx16.r3+1 - ; source: ifelse.p8:111 if cx16.r0s < 1000 - ldy cx16.r0s+1 - lda cx16.r0s - cmp #<$03e8 - tya - sbc #>$03e8 - bvc + - eor #128 -+ bpl + - jmp (cx16.r3) -+ - ; source: ifelse.p8:113 txt.print("fail2 ") - ldy #>prog8_interned_strings.string_4 - lda #prog8_interned_strings.string_5 - lda #$03e8 - bvs + - eor #128 -+ bmi label_asm_10_afterif - ; source: ifelse.p8:120 txt.print("ok3 ") - ldy #>prog8_interned_strings.string_6 - lda #$03e8 - bvs + - eor #128 -+ bmi label_asm_12_else - ; source: ifelse.p8:123 txt.print("ok4 ") - ldy #>prog8_interned_strings.string_7 - lda #prog8_interned_strings.string_8 - lda #prog8_interned_strings.string_11 - lda #$03e7 - sta cx16.r0 - sty cx16.r0+1 - - ; source: ifelse.p8:133 cx16.r1 = 999 - sta cx16.r1 - sty cx16.r1+1 - - ; source: ifelse.p8:135 if cx16.r0 < 1000 - lda cx16.r0 - ldy cx16.r0+1 - cpy #>$03e8 - bcc p8l_oklbl - bne + - cmp #<$03e8 - bcc p8l_oklbl -+ - ; source: ifelse.p8:137 txt.print("fail1 ") - ldy #>prog8_interned_strings.string_2 - lda #prog8_interned_strings.string_3 - lda #p8l_ok2lbl - sta cx16.r3 - sty cx16.r3+1 - ; source: ifelse.p8:144 if cx16.r0 < 1000 - lda cx16.r0 - ldy cx16.r0+1 - cpy #>$03e8 - bcc _jump -+ bne + - cmp #<$03e8 - bcs + -_jump jmp (cx16.r3) -+ - ; source: ifelse.p8:146 txt.print("fail2 ") - ldy #>prog8_interned_strings.string_4 - lda #prog8_interned_strings.string_5 - lda #$03e8 - bcs label_asm_13_afterif - ; source: ifelse.p8:153 txt.print("ok3 ") - ldy #>prog8_interned_strings.string_6 - lda #$03e8 - bcs label_asm_15_else - ; source: ifelse.p8:156 txt.print("ok4 ") - ldy #>prog8_interned_strings.string_7 - lda #prog8_interned_strings.string_8 - lda #prog8_interned_strings.string_12 - lda #prog8_interned_strings.string_13 - lda #1 - lda #<1 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:205 test2: -p8l_test2 - ; source: ifelse.p8:206 if var1 - lda p8b_main.p8s_test_bool.p8v_var1 - bne p8l_lbl2 - ; source: ifelse.p8:208 fail(2) - ldy #>2 - lda #<2 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:209 goto test3 - bra p8l_test3 - ; source: ifelse.p8:210 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:212 test3: -p8l_test3 - ; source: ifelse.p8:213 if var1 xor var2 - lda p8b_main.p8s_test_bool.p8v_var1 - eor p8b_main.p8s_test_bool.p8v_var2 - bne p8l_lbl3 - ; source: ifelse.p8:215 fail(3) - ldy #>3 - lda #<3 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:216 goto test4 - bra p8l_test4 - ; source: ifelse.p8:217 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:219 test4: -p8l_test4 - ; source: ifelse.p8:220 if barray[1] - lda p8b_main.p8s_test_bool.p8v_barray+1 - bne p8l_lbl4 - ; source: ifelse.p8:222 fail(4) - ldy #>4 - lda #<4 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:223 goto test5 - bra p8l_test5 - ; source: ifelse.p8:224 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:226 test5: -p8l_test5 - ; source: ifelse.p8:227 if barray[0] and var1 - lda p8b_main.p8s_test_bool.p8v_barray+0 - and p8b_main.p8s_test_bool.p8v_var1 - bne p8l_test6 - ; source: ifelse.p8:229 success++ - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:230 goto test6 - bra p8l_test6 - ; source: ifelse.p8:232 test6: -p8l_test6 - ; source: ifelse.p8:233 if barray[1] and var1 - lda p8b_main.p8s_test_bool.p8v_barray+1 - and p8b_main.p8s_test_bool.p8v_var1 - bne p8l_lbl6 - ; source: ifelse.p8:235 fail(5) - ldy #>5 - lda #<5 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:236 goto test7 - bra p8l_test7 - ; source: ifelse.p8:237 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:239 test7: -p8l_test7 - ; source: ifelse.p8:240 if success==6 - lda p8b_main.p8s_test_bool.p8v_success - cmp #6 - bne label_asm_17_else - ; source: ifelse.p8:241 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_16 - lda #p8l_lbl1 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:255 if var1 - lda p8b_main.p8s_test_bool.p8v_var1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:257 success++ - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:258 goto test2 - bra p8l_test2 - ; source: ifelse.p8:259 lbl1: -p8l_lbl1 - ; source: ifelse.p8:260 fail(10) - ldy #>10 - lda #<10 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:262 test2: -p8l_test2 - ; source: ifelse.p8:263 pointer = &lbl2 - lda #p8l_lbl2 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:264 if var2 - lda p8b_main.p8s_test_bool.p8v_var2 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:266 fail(11) - ldy #>11 - lda #<11 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:267 goto test3 - bra p8l_test3 - ; source: ifelse.p8:268 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:270 test3: -p8l_test3 - ; source: ifelse.p8:271 pointer = &lbl3 - lda #p8l_lbl3 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:272 if var1 xor var2 - lda p8b_main.p8s_test_bool.p8v_var1 - eor p8b_main.p8s_test_bool.p8v_var2 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:274 fail(12) - ldy #>12 - lda #<12 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:275 goto test4 - bra p8l_test4 - ; source: ifelse.p8:276 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:278 test4: -p8l_test4 - ; source: ifelse.p8:279 pointer = &lbl4 - lda #p8l_lbl4 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:280 if barray[1] - lda p8b_main.p8s_test_bool.p8v_barray+1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:282 fail(13) - ldy #>13 - lda #<13 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:283 goto test5 - bra p8l_test5 - ; source: ifelse.p8:284 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:286 test5: -p8l_test5 - ; source: ifelse.p8:287 pointer = &test6 - lda #p8l_test6 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:288 if barray[0] and var1 - lda p8b_main.p8s_test_bool.p8v_barray+0 - and p8b_main.p8s_test_bool.p8v_var1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:290 success++ - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:292 test6: -p8l_test6 - ; source: ifelse.p8:293 pointer = &lbl6 - lda #p8l_lbl6 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:294 if barray[1] and var2 - lda p8b_main.p8s_test_bool.p8v_barray+1 - and p8b_main.p8s_test_bool.p8v_var2 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:296 fail(14) - ldy #>14 - lda #<14 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:297 goto test7 - bra p8l_test7 - ; source: ifelse.p8:298 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_bool.p8v_success - ; source: ifelse.p8:300 test7: -p8l_test7 - ; source: ifelse.p8:301 if success==6 - lda p8b_main.p8s_test_bool.p8v_success - cmp #6 - bne label_asm_19_else - ; source: ifelse.p8:302 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_17 - lda #$14 - lda #<$14 - jsr p8b_main.p8s_fail -label_asm_21_afterif - ; source: ifelse.p8:318 if var1==var2 - lda p8b_main.p8s_test_bool.p8v_var1 - bne label_asm_22_afterif - ; source: ifelse.p8:319 fail(21) - ldy #>$15 - lda #<$15 - jsr p8b_main.p8s_fail -label_asm_22_afterif - ; source: ifelse.p8:320 if var1!=var2 - lda p8b_main.p8s_test_bool.p8v_var1 - cmp p8b_main.p8s_test_bool.p8v_var2 - beq label_asm_23_afterif - ; source: ifelse.p8:321 success++ - inc p8b_main.p8s_test_bool.p8v_success -label_asm_23_afterif - ; source: ifelse.p8:322 if var2 or var1 - lda p8b_main.p8s_test_bool.p8v_var2 - ora p8b_main.p8s_test_bool.p8v_var1 - beq label_asm_24_afterif - ; source: ifelse.p8:323 success++ - inc p8b_main.p8s_test_bool.p8v_success -label_asm_24_afterif - ; source: ifelse.p8:324 if var1 and var2 - lda p8b_main.p8s_test_bool.p8v_var1 - and p8b_main.p8s_test_bool.p8v_var2 - beq label_asm_25_afterif - ; source: ifelse.p8:325 fail(22) - ldy #>$16 - lda #<$16 - jsr p8b_main.p8s_fail -label_asm_25_afterif - ; source: ifelse.p8:326 if barray[0] xor var1 - lda p8b_main.p8s_test_bool.p8v_barray+0 - eor p8b_main.p8s_test_bool.p8v_var1 - beq label_asm_26_afterif - ; source: ifelse.p8:327 success++ - inc p8b_main.p8s_test_bool.p8v_success -label_asm_26_afterif - ; source: ifelse.p8:328 if barray[1] and var1 - lda p8b_main.p8s_test_bool.p8v_barray+1 - and p8b_main.p8s_test_bool.p8v_var1 - beq label_asm_27_afterif - ; source: ifelse.p8:329 success++ - inc p8b_main.p8s_test_bool.p8v_success -label_asm_27_afterif - ; source: ifelse.p8:331 if success==5 - lda p8b_main.p8s_test_bool.p8v_success - cmp #5 - bne label_asm_29_else - ; source: ifelse.p8:332 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_18 - lda #$1e - lda #<$1e - jsr p8b_main.p8s_fail -label_asm_30_afterif - ; source: ifelse.p8:348 if var2 - lda p8b_main.p8s_test_bool.p8v_var2 - beq label_asm_33_else - ; source: ifelse.p8:349 fail(31) - ldy #>$1f - lda #<$1f - jsr p8b_main.p8s_fail - bra label_asm_32_afterif -label_asm_33_else - ; source: ifelse.p8:351 success++ - inc p8b_main.p8s_test_bool.p8v_success -label_asm_32_afterif - ; source: ifelse.p8:352 if var1 and var2 - lda p8b_main.p8s_test_bool.p8v_var1 - and p8b_main.p8s_test_bool.p8v_var2 - beq label_asm_35_else - ; source: ifelse.p8:353 fail(32) - ldy #>$20 - lda #<$20 - jsr p8b_main.p8s_fail - bra label_asm_34_afterif -label_asm_35_else - ; source: ifelse.p8:355 success++ - inc p8b_main.p8s_test_bool.p8v_success -label_asm_34_afterif - ; source: ifelse.p8:356 if barray[1] - lda p8b_main.p8s_test_bool.p8v_barray+1 - beq label_asm_37_else - ; source: ifelse.p8:357 success++ - inc p8b_main.p8s_test_bool.p8v_success - bra label_asm_36_afterif -label_asm_37_else - ; source: ifelse.p8:359 fail(33) - ldy #>$21 - lda #<$21 - jsr p8b_main.p8s_fail -label_asm_36_afterif - ; source: ifelse.p8:360 if var1 xor barray[1] - lda p8b_main.p8s_test_bool.p8v_barray+1 - eor p8b_main.p8s_test_bool.p8v_var1 - beq label_asm_39_else - ; source: ifelse.p8:361 fail(34) - ldy #>$22 - lda #<$22 - jsr p8b_main.p8s_fail - bra label_asm_38_afterif -label_asm_39_else - ; source: ifelse.p8:363 success++ - inc p8b_main.p8s_test_bool.p8v_success -label_asm_38_afterif - ; source: ifelse.p8:365 if var1==var2 - lda p8b_main.p8s_test_bool.p8v_var1 - beq label_asm_41_else - ; source: ifelse.p8:368 success++ - inc p8b_main.p8s_test_bool.p8v_success - bra label_asm_40_afterif -label_asm_41_else - ; source: ifelse.p8:366 fail(35) - ldy #>$23 - lda #<$23 - jsr p8b_main.p8s_fail -label_asm_40_afterif - ; source: ifelse.p8:370 if var1!=var2 - lda p8b_main.p8s_test_bool.p8v_var1 - cmp p8b_main.p8s_test_bool.p8v_var2 - beq label_asm_43_else - ; source: ifelse.p8:371 success++ - inc p8b_main.p8s_test_bool.p8v_success - bra label_asm_42_afterif -label_asm_43_else - ; source: ifelse.p8:373 fail(36) - ldy #>$24 - lda #<$24 - jsr p8b_main.p8s_fail -label_asm_42_afterif - ; source: ifelse.p8:375 if var1 and barray[1] - lda p8b_main.p8s_test_bool.p8v_barray+1 - and p8b_main.p8s_test_bool.p8v_var1 - beq label_asm_45_else - ; source: ifelse.p8:376 success++ - inc p8b_main.p8s_test_bool.p8v_success - bra label_asm_44_afterif -label_asm_45_else - ; source: ifelse.p8:378 fail(37) - ldy #>$25 - lda #<$25 - jsr p8b_main.p8s_fail -label_asm_44_afterif - ; source: ifelse.p8:380 if success==8 - lda p8b_main.p8s_test_bool.p8v_success - cmp #8 - bne label_asm_47_else - ; source: ifelse.p8:381 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8v_var2 - jsr floats.copy_float - ; source: ifelse.p8:390 ubyte success - stz p8v_success - ; source: ifelse.p8:392 single_goto() - jsr p8b_main.p8s_test_float.p8s_single_goto - ; source: ifelse.p8:393 single_goto_indirect() - jsr p8b_main.p8s_test_float.p8s_single_goto_indirect - ; source: ifelse.p8:394 no_else() - jsr p8b_main.p8s_test_float.p8s_no_else - ; source: ifelse.p8:395 if_else() - jmp p8b_main.p8s_test_float.p8s_if_else - ; source: ifelse.p8:397 sub single_goto() { - -p8s_single_goto .proc -; statements - ; source: ifelse.p8:398 success=0 - stz p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:399 txt.print("float single_goto: ") - ldy #>prog8_interned_strings.string_19 - lda #prog8_float_const_0 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.copy_float - ; source: ifelse.p8:401 var2 = 11.11 - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.copy_float - ; source: ifelse.p8:402 test1: -p8l_test1 - ; source: ifelse.p8:403 if var1==0 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - beq p8l_lbl1 - ; source: ifelse.p8:405 success++ - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:406 goto test2 - bra p8l_test2 - ; source: ifelse.p8:407 lbl1: -p8l_lbl1 - ; source: ifelse.p8:408 fail(41) - ldy #>$29 - lda #<$29 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:410 test2: -p8l_test2 - ; source: ifelse.p8:411 if var1==11.11 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #prog8_float_const_0 - jsr floats.vars_equal_f - bne p8l_lbl2 - ; source: ifelse.p8:413 fail(42) - ldy #>$2a - lda #<$2a - jsr p8b_main.p8s_fail - ; source: ifelse.p8:414 goto test3 - bra p8l_test3 - ; source: ifelse.p8:415 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:417 test3: -p8l_test3 - ; source: ifelse.p8:418 if var1!=0 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - bne p8l_lbl3 - ; source: ifelse.p8:420 fail(43) - ldy #>$2b - lda #<$2b - jsr p8b_main.p8s_fail - ; source: ifelse.p8:421 goto test4 - bra p8l_test4 - ; source: ifelse.p8:422 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:424 test4: -p8l_test4 - ; source: ifelse.p8:425 if var1!=99.99 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #prog8_float_const_1 - jsr floats.vars_equal_f - beq p8l_lbl4 - ; source: ifelse.p8:427 fail(44) - ldy #>$2c - lda #<$2c - jsr p8b_main.p8s_fail - ; source: ifelse.p8:428 goto test5 - bra p8l_test5 - ; source: ifelse.p8:429 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:431 test5: -p8l_test5 - ; source: ifelse.p8:432 if var1 + var2 > 10 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_2 - jsr floats.var_fac1_lesseq_f - beq p8l_lbl5 - ; source: ifelse.p8:434 fail(45) - ldy #>$2d - lda #<$2d - jsr p8b_main.p8s_fail - ; source: ifelse.p8:435 goto test6 - bra p8l_test6 - ; source: ifelse.p8:436 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:438 test6: -p8l_test6 - ; source: ifelse.p8:439 if array[1]!=0 - lda #<(p8b_main.p8s_test_float.p8v_array+5) - ldy #>(p8b_main.p8s_test_float.p8v_array+5) - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - bne p8l_lbl6 - ; source: ifelse.p8:441 fail(46) - ldy #>$2e - lda #<$2e - jsr p8b_main.p8s_fail - ; source: ifelse.p8:442 goto test7 - bra p8l_test7 - ; source: ifelse.p8:443 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:445 test7: -p8l_test7 - ; source: ifelse.p8:446 if array[0] + var1 < 0 - lda #<(p8b_main.p8s_test_float.p8v_array+0) - ldy #>(p8b_main.p8s_test_float.p8v_array+0) - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_3 - jsr floats.var_fac1_less_f - bne p8l_test8 - ; source: ifelse.p8:448 success++ - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:450 test8: -p8l_test8 - ; source: ifelse.p8:451 if array[2] + var2 != 44.44 - lda #<(p8b_main.p8s_test_float.p8v_array+10) - ldy #>(p8b_main.p8s_test_float.p8v_array+10) - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_4 - jsr floats.var_fac1_equal_f - beq p8l_test9 - ; source: ifelse.p8:453 success++ - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:455 test9: -p8l_test9 - ; source: ifelse.p8:456 if success==8 - lda p8b_main.p8s_test_float.p8v_success - cmp #8 - bne label_asm_49_else - ; source: ifelse.p8:457 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_20 - lda #prog8_float_const_0 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.copy_float - ; source: ifelse.p8:468 var2 = 11.11 - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.copy_float - ; source: ifelse.p8:469 test1: -p8l_test1 - ; source: ifelse.p8:470 pointer = &lbl1 - lda #p8l_lbl1 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:471 if var1==0 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:473 success++ - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:474 goto test2 - bra p8l_test2 - ; source: ifelse.p8:475 lbl1: -p8l_lbl1 - ; source: ifelse.p8:476 fail(51) - ldy #>$33 - lda #<$33 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:478 test2: -p8l_test2 - ; source: ifelse.p8:479 pointer = &lbl2 - lda #p8l_lbl2 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:480 if var1==11.11 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #prog8_float_const_0 - jsr floats.vars_equal_f - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:482 fail(52) - ldy #>$34 - lda #<$34 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:483 goto test3 - bra p8l_test3 - ; source: ifelse.p8:484 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:486 test3: -p8l_test3 - ; source: ifelse.p8:487 pointer = &lbl3 - lda #p8l_lbl3 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:488 if var1!=0 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:490 fail(53) - ldy #>$35 - lda #<$35 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:491 goto test4 - bra p8l_test4 - ; source: ifelse.p8:492 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:494 test4: -p8l_test4 - ; source: ifelse.p8:495 pointer = &lbl4 - lda #p8l_lbl4 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:496 if var1!=99.99 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #prog8_float_const_1 - jsr floats.vars_equal_f - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:498 fail(54) - ldy #>$36 - lda #<$36 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:499 goto test5 - bra p8l_test5 - ; source: ifelse.p8:500 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:502 test5: -p8l_test5 - ; source: ifelse.p8:503 pointer = &lbl5 - lda #p8l_lbl5 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:504 if var1 + var2 > 10 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_2 - jsr floats.var_fac1_lesseq_f - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:506 fail(55) - ldy #>$37 - lda #<$37 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:507 goto test6 - bra p8l_test6 - ; source: ifelse.p8:508 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:510 test6: -p8l_test6 - ; source: ifelse.p8:511 pointer = &lbl6 - lda #p8l_lbl6 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:512 if array[1]!=0 - lda #<(p8b_main.p8s_test_float.p8v_array+5) - ldy #>(p8b_main.p8s_test_float.p8v_array+5) - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:514 fail(56) - ldy #>$38 - lda #<$38 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:515 goto test7 - bra p8l_test7 - ; source: ifelse.p8:516 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:518 test7: -p8l_test7 - ; source: ifelse.p8:519 pointer = &test8 - lda #p8l_test8 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:520 if array[0] + var1 < 0 - lda #<(p8b_main.p8s_test_float.p8v_array+0) - ldy #>(p8b_main.p8s_test_float.p8v_array+0) - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_3 - jsr floats.var_fac1_less_f - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:522 success++ - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:524 test8: -p8l_test8 - ; source: ifelse.p8:525 pointer = &test9 - lda #p8l_test9 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:526 if array[2] + var2 != 44.44 - lda #<(p8b_main.p8s_test_float.p8v_array+10) - ldy #>(p8b_main.p8s_test_float.p8v_array+10) - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_4 - jsr floats.var_fac1_equal_f - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:528 success++ - inc p8b_main.p8s_test_float.p8v_success - ; source: ifelse.p8:530 test9: -p8l_test9 - ; source: ifelse.p8:531 if success==8 - lda p8b_main.p8s_test_float.p8v_success - cmp #8 - bne label_asm_51_else - ; source: ifelse.p8:532 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_21 - lda #prog8_float_const_0 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.copy_float - ; source: ifelse.p8:542 var2 = 11.11 - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.copy_float - ; source: ifelse.p8:544 if var1==0 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - bne label_asm_52_afterif - ; source: ifelse.p8:545 fail(61) - ldy #>$3d - lda #<$3d - jsr p8b_main.p8s_fail -label_asm_52_afterif - ; source: ifelse.p8:547 if var1!=0 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - beq label_asm_53_afterif - ; source: ifelse.p8:548 success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_53_afterif - ; source: ifelse.p8:550 if var1==11.11 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #prog8_float_const_0 - jsr floats.vars_equal_f - beq label_asm_54_afterif - ; source: ifelse.p8:551 success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_54_afterif - ; source: ifelse.p8:553 if var1!=11.11 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #prog8_float_const_0 - jsr floats.vars_equal_f - bne label_asm_55_afterif - ; source: ifelse.p8:554 fail(62) - ldy #>$3e - lda #<$3e - jsr p8b_main.p8s_fail -label_asm_55_afterif - ; source: ifelse.p8:556 if var1==var2 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.vars_equal_f - beq label_asm_56_afterif - ; source: ifelse.p8:557 success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_56_afterif - ; source: ifelse.p8:559 if var1!=var2 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.vars_equal_f - bne label_asm_57_afterif - ; source: ifelse.p8:560 fail(63) - ldy #>$3f - lda #<$3f - jsr p8b_main.p8s_fail -label_asm_57_afterif - ; source: ifelse.p8:562 if var1 + var2 > 10 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_2 - jsr floats.var_fac1_lesseq_f - bne label_asm_58_afterif - ; source: ifelse.p8:563 success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_58_afterif - ; source: ifelse.p8:565 if array[1]!=0 - lda #<(p8b_main.p8s_test_float.p8v_array+5) - ldy #>(p8b_main.p8s_test_float.p8v_array+5) - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - beq label_asm_59_afterif - ; source: ifelse.p8:566 success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_59_afterif - ; source: ifelse.p8:568 if array[0] + var1 < 0 - lda #<(p8b_main.p8s_test_float.p8v_array+0) - ldy #>(p8b_main.p8s_test_float.p8v_array+0) - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_3 - jsr floats.var_fac1_less_f - beq label_asm_60_afterif - ; source: ifelse.p8:569 fail(64) - ldy #>$40 - lda #<$40 - jsr p8b_main.p8s_fail -label_asm_60_afterif - ; source: ifelse.p8:571 if array[2] + var2 !=44.44 - lda #<(p8b_main.p8s_test_float.p8v_array+10) - ldy #>(p8b_main.p8s_test_float.p8v_array+10) - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_4 - jsr floats.var_fac1_equal_f - bne label_asm_61_afterif - ; source: ifelse.p8:572 fail(65) - ldy #>$41 - lda #<$41 - jsr p8b_main.p8s_fail -label_asm_61_afterif - ; source: ifelse.p8:574 if success==5 - lda p8b_main.p8s_test_float.p8v_success - cmp #5 - bne label_asm_63_else - ; source: ifelse.p8:575 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_22 - lda #prog8_float_const_0 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.copy_float - ; source: ifelse.p8:584 var2 = 11.11 - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.copy_float - ; source: ifelse.p8:586 if var1==0 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - bne label_asm_65_else - ; source: ifelse.p8:587 fail(70) - ldy #>$46 - lda #<$46 - jsr p8b_main.p8s_fail - bra label_asm_64_afterif -label_asm_65_else - ; source: ifelse.p8:588 else success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_64_afterif - ; source: ifelse.p8:590 if var1!=0 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - beq label_asm_67_else - ; source: ifelse.p8:591 success++ - inc p8b_main.p8s_test_float.p8v_success - bra label_asm_66_afterif -label_asm_67_else - ; source: ifelse.p8:593 fail(71) - ldy #>$47 - lda #<$47 - jsr p8b_main.p8s_fail -label_asm_66_afterif - ; source: ifelse.p8:595 if var1==11.11 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #prog8_float_const_0 - jsr floats.vars_equal_f - beq label_asm_69_else - ; source: ifelse.p8:596 success++ - inc p8b_main.p8s_test_float.p8v_success - bra label_asm_68_afterif -label_asm_69_else - ; source: ifelse.p8:598 fail(72) - ldy #>$48 - lda #<$48 - jsr p8b_main.p8s_fail -label_asm_68_afterif - ; source: ifelse.p8:600 if var1!=11.11 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #prog8_float_const_0 - jsr floats.vars_equal_f - bne label_asm_71_else - ; source: ifelse.p8:601 fail(73) - ldy #>$49 - lda #<$49 - jsr p8b_main.p8s_fail - bra label_asm_70_afterif -label_asm_71_else - ; source: ifelse.p8:602 else success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_70_afterif - ; source: ifelse.p8:604 if var1==var2 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.vars_equal_f - beq label_asm_73_else - ; source: ifelse.p8:605 success++ - inc p8b_main.p8s_test_float.p8v_success - bra label_asm_72_afterif -label_asm_73_else - ; source: ifelse.p8:607 fail(74) - ldy #>$4a - lda #<$4a - jsr p8b_main.p8s_fail -label_asm_72_afterif - ; source: ifelse.p8:609 if var1!=var2 - lda #p8b_main.p8s_test_float.p8v_var1 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.vars_equal_f - bne label_asm_75_else - ; source: ifelse.p8:610 fail(75) - ldy #>$4b - lda #<$4b - jsr p8b_main.p8s_fail - bra label_asm_74_afterif -label_asm_75_else - ; source: ifelse.p8:612 success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_74_afterif - ; source: ifelse.p8:614 if var1 + var2 > 10 - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_2 - jsr floats.var_fac1_lesseq_f - bne label_asm_77_else - ; source: ifelse.p8:615 success++ - inc p8b_main.p8s_test_float.p8v_success - bra label_asm_76_afterif -label_asm_77_else - ; source: ifelse.p8:616 else fail(76) - ldy #>$4c - lda #<$4c - jsr p8b_main.p8s_fail -label_asm_76_afterif - ; source: ifelse.p8:618 if array[1]!=0 - lda #<(p8b_main.p8s_test_float.p8v_array+5) - ldy #>(p8b_main.p8s_test_float.p8v_array+5) - jsr floats.MOVFM - jsr floats.SIGN - cmp #0 - beq label_asm_79_else - ; source: ifelse.p8:619 success++ - inc p8b_main.p8s_test_float.p8v_success - bra label_asm_78_afterif -label_asm_79_else - ; source: ifelse.p8:620 else fail(77) - ldy #>$4d - lda #<$4d - jsr p8b_main.p8s_fail -label_asm_78_afterif - ; source: ifelse.p8:622 if array[0] + var1 < 0 - lda #<(p8b_main.p8s_test_float.p8v_array+0) - ldy #>(p8b_main.p8s_test_float.p8v_array+0) - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var1 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_3 - jsr floats.var_fac1_less_f - beq label_asm_81_else - ; source: ifelse.p8:623 fail(78) - ldy #>$4e - lda #<$4e - jsr p8b_main.p8s_fail - bra label_asm_80_afterif -label_asm_81_else - ; source: ifelse.p8:624 else success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_80_afterif - ; source: ifelse.p8:626 if array[2] + var2 != 44.44 - lda #<(p8b_main.p8s_test_float.p8v_array+10) - ldy #>(p8b_main.p8s_test_float.p8v_array+10) - jsr floats.MOVFM - lda #p8b_main.p8s_test_float.p8v_var2 - jsr floats.CONUPK - jsr floats.FADDT - lda #prog8_float_const_4 - jsr floats.var_fac1_equal_f - bne label_asm_83_else - ; source: ifelse.p8:627 fail(79) - ldy #>$4f - lda #<$4f - jsr p8b_main.p8s_fail - bra label_asm_82_afterif -label_asm_83_else - ; source: ifelse.p8:628 else success++ - inc p8b_main.p8s_test_float.p8v_success -label_asm_82_afterif - ; source: ifelse.p8:630 if success==10 - lda p8b_main.p8s_test_float.p8v_success - cmp #10 - bne label_asm_85_else - ; source: ifelse.p8:631 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_23 - lda #$51 - lda #<$51 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:661 test2: -p8l_test2 - ; source: ifelse.p8:662 if var1==11 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp #11 - beq p8l_lbl2 - ; source: ifelse.p8:664 fail(82) - ldy #>$52 - lda #<$52 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:665 goto test3 - bra p8l_test3 - ; source: ifelse.p8:666 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:668 test3: -p8l_test3 - ; source: ifelse.p8:669 if var1!=0 - lda p8b_main.p8s_test_byte.p8v_var1 - bne p8l_lbl3 - ; source: ifelse.p8:671 fail(83) - ldy #>$53 - lda #<$53 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:672 goto test4 - bra p8l_test4 - ; source: ifelse.p8:673 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:675 test4: -p8l_test4 - ; source: ifelse.p8:676 if var1!=99 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp #99 - bne p8l_lbl4 - ; source: ifelse.p8:678 fail(84) - ldy #>$54 - lda #<$54 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:679 goto test5 - bra p8l_test5 - ; source: ifelse.p8:680 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:682 test5: -p8l_test5 - ; source: ifelse.p8:683 if var1 + var2 > 10 - lda p8b_main.p8s_test_byte.p8v_var1 - clc - adc p8b_main.p8s_test_byte.p8v_var2 - cmp #11 - bpl p8l_lbl5 - ; source: ifelse.p8:685 fail(85) - ldy #>$55 - lda #<$55 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:686 goto test6 - bra p8l_test6 - ; source: ifelse.p8:687 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:689 test6: -p8l_test6 - ; source: ifelse.p8:690 if array[1]!=0 - lda p8b_main.p8s_test_byte.p8v_array+1 - bne p8l_lbl6 - ; source: ifelse.p8:692 fail(86) - ldy #>$56 - lda #<$56 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:693 goto test7 - bra p8l_test7 - ; source: ifelse.p8:694 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:696 test7: -p8l_test7 - ; source: ifelse.p8:697 if array[0] + var1 < 0 - lda p8b_main.p8s_test_byte.p8v_array+0 - clc - adc p8b_main.p8s_test_byte.p8v_var1 - bmi p8l_test8 - ; source: ifelse.p8:699 success++ - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:701 test8: -p8l_test8 - ; source: ifelse.p8:702 if array[2] + var2 != -22 - lda p8b_main.p8s_test_byte.p8v_array+2 - clc - adc p8b_main.p8s_test_byte.p8v_var2 - cmp #-22 - bne p8l_test9 - ; source: ifelse.p8:704 success++ - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:706 test9: -p8l_test9 - ; source: ifelse.p8:707 if success==8 - lda p8b_main.p8s_test_byte.p8v_success - cmp #8 - bne label_asm_87_else - ; source: ifelse.p8:708 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_24 - lda #p8l_lbl1 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:722 if var1==0 - lda p8b_main.p8s_test_byte.p8v_var1 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:724 success++ - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:725 goto test2 - bra p8l_test2 - ; source: ifelse.p8:726 lbl1: -p8l_lbl1 - ; source: ifelse.p8:727 fail(91) - ldy #>$5b - lda #<$5b - jsr p8b_main.p8s_fail - ; source: ifelse.p8:729 test2: -p8l_test2 - ; source: ifelse.p8:730 pointer = &lbl2 - lda #p8l_lbl2 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:731 if var1==11 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp #11 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:733 fail(92) - ldy #>$5c - lda #<$5c - jsr p8b_main.p8s_fail - ; source: ifelse.p8:734 goto test3 - bra p8l_test3 - ; source: ifelse.p8:735 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:737 test3: -p8l_test3 - ; source: ifelse.p8:738 pointer = &lbl3 - lda #p8l_lbl3 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:739 if var1!=0 - lda p8b_main.p8s_test_byte.p8v_var1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:741 fail(93) - ldy #>$5d - lda #<$5d - jsr p8b_main.p8s_fail - ; source: ifelse.p8:742 goto test4 - bra p8l_test4 - ; source: ifelse.p8:743 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:745 test4: -p8l_test4 - ; source: ifelse.p8:746 pointer = &lbl4 - lda #p8l_lbl4 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:747 if var1!=99 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp #99 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:749 fail(94) - ldy #>$5e - lda #<$5e - jsr p8b_main.p8s_fail - ; source: ifelse.p8:750 goto test5 - bra p8l_test5 - ; source: ifelse.p8:751 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:753 test5: -p8l_test5 - ; source: ifelse.p8:754 pointer = &lbl5 - lda #p8l_lbl5 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:755 if var1 + var2 > 10 - lda p8b_main.p8s_test_byte.p8v_var1 - clc - adc p8b_main.p8s_test_byte.p8v_var2 - cmp #11 - bmi + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:757 fail(95) - ldy #>$5f - lda #<$5f - jsr p8b_main.p8s_fail - ; source: ifelse.p8:758 goto test6 - bra p8l_test6 - ; source: ifelse.p8:759 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:761 test6: -p8l_test6 - ; source: ifelse.p8:762 pointer = &lbl6 - lda #p8l_lbl6 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:763 if array[1]!=0 - lda p8b_main.p8s_test_byte.p8v_array+1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:765 fail(96) - ldy #>$60 - lda #<$60 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:766 goto test7 - bra p8l_test7 - ; source: ifelse.p8:767 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:769 test7: -p8l_test7 - ; source: ifelse.p8:770 pointer = &test8 - lda #p8l_test8 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:771 if array[0] + var1 < 0 - lda p8b_main.p8s_test_byte.p8v_array+0 - clc - adc p8b_main.p8s_test_byte.p8v_var1 - bpl + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:773 success++ - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:775 test8: -p8l_test8 - ; source: ifelse.p8:776 pointer = &test9 - lda #p8l_test9 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:777 if array[2] + var2 != -22 - lda p8b_main.p8s_test_byte.p8v_array+2 - clc - adc p8b_main.p8s_test_byte.p8v_var2 - cmp #-22 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:779 success++ - inc p8b_main.p8s_test_byte.p8v_success - ; source: ifelse.p8:781 test9: -p8l_test9 - ; source: ifelse.p8:782 if success==8 - lda p8b_main.p8s_test_byte.p8v_success - cmp #8 - bne label_asm_89_else - ; source: ifelse.p8:783 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_25 - lda #$65 - lda #<$65 - jsr p8b_main.p8s_fail -label_asm_90_afterif - ; source: ifelse.p8:798 if var1!=0 - lda p8b_main.p8s_test_byte.p8v_var1 - beq label_asm_91_afterif - ; source: ifelse.p8:799 success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_91_afterif - ; source: ifelse.p8:801 if var1==11 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp #11 - bne label_asm_92_afterif - ; source: ifelse.p8:802 success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_92_afterif - ; source: ifelse.p8:804 if var1!=11 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp #11 - beq label_asm_93_afterif - ; source: ifelse.p8:805 fail(102) - ldy #>$66 - lda #<$66 - jsr p8b_main.p8s_fail -label_asm_93_afterif - ; source: ifelse.p8:807 if var1==var2 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp p8b_main.p8s_test_byte.p8v_var2 - bne label_asm_94_afterif - ; source: ifelse.p8:808 success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_94_afterif - ; source: ifelse.p8:810 if var1!=var2 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp p8b_main.p8s_test_byte.p8v_var2 - beq label_asm_95_afterif - ; source: ifelse.p8:811 fail(103) - ldy #>$67 - lda #<$67 - jsr p8b_main.p8s_fail -label_asm_95_afterif - ; source: ifelse.p8:813 if var1 + var2 > 10 - lda p8b_main.p8s_test_byte.p8v_var1 - clc - adc p8b_main.p8s_test_byte.p8v_var2 - cmp #11 - bmi label_asm_96_afterif - ; source: ifelse.p8:814 success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_96_afterif - ; source: ifelse.p8:816 if array[1]!=0 - lda p8b_main.p8s_test_byte.p8v_array+1 - beq label_asm_97_afterif - ; source: ifelse.p8:817 success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_97_afterif - ; source: ifelse.p8:819 if array[0] + var1 < 0 - lda p8b_main.p8s_test_byte.p8v_array+0 - clc - adc p8b_main.p8s_test_byte.p8v_var1 - bpl label_asm_98_afterif - ; source: ifelse.p8:820 fail(104) - ldy #>$68 - lda #<$68 - jsr p8b_main.p8s_fail -label_asm_98_afterif - ; source: ifelse.p8:822 if array[2] + var2 != -22 - lda p8b_main.p8s_test_byte.p8v_array+2 - clc - adc p8b_main.p8s_test_byte.p8v_var2 - cmp #-22 - beq label_asm_99_afterif - ; source: ifelse.p8:823 fail(105) - ldy #>$69 - lda #<$69 - jsr p8b_main.p8s_fail -label_asm_99_afterif - ; source: ifelse.p8:825 if success==5 - lda p8b_main.p8s_test_byte.p8v_success - cmp #5 - bne label_asm_101_else - ; source: ifelse.p8:826 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_26 - lda #$6e - lda #<$6e - jsr p8b_main.p8s_fail - bra label_asm_102_afterif -label_asm_103_else - ; source: ifelse.p8:839 else success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_102_afterif - ; source: ifelse.p8:841 if var1!=0 - lda p8b_main.p8s_test_byte.p8v_var1 - beq label_asm_105_else - ; source: ifelse.p8:842 success++ - inc p8b_main.p8s_test_byte.p8v_success - bra label_asm_104_afterif -label_asm_105_else - ; source: ifelse.p8:844 fail(111) - ldy #>$6f - lda #<$6f - jsr p8b_main.p8s_fail -label_asm_104_afterif - ; source: ifelse.p8:846 if var1==11 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp #11 - bne label_asm_107_else - ; source: ifelse.p8:847 success++ - inc p8b_main.p8s_test_byte.p8v_success - bra label_asm_106_afterif -label_asm_107_else - ; source: ifelse.p8:849 fail(112) - ldy #>$70 - lda #<$70 - jsr p8b_main.p8s_fail -label_asm_106_afterif - ; source: ifelse.p8:851 if var1!=11 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp #11 - beq label_asm_109_else - ; source: ifelse.p8:852 fail(113) - ldy #>$71 - lda #<$71 - jsr p8b_main.p8s_fail - bra label_asm_108_afterif -label_asm_109_else - ; source: ifelse.p8:853 else success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_108_afterif - ; source: ifelse.p8:855 if var1==var2 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp p8b_main.p8s_test_byte.p8v_var2 - bne label_asm_111_else - ; source: ifelse.p8:856 success++ - inc p8b_main.p8s_test_byte.p8v_success - bra label_asm_110_afterif -label_asm_111_else - ; source: ifelse.p8:858 fail(114) - ldy #>$72 - lda #<$72 - jsr p8b_main.p8s_fail -label_asm_110_afterif - ; source: ifelse.p8:860 if var1!=var2 - lda p8b_main.p8s_test_byte.p8v_var1 - cmp p8b_main.p8s_test_byte.p8v_var2 - beq label_asm_113_else - ; source: ifelse.p8:861 fail(115) - ldy #>$73 - lda #<$73 - jsr p8b_main.p8s_fail - bra label_asm_112_afterif -label_asm_113_else - ; source: ifelse.p8:863 success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_112_afterif - ; source: ifelse.p8:865 if var1 + var2 > 10 - lda p8b_main.p8s_test_byte.p8v_var1 - clc - adc p8b_main.p8s_test_byte.p8v_var2 - cmp #11 - bmi label_asm_115_else - ; source: ifelse.p8:866 success++ - inc p8b_main.p8s_test_byte.p8v_success - bra label_asm_114_afterif -label_asm_115_else - ; source: ifelse.p8:867 else fail(116) - ldy #>$74 - lda #<$74 - jsr p8b_main.p8s_fail -label_asm_114_afterif - ; source: ifelse.p8:869 if array[1]!=0 - lda p8b_main.p8s_test_byte.p8v_array+1 - beq label_asm_117_else - ; source: ifelse.p8:870 success++ - inc p8b_main.p8s_test_byte.p8v_success - bra label_asm_116_afterif -label_asm_117_else - ; source: ifelse.p8:871 else fail(117) - ldy #>$75 - lda #<$75 - jsr p8b_main.p8s_fail -label_asm_116_afterif - ; source: ifelse.p8:873 if array[0] + var1 < 0 - lda p8b_main.p8s_test_byte.p8v_array+0 - clc - adc p8b_main.p8s_test_byte.p8v_var1 - bpl label_asm_119_else - ; source: ifelse.p8:874 fail(118) - ldy #>$76 - lda #<$76 - jsr p8b_main.p8s_fail - bra label_asm_118_afterif -label_asm_119_else - ; source: ifelse.p8:875 else success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_118_afterif - ; source: ifelse.p8:877 if array[2] + var2 != -22 - lda p8b_main.p8s_test_byte.p8v_array+2 - clc - adc p8b_main.p8s_test_byte.p8v_var2 - cmp #-22 - beq label_asm_121_else - ; source: ifelse.p8:878 fail(119) - ldy #>$77 - lda #<$77 - jsr p8b_main.p8s_fail - bra label_asm_120_afterif -label_asm_121_else - ; source: ifelse.p8:879 else success++ - inc p8b_main.p8s_test_byte.p8v_success -label_asm_120_afterif - ; source: ifelse.p8:881 if success==10 - lda p8b_main.p8s_test_byte.p8v_success - cmp #10 - bne label_asm_123_else - ; source: ifelse.p8:882 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_27 - lda #$79 - lda #<$79 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:912 test2: -p8l_test2 - ; source: ifelse.p8:913 if var1==11 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp #11 - beq p8l_lbl2 - ; source: ifelse.p8:915 fail(122) - ldy #>$7a - lda #<$7a - jsr p8b_main.p8s_fail - ; source: ifelse.p8:916 goto test3 - bra p8l_test3 - ; source: ifelse.p8:917 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:919 test3: -p8l_test3 - ; source: ifelse.p8:920 if var1!=0 - lda p8b_main.p8s_test_ubyte.p8v_var1 - bne p8l_lbl3 - ; source: ifelse.p8:922 fail(123) - ldy #>$7b - lda #<$7b - jsr p8b_main.p8s_fail - ; source: ifelse.p8:923 goto test4 - bra p8l_test4 - ; source: ifelse.p8:924 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:926 test4: -p8l_test4 - ; source: ifelse.p8:927 if var1!=99 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp #99 - bne p8l_lbl4 - ; source: ifelse.p8:929 fail(124) - ldy #>$7c - lda #<$7c - jsr p8b_main.p8s_fail - ; source: ifelse.p8:930 goto test5 - bra p8l_test5 - ; source: ifelse.p8:931 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:933 test5: -p8l_test5 - ; source: ifelse.p8:934 if var1 + var2 > 10 - lda p8b_main.p8s_test_ubyte.p8v_var1 - clc - adc p8b_main.p8s_test_ubyte.p8v_var2 - cmp #11 - bcs p8l_lbl5 - ; source: ifelse.p8:936 fail(125) - ldy #>$7d - lda #<$7d - jsr p8b_main.p8s_fail - ; source: ifelse.p8:937 goto test6 - bra p8l_test6 - ; source: ifelse.p8:938 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:940 test6: -p8l_test6 - ; source: ifelse.p8:941 if array[1]!=0 - lda p8b_main.p8s_test_ubyte.p8v_array+1 - bne p8l_lbl6 - ; source: ifelse.p8:943 fail(126) - ldy #>$7e - lda #<$7e - jsr p8b_main.p8s_fail - ; source: ifelse.p8:944 goto test7 - bra p8l_test7 - ; source: ifelse.p8:945 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:947 test7: -p8l_test7 - ; source: ifelse.p8:948 if array[0] + var1 < 10 - lda p8b_main.p8s_test_ubyte.p8v_array+0 - clc - adc p8b_main.p8s_test_ubyte.p8v_var1 - cmp #10 - bcc p8l_test8 - ; source: ifelse.p8:950 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:952 test8: -p8l_test8 - ; source: ifelse.p8:953 if array[2] + var2 != 44 - lda p8b_main.p8s_test_ubyte.p8v_array+2 - clc - adc p8b_main.p8s_test_ubyte.p8v_var2 - cmp #44 - bne p8l_test9 - ; source: ifelse.p8:955 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:957 test9: -p8l_test9 - ; source: ifelse.p8:958 if success==8 - lda p8b_main.p8s_test_ubyte.p8v_success - cmp #8 - bne label_asm_125_else - ; source: ifelse.p8:959 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_28 - lda #p8l_lbl1 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:973 if var1==0 - lda p8b_main.p8s_test_ubyte.p8v_var1 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:975 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:976 goto test2 - bra p8l_test2 - ; source: ifelse.p8:977 lbl1: -p8l_lbl1 - ; source: ifelse.p8:978 fail(131) - ldy #>$83 - lda #<$83 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:980 test2: -p8l_test2 - ; source: ifelse.p8:981 pointer = &lbl2 - lda #p8l_lbl2 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:982 if var1==11 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp #11 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:984 fail(132) - ldy #>$84 - lda #<$84 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:985 goto test3 - bra p8l_test3 - ; source: ifelse.p8:986 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:988 test3: -p8l_test3 - ; source: ifelse.p8:989 pointer = &lbl3 - lda #p8l_lbl3 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:990 if var1!=0 - lda p8b_main.p8s_test_ubyte.p8v_var1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:992 fail(133) - ldy #>$85 - lda #<$85 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:993 goto test4 - bra p8l_test4 - ; source: ifelse.p8:994 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:996 test4: -p8l_test4 - ; source: ifelse.p8:997 pointer = &lbl4 - lda #p8l_lbl4 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:998 if var1!=99 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp #99 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1000 fail(134) - ldy #>$86 - lda #<$86 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1001 goto test5 - bra p8l_test5 - ; source: ifelse.p8:1002 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:1004 test5: -p8l_test5 - ; source: ifelse.p8:1005 pointer = &lbl5 - lda #p8l_lbl5 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1006 if var1 + var2 > 10 - lda p8b_main.p8s_test_ubyte.p8v_var1 - clc - adc p8b_main.p8s_test_ubyte.p8v_var2 - cmp #11 - bcc + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1008 fail(135) - ldy #>$87 - lda #<$87 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1009 goto test6 - bra p8l_test6 - ; source: ifelse.p8:1010 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:1012 test6: -p8l_test6 - ; source: ifelse.p8:1013 pointer = &lbl6 - lda #p8l_lbl6 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1014 if array[1]!=0 - lda p8b_main.p8s_test_ubyte.p8v_array+1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1016 fail(136) - ldy #>$88 - lda #<$88 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1017 goto test7 - bra p8l_test7 - ; source: ifelse.p8:1018 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:1020 test7: -p8l_test7 - ; source: ifelse.p8:1021 pointer = &test8 - lda #p8l_test8 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1022 if array[0] + var1 < 10 - lda p8b_main.p8s_test_ubyte.p8v_array+0 - clc - adc p8b_main.p8s_test_ubyte.p8v_var1 - cmp #10 - bcs + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1024 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:1026 test8: -p8l_test8 - ; source: ifelse.p8:1027 pointer = &test9 - lda #p8l_test9 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1028 if array[2] + var2 != 44 - lda p8b_main.p8s_test_ubyte.p8v_array+2 - clc - adc p8b_main.p8s_test_ubyte.p8v_var2 - cmp #44 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1030 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - ; source: ifelse.p8:1032 test9: -p8l_test9 - ; source: ifelse.p8:1033 if success==8 - lda p8b_main.p8s_test_ubyte.p8v_success - cmp #8 - bne label_asm_127_else - ; source: ifelse.p8:1034 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_29 - lda #$8d - lda #<$8d - jsr p8b_main.p8s_fail -label_asm_128_afterif - ; source: ifelse.p8:1049 if var1!=0 - lda p8b_main.p8s_test_ubyte.p8v_var1 - beq label_asm_129_afterif - ; source: ifelse.p8:1050 success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_129_afterif - ; source: ifelse.p8:1052 if var1==11 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp #11 - bne label_asm_130_afterif - ; source: ifelse.p8:1053 success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_130_afterif - ; source: ifelse.p8:1055 if var1!=11 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp #11 - beq label_asm_131_afterif - ; source: ifelse.p8:1056 fail(142) - ldy #>$8e - lda #<$8e - jsr p8b_main.p8s_fail -label_asm_131_afterif - ; source: ifelse.p8:1058 if var1==var2 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp p8b_main.p8s_test_ubyte.p8v_var2 - bne label_asm_132_afterif - ; source: ifelse.p8:1059 success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_132_afterif - ; source: ifelse.p8:1061 if var1!=var2 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp p8b_main.p8s_test_ubyte.p8v_var2 - beq label_asm_133_afterif - ; source: ifelse.p8:1062 fail(143) - ldy #>$8f - lda #<$8f - jsr p8b_main.p8s_fail -label_asm_133_afterif - ; source: ifelse.p8:1064 if var1 + var2 > 10 - lda p8b_main.p8s_test_ubyte.p8v_var1 - clc - adc p8b_main.p8s_test_ubyte.p8v_var2 - cmp #11 - bcc label_asm_134_afterif - ; source: ifelse.p8:1065 success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_134_afterif - ; source: ifelse.p8:1067 if array[1]!=0 - lda p8b_main.p8s_test_ubyte.p8v_array+1 - beq label_asm_135_afterif - ; source: ifelse.p8:1068 success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_135_afterif - ; source: ifelse.p8:1070 if array[0] + var1 < 10 - lda p8b_main.p8s_test_ubyte.p8v_array+0 - clc - adc p8b_main.p8s_test_ubyte.p8v_var1 - cmp #10 - bcs label_asm_136_afterif - ; source: ifelse.p8:1071 fail(144) - ldy #>$90 - lda #<$90 - jsr p8b_main.p8s_fail -label_asm_136_afterif - ; source: ifelse.p8:1073 if array[2] + var2 != 44 - lda p8b_main.p8s_test_ubyte.p8v_array+2 - clc - adc p8b_main.p8s_test_ubyte.p8v_var2 - cmp #44 - beq label_asm_137_afterif - ; source: ifelse.p8:1074 fail(145) - ldy #>$91 - lda #<$91 - jsr p8b_main.p8s_fail -label_asm_137_afterif - ; source: ifelse.p8:1076 if success==5 - lda p8b_main.p8s_test_ubyte.p8v_success - cmp #5 - bne label_asm_139_else - ; source: ifelse.p8:1077 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_30 - lda #$96 - lda #<$96 - jsr p8b_main.p8s_fail - bra label_asm_140_afterif -label_asm_141_else - ; source: ifelse.p8:1090 else success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_140_afterif - ; source: ifelse.p8:1092 if var1!=0 - lda p8b_main.p8s_test_ubyte.p8v_var1 - beq label_asm_143_else - ; source: ifelse.p8:1093 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - bra label_asm_142_afterif -label_asm_143_else - ; source: ifelse.p8:1095 fail(151) - ldy #>$97 - lda #<$97 - jsr p8b_main.p8s_fail -label_asm_142_afterif - ; source: ifelse.p8:1097 if var1==11 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp #11 - bne label_asm_145_else - ; source: ifelse.p8:1098 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - bra label_asm_144_afterif -label_asm_145_else - ; source: ifelse.p8:1100 fail(152) - ldy #>$98 - lda #<$98 - jsr p8b_main.p8s_fail -label_asm_144_afterif - ; source: ifelse.p8:1102 if var1!=11 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp #11 - beq label_asm_147_else - ; source: ifelse.p8:1103 fail(153) - ldy #>$99 - lda #<$99 - jsr p8b_main.p8s_fail - bra label_asm_146_afterif -label_asm_147_else - ; source: ifelse.p8:1104 else success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_146_afterif - ; source: ifelse.p8:1106 if var1==var2 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp p8b_main.p8s_test_ubyte.p8v_var2 - bne label_asm_149_else - ; source: ifelse.p8:1107 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - bra label_asm_148_afterif -label_asm_149_else - ; source: ifelse.p8:1109 fail(154) - ldy #>$9a - lda #<$9a - jsr p8b_main.p8s_fail -label_asm_148_afterif - ; source: ifelse.p8:1111 if var1!=var2 - lda p8b_main.p8s_test_ubyte.p8v_var1 - cmp p8b_main.p8s_test_ubyte.p8v_var2 - beq label_asm_151_else - ; source: ifelse.p8:1112 fail(155) - ldy #>$9b - lda #<$9b - jsr p8b_main.p8s_fail - bra label_asm_150_afterif -label_asm_151_else - ; source: ifelse.p8:1114 success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_150_afterif - ; source: ifelse.p8:1116 if var1 + var2 > 10 - lda p8b_main.p8s_test_ubyte.p8v_var1 - clc - adc p8b_main.p8s_test_ubyte.p8v_var2 - cmp #11 - bcc label_asm_153_else - ; source: ifelse.p8:1117 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - bra label_asm_152_afterif -label_asm_153_else - ; source: ifelse.p8:1118 else fail(156) - ldy #>$9c - lda #<$9c - jsr p8b_main.p8s_fail -label_asm_152_afterif - ; source: ifelse.p8:1120 if array[1]!=0 - lda p8b_main.p8s_test_ubyte.p8v_array+1 - beq label_asm_155_else - ; source: ifelse.p8:1121 success++ - inc p8b_main.p8s_test_ubyte.p8v_success - bra label_asm_154_afterif -label_asm_155_else - ; source: ifelse.p8:1122 else fail(157) - ldy #>$9d - lda #<$9d - jsr p8b_main.p8s_fail -label_asm_154_afterif - ; source: ifelse.p8:1124 if array[0] + var1 < 10 - lda p8b_main.p8s_test_ubyte.p8v_array+0 - clc - adc p8b_main.p8s_test_ubyte.p8v_var1 - cmp #10 - bcs label_asm_157_else - ; source: ifelse.p8:1125 fail(158) - ldy #>$9e - lda #<$9e - jsr p8b_main.p8s_fail - bra label_asm_156_afterif -label_asm_157_else - ; source: ifelse.p8:1126 else success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_156_afterif - ; source: ifelse.p8:1128 if array[2] + var2 != 44 - lda p8b_main.p8s_test_ubyte.p8v_array+2 - clc - adc p8b_main.p8s_test_ubyte.p8v_var2 - cmp #44 - beq label_asm_159_else - ; source: ifelse.p8:1129 fail(159) - ldy #>$9f - lda #<$9f - jsr p8b_main.p8s_fail - bra label_asm_158_afterif -label_asm_159_else - ; source: ifelse.p8:1130 else success++ - inc p8b_main.p8s_test_ubyte.p8v_success -label_asm_158_afterif - ; source: ifelse.p8:1132 if success==10 - lda p8b_main.p8s_test_ubyte.p8v_success - cmp #10 - bne label_asm_161_else - ; source: ifelse.p8:1133 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_31 - lda #$0457 - sta p8b_main.p8s_test_word.p8v_var1 - sty p8b_main.p8s_test_word.p8v_var1+1 - - ; source: ifelse.p8:1154 var2 = 1111 - sta p8b_main.p8s_test_word.p8v_var2 - sty p8b_main.p8s_test_word.p8v_var2+1 - - ; source: ifelse.p8:1155 test1: -p8l_test1 - ; source: ifelse.p8:1156 if var1==0 - lda p8b_main.p8s_test_word.p8v_var1 - ora p8b_main.p8s_test_word.p8v_var1+1 - beq p8l_lbl1 - ; source: ifelse.p8:1158 success++ - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1159 goto test2 - bra p8l_test2 - ; source: ifelse.p8:1160 lbl1: -p8l_lbl1 - ; source: ifelse.p8:1161 fail(161) - ldy #>$a1 - lda #<$a1 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1163 test2: -p8l_test2 - ; source: ifelse.p8:1164 if var1==1111 - lda p8b_main.p8s_test_word.p8v_var1 - cmp #<1111 - bne + - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp #>1111 - beq p8l_lbl2 -+ - ; source: ifelse.p8:1166 fail(162) - ldy #>$a2 - lda #<$a2 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1167 goto test3 - bra p8l_test3 - ; source: ifelse.p8:1168 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1170 test3: -p8l_test3 - ; source: ifelse.p8:1171 if var1!=0 - lda p8b_main.p8s_test_word.p8v_var1 - ora p8b_main.p8s_test_word.p8v_var1+1 - bne p8l_lbl3 - ; source: ifelse.p8:1173 fail(163) - ldy #>$a3 - lda #<$a3 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1174 goto test4 - bra p8l_test4 - ; source: ifelse.p8:1175 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1177 test4: -p8l_test4 - ; source: ifelse.p8:1178 if var1!=9999 - lda p8b_main.p8s_test_word.p8v_var1 - cmp #<9999 - bne p8l_lbl4 - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp #>9999 - bne p8l_lbl4 - ; source: ifelse.p8:1180 fail(164) - ldy #>$a4 - lda #<$a4 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1181 goto test5 - bra p8l_test5 - ; source: ifelse.p8:1182 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1184 test5: -p8l_test5 - ; source: ifelse.p8:1185 if var1 + var2 > 1000 - ldy p8b_main.p8s_test_word.p8v_var1+1 - lda p8b_main.p8s_test_word.p8v_var1 - clc - adc p8b_main.p8s_test_word.p8v_var2 - tax - tya - adc p8b_main.p8s_test_word.p8v_var2+1 - tay - txa - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #>$03e8 - lda #<$03e8 - cmp P8ZP_SCRATCH_W2 - tya - sbc P8ZP_SCRATCH_W2+1 - bvc + - eor #128 -+ bmi p8l_lbl5 - ; source: ifelse.p8:1187 fail(165) - ldy #>$a5 - lda #<$a5 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1188 goto test6 - bra p8l_test6 - ; source: ifelse.p8:1189 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1191 test6: -p8l_test6 - ; source: ifelse.p8:1192 if array[1]!=0 - lda p8b_main.p8s_test_word.p8v_array+2 - ora p8b_main.p8s_test_word.p8v_array+2+1 - bne p8l_lbl6 - ; source: ifelse.p8:1194 fail(166) - ldy #>$a6 - lda #<$a6 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1195 goto test7 - bra p8l_test7 - ; source: ifelse.p8:1196 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1198 test7: -p8l_test7 - ; source: ifelse.p8:1199 if array[0] + var1 < 0 - lda p8b_main.p8s_test_word.p8v_array+0 - ldy p8b_main.p8s_test_word.p8v_array+0+1 - clc - adc p8b_main.p8s_test_word.p8v_var1 - tax - tya - adc p8b_main.p8s_test_word.p8v_var1+1 - tay - txa - cpy #0 - bmi p8l_test8 - ; source: ifelse.p8:1201 success++ - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1203 test8: -p8l_test8 - ; source: ifelse.p8:1204 if array[2] + var2 != -2222 - lda p8b_main.p8s_test_word.p8v_array+4 - ldy p8b_main.p8s_test_word.p8v_array+4+1 - clc - adc p8b_main.p8s_test_word.p8v_var2 - tax - tya - adc p8b_main.p8s_test_word.p8v_var2+1 - tay - txa - cmp #<-2222 - bne p8l_test9 - cpy #>-2222 - bne p8l_test9 - ; source: ifelse.p8:1206 success++ - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1208 test9: -p8l_test9 - ; source: ifelse.p8:1209 if success==8 - lda p8b_main.p8s_test_word.p8v_success - cmp #8 - bne label_asm_163_else - ; source: ifelse.p8:1210 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_32 - lda #$0457 - sta p8b_main.p8s_test_word.p8v_var1 - sty p8b_main.p8s_test_word.p8v_var1+1 - - ; source: ifelse.p8:1221 var2 = 1111 - sta p8b_main.p8s_test_word.p8v_var2 - sty p8b_main.p8s_test_word.p8v_var2+1 - - ; source: ifelse.p8:1222 test1: -p8l_test1 - ; source: ifelse.p8:1223 pointer = &lbl1 - lda #p8l_lbl1 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1224 if var1==0 - lda p8b_main.p8s_test_word.p8v_var1 - ora p8b_main.p8s_test_word.p8v_var1+1 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1226 success++ - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1227 goto test2 - bra p8l_test2 - ; source: ifelse.p8:1228 lbl1: -p8l_lbl1 - ; source: ifelse.p8:1229 fail(171) - ldy #>$ab - lda #<$ab - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1231 test2: -p8l_test2 - ; source: ifelse.p8:1232 pointer = &lbl2 - lda #p8l_lbl2 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1233 if var1==1111 - lda p8b_main.p8s_test_word.p8v_var1 - cmp #<1111 - bne + - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp #>1111 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1235 fail(172) - ldy #>$ac - lda #<$ac - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1236 goto test3 - bra p8l_test3 - ; source: ifelse.p8:1237 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1239 test3: -p8l_test3 - ; source: ifelse.p8:1240 pointer = &lbl3 - lda #p8l_lbl3 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1241 if var1!=0 - lda p8b_main.p8s_test_word.p8v_var1 - ora p8b_main.p8s_test_word.p8v_var1+1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1243 fail(173) - ldy #>$ad - lda #<$ad - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1244 goto test4 - bra p8l_test4 - ; source: ifelse.p8:1245 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1247 test4: -p8l_test4 - ; source: ifelse.p8:1248 pointer = &lbl4 - lda #p8l_lbl4 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1249 if var1!=9999 - lda p8b_main.p8s_test_word.p8v_var1 - cmp #<9999 - bne + - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp #>9999 - beq ++ -+ jmp (p8v_pointer) -+ - ; source: ifelse.p8:1251 fail(174) - ldy #>$ae - lda #<$ae - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1252 goto test5 - bra p8l_test5 - ; source: ifelse.p8:1253 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1255 test5: -p8l_test5 - ; source: ifelse.p8:1256 pointer = &lbl5 - lda #p8l_lbl5 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1257 if var1 + var2 > 1000 - ldy p8b_main.p8s_test_word.p8v_var1+1 - lda p8b_main.p8s_test_word.p8v_var1 - clc - adc p8b_main.p8s_test_word.p8v_var2 - tax - tya - adc p8b_main.p8s_test_word.p8v_var2+1 - tay - txa - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #>$03e8 - lda #<$03e8 - cmp P8ZP_SCRATCH_W2 - tya - sbc P8ZP_SCRATCH_W2+1 - bvc + - eor #128 -+ bpl + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1259 fail(175) - ldy #>$af - lda #<$af - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1260 goto test6 - bra p8l_test6 - ; source: ifelse.p8:1261 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1263 test6: -p8l_test6 - ; source: ifelse.p8:1264 pointer = &lbl6 - lda #p8l_lbl6 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1265 if array[1]!=0 - lda p8b_main.p8s_test_word.p8v_array+2 - ora p8b_main.p8s_test_word.p8v_array+2+1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1267 fail(176) - ldy #>$b0 - lda #<$b0 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1268 goto test7 - bra p8l_test7 - ; source: ifelse.p8:1269 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1271 test7: -p8l_test7 - ; source: ifelse.p8:1272 pointer = &test8 - lda #p8l_test8 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1273 if array[0] + var1 < 0 - lda p8b_main.p8s_test_word.p8v_array+0 - ldy p8b_main.p8s_test_word.p8v_array+0+1 - clc - adc p8b_main.p8s_test_word.p8v_var1 - tax - tya - adc p8b_main.p8s_test_word.p8v_var1+1 - tay - txa - cpy #0 - bpl + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1275 success++ - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1277 test8: -p8l_test8 - ; source: ifelse.p8:1278 pointer = &test9 - lda #p8l_test9 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1279 if array[2] + var2 != -2222 - lda p8b_main.p8s_test_word.p8v_array+4 - ldy p8b_main.p8s_test_word.p8v_array+4+1 - clc - adc p8b_main.p8s_test_word.p8v_var2 - tax - tya - adc p8b_main.p8s_test_word.p8v_var2+1 - tay - txa - cmp #<-2222 - bne + - cpy #>-2222 - beq ++ -+ jmp (p8v_pointer) -+ - ; source: ifelse.p8:1281 success++ - inc p8b_main.p8s_test_word.p8v_success - ; source: ifelse.p8:1283 test9: -p8l_test9 - ; source: ifelse.p8:1284 if success==8 - lda p8b_main.p8s_test_word.p8v_success - cmp #8 - bne label_asm_165_else - ; source: ifelse.p8:1285 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_33 - lda #$0457 - sta p8b_main.p8s_test_word.p8v_var1 - sty p8b_main.p8s_test_word.p8v_var1+1 - - ; source: ifelse.p8:1295 var2 = 1111 - sta p8b_main.p8s_test_word.p8v_var2 - sty p8b_main.p8s_test_word.p8v_var2+1 - - ; source: ifelse.p8:1297 if var1==0 - lda p8b_main.p8s_test_word.p8v_var1 - ora p8b_main.p8s_test_word.p8v_var1+1 - bne label_asm_166_afterif - ; source: ifelse.p8:1298 fail(181) - ldy #>$b5 - lda #<$b5 - jsr p8b_main.p8s_fail -label_asm_166_afterif - ; source: ifelse.p8:1300 if var1!=0 - lda p8b_main.p8s_test_word.p8v_var1 - ora p8b_main.p8s_test_word.p8v_var1+1 - beq label_asm_167_afterif - ; source: ifelse.p8:1301 success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_167_afterif - ; source: ifelse.p8:1303 if var1==1111 - lda p8b_main.p8s_test_word.p8v_var1 - cmp #<1111 - bne label_asm_168_afterif - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp #>1111 - bne label_asm_168_afterif - ; source: ifelse.p8:1304 success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_168_afterif - ; source: ifelse.p8:1306 if var1!=1111 - lda p8b_main.p8s_test_word.p8v_var1 - cmp #<1111 - bne + - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp #>1111 - beq label_asm_169_afterif -+ - ; source: ifelse.p8:1307 fail(182) - ldy #>$b6 - lda #<$b6 - jsr p8b_main.p8s_fail -label_asm_169_afterif - ; source: ifelse.p8:1309 if var1==var2 - lda p8b_main.p8s_test_word.p8v_var1 - cmp p8b_main.p8s_test_word.p8v_var2 - bne label_asm_170_afterif - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp p8b_main.p8s_test_word.p8v_var2+1 - bne label_asm_170_afterif - ; source: ifelse.p8:1310 success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_170_afterif - ; source: ifelse.p8:1312 if var1!=var2 - lda p8b_main.p8s_test_word.p8v_var1 - cmp p8b_main.p8s_test_word.p8v_var2 - bne + - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp p8b_main.p8s_test_word.p8v_var2+1 - beq label_asm_171_afterif -+ - ; source: ifelse.p8:1313 fail(183) - ldy #>$b7 - lda #<$b7 - jsr p8b_main.p8s_fail -label_asm_171_afterif - ; source: ifelse.p8:1315 if var1 + var2 > 1000 - ldy p8b_main.p8s_test_word.p8v_var1+1 - lda p8b_main.p8s_test_word.p8v_var1 - clc - adc p8b_main.p8s_test_word.p8v_var2 - tax - tya - adc p8b_main.p8s_test_word.p8v_var2+1 - tay - txa - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #>$03e8 - lda #<$03e8 - cmp P8ZP_SCRATCH_W2 - tya - sbc P8ZP_SCRATCH_W2+1 - bvs + - eor #128 -+ bmi label_asm_172_afterif - ; source: ifelse.p8:1316 success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_172_afterif - ; source: ifelse.p8:1318 if array[1]!=0 - lda p8b_main.p8s_test_word.p8v_array+2 - ora p8b_main.p8s_test_word.p8v_array+2+1 - beq label_asm_173_afterif - ; source: ifelse.p8:1319 success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_173_afterif - ; source: ifelse.p8:1321 if array[0] + var1 < 0 - lda p8b_main.p8s_test_word.p8v_array+0 - ldy p8b_main.p8s_test_word.p8v_array+0+1 - clc - adc p8b_main.p8s_test_word.p8v_var1 - tax - tya - adc p8b_main.p8s_test_word.p8v_var1+1 - tay - txa - cpy #0 - bpl label_asm_174_afterif - ; source: ifelse.p8:1322 fail(184) - ldy #>$b8 - lda #<$b8 - jsr p8b_main.p8s_fail -label_asm_174_afterif - ; source: ifelse.p8:1324 if array[2] + var2 != -2222 - lda p8b_main.p8s_test_word.p8v_array+4 - ldy p8b_main.p8s_test_word.p8v_array+4+1 - clc - adc p8b_main.p8s_test_word.p8v_var2 - tax - tya - adc p8b_main.p8s_test_word.p8v_var2+1 - tay - txa - cmp #<-2222 - bne + - cpy #>-2222 - beq label_asm_175_afterif -+ - ; source: ifelse.p8:1325 fail(185) - ldy #>$b9 - lda #<$b9 - jsr p8b_main.p8s_fail -label_asm_175_afterif - ; source: ifelse.p8:1327 if success==5 - lda p8b_main.p8s_test_word.p8v_success - cmp #5 - bne label_asm_177_else - ; source: ifelse.p8:1328 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_34 - lda #$0457 - sta p8b_main.p8s_test_word.p8v_var1 - sty p8b_main.p8s_test_word.p8v_var1+1 - - ; source: ifelse.p8:1337 var2 = 1111 - sta p8b_main.p8s_test_word.p8v_var2 - sty p8b_main.p8s_test_word.p8v_var2+1 - - ; source: ifelse.p8:1339 if var1==0 - lda p8b_main.p8s_test_word.p8v_var1 - ora p8b_main.p8s_test_word.p8v_var1+1 - bne label_asm_179_else - ; source: ifelse.p8:1340 fail(190) - ldy #>$be - lda #<$be - jsr p8b_main.p8s_fail - bra label_asm_178_afterif -label_asm_179_else - ; source: ifelse.p8:1341 else success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_178_afterif - ; source: ifelse.p8:1343 if var1!=0 - lda p8b_main.p8s_test_word.p8v_var1 - ora p8b_main.p8s_test_word.p8v_var1+1 - beq label_asm_181_else - ; source: ifelse.p8:1344 success++ - inc p8b_main.p8s_test_word.p8v_success - bra label_asm_180_afterif -label_asm_181_else - ; source: ifelse.p8:1346 fail(191) - ldy #>$bf - lda #<$bf - jsr p8b_main.p8s_fail -label_asm_180_afterif - ; source: ifelse.p8:1348 if var1==1111 - lda p8b_main.p8s_test_word.p8v_var1 - cmp #<1111 - bne label_asm_183_else - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp #>1111 - bne label_asm_183_else - ; source: ifelse.p8:1349 success++ - inc p8b_main.p8s_test_word.p8v_success - bra label_asm_182_afterif -label_asm_183_else - ; source: ifelse.p8:1351 fail(192) - ldy #>$c0 - lda #<$c0 - jsr p8b_main.p8s_fail -label_asm_182_afterif - ; source: ifelse.p8:1353 if var1!=1111 - lda p8b_main.p8s_test_word.p8v_var1 - cmp #<1111 - bne + - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp #>1111 - beq label_asm_185_else -+ - ; source: ifelse.p8:1354 fail(193) - ldy #>$c1 - lda #<$c1 - jsr p8b_main.p8s_fail - bra label_asm_184_afterif -label_asm_185_else - ; source: ifelse.p8:1355 else success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_184_afterif - ; source: ifelse.p8:1357 if var1==var2 - lda p8b_main.p8s_test_word.p8v_var1 - cmp p8b_main.p8s_test_word.p8v_var2 - bne label_asm_187_else - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp p8b_main.p8s_test_word.p8v_var2+1 - bne label_asm_187_else - ; source: ifelse.p8:1358 success++ - inc p8b_main.p8s_test_word.p8v_success - bra label_asm_186_afterif -label_asm_187_else - ; source: ifelse.p8:1360 fail(194) - ldy #>$c2 - lda #<$c2 - jsr p8b_main.p8s_fail -label_asm_186_afterif - ; source: ifelse.p8:1362 if var1!=var2 - lda p8b_main.p8s_test_word.p8v_var1 - cmp p8b_main.p8s_test_word.p8v_var2 - bne + - lda p8b_main.p8s_test_word.p8v_var1+1 - cmp p8b_main.p8s_test_word.p8v_var2+1 - beq label_asm_189_else -+ - ; source: ifelse.p8:1363 fail(195) - ldy #>$c3 - lda #<$c3 - jsr p8b_main.p8s_fail - bra label_asm_188_afterif -label_asm_189_else - ; source: ifelse.p8:1365 success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_188_afterif - ; source: ifelse.p8:1367 if var1 + var2 > 1000 - ldy p8b_main.p8s_test_word.p8v_var1+1 - lda p8b_main.p8s_test_word.p8v_var1 - clc - adc p8b_main.p8s_test_word.p8v_var2 - tax - tya - adc p8b_main.p8s_test_word.p8v_var2+1 - tay - txa - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #>$03e8 - lda #<$03e8 - cmp P8ZP_SCRATCH_W2 - tya - sbc P8ZP_SCRATCH_W2+1 - bvs + - eor #128 -+ bmi label_asm_191_else - ; source: ifelse.p8:1368 success++ - inc p8b_main.p8s_test_word.p8v_success - bra label_asm_190_afterif -label_asm_191_else - ; source: ifelse.p8:1369 else fail(196) - ldy #>$c4 - lda #<$c4 - jsr p8b_main.p8s_fail -label_asm_190_afterif - ; source: ifelse.p8:1371 if array[1]!=0 - lda p8b_main.p8s_test_word.p8v_array+2 - ora p8b_main.p8s_test_word.p8v_array+2+1 - beq label_asm_193_else - ; source: ifelse.p8:1372 success++ - inc p8b_main.p8s_test_word.p8v_success - bra label_asm_192_afterif -label_asm_193_else - ; source: ifelse.p8:1373 else fail(197) - ldy #>$c5 - lda #<$c5 - jsr p8b_main.p8s_fail -label_asm_192_afterif - ; source: ifelse.p8:1375 if array[0] + var1 < 0 - lda p8b_main.p8s_test_word.p8v_array+0 - ldy p8b_main.p8s_test_word.p8v_array+0+1 - clc - adc p8b_main.p8s_test_word.p8v_var1 - tax - tya - adc p8b_main.p8s_test_word.p8v_var1+1 - tay - txa - cpy #0 - bpl label_asm_195_else - ; source: ifelse.p8:1376 fail(198) - ldy #>$c6 - lda #<$c6 - jsr p8b_main.p8s_fail - bra label_asm_194_afterif -label_asm_195_else - ; source: ifelse.p8:1377 else success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_194_afterif - ; source: ifelse.p8:1379 if array[2] + var2 != -2222 - lda p8b_main.p8s_test_word.p8v_array+4 - ldy p8b_main.p8s_test_word.p8v_array+4+1 - clc - adc p8b_main.p8s_test_word.p8v_var2 - tax - tya - adc p8b_main.p8s_test_word.p8v_var2+1 - tay - txa - cmp #<-2222 - bne + - cpy #>-2222 - beq label_asm_197_else -+ - ; source: ifelse.p8:1380 fail(199) - ldy #>$c7 - lda #<$c7 - jsr p8b_main.p8s_fail - bra label_asm_196_afterif -label_asm_197_else - ; source: ifelse.p8:1381 else success++ - inc p8b_main.p8s_test_word.p8v_success -label_asm_196_afterif - ; source: ifelse.p8:1383 if success==10 - lda p8b_main.p8s_test_word.p8v_success - cmp #10 - bne label_asm_199_else - ; source: ifelse.p8:1384 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_35 - lda #$0457 - sta p8b_main.p8s_test_uword.p8v_var1 - sty p8b_main.p8s_test_uword.p8v_var1+1 - - ; source: ifelse.p8:1405 var2 = 1111 - sta p8b_main.p8s_test_uword.p8v_var2 - sty p8b_main.p8s_test_uword.p8v_var2+1 - - ; source: ifelse.p8:1406 test1: -p8l_test1 - ; source: ifelse.p8:1407 if var1==0 - lda p8b_main.p8s_test_uword.p8v_var1 - ora p8b_main.p8s_test_uword.p8v_var1+1 - beq p8l_lbl1 - ; source: ifelse.p8:1409 success++ - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1410 goto test2 - bra p8l_test2 - ; source: ifelse.p8:1411 lbl1: -p8l_lbl1 - ; source: ifelse.p8:1412 fail(201) - ldy #>$c9 - lda #<$c9 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1414 test2: -p8l_test2 - ; source: ifelse.p8:1415 if var1==1111 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp #<1111 - bne + - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp #>1111 - beq p8l_lbl2 -+ - ; source: ifelse.p8:1417 fail(202) - ldy #>$ca - lda #<$ca - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1418 goto test3 - bra p8l_test3 - ; source: ifelse.p8:1419 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1421 test3: -p8l_test3 - ; source: ifelse.p8:1422 if var1!=0 - lda p8b_main.p8s_test_uword.p8v_var1 - ora p8b_main.p8s_test_uword.p8v_var1+1 - bne p8l_lbl3 - ; source: ifelse.p8:1424 fail(203) - ldy #>$cb - lda #<$cb - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1425 goto test4 - bra p8l_test4 - ; source: ifelse.p8:1426 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1428 test4: -p8l_test4 - ; source: ifelse.p8:1429 if var1!=9999 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp #<9999 - bne p8l_lbl4 - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp #>9999 - bne p8l_lbl4 - ; source: ifelse.p8:1431 fail(204) - ldy #>$cc - lda #<$cc - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1432 goto test5 - bra p8l_test5 - ; source: ifelse.p8:1433 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1435 test5: -p8l_test5 - ; source: ifelse.p8:1436 if var1 + var2 > 1000 - ldy p8b_main.p8s_test_uword.p8v_var1+1 - lda p8b_main.p8s_test_uword.p8v_var1 - clc - adc p8b_main.p8s_test_uword.p8v_var2 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var2+1 - tay - txa - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #>$03e8 - lda #<$03e8 - cpy P8ZP_SCRATCH_W2+1 - bcc p8l_lbl5 - bne + - cmp P8ZP_SCRATCH_W2 - bcc p8l_lbl5 -+ - ; source: ifelse.p8:1438 fail(205) - ldy #>$cd - lda #<$cd - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1439 goto test6 - bra p8l_test6 - ; source: ifelse.p8:1440 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1442 test6: -p8l_test6 - ; source: ifelse.p8:1443 if array[1]!=0 - lda p8b_main.p8s_test_uword.p8v_array+2 - ora p8b_main.p8s_test_uword.p8v_array+2+1 - bne p8l_lbl6 - ; source: ifelse.p8:1445 fail(206) - ldy #>$ce - lda #<$ce - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1446 goto test7 - bra p8l_test7 - ; source: ifelse.p8:1447 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1449 test7: -p8l_test7 - ; source: ifelse.p8:1450 if array[0] + var1 < 1000 - lda p8b_main.p8s_test_uword.p8v_array+0 - ldy p8b_main.p8s_test_uword.p8v_array+0+1 - clc - adc p8b_main.p8s_test_uword.p8v_var1 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var1+1 - tay - txa - cpy #>$03e8 - bcc p8l_test8 - bne + - cmp #<$03e8 - bcc p8l_test8 -+ - ; source: ifelse.p8:1452 success++ - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1454 test8: -p8l_test8 - ; source: ifelse.p8:1455 if array[2] + var2 != 4444 - lda p8b_main.p8s_test_uword.p8v_array+4 - ldy p8b_main.p8s_test_uword.p8v_array+4+1 - clc - adc p8b_main.p8s_test_uword.p8v_var2 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var2+1 - tay - txa - cmp #<4444 - bne p8l_test9 - cpy #>4444 - bne p8l_test9 - ; source: ifelse.p8:1457 success++ - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1459 test9: -p8l_test9 - ; source: ifelse.p8:1460 if success==8 - lda p8b_main.p8s_test_uword.p8v_success - cmp #8 - bne label_asm_201_else - ; source: ifelse.p8:1461 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_36 - lda #$0457 - sta p8b_main.p8s_test_uword.p8v_var1 - sty p8b_main.p8s_test_uword.p8v_var1+1 - - ; source: ifelse.p8:1472 var2 = 1111 - sta p8b_main.p8s_test_uword.p8v_var2 - sty p8b_main.p8s_test_uword.p8v_var2+1 - - ; source: ifelse.p8:1473 test1: -p8l_test1 - ; source: ifelse.p8:1474 pointer = &lbl1 - lda #p8l_lbl1 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1475 if var1==0 - lda p8b_main.p8s_test_uword.p8v_var1 - ora p8b_main.p8s_test_uword.p8v_var1+1 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1477 success++ - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1478 goto test2 - bra p8l_test2 - ; source: ifelse.p8:1479 lbl1: -p8l_lbl1 - ; source: ifelse.p8:1480 fail(211) - ldy #>$d3 - lda #<$d3 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1482 test2: -p8l_test2 - ; source: ifelse.p8:1483 pointer = &lbl2 - lda #p8l_lbl2 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1484 if var1==1111 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp #<1111 - bne + - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp #>1111 - bne + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1486 fail(212) - ldy #>$d4 - lda #<$d4 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1487 goto test3 - bra p8l_test3 - ; source: ifelse.p8:1488 lbl2: success++ -p8l_lbl2 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1490 test3: -p8l_test3 - ; source: ifelse.p8:1491 pointer = &lbl3 - lda #p8l_lbl3 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1492 if var1!=0 - lda p8b_main.p8s_test_uword.p8v_var1 - ora p8b_main.p8s_test_uword.p8v_var1+1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1494 fail(213) - ldy #>$d5 - lda #<$d5 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1495 goto test4 - bra p8l_test4 - ; source: ifelse.p8:1496 lbl3: success++ -p8l_lbl3 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1498 test4: -p8l_test4 - ; source: ifelse.p8:1499 pointer = &lbl4 - lda #p8l_lbl4 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1500 if var1!=9999 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp #<9999 - bne + - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp #>9999 - beq ++ -+ jmp (p8v_pointer) -+ - ; source: ifelse.p8:1502 fail(214) - ldy #>$d6 - lda #<$d6 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1503 goto test5 - bra p8l_test5 - ; source: ifelse.p8:1504 lbl4: success++ -p8l_lbl4 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1506 test5: -p8l_test5 - ; source: ifelse.p8:1507 pointer = &lbl5 - lda #p8l_lbl5 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1508 if var1 + var2 > 1000 - ldy p8b_main.p8s_test_uword.p8v_var1+1 - lda p8b_main.p8s_test_uword.p8v_var1 - clc - adc p8b_main.p8s_test_uword.p8v_var2 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var2+1 - tay - txa - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #>$03e8 - lda #<$03e8 - cpy P8ZP_SCRATCH_W2+1 - bcc _jump -+ bne + - cmp P8ZP_SCRATCH_W2 - bcs + -_jump jmp (p8v_pointer) -+ - ; source: ifelse.p8:1510 fail(215) - ldy #>$d7 - lda #<$d7 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1511 goto test6 - bra p8l_test6 - ; source: ifelse.p8:1512 lbl5: success++ -p8l_lbl5 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1514 test6: -p8l_test6 - ; source: ifelse.p8:1515 pointer = &lbl6 - lda #p8l_lbl6 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1516 if array[1]!=0 - lda p8b_main.p8s_test_uword.p8v_array+2 - ora p8b_main.p8s_test_uword.p8v_array+2+1 - beq + - jmp (p8v_pointer) -+ - ; source: ifelse.p8:1518 fail(216) - ldy #>$d8 - lda #<$d8 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1519 goto test7 - bra p8l_test7 - ; source: ifelse.p8:1520 lbl6: success++ -p8l_lbl6 - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1522 test7: -p8l_test7 - ; source: ifelse.p8:1523 pointer = &lbl7 - lda #p8l_lbl7 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1524 if array[0] + var1 < 1000 - lda p8b_main.p8s_test_uword.p8v_array+0 - ldy p8b_main.p8s_test_uword.p8v_array+0+1 - clc - adc p8b_main.p8s_test_uword.p8v_var1 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var1+1 - tay - txa - cpy #>$03e8 - bcc _jump -+ bne + - cmp #<$03e8 - bcs + -_jump jmp (p8v_pointer) -+ - ; source: ifelse.p8:1526 success++ - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1527 goto test8 - bra p8l_test8 - ; source: ifelse.p8:1528 lbl7: fail(217) -p8l_lbl7 - ldy #>$d9 - lda #<$d9 - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1530 test8: -p8l_test8 - ; source: ifelse.p8:1531 pointer = &lbl8 - lda #p8l_lbl8 - sta p8v_pointer - sty p8v_pointer+1 - ; source: ifelse.p8:1532 if array[2] + var2 != 4444 - lda p8b_main.p8s_test_uword.p8v_array+4 - ldy p8b_main.p8s_test_uword.p8v_array+4+1 - clc - adc p8b_main.p8s_test_uword.p8v_var2 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var2+1 - tay - txa - cmp #<4444 - bne + - cpy #>4444 - beq ++ -+ jmp (p8v_pointer) -+ - ; source: ifelse.p8:1534 success++ - inc p8b_main.p8s_test_uword.p8v_success - ; source: ifelse.p8:1535 goto test9 - bra p8l_test9 - ; source: ifelse.p8:1536 lbl8: fail(218) -p8l_lbl8 - ldy #>$da - lda #<$da - jsr p8b_main.p8s_fail - ; source: ifelse.p8:1538 test9: -p8l_test9 - ; source: ifelse.p8:1539 if success==8 - lda p8b_main.p8s_test_uword.p8v_success - cmp #8 - bne label_asm_203_else - ; source: ifelse.p8:1540 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_37 - lda #$0457 - sta p8b_main.p8s_test_uword.p8v_var1 - sty p8b_main.p8s_test_uword.p8v_var1+1 - - ; source: ifelse.p8:1550 var2 = 1111 - sta p8b_main.p8s_test_uword.p8v_var2 - sty p8b_main.p8s_test_uword.p8v_var2+1 - - ; source: ifelse.p8:1552 if var1==0 - lda p8b_main.p8s_test_uword.p8v_var1 - ora p8b_main.p8s_test_uword.p8v_var1+1 - bne label_asm_204_afterif - ; source: ifelse.p8:1553 fail(221) - ldy #>$dd - lda #<$dd - jsr p8b_main.p8s_fail -label_asm_204_afterif - ; source: ifelse.p8:1555 if var1!=0 - lda p8b_main.p8s_test_uword.p8v_var1 - ora p8b_main.p8s_test_uword.p8v_var1+1 - beq label_asm_205_afterif - ; source: ifelse.p8:1556 success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_205_afterif - ; source: ifelse.p8:1558 if var1==1111 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp #<1111 - bne label_asm_206_afterif - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp #>1111 - bne label_asm_206_afterif - ; source: ifelse.p8:1559 success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_206_afterif - ; source: ifelse.p8:1561 if var1!=1111 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp #<1111 - bne + - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp #>1111 - beq label_asm_207_afterif -+ - ; source: ifelse.p8:1562 fail(222) - ldy #>$de - lda #<$de - jsr p8b_main.p8s_fail -label_asm_207_afterif - ; source: ifelse.p8:1564 if var1==var2 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp p8b_main.p8s_test_uword.p8v_var2 - bne label_asm_208_afterif - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp p8b_main.p8s_test_uword.p8v_var2+1 - bne label_asm_208_afterif - ; source: ifelse.p8:1565 success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_208_afterif - ; source: ifelse.p8:1567 if var1!=var2 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp p8b_main.p8s_test_uword.p8v_var2 - bne + - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp p8b_main.p8s_test_uword.p8v_var2+1 - beq label_asm_209_afterif -+ - ; source: ifelse.p8:1568 fail(223) - ldy #>$df - lda #<$df - jsr p8b_main.p8s_fail -label_asm_209_afterif - ; source: ifelse.p8:1570 if var1 + var2 > 1000 - ldy p8b_main.p8s_test_uword.p8v_var1+1 - lda p8b_main.p8s_test_uword.p8v_var1 - clc - adc p8b_main.p8s_test_uword.p8v_var2 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var2+1 - tay - txa - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #>$03e8 - lda #<$03e8 - cmp P8ZP_SCRATCH_W2 - tya - sbc P8ZP_SCRATCH_W2+1 - bcs label_asm_210_afterif - ; source: ifelse.p8:1571 success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_210_afterif - ; source: ifelse.p8:1573 if array[1]!=0 - lda p8b_main.p8s_test_uword.p8v_array+2 - ora p8b_main.p8s_test_uword.p8v_array+2+1 - beq label_asm_211_afterif - ; source: ifelse.p8:1574 success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_211_afterif - ; source: ifelse.p8:1576 if array[0] + var1 < 1000 - lda p8b_main.p8s_test_uword.p8v_array+0 - ldy p8b_main.p8s_test_uword.p8v_array+0+1 - clc - adc p8b_main.p8s_test_uword.p8v_var1 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var1+1 - tay - txa - cmp #<$03e8 - tya - sbc #>$03e8 - bcs label_asm_212_afterif - ; source: ifelse.p8:1577 fail(184) - ldy #>$b8 - lda #<$b8 - jsr p8b_main.p8s_fail -label_asm_212_afterif - ; source: ifelse.p8:1579 if array[2] + var2 != 4444 - lda p8b_main.p8s_test_uword.p8v_array+4 - ldy p8b_main.p8s_test_uword.p8v_array+4+1 - clc - adc p8b_main.p8s_test_uword.p8v_var2 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var2+1 - tay - txa - cmp #<4444 - bne + - cpy #>4444 - beq label_asm_213_afterif -+ - ; source: ifelse.p8:1580 fail(225) - ldy #>$e1 - lda #<$e1 - jsr p8b_main.p8s_fail -label_asm_213_afterif - ; source: ifelse.p8:1582 if success==5 - lda p8b_main.p8s_test_uword.p8v_success - cmp #5 - bne label_asm_215_else - ; source: ifelse.p8:1583 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #prog8_interned_strings.string_38 - lda #$0457 - sta p8b_main.p8s_test_uword.p8v_var1 - sty p8b_main.p8s_test_uword.p8v_var1+1 - - ; source: ifelse.p8:1592 var2 = 1111 - sta p8b_main.p8s_test_uword.p8v_var2 - sty p8b_main.p8s_test_uword.p8v_var2+1 - - ; source: ifelse.p8:1594 if var1==0 - lda p8b_main.p8s_test_uword.p8v_var1 - ora p8b_main.p8s_test_uword.p8v_var1+1 - bne label_asm_217_else - ; source: ifelse.p8:1595 fail(230) - ldy #>$e6 - lda #<$e6 - jsr p8b_main.p8s_fail - bra label_asm_216_afterif -label_asm_217_else - ; source: ifelse.p8:1596 else success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_216_afterif - ; source: ifelse.p8:1598 if var1!=0 - lda p8b_main.p8s_test_uword.p8v_var1 - ora p8b_main.p8s_test_uword.p8v_var1+1 - beq label_asm_219_else - ; source: ifelse.p8:1599 success++ - inc p8b_main.p8s_test_uword.p8v_success - bra label_asm_218_afterif -label_asm_219_else - ; source: ifelse.p8:1601 fail(231) - ldy #>$e7 - lda #<$e7 - jsr p8b_main.p8s_fail -label_asm_218_afterif - ; source: ifelse.p8:1603 if var1==1111 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp #<1111 - bne label_asm_221_else - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp #>1111 - bne label_asm_221_else - ; source: ifelse.p8:1604 success++ - inc p8b_main.p8s_test_uword.p8v_success - bra label_asm_220_afterif -label_asm_221_else - ; source: ifelse.p8:1606 fail(232) - ldy #>$e8 - lda #<$e8 - jsr p8b_main.p8s_fail -label_asm_220_afterif - ; source: ifelse.p8:1608 if var1!=1111 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp #<1111 - bne + - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp #>1111 - beq label_asm_223_else -+ - ; source: ifelse.p8:1609 fail(233) - ldy #>$e9 - lda #<$e9 - jsr p8b_main.p8s_fail - bra label_asm_222_afterif -label_asm_223_else - ; source: ifelse.p8:1610 else success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_222_afterif - ; source: ifelse.p8:1612 if var1==var2 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp p8b_main.p8s_test_uword.p8v_var2 - bne label_asm_225_else - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp p8b_main.p8s_test_uword.p8v_var2+1 - bne label_asm_225_else - ; source: ifelse.p8:1613 success++ - inc p8b_main.p8s_test_uword.p8v_success - bra label_asm_224_afterif -label_asm_225_else - ; source: ifelse.p8:1615 fail(234) - ldy #>$ea - lda #<$ea - jsr p8b_main.p8s_fail -label_asm_224_afterif - ; source: ifelse.p8:1617 if var1!=var2 - lda p8b_main.p8s_test_uword.p8v_var1 - cmp p8b_main.p8s_test_uword.p8v_var2 - bne + - lda p8b_main.p8s_test_uword.p8v_var1+1 - cmp p8b_main.p8s_test_uword.p8v_var2+1 - beq label_asm_227_else -+ - ; source: ifelse.p8:1618 fail(235) - ldy #>$eb - lda #<$eb - jsr p8b_main.p8s_fail - bra label_asm_226_afterif -label_asm_227_else - ; source: ifelse.p8:1620 success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_226_afterif - ; source: ifelse.p8:1622 if var1 + var2 > 1000 - ldy p8b_main.p8s_test_uword.p8v_var1+1 - lda p8b_main.p8s_test_uword.p8v_var1 - clc - adc p8b_main.p8s_test_uword.p8v_var2 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var2+1 - tay - txa - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #>$03e8 - lda #<$03e8 - cmp P8ZP_SCRATCH_W2 - tya - sbc P8ZP_SCRATCH_W2+1 - bcs label_asm_229_else - ; source: ifelse.p8:1623 success++ - inc p8b_main.p8s_test_uword.p8v_success - bra label_asm_228_afterif -label_asm_229_else - ; source: ifelse.p8:1624 else fail(236) - ldy #>$ec - lda #<$ec - jsr p8b_main.p8s_fail -label_asm_228_afterif - ; source: ifelse.p8:1626 if array[1]!=0 - lda p8b_main.p8s_test_uword.p8v_array+2 - ora p8b_main.p8s_test_uword.p8v_array+2+1 - beq label_asm_231_else - ; source: ifelse.p8:1627 success++ - inc p8b_main.p8s_test_uword.p8v_success - bra label_asm_230_afterif -label_asm_231_else - ; source: ifelse.p8:1628 else fail(237) - ldy #>$ed - lda #<$ed - jsr p8b_main.p8s_fail -label_asm_230_afterif - ; source: ifelse.p8:1630 if array[0] + var1 < 1000 - lda p8b_main.p8s_test_uword.p8v_array+0 - ldy p8b_main.p8s_test_uword.p8v_array+0+1 - clc - adc p8b_main.p8s_test_uword.p8v_var1 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var1+1 - tay - txa - cmp #<$03e8 - tya - sbc #>$03e8 - bcs label_asm_233_else - ; source: ifelse.p8:1631 fail(238) - ldy #>$ee - lda #<$ee - jsr p8b_main.p8s_fail - bra label_asm_232_afterif -label_asm_233_else - ; source: ifelse.p8:1632 else success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_232_afterif - ; source: ifelse.p8:1634 if array[2] + var2 != 4444 - lda p8b_main.p8s_test_uword.p8v_array+4 - ldy p8b_main.p8s_test_uword.p8v_array+4+1 - clc - adc p8b_main.p8s_test_uword.p8v_var2 - tax - tya - adc p8b_main.p8s_test_uword.p8v_var2+1 - tay - txa - cmp #<4444 - bne + - cpy #>4444 - beq label_asm_235_else -+ - ; source: ifelse.p8:1635 fail(239) - ldy #>$ef - lda #<$ef - jsr p8b_main.p8s_fail - bra label_asm_234_afterif -label_asm_235_else - ; source: ifelse.p8:1636 else success++ - inc p8b_main.p8s_test_uword.p8v_success -label_asm_234_afterif - ; source: ifelse.p8:1638 if success==10 - lda p8b_main.p8s_test_uword.p8v_success - cmp #10 - bne label_asm_237_else - ; source: ifelse.p8:1639 txt.print(" ok\n") - ldy #>prog8_interned_strings.string_14 - lda #prog8_interned_strings.string_15 - lda #: " - .byte $57, $4f, $52, $44, $20, $3e, $3a, $20, $00 -string_10 ; PETSCII:"word <: " - .byte $57, $4f, $52, $44, $20, $3c, $3a, $20, $00 -string_11 ; PETSCII:"uword <: " - .byte $55, $57, $4f, $52, $44, $20, $3c, $3a, $20, $00 -string_12 ; PETSCII:"failed " - .byte $46, $41, $49, $4c, $45, $44, $20, $00 -string_13 ; PETSCII:"bool single_goto: " - .byte $42, $4f, $4f, $4c, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54, $4f - .byte $3a, $20, $00 -string_14 ; PETSCII:" ok\n" - .byte $20, $20, $4f, $4b, $0d, $00 -string_15 ; PETSCII:" \x12 failed \x92\n" - .byte $20, $20, $12, $20, $46, $41, $49, $4c, $45, $44, $20, $92, $0d, $00 -string_16 ; PETSCII:"bool single_goto_indirect: " - .byte $42, $4f, $4f, $4c, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54, $4f - .byte $e4, $49, $4e, $44, $49, $52, $45, $43, $54, $3a, $20, $00 -string_17 ; PETSCII:"bool no_else: " - .byte $42, $4f, $4f, $4c, $20, $4e, $4f, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_18 ; PETSCII:"bool if_else: " - .byte $42, $4f, $4f, $4c, $20, $49, $46, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_19 ; PETSCII:"float single_goto: " - .byte $46, $4c, $4f, $41, $54, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54 - .byte $4f, $3a, $20, $00 -string_2 ; PETSCII:"fail1 " - .byte $46, $41, $49, $4c, $31, $20, $00 -string_20 ; PETSCII:"float single_goto_indirect: " - .byte $46, $4c, $4f, $41, $54, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54 - .byte $4f, $e4, $49, $4e, $44, $49, $52, $45, $43, $54, $3a, $20, $00 -string_21 ; PETSCII:"float no_else: " - .byte $46, $4c, $4f, $41, $54, $20, $4e, $4f, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_22 ; PETSCII:"float if_else: " - .byte $46, $4c, $4f, $41, $54, $20, $49, $46, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_23 ; PETSCII:"byte single_goto: " - .byte $42, $59, $54, $45, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54, $4f - .byte $3a, $20, $00 -string_24 ; PETSCII:"byte single_goto_indirect: " - .byte $42, $59, $54, $45, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54, $4f - .byte $e4, $49, $4e, $44, $49, $52, $45, $43, $54, $3a, $20, $00 -string_25 ; PETSCII:"byte no_else: " - .byte $42, $59, $54, $45, $20, $4e, $4f, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_26 ; PETSCII:"byte if_else: " - .byte $42, $59, $54, $45, $20, $49, $46, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_27 ; PETSCII:"ubyte single_goto: " - .byte $55, $42, $59, $54, $45, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54 - .byte $4f, $3a, $20, $00 -string_28 ; PETSCII:"ubyte single_goto_indirect: " - .byte $55, $42, $59, $54, $45, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54 - .byte $4f, $e4, $49, $4e, $44, $49, $52, $45, $43, $54, $3a, $20, $00 -string_29 ; PETSCII:"ubyte no_else: " - .byte $55, $42, $59, $54, $45, $20, $4e, $4f, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_3 ; PETSCII:"ok1 " - .byte $4f, $4b, $31, $20, $00 -string_30 ; PETSCII:"ubyte if_else: " - .byte $55, $42, $59, $54, $45, $20, $49, $46, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_31 ; PETSCII:"word single_goto: " - .byte $57, $4f, $52, $44, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54, $4f - .byte $3a, $20, $00 -string_32 ; PETSCII:"word single_goto_indirect: " - .byte $57, $4f, $52, $44, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54, $4f - .byte $e4, $49, $4e, $44, $49, $52, $45, $43, $54, $3a, $20, $00 -string_33 ; PETSCII:"word no_else: " - .byte $57, $4f, $52, $44, $20, $4e, $4f, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_34 ; PETSCII:"word if_else: " - .byte $57, $4f, $52, $44, $20, $49, $46, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_35 ; PETSCII:"uword single_goto: " - .byte $55, $57, $4f, $52, $44, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54 - .byte $4f, $3a, $20, $00 -string_36 ; PETSCII:"uword single_goto_indirect: " - .byte $55, $57, $4f, $52, $44, $20, $53, $49, $4e, $47, $4c, $45, $e4, $47, $4f, $54 - .byte $4f, $e4, $49, $4e, $44, $49, $52, $45, $43, $54, $3a, $20, $00 -string_37 ; PETSCII:"uword no_else: " - .byte $55, $57, $4f, $52, $44, $20, $4e, $4f, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_38 ; PETSCII:"uword if_else: " - .byte $55, $57, $4f, $52, $44, $20, $49, $46, $e4, $45, $4c, $53, $45, $3a, $20, $00 -string_4 ; PETSCII:"fail2 " - .byte $46, $41, $49, $4c, $32, $20, $00 -string_5 ; PETSCII:"ok2 " - .byte $4f, $4b, $32, $20, $00 -string_6 ; PETSCII:"ok3 " - .byte $4f, $4b, $33, $20, $00 -string_7 ; PETSCII:"ok4 " - .byte $4f, $4b, $34, $20, $00 -string_8 ; PETSCII:"fail4 " - .byte $46, $41, $49, $4c, $34, $20, $00 -string_9 ; PETSCII:"uword >: " - .byte $55, $57, $4f, $52, $44, $20, $3e, $3a, $20, $00 - - ; source: ifelse.p8:32 txt.print("word >: ") - ; source: ifelse.p8:38 txt.print("fail1 ") - ; source: ifelse.p8:41 txt.print("ok1 ") - ; source: ifelse.p8:47 txt.print("fail2 ") - ; source: ifelse.p8:50 txt.print("ok2 ") - ; source: ifelse.p8:54 txt.print("ok3 ") - ; source: ifelse.p8:57 txt.print("ok4 ") - ; source: ifelse.p8:59 txt.print("fail4 ") - ; source: ifelse.p8:65 txt.print("uword >: ") - ; source: ifelse.p8:98 txt.print("word <: ") - ; source: ifelse.p8:131 txt.print("uword <: ") - ; source: ifelse.p8:178 txt.print("failed ") - ; source: ifelse.p8:194 txt.print("bool single_goto: ") - ; source: ifelse.p8:241 txt.print(" ok\n") - ; source: ifelse.p8:243 txt.print(" \x12 failed \x92\n") - ; source: ifelse.p8:249 txt.print("bool single_goto_indirect: ") - ; source: ifelse.p8:308 txt.print("bool no_else: ") - ; source: ifelse.p8:338 txt.print("bool if_else: ") - ; source: ifelse.p8:399 txt.print("float single_goto: ") - ; source: ifelse.p8:465 txt.print("float single_goto_indirect: ") - ; source: ifelse.p8:540 txt.print("float no_else: ") - ; source: ifelse.p8:582 txt.print("float if_else: ") - ; source: ifelse.p8:650 txt.print("byte single_goto: ") - ; source: ifelse.p8:716 txt.print("byte single_goto_indirect: ") - ; source: ifelse.p8:791 txt.print("byte no_else: ") - ; source: ifelse.p8:833 txt.print("byte if_else: ") - ; source: ifelse.p8:901 txt.print("ubyte single_goto: ") - ; source: ifelse.p8:967 txt.print("ubyte single_goto_indirect: ") - ; source: ifelse.p8:1042 txt.print("ubyte no_else: ") - ; source: ifelse.p8:1084 txt.print("ubyte if_else: ") - ; source: ifelse.p8:1152 txt.print("word single_goto: ") - ; source: ifelse.p8:1218 txt.print("word single_goto_indirect: ") - ; source: ifelse.p8:1293 txt.print("word no_else: ") - ; source: ifelse.p8:1335 txt.print("word if_else: ") - ; source: ifelse.p8:1403 txt.print("uword single_goto: ") - ; source: ifelse.p8:1469 txt.print("uword single_goto_indirect: ") - ; source: ifelse.p8:1548 txt.print("uword no_else: ") - ; source: ifelse.p8:1590 txt.print("uword if_else: ") - .pend - -; ---- block: 'txt' ---- -txt .proc - ; source: library:/prog8lib/cx16/textio.p8:9 txt { - DEFAULT_HEIGHT = $3c - DEFAULT_WIDTH = $50 - VERA_TEXTMATRIX_ADDR = $b000 - VERA_TEXTMATRIX_BANK = 1 - - chrout = $ffd2 - - ; source: library:/prog8lib/cx16/textio.p8:13 const ubyte DEFAULT_WIDTH = 80 - ; source: library:/prog8lib/cx16/textio.p8:14 const ubyte DEFAULT_HEIGHT = 60 - ; source: library:/prog8lib/cx16/textio.p8:16 const ubyte VERA_TEXTMATRIX_BANK = 1 - ; source: library:/prog8lib/cx16/textio.p8:17 const uword VERA_TEXTMATRIX_ADDR = $b000 - ; source: library:/prog8lib/shared_textio_functions.p8:1 txt { - ; source: library:/prog8lib/cx16/textio.p8:11 %option no_symbol_prefixing, ignore_unused - ; source: library:/prog8lib/cx16/textio.p8:40 asmsub column(ubyte col @A) clobbers(A, X, Y) { - -column .proc - ; source: library:/prog8lib/cx16/textio.p8:42 %asm {{ - sec - jsr cbm.PLOT - tay - clc - jmp cbm.PLOT - .pend - ; source: library:/prog8lib/cx16/textio.p8:51 asmsub get_column() -> ubyte @Y { - -get_column .proc - ; source: library:/prog8lib/cx16/textio.p8:52 %asm {{ - sec - jmp cbm.PLOT - .pend - ; source: library:/prog8lib/cx16/textio.p8:58 asmsub row(ubyte rownum @A) clobbers(A, X, Y) { - -row .proc - ; source: library:/prog8lib/cx16/textio.p8:60 %asm {{ - sec - jsr cbm.PLOT - tax - clc - jmp cbm.PLOT - .pend - ; source: library:/prog8lib/cx16/textio.p8:69 asmsub get_row() -> ubyte @X { - -get_row .proc - ; source: library:/prog8lib/cx16/textio.p8:70 %asm {{ - sec - jmp cbm.PLOT - .pend - ; source: library:/prog8lib/cx16/textio.p8:88 asmsub fill_screen (ubyte character @ A, ubyte color @ Y) clobbers(A, X) { - -fill_screen .proc - ; source: library:/prog8lib/cx16/textio.p8:90 %asm {{ - sty _ly+1 - pha - jsr cbm.SCREEN ; get dimensions in X/Y - txa - lsr a - lsr a - sta _lx+1 - lda #%00010000 - jsr set_vera_textmatrix_addresses - pla -_lx ldx #0 ; modified - phy -_ly ldy #1 ; modified -- sta cx16.VERA_DATA0 - sty cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - sty cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - sty cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - sty cx16.VERA_DATA0 - dex - bne - - ply - dey - beq + - stz cx16.VERA_ADDR_L - inc cx16.VERA_ADDR_M ; next line - bra _lx -+ rts - -set_vera_textmatrix_addresses: - stz cx16.VERA_CTRL - ora #VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H - stz cx16.VERA_ADDR_L ; start at (0,0) - lda #>VERA_TEXTMATRIX_ADDR - sta cx16.VERA_ADDR_M - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:134 asmsub clear_screenchars (ubyte character @ A) clobbers(X, Y) { - -clear_screenchars .proc - ; source: library:/prog8lib/cx16/textio.p8:137 %asm {{ - pha - jsr cbm.SCREEN ; get dimensions in X/Y - txa - lsr a - lsr a - sta _lx+1 - lda #%00100000 - jsr fill_screen.set_vera_textmatrix_addresses - pla -_lx ldx #0 ; modified -- sta cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - dex - bne - - dey - beq + - stz cx16.VERA_ADDR_L - inc cx16.VERA_ADDR_M ; next line - bra _lx -+ rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:163 asmsub clear_screencolors (ubyte color @ A) clobbers(X, Y) { - -clear_screencolors .proc - ; source: library:/prog8lib/cx16/textio.p8:166 %asm {{ - sta _la+1 - jsr cbm.SCREEN ; get dimensions in X/Y - txa - lsr a - lsr a - sta _lx+1 - stz cx16.VERA_CTRL - lda #%00100000 - jsr fill_screen.set_vera_textmatrix_addresses - inc cx16.VERA_ADDR_L ; start at (1,0) - the color attribute byte -_lx ldx #0 ; modified -_la lda #0 ; modified -- sta cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - dex - bne - - dey - beq + - lda #1 - sta cx16.VERA_ADDR_L - inc cx16.VERA_ADDR_M ; next line - bra _lx -+ rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:232 asmsub scroll_left() clobbers(A, X, Y) { - -scroll_left .proc - ; source: library:/prog8lib/cx16/textio.p8:235 %asm {{ - jsr cbm.SCREEN - dex - stx _lx+1 - dey - sty P8ZP_SCRATCH_B1 ; number of rows to scroll - -_nextline - stz cx16.VERA_CTRL ; data port 0: source column - lda #%00010000 | VERA_TEXTMATRIX_BANK ; auto increment 1 - sta cx16.VERA_ADDR_H - lda #2 - sta cx16.VERA_ADDR_L ; begin in column 1 - lda P8ZP_SCRATCH_B1 - clc - adc #>VERA_TEXTMATRIX_ADDR - tay - sty cx16.VERA_ADDR_M - lda #1 - sta cx16.VERA_CTRL ; data port 1: destination column - lda #%00010000 | VERA_TEXTMATRIX_BANK ; auto increment 1 - sta cx16.VERA_ADDR_H - stz cx16.VERA_ADDR_L - sty cx16.VERA_ADDR_M - -_lx ldx #0 ; modified -- lda cx16.VERA_DATA0 - sta cx16.VERA_DATA1 ; copy char - lda cx16.VERA_DATA0 - sta cx16.VERA_DATA1 ; copy color - dex - bne - - dec P8ZP_SCRATCH_B1 - bpl _nextline - - lda #0 - sta cx16.VERA_CTRL - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:276 asmsub scroll_right() clobbers(A,X,Y) { - -scroll_right .proc - ; source: library:/prog8lib/cx16/textio.p8:279 %asm {{ - jsr cbm.SCREEN - dex - stx _lx+1 - txa - asl a - dea - sta _rcol+1 - ina - ina - sta _rcol2+1 - dey - sty P8ZP_SCRATCH_B1 ; number of rows to scroll - -_nextline - stz cx16.VERA_CTRL ; data port 0: source column - lda #%00011000 | VERA_TEXTMATRIX_BANK ; auto decrement 1 - sta cx16.VERA_ADDR_H -_rcol lda #79*2-1 ; modified - sta cx16.VERA_ADDR_L ; begin in rightmost column minus one - lda P8ZP_SCRATCH_B1 - clc - adc #>VERA_TEXTMATRIX_ADDR - tay - sty cx16.VERA_ADDR_M - lda #1 - sta cx16.VERA_CTRL ; data port 1: destination column - lda #%00011000 | VERA_TEXTMATRIX_BANK ; auto decrement 1 - sta cx16.VERA_ADDR_H -_rcol2 lda #79*2+1 ; modified - sta cx16.VERA_ADDR_L - sty cx16.VERA_ADDR_M - -_lx ldx #0 ; modified -- lda cx16.VERA_DATA0 - sta cx16.VERA_DATA1 ; copy char - lda cx16.VERA_DATA0 - sta cx16.VERA_DATA1 ; copy color - dex - bne - - dec P8ZP_SCRATCH_B1 - bpl _nextline - - lda #0 - sta cx16.VERA_CTRL - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:328 asmsub scroll_up() clobbers(A, X, Y) { - -scroll_up .proc - ; source: library:/prog8lib/cx16/textio.p8:331 %asm {{ - jsr cbm.SCREEN - stx _nextline+1 - dey - sty P8ZP_SCRATCH_B1 - stz cx16.VERA_CTRL ; data port 0 is source - lda #1 | (>VERA_TEXTMATRIX_ADDR) - sta cx16.VERA_ADDR_M ; start at second line - stz cx16.VERA_ADDR_L - lda #%00010000 | VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H ; enable auto increment by 1, bank 0. - - lda #1 - sta cx16.VERA_CTRL ; data port 1 is destination - lda #>VERA_TEXTMATRIX_ADDR - sta cx16.VERA_ADDR_M ; start at top line - stz cx16.VERA_ADDR_L - lda #%00010000 | VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H ; enable auto increment by 1, bank 0. - -_nextline - ldx #80 ; modified -- lda cx16.VERA_DATA0 - sta cx16.VERA_DATA1 ; copy char - lda cx16.VERA_DATA0 - sta cx16.VERA_DATA1 ; copy color - dex - bne - - dec P8ZP_SCRATCH_B1 - beq + - stz cx16.VERA_CTRL ; data port 0 - stz cx16.VERA_ADDR_L - inc cx16.VERA_ADDR_M - lda #1 - sta cx16.VERA_CTRL ; data port 1 - stz cx16.VERA_ADDR_L - inc cx16.VERA_ADDR_M - bra _nextline - -+ lda #0 - sta cx16.VERA_CTRL - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:376 asmsub scroll_down() clobbers(A, X, Y) { - -scroll_down .proc - ; source: library:/prog8lib/cx16/textio.p8:379 %asm {{ - jsr cbm.SCREEN - stx _nextline+1 - dey - sty P8ZP_SCRATCH_B1 - stz cx16.VERA_CTRL ; data port 0 is source - dey - tya - clc - adc #>VERA_TEXTMATRIX_ADDR - sta cx16.VERA_ADDR_M ; start at line before bottom line - stz cx16.VERA_ADDR_L - lda #%00010000 | VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H ; enable auto increment by 1, bank 0. - - lda #1 - sta cx16.VERA_CTRL ; data port 1 is destination - iny - tya - clc - adc #>VERA_TEXTMATRIX_ADDR - sta cx16.VERA_ADDR_M ; start at bottom line - stz cx16.VERA_ADDR_L - lda #%00010000 | VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H ; enable auto increment by 1, bank 0. - -_nextline - ldx #80 ; modified -- lda cx16.VERA_DATA0 - sta cx16.VERA_DATA1 ; copy char - lda cx16.VERA_DATA0 - sta cx16.VERA_DATA1 ; copy color - dex - bne - - dec P8ZP_SCRATCH_B1 - beq + - stz cx16.VERA_CTRL ; data port 0 - stz cx16.VERA_ADDR_L - dec cx16.VERA_ADDR_M - lda #1 - sta cx16.VERA_CTRL ; data port 1 - stz cx16.VERA_ADDR_L - dec cx16.VERA_ADDR_M - bra _nextline - -+ lda #0 - sta cx16.VERA_CTRL - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:430 romsub $FFD2 = chrout(ubyte character @ A) ; for consistency. You can also use cbm.CHROUT directly ofcourse. Note: takes a PETSCII encoded character. - - ; source: library:/prog8lib/cx16/textio.p8:432 asmsub print (str text @ AY) clobbers(A,Y) { - -print .proc - ; source: library:/prog8lib/cx16/textio.p8:437 %asm {{ - sta P8ZP_SCRATCH_B1 - sty P8ZP_SCRATCH_REG - ldy #0 -- lda (P8ZP_SCRATCH_B1),y - beq + - jsr cbm.CHROUT - iny - bne - -+ rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:450 asmsub print_ub0 (ubyte value @ A) clobbers(A,X,Y) { - -print_ub0 .proc - ; source: library:/prog8lib/cx16/textio.p8:452 %asm {{ - jsr conv.ubyte2decimal - pha - tya - jsr cbm.CHROUT - pla - jsr cbm.CHROUT - txa - jmp cbm.CHROUT - .pend - ; source: library:/prog8lib/cx16/textio.p8:464 asmsub print_ub (ubyte value @ A) clobbers(A,X,Y) { - -print_ub .proc - ; source: library:/prog8lib/cx16/textio.p8:466 %asm {{ - jsr conv.ubyte2decimal -_print_byte_digits - pha - cpy #'0' - beq + - tya - jsr cbm.CHROUT - pla - jsr cbm.CHROUT - bra _ones -+ pla - cmp #'0' - beq _ones - jsr cbm.CHROUT -_ones txa - jmp cbm.CHROUT - .pend - ; source: library:/prog8lib/cx16/textio.p8:486 asmsub print_b (byte value @ A) clobbers(A,X,Y) { - -print_b .proc - ; source: library:/prog8lib/cx16/textio.p8:488 %asm {{ - pha - cmp #0 - bpl + - lda #'-' - jsr cbm.CHROUT -+ pla - jsr conv.byte2decimal - bra print_ub._print_byte_digits - .pend - ; source: library:/prog8lib/cx16/textio.p8:500 asmsub print_ubhex (ubyte value @ A, bool prefix @ Pc) clobbers(A,X,Y) { - -print_ubhex .proc - ; source: library:/prog8lib/cx16/textio.p8:502 %asm {{ - bcc + - pha - lda #'$' - jsr cbm.CHROUT - pla -+ jsr conv.ubyte2hex - jsr cbm.CHROUT - tya - jmp cbm.CHROUT - .pend - ; source: library:/prog8lib/cx16/textio.p8:515 asmsub print_ubbin (ubyte value @ A, bool prefix @ Pc) clobbers(A,X,Y) { - -print_ubbin .proc - ; source: library:/prog8lib/cx16/textio.p8:517 %asm {{ - sta P8ZP_SCRATCH_B1 - bcc + - lda #'%' - jsr cbm.CHROUT -+ ldy #8 -- lda #'0' - asl P8ZP_SCRATCH_B1 - bcc + - lda #'1' -+ jsr cbm.CHROUT - dey - bne - - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:534 asmsub print_uwbin (uword value @ AY, bool prefix @ Pc) clobbers(A,X,Y) { - -print_uwbin .proc - ; source: library:/prog8lib/cx16/textio.p8:536 %asm {{ - pha - tya - jsr print_ubbin - pla - clc - bra print_ubbin - .pend - ; source: library:/prog8lib/cx16/textio.p8:546 asmsub print_uwhex (uword value @ AY, bool prefix @ Pc) clobbers(A,X,Y) { - -print_uwhex .proc - ; source: library:/prog8lib/cx16/textio.p8:549 %asm {{ - pha - tya - jsr print_ubhex - pla - clc - bra print_ubhex - .pend - ; source: library:/prog8lib/cx16/textio.p8:559 asmsub print_uw0 (uword value @ AY) clobbers(A,X,Y) { - -print_uw0 .proc - ; source: library:/prog8lib/cx16/textio.p8:561 %asm {{ - jsr conv.uword2decimal - ldy #0 -- lda conv.uword2decimal.decTenThousands,y - beq + - jsr cbm.CHROUT - iny - bne - -+ rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:573 asmsub print_uw (uword value @ AY) clobbers(A,X,Y) { - -print_uw .proc - ; source: library:/prog8lib/cx16/textio.p8:575 %asm {{ - jsr conv.uword2decimal - ldy #0 -- lda conv.uword2decimal.decTenThousands,y - beq _allzero - cmp #'0' - bne _gotdigit - iny - bne - - -_gotdigit - jsr cbm.CHROUT - iny - lda conv.uword2decimal.decTenThousands,y - bne _gotdigit - rts -_allzero - lda #'0' - jmp cbm.CHROUT - .pend - ; source: library:/prog8lib/cx16/textio.p8:597 asmsub print_w (word value @ AY) clobbers(A,X,Y) { - -print_w .proc - ; source: library:/prog8lib/cx16/textio.p8:599 %asm {{ - cpy #0 - bpl + - pha - lda #'-' - jsr cbm.CHROUT - tya - eor #255 - tay - pla - eor #255 - ina - bne + - iny -+ bra print_uw - .pend - ; source: library:/prog8lib/cx16/textio.p8:617 asmsub input_chars (uword buffer @ AY) clobbers(A) -> ubyte @ Y { - -input_chars .proc - ; source: library:/prog8lib/cx16/textio.p8:622 %asm {{ - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 ; char counter = 0 -- jsr cbm.CHRIN - cmp #$0d ; return (ascii 13) pressed? - beq + ; yes, end. - sta (P8ZP_SCRATCH_W1),y ; else store char in buffer - iny - bne - -+ lda #0 - sta (P8ZP_SCRATCH_W1),y ; finish string with 0 byte - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:639 asmsub setchr (ubyte col @X, ubyte row @Y, ubyte character @A) clobbers(A) { - -setchr .proc - ; source: library:/prog8lib/cx16/textio.p8:641 %asm {{ - pha - stz cx16.VERA_CTRL - lda #VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H - txa - asl a - sta cx16.VERA_ADDR_L - tya - ; clc - adc #>VERA_TEXTMATRIX_ADDR - sta cx16.VERA_ADDR_M - pla - sta cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:659 asmsub getchr (ubyte col @A, ubyte row @Y) -> ubyte @ A { - -getchr .proc - ; source: library:/prog8lib/cx16/textio.p8:661 %asm {{ - asl a - pha - stz cx16.VERA_CTRL - lda #VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H - pla - sta cx16.VERA_ADDR_L - tya - ; clc - adc #>VERA_TEXTMATRIX_ADDR - sta cx16.VERA_ADDR_M - lda cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:678 asmsub setclr (ubyte col @X, ubyte row @Y, ubyte color @A) clobbers(A) { - -setclr .proc - ; source: library:/prog8lib/cx16/textio.p8:682 %asm {{ - pha - stz cx16.VERA_CTRL - lda #VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H - txa - asl a - ina - sta cx16.VERA_ADDR_L - tya - ; clc - adc #>VERA_TEXTMATRIX_ADDR - sta cx16.VERA_ADDR_M - pla - sta cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:701 asmsub getclr (ubyte col @A, ubyte row @Y) -> ubyte @ A { - -getclr .proc - ; source: library:/prog8lib/cx16/textio.p8:703 %asm {{ - asl a - ina - pha - stz cx16.VERA_CTRL - lda #VERA_TEXTMATRIX_BANK - sta cx16.VERA_ADDR_H - pla - sta cx16.VERA_ADDR_L - tya - ; clc - adc #>VERA_TEXTMATRIX_ADDR - sta cx16.VERA_ADDR_M - lda cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:778 asmsub plot (ubyte col @ Y, ubyte row @ X) { - -plot .proc - ; source: library:/prog8lib/cx16/textio.p8:779 %asm {{ - clc - jmp cbm.PLOT - .pend - ; source: library:/prog8lib/cx16/textio.p8:785 asmsub width() clobbers(X,Y) -> ubyte @A { - -width .proc - ; source: library:/prog8lib/cx16/textio.p8:787 %asm {{ - jsr cbm.SCREEN - txa - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:794 asmsub height() clobbers(X, Y) -> ubyte @A { - -height .proc - ; source: library:/prog8lib/cx16/textio.p8:796 %asm {{ - jsr cbm.SCREEN - tya - rts - .pend - ; source: library:/prog8lib/cx16/textio.p8:803 asmsub waitkey() -> ubyte @A { - -waitkey .proc - ; source: library:/prog8lib/cx16/textio.p8:804 %asm {{ -- jsr cbm.GETIN - beq - - rts - .pend - ; source: library:/prog8lib/shared_textio_functions.p8:5 asmsub petscii2scr(ubyte petscii_char @A) -> ubyte @A { - -petscii2scr .proc - ; source: library:/prog8lib/shared_textio_functions.p8:7 %asm {{ - sta P8ZP_SCRATCH_REG - lsr a - lsr a - lsr a - lsr a - lsr a - tax - lda _offsets,x - eor P8ZP_SCRATCH_REG - rts -_offsets .byte 128, 0, 64, 32, 64, 192, 128, 128 - .pend - ; source: library:/prog8lib/shared_textio_functions.p8:22 asmsub petscii2scr_str(str petscii_string @AY) { - -petscii2scr_str .proc - ; source: library:/prog8lib/shared_textio_functions.p8:24 %asm {{ - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 -- lda (P8ZP_SCRATCH_W1),y - beq + - jsr petscii2scr - sta (P8ZP_SCRATCH_W1),y - iny - bne - -+ rts - .pend - .pend - -; ---- block: 'cbm' ---- -cbm .proc - ; source: library:/prog8lib/cx16/syslib.p8:6 cbm { - - CINT = $ff81 - IOINIT = $ff84 - RAMTAS = $ff87 - RESTOR = $ff8a - VECTOR = $ff8d - SETMSG = $ff90 - SECOND = $ff93 - TKSA = $ff96 - MEMTOP = $ff99 - MEMBOT = $ff9c - SCNKEY = $ff9f - SETTMO = $ffa2 - ACPTR = $ffa5 - CIOUT = $ffa8 - UNTLK = $ffab - UNLSN = $ffae - LISTEN = $ffb1 - TALK = $ffb4 - READST = $ffb7 - SETLFS = $ffba - SETNAM = $ffbd - OPEN = $ffc0 - CLOSE = $ffc3 - CHKIN = $ffc6 - CHKOUT = $ffc9 - CLRCHN = $ffcc - CHRIN = $ffcf - CHROUT = $ffd2 - LOAD = $ffd5 - SAVE = $ffd8 - SETTIM = $ffdb - RDTIM = $ffde - STOP = $ffe1 - GETIN = $ffe4 - CLALL = $ffe7 - UDTIM = $ffea - SCREEN = $ffed - PLOT = $fff0 - IOBASE = $fff3 - - ; source: library:/prog8lib/cx16/syslib.p8:14 romsub $FF81 = CINT() clobbers(A,X,Y) ; (alias: SCINIT) initialize screen editor and video chip, including resetting to the default color palette. Note: also sets the video mode back to VGA - - ; source: library:/prog8lib/cx16/syslib.p8:15 romsub $FF84 = IOINIT() clobbers(A, X) ; initialize I/O devices (CIA, IRQ, ...) - - ; source: library:/prog8lib/cx16/syslib.p8:16 romsub $FF87 = RAMTAS() clobbers(A,X,Y) ; initialize RAM, screen - - ; source: library:/prog8lib/cx16/syslib.p8:17 romsub $FF8A = RESTOR() clobbers(A,X,Y) ; restore default I/O vectors - - ; source: library:/prog8lib/cx16/syslib.p8:18 romsub $FF8D = VECTOR(uword userptr @ XY, bool dir @ Pc) clobbers(A,Y) ; read/set I/O vector table - - ; source: library:/prog8lib/cx16/syslib.p8:19 romsub $FF90 = SETMSG(ubyte value @ A) ; set Kernal message control flag - - ; source: library:/prog8lib/cx16/syslib.p8:20 romsub $FF93 = SECOND(ubyte address @ A) clobbers(A) ; (alias: LSTNSA) send secondary address after LISTEN - - ; source: library:/prog8lib/cx16/syslib.p8:21 romsub $FF96 = TKSA(ubyte address @ A) clobbers(A) ; (alias: TALKSA) send secondary address after TALK - - ; source: library:/prog8lib/cx16/syslib.p8:22 romsub $FF99 = MEMTOP(uword address @ XY, bool dir @ Pc) -> uword @ XY ; read/set top of memory pointer. NOTE: as a Cx16 extension, also returns the number of RAM memory banks in register A ! See cx16.numbanks() - - ; source: library:/prog8lib/cx16/syslib.p8:23 romsub $FF9C = MEMBOT(uword address @ XY, bool dir @ Pc) -> uword @ XY ; read/set bottom of memory pointer - - ; source: library:/prog8lib/cx16/syslib.p8:24 romsub $FF9F = SCNKEY() clobbers(A,X,Y) ; scan the keyboard, also called kbd_scan - - ; source: library:/prog8lib/cx16/syslib.p8:25 romsub $FFA2 = SETTMO(ubyte timeout @ A) ; set time-out flag for IEEE bus - - ; source: library:/prog8lib/cx16/syslib.p8:26 romsub $FFA5 = ACPTR() -> ubyte @ A ; (alias: IECIN) input byte from serial bus - - ; source: library:/prog8lib/cx16/syslib.p8:27 romsub $FFA8 = CIOUT(ubyte databyte @ A) ; (alias: IECOUT) output byte to serial bus - - ; source: library:/prog8lib/cx16/syslib.p8:28 romsub $FFAB = UNTLK() clobbers(A) ; command serial bus device to UNTALK - - ; source: library:/prog8lib/cx16/syslib.p8:29 romsub $FFAE = UNLSN() clobbers(A) ; command serial bus device to UNLISTEN - - ; source: library:/prog8lib/cx16/syslib.p8:30 romsub $FFB1 = LISTEN(ubyte device @ A) clobbers(A) ; command serial bus device to LISTEN - - ; source: library:/prog8lib/cx16/syslib.p8:31 romsub $FFB4 = TALK(ubyte device @ A) clobbers(A) ; command serial bus device to TALK - - ; source: library:/prog8lib/cx16/syslib.p8:32 romsub $FFB7 = READST() -> ubyte @ A ; read I/O status word (use CLEARST to reset it to 0) - - ; source: library:/prog8lib/cx16/syslib.p8:33 romsub $FFBA = SETLFS(ubyte logical @ A, ubyte device @ X, ubyte secondary @ Y) ; set logical file parameters - - ; source: library:/prog8lib/cx16/syslib.p8:34 romsub $FFBD = SETNAM(ubyte namelen @ A, str filename @ XY) ; set filename parameters - - ; source: library:/prog8lib/cx16/syslib.p8:35 romsub $FFC0 = OPEN() clobbers(X,Y) -> bool @Pc, ubyte @A ; (via 794 ($31A)) open a logical file - - ; source: library:/prog8lib/cx16/syslib.p8:36 romsub $FFC3 = CLOSE(ubyte logical @ A) clobbers(A,X,Y) ; (via 796 ($31C)) close a logical file - - ; source: library:/prog8lib/cx16/syslib.p8:37 romsub $FFC6 = CHKIN(ubyte logical @ X) clobbers(A,X) -> bool @Pc ; (via 798 ($31E)) define an input channel - - ; source: library:/prog8lib/cx16/syslib.p8:38 romsub $FFC9 = CHKOUT(ubyte logical @ X) clobbers(A,X) ; (via 800 ($320)) define an output channel - - ; source: library:/prog8lib/cx16/syslib.p8:39 romsub $FFCC = CLRCHN() clobbers(A,X) ; (via 802 ($322)) restore default devices - - ; source: library:/prog8lib/cx16/syslib.p8:40 romsub $FFCF = CHRIN() clobbers(X, Y) -> ubyte @ A ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read. - - ; source: library:/prog8lib/cx16/syslib.p8:41 romsub $FFD2 = CHROUT(ubyte character @ A) ; (via 806 ($326)) output a character - - ; source: library:/prog8lib/cx16/syslib.p8:42 romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> bool @Pc, ubyte @ A, uword @ XY ; (via 816 ($330)) load from device - - ; source: library:/prog8lib/cx16/syslib.p8:43 romsub $FFD8 = SAVE(ubyte zp_startaddr @ A, uword endaddr @ XY) clobbers (X, Y) -> bool @ Pc, ubyte @ A ; (via 818 ($332)) save to a device. See also BSAVE - - ; source: library:/prog8lib/cx16/syslib.p8:44 romsub $FFDB = SETTIM(ubyte low @ A, ubyte middle @ X, ubyte high @ Y) ; set the software clock - - ; source: library:/prog8lib/cx16/syslib.p8:45 romsub $FFDE = RDTIM() -> ubyte @ A, ubyte @ X, ubyte @ Y ; read the software clock (A=lo,X=mid,Y=high) - - ; source: library:/prog8lib/cx16/syslib.p8:46 romsub $FFE1 = STOP() clobbers(X) -> bool @ Pz, ubyte @ A ; (via 808 ($328)) check the STOP key (and some others in A) - - ; source: library:/prog8lib/cx16/syslib.p8:47 romsub $FFE4 = GETIN() clobbers(X,Y) -> bool @Pc, ubyte @ A ; (via 810 ($32A)) get a character - - ; source: library:/prog8lib/cx16/syslib.p8:48 romsub $FFE7 = CLALL() clobbers(A,X) ; (via 812 ($32C)) close all files - - ; source: library:/prog8lib/cx16/syslib.p8:49 romsub $FFEA = UDTIM() clobbers(A,X) ; update the software clock - - ; source: library:/prog8lib/cx16/syslib.p8:50 romsub $FFED = SCREEN() -> ubyte @ X, ubyte @ Y ; read number of screen rows and columns - - ; source: library:/prog8lib/cx16/syslib.p8:51 romsub $FFF0 = PLOT(ubyte col @ Y, ubyte row @ X, bool dir @ Pc) -> ubyte @ X, ubyte @ Y ; read/set position of cursor on screen. Use txt.plot for a 'safe' wrapper that preserves X. - - ; source: library:/prog8lib/cx16/syslib.p8:52 romsub $FFF3 = IOBASE() -> uword @ XY ; read base address of I/O devices - - ; source: library:/prog8lib/cx16/syslib.p8:56 asmsub STOP2() clobbers(X) -> bool @A { - -STOP2 .proc - ; source: library:/prog8lib/cx16/syslib.p8:58 %asm {{ - jsr cbm.STOP - beq + - lda #0 - rts -+ lda #1 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:68 asmsub RDTIM16() clobbers(X) -> uword @AY { - -RDTIM16 .proc - ; source: library:/prog8lib/cx16/syslib.p8:70 %asm {{ - php - sei - jsr cbm.RDTIM - plp - cli - pha - txa - tay - pla - rts - .pend - .pend - -; ---- block: 'cx16' ---- -cx16 .proc - ; source: library:/prog8lib/cx16/syslib.p8:95 cx16 { - r0 = 2 - r0s = 2 - r0L = 2 - r0sL = 2 - r0H = 3 - r0sH = 3 - r1 = 4 - r1s = 4 - r1L = 4 - r1sL = 4 - r1H = 5 - r1sH = 5 - r2 = 6 - r2s = 6 - r2L = 6 - r2sL = 6 - r2H = 7 - r2sH = 7 - r3 = 8 - r3s = 8 - r3L = 8 - r3sL = 8 - r3H = 9 - r3sH = 9 - r4 = 10 - r4s = 10 - r4L = 10 - r4sL = 10 - r4H = 11 - r4sH = 11 - r5 = 12 - r5s = 12 - r5L = 12 - r5sL = 12 - r5H = 13 - r5sH = 13 - r6 = 14 - r6s = 14 - r6L = 14 - r6sL = 14 - r6H = 15 - r6sH = 15 - r7 = $10 - r7s = $10 - r7L = $10 - r7sL = $10 - r7H = $11 - r7sH = $11 - r8 = $12 - r8s = $12 - r8L = $12 - r8sL = $12 - r8H = $13 - r8sH = $13 - r9 = $14 - r9s = $14 - r9L = $14 - r9sL = $14 - r9H = $15 - r9sH = $15 - r10 = $16 - r10s = $16 - r10L = $16 - r10sL = $16 - r10H = $17 - r10sH = $17 - r11 = $18 - r11s = $18 - r11L = $18 - r11sL = $18 - r11H = $19 - r11sH = $19 - r12 = $1a - r12s = $1a - r12L = $1a - r12sL = $1a - r12H = $1b - r12sH = $1b - r13 = $1c - r13s = $1c - r13L = $1c - r13sL = $1c - r13H = $1d - r13sH = $1d - r14 = $1e - r14s = $1e - r14L = $1e - r14sL = $1e - r14H = $1f - r14sH = $1f - r15 = $20 - r15s = $20 - r15L = $20 - r15sL = $20 - r15H = $21 - r15sH = $21 - IERROR = $0300 - IMAIN = $0302 - ICRNCH = $0304 - IQPLOP = $0306 - IGONE = $0308 - IEVAL = $030a - SAREG = $030c - SXREG = $030d - SYREG = $030e - SPREG = $030f - USRADD = $0311 - CINV = $0314 - CBINV = $0316 - NMINV = $0318 - IOPEN = $031a - ICLOSE = $031c - ICHKIN = $031e - ICKOUT = $0320 - ICLRCH = $0322 - IBASIN = $0324 - IBSOUT = $0326 - ISTOP = $0328 - IGETIN = $032a - ICLALL = $032c - KEYHDL = $032e - ILOAD = $0330 - ISAVE = $0332 - via1prb = $9f00 - via1pra = $9f01 - via1ddrb = $9f02 - via1ddra = $9f03 - via1t1l = $9f04 - via1t1h = $9f05 - via1t1ll = $9f06 - via1t1lh = $9f07 - via1t2l = $9f08 - via1t2h = $9f09 - via1sr = $9f0a - via1acr = $9f0b - via1pcr = $9f0c - via1ifr = $9f0d - via1ier = $9f0e - via1ora = $9f0f - via2prb = $9f10 - via2pra = $9f11 - via2ddrb = $9f12 - via2ddra = $9f13 - via2t1l = $9f14 - via2t1h = $9f15 - via2t1ll = $9f16 - via2t1lh = $9f17 - via2t2l = $9f18 - via2t2h = $9f19 - via2sr = $9f1a - via2acr = $9f1b - via2pcr = $9f1c - via2ifr = $9f1d - via2ier = $9f1e - via2ora = $9f1f - VERA_ADDR_L = $9f20 - VERA_ADDR = $9f20 - VERA_ADDR_M = $9f21 - VERA_ADDR_H = $9f22 - VERA_DATA0 = $9f23 - VERA_DATA1 = $9f24 - VERA_CTRL = $9f25 - VERA_IEN = $9f26 - VERA_ISR = $9f27 - VERA_IRQLINE_L = $9f28 - VERA_SCANLINE_L = $9f28 - VERA_DC_VIDEO = $9f29 - VERA_DC_HSTART = $9f29 - VERA_DC_VER0 = $9f29 - VERA_FX_CTRL = $9f29 - VERA_FX_X_INCR_L = $9f29 - VERA_FX_X_INCR = $9f29 - VERA_FX_X_POS_L = $9f29 - VERA_FX_X_POS = $9f29 - VERA_FX_X_POS_S = $9f29 - VERA_FX_CACHE_L = $9f29 - VERA_FX_ACCUM_RESET = $9f29 - VERA_DC_HSCALE = $9f2a - VERA_DC_HSTOP = $9f2a - VERA_DC_VER1 = $9f2a - VERA_FX_TILEBASE = $9f2a - VERA_FX_X_INCR_H = $9f2a - VERA_FX_X_POS_H = $9f2a - VERA_FX_Y_POS_S = $9f2a - VERA_FX_CACHE_M = $9f2a - VERA_FX_ACCUM = $9f2a - VERA_DC_VSCALE = $9f2b - VERA_DC_VSTART = $9f2b - VERA_DC_VER2 = $9f2b - VERA_FX_MAPBASE = $9f2b - VERA_FX_Y_INCR_L = $9f2b - VERA_FX_Y_INCR = $9f2b - VERA_FX_Y_POS_L = $9f2b - VERA_FX_Y_POS = $9f2b - VERA_FX_POLY_FILL_L = $9f2b - VERA_FX_POLY_FILL = $9f2b - VERA_FX_CACHE_H = $9f2b - VERA_DC_BORDER = $9f2c - VERA_DC_VSTOP = $9f2c - VERA_DC_VER3 = $9f2c - VERA_FX_MULT = $9f2c - VERA_FX_Y_INCR_H = $9f2c - VERA_FX_Y_POS_H = $9f2c - VERA_FX_POLY_FILL_H = $9f2c - VERA_FX_CACHE_U = $9f2c - VERA_L0_CONFIG = $9f2d - VERA_L0_MAPBASE = $9f2e - VERA_L0_TILEBASE = $9f2f - VERA_L0_HSCROLL_L = $9f30 - VERA_L0_HSCROLL = $9f30 - VERA_L0_HSCROLL_H = $9f31 - VERA_L0_VSCROLL_L = $9f32 - VERA_L0_VSCROLL = $9f32 - VERA_L0_VSCROLL_H = $9f33 - VERA_L1_CONFIG = $9f34 - VERA_L1_MAPBASE = $9f35 - VERA_L1_TILEBASE = $9f36 - VERA_L1_HSCROLL_L = $9f37 - VERA_L1_HSCROLL = $9f37 - VERA_L1_HSCROLL_H = $9f38 - VERA_L1_VSCROLL_L = $9f39 - VERA_L1_VSCROLL = $9f39 - VERA_L1_VSCROLL_H = $9f3a - VERA_AUDIO_CTRL = $9f3b - VERA_AUDIO_RATE = $9f3c - VERA_AUDIO_DATA = $9f3d - VERA_SPI_DATA = $9f3e - VERA_SPI_CTRL = $9f3f - YM_ADDRESS = $9f40 - YM_DATA = $9f41 - edkeyvec = $ac03 - edkeybk = $ac05 - NMI_VEC = $fffa - RESET_VEC = $fffc - IRQ_VEC = $fffe - VERA_BASE = $9f20 - VIA1_BASE = $9f00 - VIA2_BASE = $9f10 - extdev = $9f60 - - CLOSE_ALL = $ff4a - LKUPLA = $ff59 - LKUPSA = $ff5c - screen_mode = $ff5f - screen_set_charset = $ff62 - JSRFAR = $ff6e - fetch = $ff74 - stash = $ff77 - PRIMM = $ff7d - GRAPH_init = $ff20 - GRAPH_clear = $ff23 - GRAPH_set_window = $ff26 - GRAPH_set_colors = $ff29 - GRAPH_draw_line = $ff2c - GRAPH_draw_rect = $ff2f - GRAPH_move_rect = $ff32 - GRAPH_draw_oval = $ff35 - GRAPH_draw_image = $ff38 - GRAPH_set_font = $ff3b - GRAPH_get_char_size = $ff3e - GRAPH_put_char = $ff41 - GRAPH_put_next_char = $ff41 - FB_init = $fef6 - FB_get_info = $fef9 - FB_set_palette = $fefc - FB_cursor_position = $feff - FB_cursor_next_line = $ff02 - FB_get_pixel = $ff05 - FB_get_pixels = $ff08 - FB_set_pixel = $ff0b - FB_set_pixels = $ff0e - FB_set_8_pixels = $ff11 - FB_set_8_pixels_opaque = $ff14 - FB_fill_pixels = $ff17 - FB_filter_pixels = $ff1a - FB_move_pixels = $ff1d - BSAVE = $feba - i2c_read_byte = $fec6 - i2c_write_byte = $fec9 - sprite_set_image = $fef0 - sprite_set_position = $fef3 - memory_fill = $fee4 - memory_copy = $fee7 - memory_crc = $feea - memory_decompress = $feed - console_init = $fedb - console_put_char = $fede - console_get_char = $fee1 - console_put_image = $fed8 - console_set_paging_message = $fed5 - entropy_get = $fecf - monitor = $fecc - MACPTR = $ff44 - MCIOUT = $feb1 - enter_basic = $ff47 - clock_set_date_time = $ff4d - clock_get_date_time = $ff50 - kbdbuf_peek = $febd - kbdbuf_peek2 = $febd - kbdbuf_get_modifiers = $fec0 - kbdbuf_put = $fec3 - keymap = $fed2 - mouse_config = $ff68 - mouse_get = $ff6b - mouse_scan = $ff71 - joystick_scan = $ff53 - joystick_get = $ff56 - joystick_get2 = $ff56 - x16edit_default = $c000 - x16edit_loadfile = $c003 - x16edit_loadfile_options = $c006 - audio_init = $c09f - bas_fmfreq = $c000 - bas_fmnote = $c003 - bas_fmplaystring = $c006 - bas_fmvib = $c009 - bas_playstringvoice = $c00c - bas_psgfreq = $c00f - bas_psgnote = $c012 - bas_psgwav = $c015 - bas_psgplaystring = $c018 - bas_fmchordstring = $c08d - bas_psgchordstring = $c090 - notecon_bas2fm = $c01b - notecon_bas2midi = $c01e - notecon_bas2psg = $c021 - notecon_fm2bas = $c024 - notecon_fm2midi = $c027 - notecon_fm2psg = $c02a - notecon_freq2bas = $c02d - notecon_freq2fm = $c030 - notecon_freq2midi = $c033 - notecon_freq2psg = $c036 - notecon_midi2bas = $c039 - notecon_midi2fm = $c03c - notecon_midi2psg = $c03f - notecon_psg2bas = $c042 - notecon_psg2fm = $c045 - notecon_psg2midi = $c048 - psg_init = $c04b - psg_playfreq = $c04e - psg_read = $c051 - psg_setatten = $c054 - psg_setfreq = $c057 - psg_setpan = $c05a - psg_setvol = $c05d - psg_write = $c060 - psg_write_fast = $c0a2 - psg_getatten = $c093 - psg_getpan = $c096 - ym_init = $c063 - ym_loaddefpatches = $c066 - ym_loadpatch = $c069 - ym_loadpatchlfn = $c06c - ym_playdrum = $c06f - ym_playnote = $c072 - ym_setatten = $c075 - ym_setdrum = $c078 - ym_setnote = $c07b - ym_setpan = $c07e - ym_read = $c081 - ym_release = $c084 - ym_trigger = $c087 - ym_write = $c08a - ym_getatten = $c099 - ym_getpan = $c09c - ym_get_chip_type = $c0a5 - - ; source: library:/prog8lib/cx16/syslib.p8:98 &uword IERROR = $0300 - ; source: library:/prog8lib/cx16/syslib.p8:99 &uword IMAIN = $0302 - ; source: library:/prog8lib/cx16/syslib.p8:100 &uword ICRNCH = $0304 - ; source: library:/prog8lib/cx16/syslib.p8:101 &uword IQPLOP = $0306 - ; source: library:/prog8lib/cx16/syslib.p8:102 &uword IGONE = $0308 - ; source: library:/prog8lib/cx16/syslib.p8:103 &uword IEVAL = $030a - ; source: library:/prog8lib/cx16/syslib.p8:104 &ubyte SAREG = $030c ; register storage for A for SYS calls - ; source: library:/prog8lib/cx16/syslib.p8:105 &ubyte SXREG = $030d ; register storage for X for SYS calls - ; source: library:/prog8lib/cx16/syslib.p8:106 &ubyte SYREG = $030e ; register storage for Y for SYS calls - ; source: library:/prog8lib/cx16/syslib.p8:107 &ubyte SPREG = $030f ; register storage for P (status register) for SYS calls - ; source: library:/prog8lib/cx16/syslib.p8:108 &uword USRADD = $0311 ; vector for the USR() basic command - ; source: library:/prog8lib/cx16/syslib.p8:110 &uword CINV = $0314 ; IRQ vector (in ram) - ; source: library:/prog8lib/cx16/syslib.p8:111 &uword CBINV = $0316 ; BRK vector (in ram) - ; source: library:/prog8lib/cx16/syslib.p8:112 &uword NMINV = $0318 ; NMI vector (in ram) - ; source: library:/prog8lib/cx16/syslib.p8:113 &uword IOPEN = $031a - ; source: library:/prog8lib/cx16/syslib.p8:114 &uword ICLOSE = $031c - ; source: library:/prog8lib/cx16/syslib.p8:115 &uword ICHKIN = $031e - ; source: library:/prog8lib/cx16/syslib.p8:116 &uword ICKOUT = $0320 - ; source: library:/prog8lib/cx16/syslib.p8:117 &uword ICLRCH = $0322 - ; source: library:/prog8lib/cx16/syslib.p8:118 &uword IBASIN = $0324 - ; source: library:/prog8lib/cx16/syslib.p8:119 &uword IBSOUT = $0326 - ; source: library:/prog8lib/cx16/syslib.p8:120 &uword ISTOP = $0328 - ; source: library:/prog8lib/cx16/syslib.p8:121 &uword IGETIN = $032a - ; source: library:/prog8lib/cx16/syslib.p8:122 &uword ICLALL = $032c - ; source: library:/prog8lib/cx16/syslib.p8:123 &uword KEYHDL = $032e ; keyboard scan code handler see examples/cx16/keyboardhandler.p8 - ; source: library:/prog8lib/cx16/syslib.p8:124 &uword ILOAD = $0330 - ; source: library:/prog8lib/cx16/syslib.p8:125 &uword ISAVE = $0332 - ; source: library:/prog8lib/cx16/syslib.p8:126 &uword NMI_VEC = $FFFA ; 65c02 nmi vector, determined by the kernal if banked in - ; source: library:/prog8lib/cx16/syslib.p8:127 &uword RESET_VEC = $FFFC ; 65c02 reset vector, determined by the kernal if banked in - ; source: library:/prog8lib/cx16/syslib.p8:128 &uword IRQ_VEC = $FFFE ; 65c02 interrupt vector, determined by the kernal if banked in - ; source: library:/prog8lib/cx16/syslib.p8:130 &uword edkeyvec = $ac03 ; (ram bank 0): for intercepting BASIN/CHRIN key strokes. See set_chrin_keyhandler() - ; source: library:/prog8lib/cx16/syslib.p8:131 &ubyte edkeybk = $ac05 ; ...the RAM bank of the handler routine, if not in low ram - ; source: library:/prog8lib/cx16/syslib.p8:135 &uword r0 = $0002 - ; source: library:/prog8lib/cx16/syslib.p8:136 &uword r1 = $0004 - ; source: library:/prog8lib/cx16/syslib.p8:137 &uword r2 = $0006 - ; source: library:/prog8lib/cx16/syslib.p8:138 &uword r3 = $0008 - ; source: library:/prog8lib/cx16/syslib.p8:139 &uword r4 = $000a - ; source: library:/prog8lib/cx16/syslib.p8:140 &uword r5 = $000c - ; source: library:/prog8lib/cx16/syslib.p8:141 &uword r6 = $000e - ; source: library:/prog8lib/cx16/syslib.p8:142 &uword r7 = $0010 - ; source: library:/prog8lib/cx16/syslib.p8:143 &uword r8 = $0012 - ; source: library:/prog8lib/cx16/syslib.p8:144 &uword r9 = $0014 - ; source: library:/prog8lib/cx16/syslib.p8:145 &uword r10 = $0016 - ; source: library:/prog8lib/cx16/syslib.p8:146 &uword r11 = $0018 - ; source: library:/prog8lib/cx16/syslib.p8:147 &uword r12 = $001a - ; source: library:/prog8lib/cx16/syslib.p8:148 &uword r13 = $001c - ; source: library:/prog8lib/cx16/syslib.p8:149 &uword r14 = $001e - ; source: library:/prog8lib/cx16/syslib.p8:150 &uword r15 = $0020 - ; source: library:/prog8lib/cx16/syslib.p8:152 &word r0s = $0002 - ; source: library:/prog8lib/cx16/syslib.p8:153 &word r1s = $0004 - ; source: library:/prog8lib/cx16/syslib.p8:154 &word r2s = $0006 - ; source: library:/prog8lib/cx16/syslib.p8:155 &word r3s = $0008 - ; source: library:/prog8lib/cx16/syslib.p8:156 &word r4s = $000a - ; source: library:/prog8lib/cx16/syslib.p8:157 &word r5s = $000c - ; source: library:/prog8lib/cx16/syslib.p8:158 &word r6s = $000e - ; source: library:/prog8lib/cx16/syslib.p8:159 &word r7s = $0010 - ; source: library:/prog8lib/cx16/syslib.p8:160 &word r8s = $0012 - ; source: library:/prog8lib/cx16/syslib.p8:161 &word r9s = $0014 - ; source: library:/prog8lib/cx16/syslib.p8:162 &word r10s = $0016 - ; source: library:/prog8lib/cx16/syslib.p8:163 &word r11s = $0018 - ; source: library:/prog8lib/cx16/syslib.p8:164 &word r12s = $001a - ; source: library:/prog8lib/cx16/syslib.p8:165 &word r13s = $001c - ; source: library:/prog8lib/cx16/syslib.p8:166 &word r14s = $001e - ; source: library:/prog8lib/cx16/syslib.p8:167 &word r15s = $0020 - ; source: library:/prog8lib/cx16/syslib.p8:169 &ubyte r0L = $0002 - ; source: library:/prog8lib/cx16/syslib.p8:170 &ubyte r1L = $0004 - ; source: library:/prog8lib/cx16/syslib.p8:171 &ubyte r2L = $0006 - ; source: library:/prog8lib/cx16/syslib.p8:172 &ubyte r3L = $0008 - ; source: library:/prog8lib/cx16/syslib.p8:173 &ubyte r4L = $000a - ; source: library:/prog8lib/cx16/syslib.p8:174 &ubyte r5L = $000c - ; source: library:/prog8lib/cx16/syslib.p8:175 &ubyte r6L = $000e - ; source: library:/prog8lib/cx16/syslib.p8:176 &ubyte r7L = $0010 - ; source: library:/prog8lib/cx16/syslib.p8:177 &ubyte r8L = $0012 - ; source: library:/prog8lib/cx16/syslib.p8:178 &ubyte r9L = $0014 - ; source: library:/prog8lib/cx16/syslib.p8:179 &ubyte r10L = $0016 - ; source: library:/prog8lib/cx16/syslib.p8:180 &ubyte r11L = $0018 - ; source: library:/prog8lib/cx16/syslib.p8:181 &ubyte r12L = $001a - ; source: library:/prog8lib/cx16/syslib.p8:182 &ubyte r13L = $001c - ; source: library:/prog8lib/cx16/syslib.p8:183 &ubyte r14L = $001e - ; source: library:/prog8lib/cx16/syslib.p8:184 &ubyte r15L = $0020 - ; source: library:/prog8lib/cx16/syslib.p8:186 &ubyte r0H = $0003 - ; source: library:/prog8lib/cx16/syslib.p8:187 &ubyte r1H = $0005 - ; source: library:/prog8lib/cx16/syslib.p8:188 &ubyte r2H = $0007 - ; source: library:/prog8lib/cx16/syslib.p8:189 &ubyte r3H = $0009 - ; source: library:/prog8lib/cx16/syslib.p8:190 &ubyte r4H = $000b - ; source: library:/prog8lib/cx16/syslib.p8:191 &ubyte r5H = $000d - ; source: library:/prog8lib/cx16/syslib.p8:192 &ubyte r6H = $000f - ; source: library:/prog8lib/cx16/syslib.p8:193 &ubyte r7H = $0011 - ; source: library:/prog8lib/cx16/syslib.p8:194 &ubyte r8H = $0013 - ; source: library:/prog8lib/cx16/syslib.p8:195 &ubyte r9H = $0015 - ; source: library:/prog8lib/cx16/syslib.p8:196 &ubyte r10H = $0017 - ; source: library:/prog8lib/cx16/syslib.p8:197 &ubyte r11H = $0019 - ; source: library:/prog8lib/cx16/syslib.p8:198 &ubyte r12H = $001b - ; source: library:/prog8lib/cx16/syslib.p8:199 &ubyte r13H = $001d - ; source: library:/prog8lib/cx16/syslib.p8:200 &ubyte r14H = $001f - ; source: library:/prog8lib/cx16/syslib.p8:201 &ubyte r15H = $0021 - ; source: library:/prog8lib/cx16/syslib.p8:203 &byte r0sL = $0002 - ; source: library:/prog8lib/cx16/syslib.p8:204 &byte r1sL = $0004 - ; source: library:/prog8lib/cx16/syslib.p8:205 &byte r2sL = $0006 - ; source: library:/prog8lib/cx16/syslib.p8:206 &byte r3sL = $0008 - ; source: library:/prog8lib/cx16/syslib.p8:207 &byte r4sL = $000a - ; source: library:/prog8lib/cx16/syslib.p8:208 &byte r5sL = $000c - ; source: library:/prog8lib/cx16/syslib.p8:209 &byte r6sL = $000e - ; source: library:/prog8lib/cx16/syslib.p8:210 &byte r7sL = $0010 - ; source: library:/prog8lib/cx16/syslib.p8:211 &byte r8sL = $0012 - ; source: library:/prog8lib/cx16/syslib.p8:212 &byte r9sL = $0014 - ; source: library:/prog8lib/cx16/syslib.p8:213 &byte r10sL = $0016 - ; source: library:/prog8lib/cx16/syslib.p8:214 &byte r11sL = $0018 - ; source: library:/prog8lib/cx16/syslib.p8:215 &byte r12sL = $001a - ; source: library:/prog8lib/cx16/syslib.p8:216 &byte r13sL = $001c - ; source: library:/prog8lib/cx16/syslib.p8:217 &byte r14sL = $001e - ; source: library:/prog8lib/cx16/syslib.p8:218 &byte r15sL = $0020 - ; source: library:/prog8lib/cx16/syslib.p8:220 &byte r0sH = $0003 - ; source: library:/prog8lib/cx16/syslib.p8:221 &byte r1sH = $0005 - ; source: library:/prog8lib/cx16/syslib.p8:222 &byte r2sH = $0007 - ; source: library:/prog8lib/cx16/syslib.p8:223 &byte r3sH = $0009 - ; source: library:/prog8lib/cx16/syslib.p8:224 &byte r4sH = $000b - ; source: library:/prog8lib/cx16/syslib.p8:225 &byte r5sH = $000d - ; source: library:/prog8lib/cx16/syslib.p8:226 &byte r6sH = $000f - ; source: library:/prog8lib/cx16/syslib.p8:227 &byte r7sH = $0011 - ; source: library:/prog8lib/cx16/syslib.p8:228 &byte r8sH = $0013 - ; source: library:/prog8lib/cx16/syslib.p8:229 &byte r9sH = $0015 - ; source: library:/prog8lib/cx16/syslib.p8:230 &byte r10sH = $0017 - ; source: library:/prog8lib/cx16/syslib.p8:231 &byte r11sH = $0019 - ; source: library:/prog8lib/cx16/syslib.p8:232 &byte r12sH = $001b - ; source: library:/prog8lib/cx16/syslib.p8:233 &byte r13sH = $001d - ; source: library:/prog8lib/cx16/syslib.p8:234 &byte r14sH = $001f - ; source: library:/prog8lib/cx16/syslib.p8:235 &byte r15sH = $0021 - ; source: library:/prog8lib/cx16/syslib.p8:239 const uword VERA_BASE = $9F20 - ; source: library:/prog8lib/cx16/syslib.p8:240 &ubyte VERA_ADDR_L = VERA_BASE + $0000 - ; source: library:/prog8lib/cx16/syslib.p8:241 &ubyte VERA_ADDR_M = VERA_BASE + $0001 - ; source: library:/prog8lib/cx16/syslib.p8:242 &uword VERA_ADDR = VERA_BASE + $0000 ; still need to do the _H separately - ; source: library:/prog8lib/cx16/syslib.p8:243 &ubyte VERA_ADDR_H = VERA_BASE + $0002 - ; source: library:/prog8lib/cx16/syslib.p8:244 &ubyte VERA_DATA0 = VERA_BASE + $0003 - ; source: library:/prog8lib/cx16/syslib.p8:245 &ubyte VERA_DATA1 = VERA_BASE + $0004 - ; source: library:/prog8lib/cx16/syslib.p8:246 &ubyte VERA_CTRL = VERA_BASE + $0005 - ; source: library:/prog8lib/cx16/syslib.p8:247 &ubyte VERA_IEN = VERA_BASE + $0006 - ; source: library:/prog8lib/cx16/syslib.p8:248 &ubyte VERA_ISR = VERA_BASE + $0007 - ; source: library:/prog8lib/cx16/syslib.p8:249 &ubyte VERA_IRQLINE_L = VERA_BASE + $0008 ; write only - ; source: library:/prog8lib/cx16/syslib.p8:250 &ubyte VERA_SCANLINE_L = VERA_BASE + $0008 ; read only - ; source: library:/prog8lib/cx16/syslib.p8:251 &ubyte VERA_DC_VIDEO = VERA_BASE + $0009 ; DCSEL= 0 - ; source: library:/prog8lib/cx16/syslib.p8:252 &ubyte VERA_DC_HSCALE = VERA_BASE + $000A ; DCSEL= 0 - ; source: library:/prog8lib/cx16/syslib.p8:253 &ubyte VERA_DC_VSCALE = VERA_BASE + $000B ; DCSEL= 0 - ; source: library:/prog8lib/cx16/syslib.p8:254 &ubyte VERA_DC_BORDER = VERA_BASE + $000C ; DCSEL= 0 - ; source: library:/prog8lib/cx16/syslib.p8:255 &ubyte VERA_DC_HSTART = VERA_BASE + $0009 ; DCSEL= 1 - ; source: library:/prog8lib/cx16/syslib.p8:256 &ubyte VERA_DC_HSTOP = VERA_BASE + $000A ; DCSEL= 1 - ; source: library:/prog8lib/cx16/syslib.p8:257 &ubyte VERA_DC_VSTART = VERA_BASE + $000B ; DCSEL= 1 - ; source: library:/prog8lib/cx16/syslib.p8:258 &ubyte VERA_DC_VSTOP = VERA_BASE + $000C ; DCSEL= 1 - ; source: library:/prog8lib/cx16/syslib.p8:259 &ubyte VERA_DC_VER0 = VERA_BASE + $0009 ; DCSEL=63 - ; source: library:/prog8lib/cx16/syslib.p8:260 &ubyte VERA_DC_VER1 = VERA_BASE + $000A ; DCSEL=63 - ; source: library:/prog8lib/cx16/syslib.p8:261 &ubyte VERA_DC_VER2 = VERA_BASE + $000B ; DCSEL=63 - ; source: library:/prog8lib/cx16/syslib.p8:262 &ubyte VERA_DC_VER3 = VERA_BASE + $000C ; DCSEL=63 - ; source: library:/prog8lib/cx16/syslib.p8:263 &ubyte VERA_L0_CONFIG = VERA_BASE + $000D - ; source: library:/prog8lib/cx16/syslib.p8:264 &ubyte VERA_L0_MAPBASE = VERA_BASE + $000E - ; source: library:/prog8lib/cx16/syslib.p8:265 &ubyte VERA_L0_TILEBASE = VERA_BASE + $000F - ; source: library:/prog8lib/cx16/syslib.p8:266 &ubyte VERA_L0_HSCROLL_L = VERA_BASE + $0010 - ; source: library:/prog8lib/cx16/syslib.p8:267 &ubyte VERA_L0_HSCROLL_H = VERA_BASE + $0011 - ; source: library:/prog8lib/cx16/syslib.p8:268 &uword VERA_L0_HSCROLL = VERA_BASE + $0010 - ; source: library:/prog8lib/cx16/syslib.p8:269 &ubyte VERA_L0_VSCROLL_L = VERA_BASE + $0012 - ; source: library:/prog8lib/cx16/syslib.p8:270 &ubyte VERA_L0_VSCROLL_H = VERA_BASE + $0013 - ; source: library:/prog8lib/cx16/syslib.p8:271 &uword VERA_L0_VSCROLL = VERA_BASE + $0012 - ; source: library:/prog8lib/cx16/syslib.p8:272 &ubyte VERA_L1_CONFIG = VERA_BASE + $0014 - ; source: library:/prog8lib/cx16/syslib.p8:273 &ubyte VERA_L1_MAPBASE = VERA_BASE + $0015 - ; source: library:/prog8lib/cx16/syslib.p8:274 &ubyte VERA_L1_TILEBASE = VERA_BASE + $0016 - ; source: library:/prog8lib/cx16/syslib.p8:275 &ubyte VERA_L1_HSCROLL_L = VERA_BASE + $0017 - ; source: library:/prog8lib/cx16/syslib.p8:276 &ubyte VERA_L1_HSCROLL_H = VERA_BASE + $0018 - ; source: library:/prog8lib/cx16/syslib.p8:277 &uword VERA_L1_HSCROLL = VERA_BASE + $0017 - ; source: library:/prog8lib/cx16/syslib.p8:278 &ubyte VERA_L1_VSCROLL_L = VERA_BASE + $0019 - ; source: library:/prog8lib/cx16/syslib.p8:279 &ubyte VERA_L1_VSCROLL_H = VERA_BASE + $001A - ; source: library:/prog8lib/cx16/syslib.p8:280 &uword VERA_L1_VSCROLL = VERA_BASE + $0019 - ; source: library:/prog8lib/cx16/syslib.p8:281 &ubyte VERA_AUDIO_CTRL = VERA_BASE + $001B - ; source: library:/prog8lib/cx16/syslib.p8:282 &ubyte VERA_AUDIO_RATE = VERA_BASE + $001C - ; source: library:/prog8lib/cx16/syslib.p8:283 &ubyte VERA_AUDIO_DATA = VERA_BASE + $001D - ; source: library:/prog8lib/cx16/syslib.p8:284 &ubyte VERA_SPI_DATA = VERA_BASE + $001E - ; source: library:/prog8lib/cx16/syslib.p8:285 &ubyte VERA_SPI_CTRL = VERA_BASE + $001F - ; source: library:/prog8lib/cx16/syslib.p8:288 &ubyte VERA_FX_CTRL = VERA_BASE + $0009 - ; source: library:/prog8lib/cx16/syslib.p8:289 &ubyte VERA_FX_TILEBASE = VERA_BASE + $000a - ; source: library:/prog8lib/cx16/syslib.p8:290 &ubyte VERA_FX_MAPBASE = VERA_BASE + $000b - ; source: library:/prog8lib/cx16/syslib.p8:291 &ubyte VERA_FX_MULT = VERA_BASE + $000c - ; source: library:/prog8lib/cx16/syslib.p8:292 &ubyte VERA_FX_X_INCR_L = VERA_BASE + $0009 - ; source: library:/prog8lib/cx16/syslib.p8:293 &ubyte VERA_FX_X_INCR_H = VERA_BASE + $000a - ; source: library:/prog8lib/cx16/syslib.p8:294 &uword VERA_FX_X_INCR = VERA_BASE + $0009 - ; source: library:/prog8lib/cx16/syslib.p8:295 &ubyte VERA_FX_Y_INCR_L = VERA_BASE + $000b - ; source: library:/prog8lib/cx16/syslib.p8:296 &ubyte VERA_FX_Y_INCR_H = VERA_BASE + $000c - ; source: library:/prog8lib/cx16/syslib.p8:297 &uword VERA_FX_Y_INCR = VERA_BASE + $000b - ; source: library:/prog8lib/cx16/syslib.p8:298 &ubyte VERA_FX_X_POS_L = VERA_BASE + $0009 - ; source: library:/prog8lib/cx16/syslib.p8:299 &ubyte VERA_FX_X_POS_H = VERA_BASE + $000a - ; source: library:/prog8lib/cx16/syslib.p8:300 &uword VERA_FX_X_POS = VERA_BASE + $0009 - ; source: library:/prog8lib/cx16/syslib.p8:301 &ubyte VERA_FX_Y_POS_L = VERA_BASE + $000b - ; source: library:/prog8lib/cx16/syslib.p8:302 &ubyte VERA_FX_Y_POS_H = VERA_BASE + $000c - ; source: library:/prog8lib/cx16/syslib.p8:303 &uword VERA_FX_Y_POS = VERA_BASE + $000b - ; source: library:/prog8lib/cx16/syslib.p8:304 &ubyte VERA_FX_X_POS_S = VERA_BASE + $0009 - ; source: library:/prog8lib/cx16/syslib.p8:305 &ubyte VERA_FX_Y_POS_S = VERA_BASE + $000a - ; source: library:/prog8lib/cx16/syslib.p8:306 &ubyte VERA_FX_POLY_FILL_L = VERA_BASE + $000b - ; source: library:/prog8lib/cx16/syslib.p8:307 &ubyte VERA_FX_POLY_FILL_H = VERA_BASE + $000c - ; source: library:/prog8lib/cx16/syslib.p8:308 &uword VERA_FX_POLY_FILL = VERA_BASE + $000b - ; source: library:/prog8lib/cx16/syslib.p8:309 &ubyte VERA_FX_CACHE_L = VERA_BASE + $0009 - ; source: library:/prog8lib/cx16/syslib.p8:310 &ubyte VERA_FX_CACHE_M = VERA_BASE + $000a - ; source: library:/prog8lib/cx16/syslib.p8:311 &ubyte VERA_FX_CACHE_H = VERA_BASE + $000b - ; source: library:/prog8lib/cx16/syslib.p8:312 &ubyte VERA_FX_CACHE_U = VERA_BASE + $000c - ; source: library:/prog8lib/cx16/syslib.p8:313 &ubyte VERA_FX_ACCUM = VERA_BASE + $000a - ; source: library:/prog8lib/cx16/syslib.p8:314 &ubyte VERA_FX_ACCUM_RESET = VERA_BASE + $0009 - ; source: library:/prog8lib/cx16/syslib.p8:323 const uword VIA1_BASE = $9f00 ;VIA 6522 #1 - ; source: library:/prog8lib/cx16/syslib.p8:324 &ubyte via1prb = VIA1_BASE + 0 - ; source: library:/prog8lib/cx16/syslib.p8:325 &ubyte via1pra = VIA1_BASE + 1 - ; source: library:/prog8lib/cx16/syslib.p8:326 &ubyte via1ddrb = VIA1_BASE + 2 - ; source: library:/prog8lib/cx16/syslib.p8:327 &ubyte via1ddra = VIA1_BASE + 3 - ; source: library:/prog8lib/cx16/syslib.p8:328 &ubyte via1t1l = VIA1_BASE + 4 - ; source: library:/prog8lib/cx16/syslib.p8:329 &ubyte via1t1h = VIA1_BASE + 5 - ; source: library:/prog8lib/cx16/syslib.p8:330 &ubyte via1t1ll = VIA1_BASE + 6 - ; source: library:/prog8lib/cx16/syslib.p8:331 &ubyte via1t1lh = VIA1_BASE + 7 - ; source: library:/prog8lib/cx16/syslib.p8:332 &ubyte via1t2l = VIA1_BASE + 8 - ; source: library:/prog8lib/cx16/syslib.p8:333 &ubyte via1t2h = VIA1_BASE + 9 - ; source: library:/prog8lib/cx16/syslib.p8:334 &ubyte via1sr = VIA1_BASE + 10 - ; source: library:/prog8lib/cx16/syslib.p8:335 &ubyte via1acr = VIA1_BASE + 11 - ; source: library:/prog8lib/cx16/syslib.p8:336 &ubyte via1pcr = VIA1_BASE + 12 - ; source: library:/prog8lib/cx16/syslib.p8:337 &ubyte via1ifr = VIA1_BASE + 13 - ; source: library:/prog8lib/cx16/syslib.p8:338 &ubyte via1ier = VIA1_BASE + 14 - ; source: library:/prog8lib/cx16/syslib.p8:339 &ubyte via1ora = VIA1_BASE + 15 - ; source: library:/prog8lib/cx16/syslib.p8:341 const uword VIA2_BASE = $9f10 ;VIA 6522 #2 - ; source: library:/prog8lib/cx16/syslib.p8:342 &ubyte via2prb = VIA2_BASE + 0 - ; source: library:/prog8lib/cx16/syslib.p8:343 &ubyte via2pra = VIA2_BASE + 1 - ; source: library:/prog8lib/cx16/syslib.p8:344 &ubyte via2ddrb = VIA2_BASE + 2 - ; source: library:/prog8lib/cx16/syslib.p8:345 &ubyte via2ddra = VIA2_BASE + 3 - ; source: library:/prog8lib/cx16/syslib.p8:346 &ubyte via2t1l = VIA2_BASE + 4 - ; source: library:/prog8lib/cx16/syslib.p8:347 &ubyte via2t1h = VIA2_BASE + 5 - ; source: library:/prog8lib/cx16/syslib.p8:348 &ubyte via2t1ll = VIA2_BASE + 6 - ; source: library:/prog8lib/cx16/syslib.p8:349 &ubyte via2t1lh = VIA2_BASE + 7 - ; source: library:/prog8lib/cx16/syslib.p8:350 &ubyte via2t2l = VIA2_BASE + 8 - ; source: library:/prog8lib/cx16/syslib.p8:351 &ubyte via2t2h = VIA2_BASE + 9 - ; source: library:/prog8lib/cx16/syslib.p8:352 &ubyte via2sr = VIA2_BASE + 10 - ; source: library:/prog8lib/cx16/syslib.p8:353 &ubyte via2acr = VIA2_BASE + 11 - ; source: library:/prog8lib/cx16/syslib.p8:354 &ubyte via2pcr = VIA2_BASE + 12 - ; source: library:/prog8lib/cx16/syslib.p8:355 &ubyte via2ifr = VIA2_BASE + 13 - ; source: library:/prog8lib/cx16/syslib.p8:356 &ubyte via2ier = VIA2_BASE + 14 - ; source: library:/prog8lib/cx16/syslib.p8:357 &ubyte via2ora = VIA2_BASE + 15 - ; source: library:/prog8lib/cx16/syslib.p8:360 &ubyte YM_ADDRESS = $9f40 - ; source: library:/prog8lib/cx16/syslib.p8:361 &ubyte YM_DATA = $9f41 - ; source: library:/prog8lib/cx16/syslib.p8:363 const uword extdev = $9f60 - ; source: library:/prog8lib/cx16/syslib.p8:95 cx16 { - ; source: library:/prog8lib/cx16/syslib.p8:370 romsub $ff4a = CLOSE_ALL(ubyte device @A) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:371 romsub $ff59 = LKUPLA(ubyte la @A) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:372 romsub $ff5c = LKUPSA(ubyte sa @Y) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:373 romsub $ff5f = screen_mode(ubyte mode @A, bool getCurrent @Pc) clobbers(X, Y) -> ubyte @A, bool @Pc ; note: X,Y size result is not supported, use SCREEN or get_screen_mode routine for that - - ; source: library:/prog8lib/cx16/syslib.p8:374 romsub $ff62 = screen_set_charset(ubyte charset @A, uword charsetptr @XY) clobbers(A,X,Y) ; incompatible with C128 dlchr() - - ; source: library:/prog8lib/cx16/syslib.p8:376 romsub $ff6e = JSRFAR() ; following word = address to call, byte after that=rom/ram bank it is in - - ; source: library:/prog8lib/cx16/syslib.p8:377 romsub $ff74 = fetch(ubyte bank @X, ubyte index @Y) clobbers(X) -> ubyte @A - - ; source: library:/prog8lib/cx16/syslib.p8:378 romsub $ff77 = stash(ubyte data @A, ubyte bank @X, ubyte index @Y) clobbers(X) - - ; source: library:/prog8lib/cx16/syslib.p8:379 romsub $ff7d = PRIMM() - - ; source: library:/prog8lib/cx16/syslib.p8:384 romsub $ff20 = GRAPH_init(uword vectors @R0) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:385 romsub $ff23 = GRAPH_clear() clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:386 romsub $ff26 = GRAPH_set_window(uword x @R0, uword y @R1, uword width @R2, uword height @R3) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:387 romsub $ff29 = GRAPH_set_colors(ubyte stroke @A, ubyte fill @X, ubyte background @Y) clobbers (A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:388 romsub $ff2c = GRAPH_draw_line(uword x1 @R0, uword y1 @R1, uword x2 @R2, uword y2 @R3) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:389 romsub $ff2f = GRAPH_draw_rect(uword x @R0, uword y @R1, uword width @R2, uword height @R3, uword cornerradius @R4, bool fill @Pc) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:390 romsub $ff32 = GRAPH_move_rect(uword sx @R0, uword sy @R1, uword tx @R2, uword ty @R3, uword width @R4, uword height @R5) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:391 romsub $ff35 = GRAPH_draw_oval(uword x @R0, uword y @R1, uword width @R2, uword height @R3, bool fill @Pc) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:392 romsub $ff38 = GRAPH_draw_image(uword x @R0, uword y @R1, uword ptr @R2, uword width @R3, uword height @R4) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:393 romsub $ff3b = GRAPH_set_font(uword fontptr @R0) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:394 romsub $ff3e = GRAPH_get_char_size(ubyte baseline @A, ubyte width @X, ubyte height_or_style @Y, bool is_control @Pc) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:395 romsub $ff41 = GRAPH_put_char(uword x @R0, uword y @R1, ubyte character @A) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:396 romsub $ff41 = GRAPH_put_next_char(ubyte character @A) clobbers(A,X,Y) ; alias for the routine above that doesn't reset the position of the initial character - - ; source: library:/prog8lib/cx16/syslib.p8:399 romsub $fef6 = FB_init() clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:400 romsub $fef9 = FB_get_info() clobbers(X,Y) -> byte @A, uword @R0, uword @R1 ; width=r0, height=r1 - - ; source: library:/prog8lib/cx16/syslib.p8:401 romsub $fefc = FB_set_palette(uword pointer @R0, ubyte index @A, ubyte colorcount @X) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:402 romsub $feff = FB_cursor_position(uword x @R0, uword y @R1) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:403 romsub $ff02 = FB_cursor_next_line(uword x @R0) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:404 romsub $ff05 = FB_get_pixel() clobbers(X,Y) -> ubyte @A - - ; source: library:/prog8lib/cx16/syslib.p8:405 romsub $ff08 = FB_get_pixels(uword pointer @R0, uword count @R1) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:406 romsub $ff0b = FB_set_pixel(ubyte color @A) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:407 romsub $ff0e = FB_set_pixels(uword pointer @R0, uword count @R1) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:408 romsub $ff11 = FB_set_8_pixels(ubyte pattern @A, ubyte color @X) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:409 romsub $ff14 = FB_set_8_pixels_opaque(ubyte pattern @R0, ubyte mask @A, ubyte color1 @X, ubyte color2 @Y) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:410 romsub $ff17 = FB_fill_pixels(uword count @R0, uword pstep @R1, ubyte color @A) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:411 romsub $ff1a = FB_filter_pixels(uword pointer @ R0, uword count @R1) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:412 romsub $ff1d = FB_move_pixels(uword sx @R0, uword sy @R1, uword tx @R2, uword ty @R3, uword count @R4) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:415 romsub $FEBA = BSAVE(ubyte zp_startaddr @ A, uword endaddr @ XY) clobbers (X, Y) -> bool @ Pc, ubyte @ A ; like cbm.SAVE, but omits the 2-byte prg header - - ; source: library:/prog8lib/cx16/syslib.p8:416 romsub $fec6 = i2c_read_byte(ubyte device @X, ubyte offset @Y) clobbers (X,Y) -> ubyte @A, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:417 romsub $fec9 = i2c_write_byte(ubyte device @X, ubyte offset @Y, ubyte data @A) clobbers (A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:418 romsub $fef0 = sprite_set_image(uword pixels @R0, uword mask @R1, ubyte bpp @R2, ubyte number @A, ubyte width @X, ubyte height @Y, bool apply_mask @Pc) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:419 romsub $fef3 = sprite_set_position(uword x @R0, uword y @R1, ubyte number @A) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:420 romsub $fee4 = memory_fill(uword address @R0, uword num_bytes @R1, ubyte value @A) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:421 romsub $fee7 = memory_copy(uword source @R0, uword target @R1, uword num_bytes @R2) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:422 romsub $feea = memory_crc(uword address @R0, uword num_bytes @R1) clobbers(A,X,Y) -> uword @R2 - - ; source: library:/prog8lib/cx16/syslib.p8:423 romsub $feed = memory_decompress(uword input @R0, uword output @R1) clobbers(A,X,Y) -> uword @R1 ; last address +1 is result in R1 - - ; source: library:/prog8lib/cx16/syslib.p8:424 romsub $fedb = console_init(uword x @R0, uword y @R1, uword width @R2, uword height @R3) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:425 romsub $fede = console_put_char(ubyte character @A, bool wrapping @Pc) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:426 romsub $fee1 = console_get_char() clobbers(X,Y) -> ubyte @A - - ; source: library:/prog8lib/cx16/syslib.p8:427 romsub $fed8 = console_put_image(uword pointer @R0, uword width @R1, uword height @R2) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:428 romsub $fed5 = console_set_paging_message(uword msgptr @R0) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:429 romsub $fecf = entropy_get() -> ubyte @A, ubyte @X, ubyte @Y - - ; source: library:/prog8lib/cx16/syslib.p8:430 romsub $fecc = monitor() clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:432 romsub $ff44 = MACPTR(ubyte length @A, uword buffer @XY, bool dontAdvance @Pc) clobbers(A) -> bool @Pc, uword @XY - - ; source: library:/prog8lib/cx16/syslib.p8:433 romsub $feb1 = MCIOUT(ubyte length @A, uword buffer @XY, bool dontAdvance @Pc) clobbers(A) -> bool @Pc, uword @XY - - ; source: library:/prog8lib/cx16/syslib.p8:434 romsub $ff47 = enter_basic(bool cold_or_warm @Pc) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:435 romsub $ff4d = clock_set_date_time(uword yearmonth @R0, uword dayhours @R1, uword minsecs @R2, uword jiffiesweekday @R3) clobbers(A, X, Y) - - ; source: library:/prog8lib/cx16/syslib.p8:436 romsub $ff50 = clock_get_date_time() clobbers(A, X, Y) -> uword @R0, uword @R1, uword @R2, uword @R3 ; result registers see clock_set_date_time() - - ; source: library:/prog8lib/cx16/syslib.p8:440 romsub $febd = kbdbuf_peek() -> ubyte @A, ubyte @X ; key in A, queue length in X - - ; source: library:/prog8lib/cx16/syslib.p8:441 romsub $febd = kbdbuf_peek2() -> uword @AX ; alternative to above to not have the hassle to deal with multiple return values - - ; source: library:/prog8lib/cx16/syslib.p8:442 romsub $fec0 = kbdbuf_get_modifiers() -> ubyte @A - - ; source: library:/prog8lib/cx16/syslib.p8:443 romsub $fec3 = kbdbuf_put(ubyte key @A) clobbers(X) - - ; source: library:/prog8lib/cx16/syslib.p8:444 romsub $fed2 = keymap(uword identifier @XY, bool read @Pc) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:445 romsub $ff68 = mouse_config(byte shape @A, ubyte resX @X, ubyte resY @Y) clobbers (A, X, Y) - - ; source: library:/prog8lib/cx16/syslib.p8:446 romsub $ff6b = mouse_get(ubyte zpdataptr @X) -> ubyte @A - - ; source: library:/prog8lib/cx16/syslib.p8:447 romsub $ff71 = mouse_scan() clobbers(A, X, Y) - - ; source: library:/prog8lib/cx16/syslib.p8:448 romsub $ff53 = joystick_scan() clobbers(A, X, Y) - - ; source: library:/prog8lib/cx16/syslib.p8:449 romsub $ff56 = joystick_get(ubyte joynr @A) -> ubyte @A, ubyte @X, ubyte @Y - - ; source: library:/prog8lib/cx16/syslib.p8:450 romsub $ff56 = joystick_get2(ubyte joynr @A) clobbers(Y) -> uword @AX ; alternative to above to not have the hassle to deal with multiple return values - - ; source: library:/prog8lib/cx16/syslib.p8:453 romsub $C000 = x16edit_default() clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:454 romsub $C003 = x16edit_loadfile(ubyte firstbank @X, ubyte lastbank @Y, str filename @R0, ubyte filenameLength @R1) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:455 romsub $C006 = x16edit_loadfile_options(ubyte firstbank @X, ubyte lastbank @Y, str filename @R0, - - ; source: library:/prog8lib/cx16/syslib.p8:460 romsub $C09F = audio_init() clobbers(A,X,Y) -> bool @Pc ; (re)initialize both vera PSG and YM audio chips - - ; source: library:/prog8lib/cx16/syslib.p8:461 romsub $C000 = bas_fmfreq(ubyte channel @A, uword freq @XY, bool noretrigger @Pc) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:462 romsub $C003 = bas_fmnote(ubyte channel @A, ubyte note @X, ubyte fracsemitone @Y, bool noretrigger @Pc) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:463 romsub $C006 = bas_fmplaystring(ubyte length @A, str string @XY) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:464 romsub $C009 = bas_fmvib(ubyte speed @A, ubyte depth @X) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:465 romsub $C00C = bas_playstringvoice(ubyte channel @A) clobbers(Y) - - ; source: library:/prog8lib/cx16/syslib.p8:466 romsub $C00F = bas_psgfreq(ubyte voice @A, uword freq @XY) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:467 romsub $C012 = bas_psgnote(ubyte voice @A, ubyte note @X, ubyte fracsemitone @Y) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:468 romsub $C015 = bas_psgwav(ubyte voice @A, ubyte waveform @X) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:469 romsub $C018 = bas_psgplaystring(ubyte length @A, str string @XY) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:470 romsub $C08D = bas_fmchordstring(ubyte length @A, str string @XY) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:471 romsub $C090 = bas_psgchordstring(ubyte length @A, str string @XY) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:472 romsub $C01B = notecon_bas2fm(ubyte note @X) clobbers(A) -> ubyte @X, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:473 romsub $C01E = notecon_bas2midi(ubyte note @X) clobbers(A) -> ubyte @X, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:474 romsub $C021 = notecon_bas2psg(ubyte note @X, ubyte fracsemitone @Y) clobbers(A) -> uword @XY, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:475 romsub $C024 = notecon_fm2bas(ubyte note @X) clobbers(A) -> ubyte @X, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:476 romsub $C027 = notecon_fm2midi(ubyte note @X) clobbers(A) -> ubyte @X, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:477 romsub $C02A = notecon_fm2psg(ubyte note @X, ubyte fracsemitone @Y) clobbers(A) -> uword @XY, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:478 romsub $C02D = notecon_freq2bas(uword freqHz @XY) clobbers(A) -> ubyte @X, ubyte @Y, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:479 romsub $C030 = notecon_freq2fm(uword freqHz @XY) clobbers(A) -> ubyte @X, ubyte @Y, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:480 romsub $C033 = notecon_freq2midi(uword freqHz @XY) clobbers(A) -> ubyte @X, ubyte @Y, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:481 romsub $C036 = notecon_freq2psg(uword freqHz @XY) clobbers(A) -> uword @XY, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:482 romsub $C039 = notecon_midi2bas(ubyte note @X) clobbers(A) -> ubyte @X, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:483 romsub $C03C = notecon_midi2fm(ubyte note @X) clobbers(A) -> ubyte @X, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:484 romsub $C03F = notecon_midi2psg(ubyte note @X, ubyte fracsemitone @Y) clobbers(A) -> uword @XY, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:485 romsub $C042 = notecon_psg2bas(uword freq @XY) clobbers(A) -> ubyte @X, ubyte @Y, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:486 romsub $C045 = notecon_psg2fm(uword freq @XY) clobbers(A) -> ubyte @X, ubyte @Y, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:487 romsub $C048 = notecon_psg2midi(uword freq @XY) clobbers(A) -> ubyte @X, ubyte @Y, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:488 romsub $C04B = psg_init() clobbers(A,X,Y) ; (re)init Vera PSG - - ; source: library:/prog8lib/cx16/syslib.p8:489 romsub $C04E = psg_playfreq(ubyte voice @A, uword freq @XY) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:490 romsub $C051 = psg_read(ubyte offset @X, bool cookedVol @Pc) clobbers(Y) -> ubyte @A - - ; source: library:/prog8lib/cx16/syslib.p8:491 romsub $C054 = psg_setatten(ubyte voice @A, ubyte attenuation @X) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:492 romsub $C057 = psg_setfreq(ubyte voice @A, uword freq @XY) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:493 romsub $C05A = psg_setpan(ubyte voice @A, ubyte panning @X) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:494 romsub $C05D = psg_setvol(ubyte voice @A, ubyte volume @X) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:495 romsub $C060 = psg_write(ubyte value @A, ubyte offset @X) clobbers(Y) - - ; source: library:/prog8lib/cx16/syslib.p8:496 romsub $C0A2 = psg_write_fast(ubyte value @A, ubyte offset @X) clobbers(Y) - - ; source: library:/prog8lib/cx16/syslib.p8:497 romsub $C093 = psg_getatten(ubyte voice @A) clobbers(Y) -> ubyte @X - - ; source: library:/prog8lib/cx16/syslib.p8:498 romsub $C096 = psg_getpan(ubyte voice @A) clobbers(Y) -> ubyte @X - - ; source: library:/prog8lib/cx16/syslib.p8:499 romsub $C063 = ym_init() clobbers(A,X,Y) -> bool @Pc ; (re)init YM chip - - ; source: library:/prog8lib/cx16/syslib.p8:500 romsub $C066 = ym_loaddefpatches() clobbers(A,X,Y) -> bool @Pc ; load default YM patches - - ; source: library:/prog8lib/cx16/syslib.p8:501 romsub $C069 = ym_loadpatch(ubyte channel @A, uword patchOrAddress @XY, bool what @Pc) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/syslib.p8:502 romsub $C06C = ym_loadpatchlfn(ubyte channel @A, ubyte lfn @X) clobbers(X,Y) -> ubyte @A, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:503 romsub $C06F = ym_playdrum(ubyte channel @A, ubyte note @X) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:504 romsub $C072 = ym_playnote(ubyte channel @A, ubyte kc @X, ubyte kf @Y, bool notrigger @Pc) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:505 romsub $C075 = ym_setatten(ubyte channel @A, ubyte attenuation @X) clobbers(Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:506 romsub $C078 = ym_setdrum(ubyte channel @A, ubyte note @X) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:507 romsub $C07B = ym_setnote(ubyte channel @A, ubyte kc @X, ubyte kf @Y) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:508 romsub $C07E = ym_setpan(ubyte channel @A, ubyte panning @X) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:509 romsub $C081 = ym_read(ubyte register @X, bool cooked @Pc) clobbers(Y) -> ubyte @A, bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:510 romsub $C084 = ym_release(ubyte channel @A) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:511 romsub $C087 = ym_trigger(ubyte channel @A, bool noRelease @Pc) clobbers(A,X,Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:512 romsub $C08A = ym_write(ubyte value @A, ubyte register @X) clobbers(Y) -> bool @Pc - - ; source: library:/prog8lib/cx16/syslib.p8:513 romsub $C099 = ym_getatten(ubyte channel @A) clobbers(Y) -> ubyte @X - - ; source: library:/prog8lib/cx16/syslib.p8:514 romsub $C09C = ym_getpan(ubyte channel @A) clobbers(Y) -> ubyte @X - - ; source: library:/prog8lib/cx16/syslib.p8:515 romsub $C0A5 = ym_get_chip_type() clobbers(X) -> ubyte @A - - ; source: library:/prog8lib/cx16/syslib.p8:518 asmsub set_screen_mode(ubyte mode @A) clobbers(A,X,Y) -> bool @Pc { - -set_screen_mode .proc - ; source: library:/prog8lib/cx16/syslib.p8:520 %asm {{ - clc - jmp screen_mode - .pend - ; source: library:/prog8lib/cx16/syslib.p8:526 asmsub get_screen_mode() -> byte @A, byte @X, byte @Y { - -get_screen_mode .proc - ; source: library:/prog8lib/cx16/syslib.p8:531 %asm {{ - sec - jmp screen_mode - .pend - ; source: library:/prog8lib/cx16/syslib.p8:537 asmsub kbdbuf_clear() { - -kbdbuf_clear .proc - ; source: library:/prog8lib/cx16/syslib.p8:539 %asm {{ -- jsr cbm.GETIN - bne - - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:546 asmsub mouse_config2(byte shape @A) clobbers (A, X, Y) { - -mouse_config2 .proc - ; source: library:/prog8lib/cx16/syslib.p8:548 %asm {{ - pha ; save shape - sec - jsr cx16.screen_mode ; set current screen mode and res in A, X, Y - pla ; get shape back - jmp cx16.mouse_config - .pend - ; source: library:/prog8lib/cx16/syslib.p8:557 asmsub mouse_pos() clobbers(X) -> ubyte @A { - -mouse_pos .proc - ; source: library:/prog8lib/cx16/syslib.p8:560 %asm {{ - ldx #cx16.r0 - jmp cx16.mouse_get - .pend - ; source: library:/prog8lib/cx16/syslib.p8:572 inline asmsub rombank(ubyte bank @A) { - ; source: library:/prog8lib/cx16/syslib.p8:579 inline asmsub rambank(ubyte bank @A) { - ; source: library:/prog8lib/cx16/syslib.p8:586 inline asmsub getrombank() -> ubyte @A { - ; source: library:/prog8lib/cx16/syslib.p8:593 inline asmsub getrambank() -> ubyte @A { - ; source: library:/prog8lib/cx16/syslib.p8:600 asmsub numbanks() clobbers(X) -> uword @AY { - -numbanks .proc - ; source: library:/prog8lib/cx16/syslib.p8:607 %asm {{ - sec - jsr cbm.MEMTOP - ldy #0 - cmp #0 - bne + - iny -+ rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:618 asmsub vpeek(ubyte bank @A, uword address @XY) -> ubyte @A { - -vpeek .proc - ; source: library:/prog8lib/cx16/syslib.p8:621 %asm {{ - stz cx16.VERA_CTRL - sta cx16.VERA_ADDR_H - sty cx16.VERA_ADDR_M - stx cx16.VERA_ADDR_L - lda cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:631 asmsub vaddr(ubyte bank @A, uword address @R0, ubyte addrsel @R1, byte autoIncrOrDecrByOne @Y) clobbers(A) { - -vaddr .proc - ; source: library:/prog8lib/cx16/syslib.p8:635 %asm {{ - pha - lda cx16.r1 - and #1 - sta cx16.VERA_CTRL - lda cx16.r0 - sta cx16.VERA_ADDR_L - lda cx16.r0+1 - sta cx16.VERA_ADDR_M - pla - cpy #0 - bmi ++ - beq + - ora #%00010000 -+ sta cx16.VERA_ADDR_H - rts -+ ora #%00011000 - sta cx16.VERA_ADDR_H - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:657 asmsub vaddr_clone(ubyte port @A) clobbers (A,X,Y) { - -vaddr_clone .proc - ; source: library:/prog8lib/cx16/syslib.p8:659 %asm {{ - sta VERA_CTRL - ldx VERA_ADDR_L - ldy VERA_ADDR_H - phy - ldy VERA_ADDR_M - eor #1 - sta VERA_CTRL - stx VERA_ADDR_L - sty VERA_ADDR_M - ply - sty VERA_ADDR_H - eor #1 - sta VERA_CTRL - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:677 asmsub vaddr_autoincr(ubyte bank @A, uword address @R0, ubyte addrsel @R1, uword autoIncrAmount @R2) clobbers(A,Y) { - -vaddr_autoincr .proc - ; source: library:/prog8lib/cx16/syslib.p8:681 %asm {{ - jsr _setup - lda cx16.r2H - ora cx16.r2L - beq + - jsr _determine_incr_bits -+ ora P8ZP_SCRATCH_REG - sta cx16.VERA_ADDR_H - rts - -_setup sta P8ZP_SCRATCH_REG - lda cx16.r1 - and #1 - sta cx16.VERA_CTRL - lda cx16.r0 - sta cx16.VERA_ADDR_L - lda cx16.r0+1 - sta cx16.VERA_ADDR_M - rts - -_determine_incr_bits - lda cx16.r2H - bne _large - lda cx16.r2L - ldy #13 -- cmp _strides_lsb,y - beq + - dey - bpl - -+ tya - asl a - asl a - asl a - asl a - rts -_large ora cx16.r2L - cmp #1 ; 256 - bne + - lda #9<<4 - rts -+ cmp #2 ; 512 - bne + - lda #10<<4 - rts -+ cmp #65 ; 320 - bne + - lda #14<<4 - rts -+ cmp #130 ; 640 - bne + - lda #15<<4 - rts -+ lda #0 - rts -_strides_lsb .byte 0,1,2,4,8,16,32,64,128,255,255,40,80,160,255,255 - .pend - ; source: library:/prog8lib/cx16/syslib.p8:739 asmsub vaddr_autodecr(ubyte bank @A, uword address @R0, ubyte addrsel @R1, uword autoDecrAmount @R2) clobbers(A,Y) { - -vaddr_autodecr .proc - ; source: library:/prog8lib/cx16/syslib.p8:743 %asm {{ - jsr vaddr_autoincr._setup - lda cx16.r2H - ora cx16.r2L - beq + - jsr vaddr_autoincr._determine_incr_bits - ora #%00001000 ; autodecrement -+ ora P8ZP_SCRATCH_REG - sta cx16.VERA_ADDR_H - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:756 asmsub vpoke(ubyte bank @A, uword address @R0, ubyte value @Y) clobbers(A) { - -vpoke .proc - ; source: library:/prog8lib/cx16/syslib.p8:759 %asm {{ - stz cx16.VERA_CTRL - sta cx16.VERA_ADDR_H - lda cx16.r0 - sta cx16.VERA_ADDR_L - lda cx16.r0+1 - sta cx16.VERA_ADDR_M - sty cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:771 asmsub vpoke_or(ubyte bank @A, uword address @R0, ubyte value @Y) clobbers (A) { - -vpoke_or .proc - ; source: library:/prog8lib/cx16/syslib.p8:774 %asm {{ - stz cx16.VERA_CTRL - sta cx16.VERA_ADDR_H - lda cx16.r0 - sta cx16.VERA_ADDR_L - lda cx16.r0+1 - sta cx16.VERA_ADDR_M - tya - ora cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:788 asmsub vpoke_and(ubyte bank @A, uword address @R0, ubyte value @Y) clobbers(A) { - -vpoke_and .proc - ; source: library:/prog8lib/cx16/syslib.p8:791 %asm {{ - stz cx16.VERA_CTRL - sta cx16.VERA_ADDR_H - lda cx16.r0 - sta cx16.VERA_ADDR_L - lda cx16.r0+1 - sta cx16.VERA_ADDR_M - tya - and cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:805 asmsub vpoke_xor(ubyte bank @A, uword address @R0, ubyte value @Y) clobbers (A) { - -vpoke_xor .proc - ; source: library:/prog8lib/cx16/syslib.p8:808 %asm {{ - stz cx16.VERA_CTRL - sta cx16.VERA_ADDR_H - lda cx16.r0 - sta cx16.VERA_ADDR_L - lda cx16.r0+1 - sta cx16.VERA_ADDR_M - tya - eor cx16.VERA_DATA0 - sta cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:822 asmsub vpoke_mask(ubyte bank @A, uword address @R0, ubyte mask @X, ubyte value @Y) clobbers (A) { - -vpoke_mask .proc - ; source: library:/prog8lib/cx16/syslib.p8:825 %asm {{ - sty P8ZP_SCRATCH_B1 - stz cx16.VERA_CTRL - sta cx16.VERA_ADDR_H - lda cx16.r0 - sta cx16.VERA_ADDR_L - lda cx16.r0+1 - sta cx16.VERA_ADDR_M - txa - and cx16.VERA_DATA0 - ora P8ZP_SCRATCH_B1 - sta cx16.VERA_DATA0 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:841 asmsub save_virtual_registers() clobbers(A,Y) { - -save_virtual_registers .proc - ; source: library:/prog8lib/cx16/syslib.p8:842 %asm {{ - ldy #31 -- lda cx16.r0,y - sta _cx16_vreg_storage,y - dey - bpl - - rts - -_cx16_vreg_storage - .word 0,0,0,0,0,0,0,0 - .word 0,0,0,0,0,0,0,0 - .pend - ; source: library:/prog8lib/cx16/syslib.p8:856 asmsub restore_virtual_registers() clobbers(A,Y) { - -restore_virtual_registers .proc - ; source: library:/prog8lib/cx16/syslib.p8:857 %asm {{ - ldy #31 -- lda save_virtual_registers._cx16_vreg_storage,y - sta cx16.r0,y - dey - bpl - - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:868 asmsub save_vera_context() clobbers(A) { - -save_vera_context .proc - ; source: library:/prog8lib/cx16/syslib.p8:870 %asm {{ - ; note cannot store this on cpu hardware stack because this gets called as a subroutine - lda cx16.VERA_ADDR_L - sta _vera_storage - lda cx16.VERA_ADDR_M - sta _vera_storage+1 - lda cx16.VERA_ADDR_H - sta _vera_storage+2 - lda cx16.VERA_CTRL - sta _vera_storage+3 - eor #1 - sta _vera_storage+7 - sta cx16.VERA_CTRL - lda cx16.VERA_ADDR_L - sta _vera_storage+4 - lda cx16.VERA_ADDR_M - sta _vera_storage+5 - lda cx16.VERA_ADDR_H - sta _vera_storage+6 - rts -_vera_storage: .byte 0,0,0,0,0,0,0,0 - .pend - ; source: library:/prog8lib/cx16/syslib.p8:894 asmsub restore_vera_context() clobbers(A) { - -restore_vera_context .proc - ; source: library:/prog8lib/cx16/syslib.p8:896 %asm {{ - lda cx16.save_vera_context._vera_storage+7 - sta cx16.VERA_CTRL - lda cx16.save_vera_context._vera_storage+6 - sta cx16.VERA_ADDR_H - lda cx16.save_vera_context._vera_storage+5 - sta cx16.VERA_ADDR_M - lda cx16.save_vera_context._vera_storage+4 - sta cx16.VERA_ADDR_L - lda cx16.save_vera_context._vera_storage+3 - sta cx16.VERA_CTRL - lda cx16.save_vera_context._vera_storage+2 - sta cx16.VERA_ADDR_H - lda cx16.save_vera_context._vera_storage+1 - sta cx16.VERA_ADDR_M - lda cx16.save_vera_context._vera_storage+0 - sta cx16.VERA_ADDR_L - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:918 asmsub set_chrin_keyhandler(ubyte handlerbank @A, uword handler @XY) clobbers(A) { - -set_chrin_keyhandler .proc - ; source: library:/prog8lib/cx16/syslib.p8:921 %asm {{ - sei - sta P8ZP_SCRATCH_REG - lda $00 - pha - stz $00 - lda P8ZP_SCRATCH_REG - sta cx16.edkeybk - stx cx16.edkeyvec - sty cx16.edkeyvec+1 - pla - sta $00 - cli - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:938 asmsub get_chrin_keyhandler() -> ubyte @R0, uword @R1 { - -get_chrin_keyhandler .proc - ; source: library:/prog8lib/cx16/syslib.p8:940 %asm {{ - sei - lda $00 - pha - stz $00 - lda cx16.edkeybk - sta cx16.r0L - lda cx16.edkeyvec - ldy cx16.edkeyvec+1 - sta cx16.r1 - sty cx16.r1+1 - pla - sta $00 - cli - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:961 inline asmsub disable_irqs() clobbers(A) { - ; source: library:/prog8lib/cx16/syslib.p8:969 asmsub enable_irq_handlers(bool disable_all_irq_sources @Pc) clobbers(A,Y) { - -enable_irq_handlers .proc - ; source: library:/prog8lib/cx16/syslib.p8:974 %asm {{ - php - sei - bcc + - lda #%00001111 - trb cx16.VERA_IEN ; disable all IRQ sources -+ lda #<_irq_dispatcher - ldy #>_irq_dispatcher - sta cx16.CINV - sty cx16.CINV+1 - plp - rts - -_irq_dispatcher - ; order of handling: LINE, SPRCOL, AFLOW, VSYNC. - jsr sys.save_prog8_internals - cld - lda cx16.VERA_ISR - and cx16.VERA_IEN ; only consider the bits for sources that can actually raise the IRQ - - bit #2 - beq + -_mod_line_jump - jsr _default_line_handler ; modified - ldy #2 - sty cx16.VERA_ISR - bra _dispatch_end -+ - bit #4 - beq + -_mod_sprcol_jump - jsr _default_sprcol_handler ; modified - ldy #4 - sty cx16.VERA_ISR - bra _dispatch_end -+ - bit #8 - beq + -_mod_aflow_jump - jsr _default_aflow_handler ; modified - ; note: AFLOW can only be cleared by filling the audio FIFO for at least 1/4. Not via the ISR bit. - bra _dispatch_end -+ - bit #1 - beq + -_mod_vsync_jump - jsr _default_vsync_handler ; modified - cmp #0 - bne _dispatch_end - ldy #1 - sty cx16.VERA_ISR - bra _return_irq -+ - lda #0 -_dispatch_end - cmp #0 - beq _return_irq - jsr sys.restore_prog8_internals - jmp (sys.restore_irq._orig_irqvec) ; continue with normal kernal irq routine -_return_irq - jsr sys.restore_prog8_internals - ply - plx - pla - rti - -_default_vsync_handler - lda #1 - rts -_default_line_handler - lda #0 - rts -_default_sprcol_handler - lda #0 - rts -_default_aflow_handler - lda #0 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1055 asmsub set_vsync_irq_handler(uword address @AY) clobbers(A) { - -set_vsync_irq_handler .proc - ; source: library:/prog8lib/cx16/syslib.p8:1058 %asm {{ - php - sei - sta enable_irq_handlers._mod_vsync_jump+1 - sty enable_irq_handlers._mod_vsync_jump+2 - lda #1 - tsb cx16.VERA_IEN - plp - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1070 asmsub set_line_irq_handler(uword rasterline @R0, uword address @AY) clobbers(A,Y) { - -set_line_irq_handler .proc - ; source: library:/prog8lib/cx16/syslib.p8:1074 %asm {{ - php - sei - sta enable_irq_handlers._mod_line_jump+1 - sty enable_irq_handlers._mod_line_jump+2 - lda cx16.r0 - ldy cx16.r0+1 - jsr sys.set_rasterline - lda #2 - tsb cx16.VERA_IEN - plp - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1089 asmsub set_sprcol_irq_handler(uword address @AY) clobbers(A) { - -set_sprcol_irq_handler .proc - ; source: library:/prog8lib/cx16/syslib.p8:1092 %asm {{ - php - sei - sta enable_irq_handlers._mod_sprcol_jump+1 - sty enable_irq_handlers._mod_sprcol_jump+2 - lda #4 - tsb cx16.VERA_IEN - plp - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1104 asmsub set_aflow_irq_handler(uword address @AY) clobbers(A) { - -set_aflow_irq_handler .proc - ; source: library:/prog8lib/cx16/syslib.p8:1107 %asm {{ - php - sei - sta enable_irq_handlers._mod_aflow_jump+1 - sty enable_irq_handlers._mod_aflow_jump+2 - lda #8 - tsb cx16.VERA_IEN - plp - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1120 inline asmsub disable_irq_handlers() { - ; source: library:/prog8lib/cx16/syslib.p8:1159 asmsub cpu_is_65816() -> bool @A { - -cpu_is_65816 .proc - ; source: library:/prog8lib/cx16/syslib.p8:1161 %asm {{ - php - clv - .byte $e2, $ea ; SEP #$ea, should be interpreted as 2 NOPs by 6502. 65c816 will set the Overflow flag. - bvc + - lda #1 - plp - rts -+ lda #0 - plp - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1187 asmsub get_program_args(uword buffer @R0, ubyte buf_size @R1, bool binary @Pc) { - -get_program_args .proc - ; source: library:/prog8lib/cx16/syslib.p8:1191 %asm {{ - lda #0 - rol a - sta P8ZP_SCRATCH_REG - lda $00 - pha - stz $00 - stz P8ZP_SCRATCH_W1 - lda #$bf - sta P8ZP_SCRATCH_W1+1 - ldy #0 -- lda (P8ZP_SCRATCH_W1),y - sta (cx16.r0),y - beq + -_continue iny - cpy cx16.r1L ; max size? - bne - - beq ++ -+ lda P8ZP_SCRATCH_REG ; binary? - bne _continue -+ pla - sta $00 - rts - .pend - .pend - -; ---- block: 'sys' ---- -sys .proc - ; source: library:/prog8lib/cx16/syslib.p8:1218 sys { - target = $10 - - - ; source: library:/prog8lib/cx16/syslib.p8:1221 const ubyte target = 16 ; compilation target specifier. 64 = C64, 128 = C128, 16 = CommanderX16. - ; source: library:/prog8lib/cx16/syslib.p8:1218 sys { - ; source: library:/prog8lib/cx16/syslib.p8:1223 asmsub init_system() { - -init_system .proc - ; source: library:/prog8lib/cx16/syslib.p8:1226 %asm {{ - sei - lda #0 - tax - tay - jsr cx16.mouse_config ; disable mouse - cld - lda cx16.VERA_DC_VIDEO - and #%00000111 ; retain chroma + output mode - sta P8ZP_SCRATCH_REG - lda #$0a - sta $01 ; rom bank 10 (audio) - jsr cx16.audio_init ; silence - stz $01 ; rom bank 0 (kernal) - jsr cbm.IOINIT - jsr cbm.RESTOR - jsr cbm.CINT - lda cx16.VERA_DC_VIDEO - and #%11111000 - ora P8ZP_SCRATCH_REG - sta cx16.VERA_DC_VIDEO ; restore old output mode - lda #$90 ; black - jsr cbm.CHROUT - lda #1 - jsr cbm.CHROUT ; swap fg/bg - lda #$9e ; yellow - jsr cbm.CHROUT - lda #147 ; clear screen - jsr cbm.CHROUT - lda #8 ; disable charset case switch - jsr cbm.CHROUT - lda #PROG8_VARSHIGH_RAMBANK - sta $00 ; select ram bank - lda #0 - tax - tay - clc - clv - cli - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1269 asmsub init_system_phase2() { - -init_system_phase2 .proc - ; source: library:/prog8lib/cx16/syslib.p8:1270 %asm {{ - sei - lda cx16.CINV - sta restore_irq._orig_irqvec - lda cx16.CINV+1 - sta restore_irq._orig_irqvec+1 - lda #PROG8_VARSHIGH_RAMBANK - sta $00 ; select ram bank - cli - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1283 asmsub cleanup_at_exit() { - -cleanup_at_exit .proc - ; source: library:/prog8lib/cx16/syslib.p8:1285 %asm {{ - lda #1 - sta $00 ; ram bank 1 - lda #4 - sta $01 ; rom bank 4 (basic) - stz $2d ; hack to reset machine code monitor bank to 0 - jsr cbm.CLRCHN ; reset i/o channels -_exitcodeCarry = *+1 - lda #0 - lsr a -_exitcode = *+1 - lda #0 ; exit code possibly modified in exit() -_exitcodeX = *+1 - ldx #0 -_exitcodeY = *+1 - ldy #0 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1305 asmsub set_irq(uword handler @AY) clobbers(A) { - -set_irq .proc - ; source: library:/prog8lib/cx16/syslib.p8:1307 %asm {{ - sei - sta _modified+1 - sty _modified+2 - lda #<_irq_handler - sta cx16.CINV - lda #>_irq_handler - sta cx16.CINV+1 - lda #1 - tsb cx16.VERA_IEN ; enable the vsync irq - cli - rts - -_irq_handler - jsr sys.save_prog8_internals - cld -_modified - jsr $ffff ; modified - pha - jsr sys.restore_prog8_internals - pla - beq + - jmp (restore_irq._orig_irqvec) ; continue with normal kernal irq routine -+ lda #1 - sta cx16.VERA_ISR ; clear Vera Vsync irq status - ply - plx - pla - rti - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1339 asmsub restore_irq() clobbers(A) { - -restore_irq .proc - ; source: library:/prog8lib/cx16/syslib.p8:1340 %asm {{ - sei - lda _orig_irqvec - sta cx16.CINV - lda _orig_irqvec+1 - sta cx16.CINV+1 - lda cx16.VERA_IEN - and #%11110000 ; disable all Vera IRQs but the vsync - ora #%00000001 - sta cx16.VERA_IEN - cli - rts -_orig_irqvec .word 0 - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1356 asmsub set_rasterirq(uword handler @AY, uword rasterpos @R0) clobbers(A) { - -set_rasterirq .proc - ; source: library:/prog8lib/cx16/syslib.p8:1358 %asm {{ - sei - sta _modified+1 - sty _modified+2 - lda cx16.r0 - ldy cx16.r0+1 - lda cx16.VERA_IEN - and #%11110000 ; disable all irqs but the line(raster) one - ora #%00000010 - sta cx16.VERA_IEN - lda cx16.r0 - ldy cx16.r0+1 - jsr set_rasterline - lda #<_raster_irq_handler - sta cx16.CINV - lda #>_raster_irq_handler - sta cx16.CINV+1 - cli - rts - -_raster_irq_handler - jsr sys.save_prog8_internals - cld -_modified jsr $ffff ; modified - jsr sys.restore_prog8_internals - ; end irq processing - don't use kernal's irq handling - lda #2 - tsb cx16.VERA_ISR ; clear Vera line irq status - ply - plx - pla - rti - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1393 asmsub set_rasterline(uword line @AY) { - -set_rasterline .proc - ; source: library:/prog8lib/cx16/syslib.p8:1394 %asm {{ - php - sei - sta cx16.VERA_IRQLINE_L - tya - lsr a - bcs + - lda #%10000000 - trb cx16.VERA_IEN - plp - rts -+ lda #%10000000 - tsb cx16.VERA_IEN - plp - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1412 asmsub reset_system() { - -reset_system .proc - ; source: library:/prog8lib/cx16/syslib.p8:1415 %asm {{ - sei - ldx #$42 - ldy #2 - lda #0 - jsr cx16.i2c_write_byte - bra * - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1435 asmsub wait(uword jiffies @AY) clobbers(X) { - -wait .proc - ; source: library:/prog8lib/cx16/syslib.p8:1439 %asm {{ - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - -_loop lda P8ZP_SCRATCH_W1 - ora P8ZP_SCRATCH_W1+1 - bne + - rts - -+ sei - jsr cbm.RDTIM - cli - sta P8ZP_SCRATCH_B1 -- sei - jsr cbm.RDTIM - cli - cmp P8ZP_SCRATCH_B1 - beq - - - lda P8ZP_SCRATCH_W1 - bne + - dec P8ZP_SCRATCH_W1+1 -+ dec P8ZP_SCRATCH_W1 - bra _loop - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1466 inline asmsub waitvsync() { - ; source: library:/prog8lib/cx16/syslib.p8:1475 asmsub internal_stringcopy(uword source @R0, uword target @AY) clobbers (A,Y) { - -internal_stringcopy .proc - ; source: library:/prog8lib/cx16/syslib.p8:1477 %asm {{ - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda cx16.r0 - ldy cx16.r0+1 - jmp prog8_lib.strcpy - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1486 asmsub memcopy(uword source @R0, uword target @R1, uword count @AY) clobbers(A,X,Y) { - -memcopy .proc - ; source: library:/prog8lib/cx16/syslib.p8:1492 %asm {{ - cpy #0 - bne _longcopy - - ; copy <= 255 bytes - tay - bne _copyshort - rts ; nothing to copy - -_copyshort - dey - beq + -- lda (cx16.r0),y - sta (cx16.r1),y - dey - bne - -+ lda (cx16.r0),y - sta (cx16.r1),y - rts - -_longcopy - pha ; lsb(count) = remainder in last page - tya - tax ; x = num pages (1+) - ldy #0 -- lda (cx16.r0),y - sta (cx16.r1),y - iny - bne - - inc cx16.r0+1 - inc cx16.r1+1 - dex - bne - - ply - bne _copyshort - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1531 asmsub memset(uword mem @R0, uword numbytes @R1, ubyte value @A) clobbers(A,X,Y) { - -memset .proc - ; source: library:/prog8lib/cx16/syslib.p8:1532 %asm {{ - ldy cx16.r0 - sty P8ZP_SCRATCH_W1 - ldy cx16.r0+1 - sty P8ZP_SCRATCH_W1+1 - ldx cx16.r1 - ldy cx16.r1+1 - jmp prog8_lib.memset - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1543 asmsub memsetw(uword mem @R0, uword numwords @R1, uword value @AY) clobbers (A,X,Y) { - -memsetw .proc - ; source: library:/prog8lib/cx16/syslib.p8:1544 %asm {{ - ldx cx16.r0 - stx P8ZP_SCRATCH_W1 - ldx cx16.r0+1 - stx P8ZP_SCRATCH_W1+1 - ldx cx16.r1 - stx P8ZP_SCRATCH_W2 - ldx cx16.r1+1 - stx P8ZP_SCRATCH_W2+1 - jmp prog8_lib.memsetw - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1557 inline asmsub read_flags() -> ubyte @A { - ; source: library:/prog8lib/cx16/syslib.p8:1564 inline asmsub clear_carry() { - ; source: library:/prog8lib/cx16/syslib.p8:1570 inline asmsub set_carry() { - ; source: library:/prog8lib/cx16/syslib.p8:1576 inline asmsub clear_irqd() { - ; source: library:/prog8lib/cx16/syslib.p8:1582 inline asmsub set_irqd() { - ; source: library:/prog8lib/cx16/syslib.p8:1588 inline asmsub irqsafe_set_irqd() { - ; source: library:/prog8lib/cx16/syslib.p8:1595 inline asmsub irqsafe_clear_irqd() { - ; source: library:/prog8lib/cx16/syslib.p8:1601 inline asmsub disable_caseswitch() { - ; source: library:/prog8lib/cx16/syslib.p8:1608 inline asmsub enable_caseswitch() { - ; source: library:/prog8lib/cx16/syslib.p8:1615 asmsub save_prog8_internals() { - -save_prog8_internals .proc - ; source: library:/prog8lib/cx16/syslib.p8:1616 %asm {{ - lda P8ZP_SCRATCH_B1 - sta save_SCRATCH_ZPB1 - lda P8ZP_SCRATCH_REG - sta save_SCRATCH_ZPREG - lda P8ZP_SCRATCH_W1 - sta save_SCRATCH_ZPWORD1 - lda P8ZP_SCRATCH_W1+1 - sta save_SCRATCH_ZPWORD1+1 - lda P8ZP_SCRATCH_W2 - sta save_SCRATCH_ZPWORD2 - lda P8ZP_SCRATCH_W2+1 - sta save_SCRATCH_ZPWORD2+1 - rts -save_SCRATCH_ZPB1 .byte 0 -save_SCRATCH_ZPREG .byte 0 -save_SCRATCH_ZPWORD1 .word 0 -save_SCRATCH_ZPWORD2 .word 0 - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1637 asmsub restore_prog8_internals() { - -restore_prog8_internals .proc - ; source: library:/prog8lib/cx16/syslib.p8:1638 %asm {{ - lda save_prog8_internals.save_SCRATCH_ZPB1 - sta P8ZP_SCRATCH_B1 - lda save_prog8_internals.save_SCRATCH_ZPREG - sta P8ZP_SCRATCH_REG - lda save_prog8_internals.save_SCRATCH_ZPWORD1 - sta P8ZP_SCRATCH_W1 - lda save_prog8_internals.save_SCRATCH_ZPWORD1+1 - sta P8ZP_SCRATCH_W1+1 - lda save_prog8_internals.save_SCRATCH_ZPWORD2 - sta P8ZP_SCRATCH_W2 - lda save_prog8_internals.save_SCRATCH_ZPWORD2+1 - sta P8ZP_SCRATCH_W2+1 - rts - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1655 asmsub exit(ubyte returnvalue @A) { - -exit .proc - ; source: library:/prog8lib/cx16/syslib.p8:1657 %asm {{ - sta cleanup_at_exit._exitcode - ldx prog8_lib.orig_stackpointer - txs - jmp cleanup_at_exit - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1665 asmsub exit2(ubyte resulta @A, ubyte resultx @X, ubyte resulty @Y) { - -exit2 .proc - ; source: library:/prog8lib/cx16/syslib.p8:1667 %asm {{ - sta cleanup_at_exit._exitcode - stx cleanup_at_exit._exitcodeX - sty cleanup_at_exit._exitcodeY - ldx prog8_lib.orig_stackpointer - txs - jmp cleanup_at_exit - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1677 asmsub exit3(ubyte resulta @A, ubyte resultx @X, ubyte resulty @Y, bool carry @Pc) { - -exit3 .proc - ; source: library:/prog8lib/cx16/syslib.p8:1679 %asm {{ - sta cleanup_at_exit._exitcode - lda #0 - rol a - sta cleanup_at_exit._exitcodeCarry - stx cleanup_at_exit._exitcodeX - sty cleanup_at_exit._exitcodeY - ldx prog8_lib.orig_stackpointer - txs - jmp cleanup_at_exit - .pend - ; source: library:/prog8lib/cx16/syslib.p8:1692 inline asmsub progend() -> uword @AY { - ; source: library:/prog8lib/cx16/syslib.p8:1699 inline asmsub push(ubyte value @A) { - ; source: library:/prog8lib/cx16/syslib.p8:1705 inline asmsub pushw(uword value @AY) { - ; source: library:/prog8lib/cx16/syslib.p8:1712 inline asmsub pop() -> ubyte @A { - ; source: library:/prog8lib/cx16/syslib.p8:1718 inline asmsub popw() -> uword @AY { - .pend - -; ---- block: 'conv' ---- -conv .proc - ; source: library:/prog8lib/conv.p8:3 conv { - -; non-zeropage variables -string_out ; PETSCII:"????????????????" - .byte $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f - .byte $00 - - ; source: library:/prog8lib/conv.p8:9 str @shared string_out = "????????????????" ; result buffer for the string conversion routines - ; source: library:/prog8lib/conv.p8:5 %option no_symbol_prefixing, ignore_unused - ; source: library:/prog8lib/conv.p8:11 asmsub str_ub0 (ubyte value @ A) clobbers(X) -> str @AY { - -str_ub0 .proc - ; source: library:/prog8lib/conv.p8:13 %asm {{ - jsr conv.ubyte2decimal - sty string_out - sta string_out+1 - stx string_out+2 - lda #0 - sta string_out+3 - lda #string_out - rts - .pend - ; source: library:/prog8lib/conv.p8:26 asmsub str_ub (ubyte value @ A) clobbers(X) -> str @AY { - -str_ub .proc - ; source: library:/prog8lib/conv.p8:28 %asm {{ - ldy #0 - sty P8ZP_SCRATCH_B1 - jsr conv.ubyte2decimal -_output_byte_digits - ; hundreds? - cpy #'0' - beq + - pha - tya - ldy P8ZP_SCRATCH_B1 - sta string_out,y - pla - inc P8ZP_SCRATCH_B1 - ; tens? -+ ldy P8ZP_SCRATCH_B1 - cmp #'0' - beq + - sta string_out,y - iny -+ ; ones. - txa - sta string_out,y - iny - lda #0 - sta string_out,y - lda #string_out - rts - .pend - ; source: library:/prog8lib/conv.p8:60 asmsub str_b (byte value @ A) clobbers(X) -> str @AY { - -str_b .proc - ; source: library:/prog8lib/conv.p8:62 %asm {{ - ldy #0 - sty P8ZP_SCRATCH_B1 - cmp #0 - bpl + - pha - lda #'-' - sta string_out - inc P8ZP_SCRATCH_B1 - pla -+ jsr conv.byte2decimal - bra str_ub._output_byte_digits - .pend - ; source: library:/prog8lib/conv.p8:77 asmsub str_ubhex (ubyte value @ A) clobbers(X) -> str @AY { - -str_ubhex .proc - ; source: library:/prog8lib/conv.p8:79 %asm {{ - jsr conv.ubyte2hex - sta string_out - sty string_out+1 - lda #0 - sta string_out+2 - lda #string_out - rts - .pend - ; source: library:/prog8lib/conv.p8:91 asmsub str_ubbin (ubyte value @ A) clobbers(X) -> str @AY { - -str_ubbin .proc - ; source: library:/prog8lib/conv.p8:93 %asm {{ - sta P8ZP_SCRATCH_B1 - ldy #0 - sty string_out+8 - ldy #7 -- lsr P8ZP_SCRATCH_B1 - bcc + - lda #'1' - bne _digit -+ lda #'0' -_digit sta string_out,y - dey - bpl - - lda #string_out - rts - .pend - ; source: library:/prog8lib/conv.p8:112 asmsub str_uwbin (uword value @ AY) clobbers(X) -> str @AY { - -str_uwbin .proc - ; source: library:/prog8lib/conv.p8:114 %asm {{ - sta P8ZP_SCRATCH_REG - tya - jsr str_ubbin - ldy #0 - sty string_out+16 - ldy #7 -- lsr P8ZP_SCRATCH_REG - bcc + - lda #'1' - bne _digit -+ lda #'0' -_digit sta string_out+8,y - dey - bpl - - lda #string_out - rts - .pend - ; source: library:/prog8lib/conv.p8:135 asmsub str_uwhex (uword value @ AY) -> str @AY { - -str_uwhex .proc - ; source: library:/prog8lib/conv.p8:137 %asm {{ - pha - tya - jsr conv.ubyte2hex - sta string_out - sty string_out+1 - pla - jsr conv.ubyte2hex - sta string_out+2 - sty string_out+3 - lda #0 - sta string_out+4 - lda #string_out - rts - .pend - ; source: library:/prog8lib/conv.p8:155 asmsub str_uw0 (uword value @ AY) clobbers(X) -> str @AY { - -str_uw0 .proc - ; source: library:/prog8lib/conv.p8:157 %asm {{ - jsr conv.uword2decimal - ldy #0 -- lda conv.uword2decimal.decTenThousands,y - sta string_out,y - beq + - iny - bne - -+ - lda #string_out - rts - .pend - ; source: library:/prog8lib/conv.p8:172 asmsub str_uw (uword value @ AY) clobbers(X) -> str @AY { - -str_uw .proc - ; source: library:/prog8lib/conv.p8:174 %asm {{ - jsr conv.uword2decimal - ldx #0 -_output_digits - ldy #0 -- lda conv.uword2decimal.decTenThousands,y - beq _allzero - cmp #'0' - bne _gotdigit - iny - bne - -_gotdigit sta string_out,x - inx - iny - lda conv.uword2decimal.decTenThousands,y - bne _gotdigit -_end lda #0 - sta string_out,x - lda #string_out - rts - -_allzero lda #'0' - sta string_out,x - inx - bne _end - .pend - ; source: library:/prog8lib/conv.p8:203 asmsub str_w (word value @ AY) clobbers(X) -> str @AY { - -str_w .proc - ; source: library:/prog8lib/conv.p8:205 %asm {{ - cpy #0 - bpl str_uw - pha - lda #'-' - sta string_out - tya - eor #255 - tay - pla - eor #255 - clc - adc #1 - bcc + - iny -+ jsr conv.uword2decimal - ldx #1 - bne str_uw._output_digits - rts - .pend - ; source: library:/prog8lib/conv.p8:230 asmsub any2uword(str string @AY) clobbers(Y) -> ubyte @A { - -any2uword .proc - ; source: library:/prog8lib/conv.p8:236 %asm {{ - pha - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 - lda (P8ZP_SCRATCH_W1),y - ldy P8ZP_SCRATCH_W1+1 - cmp #'$' - beq _hex - cmp #'%' - beq _bin - pla - jsr str2uword - jmp _result -_hex pla - jsr hex2uword - jmp _result -_bin pla - jsr bin2uword -_result - pha - lda cx16.r15 - sta P8ZP_SCRATCH_B1 ; result value - pla - sta cx16.r15 - sty cx16.r15+1 - lda P8ZP_SCRATCH_B1 - rts - .pend - ; source: library:/prog8lib/conv.p8:267 inline asmsub str2ubyte(str string @AY) clobbers(Y) -> ubyte @A { - ; source: library:/prog8lib/conv.p8:277 inline asmsub str2byte(str string @AY) clobbers(Y) -> byte @A { - ; source: library:/prog8lib/conv.p8:287 asmsub str2uword(str string @AY) -> uword @AY { - -str2uword .proc - ; source: library:/prog8lib/conv.p8:292 %asm {{ -_result = P8ZP_SCRATCH_W1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #0 - sty _result - sty _result+1 - sty cx16.r15+1 -_loop - lda (P8ZP_SCRATCH_W2),y - sec - sbc #48 - bpl _digit -_done - sty cx16.r15 - lda _result - ldy _result+1 - rts -_digit - cmp #10 - bcs _done - ; add digit to result - pha - jsr _result_times_10 - pla - clc - adc _result - sta _result - bcc + - inc _result+1 -+ iny - bne _loop - ; never reached - -_result_times_10 ; (W*4 + W)*2 - lda _result+1 - sta P8ZP_SCRATCH_REG - lda _result - asl a - rol P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - clc - adc _result - sta _result - lda P8ZP_SCRATCH_REG - adc _result+1 - asl _result - rol a - sta _result+1 - rts - .pend - ; source: library:/prog8lib/conv.p8:346 asmsub str2word(str string @AY) -> word @AY { - -str2word .proc - ; source: library:/prog8lib/conv.p8:351 %asm {{ -_result = P8ZP_SCRATCH_W1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #0 - sty _result - sty _result+1 - sty _negative - sty cx16.r15+1 - lda (P8ZP_SCRATCH_W2),y - cmp #'+' - bne + - iny -+ cmp #'-' - bne _parse - inc _negative - iny -_parse lda (P8ZP_SCRATCH_W2),y - sec - sbc #48 - bpl _digit -_done - sty cx16.r15 - lda _negative - beq + - sec - lda #0 - sbc _result - sta _result - lda #0 - sbc _result+1 - sta _result+1 -+ lda _result - ldy _result+1 - rts -_digit - cmp #10 - bcs _done - ; add digit to result - pha - jsr str2uword._result_times_10 - pla - clc - adc _result - sta _result - bcc + - inc _result+1 -+ iny - bne _parse - ; never reached -_negative .byte 0 - .pend - ; source: library:/prog8lib/conv.p8:405 asmsub hex2uword(str string @AY) -> uword @AY { - -hex2uword .proc - ; source: library:/prog8lib/conv.p8:410 %asm {{ - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #0 - sty P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sty cx16.r15+1 - lda (P8ZP_SCRATCH_W2),y - beq _stop - cmp #'$' - bne _loop - iny -_loop - lda #0 - sta P8ZP_SCRATCH_B1 - lda (P8ZP_SCRATCH_W2),y - beq _stop - cmp #7 ; screencode letters A-F are 1-6 - bcc _add_letter - and #127 - cmp #97 - bcs _try_iso ; maybe letter is iso:'a'-iso:'f' (97-102) - cmp #'g' - bcs _stop - cmp #'a' - bcs _add_letter - cmp #'0' - bcc _stop - cmp #'9'+1 - bcs _stop -_calc - asl P8ZP_SCRATCH_W1 - rol P8ZP_SCRATCH_W1+1 - asl P8ZP_SCRATCH_W1 - rol P8ZP_SCRATCH_W1+1 - asl P8ZP_SCRATCH_W1 - rol P8ZP_SCRATCH_W1+1 - asl P8ZP_SCRATCH_W1 - rol P8ZP_SCRATCH_W1+1 - and #$0f - clc - adc P8ZP_SCRATCH_B1 - ora P8ZP_SCRATCH_W1 - sta P8ZP_SCRATCH_W1 - iny - bne _loop -_stop - sty cx16.r15 - lda P8ZP_SCRATCH_W1 - ldy P8ZP_SCRATCH_W1+1 - rts -_add_letter - pha - lda #9 - sta P8ZP_SCRATCH_B1 - pla - jmp _calc -_try_iso - cmp #103 - bcs _stop - and #63 - bne _add_letter - .pend - ; source: library:/prog8lib/conv.p8:475 asmsub bin2uword(str string @AY) -> uword @AY { - -bin2uword .proc - ; source: library:/prog8lib/conv.p8:479 %asm {{ - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #0 - sty P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sty cx16.r15+1 - lda (P8ZP_SCRATCH_W2),y - beq _stop - cmp #'%' - bne _loop - iny -_loop - lda (P8ZP_SCRATCH_W2),y - cmp #'0' - bcc _stop - cmp #'2' - bcs _stop -_first asl P8ZP_SCRATCH_W1 - rol P8ZP_SCRATCH_W1+1 - and #1 - ora P8ZP_SCRATCH_W1 - sta P8ZP_SCRATCH_W1 - iny - bne _loop -_stop - sty cx16.r15 - lda P8ZP_SCRATCH_W1 - ldy P8ZP_SCRATCH_W1+1 - rts - .pend - ; source: library:/prog8lib/conv.p8:515 asmsub ubyte2decimal (ubyte value @A) -> ubyte @Y, ubyte @A, ubyte @X { - -ubyte2decimal .proc - ; source: library:/prog8lib/conv.p8:517 %asm {{ - ldy #uword2decimal.ASCII_0_OFFSET - jmp uword2decimal.hex_try200 - .pend - ; source: library:/prog8lib/conv.p8:523 asmsub uword2decimal (uword value @AY) -> ubyte @Y, ubyte @A, ubyte @X { - -uword2decimal .proc - ; source: library:/prog8lib/conv.p8:529 %asm {{ -;Convert 16 bit Hex to Decimal (0-65535) Rev 2 -;By Omegamatrix Further optimizations by tepples -; routine from https://forums.nesdev.org/viewtopic.php?p=130363&sid=1944ba8bac4d6afa9c02e3cc42304e6b#p130363 - -;HexToDec99 -; start in A -; end with A = 10's, decOnes (also in X) - -;HexToDec255 -; start in A -; end with Y = 100's, A = 10's, decOnes (also in X) - -;HexToDec999 -; start with A = high byte, Y = low byte -; end with Y = 100's, A = 10's, decOnes (also in X) -; requires 1 extra temp register on top of decOnes, could combine -; these two if HexToDec65535 was eliminated... - -;HexToDec65535 -; start with A/Y (low/high) as 16 bit value -; end with decTenThousand, decThousand, Y = 100's, A = 10's, decOnes (also in X) -; (irmen: I store Y and A in decHundreds and decTens too, so all of it can be easily printed) - - -ASCII_0_OFFSET = $30 -temp = P8ZP_SCRATCH_B1 ; byte in zeropage -hexHigh = P8ZP_SCRATCH_W1 ; byte in zeropage -hexLow = P8ZP_SCRATCH_W1+1 ; byte in zeropage - - -HexToDec65535; SUBROUTINE - sty hexHigh ;3 @9 - sta hexLow ;3 @12 - tya - tax ;2 @14 - lsr a ;2 @16 - lsr a ;2 @18 integer divide 1024 (result 0-63) - - cpx #$A7 ;2 @20 account for overflow of multiplying 24 from 43,000 ($A7F8) onward, - adc #1 ;2 @22 we can just round it to $A700, and the divide by 1024 is fine... - - ;at this point we have a number 1-65 that we have to times by 24, - ;add to original sum, and Mod 1024 to get a remainder 0-999 - - - sta temp ;3 @25 - asl a ;2 @27 - adc temp ;3 @30 x3 - tay ;2 @32 - lsr a ;2 @34 - lsr a ;2 @36 - lsr a ;2 @38 - lsr a ;2 @40 - lsr a ;2 @42 - tax ;2 @44 - tya ;2 @46 - asl a ;2 @48 - asl a ;2 @50 - asl a ;2 @52 - clc ;2 @54 - adc hexLow ;3 @57 - sta hexLow ;3 @60 - txa ;2 @62 - adc hexHigh ;3 @65 - sta hexHigh ;3 @68 - ror a ;2 @70 - lsr a ;2 @72 - tay ;2 @74 integer divide 1,000 (result 0-65) - - lsr a ;2 @76 split the 1,000 and 10,000 digit - tax ;2 @78 - lda ShiftedBcdTab,x ;4 @82 - tax ;2 @84 - rol a ;2 @86 - and #$0F ;2 @88 - ora #ASCII_0_OFFSET - sta decThousands ;3 @91 - txa ;2 @93 - lsr a ;2 @95 - lsr a ;2 @97 - lsr a ;2 @99 - ora #ASCII_0_OFFSET - sta decTenThousands ;3 @102 - - lda hexLow ;3 @105 - cpy temp ;3 @108 - bmi _doSubtract ;2³ @110/111 - beq _useZero ;2³ @112/113 - adc #23 + 24 ;2 @114 -_doSubtract - sbc #23 ;2 @116 - sta hexLow ;3 @119 -_useZero - lda hexHigh ;3 @122 - sbc #0 ;2 @124 - -Start100s - and #$03 ;2 @126 - tax ;2 @128 0,1,2,3 - cmp #2 ;2 @130 - rol a ;2 @132 0,2,5,7 - ora #ASCII_0_OFFSET - tay ;2 @134 Y = Hundreds digit - - lda hexLow ;3 @137 - adc Mod100Tab,x ;4 @141 adding remainder of 256, 512, and 256+512 (all mod 100) - bcs hex_doSub200 ;2³ @143/144 - -hex_try200 - cmp #200 ;2 @145 - bcc hex_try100 ;2³ @147/148 -hex_doSub200 - iny ;2 @149 - iny ;2 @151 - sbc #200 ;2 @153 -hex_try100 - cmp #100 ;2 @155 - bcc HexToDec99 ;2³ @157/158 - iny ;2 @159 - sbc #100 ;2 @161 - -HexToDec99; SUBROUTINE - lsr a ;2 @163 - tax ;2 @165 - lda ShiftedBcdTab,x ;4 @169 - tax ;2 @171 - rol a ;2 @173 - and #$0F ;2 @175 - ora #ASCII_0_OFFSET - sta decOnes ;3 @178 - txa ;2 @180 - lsr a ;2 @182 - lsr a ;2 @184 - lsr a ;2 @186 - ora #ASCII_0_OFFSET - - ; irmen: load X with ones, and store Y and A too, for easy printing afterwards - sty decHundreds - sta decTens - ldx decOnes - rts ;6 @192 Y=hundreds, A = tens digit, X=ones digit - - -HexToDec999; SUBROUTINE - sty hexLow ;3 @9 - jmp Start100s ;3 @12 - -Mod100Tab - .byte 0,56,12,56+12 - -ShiftedBcdTab - .byte $00,$01,$02,$03,$04,$08,$09,$0A,$0B,$0C - .byte $10,$11,$12,$13,$14,$18,$19,$1A,$1B,$1C - .byte $20,$21,$22,$23,$24,$28,$29,$2A,$2B,$2C - .byte $30,$31,$32,$33,$34,$38,$39,$3A,$3B,$3C - .byte $40,$41,$42,$43,$44,$48,$49,$4A,$4B,$4C - -decTenThousands .byte 0 -decThousands .byte 0 -decHundreds .byte 0 -decTens .byte 0 -decOnes .byte 0 - .byte 0 ; zero-terminate the decimal output string - .pend - ; source: library:/prog8lib/conv.p8:698 asmsub byte2decimal (byte value @A) -> ubyte @Y, ubyte @A, ubyte @X { - -byte2decimal .proc - ; source: library:/prog8lib/conv.p8:701 %asm {{ - cmp #0 - bpl + - eor #255 - clc - adc #1 -+ jmp ubyte2decimal - .pend - ; source: library:/prog8lib/conv.p8:711 asmsub ubyte2hex (ubyte value @A) clobbers(X) -> ubyte @A, ubyte @Y { - -ubyte2hex .proc - ; source: library:/prog8lib/conv.p8:713 %asm {{ - pha - and #$0f - tax - ldy _hex_digits,x - pla - lsr a - lsr a - lsr a - lsr a - tax - lda _hex_digits,x - rts - -_hex_digits .text "0123456789abcdef" ; can probably be reused for other stuff as well - .pend - ; source: library:/prog8lib/conv.p8:731 asmsub uword2hex (uword value @AY) clobbers(A,Y) { - -uword2hex .proc - ; source: library:/prog8lib/conv.p8:733 %asm {{ - sta P8ZP_SCRATCH_REG - tya - jsr ubyte2hex - sta output - sty output+1 - lda P8ZP_SCRATCH_REG - jsr ubyte2hex - sta output+2 - sty output+3 - rts -output .text "0000", $00 ; 0-terminated output buffer (to make printing easier) - .pend - .pend - -; ---- block: 'floats' ---- -floats .proc - ; source: library:/prog8lib/cx16/floats.p8:6 floats { - AYINT_facmo = $c6 - PI = 3.141592653589793 - TWOPI = 6.283185307179586 - π = 3.141592653589793 - - AYINT = $fe00 - GIVAYF = $fe03 - FOUT = $fe06 - VAL_1 = $fe09 - GETADR = $fe0c - FLOATC = $fe0f - FSUB = $fe12 - FSUBT = $fe15 - FADD = $fe18 - FADDT = $fe1b - FMULT = $fe1e - FMULTT = $fe21 - FDIV = $fe24 - FDIVT = $fe27 - LOG = $fe2a - INT = $fe2d - SQR = $fe30 - NEGOP = $fe33 - FPWR = $fe36 - FPWRT = $fe39 - EXP = $fe3c - COS = $fe3f - SIN = $fe42 - TAN = $fe45 - ATN = $fe48 - ROUND = $fe4b - ABS = $fe4e - SIGN = $fe51 - FCOMP = $fe54 - RND_0 = $fe57 - RND = $fe57 - CONUPK = $fe5a - ROMUPK = $fe5d - MOVFRM = $fe60 - MOVFM = $fe63 - MOVMF = $fe66 - MOVFA = $fe69 - MOVAF = $fe6c - FADDH = $fe6f - ZEROFC = $fe72 - NORMAL = $fe75 - NEGFAC = $fe78 - MUL10 = $fe7b - DIV10 = $fe7e - MOVEF = $fe81 - SGN = $fe84 - FLOAT = $fe87 - FLOATS = $fe8a - QINT = $fe8d - FINLOG = $fe90 - - ; source: library:/prog8lib/cx16/floats.p8:9 const float π = 3.141592653589793 - ; source: library:/prog8lib/cx16/floats.p8:10 const float PI = π - ; source: library:/prog8lib/cx16/floats.p8:11 const float TWOPI = 2*π - ; source: library:/prog8lib/cx16/floats.p8:176 &uword AYINT_facmo = $c6 ; $c6/$c7 contain result of AYINT - ; source: library:/prog8lib/cx16/floats.p8:6 floats { - ; source: library:/prog8lib/shared_floats_functions.p8:1 floats { - ; source: library:/prog8lib/cx16/floats.p8:22 romsub $fe00 = AYINT() clobbers(A,X,Y) ; fac1-> signed word in 100-101 ($64-$65) MSB FIRST. (might throw ILLEGAL QUANTITY) - - ; source: library:/prog8lib/cx16/floats.p8:27 romsub $fe03 = GIVAYF(ubyte lo @ Y, ubyte hi @ A) clobbers(A,X,Y) - - ; source: library:/prog8lib/cx16/floats.p8:29 romsub $fe06 = FOUT() clobbers(X) -> uword @ AY ; fac1 -> string, address returned in AY - - ; source: library:/prog8lib/cx16/floats.p8:30 romsub $fe09 = VAL_1(uword string @XY, ubyte length @A) clobbers(A,X,Y) -> float @FAC1 ; convert ASCII string in XY and length in A, to floating point in FAC1. WARNING: only implemented in ROM 47+. Safer to use floats.parse() instead. - - ; source: library:/prog8lib/cx16/floats.p8:34 romsub $fe0c = GETADR() clobbers(X) -> ubyte @ Y, ubyte @ A - - ; source: library:/prog8lib/cx16/floats.p8:35 romsub $fe0f = FLOATC() clobbers(A,X,Y) ; convert address to floating point - - ; source: library:/prog8lib/cx16/floats.p8:37 romsub $fe12 = FSUB(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = mflpt from A/Y - fac1 - - ; source: library:/prog8lib/cx16/floats.p8:38 romsub $fe15 = FSUBT() clobbers(A,X,Y) ; fac1 = fac2-fac1 mind the order of the operands - - ; source: library:/prog8lib/cx16/floats.p8:39 romsub $fe18 = FADD(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 += mflpt value from A/Y - - ; source: library:/prog8lib/cx16/floats.p8:40 romsub $fe1b = FADDT() clobbers(A,X,Y) ; fac1 += fac2 - - ; source: library:/prog8lib/cx16/floats.p8:41 romsub $fe1e = FMULT(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 *= mflpt value from A/Y - - ; source: library:/prog8lib/cx16/floats.p8:42 romsub $fe21 = FMULTT() clobbers(A,X,Y) ; fac1 *= fac2 - - ; source: library:/prog8lib/cx16/floats.p8:43 romsub $fe24 = FDIV(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = mflpt in A/Y / fac1 - - ; source: library:/prog8lib/cx16/floats.p8:44 romsub $fe27 = FDIVT() clobbers(A,X,Y) ; fac1 = fac2/fac1 mind the order of the operands - - ; source: library:/prog8lib/cx16/floats.p8:45 romsub $fe2a = LOG() clobbers(A,X,Y) ; fac1 = LN(fac1) (natural log) - - ; source: library:/prog8lib/cx16/floats.p8:46 romsub $fe2d = INT() clobbers(A,X,Y) ; INT() truncates, use ROUND or FADDH first to round instead of trunc - - ; source: library:/prog8lib/cx16/floats.p8:47 romsub $fe30 = SQR() clobbers(A,X,Y) ; fac1 = SQRT(fac1) - - ; source: library:/prog8lib/cx16/floats.p8:48 romsub $fe33 = NEGOP() clobbers(A) ; switch the sign of fac1 (fac1 = -fac1) - - ; source: library:/prog8lib/cx16/floats.p8:49 romsub $fe36 = FPWR(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = fac2 ** float in A/Y - - ; source: library:/prog8lib/cx16/floats.p8:50 romsub $fe39 = FPWRT() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 - - ; source: library:/prog8lib/cx16/floats.p8:51 romsub $fe3c = EXP() clobbers(A,X,Y) ; fac1 = EXP(fac1) (e ** fac1) - - ; source: library:/prog8lib/cx16/floats.p8:52 romsub $fe3f = COS() clobbers(A,X,Y) ; fac1 = COS(fac1) - - ; source: library:/prog8lib/cx16/floats.p8:53 romsub $fe42 = SIN() clobbers(A,X,Y) ; fac1 = SIN(fac1) - - ; source: library:/prog8lib/cx16/floats.p8:54 romsub $fe45 = TAN() clobbers(A,X,Y) ; fac1 = TAN(fac1) - - ; source: library:/prog8lib/cx16/floats.p8:55 romsub $fe48 = ATN() clobbers(A,X,Y) ; fac1 = ATN(fac1) - - ; source: library:/prog8lib/cx16/floats.p8:56 romsub $fe4b = ROUND() clobbers(A,X,Y) ; round fac1 - - ; source: library:/prog8lib/cx16/floats.p8:57 romsub $fe4e = ABS() clobbers(A,X,Y) ; fac1 = ABS(fac1) - - ; source: library:/prog8lib/cx16/floats.p8:58 romsub $fe51 = SIGN() clobbers(X,Y) -> ubyte @ A ; SIGN(fac1) to A, $ff, $0, $1 for negative, zero, positive - - ; source: library:/prog8lib/cx16/floats.p8:59 romsub $fe54 = FCOMP(uword mflpt @ AY) clobbers(X,Y) -> ubyte @ A ; A = compare fac1 to mflpt in A/Y, 0=equal 1=fac1 is greater, 255=fac1 is less than - - ; source: library:/prog8lib/cx16/floats.p8:60 romsub $fe57 = RND_0() clobbers(A,X,Y) ; fac1 = RND(fac1) float random number generator NOTE: incompatible with C64's RND routine - - ; source: library:/prog8lib/cx16/floats.p8:61 romsub $fe57 = RND() clobbers(A,X,Y) ; alias for RND_0 - - ; source: library:/prog8lib/cx16/floats.p8:62 romsub $fe5a = CONUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac2 - - ; source: library:/prog8lib/cx16/floats.p8:63 romsub $fe5d = ROMUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in current bank in A/Y into fac2 - - ; source: library:/prog8lib/cx16/floats.p8:64 romsub $fe60 = MOVFRM(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac1 (use MOVFM instead) - - ; source: library:/prog8lib/cx16/floats.p8:65 romsub $fe63 = MOVFM(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac1 - - ; source: library:/prog8lib/cx16/floats.p8:66 romsub $fe66 = MOVMF(uword mflpt @ XY) clobbers(A,X,Y) ; store fac1 to memory X/Y as 5-byte mflpt - - ; source: library:/prog8lib/cx16/floats.p8:67 romsub $fe69 = MOVFA() clobbers(A,X) ; copy fac2 to fac1 - - ; source: library:/prog8lib/cx16/floats.p8:68 romsub $fe6c = MOVAF() clobbers(A,X) ; copy fac1 to fac2 (rounded) - - ; source: library:/prog8lib/cx16/floats.p8:71 romsub $fe6f = FADDH() clobbers(A,X,Y) ; fac1 += 0.5, for rounding- call this before INT - - ; source: library:/prog8lib/cx16/floats.p8:72 romsub $fe72 = ZEROFC() clobbers(A,X,Y) ; fac1 = 0 - - ; source: library:/prog8lib/cx16/floats.p8:73 romsub $fe75 = NORMAL() clobbers(A,X,Y) ; normalize fac1 - - ; source: library:/prog8lib/cx16/floats.p8:74 romsub $fe78 = NEGFAC() clobbers(A) ; switch the sign of fac1 (fac1 = -fac1) (doesn't work, juse use NEGOP() instead!) - - ; source: library:/prog8lib/cx16/floats.p8:75 romsub $fe7b = MUL10() clobbers(A,X,Y) ; fac1 *= 10 - - ; source: library:/prog8lib/cx16/floats.p8:76 romsub $fe7e = DIV10() clobbers(A,X,Y) ; fac1 /= 10 , CAUTION: result is always positive! Have to restore sign manually! - - ; source: library:/prog8lib/cx16/floats.p8:77 romsub $fe81 = MOVEF() clobbers(A,X) ; copy fac1 to fac2 - - ; source: library:/prog8lib/cx16/floats.p8:78 romsub $fe84 = SGN() clobbers(A,X,Y) ; fac1 = SGN(fac1), result of SIGN (-1, 0 or 1) - - ; source: library:/prog8lib/cx16/floats.p8:79 romsub $fe87 = FLOAT() clobbers(A,X,Y) ; FAC = (s8).A - - ; source: library:/prog8lib/cx16/floats.p8:80 romsub $fe8a = FLOATS() clobbers(A,X,Y) ; FAC = (s16)facho+1:facho - - ; source: library:/prog8lib/cx16/floats.p8:81 romsub $fe8d = QINT() clobbers(A,X,Y) ; facho:facho+1:facho+2:facho+3 = u32(FAC) - - ; source: library:/prog8lib/cx16/floats.p8:82 romsub $fe90 = FINLOG(byte value @A) clobbers (A, X, Y) ; fac1 += signed byte in A - - ; source: library:/prog8lib/cx16/floats.p8:86 asmsub FREADSA (byte value @A) clobbers(A,X,Y) { - -FREADSA .proc - ; source: library:/prog8lib/cx16/floats.p8:88 %asm {{ - tay - bpl + - lda #$ff - jmp GIVAYF -+ lda #0 - jmp GIVAYF - .pend - ; source: library:/prog8lib/cx16/floats.p8:98 asmsub GIVUAYFAY (uword value @ AY) clobbers(A,X,Y) { - -GIVUAYFAY .proc - ; source: library:/prog8lib/cx16/floats.p8:100 %asm {{ - sty $c4 ; facmo ($64 on c128) - sta $c5 ; facmo+1 ($65 on c128) - ldx #$90 - sec - jmp FLOATC - .pend - ; source: library:/prog8lib/cx16/floats.p8:109 asmsub GIVAYFAY (uword value @ AY) clobbers(A,X,Y) { - -GIVAYFAY .proc - ; source: library:/prog8lib/cx16/floats.p8:111 %asm {{ - sta P8ZP_SCRATCH_B1 - tya - ldy P8ZP_SCRATCH_B1 - jmp GIVAYF ; this uses the inverse order, Y/A - .pend - ; source: library:/prog8lib/cx16/floats.p8:119 asmsub GETADRAY () clobbers(X) -> uword @ AY { - -GETADRAY .proc - ; source: library:/prog8lib/cx16/floats.p8:121 %asm {{ - jsr GETADR ; this uses the inverse order, Y/A - sta P8ZP_SCRATCH_B1 - tya - ldy P8ZP_SCRATCH_B1 - rts - .pend - ; source: library:/prog8lib/cx16/floats.p8:130 asmsub FREADUY (ubyte value @Y) { - -FREADUY .proc - ; source: library:/prog8lib/cx16/floats.p8:132 %asm {{ - lda #0 - jmp GIVAYF - .pend - ; source: library:/prog8lib/cx16/floats.p8:138 asmsub parse(str value @AY) -> float @FAC1 { - -parse .proc - ; source: library:/prog8lib/cx16/floats.p8:143 %asm {{ - ldx VAL_1 - cpx #$4c ; is there an implementation in VAL_1? (test for JMP) - bne + ; no, do it ourselves - pha ; yes, count the length and call rom VAL_1. - phy - jsr prog8_lib.strlen - tya - ply - plx - jmp VAL_1 -+ sta $a9 ; 'index' variable - sty $aa - jsr prog8_lib.strlen - lda $deb6 - cmp #$d0 ; sanity check for kernal routine correct - bne + - tya - jmp $deb6 ; kernal version dependent... -+ ; print error message if routine is borked in kernal, and exit program - ldy #0 -- lda _msg,y - beq + - jsr cbm.CHROUT - iny - bne - -+ jmp sys.exit - -_msg .text 13,"?val kaputt",13,0 - .pend - ; source: library:/prog8lib/cx16/floats.p8:185 asmsub normalize(float value @FAC1) -> float @ FAC1 { - -normalize .proc - ; source: library:/prog8lib/cx16/floats.p8:186 %asm {{ - jmp floats.NORMAL - .pend - ; source: library:/prog8lib/cx16/floats.p8:191 %asminclude "library:c64/floats.asm" -; --- low level floating point assembly routines for the C64 - -FL_ONE_const .byte 129 ; 1.0 -FL_ZERO_const .byte 0,0,0,0,0 ; 0.0 -FL_LOG2_const .byte $80, $31, $72, $17, $f8 ; log(2) - - -floats_temp_var .byte 0,0,0,0,0 ; temporary storage for a float - -ub2float .proc - ; -- convert ubyte in SCRATCH_ZPB1 to float at address A/Y - ; clobbers A, X, Y - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy P8ZP_SCRATCH_B1 - lda #0 - jsr GIVAYF -_fac_to_mem ldx P8ZP_SCRATCH_W2 - ldy P8ZP_SCRATCH_W2+1 - jmp MOVMF - .pend - -b2float .proc - ; -- convert byte in SCRATCH_ZPB1 to float at address A/Y - ; clobbers A, X, Y - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - lda P8ZP_SCRATCH_B1 - jsr FREADSA - jmp ub2float._fac_to_mem - .pend - -uw2float .proc - ; -- convert uword in SCRATCH_ZPWORD1 to float at address A/Y - ; clobbers X - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - lda P8ZP_SCRATCH_W1 - ldy P8ZP_SCRATCH_W1+1 - jsr GIVUAYFAY - jmp ub2float._fac_to_mem - .pend - -w2float .proc - ; -- convert word in SCRATCH_ZPWORD1 to float at address A/Y - ; clobbers X - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - jsr GIVAYF - jmp ub2float._fac_to_mem - .pend - - -cast_from_uw .proc - ; -- uword in A/Y into float var at (P8ZP_SCRATCH_W2) - ; clobbers X - jsr GIVUAYFAY - jmp ub2float._fac_to_mem - .pend - - -cast_from_w .proc - ; -- word in A/Y into float var at (P8ZP_SCRATCH_W2) - ; clobbers X - jsr GIVAYFAY - jmp ub2float._fac_to_mem - .pend - - -cast_from_ub .proc - ; -- ubyte in Y into float var at (P8ZP_SCRATCH_W2) - ; clobbers X - jsr FREADUY - jmp ub2float._fac_to_mem - .pend - - -cast_from_b .proc - ; -- byte in A into float var at (P8ZP_SCRATCH_W2) - ; clobbers X - jsr FREADSA - jmp ub2float._fac_to_mem - .pend - -cast_as_uw_into_ya .proc ; also used for float 2 ub - ; -- cast float at A/Y to uword into Y/A - ; clobbers X - jsr MOVFM - jmp cast_FAC1_as_uw_into_ya - .pend - -cast_as_w_into_ay .proc ; also used for float 2 b - ; -- cast float at A/Y to word into A/Y - ; clobbers X - jsr MOVFM - jmp cast_FAC1_as_w_into_ay - .pend - -cast_as_bool_into_a .proc - ; -- cast float at A/Y to bool into A - ; clobbers X - jsr MOVFM - jmp cast_FAC1_as_bool_into_a - .pend - -cast_FAC1_as_bool_into_a .proc - ; -- cast fac1 to bool into A - ; clobbers X - jsr SIGN - and #1 - rts - .pend - -cast_FAC1_as_uw_into_ya .proc ; also used for float 2 ub - ; -- cast fac1 to uword into Y/A - ; clobbers X - jmp GETADR ; into Y/A - .pend - -cast_FAC1_as_w_into_ay .proc ; also used for float 2 b - ; -- cast fac1 to word into A/Y - ; clobbers X - jsr AYINT - ldy floats.AYINT_facmo - lda floats.AYINT_facmo+1 - rts - .pend - - -copy_float .proc - ; -- copies the 5 bytes of the mflt value pointed to by P8ZP_SCRATCH_W1, - ; into the 5 bytes pointed to by A/Y. Clobbers A,Y. - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #0 - lda (P8ZP_SCRATCH_W1),y - sta (P8ZP_SCRATCH_W2),y - iny - lda (P8ZP_SCRATCH_W1),y - sta (P8ZP_SCRATCH_W2),y - iny - lda (P8ZP_SCRATCH_W1),y - sta (P8ZP_SCRATCH_W2),y - iny - lda (P8ZP_SCRATCH_W1),y - sta (P8ZP_SCRATCH_W2),y - iny - lda (P8ZP_SCRATCH_W1),y - sta (P8ZP_SCRATCH_W2),y - rts - .pend - -inc_var_f .proc - ; -- add 1 to float pointed to by A/Y - ; clobbers X - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - jsr MOVFM - lda #FL_ONE_const - jsr FADD - ldx P8ZP_SCRATCH_W1 - ldy P8ZP_SCRATCH_W1+1 - jmp MOVMF - .pend - -dec_var_f .proc - ; -- subtract 1 from float pointed to by A/Y - ; clobbers X - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #FL_ONE_const - jsr MOVFM - lda P8ZP_SCRATCH_W1 - ldy P8ZP_SCRATCH_W1+1 - jsr FSUB - ldx P8ZP_SCRATCH_W1 - ldy P8ZP_SCRATCH_W1+1 - jmp MOVMF - .pend - - -fmath_float1 .byte 0,0,0,0,0 ; storage for a mflpt5 value -fmath_float2 .byte 0,0,0,0,0 ; storage for a mflpt5 value - - -var_fac1_less_f .proc - ; -- is the float in FAC1 < the variable AY? Result in A. Clobbers X. - jsr FCOMP - cmp #255 - beq + - lda #0 - rts -+ lda #1 - rts - .pend - -var_fac1_lesseq_f .proc - ; -- is the float in FAC1 <= the variable AY? Result in A. Clobbers X. - jsr FCOMP - cmp #0 - beq + - cmp #255 - beq + - lda #0 - rts -+ lda #1 - rts - .pend - -var_fac1_greater_f .proc - ; -- is the float in FAC1 > the variable AY? Result in A. Clobbers X. - jsr FCOMP - cmp #1 - beq + - lda #0 - rts -+ lda #1 - rts - .pend - -var_fac1_greatereq_f .proc - ; -- is the float in FAC1 >= the variable AY? Result in A. Clobbers X. - jsr FCOMP - cmp #0 - beq + - cmp #1 - beq + - lda #0 - rts -+ lda #1 - rts - .pend - -var_fac1_equal_f .proc - ; -- are the floats numbers in FAC1 and the variable AY identical? Result in A. Clobbers X. - jsr FCOMP - and #1 - eor #1 - rts - .pend - -var_fac1_notequal_f .proc - ; -- are the floats numbers in FAC1 and the variable AY *not* identical? Result in A. Clobbers X. - jsr FCOMP - and #1 - rts - .pend - -vars_equal_f .proc - ; -- are the mflpt5 numbers in P8ZP_SCRATCH_W1 and AY identical? Result in A - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #0 - lda (P8ZP_SCRATCH_W1),y - cmp (P8ZP_SCRATCH_W2),y - bne _false - iny - lda (P8ZP_SCRATCH_W1),y - cmp (P8ZP_SCRATCH_W2),y - bne _false - iny - lda (P8ZP_SCRATCH_W1),y - cmp (P8ZP_SCRATCH_W2),y - bne _false - iny - lda (P8ZP_SCRATCH_W1),y - cmp (P8ZP_SCRATCH_W2),y - bne _false - iny - lda (P8ZP_SCRATCH_W1),y - cmp (P8ZP_SCRATCH_W2),y - bne _false - lda #1 - rts -_false lda #0 - rts - .pend - - -vars_less_f .proc - ; -- is float in AY < float in P8ZP_SCRATCH_W2 ? Result in A. Clobbers X. - jsr MOVFM - lda P8ZP_SCRATCH_W2 - ldy P8ZP_SCRATCH_W2+1 - jsr FCOMP - cmp #255 - bne + - lda #1 - rts -+ lda #0 - rts - .pend - -vars_lesseq_f .proc - ; -- is float in AY <= float in P8ZP_SCRATCH_W2 ? Result in A. Clobbers X. - jsr MOVFM - lda P8ZP_SCRATCH_W2 - ldy P8ZP_SCRATCH_W2+1 - jsr FCOMP - cmp #255 - bne + -- lda #1 - rts -+ cmp #0 - beq - - lda #0 - rts - .pend - -less_f .proc - ; -- is f1 < f2? Result in A. Clobbers X. - jsr compare_floats - cmp #255 - beq compare_floats._return_true - bne compare_floats._return_false - .pend - - -lesseq_f .proc - ; -- is f1 <= f2? Result in A. Clobbers X. - jsr compare_floats - cmp #255 - beq compare_floats._return_true - cmp #0 - beq compare_floats._return_true - bne compare_floats._return_false - .pend - -greater_f .proc - ; -- is f1 > f2? Result in A. Clobbers X. - jsr compare_floats - cmp #1 - beq compare_floats._return_true - bne compare_floats._return_false - .pend - -greatereq_f .proc - ; -- is f1 >= f2? Result in A. Clobbers X. - jsr compare_floats - cmp #1 - beq compare_floats._return_true - cmp #0 - beq compare_floats._return_true - bne compare_floats._return_false - .pend - -set_array_float_from_fac1 .proc - ; -- set the float in FAC1 in the array (index in A, array in P8ZP_SCRATCH_W1) - ; clobbers X - sta P8ZP_SCRATCH_B1 - asl a - asl a - clc - adc P8ZP_SCRATCH_B1 - ldy P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W1 - bcc + - iny -+ tax - jmp MOVMF - .pend - - -set_0_array_float .proc - ; -- set a float in an array to zero (index in A, array in P8ZP_SCRATCH_W1) - sta P8ZP_SCRATCH_B1 - asl a - asl a - clc - adc P8ZP_SCRATCH_B1 - tay - lda #0 - sta (P8ZP_SCRATCH_W1),y - iny - sta (P8ZP_SCRATCH_W1),y - iny - sta (P8ZP_SCRATCH_W1),y - iny - sta (P8ZP_SCRATCH_W1),y - iny - sta (P8ZP_SCRATCH_W1),y - rts - .pend - - -set_array_float .proc - ; -- set a float in an array to a value (index in A, float in P8ZP_SCRATCH_W1, array in P8ZP_SCRATCH_W2) - sta P8ZP_SCRATCH_B1 - asl a - asl a - clc - adc P8ZP_SCRATCH_B1 - adc P8ZP_SCRATCH_W2 - ldy P8ZP_SCRATCH_W2+1 - bcc + - iny -+ jmp copy_float - ; -- copies the 5 bytes of the mflt value pointed to by SCRATCH_ZPWORD1, - ; into the 5 bytes pointed to by A/Y. Clobbers A,Y. - .pend - - -pushFAC1 .proc - ;-- push floating point in FAC onto the cpu stack - ; save return address - pla - sta P8ZP_SCRATCH_W2 - pla - sta P8ZP_SCRATCH_W2+1 - ldx #floats.floats_temp_var - jsr floats.MOVMF - lda floats.floats_temp_var - pha - lda floats.floats_temp_var+1 - pha - lda floats.floats_temp_var+2 - pha - lda floats.floats_temp_var+3 - pha - lda floats.floats_temp_var+4 - pha - ; re-push return address - lda P8ZP_SCRATCH_W2+1 - pha - lda P8ZP_SCRATCH_W2 - pha - rts - .pend - -popFAC .proc - ; -- pop floating point value from cpu stack into FAC1 or FAC2 ( - ; carry flag clear=FAC1, carry set=FAC2 - ; save return address - pla - sta P8ZP_SCRATCH_W2 - pla - sta P8ZP_SCRATCH_W2+1 - pla - sta floats.floats_temp_var+4 - pla - sta floats.floats_temp_var+3 - pla - sta floats.floats_temp_var+2 - pla - sta floats.floats_temp_var+1 - pla - sta floats.floats_temp_var - lda #floats.floats_temp_var - bcs + - jsr floats.MOVFM - jmp ++ -+ jsr floats.CONUPK -+ ; re-push return address - lda P8ZP_SCRATCH_W2+1 - pha - lda P8ZP_SCRATCH_W2 - pha - rts - .pend - ; source: library:/prog8lib/cx16/floats.p8:192 %asminclude "library:c64/floats_funcs.asm" -; --- floating point builtin functions - - -func_sign_f_into_A .proc - jsr MOVFM - jmp SIGN - .pend - -func_swap_f .proc - ; -- swap floats pointed to by SCRATCH_ZPWORD1, SCRATCH_ZPWORD2 - ldy #4 -- lda (P8ZP_SCRATCH_W1),y - pha - lda (P8ZP_SCRATCH_W2),y - sta (P8ZP_SCRATCH_W1),y - pla - sta (P8ZP_SCRATCH_W2),y - dey - bpl - - rts - .pend - -func_reverse_f .proc - ; --- reverse an array of floats (array in P8ZP_SCRATCH_W1, num elements in A) -_left_index = P8ZP_SCRATCH_W2 -_right_index = P8ZP_SCRATCH_W2+1 -_loop_count = P8ZP_SCRATCH_REG - pha - jsr a_times_5 - sec - sbc #5 - sta _right_index - lda #0 - sta _left_index - pla - lsr a - sta _loop_count -_loop ; push the left indexed float on the stack - ldy _left_index - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - pha - ; copy right index float to left index float - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - inc _left_index - inc _right_index - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - inc _left_index - inc _right_index - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - inc _left_index - inc _right_index - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - inc _left_index - inc _right_index - ldy _right_index - lda (P8ZP_SCRATCH_W1),y - ldy _left_index - sta (P8ZP_SCRATCH_W1),y - ; pop the float off the stack into the right index float - ldy _right_index - pla - sta (P8ZP_SCRATCH_W1),y - dey - pla - sta (P8ZP_SCRATCH_W1),y - dey - pla - sta (P8ZP_SCRATCH_W1),y - dey - pla - sta (P8ZP_SCRATCH_W1),y - dey - pla - sta (P8ZP_SCRATCH_W1),y - inc _left_index - lda _right_index - sec - sbc #9 - sta _right_index - dec _loop_count - bne _loop - rts - - .pend - - - -a_times_5 .proc - sta P8ZP_SCRATCH_B1 - asl a - asl a - clc - adc P8ZP_SCRATCH_B1 - rts - .pend - -func_any_f_into_A .proc - jsr a_times_5 - jmp prog8_lib.func_any_b_into_A - .pend - -func_all_f_into_A .proc - jsr a_times_5 - jmp prog8_lib.func_all_b_into_A - .pend - -func_any_f_stack .proc - jsr a_times_5 - jmp prog8_lib.func_any_b_stack - .pend - -func_all_f_stack .proc - jsr a_times_5 - jmp prog8_lib.func_all_b_stack - .pend - -func_abs_f_into_FAC1 .proc - jsr MOVFM - jmp ABS - .pend - -func_sqrt_into_FAC1 .proc - jsr MOVFM - jmp SQR - .pend - - - -containment_floatarray .proc - ; -- check if a value exists in a float array. - ; parameters: FAC1: value to check, P8ZP_SCRATCH_W1: address of the word array, Y = length of array (>=1). - ; returns boolean 0/1 in A. - sty P8ZP_SCRATCH_REG - ldx #floats.floats_temp_var - jsr floats.MOVMF - ldx P8ZP_SCRATCH_REG - ldy #0 -- lda floats.floats_temp_var - cmp (P8ZP_SCRATCH_W1),y - bne _firstmiss - iny - lda floats.floats_temp_var+1 - cmp (P8ZP_SCRATCH_W1),y - bne _secondmiss - iny - lda floats.floats_temp_var+2 - cmp (P8ZP_SCRATCH_W1),y - bne _thirdmiss - iny - lda floats.floats_temp_var+3 - cmp (P8ZP_SCRATCH_W1),y - bne _fourthmiss - iny - lda floats.floats_temp_var+4 - cmp (P8ZP_SCRATCH_W1),y - bne _fifthmiss - lda #1 - rts - -_firstmiss - iny -_secondmiss - iny -_thirdmiss - iny -_fourthmiss - iny -_fifthmiss - iny - dex - bne - - lda #0 - rts - - .pend - ; source: library:/prog8lib/shared_floats_functions.p8:5 asmsub print(float value @FAC1) clobbers(A,X,Y) { - -print .proc - ; source: library:/prog8lib/shared_floats_functions.p8:7 %asm {{ - jsr tostr - ldy #0 -- lda (P8ZP_SCRATCH_W1),y - beq + - jsr cbm.CHROUT - iny - bne - -+ rts - .pend - ; source: library:/prog8lib/shared_floats_functions.p8:19 asmsub tostr(float value @FAC1) clobbers(X) -> str @AY { - -tostr .proc - ; source: library:/prog8lib/shared_floats_functions.p8:21 %asm {{ - jsr FOUT - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 - lda (P8ZP_SCRATCH_W1),y - cmp #' ' - bne + - inc P8ZP_SCRATCH_W1 - bne + - inc P8ZP_SCRATCH_W1+1 -+ lda P8ZP_SCRATCH_W1 - ldy P8ZP_SCRATCH_W1+1 - rts - .pend - ; source: library:/prog8lib/shared_floats_functions.p8:54 sub sin(float angle) -> float { - -sin .proc -; statements - ; source: library:/prog8lib/shared_floats_functions.p8:55 %asm {{ - lda #angle - jsr MOVFM - jmp SIN -; variables - .section BSS - .send BSS - -; non-zeropage variables without initialization value - .section BSS -angle .fill 5 - .send BSS - .pend - ; source: library:/prog8lib/shared_floats_functions.p8:114 sub rad(float angle) -> float { - -rad .proc -; statements - ; source: library:/prog8lib/shared_floats_functions.p8:116 %asm {{ - lda #angle - jsr MOVFM - lda #<_pi_div_180 - ldy #>_pi_div_180 - jmp FMULT -_pi_div_180 .byte 123, 14, 250, 53, 18 ; pi / 180 -; variables - .section BSS - .send BSS - -; non-zeropage variables without initialization value - .section BSS -angle .fill 5 - .send BSS - .pend - ; source: library:/prog8lib/shared_floats_functions.p8:218 inline asmsub push(float value @FAC1) { - ; source: library:/prog8lib/shared_floats_functions.p8:224 inline asmsub pop() -> float @FAC1 { - .pend - -; ---- block: 'test_stack' ---- -test_stack .proc - ; source: library:/prog8lib/test_stack.p8:5 test_stack { - - - ; source: library:/prog8lib/test_stack.p8:6 %option no_symbol_prefixing, ignore_unused - ; source: library:/prog8lib/test_stack.p8:8 asmsub test() { - -test .proc - ; source: library:/prog8lib/test_stack.p8:9 %asm {{ - lda #13 - jsr txt.chrout - lda #'-' - ldy #12 -- jsr txt.chrout - dey - bne - - lda #13 - jsr txt.chrout - lda #'s' - jsr txt.chrout - lda #'p' - jsr txt.chrout - lda #'=' - jsr txt.chrout - tsx - txa - jsr txt.print_ub - lda #13 - jsr txt.chrout - lda #'-' - ldy #12 -- jsr txt.chrout - dey - bne - - lda #13 - jmp txt.chrout - .pend - .pend - -; ---- block: 'math' ---- -math .proc - ; source: library:/prog8lib/math.p8:5 math { - - - ; source: library:/prog8lib/math.p8:6 %option no_symbol_prefixing, ignore_unused - ; source: library:/prog8lib/math.p8:8 %asminclude "library:math.asm" -; Internal Math library routines - always included by the compiler -; Generic machine independent 6502 code. -; -; some more interesting routines can be found here: -; http://6502org.wikidot.com/software-math -; http://codebase64.org/doku.php?id=base:6502_6510_maths -; https://github.com/TobyLobster/multiply_test -; https://github.com/TobyLobster/sqrt_test - - -multiply_bytes .proc - ; -- multiply 2 bytes A and Y, result as byte in A (signed or unsigned) - ; https://github.com/TobyLobster/multiply_test/blob/main/tests/mult29.a - -_multiplicand = P8ZP_SCRATCH_B1 -_multiplier = P8ZP_SCRATCH_REG - - sty _multiplicand - lsr a - sta _multiplier - lda #0 - ldx #2 -- - bcc + - clc - adc _multiplicand -+ - ror a - ror _multiplier - bcc + - clc - adc _multiplicand -+ - ror a - ror _multiplier - - bcc + - clc - adc _multiplicand -+ - ror a - ror _multiplier - bcc + - clc - adc _multiplicand -+ - ror a - ror _multiplier - dex - bne - - ; tay ; if you want 16 bits result in AY, enable this again - lda _multiplier - rts - .pend - - -multiply_words .proc - ; -- multiply two 16-bit words into a 32-bit result (signed and unsigned) - ; input: A/Y = first 16-bit number, multiply_words.multiplier = second 16-bit number - ; output: multiply_words.result, 4-bytes/32-bits product, LSB order (low-to-high) low 16 bits also in AY. - - ; NOTE: the result (which includes the multiplier parameter on entry) is a 4-byte array. - ; this routine could be faster if we could stick that into zeropage, - ; but there currently is no way to use 4 consecutive bytes in ZP (without disabling irq and saving/restoring them)... - -; mult62.a -; from: https://github.com/TobyLobster/multiply_test/blob/main/tests/mult62.a -; based on Dr Jefyll, http://forum.6502.org/viewtopic.php?f=9&t=689&start=0#p19958 -; - adjusted to use fixed zero page addresses -; - removed 'decrement to avoid clc' as this is slower on average -; - rearranged memory use to remove final memory copy and give LSB first order to result -; - removed temp zp storage bytes -; - unrolled the outer loop -; - unrolled the two inner loops once -; -; 16 bit x 16 bit unsigned multiply, 32 bit result -; Average cycles: ~442 ? -; 93 bytes - -_multiplicand = P8ZP_SCRATCH_W2 ; 2 bytes -multiplier = result - -; 16 bit x 16 bit unsigned multiply, 32 bit result -; -; On Entry: -; (multiplier, multiplier+1): two byte multiplier, four bytes needed for result -; (multiplicand, multiplicand+1): two byte multiplicand -; On Exit: -; (result, result+1, result+2, result+3): product - - sta _multiplicand - sty _multiplicand+1 - - lda #0 ; - sta result+2 ; 16 bits of zero in A, result+2 - ; Note: First 8 shifts are A -> result+2 -> result - ; Final 8 shifts are A -> result+2 -> result+1 - - ; --- 1st byte --- - ldy #4 ; count for inner loop - lsr result - - ; inner loop (8 times) -_inner_loop - ; first time - bcc + - tax ; retain A - lda result+2 - clc - adc _multiplicand - sta result+2 - txa ; recall A - adc _multiplicand+1 - -+ - ror a ; shift - ror result+2 - ror result - - ; second time - bcc + - tax ; retain A - lda result+2 - clc - adc _multiplicand - sta result+2 - txa ; recall A - adc _multiplicand+1 - -+ - ror a ; shift - ror result+2 - ror result - - dey - bne _inner_loop ; go back for 1 more shift? - - ; --- 2nd byte --- - ldy #4 ; count for inner loop - lsr result+1 - - ; inner loop (8 times) -_inner_loop2 - ; first time - bcc + - tax ; retain A - lda result+2 - clc - adc _multiplicand - sta result+2 - txa ; recall A - adc _multiplicand+1 - -+ - ror a ; shift - ror result+2 - ror result+1 - - ; second time - bcc + - tax ; retain A - lda result+2 - clc - adc _multiplicand - sta result+2 - txa ; recall A - adc _multiplicand+1 - -+ - ror a ; shift - ror result+2 - ror result+1 - dey - bne _inner_loop2 ; go back for 1 more shift? - - sta result+3 ; ms byte of hi-word of result - - lda result - ldy result+1 - rts - -result .byte 0,0,0,0 - - .pend - - -divmod_b_asm .proc - ; signed byte division: make everything positive and fix sign afterwards - sta P8ZP_SCRATCH_B1 - tya - eor P8ZP_SCRATCH_B1 - php ; save sign - lda P8ZP_SCRATCH_B1 - bpl + - eor #$ff - sec - adc #0 ; make it positive -+ pha - tya - bpl + - eor #$ff - sec - adc #0 ; make it positive - tay -+ pla - jsr divmod_ub_asm - sta _remainder - plp - bpl + - tya - eor #$ff - sec - adc #0 ; negate result - tay -+ rts -_remainder .byte 0 - .pend - - -divmod_ub_asm .proc - ; -- divide A by Y, result quotient in Y, remainder in A (unsigned) - ; division by zero will result in quotient = 255 and remainder = original number - sty P8ZP_SCRATCH_REG - sta P8ZP_SCRATCH_B1 - - lda #0 - ldx #8 - asl P8ZP_SCRATCH_B1 -- rol a - cmp P8ZP_SCRATCH_REG - bcc + - sbc P8ZP_SCRATCH_REG -+ rol P8ZP_SCRATCH_B1 - dex - bne - - ldy P8ZP_SCRATCH_B1 - rts - .pend - -divmod_w_asm .proc - ; signed word division: make everything positive and fix sign afterwards - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - lda P8ZP_SCRATCH_W1+1 - eor P8ZP_SCRATCH_W2+1 - php ; save sign - lda P8ZP_SCRATCH_W1+1 - bpl + - lda #0 - sec - sbc P8ZP_SCRATCH_W1 - sta P8ZP_SCRATCH_W1 - lda #0 - sbc P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W1+1 -+ lda P8ZP_SCRATCH_W2+1 - bpl + - lda #0 - sec - sbc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W2 - lda #0 - sbc P8ZP_SCRATCH_W2+1 - sta P8ZP_SCRATCH_W2+1 -+ tay - lda P8ZP_SCRATCH_W2 - jsr divmod_uw_asm - plp ; restore sign - bpl + - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - lda #0 - sec - sbc P8ZP_SCRATCH_W2 - pha - lda #0 - sbc P8ZP_SCRATCH_W2+1 - tay - pla -+ rts - .pend - -divmod_uw_asm .proc - ; -- divide two unsigned words (16 bit each) into 16 bit results - ; input: P8ZP_SCRATCH_W1 in ZP: 16 bit number, A/Y: 16 bit divisor - ; output: P8ZP_SCRATCH_W2 in ZP: 16 bit remainder, A/Y: 16 bit division result - ; division by zero will result in quotient = 65535 and remainder = divident - - -dividend = P8ZP_SCRATCH_W1 -remainder = P8ZP_SCRATCH_W2 -result = dividend ;save memory by reusing divident to store the result - - sta _divisor - sty _divisor+1 - lda #0 ;preset remainder to 0 - sta remainder - sta remainder+1 - ldx #16 ;repeat for each bit: ... - -- asl dividend ;dividend lb & hb*2, msb -> Carry - rol dividend+1 - rol remainder ;remainder lb & hb * 2 + msb from carry - rol remainder+1 - lda remainder - sec - sbc _divisor ;substract divisor to see if it fits in - tay ;lb result -> Y, for we may need it later - lda remainder+1 - sbc _divisor+1 - bcc + ;if carry=0 then divisor didn't fit in yet - - sta remainder+1 ;else save substraction result as new remainder, - sty remainder - inc result ;and INCrement result cause divisor fit in 1 times - -+ dex - bne - - - lda result - ldy result+1 - rts -_divisor .word 0 - .pend - - -randword .proc - ; -- 16 bit pseudo random number generator into AY - ; default seed = $00c2 $1137 - ; routine from https://codebase64.org/doku.php?id=base:x_abc_random_number_generator_8_16_bit - inc x1 - clc -x1=*+1 - lda #$00 ;x1 -c1=*+1 - eor #$c2 ;c1 -a1=*+1 - eor #$11 ;a1 - sta a1 -b1=*+1 - adc #$37 ;b1 - sta b1 - lsr a - eor a1 - adc c1 - sta c1 - ldy b1 - rts - .pend - -randbyte = randword ; -- 8 bit pseudo random number generator into A (by just reusing randword) - - -; ----------- optimized multiplications (in-place A (byte) and ?? (word)) : --------- -mul_byte_3 .proc - ; A = A + A*2 - sta P8ZP_SCRATCH_REG - asl a - clc - adc P8ZP_SCRATCH_REG - rts - .pend - -mul_word_3 .proc - ; AY = AY*2 + AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - tay - lda P8ZP_SCRATCH_W1 - rts - .pend - - -mul_byte_5 .proc - ; A = A*4 + A - sta P8ZP_SCRATCH_REG - asl a - asl a - clc - adc P8ZP_SCRATCH_REG - rts - .pend - -mul_word_5 .proc - ; AY = AY*4 + AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - tay - lda P8ZP_SCRATCH_W1 - rts - .pend - - -mul_byte_6 .proc - ; A = (A*2 + A)*2 - sta P8ZP_SCRATCH_REG - asl a - clc - adc P8ZP_SCRATCH_REG - asl a - rts - .pend - -mul_word_6 .proc - ; AY = (AY*2 + AY)*2 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - tay - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - sta P8ZP_SCRATCH_W1+1 - tya - asl a - rol P8ZP_SCRATCH_W1+1 - ldy P8ZP_SCRATCH_W1+1 - rts - .pend - -mul_byte_7 .proc - ; A = A*8 - A - sta P8ZP_SCRATCH_REG - asl a - asl a - asl a - sec - sbc P8ZP_SCRATCH_REG - rts - .pend - -mul_word_7 .proc - ; AY = AY*8 - AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - sec - sbc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - sbc P8ZP_SCRATCH_W2+1 - tay - lda P8ZP_SCRATCH_W1 - rts - .pend - -mul_byte_9 .proc - ; A = A*8 + A - sta P8ZP_SCRATCH_REG - asl a - asl a - asl a - clc - adc P8ZP_SCRATCH_REG - rts - .pend - -mul_word_9 .proc - ; AY = AY*8 + AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - tay - lda P8ZP_SCRATCH_W1 - rts - rts - .pend - -mul_byte_10 .proc - ; A=(A*4 + A)*2 - sta P8ZP_SCRATCH_REG - asl a - asl a - clc - adc P8ZP_SCRATCH_REG - asl a - rts - .pend - -mul_word_10 .proc - ; AY=(AY*4 + AY)*2 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - sta P8ZP_SCRATCH_W1+1 - lda P8ZP_SCRATCH_W1 - asl a - rol P8ZP_SCRATCH_W1+1 - ldy P8ZP_SCRATCH_W1+1 - rts - .pend - -mul_byte_11 .proc - ; A=(A*2 + A)*4 - A - sta P8ZP_SCRATCH_REG - asl a - clc - adc P8ZP_SCRATCH_REG - asl a - asl a - sec - sbc P8ZP_SCRATCH_REG - rts - .pend - -; mul_word_11 is skipped (too much code) - -mul_byte_12 .proc - ; A=(A*2 + A)*4 - sta P8ZP_SCRATCH_REG - asl a - clc - adc P8ZP_SCRATCH_REG - asl a - asl a - rts - .pend - -mul_word_12 .proc - ; AY=(AY*2 + AY)*4 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - sta P8ZP_SCRATCH_W1+1 - lda P8ZP_SCRATCH_W1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - ldy P8ZP_SCRATCH_W1+1 - rts - .pend - -mul_byte_13 .proc - ; A=(A*2 + A)*4 + A - sta P8ZP_SCRATCH_REG - asl a - clc - adc P8ZP_SCRATCH_REG - asl a - asl a - clc - adc P8ZP_SCRATCH_REG - rts - .pend - -; mul_word_13 is skipped (too much code) - -mul_byte_14 .proc - ; A=(A*8 - A)*2 - sta P8ZP_SCRATCH_REG - asl a - asl a - asl a - sec - sbc P8ZP_SCRATCH_REG - asl a - rts - .pend - -; mul_word_14 is skipped (too much code) - -mul_byte_15 .proc - ; A=A*16 - A - sta P8ZP_SCRATCH_REG - asl a - asl a - asl a - asl a - sec - sbc P8ZP_SCRATCH_REG - rts - .pend - -mul_word_15 .proc - ; AY = AY * 16 - AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - sec - sbc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - sbc P8ZP_SCRATCH_W2+1 - tay - lda P8ZP_SCRATCH_W1 - rts - .pend - -mul_byte_20 .proc - ; A=(A*4 + A)*4 - sta P8ZP_SCRATCH_REG - asl a - asl a - clc - adc P8ZP_SCRATCH_REG - asl a - asl a - rts - .pend - -mul_word_20 .proc - ; AY = AY * 10 * 2 - jsr mul_word_10 - sty P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - ldy P8ZP_SCRATCH_REG - rts - .pend - -mul_byte_25 .proc - ; A=(A*2 + A)*8 + A - sta P8ZP_SCRATCH_REG - asl a - clc - adc P8ZP_SCRATCH_REG - asl a - asl a - asl a - clc - adc P8ZP_SCRATCH_REG - rts - .pend - -mul_word_25 .proc - ; AY = (AY*2 + AY) *8 + AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - sta P8ZP_SCRATCH_W1+1 - lda P8ZP_SCRATCH_W1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - tay - lda P8ZP_SCRATCH_W1 - rts - .pend - -mul_byte_40 .proc - and #7 - tay - lda _forties,y - rts -_forties .byte 0*40, 1*40, 2*40, 3*40, 4*40, 5*40, 6*40, 7*40 & 255 - .pend - -mul_word_40 .proc - ; AY = (AY*4 + AY)*8 - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - asl a - rol P8ZP_SCRATCH_W1+1 - asl a - rol P8ZP_SCRATCH_W1+1 - clc - adc P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_W1 - lda P8ZP_SCRATCH_W1+1 - adc P8ZP_SCRATCH_W2+1 - asl P8ZP_SCRATCH_W1 - rol a - asl P8ZP_SCRATCH_W1 - rol a - asl P8ZP_SCRATCH_W1 - rol a - tay - lda P8ZP_SCRATCH_W1 - rts - .pend - -mul_byte_50 .proc - and #7 - tay - lda _fifties, y - rts -_fifties .byte 0*50, 1*50, 2*50, 3*50, 4*50, 5*50, 6*50 & 255, 7*50 & 255 - .pend - -mul_word_50 .proc - ; AY = AY * 25 * 2 - jsr mul_word_25 - sty P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - ldy P8ZP_SCRATCH_REG - rts - .pend - -mul_byte_80 .proc - and #3 - tay - lda _eighties, y - rts -_eighties .byte 0*80, 1*80, 2*80, 3*80 - .pend - -mul_word_80 .proc - ; AY = AY * 40 * 2 - jsr mul_word_40 - sty P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - ldy P8ZP_SCRATCH_REG - rts - .pend - -mul_byte_100 .proc - and #3 - tay - lda _hundreds, y - rts -_hundreds .byte 0*100, 1*100, 2*100, 3*100 & 255 - .pend - -mul_word_100 .proc - ; AY = AY * 25 * 4 - jsr mul_word_25 - sty P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - ldy P8ZP_SCRATCH_REG - rts - .pend - -mul_word_320 .proc - ; AY = A * 256 + A * 64 (msb in Y doesn't matter) - sta P8ZP_SCRATCH_B1 - ldy #0 - sty P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - asl a - rol P8ZP_SCRATCH_REG - pha - clc - lda P8ZP_SCRATCH_B1 - adc P8ZP_SCRATCH_REG - tay - pla - rts - .pend - -mul_word_640 .proc - ; AY = (A * 2 * 320) (msb in Y doesn't matter) - asl a - jmp mul_word_320 - .pend - - -; ----------- end optimized multiplications ----------- - - -; support for bit shifting that is too large to be unrolled: - -lsr_byte_A .proc - ; -- lsr signed byte in A times the value in Y - cpy #0 - beq + - cmp #0 - bpl lsr_ubyte_A -- sec - ror a - dey - bne - -+ rts - .pend - -lsr_ubyte_A .proc - ; -- lsr unsigned byte in A times the value in Y - cpy #0 - beq + -- lsr a - dey - bne - -+ rts - .pend - -asl_byte_A .proc - ; -- asl any byte in A times the value in Y - cpy #0 - beq + -- asl a - dey - bne - -+ rts - .pend - - -lsr_word_AY .proc - ; -- lsr signed word in AY times the value in X - cpx #0 - beq + - cpy #0 - bpl lsr_uword_AY - sty P8ZP_SCRATCH_B1 -- sec - ror P8ZP_SCRATCH_B1 - ror a - dex - bne - - ldy P8ZP_SCRATCH_B1 -+ rts - .pend - -lsr_uword_AY .proc - ; -- lsr unsigned word in AY times the value in X - cpx #0 - beq + - sty P8ZP_SCRATCH_B1 -- lsr P8ZP_SCRATCH_B1 - ror a - dex - bne - - ldy P8ZP_SCRATCH_B1 -+ rts - .pend - -asl_word_AY .proc - ; -- asl any word in AY times the value in X - cpx #0 - beq + - sty P8ZP_SCRATCH_B1 -- asl a - rol P8ZP_SCRATCH_B1 - dex - bne - - ldy P8ZP_SCRATCH_B1 -+ rts - .pend - - -square .proc -; -- calculate square of signed word (actually -255..255) in AY, result in AY -; routine by Lee Davison, source: http://6502.org/source/integers/square.htm -; using this routine is a lot faster as doing a regular multiplication (for words) -; -; Calculates the 16 bit unsigned integer square of the signed 16 bit integer in -; Numberl/Numberh. The result is always in the range 0 to 65025 and is held in -; Squarel/Squareh -; -; The maximum input range is only +/-255 and no checking is done to ensure that -; this is so. -; -; This routine is useful if you are trying to draw circles as for any circle -; -; x^2+y^2=r^2 where x and y are the co-ordinates of any point on the circle and -; r is the circle radius - -numberl = P8ZP_SCRATCH_W1 ; number to square low byte -numberh = P8ZP_SCRATCH_W1+1 ; number to square high byte -squarel = P8ZP_SCRATCH_W2 ; square low byte -squareh = P8ZP_SCRATCH_W2+1 ; square high byte -tempsq = P8ZP_SCRATCH_B1 ; temp byte for intermediate result - - sta numberl - sty numberh - - lda #$00 ; clear a - sta squarel ; clear square low byte - ; (no need to clear the high byte, it gets shifted out) - lda numberl ; get number low byte - ldx numberh ; get number high byte - bpl _nonneg ; if +ve don't negate it - ; else do a two's complement - eor #$ff ; invert - sec ; +1 - adc #$00 ; and add it - -_nonneg: - sta tempsq ; save abs(number) - ldx #$08 ; set bit count - -_nextr2bit: - asl squarel ; low byte *2 - rol squareh ; high byte *2+carry from low - asl a ; shift number byte - bcc _nosqadd ; don't do add if c = 0 - tay ; save a - clc ; clear carry for add - lda tempsq ; get number - adc squarel ; add number^2 low byte - sta squarel ; save number^2 low byte - lda #$00 ; clear a - adc squareh ; add number^2 high byte - sta squareh ; save number^2 high byte - tya ; get a back - -_nosqadd: - dex ; decrement bit count - bne _nextr2bit ; go do next bit - - lda squarel - ldy squareh - rts - - .pend - ; source: library:/prog8lib/math.p8:10 asmsub sin8u(ubyte angle @A) clobbers(Y) -> ubyte @A { - -sin8u .proc - ; source: library:/prog8lib/math.p8:11 %asm {{ - tay - lda _sinecos8u,y - rts -_sinecos8u .byte trunc(128.0 + 127.5 * sin(range(256+64) * rad(360.0/256.0))) - .pend - ; source: library:/prog8lib/math.p8:19 asmsub cos8u(ubyte angle @A) clobbers(Y) -> ubyte @A { - -cos8u .proc - ; source: library:/prog8lib/math.p8:20 %asm {{ - tay - lda sin8u._sinecos8u+64,y - rts - .pend - ; source: library:/prog8lib/math.p8:27 asmsub sin8(ubyte angle @A) clobbers(Y) -> byte @A { - -sin8 .proc - ; source: library:/prog8lib/math.p8:28 %asm {{ - tay - lda _sinecos8,y - rts -_sinecos8 .char trunc(127.0 * sin(range(256+64) * rad(360.0/256.0))) - .pend - ; source: library:/prog8lib/math.p8:36 asmsub cos8(ubyte angle @A) clobbers(Y) -> byte @A { - -cos8 .proc - ; source: library:/prog8lib/math.p8:37 %asm {{ - tay - lda sin8._sinecos8+64,y - rts - .pend - ; source: library:/prog8lib/math.p8:44 asmsub sinr8u(ubyte radians @A) clobbers(Y) -> ubyte @A { - -sinr8u .proc - ; source: library:/prog8lib/math.p8:45 %asm {{ - tay - lda _sinecosR8u,y - rts -_sinecosR8u .byte trunc(128.0 + 127.5 * sin(range(180+45) * rad(360.0/180.0))) - .pend - ; source: library:/prog8lib/math.p8:53 asmsub cosr8u(ubyte radians @A) clobbers(Y) -> ubyte @A { - -cosr8u .proc - ; source: library:/prog8lib/math.p8:54 %asm {{ - tay - lda sinr8u._sinecosR8u+45,y - rts - .pend - ; source: library:/prog8lib/math.p8:61 asmsub sinr8(ubyte radians @A) clobbers(Y) -> byte @A { - -sinr8 .proc - ; source: library:/prog8lib/math.p8:62 %asm {{ - tay - lda _sinecosR8,y - rts -_sinecosR8 .char trunc(127.0 * sin(range(180+45) * rad(360.0/180.0))) - .pend - ; source: library:/prog8lib/math.p8:70 asmsub cosr8(ubyte radians @A) clobbers(Y) -> byte @A { - -cosr8 .proc - ; source: library:/prog8lib/math.p8:71 %asm {{ - tay - lda sinr8._sinecosR8+45,y - rts - .pend - ; source: library:/prog8lib/math.p8:78 asmsub rnd() clobbers(Y) -> ubyte @A { - -rnd .proc - ; source: library:/prog8lib/math.p8:79 %asm {{ - jmp math.randbyte - .pend - ; source: library:/prog8lib/math.p8:84 asmsub rndw() -> uword @AY { - -rndw .proc - ; source: library:/prog8lib/math.p8:85 %asm {{ - jmp math.randword - .pend - ; source: library:/prog8lib/math.p8:108 asmsub rndseed(uword seed1 @AY, uword seed2 @R0) clobbers(A,Y) { - -rndseed .proc - ; source: library:/prog8lib/math.p8:110 %asm {{ - sta math.randword.x1 - sty math.randword.c1 - lda cx16.r0L - sta math.randword.a1 - lda cx16.r0H - sta math.randword.b1 - rts - .pend - ; source: library:/prog8lib/math.p8:121 asmsub log2(ubyte value @A) -> ubyte @Y { - -log2 .proc - ; source: library:/prog8lib/math.p8:122 %asm {{ - sta P8ZP_SCRATCH_B1 - lda #$80 - ldy #7 -- bit P8ZP_SCRATCH_B1 - beq + - rts -+ dey - bne + - rts -+ lsr a - bne - - .pend - ; source: library:/prog8lib/math.p8:137 asmsub log2w(uword value @AY) -> ubyte @Y { - -log2w .proc - ; source: library:/prog8lib/math.p8:138 %asm {{ - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - lda #<$8000 - sta cx16.r0 - lda #>$8000 - sta cx16.r0+1 - ldy #15 -- lda P8ZP_SCRATCH_W1 - and cx16.r0 - sta P8ZP_SCRATCH_B1 - lda P8ZP_SCRATCH_W1+1 - and cx16.r0+1 - ora P8ZP_SCRATCH_B1 - beq + - rts -+ dey - bne + - rts -+ lsr cx16.r0+1 - ror cx16.r0 - jmp - - .pend - ; source: library:/prog8lib/math.p8:163 asmsub mul16_last_upper() -> uword @AY { - -mul16_last_upper .proc - ; source: library:/prog8lib/math.p8:171 %asm {{ - lda multiply_words.result+2 - ldy multiply_words.result+3 - rts - .pend - ; source: library:/prog8lib/math.p8:212 asmsub direction_qd(ubyte quadrant @A, ubyte xdelta @X, ubyte ydelta @Y) -> ubyte @A { - -direction_qd .proc - ; source: library:/prog8lib/math.p8:220 %asm {{ -x_delta = cx16.r0L -y_delta = cx16.r1L -quadrant = cx16.r2L -half_value = cx16.r3L -region_number = cx16.r4L -small = cx16.r5L -large = cx16.r5H - - sta quadrant - sty y_delta - stx x_delta - cpx y_delta - bcs _XGreaterOrEqualY - -_XLessY: - lda #16 - sta region_number - stx small - sty large - bne _DetermineRegion - -_XGreaterOrEqualY: - lda #0 - sta region_number - stx large - sty small - -_DetermineRegion: - ; set A = small * 2.5 - lda small - lsr a - sta half_value - lda small - asl a - bcs _SmallerQuotient - clc - adc half_value - bcs _SmallerQuotient - cmp large - bcc _LargerQuotient - -; S * 2.5 > L -_SmallerQuotient: - ; set A = S * 1.25 - lsr half_value - lda small - clc - adc half_value - cmp large - bcc _Region1 ; if S * 1.25 < L then goto Region1 (L / S > 1.25) - bcs _Region0 ; (L / S < 1.25) - -; S * 2.5 < L -_LargerQuotient: - ; set A = S * 7.5 - lda small - asl a - asl a - asl a - bcs _Region2 - sec - sbc half_value - cmp large - bcc _Region3 ; if S * 7.5 < L then goto Region3 (L / S > 7.5) - jmp _Region2 ; (L / S < 7.5) - -_Region0: - ; L / S < 1.25. d=3,9,15,21 - jmp _LookupResult - -_Region1: - ; 1.25 < L / S < 2.5. d=2,4,8,10,14,16,20,22 - lda region_number - clc - adc #4 - sta region_number - bpl _LookupResult - -_Region2: - ; 2.5 < L / S < 7.5. d=1,5,7,11,13,17,19,23 - lda region_number - clc - adc #8 - sta region_number - bpl _LookupResult - -_Region3: - ; 7.5 < L / S. d=0,6,12,18 - lda region_number - clc - adc #12 - sta region_number - -_LookupResult: - lda quadrant - clc - adc region_number - tax - lda _quadrant_region_to_direction,x - rts - -_quadrant_region_to_direction: - .byte 9, 3,15,21 - .byte 10, 2,14,22 - .byte 11, 1,13,23 - .byte 12, 0,12, 0 - .byte 9, 3,15,21 - .byte 8, 4,16,20 - .byte 7, 5,17,19 - .byte 6, 6,18,18 - .pend - ; source: library:/prog8lib/math.p8:335 asmsub atan2(ubyte x1 @R0, ubyte y1 @R1, ubyte x2 @R2, ubyte y2 @R3) -> ubyte @A { - -atan2 .proc - ; source: library:/prog8lib/math.p8:341 %asm {{ -x1 = cx16.r0L -y1 = cx16.r1L -x2 = cx16.r2L -y2 = cx16.r3L -octant = cx16.r4L ;; temporary zeropage variable - - lda x1 - sec - sbc x2 - bcs *+4 - eor #$ff - tax - rol octant - - lda y1 - sec - sbc y2 - bcs *+4 - eor #$ff - tay - rol octant - - lda log2_tab,x - sec - sbc log2_tab,y - bcc *+4 - eor #$ff - tax - - lda octant - rol a - and #%111 - tay - - lda atan_tab,x - eor octant_adjust,y - rts - -octant_adjust - .byte %00111111 ;; x+,y+,|x|>|y| - .byte %00000000 ;; x+,y+,|x|<|y| - .byte %11000000 ;; x+,y-,|x|>|y| - .byte %11111111 ;; x+,y-,|x|<|y| - .byte %01000000 ;; x-,y+,|x|>|y| - .byte %01111111 ;; x-,y+,|x|<|y| - .byte %10111111 ;; x-,y-,|x|>|y| - .byte %10000000 ;; x-,y-,|x|<|y| - - - ;;;;;;;; atan(2^(x/32))*128/pi ;;;;;;;; - -atan_tab - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$00,$00,$00 - .byte $00,$00,$00,$00,$00,$01,$01,$01 - .byte $01,$01,$01,$01,$01,$01,$01,$01 - .byte $01,$01,$01,$01,$01,$01,$01,$01 - .byte $01,$01,$01,$01,$01,$01,$01,$01 - .byte $01,$01,$01,$01,$01,$02,$02,$02 - .byte $02,$02,$02,$02,$02,$02,$02,$02 - .byte $02,$02,$02,$02,$02,$02,$02,$02 - .byte $03,$03,$03,$03,$03,$03,$03,$03 - .byte $03,$03,$03,$03,$03,$04,$04,$04 - .byte $04,$04,$04,$04,$04,$04,$04,$04 - .byte $05,$05,$05,$05,$05,$05,$05,$05 - .byte $06,$06,$06,$06,$06,$06,$06,$06 - .byte $07,$07,$07,$07,$07,$07,$08,$08 - .byte $08,$08,$08,$08,$09,$09,$09,$09 - .byte $09,$0a,$0a,$0a,$0a,$0b,$0b,$0b - .byte $0b,$0c,$0c,$0c,$0c,$0d,$0d,$0d - .byte $0d,$0e,$0e,$0e,$0e,$0f,$0f,$0f - .byte $10,$10,$10,$11,$11,$11,$12,$12 - .byte $12,$13,$13,$13,$14,$14,$15,$15 - .byte $15,$16,$16,$17,$17,$17,$18,$18 - .byte $19,$19,$19,$1a,$1a,$1b,$1b,$1c - .byte $1c,$1c,$1d,$1d,$1e,$1e,$1f,$1f - - - ;;;;;;;; log2(x)*32 ;;;;;;;; - -log2_tab - .byte $00,$00,$20,$32,$40,$4a,$52,$59 - .byte $60,$65,$6a,$6e,$72,$76,$79,$7d - .byte $80,$82,$85,$87,$8a,$8c,$8e,$90 - .byte $92,$94,$96,$98,$99,$9b,$9d,$9e - .byte $a0,$a1,$a2,$a4,$a5,$a6,$a7,$a9 - .byte $aa,$ab,$ac,$ad,$ae,$af,$b0,$b1 - .byte $b2,$b3,$b4,$b5,$b6,$b7,$b8,$b9 - .byte $b9,$ba,$bb,$bc,$bd,$bd,$be,$bf - .byte $c0,$c0,$c1,$c2,$c2,$c3,$c4,$c4 - .byte $c5,$c6,$c6,$c7,$c7,$c8,$c9,$c9 - .byte $ca,$ca,$cb,$cc,$cc,$cd,$cd,$ce - .byte $ce,$cf,$cf,$d0,$d0,$d1,$d1,$d2 - .byte $d2,$d3,$d3,$d4,$d4,$d5,$d5,$d5 - .byte $d6,$d6,$d7,$d7,$d8,$d8,$d9,$d9 - .byte $d9,$da,$da,$db,$db,$db,$dc,$dc - .byte $dd,$dd,$dd,$de,$de,$de,$df,$df - .byte $df,$e0,$e0,$e1,$e1,$e1,$e2,$e2 - .byte $e2,$e3,$e3,$e3,$e4,$e4,$e4,$e5 - .byte $e5,$e5,$e6,$e6,$e6,$e7,$e7,$e7 - .byte $e7,$e8,$e8,$e8,$e9,$e9,$e9,$ea - .byte $ea,$ea,$ea,$eb,$eb,$eb,$ec,$ec - .byte $ec,$ec,$ed,$ed,$ed,$ed,$ee,$ee - .byte $ee,$ee,$ef,$ef,$ef,$ef,$f0,$f0 - .byte $f0,$f1,$f1,$f1,$f1,$f1,$f2,$f2 - .byte $f2,$f2,$f3,$f3,$f3,$f3,$f4,$f4 - .byte $f4,$f4,$f5,$f5,$f5,$f5,$f5,$f6 - .byte $f6,$f6,$f6,$f7,$f7,$f7,$f7,$f7 - .byte $f8,$f8,$f8,$f8,$f9,$f9,$f9,$f9 - .byte $f9,$fa,$fa,$fa,$fa,$fa,$fb,$fb - .byte $fb,$fb,$fb,$fc,$fc,$fc,$fc,$fc - .byte $fd,$fd,$fd,$fd,$fd,$fd,$fe,$fe - .byte $fe,$fe,$fe,$ff,$ff,$ff,$ff,$ff - .pend - ; source: library:/prog8lib/math.p8:468 asmsub diff(ubyte v1 @A, ubyte v2 @Y) -> ubyte @A { - -diff .proc - ; source: library:/prog8lib/math.p8:470 %asm {{ - sty P8ZP_SCRATCH_REG - sec - sbc P8ZP_SCRATCH_REG - bcs + - eor #255 - inc a -+ rts - .pend - ; source: library:/prog8lib/math.p8:481 asmsub diffw(uword w1 @R0, uword w2 @AY) -> uword @AY { - -diffw .proc - ; source: library:/prog8lib/math.p8:483 %asm {{ - sec - sbc cx16.r0L - sta cx16.r0L - tya - sbc cx16.r0H - sta cx16.r0H - bcs + - eor #255 - sta cx16.r0H - lda cx16.r0L - eor #255 - inc a - sta cx16.r0L - bne + - inc cx16.r0H -+ lda cx16.r0L - ldy cx16.r0H - rts - .pend - .pend - -; ---- block: 'prog8_lib' ---- -prog8_lib .proc - ; source: library:/prog8lib/prog8_lib.p8:3 prog8_lib { - - - ; source: library:/prog8lib/prog8_lib.p8:4 %option no_symbol_prefixing, ignore_unused - ; source: library:/prog8lib/prog8_lib.p8:6 %asminclude "library:prog8_lib.asm" -; Internal library routines - always included by the compiler -; Generic machine independent 6502 code. - - -orig_stackpointer .byte 0 ; stores the Stack pointer register at program start - - -read_byte_from_address_in_AY_into_A .proc - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #0 - lda (P8ZP_SCRATCH_W2),y - rts - .pend - - -write_byte_X_to_address_in_AY .proc - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #0 - txa - sta (P8ZP_SCRATCH_W2),y - rts - .pend - - -reg_less_uw .proc - ; AY < P8ZP_SCRATCH_W2? - cpy P8ZP_SCRATCH_W2+1 - bcc _true - bne _false - cmp P8ZP_SCRATCH_W2 - bcc _true -_false lda #0 - rts -_true lda #1 - rts - .pend - -reg_less_w .proc - ; -- AY < P8ZP_SCRATCH_W2? - cmp P8ZP_SCRATCH_W2 - tya - sbc P8ZP_SCRATCH_W2+1 - bvc + - eor #$80 -+ bmi _true - lda #0 - rts -_true lda #1 - rts - .pend - -reg_lesseq_uw .proc - ; AY <= P8ZP_SCRATCH_W2? - cpy P8ZP_SCRATCH_W2+1 - beq + - bcc _true - lda #0 - rts -+ cmp P8ZP_SCRATCH_W2 - bcc _true - beq _true - lda #0 - rts -_true lda #1 - rts - .pend - -reg_lesseq_w .proc - ; -- P8ZP_SCRATCH_W2 <= AY ? (note: order different from other routines) - cmp P8ZP_SCRATCH_W2 - tya - sbc P8ZP_SCRATCH_W2+1 - bvc + - eor #$80 -+ bpl + - lda #0 - rts -+ lda #1 - rts - .pend - - -memcopy16_up .proc - ; -- copy memory UP from (P8ZP_SCRATCH_W1) to (P8ZP_SCRATCH_W2) of length X/Y (16-bit, X=lo, Y=hi) - ; clobbers register A,X,Y - source = P8ZP_SCRATCH_W1 - dest = P8ZP_SCRATCH_W2 - length = P8ZP_SCRATCH_B1 ; (and SCRATCH_ZPREG) - - stx length - sty length+1 - - ldx length ; move low byte of length into X - bne + ; jump to start if X > 0 - dec length ; subtract 1 from length -+ ldy #0 ; set Y to 0 -- lda (source),y ; set A to whatever (source) points to offset by Y - sta (dest),y ; move A to location pointed to by (dest) offset by Y - iny ; increment Y - bne + ; if Y<>0 then (rolled over) then still moving bytes - inc source+1 ; increment hi byte of source - inc dest+1 ; increment hi byte of dest -+ dex ; decrement X (lo byte counter) - bne - ; if X<>0 then move another byte - dec length ; we've moved 255 bytes, dec length - bpl - ; if length is still positive go back and move more - rts ; done - .pend - - -memset .proc - ; -- fill memory from (P8ZP_SCRATCH_W1), length XY, with value in A. - ; clobbers X, Y - stx P8ZP_SCRATCH_B1 - sty _save_reg - ldy #0 - ldx _save_reg - beq _lastpage - -_fullpage sta (P8ZP_SCRATCH_W1),y - iny - bne _fullpage - inc P8ZP_SCRATCH_W1+1 ; next page - dex - bne _fullpage - -_lastpage ldy P8ZP_SCRATCH_B1 - beq + -- dey - sta (P8ZP_SCRATCH_W1),y - bne - - -+ rts -_save_reg .byte 0 - .pend - - -memsetw .proc - ; -- fill memory from (P8ZP_SCRATCH_W1) number of words in P8ZP_SCRATCH_W2, with word value in AY. - ; clobbers A, X, Y - sta _mod1+1 ; self-modify - sty _mod1b+1 ; self-modify - sta _mod2+1 ; self-modify - sty _mod2b+1 ; self-modify - ldx P8ZP_SCRATCH_W1 - stx P8ZP_SCRATCH_B1 - ldx P8ZP_SCRATCH_W1+1 - inx - stx P8ZP_SCRATCH_REG ; second page - - ldy #0 - ldx P8ZP_SCRATCH_W2+1 - beq _lastpage - -_fullpage -_mod1 lda #0 ; self-modified - sta (P8ZP_SCRATCH_W1),y ; first page - sta (P8ZP_SCRATCH_B1),y ; second page - iny -_mod1b lda #0 ; self-modified - sta (P8ZP_SCRATCH_W1),y ; first page - sta (P8ZP_SCRATCH_B1),y ; second page - iny - bne _fullpage - inc P8ZP_SCRATCH_W1+1 ; next page pair - inc P8ZP_SCRATCH_W1+1 ; next page pair - inc P8ZP_SCRATCH_B1+1 ; next page pair - inc P8ZP_SCRATCH_B1+1 ; next page pair - dex - bne _fullpage - -_lastpage ldx P8ZP_SCRATCH_W2 - beq _done - - ldy #0 -- -_mod2 lda #0 ; self-modified - sta (P8ZP_SCRATCH_W1), y - inc P8ZP_SCRATCH_W1 - bne _mod2b - inc P8ZP_SCRATCH_W1+1 -_mod2b lda #0 ; self-modified - sta (P8ZP_SCRATCH_W1), y - inc P8ZP_SCRATCH_W1 - bne + - inc P8ZP_SCRATCH_W1+1 -+ dex - bne - -_done rts - .pend - - - -ror2_mem_ub .proc - ; -- in-place 8-bit ror of byte at memory location in AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 - lda (P8ZP_SCRATCH_W1),y - lsr a - bcc + - ora #$80 -+ sta (P8ZP_SCRATCH_W1),y - rts - .pend - -rol2_mem_ub .proc - ; -- in-place 8-bit rol of byte at memory location in AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 - lda (P8ZP_SCRATCH_W1),y - cmp #$80 - rol a - sta (P8ZP_SCRATCH_W1),y - rts - .pend - - -strcpy .proc - ; copy a string (must be 0-terminated) from A/Y to (P8ZP_SCRATCH_W1) - ; it is assumed the target string is large enough. - ; returns the length of the string that was copied in Y. - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - ldy #$ff -- iny - lda (P8ZP_SCRATCH_W2),y - sta (P8ZP_SCRATCH_W1),y - bne - - rts - .pend - -strcmp_expression .proc - ; -- compare strings, result in A - lda _arg_s2 - ldy _arg_s2+1 - sta P8ZP_SCRATCH_W2 - sty P8ZP_SCRATCH_W2+1 - lda _arg_s1 - ldy _arg_s1+1 - jmp strcmp_mem -_arg_s1 .word 0 -_arg_s2 .word 0 - .pend - -strcmp_mem .proc - ; -- compares strings in s1 (AY) and s2 (P8ZP_SCRATCH_W2). - ; Returns -1,0,1 in A, depeding on the ordering. Clobbers Y. - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 -_loop lda (P8ZP_SCRATCH_W1),y - bne + - lda (P8ZP_SCRATCH_W2),y - bne _return_minusone - beq _return -+ cmp (P8ZP_SCRATCH_W2),y - bcc _return_minusone - bne _return_one - inc P8ZP_SCRATCH_W1 - bne + - inc P8ZP_SCRATCH_W1+1 -+ inc P8ZP_SCRATCH_W2 - bne _loop - inc P8ZP_SCRATCH_W2+1 - bne _loop -_return_one - lda #1 -_return rts -_return_minusone - lda #-1 - rts - .pend - - -strlen .proc - ; -- returns the number of bytes in the string in AY, in Y. Clobbers A. - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 -- lda (P8ZP_SCRATCH_W1),y - beq + - iny - bne - -+ rts - .pend - - -containment_bytearray .proc - ; -- check if a value exists in a byte array. - ; parameters: P8ZP_SCRATCH_W1: address of the byte array, A = byte to check, Y = length of array (>=1). - ; returns boolean 0/1 in A. - dey -- cmp (P8ZP_SCRATCH_W1),y - beq + - dey - cpy #255 - bne - - lda #0 - rts -+ lda #1 - rts - .pend - -containment_wordarray .proc - ; -- check if a value exists in a word array. - ; parameters: P8ZP_SCRATCH_W1: value to check, P8ZP_SCRATCH_W2: address of the word array, Y = length of array (>=1). - ; returns boolean 0/1 in A. - dey - tya - asl a - tay -- lda P8ZP_SCRATCH_W1 - cmp (P8ZP_SCRATCH_W2),y - bne + - lda P8ZP_SCRATCH_W1+1 - iny - cmp (P8ZP_SCRATCH_W2),y - beq _found - dey -+ dey - dey - cpy #254 - bne - - lda #0 - rts -_found lda #1 - rts - .pend - - -arraycopy_split_to_normal_words .proc - ; P8ZP_SCRATCH_W1 = start of lsb array - ; P8ZP_SCRATCH_W2 = start of msb array - ; AY = start of normal word target array - ; X = number of elements to copy - sta _modlsb+1 - sty _modlsb+2 - clc - adc #1 - bne + - iny -+ sta _modmsb+1 - sty _modmsb+2 - ldy #0 -- lda (P8ZP_SCRATCH_W1),y -_modlsb sta $ffff ; modified lsb store - lda _modlsb+1 - clc - adc #2 - sta _modlsb+1 - bcc + - inc _modlsb+2 -+ lda (P8ZP_SCRATCH_W2),y -_modmsb sta $ffff ; modified msb store - lda _modmsb+1 - clc - adc #2 - sta _modmsb+1 - bcc + - inc _modmsb+2 -+ iny - dex - bne - - rts - .pend - - -arraycopy_normal_to_split_words .proc - ; P8ZP_SCRATCH_W1 = start of target lsb array - ; P8ZP_SCRATCH_W2 = start of target msb array - ; AY = start of normal word source array - ; X = number of elements to copy - sta _modsrclsb+1 - sty _modsrclsb+2 - clc - adc #1 - bne + - iny -+ sta _modsrcmsb+1 - sty _modsrcmsb+2 - ldy #0 -_modsrclsb lda $ffff ; modified lsb read - sta (P8ZP_SCRATCH_W1),y - lda _modsrclsb+1 - clc - adc #2 - sta _modsrclsb+1 - bcc + - inc _modsrclsb+2 -+ -_modsrcmsb lda $ffff ; modnfied msb read - sta (P8ZP_SCRATCH_W2),y - lda _modsrcmsb+1 - clc - adc #2 - sta _modsrcmsb+1 - bcc + - inc _modsrcmsb+2 -+ iny - dex - bne _modsrclsb - rts - .pend - -memcopy_small .proc - ; copy up to a single page (256 bytes) of memory. - ; note: only works for NON-OVERLAPPING memory regions! - ; P8ZP_SCRATCH_W1 = from address - ; P8ZP_SCRATCH_W2 = destination address - ; Y = number of bytes to copy (where 0 means 256) - cpy #0 - beq _fullpage - dey - beq _lastbyte -_loop lda (P8ZP_SCRATCH_W1),y - sta (P8ZP_SCRATCH_W2),y - dey - bne _loop -_lastbyte lda (P8ZP_SCRATCH_W1),y - sta (P8ZP_SCRATCH_W2),y - rts -_fullpage lda (P8ZP_SCRATCH_W1),y - sta (P8ZP_SCRATCH_W2),y - dey - bne _fullpage - rts - .pend - ; source: library:/prog8lib/prog8_lib.p8:7 %asminclude "library:prog8_funcs.asm" -; ---- builtin functions - - -func_any_b_into_A .proc - ; -- any(array), array in P8ZP_SCRATCH_W1, num bytes in A - sta _cmp_mod+1 ; self-modifying code - ldy #0 -- lda (P8ZP_SCRATCH_W1),y - bne _got_any - iny -_cmp_mod cpy #255 ; modified - bne - - lda #0 - rts -_got_any lda #1 - rts - .pend - - -func_all_b_into_A .proc - ; -- all(array), array in P8ZP_SCRATCH_W1, num bytes in A - sta _cmp_mod+1 ; self-modifying code - ldy #0 -- lda (P8ZP_SCRATCH_W1),y - beq _got_not_all - iny -_cmp_mod cpy #255 ; modified - bne - - lda #1 -_got_not_all rts - .pend - -func_any_w_into_A .proc - asl a - jmp func_any_b_into_A - .pend - -func_all_w_into_A .proc - ; -- all(warray), array in P8ZP_SCRATCH_W1, num bytes in A - asl a ; times 2 because of word - sta _cmp_mod+1 ; self-modifying code - ldy #0 -- lda (P8ZP_SCRATCH_W1),y - bne + - iny - lda (P8ZP_SCRATCH_W1),y - bne ++ - lda #0 - rts -+ iny -+ iny -_cmp_mod cpy #255 ; modified - bne - - lda #1 - rts - .pend - -abs_b_into_A .proc - ; -- A = abs(A) - cmp #0 - bmi + - rts -+ eor #$ff - clc - adc #1 - rts - .pend - -abs_w_into_AY .proc - ; -- AY = abs(AY) - cpy #0 - bmi + - rts -+ eor #$ff - pha - tya - eor #$ff - tay - pla - clc - adc #1 - bcc + - iny -+ rts - .pend - -func_sign_b_into_A .proc - cmp #0 - beq _zero - bmi _neg - lda #1 -_zero rts -_neg lda #-1 - rts - .pend - -func_sign_ub_into_A .proc - cmp #0 - bne _pos - rts -_pos lda #1 - rts - .pend - -func_sign_uw_into_A .proc - cpy #0 - beq _possibly_zero -_pos lda #1 - rts -_possibly_zero cmp #0 - bne _pos - rts - .pend - -func_sign_w_into_A .proc - cpy #0 - beq _possibly_zero - bmi _neg -_pos lda #1 - rts -_neg lda #-1 - rts -_possibly_zero cmp #0 - bne _pos - rts - .pend - - -func_sqrt16_into_A .proc - ; integer square root - ; http://6502org.wikidot.com/software-math-sqrt - ; https://github.com/TobyLobster/sqrt_test/blob/main/sqrt/sqrt7.a - ; Tweaked by TobyLobster and 0xC0DE to be smaller and faster -_numl = P8ZP_SCRATCH_W1 -_numh = P8ZP_SCRATCH_W1+1 -_loop_counter = P8ZP_SCRATCH_REG -_root = P8ZP_SCRATCH_B1 - sta _numl - sty _numh - ldx #$ff - stx _loop_counter - inx - stx _root - sec -_loop lda _numh - sbc #$40 - tay - txa - sbc _root - bcc + - sty _numh - bcs ++ -+ txa -+ rol _root - asl _numl - rol _numh - rol a - asl _numl - rol _numh - rol a - tax - lsr _loop_counter - bne _loop - lda _root - rts - .pend - - -func_sort_ub .proc - ; 8bit unsigned sort - ; sorting subroutine coded by mats rosengren (mats.rosengren@esa.int) - ; input: address of array to sort in P8ZP_SCRATCH_W1, length in S - ; first, put pointer BEFORE array - sta P8ZP_SCRATCH_B1 - lda P8ZP_SCRATCH_W1 - bne + - dec P8ZP_SCRATCH_W1+1 -+ dec P8ZP_SCRATCH_W1 -_sortloop ldy P8ZP_SCRATCH_B1 ;start of subroutine sort - lda (P8ZP_SCRATCH_W1),y ;last value in (what is left of) sequence to be sorted - sta P8ZP_SCRATCH_REG ;save value. will be over-written by largest number - jmp _l2 -_l1 dey - beq _l3 - lda (P8ZP_SCRATCH_W1),y - cmp P8ZP_SCRATCH_W2+1 - bcc _l1 -_l2 sty P8ZP_SCRATCH_W2 ;index of potentially largest value - sta P8ZP_SCRATCH_W2+1 ;potentially largest value - jmp _l1 -_l3 ldy P8ZP_SCRATCH_B1 ;where the largest value shall be put - lda P8ZP_SCRATCH_W2+1 ;the largest value - sta (P8ZP_SCRATCH_W1),y ;put largest value in place - ldy P8ZP_SCRATCH_W2 ;index of free space - lda P8ZP_SCRATCH_REG ;the over-written value - sta (P8ZP_SCRATCH_W1),y ;put the over-written value in the free space - dec P8ZP_SCRATCH_B1 ;end of the shorter sequence still left - bne _sortloop ;start working with the shorter sequence - rts - .pend - - -func_sort_b .proc - ; 8bit signed sort - ; sorting subroutine coded by mats rosengren (mats.rosengren@esa.int) - ; input: address of array to sort in P8ZP_SCRATCH_W1, length in A - ; first, put pointer BEFORE array - sta P8ZP_SCRATCH_B1 - lda P8ZP_SCRATCH_W1 - bne + - dec P8ZP_SCRATCH_W1+1 -+ dec P8ZP_SCRATCH_W1 -_sortloop ldy P8ZP_SCRATCH_B1 ;start of subroutine sort - lda (P8ZP_SCRATCH_W1),y ;last value in (what is left of) sequence to be sorted - sta P8ZP_SCRATCH_REG ;save value. will be over-written by largest number - jmp _l2 -_l1 dey - beq _l3 - lda (P8ZP_SCRATCH_W1),y - cmp P8ZP_SCRATCH_W2+1 - bmi _l1 -_l2 sty P8ZP_SCRATCH_W2 ;index of potentially largest value - sta P8ZP_SCRATCH_W2+1 ;potentially largest value - jmp _l1 -_l3 ldy P8ZP_SCRATCH_B1 ;where the largest value shall be put - lda P8ZP_SCRATCH_W2+1 ;the largest value - sta (P8ZP_SCRATCH_W1),y ;put largest value in place - ldy P8ZP_SCRATCH_W2 ;index of free space - lda P8ZP_SCRATCH_REG ;the over-written value - sta (P8ZP_SCRATCH_W1),y ;put the over-written value in the free space - dec P8ZP_SCRATCH_B1 ;end of the shorter sequence still left - bne _sortloop ;start working with the shorter sequence - rts - .pend - - -func_sort_uw .proc - ; 16bit unsigned sort - ; sorting subroutine coded by mats rosengren (mats.rosengren@esa.int) - ; input: address of array to sort in P8ZP_SCRATCH_W1, length in A - ; first: subtract 2 of the pointer - asl a - sta P8ZP_SCRATCH_B1 - lda P8ZP_SCRATCH_W1 - sec - sbc #2 - sta P8ZP_SCRATCH_W1 - bcs _sort_loop - dec P8ZP_SCRATCH_W1+1 -_sort_loop ldy P8ZP_SCRATCH_B1 ;start of subroutine sort - lda (P8ZP_SCRATCH_W1),y ;last value in (what is left of) sequence to be sorted - sta _work3 ;save value. will be over-written by largest number - iny - lda (P8ZP_SCRATCH_W1),y - sta _work3+1 - dey - jmp _l2 -_l1 dey - dey - beq _l3 - iny - lda (P8ZP_SCRATCH_W1),y - dey - cmp P8ZP_SCRATCH_W2+1 - bne + - lda (P8ZP_SCRATCH_W1),y - cmp P8ZP_SCRATCH_W2 -+ bcc _l1 -_l2 sty _work1 ;index of potentially largest value - lda (P8ZP_SCRATCH_W1),y - sta P8ZP_SCRATCH_W2 ;potentially largest value - iny - lda (P8ZP_SCRATCH_W1),y - sta P8ZP_SCRATCH_W2+1 - dey - jmp _l1 -_l3 ldy P8ZP_SCRATCH_B1 ;where the largest value shall be put - lda P8ZP_SCRATCH_W2 ;the largest value - sta (P8ZP_SCRATCH_W1),y ;put largest value in place - iny - lda P8ZP_SCRATCH_W2+1 - sta (P8ZP_SCRATCH_W1),y - ldy _work1 ;index of free space - lda _work3 ;the over-written value - sta (P8ZP_SCRATCH_W1),y ;put the over-written value in the free space - iny - lda _work3+1 - sta (P8ZP_SCRATCH_W1),y - dey - dec P8ZP_SCRATCH_B1 ;end of the shorter sequence still left - dec P8ZP_SCRATCH_B1 - bne _sort_loop ;start working with the shorter sequence - rts -_work1 .byte 0 -_work3 .word 0 - .pend - - -func_sort_w .proc - ; 16bit signed sort - ; sorting subroutine coded by mats rosengren (mats.rosengren@esa.int) - ; input: address of array to sort in P8ZP_SCRATCH_W1, length in A - ; first: subtract 2 of the pointer - asl a - sta P8ZP_SCRATCH_B1 - lda P8ZP_SCRATCH_W1 - sec - sbc #2 - sta P8ZP_SCRATCH_W1 - bcs _sort_loop - dec P8ZP_SCRATCH_W1+1 -_sort_loop ldy P8ZP_SCRATCH_B1 ;start of subroutine sort - lda (P8ZP_SCRATCH_W1),y ;last value in (what is left of) sequence to be sorted - sta _work3 ;save value. will be over-written by largest number - iny - lda (P8ZP_SCRATCH_W1),y - sta _work3+1 - dey - jmp _l2 -_l1 dey - dey - beq _l3 - lda (P8ZP_SCRATCH_W1),y - cmp P8ZP_SCRATCH_W2 - iny - lda (P8ZP_SCRATCH_W1),y - dey - sbc P8ZP_SCRATCH_W2+1 - bvc + - eor #$80 -+ bmi _l1 -_l2 sty _work1 ;index of potentially largest value - lda (P8ZP_SCRATCH_W1),y - sta P8ZP_SCRATCH_W2 ;potentially largest value - iny - lda (P8ZP_SCRATCH_W1),y - sta P8ZP_SCRATCH_W2+1 - dey - jmp _l1 -_l3 ldy P8ZP_SCRATCH_B1 ;where the largest value shall be put - lda P8ZP_SCRATCH_W2 ;the largest value - sta (P8ZP_SCRATCH_W1),y ;put largest value in place - iny - lda P8ZP_SCRATCH_W2+1 - sta (P8ZP_SCRATCH_W1),y - ldy _work1 ;index of free space - lda _work3 ;the over-written value - sta (P8ZP_SCRATCH_W1),y ;put the over-written value in the free space - iny - lda _work3+1 - sta (P8ZP_SCRATCH_W1),y - dey - dec P8ZP_SCRATCH_B1 ;end of the shorter sequence still left - dec P8ZP_SCRATCH_B1 - bne _sort_loop ;start working with the shorter sequence - rts -_work1 .byte 0 -_work3 .word 0 - .pend - - -func_reverse_b .proc - ; --- reverse an array of bytes (in-place) - ; inputs: pointer to array in P8ZP_SCRATCH_W1, length in A -_index_right = P8ZP_SCRATCH_W2 -_index_left = P8ZP_SCRATCH_W2+1 -_loop_count = P8ZP_SCRATCH_REG - sta _loop_count - lsr _loop_count - sec - sbc #1 - sta _index_right - lda #0 - sta _index_left -_loop ldy _index_right - lda (P8ZP_SCRATCH_W1),y - pha - ldy _index_left - lda (P8ZP_SCRATCH_W1),y - ldy _index_right - sta (P8ZP_SCRATCH_W1),y - pla - ldy _index_left - sta (P8ZP_SCRATCH_W1),y - inc _index_left - dec _index_right - dec _loop_count - bne _loop - rts - .pend - - -func_reverse_w .proc - ; --- reverse an array of words (in-place) - ; inputs: pointer to array in P8ZP_SCRATCH_W1, length in A -_index_first = P8ZP_SCRATCH_W2 -_index_second = P8ZP_SCRATCH_W2+1 -_loop_count = P8ZP_SCRATCH_REG - pha - asl a ; *2 because words - sec - sbc #2 - sta _index_first - lda #0 - sta _index_second - pla - lsr a - pha - sta _loop_count - ; first reverse the lsbs -_loop_lo ldy _index_first - lda (P8ZP_SCRATCH_W1),y - pha - ldy _index_second - lda (P8ZP_SCRATCH_W1),y - ldy _index_first - sta (P8ZP_SCRATCH_W1),y - pla - ldy _index_second - sta (P8ZP_SCRATCH_W1),y - inc _index_second - inc _index_second - dec _index_first - dec _index_first - dec _loop_count - bne _loop_lo - ; now reverse the msbs - dec _index_second - inc _index_first - inc _index_first - inc _index_first - pla - sta _loop_count -_loop_hi ldy _index_first - lda (P8ZP_SCRATCH_W1),y - pha - ldy _index_second - lda (P8ZP_SCRATCH_W1),y - ldy _index_first - sta (P8ZP_SCRATCH_W1),y - pla - ldy _index_second - sta (P8ZP_SCRATCH_W1),y - dec _index_second - dec _index_second - inc _index_first - inc _index_first - dec _loop_count - bne _loop_hi - - rts - .pend - - -func_peekw .proc - ; -- read the word value on the address in AY - sta P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_W1+1 - ldy #0 - lda (P8ZP_SCRATCH_W1),y - pha - iny - lda (P8ZP_SCRATCH_W1),y - tay - pla - rts - .pend - - -func_pokew .proc - ; -- store the word value in AY in the address in P8ZP_SCRATCH_W1 - sty P8ZP_SCRATCH_REG - ldy #0 - sta (P8ZP_SCRATCH_W1),y - iny - lda P8ZP_SCRATCH_REG - sta (P8ZP_SCRATCH_W1),y - rts - .pend - - -func_clamp_byte .proc - ; signed value in A, result in A - ; minimum in P8ZP_SCRATCH_W1 - ; maximum in P8ZP_SCRATCH_W1+1 - tay - sec - sbc P8ZP_SCRATCH_W1+1 - bvc + - eor #$80 -+ bmi + - lda P8ZP_SCRATCH_W1+1 - tay - jmp ++ -+ tya -+ sec - sbc P8ZP_SCRATCH_W1 - bvc + - eor #$80 -+ bmi + - tya - rts -+ lda P8ZP_SCRATCH_W1 - rts - .pend - - -func_clamp_ubyte .proc - ; value in A, result in A - ; minimum in P8ZP_SCRATCH_W1 - ; maximum in P8ZP_SCRATCH_W1+1 - cmp P8ZP_SCRATCH_W1+1 - bcc + - lda P8ZP_SCRATCH_W1+1 -+ cmp P8ZP_SCRATCH_W1 - bcc + - rts -+ lda P8ZP_SCRATCH_W1 - rts - .pend - -func_clamp_word .proc - ; signed value in AY, result in AY - ; minimum in P8ZP_SCRATCH_W1 - ; maximum in P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_B1 - sty P8ZP_SCRATCH_REG - ldy P8ZP_SCRATCH_W2+1 - lda P8ZP_SCRATCH_W2 - cmp P8ZP_SCRATCH_B1 - tya - sbc P8ZP_SCRATCH_REG - bvc + - eor #$80 -+ bpl + - lda P8ZP_SCRATCH_W2 - ldy P8ZP_SCRATCH_W2+1 - sta P8ZP_SCRATCH_B1 - sty P8ZP_SCRATCH_REG -+ ldy P8ZP_SCRATCH_W1+1 - lda P8ZP_SCRATCH_W1 - cmp P8ZP_SCRATCH_B1 - tya - sbc P8ZP_SCRATCH_REG - bvc + - eor #$80 -+ bpl + - ldy P8ZP_SCRATCH_REG - lda P8ZP_SCRATCH_B1 - rts -+ ldy P8ZP_SCRATCH_W1+1 - lda P8ZP_SCRATCH_W1 - rts - .pend - -func_clamp_uword .proc - ; value in AY, result in AY - ; minimum in P8ZP_SCRATCH_W1 - ; maximum in P8ZP_SCRATCH_W2 - sta P8ZP_SCRATCH_B1 - sty P8ZP_SCRATCH_REG - cpy P8ZP_SCRATCH_W2+1 - bcc ++ - bne + - cmp P8ZP_SCRATCH_W2 - bcc ++ -+ beq + - lda P8ZP_SCRATCH_W2 - ldy P8ZP_SCRATCH_W2+1 - sta P8ZP_SCRATCH_B1 - sty P8ZP_SCRATCH_REG -+ ldy P8ZP_SCRATCH_REG - lda P8ZP_SCRATCH_B1 - cpy P8ZP_SCRATCH_W1+1 - bcc ++ - bne + - cmp P8ZP_SCRATCH_W1 - bcc ++ -+ beq + - ldy P8ZP_SCRATCH_REG - lda P8ZP_SCRATCH_B1 - rts -+ ldy P8ZP_SCRATCH_W1+1 - lda P8ZP_SCRATCH_W1 - rts - - .pend - .pend -; global float constants -prog8_float_const_0 .byte $84, $31, $c2, $8f, $5c ; float 11.11 -prog8_float_const_1 .byte $87, $47, $fa, $e1, $47 ; float 99.99 -prog8_float_const_2 .byte $84, $20, $00, $00, $00 ; float 10.0 -prog8_float_const_3 .byte $00, $00, $00, $00, $00 ; float 0.0 -prog8_float_const_4 .byte $86, $31, $c2, $8f, $5c ; float 44.44 -; expression temp vars - .section BSS - .send BSS -; bss sections -PROG8_VARSHIGH_RAMBANK = 1 -prog8_bss_section_start - .dsection BSS -prog8_bss_section_size = * - prog8_bss_section_start - .dsection slabs_BSS -prog8_program_end ; end of program label for progend() diff --git a/compiler/test/vm/TestCompilerVirtual.kt b/compiler/test/vm/TestCompilerVirtual.kt index f3da054ed..724644b67 100644 --- a/compiler/test/vm/TestCompilerVirtual.kt +++ b/compiler/test/vm/TestCompilerVirtual.kt @@ -20,7 +20,7 @@ import prog8tests.helpers.compileText import kotlin.io.path.readText class TestCompilerVirtual: FunSpec({ - test("compile virtual: any all sort reverse builtin funcs") { + test("compile virtual: any all builtin funcs") { val src = """ main { @@ -29,9 +29,6 @@ main { bool result = all(words) cx16.r0++ result = any(words) - cx16.r0++ - sort(words) - reverse(words) } }""" val target = VMTarget() diff --git a/docs/source/index.rst b/docs/source/index.rst index e93057cf1..fd886a06b 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -85,7 +85,7 @@ Features - Conditional branches for status flags that map 1:1 to processor branch instructions for optimal efficiency - ``when`` statement to avoid if-else chains - ``in`` expression for concise and efficient multi-value/containment test -- Several powerful built-in functions, such as ``lsb``, ``msb``, ``min``, ``max``, ``rol``, ``ror``, ``sort`` and ``reverse`` +- Several powerful built-in functions, such as ``lsb``, ``msb``, ``min``, ``max``, ``rol``, ``ror`` - Variable data types include signed and unsigned bytes and words, arrays, strings. - Various powerful built-in libraries to do I/O, number conversions, graphics and more - Floating point math is supported on select compiler targets. diff --git a/docs/source/libraries.rst b/docs/source/libraries.rst index 352c762b9..686742157 100644 --- a/docs/source/libraries.rst +++ b/docs/source/libraries.rst @@ -1,10 +1,11 @@ -=============== -Library modules -=============== +===================================== +Library modules and builtin functions +===================================== -The compiler provides several "built-in" library modules with useful subroutine and variables. +The compiler provides several library modules with useful subroutine and variables. +There are also a bunch of builtin functions. -Some of these may be specific for a certain compilation target, or work slightly different, +Some of the libraries may be specific for a certain compilation target, or work slightly different, but some effort is put into making them available across compilation targets. This means that as long as your program is only using the subroutines from these @@ -29,6 +30,199 @@ of these library modules automatically as required. code publicly available on https://www.codebase64.org/ +.. _builtinfunctions: + +Built-in Functions +------------------ +There's a set of predefined functions in the language. These are fixed and can't be redefined in user code. +You can use them in expressions and the compiler will evaluate them at compile-time if possible. + + +Math +^^^^ + +abs (x) + Returns the absolute value of a number (integer or floating point). + +min (x, y) + Returns the smallest of x and y. Supported for integer types only, for floats use ``floats.minf()`` instead. + +max (x, y) + Returns the largest of x and y. Supported for integer types only, for floats use ``floats.maxf()`` instead. + +clamp (value, minimum, maximum) + Returns the value restricted to the given minimum and maximum. + Supported for integer types only, for floats use ``floats.clampf()`` instead. + +sgn (x) + Get the sign of the value (integer or floating point). + The result is a byte: -1, 0 or 1 (negative, zero, positive). + +sqrt (w) + Returns the square root of the number. + Supports unsigned integer (result is ubyte) and floating point numbers. + To do the reverse - squaring a number - just write ``x*x``. + +divmod (dividend, divisor, quotient, remainder) + Performs division only once and returns both quotient and remainder in a single call, where using '/' and '%' separately + would perform the division operation twice. + All values are ubytes or all are uwords. + The last two arguments must be variables to receive the quotient and remainder results, respectively. + + +Array operations +^^^^^^^^^^^^^^^^ + +any (x) + true if any of the values in the array value x is 'true' (not zero), else false. + +all (x) + true if all of the values in the array value x are 'true' (not zero), else false. + +len (x) + Number of values in the array value x, or the number of characters in a string (excluding the 0-byte). + Note: this can be different from the number of *bytes* in memory if the datatype isn't a byte. See sizeof(). + Note: lengths of strings and arrays are determined at compile-time! If your program modifies the actual + length of the string during execution, the value of len(s) may no longer be correct! + (use the ``string.length`` routine if you want to dynamically determine the length by counting to the + first 0-byte) + + +Miscellaneous +^^^^^^^^^^^^^ + +cmp (x,y) + Compare the integer value x to integer value y. Doesn't return a value or boolean result, only sets the processor's status bits! + You can use a conditional jumps (``if_cc`` etcetera) to act on this. + Normally you should just use a comparison expression (``x < y``) + +lsb (x) + Get the least significant byte of the word x. Equivalent to the cast "x as ubyte". + +msb (x) + Get the most significant byte of the word x. + +mkword (msb, lsb) + Efficiently create a word value from two bytes (the msb and the lsb). Avoids multiplication and shifting. + So mkword($80, $22) results in $8022. + + .. note:: + The arguments to the mkword() function are in 'natural' order that is first the msb then the lsb. + Don't get confused by how the system actually stores this 16-bit word value in memory (which is + in little-endian format, so lsb first then msb) + +peek (address) + same as @(address) - reads the byte at the given address in memory. + +peekw (address) + reads the word value at the given address in memory. Word is read as usual little-endian lsb/msb byte order. + +peekf (address) + reads the float value at the given address in memory. On CBM machines, this reads 5 bytes. + +poke (address, value) + same as @(address)=value - writes the byte value at the given address in memory. + +pokew (address, value) + writes the word value at the given address in memory, in usual little-endian lsb/msb byte order. + +pokef (address, value) + writes the float value at the given address in memory. On CBM machines, this writes 5 bytes. + +pokemon (address, value) + Like poke(), but also returns the previous value in the given address. + Also doesn't have anything to do with a certain video game. + +rol (x) + Rotate the bits in x (byte or word) one position to the left. + This uses the CPU's rotate semantics: bit 0 will be set to the current value of the Carry flag, + while the highest bit will become the new Carry flag value. + (essentially, it is a 9-bit or 17-bit rotation) + Modifies in-place, doesn't return a value (so can't be used in an expression). + You can rol a memory location directly by using the direct memory access syntax, so like ``rol(@($5000))`` + +rol2 (x) + Like ``rol`` but now as 8-bit or 16-bit rotation. + It uses some extra logic to not consider the carry flag as extra rotation bit. + Modifies in-place, doesn't return a value (so can't be used in an expression). + You can rol a memory location directly by using the direct memory access syntax, so like ``rol2(@($5000))`` + +ror (x) + Rotate the bits in x (byte or word) one position to the right. + This uses the CPU's rotate semantics: the highest bit will be set to the current value of the Carry flag, + while bit 0 will become the new Carry flag value. + (essentially, it is a 9-bit or 17-bit rotation) + Modifies in-place, doesn't return a value (so can't be used in an expression). + You can ror a memory location directly by using the direct memory access syntax, so like ``ror(@($5000))`` + +ror2 (x) + Like ``ror`` but now as 8-bit or 16-bit rotation. + It uses some extra logic to not consider the carry flag as extra rotation bit. + Modifies in-place, doesn't return a value (so can't be used in an expression). + You can ror a memory location directly by using the direct memory access syntax, so like ``ror2(@($5000))`` + +setlsb (x, value) + Sets the least significant byte of word variable x to a new value. Leaves the MSB untouched. + +setmsb (x, value) + Sets the most significant byte of word variable x to a new value. Leaves the LSB untouched. + +sizeof (name) ; sizeof (number) + Number of bytes that the object 'name', or the number 'number' occupies in memory. + This is a constant determined by the data type of + the object. For instance, for a variable of type uword, the sizeof is 2. + For an 10 element array of floats, it is 50 (on the C64, where a float is 5 bytes). + Note: usually you will be interested in the number of elements in an array, use len() for that. + +memory (name, size, alignment) + Returns the address of the first location of a statically "reserved" block of memory of the given size in bytes, + with the given name. The block is uninitialized memory, it is *not* set to zero! + If you specify an alignment value >1, it means the block of memory will + be aligned to such a dividable address in memory, for instance an alignment of $100 means the + memory block is aligned on a page boundary, and $2 means word aligned (even addresses). + Requesting the address of such a named memory block again later with + the same name, will result in the same address as before. + When reusing blocks in that way, it is required that the size argument is the same, + otherwise you'll get a compilation error. + This routine can be used to "reserve" parts of the memory where a normal byte array variable would + not suffice; for instance if you need more than 256 consecutive bytes. + The return value is just a simple uword address so it cannot be used as an array in your program. + You can only treat it as a pointer or use it in inline assembly. + +call (address) -> uword + Calls a subroutine given by its memory address. You cannot pass arguments directly, + although it is ofcourse possible to do this via the global ``cx16.r0...`` registers for example. + It is assumed the subroutine returns a word value (in AY), if it does not, just add void to the call to ignore the result value. + This function effectively creates an "indirect JSR" if you use it on a ``uword`` pointer variable. + But because it doesn't handle bank switching etcetera by itself, + it is a lot faster than ``callfar``. And it works on other systems than just the Commander X16. + +callfar (bank, address, argumentword) -> uword ; NOTE: specific to cx16 target for now + Calls an assembly routine in another bank on the Commander X16 (using its ``JSRFAR`` routine) + Be aware that ram OR rom bank may be changed depending on the address it jumps to! + The argumentword will be loaded into the A+Y registers before calling the routine. + The uword value that the routine returns in the A+Y registers, will be returned. + NOTE: this routine is very inefficient, so don't use it to call often. Set the bank yourself + or even write a custom tailored trampoline routine if you need to. Or use ``call`` if you can. + +syscall (callnr), syscall1 (callnr, arg), syscall2 (callnr, arg1, arg2), syscall3 (callnr, arg1, arg2, arg3) + Functions for doing a system call on targets that support this. Currently no actual target + uses this though except, possibly, the experimental code generation target! + The regular 6502 based compiler targets just use a subroutine call to asmsub Kernal routines at + specific memory locations. So these builtin function calls are not useful yet except for + experimentation in new code generation targets. + +rsave + Saves all registers including status (or only X) on the stack + Note: the 16 bit 'virtual' registers of the Commander X16 are *not* saved, + but you can use ``cx16.save_virtual_registers()`` for that. + +rrestore + Restore all registers including status (or only X) back from the cpu hardware stack + Note: the 16 bit 'virtual' registers of the Commander X16 are *not* restored, + but you can use ``cx16.restore_virtual_registers()`` for that. + + Low-fi variable and subroutine definitions in all available library modules --------------------------------------------------------------------------- diff --git a/docs/source/programming.rst b/docs/source/programming.rst index 5e4d83523..4f9987272 100644 --- a/docs/source/programming.rst +++ b/docs/source/programming.rst @@ -796,224 +796,8 @@ Otherwise the compiler will issue a warning about discarding a result value. then undefined because the variables will get overwritten. -.. _builtinfunctions: - -Built-in Functions ------------------- - - -There's a set of predefined functions in the language. These are fixed and can't be redefined in user code. -You can use them in expressions and the compiler will evaluate them at compile-time if possible. - - -Math -^^^^ - -abs (x) - Returns the absolute value of a number (integer or floating point). - -min (x, y) - Returns the smallest of x and y. Supported for integer types only, for floats use ``floats.minf()`` instead. - -max (x, y) - Returns the largest of x and y. Supported for integer types only, for floats use ``floats.maxf()`` instead. - -clamp (value, minimum, maximum) - Returns the value restricted to the given minimum and maximum. - Supported for integer types only, for floats use ``floats.clampf()`` instead. - -sgn (x) - Get the sign of the value (integer or floating point). - The result is a byte: -1, 0 or 1 (negative, zero, positive). - -sqrt (w) - Returns the square root of the number. - Supports unsigned integer (result is ubyte) and floating point numbers. - To do the reverse - squaring a number - just write ``x*x``. - -divmod (dividend, divisor, quotient, remainder) - Performs division only once and returns both quotient and remainder in a single call, where using '/' and '%' separately - would perform the division operation twice. - All values are ubytes or all are uwords. - The last two arguments must be variables to receive the quotient and remainder results, respectively. - - -Array operations -^^^^^^^^^^^^^^^^ - -any (x) - true if any of the values in the array value x is 'true' (not zero), else false. - -all (x) - true if all of the values in the array value x are 'true' (not zero), else false. - -len (x) - Number of values in the array value x, or the number of characters in a string (excluding the 0-byte). - Note: this can be different from the number of *bytes* in memory if the datatype isn't a byte. See sizeof(). - Note: lengths of strings and arrays are determined at compile-time! If your program modifies the actual - length of the string during execution, the value of len(s) may no longer be correct! - (use the ``string.length`` routine if you want to dynamically determine the length by counting to the - first 0-byte) - -reverse (array) - Reverse the values in the array (in-place). - Can be used after sort() to sort an array in descending order. - -sort (array) - Sort the array in ascending order (in-place) - Supported are arrays of bytes or word values. - Sorting a floating-point array is not supported right now, as a general sorting routine for this will - be extremely slow. Either build one yourself or find another solution that doesn't require sorting. - Finally, note that sorting an array with strings in it will not do what you might think; - it considers the array as just an array of integer words and sorts the string *pointers* accordingly. - Sorting strings alphabetically has to be programmed yourself if you need it. - - -Miscellaneous -^^^^^^^^^^^^^ - -cmp (x,y) - Compare the integer value x to integer value y. Doesn't return a value or boolean result, only sets the processor's status bits! - You can use a conditional jumps (``if_cc`` etcetera) to act on this. - Normally you should just use a comparison expression (``x < y``) - -lsb (x) - Get the least significant byte of the word x. Equivalent to the cast "x as ubyte". - -msb (x) - Get the most significant byte of the word x. - -mkword (msb, lsb) - Efficiently create a word value from two bytes (the msb and the lsb). Avoids multiplication and shifting. - So mkword($80, $22) results in $8022. - - .. note:: - The arguments to the mkword() function are in 'natural' order that is first the msb then the lsb. - Don't get confused by how the system actually stores this 16-bit word value in memory (which is - in little-endian format, so lsb first then msb) - -peek (address) - same as @(address) - reads the byte at the given address in memory. - -peekw (address) - reads the word value at the given address in memory. Word is read as usual little-endian lsb/msb byte order. - -peekf (address) - reads the float value at the given address in memory. On CBM machines, this reads 5 bytes. - -poke (address, value) - same as @(address)=value - writes the byte value at the given address in memory. - -pokew (address, value) - writes the word value at the given address in memory, in usual little-endian lsb/msb byte order. - -pokef (address, value) - writes the float value at the given address in memory. On CBM machines, this writes 5 bytes. - -pokemon (address, value) - Like poke(), but also returns the previous value in the given address. - Also doesn't have anything to do with a certain video game. - -rol (x) - Rotate the bits in x (byte or word) one position to the left. - This uses the CPU's rotate semantics: bit 0 will be set to the current value of the Carry flag, - while the highest bit will become the new Carry flag value. - (essentially, it is a 9-bit or 17-bit rotation) - Modifies in-place, doesn't return a value (so can't be used in an expression). - You can rol a memory location directly by using the direct memory access syntax, so like ``rol(@($5000))`` - -rol2 (x) - Like ``rol`` but now as 8-bit or 16-bit rotation. - It uses some extra logic to not consider the carry flag as extra rotation bit. - Modifies in-place, doesn't return a value (so can't be used in an expression). - You can rol a memory location directly by using the direct memory access syntax, so like ``rol2(@($5000))`` - -ror (x) - Rotate the bits in x (byte or word) one position to the right. - This uses the CPU's rotate semantics: the highest bit will be set to the current value of the Carry flag, - while bit 0 will become the new Carry flag value. - (essentially, it is a 9-bit or 17-bit rotation) - Modifies in-place, doesn't return a value (so can't be used in an expression). - You can ror a memory location directly by using the direct memory access syntax, so like ``ror(@($5000))`` - -ror2 (x) - Like ``ror`` but now as 8-bit or 16-bit rotation. - It uses some extra logic to not consider the carry flag as extra rotation bit. - Modifies in-place, doesn't return a value (so can't be used in an expression). - You can ror a memory location directly by using the direct memory access syntax, so like ``ror2(@($5000))`` - -setlsb (x, value) - Sets the least significant byte of word variable x to a new value. Leaves the MSB untouched. - -setmsb (x, value) - Sets the most significant byte of word variable x to a new value. Leaves the LSB untouched. - -sizeof (name) ; sizeof (number) - Number of bytes that the object 'name', or the number 'number' occupies in memory. - This is a constant determined by the data type of - the object. For instance, for a variable of type uword, the sizeof is 2. - For an 10 element array of floats, it is 50 (on the C64, where a float is 5 bytes). - Note: usually you will be interested in the number of elements in an array, use len() for that. - -memory (name, size, alignment) - Returns the address of the first location of a statically "reserved" block of memory of the given size in bytes, - with the given name. The block is uninitialized memory, it is *not* set to zero! - If you specify an alignment value >1, it means the block of memory will - be aligned to such a dividable address in memory, for instance an alignment of $100 means the - memory block is aligned on a page boundary, and $2 means word aligned (even addresses). - Requesting the address of such a named memory block again later with - the same name, will result in the same address as before. - When reusing blocks in that way, it is required that the size argument is the same, - otherwise you'll get a compilation error. - This routine can be used to "reserve" parts of the memory where a normal byte array variable would - not suffice; for instance if you need more than 256 consecutive bytes. - The return value is just a simple uword address so it cannot be used as an array in your program. - You can only treat it as a pointer or use it in inline assembly. - -call (address) -> uword - Calls a subroutine given by its memory address. You cannot pass arguments directly, - although it is ofcourse possible to do this via the global ``cx16.r0...`` registers for example. - It is assumed the subroutine returns a word value (in AY), if it does not, just add void to the call to ignore the result value. - This function effectively creates an "indirect JSR" if you use it on a ``uword`` pointer variable. - But because it doesn't handle bank switching etcetera by itself, - it is a lot faster than ``callfar``. And it works on other systems than just the Commander X16. - -callfar (bank, address, argumentword) -> uword ; NOTE: specific to cx16 target for now - Calls an assembly routine in another bank on the Commander X16 (using its ``JSRFAR`` routine) - Be aware that ram OR rom bank may be changed depending on the address it jumps to! - The argumentword will be loaded into the A+Y registers before calling the routine. - The uword value that the routine returns in the A+Y registers, will be returned. - NOTE: this routine is very inefficient, so don't use it to call often. Set the bank yourself - or even write a custom tailored trampoline routine if you need to. Or use ``call`` if you can. - -syscall (callnr), syscall1 (callnr, arg), syscall2 (callnr, arg1, arg2), syscall3 (callnr, arg1, arg2, arg3) - Functions for doing a system call on targets that support this. Currently no actual target - uses this though except, possibly, the experimental code generation target! - The regular 6502 based compiler targets just use a subroutine call to asmsub Kernal routines at - specific memory locations. So these builtin function calls are not useful yet except for - experimentation in new code generation targets. - -rsave - Saves all registers including status (or only X) on the stack - Note: the 16 bit 'virtual' registers of the Commander X16 are *not* saved, - but you can use ``cx16.save_virtual_registers()`` for that. - -rrestore - Restore all registers including status (or only X) back from the cpu hardware stack - Note: the 16 bit 'virtual' registers of the Commander X16 are *not* restored, - but you can use ``cx16.restore_virtual_registers()`` for that. - - -Library routines ----------------- - -There are many routines available in the compiler libraries. -Some are used internally by the compiler as well. +Library routines and builtin functions +-------------------------------------- +There are many routines available in the compiler libraries or as builtin functions. The most important ones can be found in the :doc:`libraries` chapter. - -There's too many to list here, just have a look through the source code -of the library modules to see what's there. -(They can be found in the compiler/res directory) -The example programs also use a small set of the library routines, you can study -their source code to see how they might be used. diff --git a/docs/source/todo.rst b/docs/source/todo.rst index d39ef3de2..1ced69847 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -1,6 +1,8 @@ TODO ==== +Get rid of any() and all() as builtin functions? Replace them with regular subroutines in buffer.p8 for example? + See open issues on github. IR: add SEC and CLC instructions in place of call to sys.set_carry() and sys.clear_carry(). (check more inline sub calls that should be a single instruction?) @@ -78,7 +80,6 @@ Compiler: - Zig-like defer to execute a statement/anonymousscope when subroutine exits? (problem is, we have jump insructions and inline asm , where we lose track of when exactly the subroutine exits...) - generate WASM to eventually run prog8 on a browser canvas? Use binaryen toolkit and/or my binaryen kotlin library? - implement split words arrays all() -- implement split words arrays sort() Libraries: diff --git a/examples/sorting.p8 b/examples/sorting.p8 deleted file mode 100644 index bc562a403..000000000 --- a/examples/sorting.p8 +++ /dev/null @@ -1,69 +0,0 @@ -%import textio -%zeropage basicsafe - -; Note: this program can be compiled for multiple target systems. - -main { - - sub start() { - - ubyte[] uba = [10,0,2,8,5,4,3,9] - uword[] uwa = [1000,0,200,8000,50,40000,3,900] - byte[] ba = [-10,0,-2,8,5,4,-3,9,-99] - word[] wa = [-1000,0,-200,8000,50,31111,3,-900] - - txt.print("original\n") - print_arrays() - - sort(uba) - sort(uwa) - sort(ba) - sort(wa) - - txt.print("sorted\n") - print_arrays() - - reverse(uba) - reverse(uwa) - reverse(ba) - reverse(wa) - - txt.print("reversed\n") - print_arrays() - - ;test_stack.test() - return - - - sub print_arrays() { - ubyte ub - uword uw - byte bb - word ww - for ub in uba { - txt.print_ub(ub) - txt.chrout(',') - } - txt.nl() - - for uw in uwa { - txt.print_uw(uw) - txt.chrout(',') - } - txt.nl() - - for bb in ba { - txt.print_b(bb) - txt.chrout(',') - } - txt.nl() - - for ww in wa { - txt.print_w(ww) - txt.chrout(',') - } - txt.nl() - txt.nl() - } - } -} diff --git a/examples/test.p8 b/examples/test.p8 index d4f96fcb5..bfad393c5 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,55 +1,23 @@ %import textio +%import buffers %zeropage basicsafe %option no_sysinit main { sub start() { - ringbuffer256.init() + smallringbuffer.init() - cx16.r0L = ringbuffer256.get() - if_cs { - txt.print_ub(cx16.r0L) - txt.nl() - } else { - txt.print("buffer empty\n") - } + smallringbuffer.put(123) + txt.print_ub(smallringbuffer.get()) + txt.nl() + + smallringbuffer.putw(12345) + txt.print_uw(smallringbuffer.getw()) + txt.nl() } } -ringbuffer256 { - uword size - ubyte head - ubyte tail - ubyte[256] buffer - - sub init() { - size = head = 0 - tail = 255 - } - - sub add(ubyte value) -> bool { - if size==256 - return false - - buffer[head] = value - head++ - size++ - } - - sub get() -> ubyte { - if size==0 { - sys.clear_carry() - return 0 - } - - size-- - tail++ - sys.set_carry() - return buffer[tail] - } - -} ; ;main { diff --git a/syntax-files/IDEA/Prog8.xml b/syntax-files/IDEA/Prog8.xml index 08b3079b9..d83c99057 100644 --- a/syntax-files/IDEA/Prog8.xml +++ b/syntax-files/IDEA/Prog8.xml @@ -14,7 +14,7 @@ - + diff --git a/syntax-files/NotepadPlusPlus/Prog8.xml b/syntax-files/NotepadPlusPlus/Prog8.xml index b9f188042..eb5d1131d 100644 --- a/syntax-files/NotepadPlusPlus/Prog8.xml +++ b/syntax-files/NotepadPlusPlus/Prog8.xml @@ -27,7 +27,7 @@ void const str byte ubyte bool word uword float zp shared split requirezp nozp %address %asm %ir %asmbinary %asminclude %breakpoint %encoding %import %launcher %option %output %zeropage %zpreserved %zpallowed inline sub asmsub romsub clobbers asm if when else if_cc if_cs if_eq if_mi if_neg if_nz if_pl if_pos if_vc if_vs if_z for in step do while repeat unroll break continue return goto - abs all any call callfar clamp cmp divmod len lsb lsl lsr memory mkword min max msb peek peekw peekf poke pokew pokef rsave rsavex rrestore rrestorex reverse rnd rndw rol rol2 ror ror2 setlsb setmsb sgn sizeof sort sqrtw swap + abs all any call callfar clamp cmp divmod len lsb lsl lsr memory mkword min max msb peek peekw peekf poke pokew pokef rsave rsavex rrestore rrestorex rnd rndw rol rol2 ror ror2 setlsb setmsb sgn sizeof sqrtw true false not and or xor as to downto |>