From 219845e56514c2cef1910b6fe7bb70d93da78008 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 20 Apr 2022 10:04:30 +0900 Subject: [PATCH] gpu mmio write addrs have been moved around --- terranmon.txt | 15 +++---- .../torvald/tsvm/GraphicsJSR223Delegate.kt | 17 +++++--- .../net/torvald/tsvm/peripheral/GlassTty.kt | 2 +- .../tsvm/peripheral/GraphicsAdapter.kt | 42 ++++++++++--------- .../src/net/torvald/tsvm/peripheral/TTY.kt | 2 +- 5 files changed, 44 insertions(+), 34 deletions(-) diff --git a/terranmon.txt b/terranmon.txt index 94ef020..c81645a 100644 --- a/terranmon.txt +++ b/terranmon.txt @@ -167,17 +167,12 @@ From the start of the memory space: 12 bytes argument for "command" (arg1: Byte, arg2: Byte) write to this address FIRST and then write to "command" to execute the command -2 bytes - framebuffer scroll X -2 bytes - framebuffer scroll Y -896 bytes - horizontal scroll offset for scanlines -234 bytes +1134 bytes unused 1920 mapped to font ROM Font Mapping area holds 128 characters in consecutive order, each character is always 15 bytes. + (designer's note: it's still useful to divide the char rom to two halves, lower half being characters ROM and upper half being symbols ROM) 2 bytes Cursor position in: (y*80 + x) 2560 bytes @@ -316,6 +311,12 @@ MMIO 22 12 23 21 If 1 layer is used, this field will do nothing and always fall back to 0 +14..15 RW + framebuffer scroll X +16..17 RW + framebuffer scroll Y +1024..2047 RW + horizontal scroll offset for scanlines Text-mode-font-ROM is immutable and does not belong to VRAM Even in the text mode framebuffer is still being drawn onto the screen, and the texts are drawn on top of it diff --git a/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt b/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt index 242444d..1444639 100644 --- a/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt +++ b/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt @@ -67,7 +67,6 @@ class GraphicsJSR223Delegate(val vm: VM) { return intArrayOf(0, 0) } - fun scrollFrame(xdelta: Int, ydelta: Int) { getFirstGPU()?.let { it.framebufferScrollX = (it.framebufferScrollX + xdelta) fmod it.framebuffer.width @@ -77,20 +76,26 @@ class GraphicsJSR223Delegate(val vm: VM) { fun setLineOffset(line: Int, offset: Int) { getFirstGPU()?.let { - it.poke(250900L + 2*line, offset.shr(8).toByte()) // absolutely not USHR - it.poke(250901L + 2*line, offset.toByte()) + it.scanlineOffsets[2L * line] = offset.toByte() + it.scanlineOffsets[2L * line + 1] = offset.shr(8).toByte() // absolutely not USHR } } fun getLineOffset(line: Int): Int { getFirstGPU()?.let { - var xoff = it.peek(250900L + 2*line)!!.toUint().shl(8) or it.peek(250901L + 2*line)!!.toUint() + var xoff = it.scanlineOffsets[2L * line].toUint() or it.scanlineOffsets[2L * line + 1].toUint().shl(8) if (xoff.and(0x8000) != 0) xoff = xoff or 0xFFFF0000.toInt() return xoff } return 0 } + fun setGraphicsMode(mode: Int) { + getFirstGPU()?.mmio_write(12L, mode.toByte()) + } + + fun getGraphicsMode() = getFirstGPU()?.mmio_read(12L)?.toUint() ?: 0 + fun getPixelDimension(): IntArray { getFirstGPU()?.let { return intArrayOf(it.framebuffer.width, it.framebuffer.height) } return intArrayOf(-1, -1) @@ -163,9 +168,9 @@ class GraphicsJSR223Delegate(val vm: VM) { ) }*/ - fun setHalfrowMode(set: Boolean) { + /*fun setHalfrowMode(set: Boolean) { getFirstGPU()?.halfrowMode = set - } + }*/ private fun GraphicsAdapter._loadSprite(spriteNum: Int, ptr: Int) { UnsafeHelper.memcpy( diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/GlassTty.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/GlassTty.kt index 2fa47a0..d66c423 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/GlassTty.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/GlassTty.kt @@ -31,7 +31,7 @@ abstract class GlassTty(val TEXT_ROWS: Int, val TEXT_COLS: Int) { abstract var ttyBack: Int abstract var ttyRawMode: Boolean - abstract var halfrowMode: Boolean +// abstract var halfrowMode: Boolean abstract fun putChar(x: Int, y: Int, text: Byte, foreColour: Byte = ttyFore.toByte(), backColour: Byte = ttyBack.toByte()) diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index 243a0af..e43a57b 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -77,6 +77,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi internal val textArea = UnsafeHelper.allocate(7682) internal val unusedArea = UnsafeHelper.allocate(1024) + internal val scanlineOffsets = UnsafeHelper.allocate(1024) protected val paletteShader = LoadShader(DRAW_SHADER_VERT, config.paletteShader) protected val textShader = LoadShader(DRAW_SHADER_VERT, config.fragShader) @@ -118,7 +119,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi private val memTextOffset = 2L + 2560 + 2560 private val TEXT_AREA_SIZE = TEXT_COLS * TEXT_ROWS - override var halfrowMode = false +// override var halfrowMode = false override var rawCursorPos: Int get() = textArea.getShortFree(memTextCursorPosOffset).toInt() @@ -132,7 +133,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi if (newx >= TEXT_COLS) { newx = 0 - newy += 1 + halfrowMode.toInt() + newy += 1 //+ halfrowMode.toInt() } else if (newx < 0) { newx = 0 @@ -166,6 +167,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi framebuffer.fill() unusedArea.fillWith(0) + scanlineOffsets.fillWith(0) val pm = Pixmap(1, 1, Pixmap.Format.RGBA8888) pm.drawPixel(0, 0, -1) @@ -197,11 +199,6 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi val adi = addr.toInt() return when (addr) { in 0 until 250880 -> framebuffer.pixels.get(adi)//framebuffer.getPixel(adi % WIDTH, adi / WIDTH).toByte() - 250896L -> framebufferScrollX.toByte() - 250897L -> framebufferScrollX.ushr(8).toByte() - 250898L -> framebufferScrollY.toByte() - 250899L -> framebufferScrollY.ushr(8).toByte() - 251796L -> halfrowMode.toInt().toByte() in 252030 until 252030+1920 -> mappedFontRom[adi- 252030] in 250880 until 250880+1024 -> unusedArea[addr - 250880] in 253950 until 261632 -> textArea[addr - 253950] @@ -226,11 +223,6 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi unusedArea[addr - 250880] = byte runCommand(byte) } - 250896L -> framebufferScrollX = framebufferScrollX.and(0xFFFFFF00.toInt()).or(bi) - 250897L -> framebufferScrollX = framebufferScrollX.and(0xFFFF00FF.toInt()).or(bi shl 8) - 250898L -> framebufferScrollY = framebufferScrollY.and(0xFFFFFF00.toInt()).or(bi) - 250899L -> framebufferScrollY = framebufferScrollY.and(0xFFFF00FF.toInt()).or(bi shl 8) - 251796L -> halfrowMode = (bi and 1) == 1 in 252030 until 252030+1920 -> mappedFontRom[adi- 252030] = byte in 250880 until 250880+1024 -> unusedArea[addr - 250880] = byte in 253950 until 261632 -> textArea[addr - 253950] = byte @@ -274,6 +266,12 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi 11L -> sgr.bankCount.toByte() 12L -> graphicsMode.toByte() 13L -> layerArrangement.toByte() + 14L -> framebufferScrollX.toByte() + 15L -> framebufferScrollX.ushr(8).toByte() + 16L -> framebufferScrollY.toByte() + 17L -> framebufferScrollY.ushr(8).toByte() + + in 1024L..2047L -> scanlineOffsets[addr - 1024] in 0 until VM.MMIO_SIZE -> -1 else -> null @@ -289,6 +287,13 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi 10L -> { ttyBack = bi } 12L -> { graphicsMode = bi } 13L -> { layerArrangement = bi } + 14L -> { framebufferScrollX = framebufferScrollX.and(0xFFFFFF00.toInt()).or(bi) } + 15L -> { framebufferScrollX = framebufferScrollX.and(0xFFFF00FF.toInt()).or(bi shl 8) } + 16L -> { framebufferScrollY = framebufferScrollY.and(0xFFFFFF00.toInt()).or(bi) } + 17L -> { framebufferScrollY = framebufferScrollY.and(0xFFFF00FF.toInt()).or(bi shl 8) } + + in 1024L..2047L -> { scanlineOffsets[addr - 1024] = byte } + else -> null } } @@ -608,7 +613,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi override fun crlf() { val (_, y) = getCursorPos() - val newy = y + 1 + halfrowMode.toInt() + val newy = y + 1 //+ halfrowMode.toInt() setCursorPos(0, if (newy >= TEXT_ROWS) TEXT_ROWS - 1 else newy) if (newy >= TEXT_ROWS) scrollUp(1) } @@ -715,6 +720,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi chrrom0.dispose() chrrom.dispose() unusedArea.destroy() + scanlineOffsets.destroy() } private var textCursorBlinkTimer = 0f @@ -742,10 +748,9 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi if (isRefSize && graphicsMode == 1) { val layerOrder = LAYERORDERS4[layerArrangement] for (y in 0..223) { - var xoff = unusedArea[20L + 2 * y].toUint().shl(8) or unusedArea[20L + 2 * y + 1].toUint() + var xoff = scanlineOffsets[2L * y].toUint().shl(8) or scanlineOffsets[2L * y + 1].toUint() if (xoff.and(0x8000) != 0) xoff = xoff or 0xFFFF0000.toInt() - val xs = - (0 + xoff).coerceIn(0, 279)..(279 + xoff).coerceIn(0, 279) + val xs = (0 + xoff).coerceIn(0, 279)..(279 + xoff).coerceIn(0, 279) if (xoff in -(280 - 1) until 280) { for (x in xs) { @@ -778,10 +783,9 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi } else { for (y in 0 until config.height) { - var xoff = unusedArea[20L + 2 * y].toUint().shl(8) or unusedArea[20L + 2 * y + 1].toUint() + var xoff = scanlineOffsets[2L * y].toUint() or scanlineOffsets[2L * y + 1].toUint().shl(8) if (xoff.and(0x8000) != 0) xoff = xoff or 0xFFFF0000.toInt() - val xs = - (0 + xoff).coerceIn(0, config.width - 1)..(config.width - 1 + xoff).coerceIn(0, config.width - 1) + val xs = (0 + xoff).coerceIn(0, config.width - 1)..(config.width - 1 + xoff).coerceIn(0, config.width - 1) if (xoff in -(config.width - 1) until config.width) { for (x in xs) { diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/TTY.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TTY.kt index fb6ce85..703e4a0 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/TTY.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/TTY.kt @@ -31,7 +31,7 @@ class TTY(assetsRoot: String, val vm: VM) : GlassTty(TEXT_ROWS, TEXT_COLS), Peri override var blinkCursor = true override var ttyRawMode = false - override var halfrowMode = false +// override var halfrowMode = false override fun getCursorPos() = rawCursorPos % TEXT_COLS to rawCursorPos / TEXT_COLS /**