script modules and 'require()'

This commit is contained in:
minjaesong
2023-01-08 05:07:25 +09:00
parent 3a879edd54
commit ca39263131
7 changed files with 75 additions and 28 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()
*/

View File

@@ -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'

View File

@@ -400,6 +400,7 @@ METADATA -
3,16: ADPCM Stereo
<special>
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