]> 4ch.mooo.com Git - 16.git/commitdiff
let's show Sparky4 what I mean by vertical column font rendering.
authorJonathan Campbell <jonathan@castus.tv>
Sun, 17 Apr 2016 05:29:15 +0000 (22:29 -0700)
committerJonathan Campbell <jonathan@castus.tv>
Sun, 17 Apr 2016 05:29:15 +0000 (22:29 -0700)
this code should demonstrate what I mean about minimizing our writes to
the map mask register and using arithmetic to step from byte to byte.
at least in DOSBox-X, the characters appear much faster now.

pcx2vrl
pcxsscut
src/lib/modex16.c
src/lib/modex16.h
src/lib/modex16/16render.c
vrl2vrs
vrsdump

diff --git a/pcx2vrl b/pcx2vrl
index 3d9ac6e6d0e4fe19bb8f1962de5fd02253dea7be..06179c758ee3353a54ef7bc76b2422c342d53dd7 100755 (executable)
Binary files a/pcx2vrl and b/pcx2vrl differ
index d743ac3b8ac58a73b3cb2380e2367aee9b167169..2ce56d285d26ddb8a30e5f7bf2839df2bde1fa75 100755 (executable)
Binary files a/pcxsscut and b/pcxsscut differ
index 4e7004e11279d509de1b58c97c818c66d0c1287b..bada2e67972d951ea48fdacbe96bbda4b969b5b8 100755 (executable)
@@ -914,7 +914,8 @@ void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, cons
                JNZ L1\r
        }\r
 //TODO: OPTIMIZE THIS!!!!\r
-               modexDrawCharPBuf(page, x, y, t, col, bgcol, addrq);\r
+               modexDrawCharPBuf(page, x/*for mode X planar use*/, y/*redunant, remove*/, t, col, bgcol, addrq);\r
+               addrq += 2; /* move 8 pixels over (2 x 4 planar pixels per byte) */\r
 \r
                //if(!q) getch();\r
        }\r
index c1c45252a336de6ef0d286a25f07963c2e78e151..f85eb055a2de9b60b47e8d9a0c7faecc4248a4ce 100755 (executable)
@@ -71,7 +71,7 @@ static struct pcxHeader {
 
 /* -========================== Types & Macros ==========================- */
 #define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))
-#define PLANE(x) (1<< (x&3))
+#define PLANE(x) (1 << ((x) & 3))
 #define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)
 #define     PALSIZE            768
 
@@ -149,6 +149,8 @@ void modexPalOverscan(byte *p, word col);
 void modexchkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/);
 void modexputPixel(page_t *page, int x, int y, byte color);
 byte modexgetPixel(page_t *page, int x, int y);
+
+#if 0 // not needed anymore. maybe good for reference purposes though.
 static inline void modexwritepixel(page_t *page, int x, int y, word addr, byte color)
 {
        /* Each address accesses four neighboring pixels, so set
@@ -172,6 +174,8 @@ static inline byte modexreadPixel(page_t *page, int x, int y, word addr)
        outpw(GC_INDEX+1, x & 3);
        return vga_state.vga_graphics_ram[addr];
 }
+#endif
+
 void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str);
 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str);
 void modexpdump(page_t *pee);
index fe78022d9fec20d6872d03377ab91358cd269ea2..8e6fa43624cd41be40f3b0b7fbd4ffbdb7809f53 100755 (executable)
@@ -435,34 +435,38 @@ modexDrawSpritePBufRegion(page_t *page, int x, int y,
     }\r
 }\r
 \r
-void modexDrawCharPBuf(page_t *page, int x, int y, word t, word col, word bgcol, word addr)\r
+void modexDrawCharPBuf(page_t *page, int x/*for planar selection only*/, int y/*redundant, remove*/, word t, word col, word bgcol, word addr)\r
 {\r
-       word i, j, k;\r
-       for(i=0; i<romFonts[t].charSize; i++)\r
-       {\r
-               j=1<<8;\r
-               k=0;\r
-               //every "pixel" row\r
-               while(j)\r
-               {\r
-//                     if(q)\r
-                       //_fmemcpy(page->data + (((page->width/4) * (y+i)) + ((x+romFontsData.chw+k) / 4)), romFontsData.l[i] & j ? col:bgcol, 2);\r
-                       modexwritepixel(page, x+k+romFontsData.chw, y+i, addr, romFontsData.l[i] & j ? col:bgcol);\r
-//                     else\r
-                               //printf("l[i]=%c j=%02u l[i] & j=%02u %c\n", l[i] , j, l[i] & j, l[i] & j ? '*':' ');\r
-                               //printf("%c", l[i] & j ? '*':' ');\r
-//                             romFontsData.z[k]=romFontsData.l[i] & j ? '*':' ';\r
-                       j>>=1;\r
-                       k++;\r
+       /* vertical drawing routine by joncampbell123.\r
+        *\r
+        * optimize for VGA mode X planar memory to minimize the number of times we do I/O write to map mask register.\r
+        * so, we enumerate over columns (not rows!) to draw every 4th pixel. bit masks are used because of the font bitmap.\r
+        * \r
+        * NTS: addr defines what VGA memory address we use, "x" is redundant except to specify which of the 4 pixels we select in the map mask register. */\r
+       word drawaddr;\r
+       word colm, row;\r
+       byte fontbyte;\r
+       byte plane;\r
+       byte m1,m2;\r
+\r
+       plane = x & 3;\r
+       m1 = 0x80; // left half\r
+       m2 = 0x08; // right half\r
+       for (colm=0;colm < 4;colm++) {\r
+               drawaddr = addr;\r
+               modexSelectPlane(PLANE(plane));\r
+               for (row=0;row < 8;row++) {\r
+                       fontbyte = romFontsData.l[row];\r
+                       vga_state.vga_graphics_ram[drawaddr  ] = (fontbyte & m1) ? col : bgcol;\r
+                       vga_state.vga_graphics_ram[drawaddr+1] = (fontbyte & m2) ? col : bgcol;\r
+                       drawaddr += page->width >> 2;\r
+               }\r
+\r
+               m1 >>= 1;\r
+               m2 >>= 1;\r
+               if ((++plane) == 4) {\r
+                       addr++;\r
+                       plane = 0;\r
                }\r
-//             if(!q)\r
-//             {\r
-//                     for(k=0;k<9;k++)\r
-//                     {\r
-//                             printf("%c", romFontsData.z[k]);\r
-//                     }\r
-//                     printf("\n");\r
-//             }\r
        }\r
-       romFontsData.chw += k;\r
 }\r
diff --git a/vrl2vrs b/vrl2vrs
index acdd4bda2f0dd8772cdce97a19b6c906e4e09f8e..cee2d1d5ec2093825ded51e0e6c9b8b836e38ee9 100755 (executable)
Binary files a/vrl2vrs and b/vrl2vrs differ
diff --git a/vrsdump b/vrsdump
index 8ba0497deb819d75caeef21a3a0d4086b394845b..a75a903a84ae3d98973e3aecab4a6c08fce8a764 100755 (executable)
Binary files a/vrsdump and b/vrsdump differ