diff --git a/assets/disk0/home/fsh.js b/assets/disk0/home/fsh.js index 5acc322..46a167b 100644 --- a/assets/disk0/home/fsh.js +++ b/assets/disk0/home/fsh.js @@ -21,7 +21,7 @@ _fsh.brandLogoTexSmall = new GL.Texture(24, 14, gzip.decomp(base64.atob( _fsh.scrlayout = ["com.fsh.clock","com.fsh.calendar","com.fsh.todo_list", "com.fsh.quick_access"]; _fsh.drawWallpaper = function() { - let wp = files.open("A:/tvdos/wall.bytes") + let wp = files.open("A:/home/wall.bytes") // filesystem.open("A", "/tvdos/wall.bytes", "R") let b = sys.malloc(250880) // dma.comToRam(0, 0, b, 250880) diff --git a/assets/disk0/tvdos/TVDOS.SYS b/assets/disk0/tvdos/TVDOS.SYS index 960120e..bf223f4 100644 --- a/assets/disk0/tvdos/TVDOS.SYS +++ b/assets/disk0/tvdos/TVDOS.SYS @@ -1062,8 +1062,17 @@ Object.freeze(unicode); /////////////////////////////////////////////////////////////////////////////// // install other stuffs -let glfile = files.open("A:/tvdos/gl.js") -const GL = eval(glfile.sread()) +var require = (absdir) => { + let moduleFile = files.open(absdir) + if (!moduleFile.exists) throw Error("No such file: " + absdir) + let moduleScript = moduleFile.sread() + return eval(`let exports = {}; ${moduleScript}; Object.freeze(exports)`) +} + + +var GL = require("A:/tvdos/include/gl.js") + + let checkTerm = `if (sys.peek(-49)&1) throw new InterruptedException();` let injectIntChk = (s, n) => { @@ -1091,6 +1100,8 @@ var execApp = (cmdsrc, args, appname) => { execAppPrg(args); } + + /////////////////////////////////////////////////////////////////////////////// // Boot script diff --git a/assets/disk0/tvdos/bin/command.js b/assets/disk0/tvdos/bin/command.js index 47b3ca3..bf54a55 100644 --- a/assets/disk0/tvdos/bin/command.js +++ b/assets/disk0/tvdos/bin/command.js @@ -594,6 +594,19 @@ shell.stdio = { } } Object.freeze(shell.stdio) +// install an improved version of require that takes care of relative path +shell.require = require +require = function(path) { + // absolute path? + if (path[1] == ":") return shell.require(path) + else { + // if the path starts with ".", look for the current directory + // if the path starts with [A-Za-z0-9], look for the DOSDIR/includes + if (path[0] == '.') return shell.require(shell.resolvePathInput(path).full + ".js") + else return shell.require(`A:${_TVDOS.variables.DOSDIR}/include/${path}.js`) + } +} + shell.execute = function(line) { if (0 == line.size) return let parsedTokens = shell.parse(line) // echo, "hai", |, less diff --git a/assets/disk0/tvdos/bin/playmov.js b/assets/disk0/tvdos/bin/playmov.js index a38c51c..b99db81 100644 --- a/assets/disk0/tvdos/bin/playmov.js +++ b/assets/disk0/tvdos/bin/playmov.js @@ -188,6 +188,15 @@ while (readCount < FILE_LENGTH) { if (65535 == packetType) { frameUnit -= 1 } + // background colour packets + else if (65279 == packetType) { + let rgbx = readInt() + graphics.setBackground( + (rgbx & 0xFF000000) >>> 24, + (rgbx & 0x00FF0000) >>> 16, + (rgbx & 0x0000FF00) >>> 8 + ) + } // video packets else if (packetType < 2047) { // iPF diff --git a/assets/disk0/tvdos/include/example.js b/assets/disk0/tvdos/include/example.js new file mode 100644 index 0000000..e9d681d --- /dev/null +++ b/assets/disk0/tvdos/include/example.js @@ -0,0 +1,10 @@ +exports.greet = function() { println("Hello, module!") } + +/* + +Try in your user program: + +let m = require("A:/tvdos/include/example.js") +m.greet() + +*/ \ No newline at end of file diff --git a/assets/disk0/tvdos/gl.js b/assets/disk0/tvdos/include/gl.js similarity index 73% rename from assets/disk0/tvdos/gl.js rename to assets/disk0/tvdos/include/gl.js index 9bcc880..2498c8d 100644 --- a/assets/disk0/tvdos/gl.js +++ b/assets/disk0/tvdos/include/gl.js @@ -4,10 +4,9 @@ TVDOS Graphics Library Has no affiliation with OpenGL by Khronos Group */ -const GL = {}; // bytes should be able to handle both JSArray and Java ByteArray (toString = "[B")? -GL.Texture = function(w, h, bytes) { +exports.Texture = function(w, h, bytes) { this.width = w; this.height = h; this.texData = bytes; @@ -16,7 +15,7 @@ GL.Texture = function(w, h, bytes) { throw "Texture data is not an instance of array"; } }; -GL.MonoTex = function(w, h, bits) { +exports.MonoTex = function(w, h, bits) { this.width = w; this.height = h; this.texData = bits; @@ -25,16 +24,16 @@ GL.MonoTex = function(w, h, bits) { throw "Texture data is not an instance of array"; } }; -GL.SpriteSheet = function(tilew, tileh, tex) { +exports.SpriteSheet = function(tilew, tileh, tex) { this.tileWidth = tilew; this.tileHeight = tileh; this.texture = tex; - if (!tex instanceof GL.Texture) { - throw "Texture is not an instance of GL.Texture"; + if (!tex instanceof exports.Texture) { + throw "Texture is not an instance of exports.Texture"; } - this.getOffX = function(x) { // THIS, or: GL.SpriteSheet.prototype.getOffX + this.getOffX = function(x) { // THIS, or: exports.SpriteSheet.prototype.getOffX let tx = this.tileWidth * (x|0); if (tx + this.tileWidth > this.texture.width) throw "Sprite x-offset of "+tx+" is greater than sprite width "+this.texture.width; return tx; @@ -46,19 +45,19 @@ GL.SpriteSheet = function(tilew, tileh, tex) { return ty; }; }; -GL.drawTexPattern = function(texture, x, y, width, height, framebuffer, fgcol, bgcol) { - if (!(texture instanceof GL.Texture) && !(texture instanceof GL.MonoTex)) throw Error("Texture is not a GL Texture types"); +exports.drawTexPattern = function(texture, x, y, width, height, framebuffer, fgcol, bgcol) { + if (!(texture instanceof exports.Texture) && !(texture instanceof exports.MonoTex)) throw Error("Texture is not a GL Texture types"); let paint = (!framebuffer) ? graphics.plotPixel : graphics.plotPixel2 for (let yy = 0; yy < height; yy++) { for (let xx = 0; xx < width;) { let tx = xx % texture.width; let ty = yy % texture.height; - if (texture instanceof GL.Texture) { + if (texture instanceof exports.Texture) { let c = texture.texData[ty * texture.width + tx]; paint(x + xx, y + yy, c); } - else if (texture instanceof GL.MonoTex) { + else if (texture instanceof exports.MonoTex) { let octet = texture.texData[ty * (texture.width >> 3) + (tx >> 3)]; for (let i = 0; i < 8; i++) { let bit = ((octet >>> (7 - i)) & 1 != 0) @@ -66,25 +65,25 @@ GL.drawTexPattern = function(texture, x, y, width, height, framebuffer, fgcol, b } } - xx += (texture instanceof GL.MonoTex) ? 8 : 1; + xx += (texture instanceof exports.MonoTex) ? 8 : 1; } } }; -GL.drawTexPatternOver = function(texture, x, y, width, height, framebuffer, fgcol) { - if (!(texture instanceof GL.Texture) && !(texture instanceof GL.MonoTex)) throw Error("Texture is not a GL Texture types"); +exports.drawTexPatternOver = function(texture, x, y, width, height, framebuffer, fgcol) { + if (!(texture instanceof exports.Texture) && !(texture instanceof exports.MonoTex)) throw Error("Texture is not a GL Texture types"); let paint = (!framebuffer) ? graphics.plotPixel : graphics.plotPixel2 for (let yy = 0; yy < height; yy++) { for (let xx = 0; xx < width;) { let tx = xx % texture.width; let ty = yy % texture.height; - if (texture instanceof GL.Texture) { + if (texture instanceof exports.Texture) { let c = texture.texData[ty * texture.width + tx]; if ((c & 255) != 255) { paint(x + xx, y + yy, c); } } - else if (texture instanceof GL.MonoTex) { + else if (texture instanceof exports.MonoTex) { let octet = texture.texData[ty * (texture.width >> 3) + (tx >> 3)]; for (let i = 0; i < 8; i++) { let bit = ((octet >>> (7 - i)) & 1 != 0) @@ -92,21 +91,21 @@ GL.drawTexPatternOver = function(texture, x, y, width, height, framebuffer, fgco } } - xx += (texture instanceof GL.MonoTex) ? 8 : 1; + xx += (texture instanceof exports.MonoTex) ? 8 : 1; } } }; /* * Draws a texture verbatim - color of 255 will be written to the screen buffer */ -GL.drawTexImage = function(texture, x, y, framebuffer, fgcol, bgcol) { - GL.drawTexPattern(texture, x, y, texture.width, texture.height, framebuffer, fgcol, bgcol); +exports.drawTexImage = function(texture, x, y, framebuffer, fgcol, bgcol) { + exports.drawTexPattern(texture, x, y, texture.width, texture.height, framebuffer, fgcol, bgcol); }; /* * Draws texture with blitting - color of 255 will pass-thru what's already on the screen buffer */ -GL.drawTexImageOver = function(texture, x, y, framebuffer, fgcol) { - GL.drawTexPatternOver(texture, x, y, texture.width, texture.height, framebuffer, fgcol); +exports.drawTexImageOver = function(texture, x, y, framebuffer, fgcol) { + exports.drawTexPatternOver(texture, x, y, texture.width, texture.height, framebuffer, fgcol); }; /* * @param xi x-index in the spritesheet, ZERO-BASED INDEX @@ -116,7 +115,7 @@ GL.drawTexImageOver = function(texture, x, y, framebuffer, fgcol) { * @param overrideFG if the value is set and the current pixel of the sheet is not 255, plots this colour instead * @param overrideBG if the value is set and the current pixel of the sheet is 255, plots this colour instead */ -GL.drawSprite = function(sheet, xi, yi, x, y, framebuffer, overrideFG, overrideBG) { +exports.drawSprite = function(sheet, xi, yi, x, y, framebuffer, overrideFG, overrideBG) { let paint = (!framebuffer) ? graphics.plotPixel : graphics.plotPixel2 let offx = sheet.getOffX(xi); let offy = sheet.getOffY(yi); @@ -137,7 +136,7 @@ GL.drawSprite = function(sheet, xi, yi, x, y, framebuffer, overrideFG, overrideB * @param y y-position on the framebuffer where the sprite will be drawn * @param overrideFG if the value is set and the current pixel of the sheet is not 255, plots this colour instead */ -GL.drawSpriteOver = function(sheet, xi, yi, x, y, framebuffer, overrideFG) { +exports.drawSpriteOver = function(sheet, xi, yi, x, y, framebuffer, overrideFG) { let paint = (!framebuffer) ? graphics.plotPixel : graphics.plotPixel2 let offx = sheet.getOffX(xi); let offy = sheet.getOffY(yi); @@ -150,5 +149,3 @@ GL.drawSpriteOver = function(sheet, xi, yi, x, y, framebuffer, overrideFG) { } } }; - -Object.freeze(GL); // this returns frozen 'GL' diff --git a/terranmon.txt b/terranmon.txt index 47b92b0..fe17f1e 100644 --- a/terranmon.txt +++ b/terranmon.txt @@ -400,6 +400,7 @@ METADATA - 3,16: ADPCM Stereo 255,255: sync packet (wait until the next frame) + 254,255: background colour packet Packet Type High Byte (iPF Type Numbers) 0..7: iPF Type 1..8 @@ -438,6 +439,12 @@ GLOBAL TYPE 255 Packet - Sync Packet (subset of GLOBAL TYPE 255 Packet) - uint16 0xFFFF (type of packet for Global Type 255) +Background Colour Packet - + uint16 0xFEFF + uint8 Red (0-255) + uint8 Green (0-255) + uint8 Blue (0x255) + uint8 0x00 (pad byte) Frame Timing