+//===========================================================================\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
+ //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