X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fmodex16%2F16render.c;h=77598fa55ee14c9616bfbdff3d5b206b29719459;hb=e3ac78ae7ba30101e388236f6312a04c79a94c35;hp=91820e8e246d8fbaa67a0bccafe1ec2577deede9;hpb=81a89657d4c71baad7e1a6c65c166fcca6af8bf8;p=16.git diff --git a/src/lib/modex16/16render.c b/src/lib/modex16/16render.c index 91820e8e..77598fa5 100755 --- a/src/lib/modex16/16render.c +++ b/src/lib/modex16/16render.c @@ -1,5 +1,5 @@ /* Project 16 Source Code~ - * Copyright (C) 2012-2015 sparky4 & pngwen & andrius4669 + * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 * * This file is part of Project 16. * @@ -435,36 +435,39 @@ modexDrawSpritePBufRegion(page_t *page, int x, int y, } } -void modexDrawCharPBuf(page_t *page, int x, int y, word t, word col, word bgcol, boolean q) +void modexDrawChar(page_t *page, int x/*for planar selection only*/, word t, word col, word bgcol, word addr) { - word i, j, k; - for(i=0; idata + (((page->width/4) * (y+i)) + ((x+romFontsData.chw+k) / 4)), - romFontsData.l[i] & j ? - col:bgcol, 2); - //modexputPixel(page, x+xp+chw, y+i, l[i] & j ? col:bgcol); - else - //printf("l[i]=%c j=%02u l[i] & j=%02u %c\n", l[i] , j, l[i] & j, l[i] & j ? '*':' '); - //printf("%c", l[i] & j ? '*':' '); - romFontsData.z[k]=romFontsData.l[i] & j ? '*':' '; - j>>=1; - k++; + /* vertical drawing routine by joncampbell123. + * + * optimize for VGA mode X planar memory to minimize the number of times we do I/O write to map mask register. + * so, we enumerate over columns (not rows!) to draw every 4th pixel. bit masks are used because of the font bitmap. + * + * 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. */ + word rows = romFonts[t].charSize; + word drawaddr; + word colm, row; + byte fontbyte; + byte plane; + byte m1,m2; + + plane = x & 3; + m1 = 0x80; // left half + m2 = 0x08; // right half + for (colm=0;colm < 4;colm++) { + drawaddr = addr; + modexSelectPlane(PLANE(plane)); + for (row=0;row < rows;row++) { + fontbyte = romFontsData.l[row]; + vga_state.vga_graphics_ram[drawaddr ] = (fontbyte & m1) ? col : bgcol; + vga_state.vga_graphics_ram[drawaddr+1] = (fontbyte & m2) ? col : bgcol; + drawaddr += page->width >> 2; } - if(!q) - { - for(k=0;k<9;k++) - { - printf("%c", romFontsData.z[k]); - } - printf("\n"); + + m1 >>= 1; + m2 >>= 1; + if ((++plane) == 4) { + addr++; + plane = 0; } } - romFontsData.chw += k; }