/* Project 16 Source Code~\r
- * Copyright (C) 2012-2015 sparky4 & pngwen & andrius4669\r
+ * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123\r
*\r
* This file is part of Project 16.\r
*\r
const int px=x+page->dx;\r
const int py=y+page->dy;\r
const int prw = rw/4;\r
+ int prh;\r
\r
//fine tuning\r
rx+=1;\r
//^^;\r
#define PEEE rx-prw\r
#define PE (p->pwidth)\r
- #define PEEEE (PE*(ry))\r
+ if(rh<p->height) prh = (PE*(ry-4));\r
+ else if(rh==p->height) prh = (PE*(ry));\r
y=py;\r
x=px;\r
//printf("%d,%d p(%d,%d) r(%d,%d) rwh(%d,%d)\n", x, y, px, py, rx, ry, rw, rh);\r
for(plane=0; plane < 4; plane++) {\r
- i=PEEE+PEEEE;\r
+ i=PEEE+prh;\r
modexSelectPlane(PLANE(plane-1));\r
for(; y < py+rh; y++) {\r
_fmemcpy(page->data + (((page->width/4) * (y)) + ((x) / 4)), &(p->plane[plane][i]), prw);\r
JNZ PLANE_LOOP ; do all 4 planes\r
}\r
}\r
+\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
+ /* 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
+ }\r
+}\r