]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/modex16.c
VRSTEST.EXE NOW USES PAGE MANAGER! wwww
[16.git] / src / lib / modex16.c
index 6a5b27994f5549b8c1e80e141fab486627389662..b8f733be22b581f1748cffffa04e1f60e988b3be 100755 (executable)
@@ -1,11 +1,11 @@
 /* Project 16 Source Code~\r
- * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669\r
+ * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
  *\r
  * This file is part of Project 16.\r
  *\r
  * Project 16 is free software; you can redistribute it and/or modify\r
  * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either verson 3 of the License, or\r
+ * the Free Software Foundation; either version 3 of the License, or\r
  * (at your option) any later version.\r
  *\r
  * Project 16 is distributed in the hope that it will be useful,\r
@@ -62,7 +62,12 @@ void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv)
 static void\r
 vgaSetMode(byte mode)\r
 {\r
-  int10_setmode(mode);\r
+       union REGS regs;\r
+\r
+       regs.h.ah = SET_MODE;\r
+       regs.h.al = mode;\r
+       int86(VIDEO_INT, &regs, &regs);\r
+  //int10_setmode(mode);\r
 }\r
 \r
 //---------------------------------------------------\r
@@ -85,13 +90,21 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
 \r
        vgaSetMode(VGA_256_COLOR_MODE);\r
        vga_enable_256color_modex();\r
+\r
        update_state_from_vga();\r
        vga_read_crtc_mode(&cm);\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
        switch(vq)\r
        {\r
                case 1:\r
                        //CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]);\r
+                       /*for(i=0; i<CRTParmCount; i++) {\r
+                               outpw(CRTC_INDEX, ModeX_320x240regs[i]);\r
+                       }*/\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
@@ -106,7 +119,7 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
                        cm.horizontal_total=0x5f + 5; /* CRTC[0]             -5 */\r
                        cm.horizontal_display_end=0x4f + 1; /* CRTC[1]       -1 */\r
                        cm.horizontal_blank_start=0x50 + 1; /* CRTC[2] */\r
-                       cm.horizontal_blank_end=0x82 + 1;   /* CRTC[3] bit 0-4 & CRTC[5] bit 7 */\r
+//                     cm.horizontal_blank_end=0x82 + 1;   /* CRTC[3] bit 0-4 & CRTC[5] bit 7 *///skewing ^^;\r
                        cm.horizontal_start_retrace=0x54;/* CRTC[4] */\r
                        cm.horizontal_end_retrace=0x80; /* CRTC[5] bit 0-4 */\r
                        //cm.horizontal_start_delay_after_total=0x3e; /* CRTC[3] bit 5-6 */\r
@@ -155,7 +168,6 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv)
        //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
-       gv->video.num_of_pages=0;\r
 }\r
 \r
 void\r
@@ -185,7 +197,9 @@ modexDefaultPage(page_t *p)
        page.tilesh=page.height/TILEWH;\r
        page.tilemidposscreenx = page.tw/2;\r
        page.tilemidposscreeny = (page.th/2)+1;\r
-       page.pagesize = (sdiword)(page.width/4)*page.height;\r
+       page.stridew=page.width/4;\r
+       page.pagesize = (word)(page.stridew)*page.height;\r
+       page.pi=page.width*4;\r
        page.id = 0;\r
 \r
     return page;\r
@@ -201,14 +215,18 @@ modexNextPage(page_t *p) {
     result.data = p->data + (p->pagesize);\r
     result.dx = 0;\r
     result.dy = 0;\r
+       result.sw = p->sw;\r
+       result.sh = p->sh;\r
     result.width = p->width;\r
     result.height = p->height;\r
        result.tw = p->tw;\r
        result.th = p->th;\r
        result.tilesw = p->tilesw;\r
        result.tilesh = p->tilesh;\r
-       result.id = p->id+1;\r
+       result.stridew=p->stridew;\r
        result.pagesize = p->pagesize;\r
+       result.pi=result.width*4;\r
+       result.id = p->id+1;\r
 \r
        return result;\r
 }\r
@@ -222,6 +240,8 @@ modexNextPageFlexibleSize(page_t *p, word x, word y)
        result.data = p->data + (p->pagesize);  /* compute the offset */\r
        result.dx = 0;\r
        result.dy = 0;\r
+       result.sw = x;\r
+       result.sh = y;\r
        result.width = x;\r
        result.height = y;\r
        result.tw = result.sw/TILEWH;\r
@@ -229,7 +249,17 @@ modexNextPageFlexibleSize(page_t *p, word x, word y)
        result.tilesw=result.width/TILEWH;\r
        result.tilesh=result.height/TILEWH;\r
        result.id = p->id+1;\r
-       result.pagesize = (sdiword)(result.width/4)*result.height;\r
+       result.stridew=p->sw/4;//result.width/4;\r
+       result.pagesize = (word)(result.stridew)*result.height;\r
+       switch(result.id)\r
+       {\r
+               case 2:\r
+                       result.pi=p->width*4;\r
+               break;\r
+               case 3:\r
+                       result.pi=p->pi;\r
+               break;\r
+       }\r
 \r
        return result;\r
 }\r
@@ -237,25 +267,31 @@ modexNextPageFlexibleSize(page_t *p, word x, word y)
 void modexCalcVmemRemain(video_t *video)\r
 {\r
        byte i;\r
-       //printf("\n\n  1st vmem_remain=%ld\n", video->vmem_remain);\r
-       for(i=0; i<=video->num_of_pages-1; i++)\r
+       //printf("\n\n  1st vmem_remain=%u\n", video->vmem_remain);\r
+       for(i=0; i<video->num_of_pages; i++)\r
        {\r
                video->vmem_remain-=video->page[i].pagesize;\r
-               //printf("              [%u], video->page[i].pagesize=%ld\n", i, video->page[i].pagesize);\r
-               //printf("              [%u], vmem_remain=%ld\n", i, video->vmem_remain);\r
+               //printf("              [%u], video->page[%u].pagesize=%u\n", i, i, video->page[i].pagesize);\r
+               //printf("              [%u], vmem_remain=%u\n", i, video->vmem_remain);\r
        }\r
 }\r
 \r
 void modexHiganbanaPageSetup(video_t *video)\r
 {\r
-       video->vmem_remain=262144L;\r
-       (video->page[0]) = modexDefaultPage(&(video->page[0])); video->num_of_pages++;\r
-       //video->page[0].width += (TILEWHD); video->page[0].height += (TILEWHD);\r
+       video->vmem_remain=65535U;\r
+       video->num_of_pages=0;\r
+       (video->page[0]) = modexDefaultPage(&(video->page[0])); video->num_of_pages++;  //video->page[0].width += (TILEWHD); video->page[0].height += (TILEWHD);\r
        (video->page[1]) = modexNextPage(&(video->page[0]));    video->num_of_pages++;\r
-       //(video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), video->page[0].width, video->page[0].sh-40);  video->num_of_pages++;\r
-       //(video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), TILEWH, TILEWH);      video->num_of_pages++;\r
+//0000 (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), (video->page[0]).width, TILEWH*4);              video->num_of_pages++;\r
+//0000 (video->page[3]) = (video->page[2]);            video->num_of_pages++;\r
+       (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), TILEWH*4, TILEWH*4);            video->num_of_pages++;\r
+//     (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].width, 176);     video->num_of_pages++;\r
+       (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].sw, 208);        video->num_of_pages++;\r
+//     (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), video->page[0].width, 172);     video->num_of_pages++;\r
+//     (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), 72, 128);               video->num_of_pages++;\r
        modexCalcVmemRemain(video);\r
        video->p=0;\r
+       video->r=1;\r
 }\r
 \r
 void\r
@@ -277,42 +313,39 @@ modexShowPage(page_t *page) {
     low_address  = LOW_ADDRESS  | (offset << 8);\r
 \r
     /* wait for appropriate timing and then program CRTC */\r
-    while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
+    //while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
     outpw(CRTC_INDEX, high_address);\r
     outpw(CRTC_INDEX, low_address);\r
     outp(CRTC_INDEX, 0x13);\r
     outp(CRTC_DATA, crtcOffset);\r
 \r
     /*  wait for one retrace */\r
-    while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
+    //while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
 \r
     /* do PEL panning here */\r
     outp(AC_INDEX, 0x33);\r
     outp(AC_INDEX, (page->dx & 0x03) << 1);\r
 }\r
 \r
-\r
 void\r
 modexPanPage(page_t *page, int dx, int dy) {\r
     page->dx = dx;\r
     page->dy = dy;\r
 }\r
 \r
-\r
 void\r
 modexSelectPlane(byte plane) {\r
     outp(SC_INDEX, MAP_MASK);    /* select plane */\r
     outp(SC_DATA,  plane);\r
 }\r
 \r
-\r
 void\r
 modexClearRegion(page_t *page, int x, int y, int w, int h, byte  color) {\r
     word pageOff = (word) page->data;\r
     word xoff=x/4;       /* xoffset that begins each row */\r
     word scanCount=w/4;  /* number of iterations per row (excluding right clip)*/\r
-    word poffset = pageOff + y*(page->width/4) + xoff; /* starting offset */\r
-    word nextRow = page->width/4-scanCount-1;  /* loc of next row */\r
+    word poffset = pageOff + y*(page->stridew) + xoff; /* starting offset */\r
+    word nextRow = page->stridew-scanCount-1;  /* loc of next row */\r
     byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08};  /* clips for rectangles not on 4s */\r
     byte rclip[] = {0x00, 0x01, 0x03, 0x07};\r
     byte left = lclip[x&0x03];\r
@@ -323,6 +356,8 @@ modexClearRegion(page_t *page, int x, int y, int w, int h, byte  color) {
       right=0x0f;\r
     }\r
 \r
+       //printf("modexClearRegion(x=%u, y=%u, w=%u, h=%u, left=%u, right=%u)\n", x, y, w, h, left, right);\r
+\r
     __asm {\r
            PUSHF\r
            PUSH ES\r
@@ -388,17 +423,33 @@ modexCopyPageRegion(page_t *dest, page_t *src,
                    word dx, word dy,\r
                    word width, word height)\r
 {\r
-    word doffset = (word)dest->data + dy*(dest->width/4) + dx/4;\r
-    word soffset = (word)src->data + sy*(src->width/4) + sx/4;\r
-    word scans   = vga_state.vga_stride;\r
-    word nextSrcRow = src->width/4 - scans - 1;\r
-    word nextDestRow = dest->width/4 - scans - 1;\r
+    word doffset = (word)dest->data + dy*(dest->stridew) + dx/4;\r
+    word soffset = (word)src->data + sy*(src->stridew) + sx/4;\r
+    word scans   = vga_state.vga_stride;                               //++++0000 the quick and dirty fix of the major issue with p16 video display wwww\r
+    word nextSrcRow = src->stridew - scans - 1;\r
+    word nextDestRow = dest->stridew - scans - 1;\r
     byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08};  /* clips for rectangles not on 4s */\r
-    byte rclip[] = {0x0f, 0x01, 0x03, 0x07};\r
+    byte rclip[] = {0x00, 0x01, 0x03, 0x07};\r
     byte left = lclip[sx&0x03];\r
     byte right = rclip[(sx+width)&0x03];\r
 \r
+       /* handle the case which requires an extra group */\r
+       if((sx & 0x03) && !((sx+width) & 0x03)) {\r
+               right=0x0f;\r
+       }\r
+\r
+//     printf("modexCopyPageRegion(src->stridew=%u, dest->stridew=%u, sx=%u, sy=%u, dx=%u, dy=%u, width=%u, height=%u, left=%u, right=%u)\n", src->stridew, dest->stridew, sx, sy, dx, dy, width, height, left, right);\r
+\r
     __asm {\r
+           PUSHF\r
+           PUSH ES\r
+           PUSH AX\r
+           PUSH BX\r
+           PUSH CX\r
+           PUSH DX\r
+           PUSH SI\r
+           PUSH DI\r
+\r
                MOV AX, SCREEN_SEG      ; work in the vga space\r
                MOV ES, AX            ;\r
                MOV DI, doffset  ;\r
@@ -447,6 +498,15 @@ modexCopyPageRegion(page_t *dest, page_t *src,
                MOV DX, GC_INDEX+1      ; go back to CPU data\r
                MOV AL, 0ffh        ; none from latches\r
                OUT DX, AL            ;\r
+\r
+           POP DI\r
+           POP SI\r
+           POP DX\r
+           POP CX\r
+           POP BX\r
+           POP AX\r
+           POP ES\r
+           POPF\r
     }\r
 }\r
 \r
@@ -800,7 +860,7 @@ modexPalUpdate0(byte *p)
 }\r
 \r
 void\r
-modexPalOverscan(byte *p, word col)\r
+modexPalOverscan(word col)\r
 {\r
        //modexWaitBorder();\r
        vga_wait_for_vsync();\r
@@ -1008,6 +1068,15 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c
        }\r
        //load the letter 'A'\r
        __asm {\r
+           PUSHF\r
+           PUSH ES\r
+           PUSH AX\r
+           PUSH BX\r
+           PUSH CX\r
+           PUSH DX\r
+           PUSH SI\r
+           PUSH DI\r
+\r
                MOV DI, addr\r
                MOV SI, o\r
                MOV ES, s\r
@@ -1022,6 +1091,15 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c
                INC DI\r
                DEC CX\r
                JNZ L1\r
+\r
+           POP DI\r
+           POP SI\r
+           POP DX\r
+           POP CX\r
+           POP BX\r
+           POP AX\r
+           POP ES\r
+           POPF\r
        }\r
 \r
                for(i=0; i<w; i++)\r
@@ -1072,38 +1150,28 @@ void modexcls(page_t *page, byte color, byte *Where)
 \r
 void\r
 modexWaitBorder() {\r
-    while(inp(INPUT_STATUS_1)  & 8)  {\r
+       while(inp(INPUT_STATUS_1)  & 8)  {\r
        // spin\r
-    }\r
-\r
-    while(!(inp(INPUT_STATUS_1)  & 8))  {\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
+       while(!(inp(INPUT_STATUS_1)  & 8))  {\r
+       //spin\r
        }\r
-       else {\r
-               printf("WARNING: bios cls no ptr\n");\r
+}\r
+\r
+void modexprintmeminfo(video_t *v)\r
+{\r
+       byte i;\r
+       printf("video memory remaining: %u\n", v->vmem_remain);\r
+       printf("page ");\r
+       for(i=0; i<v->num_of_pages;i++)\r
+       {\r
+               printf("        [%u]=", i);\r
+               printf("(%Fp)", (v->page[i].data));\r
+               printf(" size=%u        ", v->page[i].pagesize);\r
+               printf("w=%lu  h=%lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height);\r
+               printf("sw=%lu  sh=%lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh);\r
+               printf("pi=%u", v->page[i].pi);\r
+               printf("\n");\r
        }\r
 }\r