X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_vl.c;h=c115761b99ba92c8c9222f0b3b70ff1b5c9f2a80;hb=a565be31ce92d6168ae6983042da75b0b683e52b;hp=503cad0665a55fae3f4c8548e003d44ced52bccd;hpb=16fee04bfaa2cf218b1a906b0df0ed7e3a5706fa;p=16.git diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c index 503cad06..c115761b 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-2019 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,20 +257,20 @@ 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(); + return int10_getmode(); } /* -========================= Entry Points ==========================- */ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) { - word i; + //word i; struct vga_mode_params cm; - int CRTParmCount; + //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; @@ -116,8 +299,8 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) cm.word_mode = 0; cm.dword_mode = 0; // 320x240 mode 60Hz - cm.horizontal_total=0x5f + 5; /* CRTC[0] -5 */ - cm.horizontal_display_end=0x4f + 1; /* CRTC[1] -1 */ + cm.horizontal_total=0x5f + 5; /* CRTC[0] -5 */ + cm.horizontal_display_end=0x4f + 1; /* CRTC[1] -1 */ cm.horizontal_blank_start=0x50 + 1; /* CRTC[2] */ // cm.horizontal_blank_end=0x82 + 1; /* CRTC[3] bit 0-4 & CRTC[5] bit 7 *///skewing ^^; cm.horizontal_start_retrace=0x54;/* CRTC[4] */ @@ -150,59 +333,101 @@ 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; + 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; - /* default page values */ + /* 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.dx = 0; + 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; page.id = 0; - return page; + return page; } /* returns the next page in contiguous memory @@ -210,19 +435,19 @@ modexDefaultPage(page_t *p) */ page_t modexNextPage(page_t *p) { - page_t result; + page_t result; - result.data = p->data + (p->pagesize); - result.dx = 0; - result.dy = 0; + result.data = p->data + (p->pagesize); + result.dx = p->dx; // not used anymore we use page[0].dx + result.dy = p->dy; // not used anymore we use page[0].dy result.sw = p->sw; 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.width = p->width; + result.height = p->height; + 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; @@ -238,20 +463,20 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) page_t result; result.data = p->data + (p->pagesize); /* compute the offset */ - result.dx = 0; - result.dy = 0; + result.dx = 0; // not used anymore we use page[0].dx + result.dy = 0; // not used anymore we use page[0].dy result.sw = x; 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,139 +502,217 @@ 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 + 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; } +// +// move page to appropriate part and show it +// void modexShowPage(page_t *page) { - word high_address; - word low_address; - word offset; - byte crtcOffset; - - /* calculate offset */ - offset = (word) page->data; - offset += page->dy * (page->width >> 2 ); - offset += page->dx >> 2; - - /* calculate crtcOffset according to virtual width */ - crtcOffset = page->width >> 3; - - high_address = HIGH_ADDRESS | (offset & 0xff00); - low_address = LOW_ADDRESS | (offset << 8); - - /* wait for appropriate timing and then program CRTC */ - //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 */ - //while (!(inp(INPUT_STATUS_1) & VRETRACE)); - - /* do PEL panning here */ - outp(AC_INDEX, 0x33); - outp(AC_INDEX, (page->dx & 0x03) << 1); + word high_address, low_address, offset; + byte crtcOffset; + + /* calculate offset */ + offset = (word) page->data; + offset += page[0].dy * (page->width >> 2 ); + offset += page[0].dx >> 2; + + /* calculate crtcOffset according to virtual width */ + crtcOffset = page->width >> 3; + + high_address = HIGH_ADDRESS | (offset & 0xff00); + low_address = LOW_ADDRESS | (offset << 8); + + /* wait for appropriate timing and then program CRTC */ +//+=+= 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(STATUS_REGISTER_1) & VRETRACE)); + + /* do PEL panning here */ + 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 + offset = (word) page->data; + offset += page->dy * (page->width >> 2 ); + offset += page->dx >> 2; + + // calculate crtcOffset according to virtual width + switch(sr) + { + case 1: + crtcOffset = page->sw >> 3; + break; + default: + case 0: + crtcOffset = page->width >> 3; + break; + } + + high_address = HIGH_ADDRESS | (offset & 0xff00); + low_address = LOW_ADDRESS | (offset << 8); + + // 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(STATUS_REGISTER_1) & VRETRACE)); + + // do PEL panning here + outp(AC_INDEX, 0x33); + 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; +} + +//============================================================================= + void modexPanPage(page_t *page, int dx, int dy) { - page->dx = dx; - page->dy = dy; + page[0].dx = dx; + page[0].dy = dy; } void modexSelectPlane(byte plane) { - outp(SC_INDEX, MAP_MASK); /* select plane */ - outp(SC_DATA, 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) { - 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}; - byte left = lclip[x&0x03]; - byte right = rclip[(x+w)&0x03]; - - /* handle the case which requires an extra group */ - if((x & 0x03) && !((x+w) & 0x03)) { - right=0x0f; - } +modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) +{ + word pageOff = (word) page->data; + 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 + if((x & 0x03) && !((x+w) & 0x03)) { + right=0x0f; + } //printf("modexClearRegion(x=%u, y=%u, w=%u, h=%u, left=%u, right=%u)\n", x, y, w, h, left, right); - __asm { - PUSHF - PUSH ES - PUSH AX - PUSH BX - PUSH CX - PUSH DX - PUSH SI - PUSH DI - MOV AX, SCREEN_SEG ; go to the VGA memory + __asm { + PUSHF + PUSH ES + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH SI + PUSH DI + 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 + MOV AL, SC_MAPMASK 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 + 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 + 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 + 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 + MOV AL, BL ; restore color + REP STOSB ; write the color SCAN_DONE: - MOV BL, AL ; remeber color + MOV BL, AL ; remeber color MOV AL, right - OUT DX, AL ; do the right clip - MOV AL, BL ; restore color + 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 - POP DI - POP SI - POP DX - POP CX - POP BX - POP AX - POP ES - POPF - } + POP DI + POP SI + POP DX + POP CX + POP BX + POP AX + POP ES + POPF + } } /* moved to src/lib/modex16/16render.c */ @@ -419,39 +723,38 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) { */ 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->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 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}; - byte left = lclip[sx&0x03]; - byte right = rclip[(sx+width)&0x03]; - - /* handle the case which requires an extra group */ + 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; + LRCLIPDEF + byte left = lclip[sx&0x03]; + byte right = rclip[(sx+width)&0x03]; + + // handle the case which requires an extra group if((sx & 0x03) && !((sx+width) & 0x03)) { right=0x0f; } // printf("modexCopyPageRegion(src->stridew=%u, dest->stridew=%u, sx=%u, sy=%u, dx=%u, dy=%u, width=%u, height=%u, left=%u, right=%u)\n", src->stridew, dest->stridew, sx, sy, dx, dy, width, height, left, right); - __asm { - PUSHF - PUSH ES - PUSH AX - PUSH BX - PUSH CX - PUSH DX - PUSH SI - PUSH DI - - MOV AX, SCREEN_SEG ; work in the vga space - MOV ES, AX ; + __asm { + PUSHF + PUSH ES + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH SI + PUSH DI + + MOV AX, SCREEN_SEG ; work in the vga space + MOV ES, AX ; MOV DI, doffset ; MOV SI, soffset ; @@ -460,9 +763,9 @@ modexCopyPageRegion(page_t *dest, page_t *src, OUT DX, AX MOV AX, SC_INDEX ; point to the mask register - MOV DX, AX ; - MOV AL, MAP_MASK ; - OUT DX, AL ; + MOV DX, AX ; + MOV AL, SC_MAPMASK ; + OUT DX, AL ; INC DX ; ROW_START: @@ -471,358 +774,251 @@ modexCopyPageRegion(page_t *dest, page_t *src, MOV DS, AX MOV CX, scans ; the number of latches - MOV AL, left ; do the left column - OUT DX, AL ; + MOV AL, left ; do the left column + OUT DX, AL ; MOVSB ; DEC CX ; - MOV AL, 0fh ; do the inner columns + MOV AL, 0fh ; do the inner columns OUT DX, AL - REP MOVSB ; copy the pixels + 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 ; + 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 + 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 ; - - POP DI - POP SI - POP DX - POP CX - POP BX - POP AX - POP ES - POPF - } + MOV DX, GC_INDEX+1 ; go back to CPU data + MOV AL, 0ffh ; none from latches + OUT DX, AL ; + + POP DI + POP SI + POP DX + POP CX + POP BX + POP AX + POP ES + POPF + } } +//check 16_vl_1.c /* fade and flash */ void modexFadeOn(word fade, byte *palette) { - fadePalette(-fade, 64, 64/fade+1, palette); + fadePalette(-fade, 64, 64/fade+1, palette); } void modexFadeOff(word fade, byte *palette) { - fadePalette(fade, 0, 64/fade+1, palette); + fadePalette(fade, 0, 64/fade+1, palette); } void modexFlashOn(word fade, byte *palette) { - fadePalette(fade, -64, 64/fade+1, palette); + fadePalette(fade, -64, 64/fade+1, palette); } void modexFlashOff(word fade, byte *palette) { - fadePalette(-fade, 0, 64/fade+1, palette); + fadePalette(-fade, 0, 64/fade+1, palette); } static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette) { - word i; - byte dim = start; + word i; + byte dim = start; - /* handle the case where we just update */ - if(iter == 0) { - modexPalUpdate1(palette); + /* handle the case where we just update */ + if(iter == 0) { + modexPalUpdate(palette); return; - } + } - while(iter > 0) { /* FadeLoop */ + while(iter > 0) { /* FadeLoop */ for(i=0; i 127) { + tmppal[i] = palette[i] - dim; + if(tmppal[i] > 127) { tmppal[i] = 0; - } else if(tmppal[i] > 63) { + } else if(tmppal[i] > 63) { tmppal[i] = 63; - } + } } - modexPalUpdate1(tmppal); + modexPalUpdate(tmppal); iter--; dim += fade; - } + } } -/* save and load */ -void -modexPalSave(byte *palette) { - int i; +// save and load +void modexPalSave(byte *palette) +{ + int i; - outp(PAL_READ_REG, 0); /* start at palette entry 0 */ - for(i=0; i= 0) { + read(fd,palette, palsize*3); + close(fd); + + 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); -void -modexPalWhite() { - fadePalette(-1, -64, 1, tmppal); + 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); +} -/* utility */ -void -modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset) +void VL_LoadPalFileCore(byte *palette, global_game_variables_t *gvar) { - 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; + VLL_LoadPalFilewithoffset("data/16.pal", palette, 0, COREPALSIZE, gvar); +} - //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); - } +void VL_UpdatePaletteWrite(byte *palette, word o, word p, global_game_variables_t *gvar) +{ + word i; -printf("\nqqqqqqqq\n\n"); + 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); - //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 - */ + VL_PaletteSync(gvar); +} - /* - Facking bloody point the values of the changed palette to correct values.... major confusion! wwww - */ +void VL_PaletteSync(global_game_variables_t *gvar) +{ + modexPalSave(&gvar->video.palette); +} - //(offset/bmp->offset)*bmp->offset +void +modexSavePalFile(char *filename, byte *pal) { + //unsigned int i; + FILE *file; + /* open the file for writing */ + file = fopen(filename, "wb"); + if(!file) { + printf("Could not open %s for writing\n", filename); + } - //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); - }*/ + /* write the data to the file */ + fwrite(pal, 1, PAL_SIZE, file); + fclose(file); +} - //printf("%02d`", bmp->data[lq]); - //if(lq > 0 && lq%bmp->width==0) printf("\n"); - } -//printf(" aq=%02d\n", aq); -//printf(" aa=%02d\n", aa); +/* blanking */ +void +modexPalBlack() { + fadePalette(-1, 64, 1, tmppal); +} - //update the palette~ - modexPalUpdate(bmp, &pp, aq, aqoffset); - (*i)=pp; - if(aqwidth >> 2; + } + + m1 >>= 1; + m2 >>= 1; + if ((++plane) == 4) { + addr++; + plane = 0; + } + } +} + +void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word color, word bgcolor, boolean vidsw, const byte *str) { 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 addrr = addrq; + word x_draw; + //word addr = (word) romFontsData.l; + 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++) + switch(vidsw) { - c = (*str); - if(c=='\n') - { - 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; } } @@ -1068,14 +1234,14 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c } //load the letter 'A' __asm { - PUSHF - PUSH ES - PUSH AX - PUSH BX - PUSH CX - PUSH DX - PUSH SI - PUSH DI + PUSHF + PUSH ES + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH SI + PUSH DI MOV DI, addr MOV SI, o @@ -1092,14 +1258,14 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c DEC CX JNZ L1 - POP DI - POP SI - POP DX - POP CX - POP BX - POP AX - POP ES - POPF + POP DI + POP SI + POP DX + POP CX + POP BX + POP AX + POP ES + POPF } for(i=0; ivideo.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 // @@ -1145,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"); + } } }