byte far* VGA=(byte far*) 0xA0000000; /* this points to video memory. */\r
\r
static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette);\r
-static byte tmppal[PAL_SIZE];\r
+/*static */byte tmppal[PAL_SIZE];\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=======================\r
+=\r
+= VL_Startup\r
+=\r
+=======================\r
+*/\r
+\r
+void VL_Startup (global_game_variables_t *gvar)\r
+{\r
+ __asm cld;\r
+\r
+ VGAmodeX(1/*TODO other modes*/, 1, gvar);\r
+//-- VL_LoadPalFileCore(gvar->video.palette, gvar);\r
+ VL_SetCorePal(gvar);\r
+ //Quit ("Improper video card! If you really have a VGA card that I am not\ndetecting it!", gvar);\r
+}\r
+\r
+\r
+\r
+/*\r
+=======================\r
+=\r
+= VL_Shutdown\r
+=\r
+=======================\r
+*/\r
+\r
+void VL_Shutdown (global_game_variables_t *gvar)\r
+{\r
+ VGAmodeX(0, 1, gvar);\r
+}\r
+\r
+/*\r
+=======================\r
+=\r
+= VL_SetVGAPlaneMode\r
+=\r
+=======================\r
+*/\r
+#if 0\r
+void VL_SetVGAPlaneMode (global_game_variables_t *gvar)\r
+{\r
+ VL_vgaSetMode(VGA_256_COLOR_MODE);\r
+ VL_DePlaneVGA ();\r
+ VGAMAPMASK(15);\r
+ VL_SetLineWidth (40, &gvar->video.ofs);\r
+}\r
+#endif\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=================\r
+=\r
+= VL_ClearVideo\r
+=\r
+= Fill the entire video buffer with a given color\r
+=\r
+=================\r
+*/\r
+\r
+void VL_ClearVideo (byte color)\r
+{\r
+ __asm {\r
+ mov dx,GC_INDEX\r
+ mov al,GC_MODE\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ and al,0xfc // write mode 0 to store directly to video\r
+ out dx,al\r
+\r
+ mov dx,SC_INDEX\r
+ mov ax,SC_MAPMASK+15*256\r
+ out dx,ax // write through all four planes\r
+\r
+ mov ax,SCREENSEG\r
+ mov es,ax\r
+ mov al,[color]\r
+ mov ah,al\r
+ mov cx,0x8000 // 0x8000 words, clearing 8 video bytes/word\r
+ xor di,di\r
+ rep stosw\r
+ }\r
+}\r
+\r
+/*\r
+=============================================================================\r
+\r
+ VGA REGISTER MANAGEMENT ROUTINES\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+/*\r
+=================\r
+=\r
+= VL_DePlaneVGA\r
+=\r
+=================\r
+*/\r
+#if 0\r
+void VL_DePlaneVGA (void)\r
+{\r
+\r
+//\r
+// change CPU addressing to non linear mode\r
+//\r
+\r
+//\r
+// turn off chain 4 and odd/even\r
+//\r
+ outportb (SC_INDEX,SC_MEMMODE);\r
+ outportb (SC_INDEX+1,(inportb(SC_INDEX+1)&~8)|4);\r
+\r
+ outportb (SC_INDEX,SC_MAPMASK); // leave this set throughought\r
+\r
+//\r
+// turn off odd/even and set write mode 0\r
+//\r
+ outportb (GC_INDEX,GC_MODE);\r
+ outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~0x13);\r
+\r
+//\r
+// turn off chain\r
+//\r
+ outportb (GC_INDEX,GC_MISCELLANEOUS);\r
+ outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~2);\r
+\r
+//\r
+// clear the entire buffer space, because int 10h only did 16 k / plane\r
+//\r
+ VL_ClearVideo (0);\r
+\r
+//\r
+// change CRTC scanning from doubleword to byte mode, allowing >64k scans\r
+//\r
+ outportb (CRTC_INDEX,CRTC_UNDERLINE);\r
+ outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)&~0x40);\r
+\r
+ outportb (CRTC_INDEX,CRTC_MODE);\r
+ outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)|0x40);\r
+}\r
+#endif\r
+//===========================================================================\r
+\r
+/*\r
+====================\r
+=\r
+= VL_SetSplitScreen\r
+=\r
+====================\r
+*/\r
+\r
+void VL_SetSplitScreen (int linenum)\r
+{\r
+ VL_WaitVBL (1);\r
+ linenum=linenum*2-1;\r
+ outportb (CRTC_INDEX,CRTC_LINECOMPARE);\r
+ outportb (CRTC_INDEX+1,linenum % 256);\r
+ outportb (CRTC_INDEX,CRTC_OVERFLOW);\r
+ outportb (CRTC_INDEX+1, 1+16*(linenum/256));\r
+ outportb (CRTC_INDEX,CRTC_MAXSCANLINE);\r
+ outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1) & (255-64));\r
+}\r
\r
/////////////////////////////////////////////////////////////////////////////\r
-// //\r
-// setvideo() - This function Manages the video modes //\r
-// //\r
+// //\r
+// setvideo() - This function Manages the video modes //\r
+// //\r
/////////////////////////////////////////////////////////////////////////////\r
void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv)\r
{\r
{\r
case 0: // deinit the video\r
// change to the video mode we were in before we switched to mode 13h\r
- modexLeave();\r
- in.h.ah = 0x00;\r
- in.h.al = gv->video.old_mode;\r
- int86(0x10, &in, &out);\r
+ if(gv->video.VL_Started)\r
+ {\r
+ modexLeave();\r
+ in.h.ah = 0x00;\r
+ in.h.al = gv->video.old_mode;\r
+ int86(0x10, &in, &out);\r
+ }\r
+ gv->video.VL_Started=0;\r
break;\r
default: // init the video\r
+ if(gv->video.VL_Started)\r
+ return;\r
+ if(!gv->video.VL_Initiated)\r
+ TL_VidInit(gv);\r
// get old video mode\r
//in.h.ah = 0xf;\r
//int86(0x10, &in, &out);\r
- gv->video.old_mode = vgaGetMode();//out.h.al;\r
+ gv->video.old_mode = VL_vgaGetMode();//out.h.al;\r
// enter mode\r
modexEnter(vq, cmem, gv);\r
break;\r
}\r
}\r
\r
-static void\r
-vgaSetMode(byte mode)\r
+//---------------------------------------------------\r
+//\r
+// Use the bios to set the current video mode\r
+//\r
+\r
+/*static */void\r
+VL_vgaSetMode(byte mode)\r
{\r
union REGS regs;\r
\r
regs.h.ah = SET_MODE;\r
regs.h.al = mode;\r
int86(VIDEO_INT, ®s, ®s);\r
- //int10_setmode(mode);\r
}\r
\r
//---------------------------------------------------\r
// Use the bios to get the current video mode\r
//\r
\r
-byte/*FIXME: why long? "long" is 32-bit datatype, VGA modes are 8-bit numbers. */\r
-vgaGetMode()\r
+byte\r
+VL_vgaGetMode(void)\r
{\r
return int10_getmode();\r
}\r
/* -========================= Entry Points ==========================- */\r
void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)\r
{\r
- word i;\r
+ //word i;\r
struct vga_mode_params cm;\r
//int CRTParmCount;\r
\r
- vgaSetMode(VGA_256_COLOR_MODE);\r
+ VL_vgaSetMode(VGA_256_COLOR_MODE);\r
vga_enable_256color_modex();\r
\r
update_state_from_vga();\r
switch(vq)\r
{\r
case 1:\r
+ case 8: //320x240 no buffer\r
//CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]);\r
/*for(i=0; i<CRTParmCount; i++) {\r
outpw(CRTC_INDEX, ModeX_320x240regs[i]);\r
}*/\r
- /* width and height */\r
+ // width and height //\r
gv->video.page[0].sw = vga_state.vga_width = 320; // VGA lib currently does not update this\r
gv->video.page[0].sh = vga_state.vga_height = 240; // VGA lib currently does not update this\r
- /* virtual width and height. match screen, at first */\r
+ // virtual width and height. match screen, at first //\r
gv->video.page[0].height = gv->video.page[0].sh;\r
gv->video.page[0].width = gv->video.page[0].sw;\r
\r
vga_state.vga_stride = cm.offset * 2;\r
vga_write_crtc_mode(&cm,0);\r
\r
- /* clear video memory */\r
+ // clear video memory //\r
switch (cmem)\r
{\r
- case 1: {\r
- /* clear video memory */\r
- dword far*ptr=(dword far*)vga_state.vga_graphics_ram;//VGA; /* used for faster screen clearing */\r
+ case 1:\r
+ {\r
+#if 0\r
+ dword far*ptr=(dword far*)vga_state.vga_graphics_ram;//VGA; // used for faster screen clearing //\r
vga_write_sequencer(2/*map mask register*/,0xf/*all 4 planes*/);\r
for(i = 0;i < 0x4000; i++) ptr[i] = 0x0000; // 0x4000 x dword = 64KB\r
+ // fix up the palette and everything //\r
+ modexPalBlack(); //reset the palette~//\r
+#endif\r
+ //\r
+ // clear the entire buffer space, because int 10h only did 16 k / plane\r
+ //\r
+ VL_ClearVideo (0);\r
}\r
break;\r
}\r
-\r
-// gv->video.page[0].tw = gv->video.page[0].sw/TILEWH;\r
-// gv->video.page[0].th = gv->video.page[0].sh/TILEWH;\r
-\r
- //TODO MAKE FLEXIBLE~\r
-// gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw;\r
-// gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1;\r
+//-- VL_SetLineWidth (cm.offset, gv);\r
+ //gv->video.ofs.displayofs = 0;\r
+ //gv->video.ofs.bufferofs = gv->video.page[0].width*gv->video.page[0].height;//gvar->video.page[0].pagesize;\r
+ gv->video.curr_mode=vq;\r
+ gv->video.VL_Started=1;\r
}\r
\r
-void\r
-modexLeave() {\r
- /* VGAmodeX restores original mode and palette */\r
- vgaSetMode(TEXT_MODE);\r
+void modexLeave(void)\r
+{\r
+ // VGAmodeX restores original mode and palette\r
+ VL_vgaSetMode(TEXT_MODE);\r
}\r
\r
+#if 0\r
page_t\r
modexDefaultPage(page_t *p)\r
+{\r
+ page_t page;\r
+ /* default page values */\r
+ //page.data = VGA;\r
+ //page.data = (byte far *)(vga_state.vga_graphics_ram);\r
+ page.data = (vga_state.vga_graphics_ram);\r
+ page.dx = 0;\r
+ page.dy = 0;\r
+ page.sw = p->sw;\r
+ page.sh = p->sh;\r
+ page.width = p->sw;\r
+ page.height = p->sh;\r
+ page.ti.tw = page.sw/TILEWH;\r
+ page.ti.th = page.sh/TILEWH;\r
+ page.ti.tilesw=page.width/TILEWH;\r
+ page.ti.tilesh=page.height/TILEWH;\r
+ page.ti.tilemidposscreenx = page.ti.tw/2;\r
+ page.ti.tilemidposscreeny = (page.ti.th/2)+1;\r
+ page.stridew=page.width/4;\r
+ page.pagesize = (word)(page.stridew)*page.height;\r
+ page.pi=page.width*4;\r
+ page.id = 0;\r
+ if(ggvv->video.curr_mode = 1)\r
+ {\r
+ page.width += TILEWHD;\r
+ page.height += TILEWHD;\r
+ }\r
+ return page;\r
+}\r
+#endif\r
+page_t\r
+modexDefaultPage(page_t *p, global_game_variables_t *gvar)\r
{\r
page_t page;\r
\r
page.dy = 0;\r
page.sw = p->sw;\r
page.sh = p->sh;\r
- page.width = p->sw+TILEWHD;\r
- page.height = p->sh+TILEWHD;\r
- page.tw = page.sw/TILEWH;\r
- page.th = page.sh/TILEWH;\r
- page.tilesw=page.width/TILEWH;\r
- page.tilesh=page.height/TILEWH;\r
- page.tilemidposscreenx = page.tw/2;\r
- page.tilemidposscreeny = (page.th/2)+1;\r
+ page.width = p->sw;\r
+ page.height = p->sh;\r
+ if(gvar->video.curr_mode == 1)\r
+{ page.width += TILEWHD;\r
+ page.height += TILEWHD; }\r
+ page.ti.tw = page.sw/TILEWH;\r
+ page.ti.th = page.sh/TILEWH;\r
+ page.ti.tilesw=page.width/TILEWH;\r
+ page.ti.tilesh=page.height/TILEWH;\r
+ page.ti.tilemidposscreenx = page.ti.tw/2;\r
+ page.ti.tilemidposscreeny = (page.ti.th/2)+1;\r
page.stridew=page.width/4;\r
page.pagesize = (word)(page.stridew)*page.height;\r
page.pi=page.width*4;\r
result.sh = p->sh;\r
result.width = p->width;\r
result.height = p->height;\r
- result.tw = p->tw;\r
- result.th = p->th;\r
- result.tilesw = p->tilesw;\r
- result.tilesh = p->tilesh;\r
+ result.ti.tw = p->ti.tw;\r
+ result.ti.th = p->ti.th;\r
+ result.ti.tilesw = p->ti.tilesw;\r
+ result.ti.tilesh = p->ti.tilesh;\r
result.stridew=p->stridew;\r
result.pagesize = p->pagesize;\r
result.pi=result.width*4;\r
result.sh = y;\r
result.width = x;\r
result.height = y;\r
- result.tw = result.sw/TILEWH;\r
- result.th = result.sh/TILEWH;\r
- result.tilesw=result.width/TILEWH;\r
- result.tilesh=result.height/TILEWH;\r
+ result.ti.tw = result.sw/TILEWH;\r
+ result.ti.th = result.sh/TILEWH;\r
+ result.ti.tilesw=result.width/TILEWH;\r
+ result.ti.tilesh=result.height/TILEWH;\r
result.id = p->id+1;\r
- result.stridew=p->sw/4;//result.width/4;\r
+ result.stridew=result.width/4;//p->sw/4;\r
result.pagesize = (word)(result.stridew)*result.height;\r
- switch(result.id)\r
+/* switch(result.id)\r
{\r
case 2:\r
result.pi=p->width*4;\r
case 3:\r
result.pi=p->pi;\r
break;\r
- }\r
+ }*/\r
+ result.pi=result.width*4;\r
\r
return result;\r
}\r
}\r
}\r
\r
-void modexHiganbanaPageSetup(video_t *video)\r
+void VL_Initofs(video_t *video)\r
+{\r
+ if(!video->vga_state.bgps)\r
+ {\r
+ video->ofs.offscreen_ofs = video->page[0].pagesize+video->page[1].pagesize;//(vga_state.vga_stride * vga_state.vga_height);\r
+ video->ofs.pattern_ofs = (uint16_t)video->page[2].data;\r
+ }else{\r
+ video->ofs.offscreen_ofs = 0;\r
+ video->ofs.pattern_ofs = 0;//(uint16_t)video->page[0].data;\r
+ }\r
+}\r
+\r
+void modexHiganbanaPageSetup(global_game_variables_t *gvar)\r
{\r
- video->vmem_remain=65535U;\r
- video->num_of_pages=0;\r
- (video->page[0]) = modexDefaultPage(&(video->page[0])); video->num_of_pages++; //video->page[0].width += (TILEWHD); video->page[0].height += (TILEWHD);\r
- (video->page[1]) = modexNextPage(&(video->page[0])); video->num_of_pages++;\r
-//0000 (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), (video->page[0]).width, TILEWH*4); video->num_of_pages++;\r
-//0000 (video->page[3]) = (video->page[2]); video->num_of_pages++;\r
-//// (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), TILEWH*4, TILEWH*4); video->num_of_pages++;\r
-//// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].sw, 208); video->num_of_pages++;\r
- (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), video->page[0].width, 96); video->num_of_pages++;\r
- (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].width, video->page[2].height); video->num_of_pages++;\r
- modexCalcVmemRemain(video);\r
- video->p=0;\r
- video->r=1;\r
- video->vh=video->page[0].height+video->page[1].height+video->page[3].height-8;//+video->page[2].height\r
+ gvar->video.vmem_remain=65535U;\r
+ gvar->video.num_of_pages=0;\r
+ (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);\r
+ (gvar->video.page[1]) = modexNextPage(&(gvar->video.page[0])); gvar->video.num_of_pages++;\r
+//0000 (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), (gvar->video.page[0]).width, TILEWH*4); gvar->video.num_of_pages++;\r
+//0000 (gvar->video.page[3]) = (gvar->video.page[2]); gvar->video.num_of_pages++;\r
+//// (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), TILEWH*4, TILEWH*4); gvar->video.num_of_pages++;\r
+//// (gvar->video.page[3]) = modexNextPageFlexibleSize(&(gvar->video.page[2]), gvar->video.page[0].sw, 208); gvar->video.num_of_pages++;\r
+ (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), gvar->video.page[0].width, 96); gvar->video.num_of_pages++;\r
+ (gvar->video.page[3]) = modexNextPageFlexibleSize(&(gvar->video.page[2]), gvar->video.page[0].width, 96); gvar->video.num_of_pages++;\r
+ modexCalcVmemRemain(&gvar->video);\r
+\r
+ gvar->video.sp=gvar->video.p = 0; //showpage\r
+ gvar->video.dorender = 1; //render\r
+ gvar->video.vh=gvar->video.page[0].height+gvar->video.page[1].height+gvar->video.page[2].height+gvar->video.page[3].height;\r
+\r
+ VL_Initofs(&gvar->video);\r
//doslib origi var\r
- video->omemptr= vga_state.vga_graphics_ram;\r
- video->vga_draw_stride= vga_state.vga_draw_stride;\r
- video->vga_draw_stride_limit= vga_state.vga_draw_stride_limit;\r
- //sprite render switch\r
- video->rss=0;\r
+ gvar->video.vga_state.omemptr= vga_state.vga_graphics_ram;\r
+ gvar->video.vga_state.vga_draw_stride= vga_state.vga_draw_stride;\r
+ gvar->video.vga_state.vga_draw_stride_limit= vga_state.vga_draw_stride_limit;\r
+ //sprite render switch and bgpreservation switch\r
+ gvar->video.vga_state.rss= 1;\r
+ gvar->video.vga_state.bgps= 1;\r
\r
//setup the buffersize\r
- video->page[0].dx=video->page[0].dy=\r
- video->page[1].dx=video->page[1].dy=TILEWH; // 1 tile size buffer\r
- video->page[2].dx=video->page[2].dy=\r
- video->page[3].dx=video->page[3].dy=0; // cache pages are buffer wwww\r
+ gvar->video.page[0].dx=gvar->video.page[0].dy=\r
+ gvar->video.page[1].dx=gvar->video.page[1].dy=TILEWH; // 1 tile size buffer\r
+ gvar->video.page[2].dx=gvar->video.page[2].dy=\r
+ gvar->video.page[3].dx=gvar->video.page[3].dy=0; // cache pages are buffer wwww\r
+\r
+ gvar->video.page[0].tlx=gvar->mv[0].tx*TILEWH;\r
+ gvar->video.page[0].tly=gvar->mv[0].ty*TILEWH;\r
}\r
\r
//\r
low_address = LOW_ADDRESS | (offset << 8);\r
\r
/* wait for appropriate timing and then program CRTC */\r
-//+=+= while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
+//+=+= while ((inp(STATUS_REGISTER_1) & DISPLAY_ENABLE));\r
outpw(CRTC_INDEX, high_address);\r
outpw(CRTC_INDEX, low_address);\r
outp(CRTC_INDEX, 0x13);\r
outp(CRTC_DATA, crtcOffset);\r
\r
/* wait for one retrace */\r
-//+=+= while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
+//+=+= while (!(inp(STATUS_REGISTER_1) & VRETRACE));\r
\r
/* do PEL panning here */\r
outp(AC_INDEX, 0x33);\r
outp(AC_INDEX, (page[0].dx & 0x03) << 1);\r
}\r
+\r
//args: page, vertical sync switch, screen resolution switch, page0 switch\r
void\r
-VL_ShowPage(page_t *page, boolean vsync, boolean sr) {\r
+VL_ShowPage(page_t *page, boolean vsync, boolean sr)\r
+{\r
word high_address, low_address, offset;\r
byte crtcOffset;\r
\r
- /* calculate offset */\r
+ // calculate offset\r
offset = (word) page->data;\r
- offset += page[0].dy * (page->width >> 2 );\r
- offset += page[0].dx >> 2;\r
+ offset += page->dy * (page->width >> 2 );\r
+ offset += page->dx >> 2;\r
\r
- /* calculate crtcOffset according to virtual width */\r
+ // calculate crtcOffset according to virtual width\r
switch(sr)\r
{\r
case 1:\r
high_address = HIGH_ADDRESS | (offset & 0xff00);\r
low_address = LOW_ADDRESS | (offset << 8);\r
\r
- /* wait for appropriate timing and then program CRTC */\r
- if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
+ // wait for appropriate timing and then program CRTC\r
+ if(vsync) while ((inp(STATUS_REGISTER_1) & DISPLAY_ENABLE));\r
outpw(CRTC_INDEX, high_address);\r
outpw(CRTC_INDEX, low_address);\r
outp(CRTC_INDEX, 0x13);\r
outp(CRTC_DATA, crtcOffset);\r
\r
- /* wait for one retrace */\r
- if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
+ // wait for one retrace\r
+ if(vsync) while (!(inp(STATUS_REGISTER_1) & VRETRACE));\r
\r
- /* do PEL panning here */\r
+ // do PEL panning here\r
outp(AC_INDEX, 0x33);\r
- outp(AC_INDEX, (page[0].dx & 0x03) << 1);\r
- vga_state.vga_graphics_ram = (VGA_RAM_PTR)page[0].data;\r
+ outp(AC_INDEX, (page->dx & 0x03) << 1);\r
+ vga_state.vga_graphics_ram = (VGA_RAM_PTR)page->data;\r
+ vga_state.vga_draw_stride_limit = vga_state.vga_draw_stride = page->stridew;\r
}\r
\r
//=============================================================================\r
\r
void\r
modexSelectPlane(byte plane) {\r
- outp(SC_INDEX, MAP_MASK); /* select plane */\r
+ outp(SC_INDEX, SC_MAPMASK); /* select plane */\r
outp(SC_DATA, plane);\r
}\r
\r
void\r
-modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) {\r
+modexClearRegion(page_t *page, int x, int y, int w, int h, byte color)\r
+{\r
word pageOff = (word) page->data;\r
- word xoff=x/4; /* xoffset that begins each row */\r
- word scanCount=w/4; /* number of iterations per row (excluding right clip)*/\r
- word poffset = pageOff + y*(page->stridew) + xoff; /* starting offset */\r
- word nextRow = page->stridew-scanCount-1; /* loc of next row */\r
- byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */\r
- byte rclip[] = {0x00, 0x01, 0x03, 0x07};\r
+ word xoff=(x>>2); // xoffset that begins each row\r
+ word poffset = pageOff + y*(page->stridew) + xoff; // starting offset\r
+ word scanCount=w>>2; // number of iterations per row (excluding right clip)\r
+ word nextRow = page->stridew-scanCount-1; // loc of next row\r
+ LRCLIPDEF\r
byte left = lclip[x&0x03];\r
byte right = rclip[(x+w)&0x03];\r
\r
- /* handle the case which requires an extra group */\r
+ // handle the case which requires an extra group\r
if((x & 0x03) && !((x+w) & 0x03)) {\r
- right=0x0f;\r
+ right=0x0f;\r
}\r
\r
//printf("modexClearRegion(x=%u, y=%u, w=%u, h=%u, left=%u, right=%u)\n", x, y, w, h, left, right);\r
MOV ES, AX\r
MOV DI, poffset ; go to the first pixel\r
MOV DX, SC_INDEX ; point to the map mask\r
- MOV AL, MAP_MASK\r
+ MOV AL, SC_MAPMASK\r
OUT DX, AL\r
INC DX\r
MOV AL, color ; get ready to write colors\r
word dx, word dy,\r
word width, word height)\r
{\r
- word doffset = (word)dest->data + dy*(dest->stridew) + dx/4;\r
- word soffset = (word)src->data + sy*(src->stridew) + sx/4;\r
- word scans = vga_state.vga_stride; //++++0000 the quick and dirty fix of the major issue with p16 video display wwww\r
+ word doffset = (word)dest->data + dy*(dest->stridew) + (dx>>2);\r
+ word soffset = (word)src->data + sy*(src->stridew) + (sx>>2);\r
+ word scans = vga_state.vga_stride+8; //++++0000 the quick and dirty fix of the major issue with p16 video display wwww\r
word nextSrcRow = src->stridew - scans - 1;\r
word nextDestRow = dest->stridew - scans - 1;\r
- byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */\r
- byte rclip[] = {0x00, 0x01, 0x03, 0x07};\r
+ LRCLIPDEF\r
byte left = lclip[sx&0x03];\r
byte right = rclip[(sx+width)&0x03];\r
\r
- /* handle the case which requires an extra group */\r
+ // handle the case which requires an extra group\r
if((sx & 0x03) && !((sx+width) & 0x03)) {\r
right=0x0f;\r
}\r
\r
MOV AX, SC_INDEX ; point to the mask register\r
MOV DX, AX ;\r
- MOV AL, MAP_MASK ;\r
+ MOV AL, SC_MAPMASK ;\r
OUT DX, AL ;\r
INC DX ;\r
\r
}\r
}\r
\r
+//check 16_vl_1.c\r
\r
/* fade and flash */\r
void\r
\r
/* handle the case where we just update */\r
if(iter == 0) {\r
- modexPalUpdate1(palette);\r
+ modexPalUpdate(palette);\r
return;\r
}\r
\r
tmppal[i] = 63;\r
}\r
}\r
- modexPalUpdate1(tmppal);\r
+ modexPalUpdate(tmppal);\r
iter--;\r
dim += fade;\r
}\r
}\r
\r
\r
-/* save and load */\r
-void\r
-modexPalSave(byte *palette) {\r
+// save and load\r
+void modexPalSave(byte *palette)\r
+{\r
int i;\r
\r
- outp(PAL_READ_REG, 0); /* start at palette entry 0 */\r
- for(i=0; i<PAL_SIZE; i++) {\r
- palette[i] = inp(PAL_DATA_REG); /* read the palette data */\r
+ outp(PAL_READ_REG, 0); // start at palette entry 0\r
+ for(i=0; i<PAL_SIZE; i++)\r
+ {\r
+ palette[i] = inp(PAL_DATA_REG); // read the palette data\r
}\r
}\r
\r
\r
-byte *\r
+/*byte *\r
modexNewPal() {\r
byte *ptr;\r
- ptr = malloc(PAL_SIZE);\r
+ ptr = mAlloc(PAL_SIZE);\r
\r
- /* handle errors */\r
+ // handle errors\r
if(!ptr) {\r
- printf("Could not allocate palette.\n");\r
- exit(-1);\r
+ printf("Could not Allocate palette.\n");\r
}\r
\r
return ptr;\r
-}\r
+}*/\r
\r
\r
void\r
-modexLoadPalFile(byte *filename, byte **palette) {\r
+modexLoadPalFile(byte *filename, byte *palette) {\r
FILE *file;\r
byte *ptr;\r
\r
- /* free the palette if it exists */\r
- if(*palette) {\r
- free(*palette);\r
- }\r
+ // free the palette if it exists\r
+ //if(*palette) { free(*palette); }\r
\r
- /* allocate the new palette */\r
- *palette = modexNewPal();\r
+ // allocate the new palette\r
+ //*palette = modexNewPal();\r
\r
- /* open the file */\r
+ // open the file\r
file = fopen(filename, "rb");\r
if(!file) {\r
- printf("Could not open palette file: %s\n", filename);\r
- exit(-2);\r
+ printf("Could not open palette file: %s\n", filename);\r
}\r
\r
/* read the file */\r
- ptr = *palette;\r
+ ptr = palette;\r
while(!feof(file)) {\r
*ptr++ = fgetc(file);\r
}\r
fclose(file);\r
}\r
\r
+#define COREPALSIZE 9//27 //3*9\r
\r
-void VL_LoadPalFile(const char *filename, byte *palette)\r
+void VLL_LoadPalFilewithoffset(const char *filename, byte *palette, word o, word palsize, global_game_variables_t *gvar)\r
{\r
int fd;\r
+ byte *newpalette;\r
\r
fd = open(filename,O_RDONLY|O_BINARY);\r
if (fd >= 0) {\r
- word i;\r
-\r
- read(fd,palette,768);\r
+ read(fd,palette, palsize*3);\r
close(fd);\r
\r
- vga_palette_lseek(0);\r
- for (i=0;i < 256;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2);\r
+ if(palsize==COREPALSIZE) newpalette = palette; else{ //if core then load it\r
+ newpalette = &palette[3]; //skip overscan color\r
+ if(!o) o++;\r
+ }\r
+ VL_UpdatePaletteWrite(newpalette, o, palsize, gvar);\r
}\r
}\r
\r
+//++++//\r
+void VL_SetCorePal(global_game_variables_t *gvar)\r
+{\r
+ byte *palette = &corepal;\r
+ word i;\r
+\r
+ vga_palette_lseek(0);\r
+ for (i=0;i < COREPALSIZE;i++)\r
+ vga_palette_write(palette[(i*3)+0]>>2,\r
+ palette[(i*3)+1]>>2,\r
+ palette[(i*3)+2]>>2);\r
+\r
+ VL_PaletteSync(gvar);\r
+}\r
+\r
+void VL_LoadPalFile(const char *filename, byte *palette, global_game_variables_t *gvar)\r
+{\r
+ VLL_LoadPalFilewithoffset(filename, palette,\r
+ 0, //overwrite core/system palette\r
+// COREPALSIZE, //preserved core/system palette\r
+ PAL_SIZE/3, gvar);\r
+}\r
+\r
+void VL_LoadPalFileCore(byte *palette, global_game_variables_t *gvar)\r
+{\r
+ VLL_LoadPalFilewithoffset("data/16.pal", palette, 0, COREPALSIZE, gvar);\r
+}\r
+\r
+void VL_UpdatePaletteWrite(byte *palette, word o, word p, global_game_variables_t *gvar)\r
+{\r
+ word i;\r
+\r
+ vga_palette_lseek(o);\r
+ for (i=0;i < p-o;i++)\r
+ vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2);\r
+\r
+ VL_PaletteSync(gvar);\r
+}\r
+\r
+void VL_PaletteSync(global_game_variables_t *gvar)\r
+{\r
+ modexPalSave(&gvar->video.palette);\r
+}\r
\r
void\r
modexSavePalFile(char *filename, byte *pal) {\r
file = fopen(filename, "wb");\r
if(!file) {\r
printf("Could not open %s for writing\n", filename);\r
- exit(-2);\r
}\r
\r
/* write the data to the file */\r
\r
\r
/* utility */\r
-void\r
-modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset)\r
-{\r
- byte *p = bmp->palette;\r
- word w=0;\r
- word q=0;\r
- word qq=0;\r
- static word a[PAL_SIZE]; //palette array of change values!\r
- word z=0, aq=0, aa=0, pp=0;\r
-\r
- //modexWaitBorder();\r
- vga_wait_for_vsync();\r
- if((*i)==0)\r
- {\r
- memset(a, -1, sizeof(a));\r
- outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */\r
- }\r
- else if(qp==0)\r
- {\r
- q=(*i);\r
- }\r
- else\r
- {\r
- q=(*i);\r
- qq=(*i)/3;\r
-// printf("q: %02d\n", (q));\r
-// printf("qq: %02d\n", (qq));\r
- //printf(" (*i)-q=%02d\n", (*i)-q);\r
- outp(PAL_WRITE_REG, qq); /* start at the beginning of palette */\r
- }\r
- if((*i)<PAL_SIZE/2 && w==0)\r
- {\r
- for(; (*i)<PAL_SIZE/2; (*i)++)\r
- {\r
- //if(i%3==0 && (p[i+5]==p[i+4] && p[i+4]==p[i+3] && p[i+3]==p[i+2] && p[i+2]==p[i+1] && p[i+1]==p[i] && p[i+5]==p[i]))\r
-//____ if((qp>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\r
- 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]))\r
- {\r
- w++;\r
- break;\r
- }\r
- else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))\r
- {\r
- //printf("qp=%d\n", qp);\r
- //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);\r
- printf(" %d's color=%d\n", (*i), (a[qp])-(bmp->offset*3)+qp);\r
- //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!\r
- if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }\r
- }\r
- else\r
- {\r
- if(bmp->offset==0 && (*i)<3 && q==0) outp(PAL_DATA_REG, 0);\r
- else\r
- if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);\r
- else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);\r
- printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }\r
- }\r
- }\r
- //if(qp>0) printf("qp=%d\n", qp);\r
- //if(qp>0) printf(" (*i)=%d\n", (*i)/3);\r
- }\r
- //modexWaitBorder(); /* waits one retrace -- less flicker */\r
- vga_wait_for_vsync();\r
- if((*i)>=PAL_SIZE/2 && w==0)\r
- {\r
- for(; (*i)<PAL_SIZE; (*i)++)\r
- {\r
-//____ if((qp>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\r
- 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]))\r
- {\r
- w++;\r
- break;\r
- }\r
- else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))\r
- {\r
- //printf("qp=%d\n", qp);\r
- //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);\r
- printf(" %d's color=%d\n", (*i), (a[qp]-(bmp->offset*3)+qp));\r
- //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!\r
- if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }\r
- }\r
- else\r
- {\r
- if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);\r
- else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);\r
- printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }\r
- }\r
- }\r
- //printf(" (*i)=%d\n", (*i)/3);\r
- }\r
-\r
-printf("\nqqqqqqqq\n\n");\r
-\r
- //palette checker~\r
- if(q>0 && qp==0)\r
- {\r
- long lq;\r
- long bufSize = (bmp->width * bmp->height);\r
- pp = q;\r
- //printf("1(*i)=%02d\n", (*i)/3);\r
- //printf("1z=%02d\n", z/3);\r
- modexchkcolor(bmp, &q, &a, &aa, &z, i);\r
- //printf("2(*i)=%02d\n", (*i)/3);\r
- //printf("2z=%02d\n", z/3);\r
- aq=0;\r
-aqpee:\r
- while(aq<=aa)\r
- {\r
-// printf("a[%02d]=(%d)\n", aq, a[aq]);\r
- if(a[aq]==-1) aq++;\r
- else { aqoffset++; break; }\r
- }\r
-//update the image data here!\r
- for(lq=0; lq<bufSize; lq++)\r
- {\r
- /*\r
- note to self\r
- use a[qp] instead of bmp->offset for this spot!\r
- NO! wwww\r
- */\r
-\r
- /*\r
- Facking bloody point the values of the changed palette to correct values.... major confusion! wwww\r
- */\r
-\r
- //(offset/bmp->offset)*bmp->offset\r
-\r
-\r
- //printf("%02d ",bmp->data[lq]+bmp->offset);\r
- //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
- //printf("%02d_", bmp->data[lq]+bmp->offset);\r
- /*if(bmp->data[lq]+bmp->offset==aq)\r
- {\r
- //printf("%02d", bmp->data[lq]);\r
- //printf("\n%02d\n", bmp->offset);\r
- printf("aq=%02d ", aq);\r
- printf("a[aq]=%02d ", a[aq]);\r
- printf("a[aq]+aqpp=%02d ", a[aq]+aqpp);\r
- printf("a[aq]-aqpp=%02d\n", a[aq]-aqpp);\r
- //bmp->data[lq]=((bmp->data[lq]+bmp->offset)-a[aq]);\r
-//++++ bmp->data[lq]=a[aq]-aqpp;\r
-// printf("_%d ", bmp->data[lq]);\r
- //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
- }\r
- else if(bmp->data[lq]+bmp->offset < ((*i)/3)-aqpp)\r
- {\r
- if(bmp->data[lq]+bmp->offset >= aq)\r
- {\r
- bmp->data[lq]=(bmp->data[lq]+bmp->offset)-aqpp;//-((z-(*i))/3);\r
- //printf("_%d ", bmp->data[lq]+bmp->offset)-aqpp-((z-(*i))/3);\r
- }\r
- else bmp->data[lq]+=(bmp->offset-aqpp);\r
- }*/\r
-\r
- //printf("%02d`", bmp->data[lq]);\r
- //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
- }\r
-\r
-//printf(" aq=%02d\n", aq);\r
-//printf(" aa=%02d\n", aa);\r
-\r
- //update the palette~\r
- modexPalUpdate(bmp, &pp, aq, aqoffset);\r
- (*i)=pp;\r
-\r
- if(aq<aa){ pp=q; aq++; goto aqpee; }\r
- }\r
-}\r
+//moved to 16_vlpal.c\r
\r
void\r
-modexPalUpdate1(byte *p)\r
+modexPalUpdate(byte *p)\r
{\r
int i;\r
//modexWaitBorder();\r
}\r
\r
void\r
-modexPalUpdate0(byte *p)\r
+//modexPalUpdate0(byte *p)\r
+VL_modexPalScramble(byte *p)\r
{\r
int i;\r
//modexWaitBorder();\r
}\r
}\r
\r
-void\r
-modexPalOverscan(word col)\r
+word\r
+VL_modexPalOverscan(byte *p, word col)\r
{\r
+ int i;\r
//modexWaitBorder();\r
vga_wait_for_vsync();\r
outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */\r
- outp(PAL_DATA_REG, col);\r
+ for(i=col; i<(3+col); i++)\r
+ {\r
+ outp(PAL_DATA_REG, p[i]);\r
+ }\r
+// modexPalSave(p);\r
+ return col;\r
}\r
\r
-//color checker~\r
-//i want to make another vesion that checks the palette when the palette is being appened~\r
-void modexchkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/)\r
-{\r
- byte *pal;\r
- word zz=0;\r
- pal = modexNewPal();\r
- modexPalSave(pal);\r
- //printf("q: %02d\n", (*q));\r
- printf("chkcolor start~\n");\r
- printf("1 (*z): %d\n", (*z)/3);\r
- printf("1 (*i): %d\n", (*i)/3);\r
-// printf("1 offset of color in palette (*q): %d\n", (*q)/3);\r
- printf("wwwwwwwwwwwwwwww\n");\r
- //check palette for dups\r
- for(; (*z)<PAL_SIZE; (*z)+=3)\r
- {\r
- //printf("\n z: %d\n", (*z));\r
- //printf(" q: %d\n", (*q));\r
- //printf(" z+q: %d\n\n", ((*z)+(*q)));\r
- //if((*z)%3==0)\r
- //{\r
-//---- if(pal[(*z)]==pal[(*z)+3] && pal[(*z)+1]==pal[(*z)+4] && pal[(*z)+2]==pal[(*z)+5])\r
- if((*z)==(*i))\r
- {\r
-// printf("\n%d [%02d][%02d][%02d]\n", (*z), pal[(*z)], pal[(*z)+1], pal[(*z)+2]);\r
-// printf("%d [%02d][%02d][%02d]\n\n", (*z)+3, pal[(*z)+3], pal[(*z)+4], pal[(*z)+5]);\r
-//0000 (*z)-=3;\r
- break;\r
- }\r
- else for(zz=0; zz<(*q); zz+=3)\r
- {\r
- //printf("zz: %02d\n", zz/3);\r
- if(zz%3==0)\r
- {\r
- if(pal[((*z)+(*q))]==pal[((*z)+(*q))+3] && pal[((*z)+(*q))+1]==pal[((*z)+(*q))+4] && pal[((*z)+(*q))+2]==pal[((*z)+(*q))+5]) //break if duplicate colors found in palette because it have reached the end of the current data of the palette\r
- {\r
-// (*z)-=3;\r
-// (*i)-=3;\r
-// printf("\nzq1:%d[%02d][%02d][%02d]\n", (zz+q), pal[(zz+q)], pal[(zz+q)+1], pal[(zz+q)+2]);\r
-// printf("zq2:%d[%02d][%02d][%02d]\n\n", (zz+q)+3, pal[(zz+q)+3], pal[(zz+q)+4], pal[(zz+q)+5]);\r
- break;\r
- }\r
- else if(pal[zz]==pal[((*z)+(*q))] && pal[zz+1]==pal[((*z)+(*q))+1] && pal[zz+2]==pal[((*z)+(*q))+2])\r
- {\r
-// printf("\n\nwwwwwwwwwwwwwwww\n");\r
-// printf(" zq: %d [%02d][%02d][%02d] value that is needing to be changed~\n", ((*z)+(*q))/3, pal[((*z)+(*q))], pal[((*z)+(*q))+1], pal[((*z)+(*q))+2]);\r
-// printf(" zz: %d [%02d][%02d][%02d] value that the previous value is going to change to~\n", (zz)/3, pal[zz], pal[zz+1], pal[zz+2]);\r
-// //printf(" zv: %d [%02d][%02d][%02d] wwww\n", (zz-z+q)/3, pal[(zz-z+q)], pal[(zz-z+q)+1], pal[(zz-z+q)+2]);\r
-// printf(" z : %d [%02d][%02d][%02d] offset value~\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);\r
-//++++ (*i)--;\r
-// (*z)--;\r
- //expand dong here\r
-/*\r
-planned features that i plan to implement~\r
-image that has values on the pallete list!\r
-wwww\r
-no... wait.... no wwww\r
-*/\r
- //for(zzii=0; zzii<3; zzii++)\r
- //{\r
- //printf("z+q: %d\n\n", ((*z)+(*q)));\r
- a[(((*z)+(*q)))]=zz;\r
- //}\r
- (*aa)=(((*z)+(*q)));\r
- printf("!! a[%02d]: %d\n", (((*z)+(*q))/3), zz/3);\r
-// printf("\n aa: %d\n\n", (*aa));\r
-// printf(" a[%02d]=(%02d) offset array i think the palette should be updated again~\n", ((*z)+(*q))/3, a[((*z)+(*q))/3]);\r
-// printf("wwwwwwwwwwwwwwww\n\n");\r
- }\r
- /*else\r
- {\r
- printf("================\n");\r
- printf("zq: %d [%02d][%02d][%02d]\n", ((*z)+(*q))/3, pal[((*z)+(*q))], pal[((*z)+(*q))+1], pal[((*z)+(*q))+2]);\r
- printf("zz: %d [%02d][%02d][%02d]\n", (zz)/3, pal[zz], pal[zz+1], pal[zz+2]);\r
- printf("z : %d [%02d][%02d][%02d]\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);\r
- printf("================\n");\r
- }*/\r
- //printf("[%d]", (zz+q));\r
- }\r
- }\r
- }\r
- printf("wwwwwwwwwwwwwwww\n");\r
- printf("2 (*z): %d\n", (*z)/3);\r
- printf("2 (*i): %d\n", (*i)/3);\r
-// printf("2 offset of color in palette (*q): %d\n", (*q)/3);\r
- printf("chkcolor end~\n");\r
- free(pal);\r
-}\r
+//check 16_vl_1.c\r
\r
void modexputPixel(page_t *page, int x, int y, byte color)\r
{\r
}\r
}\r
\r
-void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)\r
+void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word color, word bgcolor, boolean vidsw, const byte *str)\r
{\r
word s, o, w;\r
- word x_draw = x;\r
+ word x_draw;\r
//word addr = (word) romFontsData.l;\r
- word addrq = (page->width/4) * y + (x / 4) + ((word)page->data);\r
- word addrr = addrq;\r
+ word addrq;\r
+ word addrr;\r
byte c;\r
\r
- s=romFonts[t].seg;\r
- o=romFonts[t].off;\r
- w=romFonts[t].charSize;\r
- romFontsData.chw=0;\r
-\r
- for(; *str != '\0'; str++)\r
- {\r
- c = (*str);\r
- if(c=='\n')\r
+ switch(vidsw)\r
{\r
- x = x_draw;\r
- romFontsData.chw = 0;\r
- addrq += (page->width / 4) * 8;\r
- addrr = addrq;\r
- y += 8;\r
- continue;\r
- }\r
+ case 0:\r
+ printf("%s\n", str);\r
+ break;\r
+ case 1:\r
+ if(tlsw){ x-=page->tlx; y-=page->tly; }\r
+ x_draw = x>>2;\r
+ addrq = (page->stridew) * y + (word)(x_draw) +\r
+ ((word)page->data);\r
+ addrr = addrq;\r
+ s=romFonts[t].seg;\r
+ o=romFonts[t].off;\r
+ w=romFonts[t].charSize;\r
+ romFontsData.chw=0;\r
+\r
+ for(; *str != '\0'; str++)\r
+ {\r
+ c = (*str);\r
+ if(c=='\n')\r
+ {\r
+ x = x_draw;\r
+ romFontsData.chw = 0;\r
+ addrq += (page->stridew) * 8;\r
+ addrr = addrq;\r
+ y += 8;\r
+ continue;\r
+ }\r
\r
- // load the character into romFontsData.l\r
- // no need for inline assembly!\r
- // NTS: It might even be faster to just let the modexDrawChar point directly at ROM font than to copy per char! --J.C.\r
- _fmemcpy(romFontsData.l,MK_FP(s,o+(w*c))/*ROM font location*/,w/*char size*/);\r
- modexDrawChar(page, x_draw/*for mode X planar use*/, t, col, bgcol, addrr);\r
- x_draw += 8; /* track X for edge of screen */\r
- addrr += 2; /* move 8 pixels over (2 x 4 planar pixels per byte) */\r
+ // load the character into romFontsData.l\r
+ // no need for inline assembly!\r
+ // NTS: It might even be faster to just let the modexDrawChar point directly at ROM font than to copy per char! --J.C.\r
+ _fmemcpy(romFontsData.l,MK_FP(s,o+(w*c))/*ROM font location*/,w/*char size*/);\r
+ modexDrawChar(page, x_draw/*for mode X planar use*/, t, color, bgcolor, addrr);\r
+ x_draw += 8; /* track X for edge of screen */\r
+ addrr += 2; /* move 8 pixels over (2 x 4 planar pixels per byte) */\r
+ }\r
+ //printf("print xy:%dx%d tlxy:%dx%d\n", x, y, page->tlx, page->tly);\r
+ break;\r
}\r
}\r
\r
}\r
}\r
\r
+// short hand of modexprint\r
+void VL_print(const byte *str, nibble pagenum, global_game_variables_t *gvar)\r
+{\r
+ 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);\r
+}\r
+\r
/* palette dump on display! */\r
-void modexpdump(page_t *pee)\r
+void modexpdump(nibble pagenum, global_game_variables_t *gvar)\r
{\r
int mult=(QUADWH);\r
int palq=(mult)*TILEWH;\r
int palcol=0;\r
int palx, paly;\r
- for(paly=0; paly<palq; paly+=mult){\r
- for(palx=0; palx<palq; palx+=mult){\r
- modexClearRegion(pee, palx+TILEWH, paly+TILEWH, mult, mult, palcol);\r
+ for(paly=TILEWH*8; paly<palq+TILEWH*8; paly+=mult){\r
+ for(palx=TILEWH*12; palx<palq+TILEWH*12; palx+=mult){\r
+ modexClearRegion(&gvar->video.page[pagenum], palx+TILEWH, paly+TILEWH, mult, mult, palcol);\r
palcol++;\r
}\r
}\r
+ modexPalSave(gvar->video.palette);\r
}\r
-\r
+#if 0\r
/////////////////////////////////////////////////////////////////////////////\r
// //\r
// cls() - This clears the screen to the specified color, on the VGA or on //\r
/* set map mask to all 4 planes */\r
outpw(SC_INDEX, 0xff02);\r
//_fmemset(VGA, color, 16000);\r
- _fmemset(Where, color, page->width*(page->height)/4);\r
+ _fmemset(Where, color, page->stridew*page->height);\r
}\r
-\r
+#endif\r
//\r
// pattern filler from joncampbell123's code\r
//\r
\r
void\r
modexWaitBorder() {\r
- while(inp(INPUT_STATUS_1) & 8) {\r
+ while(inp(STATUS_REGISTER_1) & 8) {\r
// spin\r
}\r
\r
- while(!(inp(INPUT_STATUS_1) & 8)) {\r
+ while(!(inp(STATUS_REGISTER_1) & 8)) {\r
//spin\r
}\r
}\r
\r
+void\r
+modexWaitBorder_start()\r
+{\r
+ while(inp(STATUS_REGISTER_1) & 8) {\r
+ // spin\r
+ }\r
+\r
+}\r
+\r
+void\r
+modexWaitBorder_end()\r
+{\r
+ while(!(inp(STATUS_REGISTER_1) & 8)) {\r
+ // spin\r
+ }\r
+\r
+}\r
+\r
+//===========================================================================\r
+\r
//\r
// printings of video memory information\r
//\r
// printf("========================================\n");\r
printf("VL_PrintmodexmemInfo:\n");\r
// printf("========================================\n");\r
- printf(" Virtual Screen: %dx", v->page[0].width); printf("%d ", v->page[0].height); printf("Tile: %dx", v->page[0].tilesw); printf("%d", v->page[0].tilesh); printf("=((Virtual Screen)/16)\n");\r
- printf(" Screen: %dx", v->page[0].sw); printf("%d ", v->page[0].sh); printf("Tile: %dx", v->page[0].tw); printf("%d", v->page[0].th); printf("=((Screen)/16)\n");\r
-\r
- printf(" Free Video Memory: %u\n", v->vmem_remain);\r
- printf(" page");\r
- for(i=0; i<v->num_of_pages;i++)\r
+ 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");\r
+ 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");\r
+ printf(" vga_stride: %u ", vga_state.vga_stride);\r
+ printf("pagestride: %u ", v->page[0].stridew);\r
+ printf("draw_stride: %u ", vga_state.vga_draw_stride);\r
+ printf("draw_stride_limit: %u\n", vga_state.vga_draw_stride_limit);\r
+\r
+ if(v->vmem_remain)\r
+ printf(" Free Video Memory: %u\n", v->vmem_remain);\r
+ if(v->num_of_pages)\r
{\r
- printf(" [%u]=", i);\r
- printf("(%Fp)", (v->page[i].data));\r
- printf(" size=%u ", v->page[i].pagesize);\r
- printf("w=%-3lu h=%-3lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height);\r
- printf("sw=%-3lu sh=%-3lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh);\r
- printf("pi=%u", v->page[i].pi);\r
- printf("\n");\r
+ printf(" page");\r
+ for(i=0; i<v->num_of_pages;i++)\r
+ {\r
+ printf(" [%u]=", i);\r
+ printf("(%Fp)", (v->page[i].data));\r
+ printf(" size=%u ", v->page[i].pagesize);\r
+ printf("w=%-3lu h=%-3lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height);\r
+ printf("sw=%-3lu sh=%-3lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh);\r
+ printf("pi=%u", v->page[i].pi);\r
+ printf("\n");\r
+ }\r
}\r
}\r