X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_vl.c;h=e2000348d7ecf673c569525661a96a5cca4ad7c4;hb=6021fc3f27b895d382fbd30488ead35657e39196;hp=07eb939ffa5ebc7d2aa2523c00605c842104ff3b;hpb=f791077eab2bcb7993d267fdaeba388fd078b60a;p=16.git diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c index 07eb939f..e2000348 100755 --- a/src/lib/16_vl.c +++ b/src/lib/16_vl.c @@ -1,5 +1,5 @@ /* Project 16 Source Code~ - * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * Copyright (C) 2012-2018 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover * * This file is part of Project 16. * @@ -28,12 +28,182 @@ 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]; +/*static */byte tmppal[PAL_SIZE]; + +//=========================================================================== + +/* +======================= += += VL_Startup += +======================= +*/ + +void VL_Startup (global_game_variables_t *gvar) +{ + __asm cld; + + VGAmodeX(1/*TODO other modes*/, 1, gvar); +//-- VL_LoadPalFileCore(gvar->video.palette, gvar); + VL_SetCorePal(gvar); + //Quit ("Improper video card! If you really have a VGA card that I am not\ndetecting it!", gvar); +} + + + +/* +======================= += += VL_Shutdown += +======================= +*/ + +void VL_Shutdown (global_game_variables_t *gvar) +{ + VGAmodeX(0, 1, gvar); +} + +/* +======================= += += VL_SetVGAPlaneMode += +======================= +*/ +#if 0 +void VL_SetVGAPlaneMode (global_game_variables_t *gvar) +{ + VL_vgaSetMode(VGA_256_COLOR_MODE); + VL_DePlaneVGA (); + VGAMAPMASK(15); + VL_SetLineWidth (40, &gvar->video.ofs); +} +#endif + +//=========================================================================== + +/* +================= += += VL_ClearVideo += += Fill the entire video buffer with a given color += +================= +*/ + +void VL_ClearVideo (byte color) +{ + __asm { + mov dx,GC_INDEX + mov al,GC_MODE + out dx,al + inc dx + in al,dx + and al,0xfc // write mode 0 to store directly to video + out dx,al + + mov dx,SC_INDEX + mov ax,SC_MAPMASK+15*256 + out dx,ax // write through all four planes + + mov ax,SCREENSEG + mov es,ax + mov al,[color] + mov ah,al + mov cx,0x8000 // 0x8000 words, clearing 8 video bytes/word + xor di,di + rep stosw + } +} + +/* +============================================================================= + + VGA REGISTER MANAGEMENT ROUTINES + +============================================================================= +*/ + + +/* +================= += += VL_DePlaneVGA += +================= +*/ +#if 0 +void VL_DePlaneVGA (void) +{ + +// +// change CPU addressing to non linear mode +// + +// +// turn off chain 4 and odd/even +// + outportb (SC_INDEX,SC_MEMMODE); + outportb (SC_INDEX+1,(inportb(SC_INDEX+1)&~8)|4); + + outportb (SC_INDEX,SC_MAPMASK); // leave this set throughought + +// +// turn off odd/even and set write mode 0 +// + outportb (GC_INDEX,GC_MODE); + outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~0x13); + +// +// turn off chain +// + outportb (GC_INDEX,GC_MISCELLANEOUS); + outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~2); + +// +// clear the entire buffer space, because int 10h only did 16 k / plane +// + VL_ClearVideo (0); + +// +// change CRTC scanning from doubleword to byte mode, allowing >64k scans +// + outportb (CRTC_INDEX,CRTC_UNDERLINE); + outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)&~0x40); + + outportb (CRTC_INDEX,CRTC_MODE); + outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)|0x40); +} +#endif +//=========================================================================== + +/* +==================== += += VL_SetSplitScreen += +==================== +*/ + +void VL_SetSplitScreen (int linenum) +{ + VL_WaitVBL (1); + linenum=linenum*2-1; + outportb (CRTC_INDEX,CRTC_LINECOMPARE); + outportb (CRTC_INDEX+1,linenum % 256); + outportb (CRTC_INDEX,CRTC_OVERFLOW); + outportb (CRTC_INDEX+1, 1+16*(linenum/256)); + outportb (CRTC_INDEX,CRTC_MAXSCANLINE); + outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1) & (255-64)); +} ///////////////////////////////////////////////////////////////////////////// -// // -// setvideo() - This function Manages the video modes // -// // +// // +// setvideo() - This function Manages the video modes // +// // ///////////////////////////////////////////////////////////////////////////// void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv) { @@ -43,31 +213,43 @@ void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv) { 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); + if(gv->video.VL_Started) + { + modexLeave(); + in.h.ah = 0x00; + in.h.al = gv->video.old_mode; + int86(0x10, &in, &out); + } + gv->video.VL_Started=0; break; default: // init the video + if(gv->video.VL_Started) + return; + if(!gv->video.VL_Initiated) + TL_VidInit(gv); // get old video mode //in.h.ah = 0xf; //int86(0x10, &in, &out); - gv->video.old_mode = vgaGetMode();//out.h.al; + gv->video.old_mode = VL_vgaGetMode();//out.h.al; // enter mode modexEnter(vq, cmem, gv); break; } } -static void -vgaSetMode(byte mode) +//--------------------------------------------------- +// +// Use the bios to set the current video mode +// + +/*static */void +VL_vgaSetMode(byte mode) { union REGS regs; regs.h.ah = SET_MODE; regs.h.al = mode; int86(VIDEO_INT, ®s, ®s); - //int10_setmode(mode); } //--------------------------------------------------- @@ -75,8 +257,8 @@ vgaSetMode(byte mode) // Use the bios to get the current video mode // -byte/*FIXME: why long? "long" is 32-bit datatype, VGA modes are 8-bit numbers. */ -vgaGetMode() +byte +VL_vgaGetMode(void) { return int10_getmode(); } @@ -84,11 +266,11 @@ vgaGetMode() /* -========================= Entry Points ==========================- */ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) { - word i; + //word i; struct vga_mode_params cm; //int CRTParmCount; - vgaSetMode(VGA_256_COLOR_MODE); + VL_vgaSetMode(VGA_256_COLOR_MODE); vga_enable_256color_modex(); update_state_from_vga(); @@ -101,14 +283,15 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) switch(vq) { case 1: + case 8: //320x240 no buffer //CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]); /*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 - /* virtual width and height. match screen, at first */ + // virtual width and height. match screen, at first // gv->video.page[0].height = gv->video.page[0].sh; gv->video.page[0].width = gv->video.page[0].sw; @@ -150,34 +333,73 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) vga_state.vga_stride = cm.offset * 2; vga_write_crtc_mode(&cm,0); - /* clear video memory */ + // clear video memory // switch (cmem) { - case 1: { - /* clear video memory */ - dword far*ptr=(dword far*)vga_state.vga_graphics_ram;//VGA; /* used for faster screen clearing */ + case 1: + { +#if 0 + 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~// +#endif + // + // clear the entire buffer space, because int 10h only did 16 k / plane + // + VL_ClearVideo (0); } 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; +//-- VL_SetLineWidth (cm.offset, gv); + //gv->video.ofs.displayofs = 0; + //gv->video.ofs.bufferofs = gv->video.page[0].width*gv->video.page[0].height;//gvar->video.page[0].pagesize; + gv->video.curr_mode=vq; + gv->video.VL_Started=1; } -void -modexLeave() { - /* VGAmodeX restores original mode and palette */ - vgaSetMode(TEXT_MODE); +void modexLeave(void) +{ + // VGAmodeX restores original mode and palette + VL_vgaSetMode(TEXT_MODE); } +#if 0 page_t modexDefaultPage(page_t *p) +{ + page_t page; + /* default page values */ + //page.data = VGA; + //page.data = (byte far *)(vga_state.vga_graphics_ram); + page.data = (vga_state.vga_graphics_ram); + page.dx = 0; + page.dy = 0; + page.sw = p->sw; + page.sh = p->sh; + page.width = p->sw; + page.height = p->sh; + 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; + page.id = 0; + if(ggvv->video.curr_mode = 1) + { + page.width += TILEWHD; + page.height += TILEWHD; + } + return page; +} +#endif +page_t +modexDefaultPage(page_t *p, global_game_variables_t *gvar) { page_t page; @@ -189,14 +411,17 @@ modexDefaultPage(page_t *p) page.dy = 0; page.sw = p->sw; 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.width = p->sw; + page.height = p->sh; + if(gvar->video.curr_mode == 1) +{ page.width += TILEWHD; + page.height += TILEWHD; } + 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 +444,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 +469,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 +484,8 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) case 3: result.pi=p->pi; break; - } + }*/ + result.pi=result.width*4; return result; } @@ -276,28 +502,53 @@ void modexCalcVmemRemain(video_t *video) } } -void modexHiganbanaPageSetup(video_t *video) +void VL_Initofs(video_t *video) +{ + if(!video->vga_state.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(global_game_variables_t *gvar) { - video->vmem_remain=65535U; - video->num_of_pages=0; - (video->page[0]) = modexDefaultPage(&(video->page[0])); video->num_of_pages++; //video->page[0].width += (TILEWHD); video->page[0].height += (TILEWHD); - (video->page[1]) = modexNextPage(&(video->page[0])); video->num_of_pages++; -//0000 (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), (video->page[0]).width, TILEWH*4); video->num_of_pages++; -//0000 (video->page[3]) = (video->page[2]); video->num_of_pages++; - (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].width, 176); 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, 172); video->num_of_pages++; -// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), 72, 128); video->num_of_pages++; - modexCalcVmemRemain(video); - video->p=0; - video->r=1; + gvar->video.vmem_remain=65535U; + gvar->video.num_of_pages=0; + (gvar->video.page[0]) = modexDefaultPage(&(gvar->video.page[0]), gvar); gvar->video.num_of_pages++; //gvar->video.page[0].width += (TILEWHD); gvar->video.page[0].height += (TILEWHD); + (gvar->video.page[1]) = modexNextPage(&(gvar->video.page[0])); gvar->video.num_of_pages++; +//0000 (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), (gvar->video.page[0]).width, TILEWH*4); gvar->video.num_of_pages++; +//0000 (gvar->video.page[3]) = (gvar->video.page[2]); gvar->video.num_of_pages++; +//// (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), TILEWH*4, TILEWH*4); gvar->video.num_of_pages++; +//// (gvar->video.page[3]) = modexNextPageFlexibleSize(&(gvar->video.page[2]), gvar->video.page[0].sw, 208); gvar->video.num_of_pages++; + (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), gvar->video.page[0].width, 96); gvar->video.num_of_pages++; + (gvar->video.page[3]) = modexNextPageFlexibleSize(&(gvar->video.page[2]), gvar->video.page[0].width, 96); gvar->video.num_of_pages++; + modexCalcVmemRemain(&gvar->video); + + gvar->video.sp=gvar->video.p = 0; //showpage + gvar->video.dorender = 1; //render + gvar->video.vh=gvar->video.page[0].height+gvar->video.page[1].height+gvar->video.page[2].height+gvar->video.page[3].height; + + VL_Initofs(&gvar->video); + //doslib origi var + gvar->video.vga_state.omemptr= vga_state.vga_graphics_ram; + gvar->video.vga_state.vga_draw_stride= vga_state.vga_draw_stride; + gvar->video.vga_state.vga_draw_stride_limit= vga_state.vga_draw_stride_limit; + //sprite render switch and bgpreservation switch + gvar->video.vga_state.rss= 1; + gvar->video.vga_state.bgps= 1; //setup the buffersize - video->page[0].dx=video->page[0].dy= - video->page[1].dx=video->page[1].dy=TILEWH; // 1 tile size buffer - video->page[2].dx=video->page[2].dy= - video->page[3].dx=video->page[3].dy=0; // cache pages are buffer wwww + gvar->video.page[0].dx=gvar->video.page[0].dy= + gvar->video.page[1].dx=gvar->video.page[1].dy=TILEWH; // 1 tile size buffer + gvar->video.page[2].dx=gvar->video.page[2].dy= + gvar->video.page[3].dx=gvar->video.page[3].dy=0; // cache pages are buffer wwww + + gvar->video.page[0].tlx=gvar->mv[0].tx*TILEWH; + gvar->video.page[0].tly=gvar->mv[0].ty*TILEWH; } // @@ -320,33 +571,33 @@ modexShowPage(page_t *page) { low_address = LOW_ADDRESS | (offset << 8); /* wait for appropriate timing and then program CRTC */ -//+=+= while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE)); +//+=+= while ((inp(STATUS_REGISTER_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 */ -//+=+= while (!(inp(INPUT_STATUS_1) & VRETRACE)); +//+=+= while (!(inp(STATUS_REGISTER_1) & VRETRACE)); /* do PEL panning here */ outp(AC_INDEX, 0x33); outp(AC_INDEX, (page[0].dx & 0x03) << 1); } -//another variant //args: page, vertical sync switch, screen resolution switch, page0 switch void -VL_ShowPage(page_t *page, boolean vsync, boolean sr) { +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: @@ -361,20 +612,21 @@ 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 */ - if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE)); + // wait for appropriate timing and then program CRTC + if(vsync) while ((inp(STATUS_REGISTER_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 */ - if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE)); + // wait for one retrace + if(vsync) while (!(inp(STATUS_REGISTER_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; + vga_state.vga_draw_stride_limit = vga_state.vga_draw_stride = page->stridew; } //============================================================================= @@ -387,25 +639,25 @@ modexPanPage(page_t *page, int dx, int dy) { void modexSelectPlane(byte plane) { - outp(SC_INDEX, MAP_MASK); /* select plane */ + outp(SC_INDEX, SC_MAPMASK); /* select plane */ outp(SC_DATA, plane); } void -modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) { +modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) +{ word pageOff = (word) page->data; - word xoff=x/4; /* xoffset that begins each row */ - word scanCount=w/4; /* number of iterations per row (excluding right clip)*/ - word poffset = pageOff + y*(page->stridew) + xoff; /* starting offset */ - word nextRow = page->stridew-scanCount-1; /* loc of next row */ - byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */ - byte rclip[] = {0x00, 0x01, 0x03, 0x07}; + word xoff=(x>>2); // xoffset that begins each row + word poffset = pageOff + y*(page->stridew) + xoff; // starting offset + word scanCount=w>>2; // number of iterations per row (excluding right clip) + word nextRow = page->stridew-scanCount-1; // loc of next row + LRCLIPDEF byte left = lclip[x&0x03]; byte right = rclip[(x+w)&0x03]; - /* handle the case which requires an extra group */ + // handle the case which requires an extra group if((x & 0x03) && !((x+w) & 0x03)) { - right=0x0f; + right=0x0f; } //printf("modexClearRegion(x=%u, y=%u, w=%u, h=%u, left=%u, right=%u)\n", x, y, w, h, left, right); @@ -423,7 +675,7 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) { MOV ES, AX MOV DI, poffset ; go to the first pixel MOV DX, SC_INDEX ; point to the map mask - MOV AL, MAP_MASK + MOV AL, SC_MAPMASK OUT DX, AL INC DX MOV AL, color ; get ready to write colors @@ -475,17 +727,16 @@ modexCopyPageRegion(page_t *dest, page_t *src, word dx, word dy, word width, word height) { - word doffset = (word)dest->data + dy*(dest->stridew) + dx/4; - word soffset = (word)src->data + sy*(src->stridew) + sx/4; - word scans = vga_state.vga_stride; //++++0000 the quick and dirty fix of the major issue with p16 video display wwww + word doffset = (word)dest->data + dy*(dest->stridew) + (dx>>2); + word soffset = (word)src->data + sy*(src->stridew) + (sx>>2); + word scans = vga_state.vga_stride+8; //++++0000 the quick and dirty fix of the major issue with p16 video display wwww word nextSrcRow = src->stridew - scans - 1; word nextDestRow = dest->stridew - scans - 1; - byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */ - byte rclip[] = {0x00, 0x01, 0x03, 0x07}; + LRCLIPDEF byte left = lclip[sx&0x03]; byte right = rclip[(sx+width)&0x03]; - /* handle the case which requires an extra group */ + // handle the case which requires an extra group if((sx & 0x03) && !((sx+width) & 0x03)) { right=0x0f; } @@ -513,7 +764,7 @@ modexCopyPageRegion(page_t *dest, page_t *src, MOV AX, SC_INDEX ; point to the mask register MOV DX, AX ; - MOV AL, MAP_MASK ; + MOV AL, SC_MAPMASK ; OUT DX, AL ; INC DX ; @@ -562,6 +813,7 @@ modexCopyPageRegion(page_t *dest, page_t *src, } } +//check 16_vl_1.c /* fade and flash */ void @@ -595,7 +847,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; } @@ -608,62 +860,59 @@ fadePalette(sbyte fade, sbyte start, word iter, byte *palette) { tmppal[i] = 63; } } - modexPalUpdate1(tmppal); + modexPalUpdate(tmppal); iter--; dim += fade; } } -/* save and load */ -void -modexPalSave(byte *palette) { +// save and load +void modexPalSave(byte *palette) +{ int i; - outp(PAL_READ_REG, 0); /* start at palette entry 0 */ - for(i=0; i= 0) { - word i; - - read(fd,palette,768); + read(fd,palette, palsize*3); close(fd); - vga_palette_lseek(0); - for (i=0;i < 256;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2); + if(palsize==COREPALSIZE) newpalette = palette; else{ //if core then load it + newpalette = &palette[3]; //skip overscan color + if(!o) o++; + } + VL_UpdatePaletteWrite(newpalette, o, palsize, gvar); } } +//++++// +void VL_SetCorePal(global_game_variables_t *gvar) +{ + byte *palette = &corepal; + word i; + + vga_palette_lseek(0); + for (i=0;i < COREPALSIZE;i++) + vga_palette_write(palette[(i*3)+0]>>2, + palette[(i*3)+1]>>2, + palette[(i*3)+2]>>2); + + VL_PaletteSync(gvar); +} + +void VL_LoadPalFile(const char *filename, byte *palette, global_game_variables_t *gvar) +{ + VLL_LoadPalFilewithoffset(filename, palette, + 0, //overwrite core/system palette +// COREPALSIZE, //preserved core/system palette + PAL_SIZE/3, gvar); +} + +void VL_LoadPalFileCore(byte *palette, global_game_variables_t *gvar) +{ + VLL_LoadPalFilewithoffset("data/16.pal", palette, 0, COREPALSIZE, gvar); +} + +void VL_UpdatePaletteWrite(byte *palette, word o, word p, global_game_variables_t *gvar) +{ + word i; + + vga_palette_lseek(o); + for (i=0;i < p-o;i++) + vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2); + + VL_PaletteSync(gvar); +} + +void VL_PaletteSync(global_game_variables_t *gvar) +{ + modexPalSave(&gvar->video.palette); +} void modexSavePalFile(char *filename, byte *pal) { @@ -698,7 +993,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 */ @@ -721,177 +1015,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(aqwidth/4) * y + (x / 4) + ((word)page->data); - word addrr = addrq; + word addrq; + word addrr; 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') + switch(vidsw) { - x = x_draw; - romFontsData.chw = 0; - addrq += (page->width / 4) * 8; - addrr = addrq; - y += 8; - continue; - } + case 0: + printf("%s\n", str); + break; + case 1: + if(tlsw){ x-=page->tlx; y-=page->tly; } + x_draw = x>>2; + addrq = (page->stridew) * y + (word)(x_draw) + + ((word)page->data); + addrr = addrq; + s=romFonts[t].seg; + o=romFonts[t].off; + w=romFonts[t].charSize; + romFontsData.chw=0; + + for(; *str != '\0'; str++) + { + c = (*str); + if(c=='\n') + { + x = x_draw; + romFontsData.chw = 0; + addrq += (page->stridew) * 8; + addrr = addrq; + y += 8; + continue; + } - // load the character into romFontsData.l - // no need for inline assembly! - // NTS: It might even be faster to just let the modexDrawChar point directly at ROM font than to copy per char! --J.C. - _fmemcpy(romFontsData.l,MK_FP(s,o+(w*c))/*ROM font location*/,w/*char size*/); - modexDrawChar(page, x_draw/*for mode X planar use*/, t, col, bgcol, addrr); - x_draw += 8; /* track X for edge of screen */ - addrr += 2; /* move 8 pixels over (2 x 4 planar pixels per byte) */ + // load the character into romFontsData.l + // no need for inline assembly! + // NTS: It might even be faster to just let the modexDrawChar point directly at ROM font than to copy per char! --J.C. + _fmemcpy(romFontsData.l,MK_FP(s,o+(w*c))/*ROM font location*/,w/*char size*/); + modexDrawChar(page, x_draw/*for mode X planar use*/, t, color, bgcolor, addrr); + x_draw += 8; /* track X for edge of screen */ + addrr += 2; /* move 8 pixels over (2 x 4 planar pixels per byte) */ + } + //printf("print xy:%dx%d tlxy:%dx%d\n", x, y, page->tlx, page->tly); + break; } } @@ -1224,21 +1284,28 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c } } +// short hand of modexprint +void VL_print(const byte *str, nibble pagenum, global_game_variables_t *gvar) +{ + modexprint(&(gvar->video.page[pagenum]), gvar->video.print.x, gvar->video.print.y, gvar->video.print.t, gvar->video.print.tlsw, gvar->video.print.color, gvar->video.print.bgcolor, gvar->video.VL_Started, str); +} + /* palette dump on display! */ -void modexpdump(page_t *pee) +void modexpdump(nibble pagenum, global_game_variables_t *gvar) { int mult=(QUADWH); int palq=(mult)*TILEWH; int palcol=0; int palx, paly; - for(paly=0; palyvideo.page[pagenum], palx+TILEWH, paly+TILEWH, mult, mult, palcol); palcol++; } } + modexPalSave(gvar->video.palette); } - +#if 0 ///////////////////////////////////////////////////////////////////////////// // // // cls() - This clears the screen to the specified color, on the VGA or on // @@ -1251,33 +1318,121 @@ 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); +} +#endif +// +// pattern filler from joncampbell123's code +// +void VL_PatternDraw(video_t *video, word pn, boolean sw, boolean allsw) +{ + unsigned int i,j,o, d,h,s; + word w; + + switch(sw) + { + case 0: + w=vga_state.vga_width; + d=0; + s=vga_state.vga_stride; + switch(allsw) + { + case 0: + h=vga_state.vga_height; + break; + case 1: + h=video->vh; + break; + } + break; + default: + w=video->page[pn].width; + d=(0x10000UL - (uint16_t)video->page[pn].data); + s=video->page[pn].stridew; + switch(allsw) + { + case 0: + h=video->page[pn].height; + break; + case 1: + if(!pn) h=video->vh; + else h=video->page[pn].height; + break; + } + break; + } + + /* fill screen/pattern with a distinctive pattern */ + for (i=0;i < w;i++) { + o = (i >> 2) + d; + vga_write_sequencer(0x02/*map mask*/,1 << (i&3)); + for (j=0;j < h;j++,o += s) + vga_state.vga_graphics_ram[o] = (i^j)&15; // VRL samples put all colors in first 15! + } } void modexWaitBorder() { - while(inp(INPUT_STATUS_1) & 8) { + while(inp(STATUS_REGISTER_1) & 8) { // spin } - while(!(inp(INPUT_STATUS_1) & 8)) { + while(!(inp(STATUS_REGISTER_1) & 8)) { //spin } } -void modexprintmeminfo(video_t *v) +void +modexWaitBorder_start() +{ + while(inp(STATUS_REGISTER_1) & 8) { + // spin + } + +} + +void +modexWaitBorder_end() +{ + while(!(inp(STATUS_REGISTER_1) & 8)) { + // spin + } + +} + +//=========================================================================== + +// +// printings of video memory information +// +void VL_PrintmodexmemInfo(video_t *v) { byte i; - printf("video memory remaining: %u\n", v->vmem_remain); - printf("page "); - for(i=0; inum_of_pages;i++) + +// 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].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(" vga_stride: %u ", vga_state.vga_stride); + printf("pagestride: %u ", v->page[0].stridew); + printf("draw_stride: %u ", vga_state.vga_draw_stride); + printf("draw_stride_limit: %u\n", vga_state.vga_draw_stride_limit); + + if(v->vmem_remain) + printf(" Free Video Memory: %u\n", v->vmem_remain); + if(v->num_of_pages) { - printf(" [%u]=", i); - printf("(%Fp)", (v->page[i].data)); - printf(" size=%u ", v->page[i].pagesize); - printf("w=%lu h=%lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height); - printf("sw=%lu sh=%lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh); - printf("pi=%u", v->page[i].pi); - printf("\n"); + printf(" page"); + for(i=0; inum_of_pages;i++) + { + printf(" [%u]=", i); + printf("(%Fp)", (v->page[i].data)); + printf(" size=%u ", v->page[i].pagesize); + printf("w=%-3lu h=%-3lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height); + printf("sw=%-3lu sh=%-3lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh); + printf("pi=%u", v->page[i].pi); + printf("\n"); + } } }