1 /* Project 16 Source Code~
\r
2 * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669
\r
4 * This file is part of Project 16.
\r
6 * Project 16 is free software; you can redistribute it and/or modify
\r
7 * it under the terms of the GNU General Public License as published by
\r
8 * the Free Software Foundation; either verson 3 of the License, or
\r
9 * (at your option) any later version.
\r
11 * Project 16 is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License
\r
17 * along with this program. If not, see <http://www.gnu.org/licenses/>, or
\r
18 * write to the Free Software Foundation, Inc., 51 Franklin Street,
\r
19 * Fifth Floor, Boston, MA 02110-1301 USA.
\r
26 #include "src/lib/modex16.h"
\r
28 byte far* VGA=(byte far*) 0xA0000000; /* this points to video memory. */
\r
30 static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette);
\r
31 static byte tmppal[PAL_SIZE];
\r
33 /////////////////////////////////////////////////////////////////////////////
\r
35 // setvideo() - This function Manages the video modes //
\r
37 /////////////////////////////////////////////////////////////////////////////
\r
38 void VGAmodeX(sword vq, byte cm, global_game_variables_t *gv)
\r
44 case 0: // deinit the video
\r
45 // change to the video mode we were in before we switched to mode 13h
\r
48 in.h.al = gv->video.old_mode;
\r
49 int86(0x10, &in, &out);
\r
51 default: // init the video
\r
52 // get old video mode
\r
54 //int86(0x10, &in, &out);
\r
55 gv->video.old_mode = vgaGetMode();//out.h.al;
\r
57 modexEnter(vq, cm, gv);
\r
63 vgaSetMode(byte mode)
\r
67 regs.h.ah = SET_MODE;
\r
69 int86(VIDEO_INT, ®s, ®s);
\r
72 //---------------------------------------------------
\r
74 // Use the bios to get the current video mode
\r
83 int86(VIDEO_INT, &rg, &rg);
\r
88 /* -========================= Entry Points ==========================- */
\r
90 modexEnter(sword vq, boolean cm, global_game_variables_t *gv)
\r
93 dword far*ptr=(dword far*)VGA; /* used for faster screen clearing */
\r
95 /* common mode X initiation stuff~ */
\r
96 modexsetBaseXMode(gv->video.page);
\r
101 CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]);
\r
102 /* width and height */
\r
103 gv->video.page[0].sw=320;
\r
104 gv->video.page[0].sh=240;
\r
106 /* send the CRTParms */
\r
107 for(i=0; i<CRTParmCount; i++) {
\r
108 outpw(CRTC_INDEX, ModeX_320x240regs[i]);
\r
112 CRTParmCount = sizeof(ModeX_160x120regs) / sizeof(ModeX_160x120regs[0]);
\r
113 /* width and height */
\r
114 gv->video.page[0].sw=120;
\r
115 gv->video.page[0].sh=160;
\r
117 /* send the CRTParms */
\r
118 for(i=0; i<CRTParmCount; i++) {
\r
119 outpw(CRTC_INDEX, ModeX_160x120regs[i]);
\r
123 CRTParmCount = sizeof(ModeX_320x200regs) / sizeof(ModeX_320x200regs[0]);
\r
124 /* width and height */
\r
125 gv->video.page[0].sw=320;
\r
126 gv->video.page[0].sh=200;
\r
128 /* send the CRTParms */
\r
129 for(i=0; i<CRTParmCount; i++) {
\r
130 outpw(CRTC_INDEX, ModeX_320x200regs[i]);
\r
134 CRTParmCount = sizeof(ModeX_192x144regs) / sizeof(ModeX_192x144regs[0]);
\r
135 /* width and height */
\r
136 gv->video.page[0].sw=192;
\r
137 gv->video.page[0].sh=144;
\r
139 /* send the CRTParms */
\r
140 for(i=0; i<CRTParmCount; i++) {
\r
141 outpw(CRTC_INDEX, ModeX_192x144regs[i]);
\r
145 CRTParmCount = sizeof(ModeX_256x192regs) / sizeof(ModeX_256x192regs[0]);
\r
146 /* width and height */
\r
147 gv->video.page[0].sw=256;
\r
148 gv->video.page[0].sh=192;
\r
150 /* send the CRTParms */
\r
151 for(i=0; i<CRTParmCount; i++) {
\r
152 outpw(CRTC_INDEX, ModeX_256x192regs[i]);
\r
157 /* clear video memory */
\r
161 /* clear video memory */
\r
162 outpw(SC_INDEX, 0x0f02);
\r
163 for(i=0; i<0x8000; i++) {
\r
168 gv->video.page[0].tilesw = gv->video.page[0].sw/TILEWH;
\r
169 gv->video.page[0].tilesh = gv->video.page[0].sh/TILEWH;
\r
170 //TODO MAKE FLEXIBLE~
\r
171 gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw;
\r
172 gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1;
\r
173 #define PAGE_SIZE (word)(gv->video.page[0].sw/4 * gv->video.page[0].sh)
\r
178 /* TODO restore original mode and palette */
\r
179 vgaSetMode(TEXT_MODE);
\r
182 // setBaseXMode() does the initialization to make the VGA ready to
\r
183 // accept any combination of configuration register settings. This
\r
184 // involves enabling writes to index 0 to 7 of the CRT controller (port
\r
185 // 0x3D4), by clearing the most significant bit (bit 7) of index 0x11.
\r
187 modexsetBaseXMode(page_t *page)
\r
190 /* TODO save current video mode and palette */
\r
191 vgaSetMode(VGA_256_COLOR_MODE);
\r
193 /* disable chain4 mode */
\r
194 outpw(SC_INDEX, 0x0604);
\r
196 /* synchronous reset while setting Misc Output */
\r
197 outpw(SC_INDEX, 0x0100);
\r
199 /* select 25 MHz dot clock & 60 Hz scanning rate */
\r
200 outp(MISC_OUTPUT, 0xe3);
\r
202 /* undo reset (restart sequencer) */
\r
203 outpw(SC_INDEX, 0x0300);
\r
205 /* reprogram the CRT controller */
\r
206 outp(CRTC_INDEX, 0x11); /* VSync End reg contains register write prot */
\r
207 // temp = inp(CRTC_DATA) & 0x7F;
\r
208 // outp(CRTC_INDEX, 0x11);
\r
209 outp(CRTC_DATA, 0x7f); /* get current write protect on varios regs */
\r
210 // outp(CRTC_DATA, temp); /* get current write protect on varios regs */
\r
214 modexDefaultPage(page_t *p)
\r
218 /* default page values */
\r
224 page.width = p->sw;
\r
225 page.height = p->sh;
\r
226 page.tw = page.sw/TILEWH;
\r
227 page.th = page.sh/TILEWH;
\r
228 page.tilemidposscreenx = page.tw/2;
\r
229 page.tilemidposscreeny = (page.th/2)+1;
\r
230 page.tilesw=p->tilesw;
\r
231 page.tilesh=p->tilesh;
\r
232 //pageSize = p->sw*p->sh;
\r
238 /* returns the next page in contiguous memory
\r
239 * the next page will be the same size as p, by default
\r
242 modexNextPage(page_t *p) {
\r
245 result.data = p->data + (p->width/4)*p->height;
\r
248 result.width = p->width;
\r
249 result.height = p->height;
\r
250 result.tw = p->width/TILEWH;
\r
251 result.th = p->height/TILEWH;
\r
252 result.id = p->id+1;
\r
255 // return modexNextPageFlexibleSize(&p, p->width, p->height);
\r
258 //next page with defined dimentions~
\r
260 modexNextPageFlexibleSize(page_t *p, word x, word y)
\r
264 result.data = p->data + (p->width/4)*p->height; /* compute the offset */
\r
269 result.tw = p->width/TILEWH;
\r
270 result.th = p->height/TILEWH;
\r
271 result.id = p->id+1;
\r
278 modexShowPage(page_t *page) {
\r
284 /* calculate offset */
\r
285 offset = (word) page->data;
\r
286 offset += page->dy * (page->width >> 2 );
\r
287 offset += page->dx >> 2;
\r
289 /* calculate crtcOffset according to virtual width */
\r
290 crtcOffset = page->width >> 3;
\r
292 high_address = HIGH_ADDRESS | (offset & 0xff00);
\r
293 low_address = LOW_ADDRESS | (offset << 8);
\r
295 /* wait for appropriate timing and then program CRTC */
\r
296 while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));
\r
297 outpw(CRTC_INDEX, high_address);
\r
298 outpw(CRTC_INDEX, low_address);
\r
299 outp(CRTC_INDEX, 0x13);
\r
300 outp(CRTC_DATA, crtcOffset);
\r
302 /* wait for one retrace */
\r
303 while (!(inp(INPUT_STATUS_1) & VRETRACE));
\r
305 /* do PEL panning here */
\r
306 outp(AC_INDEX, 0x33);
\r
307 outp(AC_INDEX, (page->dx & 0x03) << 1);
\r
312 modexPanPage(page_t *page, int dx, int dy) {
\r
319 modexSelectPlane(byte plane) {
\r
320 outp(SC_INDEX, MAP_MASK); /* select plane */
\r
321 outp(SC_DATA, plane);
\r
326 modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) {
\r
327 word pageOff = (word) page->data;
\r
328 word xoff=x/4; /* xoffset that begins each row */
\r
329 word scanCount=w/4; /* number of iterations per row (excluding right clip)*/
\r
330 word poffset = pageOff + y*(page->width/4) + xoff; /* starting offset */
\r
331 word nextRow = page->width/4-scanCount-1; /* loc of next row */
\r
332 byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */
\r
333 byte rclip[] = {0x00, 0x01, 0x03, 0x07};
\r
334 byte left = lclip[x&0x03];
\r
335 byte right = rclip[(x+w)&0x03];
\r
337 /* handle the case which requires an extra group */
\r
338 if((x & 0x03) && !((x+w) & 0x03)) {
\r
343 MOV AX, SCREEN_SEG ; go to the VGA memory
\r
345 MOV DI, poffset ; go to the first pixel
\r
346 MOV DX, SC_INDEX ; point to the map mask
\r
350 MOV AL, color ; get ready to write colors
\r
352 MOV CX, scanCount ; count the line
\r
353 MOV BL, AL ; remember color
\r
354 MOV AL, left ; do the left clip
\r
355 OUT DX, AL ; set the left clip
\r
356 MOV AL, BL ; restore color
\r
357 STOSB ; write the color
\r
359 JZ SCAN_DONE ; handle 1 group stuff
\r
361 ;-- write the main body of the scanline
\r
362 MOV BL, AL ; remember color
\r
363 MOV AL, 0x0f ; write to all pixels
\r
365 MOV AL, BL ; restore color
\r
366 REP STOSB ; write the color
\r
368 MOV BL, AL ; remeber color
\r
370 OUT DX, AL ; do the right clip
\r
371 MOV AL, BL ; restore color
\r
372 STOSB ; write pixel
\r
373 ADD DI, nextRow ; go to the next row
\r
379 /* moved to src/lib/modex16/16render.c */
\r
381 /* copy a region of video memory from one page to another.
\r
382 * It assumes that the left edge of the tile is the same on both
\r
383 * regions and the memory areas do not overlap.
\r
386 modexCopyPageRegion(page_t *dest, page_t *src,
\r
389 word width, word height)
\r
391 word doffset = (word)dest->data + dy*(dest->width/4) + dx/4;
\r
392 word soffset = (word)src->data + sy*(src->width/4) + sx/4;
\r
393 word scans = width/4;
\r
394 word nextSrcRow = src->width/4 - scans - 1;
\r
395 word nextDestRow = dest->width/4 - scans - 1;
\r
396 byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */
\r
397 byte rclip[] = {0x0f, 0x01, 0x03, 0x07};
\r
398 byte left = lclip[sx&0x03];
\r
399 byte right = rclip[(sx+width)&0x03];
\r
402 MOV AX, SCREEN_SEG ; work in the vga space
\r
407 MOV DX, GC_INDEX ; turn off cpu bits
\r
411 MOV AX, SC_INDEX ; point to the mask register
\r
421 MOV CX, scans ; the number of latches
\r
423 MOV AL, left ; do the left column
\r
428 MOV AL, 0fh ; do the inner columns
\r
430 REP MOVSB ; copy the pixels
\r
432 MOV AL, right ; do the right column
\r
437 MOV AX, SI ; go the start of the next row
\r
438 ADD AX, nextSrcRow ;
\r
441 ADD AX, nextDestRow ;
\r
444 DEC height ; do the rest of the actions
\r
447 MOV DX, GC_INDEX+1 ; go back to CPU data
\r
448 MOV AL, 0ffh ; none from latches
\r
454 /* fade and flash */
\r
456 modexFadeOn(word fade, byte *palette) {
\r
457 fadePalette(-fade, 64, 64/fade+1, palette);
\r
462 modexFadeOff(word fade, byte *palette) {
\r
463 fadePalette(fade, 0, 64/fade+1, palette);
\r
468 modexFlashOn(word fade, byte *palette) {
\r
469 fadePalette(fade, -64, 64/fade+1, palette);
\r
474 modexFlashOff(word fade, byte *palette) {
\r
475 fadePalette(-fade, 0, 64/fade+1, palette);
\r
480 fadePalette(sbyte fade, sbyte start, word iter, byte *palette) {
\r
484 /* handle the case where we just update */
\r
486 modexPalUpdate1(palette);
\r
490 while(iter > 0) { /* FadeLoop */
\r
491 for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */
\r
492 tmppal[i] = palette[i] - dim;
\r
493 if(tmppal[i] > 127) {
\r
495 } else if(tmppal[i] > 63) {
\r
499 modexPalUpdate1(tmppal);
\r
506 /* save and load */
\r
508 modexPalSave(byte *palette) {
\r
511 outp(PAL_READ_REG, 0); /* start at palette entry 0 */
\r
512 for(i=0; i<PAL_SIZE; i++) {
\r
513 palette[i] = inp(PAL_DATA_REG); /* read the palette data */
\r
521 ptr = malloc(PAL_SIZE);
\r
523 /* handle errors */
\r
525 printf("Could not allocate palette.\n");
\r
534 modexLoadPalFile(byte *filename, byte **palette) {
\r
538 /* free the palette if it exists */
\r
543 /* allocate the new palette */
\r
544 *palette = modexNewPal();
\r
546 /* open the file */
\r
547 file = fopen(filename, "rb");
\r
549 printf("Could not open palette file: %s\n", filename);
\r
553 /* read the file */
\r
555 while(!feof(file)) {
\r
556 *ptr++ = fgetc(file);
\r
564 modexSavePalFile(char *filename, byte *pal) {
\r
568 /* open the file for writing */
\r
569 file = fopen(filename, "wb");
\r
571 printf("Could not open %s for writing\n", filename);
\r
575 /* write the data to the file */
\r
576 fwrite(pal, 1, PAL_SIZE, file);
\r
584 fadePalette(-1, 64, 1, tmppal);
\r
590 fadePalette(-1, -64, 1, tmppal);
\r
596 modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset)
\r
598 byte *p = bmp->palette;
\r
602 static word a[PAL_SIZE]; //palette array of change values!
\r
603 word z=0, aq=0, aa=0, pp=0;
\r
608 memset(a, -1, sizeof(a));
\r
609 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
619 // printf("q: %02d\n", (q));
\r
620 // printf("qq: %02d\n", (qq));
\r
621 //printf(" (*i)-q=%02d\n", (*i)-q);
\r
622 outp(PAL_WRITE_REG, qq); /* start at the beginning of palette */
\r
624 if((*i)<PAL_SIZE/2 && w==0)
\r
626 for(; (*i)<PAL_SIZE/2; (*i)++)
\r
628 //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
629 //____ 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
630 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
635 else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))
\r
637 //printf("qp=%d\n", qp);
\r
638 //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);
\r
639 printf(" %d's color=%d\n", (*i), (a[qp])-(bmp->offset*3)+qp);
\r
640 //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!
\r
641 if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }
\r
645 if(bmp->offset==0 && (*i)<3 && q==0) outp(PAL_DATA_REG, 0);
\r
647 if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);
\r
648 else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);
\r
649 printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }
\r
652 //if(qp>0) printf("qp=%d\n", qp);
\r
653 //if(qp>0) printf(" (*i)=%d\n", (*i)/3);
\r
655 modexWaitBorder(); /* waits one retrace -- less flicker */
\r
656 if((*i)>=PAL_SIZE/2 && w==0)
\r
658 for(; (*i)<PAL_SIZE; (*i)++)
\r
660 //____ 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
661 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
666 else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))
\r
668 //printf("qp=%d\n", qp);
\r
669 //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);
\r
670 printf(" %d's color=%d\n", (*i), (a[qp]-(bmp->offset*3)+qp));
\r
671 //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!
\r
672 if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }
\r
676 if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);
\r
677 else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);
\r
678 printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }
\r
681 //printf(" (*i)=%d\n", (*i)/3);
\r
684 printf("\nqqqqqqqq\n\n");
\r
690 long bufSize = (bmp->width * bmp->height);
\r
692 //printf("1(*i)=%02d\n", (*i)/3);
\r
693 //printf("1z=%02d\n", z/3);
\r
694 chkcolor(bmp, &q, &a, &aa, &z, i);
\r
695 //printf("2(*i)=%02d\n", (*i)/3);
\r
696 //printf("2z=%02d\n", z/3);
\r
701 // printf("a[%02d]=(%d)\n", aq, a[aq]);
\r
702 if(a[aq]==-1) aq++;
\r
703 else { aqoffset++; break; }
\r
705 //update the image data here!
\r
706 for(lq=0; lq<bufSize; lq++)
\r
710 use a[qp] instead of bmp->offset for this spot!
\r
715 Facking bloody point the values of the changed palette to correct values.... major confusion! wwww
\r
718 //(offset/bmp->offset)*bmp->offset
\r
721 //printf("%02d ",bmp->data[lq]+bmp->offset);
\r
722 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
723 //printf("%02d_", bmp->data[lq]+bmp->offset);
\r
724 /*if(bmp->data[lq]+bmp->offset==aq)
\r
726 //printf("%02d", bmp->data[lq]);
\r
727 //printf("\n%02d\n", bmp->offset);
\r
728 printf("aq=%02d ", aq);
\r
729 printf("a[aq]=%02d ", a[aq]);
\r
730 printf("a[aq]+aqpp=%02d ", a[aq]+aqpp);
\r
731 printf("a[aq]-aqpp=%02d\n", a[aq]-aqpp);
\r
732 //bmp->data[lq]=((bmp->data[lq]+bmp->offset)-a[aq]);
\r
733 //++++ bmp->data[lq]=a[aq]-aqpp;
\r
734 // printf("_%d ", bmp->data[lq]);
\r
735 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
737 else if(bmp->data[lq]+bmp->offset < ((*i)/3)-aqpp)
\r
739 if(bmp->data[lq]+bmp->offset >= aq)
\r
741 bmp->data[lq]=(bmp->data[lq]+bmp->offset)-aqpp;//-((z-(*i))/3);
\r
742 //printf("_%d ", bmp->data[lq]+bmp->offset)-aqpp-((z-(*i))/3);
\r
744 else bmp->data[lq]+=(bmp->offset-aqpp);
\r
747 //printf("%02d`", bmp->data[lq]);
\r
748 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
751 //printf(" aq=%02d\n", aq);
\r
752 //printf(" aa=%02d\n", aa);
\r
754 //update the palette~
\r
755 modexPalUpdate(bmp, &pp, aq, aqoffset);
\r
758 if(aq<aa){ pp=q; aq++; goto aqpee; }
\r
763 modexPalUpdate1(byte *p)
\r
767 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
768 for(i=0; i<PAL_SIZE/2; i++)
\r
770 outp(PAL_DATA_REG, p[i]);
\r
772 modexWaitBorder(); /* waits one retrace -- less flicker */
\r
773 for(; i<PAL_SIZE; i++)
\r
775 outp(PAL_DATA_REG, p[(i)]);
\r
780 modexPalUpdate0(byte *p)
\r
784 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
785 for(i=0; i<PAL_SIZE/2; i++)
\r
787 outp(PAL_DATA_REG, rand());
\r
789 modexWaitBorder(); /* waits one retrace -- less flicker */
\r
790 for(; i<PAL_SIZE; i++)
\r
792 outp(PAL_DATA_REG, rand());
\r
797 modexPalOverscan(byte *p, word col)
\r
800 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
801 outp(PAL_DATA_REG, col);
\r
805 //i want to make another vesion that checks the palette when the palette is being appened~
\r
806 void chkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/)
\r
810 pal = modexNewPal();
\r
812 //printf("q: %02d\n", (*q));
\r
813 printf("chkcolor start~\n");
\r
814 printf("1 (*z): %d\n", (*z)/3);
\r
815 printf("1 (*i): %d\n", (*i)/3);
\r
816 // printf("1 offset of color in palette (*q): %d\n", (*q)/3);
\r
817 printf("wwwwwwwwwwwwwwww\n");
\r
818 //check palette for dups
\r
819 for(; (*z)<PAL_SIZE; (*z)+=3)
\r
821 //printf("\n z: %d\n", (*z));
\r
822 //printf(" q: %d\n", (*q));
\r
823 //printf(" z+q: %d\n\n", ((*z)+(*q)));
\r
826 //---- if(pal[(*z)]==pal[(*z)+3] && pal[(*z)+1]==pal[(*z)+4] && pal[(*z)+2]==pal[(*z)+5])
\r
829 // printf("\n%d [%02d][%02d][%02d]\n", (*z), pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
830 // printf("%d [%02d][%02d][%02d]\n\n", (*z)+3, pal[(*z)+3], pal[(*z)+4], pal[(*z)+5]);
\r
834 else for(zz=0; zz<(*q); zz+=3)
\r
836 //printf("zz: %02d\n", zz/3);
\r
839 if(pal[((*z)+(*q))]==pal[((*z)+(*q))+3] && pal[((*z)+(*q))+1]==pal[((*z)+(*q))+4] && pal[((*z)+(*q))+2]==pal[((*z)+(*q))+5]) //break if duplicate colors found in palette because it have reached the end of the current data of the palette
\r
843 // printf("\nzq1:%d[%02d][%02d][%02d]\n", (zz+q), pal[(zz+q)], pal[(zz+q)+1], pal[(zz+q)+2]);
\r
844 // printf("zq2:%d[%02d][%02d][%02d]\n\n", (zz+q)+3, pal[(zz+q)+3], pal[(zz+q)+4], pal[(zz+q)+5]);
\r
847 else if(pal[zz]==pal[((*z)+(*q))] && pal[zz+1]==pal[((*z)+(*q))+1] && pal[zz+2]==pal[((*z)+(*q))+2])
\r
849 // printf("\n\nwwwwwwwwwwwwwwww\n");
\r
850 // printf(" zq: %d [%02d][%02d][%02d] value that is needing to be changed~\n", ((*z)+(*q))/3, pal[((*z)+(*q))], pal[((*z)+(*q))+1], pal[((*z)+(*q))+2]);
\r
851 // printf(" zz: %d [%02d][%02d][%02d] value that the previous value is going to change to~\n", (zz)/3, pal[zz], pal[zz+1], pal[zz+2]);
\r
852 // //printf(" zv: %d [%02d][%02d][%02d] wwww\n", (zz-z+q)/3, pal[(zz-z+q)], pal[(zz-z+q)+1], pal[(zz-z+q)+2]);
\r
853 // printf(" z : %d [%02d][%02d][%02d] offset value~\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
858 planned features that i plan to implement~
\r
859 image that has values on the pallete list!
\r
861 no... wait.... no wwww
\r
863 //for(zzii=0; zzii<3; zzii++)
\r
865 //printf("z+q: %d\n\n", ((*z)+(*q)));
\r
866 a[(((*z)+(*q)))]=zz;
\r
868 (*aa)=(((*z)+(*q)));
\r
869 printf("!! a[%02d]: %d\n", (((*z)+(*q))/3), zz/3);
\r
870 // printf("\n aa: %d\n\n", (*aa));
\r
871 // printf(" a[%02d]=(%02d) offset array i think the palette should be updated again~\n", ((*z)+(*q))/3, a[((*z)+(*q))/3]);
\r
872 // printf("wwwwwwwwwwwwwwww\n\n");
\r
876 printf("================\n");
\r
877 printf("zq: %d [%02d][%02d][%02d]\n", ((*z)+(*q))/3, pal[((*z)+(*q))], pal[((*z)+(*q))+1], pal[((*z)+(*q))+2]);
\r
878 printf("zz: %d [%02d][%02d][%02d]\n", (zz)/3, pal[zz], pal[zz+1], pal[zz+2]);
\r
879 printf("z : %d [%02d][%02d][%02d]\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
880 printf("================\n");
\r
882 //printf("[%d]", (zz+q));
\r
886 printf("wwwwwwwwwwwwwwww\n");
\r
887 printf("2 (*z): %d\n", (*z)/3);
\r
888 printf("2 (*i): %d\n", (*i)/3);
\r
889 // printf("2 offset of color in palette (*q): %d\n", (*q)/3);
\r
890 printf("chkcolor end~\n");
\r
894 void modexputPixel(page_t *page, int x, int y, byte color)
\r
896 word pageOff = (word) page->data;
\r
897 /* Each address accesses four neighboring pixels, so set
\r
898 Write Plane Enable according to which pixel we want
\r
899 to modify. The plane is determined by the two least
\r
900 significant bits of the x-coordinate: */
\r
901 modexSelectPlane(PLANE(x));
\r
902 //outp(SC_INDEX, 0x02);
\r
903 //outp(SC_DATA, 0x01 << (x & 3));
\r
905 /* The offset of the pixel into the video segment is
\r
906 offset = (width * y + x) / 4, and write the given
\r
907 color to the plane we selected above. Heed the active
\r
908 page start selection. */
\r
909 VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff] = color;
\r
913 byte modexgetPixel(page_t *page, int x, int y)
\r
915 word pageOff = (word) page->data;
\r
916 /* Select the plane from which we must read the pixel color: */
\r
917 outpw(GC_INDEX, 0x04);
\r
918 outpw(GC_INDEX+1, x & 3);
\r
920 return VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff];
\r
924 void modexhlin(page_t *page, word xl, word xh, word y, word color)
\r
929 for(x=0;x<xh*4;x+=4)
\r
931 if(x+4>=page[0].sw-1){ x=0; yy+=4; }
\r
932 modexClearRegion(page, x+xl, y+yy, 4, 4, color);
\r
934 //modexputPixel(page, x+xl, y, color);
\r
937 void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str, boolean q)
\r
940 word addr = (word) romFontsData.l;
\r
945 w=romFonts[t].charSize;
\r
946 romFontsData.chw=0;
\r
948 for(; *str != '\0'; str++)
\r
951 if((c=='\n'/* || c=="\
\r
952 "*/) || romFontsData.chw
\r
955 romFontsData.chw=0;
\r
956 y+=romFonts[t].charSize;
\r
959 //load the letter 'A'
\r
965 MOV AL, c ; the letter
\r
968 ADD SI, AX ;the address of charcter
\r
976 //TODO: OPTIMIZE THIS!!!!
\r
977 modexDrawCharPBuf(page, x, y, t, col, bgcol, q);
\r
983 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)
\r
985 word i, s, o, w, j, xp;
\r
987 word addr = (word) l;
\r
1011 s=romFonts[t].seg;
\r
1012 o=romFonts[t].off;
\r
1014 for(; *str != '\0'; str++)
\r
1017 if((c=='\n'/* || c=="\
\r
1018 "*/)/* || chw>=page->width*/)
\r
1024 //load the letter 'A'
\r
1030 MOV AL, c ; the letter
\r
1033 ADD SI, AX ;the address of charcter
\r
1042 for(i=0; i<w; i++)
\r
1048 //modexputPixel(page, x+xp+chw, y+i, l[i] & j ? col:bgcol);
\r
1049 modexClearRegion(page, (x+xp+chw)*8, (y+i)*8, 8, 8, l[i] & j ? col:bgcol);
\r
1058 /* palette dump on display! */
\r
1059 void pdump(page_t *pee)
\r
1061 int mult=(QUADWH);
\r
1062 int palq=(mult)*TILEWH;
\r
1065 for(paly=0; paly<palq; paly+=mult){
\r
1066 for(palx=0; palx<palq; palx+=mult){
\r
1067 modexClearRegion(pee, palx+TILEWH, paly+TILEWH, mult, mult, palcol);
\r
1073 /////////////////////////////////////////////////////////////////////////////
\r
1075 // cls() - This clears the screen to the specified color, on the VGA or on //
\r
1076 // the Virtual screen. //
\r
1078 /////////////////////////////////////////////////////////////////////////////
\r
1079 void cls(page_t *page, byte color, byte *Where)
\r
1081 //modexClearRegion(page, 0, 0, page->width, page->height, color);
\r
1082 /* set map mask to all 4 planes */
\r
1083 outpw(SC_INDEX, 0xff02);
\r
1084 //_fmemset(VGA, color, 16000);
\r
1085 _fmemset(Where, color, page->width*(page->height)/4);
\r
1089 modexWaitBorder() {
\r
1090 while(inp(INPUT_STATUS_1) & 8) {
\r
1094 while(!(inp(INPUT_STATUS_1) & 8)) {
\r