]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/modex16.c
vgamodex uses gvar now!
[16.git] / src / lib / modex16.c
index acc0058b7950f7f23c96b1a77f17b593cd8e0e62..02fc24062c5d8760fe21a995a2b2c89a68f31b0d 100644 (file)
@@ -20,9 +20,6 @@
  *\r
  */\r
 \r
-#include <dos.h>\r
-#include <string.h>\r
-#include <mem.h>\r
 #include <conio.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -32,6 +29,36 @@ byte far* VGA=(byte far*) 0xA0000000;   /* this points to video memory. */
 \r
 static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette);\r
 static byte tmppal[PAL_SIZE];\r
+//int old_mode;\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//                                                                                                                                                                                                                                             //\r
+// setvideo() - This function Manages the video modes                                                                                          //\r
+//                                                                                                                                                                                                                                             //\r
+/////////////////////////////////////////////////////////////////////////////\r
+void VGAmodeX(sword vq, global_game_variables_t *gv)\r
+{\r
+       union REGS in, out;\r
+\r
+       if(!vq)\r
+       { // 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->old_mode;\r
+               int86(0x10, &in, &out);\r
+\r
+       }\r
+       else if(vq==1)\r
+       { // init the video\r
+               // get old video mode\r
+               in.h.ah = 0xf;\r
+               int86(0x10, &in, &out);\r
+               gv->old_mode = out.h.al;\r
+               // enter mode\r
+               modexEnter();\r
+       }\r
+}\r
 \r
 static void\r
 vgaSetMode(byte mode)\r
@@ -942,67 +969,165 @@ no... wait.... no wwww
                 free(pal);\r
 }\r
 \r
-void modexputPixel(int x, int y, byte color)\r
+void modexputPixel(page_t *page, int x, int y, byte color)\r
 {\r
+       word pageOff = (word) page->data;\r
         /* Each address accesses four neighboring pixels, so set\r
            Write Plane Enable according to which pixel we want\r
            to modify.  The plane is determined by the two least\r
            significant bits of the x-coordinate: */\r
-       outp(SC_INDEX, 0x02);\r
-       outp(SC_DATA, 0x01 << (x & 3));\r
+       modexSelectPlane(PLANE(x));\r
+       //outp(SC_INDEX, 0x02);\r
+       //outp(SC_DATA, 0x01 << (x & 3));\r
 \r
        /* The offset of the pixel into the video segment is\r
           offset = (width * y + x) / 4, and write the given\r
           color to the plane we selected above.  Heed the active\r
           page start selection. */\r
-       VGA[(unsigned)((SCREEN_WIDTH/4) * y) + (x / 4) + 0] = color;\r
+       VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff] = color;\r
 \r
 }\r
 \r
-byte modexgetPixel(int x, int y)\r
+byte modexgetPixel(page_t *page, int x, int y)\r
 {\r
+       word pageOff = (word) page->data;\r
        /* Select the plane from which we must read the pixel color: */\r
        outpw(GC_INDEX, 0x04);\r
        outpw(GC_INDEX+1, x & 3);\r
 \r
-       return VGA[(unsigned)((SCREEN_WIDTH/4) * y) + (x / 4) + 0];\r
+       return VGA[(unsigned)((page->width/4) * y) + (x / 4) + pageOff];\r
+\r
+}\r
+\r
+void modexhlin(page_t *page, word xl, word xh, word y, word color)\r
+{\r
+       word x;\r
+       word yy=0;\r
+\r
+       for(x=0;x<xh*4;x+=4)\r
+       {\r
+               if(x+4>=SCREEN_WIDTH-1){ x=0; yy+=4; }\r
+               modexClearRegion(page, x+xl, y+yy, 4, 4, color);\r
+       }\r
+       //modexputPixel(page, x+xl, y, color);\r
+}\r
+\r
+void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)\r
+{\r
+       word i, s, o, w, j, xp;\r
+       byte l[1024];\r
+       word addr = (word) l;\r
+       word chw=0;\r
+       byte c;\r
+\r
+       switch(t)\r
+       {\r
+               case 0:\r
+                       w=14;\r
+               break;\r
+               case 1:\r
+                       w=8;\r
+               break;\r
+               case 2:\r
+                       w=8;\r
+               break;\r
+               case 3:\r
+                       w=16;\r
+               break;\r
+               default:\r
+                       t=3;\r
+                       w=16;\r
+               break;\r
+       }\r
+\r
+       s=romFonts[t].seg;\r
+       o=romFonts[t].off;\r
+\r
+       for(; *str != '\0'; str++)\r
+       {\r
+       c = (*str);\r
+       if((c=='\n'/* || c=="\\r
+"*/) || chw\r
+>=page->width)\r
+       {\r
+               chw=0;\r
+               y+=w;\r
+               continue;\r
+       }\r
+       //load the letter 'A'\r
+       __asm {\r
+               MOV DI, addr\r
+               MOV SI, o\r
+               MOV ES, s\r
+               SUB AH, AH\r
+               MOV AL, c       ; the letter\r
+               MOV CX, w\r
+               MUL CX\r
+               ADD SI, AX      ;the address of charcter\r
+       L1:     MOV AX, ES:SI\r
+               MOV DS:DI, AX\r
+               INC SI\r
+               INC DI\r
+               DEC CX\r
+               JNZ L1\r
+       }\r
 \r
+               for(i=0; i<w; i++)\r
+               {\r
+                       j=1<<8;\r
+                       xp=0;\r
+                       while(j)\r
+                       {\r
+                               modexputPixel(page, x+xp+chw, y+i, l[i] & j ? col:bgcol);\r
+                               xp++;\r
+                               j>>=1;\r
+                       }\r
+               }\r
+               chw += xp;\r
+       }\r
 }\r
 \r
-void modexprint(word x, word y, word t, word col, const byte *str)\r
-{
-       word i, s, o, w, j, xp;
-       byte l[16];\r
-       word addr = (word) l;
-       word chw=0;
-       byte c;
-
+void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)\r
+{\r
+       word i, s, o, w, j, xp;\r
+       byte l[1024];\r
+       word addr = (word) l;\r
+       word chw=0;\r
+       byte c;\r
+\r
        switch(t)\r
        {\r
-               case 0:
+               case 0:\r
                        w=14;\r
                break;\r
-               case 1:
+               case 1:\r
                        w=8;\r
                break;\r
-               case 2:
+               case 2:\r
                        w=8;\r
                break;\r
-               case 3:
+               case 3:\r
                        w=16;\r
                break;\r
-               default:
+               default:\r
                        t=3;\r
                        w=16;\r
                break;\r
-       }
+       }\r
 \r
        s=romFonts[t].seg;\r
-       o=romFonts[t].off;
+       o=romFonts[t].off;\r
 \r
        for(; *str != '\0'; str++)\r
-       {
-       c = *(str);
+       {\r
+       c = (*str);\r
+       if((c=='\n'/* || c=="\\r
+"*/)/* || chw>=page->width*/)\r
+       {\r
+               chw=0;\r
+               y+=w;\r
+               continue;\r
+       }\r
        //load the letter 'A'\r
        __asm {\r
                MOV DI, addr\r
@@ -1019,20 +1144,21 @@ void modexprint(word x, word y, word t, word col, const byte *str)
                INC DI\r
                DEC CX\r
                JNZ L1\r
-       }
+       }\r
 \r
-               for(i=0; i<w; i++)
+               for(i=0; i<w; i++)\r
                {\r
-                       j=1<<8;
+                       j=1<<8;\r
                        xp=0;\r
-                       while(j)
-                       {
-                               modexputPixel(x+xp+chw, y+i, l[i] & j ? col:0);
-                               xp++;
-                               j>>=1;
-                       }
+                       while(j)\r
+                       {\r
+                               //modexputPixel(page, x+xp+chw, y+i, l[i] & j ? col:bgcol);\r
+                               modexClearRegion(page, (x+xp+chw)*8, (y+i)*8, 8, 8, l[i] & j ? col:bgcol);\r
+                               xp++;\r
+                               j>>=1;\r
+                       }\r
                }\r
-               chw += 8;\r
+               chw += xp;\r
        }\r
 }\r
 \r