now with screen scroll

This commit is contained in:
minjaesong
2020-05-12 23:32:35 +09:00
parent 516eb84b65
commit b87afc4a51
2 changed files with 55 additions and 13 deletions

View File

@@ -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
} }
} }

View File

@@ -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() {