X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_vl.c;h=e2000348d7ecf673c569525661a96a5cca4ad7c4;hb=6021fc3f27b895d382fbd30488ead35657e39196;hp=24e3342ed0fe67efbba8d6fde36f65f6df8cb2bd;hpb=cecbe84f7c61a26fa2285fc125839b2ff50a7f51;p=16.git diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c index 24e3342e..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-2017 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) { @@ -60,22 +230,26 @@ void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *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); } //--------------------------------------------------- @@ -83,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(); } @@ -92,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(); @@ -109,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; @@ -158,31 +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~ + // 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; } -// VL_SetLineWidth (cm.offset, &gv->video.ofs); +//-- 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; @@ -194,8 +411,11 @@ 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.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; @@ -294,38 +514,41 @@ void VL_Initofs(video_t *video) } } -void modexHiganbanaPageSetup(video_t *video) +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].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, 96); video->num_of_pages++; - modexCalcVmemRemain(video); - - 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); + 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 - video->vga_state.omemptr= vga_state.vga_graphics_ram; - video->vga_state.vga_draw_stride= vga_state.vga_draw_stride; - video->vga_state.vga_draw_stride_limit= vga_state.vga_draw_stride_limit; + 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 - video->vga_state.rss= 1; - video->vga_state.bgps= 1; + 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; } // @@ -348,14 +571,14 @@ 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); @@ -390,14 +613,14 @@ VL_ShowPage(page_t *page, boolean vsync, boolean sr) low_address = LOW_ADDRESS | (offset << 8); // wait for appropriate timing and then program CRTC - if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE)); + 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)); + if(vsync) while (!(inp(STATUS_REGISTER_1) & VRETRACE)); // do PEL panning here outp(AC_INDEX, 0x33); @@ -644,14 +867,15 @@ fadePalette(sbyte fade, sbyte start, word iter, byte *palette) { } -/* 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) { - read(fd,palette, PAL_SIZE); + read(fd,palette, palsize*3); close(fd); - VL_UpdatePaletteWrite(palette, o); + 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_UpdatePaletteWrite(byte *palette, word o) +//++++// +void VL_SetCorePal(global_game_variables_t *gvar) { + byte *palette = &corepal; word i; - vga_palette_lseek(/*1+*/o); - for (i=o;i < 256-o;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2); + + 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 @@ -800,14 +1057,20 @@ VL_modexPalScramble(byte *p) } word -modexPalOverscan(word col) +VL_modexPalOverscan(byte *p, word col) { + int i; //modexWaitBorder(); vga_wait_for_vsync(); outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */ - outp(PAL_DATA_REG, col); + for(i=col; i<(3+col); i++) + { + outp(PAL_DATA_REG, p[i]); + } +// modexPalSave(p); return col; } + //check 16_vl_1.c void modexputPixel(page_t *page, int x, int y, byte color) @@ -877,7 +1140,7 @@ void modexDrawChar(page_t *page, int x/*for planar selection only*/, word t, wor } } -void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word col, word bgcol, boolean sw, const byte *str) +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; @@ -886,14 +1149,14 @@ void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word col, word addrr; byte c; - switch(sw) + switch(vidsw) { case 0: printf("%s\n", str); break; case 1: if(tlsw){ x-=page->tlx; y-=page->tly; } - x_draw = x/4; + x_draw = x>>2; addrq = (page->stridew) * y + (word)(x_draw) + ((word)page->data); addrr = addrq; @@ -919,7 +1182,7 @@ void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word col, // 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); + 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) */ } @@ -1021,8 +1284,14 @@ 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; @@ -1030,12 +1299,13 @@ void modexpdump(page_t *pee) int palx, paly; for(paly=TILEWH*8; 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 // @@ -1050,7 +1320,7 @@ void modexcls(page_t *page, byte color, byte *Where) //_fmemset(VGA, color, 16000); _fmemset(Where, color, page->stridew*page->height); } - +#endif // // pattern filler from joncampbell123's code // @@ -1103,11 +1373,11 @@ void VL_PatternDraw(video_t *video, word pn, boolean sw, boolean allsw) 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 } } @@ -1115,7 +1385,7 @@ modexWaitBorder() { void modexWaitBorder_start() { - while(inp(INPUT_STATUS_1) & 8) { + while(inp(STATUS_REGISTER_1) & 8) { // spin } @@ -1124,7 +1394,7 @@ modexWaitBorder_start() void modexWaitBorder_end() { - while(!(inp(INPUT_STATUS_1) & 8)) { + while(!(inp(STATUS_REGISTER_1) & 8)) { // spin } @@ -1144,17 +1414,25 @@ void VL_PrintmodexmemInfo(video_t *v) // 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(" Free Video Memory: %u\n", v->vmem_remain); - printf(" page"); - for(i=0; inum_of_pages;i++) + 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=%-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"); + 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"); + } } }