From ce40f6f862ca9da35b6b5324882cef10851bb302 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Mon, 11 Mar 2019 22:30:32 +0100 Subject: [PATCH] defined a few more sysasm routines --- compiler/src/prog8/stackvm/StackVm.kt | 47 ++++++++++++++++++++++++--- examples/test.p8 | 1 + 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/compiler/src/prog8/stackvm/StackVm.kt b/compiler/src/prog8/stackvm/StackVm.kt index c21919a4c..acc5f0140 100644 --- a/compiler/src/prog8/stackvm/StackVm.kt +++ b/compiler/src/prog8/stackvm/StackVm.kt @@ -88,7 +88,17 @@ enum class Syscall(val callNr: Short) { SYSCALLSTUB(200), SYSASM_c64scr_PLOT(201), SYSASM_c64scr_print(202), - SYSASM_c64scr_setcc(203), + SYSASM_c64scr_print_ub0(203), + SYSASM_c64scr_print_ub(204), + SYSASM_c64scr_print_b(205), + SYSASM_c64scr_print_ubhex(206), + SYSASM_c64scr_print_ubbin(207), + SYSASM_c64scr_print_uwbin(208), + SYSASM_c64scr_print_uwhex(209), + SYSASM_c64scr_print_uw0(210), + SYSASM_c64scr_print_uw(211), + SYSASM_c64scr_print_w(212), + SYSASM_c64scr_setcc(213), } @@ -1779,8 +1789,15 @@ class StackVm(private var traceOutputFile: String?) { P_carry = evalstack.pop().asBooleanValue P_irqd = evalstack.pop().asBooleanValue } - Opcode.RSAVEX -> evalstack.push(variables["X"]) - Opcode.RRESTOREX -> variables["X"] = evalstack.pop() + Opcode.RSAVEX -> { + evalstack.push(variables["X"]) + println("-----rsaveX called, stacksize ${evalstack.size}") // TODO + } + Opcode.RRESTOREX -> { + println("-----rrestoreX called, stacksize before ${evalstack.size}") // TODO + // TODO called too ofen -> stack error + variables["X"] = evalstack.pop() + } Opcode.INLINE_ASSEMBLY -> throw VmExecutionException("stackVm doesn't support executing inline assembly code $ins") Opcode.PUSH_ADDR_HEAPVAR -> { val heapId = variables[ins.callLabel]!!.heapId @@ -1822,7 +1839,16 @@ class StackVm(private var traceOutputFile: String?) { if(ins.nextAlt==null) throw VmExecutionException("call to system routine requires nextAlt return instruction set: $ins") else { - println("CALLING SYSTEM ROUTINE $ins") + when(ins.callLabel) { + "c64.CLEARSCR" -> { + println(" evalstack (size=${evalstack.size}):") + evalstack.printTop(4, System.out) + canvas?.clearScreen(mem.getUByte(0xd021).toInt()) + } + else -> { + TODO("SYSTEM ROUTINE ${ins.callLabel}") + } + } return ins.nextAlt!! } } else @@ -2134,13 +2160,24 @@ class StackVm(private var traceOutputFile: String?) { val str = heap.get(straddr).str!! canvas?.writeText(x, y, str, 1, true) } + Syscall.SYSASM_c64scr_print_ub -> { + val (x, y) = canvas!!.getCursorPos() + val num = variables["A"]!!.integerValue() + canvas?.writeText(x, y, num.toString(), 1, true) + } + Syscall.SYSASM_c64scr_print_uw -> { + val (x, y) = canvas!!.getCursorPos() + val lo = variables["A"]!!.integerValue() + val hi = variables["Y"]!!.integerValue() + val number = lo+256*hi + canvas?.writeText(x, y, number.toString(), 1, true) + } Syscall.SYSASM_c64scr_setcc -> { val x = variables["c64scr.setcc.column"]!!.integerValue() val y = variables["c64scr.setcc.row"]!!.integerValue() val char = variables["c64scr.setcc.char"]!!.integerValue() // val color = variables["c64scr.setcc.color"]!!.integerValue() // text color other than 1 (white) can't be used right now canvas?.setChar(x, y, char.toShort()) - println("setcc $x $y") // TODO the vm is in an endless loop here when running tehtriz with this! } else -> throw VmExecutionException("unimplemented syscall $syscall") } diff --git a/examples/test.p8 b/examples/test.p8 index 2fd8c6a7c..700c7d027 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -8,5 +8,6 @@ sub start() { + c64.CLEARSCR() ; @todo empty stack exception in vm } }