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, boolean cmem, 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, cmem, gv);
\r
63 vgaSetMode(byte mode)
\r
65 int10_setmode(mode);
\r
68 //---------------------------------------------------
\r
70 // Use the bios to get the current video mode
\r
73 byte/*FIXME: why long? "long" is 32-bit datatype, VGA modes are 8-bit numbers. */
\r
76 return int10_getmode();
\r
79 /* -========================= Entry Points ==========================- */
\r
80 void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
\r
83 dword far*ptr=(dword far*)vga_state.vga_graphics_ram;//VGA; /* used for faster screen clearing */
\r
84 struct vga_mode_params cm;
\r
87 vgaSetMode(VGA_256_COLOR_MODE);
\r
88 vga_enable_256color_modex();
\r
89 update_state_from_vga();
\r
90 vga_read_crtc_mode(&cm);
\r
95 //CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]);
\r
96 /* width and height */
\r
97 gv->video.page[0].sw=vga_state.vga_width = 320; // VGA lib currently does not update this
\r
98 gv->video.page[0].sh=vga_state.vga_height = 240; // VGA lib currently does not update this
\r
100 // 320x240 mode 60Hz
\r
101 cm.horizontal_total=0x5f + 5; /* CRTC[0] -5 */
\r
102 cm.horizontal_display_end=0x4f + 1; /* CRTC[1] -1 */
\r
103 cm.horizontal_blank_start=0x50 + 1; /* CRTC[2] */
\r
104 cm.horizontal_blank_end=0x82 + 1; /* CRTC[3] bit 0-4 & CRTC[5] bit 7 */
\r
105 cm.horizontal_start_retrace=0x54;/* CRTC[4] */
\r
106 cm.horizontal_end_retrace=0x80; /* CRTC[5] bit 0-4 */
\r
107 //cm.horizontal_start_delay_after_total=0x3e; /* CRTC[3] bit 5-6 */
\r
108 //cm.horizontal_start_delay_after_retrace=0x41; /* CRTC[5] bit 5-6 */
\r
109 cm.vertical_total = 0x20D + 2;
\r
110 cm.vertical_start_retrace = 0x1EA;
\r
111 cm.vertical_end_retrace = 0x1EC;
\r
112 cm.vertical_display_end = 480;
\r
113 cm.vertical_blank_start = 0x1E7 + 1;
\r
114 cm.vertical_blank_end = 0x206 + 1;
\r
115 cm.clock_select = 0; /* misc register = 0xE3 25MHz */
\r
119 cm.scan_double=1; /* CRTC[0x09] bit 7 */
\r
120 cm.max_scanline=0; /* CRTC[0x09] bit 4-0 */
\r
122 case 2: // TODO: 160x120 according to ModeX_160x120regs
\r
124 case 3: // TODO: 160x120 according to ModeX_320x200regs
\r
126 case 4: // TODO: 160x120 according to ModeX_192x144regs
\r
128 case 5: // TODO: 160x120 according to ModeX_256x192regs
\r
134 vga_write_crtc_mode(&cm,0);
\r
136 /* clear video memory */
\r
140 /* clear video memory */
\r
141 vga_write_sequencer(2/*map mask register*/,0xf/*all 4 planes*/);
\r
142 for(i=0; i<0x8000; i++) ptr[i] = 0x0000;
\r
145 gv->video.page[0].tilesw = gv->video.page[0].sw/TILEWH;
\r
146 gv->video.page[0].tilesh = gv->video.page[0].sh/TILEWH;
\r
147 //TODO MAKE FLEXIBLE~
\r
148 gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw;
\r
149 gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1;
\r
150 #define PAGE_SIZE (word)(gv->video.page[0].sw/4 * gv->video.page[0].sh)
\r
155 /* TODO restore original mode and palette */
\r
156 vgaSetMode(TEXT_MODE);
\r
160 modexDefaultPage(page_t *p)
\r
164 /* default page values */
\r
165 page.data = vga_state.vga_graphics_ram;//VGA;
\r
170 page.width = p->sw;
\r
171 page.height = p->sh;
\r
172 page.tw = page.sw/TILEWH;
\r
173 page.th = page.sh/TILEWH;
\r
174 page.tilemidposscreenx = page.tw/2;
\r
175 page.tilemidposscreeny = (page.th/2)+1;
\r
176 page.tilesw=p->tilesw;
\r
177 page.tilesh=p->tilesh;
\r
178 //pageSize = p->sw*p->sh;
\r
184 /* returns the next page in contiguous memory
\r
185 * the next page will be the same size as p, by default
\r
188 modexNextPage(page_t *p) {
\r
191 result.data = p->data + (p->width/4)*p->height;
\r
194 result.width = p->width;
\r
195 result.height = p->height;
\r
196 result.tw = p->width/TILEWH;
\r
197 result.th = p->height/TILEWH;
\r
198 result.id = p->id+1;
\r
201 // return modexNextPageFlexibleSize(&p, p->width, p->height);
\r
204 //next page with defined dimentions~
\r
206 modexNextPageFlexibleSize(page_t *p, word x, word y)
\r
210 result.data = p->data + (p->width/4)*p->height; /* compute the offset */
\r
215 result.tw = p->width/TILEWH;
\r
216 result.th = p->height/TILEWH;
\r
217 result.id = p->id+1;
\r
224 modexShowPage(page_t *page) {
\r
230 /* calculate offset */
\r
231 offset = (word) page->data;
\r
232 offset += page->dy * (page->width >> 2 );
\r
233 offset += page->dx >> 2;
\r
235 /* calculate crtcOffset according to virtual width */
\r
236 crtcOffset = page->width >> 3;
\r
238 high_address = HIGH_ADDRESS | (offset & 0xff00);
\r
239 low_address = LOW_ADDRESS | (offset << 8);
\r
241 /* wait for appropriate timing and then program CRTC */
\r
242 while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));
\r
243 outpw(CRTC_INDEX, high_address);
\r
244 outpw(CRTC_INDEX, low_address);
\r
245 outp(CRTC_INDEX, 0x13);
\r
246 outp(CRTC_DATA, crtcOffset);
\r
248 /* wait for one retrace */
\r
249 while (!(inp(INPUT_STATUS_1) & VRETRACE));
\r
251 /* do PEL panning here */
\r
252 outp(AC_INDEX, 0x33);
\r
253 outp(AC_INDEX, (page->dx & 0x03) << 1);
\r
258 modexPanPage(page_t *page, int dx, int dy) {
\r
265 modexSelectPlane(byte plane) {
\r
266 outp(SC_INDEX, MAP_MASK); /* select plane */
\r
267 outp(SC_DATA, plane);
\r
272 modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) {
\r
273 word pageOff = (word) page->data;
\r
274 word xoff=x/4; /* xoffset that begins each row */
\r
275 word scanCount=w/4; /* number of iterations per row (excluding right clip)*/
\r
276 word poffset = pageOff + y*(page->width/4) + xoff; /* starting offset */
\r
277 word nextRow = page->width/4-scanCount-1; /* loc of next row */
\r
278 byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */
\r
279 byte rclip[] = {0x00, 0x01, 0x03, 0x07};
\r
280 byte left = lclip[x&0x03];
\r
281 byte right = rclip[(x+w)&0x03];
\r
283 /* handle the case which requires an extra group */
\r
284 if((x & 0x03) && !((x+w) & 0x03)) {
\r
289 MOV AX, SCREEN_SEG ; go to the VGA memory
\r
291 MOV DI, poffset ; go to the first pixel
\r
292 MOV DX, SC_INDEX ; point to the map mask
\r
296 MOV AL, color ; get ready to write colors
\r
298 MOV CX, scanCount ; count the line
\r
299 MOV BL, AL ; remember color
\r
300 MOV AL, left ; do the left clip
\r
301 OUT DX, AL ; set the left clip
\r
302 MOV AL, BL ; restore color
\r
303 STOSB ; write the color
\r
305 JZ SCAN_DONE ; handle 1 group stuff
\r
307 ;-- write the main body of the scanline
\r
308 MOV BL, AL ; remember color
\r
309 MOV AL, 0x0f ; write to all pixels
\r
311 MOV AL, BL ; restore color
\r
312 REP STOSB ; write the color
\r
314 MOV BL, AL ; remeber color
\r
316 OUT DX, AL ; do the right clip
\r
317 MOV AL, BL ; restore color
\r
318 STOSB ; write pixel
\r
319 ADD DI, nextRow ; go to the next row
\r
325 /* moved to src/lib/modex16/16render.c */
\r
327 /* copy a region of video memory from one page to another.
\r
328 * It assumes that the left edge of the tile is the same on both
\r
329 * regions and the memory areas do not overlap.
\r
332 modexCopyPageRegion(page_t *dest, page_t *src,
\r
335 word width, word height)
\r
337 word doffset = (word)dest->data + dy*(dest->width/4) + dx/4;
\r
338 word soffset = (word)src->data + sy*(src->width/4) + sx/4;
\r
339 word scans = width/4;
\r
340 word nextSrcRow = src->width/4 - scans - 1;
\r
341 word nextDestRow = dest->width/4 - scans - 1;
\r
342 byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */
\r
343 byte rclip[] = {0x0f, 0x01, 0x03, 0x07};
\r
344 byte left = lclip[sx&0x03];
\r
345 byte right = rclip[(sx+width)&0x03];
\r
348 MOV AX, SCREEN_SEG ; work in the vga space
\r
353 MOV DX, GC_INDEX ; turn off cpu bits
\r
357 MOV AX, SC_INDEX ; point to the mask register
\r
367 MOV CX, scans ; the number of latches
\r
369 MOV AL, left ; do the left column
\r
374 MOV AL, 0fh ; do the inner columns
\r
376 REP MOVSB ; copy the pixels
\r
378 MOV AL, right ; do the right column
\r
383 MOV AX, SI ; go the start of the next row
\r
384 ADD AX, nextSrcRow ;
\r
387 ADD AX, nextDestRow ;
\r
390 DEC height ; do the rest of the actions
\r
393 MOV DX, GC_INDEX+1 ; go back to CPU data
\r
394 MOV AL, 0ffh ; none from latches
\r
400 /* fade and flash */
\r
402 modexFadeOn(word fade, byte *palette) {
\r
403 fadePalette(-fade, 64, 64/fade+1, palette);
\r
408 modexFadeOff(word fade, byte *palette) {
\r
409 fadePalette(fade, 0, 64/fade+1, palette);
\r
414 modexFlashOn(word fade, byte *palette) {
\r
415 fadePalette(fade, -64, 64/fade+1, palette);
\r
420 modexFlashOff(word fade, byte *palette) {
\r
421 fadePalette(-fade, 0, 64/fade+1, palette);
\r
426 fadePalette(sbyte fade, sbyte start, word iter, byte *palette) {
\r
430 /* handle the case where we just update */
\r
432 modexPalUpdate1(palette);
\r
436 while(iter > 0) { /* FadeLoop */
\r
437 for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */
\r
438 tmppal[i] = palette[i] - dim;
\r
439 if(tmppal[i] > 127) {
\r
441 } else if(tmppal[i] > 63) {
\r
445 modexPalUpdate1(tmppal);
\r
452 /* save and load */
\r
454 modexPalSave(byte *palette) {
\r
457 outp(PAL_READ_REG, 0); /* start at palette entry 0 */
\r
458 for(i=0; i<PAL_SIZE; i++) {
\r
459 palette[i] = inp(PAL_DATA_REG); /* read the palette data */
\r
467 ptr = malloc(PAL_SIZE);
\r
469 /* handle errors */
\r
471 printf("Could not allocate palette.\n");
\r
480 modexLoadPalFile(byte *filename, byte **palette) {
\r
484 /* free the palette if it exists */
\r
489 /* allocate the new palette */
\r
490 *palette = modexNewPal();
\r
492 /* open the file */
\r
493 file = fopen(filename, "rb");
\r
495 printf("Could not open palette file: %s\n", filename);
\r
499 /* read the file */
\r
501 while(!feof(file)) {
\r
502 *ptr++ = fgetc(file);
\r
510 modexSavePalFile(char *filename, byte *pal) {
\r
514 /* open the file for writing */
\r
515 file = fopen(filename, "wb");
\r
517 printf("Could not open %s for writing\n", filename);
\r
521 /* write the data to the file */
\r
522 fwrite(pal, 1, PAL_SIZE, file);
\r
530 fadePalette(-1, 64, 1, tmppal);
\r
536 fadePalette(-1, -64, 1, tmppal);
\r
542 modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset)
\r
544 byte *p = bmp->palette;
\r
548 static word a[PAL_SIZE]; //palette array of change values!
\r
549 word z=0, aq=0, aa=0, pp=0;
\r
551 //modexWaitBorder();
\r
552 vga_wait_for_vsync();
\r
555 memset(a, -1, sizeof(a));
\r
556 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
566 // printf("q: %02d\n", (q));
\r
567 // printf("qq: %02d\n", (qq));
\r
568 //printf(" (*i)-q=%02d\n", (*i)-q);
\r
569 outp(PAL_WRITE_REG, qq); /* start at the beginning of palette */
\r
571 if((*i)<PAL_SIZE/2 && w==0)
\r
573 for(; (*i)<PAL_SIZE/2; (*i)++)
\r
575 //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
576 //____ 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
577 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
582 else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))
\r
584 //printf("qp=%d\n", qp);
\r
585 //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);
\r
586 printf(" %d's color=%d\n", (*i), (a[qp])-(bmp->offset*3)+qp);
\r
587 //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!
\r
588 if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }
\r
592 if(bmp->offset==0 && (*i)<3 && q==0) outp(PAL_DATA_REG, 0);
\r
594 if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);
\r
595 else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);
\r
596 printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }
\r
599 //if(qp>0) printf("qp=%d\n", qp);
\r
600 //if(qp>0) printf(" (*i)=%d\n", (*i)/3);
\r
602 //modexWaitBorder(); /* waits one retrace -- less flicker */
\r
603 vga_wait_for_vsync();
\r
604 if((*i)>=PAL_SIZE/2 && w==0)
\r
606 for(; (*i)<PAL_SIZE; (*i)++)
\r
608 //____ 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
609 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
614 else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))
\r
616 //printf("qp=%d\n", qp);
\r
617 //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);
\r
618 printf(" %d's color=%d\n", (*i), (a[qp]-(bmp->offset*3)+qp));
\r
619 //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!
\r
620 if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }
\r
624 if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);
\r
625 else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);
\r
626 printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }
\r
629 //printf(" (*i)=%d\n", (*i)/3);
\r
632 printf("\nqqqqqqqq\n\n");
\r
638 long bufSize = (bmp->width * bmp->height);
\r
640 //printf("1(*i)=%02d\n", (*i)/3);
\r
641 //printf("1z=%02d\n", z/3);
\r
642 modexchkcolor(bmp, &q, &a, &aa, &z, i);
\r
643 //printf("2(*i)=%02d\n", (*i)/3);
\r
644 //printf("2z=%02d\n", z/3);
\r
649 // printf("a[%02d]=(%d)\n", aq, a[aq]);
\r
650 if(a[aq]==-1) aq++;
\r
651 else { aqoffset++; break; }
\r
653 //update the image data here!
\r
654 for(lq=0; lq<bufSize; lq++)
\r
658 use a[qp] instead of bmp->offset for this spot!
\r
663 Facking bloody point the values of the changed palette to correct values.... major confusion! wwww
\r
666 //(offset/bmp->offset)*bmp->offset
\r
669 //printf("%02d ",bmp->data[lq]+bmp->offset);
\r
670 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
671 //printf("%02d_", bmp->data[lq]+bmp->offset);
\r
672 /*if(bmp->data[lq]+bmp->offset==aq)
\r
674 //printf("%02d", bmp->data[lq]);
\r
675 //printf("\n%02d\n", bmp->offset);
\r
676 printf("aq=%02d ", aq);
\r
677 printf("a[aq]=%02d ", a[aq]);
\r
678 printf("a[aq]+aqpp=%02d ", a[aq]+aqpp);
\r
679 printf("a[aq]-aqpp=%02d\n", a[aq]-aqpp);
\r
680 //bmp->data[lq]=((bmp->data[lq]+bmp->offset)-a[aq]);
\r
681 //++++ bmp->data[lq]=a[aq]-aqpp;
\r
682 // printf("_%d ", bmp->data[lq]);
\r
683 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
685 else if(bmp->data[lq]+bmp->offset < ((*i)/3)-aqpp)
\r
687 if(bmp->data[lq]+bmp->offset >= aq)
\r
689 bmp->data[lq]=(bmp->data[lq]+bmp->offset)-aqpp;//-((z-(*i))/3);
\r
690 //printf("_%d ", bmp->data[lq]+bmp->offset)-aqpp-((z-(*i))/3);
\r
692 else bmp->data[lq]+=(bmp->offset-aqpp);
\r
695 //printf("%02d`", bmp->data[lq]);
\r
696 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
699 //printf(" aq=%02d\n", aq);
\r
700 //printf(" aa=%02d\n", aa);
\r
702 //update the palette~
\r
703 modexPalUpdate(bmp, &pp, aq, aqoffset);
\r
706 if(aq<aa){ pp=q; aq++; goto aqpee; }
\r
711 modexPalUpdate1(byte *p)
\r
714 //modexWaitBorder();
\r
715 vga_wait_for_vsync();
\r
716 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
717 for(i=0; i<PAL_SIZE/2; i++)
\r
719 outp(PAL_DATA_REG, p[i]);
\r
721 //modexWaitBorder(); /* waits one retrace -- less flicker */
\r
722 vga_wait_for_vsync();
\r
723 for(; i<PAL_SIZE; i++)
\r
725 outp(PAL_DATA_REG, p[(i)]);
\r
730 modexPalUpdate0(byte *p)
\r
733 //modexWaitBorder();
\r
734 vga_wait_for_vsync();
\r
735 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
736 for(i=0; i<PAL_SIZE/2; i++)
\r
738 outp(PAL_DATA_REG, rand());
\r
740 //modexWaitBorder(); /* waits one retrace -- less flicker */
\r
741 vga_wait_for_vsync();
\r
742 for(; i<PAL_SIZE; i++)
\r
744 outp(PAL_DATA_REG, rand());
\r
749 modexPalOverscan(byte *p, word col)
\r
751 //modexWaitBorder();
\r
752 vga_wait_for_vsync();
\r
753 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
754 outp(PAL_DATA_REG, col);
\r
758 //i want to make another vesion that checks the palette when the palette is being appened~
\r
759 void modexchkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/)
\r
763 pal = modexNewPal();
\r
765 //printf("q: %02d\n", (*q));
\r
766 printf("chkcolor start~\n");
\r
767 printf("1 (*z): %d\n", (*z)/3);
\r
768 printf("1 (*i): %d\n", (*i)/3);
\r
769 // printf("1 offset of color in palette (*q): %d\n", (*q)/3);
\r
770 printf("wwwwwwwwwwwwwwww\n");
\r
771 //check palette for dups
\r
772 for(; (*z)<PAL_SIZE; (*z)+=3)
\r
774 //printf("\n z: %d\n", (*z));
\r
775 //printf(" q: %d\n", (*q));
\r
776 //printf(" z+q: %d\n\n", ((*z)+(*q)));
\r
779 //---- if(pal[(*z)]==pal[(*z)+3] && pal[(*z)+1]==pal[(*z)+4] && pal[(*z)+2]==pal[(*z)+5])
\r
782 // printf("\n%d [%02d][%02d][%02d]\n", (*z), pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
783 // printf("%d [%02d][%02d][%02d]\n\n", (*z)+3, pal[(*z)+3], pal[(*z)+4], pal[(*z)+5]);
\r
787 else for(zz=0; zz<(*q); zz+=3)
\r
789 //printf("zz: %02d\n", zz/3);
\r
792 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
796 // printf("\nzq1:%d[%02d][%02d][%02d]\n", (zz+q), pal[(zz+q)], pal[(zz+q)+1], pal[(zz+q)+2]);
\r
797 // printf("zq2:%d[%02d][%02d][%02d]\n\n", (zz+q)+3, pal[(zz+q)+3], pal[(zz+q)+4], pal[(zz+q)+5]);
\r
800 else if(pal[zz]==pal[((*z)+(*q))] && pal[zz+1]==pal[((*z)+(*q))+1] && pal[zz+2]==pal[((*z)+(*q))+2])
\r
802 // printf("\n\nwwwwwwwwwwwwwwww\n");
\r
803 // 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
804 // 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
805 // //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
806 // printf(" z : %d [%02d][%02d][%02d] offset value~\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
811 planned features that i plan to implement~
\r
812 image that has values on the pallete list!
\r
814 no... wait.... no wwww
\r
816 //for(zzii=0; zzii<3; zzii++)
\r
818 //printf("z+q: %d\n\n", ((*z)+(*q)));
\r
819 a[(((*z)+(*q)))]=zz;
\r
821 (*aa)=(((*z)+(*q)));
\r
822 printf("!! a[%02d]: %d\n", (((*z)+(*q))/3), zz/3);
\r
823 // printf("\n aa: %d\n\n", (*aa));
\r
824 // printf(" a[%02d]=(%02d) offset array i think the palette should be updated again~\n", ((*z)+(*q))/3, a[((*z)+(*q))/3]);
\r
825 // printf("wwwwwwwwwwwwwwww\n\n");
\r
829 printf("================\n");
\r
830 printf("zq: %d [%02d][%02d][%02d]\n", ((*z)+(*q))/3, pal[((*z)+(*q))], pal[((*z)+(*q))+1], pal[((*z)+(*q))+2]);
\r
831 printf("zz: %d [%02d][%02d][%02d]\n", (zz)/3, pal[zz], pal[zz+1], pal[zz+2]);
\r
832 printf("z : %d [%02d][%02d][%02d]\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
833 printf("================\n");
\r
835 //printf("[%d]", (zz+q));
\r
839 printf("wwwwwwwwwwwwwwww\n");
\r
840 printf("2 (*z): %d\n", (*z)/3);
\r
841 printf("2 (*i): %d\n", (*i)/3);
\r
842 // printf("2 offset of color in palette (*q): %d\n", (*q)/3);
\r
843 printf("chkcolor end~\n");
\r
847 void modexputPixel(page_t *page, int x, int y, byte color)
\r
849 word pageOff = (word) page->data;
\r
850 /* Each address accesses four neighboring pixels, so set
\r
851 Write Plane Enable according to which pixel we want
\r
852 to modify. The plane is determined by the two least
\r
853 significant bits of the x-coordinate: */
\r
854 modexSelectPlane(PLANE(x));
\r
855 //outp(SC_INDEX, 0x02);
\r
856 //outp(SC_DATA, 0x01 << (x & 3));
\r
858 /* The offset of the pixel into the video segment is
\r
859 offset = (width * y + x) / 4, and write the given
\r
860 color to the plane we selected above. Heed the active
\r
861 page start selection. */
\r
862 VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff] = color;
\r
866 byte modexgetPixel(page_t *page, int x, int y)
\r
868 word pageOff = (word) page->data;
\r
869 /* Select the plane from which we must read the pixel color: */
\r
870 outpw(GC_INDEX, 0x04);
\r
871 outpw(GC_INDEX+1, x & 3);
\r
873 return VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff];
\r
877 void modexhlin(page_t *page, word xl, word xh, word y, word color)
\r
882 for(x=0;x<xh*4;x+=4)
\r
884 if(x+4>=page[0].sw-1){ x=0; yy+=4; }
\r
885 modexClearRegion(page, x+xl, y+yy, 4, 4, color);
\r
887 //modexputPixel(page, x+xl, y, color);
\r
890 void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str, boolean q)
\r
893 word addr = (word) romFontsData.l;
\r
898 w=romFonts[t].charSize;
\r
899 romFontsData.chw=0;
\r
901 for(; *str != '\0'; str++)
\r
904 if((c=='\n'/* || c=="\
\r
905 "*/) || romFontsData.chw
\r
908 romFontsData.chw=0;
\r
909 y+=romFonts[t].charSize;
\r
912 //load the letter 'A'
\r
918 MOV AL, c ; the letter
\r
921 ADD SI, AX ;the address of charcter
\r
929 //TODO: OPTIMIZE THIS!!!!
\r
930 modexDrawCharPBuf(page, x, y, t, col, bgcol, q);
\r
936 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)
\r
938 word i, s, o, w, j, xp;
\r
940 word addr = (word) l;
\r
967 for(; *str != '\0'; str++)
\r
970 if((c=='\n'/* || c=="\
\r
971 "*/)/* || chw>=page->width*/)
\r
977 //load the letter 'A'
\r
983 MOV AL, c ; the letter
\r
986 ADD SI, AX ;the address of charcter
\r
1001 //modexputPixel(page, x+xp+chw, y+i, l[i] & j ? col:bgcol);
\r
1002 modexClearRegion(page, (x+xp+chw)*8, (y+i)*8, 8, 8, l[i] & j ? col:bgcol);
\r
1011 /* palette dump on display! */
\r
1012 void modexpdump(page_t *pee)
\r
1014 int mult=(QUADWH);
\r
1015 int palq=(mult)*TILEWH;
\r
1018 for(paly=0; paly<palq; paly+=mult){
\r
1019 for(palx=0; palx<palq; palx+=mult){
\r
1020 modexClearRegion(pee, palx+TILEWH, paly+TILEWH, mult, mult, palcol);
\r
1026 /////////////////////////////////////////////////////////////////////////////
\r
1028 // cls() - This clears the screen to the specified color, on the VGA or on //
\r
1029 // the Virtual screen. //
\r
1031 /////////////////////////////////////////////////////////////////////////////
\r
1032 void modexcls(page_t *page, byte color, byte *Where)
\r
1034 //modexClearRegion(page, 0, 0, page->width, page->height, color);
\r
1035 /* set map mask to all 4 planes */
\r
1036 outpw(SC_INDEX, 0xff02);
\r
1037 //_fmemset(VGA, color, 16000);
\r
1038 _fmemset(Where, color, page->width*(page->height)/4);
\r
1042 modexWaitBorder() {
\r
1043 while(inp(INPUT_STATUS_1) & 8) {
\r
1047 while(!(inp(INPUT_STATUS_1) & 8)) {
\r
1057 m = int10_getmode();
\r
1058 if ((rp=vga_state.vga_graphics_ram) != NULL && !(m <= 3 || m == 7)) {
\r
1059 unsigned int i,im;
\r
1061 im = (FP_SEG(vga_state.vga_graphics_ram_fence) - FP_SEG(vga_state.vga_graphics_ram));
\r
1062 if (im > 0xFFE) im = 0xFFE;
\r
1064 for (i=0;i < im;i++) vga_state.vga_graphics_ram[i] = 0;
\r
1066 else if ((ap=vga_state.vga_alpha_ram) != NULL) {
\r
1067 unsigned int i,im;
\r
1069 im = (FP_SEG(vga_state.vga_alpha_ram_fence) - FP_SEG(vga_state.vga_alpha_ram));
\r
1070 if (im > 0x7FE) im = 0x7FE;
\r
1071 im <<= 4 - 1; /* because ptr is type uint16_t */
\r
1072 for (i=0;i < im;i++) vga_state.vga_alpha_ram[i] = 0x0720;
\r
1075 printf("WARNING: bios cls no ptr\n");
\r