From fcf3dca3e4f2be3020c418d7d6cbb60864aac20d Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 22 Nov 2020 17:24:00 +0900 Subject: [PATCH] adding 9-bit font used on HP 264x terminals --- cp437_fira_code.png | Bin 13418 -> 13559 bytes hp2640.kra | 3 +++ hp2640.png | Bin 0 -> 5559 bytes src/net/torvald/tsvm/AppLoader.java | 4 +-- src/net/torvald/tsvm/VMGUI.kt | 4 +-- .../tsvm/peripheral/GraphicsAdapter.kt | 21 +++++---------- .../torvald/tsvm/peripheral/TexticsAdapter.kt | 24 +++++++++++++----- 7 files changed, 31 insertions(+), 25 deletions(-) create mode 100644 hp2640.kra create mode 100644 hp2640.png diff --git a/cp437_fira_code.png b/cp437_fira_code.png index bcec388c3b24357d771009c2a33f97d6f78300cd..2618ae2be75889591a419e577a99b6ea92dbf904 100644 GIT binary patch literal 13559 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

*`3YjW9>O|yqz<=0fk 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 literal 13418 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 FV1g8UzFq(T literal 0 HcmV?d00001 diff --git a/src/net/torvald/tsvm/AppLoader.java b/src/net/torvald/tsvm/AppLoader.java index abda740..3703ea3 100644 --- a/src/net/torvald/tsvm/AppLoader.java +++ b/src/net/torvald/tsvm/AppLoader.java @@ -22,8 +22,8 @@ public class AppLoader { appConfig.resizable = false; appConfig.title = appTitle; appConfig.forceExit = true; - appConfig.width = 960;//560; - appConfig.height = 400;//448; + appConfig.width = 720;//560; + appConfig.height = 375;//448; // val vm = VM(64.kB(), TheRealWorld(), arrayOf(GenericBios)) diff --git a/src/net/torvald/tsvm/VMGUI.kt b/src/net/torvald/tsvm/VMGUI.kt index c8cda99..e5bb65a 100644 --- a/src/net/torvald/tsvm/VMGUI.kt +++ b/src/net/torvald/tsvm/VMGUI.kt @@ -33,9 +33,9 @@ class VMGUI(val vm: VM, val appConfig: LwjglApplicationConfiguration) : Applicat override fun create() { super.create() - //gpu = TexticsAdapter(vm, theme = GraphicsAdapter.THEME_COLORCRT) //gpu = GraphicsAdapter(vm, GraphicsAdapter.DEFAULT_CONFIG_COLOR_CRT) - gpu = CharacterLCDdisplay(vm) + gpu = TexticsAdapter(vm) + //gpu = CharacterLCDdisplay(vm) vm.peripheralTable[1] = PeripheralEntry( VM.PERITYPE_GPU_AND_TERM, diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index 596d554..5680f18 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -153,9 +153,11 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) : spriteAndTextArea[k + memTextOffset] = 0 } - unusedArea[0] = 2 - unusedArea[1] = 3 - unusedArea[2] = 4 + if (theme.contains("color")) { + unusedArea[0] = 2 + unusedArea[1] = 3 + unusedArea[2] = 4 + } setCursorPos(0, 0) @@ -882,8 +884,6 @@ uniform vec2 tilesInAtlas = ivec2(16.0, 16.0); uniform vec2 atlasTexSize = ivec2(128.0, 224.0); vec2 tileSizeInPx = atlasTexSize / tilesInAtlas; // should be like ivec2(16, 16) -float fontGamma = 1.8; - ivec2 getTileXY(int tileNumber) { return ivec2(tileNumber % int(tilesInAtlas.x), tileNumber / int(tilesInAtlas.x)); } @@ -899,15 +899,6 @@ int getTileFromColor(vec4 color) { return _colToInt(color) & 0xFFFFF; } -vec4 fontMix(vec4 zero, vec4 one, float scale) { - return vec4(zero.r * (1 - pow(scale, fontGamma)) + one.r * pow(scale, fontGamma), - zero.g * (1 - pow(scale, fontGamma)) + one.g * pow(scale, fontGamma), - zero.b * (1 - pow(scale, fontGamma)) + one.b * pow(scale, fontGamma), - zero.a * (1 - pow(scale, fontGamma)) + one.a * pow(scale, fontGamma) - ); -} - - void main() { // READ THE FUCKING MANUAL, YOU DONKEY !! // @@ -945,7 +936,7 @@ void main() { // apply colour. I'm expecting FONT ROM IMAGE to be greyscale // TODO non-linear mix with gamma 2.2 - gl_FragColor = fontMix(backColFromMap, foreColFromMap, tileCol.r); + gl_FragColor = mix(backColFromMap, foreColFromMap, tileCol.r); } """.trimIndent() diff --git a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt b/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt index ef123f4..5499728 100644 --- a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt @@ -5,18 +5,30 @@ import com.badlogic.gdx.graphics.Texture import net.torvald.tsvm.VM import net.torvald.tsvm.kB -class TexticsAdapter(vm: VM, theme: String) : GraphicsAdapter(vm, AdapterConfig( - "crt_green", +class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig( + "crt", + 720, + 375, + 80, + 25, + 254, + 255, + 256.kB(), + "./hp2640.png", + 0.32f +)) { +/*class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig( + "crt_color", 560, 448, 80, 32, - 239, - 0, + 254, + 255, 256.kB(), "./cp437_fira_code.png", - 0.7f -)) { + 0.64f +)) {*/ override fun peek(addr: Long): Byte? { return when (addr) {