]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/modex16.c
modified: 16.exe
[16.git] / src / lib / modex16.c
old mode 100644 (file)
new mode 100755 (executable)
index acc0058..e3e7039
@@ -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
@@ -287,7 +314,7 @@ void
 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
+    byte far *data = bmp->data;//+bmp->offset;\r
     word bmpOffset = (word) data + ry * bmp->width + rx;\r
     word width = rw;\r
     word height = rh;\r
@@ -298,6 +325,10 @@ modexDrawBmpRegion(page_t *page, int x, int y,
     word rowCounter;\r
     byte planeCounter = 4;\r
 \r
+/*     printf("bmp->data=%Fp\n",bmp->data);\r
+       printf("*bmp->data=%Fp\n",*(bmp->data));\r
+       printf("&bmp->data=%Fp\n",&(bmp->data));*/\r
+\r
         //code is a bit slow here\r
     __asm {\r
                 MOV AX, SCREEN_SEG      ; go to the VGA memory\r
@@ -942,67 +973,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 +1148,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