mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 19:51:51 +09:00
gpu mmio write addrs have been moved around
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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())
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user