graphics: fixed pixels not plotting on non crt_color

This commit is contained in:
minjaesong
2021-04-27 16:02:30 +09:00
parent e031f0d256
commit eb58838a57
11 changed files with 85 additions and 60 deletions

View File

@@ -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
View 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;
}

View File

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

Binary file not shown.

View 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

Binary file not shown.

BIN
assets/tandem_logo_240.r8 Normal file

Binary file not shown.

View File

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

View File

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

View File

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

View File

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