Mercurial > hg > forks > multipaint-js
diff exporters.pde @ 0:ebd5689e2985
Initial import of Multipaint sketch version 22.5.2017.
author | Tero Heikkinen |
---|---|
date | Tue, 03 Jul 2018 20:56:55 +0300 |
parents | |
children | e2f754cc1665 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exporters.pde Tue Jul 03 20:56:55 2018 +0300 @@ -0,0 +1,1851 @@ +// machine definitions +// source writer and other export/import functions +// the machine_export() makes use of bitmapexport() and colorexport() below +// remember hexdump -C ! + +String g_formatname, g_formatextension; + +int g_headpos; +int[] g_grids = new int[16]; +int OLD=0; +int NEW=1; +int g_gridmode=OLD; + +int bitti(int inp) +{ + if(inp==0)return 0; + return 1; +} + +int qbitti(int inp) +{ + if(inp==10)return 1; + return 0; +} + +void poopspecialsprites() +{ + int x,y,xs,xx,yy,mup,row; + int b7,b6,b5,b4,b3,b2,b1,b0,val; + mup=0; + for(row=0;row<=1;row++){ + for(x=0;x<=8;x++) + { + for(y=0;y<=20;y++){ + for(xs=0;xs<=2;xs++){ + if(mup>0){print(",");} + mup=1; + xx=x*24+xs*8; + if(row==1&&x==7){xx=xx+24;} + if(x==8){xx=xx+24;} + yy=row*48+2+y; + b7=qbitti(easygetcolor(xx,yy)); + b6=qbitti(easygetcolor(xx+1,yy)); + b5=qbitti(easygetcolor(xx+2,yy)); + b4=qbitti(easygetcolor(xx+3,yy)); + b3=qbitti(easygetcolor(xx+4,yy)); + b2=qbitti(easygetcolor(xx+5,yy)); + b1=qbitti(easygetcolor(xx+6,yy)); + b0=qbitti(easygetcolor(xx+7,yy)); + val=b7*128+b6*64+b5*32+b4*16+b3*8+b2*4+b1*2+b0; + print(str(val)); + } + + }print(",0"); println(""); + for(y=0;y<=20;y++){ + for(xs=0;xs<=2;xs++){ + if(mup>0){print(",");} + mup=1; + xx=x*24+xs*8;yy=row*48+y*2; + if(x==8){xx=xx+24;} + b7=bitti(easygetcolor(xx,yy)); + b6=bitti(easygetcolor(xx+1,yy)); + b5=bitti(easygetcolor(xx+2,yy)); + b4=bitti(easygetcolor(xx+3,yy)); + b3=bitti(easygetcolor(xx+4,yy)); + b2=bitti(easygetcolor(xx+5,yy)); + b1=bitti(easygetcolor(xx+6,yy)); + b0=bitti(easygetcolor(xx+7,yy)); + if(x==7){xx=x*24+xs*16;yy=row*48+y; + b7=bitti(easygetcolor(xx,yy)); + b6=bitti(easygetcolor(xx+2,yy)); + b5=bitti(easygetcolor(xx+4,yy)); + b4=bitti(easygetcolor(xx+6,yy)); + b3=bitti(easygetcolor(xx+8,yy)); + b2=bitti(easygetcolor(xx+10,yy)); + b1=bitti(easygetcolor(xx+12,yy)); + b0=bitti(easygetcolor(xx+14,yy)); + } + val=b7*128+b6*64+b5*32+b4*16+b3*8+b2*4+b1*2+b0; + print(str(val)); + } + + }print(",0"); println(); + } + } +} + +void poopultimachars() +{ + PImage poutput; + poutput=createImage(256*8,8,RGB); + int x,y,rr,gg,bb,xx,yy,bx,by; + int ac,box,boy; + int b7,b6,b5,b4,b3,b2,b1,b0,val; + int blok,muna; + color c; + + blok=0; + PrintWriter f=createWriter("/home/tero/code/c64/ultima/graffa.s"); + f.println(".global _graffa"); + f.println("_graffa:"); + f.println(); + //print("unsigned char graffa[]={"); + for(y=0;y<=5;y++){ + muna=0; + if(blok<=63){ + f.print(".byte ");} + for(x=0;x<=19;x++) + { + if(blok<=63){ + for(boy=0;boy<=1;boy++){ + for(box=0;box<=1;box++){ + + for(yy=0;yy<=7;yy++){ + bx=x*16+box*8;by=(y*16+boy*8+yy); + + b7=0;b6=0;b5=0;b4=0;b3=0;b2=0;b1=0;b0=0; + ac=easygetcolor(bx,by); + if(ac==0){b7=0;b6=0;} + if(ac==15){b7=1;b6=0;} + if(ac==2){b7=0;b6=1;} + if(ac==7){b7=1;b6=1;} + ac=easygetcolor(bx+2,by); + if(ac==0){b5=0;b4=0;} + if(ac==15){b5=1;b4=0;} + if(ac==2){b5=0;b4=1;} + if(ac==7){b5=1;b4=1;} + ac=easygetcolor(bx+4,by); + if(ac==0){b3=0;b2=0;} + if(ac==15){b3=1;b2=0;} + if(ac==2){b3=0;b2=1;} + if(ac==7){b3=1;b2=1;} + ac=easygetcolor(bx+6,by); + if(ac==0){b1=0;b0=0;} + if(ac==15){b1=1;b0=0;} + if(ac==2){b1=0;b0=1;} + if(ac==7){b1=1;b0=1;} + val=b7*128+b6*64+b5*32+b4*16+b3*8+b2*4+b1*2+b0; + f.print(str(val));muna++; + if(muna<640){f.print(",");} + + for(xx=0;xx<=7;xx++){ + + rr=g_r[easygetcolor(x*8+xx,y*8+yy)]; + gg=g_g[easygetcolor(x*8+xx,y*8+yy)]; + bb=g_b[easygetcolor(x*8+xx,y*8+yy)]; + c=color(rr,gg,bb); + poutput.set(x*8+y*(16*8)+xx,yy,c); + } + } + } + } + } + } + f.println(); + blok++; + } + f.flush(); + f.close(); + //poutput.save("/home/tero/sketchbook/petscii/data/petscii-c64x.png"); +} + +void poopchars() +{ + PImage poutput; + poutput=createImage(256*8,8,RGB); + int x,y,rr,gg,bb,xx,yy,bx,by; + int ac; + int b7,b6,b5,b4,b3,b2,b1,b0,val; + color c; + + PrintWriter f=createWriter("/home/tero/code/c64/newgame/graffa.s"); + f.println(".global _graffa"); + f.println("_graffa:"); + f.println(); + //print("unsigned char graffa[]={"); + for(y=0;y<=15;y++){ + f.print(".byte "); + for(x=0;x<=15;x++) + { + for(yy=0;yy<=7;yy++){ + bx=x*8;by=(y*8+yy); + + b7=0;b6=0;b5=0;b4=0;b3=0;b2=0;b1=0;b0=0; + ac=easygetcolor(bx,by); + if(ac==0){b7=0;b6=0;} + if(ac==15){b7=1;b6=0;} + if(ac==11){b7=0;b6=1;} + if(ac==5){b7=1;b6=1;} + ac=easygetcolor(bx+2,by); + if(ac==0){b5=0;b4=0;} + if(ac==15){b5=1;b4=0;} + if(ac==11){b5=0;b4=1;} + if(ac==5){b5=1;b4=1;} + ac=easygetcolor(bx+4,by); + if(ac==0){b3=0;b2=0;} + if(ac==15){b3=1;b2=0;} + if(ac==11){b3=0;b2=1;} + if(ac==5){b3=1;b2=1;} + ac=easygetcolor(bx+6,by); + if(ac==0){b1=0;b0=0;} + if(ac==15){b1=1;b0=0;} + if(ac==11){b1=0;b0=1;} + if(ac==5){b1=1;b0=1;} + val=b7*128+b6*64+b5*32+b4*16+b3*8+b2*4+b1*2+b0; + f.print(str(val)); + if(x<15||yy<7){f.print(",");} + for(xx=0;xx<=7;xx++){ + + rr=g_r[easygetcolor(x*8+xx,y*8+yy)]; + gg=g_g[easygetcolor(x*8+xx,y*8+yy)]; + bb=g_b[easygetcolor(x*8+xx,y*8+yy)]; + c=color(rr,gg,bb); + poutput.set(x*8+y*(16*8)+xx,yy,c); + } + } + } + f.println(); + } + f.flush(); + f.close(); + poutput.save("/home/tero/sketchbook/petscii/data/petscii-c64x.png"); +} + +void poopsprites() +{ + int x,y,xs,xx,yy,mup; + int b7,b6,b5,b4,b3,b2,b1,b0,val; + mup=0; + for(x=0;x<=7;x++) + { + for(y=0;y<=15;y++){ + for(xs=0;xs<=1;xs++){ + if(mup>0){print(",");} + mup=1; + xx=x*16+xs*8; + yy=y; + b7=bitti(easygetcolor(xx,yy)); + b6=bitti(easygetcolor(xx+1,yy)); + b5=bitti(easygetcolor(xx+2,yy)); + b4=bitti(easygetcolor(xx+3,yy)); + b3=bitti(easygetcolor(xx+4,yy)); + b2=bitti(easygetcolor(xx+5,yy)); + b1=bitti(easygetcolor(xx+6,yy)); + b0=bitti(easygetcolor(xx+7,yy)); + val=b7*128+b6*64+b5*32+b4*16+b3*8+b2*4+b1*2+b0; + print(str(val)); + } + + }println(); + } + +} + +void pushbyte(int ad,int head) +{ + g_map[ad]=byte((g_template[head]&128)>>7); + g_map[ad+1]=byte((g_template[head]&64)>>6); + g_map[ad+2]=byte((g_template[head]&32)>>5); + g_map[ad+3]=byte((g_template[head]&16)>>4); + g_map[ad+4]=byte((g_template[head]&8)>>3); + g_map[ad+5]=byte((g_template[head]&4)>>2); + g_map[ad+6]=byte((g_template[head]&2)>>1); + g_map[ad+7]=byte(g_template[head]&1); +} + +void format_import(String fname) +{ + int x, y, x2, y2, y3, head, xx, yy, yp, ad, valu; + int p1, p2, p3; + head=0; + + if (machine==SPECTRUM) //SCR=SCREEN$ + { + // 32*24*8 bytes of bitmap + // 32*24 bytes of attributes + import_program(fname); + if(g_template.length<6912){message("FALSE");return;} + for (y=0; y<=2; y++) { + for (y2=0; y2<=7; y2++) { + for (yy=0; yy<=7; yy++) { + for (x=0; x<=31; x++) { + yp=y*64+yy*8+y2; + ad=1024+yp*256+x*8; + pushbyte(ad,head); + head++; + } + } + } + } + for (y=0; y<=23; y++) { + for (x=0; x<=31; x++) { + ad=65536+x+y*(32*8); + valu=g_template[head]; + int ink=valu&7; + int pap=valu&56; + pap=pap>>3; + int bri=valu&64; + bri=bri>>6; + ink=ink+bri*8; + pap=pap+bri*8; + if (pap==8) { + pap=0; + } + for (y2=0; y2<=7; y2++) { + g_map[ad+y2*32]=byte(ink); + g_map[ad+y2*32+MX*MY*8]=byte(pap); + } + head++; + } + } + } + + if (machine==C64) { + //0x0002->bitmap + //0x1f42->colormap + //0x232a=border (take the lower nybble) + import_program(fname); //art studio + if(g_template.length<9006){message("FALSE");return;} + if (g_template.length>=0x232a) { + g_map[0]=byte(g_template[0x232a]&15); + } + for (y=0; y<25; y++) { + for (x=0; x<40; x++) { + for (y2=0; y2<=7; y2++) { + head=2+x*8+y*(40*8)+y2; + ad=1024+x*8+y*(320*8)+y2*320; + pushbyte(ad,head); + p1=g_template[0x1f42+x+y*40]&15; + p2=g_template[0x1f42+x+y*40]&240; + p2=p2>>4; + g_map[65536+x+y*40*8+y2*40]=byte(p2); + g_map[65536+MX*MY*8+x+y*40*8+y2*40]=byte(p1); + } + } + } + } + + if (machine==PLUS4) { // Botticelli + //g.hires.prg = botticelli + //2 - luminance 40*25 + //1026 - colors 40*25 + //2050 - bitmappi 40*25*8 + import_program(fname); + + if(g_template.length<10050){message("FALSE");return;} + int l1,l2; + for (y=0; y<25; y++) { + for (x=0; x<40; x++) { + for (y2=0; y2<=7; y2++) { + head=2050+x*8+y*(40*8)+y2; + ad=1024+x*8+y*(320*8)+y2*320; + pushbyte(ad,head); + + p1=g_template[1026+x+y*40]&15; + p2=g_template[1026+x+y*40]&240; + p2=p2>>4; + l1=g_template[2+x+y*40]&15; + l2=g_template[2+x+y*40]&240; + l2=l2>>4; + g_map[65536+x+y*40*8+y2*40]=byte(convertlumi(l1,p2)); + g_map[65536+MX*MY*8+x+y*40*8+y2*40]=byte(convertlumi(l2,p1)); + } + } + } + + } + + if (machine==PLUS4M) { // Multi Botticelli + //m.multi.prg = multi botticelli + //2- lumins 40*25 + //1024 - bäkki1 + //1025 - bäkki2 + //1026 - colors 40*25 + //2050 - bitmap 40*25*8 + import_program(fname); + + if(g_template.length<10050){message("FALSE");return;} + int l1,l2; + for (y=0; y<25; y++) { + for (x=0; x<40; x++) { + for (y2=0; y2<=7; y2++) { + head=2050+x*8+y*(40*8)+y2; + ad=1024+x*8+y*(320*8)+y2*320; + pushbyte(ad,head); + + p1=g_template[1026+x+y*40]&15; + p2=g_template[1026+x+y*40]&240; + p2=p2>>4; + l1=g_template[2+x+y*40]&15; + l2=g_template[2+x+y*40]&240; + l2=l2>>4; + g_map[65536+x+y*40+1000]=byte(convertlumi(l1,p2)); + g_map[65536+x+y*40+0000]=byte(convertlumi(l2,p1)); + } + } + } + p1=int(g_template[1025])&240; + l1=int(g_template[1025])&15; + p1=p1>>4; + g_map[1]=byte(convertlumi(l1,p1)); + p1=int(g_template[1024])&240; + l1=int(g_template[1024])&15; + p1=p1>>4; + g_map[2]=byte(convertlumi(l1,p1)); + } + + if (machine==C64M) {//advanced art studio + //adv. art studio (=multicolor) 10018 bytes + //0x0002 bitmap (40*25*8) + //0x1f42 colors1 (40*25) + //0x232a border + //0x232b background + //0x233a colors2 (40*25) + import_program(fname); + if(g_template.length<10018){message("FALSE");return;} + for (y=0; y<25; y++) { + for (x=0; x<40; x++) { + for (y2=0; y2<8; y2++) { + head=2+x*8+y*(40*8)+y2; + ad=1024+x*8+y*(320*8)+y2*320; + pushbyte(ad,head); + + p1=g_template[0x1f42+x+y*40]&15; + p2=g_template[0x1f42+x+y*40]&240; + p2=p2>>4; + p3=g_template[0x233a+x+y*40]&15; + g_map[65536+x+y*40]=byte(p1); + g_map[65536+x+y*40+1000]=byte(p2); + g_map[65536+x+y*40+2000]=byte(p3); + g_map[0]=byte(g_template[0x232a]&15);//bord + g_map[1]=byte(g_template[0x232b]&15);//baku + } + } + } + } + + if(machine==MSX){ // sc2 + // 7=bitmap 32*24*8 + // 7+(32*24*8)=colormap 32*24 + import_program(fname); + if(g_template.length<14343){message("FALSE");return;} + for (y=0; y<24; y++) { + for (x=0; x<32; x++) { + for (y2=0; y2<=7; y2++) { + head=7+x*8+y*(32*8)+y2; + ad=1024+x*8+y*(256*8)+y2*256; + pushbyte(ad,head); + p1=g_template[(8199)+x*8+((y*8*32)+y2)]&15; + p2=g_template[(8199)+x*8+((y*8*32)+y2)]&240; + p2=p2>>4; + if(p1==0){p1=1;} + if(p2==0){p2=1;} + g_map[65536+x+y*32*8+y2*32]=byte(p2); + g_map[65536+MX*MY*8+x+y*32*8+y2*32]=byte(p1); + } + } + } + } + + if(machine==CPC){ // a studio? + import_program(fname); + message("Not|Working"); + } + + consistency(); + refresh(); + g_boxreconstruct=2; +} + +void format_export(String fname) +{ + int val1, val2, val3; + int y, y2, yy, x, yp, xp, ad, valu, valu2, bri; + + if (machine==PLUS4) {// botticelli hires + load_template("g.hires.prg"); + set_head(0x02); + colorexport(40, 25, 65536, 5);//lumis + set_head(1026); + colorexport(40, 25, 65536, 4);//colors + set_head(2050); + bitmapexport(40, 25); + export_program(fname); + } + + if (machine==PLUS4M) {// multi botticelli multicolor + load_template("m.multi.prg"); + val2=getpluscolor(int(g_map[1])); + val1=getplusluminance(int(g_map[1])); + val3=val2*16+val1; + set_head(1025); + write_head(val3); + val2=getpluscolor(int(g_map[2])); + val1=getplusluminance(int(g_map[2])); + val3=val2*16+val1; + set_head(1024); + write_head(val3); + set_head(1026); + colorexport(40, 25, 65536, 6);//colors + set_head(2); + colorexport(40, 25, 65536, 7);//lumis + set_head(2050); + bitmapexport(40, 25); + export_program(fname); + } + + if (machine==C64) { + load_template("hires.art"); + set_head(2); + bitmapexport(40, 25); + set_head(0x1f42); + colorexport(40, 25, 65536, 0); + set_head(0x232a); + write_head(int(g_map[0])); + export_program(fname); + } + + if (machine==C64M) { + if(fname.indexOf(".kla")==-1){ + load_template("multic.ocp"); + set_head(2); + bitmapexport(40, 25); + set_head(0x1f42); + colorexport(40, 25, 65536, 1); + set_head(0x233a); + colorexport(40, 25, 65536+2000, 2); + set_head(0x232a); + write_head(int(g_map[0])); + set_head(0x232b); + write_head(int(g_map[1])); + export_program(fname); + } + + //koala + + if(fname.indexOf(".kla")>=0){ + load_template("multic.kla"); + set_head(2); + bitmapexport(40,25); + set_head(0x1f42); + colorexport(40,25,65536,1); + set_head(0x232a); + colorexport(40,25,65536+2000,2); + set_head(0x2712); + write_head(int(g_map[1]&15)); + export_program(fname); + } + + } + + if (machine==MSX) { + load_template("msx-screen2.sc2"); + set_head(7); + bitmapexport(32, 24); + set_head(7+(32*24*8)+768+1280); + colorexport(32, 24, 65536, 3);//there's an exception for msx-style + export_program(fname); + } + + if (machine==SPECTRUM) + { + load_template("zx-screen.scr"); + set_head(0); + for (y=0; y<=2; y++) { + for (y2=0; y2<=7; y2++) { + for (yy=0; yy<=7; yy++) { + for (x=0; x<=31; x++) { + yp=y*64+yy*8+y2; + ad=1024+yp*256+x*8; + valu=g_map[ad+0]*128+g_map[ad+1]*64+g_map[ad+2]*32+g_map[ad+3]*16+g_map[ad+4]*8+g_map[ad+5]*4+g_map[ad+6]*2+g_map[ad+7]*1; + write_head(int(valu)); + } + } + } + } + for (y=0; y<=23; y++) { + for (x=0; x<=31; x++) { + ad=65536+x+y*256; + valu=int(g_map[ad]); + valu2=int(g_map[ad+MX*MY*8]); + bri=0; + if (valu>=8) { + bri=1; + valu=valu-8; + valu2=valu2-8; + if (valu2<=0) { + valu2=0; + } + } + if (bri==1) { + valu=valu+64; + } + write_head(int(valu+valu2*8)); + } + } + export_program(fname); + } +} + +void machine_export(String fname, int sorsa) +{ + int yy, xx, x, y2, y, checksum; + int xp, yp; + int valu, valu2; + int val1, val2, val3; + int ad, by; + int bri, skyp; + g_sorsaa=sorsa;//aargh another global + + if (sorsa==1) { + exwriter=createWriter(fname); + } + + // any common text headers + by=0; + skyp=0; + outputter(";machine="+str(machine)+" ("+g_name+")", true); + + if (machine==C64) { //C64 HIRES + + load_template("c64show.prg"); + set_head(0X0227); + bitmapexport(40, 25); + set_head(0X2167); + write_head(g_map[0]);//=border + set_head(0X2168); + write_head(g_map[1]);//=background mutta ei tarvita + set_head(0X2169); + outputter("; The following two first values are border and background", true); + colorexport(40, 25, 65536, 0); + export_program(fname); + + //c64show.prg + //offsets + //0x0227->bitmappi (40x25 x 8 bytee) + //0x2167:borderi väri + //0x2169->värikartta (40x25 bytee, nyppelit foreg/backg) + } + + if (machine==C64M) { //C64 MULTICOLOR + + load_template("c64mshow.prg"); + set_head(0x0239); + bitmapexport(40, 25); + + // first color information + set_head(0x2179); + write_head(g_map[0]); + set_head(0x217A); + write_head(g_map[1]); + set_head(0x217B); + outputter("; The following two first values are border and background", true); + colorexport(40, 25, 65536, 1); + + // second color information + set_head(0x2563); + outputter("; The following goes to $D800 onwards", true); + colorexport(40, 25, 65536+2000, 2); + export_program(fname); + + //c64 multicolor + //offsets + //0x0239->bitmappi (40x25 x 8 bytee) + //0x2179:borderi väri + //0x217A:bäkkis väri + //0x217B->värikartta 1 (40x25 bytee, nyppelit foreg/backg ilmeisesti) + //0x2563->värikartta 2 (40x25 bytee, nyppeli 3-väri nepan osoitteessa $d800-) + } + + if (machine==PLUS4M) { //PLUS4 MULTICOLOR + load_template("showpfourm.prg"); + outputter(" .global _bitmap", true); + outputter(" .global _color1", true); + outputter(" .global _color2", true); + outputter(" .global _border", true); + outputter(" .global _back1", true); + outputter(" .global _back2", true); + outputter("_bitmap:", true); + set_head(0x013e); + bitmapexport(40, 25); + outputter("_border:", true); + val1=getpluscolor(int(g_map[0])); + val2=getplusluminance(int(g_map[0])); + val3=val2*16+val1; + set_head(0x207e); + write_head(val3); + outputter(" .byte "+val3, true); + outputter("_back1:", true); + val1=getpluscolor(int(g_map[1])); + val2=getplusluminance(int(g_map[1])); + val3=val2*16+val1; + set_head(0x207f); + write_head(val3); + outputter(" .byte "+val3, true); + outputter("_back2:", true); + val1=getpluscolor(int(g_map[2])); + val2=getplusluminance(int(g_map[2])); + val3=val2*16+val1; + set_head(0x2080); + write_head(val3); + outputter(" .byte "+val3, true); + outputter("_color1:", true); + set_head(0x2081); + colorexport(40, 25, 65536, 6); + outputter("_color2:", true); + set_head(0x2469); + colorexport(40, 25, 65536, 7); + export_program(fname); + //plus4 multic + //0x013e bitmap (40 x 25 x 8) + //0x207e border + //0x207f background 1 + //0x2080 background 2 + //0x2081 colors (40 x 25) + //0x2469 luminance (40 x 25) + } + + if (machine==PLUS4) {// Plus 4 hires + load_template("showpfour.prg"); + outputter(" .global _bitmap", true); + outputter(" .global _color", true); + outputter(" .global _lumi", true); + outputter(" .global _border", true); + outputter("_bitmap:", true); + set_head(0x0137); + bitmapexport(40, 25); + val1=getpluscolor(int(g_map[0])); + val2=getplusluminance(int(g_map[0])); + val3=val2*16+val1; + set_head(0x2077); + write_head(val3); //border + + set_head(0x2078); + colorexport(40, 25, 65536, 4);//colors + set_head(0x2460); + colorexport(40, 25, 65536, 5);//lumis + export_program(fname); + //plus4 hires + //0x0137 bitmap (40 x 25 x 8) + //0x2077 borderi + //0x2078 colors (40 x 25) + //0x2460 luminance (40 x 25) + } + + if (machine==MSX) { // MSX + load_template("msxshow.com"); + set_head(0x00f9); + outputter(char(9)+".globl _nimi1,_nimi2", true); + outputter(char(9)+".area _CODE", true); + outputter("_nimi1:", true); + bitmapexport(32, 24); + set_head(0x18f9); + //write_head(g_map[1]); //backg + //outputter("; The first following value is background", true); + outputter("_nimi2:", true); + colorexport(32, 24, 65536, 3);//there's an exception for msx-style + export_program(fname); + //msx comm + //0x00f9 bitmap (32x24 x 8 bytes) + //0x18f9 background color + //0x18fa colors (32*24 bytes) + } + + if (machine==SPECTRUM) { // ZX Spectrum + + //would need some cleaning up + + // outputter(" .area _DATA",true); + // outputter(" .globl _taustakuva",true); + // outputter("",true); + // outputter("_taustakuva:",true); + load_template("specshow.tap"); + int stad; + + checksum=0xc9; + for (y=0x1d24; y<=0x1d3d; y++) { //1d3e + checksum=checksum^int(g_template[y]); + } + //TAP requires fiddling with the checksum + //println("Checksum:"+hex(checksum,2)); + set_head(0x0223); + outputter(".byte "+(str(g_map[0]))+" ;border", true); + write_head(int(g_map[0])); + checksum=checksum^int(g_map[0]); + for (y=0; y<=2; y++) { + for (y2=0; y2<=7; y2++) { + for (yy=0; yy<=7; yy++) { + + outputter(".byte ", false); + for (x=0; x<=31; x++) { + yp=y*64+yy*8+y2; + xp=x; + ad=1024+yp*256+x*8; + valu=g_map[ad+0]*128+g_map[ad+1]*64+g_map[ad+2]*32+g_map[ad+3]*16+g_map[ad+4]*8+g_map[ad+5]*4+g_map[ad+6]*2+g_map[ad+7]*1; + outputter(str(int(valu)), false); + by++; + write_head(int(valu)); + checksum=checksum^int(valu); + if (x<=30) { + outputter(",", false); + } + } + outputter("", true); + } + } + } + + outputter("; attributes", true); + for (y=0; y<=23; y++) { + outputter(".byte ", false); + for (x=0; x<=31; x++) { + ad=65536+x+y*256; + valu=int(g_map[ad]); + valu2=int(g_map[ad+MX*MY*8]); + bri=0; + if (valu>=8) { + bri=1; + valu=valu-8; + valu2=valu2-8; + if (valu2<=0) { + valu2=0; + } + } + if (bri==1) { + valu=valu+64; + } + outputter(str(valu+valu2*8), false); + by++; + write_head(int(valu+valu2*8)); + checksum=checksum^int(valu+valu2*8); + if (x<=30) { + outputter(",", false); + } + } + outputter("", true); + } + //println("checksum:"+hex(checksum,2)); + set_head(0x1d3e); + write_head(int(checksum)); + export_program(fname); + } + + if (machine==CPC) { + load_template("cpc-mode0.bin"); + + set_head(69);//bitmap offset + bitmapexport_cpc(160, 200); + set_head(16453); + outputter(";palette", true); + outputter(".byte ", false); + for (int i=0; i<g_maxcolors; i++) {//fixed # of palette entries, just trying to be generic + val1=int(g_g[i]/(256/g_palsteps)); + val2=int(g_r[i]/(256/g_palsteps)); + val3=int(g_b[i]/(256/g_palsteps)); + write_head(val1*9+val2*3+val3); + outputter(str(val1*9+val2*3+val3), false); + if (i<g_maxcolors-1) { + outputter(",", false); + } + } + outputter("", true); + outputter(";border", true); + outputter(".byte ", false); + set_head(16469); + valu=int(g_map[0]); + val1=int(g_g[valu]/(256/g_palsteps)); + val2=int(g_r[valu]/(256/g_palsteps)); + val3=int(g_b[valu]/(256/g_palsteps)); + write_head(val1*9+val2*3+val3); + outputter(str(val1*9+val2*3+val3), false); + //cpc + //69 bitmap 16384 bytes + //16453 palette 16 bytes (0..26) + //16469 border color (0..26) + export_program(fname); + } + + // any common lead-outs + + if (sorsa==1) { + exwriter.flush(); + exwriter.close(); + } +} + +void bitmapexport_cpc(int xwid, int yy) +{ + int x, y, ad, val1, val2, y2; + int pix0b0, pix0b1, pix0b2, pix0b3; + int pix1b0, pix1b1, pix1b2, pix1b3; + int pp; + pp=0; + outputter(";bitmap", true); + for (y2=0; y2<=7; y2++) { + for (y=0; y<25; y++) { + outputter(" .byte ", false); + for (x=0; x<xwid/2; x++) { + ad=1024+(y*8)*X+(y2*X)+x*4; + + val1=int(g_map[ad]); + pix0b0=0;pix0b1=0;pix0b2=0;pix0b3=0; + if ((val1&1)!=0) pix0b0=1; + if ((val1&2)!=0) pix0b1=1; + if ((val1&4)!=0) pix0b2=1; + if ((val1&8)!=0) pix0b3=1; + + val1=int(g_map[ad+2]); + + pix1b0=0;pix1b1=0;pix1b2=0;pix1b3=0; + if ((val1&1)!=0) pix1b0=1; + if ((val1&2)!=0) pix1b1=1; + if ((val1&4)!=0) pix1b2=1; + if ((val1&8)!=0) pix1b3=1; + + val2=pix1b3+pix0b3*2+pix1b1*4+pix0b1*8+pix1b2*16+pix0b2*32+pix1b0*64+pix0b0*128; + outputter(str(int(val2)), false); + write_head(val2); + pp++; + if (x<xwid/2-1) { + outputter(",", false); + } + } + outputter("", true); + } + outputter(" .byte ", false); + for (int j=0; j<=47; j++) { + write_head(0); + outputter(str(int(0)), false); + pp++; + if (j<47) { + outputter(",", false); + } + } + outputter("", true); + } + outputter("", true); +} + +void bitmapexport(int xx, int yy) +{ + int xwid, ywid, x, y, y2, value, ad, linep; + linep=0; + xwid=xx*8; + ywid=yy*8; + //outputter("unsigned char img[]={",false); + + for (y=0; y<yy; y++) { + for (x=0; x<xx; x++) { +// outputter(" .byte ", false); + outputter(char(9)+".db ",false); + for (y2=0; y2<=7; y2++) { + ad=1024+y*(xwid*8)+(y2*xwid)+x*8; + value=g_map[ad+0]*128+g_map[ad+1]*64+g_map[ad+2]*32+g_map[ad+3]*16+g_map[ad+4]*8+g_map[ad+5]*4+g_map[ad+6]*2+g_map[ad+7]*1; + outputter(str(int(value)), false); + write_head(int(value)); + if (y2<=6) { + outputter(",", false); + } + } + outputter("", true); + linep++; + if (linep==xx) { + linep=0; + outputter("", true); + } + } + } + outputter("", true); +} + +int convertlumi(int l,int f) +{ + int res=0; + if(f==0)return 0; + if(l==0)res=0+f; + if(l==1)res=15+f; + if(l==2)res=30+f; + if(l==3)res=45+f; + if(l==4)res=60+f; + if(l==5)res=75+f; + if(l==6)res=90+f; + if(l==7)res=105+f; + return res; +} + +int getplusluminance(int c) +{ + int res=0; + if (c==0)res=0; + if (c>=1&&c<=15)res=0; + if (c>=16&&c<=30)res=1; + if (c>=31&&c<=45)res=2; + if (c>=46&&c<=60)res=3; + if (c>=61&&c<=75)res=4; + if (c>=76&&c<=90)res=5; + if (c>=91&&c<=105)res=6; + if (c>=106&&c<=120)res=7; + return res; +} + +int getpluscolor(int c) +{ + int res=0; + if (c==0)res=0; + if (c>=1&&c<=15)res=c; + if (c>=16&&c<=30)res=c-15; + if (c>=31&&c<=45)res=c-30; + if (c>=46&&c<=60)res=c-45; + if (c>=61&&c<=75)res=c-60; + if (c>=76&&c<=90)res=c-75; + if (c>=91&&c<=105)res=c-90; + if (c>=106&&c<=120)res=c-105; + return res; +} + +void colorexport(int xx, int yy, int source, int param) +{ + int x, y, y2, valu, valu2, kalu, muista, ad, linep, xwid, ywid, xoor, yline, myrpsi; + xwid=xx*8; + ywid=yy*8; + valu=0; + valu2=0; + myrpsi=0; + xoor=xx; + if (param==0||param==4||param==5) { + xoor=xx*8; + } + if (machine==MSX) { + myrpsi=7; + } + if (param<2) { + outputter("colora:", true); + } + if (param==2) { + outputter("colorb:", true); + } + if (param<2) { + outputter(" .byte "+int(g_map[0])+","+int(g_map[1]), true); + } + if (param==3) { + // outputter("color:", true); + // outputter(" .byte ", false); + // outputter(g_map[0]+" ", true); + xoor=xx*8; + } + if (param==4) { + outputter("_border:", true); + outputter(" .byte ", false); + kalu=getpluscolor(int(g_map[0])); + valu2=getplusluminance(int(g_map[0])); + valu=valu2*16+kalu; + outputter(valu+" ", true); + outputter("_color:", true); + } + if (param==5) { + outputter("_lumi:", true); + } + for (y=0; y<yy; y++) { + //outputter(" .byte ", false); + outputter(char(9)+".db ", false); + for (x=0; x<xx; x++) { + for (yline=0; yline<=myrpsi; yline++) { + ad=source+x+y*xoor+yline*xx; + if (param==0) { + valu=int(g_map[ad]); + valu2=int(g_map[ad+MX*MY*8]); + } + if (param==1) { + valu2=int(g_map[ad]); + valu=int(g_map[ad+1000]); + } + if (param==2) { + valu2=int(g_map[ad]); + valu=0; + } + if (param==3) { + valu=int(g_map[ad]); + valu2=int(g_map[ad+MX*MY*8]); + } + + if (param==4) {//plus4 colortable + kalu=int(g_map[ad]); + valu=getpluscolor(kalu); + kalu=int(g_map[ad+MX*MY*8]); + valu2=getpluscolor(kalu); + } + + if (param==5) {//plus4 lumitable + kalu=int(g_map[ad]); + valu2=getplusluminance(kalu); + kalu=int(g_map[ad+MX*MY*8]); + valu=getplusluminance(kalu); + } + + if (param==6) {//plus4 multic1 + valu2=getpluscolor(int(g_map[ad])); + valu=getpluscolor(int(g_map[ad+1000])); + } + + if (param==7) {//plus4 multic2 + valu=getplusluminance(int(g_map[ad])); + valu2=getplusluminance(int(g_map[ad+1000])); + } + + outputter(str(valu*16+valu2), false); + write_head(int(valu*16+valu2)); + if (x<(xx-1)||yline<myrpsi) { + outputter(",", false); + } + } + } + outputter("", true); + } + outputter("", true); +} + +void load_template(String fname) +{ + g_template=loadBytes("templates/"+fname); +} + +void import_program(String fname) +{ + g_template=loadBytes(fname); +} + +void set_head(int pos) +{ + g_headpos=pos; +} + +void write_head(int bb) +{ + g_template[g_headpos]=byte(bb); + g_headpos++; +} + +void export_program(String fname) +{ + if (g_sorsaa==1) { + return; + } + saveBytes(fname, g_template); +} + +void outputter(String oput, boolean eol) +{ + if (g_sorsaa==0)return; + if (eol==false)exwriter.print(oput); + if (eol==true)exwriter.println(oput); +} + + +void import_image(String name) +{ + PImage image; + image = loadImage(name); + int balx, baly, xx, yy, x2, y2, rr, gg, bb, avg, molox, i, j, target; + int cx, cy; + int aas, bbs, swap, idefix, avx, avy; + int[] pixut= new int[260]; + int[] idx=new int[260]; + int[] histog=new int[8192]; + float ww, hh, fld, compa, fx2, fy2; + color c; + int xcolors, limitter, vertti, erkki; + int rh,gh,bh; + + xcolors=g_maxcolors; + vertti=8; + erkki=1; + limitter=2; + if (g_britemode==1) { + xcolors=8; + } + if (g_attrimode==0) { + vertti=1; + erkki=8; + } + if (g_multic==1) { + limitter=4; + }//because zero color can be anywhere? + if (g_multic==2) { + limitter=16; + } + molox=1; + command('O');//special clear screen + if (g_multic==1||g_hzoomer==2) { + molox=2; + } + ww=image.width; + hh=image.height; + if (ww<=16||hh<=16) { + return; + } + balx=int(ww/X); + balx=balx*molox; + baly=int(hh/Y); + if (balx<1) { + balx=1; + } + if (baly<1) { + baly=1; + } + + if(g_palsteps>0){ + for(i=0;i<g_maxcolors;i++){ + makecolor(i,0,0,0); + } + + int maxhis,palls,psteps; + psteps=int(g_palsteps-1); + maxhis=0;palls=int(255/psteps); + for (cy=0; cy<MY*erkki; cy++) { + for (cx=0; cx<MX; cx++) { + for (yy=cy*vertti; yy<=cy*vertti+vertti-1; yy++) { + for (xx=cx*8; xx<=cx*8+7; xx=xx+molox) { + fx2=(ww/X)*xx; + fy2=(hh/Y)*yy; + x2=int(fx2); + y2=int(fy2); + rr=0; + gg=0; + bb=0; + avg=0; + + for (avy=0; avy<baly; avy++) { + for (avx=0; avx<balx; avx++) { + c=image.get(x2+avx, y2+avy); + rr=rr+int(red(c)); + gg=gg+int(green(c)); + bb=bb+int(blue(c)); + avg++; + } + } + rh=rr/(avg); + gh=gg/(avg); + bh=bb/(avg); + rh=int(rh)/palls; + gh=int(gh)/palls; + bh=int(bh)/palls; + histog[int(rh*(g_palsteps*g_palsteps)+gh*(g_palsteps)+bh)]++; + if(histog[int(rh*(g_palsteps*g_palsteps)+gh*(g_palsteps)+bh)]>maxhis){maxhis=histog[int(rh*(g_palsteps*g_palsteps)+gh*(g_palsteps)+bh)];} + } + } + } + } + + int step; + step=0; + for(j=maxhis;j>0;j--){ + for(i=0;i<=4096;i++){ + if(histog[i]==j){ + rh=i/int(g_palsteps*g_palsteps); + gh=i-int(rh*(g_palsteps*g_palsteps));gh=gh/int(g_palsteps); + bh=i-int(rh*(g_palsteps*g_palsteps));bh=bh-int(gh*g_palsteps); + rh=rh*int(palls); + gh=gh*int(palls); + bh=bh*int(palls); + if(step<g_maxcolors){ + makecolor(step,rh,gh,bh);step++; + } + } + } + } + + } + + for (cy=0; cy<MY*erkki; cy++) { + for (cx=0; cx<MX; cx++) { + for (i=0; i<xcolors; i++) { + pixut[i]=0; + idx[i]=i; + } + for (yy=cy*vertti; yy<=cy*vertti+vertti-1; yy++) { + for (xx=cx*8; xx<=cx*8+7; xx=xx+molox) { + fx2=(ww/X)*xx; + fy2=(hh/Y)*yy; + x2=int(fx2); + y2=int(fy2); + rr=0; + gg=0; + bb=0; + avg=0; + for (avy=0; avy<baly; avy++) { + for (avx=0; avx<balx; avx++) { + c=image.get(x2+avx, y2+avy); + rr=rr+int(red(c)); + gg=gg+int(green(c)); + bb=bb+int(blue(c)); + avg++; + } + } + rr=rr/(avg); + gg=gg/(avg); + bb=bb/(avg); + g_farge=0; + target=-1; + compa=9999; + for (i=0; i<xcolors; i++) { + fld=dist(rr, gg, bb, g_r[i], g_g[i], g_b[i]); + if (fld<compa) { + compa=fld; + target=i; + } + } + + g_farge=target; + pixut[target]++;//histogramming + } + } + + for (aas=0; aas<xcolors; aas++) { + for (bbs=0; bbs<=aas; bbs++) { + if (pixut[aas]>pixut[bbs]) { + swap=pixut[aas]; + pixut[aas]=pixut[bbs]; + pixut[bbs]=swap; + swap=idx[aas]; + idx[aas]=idx[bbs]; + idx[bbs]=swap; + } + } + } + + for (idefix=0; idefix<limitter; idefix++) { + i=idx[idefix]; + for (yy=cy*vertti; yy<=cy*vertti+vertti-1; yy++) { + for (xx=cx*8; xx<=cx*8+7; xx=xx+molox) { + + fx2=(ww/X)*xx; + fy2=(hh/Y)*yy; + x2=int(fx2); + y2=int(fy2); + + rr=0; + gg=0; + bb=0; + avg=0; + for (avy=0; avy<baly; avy++) { + for (avx=0; avx<balx; avx++) { + c=image.get(x2+avx, y2+avy); + rr=rr+int(red(c)); + gg=gg+int(green(c)); + bb=bb+int(blue(c)); + avg++; + } + } + rr=rr/(avg); + gg=gg/(avg); + bb=bb/(avg); + g_farge=0; + target=-1; + compa=9999; + for (j=0; j<limitter; j++) { + fld=dist(rr, gg, bb, g_r[idx[j]], g_g[idx[j]], g_b[idx[j]]); + if (fld<compa) { + compa=fld; + target=idx[j]; + } + } + if (i==target) { + + g_farge=target; + makepoint(xx, yy); + } + } + } + if (idefix==0) { + + for (yy=cy*vertti; yy<=cy*vertti+vertti-1; yy++) { + for (xx=cx*8; xx<=cx*8+7; xx=xx+molox) { + g_farge=idx[0]; + makepoint(xx, yy); + } + } + } + } + } + } + +} + +void export_image(String name) +{ + //output the visible graphics as image + //with border + //processing style + int xx, yy, f, x2; + color c; + for (xx=0; xx<output.width; xx++) { + for (yy=0; yy<output.width; yy++) { + c=color(g_r[259], g_g[259], g_b[259]); + output.set(xx, yy, c); + } + } + + for (xx=0; xx<X; xx++) { + for (yy=0; yy<Y; yy++) { + x2=xx; + f=getabsa(x2, yy, 0); + if (g_multic==1||g_hzoomer==2) { + x2=xx/2; + x2=x2*2; + f=getmultic(x2, yy, 0); + } + if (machine==MSX) { + if (f==0) { + f=g_map[1]; + } + } + c=color(g_r[f], g_g[f], g_b[f]); + for (int vertti=0; vertti<=g_omag; vertti++) { + for (int mortti=0; mortti<=g_omag; mortti++) { + output.set((g_bordh*g_omag)/2+xx*g_omag+mortti, (g_bordv*g_omag)/2+yy*g_omag+vertti, c); + } + } + } + } + output.save(name); +} + +void export_image_sans_border(String name) +{ + //output the visible graphics as image + //processing style + //without border + int xx, yy, f, x2; + color c; + + for (xx=0; xx<outputsans.width; xx++) { + for (yy=0; yy<outputsans.width; yy++) { + c=color(g_r[259], g_g[259], g_b[259]); + outputsans.set(xx, yy, c); + } + } + + for (xx=0; xx<X; xx++) { + for (yy=0; yy<Y; yy++) { + x2=xx; + f=getabsa(x2, yy, 0); + if (g_multic==1||g_hzoomer==2) { + x2=xx/2; + x2=x2*2; + f=getmultic(x2, yy, 0); + } + + if (machine==MSX) { + if (f==0) { + f=g_map[1]; + } + } + c=color(g_r[f], g_g[f], g_b[f]); + for (int vertti=0; vertti<=g_omag; vertti++) { + for (int mortti=0; mortti<=g_omag; mortti++) { + outputsans.set(xx*g_omag+mortti, yy*g_omag+vertti, c); + } + } + } + } + outputsans.save(name); +} + +void make_c64_palette() +{ + // Pepto's murky C64 palette: http://www.pepto.de/projects/colorvic + int rgb[]={#000000,#FFFFFF,#68372B,#70A4B2,#6F3D86,#588D43,#352879,#B8C76F, + #6F4F25,#433900,#9A6759,#444444,#6C6C6C,#9AD284,#6C5EB5,#959595}; + for(int i=0;i<g_maxcolors;i++){ + rgb[i]=rgb[i]&0xffffff; + g_grids[i]=rgb[i]+#282828; + makecolor(i,rgb[i]>>16,(rgb[i]�FF00)>>8,rgb[i]�FF); + } + g_grids[1]=#d0d0d0;g_gridmode=NEW; + g_map[13]=byte(C64); +} + +void make_plus4_palette() +{ + int rgb[]={ + #000000,#2C2C2C,#621307,#00424C,#510378,#004E00,#27188E,#303E00,#582100,#463000,#244400,#630448,#004E0C,#0E2784,#33118E,#184800, + #3B3B3B,#702419,#00505A,#601685,#125D00,#36289B,#3F4C00,#663100,#553F00,#345200,#711656,#005C1D,#1F3691,#42229B,#285700, + #424242,#772C21,#055861,#661E8C,#1B6400,#3E30A2,#475400,#6D3900,#5C4700,#3B5900,#771F5D,#046325,#273E98,#492AA1,#305E00, + #515151,#843B31,#17656F,#742E99,#2B7100,#4C3FAF,#556200,#7A4709,#6A5500,#4A6700,#852F6B,#177135,#364CA5,#5739AE,#3F6B00, + #7A7A7A,#AC665C,#468E97,#9C5AC0,#57992E,#766AD5,#7E8A13,#A2713A,#927E20,#748F14,#AC5A93,#459960,#6276CB,#8064D4,#6A9419, + #959595,#C58178,#62A8B1,#B675D9,#73B34C,#9185ED,#99A433,#BB8C57,#AC993E,#8FAA34,#C676AD,#62B37B,#7D91E4,#9B80ED,#85AE38, + #AFAFAF,#DE9B93,#7DC2CA,#CF90F2,#8DCD68,#AB9FFF,#B3BE51,#D5A673,#C6B35B,#A9C351,#DF91C7,#7DCC96,#97ABFD,#B59AFF,#9FC755, + #E1E1E1,#FFCFC6,#B2F4FC,#FFC4FF,#C1FE9D,#DDD2FF,#E5F088,#FFD9A8,#F7E591,#DBF588,#FFC4F9,#B1FEC9,#CBDDFF,#E7CDFF,#D2F98C + }; + for(int i=0;i<g_maxcolors;i++){ + rgb[i]=rgb[i]&0xffffff; + makecolor(i,rgb[i]>>16,(rgb[i]�FF00)>>8,rgb[i]�FF); + } +} + +void make_msx_palette() +{ + int rgb[]={ + #000000, + #000000, + #3EB849, + #74D07D, + #5955E0, + #8076F1, + #B95E51, + #65DBEF, + #DB6559, + #FF897D, + #CCC35E, + #DED087, + #3AA241, + #B766B5, + #CCCCCC, + #FFFFFF}; + + for(int i=0;i<g_maxcolors;i++){ + rgb[i]=rgb[i]&0xffffff; + g_grids[i]=rgb[i]+#1f1f1f; + makecolor(i,(rgb[i]>>16),(rgb[i]�FF00)>>8,rgb[i]�FF); + } + g_grids[5]=#9f95Ff; + g_grids[7]=#84faEF; + g_grids[9]=#ffa99d; + g_grids[15]=#d8d8d8;g_gridmode=NEW; +} + +void make_spectrum_palette() +{ + int rgb[]={#000000,#0000C0,#C00000,#C000C0,#00C000,#00C0C0,#C0C000,#C0C0C0, + #000000,#0000FF,#FF0000,#FF00FF,#00FF00,#00FFFF,#FFFF00,#FFFFFF}; + + g_grids[9]=#0000d8; + g_grids[10]=#d80000; + g_grids[11]=#d800d8; + g_grids[12]=#00d800; + g_grids[13]=#00d8d8; + g_grids[14]=#d8d800; + g_grids[15]=#d8d8d8; + for(int i=0;i<g_maxcolors;i++){ + rgb[i]=rgb[i]&0xffffff; + if(i<=8){g_grids[i]=rgb[i]+#282828;} + makecolor(i,(rgb[i]>>16),(rgb[i]�FF00)>>8,rgb[i]�FF); + } + g_gridmode=NEW; +} + +void set_machine(int m) +{ + machine=m; + g_expname="none"; + g_map[3]=byte(machine);g_map[13]=byte(machine); + g_palsteps=0;g_farge=1;g_backg=0;g_britemode=0; + g_charlimit=0;g_hzoomer=1;g_backmode=0; + g_formatname=""; + g_formatextension=""; + g_maxcolors=16;X=320;Y=200; + + if (machine==C64) {//c64 hires + g_expname="prg"; + g_formatname="Art Studio"; + g_formatextension="art"; + g_name="c64"; + g_attrimode=1; + g_map[1]=byte(255); + g_map[0]=6; + make_c64_palette(); + } + + if (machine==CPC) { //Amstrad CPC mode 0 + g_hzoomer=2; + g_palsteps=3; + g_name="cpc";g_expname="bin"; + g_formatname="";g_formatextension=""; + g_multic=2; + g_attrimode=0; + g_map[1]=byte(255);g_map[0]=1; + + makecolor(0, 0, 0, 0); + makecolor(1, 0x0, 0x0, 0x80); + makecolor(2, 0x00, 0x00, 0xFF); + makecolor(3, 0x80, 0x00, 0x00); + makecolor(4, 0x80, 0x00, 0x80); + makecolor(5, 0x80, 0x00, 0xFF); + makecolor(6, 0xFF, 0x00, 0x00); + makecolor(7, 0xFF, 0x00, 0x80); + makecolor(8, 0xFF, 0x00, 0xFF); + makecolor(9, 0x00, 0x80, 0x00); + makecolor(10, 0x00, 0x80, 0x80); + makecolor(11, 0x00, 0x80, 0xFF); + makecolor(12, 0x80, 0x80, 0x00); + makecolor(13, 0x80, 0x80, 0x80); + makecolor(14, 0x80, 0x80, 0xFF); + makecolor(15, 0xFF, 0xFF, 0xFF); + } + + if (machine==MSX) { // MSX + g_name="msx"; + g_expname="com"; + g_formatname="Screen 2"; + g_formatextension="sc2"; + X=256;Y=192; + g_attrimode=0; + g_backmode=1; + g_farge=15; + g_backg=0; + + //TI99 variant + /* + makecolor(0,0,0,0); + makecolor(1,0,0,0); + + makecolor(2,0x21,0xc8,0x42); //21c842 medgreen + makecolor(3,0x5e,0xdc,0x78);//5edc78 light green + makecolor(4,0x54,0x55,0xed);//5455ed dark blue + makecolor(5,0x7d,0x76,0xFc);//7d76fc light blue + + makecolor(6,0xd4,0x52,0x4d); //d4524d dark red + makecolor(7,0x42,0xeb,0xf5); //42ebf5 cyan + makecolor(8,0xfc,0x55,0x54); //fc5554 medium red + makecolor(9,0xff,0x79,0x78); //ff7978 light red + makecolor(10,0xd4,0xc1,0x54);// d4c154 dark yellow + makecolor(11,0xe6,0xce,0x80);// e6ce80 light yellow + makecolor(12,0x21,0xb0,0x3b);// 21b03b dark green + makecolor(13,0xc9,0x5b,0xba);// c95bba magenta + makecolor(14,0xCc,0xcc,0xCc);// gray + makecolor(15,0xFF,0xFF,0xFF); + */ + make_msx_palette(); + } + + if (machine==SPECTRUM) { // ZX Spectrum + g_name="spec"; + g_expname="tap"; + X=256;Y=192; + g_formatname="Screen$";g_formatextension="scr"; + g_farge=7; + g_backg=0; + g_attrimode=1; + g_britemode=1; + g_map[0]=1; + g_map[1]=byte(255); + make_spectrum_palette(); + } + + if (machine==TIMEX) { // timex sinclair + g_name="tmx"; + X=256;Y=192; + g_farge=7; + g_backg=0; + g_attrimode=0; + g_britemode=1; + g_map[1]=byte(255); + make_spectrum_palette(); + } + + if (machine==JR200) { // Panasonic JR200 + g_name="jr200"; + X=256;Y=192; + g_maxcolors=8; + g_farge=7; + g_backg=0; + g_attrimode=1; + g_map[1]=byte(255); + make_spectrum_palette();//cheating + } + + if (machine==PLUS4M||machine==PLUS4) { // Commodore plus/4 + g_backmode=1; + g_multic=1; + g_name="plus4m";g_expname="prg"; + g_attrimode=1; + g_maxcolors=121; + g_charlimit=2; + g_map[1]=0;g_map[2]=61;g_farge=61; + g_formatname="M.Botticelli";g_formatextension="prg"; + if (machine==PLUS4) { // plus/4 hires + g_formatname="Botticelli";g_formatextension="prg"; + g_multic=0; + g_backmode=0; + g_charlimit=0; + g_name="plus4"; + g_attrimode=1; + g_map[1]=byte(255); + } + g_map[0]=6; + make_plus4_palette(); + } + + if (machine==C64M) { //c64 multicolor + g_backmode=1; + g_charlimit=3; + g_multic=1; + g_name="c64m";g_expname="prg"; + g_formatname="A. A. Studio"; + g_formatextension="ocp"; + g_attrimode=1; + g_map[1]=byte(0); + g_map[0]=6; + make_c64_palette(); + } + + if (machine==AMIGA) { //generic 16bit + g_backmode=1; + g_maxcolors=32;g_palsteps=16; + g_name="test"; + g_multic=2; + g_attrimode=2; + g_map[1]=byte(0); + for (int z=0; z<g_maxcolors; z++) { + if (z<16) { + makecolor(z, z*17, z*17, z*17); + } else + { + makecolor(z, (z-16)*17, 0, 0); + } + } + } + + if (machine==C64FLI) { //c64 hires FLI = AFLI + g_expname="prg"; + g_formatname="";g_formatextension=""; + g_name="afli"; + g_attrimode=0; + g_map[1]=byte(255); + g_map[0]=6; + make_c64_palette(); + } + + if (machine==C64FLIM) { //C64 FLI multicolor + g_hzoomer=2; + g_maxcolors=16; + g_name="fli";g_expname=""; + g_formatname="";g_formatextension=""; + g_multic=2; + g_attrimode=0; + g_map[1]=byte(255); + g_map[0]=6; + make_c64_palette(); + } + + if (machine==FAKEX) { // Fake 8-bit computer + g_name="fake"; + g_expname=""; + g_formatname=""; + g_formatextension=""; + X=320;Y=200; + g_multic=2; + g_attrimode=2;//g_palsteps=4; + g_farge=15; + g_backg=0; + make_c64_palette(); + } + + if (machine==PICO8) { // Pico-8 fantasy console + g_name="pico8"; + g_expname=""; + g_formatname=""; + g_formatextension=""; + X=128;Y=128; + g_farge=15; + g_backg=0; + g_multic=2; + g_attrimode=2; + makecolor(0, 0, 0, 0); + makecolor(1, 32, 51, 123); + makecolor(2, 126, 37, 83); + makecolor(3, 0, 144, 61); + makecolor(4, 171, 82, 54); + makecolor(5, 52, 54, 53); + makecolor(6, 194, 195, 199); + makecolor(7, 255, 241, 232); + makecolor(8, 255, 0, 77); + makecolor(9, 255, 155, 0); + makecolor(10, 255, 231, 39); + makecolor(11, 0, 226, 50); + makecolor(12, 41, 173, 255); + makecolor(13, 132, 112, 169); + makecolor(14, 255, 119, 168); + makecolor(15, 255, 214, 197); + } + if (machine==UNIA) { // Unia digital palette + g_name="unia"; + g_expname=""; + g_formatname=""; + g_formatextension=""; + X=256;Y=192; + g_farge=15; + g_backg=0; + g_multic=2; + g_attrimode=2; + makecolor(0, 0, 0 , 0); + makecolor(1, 0xff, 0xff, 0xff); + makecolor(2, 0xff, 0xfd, 0x38); + makecolor(3, 0xff, 0xc5, 0x00); + makecolor(4, 0xff, 0x00, 0x00); + makecolor(5, 0xff, 0x3c, 0xb4); + makecolor(6, 0xa0, 0x23, 0xbc); + makecolor(7, 0x1b, 0xa1, 0xfc); + makecolor(8, 0xe1, 0xe1, 0xe1); + makecolor(9, 0xb9, 0x63, 0x00); + makecolor(10, 0xff, 0xaa, 0xbe); + makecolor(11, 0xd2, 0x9b, 0xd7); + makecolor(12, 0xad, 0xad, 0xad); + makecolor(13, 0x00, 0xb7, 0xb7); + makecolor(14, 0x23, 0xaf, 0x32); + makecolor(15, 0x29, 0xf7, 0xa7); + } +} + +void packer() +{ + int i, dat, amo; + int head; + amo=1; + i=0; + head=0; + //0=repeated element [n repetitions, element length, element] + //1-255=repeat byte [element] + + while (i<=g_map.length-3) { + dat=int(g_map[i]); + while (int (g_map[i+1])==dat&&i<=g_map.length-3) { + if (int(g_map[i+1])==dat) { + if (amo<65535) { + amo++; + i++; + } + if (amo==65535) { + //pask[head]=dat;pask[head+1]=255; + println(dat+" x "+amo); + head=head+3; + amo=0; + } + } + } + println(dat+" x "+amo); + amo=0; + // pask[head]=dat;pask[head+1]=amo; + head++; + head++; + head++; + i++; + } + println(head); + + for (i=0; i<=g_map.length; i++) { + } + message("Packing|test|"+str(head)); +} +