From 4b293c537f4dcc3fd519da2192491fc15aa35aa3 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 17 Oct 2021 22:41:51 +0900 Subject: [PATCH] working font redefining --- assets/FontROM7x14.png | Bin 3694 -> 3701 bytes assets/disk0/fontredef.js | 33 ++++++++++++++ src/net/torvald/tsvm/DMADelegate.kt | 2 + .../tsvm/peripheral/GraphicsAdapter.kt | 41 +++++++++++------- terranmon.txt | 2 +- 5 files changed, 62 insertions(+), 16 deletions(-) create mode 100644 assets/disk0/fontredef.js diff --git a/assets/FontROM7x14.png b/assets/FontROM7x14.png index d50fcfd6cd3bf4d5fd3de488ec42aad871ec6614..ac140a00c07fb78cf41ce25048c8891afe731d3f 100644 GIT binary patch delta 3685 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 Dzrrm@ delta 3677 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 diff --git a/assets/disk0/fontredef.js b/assets/disk0/fontredef.js new file mode 100644 index 0000000..0aa789b --- /dev/null +++ b/assets/disk0/fontredef.js @@ -0,0 +1,33 @@ +sys.poke(-1299460, 4) + +let off = -1300607 - (14*0x4F) +let char = [0,42,85,62,65,85,65,81,93,65,62,0,0,0] +for (let i = 0; i < char.length; i++) { + sys.poke(off - i, char[i]) +} + +// check if things are copied well +for (let k = 0; k < 14*128; k += 14) { + let c = (k / 14)|0 + let x = 7 * ((c % 16)|0) + let y = 14 * ((c / 16)|0) + + for (let l = 0; l < 14; l++) { + let byte = sys.peek(-1300607 - k - l) + for (let b = 0; b < 7; b++) { + let px = 239 * ((byte >> (6 - b)) & 1) + graphics.plotPixel(200+x+b, 200+y+l, px) + } + } +} + + +sys.poke(-1299460, 6) + +for (let y=0; y < 16; y++) { + for (let x = 0; x < 16; x++) { + con.addch(y*16+x) + con.curs_right() + } + println() +} \ No newline at end of file diff --git a/src/net/torvald/tsvm/DMADelegate.kt b/src/net/torvald/tsvm/DMADelegate.kt index 0318295..84704c3 100644 --- a/src/net/torvald/tsvm/DMADelegate.kt +++ b/src/net/torvald/tsvm/DMADelegate.kt @@ -20,6 +20,7 @@ class DMADelegate(val vm: VM) { UnsafeHelper.memcpyRaw(null, vm.usermem.ptr + from, data, UnsafeHelper.getArrayOffset(data), length.toLong()) it.framebuffer.pixels.position(offset) it.framebuffer.pixels.put(data) + it.framebuffer.pixels.position(0) // rewinding to avoid graphical glitch } } @@ -37,6 +38,7 @@ class DMADelegate(val vm: VM) { val data = ByteArray(length) it.framebuffer.pixels.position(from) it.framebuffer.pixels.get(data) + it.framebuffer.pixels.position(0) // rewinding to avoid graphical glitch UnsafeHelper.memcpyRaw(data, UnsafeHelper.getArrayOffset(data), null, vm.usermem.ptr + to, length.toLong()) } } diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index 5adceee..991348a 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -6,7 +6,9 @@ import com.badlogic.gdx.graphics.g2d.Gdx2DPixmap import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.glutils.FrameBuffer +import com.badlogic.gdx.graphics.glutils.PixmapTextureData import com.badlogic.gdx.math.Matrix4 +import com.badlogic.gdx.utils.GdxRuntimeException import net.torvald.UnsafeHelper import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint import net.torvald.tsvm.AppLoader @@ -67,7 +69,8 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super val channel = it % 4 rgba.shr((3 - channel) * 8).and(255) / 255f } - protected var chrrom0 = Texture(Pixmap(Gdx2DPixmap(Gdx.files.internal("./assets/"+config.chrRomPath).read(), Gdx2DPixmap.GDX2D_FORMAT_ALPHA))) + protected var chrrom = Pixmap(Gdx2DPixmap(Gdx.files.internal("./assets/"+config.chrRomPath).read(), Gdx2DPixmap.GDX2D_FORMAT_ALPHA)) + protected var chrrom0 = Texture(1,1,Pixmap.Format.RGBA8888) protected val faketex: Texture internal val textArea = UnsafeHelper.allocate(7682) @@ -162,6 +165,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super faketex = Texture(pm) pm.dispose() + // initialise with NONZERO value; value zero corresponds to opaque black, and it will paint the whole screen black // when in text mode, and that's undesired behaviour // -1 is preferred because it points to the colour CLEAR, and it's constant. @@ -309,25 +313,27 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super val ch = config.height / config.textRows if (cw > 8 || ch > 15) throw UnsupportedOperationException() - chrrom0.textureData.prepare() - val pixmap = chrrom0.textureData.consumePixmap() + val pixmap = chrrom val scanline = ByteArray(cw) val dataOffset = mode * chrrom0.width * chrrom0.height / 2 for (char in 0 until 128) { + val px = (char % 16) * cw; val py = (char / 16) * ch + val off = dataOffset + (py * 16 * cw) + px for (line in 0 until ch) { - pixmap.pixels.position((char / 16) * (cw * 16 * ch) + (char % 16) * cw + dataOffset) + pixmap.pixels.position(off + (line * 16 * cw)) pixmap.pixels.get(scanline) + pixmap.pixels.position(0) // rewinding to avoid graphical glitch var word = 0 for (bm in 0 until scanline.size) { val pixel = (scanline[bm] < 0).toInt() word = word or (pixel shl (scanline.size - 1 - bm)) } - mappedFontRom[char * ch + line] + mappedFontRom[char * ch + line] = word.toByte() } } - pixmap.dispose() +// try { pixmap.dispose() } catch (e: GdxRuntimeException) {} } /** @@ -341,27 +347,25 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super if (cw > 8 || ch > 15) throw UnsupportedOperationException() - chrrom0.textureData.prepare() - val pixmap = chrrom0.textureData.consumePixmap() + val pixmap = chrrom val scanline = ByteArray(cw) val dataOffset = mode * chrrom0.width * chrrom0.height / 2 for (char in 0 until 128) { + val px = (char % 16) * cw; val py = (char / 16) * ch + val off = dataOffset + (py * 16 * cw) + px for (line in 0 until ch) { - val word = mappedFontRom[char * ch + line] + val word = mappedFontRom[char * ch + line].toInt() for (bm in 0 until scanline.size) { - val pixel = 255 * (word and (1 shl (scanline.size - 1 - bm)).toByte() < 0).toInt() + val pixel = 255 * ((word shr (cw - 1 - bm)) and 1) scanline[bm] = pixel.toByte() } - pixmap.pixels.position((char / 16) * (cw * 16 * ch) + (char % 16) * cw + dataOffset) + pixmap.pixels.position(off + (line * 16 * cw)) pixmap.pixels.put(scanline) + pixmap.pixels.position(0) // rewinding to avoid graphical glitch } } - chrrom0.dispose() - chrrom0 = Texture(pixmap) - - pixmap.dispose() } @@ -671,6 +675,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super try { textBackTex.dispose() } catch (_: Throwable) {} chrrom0.dispose() + chrrom.dispose() unusedArea.destroy() } @@ -685,6 +690,10 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super unusedArea[2].toInt().and(15).toFloat() / 15f, 1f) open fun render(delta: Float, uiBatch: SpriteBatch, xoff: Float, yoff: Float) { + // must reset positions as pixmaps expect them to be zero + framebuffer.pixels.position(0) + chrrom.pixels.position(0) + framebuffer2.setColor(-1);framebuffer2.fill() for (y in 0 until config.height) { var xoff = unusedArea[20L + 2*y].toUint().shl(8) or unusedArea[20L + 2*y + 1].toUint() @@ -702,6 +711,8 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super } + chrrom0.dispose() + chrrom0 = Texture(chrrom) rendertex.dispose() rendertex = Texture(framebuffer2, Pixmap.Format.RGBA8888, false) diff --git a/terranmon.txt b/terranmon.txt index 7711fa9..e4d2aa0 100644 --- a/terranmon.txt +++ b/terranmon.txt @@ -158,7 +158,7 @@ From the start of the memory space: 2: fill framebuffer with given colour (arg1) 3: do '1' then do '2' 4: copy Low Font ROM (char 0–127) to mapping area - 5: copy Low Font ROM (char 128–255) to mapping area + 5: copy High Font ROM (char 128–255) to mapping area 6: write contents of the font ROM mapping area to the Low Font ROM 7: write contents of the font ROM mapping area to the High Font ROM 12 bytes