From dd7d226d7b6466d5197ecf1c8d0dab079f917a29 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 19 Nov 2020 18:01:40 +0900 Subject: [PATCH] half-working text-only lcd --- 8025_textonly.png | Bin 0 -> 6613 bytes lcd.png | Bin 0 -> 3737 bytes src/net/torvald/tsvm/AppLoader.java | 4 +- src/net/torvald/tsvm/VMGUI.kt | 4 +- .../tsvm/peripheral/CharacterLCDdisplay.kt | 44 ++++++++++++++++++ .../tsvm/peripheral/GraphicsAdapter.kt | 26 +++++------ 6 files changed, 62 insertions(+), 16 deletions(-) create mode 100644 8025_textonly.png create mode 100644 lcd.png create mode 100644 src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt diff --git a/8025_textonly.png b/8025_textonly.png new file mode 100644 index 0000000000000000000000000000000000000000..094b7168b5cf2778e203012619c840ef06eddca9 GIT binary patch literal 6613 zcmeI0X;4#H7RMj9+QEo`(gH&dAq}V?%b+lT$RflD+K8+rC}1};g3>G&yAT2>qB86w z$Rc5DkVXxNfUH3&wH+ks1loW=5(tnc60)!)frQL^z*IROW@@I2uI>-HRd2iRyqtT_ z{ok8&e|OHEJ*Bkk54!*WP;zlbc>ut6@YrSq+X>c?9kWsaKq35!lhe5?K|ug;C@&^& z;4sQv<25!a<96Ol$EVLTk(p+9^7VtvN?iskcK=yO6MHON>x?__)@S7WA$SwNg@bYNAJ=?e_?3LC_e;=Z=A{UBq zScUq@tiBOde&mKnX8wq*r!s=Brq4ewX!CucdaAH2-l@u`Ce-gLdhuCOf{)icb|Lzx zZr{)IsW5Z9c-k3+dDsh9EerEyJdK4EaVH*~UntV6YqBI;hWbS+f1om^x@wC@BRlqt z$F)vq(DMUp3*YuGm_5_4T-fEe{|8^`qo`>3(FOsksIeI?eM-Ra;rl#8_Ps@R=z{~G z80qXA1px4U(4hd7lxYBfhLQ{Fgjf6r&UjNqP^jbU2~wPY6L?T04|v;nL0=h|EeGdD=E#9-MGCCtmVz31p}d<_+VHf@g7_X^F5bsZcY z{j}u7lCJcO7=dIe8tt>iJI3t4J45B{Oo*imr)QQs-kF$od4le&65Vo0f5o&J zgpKYINW_vK9u;P~jC!Q3(b&ID zYia~TFDf1Vc%-w7cNQFK#+T3CM=)%d{&pyM3cbE^fPz2L@;-!Wp4I(nk%kD%W;QIg zdTo)5mUKlfT0kyZ`AQ4@C(2h^`AQ4wKt-M&$kPK*2RG&Efjm6`bs$d<*q8Wh;Ob z8sXv7f3lc_m$6H&EtX9i+qO%J{fxQyCjiU~?xPOG=qUFj~BX zc}(&xRS%I7K{AcS{v0SX#*nSyAh=_-3x%5K4d5u=;Bx=PW63cn^bF56k=xp2flNwY zTjJ6=#UfS?#P_(Oo)kfoP{V5--!Q0l*@qBs@~O#^F-3zUvO1-%CnVr-A$@J~^pgyI z!psG$3o>4UrN!*N0j2J+FO}W|i_xrTiSMza>Z(QxN^i;zvt@ zD0)9@-#TJV30y7H5opUu{+1rMyO*UWM2o%{_TQ3!fttXJd7k&O;VdRs7ACPMRmQ4w zJ+TM5p<)WXKa{*30+<6?YG_S>MlsHElLk<@O3c6su;Uu)$aG7tF*-d0J4h8Sy50j# z7lhWhYc!@(A~GGnoPLcM7)ckB(lE33T%#c{gieX#G5+_sLE2#Oe!6ZtLXy55v{ok6 z*p1o?#`m#!NY=i}4=xg}NVN}wSnzr#_zhqh(211MB7TBH%&#}Drp!sX;y)Dy=`Y5xQOu>&*! literal 0 HcmV?d00001 diff --git a/lcd.png b/lcd.png new file mode 100644 index 0000000000000000000000000000000000000000..22f9263a1e6033b8ef4c8fcc8773cceaff3a0dc1 GIT binary patch literal 3737 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 literal 0 HcmV?d00001 diff --git a/src/net/torvald/tsvm/AppLoader.java b/src/net/torvald/tsvm/AppLoader.java index b4e4e4a..abda740 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 = 560; - appConfig.height = 448; + appConfig.width = 960;//560; + appConfig.height = 400;//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 597a790..c8cda99 100644 --- a/src/net/torvald/tsvm/VMGUI.kt +++ b/src/net/torvald/tsvm/VMGUI.kt @@ -7,6 +7,7 @@ import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.SpriteBatch import kotlinx.coroutines.* import net.torvald.tsvm.CompressorDelegate.GZIP_HEADER +import net.torvald.tsvm.peripheral.CharacterLCDdisplay import net.torvald.tsvm.peripheral.GenericBios import net.torvald.tsvm.peripheral.GraphicsAdapter import net.torvald.tsvm.peripheral.TexticsAdapter @@ -33,7 +34,8 @@ class VMGUI(val vm: VM, val appConfig: LwjglApplicationConfiguration) : Applicat super.create() //gpu = TexticsAdapter(vm, theme = GraphicsAdapter.THEME_COLORCRT) - gpu = GraphicsAdapter(vm, GraphicsAdapter.DEFAULT_CONFIG_COLOR_CRT) + //gpu = GraphicsAdapter(vm, GraphicsAdapter.DEFAULT_CONFIG_COLOR_CRT) + gpu = CharacterLCDdisplay(vm) vm.peripheralTable[1] = PeripheralEntry( VM.PERITYPE_GPU_AND_TERM, diff --git a/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt b/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt new file mode 100644 index 0000000..779ba91 --- /dev/null +++ b/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt @@ -0,0 +1,44 @@ +package net.torvald.tsvm.peripheral + +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.Texture +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.tsvm.VM + +class CharacterLCDdisplay(vm: VM) : GraphicsAdapter(vm, AdapterConfig( + "pmlcd_inverted", 960, 400, 80, 25, 249, 255, 262144L, "./lcd.png", 0.7f +) +) { + + private val machine = Texture("./8025_textonly.png") + + override fun peek(addr: Long): Byte? { + return when (addr) { + in 0 until 250880 -> (-1).toByte() + else -> super.peek(addr) + } + } + + override fun poke(addr: Long, byte: Byte) { + when (addr) { + in 0 until 250880 -> { /*do nothing*/ } + else -> super.poke(addr, byte) + } + } + + override fun render(delta: Float, batch: SpriteBatch, xoff: Float, yoff: Float) { + /*batch.shader = null + batch.inUse { + batch.color = Color.WHITE + batch.draw(machine, xoff, yoff) + } + super.render(delta, batch, xoff+200, yoff-200) + */ + super.render(delta, batch, xoff, yoff) + } + + override fun dispose() { + machine.dispose() + super.dispose() + } +} \ No newline at end of file diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index c5ee8ac..d36bbf1 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -569,7 +569,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) : private var glowDecay = config.decay private var decayColor = Color(1f, 1f, 1f, 1f - glowDecay) - fun render(delta: Float, batch: SpriteBatch, x: Float, y: Float) { + open fun render(delta: Float, batch: SpriteBatch, xoff: Float, yoff: Float) { rendertex.dispose() rendertex = Texture(framebuffer, Pixmap.Format.RGBA8888, false) @@ -608,7 +608,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) : if (theme.startsWith("pmlcd")) batch.shader.setUniformf("lcdBaseCol", LCD_BASE_COL) // draw framebuffer - batch.draw(rendertex, x, y) + batch.draw(rendertex, 0f, 0f) // draw texts or sprites @@ -712,7 +712,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) : batch.shader = null batch.inUse { batch.color = Color.WHITE - batch.draw(outFBOs[1].colorBufferTexture, 0f, HEIGHT.toFloat(), WIDTH.toFloat(), -HEIGHT.toFloat()) + batch.draw(outFBOs[1].colorBufferTexture, xoff, HEIGHT.toFloat() - yoff, WIDTH.toFloat(), -HEIGHT.toFloat()) } @@ -1483,16 +1483,16 @@ void main() { 0 ) } +} - private fun FrameBuffer.inUse(action: () -> Unit) { - this.begin() - action() - this.end() - } +fun FrameBuffer.inUse(action: () -> Unit) { + this.begin() + action() + this.end() +} - private fun SpriteBatch.inUse(action: () -> Unit) { - this.begin() - action() - this.end() - } +fun SpriteBatch.inUse(action: () -> Unit) { + this.begin() + action() + this.end() } \ No newline at end of file