]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/modex16.c
clear video RAM using pointer set after INT 10h + vga update, not
[16.git] / src / lib / modex16.c
index a2152825ee9638110111f011c051bdc1ff646a99..cab1376675720d225ca62f6d01f1204c020a5ce4 100755 (executable)
@@ -70,7 +70,7 @@ vgaSetMode(byte mode)
 // Use the bios to get the current video mode\r
 //\r
 \r
-long/*FIXME: why long? "long" is 32-bit datatype, VGA modes are 8-bit numbers. */\r
+byte/*FIXME: why long? "long" is 32-bit datatype, VGA modes are 8-bit numbers. */\r
 vgaGetMode()\r
 {\r
     return int10_getmode();\r
@@ -80,7 +80,6 @@ vgaGetMode()
 void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)\r
 {\r
        word i;\r
-       dword far*ptr=(dword far*)VGA;      /* used for faster screen clearing */\r
        struct vga_mode_params cm;\r
        int CRTParmCount;\r
 \r
@@ -94,9 +93,12 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
                case 1:\r
                        //CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]);\r
                        /* width and height */\r
-                       gv->video.page[0].sw=vga_state.vga_width = 320; // VGA lib currently does not update this\r
-                       gv->video.page[0].sh=vga_state.vga_height = 240; // VGA lib currently does not update this\r
+                       gv->video.page[0].sw = vga_state.vga_width = 320; // VGA lib currently does not update this\r
+                       gv->video.page[0].sh = vga_state.vga_height = 240; // VGA lib currently does not update this\r
 \r
+                       // mode X BYTE mode\r
+                       cm.word_mode = 0;\r
+                       cm.dword_mode = 0;\r
                        // 320x240 mode 60Hz\r
                        cm.horizontal_total=0x5f + 5; /* CRTC[0]             -5 */\r
                        cm.horizontal_display_end=0x4f + 1; /* CRTC[1]       -1 */\r
@@ -115,6 +117,7 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
                        cm.clock_select = 0; /* misc register = 0xE3  25MHz */\r
                        cm.vsync_neg = 1;\r
                        cm.hsync_neg = 1;\r
+                       cm.offset = (vga_state.vga_width / (4 * 2)); // 320 wide (40 x 4 pixel groups x 2)\r
                        break;\r
                case 2: // TODO: 160x120 according to ModeX_160x120regs\r
                        return;\r
@@ -128,15 +131,18 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
                        return;\r
        }\r
 \r
+       vga_state.vga_stride = cm.offset * 2;\r
        vga_write_crtc_mode(&cm,0);\r
 \r
        /* clear video memory */\r
        switch (cmem)\r
        {\r
-               case 1:\r
-               /* clear video memory */\r
-               vga_write_sequencer(2/*map mask register*/,0xf/*all 4 planes*/);\r
-               for(i=0; i<0x8000; i++) ptr[i] = 0x0000;\r
+               case 1: {\r
+                       /* clear video memory */\r
+                       dword far*ptr=(dword far*)vga_state.vga_graphics_ram;//VGA;      /* used for faster screen clearing */\r
+                       vga_write_sequencer(2/*map mask register*/,0xf/*all 4 planes*/);\r
+                       for(i = 0;i < 0x4000; i++) ptr[i] = 0x0000; // 0x4000 x dword = 64KB\r
+               }\r
                break;\r
        }\r
        gv->video.page[0].tilesw = gv->video.page[0].sw/TILEWH;\r
@@ -545,7 +551,8 @@ modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset)
        static word a[PAL_SIZE];        //palette array of change values!\r
        word z=0, aq=0, aa=0, pp=0;\r
 \r
-       modexWaitBorder();\r
+       //modexWaitBorder();\r
+       vga_wait_for_vsync();\r
        if((*i)==0)\r
        {\r
                memset(a, -1, sizeof(a));\r
@@ -595,7 +602,8 @@ modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset)
                //if(qp>0) printf("qp=%d\n", qp);\r
                //if(qp>0) printf("                                          (*i)=%d\n", (*i)/3);\r
        }\r
-       modexWaitBorder();        /* waits one retrace -- less flicker */\r
+       //modexWaitBorder();      /* waits one retrace -- less flicker */\r
+       vga_wait_for_vsync();\r
        if((*i)>=PAL_SIZE/2 && w==0)\r
        {\r
                for(; (*i)<PAL_SIZE; (*i)++)\r
@@ -634,7 +642,7 @@ printf("\nqqqqqqqq\n\n");
                pp = q;\r
                //printf("1(*i)=%02d\n", (*i)/3);\r
                //printf("1z=%02d\n", z/3);\r
-               chkcolor(bmp, &q, &a, &aa, &z, i);\r
+               modexchkcolor(bmp, &q, &a, &aa, &z, i);\r
                //printf("2(*i)=%02d\n", (*i)/3);\r
                //printf("2z=%02d\n", z/3);\r
                aq=0;\r
@@ -706,13 +714,15 @@ void
 modexPalUpdate1(byte *p)\r
 {\r
        int i;\r
-       modexWaitBorder();\r
+       //modexWaitBorder();\r
+       vga_wait_for_vsync();\r
        outp(PAL_WRITE_REG, 0);  /* start at the beginning of palette */\r
        for(i=0; i<PAL_SIZE/2; i++)\r
        {\r
                outp(PAL_DATA_REG, p[i]);\r
        }\r
-       modexWaitBorder();        /* waits one retrace -- less flicker */\r
+       //modexWaitBorder();      /* waits one retrace -- less flicker */\r
+       vga_wait_for_vsync();\r
        for(; i<PAL_SIZE; i++)\r
        {\r
                outp(PAL_DATA_REG, p[(i)]);\r
@@ -723,13 +733,15 @@ void
 modexPalUpdate0(byte *p)\r
 {\r
        int i;\r
-       modexWaitBorder();\r
+       //modexWaitBorder();\r
+       vga_wait_for_vsync();\r
        outp(PAL_WRITE_REG, 0);  /* start at the beginning of palette */\r
        for(i=0; i<PAL_SIZE/2; i++)\r
        {\r
                outp(PAL_DATA_REG, rand());\r
        }\r
-       modexWaitBorder();        /* waits one retrace -- less flicker */\r
+       //modexWaitBorder();      /* waits one retrace -- less flicker */\r
+       vga_wait_for_vsync();\r
        for(; i<PAL_SIZE; i++)\r
        {\r
                outp(PAL_DATA_REG, rand());\r
@@ -739,14 +751,15 @@ modexPalUpdate0(byte *p)
 void\r
 modexPalOverscan(byte *p, word col)\r
 {\r
-       modexWaitBorder();\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
 }\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
+void modexchkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/)\r
 {\r
                byte *pal;\r
                word zz=0;\r
@@ -864,23 +877,11 @@ byte modexgetPixel(page_t *page, int x, int y)
 \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, boolean q)\r
+void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)\r
 {\r
        word s, o, w;\r
        word addr = (word) romFontsData.l;\r
+       word addrq = (page->width/4) * y + (x / 4) + ((word)page->data);\r
        byte c;\r
 \r
        s=romFonts[t].seg;\r
@@ -917,7 +918,8 @@ void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, cons
                JNZ L1\r
        }\r
 //TODO: OPTIMIZE THIS!!!!\r
-               modexDrawCharPBuf(page, x, y, t, col, bgcol, q);\r
+               modexDrawCharPBuf(page, x/*for mode X planar use*/, y/*redunant, remove*/, t, col, bgcol, addrq);\r
+               addrq += 2; /* move 8 pixels over (2 x 4 planar pixels per byte) */\r
 \r
                //if(!q) getch();\r
        }\r
@@ -999,7 +1001,7 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c
 }\r
 \r
 /* palette dump on display! */\r
-void pdump(page_t *pee)\r
+void modexpdump(page_t *pee)\r
 {\r
        int mult=(QUADWH);\r
        int palq=(mult)*TILEWH;\r
@@ -1019,7 +1021,7 @@ void pdump(page_t *pee)
 //              the Virtual screen.                                                                                     //\r
 //                                                                                                                                              //\r
 /////////////////////////////////////////////////////////////////////////////\r
-void cls(page_t *page, byte color, byte *Where)\r
+void modexcls(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
@@ -1028,13 +1030,40 @@ void cls(page_t *page, byte color, byte *Where)
        _fmemset(Where, color, page->width*(page->height)/4);\r
 }\r
 \r
-void\r
+/*void\r
 modexWaitBorder() {\r
     while(inp(INPUT_STATUS_1)  & 8)  {\r
-       /* spin */\r
+       // spin\r
     }\r
 \r
     while(!(inp(INPUT_STATUS_1)  & 8))  {\r
-       /* spin */\r
+       // spin\r
     }\r
+}*/\r
+\r
+void bios_cls() {\r
+       VGA_ALPHA_PTR ap;\r
+       VGA_RAM_PTR rp;\r
+       unsigned char m;\r
+\r
+       m = int10_getmode();\r
+       if ((rp=vga_state.vga_graphics_ram) != NULL && !(m <= 3 || m == 7)) {\r
+               unsigned int i,im;\r
+\r
+               im = (FP_SEG(vga_state.vga_graphics_ram_fence) - FP_SEG(vga_state.vga_graphics_ram));\r
+               if (im > 0xFFE) im = 0xFFE;\r
+               im <<= 4;\r
+               for (i=0;i < im;i++) vga_state.vga_graphics_ram[i] = 0;\r
+       }\r
+       else if ((ap=vga_state.vga_alpha_ram) != NULL) {\r
+               unsigned int i,im;\r
+\r
+               im = (FP_SEG(vga_state.vga_alpha_ram_fence) - FP_SEG(vga_state.vga_alpha_ram));\r
+               if (im > 0x7FE) im = 0x7FE;\r
+               im <<= 4 - 1; /* because ptr is type uint16_t */\r
+               for (i=0;i < im;i++) vga_state.vga_alpha_ram[i] = 0x0720;\r
+       }\r
+       else {\r
+               printf("WARNING: bios cls no ptr\n");\r
+       }\r
 }\r