]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/modex16.c
pcxtest0 for planar dump test
[16.git] / src / lib / modex16.c
old mode 100644 (file)
new mode 100755 (executable)
index e4dfeea..9403ce7
@@ -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
@@ -33,6 +30,35 @@ byte far* VGA=(byte far*) 0xA0000000;   /* this points to video memory. */
 static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette);\r
 static byte tmppal[PAL_SIZE];\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
+       switch (vq)\r
+       {\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
+               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
+                       // enter mode\r
+                       modexEnter(vq, gv);\r
+               break;\r
+       }\r
+}\r
+\r
 static void\r
 vgaSetMode(byte mode)\r
 {\r
@@ -43,76 +69,186 @@ vgaSetMode(byte mode)
   int86(VIDEO_INT, &regs, &regs);\r
 }\r
 \r
+//---------------------------------------------------\r
+//\r
+// Use the bios to get the current video mode\r
+//\r
+\r
+long\r
+vgaGetMode()\r
+{\r
+    union REGS rg;\r
+\r
+    rg.h.ah = 0x0f;\r
+    int86(VIDEO_INT, &rg, &rg);\r
+\r
+    return rg.h.al;\r
+}\r
 \r
 /* -========================= Entry  Points ==========================- */\r
 void\r
-modexEnter() {\r
-    word i;\r
-    dword far*ptr=(dword far*)VGA;      /* used for faster screen clearing */\r
-    word CRTParms[] = {\r
-        0x0d06,         /* vertical total */\r
-        0x3e07,         /* overflow (bit 8 of vertical counts) */\r
-        0x4109,         /* cell height (2 to double-scan */\r
-        0xea10,         /* v sync start */\r
-        0xac11,         /* v sync end and protect cr0-cr7 */\r
-        0xdf12,         /* vertical displayed */\r
-        0x0014,         /* turn off dword mode */\r
-        0xe715,         /* v blank start */\r
-        0x0616,         /* v blank end */\r
-        0xe317          /* turn on byte mode */\r
-    };\r
-    int CRTParmCount = sizeof(CRTParms) / sizeof(CRTParms[0]);\r
-\r
-    /* TODO save current video mode and palette */\r
-    vgaSetMode(VGA_256_COLOR_MODE);\r
-\r
-    /* disable chain4 mode */\r
-    outpw(SC_INDEX, 0x0604);\r
-\r
-    /* synchronous reset while setting Misc Output */\r
-    outpw(SC_INDEX, 0x0100);\r
-\r
-    /* select 25 MHz dot clock & 60 Hz scanning rate */\r
-    outp(MISC_OUTPUT, 0xe3);\r
-\r
-    /* undo reset (restart sequencer) */\r
-    outpw(SC_INDEX, 0x0300);\r
-\r
-    /* reprogram the CRT controller */\r
-    outp(CRTC_INDEX, 0x11); /* VSync End reg contains register write prot */\r
-    outp(CRTC_DATA, 0x7f);  /* get current write protect on varios regs */\r
-\r
-    /* send the CRTParms */\r
-    for(i=0; i<CRTParmCount; i++) {\r
-        outpw(CRTC_INDEX, CRTParms[i]);\r
-    }\r
+modexEnter(sword vq, global_game_variables_t *gv)\r
+{\r
+       word i;\r
+       dword far*ptr=(dword far*)VGA;      /* used for faster screen clearing */\r
+       int CRTParmCount;\r
+       /* common mode X initiation stuff~ */\r
+       modexsetBaseXMode(gv->video.page);\r
 \r
-    /* clear video memory */\r
-    outpw(SC_INDEX, 0x0f02);\r
-    for(i=0; i<0x8000; i++) {\r
-        ptr[i] = 0x0000;\r
-    }\r
+       switch(vq)\r
+       {\r
+               case 1:\r
+                       CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]);\r
+                       /* width and height */\r
+                       gv->video.page[0].sw=320;\r
+                       gv->video.page[0].sh=240;\r
+\r
+                       /* send the CRTParms */\r
+                       for(i=0; i<CRTParmCount; i++) {\r
+                               outpw(CRTC_INDEX, ModeX_320x240regs[i]);\r
+                       }\r
+\r
+                       /* clear video memory */\r
+                       outpw(SC_INDEX, 0x0f02);\r
+                       for(i=0; i<0x8000; i++) {\r
+                               ptr[i] = 0x0000;\r
+                       }\r
+               break;\r
+               case 2:\r
+                       CRTParmCount = sizeof(ModeX_160x120regs) / sizeof(ModeX_160x120regs[0]);\r
+                       /* width and height */\r
+                       gv->video.page[0].sw=120;\r
+                       gv->video.page[0].sh=160;\r
+\r
+                       /* send the CRTParms */\r
+                       for(i=0; i<CRTParmCount; i++) {\r
+                               outpw(CRTC_INDEX, ModeX_160x120regs[i]);\r
+                       }\r
+\r
+                       /* clear video memory */\r
+                       outpw(SC_INDEX, 0x0f02);\r
+                       for(i=0; i<0x8000; i++) {\r
+                               ptr[i] = 0x0000;\r
+                       }\r
+               break;\r
+               case 3:\r
+                       CRTParmCount = sizeof(ModeX_320x200regs) / sizeof(ModeX_320x200regs[0]);\r
+                       /* width and height */\r
+                       gv->video.page[0].sw=320;\r
+                       gv->video.page[0].sh=200;\r
+\r
+                       /* send the CRTParms */\r
+                       for(i=0; i<CRTParmCount; i++) {\r
+                               outpw(CRTC_INDEX, ModeX_320x200regs[i]);\r
+                       }\r
+\r
+                       /* clear video memory */\r
+                       outpw(SC_INDEX, 0x0f02);\r
+                       for(i=0; i<0x8000; i++) {\r
+                               ptr[i] = 0x0000;\r
+                       }\r
+               break;\r
+               case 4:\r
+                       CRTParmCount = sizeof(ModeX_192x144regs) / sizeof(ModeX_192x144regs[0]);\r
+                       /* width and height */\r
+                       gv->video.page[0].sw=192;\r
+                       gv->video.page[0].sh=144;\r
+\r
+                       /* send the CRTParms */\r
+                       for(i=0; i<CRTParmCount; i++) {\r
+                               outpw(CRTC_INDEX, ModeX_192x144regs[i]);\r
+                       }\r
+\r
+                       /* clear video memory */\r
+                       outpw(SC_INDEX, 0x0f02);\r
+                       for(i=0; i<0x8000; i++) {\r
+                               ptr[i] = 0x0000;\r
+                       }\r
+               break;\r
+               case 5:\r
+                       CRTParmCount = sizeof(ModeX_256x192regs) / sizeof(ModeX_256x192regs[0]);\r
+                       /* width and height */\r
+                       gv->video.page[0].sw=256;\r
+                       gv->video.page[0].sh=192;\r
+\r
+                       /* send the CRTParms */\r
+                       for(i=0; i<CRTParmCount; i++) {\r
+                               outpw(CRTC_INDEX, ModeX_256x192regs[i]);\r
+                       }\r
+\r
+                       /* clear video memory */\r
+                       outpw(SC_INDEX, 0x0f02);\r
+                       for(i=0; i<0x8000; i++) {\r
+                               ptr[i] = 0x0000;\r
+                       }\r
+               break;\r
+       }\r
+       gv->video.page[0].tilesw = gv->video.page[0].sw/TILEWH;\r
+       gv->video.page[0].tilesh = gv->video.page[0].sh/TILEWH;\r
+       //TODO MAKE FLEXIBLE~\r
+       gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw;\r
+       gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1;\r
+       #define PAGE_SIZE               (word)(gv->video.page[0].sw/4 * gv->video.page[0].sh)\r
 }\r
 \r
-\r
 void\r
 modexLeave() {\r
     /* TODO restore original mode and palette */\r
     vgaSetMode(TEXT_MODE);\r
 }\r
 \r
+//    setBaseXMode() does the initialization to make the VGA ready to\r
+//    accept any combination of configuration register settings.  This\r
+//    involves enabling writes to index 0 to 7 of the CRT controller (port\r
+//    0x3D4), by clearing the most significant bit (bit 7) of index 0x11.\r
+void\r
+modexsetBaseXMode(page_t *page)\r
+{\r
+       word temp;\r
+       /* TODO save current video mode and palette */\r
+       vgaSetMode(VGA_256_COLOR_MODE);\r
+\r
+       /* disable chain4 mode */\r
+       outpw(SC_INDEX, 0x0604);\r
+\r
+       /* synchronous reset while setting Misc Output */\r
+       outpw(SC_INDEX, 0x0100);\r
+\r
+       /* select 25 MHz dot clock & 60 Hz scanning rate */\r
+       outp(MISC_OUTPUT, 0xe3);\r
+\r
+       /* undo reset (restart sequencer) */\r
+       outpw(SC_INDEX, 0x0300);\r
+\r
+       /* reprogram the CRT controller */\r
+       outp(CRTC_INDEX, 0x11); /* VSync End reg contains register write prot */\r
+//     temp = inp(CRTC_DATA) & 0x7F;\r
+//     outp(CRTC_INDEX, 0x11);\r
+       outp(CRTC_DATA, 0x7f);  /* get current write protect on varios regs */\r
+//     outp(CRTC_DATA, temp);  /* get current write protect on varios regs */\r
+}\r
 \r
 page_t\r
-modexDefaultPage() {\r
+modexDefaultPage(page_t *p)\r
+{\r
     page_t page;\r
 \r
     /* default page values */\r
     page.data = VGA;\r
     page.dx = 0;\r
     page.dy = 0;\r
-    page.width = SCREEN_WIDTH;\r
-    page.height = SCREEN_HEIGHT;\r
-        page.id = 0;\r
+       page.sw = p->sw;\r
+       page.sh = p->sh;\r
+       page.width = p->sw;\r
+       page.height = p->sh;\r
+       page.tw = page.sw/TILEWH;\r
+       page.th = page.sh/TILEWH;\r
+       page.tilemidposscreenx = page.tw/2;\r
+       page.tilemidposscreeny = (page.th/2)+1;\r
+       page.tilesw=p->tilesw;\r
+       page.tilesh=p->tilesh;\r
+       //pageSize = p->sw*p->sh;\r
+       page.id = 0;\r
 \r
     return page;\r
 }\r
@@ -124,30 +260,35 @@ page_t
 modexNextPage(page_t *p) {\r
     page_t result;\r
 \r
-    result.data = p->data + (p->width/4)*p->height;  /* compute the offset */\r
+    result.data = p->data + (p->width/4)*p->height;\r
     result.dx = 0;\r
     result.dy = 0;\r
     result.width = p->width;\r
     result.height = p->height;\r
-        result.id = p->id+1;\r
+       result.tw = p->width/TILEWH;\r
+       result.th = p->height/TILEWH;\r
+       result.id = p->id+1;\r
 \r
-    return result;\r
+       return result;\r
+//     return modexNextPageFlexibleSize(&p, p->width, p->height);\r
 }\r
 \r
 //next page with defined dimentions~\r
 page_t\r
-modexNextPage0(page_t *p, word x, word y)\r
+modexNextPageFlexibleSize(page_t *p, word x, word y)\r
 {\r
-        page_t result;\r
-\r
-        result.data = p->data + (p->width/4)*p->height;  /* compute the offset */\r
-        result.dx = 0;\r
-        result.dy = 0;\r
-        result.width = x;\r
-        result.height = y;\r
-        result.id = p->id+1;\r
-\r
-    return result;\r
+       page_t result;\r
+\r
+       result.data = p->data + (p->width/4)*p->height;  /* compute the offset */\r
+       result.dx = 0;\r
+       result.dy = 0;\r
+       result.width = x;\r
+       result.height = y;\r
+       result.tw = p->width/TILEWH;\r
+       result.th = p->height/TILEWH;\r
+       result.id = p->id+1;\r
+\r
+       return result;\r
 }\r
 \r
 \r
@@ -257,24 +398,46 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte  color) {
 void\r
 oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite)\r
 {\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
+       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
+void\r
+CDrawBmp(byte far* vgamem, page_t* page, int x, int y, bitmap_t *bmp, byte sprite)\r
+{\r
+       byte plane;\r
+       word px, py;\r
+       word offset=0;\r
+\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
+                               //modexputPixel(page, x+px, y+py, bmp->data[offset]);\r
+                               vgamem[PAGE_OFFSET(x+px, y+py)] = bmp->data[offset];\r
+                       offset+=bmp->width;\r
+                       }\r
+               }\r
+       }\r
+}\r
 \r
 void\r
 modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp) {\r
@@ -282,12 +445,11 @@ modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp) {
     modexDrawBmpRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
 }\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
+    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 +460,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
@@ -346,7 +512,6 @@ modexDrawBmpRegion(page_t *page, int x, int y,
     }\r
 }\r
 \r
-\r
 void\r
 modexDrawPlanarBuf(page_t *page, int x, int y, planar_buf_t *bmp) {\r
     /* TODO - adapt from test code */\r
@@ -364,7 +529,7 @@ modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp) {
     modexDrawSpriteRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
 }\r
 \r
-void\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
@@ -434,8 +599,79 @@ modexDrawSpriteRegion(page_t *page, int x, int y,
                 DEC planeCounter\r
                 JNZ PLANE_LOOP          ; do all 4 planes\r
     }\r
-}\r
+}//backup!*/\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 huge *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;\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, MAP_MASK        ;\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
 /* copy a region of video memory from one page to another.\r
  * It assumes that the left edge of the tile is the same on both\r
@@ -852,6 +1088,14 @@ modexPalUpdate0(byte *p)
         }\r
 }\r
 \r
+void\r
+modexPalOverscan(byte *p, word col)\r
+{\r
+       modexWaitBorder();\r
+       outp(PAL_WRITE_REG, 0);  /* start at the beginning of palette */\r
+       outp(PAL_DATA_REG, col);\r
+}\r
+\r
 //color checker~\r
 //i want to make another vesion that checks the palette when the palette is being appened~\r
 void chkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/)\r
@@ -942,68 +1186,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>=page[0].sw-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, word bgcol, const byte *str)\r
-{
-       word i, s, o, w, j, xp;
+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;
-       word chw=0;
-       byte c;
-
+       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
-       {
-       if(chw>=SCREEN_WIDTH-1) y+=w;
-       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
@@ -1020,23 +1361,54 @@ void modexprint(word x, word y, word t, word col, word bgcol, 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:bgcol);
-                               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 += xp;\r
        }\r
 }\r
 \r
+/* palette dump on display! */\r
+void pdump(page_t *pee)\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
+                       palcol++;\r
+               }\r
+       }\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//                                                                                                                                              //\r
+// cls() - This clears the screen to the specified color, on the VGA or on //\r
+//              the Virtual screen.                                                                                     //\r
+//                                                                                                                                              //\r
+/////////////////////////////////////////////////////////////////////////////\r
+void cls(page_t *page, byte color, byte *Where)\r
+{\r
+       //modexClearRegion(page, 0, 0, page->width, page->height, color);\r
+       /* set map mask to all 4 planes */\r
+       outpw(SC_INDEX, 0xff02);\r
+       //_fmemset(VGA, color, 16000);\r
+       _fmemset(Where, color, page->width*(page->height));\r
+}\r
+\r
 void\r
 modexWaitBorder() {\r
     while(inp(INPUT_STATUS_1)  & 8)  {\r