+/* Project 16 Source Code~\r
+ * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
+ *\r
+ * This file is part of Project 16.\r
+ *\r
+ * Project 16 is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * Project 16 is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>, or\r
+ * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
+ * Fifth Floor, Boston, MA 02110-1301 USA.\r
+ *\r
+ */\r
+\r
+#include "src/lib/16_vlpal.h"\r
+\r
+void VL_palette(bitmap_t *bmp, word *i, word qp, word aqoffset)\r
+{\r
+ byte *p = bmp->palette;\r
+ word w=0;\r
+ word q=0;\r
+ word qq=0;\r
+ static word a[PAL_SIZE]; //palette array of change values!\r
+ word z=0, aq=0, aa=0, pp=0;\r
+\r
+ //modexWaitBorder();\r
+ vga_wait_for_vsync();\r
+ if((*i)==0)\r
+ {\r
+ memset(a, -1, sizeof(a));\r
+ outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */\r
+ }\r
+ else if(qp==0)\r
+ {\r
+ q=(*i);\r
+ }\r
+ else\r
+ {\r
+ q=(*i);\r
+ qq=(*i)/3;\r
+// printf("q: %02d\n", (q));\r
+// printf("qq: %02d\n", (qq));\r
+ //printf(" (*i)-q=%02d\n", (*i)-q);\r
+ outp(PAL_WRITE_REG, qq); /* start at the beginning of palette */\r
+ }\r
+ if((*i)<PAL_SIZE/2 && w==0)\r
+ {\r
+ for(; (*i)<PAL_SIZE/2; (*i)++)\r
+ {\r
+ //if(i%3==0 && (p[i+5]==p[i+4] && p[i+4]==p[i+3] && p[i+3]==p[i+2] && p[i+2]==p[i+1] && p[i+1]==p[i] && p[i+5]==p[i]))\r
+//____ if((qp>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\r
+ 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]))\r
+ {\r
+ w++;\r
+ break;\r
+ }\r
+ else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))\r
+ {\r
+ //printf("qp=%d\n", qp);\r
+ //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);\r
+ printf(" %d's color=%d\n", (*i), (a[qp])-(bmp->offset*3)+qp);\r
+ //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!\r
+ if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }\r
+ }\r
+ else\r
+ {\r
+ if(bmp->offset==0 && (*i)<3 && q==0) outp(PAL_DATA_REG, 0);\r
+ else\r
+ if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);\r
+ else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);\r
+ printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }\r
+ }\r
+ }\r
+ //if(qp>0) printf("qp=%d\n", qp);\r
+ //if(qp>0) printf(" (*i)=%d\n", (*i)/3);\r
+ }\r
+ //modexWaitBorder(); /* waits one retrace -- less flicker */\r
+ vga_wait_for_vsync();\r
+ if((*i)>=PAL_SIZE/2 && w==0)\r
+ {\r
+ for(; (*i)<PAL_SIZE; (*i)++)\r
+ {\r
+//____ if((qp>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\r
+ 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]))\r
+ {\r
+ w++;\r
+ break;\r
+ }\r
+ else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))\r
+ {\r
+ //printf("qp=%d\n", qp);\r
+ //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);\r
+ printf(" %d's color=%d\n", (*i), (a[qp]-(bmp->offset*3)+qp));\r
+ //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!\r
+ if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }\r
+ }\r
+ else\r
+ {\r
+ if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);\r
+ else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);\r
+ printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }\r
+ }\r
+ }\r
+ //printf(" (*i)=%d\n", (*i)/3);\r
+ }\r
+\r
+printf("\nqqqqqqqq\n\n");\r
+\r
+ //palette checker~\r
+ if(q>0 && qp==0)\r
+ {\r
+ long lq;\r
+ long bufSize = (bmp->width * bmp->height);\r
+ pp = q;\r
+ //printf("1(*i)=%02d\n", (*i)/3);\r
+ //printf("1z=%02d\n", z/3);\r
+ modexchkcolor(bmp, &q, &a, &aa, &z, i);\r
+ //printf("2(*i)=%02d\n", (*i)/3);\r
+ //printf("2z=%02d\n", z/3);\r
+ aq=0;\r
+aqpee:\r
+ while(aq<=aa)\r
+ {\r
+// printf("a[%02d]=(%d)\n", aq, a[aq]);\r
+ if(a[aq]==-1) aq++;\r
+ else { aqoffset++; break; }\r
+ }\r
+//update the image data here!\r
+ for(lq=0; lq<bufSize; lq++)\r
+ {\r
+ /*\r
+ note to self\r
+ use a[qp] instead of bmp->offset for this spot!\r
+ NO! wwww\r
+ */\r
+\r
+ /*\r
+ Facking bloody point the values of the changed palette to correct values.... major confusion! wwww\r
+ */\r
+\r
+ //(offset/bmp->offset)*bmp->offset\r
+\r
+\r
+ //printf("%02d ",bmp->data[lq]+bmp->offset);\r
+ //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
+ //printf("%02d_", bmp->data[lq]+bmp->offset);\r
+ /*if(bmp->data[lq]+bmp->offset==aq)\r
+ {\r
+ //printf("%02d", bmp->data[lq]);\r
+ //printf("\n%02d\n", bmp->offset);\r
+ printf("aq=%02d ", aq);\r
+ printf("a[aq]=%02d ", a[aq]);\r
+ printf("a[aq]+aqpp=%02d ", a[aq]+aqpp);\r
+ printf("a[aq]-aqpp=%02d\n", a[aq]-aqpp);\r
+ //bmp->data[lq]=((bmp->data[lq]+bmp->offset)-a[aq]);\r
+//++++ bmp->data[lq]=a[aq]-aqpp;\r
+// printf("_%d ", bmp->data[lq]);\r
+ //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
+ }\r
+ else if(bmp->data[lq]+bmp->offset < ((*i)/3)-aqpp)\r
+ {\r
+ if(bmp->data[lq]+bmp->offset >= aq)\r
+ {\r
+ bmp->data[lq]=(bmp->data[lq]+bmp->offset)-aqpp;//-((z-(*i))/3);\r
+ //printf("_%d ", bmp->data[lq]+bmp->offset)-aqpp-((z-(*i))/3);\r
+ }\r
+ else bmp->data[lq]+=(bmp->offset-aqpp);\r
+ }*/\r
+\r
+ //printf("%02d`", bmp->data[lq]);\r
+ //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
+ }\r
+\r
+//printf(" aq=%02d\n", aq);\r
+//printf(" aa=%02d\n", aa);\r
+\r
+ //update the palette~\r
+ VL_palette(bmp, &pp, aq, aqoffset);\r
+ (*i)=pp;\r
+\r
+ if(aq<aa){ pp=q; aq++; goto aqpee; }\r
+ }\r
+}\r