mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 19:51:51 +09:00
now with screen scroll
This commit is contained in:
@@ -34,19 +34,19 @@ abstract class GlassTty(val TEXT_ROWS: Int, val TEXT_COLS: Int) {
|
|||||||
abstract fun putChar(x: Int, y: Int, text: Byte, foreColour: Byte = ttyFore.toByte(), backColour: Byte = ttyBack.toByte())
|
abstract fun putChar(x: Int, y: Int, text: Byte, foreColour: Byte = ttyFore.toByte(), backColour: Byte = ttyBack.toByte())
|
||||||
|
|
||||||
fun writeOut(char: Byte) {
|
fun writeOut(char: Byte) {
|
||||||
val printable = acceptChar(char)
|
|
||||||
|
|
||||||
if (printable) {
|
|
||||||
val (x, y) = getCursorPos()
|
|
||||||
putChar(x, y, char)
|
|
||||||
setCursorPos(x + 1, y) // should automatically wrap and advance a line for out-of-bound x-value
|
|
||||||
}
|
|
||||||
|
|
||||||
// deal with y-axis out-of-bounds
|
// deal with y-axis out-of-bounds
|
||||||
val (cx, cy) = getCursorPos()
|
var (cx, cy) = getCursorPos()
|
||||||
if (cy >= TEXT_ROWS) {
|
if (cy >= TEXT_ROWS) {
|
||||||
scrollUp(cy - TEXT_ROWS + 1)
|
scrollUp(cy - TEXT_ROWS + 1)
|
||||||
setCursorPos(cx, TEXT_ROWS - 1)
|
setCursorPos(cx, TEXT_ROWS - 1)
|
||||||
|
cy = TEXT_ROWS - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
val printable = acceptChar(char) // this function processes the escape codes and CRLFs
|
||||||
|
|
||||||
|
if (printable) {
|
||||||
|
putChar(cx, cy, char)
|
||||||
|
setCursorPos(cx + 1, cy) // should automatically wrap and advance a line for out-of-bound x-value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ class GraphicsAdapter(val lcdMode: Boolean = false) : GlassTty(Companion.TEXT_RO
|
|||||||
private val memTextForeOffset = 2980L
|
private val memTextForeOffset = 2980L
|
||||||
private val memTextBackOffset = 2980L + 2560
|
private val memTextBackOffset = 2980L + 2560
|
||||||
private val memTextOffset = 2980L + 2560 + 2560
|
private val memTextOffset = 2980L + 2560 + 2560
|
||||||
|
private val TEXT_AREA_SIZE = TEXT_COLS * TEXT_ROWS
|
||||||
|
|
||||||
override var rawCursorPos: Int
|
override var rawCursorPos: Int
|
||||||
get() = spriteAndTextArea.getShort(memTextCursorPosOffset).toInt()
|
get() = spriteAndTextArea.getShort(memTextCursorPosOffset).toInt()
|
||||||
@@ -271,12 +272,52 @@ class GraphicsAdapter(val lcdMode: Boolean = false) : GlassTty(Companion.TEXT_RO
|
|||||||
|
|
||||||
/** New lines are added at the bottom */
|
/** New lines are added at the bottom */
|
||||||
override fun scrollUp(arg: Int) {
|
override fun scrollUp(arg: Int) {
|
||||||
//TODO("Not yet implemented")
|
val displacement = arg.toLong() * TEXT_COLS
|
||||||
|
UnsafeHelper.memcpy(
|
||||||
|
spriteAndTextArea.ptr + memTextOffset + displacement,
|
||||||
|
spriteAndTextArea.ptr + memTextOffset,
|
||||||
|
TEXT_AREA_SIZE - displacement
|
||||||
|
)
|
||||||
|
UnsafeHelper.memcpy(
|
||||||
|
spriteAndTextArea.ptr + memTextBackOffset + displacement,
|
||||||
|
spriteAndTextArea.ptr + memTextBackOffset,
|
||||||
|
TEXT_AREA_SIZE - displacement
|
||||||
|
)
|
||||||
|
UnsafeHelper.memcpy(
|
||||||
|
spriteAndTextArea.ptr + memTextForeOffset + displacement,
|
||||||
|
spriteAndTextArea.ptr + memTextForeOffset,
|
||||||
|
TEXT_AREA_SIZE - displacement
|
||||||
|
)
|
||||||
|
for (i in 0 until displacement) {
|
||||||
|
spriteAndTextArea[memTextOffset + TEXT_AREA_SIZE - displacement + i] = 0
|
||||||
|
spriteAndTextArea[memTextBackOffset + TEXT_AREA_SIZE - displacement + i] = ttyBack.toByte()
|
||||||
|
spriteAndTextArea[memTextForeOffset + TEXT_AREA_SIZE - displacement + i] = ttyFore.toByte()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** New lines are added at the top */
|
/** New lines are added at the top */
|
||||||
override fun scrollDown(arg: Int) {
|
override fun scrollDown(arg: Int) {
|
||||||
TODO("Not yet implemented")
|
val displacement = arg.toLong() * TEXT_COLS
|
||||||
|
UnsafeHelper.memcpy(
|
||||||
|
spriteAndTextArea.ptr + memTextOffset,
|
||||||
|
spriteAndTextArea.ptr + memTextOffset + displacement,
|
||||||
|
TEXT_AREA_SIZE - displacement
|
||||||
|
)
|
||||||
|
UnsafeHelper.memcpy(
|
||||||
|
spriteAndTextArea.ptr + memTextBackOffset,
|
||||||
|
spriteAndTextArea.ptr + memTextBackOffset + displacement,
|
||||||
|
TEXT_AREA_SIZE - displacement
|
||||||
|
)
|
||||||
|
UnsafeHelper.memcpy(
|
||||||
|
spriteAndTextArea.ptr + memTextForeOffset,
|
||||||
|
spriteAndTextArea.ptr + memTextForeOffset + displacement,
|
||||||
|
TEXT_AREA_SIZE - displacement
|
||||||
|
)
|
||||||
|
for (i in 0 until displacement) {
|
||||||
|
spriteAndTextArea[memTextOffset + TEXT_AREA_SIZE + i] = 0
|
||||||
|
spriteAndTextArea[memTextBackOffset + TEXT_AREA_SIZE + i] = ttyBack.toByte()
|
||||||
|
spriteAndTextArea[memTextForeOffset + TEXT_AREA_SIZE + i] = ttyFore.toByte()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun sgrOneArg(arg: Int) {
|
override fun sgrOneArg(arg: Int) {
|
||||||
@@ -295,7 +336,7 @@ class GraphicsAdapter(val lcdMode: Boolean = false) : GlassTty(Companion.TEXT_RO
|
|||||||
* @param arg1 y-position (row)
|
* @param arg1 y-position (row)
|
||||||
* @param arg2 x-position (column) */
|
* @param arg2 x-position (column) */
|
||||||
override fun cursorXY(arg1: Int, arg2: Int) {
|
override fun cursorXY(arg1: Int, arg2: Int) {
|
||||||
TODO("Not yet implemented")
|
setCursorPos(arg2, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ringBell() {
|
override fun ringBell() {
|
||||||
@@ -303,7 +344,8 @@ class GraphicsAdapter(val lcdMode: Boolean = false) : GlassTty(Companion.TEXT_RO
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun insertTab() {
|
override fun insertTab() {
|
||||||
TODO("Not yet implemented")
|
val (x, y) = getCursorPos()
|
||||||
|
setCursorPos((x / 8) + 8, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun crlf() {
|
override fun crlf() {
|
||||||
|
|||||||
Reference in New Issue
Block a user