X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fmodex16.c;h=3bf65ee40fa12bc96c404d3b1b7cfb21bd26e38f;hb=2bc6e98511fbe156f4ec68b1b7dbc7c8c03f866f;hp=f303ecf412749fe49ec268da5aeaaa8233cc91ff;hpb=d2f92009f1d0cc3cf375c7d068a332190f350071;p=16.git diff --git a/src/lib/modex16.c b/src/lib/modex16.c index f303ecf4..3bf65ee4 100644 --- a/src/lib/modex16.c +++ b/src/lib/modex16.c @@ -1,11 +1,32 @@ +/* Project 16 Source Code~ + * Copyright (C) 2012-2015 sparky4 & pngwen & andrius4669 + * + * This file is part of Project 16. + * + * Project 16 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Project 16 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see , or + * write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + #include #include #include #include #include #include -#include "src\lib\modex16.h" - +#include "src/lib/modex16.h" byte far* VGA=(byte far*) 0xA0000000; /* this points to video memory. */ @@ -91,6 +112,7 @@ modexDefaultPage() { page.dy = 0; page.width = SCREEN_WIDTH; page.height = SCREEN_HEIGHT; + page.id = 0; return page; } @@ -107,6 +129,23 @@ modexNextPage(page_t *p) { result.dy = 0; result.width = p->width; result.height = p->height; + result.id = p->id+1; + + return result; +} + +//next page with defined dimentions~ +page_t +modexNextPage0(page_t *p, word x, word y) +{ + page_t result; + + result.data = p->data + (p->width/4)*p->height; /* compute the offset */ + result.dx = 0; + result.dy = 0; + result.width = x; + result.height = y; + result.id = p->id+1; return result; } @@ -138,7 +177,7 @@ modexShowPage(page_t *page) { outp(CRTC_DATA, crtcOffset); /* wait for one retrace */ - while (!(inp(INPUT_STATUS_1) & VRETRACE)); + while (!(inp(INPUT_STATUS_1) & VRETRACE)); /* do PEL panning here */ outp(AC_INDEX, 0x33); @@ -215,6 +254,28 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) { } +void +oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite) +{ + byte plane; + word px, py; + word offset; + + /* TODO Make this fast. It's SLOOOOOOW */ + for(plane=0; plane < 4; plane++) { + modexSelectPlane(PLANE(plane+x)); + for(px = plane; px < bmp->width; px+=4) { + offset=px; + for(py=0; pyheight; py++) { + if(!sprite || bmp->data[offset]) + page[PAGE_OFFSET(x+px, y+py)] = bmp->data[offset]; + offset+=bmp->width; + } + } + } +} + + void modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp) { /* draw the region (the entire freakin bitmap) */ @@ -253,7 +314,7 @@ modexDrawBmpRegion(page_t *page, int x, int y, ;-- begin plane painting MOV AX, height ; start the row counter - MOV rowCounter, AX ; + MOV rowCounter, AX ; MOV DI, poffset ; go to the first pixel MOV SI, bmpOffset ; go to the bmp pixel ROW_LOOP: @@ -333,7 +394,7 @@ modexDrawSpriteRegion(page_t *page, int x, int y, ;-- begin plane painting MOV AX, height ; start the row counter - MOV rowCounter, AX ; + MOV rowCounter, AX ; MOV DI, poffset ; go to the first pixel MOV SI, bmpOffset ; go to the bmp pixel ROW_LOOP: @@ -481,7 +542,7 @@ fadePalette(sbyte fade, sbyte start, word iter, byte *palette) { /* handle the case where we just update */ if(iter == 0) { - modexPalUpdate2(palette); + modexPalUpdate1(palette); return; } @@ -494,7 +555,7 @@ fadePalette(sbyte fade, sbyte start, word iter, byte *palette) { tmppal[i] = 63; } } - modexPalUpdate2(tmppal); + modexPalUpdate1(tmppal); iter--; dim += fade; } @@ -591,19 +652,15 @@ modexPalWhite() { /* utility */ void -modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqpp) +modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset) { -//---- static word count=0; byte *p = bmp->palette; word w=0; word q=0; word qq=0; - word ii; - static word a[PAL_SIZE/3]; - word z=0, aq=0, aa=0, pp=0, apee=0; - sword aqpw; + static word a[PAL_SIZE]; //palette array of change values! + word z=0, aq=0, aa=0, pp=0; - //printf("1 (*i)=%02d\n", (*i)/3); modexWaitBorder(); if((*i)==0) { @@ -621,7 +678,6 @@ modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqpp) // printf("q: %02d\n", (q)); // printf("qq: %02d\n", (qq)); //printf(" (*i)-q=%02d\n", (*i)-q); -// printf("================\n"); outp(PAL_WRITE_REG, qq); /* start at the beginning of palette */ } if((*i)0)&&((*i)-q)%3==0 && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) outp(PAL_DATA_REG, p[(*i)-q]); else - if(((((*i)-q)%3==0) || ((qp>0)&&((*i)-(bmp->offset*3))%3==0)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) + if(((((*i)-q)%3==0)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) { - if(q>0) - { -/* (*i)-=(aqpp*3); - aqpw=aqpp-1; - outp(PAL_WRITE_REG, qq+(((*i)+(aqpw*3)-(bmp->offset*3))/3)); - for(ii=aqpp; ii>0; ii--) - { - outp(PAL_DATA_REG, p[((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3))-(bmp->offset*3))]); - outp(PAL_DATA_REG, p[((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3)+1)-(bmp->offset*3))]); - outp(PAL_DATA_REG, p[((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3)+2)-(bmp->offset*3))]);*/ - printf("%d's color=%d\n", (*i)/3, ((*i)-(bmp->offset*3))); - printf("%d's color2=%d\n", (*i)/3, ((*i)-(bmp->offset*3))-(aqpp*3)); -// printf("position = %d\n", qq+(((*i)+(aqpw*3)-(bmp->offset*3))/3)); -/*if(qp>0){ //printf("[%d]", p[((*i)-q)]); printf("[%d]", p[((*i)-q)+1]); printf("[%d]", p[((*i)-q)+2]); printf("[%d]", p[((*i)-q)+3]); printf("[%d]", p[((*i)-q)+4]); printf("[%d]", p[((*i)-q)+5]); printf(" %d [%d]\n", (*i), p[((*i)-q)]); } -printf("[%d]", p[((((*i)+((aqpp-ii)*3)))-(bmp->offset*3))]); -printf("[%d]", p[((((*i)+((aqpp-ii)*3))+1)-(bmp->offset*3))]); -printf("[%d] | ", p[((((*i)+((aqpp-ii)*3))+2)-(bmp->offset*3))]); -printf("[%d]", p[((((*i)+((aqpp-ii)*3))+3)-(bmp->offset*3))]); -printf("[%d]", p[((((*i)+((aqpp-ii)*3))+4)-(bmp->offset*3))]); -printf("[%d]", p[((((*i)+((aqpp-ii)*3))+5)-(bmp->offset*3))]); -printf(" %d [%d]\n",((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3))-(bmp->offset*3))/3, p[((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3))-(bmp->offset*3))]); }*/ - //printf("%d\n", ((*i)+((ii)*3))/3); - //printf("ii=%d\n", ii); - //printf("aqpp=%d\n", aqpp); - //printf(" %d\n", ((*i)+((aqpp-ii)*3))/3); -// } - //printf(" %d\n",((((*i)+((aqpp-ii)*3)))-(bmp->offset*3))); - //printf(" %d\n",((((*i)+((aqpp-ii)*3))+1)-(bmp->offset*3))); - //printf(" %d\n",((((*i)+((aqpp-ii)*3))+2)-(bmp->offset*3))); - printf(" (*i)=%d\n", (*i)/3); - } - //if(q>0) printf("%d\n", (*i)/3); - //printf("[%d]", p[((*i)-q)]); printf("[%d]", p[((*i)-q)+1]); printf("[%d]", p[((*i)-q)+2]); printf("[%d]", p[((*i)-q)+3]); printf("[%d]", p[((*i)-q)+4]); printf("[%d]", p[((*i)-q)+5]); printf(" %d [%d]\n", (*i), p[((*i)-q)]); w++; break; } + else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3)) + { + //printf("qp=%d\n", qp); + //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]); + printf(" %d's color=%d\n", (*i), (a[qp])-(bmp->offset*3)+qp); + //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit! + if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; } + } else { if(bmp->offset==0 && (*i)<3 && q==0) outp(PAL_DATA_REG, 0); else if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]); - else outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3))]); + else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]); + printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); } } } + //if(qp>0) printf("qp=%d\n", qp); + //if(qp>0) printf(" (*i)=%d\n", (*i)/3); } modexWaitBorder(); /* waits one retrace -- less flicker */ if((*i)>=PAL_SIZE/2 && w==0) @@ -683,54 +717,30 @@ printf(" %d [%d]\n",((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3))-(bmp->offset*3))/3, p[ for(; (*i)0)&&((*i)-q)%3==0 && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) outp(PAL_DATA_REG, p[(*i)-q]); else - if(((((*i)-q)%3==0) || ((qp>0)&&((*i)-(bmp->offset*3))%3==0)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) + if(((((*i)-q)%3==0)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) { - if(q>0) - { -/* (*i)-=(aqpp*3); - aqpw=aqpp-1; - outp(PAL_WRITE_REG, qq+(((*i)+(aqpw*3)-(bmp->offset*3))/3)); - for(ii=aqpp; ii>0; ii--) - { - outp(PAL_DATA_REG, p[((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3))-(bmp->offset*3))]); - outp(PAL_DATA_REG, p[((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3)+1)-(bmp->offset*3))]); - outp(PAL_DATA_REG, p[((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3)+2)-(bmp->offset*3))]);*/ - printf("%d's color=%d\n", (*i)/3, ((*i)-(bmp->offset*3))); - printf("%d's color2=%d\n", (*i)/3, ((*i)-(bmp->offset*3))-(aqpp*3)); -// printf("position = %d\n", qq+(((*i)+(aqpw*3)-(bmp->offset*3))/3)); -/*if(qp>0){ //printf("[%d]", p[((*i)-q)]); printf("[%d]", p[((*i)-q)+1]); printf("[%d]", p[((*i)-q)+2]); printf("[%d]", p[((*i)-q)+3]); printf("[%d]", p[((*i)-q)+4]); printf("[%d]", p[((*i)-q)+5]); printf(" %d [%d]\n", (*i), p[((*i)-q)]); } -printf("[%d]", p[((((*i)+((aqpp-ii)*3)))-(bmp->offset*3))]); -printf("[%d]", p[((((*i)+((aqpp-ii)*3))+1)-(bmp->offset*3))]); -printf("[%d] | ", p[((((*i)+((aqpp-ii)*3))+2)-(bmp->offset*3))]); -printf("[%d]", p[((((*i)+((aqpp-ii)*3))+3)-(bmp->offset*3))]); -printf("[%d]", p[((((*i)+((aqpp-ii)*3))+4)-(bmp->offset*3))]); -printf("[%d]", p[((((*i)+((aqpp-ii)*3))+5)-(bmp->offset*3))]); -printf(" %d [%d]\n",((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3))-(bmp->offset*3))/3, p[((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3))-(bmp->offset*3))]); }*/ - //printf("%d\n", ((*i)+((ii)*3))/3); - //printf("ii=%d\n", ii); - //printf("aqpp=%d\n", aqpp); - //printf(" %d\n", ((*i)+((aqpp-ii)*3))/3); -// } - //printf(" %d\n",((((*i)+((aqpp-ii)*3)))-(bmp->offset*3))); - //printf(" %d\n",((((*i)+((aqpp-ii)*3))+1)-(bmp->offset*3))); - //printf(" %d\n",((((*i)+((aqpp-ii)*3))+2)-(bmp->offset*3))); - printf(" (*i)=%d\n", (*i)/3); - } - //if(q>0) printf("%d\n", (*i)/3); - //printf("[%d]", p[((*i)-q)]); printf("[%d]", p[((*i)-q)+1]); printf("[%d]", p[((*i)-q)+2]); printf("[%d]", p[((*i)-q)+3]); printf("[%d]", p[((*i)-q)+4]); printf("[%d]", p[((*i)-q)+5]); printf(" %d [%d]\n", (*i), p[((*i)-q)]); w++; break; } + else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3)) + { + //printf("qp=%d\n", qp); + //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]); + printf(" %d's color=%d\n", (*i), (a[qp]-(bmp->offset*3)+qp)); + //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit! + if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; } + } else { if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]); - else outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3))]); + else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]); + printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); } } } + //printf(" (*i)=%d\n", (*i)/3); } -// if(q>0) -// printf("2 (*i)=%02d\n", (*i)/3); +printf("\nqqqqqqqq\n\n"); //palette checker~ if(q>0 && qp==0) @@ -740,27 +750,35 @@ printf(" %d [%d]\n",((((*i)+((aqpp-ii)*3))+((aqpp+ii)*3))-(bmp->offset*3))/3, p[ pp = q; //printf("1(*i)=%02d\n", (*i)/3); //printf("1z=%02d\n", z/3); - chkcolor(bmp, &q, &a, &aa, &z, i, &aqpp); + chkcolor(bmp, &q, &a, &aa, &z, i); //printf("2(*i)=%02d\n", (*i)/3); //printf("2z=%02d\n", z/3); - aq=0; aqpee: while(aq<=aa) { // printf("a[%02d]=(%d)\n", aq, a[aq]); if(a[aq]==-1) aq++; - else{ apee++; break; } + else { aqoffset++; break; } } - - //printf("(*i) =%02d\n", (*i)/3); - //printf("z =%02d\n", z/3); - //if(aqoffset for this spot! + NO! wwww + */ + + /* + Facking bloody point the values of the changed palette to correct values.... major confusion! wwww + */ + + //(offset/bmp->offset)*bmp->offset + + + //printf("%02d ",bmp->data[lq]+bmp->offset); + //if(lq > 0 && lq%bmp->width==0) printf("\n"); //printf("%02d_", bmp->data[lq]+bmp->offset); /*if(bmp->data[lq]+bmp->offset==aq) { @@ -790,18 +808,18 @@ aqpee: } //printf(" aq=%02d\n", aq); -//printf(" aa=%02d\n", aa);/ +//printf(" aa=%02d\n", aa); //update the palette~ - modexPalUpdate(bmp, &pp, 1, aqpp); + modexPalUpdate(bmp, &pp, aq, aqoffset); (*i)=pp; - if(aq