]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/modex16.c
><
[16.git] / src / lib / modex16.c
old mode 100644 (file)
new mode 100755 (executable)
index ae0bd69..9b7f4c4
@@ -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
@@ -253,41 +394,108 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte  color) {
     }\r
 }\r
 \r
-\r
-void\r
-oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite)\r
+//TODO! ADD CLIPPING!!\r
+//memory management needs to be added\r
+//void\r
+//modexDrawBmpRegion   (page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp)\r
+void modexDrawPBufRegion        (page_t *page, int x, int y, int rx, int ry, int rw, int rh, planar_buf_t *p, boolean sprite)\r
 {\r
-        byte plane;\r
-        word px, py;\r
-        word offset;\r
-\r
-        /* TODO Make this fast.  It's SLOOOOOOW */\r
+        int plane;\r
+        int px, py, i;\r
+        px=x;\r
+        py=y;\r
         for(plane=0; plane < 4; plane++) {\r
+                i=(rx/4)+((rx/4)*ry);\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
+                for(; y < py+rh; y++) {\r
+                        //for(px=0; px < p->width; px++) {\r
+                                //printf("%02X ", (int) p->plane[plane][i++]);\r
+//                              _fmemcpy(buff, &(p->plane[plane][i+=p->pwidth]), p->pwidth);\r
+//                              printf("buff %u==%s\n", y, *buff);\r
+                                _fmemcpy(page->data + (((page->width/4) * (y+page->dy)) + ((x+page->dx) / 4)), &(p->plane[plane][i+=rw]), rw/4);\r
+                        //}\r
                 }\r
+                x=px;\r
+                y=py;\r
         }\r
 }\r
 \r
 \r
+/*temp*/\r
+void\r
+DrawPBuf(page_t *page, int x, int y, planar_buf_t *p, boolean sprite)\r
+{\r
+       int plane;\r
+       int px, py, i;\r
+//     byte near *buff;\r
+       px=x;\r
+       py=y;\r
+//     buff = _nmalloc(p->pwidth+1);\r
+       // TODO Make this fast.  It's SLOOOOOOW\r
+//     for(plane=0; plane < 4; plane++) {\r
+//             i=0;\r
+//             modexSelectPlane(PLANE(plane+x));\r
+//             for(px = plane; px < p->width; px+=4) {\r
+//                     offset=px;\r
+//                     for(py=0; py<p->height/2; py++) {\r
+//                             //SELECT_ALL_PLANES();\r
+//                             if(!sprite || p->plane[offset])\r
+//                                     page->data = &(p->plane[offset][i++]);\r
+//                             offset+=p->width;\r
+//                             offset++;\r
+//                     }\r
+//             }\r
+//     }\r
+       for(plane=0; plane < 4; plane++) {\r
+               i=0;\r
+               modexSelectPlane(PLANE(plane+x));\r
+               for(; y < py+p->height; y++) {\r
+                       //for(px=0; px < p->width; px++) {\r
+                               //printf("%02X ", (int) p->plane[plane][i++]);\r
+//                             _fmemcpy(buff, &(p->plane[plane][i+=p->pwidth]), p->pwidth);\r
+//                             printf("buff %u==%s\n", y, *buff);\r
+//                             _fmemcpy(page->data + (((page->width/4) * (y+page->dy)) + ((x+page->dx) / 4)), buff, p->pwidth);\r
+                               _fmemcpy(page->data + (((page->width/4) * (y+page->dy)) + ((x+page->dx) / 4)), &(p->plane[plane][i+=p->pwidth]), p->pwidth);\r
+                       //}\r
+               }\r
+               x=px;\r
+               y=py;\r
+       }\r
+//     _nfree(buff);\r
+}\r
+\r
+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
+}\r
+\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
-\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 +506,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,18 +558,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
-        int plane;\r
-        for(plane=0; plane < 4; plane++)\r
-        {\r
-                //fack\r
-        }\r
-}\r
-\r
-\r
 void\r
 modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp) {\r
     /* draw the whole sprite */\r
@@ -436,7 +636,6 @@ modexDrawSpriteRegion(page_t *page, int x, int y,
     }\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
  * regions and the memory areas do not overlap.\r
@@ -852,6 +1051,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,74 +1149,92 @@ 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
-{
-       word i, s, o, w, j, xp;
+{\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
+       //byte near *bakapee;\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);
-       if(c=='\n' || c=="\
-" || chw>=page->width-1)
-       {
-               chw=0;
-               y+=w;
-               continue;
-       }
+       {\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
@@ -1026,23 +1251,134 @@ void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, cons
                INC DI\r
                DEC CX\r
                JNZ L1\r
-       }
+       }\r
+       //bakapee = _nmalloc(sizeof(byte)*8);\r
+//TODO: OPTIMIZE THIS!!!!\r
+               for(i=0; i<w; i++)\r
+               {\r
+                       /*modexSelectPlane(PLANE(x));\r
+                       j=1<<8;\r
+                       *bakapee=(l[i] & j ? col:bgcol);\r
+                       _fmemcpy(page->data + (((page->width/4) * (y+page->dy+i)) + ((x+page->dx+chw) / 4)), bakapee, 8);*/\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
+       //_nfree(bakapee);\r
+}\r
 \r
-               for(i=0; i<w; i++)
+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:\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>=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;
+                       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-1;\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