]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_vl.c
[16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / src / lib / 16_vl.c
index 82e81375b79a804cc3ff4cc3c65b6fb1cbef0d0a..833a75a6f8f116c6c0fca834e49bc2988f4d52db 100755 (executable)
@@ -43,16 +43,18 @@ 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
-                       // get old video mode\r
-                       //in.h.ah = 0xf;\r
-                       //int86(0x10, &in, &out);\r
-                       gv->video.old_mode = vgaGetMode();//out.h.al;\r
+                       if(gv->video.VL_Started)\r
+                               return;\r
                        // enter mode\r
                        modexEnter(vq, cmem, gv);\r
                break;\r
@@ -163,6 +165,8 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
                }\r
                break;\r
        }\r
+       VL_SetLineWidth (cm.offset, &gv->video.ofs);\r
+       gv->video.VL_Started=1;\r
 }\r
 \r
 void\r
@@ -171,6 +175,39 @@ modexLeave() {
        vgaSetMode(TEXT_MODE);\r
 }\r
 \r
+/*\r
+====================\r
+=\r
+= VL_SetLineWidth\r
+=\r
+= Line witdh is in WORDS, 40 words is normal width for vgaplanegr\r
+=\r
+====================\r
+*/\r
+\r
+void VL_SetLineWidth (unsigned width, ofs_t *ofs)\r
+{\r
+       int i,offset;\r
+\r
+//\r
+// set wide virtual screen\r
+//\r
+       outport (CRTC_INDEX,CRTC_OFFSET+width*256);\r
+\r
+//\r
+// set up lookup tables\r
+//\r
+       ofs->linewidth = width*2;\r
+\r
+       offset = 0;\r
+\r
+       for (i=0;i<MAXSCANLINES;i++)\r
+       {\r
+               ofs->ylookup[i]=offset;\r
+               offset += ofs->linewidth;\r
+       }\r
+}\r
+\r
 page_t\r
 modexDefaultPage(page_t *p)\r
 {\r
@@ -416,8 +453,7 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte color)
        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
-       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[x&0x03];\r
        byte right = rclip[(x+w)&0x03];\r
 \r
@@ -498,8 +534,7 @@ modexCopyPageRegion(page_t *dest, page_t *src,
        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
@@ -580,6 +615,7 @@ modexCopyPageRegion(page_t *dest, page_t *src,
        }\r
 }\r
 \r
+//check 16_vl_1.c\r
 \r
 /* fade and flash */\r
 void\r
@@ -782,14 +818,16 @@ modexPalUpdate0(byte *p)
        }\r
 }\r
 \r
-void\r
+word\r
 modexPalOverscan(word col)\r
 {\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
+       return col;\r
 }\r
+//check 16_vl_1.c\r
 \r
 void modexputPixel(page_t *page, int x, int y, byte color)\r
 {\r
@@ -858,7 +896,7 @@ 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, boolean tlsw, word col, word bgcol, const byte *str)\r
+void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word col, word bgcol, boolean sw, const byte *str)\r
 {\r
        word s, o, w;\r
        word x_draw;\r
@@ -867,38 +905,46 @@ void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word col,
        word addrr;\r
        byte c;\r
 \r
-       if(tlsw){ x-=page->tlx; y-=page->tly; }\r
-       x_draw = x/4;\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
+       switch(sw)\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/4;\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, 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
+                       }\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
@@ -1103,6 +1149,8 @@ modexWaitBorder_end()
 \r
 }\r
 \r
+//===========================================================================\r
+\r
 //\r
 // printings of video memory information\r
 //\r