OSDN Git Service

got pcxtest.exe to compile and work
[proj16/16.git] / src / lib / 16_vl.c
index 71c5667..1207c84 100755 (executable)
@@ -1,5 +1,5 @@
 /* Project 16 Source Code~\r
- * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
+ * Copyright (C) 2012-2022 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
  *\r
  * This file is part of Project 16.\r
  *\r
 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
@@ -43,31 +213,43 @@ void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv)
        {\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, &regs, &regs);\r
-  //int10_setmode(mode);\r
 }\r
 \r
 //---------------------------------------------------\r
@@ -75,8 +257,8 @@ vgaSetMode(byte mode)
 // 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
@@ -84,11 +266,11 @@ vgaGetMode()
 /* -========================= 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
@@ -101,14 +283,15 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
        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
@@ -150,31 +333,75 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
        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
+                       // 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
+//--   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
        /* default page values */\r
        //page.data = VGA;\r
@@ -184,8 +411,11 @@ modexDefaultPage(page_t *p)
        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.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
@@ -274,7 +504,7 @@ void modexCalcVmemRemain(video_t *video)
 \r
 void VL_Initofs(video_t *video)\r
 {\r
-       if(!video->bgps)\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
@@ -284,38 +514,41 @@ void VL_Initofs(video_t *video)
        }\r
 }\r
 \r
-void modexHiganbanaPageSetup(video_t *video)\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, 96);      video->num_of_pages++;\r
-       modexCalcVmemRemain(video);\r
-\r
-       video->sp=video->p =    0;      //showpage\r
-       video->dorender =       1;                      //render\r
-       video->vh=video->page[0].height+video->page[1].height+video->page[2].height+video->page[3].height;\r
-\r
-       VL_Initofs(video);\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
+       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
-       video->rss=             1;\r
-       video->bgps=    1;\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
@@ -338,14 +571,14 @@ modexShowPage(page_t *page) {
        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
@@ -354,7 +587,8 @@ modexShowPage(page_t *page) {
 \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
@@ -379,19 +613,20 @@ VL_ShowPage(page_t *page, boolean vsync, boolean sr) {
        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
+       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
+       if(vsync) while (!(inp(STATUS_REGISTER_1) & VRETRACE));\r
 \r
        // do PEL panning here\r
        outp(AC_INDEX, 0x33);\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
@@ -404,25 +639,25 @@ modexPanPage(page_t *page, int dx, int dy) {
 \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
@@ -440,7 +675,7 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte  color) {
                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
@@ -492,17 +727,16 @@ modexCopyPageRegion(page_t *dest, page_t *src,
                        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
@@ -530,7 +764,7 @@ modexCopyPageRegion(page_t *dest, page_t *src,
 \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
@@ -579,6 +813,7 @@ modexCopyPageRegion(page_t *dest, page_t *src,
        }\r
 }\r
 \r
+//check 16_vl_1.c\r
 \r
 /* fade and flash */\r
 void\r
@@ -632,14 +867,15 @@ fadePalette(sbyte fade, sbyte start, word iter, byte *palette) {
 }\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
@@ -649,36 +885,98 @@ modexNewPal() {
        byte *ptr;\r
        ptr = malloc(PAL_SIZE);\r
 \r
-       /* handle errors */\r
+       // handle errors\r
        if(!ptr) {\r
-               printf("Could not allocate palette.\n");\r
+               printf("Could not Allocate palette.\n");\r
        }\r
 \r
        return ptr;\r
 }\r
 \r
+static struct pcxHeader {\r
+    byte id;\r
+    byte version;\r
+    byte encoding;\r
+    byte bpp;\r
+    word xmin;\r
+    word ymin;\r
+    word xmax;\r
+    word ymax;\r
+    word hres;\r
+    word vres;\r
+    byte pal16[48];\r
+    byte res1;\r
+    word bpplane;\r
+    word palType;\r
+    word hScreenSize;\r
+    word vScreenSize;\r
+    byte padding[54];\r
+} head;\r
+\r
+\r
+static void loadPcxStage1(FILE *file, bitmap_t *result) {\r
+    long bufSize;\r
+    int index;\r
+    byte count, val;\r
+    long int pos;\r
+\r
+    /* read the header */\r
+    fread(&head, sizeof(char), sizeof(struct pcxHeader), file);\r
+\r
+    /* get the width and height */\r
+    result->width = head.xmax - head.xmin + 1;\r
+    result->height = head.ymax - head.ymin + 1;\r
+\r
+    /* make sure this  is 8bpp */\r
+    if(head.bpp != 8) {\r
+       printf("I only know how to handle 8bpp pcx files!\n");\r
+       fclose(file);\r
+       exit(-2);\r
+    }\r
+}\r
+\r
+void loadPcxPalette(FILE *file, bitmap_t *result) {\r
+    byte val;\r
+    int index;\r
+\r
+    /* handle the palette */\r
+    fseek(file, -769, SEEK_END);\r
+    val = fgetc(file);\r
+    result->palette = modexNewPal();\r
+    if(head.version == 5 && val == 12) {\r
+       /* use the vga palette */\r
+       for(index=0; !feof(file) && index < PAL_SIZE; index++) {\r
+           val = fgetc(file);\r
+           result->palette[index] = val >> 2;\r
+       }\r
+    } else {\r
+       /* use the 16 color palette */\r
+       for(index=0; index<48; index++) {\r
+           result->palette[index]  = head.pal16[index];\r
+       }\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
+               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
@@ -686,28 +984,485 @@ modexLoadPalFile(byte *filename, byte **palette) {
        fclose(file);\r
 }\r
 \r
+bitmap_t\r
+bitmapLoadPcx(char *filename) {\r
+    FILE *file;\r
+    bitmap_t result;\r
+    long bufSize;\r
+    int index;\r
+    byte count, val;\r
+\r
+    /* open the PCX file for reading */\r
+    file = fopen(filename, "rb");\r
+    if(!file) {\r
+       printf("Could not open %s for reading.\n", filename);\r
+       exit(-2);\r
+    }\r
+\r
+    /* load the first part of the pcx file */\r
+    loadPcxStage1(file, &result);\r
+\r
+    /* allocate the buffer */\r
+    bufSize = result.width * result.height;\r
+    result.data = malloc(bufSize);\r
+    if(!result.data) {\r
+       printf("Could not allocate memory for bitmap data.");\r
+       fclose(file);\r
+       exit(-1);\r
+    }\r
+\r
+    /*  read the buffer in */\r
+    index = 0;\r
+    do {\r
+       /* get the run length and the value */\r
+       count = fgetc(file);\r
+       if(0xC0 ==  (count & 0xC0)) { /* this is the run count */\r
+           count &= 0x3f;\r
+           val = fgetc(file);\r
+       } else {\r
+           val = count;\r
+           count = 1;\r
+       }\r
+\r
+       /* write the pixel the specified number of times */\r
+       for(; count && index < bufSize; count--,index++)  {\r
+           result.data[index] = val;\r
+       }\r
+    } while(index < bufSize);\r
+\r
+    loadPcxPalette(file, &result);\r
+\r
+    fclose(file);\r
+\r
+    return result;\r
+}\r
+\r
+\r
+tileset_t\r
+bitmapLoadPcxTiles(char *filename, word twidth, word theight) {\r
+    tileset_t ts;\r
+    FILE *file;\r
+    bitmap_t result;\r
+    int i;\r
+\r
+    /* open the PCX file for reading */\r
+    file = fopen(filename, "rb");\r
+    if(!file) {\r
+       printf("Could not open %s for reading.\n", filename);\r
+       exit(-2);\r
+    }\r
+\r
+    /* load the first part of the pcx file */\r
+    loadPcxStage1(file, &result);\r
+\r
+    /* get the number of tiles and set up the result structure */\r
+    ts.twidth = twidth;\r
+    ts.theight = theight;\r
+    ts.ntiles = (result.width/twidth) * (result.height/theight);\r
+    ts.palette = result.palette;\r
+\r
+    /* allocate the pixel storage for the tiles */\r
+    ts.data = malloc(sizeof(byte*) * ts.ntiles);\r
+    ts.data[0] = malloc(sizeof(byte) * ts.ntiles * twidth * theight);\r
+    for(i=1; i < ts.ntiles; i++) {\r
+       ts.data[i] = ts.data[i-1] + twidth * theight;\r
+    }\r
+\r
+    /* finish off the file */\r
+    loadPcxPalette(file, &result);\r
+\r
+    fclose(file);\r
 \r
-void VL_LoadPalFile(const char *filename, byte *palette)\r
+    return ts;\r
+}\r
+\r
+void\r
+oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite)\r
 {\r
-       VL_LoadPalFilewithoffset(filename, palette, 0);\r
+       byte plane;\r
+       word px, py;\r
+       word offset;\r
+\r
+       /* TODO Make this fast.  It's SLOOOOOOW */\r
+       for(plane=0; plane < 4; plane++) {\r
+               modexSelectPlane(PLANE(plane+x));\r
+               for(px = plane; px < bmp->width; px+=4) {\r
+                       offset=px;\r
+                       for(py=0; py<bmp->height; py++) {\r
+                       if(!sprite || bmp->data[offset])\r
+                               page[PAGE_OFFSET(x+px, y+py)] = bmp->data[offset];\r
+                       offset+=bmp->width;\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+//* normal versions *//\r
+void\r
+modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp) {\r
+    /* draw the region (the entire freakin bitmap) */\r
+    modexDrawBmpRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
+}\r
+\r
+void\r
+modexDrawBmpRegion(page_t *page, int x, int y,\r
+                  int rx, int ry, int rw, int rh, bitmap_t *bmp) {\r
+       word poffset = (word)page->data + y*(page->width/4) + x/4;\r
+       byte *data = bmp->data;//+bmp->offset;\r
+       word bmpOffset = (word) data + ry * bmp->width + rx;\r
+       word width = rw;\r
+       word height = rh;\r
+       byte plane = 1 << ((byte) x & 0x03);\r
+       word scanCount = width/4 + (width%4 ? 1 :0);\r
+       word nextPageRow = page->width/4 - scanCount;\r
+       word nextBmpRow = (word) bmp->width - width;\r
+       word rowCounter=0;\r
+       byte planeCounter = 4;\r
+\r
+    __asm {\r
+               MOV AX, SCREEN_SEG      ; go to the VGA memory\r
+               MOV ES, AX\r
+\r
+               MOV DX, SC_INDEX        ; point at the map mask register\r
+               MOV AL, SC_MAPMASK      ;\r
+               OUT DX, AL            ;\r
+\r
+       PLANE_LOOP:\r
+               MOV DX, SC_DATA  ; select the current plane\r
+               MOV AL, plane      ;\r
+               OUT DX, AL            ;\r
+\r
+               ;-- begin plane painting\r
+               MOV AX, height    ; start the row counter\r
+               MOV rowCounter, AX      ;\r
+               MOV DI, poffset  ; go to the first pixel\r
+               MOV SI, bmpOffset       ; go to the bmp pixel\r
+       ROW_LOOP:\r
+               MOV CX, width      ; count the columns\r
+       SCAN_LOOP:\r
+               MOVSB              ; copy the pixel\r
+               SUB CX, 3              ; we skip the next 3\r
+               ADD SI, 3              ; skip the bmp pixels\r
+               LOOP SCAN_LOOP    ; finish the scan\r
+\r
+               MOV AX, nextPageRow\r
+               ADD DI, AX            ; go to the next row on screen\r
+               MOV AX, nextBmpRow\r
+               ADD SI, AX            ; go to the next row on bmp\r
+\r
+               DEC rowCounter\r
+               JNZ ROW_LOOP        ; do all the rows\r
+               ;-- end plane painting\r
+               MOV AL, plane      ; advance to the next plane\r
+               SHL AL, 1              ;\r
+               AND AL, 0x0f        ; mask the plane properly\r
+               MOV plane, AL      ; store the plane\r
+\r
+               INC bmpOffset      ; start bmp at the right spot\r
+\r
+               DEC planeCounter\r
+               JNZ PLANE_LOOP    ; do all 4 planes\r
+    }\r
+}\r
+\r
+void\r
+modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp) {\r
+    /* draw the whole sprite */\r
+    modexDrawSpriteRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
+}\r
+\r
+void\r
+modexDrawSpriteRegion(page_t *page, int x, int y,\r
+                     int rx, int ry, int rw, int rh, bitmap_t *bmp) {\r
+       word poffset = (word)page->data + y*(page->width/4) + x/4;\r
+       byte *data = bmp->data;//+bmp->offset;\r
+       word bmpOffset = (word) data + ry * bmp->width + rx;\r
+       word width = rw;\r
+       word height = rh;\r
+       byte plane = 1 << ((byte) x & 0x03);\r
+       word scanCount = width/4 + (width%4 ? 1 :0);\r
+       word nextPageRow = page->width/4 - scanCount;\r
+       word nextBmpRow = (word) bmp->width - width;\r
+       word rowCounter=0;\r
+       byte planeCounter = 4;\r
+\r
+    __asm {\r
+               MOV AX, SCREEN_SEG      ; go to the VGA memory\r
+               MOV ES, AX\r
+\r
+               MOV DX, SC_INDEX        ; point at the map mask register\r
+               MOV AL, SC_MAPMASK      ;\r
+               OUT DX, AL            ;\r
+\r
+       PLANE_LOOP:\r
+               MOV DX, SC_DATA  ; select the current plane\r
+               MOV AL, plane      ;\r
+               OUT DX, AL            ;\r
+\r
+               ;-- begin plane painting\r
+               MOV AX, height    ; start the row counter\r
+               MOV rowCounter, AX      ;\r
+               MOV DI, poffset  ; go to the first pixel\r
+               MOV SI, bmpOffset       ; go to the bmp pixel\r
+       ROW_LOOP:\r
+               MOV CX, width      ; count the columns\r
+       SCAN_LOOP:\r
+               LODSB\r
+               DEC SI\r
+               CMP AL, 0\r
+               JNE DRAW_PIXEL    ; draw non-zero pixels\r
+\r
+               INC DI            ; skip the transparent pixel\r
+               ADD SI, 1\r
+               JMP NEXT_PIXEL\r
+       DRAW_PIXEL:\r
+               MOVSB              ; copy the pixel\r
+       NEXT_PIXEL:\r
+               SUB CX, 3              ; we skip the next 3\r
+               ADD SI, 3              ; skip the bmp pixels\r
+               LOOP SCAN_LOOP    ; finish the scan\r
+\r
+               MOV AX, nextPageRow\r
+               ADD DI, AX            ; go to the next row on screen\r
+               MOV AX, nextBmpRow\r
+               ADD SI, AX            ; go to the next row on bmp\r
+\r
+               DEC rowCounter\r
+               JNZ ROW_LOOP        ; do all the rows\r
+               ;-- end plane painting\r
+\r
+               MOV AL, plane      ; advance to the next plane\r
+               SHL AL, 1              ;\r
+               AND AL, 0x0f        ; mask the plane properly\r
+               MOV plane, AL      ; store the plane\r
+\r
+               INC bmpOffset      ; start bmp at the right spot\r
+\r
+               DEC planeCounter\r
+               JNZ PLANE_LOOP    ; do all 4 planes\r
+    }\r
+}\r
+\r
+//* planar buffer versions *//\r
+void\r
+modexDrawBmpPBuf(page_t *page, int x, int y, planar_buf_t *bmp) {\r
+    /* draw the region (the entire freakin bitmap) */\r
+    modexDrawBmpPBufRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
+}\r
+\r
+void\r
+modexDrawBmpPBufRegion(page_t *page, int x, int y,\r
+                  int rx, int ry, int rw, int rh, planar_buf_t *bmp) {\r
+       word poffset = (word) page->data  + y*(page->width/4) + x/4;\r
+       byte *data = (byte *)bmp->plane[0];\r
+       word bmpOffset = (word) data + ry * bmp->width + rx;\r
+       word width = rw;\r
+       word height = rh;\r
+       byte plane = 1 << ((byte) x & 0x03);\r
+       word scanCount = width/4 + (width%4 ? 1 :0);\r
+       word nextPageRow = page->width/4 - scanCount;\r
+       word nextBmpRow = (word) bmp->width - width;\r
+       word rowCounter=0;\r
+       byte planeCounter = 4;\r
+\r
+    __asm {\r
+               MOV AX, SCREEN_SEG      ; go to the VGA memory\r
+               MOV ES, AX\r
+\r
+               MOV DX, SC_INDEX        ; point at the map mask register\r
+               MOV AL, SC_MAPMASK      ;\r
+               OUT DX, AL            ;\r
+\r
+       PLANE_LOOP:\r
+               MOV DX, SC_DATA  ; select the current plane\r
+               MOV AL, plane      ;\r
+               OUT DX, AL            ;\r
+\r
+               ;-- begin plane painting\r
+               MOV AX, height    ; start the row counter\r
+               MOV rowCounter, AX      ;\r
+               MOV DI, poffset  ; go to the first pixel\r
+               MOV SI, bmpOffset       ; go to the bmp pixel\r
+       ROW_LOOP:\r
+               MOV CX, width      ; count the columns\r
+       SCAN_LOOP:\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+               MOVSB              ; copy the pixel\r
+\r
+               SUB CX, 3              ; we skip the next 3\r
+               ADD SI, 3              ; skip the bmp pixels\r
+               LOOP SCAN_LOOP    ; finish the scan\r
+\r
+               MOV AX, nextPageRow\r
+               ADD DI, AX            ; go to the next row on screen\r
+               MOV AX, nextBmpRow\r
+               ADD SI, AX            ; go to the next row on bmp\r
+\r
+               DEC rowCounter\r
+               JNZ ROW_LOOP        ; do all the rows\r
+               ;-- end plane painting\r
+\r
+               MOV AL, plane      ; advance to the next plane\r
+               SHL AL, 1              ;\r
+               AND AL, 0x0f        ; mask the plane properly\r
+               MOV plane, AL      ; store the plane\r
+\r
+               INC bmpOffset      ; start bmp at the right spot\r
+\r
+               DEC planeCounter\r
+               JNZ PLANE_LOOP    ; do all 4 planes\r
+    }\r
+}\r
+\r
+void\r
+modexDrawSpritePBuf(page_t *page, int x, int y, planar_buf_t *bmp) {\r
+    /* draw the whole sprite */\r
+    modexDrawSpritePBufRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
+}\r
+\r
+void\r
+modexDrawSpritePBufRegion(page_t *page, int x, int y,\r
+                     int rx, int ry, int rw, int rh, planar_buf_t *bmp) {\r
+       word poffset = (word)page->data + y*(page->width/4) + x/4;\r
+       byte *data = (byte *)bmp->plane[0];\r
+       word bmpOffset = (word) data + ry * bmp->width + rx;\r
+       word width = rw;\r
+       word height = rh;\r
+       byte plane = 1 << ((byte) x & 0x03);\r
+       word scanCount = width/4 + (width%4 ? 1 :0);\r
+       word nextPageRow = page->width/4 - scanCount;\r
+       word nextBmpRow = (word) bmp->width - width;\r
+       word rowCounter=0;\r
+       byte planeCounter = 4;\r
+\r
+    __asm {\r
+               MOV AX, SCREEN_SEG      ; go to the VGA memory\r
+               MOV ES, AX\r
+\r
+               MOV DX, SC_INDEX        ; point at the map mask register\r
+               MOV AL, SC_MAPMASK      ;\r
+               OUT DX, AL            ;\r
+\r
+       PLANE_LOOP:\r
+               MOV DX, SC_DATA  ; select the current plane\r
+               MOV AL, plane      ;\r
+               OUT DX, AL            ;\r
+\r
+               ;-- begin plane painting\r
+               MOV AX, height    ; start the row counter\r
+               MOV rowCounter, AX      ;\r
+               MOV DI, poffset  ; go to the first pixel\r
+               MOV SI, bmpOffset       ; go to the bmp pixel\r
+       ROW_LOOP:\r
+               MOV CX, width      ; count the columns\r
+       SCAN_LOOP:\r
+               LODSB\r
+               DEC SI\r
+               CMP AL, 0\r
+               JNE DRAW_PIXEL    ; draw non-zero pixels\r
+\r
+               INC DI            ; skip the transparent pixel\r
+               ADD SI, 1\r
+               JMP NEXT_PIXEL\r
+       DRAW_PIXEL:\r
+               MOVSB              ; copy the pixel\r
+       NEXT_PIXEL:\r
+               SUB CX, 3              ; we skip the next 3\r
+               ADD SI, 3              ; skip the bmp pixels\r
+               LOOP SCAN_LOOP    ; finish the scan\r
+\r
+               MOV AX, nextPageRow\r
+               ADD DI, AX            ; go to the next row on screen\r
+               MOV AX, nextBmpRow\r
+               ADD SI, AX            ; go to the next row on bmp\r
+\r
+               DEC rowCounter\r
+               JNZ ROW_LOOP        ; do all the rows\r
+               ;-- end plane painting\r
+\r
+               MOV AL, plane      ; advance to the next plane\r
+               SHL AL, 1              ;\r
+               AND AL, 0x0f        ; mask the plane properly\r
+               MOV plane, AL      ; store the plane\r
+\r
+               INC bmpOffset      ; start bmp at the right spot\r
+\r
+               DEC planeCounter\r
+               JNZ PLANE_LOOP    ; do all 4 planes\r
+    }\r
 }\r
 \r
-void VL_LoadPalFilewithoffset(const char *filename, byte *palette, word o)\r
+#define COREPALSIZE 9//27      //3*9\r
+\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,        PAL_SIZE);\r
+               read(fd,palette,        palsize*3);\r
                close(fd);\r
 \r
-               vga_palette_lseek(1+o);\r
-               for (i=o;i < 255-o;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
@@ -762,7 +1517,8 @@ modexPalUpdate(byte *p)
 }\r
 \r
 void\r
-modexPalUpdate0(byte *p)\r
+//modexPalUpdate0(byte *p)\r
+VL_modexPalScramble(byte *p)\r
 {\r
        int i;\r
        //modexWaitBorder();\r
@@ -780,15 +1536,23 @@ modexPalUpdate0(byte *p)
        }\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
+//check 16_vl_1.c\r
+\r
 void modexputPixel(page_t *page, int x, int y, byte color)\r
 {\r
        word pageOff = (word) page->data;\r
@@ -856,47 +1620,55 @@ void modexDrawChar(page_t *page, int x/*for planar selection only*/, word t, wor
        }\r
 }\r
 \r
-void modexprint(page_t *page, sword x, sword 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
-       sword x_draw;\r
+       word x_draw;\r
        //word addr = (word) romFontsData.l;\r
        word addrq;\r
        word addrr;\r
        byte c;\r
 \r
-       x-=page->tlx; y-=page->tly;\r
-       x_draw = x/4;\r
-       addrq = (page->stridew) * y + (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
+       switch(vidsw)\r
        {\r
-               c = (*str);\r
-               if(c=='\n')\r
-               {\r
-                       x = x_draw;\r
-                       romFontsData.chw = 0;\r
-                       addrq += (page->stridew) * 8;\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
-                       y += 8;\r
-                       continue;\r
-               }\r
+                       s=romFonts[t].seg;\r
+                       o=romFonts[t].off;\r
+                       w=romFonts[t].charSize;\r
+                       romFontsData.chw=0;\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
+                       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, 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
-       //printf("print xy:%dx%d        tlxy:%dx%d\n", x, y, page->tlx, page->tly);\r
 }\r
 \r
 void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)\r
@@ -992,21 +1764,28 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c
        }\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
@@ -1021,7 +1800,7 @@ void modexcls(page_t *page, byte color, byte *Where)
        //_fmemset(VGA, color, 16000);\r
        _fmemset(Where, color, page->stridew*page->height);\r
 }\r
-\r
+#endif\r
 //\r
 // pattern filler from joncampbell123's code\r
 //\r
@@ -1074,11 +1853,11 @@ void VL_PatternDraw(video_t *video, word pn, boolean sw, boolean allsw)
 \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
@@ -1086,7 +1865,7 @@ modexWaitBorder() {
 void\r
 modexWaitBorder_start()\r
 {\r
-       while(inp(INPUT_STATUS_1)  & 8)  {\r
+       while(inp(STATUS_REGISTER_1)  & 8)  {\r
        // spin\r
        }\r
 \r
@@ -1095,12 +1874,14 @@ modexWaitBorder_start()
 void\r
 modexWaitBorder_end()\r
 {\r
-       while(!(inp(INPUT_STATUS_1)  & 8))  {\r
+       while(!(inp(STATUS_REGISTER_1)  & 8))  {\r
        // spin\r
        }\r
 \r
 }\r
 \r
+//===========================================================================\r
+\r
 //\r
 // printings of video memory information\r
 //\r
@@ -1113,17 +1894,25 @@ void VL_PrintmodexmemInfo(video_t *v)
 //     printf("========================================\n");\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
-\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("  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