changeset 127:4cebbee4b29b

More work on source export.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 12 Jul 2018 22:33:07 +0300
parents d2b8166fa2a5
children 3f48c23c7987
files exporters.pde
diffstat 1 files changed, 112 insertions(+), 97 deletions(-) [+]
line wrap: on
line diff
--- a/exporters.pde	Thu Jul 12 14:35:42 2018 +0300
+++ b/exporters.pde	Thu Jul 12 22:33:07 2018 +0300
@@ -30,8 +30,9 @@
         m_byteDef = ".byte";
         m_src = "";
         m_eol = "\n";
+
+        m_intmode = 0;
         m_prefix = "";
-        m_intmode = 1;
     }
 
     void setOffs(int offs)
@@ -64,35 +65,28 @@
         return m_src;
     }
 
+    String getHexValue(int dval, int dlen)
+    {
+        static final String mpHexChars[16] = "0123456789abcdef";
+        char[] dstr = new char[dlen];
+
+        for (i = dlen - 1; i >= 0; i--)
+        {
+            dstr[i] = mpHexChars[dval & 0x0f];
+            dval >>= 4;
+        }
+
+        return new String(dstr.join(''));
+    }
+
     String getByteStr(int val)
     {
         switch (m_intmode)
         {
             case 0: return str(val & 0xff);
-        }
-    }
-
-    boolean changeState(int nstate)
-    {
-        boolean changed = (nstate != m_state);
-        if (changed && m_state != -1)
-        {
-            m_src += m_eol;
+            case 1: return "$"+ getHexValue(val & 0xff, 2);
+            case 2: return getHexValue(val & 0xff, 2) +"h";
         }
-
-        m_state = nstate;
-        return changed;
-    }
-
-    void addEOL()
-    {
-        changeState(4);
-        m_src += m_eol;
-    }
-
-    void addByteSep()
-    {
-        m_src += ",";
     }
 
     void addIndent()
@@ -101,9 +95,20 @@
             m_src += " ";
     }
 
-    void addByteDef(boolean nl)
+    void addByteSep()
+    {
+        m_src += ",";
+    }
+
+    void addEOL()
     {
-        if (!nl)
+        m_state = 4;
+        m_src += m_eol;
+    }
+
+    void addByteDef(boolean force)
+    {
+        if (m_state != 2 || force)
         {
             m_src += m_eol;
             addIndent();
@@ -116,20 +121,29 @@
 
     void addLabel(String blabel, boolean nl)
     {
-        changeState(3);
+        if (m_state != 3)
+            addEOL();
+
         m_src += m_prefix + blabel +":"+ (nl ? " " : "");
+        m_state = 3;
     }
 
     void addComment(String bstr)
     {
-        changeState(4);
+        if (m_state != 4)
+            addEOL();
+
         m_src += "; "+ bstr + m_eol;
+        m_state = 4;
     }
 
     void addLine(String bstr)
     {
-        changeState(4);
-        m_src += bstr + m_eol;
+        if (m_state != 4)
+            addEOL();
+
+        m_src += bstr.replace("@@", m_prefix) + m_eol;
+        m_state = 4;
     }
 
     void writeByte(int bval, String blabel)
@@ -139,17 +153,18 @@
         if (blabel != null)
         {
             addLabel(blabel, true);
-            addByteDef(true);
+            m_state = 2;
+            addByteDef(false);
             m_src += getByteStr(bval);
             m_src += m_eol;
         }
         else
         {
-            if (changeState(2))
+            if (m_state != 2)
                 addByteDef(true);
             else
             if (m_bpl > 0 && m_bytes > m_bpl)
-                addByteDef(false);
+                addByteDef(true);
 
             if (m_bytes++ > 0)
                 addByteSep();
@@ -598,12 +613,12 @@
     if (machine == PLUS4M) { //PLUS4 MULTICOLOR
         ctx.loadTemplate("showpfourm.prg");
 
-        ctx.addLine(".global _bitmap");
-        ctx.addLine(".global _color1");
-        ctx.addLine(".global _color2");
-        ctx.addLine(".global _border");
-        ctx.addLine(".global _back1");
-        ctx.addLine(".global _back2");
+        ctx.addLine(".global @@_bitmap");
+        ctx.addLine(".global @@_color1");
+        ctx.addLine(".global @@_color2");
+        ctx.addLine(".global @@_border");
+        ctx.addLine(".global @@_back1");
+        ctx.addLine(".global @@_back2");
 
         ctx.addLabel("_bitmap");
         ctx.setOffs(0x013e);
@@ -650,24 +665,26 @@
     if (machine == PLUS4) { // Plus 4 hires
         ctx.loadTemplate("showpfour.prg");
 
-        ctx.addLine(".global _bitmap");
-        ctx.addLine(".global _color");
-        ctx.addLine(".global _lumi");
-        ctx.addLine(".global _border");
+        ctx.addLine(".global @@_bitmap");
+        ctx.addLine(".global @@_color");
+        ctx.addLine(".global @@_lumi");
+        ctx.addLine(".global @@_border");
 
         ctx.setOffs(0x0137);
+        ctx.addLabel("_bitmap");
         mpExportBitmapData(ctx, 40, 25);
 
         val1 = getpluscolor(int(g_map[0]));
         val2 = getplusluminance(int(g_map[0]));
         val3 = val2 * 16 + val1;
-        ctx.setOffs(0x2077);
-        ctx.writeByte(val3); //border
+        ctx.writeByteAt(0x2077, val3, "_border"); //border
 
         ctx.setOffs(0x2078);
+        ctx.addLabel("_color");
         mpExportColorData(ctx, 40, 25, 65536, 4); //colors
 
         ctx.setOffs(0x2460);
+        ctx.addLabel("_lumi");
         mpExportColorData(ctx, 40, 25, 65536, 5); //lumis
 
         //plus4 hires
@@ -680,7 +697,7 @@
     if (machine == MSX) { // MSX
         ctx.loadTemplate("msxshow.com");
 
-        ctx.addLine(".globl _bitmap,_nimi2");
+        ctx.addLine(".globl @@_bitmap,@@_nimi2");
         ctx.addLine(".area _CODE");
 
         ctx.setOffs(0x00f9);
@@ -705,75 +722,72 @@
         //would need some cleaning up
 
         //  ctx.addLine(".area  _DATA");
-        //  ctx.addLine(".globl _taustakuva");
+        //  ctx.addLine(".globl @@_taustakuva");
         //  ctx.addLabel("_taustakuva");
         ctx.loadTemplate("specshow.tap");
 
         int checksum = 0xc9;
-        for (y = 0x1d24; y <= 0x1d3d; y++) { //1d3e
+        for (y = 0x1d24; y < 0x1d3e; y++)
+        {
             checksum = checksum ^ int(g_template[y]);
         }
 
         //TAP requires fiddling with the checksum
         //println("Checksum:"+hex(checksum,2));
-        ctx.addLabel("paske");
-        ctx.writeByteAt(0x0223, g_map[0]);
+        ctx.writeByteAt(0x0223, g_map[0], "_something1");
         checksum = checksum ^ int(g_map[0]);
 
-        ctx.addLabel("jottain");
+        ctx.addLabel("_something2");
+        ctx.setBPL(32);
         for (int y = 0; y <= 2; y++)
         for (int y2 = 0; y2 < 8; y2++)
         for (int yy = 0; yy < 8; yy++)
+        for (int x = 0; x < 32; x++)
         {
-            for (int x = 0; x < 32; x++)
-            {
-                int 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;
+            int 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;
 
-                ctx.writeByte(valu);
-                checksum = checksum ^ int(valu);
-            }
+            ctx.writeByte(valu);
+            checksum = checksum ^ int(valu);
         }
 
-        ctx.addLabel("attributes");
+        ctx.addLabel("_attributes");
         for (int y = 0; y < 24; y++)
+        for (int x = 0; x < 32; x++)
         {
-            for (int x = 0; x < 32; x++)
-            {
-                int ad = 65536 + x + y * 256,
-                    valu = int(g_map[ad]),
-                    valu2 = int(g_map[ad + MX * MY * 8]),
-                    bri = 0;
+            int 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 (valu >= 8)
+            {
+                bri = 1;
+                valu = valu - 8;
+                valu2 = valu2 - 8;
+                if (valu2 <= 0) {
+                    valu2 = 0;
                 }
-                if (bri == 1) {
-                    valu = valu + 64;
-                }
+            }
+            if (bri == 1) {
+                valu = valu + 64;
+            }
 
-                ctx.writeByte(valu + valu2 * 8);
-                checksum = checksum ^ int(valu + valu2 * 8);
-            }
+            ctx.writeByte(valu + valu2 * 8);
+            checksum = checksum ^ int(valu + valu2 * 8);
         }
+        ctx.setBPLOff();
 
-        //println("checksum:"+hex(checksum,2));
-        ctx.writeByteAt(0x1d3e, int(checksum));
+        ctx.writeByteAt(0x1d3e, int(checksum), "_checksum");
     }
     else
     if (machine == CPC) {
@@ -786,7 +800,7 @@
 
         //fixed # of palette entries, just trying to be generic
         ctx.setOffs(16453);
-        ctx.setBPL(g_maxcolors - 1);
+        ctx.setBPL(32);
         ctx.addLabel("_palette");
         for (int i = 0; i < g_maxcolors; i++)
         {
@@ -794,7 +808,7 @@
             val2 = int(g_r[i] / (256 / g_palsteps));
             val3 = int(g_b[i] / (256 / g_palsteps));
 
-            ctx.writeByte(ctx, val1 * 9 + val2 * 3 + val3);
+            ctx.writeByte(val1 * 9 + val2 * 3 + val3);
         }
         ctx.setBPLOff();
 
@@ -815,6 +829,7 @@
     else
         return false;
 
+    ctx.addEOL();
     return true;
 }
 
@@ -825,11 +840,11 @@
     int pix0b0, pix0b1, pix0b2, pix0b3;
     int pix1b0, pix1b1, pix1b2, pix1b3;
 
-    ctx.setBPL(xwid / 2);
+    ctx.setBPL(32);
 
     for (y2 = 0; y2 < 8; y2++)
     {
-        ctx.addByteDef();
+        ctx.addByteDef(true);
 
         for (y = 0; y < 25; y++)
         for (x = 0; x < int(xwid / 2); x++)
@@ -862,7 +877,7 @@
             ctx.writeByte(val2);
         }
 
-        ctx.addByteDef();
+        ctx.addByteDef(true);
         for (int j = 0; j <= 47; j++)
             ctx.writeByte(0);
     }
@@ -878,7 +893,7 @@
         ywid = yy * 8;
 
     ctx.setBPL(32);
-    ctx.addByteDef();
+    ctx.addByteDef(true);
 
     for (int y = 0; y < yy; y++)
     for (int x = 0; x < xx; x++)
@@ -969,7 +984,7 @@
 
     for (int yc = 0; yc < height; yc++)
     {
-        ctx.addByteDef();
+        ctx.addByteDef(true);
         for (int xc = 0; xc < width; xc++)
         for (int yline = 0; yline <= myrpsi; yline++)
         {