X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fmodex16.c;h=0aa6904b1daa289ca79646d456cb9a4f5122ef17;hb=900779b8b2ce8c05c3df897d3ae3fa5d8cb414c6;hp=7ac8f1b2a375d3129451d6e70e4a9d7a72331f4c;hpb=1994e0d47edc486c81a3d6086574132870c644ed;p=16.git diff --git a/src/lib/modex16.c b/src/lib/modex16.c old mode 100644 new mode 100755 index 7ac8f1b2..0aa6904b --- a/src/lib/modex16.c +++ b/src/lib/modex16.c @@ -1,11 +1,11 @@ /* Project 16 Source Code~ - * Copyright (C) 2012-2015 sparky4 & pngwen & andrius4669 + * Copyright (C) 2012-2016 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 + * the Free Software Foundation; either verson 3 of the License, or * (at your option) any later version. * * Project 16 is distributed in the hope that it will be useful, @@ -20,9 +20,6 @@ * */ -#include -#include -#include #include #include #include @@ -33,6 +30,35 @@ byte far* VGA=(byte far*) 0xA0000000; /* this points to video memory. */ static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette); static byte tmppal[PAL_SIZE]; +///////////////////////////////////////////////////////////////////////////// +// // +// setvideo() - This function Manages the video modes // +// // +///////////////////////////////////////////////////////////////////////////// +void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv) +{ + union REGS in, out; + + switch (vq) + { + case 0: // deinit the video + // change to the video mode we were in before we switched to mode 13h + modexLeave(); + in.h.ah = 0x00; + in.h.al = gv->video.old_mode; + int86(0x10, &in, &out); + break; + default: // init the video + // get old video mode + //in.h.ah = 0xf; + //int86(0x10, &in, &out); + gv->video.old_mode = vgaGetMode();//out.h.al; + // enter mode + modexEnter(vq, cmem, gv); + break; + } +} + static void vgaSetMode(byte mode) { @@ -43,76 +69,190 @@ vgaSetMode(byte mode) int86(VIDEO_INT, ®s, ®s); } +//--------------------------------------------------- +// +// Use the bios to get the current video mode +// -/* -========================= Entry Points ==========================- */ -void -modexEnter() { - word i; - dword far*ptr=(dword far*)VGA; /* used for faster screen clearing */ - word CRTParms[] = { - 0x0d06, /* vertical total */ - 0x3e07, /* overflow (bit 8 of vertical counts) */ - 0x4109, /* cell height (2 to double-scan */ - 0xea10, /* v sync start */ - 0xac11, /* v sync end and protect cr0-cr7 */ - 0xdf12, /* vertical displayed */ - 0x0014, /* turn off dword mode */ - 0xe715, /* v blank start */ - 0x0616, /* v blank end */ - 0xe317 /* turn on byte mode */ - }; - int CRTParmCount = sizeof(CRTParms) / sizeof(CRTParms[0]); - - /* TODO save current video mode and palette */ - vgaSetMode(VGA_256_COLOR_MODE); - - /* disable chain4 mode */ - outpw(SC_INDEX, 0x0604); - - /* synchronous reset while setting Misc Output */ - outpw(SC_INDEX, 0x0100); - - /* select 25 MHz dot clock & 60 Hz scanning rate */ - outp(MISC_OUTPUT, 0xe3); - - /* undo reset (restart sequencer) */ - outpw(SC_INDEX, 0x0300); - - /* reprogram the CRT controller */ - outp(CRTC_INDEX, 0x11); /* VSync End reg contains register write prot */ - outp(CRTC_DATA, 0x7f); /* get current write protect on varios regs */ - - /* send the CRTParms */ - for(i=0; ivideo.page[0].sw=vga_state.vga_width = 320; // VGA lib currently does not update this + gv->video.page[0].sh=vga_state.vga_height = 240; // VGA lib currently does not update this + + /* send the CRTParms */ + /*for(i=0; ivideo.page[0].sw=120; + gv->video.page[0].sh=160; + + /* send the CRTParms */ + for(i=0; ivideo.page[0].sw=320; + gv->video.page[0].sh=200; + + /* send the CRTParms */ + for(i=0; ivideo.page[0].sw=192; + gv->video.page[0].sh=144; + + /* send the CRTParms */ + for(i=0; ivideo.page[0].sw=256; + gv->video.page[0].sh=192; + + /* send the CRTParms */ + for(i=0; ivideo.page[0].tilesw = gv->video.page[0].sw/TILEWH; + gv->video.page[0].tilesh = gv->video.page[0].sh/TILEWH; + //TODO MAKE FLEXIBLE~ + gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw; + gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1; + #define PAGE_SIZE (word)(gv->video.page[0].sw/4 * gv->video.page[0].sh) +} void modexLeave() { - /* TODO restore original mode and palette */ - vgaSetMode(TEXT_MODE); + /* TODO restore original mode and palette */ + vgaSetMode(TEXT_MODE); } +// setBaseXMode() does the initialization to make the VGA ready to +// accept any combination of configuration register settings. This +// involves enabling writes to index 0 to 7 of the CRT controller (port +// 0x3D4), by clearing the most significant bit (bit 7) of index 0x11. +void +modexsetBaseXMode() +{ + /* TODO save current video mode and palette */ + vgaSetMode(VGA_256_COLOR_MODE); + vga_enable_256color_modex(); + update_state_from_vga(); +} page_t -modexDefaultPage() { +modexDefaultPage(page_t *p) +{ page_t page; /* default page values */ page.data = VGA; page.dx = 0; page.dy = 0; - page.width = SCREEN_WIDTH; - page.height = SCREEN_HEIGHT; - page.id = 0; + page.sw = p->sw; + page.sh = p->sh; + page.width = p->sw; + page.height = p->sh; + page.tw = page.sw/TILEWH; + page.th = page.sh/TILEWH; + page.tilemidposscreenx = page.tw/2; + page.tilemidposscreeny = (page.th/2)+1; + page.tilesw=p->tilesw; + page.tilesh=p->tilesh; + //pageSize = p->sw*p->sh; + page.id = 0; return page; } @@ -124,30 +264,35 @@ page_t modexNextPage(page_t *p) { page_t result; - result.data = p->data + (p->width/4)*p->height; /* compute the offset */ + result.data = p->data + (p->width/4)*p->height; result.dx = 0; result.dy = 0; result.width = p->width; result.height = p->height; - result.id = p->id+1; + result.tw = p->width/TILEWH; + result.th = p->height/TILEWH; + result.id = p->id+1; - return result; + return result; +// return modexNextPageFlexibleSize(&p, p->width, p->height); } //next page with defined dimentions~ page_t -modexNextPage0(page_t *p, word x, word y) +modexNextPageFlexibleSize(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; + 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.tw = p->width/TILEWH; + result.th = p->height/TILEWH; + result.id = p->id+1; + + return result; } @@ -194,7 +339,7 @@ modexPanPage(page_t *page, int dx, int dy) { void modexSelectPlane(byte plane) { - outp(SC_INDEX, MAP_MASK); /* select plane */ + outp(SC_INDEX, MAP_MASK); /* select plane */ outp(SC_DATA, plane); } @@ -217,225 +362,43 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) { } __asm { - MOV AX, SCREEN_SEG ; go to the VGA memory - MOV ES, AX - MOV DI, poffset ; go to the first pixel - MOV DX, SC_INDEX ; point to the map mask - MOV AL, MAP_MASK - OUT DX, AL - INC DX - MOV AL, color ; get ready to write colors - SCAN_START: - MOV CX, scanCount ; count the line - MOV BL, AL ; remember color - MOV AL, left ; do the left clip - OUT DX, AL ; set the left clip - MOV AL, BL ; restore color - STOSB ; write the color - DEC CX - JZ SCAN_DONE ; handle 1 group stuff - - ;-- write the main body of the scanline - MOV BL, AL ; remember color - MOV AL, 0x0f ; write to all pixels - OUT DX, AL - MOV AL, BL ; restore color - REP STOSB ; write the color - SCAN_DONE: - MOV BL, AL ; remeber color - MOV AL, right - OUT DX, AL ; do the right clip - MOV AL, BL ; restore color - STOSB ; write pixel - ADD DI, nextRow ; go to the next row - DEC h - JNZ SCAN_START - } -} - - -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) */ - modexDrawBmpRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp); -} - - -void -modexDrawBmpRegion(page_t *page, int x, int y, - int rx, int ry, int rw, int rh, bitmap_t *bmp) { - word poffset = (word) page->data + y*(page->width/4) + x/4; - byte *data = bmp->data;//+bmp->offset; - word bmpOffset = (word) data + ry * bmp->width + rx; - word width = rw; - word height = rh; - byte plane = 1 << ((byte) x & 0x03); - word scanCount = width/4 + (width%4 ? 1 :0); - word nextPageRow = page->width/4 - scanCount; - word nextBmpRow = (word) bmp->width - width; - word rowCounter; - byte planeCounter = 4; - - //code is a bit slow here - __asm { - MOV AX, SCREEN_SEG ; go to the VGA memory - MOV ES, AX - - MOV DX, SC_INDEX ; point at the map mask register - MOV AL, MAP_MASK ; - OUT DX, AL ; - - PLANE_LOOP: - MOV DX, SC_DATA ; select the current plane - MOV AL, plane ; - OUT DX, AL ; - - ;-- begin plane painting - MOV AX, height ; start the row counter - MOV rowCounter, AX ; - MOV DI, poffset ; go to the first pixel - MOV SI, bmpOffset ; go to the bmp pixel - ROW_LOOP: - MOV CX, width ; count the columns - SCAN_LOOP: - MOVSB ; copy the pixel - SUB CX, 3 ; we skip the next 3 - ADD SI, 3 ; skip the bmp pixels - LOOP SCAN_LOOP ; finish the scan - - MOV AX, nextPageRow - ADD DI, AX ; go to the next row on screen - MOV AX, nextBmpRow - ADD SI, AX ; go to the next row on bmp - - DEC rowCounter - JNZ ROW_LOOP ; do all the rows - ;-- end plane painting - - MOV AL, plane ; advance to the next plane - SHL AL, 1 ; - AND AL, 0x0f ; mask the plane properly - MOV plane, AL ; store the plane - - INC bmpOffset ; start bmp at the right spot - - DEC planeCounter - JNZ PLANE_LOOP ; do all 4 planes - } -} - - -void -modexDrawPlanarBuf(page_t *page, int x, int y, planar_buf_t *bmp) { - /* TODO - adapt from test code */ - int plane; - for(plane=0; plane < 4; plane++) - { - //fack - } -} - - -void -modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp) { - /* draw the whole sprite */ - modexDrawSpriteRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp); -} - -void -modexDrawSpriteRegion(page_t *page, int x, int y, - int rx, int ry, int rw, int rh, bitmap_t *bmp) { - word poffset = (word)page->data + y*(page->width/4) + x/4; - byte *data = bmp->data;//+bmp->offset; - word bmpOffset = (word) data + ry * bmp->width + rx; - word width = rw; - word height = rh; - byte plane = 1 << ((byte) x & 0x03); - word scanCount = width/4 + (width%4 ? 1 :0); - word nextPageRow = page->width/4 - scanCount; - word nextBmpRow = (word) bmp->width - width; - word rowCounter; - byte planeCounter = 4; - - __asm { - MOV AX, SCREEN_SEG ; go to the VGA memory - MOV ES, AX - - MOV DX, SC_INDEX ; point at the map mask register - MOV AL, MAP_MASK ; - OUT DX, AL ; - - PLANE_LOOP: - MOV DX, SC_DATA ; select the current plane - MOV AL, plane ; - OUT DX, AL ; - - ;-- begin plane painting - MOV AX, height ; start the row counter - MOV rowCounter, AX ; - MOV DI, poffset ; go to the first pixel - MOV SI, bmpOffset ; go to the bmp pixel - ROW_LOOP: - MOV CX, width ; count the columns - SCAN_LOOP: - LODSB - DEC SI - CMP AL, 0 - JNE DRAW_PIXEL ; draw non-zero pixels - - INC DI ; skip the transparent pixel - ADD SI, 1 - JMP NEXT_PIXEL - DRAW_PIXEL: - MOVSB ; copy the pixel - NEXT_PIXEL: - SUB CX, 3 ; we skip the next 3 - ADD SI, 3 ; skip the bmp pixels - LOOP SCAN_LOOP ; finish the scan - - MOV AX, nextPageRow - ADD DI, AX ; go to the next row on screen - MOV AX, nextBmpRow - ADD SI, AX ; go to the next row on bmp - - DEC rowCounter - JNZ ROW_LOOP ; do all the rows - ;-- end plane painting - - MOV AL, plane ; advance to the next plane - SHL AL, 1 ; - AND AL, 0x0f ; mask the plane properly - MOV plane, AL ; store the plane - - INC bmpOffset ; start bmp at the right spot - - DEC planeCounter - JNZ PLANE_LOOP ; do all 4 planes + MOV AX, SCREEN_SEG ; go to the VGA memory + MOV ES, AX + MOV DI, poffset ; go to the first pixel + MOV DX, SC_INDEX ; point to the map mask + MOV AL, MAP_MASK + OUT DX, AL + INC DX + MOV AL, color ; get ready to write colors + SCAN_START: + MOV CX, scanCount ; count the line + MOV BL, AL ; remember color + MOV AL, left ; do the left clip + OUT DX, AL ; set the left clip + MOV AL, BL ; restore color + STOSB ; write the color + DEC CX + JZ SCAN_DONE ; handle 1 group stuff + + ;-- write the main body of the scanline + MOV BL, AL ; remember color + MOV AL, 0x0f ; write to all pixels + OUT DX, AL + MOV AL, BL ; restore color + REP STOSB ; write the color + SCAN_DONE: + MOV BL, AL ; remeber color + MOV AL, right + OUT DX, AL ; do the right clip + MOV AL, BL ; restore color + STOSB ; write pixel + ADD DI, nextRow ; go to the next row + DEC h + JNZ SCAN_START } } +/* moved to src/lib/modex16/16render.c */ /* copy a region of video memory from one page to another. * It assumes that the left edge of the tile is the same on both @@ -443,9 +406,9 @@ modexDrawSpriteRegion(page_t *page, int x, int y, */ void modexCopyPageRegion(page_t *dest, page_t *src, - word sx, word sy, - word dx, word dy, - word width, word height) + word sx, word sy, + word dx, word dy, + word width, word height) { word doffset = (word)dest->data + dy*(dest->width/4) + dx/4; word soffset = (word)src->data + sy*(src->width/4) + sx/4; @@ -458,54 +421,54 @@ modexCopyPageRegion(page_t *dest, page_t *src, byte right = rclip[(sx+width)&0x03]; __asm { - MOV AX, SCREEN_SEG ; work in the vga space - MOV ES, AX ; - MOV DI, doffset ; - MOV SI, soffset ; - - MOV DX, GC_INDEX ; turn off cpu bits - MOV AX, 0008h ; - OUT DX, AX - - MOV AX, SC_INDEX ; point to the mask register - MOV DX, AX ; - MOV AL, MAP_MASK ; - OUT DX, AL ; - INC DX ; - - ROW_START: - PUSH DS - MOV AX, ES - MOV DS, AX - MOV CX, scans ; the number of latches - - MOV AL, left ; do the left column - OUT DX, AL ; - MOVSB ; - DEC CX ; - - MOV AL, 0fh ; do the inner columns - OUT DX, AL - REP MOVSB ; copy the pixels - - MOV AL, right ; do the right column - OUT DX, AL - MOVSB - POP DS - - MOV AX, SI ; go the start of the next row - ADD AX, nextSrcRow ; - MOV SI, AX ; - MOV AX, DI ; - ADD AX, nextDestRow ; - MOV DI, AX ; - - DEC height ; do the rest of the actions - JNZ ROW_START ; - - MOV DX, GC_INDEX+1 ; go back to CPU data - MOV AL, 0ffh ; none from latches - OUT DX, AL ; + MOV AX, SCREEN_SEG ; work in the vga space + MOV ES, AX ; + MOV DI, doffset ; + MOV SI, soffset ; + + MOV DX, GC_INDEX ; turn off cpu bits + MOV AX, 0008h ; + OUT DX, AX + + MOV AX, SC_INDEX ; point to the mask register + MOV DX, AX ; + MOV AL, MAP_MASK ; + OUT DX, AL ; + INC DX ; + + ROW_START: + PUSH DS + MOV AX, ES + MOV DS, AX + MOV CX, scans ; the number of latches + + MOV AL, left ; do the left column + OUT DX, AL ; + MOVSB ; + DEC CX ; + + MOV AL, 0fh ; do the inner columns + OUT DX, AL + REP MOVSB ; copy the pixels + + MOV AL, right ; do the right column + OUT DX, AL + MOVSB + POP DS + + MOV AX, SI ; go the start of the next row + ADD AX, nextSrcRow ; + MOV SI, AX ; + MOV AX, DI ; + ADD AX, nextDestRow ; + MOV DI, AX ; + + DEC height ; do the rest of the actions + JNZ ROW_START ; + + MOV DX, GC_INDEX+1 ; go back to CPU data + MOV AL, 0ffh ; none from latches + OUT DX, AL ; } } @@ -542,22 +505,22 @@ fadePalette(sbyte fade, sbyte start, word iter, byte *palette) { /* handle the case where we just update */ if(iter == 0) { - modexPalUpdate1(palette); - return; + modexPalUpdate1(palette); + return; } while(iter > 0) { /* FadeLoop */ - for(i=0; i 127) { - tmppal[i] = 0; - } else if(tmppal[i] > 63) { - tmppal[i] = 63; - } - } - modexPalUpdate1(tmppal); - iter--; - dim += fade; + for(i=0; i 127) { + tmppal[i] = 0; + } else if(tmppal[i] > 63) { + tmppal[i] = 63; + } + } + modexPalUpdate1(tmppal); + iter--; + dim += fade; } } @@ -569,7 +532,7 @@ modexPalSave(byte *palette) { outp(PAL_READ_REG, 0); /* start at palette entry 0 */ for(i=0; ipalette; - word w=0; - word q=0; - word qq=0; - static word a[PAL_SIZE]; //palette array of change values! - word z=0, aq=0, aa=0, pp=0; - - modexWaitBorder(); - if((*i)==0) - { - memset(a, -1, sizeof(a)); - outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */ - } - else if(qp==0) - { - q=(*i); - } - else - { - q=(*i); - qq=(*i)/3; -// printf("q: %02d\n", (q)); -// printf("qq: %02d\n", (qq)); - //printf(" (*i)-q=%02d\n", (*i)-q); - 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)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) - { - 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)+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) - { - 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)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) - { - 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)+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); - } + byte *p = bmp->palette; + word w=0; + word q=0; + word qq=0; + static word a[PAL_SIZE]; //palette array of change values! + word z=0, aq=0, aa=0, pp=0; + + modexWaitBorder(); + if((*i)==0) + { + memset(a, -1, sizeof(a)); + outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */ + } + else if(qp==0) + { + q=(*i); + } + else + { + q=(*i); + qq=(*i)/3; +// printf("q: %02d\n", (q)); +// printf("qq: %02d\n", (qq)); + //printf(" (*i)-q=%02d\n", (*i)-q); + 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)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) + { + 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)+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) + { + 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)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) + { + 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)+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); + } printf("\nqqqqqqqq\n\n"); - //palette checker~ - if(q>0 && qp==0) - { - long lq; - long bufSize = (bmp->width * bmp->height); - pp = q; - //printf("1(*i)=%02d\n", (*i)/3); - //printf("1z=%02d\n", z/3); - chkcolor(bmp, &q, &a, &aa, &z, i); - //printf("2(*i)=%02d\n", (*i)/3); - //printf("2z=%02d\n", z/3); - aq=0; + //palette checker~ + if(q>0 && qp==0) + { + long lq; + long bufSize = (bmp->width * bmp->height); + pp = q; + //printf("1(*i)=%02d\n", (*i)/3); + //printf("1z=%02d\n", z/3); + 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 { aqoffset++; break; } - } + while(aq<=aa) + { +// printf("a[%02d]=(%d)\n", aq, a[aq]); + if(a[aq]==-1) aq++; + else { aqoffset++; break; } + } //update the image data here! - for(lq=0; lqoffset 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) - { - //printf("%02d", bmp->data[lq]); - //printf("\n%02d\n", bmp->offset); - printf("aq=%02d ", aq); - printf("a[aq]=%02d ", a[aq]); - printf("a[aq]+aqpp=%02d ", a[aq]+aqpp); - printf("a[aq]-aqpp=%02d\n", a[aq]-aqpp); - //bmp->data[lq]=((bmp->data[lq]+bmp->offset)-a[aq]); -//++++ bmp->data[lq]=a[aq]-aqpp; -// printf("_%d ", bmp->data[lq]); - //if(lq > 0 && lq%bmp->width==0) printf("\n"); - } - else if(bmp->data[lq]+bmp->offset < ((*i)/3)-aqpp) - { - if(bmp->data[lq]+bmp->offset >= aq) - { - bmp->data[lq]=(bmp->data[lq]+bmp->offset)-aqpp;//-((z-(*i))/3); - //printf("_%d ", bmp->data[lq]+bmp->offset)-aqpp-((z-(*i))/3); - } - else bmp->data[lq]+=(bmp->offset-aqpp); - }*/ - - //printf("%02d`", bmp->data[lq]); - //if(lq > 0 && lq%bmp->width==0) printf("\n"); - } - -//printf(" aq=%02d\n", aq); -//printf(" aa=%02d\n", aa); - - //update the palette~ - modexPalUpdate(bmp, &pp, aq, aqoffset); - (*i)=pp; - - 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) + { + //printf("%02d", bmp->data[lq]); + //printf("\n%02d\n", bmp->offset); + printf("aq=%02d ", aq); + printf("a[aq]=%02d ", a[aq]); + printf("a[aq]+aqpp=%02d ", a[aq]+aqpp); + printf("a[aq]-aqpp=%02d\n", a[aq]-aqpp); + //bmp->data[lq]=((bmp->data[lq]+bmp->offset)-a[aq]); +//++++ bmp->data[lq]=a[aq]-aqpp; +// printf("_%d ", bmp->data[lq]); + //if(lq > 0 && lq%bmp->width==0) printf("\n"); + } + else if(bmp->data[lq]+bmp->offset < ((*i)/3)-aqpp) + { + if(bmp->data[lq]+bmp->offset >= aq) + { + bmp->data[lq]=(bmp->data[lq]+bmp->offset)-aqpp;//-((z-(*i))/3); + //printf("_%d ", bmp->data[lq]+bmp->offset)-aqpp-((z-(*i))/3); + } + else bmp->data[lq]+=(bmp->offset-aqpp); + }*/ + + //printf("%02d`", bmp->data[lq]); + //if(lq > 0 && lq%bmp->width==0) printf("\n"); + } + +//printf(" aq=%02d\n", aq); +//printf(" aa=%02d\n", aa); + + //update the palette~ + modexPalUpdate(bmp, &pp, aq, aqoffset); + (*i)=pp; + + if(aqdata; + /* Each address accesses four neighboring pixels, so set + Write Plane Enable according to which pixel we want + to modify. The plane is determined by the two least + significant bits of the x-coordinate: */ + modexSelectPlane(PLANE(x)); + //outp(SC_INDEX, 0x02); + //outp(SC_DATA, 0x01 << (x & 3)); /* The offset of the pixel into the video segment is offset = (width * y + x) / 4, and write the given color to the plane we selected above. Heed the active page start selection. */ - VGA[(unsigned)((SCREEN_WIDTH/4) * y) + (x / 4) + 0] = color; + VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff] = color; } -byte modexgetPixel(int x, int y) +byte modexgetPixel(page_t *page, int x, int y) { + word pageOff = (word) page->data; /* Select the plane from which we must read the pixel color: */ outpw(GC_INDEX, 0x04); outpw(GC_INDEX+1, x & 3); - return VGA[(unsigned)((SCREEN_WIDTH/4) * y) + (x / 4) + 0]; + return VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff]; + +} + +void modexhlin(page_t *page, word xl, word xh, word y, word color) +{ + word x; + word yy=0; + + for(x=0;x=page[0].sw-1){ x=0; yy+=4; } + modexClearRegion(page, x+xl, y+yy, 4, 4, color); + } + //modexputPixel(page, x+xl, y, color); +} + +void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str, boolean q) +{ + word s, o, w; + word addr = (word) romFontsData.l; + byte c; + + s=romFonts[t].seg; + o=romFonts[t].off; + w=romFonts[t].charSize; + romFontsData.chw=0; + + for(; *str != '\0'; str++) + { + c = (*str); + if((c=='\n'/* || c=="\ +"*/) || romFontsData.chw +>=page->width) + { + romFontsData.chw=0; + y+=romFonts[t].charSize; + continue; + } + //load the letter 'A' + __asm { + MOV DI, addr + MOV SI, o + MOV ES, s + SUB AH, AH + MOV AL, c ; the letter + MOV CX, w + MUL CX + ADD SI, AX ;the address of charcter + L1: MOV AX, ES:SI + MOV DS:DI, AX + INC SI + INC DI + DEC CX + JNZ L1 + } +//TODO: OPTIMIZE THIS!!!! + modexDrawCharPBuf(page, x, y, t, col, bgcol, q); + //if(!q) getch(); + } } -void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str) -{ - word i, s, o, w, j, xp; +void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str) +{ + word i, s, o, w, j, xp; byte l[1024]; - word addr = (word) l; - word chw=0; - byte c; - + word addr = (word) l; + word chw=0; + byte c; + switch(t) { - case 0: + case 0: w=14; break; - case 1: + case 1: w=8; break; - case 2: + case 2: w=8; break; - case 3: + case 3: w=16; break; - default: + default: t=3; w=16; break; - } + } s=romFonts[t].seg; - o=romFonts[t].off; + o=romFonts[t].off; for(; *str != '\0'; str++) - { - if(chw>=page->width-1) - { - x=chw=0; - y+=w; - continue; - } - c = (*str); - if(c=='\n' || c=="\ -") - { - y+=w; - x=chw=0; - continue; - } + { + c = (*str); + if((c=='\n'/* || c=="\ +"*/)/* || chw>=page->width*/) + { + chw=0; + y+=w; + continue; + } //load the letter 'A' __asm { MOV DI, addr @@ -1032,30 +1059,61 @@ void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, cons INC DI DEC CX JNZ L1 - } + } - for(i=0; i>=1; - } + while(j) + { + //modexputPixel(page, x+xp+chw, y+i, l[i] & j ? col:bgcol); + modexClearRegion(page, (x+xp+chw)*8, (y+i)*8, 8, 8, l[i] & j ? col:bgcol); + xp++; + j>>=1; + } + } + chw += xp; + } +} + +/* palette dump on display! */ +void pdump(page_t *pee) +{ + int mult=(QUADWH); + int palq=(mult)*TILEWH; + int palcol=0; + int palx, paly; + for(paly=0; palywidth, page->height, color); + /* set map mask to all 4 planes */ + outpw(SC_INDEX, 0xff02); + //_fmemset(VGA, color, 16000); + _fmemset(Where, color, page->width*(page->height)/4); +} + void modexWaitBorder() { while(inp(INPUT_STATUS_1) & 8) { - /* spin */ + /* spin */ } while(!(inp(INPUT_STATUS_1) & 8)) { - /* spin */ + /* spin */ } }