diff --git a/compiler/src/prog8/stackvm/ScreenDialog.kt b/compiler/src/prog8/stackvm/ScreenDialog.kt index 532173523..a43644cf8 100644 --- a/compiler/src/prog8/stackvm/ScreenDialog.kt +++ b/compiler/src/prog8/stackvm/ScreenDialog.kt @@ -60,53 +60,50 @@ class BitmapScreenPanel : KeyListener, JPanel() { g2d.color = palette[color and 15] g2d.drawLine(x1, y1, x2, y2) } - fun writeText(x: Int, y: Int, text: String, color: Int, lowercase: Boolean) { - var xx=x - var yy=y + fun printText(text: String, color: Int, lowercase: Boolean) { val lines = text.split('\n') for(line in lines.withIndex()) { - writeTextSingleLine(xx, yy, line.value, color, lowercase) - xx = cursorX - yy = cursorY + printTextSingleLine(line.value, color, lowercase) if(line.index=(SCREENWIDTH/8)) { - yy++ - xx=0 + setChar(cursorX, cursorY, sc) + cursorX++ + if(cursorX>=(SCREENWIDTH/8)) { + cursorY++ + cursorX=0 } } - cursorX = x + text.length - cursorY = y - if(cursorX>=(SCREENWIDTH/8)) { + } + + fun printChar(char: Short) { + if(char==13.toShort() || char==141.toShort()) { cursorX=0 cursorY++ + } else { + setChar(cursorX, cursorY, char) + cursorX++ + if (cursorX >= (SCREENWIDTH / 8)) { + cursorY++ + cursorX = 0 + } } } + fun setChar(x: Int, y: Int, screenCode: Short) { g2d.clearRect(8*x, 8*y, 8, 8) g2d.drawImage(Charset.shiftedChars[screenCode.toInt()], 8*x, 8*y , null) - cursorX = x + 1 - cursorY = y - if(cursorX>=(SCREENWIDTH/8)) { - cursorX=0 - cursorY++ - } } fun setCursorPos(x: Int, y: Int) { @@ -118,6 +115,19 @@ class BitmapScreenPanel : KeyListener, JPanel() { return Pair(cursorX, cursorY) } + fun writeText(x: Int, y: Int, text: String, color: Int, lowercase: Boolean) { + var xx=x + if(color!=1) { + TODO("text can only be white for now") + } + for(clearx in xx until xx+text.length) { + g2d.clearRect(8*clearx, 8*y, 8, 8) + } + for(sc in Petscii.encodeScreencode(text, lowercase)) { + setChar(xx++, y, sc) + } + } + companion object { const val SCREENWIDTH = 320 diff --git a/compiler/src/prog8/stackvm/StackVm.kt b/compiler/src/prog8/stackvm/StackVm.kt index 6ad833c33..665b7acbc 100644 --- a/compiler/src/prog8/stackvm/StackVm.kt +++ b/compiler/src/prog8/stackvm/StackVm.kt @@ -1886,8 +1886,7 @@ class StackVm(private var traceOutputFile: String?) { } "c64.CHROUT" -> { val sc=variables.getValue("A").integerValue() - val (x, y) = canvas?.getCursorPos()!! - canvas?.setChar(x, y, sc.toShort()) + canvas?.printChar(sc.toShort()) callstack.pop() } "c64.GETIN" -> { @@ -2208,27 +2207,23 @@ class StackVm(private var traceOutputFile: String?) { canvas?.setCursorPos(x, y) } Syscall.SYSASM_c64scr_print -> { - val (x, y) = canvas!!.getCursorPos() val straddr = variables.getValue("A").integerValue() + 256*variables.getValue("Y").integerValue() val str = heap.get(straddr).str!! - canvas?.writeText(x, y, str, 1, true) + canvas?.printText(str, 1, true) } Syscall.SYSASM_c64scr_print_ub -> { - val (x, y) = canvas!!.getCursorPos() val num = variables.getValue("A").integerValue() - canvas?.writeText(x, y, num.toString(), 1, true) + canvas?.printText(num.toString(), 1, true) } Syscall.SYSASM_c64scr_print_uw -> { - val (x, y) = canvas!!.getCursorPos() val lo = variables.getValue("A").integerValue() val hi = variables.getValue("Y").integerValue() val number = lo+256*hi - canvas?.writeText(x, y, number.toString(), 1, true) + canvas?.printText(number.toString(), 1, true) } Syscall.SYSASM_c64flt_print_f -> { - val (x, y) = canvas!!.getCursorPos() val number = variables.getValue("c64flt.print_f.value").numericValue() - canvas?.writeText(x, y, number.toString(), 1, true) + canvas?.printText(number.toString(), 1, true) } Syscall.SYSASM_c64scr_setcc -> { val x = variables.getValue("c64scr.setcc.column").integerValue()