]> 4ch.mooo.com Git - 16.git/commitdiff
p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I...
authorsparky4 <sparky4@cock.li>
Sat, 15 Apr 2017 16:35:41 +0000 (11:35 -0500)
committersparky4 <sparky4@cock.li>
Sat, 15 Apr 2017 16:35:41 +0000 (11:35 -0500)
16/src/lib/bitmap.c
16/src/lib/bitmap.h
16/src/lib/omodex16.c [new file with mode: 0755]
16/src/lib/omodex16.h [new file with mode: 0755]
makefile
src/0croll.c
src/inputest.c
src/lib/16_dbg.h
src/lib/16render.c
src/lib/16render.h
src/vrstest.c

index 6e496049a283030eadd80488a46d7ff27ec67c21..4e48cab20ab58206683d0e6c765e0910a236d52b 100755 (executable)
@@ -77,7 +77,7 @@ static void loadPcxPalette(FILE *file, bitmap_t *result) {
        /* handle the palette */\r
        fseek(file, -769, SEEK_END);\r
        val = fgetc(file);\r
-       result->palette = modexNewPal();\r
+       result->palette = omodexNewPal();\r
        if(head.version == 5 && val == 12) {\r
        /* use the vga palette */\r
        for(index=0; !feof(file) && index < PAL_SIZE; index++) {\r
@@ -197,16 +197,3 @@ bitmapLoadPcxTiles(char *filename, word twidth, word theight) {
 \r
        return ts;\r
 }\r
-\r
-byte *\r
-modexNewPal() {\r
-       byte *ptr;\r
-       ptr = malloc(PAL_SIZE);\r
-\r
-       // handle errors\r
-       if(!ptr) {\r
-               printf("Could not allocate palette.\n");\r
-       }\r
-\r
-       return ptr;\r
-}\r
index d87356b2e797a7387c7123ebfca84f14244335a2..220079897140e400ad8b9a472efdb9fa7e3a2b77 100755 (executable)
@@ -26,9 +26,9 @@
 #ifndef BITMAP_H\r
 #define BITMAP_H\r
 \r
-#include "src/lib/16_vl.h"\r
+#include "16/src/lib/omodex16.h"\r
 \r
 bitmap_t bitmapLoadPcx(char *filename, global_game_variables_t *gv);\r
 tileset_t bitmapLoadPcxTiles(char *filename, word twidth, word theight);\r
-byte *modexNewPal();\r
+\r
 #endif\r
diff --git a/16/src/lib/omodex16.c b/16/src/lib/omodex16.c
new file mode 100755 (executable)
index 0000000..4a3942b
--- /dev/null
@@ -0,0 +1,640 @@
+#include <dos.h>\r
+#include <string.h>\r
+#include <mem.h>\r
+#include <conio.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "16/src/lib/omodex16.h"\r
+\r
+\r
+byte far* VGA=(byte far*) 0xA0000000;  /* this points to video memory. */\r
+\r
+static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette);\r
+static byte tmppal[PAL_SIZE];\r
+\r
+static void\r
+vgaSetMode(byte mode)\r
+{\r
+  union REGS regs;\r
+\r
+  regs.h.ah = SET_MODE;\r
+  regs.h.al = mode;\r
+  int86(VIDEO_INT, &regs, &regs);\r
+}\r
+\r
+\r
+/* -========================= Entry  Points ==========================- */\r
+void\r
+omodexEnter() {\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
+\r
+    /* clear video memory */\r
+    outpw(SC_INDEX, 0x0f02);\r
+    for(i=0; i<0x8000; i++) {\r
+       ptr[i] = 0x0000;\r
+    }\r
+}\r
+\r
+\r
+void\r
+omodexLeave() {\r
+    /* TODO restore original mode and palette */\r
+    vgaSetMode(TEXT_MODE);\r
+}\r
+\r
+\r
+opage_t\r
+omodexDefaultPage() {\r
+    opage_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
+\r
+    return page;\r
+}\r
+\r
+/* returns the next page in contiguous memory\r
+ * the next page will be the same size as p, by default\r
+ */\r
+opage_t\r
+omodexNextPage(opage_t *p) {\r
+    opage_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 = p->width;\r
+    result.height = p->height;\r
+\r
+    return result;\r
+}\r
+\r
+\r
+void\r
+omodexShowPage(opage_t *page) {\r
+    word high_address;\r
+    word low_address;\r
+    word offset;\r
+    byte crtcOffset;\r
+\r
+    /* calculate offset */\r
+    offset = (word) page->data;\r
+    offset += page->dy * (page->width >> 2 );\r
+    offset += page->dx >> 2;\r
+\r
+    /* calculate crtcOffset according to virtual width */\r
+    crtcOffset = page->width >> 3;\r
+\r
+    high_address = HIGH_ADDRESS | (offset & 0xff00);\r
+    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
+    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
+\r
+    /* do PEL panning here */\r
+    outp(AC_INDEX, 0x33);\r
+    outp(AC_INDEX, (page->dx & 0x03) << 1);\r
+}\r
+\r
+\r
+void\r
+omodexPanPage(opage_t *page, int dx, int dy) {\r
+    page->dx = dx;\r
+    page->dy = dy;\r
+}\r
+\r
+\r
+void\r
+omodexSelectPlane(byte plane) {\r
+    outp(SC_INDEX, MAP_MASK);          /* select plane */\r
+    outp(SC_DATA,  plane);\r
+}\r
+\r
+\r
+void\r
+omodexClearRegion(opage_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
+    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
+    byte right = rclip[(x+w)&0x03];\r
+\r
+    /* handle the case which requires an extra group */\r
+    if((x & 0x03) && !((x+w) & 0x03)) {\r
+      right=0x0f;\r
+    }\r
+\r
+    __asm {\r
+               MOV AX, SCREEN_SEG      ; go to the VGA memory\r
+               MOV ES, AX\r
+               MOV DI, poffset         ; go to the first pixel\r
+               MOV DX, SC_INDEX        ; point to the map mask\r
+               MOV AL, MAP_MASK\r
+               OUT DX, AL\r
+               INC DX\r
+               MOV AL, color           ; get ready to write colors\r
+       SCAN_START:\r
+               MOV CX, scanCount       ; count the line\r
+               MOV BL, AL              ; remember color\r
+               MOV AL, left            ; do the left clip\r
+               OUT DX, AL              ; set the left clip\r
+               MOV AL, BL              ; restore color\r
+               STOSB                   ; write the color\r
+               DEC CX\r
+               JZ SCAN_DONE            ; handle 1 group stuff\r
+\r
+               ;-- write the main body of the scanline\r
+               MOV BL, AL              ; remember color\r
+               MOV AL, 0x0f            ; write to all pixels\r
+               OUT DX, AL\r
+               MOV AL, BL              ; restore color\r
+               REP STOSB               ; write the color\r
+       SCAN_DONE:\r
+               MOV BL, AL              ; remeber color\r
+               MOV AL, right\r
+               OUT DX, AL              ; do the right clip\r
+               MOV AL, BL              ; restore color\r
+               STOSB                   ; write pixel\r
+               ADD DI, nextRow         ; go to the next row\r
+               DEC h\r
+               JNZ SCAN_START\r
+    }\r
+}\r
+\r
+\r
+void\r
+omodexDrawBmp(opage_t *page, int x, int y, bitmap_t *bmp) {\r
+    /* draw the region (the entire freakin bitmap) */\r
+    omodexDrawBmpRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
+}\r
+\r
+\r
+void\r
+omodexDrawBmpRegion(opage_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;\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=0;\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
+               MOVSB                   ; copy the 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
+\r
+void\r
+omodexDrawSprite(opage_t *page, int x, int y, bitmap_t *bmp) {\r
+    /* draw the whole sprite */\r
+    omodexDrawSpriteRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
+}\r
+\r
+void\r
+omodexDrawSpriteRegion(opage_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;\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=0;\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
+\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
+ */\r
+void\r
+omodexCopyPageRegion(opage_t *dest, opage_t *src,\r
+                   word sx, word sy,\r
+                   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   = width/4;\r
+    word nextSrcRow = src->width/4 - scans - 1;\r
+    word nextDestRow = dest->width/4 - scans - 1;\r
+    byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08};  /* clips for rectangles not on 4s */\r
+    byte rclip[] = {0x0f, 0x01, 0x03, 0x07};\r
+    byte left = lclip[sx&0x03];\r
+    byte right = rclip[(sx+width)&0x03];\r
+\r
+    __asm {\r
+               MOV AX, SCREEN_SEG      ; work in the vga space\r
+               MOV ES, AX              ;\r
+               MOV DI, doffset         ;\r
+               MOV SI, soffset         ;\r
+\r
+               MOV DX, GC_INDEX        ; turn off cpu bits\r
+               MOV AX, 0008h           ;\r
+               OUT DX, AX\r
+\r
+               MOV AX, SC_INDEX        ; point to the mask register\r
+               MOV DX, AX              ;\r
+               MOV AL, MAP_MASK        ;\r
+               OUT DX, AL              ;\r
+               INC DX                  ;\r
+\r
+       ROW_START:\r
+               PUSH DS\r
+               MOV AX, ES\r
+               MOV DS, AX\r
+               MOV CX, scans           ; the number of latches\r
+\r
+               MOV AL, left            ; do the left column\r
+               OUT DX, AL              ;\r
+               MOVSB                   ;\r
+               DEC CX                  ;\r
+\r
+               MOV AL, 0fh             ; do the inner columns\r
+               OUT DX, AL\r
+               REP MOVSB               ; copy the pixels\r
+\r
+               MOV AL, right           ; do the right column\r
+               OUT DX, AL\r
+               MOVSB\r
+               POP DS\r
+\r
+               MOV AX, SI              ; go the start of the next row\r
+               ADD AX, nextSrcRow      ;\r
+               MOV SI, AX              ;\r
+               MOV AX, DI              ;\r
+               ADD AX, nextDestRow     ;\r
+               MOV DI, AX              ;\r
+\r
+               DEC height              ; do the rest of the actions\r
+               JNZ ROW_START           ;\r
+\r
+               MOV DX, GC_INDEX+1      ; go back to CPU data\r
+               MOV AL, 0ffh            ; none from latches\r
+               OUT DX, AL              ;\r
+    }\r
+}\r
+\r
+\r
+/* fade and flash */\r
+void\r
+omodexFadeOn(word fade, byte *palette) {\r
+    fadePalette(-fade, 64, 64/fade+1, palette);\r
+}\r
+\r
+\r
+void\r
+omodexFadeOff(word fade, byte *palette) {\r
+    fadePalette(fade, 0, 64/fade+1, palette);\r
+}\r
+\r
+\r
+void\r
+omodexFlashOn(word fade, byte *palette) {\r
+    fadePalette(fade, -64, 64/fade+1, palette);\r
+}\r
+\r
+\r
+void\r
+omodexFlashOff(word fade, byte *palette) {\r
+    fadePalette(-fade, 0, 64/fade+1, palette);\r
+}\r
+\r
+\r
+static void\r
+fadePalette(sbyte fade, sbyte start, word iter, byte *palette) {\r
+    word i;\r
+    byte dim = start;\r
+\r
+    /* handle the case where we just update */\r
+    if(iter == 0) {\r
+       omodexPalUpdate(palette);\r
+       return;\r
+    }\r
+\r
+    while(iter > 0) {  /* FadeLoop */\r
+       for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */\r
+           tmppal[i] = palette[i] - dim;\r
+           if(tmppal[i] > 127) {\r
+               tmppal[i] = 0;\r
+           } else if(tmppal[i] > 63) {\r
+               tmppal[i] = 63;\r
+           }\r
+       }\r
+        omodexPalUpdate(tmppal);\r
+       iter--;\r
+       dim += fade;\r
+    }\r
+}\r
+\r
+\r
+/* save and load */\r
+void\r
+omodexPalSave(byte *palette) {\r
+    int  i;\r
+\r
+    outp(PAL_READ_REG, 0);     /* start at palette entry 0 */\r
+    for(i=0; i<PAL_SIZE; i++) {\r
+       palette[i] = inp(PAL_DATA_REG); /* read the palette data */\r
+    }\r
+}\r
+\r
+\r
+byte *\r
+omodexNewPal() {\r
+    byte *ptr;\r
+    ptr = malloc(PAL_SIZE);\r
+\r
+    /* handle errors */\r
+    if(!ptr) {\r
+       printf("Could not allocate palette.\n");\r
+       exit(-1);\r
+    }\r
+\r
+    return ptr;\r
+}\r
+\r
+\r
+void\r
+omodexLoadPalFile(byte *filename, byte **palette) {\r
+    FILE *file;\r
+    byte *ptr;\r
+\r
+    /* free the palette if it exists */\r
+    if(*palette) {\r
+       free(*palette);\r
+    }\r
+\r
+    /* allocate the new palette */\r
+    *palette = omodexNewPal();\r
+\r
+    /* open the file */\r
+    file = fopen(filename, "rb");\r
+    if(!file) {\r
+       printf("Could not open palette file: %s\n", filename);\r
+       exit(-2);\r
+    }\r
+\r
+    /* read the file */\r
+    ptr = *palette;\r
+    while(!feof(file)) {\r
+       *ptr++ = fgetc(file);\r
+    }\r
+\r
+    fclose(file);\r
+}\r
+\r
+\r
+void\r
+omodexSavePalFile(char *filename, byte *pal) {\r
+//    unsigned int i;\r
+    FILE *file;\r
+\r
+    /* open the file for writing */\r
+    file = fopen(filename, "wb");\r
+    if(!file) {\r
+       printf("Could not open %s for writing\n", filename);\r
+       exit(-2);\r
+    }\r
+\r
+    /* write the data to the file */\r
+    fwrite(pal, 1, PAL_SIZE, file);\r
+    fclose(file);\r
+}\r
+\r
+\r
+/* blanking */\r
+void\r
+omodexPalBlack() {\r
+    fadePalette(-1, 64, 1, tmppal);\r
+}\r
+\r
+\r
+void\r
+omodexPalWhite() {\r
+    fadePalette(-1, -64, 1, tmppal);\r
+}\r
+\r
+\r
+/* utility */\r
+void\r
+omodexPalUpdate(byte *p) {\r
+    int i;\r
+    omodexWaitBorder();\r
+    outp(PAL_WRITE_REG, 0);  /* start at the beginning of palette */\r
+    for(i=0; i<PAL_SIZE/2; i++) {\r
+       outp(PAL_DATA_REG, p[i]);\r
+    }\r
+    omodexWaitBorder();            /* waits one retrace -- less flicker */\r
+    for(i=PAL_SIZE/2; i<PAL_SIZE; i++) {\r
+       outp(PAL_DATA_REG, p[i]);\r
+    }\r
+}\r
+\r
+\r
+void\r
+omodexWaitBorder() {\r
+    while(inp(INPUT_STATUS_1)  & 8)  {\r
+       /* spin */\r
+    }\r
+\r
+    while(!(inp(INPUT_STATUS_1)  & 8))  {\r
+       /* spin */\r
+    }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//\r
+//      US_CheckParm() - checks to see if a string matches one of a set of\r
+//              strings. The check is case insensitive. The routine returns the\r
+//              index of the string that matched, or -1 if no matches were found\r
+//\r
+///////////////////////////////////////////////////////////////////////////\r
+int\r
+US_CheckParm(char *parm,char **strings)\r
+{\r
+       char    cp,cs,\r
+                       *p,*s;\r
+       int             i;\r
+\r
+       while (!isalpha(*parm)) // Skip non-alphas\r
+               parm++;\r
+\r
+       for (i = 0;*strings && **strings;i++)\r
+       {\r
+               for (s = *strings++,p = parm,cs = cp = 0;cs == cp;)\r
+               {\r
+                       cs = *s++;\r
+                       if (!cs)\r
+                               return(i);\r
+                       cp = *p++;\r
+\r
+                       if (isupper(cs))\r
+                               cs = tolower(cs);\r
+                       if (isupper(cp))\r
+                               cp = tolower(cp);\r
+               }\r
+       }\r
+       return(-1);\r
+}\r
diff --git a/16/src/lib/omodex16.h b/16/src/lib/omodex16.h
new file mode 100755 (executable)
index 0000000..2e96980
--- /dev/null
@@ -0,0 +1,87 @@
+/*\r
+ * Functions for handling omodex and doing other basic graphics stuff.\r
+ */\r
+#ifndef omodex16_H\r
+#define omodex16_H\r
+#include <conio.h>\r
+#include "src/lib/16_head.h"\r
+#include "16/src/lib/bitmap.h"\r
+\r
+/* -========================== Types & Macros ==========================- */\r
+#define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))\r
+//#define PLANE(x) (1<< (x&3))\r
+#define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)\r
+\r
+typedef struct {\r
+    byte far* data;    /* the data for the page */\r
+    word dx;           /* col we are viewing on the virtual screen */\r
+    word dy;           /* row we are viewing on the virtual screen */\r
+    word width;                /* virtual width of the page */\r
+    word height;       /* virtual height of the page */\r
+} opage_t;\r
+\r
+/* -============================ Functions =============================- */\r
+/* mode switching, page, and plane functions */\r
+void omodexEnter();\r
+void omodexLeave();\r
+opage_t omodexDefaultPage();\r
+opage_t omodexNextPage(opage_t *p);\r
+void omodexShowPage(opage_t *page);\r
+void omodexPanPage(opage_t *page, int dx, int dy);\r
+void omodexSelectPlane(byte plane);\r
+void omodexClearRegion(opage_t *page, int x, int y, int w, int h, byte color);\r
+void omodexDrawBmp(opage_t *page, int x, int y, bitmap_t *bmp);\r
+void omodexDrawBmpRegion(opage_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp);\r
+void omodexDrawSprite(opage_t *page, int x, int y, bitmap_t *bmp);\r
+void omodexDrawSpriteRegion(opage_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp);\r
+\r
+/* Palette fade and flash effects */\r
+void omodexFadeOn(word fade, byte *palette);\r
+void omodexFadeOff(word fade, byte *palette);\r
+void omodexFlashOn(word fade, byte *palette);\r
+void omodexFlashOff(word fade, byte *palette);\r
+\r
+/* palette loading and saving */\r
+void omodexPalSave(byte *palette);\r
+byte *omodexNewPal();\r
+void omodexLoadPalFile(char *filename, byte **palette);\r
+void omodexSavePalFile(char *filename, byte *palette);\r
+\r
+/* fixed palette functions */\r
+void omodexPalBlack();\r
+void omodexPalWhite();\r
+\r
+/* utility functions */\r
+void omodexPalUpdate(byte *p);\r
+void omodexWaitBorder();\r
+int US_CheckParm(char *parm,char **strings);\r
+\r
+/* -======================= Constants & Vars ==========================- */\r
+extern byte far*  VGA;  /* The VGA Memory */\r
+#define SCREEN_SEG             0xa000\r
+#define VIDEO_INT              0x10\r
+#define SET_MODE               0x00\r
+#define VGA_256_COLOR_MODE     0x13\r
+#define TEXT_MODE              0x03\r
+#define SCREEN_WIDTH           320\r
+#define SCREEN_HEIGHT          240\r
+#define PAGE_SIZE              (word)(SCREEN_WIDTH/4 * SCREEN_HEIGHT)\r
+\r
+#define AC_INDEX               0x03c0\r
+#define SC_INDEX               0x03c4\r
+#define SC_DATA                        0x03c5\r
+//#define CRTC_INDEX           0x03d4\r
+#define CRTC_DATA              0x03d5\r
+#define GC_INDEX               0x03ce\r
+#define MISC_OUTPUT            0x03c2\r
+#define HIGH_ADDRESS           0x0C\r
+#define LOW_ADDRESS            0x0D\r
+#define VRETRACE               0x08\r
+#define INPUT_STATUS_1         0x03da\r
+#define DISPLAY_ENABLE         0x01\r
+#define MAP_MASK               0x02\r
+#define PAL_READ_REG            0x03C7   /* Color register, read address */\r
+#define PAL_WRITE_REG           0x03C8   /* Color register, write address */\r
+#define PAL_DATA_REG            0x03C9   /* Color register, data port */\r
+#define PAL_SIZE                (256 * 3)\r
+#endif\r
index 334e47f2a37d1d43a417d69bb3994922c7cad1bd..75fc0af8c3be9171d992a322c68ec256bb4b2d64 100755 (executable)
--- a/makefile
+++ b/makefile
@@ -256,7 +256,7 @@ bakapi.exe:         bakapi.$(OBJ) 16_vl.$(OBJ) 16_vl_1.$(OBJ) 16text.$(OBJ) bakapee.$(O
 #
 # Test Executables!
 #
-0croll.exe:    0croll.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) $(OLDLIBOBJS)
+0croll.exe:    0croll.$(OBJ) $(OLDLIBOBJS) omodex16.$(OBJ) 16_in.$(OBJ)
 0croll.$(OBJ): $(SRC)/0croll.c
 scroll.exe:    scroll.$(OBJ) $(16LIB) gfx.lib $(DOSLIB)
 scroll.$(OBJ): $(SRC)/scroll.c
@@ -385,6 +385,7 @@ bakapee.$(OBJ):     $(SRCLIB)/bakapee.c $(SRCLIB)/bakapee.h
 16_vrs.$(OBJ): $(SRCLIB)/16_vrs.c $(SRCLIB)/16_vrs.h $(DOSLIB)
 16_spri.$(OBJ):$(SRCLIB)/16_spri.c $(SRCLIB)/16_spri.h
 bitmap.$(OBJ): 16/$(SRCLIB)/bitmap.c 16/$(SRCLIB)/bitmap.h
+omodex16.$(OBJ):       16/$(SRCLIB)/omodex16.c 16/$(SRCLIB)/omodex16.h
 planar.$(OBJ): $(SRCLIB)/planar.c $(SRCLIB)/planar.h
 scroll16.$(OBJ):$(SRCLIB)/scroll16.c $(SRCLIB)/scroll16.h
 16text.$(OBJ): $(SRCLIB)/16text.c $(SRCLIB)/16text.h
index 844dc9957f8a326fbf8daceb96895ff154f309e4..aabb518bd7eb4ccd6fa05647b2e5f378041b0edf 100755 (executable)
@@ -1,5 +1,5 @@
-//#include "modex16.h"\r
-#include "src/lib/16_vl.h"\r
+//from https://github.com/sparky4/16/commit/a19d7592507e5f7aa91f4a6b6611e021bd1a3e8d\r
+#include "16/src/lib/omodex16.h"\r
 #include "16/src/lib/bitmap.h"\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -29,7 +29,7 @@ typedef struct {
 \r
 typedef struct {\r
        omap_t *map;\r
-       page_t *page;\r
+       opage_t *page;\r
        int tx; //???? appears to be the tile position on the viewable screen map\r
        int ty; //???? appears to be the tile position on the viewable screen map\r
        word dxThresh; //????\r
@@ -49,7 +49,7 @@ void omapScrollLeft(omap_view_t *mv, byte offest);
 void omapScrollUp(omap_view_t *mv, byte offset);\r
 void omapScrollDown(omap_view_t *mv, byte offset);\r
 void omapGoTo(omap_view_t *mv, int tx, int ty);\r
-void omapDrawTile(otiles_t *t, word i, page_t *page, word x, word y);\r
+void omapDrawTile(otiles_t *t, word i, opage_t *page, word x, word y);\r
 void omapDrawRow(omap_view_t *mv, int tx, int ty, word y);\r
 void omapDrawCol(omap_view_t *mv, int tx, int ty, word x);\r
 \r
@@ -62,7 +62,7 @@ void main() {
        //int ch=0x0;\r
 //     byte ch;\r
 //     int q=0;\r
-       page_t screen;//,screen2;\r
+       opage_t screen;//,screen2;\r
        omap_t map;\r
        omap_view_t mv;//, mv2;\r
        omap_view_t *draw;//, *show, *tmp;\r
@@ -82,15 +82,15 @@ void main() {
 \r
        /* draw the tiles */\r
        ptr = map.data;\r
-       modexEnter(1, 1, &gvar);\r
-       screen = modexDefaultPage(&screen, &gvar);\r
+       omodexEnter(1, 1, &gvar);\r
+       screen = omodexDefaultPage();\r
        screen.width += (TILEWH*2);\r
        mv.page = &screen;\r
        omapGoTo(&mv, 16, 16);\r
-//     screen2=modexNextPage(mv.page);\r
+//     screen2=omodexNextPage(mv.page);\r
 //     mv2.page = &screen2;\r
 //     omapGoTo(&mv2, 16, 16);\r
-//     modexShowPage(mv.page);\r
+//     omodexShowPage(mv.page);\r
 \r
        /* set up paging */\r
 //     show = &mv;\r
@@ -106,7 +106,7 @@ void main() {
        while(!gvar.in.inst->Keyboard[77]){\r
 //             for(q=0; q<TILEWH; q++) {\r
                omapScrollRight(draw, 1);\r
-//             modexShowPage(draw->page);\r
+//             omodexShowPage(draw->page);\r
 //             omapScrollRight(draw, 1);\r
 //             SWAP(draw, show);\r
 //             }\r
@@ -115,7 +115,7 @@ void main() {
        while(!gvar.in.inst->Keyboard[75]){\r
 //             for(q=0; q<TILEWH; q++) {\r
                omapScrollLeft(draw, 1);\r
-//             modexShowPage(draw->page);\r
+//             omodexShowPage(draw->page);\r
 //             omapScrollLeft(show, 1);\r
 //             SWAP(draw, show);\r
 //             }\r
@@ -124,7 +124,7 @@ void main() {
        while(!gvar.in.inst->Keyboard[80]){\r
 //             for(q=0; q<TILEWH; q++) {\r
                omapScrollDown(draw, 1);\r
-//             modexShowPage(draw->page);\r
+//             omodexShowPage(draw->page);\r
 //             omapScrollDown(show, 1);\r
 //             SWAP(draw, show);\r
 //             }\r
@@ -133,18 +133,18 @@ void main() {
        while(!gvar.in.inst->Keyboard[72]){\r
 //             for(q=0; q<TILEWH; q++) {\r
                omapScrollUp(draw, 1);\r
-//             modexShowPage(draw->page);\r
+//             omodexShowPage(draw->page);\r
 //             omapScrollUp(show, 1);\r
 //             SWAP(draw, show);\r
 //             }\r
        }\r
 \r
        //keyp(ch);\r
-       modexShowPage(draw->page);\r
+       omodexShowPage(draw->page);\r
 \r
        }\r
 \r
-       modexLeave();\r
+       omodexLeave();\r
 \r
 //     setkb(0);\r
        IN_Shutdown(&gvar);\r
@@ -312,7 +312,7 @@ omapGoTo(omap_view_t *mv, int tx, int ty) {
        mv->dyThresh = mv->map->tiles->tileHeight * 2;\r
 \r
        /* draw the tiles */\r
-       modexClearRegion(mv->page, 0, 0, mv->page->width, mv->page->height, 0);\r
+       omodexClearRegion(mv->page, 0, 0, mv->page->width, mv->page->height, 0);\r
        py=0;\r
        i=mv->ty * mv->map->width + mv->tx;\r
        for(ty=mv->ty-1; py < SCREEN_HEIGHT+mv->dyThresh && ty < mv->map->height; ty++, py+=mv->map->tiles->tileHeight) {\r
@@ -323,12 +323,12 @@ omapGoTo(omap_view_t *mv, int tx, int ty) {
 \r
 \r
 void\r
-omapDrawTile(otiles_t *t, word i, page_t *page, word x, word y) {\r
+omapDrawTile(otiles_t *t, word i, opage_t *page, word x, word y) {\r
        word rx;\r
        word ry;\r
        rx = (i % t->cols) * t->tileWidth;\r
        ry = (i / t->cols) * t->tileHeight;\r
-       modexDrawBmpRegion(page, x, y, rx, ry, t->tileWidth, t->tileHeight, t->data);\r
+       omodexDrawBmpRegion(page, x, y, rx, ry, t->tileWidth, t->tileHeight, t->data);\r
 }\r
 \r
 \r
index 65fafd87e63b68a11a067faf0a7486e8f3757774..8d76a7fca3e82ffeb64e63b5b2a222bf2a5b0053 100755 (executable)
@@ -29,9 +29,10 @@ void
 main(int argc, char *argv[])\r
 {\r
        static global_game_variables_t gvar;\r
-       //extern struct inconfig inpu;\r
+#ifdef __DEBUG_InputMgr__\r
        dbg_testkeyin=0;\r
        dbg_testcontrolnoisy=1;\r
+#endif\r
        start_timer(&gvar);\r
        //Startup16(&gvar);\r
        IN_Startup(&gvar);\r
@@ -108,6 +109,8 @@ ctrl_Keyboard1);
        //printf("%u\n", in.Keyboard[sc_Escape]);\r
        printf("inputest.exe ");\r
        printf("version %s\n", VERSION);\r
+#ifdef __DEBUG_InputMgr__\r
        printf("testkeyin=%u\n", dbg_testkeyin);\r
        printf("testcontrolnoisy=%u\n", dbg_testcontrolnoisy);\r
+#endif\r
 }\r
index ede5c359cede94c1f74d7eacdfee64483387cebf..295b7146b9d96abea20ad1a38d0905dd19b5f36d 100755 (executable)
@@ -7,7 +7,7 @@
 #include "src/lib/16_tdef.h"\r
 \r
 #define __DEBUG__\r
-#define __DEBUG_InputMgr__\r
+//#define __DEBUG_InputMgr__\r
 #define __DEBUG_MAP__\r
 //#define __DEBUG_2__\r
 //#define __DEBUG_CA__\r
index d159c2a312d3bddc853a714e51c4d192b272b09d..0b4a0497c445a06f7e7569307e992944bafcc585 100755 (executable)
@@ -52,7 +52,7 @@ void modexDrawPBufRegion      (page_t *page, int x, int y, int rx, int ry, int rw, in
        //printf("%d,%d p(%d,%d) r(%d,%d) rwh(%d,%d)\n", x, y, px, py, rx, ry, rw, rh);\r
        for(plane=0; plane < 4; plane++) {\r
                i=PEEE+prh;\r
-               modexSelectPlane(PLANE(plane-1));\r
+               omodexSelectPlane(PLANE(plane-1));\r
                for(; y < py+rh; y++) {\r
                                _fmemcpy(page->data + (((page->width/4) * (y)) + ((x) / 4)), &(p->plane[plane][i]), prw);\r
                                i+=PE;\r
@@ -120,7 +120,7 @@ oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite)
 \r
        /* TODO Make this fast.  It's SLOOOOOOW */\r
        for(plane=0; plane < 4; plane++) {\r
-               modexSelectPlane(PLANE(plane+x));\r
+               omodexSelectPlane(PLANE(plane+x));\r
                for(px = plane; px < bmp->width; px+=4) {\r
                        offset=px;\r
                        for(py=0; py<bmp->height; py++) {\r
index 7287bf1e81d5609907f1be6e3a1974fe24ce0224..bea992be0038c7cf11b77d8cbcc80cab0a3c6faf 100755 (executable)
@@ -23,7 +23,8 @@
 #ifndef __RENDER_H__\r
 #define __RENDER_H__\r
 \r
-#include "src/lib/16_vl.h"\r
+//#include "src/lib/16_vl.h"\r
+#include "16/src/lib/omodex16.h"\r
 \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
 void modexDrawPBuf(page_t *page, int x, int y, planar_buf_t *p, boolean sprite); /*temp*/\r
index 2e6a90bbc128d74aa1dc897616ad731d00e02c4e..7ab82a4cfd87abe1c9078847e6e772241f3e529c 100755 (executable)
@@ -28,7 +28,9 @@
 #include "src/lib/16_ca.h"\r
 #include "src/lib/16_mm.h"\r
 \r
+#ifdef __DEBUG_InputMgr__\r
 extern boolean dbg_nointest;\r
+#endif\r
 boolean panswitch;\r
 \r
 static word far* clockw= (word far*) 0x046C; /* 18.2hz clock */\r
@@ -53,7 +55,9 @@ void main()
        int size=0;\r
 */\r
 \r
+#ifdef __DEBUG_InputMgr__\r
        dbg_nointest=0;\r
+#endif\r
        Startup16(&gvar);\r
 \r
 /*     CA_LoadFile("data/spri/chikyuu.vrs", &bigbuffer, &gvar);\r