X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_vl.c;h=13d8c9bb28e0b5c641505d155d80a638c6a8060c;hb=8564174b559b9e19036392ab7677fe9ee754080c;hp=f22b7772cacd17c8bd7d9119700644bbd2ae1cf5;hpb=56710ee126bdba751512938e8c3ebce1cf34f746;p=16.git diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c index f22b7772..13d8c9bb 100755 --- a/src/lib/16_vl.c +++ b/src/lib/16_vl.c @@ -158,16 +158,11 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) dword far*ptr=(dword far*)vga_state.vga_graphics_ram;//VGA; /* used for faster screen clearing */ vga_write_sequencer(2/*map mask register*/,0xf/*all 4 planes*/); for(i = 0;i < 0x4000; i++) ptr[i] = 0x0000; // 0x4000 x dword = 64KB + /* fix up the palette and everything */ + modexPalBlack(); //reset the palette~ } break; } - -// gv->video.page[0].tw = gv->video.page[0].sw/TILEWH; -// gv->video.page[0].th = 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; } void @@ -191,12 +186,12 @@ modexDefaultPage(page_t *p) page.sh = p->sh; page.width = p->sw+TILEWHD; page.height = p->sh+TILEWHD; - page.tw = page.sw/TILEWH; - page.th = page.sh/TILEWH; - page.tilesw=page.width/TILEWH; - page.tilesh=page.height/TILEWH; - page.tilemidposscreenx = page.tw/2; - page.tilemidposscreeny = (page.th/2)+1; + page.ti.tw = page.sw/TILEWH; + page.ti.th = page.sh/TILEWH; + page.ti.tilesw=page.width/TILEWH; + page.ti.tilesh=page.height/TILEWH; + page.ti.tilemidposscreenx = page.ti.tw/2; + page.ti.tilemidposscreeny = (page.ti.th/2)+1; page.stridew=page.width/4; page.pagesize = (word)(page.stridew)*page.height; page.pi=page.width*4; @@ -219,10 +214,10 @@ modexNextPage(page_t *p) { result.sh = p->sh; result.width = p->width; result.height = p->height; - result.tw = p->tw; - result.th = p->th; - result.tilesw = p->tilesw; - result.tilesh = p->tilesh; + result.ti.tw = p->ti.tw; + result.ti.th = p->ti.th; + result.ti.tilesw = p->ti.tilesw; + result.ti.tilesh = p->ti.tilesh; result.stridew=p->stridew; result.pagesize = p->pagesize; result.pi=result.width*4; @@ -244,14 +239,14 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) result.sh = y; result.width = x; result.height = y; - result.tw = result.sw/TILEWH; - result.th = result.sh/TILEWH; - result.tilesw=result.width/TILEWH; - result.tilesh=result.height/TILEWH; + result.ti.tw = result.sw/TILEWH; + result.ti.th = result.sh/TILEWH; + result.ti.tilesw=result.width/TILEWH; + result.ti.tilesh=result.height/TILEWH; result.id = p->id+1; - result.stridew=p->sw/4;//result.width/4; + result.stridew=result.width/4;//p->sw/4; result.pagesize = (word)(result.stridew)*result.height; - switch(result.id) +/* switch(result.id) { case 2: result.pi=p->width*4; @@ -259,7 +254,8 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) case 3: result.pi=p->pi; break; - } + }*/ + result.pi=result.width*4; return result; } @@ -276,6 +272,18 @@ void modexCalcVmemRemain(video_t *video) } } +void VL_Initofs(video_t *video) +{ + if(!video->bgps) + { + video->ofs.offscreen_ofs = video->page[0].pagesize+video->page[1].pagesize;//(vga_state.vga_stride * vga_state.vga_height); + video->ofs.pattern_ofs = (uint16_t)video->page[2].data; + }else{ + video->ofs.offscreen_ofs = 0; + video->ofs.pattern_ofs = 0;//(uint16_t)video->page[0].data; + } +} + void modexHiganbanaPageSetup(video_t *video) { video->vmem_remain=65535U; @@ -287,17 +295,21 @@ void modexHiganbanaPageSetup(video_t *video) //// (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), TILEWH*4, TILEWH*4); video->num_of_pages++; //// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].sw, 208); video->num_of_pages++; (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), video->page[0].width, 96); video->num_of_pages++; - (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].width, video->page[2].height); video->num_of_pages++; + (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].width, 96); video->num_of_pages++; modexCalcVmemRemain(video); - video->p=0; - video->r=1; - video->vh=video->page[0].height+video->page[1].height+video->page[3].height-8;//+video->page[2].height + + video->sp=video->p = 0; //showpage + video->dorender = 1; //render + video->vh=video->page[0].height+video->page[1].height+video->page[2].height+video->page[3].height; + + VL_Initofs(video); //doslib origi var video->omemptr= vga_state.vga_graphics_ram; video->vga_draw_stride= vga_state.vga_draw_stride; video->vga_draw_stride_limit= vga_state.vga_draw_stride_limit; - //sprite render switch - video->rss=0; + //sprite render switch and bgpreservation switch + video->rss= 1; + video->bgps= 1; //setup the buffersize video->page[0].dx=video->page[0].dy= @@ -339,18 +351,19 @@ modexShowPage(page_t *page) { outp(AC_INDEX, 0x33); outp(AC_INDEX, (page[0].dx & 0x03) << 1); } + //args: page, vertical sync switch, screen resolution switch, page0 switch void VL_ShowPage(page_t *page, boolean vsync, boolean sr) { word high_address, low_address, offset; byte crtcOffset; - /* calculate offset */ + // calculate offset offset = (word) page->data; - offset += page[0].dy * (page->width >> 2 ); - offset += page[0].dx >> 2; + offset += page->dy * (page->width >> 2 ); + offset += page->dx >> 2; - /* calculate crtcOffset according to virtual width */ + // calculate crtcOffset according to virtual width switch(sr) { case 1: @@ -365,20 +378,20 @@ VL_ShowPage(page_t *page, boolean vsync, boolean sr) { high_address = HIGH_ADDRESS | (offset & 0xff00); low_address = LOW_ADDRESS | (offset << 8); - /* wait for appropriate timing and then program CRTC */ + // wait for appropriate timing and then program CRTC if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE)); outpw(CRTC_INDEX, high_address); outpw(CRTC_INDEX, low_address); outp(CRTC_INDEX, 0x13); outp(CRTC_DATA, crtcOffset); - /* wait for one retrace */ + // wait for one retrace if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE)); - /* do PEL panning here */ + // do PEL panning here outp(AC_INDEX, 0x33); - outp(AC_INDEX, (page[0].dx & 0x03) << 1); - vga_state.vga_graphics_ram = (VGA_RAM_PTR)page[0].data; + outp(AC_INDEX, (page->dx & 0x03) << 1); + vga_state.vga_graphics_ram = (VGA_RAM_PTR)page->data; } //============================================================================= @@ -599,7 +612,7 @@ fadePalette(sbyte fade, sbyte start, word iter, byte *palette) { /* handle the case where we just update */ if(iter == 0) { - modexPalUpdate1(palette); + modexPalUpdate(palette); return; } @@ -612,7 +625,7 @@ fadePalette(sbyte fade, sbyte start, word iter, byte *palette) { tmppal[i] = 63; } } - modexPalUpdate1(tmppal); + modexPalUpdate(tmppal); iter--; dim += fade; } @@ -638,8 +651,7 @@ modexNewPal() { /* handle errors */ if(!ptr) { - printf("Could not allocate palette.\n"); - exit(-1); + printf("Could not allocate palette.\n"); } return ptr; @@ -663,7 +675,6 @@ modexLoadPalFile(byte *filename, byte **palette) { file = fopen(filename, "rb"); if(!file) { printf("Could not open palette file: %s\n", filename); - exit(-2); } /* read the file */ @@ -684,7 +695,7 @@ void VL_LoadPalFile(const char *filename, byte *palette) if (fd >= 0) { word i; - read(fd,palette,768); + read(fd,palette, PAL_SIZE); close(fd); vga_palette_lseek(0); @@ -702,7 +713,6 @@ modexSavePalFile(char *filename, byte *pal) { file = fopen(filename, "wb"); if(!file) { printf("Could not open %s for writing\n", filename); - exit(-2); } /* write the data to the file */ @@ -725,177 +735,10 @@ modexPalWhite() { /* utility */ -void -modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset) -{ - 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(); - vga_wait_for_vsync(); - 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 */ - vga_wait_for_vsync(); - 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); - modexchkcolor(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; } - } -//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(aqdata; @@ -1103,7 +856,7 @@ void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, cons word s, o, w; word x_draw = x; //word addr = (word) romFontsData.l; - word addrq = (page->width/4) * y + (x / 4) + ((word)page->data); + word addrq = (page->stridew) * y + (x / 4) + ((word)page->data); word addrr = addrq; byte c; @@ -1119,7 +872,7 @@ void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, cons { x = x_draw; romFontsData.chw = 0; - addrq += (page->width / 4) * 8; + addrq += (page->stridew) * 8; addrr = addrq; y += 8; continue; @@ -1255,7 +1008,7 @@ void modexcls(page_t *page, byte color, byte *Where) /* set map mask to all 4 planes */ outpw(SC_INDEX, 0xff02); //_fmemset(VGA, color, 16000); - _fmemset(Where, color, page->width*(page->height)/4); + _fmemset(Where, color, page->stridew*page->height); } // @@ -1319,6 +1072,24 @@ modexWaitBorder() { } } +void +modexWaitBorder_start() +{ + while(inp(INPUT_STATUS_1) & 8) { + // spin + } + +} + +void +modexWaitBorder_end() +{ + while(!(inp(INPUT_STATUS_1) & 8)) { + // spin + } + +} + // // printings of video memory information // @@ -1329,8 +1100,8 @@ void VL_PrintmodexmemInfo(video_t *v) // printf("========================================\n"); printf("VL_PrintmodexmemInfo:\n"); // printf("========================================\n"); - printf(" Virtual Screen: %dx", v->page[0].width); printf("%d ", v->page[0].height); printf("Tile: %dx", v->page[0].tilesw); printf("%d", v->page[0].tilesh); printf("=((Virtual Screen)/16)\n"); - printf(" Screen: %dx", v->page[0].sw); printf("%d ", v->page[0].sh); printf("Tile: %dx", v->page[0].tw); printf("%d", v->page[0].th); printf("=((Screen)/16)\n"); + printf(" Virtual Screen: %dx", v->page[0].width); printf("%d ", v->page[0].height); printf("Tile: %dx", v->page[0].ti.tilesw); printf("%d", v->page[0].ti.tilesh); printf("=((Virtual Screen)/16)\n"); + printf(" Screen: %dx", v->page[0].sw); printf("%d ", v->page[0].sh); printf("Tile: %dx", v->page[0].ti.tw); printf("%d", v->page[0].ti.th); printf("=((Screen)/16)\n"); printf(" Free Video Memory: %u\n", v->vmem_remain); printf(" page");