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.scanline_div2=1; /* CRTC[0x17] bit 2 */
\r
120 cm.scan_double=0; /* CRTC[0x09] bit 7 */
\r
121 cm.max_scanline=4; /* CRTC[0x09] bit 4-0 */
\r
123 case 2: // TODO: 160x120 according to ModeX_160x120regs
\r
125 case 3: // TODO: 160x120 according to ModeX_320x200regs
\r
127 case 4: // TODO: 160x120 according to ModeX_192x144regs
\r
129 case 5: // TODO: 160x120 according to ModeX_256x192regs
\r
135 vga_write_crtc_mode(&cm,0);
\r
137 /* clear video memory */
\r
141 /* clear video memory */
\r
142 vga_write_sequencer(2/*map mask register*/,0xf/*all 4 planes*/);
\r
143 for(i=0; i<0x8000; i++) ptr[i] = 0x0000;
\r
146 gv->video.page[0].tilesw = gv->video.page[0].sw/TILEWH;
\r
147 gv->video.page[0].tilesh = gv->video.page[0].sh/TILEWH;
\r
148 //TODO MAKE FLEXIBLE~
\r
149 gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw;
\r
150 gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1;
\r
151 #define PAGE_SIZE (word)(gv->video.page[0].sw/4 * gv->video.page[0].sh)
\r
156 /* TODO restore original mode and palette */
\r
157 vgaSetMode(TEXT_MODE);
\r
161 modexDefaultPage(page_t *p)
\r
165 /* default page values */
\r
166 page.data = vga_state.vga_graphics_ram;//VGA;
\r
171 page.width = p->sw;
\r
172 page.height = p->sh;
\r
173 page.tw = page.sw/TILEWH;
\r
174 page.th = page.sh/TILEWH;
\r
175 page.tilemidposscreenx = page.tw/2;
\r
176 page.tilemidposscreeny = (page.th/2)+1;
\r
177 page.tilesw=p->tilesw;
\r
178 page.tilesh=p->tilesh;
\r
179 //pageSize = p->sw*p->sh;
\r
185 /* returns the next page in contiguous memory
\r
186 * the next page will be the same size as p, by default
\r
189 modexNextPage(page_t *p) {
\r
192 result.data = p->data + (p->width/4)*p->height;
\r
195 result.width = p->width;
\r
196 result.height = p->height;
\r
197 result.tw = p->width/TILEWH;
\r
198 result.th = p->height/TILEWH;
\r
199 result.id = p->id+1;
\r
202 // return modexNextPageFlexibleSize(&p, p->width, p->height);
\r
205 //next page with defined dimentions~
\r
207 modexNextPageFlexibleSize(page_t *p, word x, word y)
\r
211 result.data = p->data + (p->width/4)*p->height; /* compute the offset */
\r
216 result.tw = p->width/TILEWH;
\r
217 result.th = p->height/TILEWH;
\r
218 result.id = p->id+1;
\r
225 modexShowPage(page_t *page) {
\r
231 /* calculate offset */
\r
232 offset = (word) page->data;
\r
233 offset += page->dy * (page->width >> 2 );
\r
234 offset += page->dx >> 2;
\r
236 /* calculate crtcOffset according to virtual width */
\r
237 crtcOffset = page->width >> 3;
\r
239 high_address = HIGH_ADDRESS | (offset & 0xff00);
\r
240 low_address = LOW_ADDRESS | (offset << 8);
\r
242 /* wait for appropriate timing and then program CRTC */
\r
243 while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));
\r
244 outpw(CRTC_INDEX, high_address);
\r
245 outpw(CRTC_INDEX, low_address);
\r
246 outp(CRTC_INDEX, 0x13);
\r
247 outp(CRTC_DATA, crtcOffset);
\r
249 /* wait for one retrace */
\r
250 while (!(inp(INPUT_STATUS_1) & VRETRACE));
\r
252 /* do PEL panning here */
\r
253 outp(AC_INDEX, 0x33);
\r
254 outp(AC_INDEX, (page->dx & 0x03) << 1);
\r
259 modexPanPage(page_t *page, int dx, int dy) {
\r
266 modexSelectPlane(byte plane) {
\r
267 outp(SC_INDEX, MAP_MASK); /* select plane */
\r
268 outp(SC_DATA, plane);
\r
273 modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) {
\r
274 word pageOff = (word) page->data;
\r
275 word xoff=x/4; /* xoffset that begins each row */
\r
276 word scanCount=w/4; /* number of iterations per row (excluding right clip)*/
\r
277 word poffset = pageOff + y*(page->width/4) + xoff; /* starting offset */
\r
278 word nextRow = page->width/4-scanCount-1; /* loc of next row */
\r
279 byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */
\r
280 byte rclip[] = {0x00, 0x01, 0x03, 0x07};
\r
281 byte left = lclip[x&0x03];
\r
282 byte right = rclip[(x+w)&0x03];
\r
284 /* handle the case which requires an extra group */
\r
285 if((x & 0x03) && !((x+w) & 0x03)) {
\r
290 MOV AX, SCREEN_SEG ; go to the VGA memory
\r
292 MOV DI, poffset ; go to the first pixel
\r
293 MOV DX, SC_INDEX ; point to the map mask
\r
297 MOV AL, color ; get ready to write colors
\r
299 MOV CX, scanCount ; count the line
\r
300 MOV BL, AL ; remember color
\r
301 MOV AL, left ; do the left clip
\r
302 OUT DX, AL ; set the left clip
\r
303 MOV AL, BL ; restore color
\r
304 STOSB ; write the color
\r
306 JZ SCAN_DONE ; handle 1 group stuff
\r
308 ;-- write the main body of the scanline
\r
309 MOV BL, AL ; remember color
\r
310 MOV AL, 0x0f ; write to all pixels
\r
312 MOV AL, BL ; restore color
\r
313 REP STOSB ; write the color
\r
315 MOV BL, AL ; remeber color
\r
317 OUT DX, AL ; do the right clip
\r
318 MOV AL, BL ; restore color
\r
319 STOSB ; write pixel
\r
320 ADD DI, nextRow ; go to the next row
\r
326 /* moved to src/lib/modex16/16render.c */
\r
328 /* copy a region of video memory from one page to another.
\r
329 * It assumes that the left edge of the tile is the same on both
\r
330 * regions and the memory areas do not overlap.
\r
333 modexCopyPageRegion(page_t *dest, page_t *src,
\r
336 word width, word height)
\r
338 word doffset = (word)dest->data + dy*(dest->width/4) + dx/4;
\r
339 word soffset = (word)src->data + sy*(src->width/4) + sx/4;
\r
340 word scans = width/4;
\r
341 word nextSrcRow = src->width/4 - scans - 1;
\r
342 word nextDestRow = dest->width/4 - scans - 1;
\r
343 byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */
\r
344 byte rclip[] = {0x0f, 0x01, 0x03, 0x07};
\r
345 byte left = lclip[sx&0x03];
\r
346 byte right = rclip[(sx+width)&0x03];
\r
349 MOV AX, SCREEN_SEG ; work in the vga space
\r
354 MOV DX, GC_INDEX ; turn off cpu bits
\r
358 MOV AX, SC_INDEX ; point to the mask register
\r
368 MOV CX, scans ; the number of latches
\r
370 MOV AL, left ; do the left column
\r
375 MOV AL, 0fh ; do the inner columns
\r
377 REP MOVSB ; copy the pixels
\r
379 MOV AL, right ; do the right column
\r
384 MOV AX, SI ; go the start of the next row
\r
385 ADD AX, nextSrcRow ;
\r
388 ADD AX, nextDestRow ;
\r
391 DEC height ; do the rest of the actions
\r
394 MOV DX, GC_INDEX+1 ; go back to CPU data
\r
395 MOV AL, 0ffh ; none from latches
\r
401 /* fade and flash */
\r
403 modexFadeOn(word fade, byte *palette) {
\r
404 fadePalette(-fade, 64, 64/fade+1, palette);
\r
409 modexFadeOff(word fade, byte *palette) {
\r
410 fadePalette(fade, 0, 64/fade+1, palette);
\r
415 modexFlashOn(word fade, byte *palette) {
\r
416 fadePalette(fade, -64, 64/fade+1, palette);
\r
421 modexFlashOff(word fade, byte *palette) {
\r
422 fadePalette(-fade, 0, 64/fade+1, palette);
\r
427 fadePalette(sbyte fade, sbyte start, word iter, byte *palette) {
\r
431 /* handle the case where we just update */
\r
433 modexPalUpdate1(palette);
\r
437 while(iter > 0) { /* FadeLoop */
\r
438 for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */
\r
439 tmppal[i] = palette[i] - dim;
\r
440 if(tmppal[i] > 127) {
\r
442 } else if(tmppal[i] > 63) {
\r
446 modexPalUpdate1(tmppal);
\r
453 /* save and load */
\r
455 modexPalSave(byte *palette) {
\r
458 outp(PAL_READ_REG, 0); /* start at palette entry 0 */
\r
459 for(i=0; i<PAL_SIZE; i++) {
\r
460 palette[i] = inp(PAL_DATA_REG); /* read the palette data */
\r
468 ptr = malloc(PAL_SIZE);
\r
470 /* handle errors */
\r
472 printf("Could not allocate palette.\n");
\r
481 modexLoadPalFile(byte *filename, byte **palette) {
\r
485 /* free the palette if it exists */
\r
490 /* allocate the new palette */
\r
491 *palette = modexNewPal();
\r
493 /* open the file */
\r
494 file = fopen(filename, "rb");
\r
496 printf("Could not open palette file: %s\n", filename);
\r
500 /* read the file */
\r
502 while(!feof(file)) {
\r
503 *ptr++ = fgetc(file);
\r
511 modexSavePalFile(char *filename, byte *pal) {
\r
515 /* open the file for writing */
\r
516 file = fopen(filename, "wb");
\r
518 printf("Could not open %s for writing\n", filename);
\r
522 /* write the data to the file */
\r
523 fwrite(pal, 1, PAL_SIZE, file);
\r
531 fadePalette(-1, 64, 1, tmppal);
\r
537 fadePalette(-1, -64, 1, tmppal);
\r
543 modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset)
\r
545 byte *p = bmp->palette;
\r
549 static word a[PAL_SIZE]; //palette array of change values!
\r
550 word z=0, aq=0, aa=0, pp=0;
\r
552 //modexWaitBorder();
\r
553 vga_wait_for_vsync();
\r
556 memset(a, -1, sizeof(a));
\r
557 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
567 // printf("q: %02d\n", (q));
\r
568 // printf("qq: %02d\n", (qq));
\r
569 //printf(" (*i)-q=%02d\n", (*i)-q);
\r
570 outp(PAL_WRITE_REG, qq); /* start at the beginning of palette */
\r
572 if((*i)<PAL_SIZE/2 && w==0)
\r
574 for(; (*i)<PAL_SIZE/2; (*i)++)
\r
576 //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
577 //____ 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
578 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
583 else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))
\r
585 //printf("qp=%d\n", qp);
\r
586 //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);
\r
587 printf(" %d's color=%d\n", (*i), (a[qp])-(bmp->offset*3)+qp);
\r
588 //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!
\r
589 if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }
\r
593 if(bmp->offset==0 && (*i)<3 && q==0) outp(PAL_DATA_REG, 0);
\r
595 if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);
\r
596 else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);
\r
597 printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }
\r
600 //if(qp>0) printf("qp=%d\n", qp);
\r
601 //if(qp>0) printf(" (*i)=%d\n", (*i)/3);
\r
603 //modexWaitBorder(); /* waits one retrace -- less flicker */
\r
604 vga_wait_for_vsync();
\r
605 if((*i)>=PAL_SIZE/2 && w==0)
\r
607 for(; (*i)<PAL_SIZE; (*i)++)
\r
609 //____ 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
610 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
615 else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))
\r
617 //printf("qp=%d\n", qp);
\r
618 //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);
\r
619 printf(" %d's color=%d\n", (*i), (a[qp]-(bmp->offset*3)+qp));
\r
620 //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!
\r
621 if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }
\r
625 if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);
\r
626 else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);
\r
627 printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }
\r
630 //printf(" (*i)=%d\n", (*i)/3);
\r
633 printf("\nqqqqqqqq\n\n");
\r
639 long bufSize = (bmp->width * bmp->height);
\r
641 //printf("1(*i)=%02d\n", (*i)/3);
\r
642 //printf("1z=%02d\n", z/3);
\r
643 modexchkcolor(bmp, &q, &a, &aa, &z, i);
\r
644 //printf("2(*i)=%02d\n", (*i)/3);
\r
645 //printf("2z=%02d\n", z/3);
\r
650 // printf("a[%02d]=(%d)\n", aq, a[aq]);
\r
651 if(a[aq]==-1) aq++;
\r
652 else { aqoffset++; break; }
\r
654 //update the image data here!
\r
655 for(lq=0; lq<bufSize; lq++)
\r
659 use a[qp] instead of bmp->offset for this spot!
\r
664 Facking bloody point the values of the changed palette to correct values.... major confusion! wwww
\r
667 //(offset/bmp->offset)*bmp->offset
\r
670 //printf("%02d ",bmp->data[lq]+bmp->offset);
\r
671 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
672 //printf("%02d_", bmp->data[lq]+bmp->offset);
\r
673 /*if(bmp->data[lq]+bmp->offset==aq)
\r
675 //printf("%02d", bmp->data[lq]);
\r
676 //printf("\n%02d\n", bmp->offset);
\r
677 printf("aq=%02d ", aq);
\r
678 printf("a[aq]=%02d ", a[aq]);
\r
679 printf("a[aq]+aqpp=%02d ", a[aq]+aqpp);
\r
680 printf("a[aq]-aqpp=%02d\n", a[aq]-aqpp);
\r
681 //bmp->data[lq]=((bmp->data[lq]+bmp->offset)-a[aq]);
\r
682 //++++ bmp->data[lq]=a[aq]-aqpp;
\r
683 // printf("_%d ", bmp->data[lq]);
\r
684 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
686 else if(bmp->data[lq]+bmp->offset < ((*i)/3)-aqpp)
\r
688 if(bmp->data[lq]+bmp->offset >= aq)
\r
690 bmp->data[lq]=(bmp->data[lq]+bmp->offset)-aqpp;//-((z-(*i))/3);
\r
691 //printf("_%d ", bmp->data[lq]+bmp->offset)-aqpp-((z-(*i))/3);
\r
693 else bmp->data[lq]+=(bmp->offset-aqpp);
\r
696 //printf("%02d`", bmp->data[lq]);
\r
697 //if(lq > 0 && lq%bmp->width==0) printf("\n");
\r
700 //printf(" aq=%02d\n", aq);
\r
701 //printf(" aa=%02d\n", aa);
\r
703 //update the palette~
\r
704 modexPalUpdate(bmp, &pp, aq, aqoffset);
\r
707 if(aq<aa){ pp=q; aq++; goto aqpee; }
\r
712 modexPalUpdate1(byte *p)
\r
715 //modexWaitBorder();
\r
716 vga_wait_for_vsync();
\r
717 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
718 for(i=0; i<PAL_SIZE/2; i++)
\r
720 outp(PAL_DATA_REG, p[i]);
\r
722 //modexWaitBorder(); /* waits one retrace -- less flicker */
\r
723 vga_wait_for_vsync();
\r
724 for(; i<PAL_SIZE; i++)
\r
726 outp(PAL_DATA_REG, p[(i)]);
\r
731 modexPalUpdate0(byte *p)
\r
734 //modexWaitBorder();
\r
735 vga_wait_for_vsync();
\r
736 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
737 for(i=0; i<PAL_SIZE/2; i++)
\r
739 outp(PAL_DATA_REG, rand());
\r
741 //modexWaitBorder(); /* waits one retrace -- less flicker */
\r
742 vga_wait_for_vsync();
\r
743 for(; i<PAL_SIZE; i++)
\r
745 outp(PAL_DATA_REG, rand());
\r
750 modexPalOverscan(byte *p, word col)
\r
752 //modexWaitBorder();
\r
753 vga_wait_for_vsync();
\r
754 outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */
\r
755 outp(PAL_DATA_REG, col);
\r
759 //i want to make another vesion that checks the palette when the palette is being appened~
\r
760 void modexchkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/)
\r
764 pal = modexNewPal();
\r
766 //printf("q: %02d\n", (*q));
\r
767 printf("chkcolor start~\n");
\r
768 printf("1 (*z): %d\n", (*z)/3);
\r
769 printf("1 (*i): %d\n", (*i)/3);
\r
770 // printf("1 offset of color in palette (*q): %d\n", (*q)/3);
\r
771 printf("wwwwwwwwwwwwwwww\n");
\r
772 //check palette for dups
\r
773 for(; (*z)<PAL_SIZE; (*z)+=3)
\r
775 //printf("\n z: %d\n", (*z));
\r
776 //printf(" q: %d\n", (*q));
\r
777 //printf(" z+q: %d\n\n", ((*z)+(*q)));
\r
780 //---- if(pal[(*z)]==pal[(*z)+3] && pal[(*z)+1]==pal[(*z)+4] && pal[(*z)+2]==pal[(*z)+5])
\r
783 // printf("\n%d [%02d][%02d][%02d]\n", (*z), pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
784 // printf("%d [%02d][%02d][%02d]\n\n", (*z)+3, pal[(*z)+3], pal[(*z)+4], pal[(*z)+5]);
\r
788 else for(zz=0; zz<(*q); zz+=3)
\r
790 //printf("zz: %02d\n", zz/3);
\r
793 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
797 // printf("\nzq1:%d[%02d][%02d][%02d]\n", (zz+q), pal[(zz+q)], pal[(zz+q)+1], pal[(zz+q)+2]);
\r
798 // printf("zq2:%d[%02d][%02d][%02d]\n\n", (zz+q)+3, pal[(zz+q)+3], pal[(zz+q)+4], pal[(zz+q)+5]);
\r
801 else if(pal[zz]==pal[((*z)+(*q))] && pal[zz+1]==pal[((*z)+(*q))+1] && pal[zz+2]==pal[((*z)+(*q))+2])
\r
803 // printf("\n\nwwwwwwwwwwwwwwww\n");
\r
804 // 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
805 // 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
806 // //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
807 // printf(" z : %d [%02d][%02d][%02d] offset value~\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
812 planned features that i plan to implement~
\r
813 image that has values on the pallete list!
\r
815 no... wait.... no wwww
\r
817 //for(zzii=0; zzii<3; zzii++)
\r
819 //printf("z+q: %d\n\n", ((*z)+(*q)));
\r
820 a[(((*z)+(*q)))]=zz;
\r
822 (*aa)=(((*z)+(*q)));
\r
823 printf("!! a[%02d]: %d\n", (((*z)+(*q))/3), zz/3);
\r
824 // printf("\n aa: %d\n\n", (*aa));
\r
825 // printf(" a[%02d]=(%02d) offset array i think the palette should be updated again~\n", ((*z)+(*q))/3, a[((*z)+(*q))/3]);
\r
826 // printf("wwwwwwwwwwwwwwww\n\n");
\r
830 printf("================\n");
\r
831 printf("zq: %d [%02d][%02d][%02d]\n", ((*z)+(*q))/3, pal[((*z)+(*q))], pal[((*z)+(*q))+1], pal[((*z)+(*q))+2]);
\r
832 printf("zz: %d [%02d][%02d][%02d]\n", (zz)/3, pal[zz], pal[zz+1], pal[zz+2]);
\r
833 printf("z : %d [%02d][%02d][%02d]\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);
\r
834 printf("================\n");
\r
836 //printf("[%d]", (zz+q));
\r
840 printf("wwwwwwwwwwwwwwww\n");
\r
841 printf("2 (*z): %d\n", (*z)/3);
\r
842 printf("2 (*i): %d\n", (*i)/3);
\r
843 // printf("2 offset of color in palette (*q): %d\n", (*q)/3);
\r
844 printf("chkcolor end~\n");
\r
848 void modexputPixel(page_t *page, int x, int y, byte color)
\r
850 word pageOff = (word) page->data;
\r
851 /* Each address accesses four neighboring pixels, so set
\r
852 Write Plane Enable according to which pixel we want
\r
853 to modify. The plane is determined by the two least
\r
854 significant bits of the x-coordinate: */
\r
855 modexSelectPlane(PLANE(x));
\r
856 //outp(SC_INDEX, 0x02);
\r
857 //outp(SC_DATA, 0x01 << (x & 3));
\r
859 /* The offset of the pixel into the video segment is
\r
860 offset = (width * y + x) / 4, and write the given
\r
861 color to the plane we selected above. Heed the active
\r
862 page start selection. */
\r
863 VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff] = color;
\r
867 byte modexgetPixel(page_t *page, int x, int y)
\r
869 word pageOff = (word) page->data;
\r
870 /* Select the plane from which we must read the pixel color: */
\r
871 outpw(GC_INDEX, 0x04);
\r
872 outpw(GC_INDEX+1, x & 3);
\r
874 return VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff];
\r
878 void modexhlin(page_t *page, word xl, word xh, word y, word color)
\r
883 for(x=0;x<xh*4;x+=4)
\r
885 if(x+4>=page[0].sw-1){ x=0; yy+=4; }
\r
886 modexClearRegion(page, x+xl, y+yy, 4, 4, color);
\r
888 //modexputPixel(page, x+xl, y, color);
\r
891 void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str, boolean q)
\r
894 word addr = (word) romFontsData.l;
\r
899 w=romFonts[t].charSize;
\r
900 romFontsData.chw=0;
\r
902 for(; *str != '\0'; str++)
\r
905 if((c=='\n'/* || c=="\
\r
906 "*/) || romFontsData.chw
\r
909 romFontsData.chw=0;
\r
910 y+=romFonts[t].charSize;
\r
913 //load the letter 'A'
\r
919 MOV AL, c ; the letter
\r
922 ADD SI, AX ;the address of charcter
\r
930 //TODO: OPTIMIZE THIS!!!!
\r
931 modexDrawCharPBuf(page, x, y, t, col, bgcol, q);
\r
937 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)
\r
939 word i, s, o, w, j, xp;
\r
941 word addr = (word) l;
\r
968 for(; *str != '\0'; str++)
\r
971 if((c=='\n'/* || c=="\
\r
972 "*/)/* || chw>=page->width*/)
\r
978 //load the letter 'A'
\r
984 MOV AL, c ; the letter
\r
987 ADD SI, AX ;the address of charcter
\r
1002 //modexputPixel(page, x+xp+chw, y+i, l[i] & j ? col:bgcol);
\r
1003 modexClearRegion(page, (x+xp+chw)*8, (y+i)*8, 8, 8, l[i] & j ? col:bgcol);
\r
1012 /* palette dump on display! */
\r
1013 void modexpdump(page_t *pee)
\r
1015 int mult=(QUADWH);
\r
1016 int palq=(mult)*TILEWH;
\r
1019 for(paly=0; paly<palq; paly+=mult){
\r
1020 for(palx=0; palx<palq; palx+=mult){
\r
1021 modexClearRegion(pee, palx+TILEWH, paly+TILEWH, mult, mult, palcol);
\r
1027 /////////////////////////////////////////////////////////////////////////////
\r
1029 // cls() - This clears the screen to the specified color, on the VGA or on //
\r
1030 // the Virtual screen. //
\r
1032 /////////////////////////////////////////////////////////////////////////////
\r
1033 void modexcls(page_t *page, byte color, byte *Where)
\r
1035 //modexClearRegion(page, 0, 0, page->width, page->height, color);
\r
1036 /* set map mask to all 4 planes */
\r
1037 outpw(SC_INDEX, 0xff02);
\r
1038 //_fmemset(VGA, color, 16000);
\r
1039 _fmemset(Where, color, page->width*(page->height)/4);
\r
1043 modexWaitBorder() {
\r
1044 while(inp(INPUT_STATUS_1) & 8) {
\r
1048 while(!(inp(INPUT_STATUS_1) & 8)) {
\r
1058 m = int10_getmode();
\r
1059 if ((rp=vga_state.vga_graphics_ram) != NULL && !(m <= 3 || m == 7)) {
\r
1060 unsigned int i,im;
\r
1062 im = (FP_SEG(vga_state.vga_graphics_ram_fence) - FP_SEG(vga_state.vga_graphics_ram));
\r
1063 if (im > 0xFFE) im = 0xFFE;
\r
1065 for (i=0;i < im;i++) vga_state.vga_graphics_ram[i] = 0;
\r
1067 else if ((ap=vga_state.vga_alpha_ram) != NULL) {
\r
1068 unsigned int i,im;
\r
1070 im = (FP_SEG(vga_state.vga_alpha_ram_fence) - FP_SEG(vga_state.vga_alpha_ram));
\r
1071 if (im > 0x7FE) im = 0x7FE;
\r
1072 im <<= 4 - 1; /* because ptr is type uint16_t */
\r
1073 for (i=0;i < im;i++) vga_state.vga_alpha_ram[i] = 0x0720;
\r
1076 printf("WARNING: bios cls no ptr\n");
\r