mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 19:51:51 +09:00
graphics: fixed pixels not plotting on non crt_color
This commit is contained in:
@@ -1,37 +1,26 @@
|
|||||||
con.curs_set(0)
|
con.curs_set(0)
|
||||||
con.clear()
|
con.clear()
|
||||||
let t=`${system.maxmem()>>>10} Kbytes System`
|
let t=`${system.maxmem()>>>10} Kbytes System`
|
||||||
// 0b_HL where H is top pixel
|
let imageBits = gzip.decomp(base64.atob(
|
||||||
// H-bits
|
"H4sICC62h2ACA3RhbmRlbV9sb2dvXzI0MC5iaW4AhdQ/bsMgGAXwh4hEhyisHSq5R+iYISpX6REydqhkjsZRfASPDJbJ449jQuxUspDsn2XD+z6wAMSIPjiECQOgAwcoIMwQNuoAQ+2TilZlrehbdeioJqspypeTqgfttrXLqhvVljO9qypq/IPqrLLRblcZQQi8oyqqClZwiI+6cdHPVYcdlUnHVmdc5aooypVV+iaS+lYnXMUr9dQjkk6LMsEt/YkRcKL8WlQPj+BO+NtW/vFZpc06Ununcan1S9r3rHL+X+3HgwpkHaim1bPglVSFqFzTpsZeWzWncUZRd+DLTg+HOskL8Jv1+ErtiZk7PaKu4I6W6n8jph+1S+pRd85dOX/Wq6h9UmOjTqg71kAsykD2dI4qnZ5R75RVexbirmWXGSuTTlGF0wH1Dt1R02pg81BtfTIYp5L6qFh0OVWe1NUnUtIb4Dr/QbAEAAA="
|
||||||
let imgh = [
|
))
|
||||||
[252,0,3,0,0],
|
for (let y = 0; y < 40; y++) {
|
||||||
[48,0,3,0,0],
|
for (let x = 0; x < 30; x++) {
|
||||||
[51,239,191,102,255],
|
let octet = imageBits[y * 30 + x]
|
||||||
[51,237,191,66,219],
|
for (let i = 0; i < 8; i++) {
|
||||||
[52,45,161,126,219],
|
graphics.plotPixel(8*x + i, y+8, ((octet >>> (7 - i)) & 1 != 0) ? 255 : 239)
|
||||||
[54,109,179,124,219]];
|
}
|
||||||
// L-bits
|
}
|
||||||
let imgl = [
|
}
|
||||||
[252,0,3,0,0],
|
|
||||||
[51,207,31,60,254],
|
|
||||||
[48,109,191,66,219],
|
|
||||||
[54,109,179,102,219],
|
|
||||||
[52,45,161,96,219],
|
|
||||||
[51,237,159,60,219]];
|
|
||||||
let imgc = [32,220,223,219]
|
|
||||||
for (let y=0;y<imgh.length;y++) {
|
|
||||||
for (let x=0;x<imgh[0].length;x++) {
|
|
||||||
for (let b=7;b>=0;b--) {
|
|
||||||
con.mvaddch(y+1,1+x*8+7-b,imgc[(imgh[y][x]>>b&1)<<1|imgl[y][x]>>b&1])
|
|
||||||
}}}
|
|
||||||
con.move(8,1+(40-t.length>>1))
|
con.move(8,1+(40-t.length>>1))
|
||||||
print(t)
|
print(t)
|
||||||
// wait arbitrary time
|
// wait arbitrary time
|
||||||
for (let b=0;b<333333;b++) {
|
for (let b=0;b<system.maxmem()*10;b++) {
|
||||||
sys.poke(0,(Math.random()*255)|0)
|
sys.poke(0,(Math.random()*255)|0)
|
||||||
sys.poke(0,0)
|
sys.poke(0,0)
|
||||||
}
|
}
|
||||||
con.clear();
|
con.clear()
|
||||||
|
graphics.clearPixels(255)
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
44
assets/bw_r8_to_bits.c
Normal file
44
assets/bw_r8_to_bits.c
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
char word_to_byte(char * inbuf) {
|
||||||
|
return
|
||||||
|
((*(inbuf + 0) & 1) << 7) |
|
||||||
|
((*(inbuf + 1) & 1) << 6) |
|
||||||
|
((*(inbuf + 2) & 1) << 5) |
|
||||||
|
((*(inbuf + 3) & 1) << 4) |
|
||||||
|
((*(inbuf + 4) & 1) << 3) |
|
||||||
|
((*(inbuf + 5) & 1) << 2) |
|
||||||
|
((*(inbuf + 6) & 1) << 1) |
|
||||||
|
((*(inbuf + 7) & 1) << 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char const *argv[]) {
|
||||||
|
FILE * infile;
|
||||||
|
FILE * outfile;
|
||||||
|
char word[8];
|
||||||
|
|
||||||
|
infile = fopen(argv[1], "r");
|
||||||
|
outfile = fopen(argv[2], "w");
|
||||||
|
|
||||||
|
int exit = -1;
|
||||||
|
while (exit < 0) {
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
int b = fgetc(infile);
|
||||||
|
if (b == -1 && exit < 0) exit = i;
|
||||||
|
word[i] = (char) b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exit == 0) break; // if the first byte is EOF, do not write out
|
||||||
|
|
||||||
|
fputc(word_to_byte(word), outfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
fflush(outfile);
|
||||||
|
fclose(infile);
|
||||||
|
fclose(outfile);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,19 +1,15 @@
|
|||||||
var imageBits = gzip.decomp(base64.atob(
|
con.curs_set(0)
|
||||||
"H4sICPx7h2ACA3RhbmRlbV9sb2dvXzI0MC5iaW4A7dQ/boMwFAbwz3Ikd4jitUMleoSOGaL6Kj1Cxg6V8NF8FI7AyIBwPv8hOA6kW6Y8IST4WWC/92zvX/GMsABEj9Y7+BEdoD1vUICfIKJ2MNQ2qqhVlop2XU1Sk5WDoyqHZtFmXZukulJtOdOrqqxmuFGdVFbabCpT4D2fqIqqvBW8hVdNP+vnot2Gyqh9rRPOclFk5coKfRNRh1pHnMUjHah7RB1nZQbX9CekgBPl14IOGODdAX/ryj/eq7RJe2rrNE6lfkn7nlRO/6v9uFGBpB3V1HoUvKIqH5RrWtXQa4umbByR1e042OluV2byBPwm3T9Se2DOne5RVnBDc/W/EbIftIk6oOycq3L+rFdWe6fGBh1RdqyBmJUJ2dIpqHR6QrlTFm1ZiKvmXWasjDoGFU57lDt0Q02tns1DteXJYJyKOgTFrPOpcqeuPJGSvuIpcQH1GZbNgAcAAA=="
|
con.clear()
|
||||||
));
|
let t=`${system.maxmem()>>>10} Kbytes System`
|
||||||
for (let y = 0; y < 64; y++) {
|
let imageBits = gzip.decomp(base64.atob(
|
||||||
|
"H4sICC62h2ACA3RhbmRlbV9sb2dvXzI0MC5iaW4AhdQ/bsMgGAXwh4hEhyisHSq5R+iYISpX6REydqhkjsZRfASPDJbJ449jQuxUspDsn2XD+z6wAMSIPjiECQOgAwcoIMwQNuoAQ+2TilZlrehbdeioJqspypeTqgfttrXLqhvVljO9qypq/IPqrLLRblcZQQi8oyqqClZwiI+6cdHPVYcdlUnHVmdc5aooypVV+iaS+lYnXMUr9dQjkk6LMsEt/YkRcKL8WlQPj+BO+NtW/vFZpc06Ununcan1S9r3rHL+X+3HgwpkHaim1bPglVSFqFzTpsZeWzWncUZRd+DLTg+HOskL8Jv1+ErtiZk7PaKu4I6W6n8jph+1S+pRd85dOX/Wq6h9UmOjTqg71kAsykD2dI4qnZ5R75RVexbirmWXGSuTTlGF0wH1Dt1R02pg81BtfTIYp5L6qFh0OVWe1NUnUtIb4Dr/QbAEAAA="
|
||||||
|
))
|
||||||
|
for (let y = 0; y < 40; y++) {
|
||||||
for (let x = 0; x < 30; x++) {
|
for (let x = 0; x < 30; x++) {
|
||||||
let word = imageBits[y * 30 + x];
|
let octet = imageBits[y * 30 + x]
|
||||||
for (let i = 0; i < 8; i++) {
|
for (let i = 0; i < 8; i++) {
|
||||||
graphics.plotPixel(8*x + i, y, ((word >>> (7 - i)) & 1 != 0) ? 255 : 239);
|
graphics.plotPixel(8*x + i, y+8, ((octet >>> (7 - i)) & 1 != 0) ? 255 : 239)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
con.move(8,1)
|
||||||
// wait arbitrary time
|
|
||||||
for (let b=0;b<333333;b++) {
|
|
||||||
sys.poke(0,(Math.random()*255)|0);
|
|
||||||
sys.poke(0,0);
|
|
||||||
}
|
|
||||||
con.clear();
|
|
||||||
graphics.clearPixels(255);
|
|
||||||
BIN
assets/tandem_logo_240.bin.gz
LFS
Normal file
BIN
assets/tandem_logo_240.bin.gz
LFS
Normal file
Binary file not shown.
1
assets/tandem_logo_240.bin.gz.txt
Normal file
1
assets/tandem_logo_240.bin.gz.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
H4sICC62h2ACA3RhbmRlbV9sb2dvXzI0MC5iaW4AhdQ/bsMgGAXwh4hEhyisHSq5R+iYISpX6REydqhkjsZRfASPDJbJ449jQuxUspDsn2XD+z6wAMSIPjiECQOgAwcoIMwQNuoAQ+2TilZlrehbdeioJqspypeTqgfttrXLqhvVljO9qypq/IPqrLLRblcZQQi8oyqqClZwiI+6cdHPVYcdlUnHVmdc5aooypVV+iaS+lYnXMUr9dQjkk6LMsEt/YkRcKL8WlQPj+BO+NtW/vFZpc06Ununcan1S9r3rHL+X+3HgwpkHaim1bPglVSFqFzTpsZeWzWncUZRd+DLTg+HOskL8Jv1+ErtiZk7PaKu4I6W6n8jph+1S+pRd85dOX/Wq6h9UmOjTqg71kAsykD2dI4qnZ5R75RVexbirmWXGSuTTlGF0wH1Dt1R02pg81BtfTIYp5L6qFh0OVWe1NUnUtIb4Dr/QbAEAAA=
|
||||||
BIN
assets/tandem_logo_240.kra
LFS
Normal file
BIN
assets/tandem_logo_240.kra
LFS
Normal file
Binary file not shown.
BIN
assets/tandem_logo_240.r8
Normal file
BIN
assets/tandem_logo_240.r8
Normal file
Binary file not shown.
@@ -38,7 +38,7 @@ public class AppLoader {
|
|||||||
EmulInstance term = new EmulInstance(appConfig, vm, "net.torvald.tsvm.peripheral.TexticsAdapter", "assets/disk0");
|
EmulInstance term = new EmulInstance(appConfig, vm, "net.torvald.tsvm.peripheral.TexticsAdapter", "assets/disk0");
|
||||||
EmulInstance portable = new EmulInstance(appConfig, vm, "net.torvald.tsvm.peripheral.CharacterLCDdisplay", "assets/disk0");
|
EmulInstance portable = new EmulInstance(appConfig, vm, "net.torvald.tsvm.peripheral.CharacterLCDdisplay", "assets/disk0");
|
||||||
|
|
||||||
new LwjglApplication(new VMGUI(reference), appConfig);
|
new LwjglApplication(new VMGUI(portable), appConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ShaderProgram loadShaderFromFile(String vert, String frag) {
|
public static ShaderProgram loadShaderFromFile(String vert, String frag) {
|
||||||
|
|||||||
@@ -28,15 +28,11 @@ class GraphicsJSR223Delegate(val vm: VM) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun loadBulk(fromAddr: Int, toAddr: Int, length: Int) {
|
fun loadBulk(fromAddr: Int, toAddr: Int, length: Int) {
|
||||||
getFirstGPU()?.let {
|
getFirstGPU()?._loadbulk(fromAddr, toAddr, length)
|
||||||
it._loadbulk(fromAddr, toAddr, length)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun storeBulk(fromAddr: Int, toAddr: Int, length: Int) {
|
fun storeBulk(fromAddr: Int, toAddr: Int, length: Int) {
|
||||||
getFirstGPU()?.let {
|
getFirstGPU()?._storebulk(fromAddr, toAddr, length)
|
||||||
it._storebulk(fromAddr, toAddr, length)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun plotPixel(x: Int, y: Int, color: Int) {
|
fun plotPixel(x: Int, y: Int, color: Int) {
|
||||||
@@ -74,9 +70,7 @@ class GraphicsJSR223Delegate(val vm: VM) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun clearText() {
|
fun clearText() {
|
||||||
getFirstGPU()?.let {
|
getFirstGPU()?.eraseInDisp(2)
|
||||||
it.eraseInDisp(2)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clearPixels(col: Int) {
|
fun clearPixels(col: Int) {
|
||||||
|
|||||||
@@ -620,8 +620,8 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super
|
|||||||
// feed palette data
|
// feed palette data
|
||||||
// must be done every time the shader is "actually loaded"
|
// must be done every time the shader is "actually loaded"
|
||||||
// try this: if above line precedes 'batch.shader = paletteShader', it won't work
|
// try this: if above line precedes 'batch.shader = paletteShader', it won't work
|
||||||
outFBObatch.shader.setUniform4fv("pal", paletteOfFloats, 0, paletteOfFloats.size)
|
paletteShader.setUniform4fv("pal", paletteOfFloats, 0, paletteOfFloats.size)
|
||||||
if (theme.startsWith("pmlcd")) outFBObatch.shader.setUniformf("lcdBaseCol", LCD_BASE_COL)
|
paletteShader.setUniformf("lcdBaseCol", LCD_BASE_COL)
|
||||||
|
|
||||||
// draw framebuffer
|
// draw framebuffer
|
||||||
outFBObatch.draw(rendertex, 0f, 0f)
|
outFBObatch.draw(rendertex, 0f, 0f)
|
||||||
@@ -648,11 +648,6 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super
|
|||||||
if (drawCursor) ttyFore else spriteAndTextArea[memTextForeOffset + addr].toInt()
|
if (drawCursor) ttyFore else spriteAndTextArea[memTextForeOffset + addr].toInt()
|
||||||
.and(255)
|
.and(255)
|
||||||
|
|
||||||
if (!theme.contains("color")) {
|
|
||||||
if (back == 255) back = 0
|
|
||||||
if (fore == 255) fore = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
textPixmap.setColor(Color(0f, 0f, char / 255f, 1f))
|
textPixmap.setColor(Color(0f, 0f, char / 255f, 1f))
|
||||||
textPixmap.drawPixel(x, y)
|
textPixmap.drawPixel(x, y)
|
||||||
textBackPixmap.setColor(
|
textBackPixmap.setColor(
|
||||||
@@ -700,7 +695,7 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig, val sgr: Super
|
|||||||
textShader.setUniformf("screenDimension", WIDTH.toFloat(), HEIGHT.toFloat())
|
textShader.setUniformf("screenDimension", WIDTH.toFloat(), HEIGHT.toFloat())
|
||||||
textShader.setUniformf("tilesInAtlas", 16f, 16f)
|
textShader.setUniformf("tilesInAtlas", 16f, 16f)
|
||||||
textShader.setUniformf("atlasTexSize", chrrom0.width.toFloat(), chrrom0.height.toFloat())
|
textShader.setUniformf("atlasTexSize", chrrom0.width.toFloat(), chrrom0.height.toFloat())
|
||||||
if (theme.startsWith("pmlcd")) outFBObatch.shader.setUniformf("lcdBaseCol", LCD_BASE_COL)
|
textShader.setUniformf("lcdBaseCol", LCD_BASE_COL)
|
||||||
|
|
||||||
outFBObatch.draw(faketex, 0f, 0f, WIDTH.toFloat(), HEIGHT.toFloat())
|
outFBObatch.draw(faketex, 0f, 0f, WIDTH.toFloat(), HEIGHT.toFloat())
|
||||||
|
|
||||||
@@ -830,7 +825,7 @@ uniform vec4 lcdBaseCol;
|
|||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
vec4 palCol = pal[int(texture2D(u_texture, v_texCoords).a * 255.0)];
|
vec4 palCol = pal[int(texture2D(u_texture, v_texCoords).a * 255.0)];
|
||||||
float lum = floor((3.0 * palCol.r + 4.0 * palCol.g + palCol.b) / 8.0 * intensitySteps) / intensitySteps;
|
float lum = ceil((3.0 * palCol.r + 4.0 * palCol.g + palCol.b) / 8.0 * intensitySteps) / intensitySteps;
|
||||||
vec4 outIntensity = vec4(vec3(1.0 - lum), palCol.a);
|
vec4 outIntensity = vec4(vec3(1.0 - lum), palCol.a);
|
||||||
|
|
||||||
// LCD output will invert the luminosity. That is, normally white colour will be black on PM-LCD.
|
// LCD output will invert the luminosity. That is, normally white colour will be black on PM-LCD.
|
||||||
|
|||||||
@@ -47,14 +47,14 @@ class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig(
|
|||||||
|
|
||||||
override fun peek(addr: Long): Byte? {
|
override fun peek(addr: Long): Byte? {
|
||||||
return when (addr) {
|
return when (addr) {
|
||||||
in 0 until 250880 -> (-1).toByte()
|
in 0 until 250972 -> (-1).toByte()
|
||||||
else -> super.peek(addr)
|
else -> super.peek(addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun poke(addr: Long, byte: Byte) {
|
override fun poke(addr: Long, byte: Byte) {
|
||||||
when (addr) {
|
when (addr) {
|
||||||
in 0 until 250880 -> { /*do nothing*/ }
|
in 0 until 250972 -> { /*do nothing*/ }
|
||||||
else -> super.poke(addr, byte)
|
else -> super.poke(addr, byte)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user