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]&#00FF00)>>8,rgb[i]&#0000FF);
+    }
+    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]&#00FF00)>>8,rgb[i]&#0000FF);
+    }
+}
+
+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]&#00FF00)>>8,rgb[i]&#0000FF);
+    }
+    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]&#00FF00)>>8,rgb[i]&#0000FF);
+    }
+    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));
+}
+