From 5e290061f463fe17990e6a966ce206865b0a7696 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 3 Dec 2021 11:57:31 +0900 Subject: [PATCH] codes split into modules: tsvm_core, tsvm_executable, TerranBASICexecutable --- .../{TSVM_Executable.xml => TerranBASIC.xml} | 51 ++-- .idea/artifacts/TerrarumTSVM.xml | 8 + .idea/modules.xml | 5 +- .idea/runConfigurations.xml | 10 + .idea/uiDesigner.xml | 124 ++++++++ TerranBASICexecutable/META-INF/MANIFEST.MF | 3 + .../TerranBASICexecutable.iml | 15 +- .../src/net/torvald/tsvm/TerranBASIC.java | 32 +++ .../src/net/torvald/tsvm/VMGUI.kt | 264 ++++++++++++++++++ src/net/torvald/random/HQRNG.java | 194 ------------- .../services/javax.script.ScriptEngineFactory | 0 .../src}/net/torvald/tsvm/Base64Delegate.kt | 0 .../src/net/torvald/tsvm}/CircularArray.kt | 4 +- .../net/torvald/tsvm/CompressorDelegate.kt | 0 .../src}/net/torvald/tsvm/DMADelegate.kt | 0 .../net/torvald/tsvm/FilesystemDelegate.kt | 0 .../torvald/tsvm/GraphicsJSR223Delegate.kt | 0 tsvm_core/src/net/torvald/tsvm/LoadShader.kt | 18 ++ .../src}/net/torvald/tsvm/SerialHelper.kt | 0 .../net/torvald/tsvm}/TextureRegionPack.kt | 2 +- .../src}/net/torvald/tsvm/UnsafePtr.kt | 0 {src => tsvm_core/src}/net/torvald/tsvm/VM.kt | 6 +- .../src}/net/torvald/tsvm/VMJSR223Delegate.kt | 0 .../src}/net/torvald/tsvm/VMRunnerFactory.kt | 6 +- .../src}/net/torvald/tsvm/WorldInterface.kt | 0 .../tsvm/peripheral/BlockTransferInterface.kt | 4 +- .../tsvm/peripheral/BlockTransferPort.kt | 0 .../tsvm/peripheral/CharacterLCDdisplay.kt | 2 +- .../net/torvald/tsvm/peripheral/ExtDisp.kt | 4 +- .../net/torvald/tsvm/peripheral/GlassTty.kt | 0 .../tsvm/peripheral/GraphicsAdapter.kt | 6 +- .../net/torvald/tsvm/peripheral/IOSpace.kt | 3 +- .../net/torvald/tsvm/peripheral/PeriBase.kt | 0 .../src}/net/torvald/tsvm/peripheral/TTY.kt | 0 .../net/torvald/tsvm/peripheral/TermSim.kt | 0 .../torvald/tsvm/peripheral/TestDiskDrive.kt | 0 .../tsvm/peripheral/TestFunctionGenerator.kt | 0 .../torvald/tsvm/peripheral/TexticsAdapter.kt | 0 .../torvald/tsvm/peripheral/VMProgramRom.kt | 1 - .../net/torvald/tsvm/vdc/V2kParserTest.kt | 0 .../src}/net/torvald/tsvm/vdc/V2kRunTest.kt | 6 +- .../src}/net/torvald/tsvm/vdc/Videotron2K.kt | 4 +- tsvm_core/tsvm_core.iml | 23 ++ tsvm_dummymodule.iml | 9 + tsvm_executable.iml | 23 ++ .../tsvmperipheral/WorldRadar.kt | 0 .../src}/net/torvald/tsvm/AppLoader.java | 25 -- .../src}/net/torvald/tsvm/Memvwr.kt | 0 .../src}/net/torvald/tsvm/VMGUI.kt | 11 +- 49 files changed, 582 insertions(+), 281 deletions(-) rename .idea/artifacts/{TSVM_Executable.xml => TerranBASIC.xml} (94%) create mode 100644 .idea/artifacts/TerrarumTSVM.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 TerranBASICexecutable/META-INF/MANIFEST.MF rename tsvm.iml => TerranBASICexecutable/TerranBASICexecutable.iml (96%) create mode 100644 TerranBASICexecutable/src/net/torvald/tsvm/TerranBASIC.java create mode 100644 TerranBASICexecutable/src/net/torvald/tsvm/VMGUI.kt delete mode 100644 src/net/torvald/random/HQRNG.java rename {src => tsvm_core/src}/main/resources/META-INF/services/javax.script.ScriptEngineFactory (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/Base64Delegate.kt (100%) rename {src/net/torvald/util => tsvm_core/src/net/torvald/tsvm}/CircularArray.kt (97%) rename {src => tsvm_core/src}/net/torvald/tsvm/CompressorDelegate.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/DMADelegate.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/FilesystemDelegate.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/GraphicsJSR223Delegate.kt (100%) create mode 100644 tsvm_core/src/net/torvald/tsvm/LoadShader.kt rename {src => tsvm_core/src}/net/torvald/tsvm/SerialHelper.kt (100%) rename {src/net/torvald/terrarumsansbitmap/gdx => tsvm_core/src/net/torvald/tsvm}/TextureRegionPack.kt (98%) rename {src => tsvm_core/src}/net/torvald/tsvm/UnsafePtr.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/VM.kt (97%) rename {src => tsvm_core/src}/net/torvald/tsvm/VMJSR223Delegate.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/VMRunnerFactory.kt (96%) rename {src => tsvm_core/src}/net/torvald/tsvm/WorldInterface.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/BlockTransferInterface.kt (96%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/BlockTransferPort.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt (98%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/ExtDisp.kt (96%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/GlassTty.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/GraphicsAdapter.kt (99%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/IOSpace.kt (99%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/PeriBase.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/TTY.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/TermSim.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/TestDiskDrive.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/TexticsAdapter.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/peripheral/VMProgramRom.kt (97%) rename {src => tsvm_core/src}/net/torvald/tsvm/vdc/V2kParserTest.kt (100%) rename {src => tsvm_core/src}/net/torvald/tsvm/vdc/V2kRunTest.kt (87%) rename {src => tsvm_core/src}/net/torvald/tsvm/vdc/Videotron2K.kt (99%) create mode 100644 tsvm_core/tsvm_core.iml create mode 100644 tsvm_dummymodule.iml create mode 100644 tsvm_executable.iml rename {src => tsvm_executable/src}/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt (100%) rename {src => tsvm_executable/src}/net/torvald/tsvm/AppLoader.java (74%) rename {src => tsvm_executable/src}/net/torvald/tsvm/Memvwr.kt (100%) rename {src => tsvm_executable/src}/net/torvald/tsvm/VMGUI.kt (96%) diff --git a/.idea/artifacts/TSVM_Executable.xml b/.idea/artifacts/TerranBASIC.xml similarity index 94% rename from .idea/artifacts/TSVM_Executable.xml rename to .idea/artifacts/TerranBASIC.xml index 75f8f4b..9e4dfec 100644 --- a/.idea/artifacts/TSVM_Executable.xml +++ b/.idea/artifacts/TerranBASIC.xml @@ -1,13 +1,32 @@ - - $PROJECT_DIR$/out/artifacts/TSVM_Executable - - + + $PROJECT_DIR$/out/artifacts/TerranBASIC + - + - + + + + + + + + + + + + + + + + + + + + + @@ -45,25 +64,7 @@ - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.idea/artifacts/TerrarumTSVM.xml b/.idea/artifacts/TerrarumTSVM.xml new file mode 100644 index 0000000..de20b74 --- /dev/null +++ b/.idea/artifacts/TerrarumTSVM.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/out/artifacts/TerrarumTSVM + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 3b2904e..25177de 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,10 @@ - + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TerranBASICexecutable/META-INF/MANIFEST.MF b/TerranBASICexecutable/META-INF/MANIFEST.MF new file mode 100644 index 0000000..191d8f6 --- /dev/null +++ b/TerranBASICexecutable/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: net.torvald.tsvm.TerranBASIC + diff --git a/tsvm.iml b/TerranBASICexecutable/TerranBASICexecutable.iml similarity index 96% rename from tsvm.iml rename to TerranBASICexecutable/TerranBASICexecutable.iml index 7165379..d54dca1 100644 --- a/tsvm.iml +++ b/TerranBASICexecutable/TerranBASICexecutable.iml @@ -7,16 +7,17 @@ - - - + - - - - + + + + + + + \ No newline at end of file diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBASIC.java b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBASIC.java new file mode 100644 index 0000000..3368baa --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBASIC.java @@ -0,0 +1,32 @@ +package net.torvald.tsvm; + +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import net.torvald.tsvm.peripheral.*; + +public class TerranBASIC { + + public static String appTitle = "TerranBASIC"; + public static Lwjgl3ApplicationConfiguration appConfig; + + public static int WIDTH = 640; + public static int HEIGHT = 480; + + public static void main(String[] args) { + ShaderProgram.pedantic = false; + + appConfig = new Lwjgl3ApplicationConfiguration(); + appConfig.setIdleFPS(60); + appConfig.setForegroundFPS(60); + appConfig.useVsync(false); + appConfig.setResizable(false); + appConfig.setTitle(appTitle); + + appConfig.setWindowedMode(WIDTH, HEIGHT); + + VM tbasvm = new VM(64 << 10, new TheRealWorld(), new VMProgramRom[]{TBASRelBios.INSTANCE}); + EmulInstance tbasrunner = new EmulInstance(tbasvm, "net.torvald.tsvm.peripheral.ReferenceGraphicsAdapter", "assets/disk0", 560, 448); + new Lwjgl3Application(new VMGUI(tbasrunner, WIDTH, HEIGHT), appConfig); + } +} diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/VMGUI.kt b/TerranBASICexecutable/src/net/torvald/tsvm/VMGUI.kt new file mode 100644 index 0000000..4b24884 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/VMGUI.kt @@ -0,0 +1,264 @@ +package net.torvald.tsvm + +import com.badlogic.gdx.ApplicationAdapter +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.graphics.* +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import kotlinx.coroutines.* +import net.torvald.tsvm.peripheral.* +import java.io.File + +class EmulInstance( + val vm: VM, + val display: String?, + val diskPath: String = "assets/disk0", + val drawWidth: Int, + val drawHeight: Int, +) { + + var extraPeripherals: List> = listOf(); private set + + constructor( + vm: VM, + display: String?, + diskPath: String = "assets/disk0", + drawWidth: Int, + drawHeight: Int, + extraPeripherals: List> + ) : this(vm, display, diskPath, drawWidth, drawHeight) { + this.extraPeripherals = extraPeripherals + } + +} + +class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHeight: Int) : ApplicationAdapter() { + + val vm = loaderInfo.vm + + lateinit var batch: SpriteBatch + lateinit var camera: OrthographicCamera + + var gpu: GraphicsAdapter? = null + lateinit var vmRunner: VMRunner + lateinit var coroutineJob: Job + lateinit var fullscreenQuad: Mesh + + override fun create() { + super.create() + + fullscreenQuad = Mesh( + true, 4, 6, + VertexAttribute.Position(), + VertexAttribute.ColorUnpacked(), + VertexAttribute.TexCoords(0) + ) + updateFullscreenQuad(TerranBASIC.WIDTH, TerranBASIC.HEIGHT) + + batch = SpriteBatch() + camera = OrthographicCamera(TerranBASIC.WIDTH.toFloat(), TerranBASIC.HEIGHT.toFloat()) + camera.setToOrtho(false) + camera.update() + batch.projectionMatrix = camera.combined + + + init() + } + + private fun init() { + if (loaderInfo.display != null) { + val loadedClass = Class.forName(loaderInfo.display) + val loadedClassConstructor = loadedClass.getConstructor(vm::class.java) + val loadedClassInstance = loadedClassConstructor.newInstance(vm) + gpu = (loadedClassInstance as GraphicsAdapter) + + vm.getIO().blockTransferPorts[0].attachDevice(TestDiskDrive(vm, 0, File(loaderInfo.diskPath))) + + vm.peripheralTable[1] = PeripheralEntry( + gpu, + GraphicsAdapter.VRAM_SIZE, + 16, + 0 + ) + + vm.getPrintStream = { gpu!!.getPrintStream() } + vm.getErrorStream = { gpu!!.getErrorStream() } + vm.getInputStream = { gpu!!.getInputStream() } + } + else { + vm.getPrintStream = { System.out } + vm.getErrorStream = { System.err } + vm.getInputStream = { System.`in` } + } + + loaderInfo.extraPeripherals.forEach { (port, peri) -> + val typeargs = peri.args.map { it.javaClass }.toTypedArray() + + val loadedClass = Class.forName(peri.peripheralClassname) + val loadedClassConstructor = loadedClass.getConstructor(*typeargs) + val loadedClassInstance = loadedClassConstructor.newInstance(*peri.args) + + vm.peripheralTable[port] = PeripheralEntry( + loadedClassInstance as PeriBase, + peri.memsize, + peri.mmioSize, + peri.interruptCount + ) + } + + Gdx.input.inputProcessor = vm.getIO() + + + vmRunner = VMRunnerFactory(vm, "js") + coroutineJob = GlobalScope.launch { + vmRunner.executeCommand(vm.roms[0]!!.readAll()) + } + } + + private var rebootRequested = false + + private fun reboot() { + vmRunner.close() + coroutineJob.cancel("reboot requested") + + vm.init() + init() + } + + private var updateAkku = 0.0 + private var updateRate = 1f / 60f + + override fun render() { + gdxClearAndSetBlend(.094f, .094f, .094f, 0f) + setCameraPosition(0f, 0f) + + // update window title with contents of the 'built-in status display' + val msg = (1024L until 1048L).map { cp437toUni[vm.getIO().mmio_read(it)!!.toInt().and(255)] }.joinToString("").trim() + Gdx.graphics.setTitle("$msg $EMDASH F: ${Gdx.graphics.framesPerSecond}") + + super.render() + + val dt = Gdx.graphics.rawDeltaTime + updateAkku += dt + + var i = 0L + while (updateAkku >= updateRate) { + updateGame(updateRate) + updateAkku -= updateRate + i += 1 + } + + renderGame(dt) + } + + private fun updateGame(delta: Float) { + if (!vm.resetDown && rebootRequested) { + reboot() + rebootRequested = false + } + + vm.update(delta) + + if (vm.resetDown) rebootRequested = true + } + + fun poke(addr: Long, value: Byte) = vm.poke(addr, value) + + private val defaultGuiBackgroundColour = Color(0x444444ff) + + private fun renderGame(delta: Float) { + val clearCol = gpu?.getBackgroundColour() ?: defaultGuiBackgroundColour + Gdx.gl.glClearColor(clearCol.r, clearCol.g, clearCol.b, clearCol.a) + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + gpu?.render(delta, batch, (viewportWidth - loaderInfo.drawWidth).div(2).toFloat(), (viewportHeight - loaderInfo.drawHeight).div(2).toFloat()) + + vm.findPeribyType("oled")?.let { + val disp = it.peripheral as ExtDisp + + disp.render(batch, + (viewportWidth - loaderInfo.drawWidth).div(2).toFloat() + (gpu?.config?.width ?: 0), + (viewportHeight - loaderInfo.drawHeight).div(2).toFloat()) + } + } + + private fun setCameraPosition(newX: Float, newY: Float) { + camera.position.set((-newX + TerranBASIC.WIDTH / 2), (-newY + TerranBASIC.HEIGHT / 2), 0f) // deliberate integer division + camera.update() + batch.setProjectionMatrix(camera.combined) + } + + private fun gdxClearAndSetBlend(r: Float, g: Float, b: Float, a: Float) { + Gdx.gl.glClearColor(r,g,b,a) + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) + Gdx.gl.glEnable(GL20.GL_BLEND) + } + + private fun updateFullscreenQuad(WIDTH: Int, HEIGHT: Int) { // NOT y-flipped quads! + fullscreenQuad.setVertices(floatArrayOf( + 0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f, 1f, + WIDTH.toFloat(), 0f, 0f, 1f, 1f, 1f, 1f, 1f, 1f, + WIDTH.toFloat(), HEIGHT.toFloat(), 0f, 1f, 1f, 1f, 1f, 1f, 0f, + 0f, HEIGHT.toFloat(), 0f, 1f, 1f, 1f, 1f, 0f, 0f + )) + fullscreenQuad.setIndices(shortArrayOf(0, 1, 2, 2, 3, 0)) + } + + override fun dispose() { + super.dispose() + batch.dispose() + fullscreenQuad.dispose() + coroutineJob.cancel() + vm.dispose() + } + + companion object { + val cp437toUni = hashMapOf( + 0 to 32.toChar(), + 1 to 0x263A.toChar(), + 2 to 0x263B.toChar(), + 3 to 0x2665.toChar(), + 4 to 0x2666.toChar(), + 5 to 0x2663.toChar(), + 6 to 0x2660.toChar(), + 7 to 0x2022.toChar(), + 8 to 0x25D8.toChar(), + 9 to 0x25CB.toChar(), + 10 to 0x25D9.toChar(), + 11 to 0x2642.toChar(), + 12 to 0x2640.toChar(), + 13 to 0x266A.toChar(), + 14 to 0x266B.toChar(), + 15 to 0x00A4.toChar(), + + 16 to 0x25BA.toChar(), + 17 to 0x25C4.toChar(), + 18 to 0x2195.toChar(), + 19 to 0x203C.toChar(), + 20 to 0x00B6.toChar(), + 21 to 0x00A7.toChar(), + 22 to 0x25AC.toChar(), + 23 to 0x21A8.toChar(), + 24 to 0x2191.toChar(), + 25 to 0x2193.toChar(), + 26 to 0x2192.toChar(), + 27 to 0x2190.toChar(), + 28 to 0x221F.toChar(), + 29 to 0x2194.toChar(), + 30 to 0x25B2.toChar(), + 31 to 0x25BC.toChar(), + + 127 to 0x2302.toChar(), + + 158 to 0x2610.toChar(), + 159 to 0x2611.toChar() + ) + + init { + for (k in 32..126) { + cp437toUni[k] = k.toChar() + } + } + } +} + +const val EMDASH = 0x2014.toChar() \ No newline at end of file diff --git a/src/net/torvald/random/HQRNG.java b/src/net/torvald/random/HQRNG.java deleted file mode 100644 index 1ead5a0..0000000 --- a/src/net/torvald/random/HQRNG.java +++ /dev/null @@ -1,194 +0,0 @@ -package net.torvald.random; - -import java.util.Random; - -/** - * Xoroshiro128 - * - * Note: low 4 bits are considered "dirty"; avoid these bits for making random set of booleans - * - * see https://github.com/SquidPony/SquidLib/blob/master/squidlib-util/src/main/java/squidpony/squidmath/XoRoRNG.java - */ -public class HQRNG extends Random { - - private static final long DOUBLE_MASK = (1L << 53) - 1; - private static final double NORM_53 = 1. / (1L << 53); - private static final long FLOAT_MASK = (1L << 24) - 1; - private static final double NORM_24 = 1. / (1L << 24); - - private static final long serialVersionUID = 1018744536171610262L; - - private long state0, state1; - - public long getState0() { - return state0; - } - - public long getState1() { - return state1; - } - - /** - * Creates a new generator seeded using four calls to Math.random(). - */ - public HQRNG() { - this((long) ((Math.random() - 0.5) * 0x10000000000000L) - ^ (long) (((Math.random() - 0.5) * 2.0) * 0x8000000000000000L), - (long) ((Math.random() - 0.5) * 0x10000000000000L) - ^ (long) (((Math.random() - 0.5) * 2.0) * 0x8000000000000000L)); - } - /** - * Constructs this XoRoRNG by dispersing the bits of seed using {@link #setSeed(long)} across the two parts of state - * this has. - * @param seed a long that won't be used exactly, but will affect both components of state - */ - public HQRNG(final long seed) { - setSeed(seed); - } - /** - * Constructs this XoRoRNG by calling {@link #setSeed(long, long)} on the arguments as given; see that method for - * the specific details (stateA and stateB are kept as-is unless they are both 0). - * @param stateA the number to use as the first part of the state; this will be 1 instead if both seeds are 0 - * @param stateB the number to use as the second part of the state - */ - public HQRNG(final long stateA, final long stateB) { - setSeed(stateA, stateB); - } - - @Override - public final int next(int bits) { - final long s0 = state0; - long s1 = state1; - final int result = (int)(s0 + s1) >>> (32 - bits); - s1 ^= s0; - state0 = (s0 << 55 | s0 >>> 9) ^ s1 ^ (s1 << 14); // a, b - state1 = (s1 << 36 | s1 >>> 28); // c - return result; - } - - @Override - public final long nextLong() { - final long s0 = state0; - long s1 = state1; - final long result = s0 + s1; - - s1 ^= s0; - state0 = (s0 << 55 | s0 >>> 9) ^ s1 ^ (s1 << 14); // a, b - state1 = (s1 << 36 | s1 >>> 28); // c - /* - state0 = Long.rotateLeft(s0, 55) ^ s1 ^ (s1 << 14); // a, b - state1 = Long.rotateLeft(s1, 36); // c - */ - return result; - } - - /** - * Can return any int, positive or negative, of any size permissible in a 32-bit signed integer. - * @return any int, all 32 bits are random - */ - public int nextInt() { - return (int)nextLong(); - } - - /** - * Exclusive on the outer bound; the inner bound is 0. The bound may be negative, which will produce a non-positive - * result. - * @param bound the outer exclusive bound; may be positive or negative - * @return a random int between 0 (inclusive) and bound (exclusive) - */ - public int nextInt(final int bound) { - return (int) ((bound * (nextLong() >>> 33)) >> 31); - } - /** - * Inclusive lower, exclusive upper. - * @param inner the inner bound, inclusive, can be positive or negative - * @param outer the outer bound, exclusive, should be positive, should usually be greater than inner - * @return a random int that may be equal to inner and will otherwise be between inner and outer - */ - public int nextInt(final int inner, final int outer) { - return inner + nextInt(outer - inner); - } - - /** - * Exclusive on the outer bound; the inner bound is 0. The bound may be negative, which will produce a non-positive - * result. - * @param bound the outer exclusive bound; may be positive or negative - * @return a random long between 0 (inclusive) and bound (exclusive) - */ - public long nextLong(long bound) { - long rand = nextLong(); - final long randLow = rand & 0xFFFFFFFFL; - final long boundLow = bound & 0xFFFFFFFFL; - rand >>>= 32; - bound >>= 32; - final long z = (randLow * boundLow >> 32); - long t = rand * boundLow + z; - final long tLow = t & 0xFFFFFFFFL; - t >>>= 32; - return rand * bound + t + (tLow + randLow * bound >> 32) - (z >> 63) - (bound >> 63); - } - /** - * Inclusive inner, exclusive outer; both inner and outer can be positive or negative. - * @param inner the inner bound, inclusive, can be positive or negative - * @param outer the outer bound, exclusive, can be positive or negative and may be greater than or less than inner - * @return a random long that may be equal to inner and will otherwise be between inner and outer - */ - public long nextLong(final long inner, final long outer) { - return inner + nextLong(outer - inner); - } - - public double nextDouble() { - return (nextLong() & DOUBLE_MASK) * NORM_53; - } - - public float nextFloat() { - return (float) ((nextLong() & FLOAT_MASK) * NORM_24); - } - - public boolean nextBoolean() { - return nextLong() < 0L; - } - - public void nextBytes(final byte[] bytes) { - int i = bytes.length, n = 0; - while (i != 0) { - n = Math.min(i, 8); - for (long bits = nextLong(); n-- != 0; bits >>>= 8) { - bytes[--i] = (byte) bits; - } - } - } - - /** - * Sets the seed of this generator using one long, running that through LightRNG's algorithm twice to get the state. - * @param seed the number to use as the seed - */ - public void setSeed(final long seed) { - - long state = seed + 0x9E3779B97F4A7C15L, - z = state; - z = (z ^ (z >>> 30)) * 0xBF58476D1CE4E5B9L; - z = (z ^ (z >>> 27)) * 0x94D049BB133111EBL; - state0 = z ^ (z >>> 31); - state += 0x9E3779B97F4A7C15L; - z = state; - z = (z ^ (z >>> 30)) * 0xBF58476D1CE4E5B9L; - z = (z ^ (z >>> 27)) * 0x94D049BB133111EBL; - state1 = z ^ (z >>> 31); - } - - /** - * Sets the seed of this generator using two longs, using them without changes unless both are 0 (then it makes the - * state variable corresponding to stateA 1 instead). - * @param stateA the number to use as the first part of the state; this will be 1 instead if both seeds are 0 - * @param stateB the number to use as the second part of the state - */ - public void setSeed(final long stateA, final long stateB) { - - state0 = stateA; - state1 = stateB; - if((stateA | stateB) == 0L) - state0 = 1L; - } - -} diff --git a/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory b/tsvm_core/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory similarity index 100% rename from src/main/resources/META-INF/services/javax.script.ScriptEngineFactory rename to tsvm_core/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory diff --git a/src/net/torvald/tsvm/Base64Delegate.kt b/tsvm_core/src/net/torvald/tsvm/Base64Delegate.kt similarity index 100% rename from src/net/torvald/tsvm/Base64Delegate.kt rename to tsvm_core/src/net/torvald/tsvm/Base64Delegate.kt diff --git a/src/net/torvald/util/CircularArray.kt b/tsvm_core/src/net/torvald/tsvm/CircularArray.kt similarity index 97% rename from src/net/torvald/util/CircularArray.kt rename to tsvm_core/src/net/torvald/tsvm/CircularArray.kt index 6c6f0ad..a8bc746 100644 --- a/src/net/torvald/util/CircularArray.kt +++ b/tsvm_core/src/net/torvald/tsvm/CircularArray.kt @@ -1,4 +1,4 @@ -package net.torvald.util +package net.torvald.tsvm import java.util.* @@ -13,7 +13,7 @@ import java.util.* * * Created by minjaesong on 2017-01-22. */ -class CircularArray(val size: Int, val overwriteOnOverflow: Boolean): Iterable { +internal class CircularArray(val size: Int, val overwriteOnOverflow: Boolean): Iterable { /** * What to do RIGHT BEFORE old element is being overridden by the new element (only makes sense when ```overwriteOnOverflow = true```) diff --git a/src/net/torvald/tsvm/CompressorDelegate.kt b/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt similarity index 100% rename from src/net/torvald/tsvm/CompressorDelegate.kt rename to tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt diff --git a/src/net/torvald/tsvm/DMADelegate.kt b/tsvm_core/src/net/torvald/tsvm/DMADelegate.kt similarity index 100% rename from src/net/torvald/tsvm/DMADelegate.kt rename to tsvm_core/src/net/torvald/tsvm/DMADelegate.kt diff --git a/src/net/torvald/tsvm/FilesystemDelegate.kt b/tsvm_core/src/net/torvald/tsvm/FilesystemDelegate.kt similarity index 100% rename from src/net/torvald/tsvm/FilesystemDelegate.kt rename to tsvm_core/src/net/torvald/tsvm/FilesystemDelegate.kt diff --git a/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt b/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt similarity index 100% rename from src/net/torvald/tsvm/GraphicsJSR223Delegate.kt rename to tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt diff --git a/tsvm_core/src/net/torvald/tsvm/LoadShader.kt b/tsvm_core/src/net/torvald/tsvm/LoadShader.kt new file mode 100644 index 0000000..08d1183 --- /dev/null +++ b/tsvm_core/src/net/torvald/tsvm/LoadShader.kt @@ -0,0 +1,18 @@ +package net.torvald.tsvm + +import com.badlogic.gdx.graphics.glutils.ShaderProgram + +/** + * Created by minjaesong on 2021-12-03. + */ +internal object LoadShader { + operator fun invoke(vert: String, frag: String): ShaderProgram { + val s = ShaderProgram(vert, frag) + + if (s.log.toLowerCase().contains("error")) { + throw Error(String.format("Shader program loaded with %s, %s failed:\n%s", vert, frag, s.log)) + } + + return s + } +} \ No newline at end of file diff --git a/src/net/torvald/tsvm/SerialHelper.kt b/tsvm_core/src/net/torvald/tsvm/SerialHelper.kt similarity index 100% rename from src/net/torvald/tsvm/SerialHelper.kt rename to tsvm_core/src/net/torvald/tsvm/SerialHelper.kt diff --git a/src/net/torvald/terrarumsansbitmap/gdx/TextureRegionPack.kt b/tsvm_core/src/net/torvald/tsvm/TextureRegionPack.kt similarity index 98% rename from src/net/torvald/terrarumsansbitmap/gdx/TextureRegionPack.kt rename to tsvm_core/src/net/torvald/tsvm/TextureRegionPack.kt index 52a3e5a..e4a456a 100755 --- a/src/net/torvald/terrarumsansbitmap/gdx/TextureRegionPack.kt +++ b/tsvm_core/src/net/torvald/tsvm/TextureRegionPack.kt @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.torvald.terrarumsansbitmap.gdx +package net.torvald.tsvm import com.badlogic.gdx.files.FileHandle import com.badlogic.gdx.graphics.Texture diff --git a/src/net/torvald/tsvm/UnsafePtr.kt b/tsvm_core/src/net/torvald/tsvm/UnsafePtr.kt similarity index 100% rename from src/net/torvald/tsvm/UnsafePtr.kt rename to tsvm_core/src/net/torvald/tsvm/UnsafePtr.kt diff --git a/src/net/torvald/tsvm/VM.kt b/tsvm_core/src/net/torvald/tsvm/VM.kt similarity index 97% rename from src/net/torvald/tsvm/VM.kt rename to tsvm_core/src/net/torvald/tsvm/VM.kt index da6187c..3d03b3c 100644 --- a/src/net/torvald/tsvm/VM.kt +++ b/tsvm_core/src/net/torvald/tsvm/VM.kt @@ -34,7 +34,7 @@ class VM( val peripheralTable = Array(8) { PeripheralEntry() } - internal fun getIO(): IOSpace = peripheralTable[0].peripheral as IOSpace + fun getIO(): IOSpace = peripheralTable[0].peripheral as IOSpace //lateinit var printStream: OutputStream //lateinit var errorStream: OutputStream @@ -121,7 +121,7 @@ class VM( } } - internal fun poke(addr: Long, value: Byte) { + fun poke(addr: Long, value: Byte) { val (memspace, offset) = translateAddr(addr) if (memspace == null) throw ErrorIllegalAccess(this, addr) @@ -135,7 +135,7 @@ class VM( (memspace as PeriBase).poke(offset, value) } - internal fun peek(addr:Long): Byte? { + fun peek(addr:Long): Byte? { val (memspace, offset) = translateAddr(addr) return if (memspace == null) null diff --git a/src/net/torvald/tsvm/VMJSR223Delegate.kt b/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt similarity index 100% rename from src/net/torvald/tsvm/VMJSR223Delegate.kt rename to tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt diff --git a/src/net/torvald/tsvm/VMRunnerFactory.kt b/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt similarity index 96% rename from src/net/torvald/tsvm/VMRunnerFactory.kt rename to tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt index 1996ef8..2bb80de 100644 --- a/src/net/torvald/tsvm/VMRunnerFactory.kt +++ b/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt @@ -1,7 +1,5 @@ package net.torvald.tsvm -import net.torvald.tsvm.peripheral.GraphicsAdapter -import net.torvald.tsvm.vdc.Videotron2K import org.graalvm.polyglot.Context import org.graalvm.polyglot.HostAccess import java.io.FileReader @@ -27,7 +25,7 @@ object VMRunnerFactory { } return when (extension) { - "vt2" -> { + /*"vt2" -> { object : VMRunner(extension) { val engine = @@ -45,7 +43,7 @@ object VMRunnerFactory { TODO("Not yet implemented") } } - } + }*/ "js" -> { object : VMRunner(extension) { private val context = Context.newBuilder("js") diff --git a/src/net/torvald/tsvm/WorldInterface.kt b/tsvm_core/src/net/torvald/tsvm/WorldInterface.kt similarity index 100% rename from src/net/torvald/tsvm/WorldInterface.kt rename to tsvm_core/src/net/torvald/tsvm/WorldInterface.kt diff --git a/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt similarity index 96% rename from src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt index 3c95247..0cca5d5 100644 --- a/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt @@ -96,4 +96,6 @@ fun ByteArray.trimNull(): ByteArray { cnt -= 1 } return this.sliceArray(0..cnt) -} \ No newline at end of file +} + +fun ByteArray.startsWith(other: ByteArray) = this.sliceArray(other.indices).contentEquals(other) diff --git a/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt similarity index 100% rename from src/net/torvald/tsvm/peripheral/BlockTransferPort.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt diff --git a/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt similarity index 98% rename from src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt index 49683b9..131aafe 100644 --- a/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt @@ -4,7 +4,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUlong -import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack +import net.torvald.tsvm.TextureRegionPack import net.torvald.tsvm.VM class CharacterLCDdisplay(vm: VM) : GraphicsAdapter(vm, AdapterConfig( diff --git a/src/net/torvald/tsvm/peripheral/ExtDisp.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/ExtDisp.kt similarity index 96% rename from src/net/torvald/tsvm/peripheral/ExtDisp.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/ExtDisp.kt index c2893f5..a7e0325 100644 --- a/src/net/torvald/tsvm/peripheral/ExtDisp.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/ExtDisp.kt @@ -5,7 +5,7 @@ import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.math.Matrix4 -import net.torvald.tsvm.AppLoader +import net.torvald.tsvm.LoadShader import net.torvald.tsvm.VM /** @@ -28,7 +28,7 @@ class ExtDisp(val vm: VM, val width: Int, val height: Int) : PeriBase { internal val framebuffer = Pixmap(width, height, Pixmap.Format.Alpha) private val outFBObatch = SpriteBatch() - protected val drawShader = AppLoader.loadShaderInline(GraphicsAdapter.DRAW_SHADER_VERT, OLED_PAL_SHADER) + protected val drawShader = LoadShader(GraphicsAdapter.DRAW_SHADER_VERT, OLED_PAL_SHADER) init { // no orthographic camera, must be "raw" Matrix4 diff --git a/src/net/torvald/tsvm/peripheral/GlassTty.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/GlassTty.kt similarity index 100% rename from src/net/torvald/tsvm/peripheral/GlassTty.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/GlassTty.kt diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt similarity index 99% rename from src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index 0fe293a..574236a 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -11,7 +11,7 @@ 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 +import net.torvald.tsvm.LoadShader import net.torvald.tsvm.VM import net.torvald.tsvm.kB import net.torvald.tsvm.peripheral.GraphicsAdapter.Companion.DRAW_SHADER_FRAG @@ -79,8 +79,8 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super internal val textArea = UnsafeHelper.allocate(7682) internal val unusedArea = UnsafeHelper.allocate(1024) - protected val paletteShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, config.paletteShader) - protected val textShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, config.fragShader) + protected val paletteShader = LoadShader(DRAW_SHADER_VERT, config.paletteShader) + protected val textShader = LoadShader(DRAW_SHADER_VERT, config.fragShader) override var blinkCursor = true override var ttyRawMode = false diff --git a/src/net/torvald/tsvm/peripheral/IOSpace.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/IOSpace.kt similarity index 99% rename from src/net/torvald/tsvm/peripheral/IOSpace.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/IOSpace.kt index 6bc142c..53355a3 100644 --- a/src/net/torvald/tsvm/peripheral/IOSpace.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/IOSpace.kt @@ -4,9 +4,8 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.Input import com.badlogic.gdx.InputProcessor import net.torvald.UnsafeHelper +import net.torvald.tsvm.CircularArray import net.torvald.tsvm.VM -import net.torvald.util.CircularArray -import java.io.File import kotlin.experimental.and class IOSpace(val vm: VM) : PeriBase, InputProcessor { diff --git a/src/net/torvald/tsvm/peripheral/PeriBase.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/PeriBase.kt similarity index 100% rename from src/net/torvald/tsvm/peripheral/PeriBase.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/PeriBase.kt diff --git a/src/net/torvald/tsvm/peripheral/TTY.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TTY.kt similarity index 100% rename from src/net/torvald/tsvm/peripheral/TTY.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/TTY.kt diff --git a/src/net/torvald/tsvm/peripheral/TermSim.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TermSim.kt similarity index 100% rename from src/net/torvald/tsvm/peripheral/TermSim.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/TermSim.kt diff --git a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt similarity index 100% rename from src/net/torvald/tsvm/peripheral/TestDiskDrive.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt diff --git a/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt similarity index 100% rename from src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt diff --git a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt similarity index 100% rename from src/net/torvald/tsvm/peripheral/TexticsAdapter.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt diff --git a/src/net/torvald/tsvm/peripheral/VMProgramRom.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt similarity index 97% rename from src/net/torvald/tsvm/peripheral/VMProgramRom.kt rename to tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt index 0f05fd8..3e4d9b8 100644 --- a/src/net/torvald/tsvm/peripheral/VMProgramRom.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt @@ -3,7 +3,6 @@ package net.torvald.tsvm.peripheral import net.torvald.tsvm.CompressorDelegate import net.torvald.tsvm.CompressorDelegate.GZIP_HEADER import net.torvald.tsvm.VM -import net.torvald.tsvm.startsWith import java.io.File open class VMProgramRom(path: String) { diff --git a/src/net/torvald/tsvm/vdc/V2kParserTest.kt b/tsvm_core/src/net/torvald/tsvm/vdc/V2kParserTest.kt similarity index 100% rename from src/net/torvald/tsvm/vdc/V2kParserTest.kt rename to tsvm_core/src/net/torvald/tsvm/vdc/V2kParserTest.kt diff --git a/src/net/torvald/tsvm/vdc/V2kRunTest.kt b/tsvm_core/src/net/torvald/tsvm/vdc/V2kRunTest.kt similarity index 87% rename from src/net/torvald/tsvm/vdc/V2kRunTest.kt rename to tsvm_core/src/net/torvald/tsvm/vdc/V2kRunTest.kt index 572c101..5465f05 100644 --- a/src/net/torvald/tsvm/vdc/V2kRunTest.kt +++ b/tsvm_core/src/net/torvald/tsvm/vdc/V2kRunTest.kt @@ -39,11 +39,11 @@ class V2kRunTest : ApplicationAdapter() { ) batch = SpriteBatch() - camera = OrthographicCamera(AppLoader.WIDTH.toFloat(), AppLoader.WIDTH.toFloat()) + camera = OrthographicCamera(net.torvald.tsvm.AppLoader.WIDTH.toFloat(), net.torvald.tsvm.AppLoader.WIDTH.toFloat()) camera.setToOrtho(false) camera.update() batch.projectionMatrix = camera.combined - Gdx.gl20.glViewport(0, 0, AppLoader.WIDTH, AppLoader.HEIGHT) + Gdx.gl20.glViewport(0, 0, net.torvald.tsvm.AppLoader.WIDTH, net.torvald.tsvm.AppLoader.HEIGHT) vm.getPrintStream = { gpu.getPrintStream() } vm.getErrorStream = { gpu.getErrorStream() } @@ -64,7 +64,7 @@ class V2kRunTest : ApplicationAdapter() { private var updateRate = 1f / 60f override fun render() { - Gdx.graphics.setTitle("${AppLoader.appTitle} $EMDASH F: ${Gdx.graphics.framesPerSecond} $EMDASH VF: ${(1.0 / vdc.statsFrameTime).toInt()}") + Gdx.graphics.setTitle("${net.torvald.tsvm.AppLoader.appTitle} $EMDASH F: ${Gdx.graphics.framesPerSecond} $EMDASH VF: ${(1.0 / vdc.statsFrameTime).toInt()}") super.render() diff --git a/src/net/torvald/tsvm/vdc/Videotron2K.kt b/tsvm_core/src/net/torvald/tsvm/vdc/Videotron2K.kt similarity index 99% rename from src/net/torvald/tsvm/vdc/Videotron2K.kt rename to tsvm_core/src/net/torvald/tsvm/vdc/Videotron2K.kt index eb7b2d5..6bebd24 100644 --- a/src/net/torvald/tsvm/vdc/Videotron2K.kt +++ b/tsvm_core/src/net/torvald/tsvm/vdc/Videotron2K.kt @@ -1,7 +1,7 @@ package net.torvald.tsvm.vdc import net.torvald.UnsafeHelper -import net.torvald.random.HQRNG +import torvald.random.HQRNG import net.torvald.tsvm.peripheral.GraphicsAdapter import java.lang.NumberFormatException import java.util.* @@ -149,7 +149,7 @@ class Videotron2K(var gpu: GraphicsAdapter?) { private val infoPrint = true private val debugPrint = false - private val rng = HQRNG() + private val rng = torvald.random.HQRNG() fun eval(command: String) { val rootStatements = parseCommands(command) diff --git a/tsvm_core/tsvm_core.iml b/tsvm_core/tsvm_core.iml new file mode 100644 index 0000000..01c580f --- /dev/null +++ b/tsvm_core/tsvm_core.iml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tsvm_dummymodule.iml b/tsvm_dummymodule.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/tsvm_dummymodule.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tsvm_executable.iml b/tsvm_executable.iml new file mode 100644 index 0000000..9a4360f --- /dev/null +++ b/tsvm_executable.iml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt b/tsvm_executable/src/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt similarity index 100% rename from src/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt rename to tsvm_executable/src/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt diff --git a/src/net/torvald/tsvm/AppLoader.java b/tsvm_executable/src/net/torvald/tsvm/AppLoader.java similarity index 74% rename from src/net/torvald/tsvm/AppLoader.java rename to tsvm_executable/src/net/torvald/tsvm/AppLoader.java index bd48378..c2aa3c8 100644 --- a/src/net/torvald/tsvm/AppLoader.java +++ b/tsvm_executable/src/net/torvald/tsvm/AppLoader.java @@ -34,18 +34,13 @@ public class AppLoader { // VM vm = new VM(64 << 10, new TheRealWorld(), new VMProgramRom[]{TandemBios.INSTANCE, BasicRom.INSTANCE}); // VM vm = new VM(128 << 10, new TheRealWorld(), new VMProgramRom[]{BasicBios.INSTANCE, WPBios.INSTANCE}); VM vm = new VM(2048 << 10, new TheRealWorld(), new VMProgramRom[]{TsvmBios.INSTANCE}); - VM pipvm = new VM(4096, new TheRealWorld(), new VMProgramRom[]{PipBios.INSTANCE, PipROM.INSTANCE}); - // uncomment to target the TerranBASIC runner -// VM vm = new VM(64 << 10, new TheRealWorld(), new VMProgramRom[]{TBASRelBios.INSTANCE}); - EmulInstance reference = new EmulInstance(vm, "net.torvald.tsvm.peripheral.ReferenceGraphicsAdapter", "assets/disk0", 560, 448); EmulInstance reference2 = new EmulInstance(vm, "net.torvald.tsvm.peripheral.ReferenceLikeLCD", "assets/disk0", 560, 448); EmulInstance term = new EmulInstance(vm, "net.torvald.tsvm.peripheral.Term", "assets/disk0", 720, 480); EmulInstance portable = new EmulInstance(vm, "net.torvald.tsvm.peripheral.CharacterLCDdisplay", "assets/disk0", 628, 302); EmulInstance wp = new EmulInstance(vm, "net.torvald.tsvm.peripheral.WpTerm", "assets/wpdisk", 810, 360); - EmulInstance pip = new EmulInstance(pipvm, null, "assets/disk0", 640, 480, CollectionsKt.listOf(new Pair(1, new PeripheralEntry2( 32768L, 1, @@ -56,24 +51,4 @@ public class AppLoader { new Lwjgl3Application(new VMGUI(pip, WIDTH, HEIGHT), appConfig); } - - public static ShaderProgram loadShaderFromFile(String vert, String frag) { - ShaderProgram s = new ShaderProgram(Gdx.files.internal(vert), Gdx.files.internal(frag)); - - if (s.getLog().toLowerCase().contains("error")) { - throw new Error(String.format("Shader program loaded with %s, %s failed:\n%s", vert, frag, s.getLog())); - } - - return s; - } - - public static ShaderProgram loadShaderInline(String vert, String frag) { - ShaderProgram s = new ShaderProgram(vert, frag); - - if (s.getLog().toLowerCase().contains("error")) { - throw new Error(String.format("Shader program loaded with %s, %s failed:\n%s", vert, frag, s.getLog())); - } - - return s; - } } diff --git a/src/net/torvald/tsvm/Memvwr.kt b/tsvm_executable/src/net/torvald/tsvm/Memvwr.kt similarity index 100% rename from src/net/torvald/tsvm/Memvwr.kt rename to tsvm_executable/src/net/torvald/tsvm/Memvwr.kt diff --git a/src/net/torvald/tsvm/VMGUI.kt b/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt similarity index 96% rename from src/net/torvald/tsvm/VMGUI.kt rename to tsvm_executable/src/net/torvald/tsvm/VMGUI.kt index ea680fd..b187f36 100644 --- a/src/net/torvald/tsvm/VMGUI.kt +++ b/tsvm_executable/src/net/torvald/tsvm/VMGUI.kt @@ -6,12 +6,9 @@ import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.g2d.SpriteBatch import kotlinx.coroutines.* import net.torvald.terrarum.modulecomputers.tsvmperipheral.WorldRadar -import net.torvald.tsvm.CompressorDelegate.GZIP_HEADER import net.torvald.tsvm.peripheral.* import java.io.File -fun ByteArray.startsWith(other: ByteArray) = this.sliceArray(other.indices).contentEquals(other) - class EmulInstance( val vm: VM, val display: String?, @@ -97,7 +94,13 @@ class VMGUI(val loaderInfo: EmulInstance, val viewportWidth: Int, val viewportHe vm.getInputStream = { System.`in` } } - vm.getIO().blockTransferPorts[1].attachDevice(WorldRadar(Gdx.files.internal("test_assets/test_terrain.png"))) + vm.getIO().blockTransferPorts[1].attachDevice( + WorldRadar( + Gdx.files.internal( + "test_assets/test_terrain.png" + ) + ) + ) loaderInfo.extraPeripherals.forEach { (port, peri) -> val typeargs = peri.args.map { it.javaClass }.toTypedArray()