From e031f0d2567272a0b3f31cd0d51d1b20dae2d173 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 27 Apr 2021 14:02:38 +0900 Subject: [PATCH] graphics: fixed bad screen fill command impl; added clearPixels cmd --- assets/disk0/home/logotest.js | 19 +++++++++++++++++++ src/net/torvald/tsvm/AppLoader.java | 2 +- .../torvald/tsvm/GraphicsJSR223Delegate.kt | 5 +++++ .../tsvm/peripheral/GraphicsAdapter.kt | 14 ++++---------- 4 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 assets/disk0/home/logotest.js diff --git a/assets/disk0/home/logotest.js b/assets/disk0/home/logotest.js new file mode 100644 index 0000000..ad5fd11 --- /dev/null +++ b/assets/disk0/home/logotest.js @@ -0,0 +1,19 @@ +var imageBits = gzip.decomp(base64.atob( +"H4sICPx7h2ACA3RhbmRlbV9sb2dvXzI0MC5iaW4A7dQ/boMwFAbwz3Ikd4jitUMleoSOGaL6Kj1Cxg6V8NF8FI7AyIBwPv8hOA6kW6Y8IST4WWC/92zvX/GMsABEj9Y7+BEdoD1vUICfIKJ2MNQ2qqhVlop2XU1Sk5WDoyqHZtFmXZukulJtOdOrqqxmuFGdVFbabCpT4D2fqIqqvBW8hVdNP+vnot2Gyqh9rRPOclFk5coKfRNRh1pHnMUjHah7RB1nZQbX9CekgBPl14IOGODdAX/ryj/eq7RJe2rrNE6lfkn7nlRO/6v9uFGBpB3V1HoUvKIqH5RrWtXQa4umbByR1e042OluV2byBPwm3T9Se2DOne5RVnBDc/W/EbIftIk6oOycq3L+rFdWe6fGBh1RdqyBmJUJ2dIpqHR6QrlTFm1ZiKvmXWasjDoGFU57lDt0Q02tns1DteXJYJyKOgTFrPOpcqeuPJGSvuIpcQH1GZbNgAcAAA==" +)); +for (let y = 0; y < 64; y++) { + for (let x = 0; x < 30; x++) { + let word = imageBits[y * 30 + x]; + for (let i = 0; i < 8; i++) { + graphics.plotPixel(8*x + i, y, ((word >>> (7 - i)) & 1 != 0) ? 255 : 239); + } + } +} + +// wait arbitrary time +for (let b=0;b<333333;b++) { + sys.poke(0,(Math.random()*255)|0); + sys.poke(0,0); +} +con.clear(); +graphics.clearPixels(255); diff --git a/src/net/torvald/tsvm/AppLoader.java b/src/net/torvald/tsvm/AppLoader.java index 59f0415..b979aab 100644 --- a/src/net/torvald/tsvm/AppLoader.java +++ b/src/net/torvald/tsvm/AppLoader.java @@ -38,7 +38,7 @@ public class AppLoader { EmulInstance term = new EmulInstance(appConfig, vm, "net.torvald.tsvm.peripheral.TexticsAdapter", "assets/disk0"); EmulInstance portable = new EmulInstance(appConfig, vm, "net.torvald.tsvm.peripheral.CharacterLCDdisplay", "assets/disk0"); - new LwjglApplication(new VMGUI(portable), appConfig); + new LwjglApplication(new VMGUI(reference), appConfig); } public static ShaderProgram loadShaderFromFile(String vert, String frag) { diff --git a/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt b/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt index a123d36..3c10e2a 100644 --- a/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt +++ b/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt @@ -79,6 +79,11 @@ class GraphicsJSR223Delegate(val vm: VM) { } } + fun clearPixels(col: Int) { + getFirstGPU()?.poke(250884L, col.toByte()) + getFirstGPU()?.poke(250883L, 2) + } + /** * prints a char as-is; won't interpret them as an escape sequence */ diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index 39a91a5..2f11c01 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -14,6 +14,7 @@ import net.torvald.tsvm.peripheral.GraphicsAdapter.Companion.DRAW_SHADER_FRAG import java.io.InputStream import java.io.OutputStream import kotlin.experimental.and +import kotlin.math.roundToInt data class AdapterConfig( val theme: String, @@ -262,12 +263,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super } } 2 -> { - framebuffer.setColor( - paletteOfFloats[arg1 * 4], - paletteOfFloats[arg1 * 4 + 1], - paletteOfFloats[arg1 * 4 + 2], - paletteOfFloats[arg1 * 4 + 3] - ) + framebuffer.setColor(0f,0f,0f,arg1 / 255f) framebuffer.fill() } } @@ -767,9 +763,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super } private fun peekPalette(offset: Int): Byte { - if (offset == 255) return 0 // palette 255 is always transparent - - // FIXME always return zero? + if (offset >= 255 * 2) return 0 // palette 255 is always transparent val highvalue = paletteOfFloats[offset * 2] // R, B val lowvalue = paletteOfFloats[offset * 2 + 1] // G, A @@ -778,7 +772,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super private fun pokePalette(offset: Int, byte: Byte) { // palette 255 is always transparent - if (offset < 255) { + if (offset < 255 * 2) { val highvalue = byte.toInt().and(0xF0).ushr(4) / 15f val lowvalue = byte.toInt().and(0x0F) / 15f