OSDN Git Service

extended the palette system~ wwww
authorsparky4 <sparky4@cock.li>
Sun, 29 Mar 2015 08:35:47 +0000 (03:35 -0500)
committersparky4 <sparky4@cock.li>
Sun, 29 Mar 2015 08:35:47 +0000 (03:35 -0500)
wwww
modified:   data/MAYU.PCX
new file:   data/g.pal
modified:   data/koishi^^.pcx
modified:   data/koishi~.pcx
modified:   data/ptmp.pcx
modified:   pcxtest.exe
modified:   scroll.exe
modified:   src/lib/bitmap.h
modified:   src/lib/mapread.c
modified:   src/lib/mapread.h
modified:   src/lib/modex16.c
modified:   src/lib/modex16.h
modified:   src/pcxtest.c
modified:   src/scroll.c
modified:   test.exe
modified:   test2.exe

16 files changed:
data/MAYU.PCX
data/g.pal [new file with mode: 0644]
data/koishi^^.pcx
data/koishi~.pcx
data/ptmp.pcx
pcxtest.exe
scroll.exe
src/lib/bitmap.h
src/lib/mapread.c
src/lib/mapread.h
src/lib/modex16.c
src/lib/modex16.h
src/pcxtest.c
src/scroll.c
test.exe
test2.exe

index 025e7d4..c89f025 100644 (file)
Binary files a/data/MAYU.PCX and b/data/MAYU.PCX differ
diff --git a/data/g.pal b/data/g.pal
new file mode 100644 (file)
index 0000000..7ac648d
Binary files /dev/null and b/data/g.pal differ
index 0dbbc0d..66523ed 100644 (file)
Binary files a/data/koishi^^.pcx and b/data/koishi^^.pcx differ
index 58a03bb..c606567 100644 (file)
Binary files a/data/koishi~.pcx and b/data/koishi~.pcx differ
index 3b95631..7e212b7 100644 (file)
Binary files a/data/ptmp.pcx and b/data/ptmp.pcx differ
index 98fa93a..e69de29 100644 (file)
Binary files a/pcxtest.exe and b/pcxtest.exe differ
index 3417aed..edbdeeb 100644 (file)
Binary files a/scroll.exe and b/scroll.exe differ
index 2eefe41..e0e93c3 100644 (file)
@@ -8,7 +8,8 @@ typedef struct {
     byte *data;
     word width;\r
     word height;\r
-    byte *palette;\r
+    byte *palette;
+    word offset;\r
 } bitmap_t;\r
 \r
 typedef struct {\r
index a55f21a..d118779 100644 (file)
@@ -9,7 +9,7 @@ static int jsoneq(const char *json, jsmntok_t *tok, const char *s) {
 }
 
 //this function is quite messy ^^; sorry! it is a quick and dirty fix~
-static int dump(const char *js, jsmntok_t *t, size_t count, int indent, /*char *js_sv,*/ map_t *map, int q/*, int *w*/) {
+static int dump(const char *js, jsmntok_t *t, size_t count, int indent, /*char *js_sv,*/ map_t *map, int q) {
        int i, j, k;
        bitmap_t bp;
        if (count == 0) {
@@ -75,9 +75,9 @@ static int dump(const char *js, jsmntok_t *t, size_t count, int indent, /*char *
                j = 0;
                for (i = 0; i < t->size; i++) {
                        //for (k = 0; k < indent; k++) printf("\t");
-                       j += dump(js, t+1+j, count-j, indent+1, map, i/*, w*/);
+                       j += dump(js, t+1+j, count-j, indent+1, map, i);
                        //printf(": ");
-                       j += dump(js, t+1+j, count-j, indent+1, map, i/*, w*/);
+                       j += dump(js, t+1+j, count-j, indent+1, map, i);
                        //printf("\n");
                }
                return j+1;
@@ -87,7 +87,7 @@ static int dump(const char *js, jsmntok_t *t, size_t count, int indent, /*char *
                for (i = 0; i < t->size; i++) {
                        //for (k = 0; k < indent-1; k++) printf("\t");
                        //printf("\t-");
-                       j += dump(js, t+1+j, count-j, indent+1, map, i/*, &t->size*/);
+                       j += dump(js, t+1+j, count-j, indent+1, map, i);
                        //printf("==\n");
                }
                return j+1;
@@ -95,7 +95,7 @@ static int dump(const char *js, jsmntok_t *t, size_t count, int indent, /*char *
        return 0;
 }
 
-static int loadmap(char *mn, map_t *map/*, word w*/)
+static int loadmap(char *mn, map_t *map)
 {
        int r;
        int eof_expected = 0;
index 623bf54..b82369a 100644 (file)
@@ -26,6 +26,6 @@ typedef struct {
 
 static int jsoneq(const char *json, jsmntok_t *tok, const char *s);
 static int dump(const char *js, jsmntok_t *t, size_t count, int indent, map_t *map, int q);
-static int loadmap(char *mn, map_t *map/*, word w*/);
+static int loadmap(char *mn, map_t *map);
 
 #endif/*_LIBMAPREAD_H_*/
index d0707ff..83c2278 100644 (file)
-#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 "src\lib\modex16.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
-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
-\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
-modexLeave() {\r
-    /* TODO restore original mode and palette */\r
-    vgaSetMode(TEXT_MODE);\r
-}\r
-\r
-\r
-page_t\r
-modexDefaultPage() {\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
-\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
-page_t\r
-modexNextPage(page_t *p) {\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 = p->width;\r
-    result.height = p->height;\r
-\r
-    return result;\r
-}\r
-\r
-\r
-void\r
-modexShowPage(page_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
-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
-    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
-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;\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
-       //code is a bit slow here\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
-modexDrawPlanarBuf(page_t *page, int x, int y, planar_buf_t *bmp) {\r
+#include <dos.h>
+#include <string.h>
+#include <mem.h>
+#include <conio.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "src\lib\modex16.h"
+
+
+byte far* VGA=(byte far*) 0xA0000000;  /* this points to video memory. */
+
+static void fadePalette(sbyte fade, sbyte start, word iter, byte *palette);
+static byte tmppal[PAL_SIZE];
+
+static void
+vgaSetMode(byte mode)
+{
+  union REGS regs;
+
+  regs.h.ah = SET_MODE;
+  regs.h.al = mode;
+  int86(VIDEO_INT, &regs, &regs);
+}
+
+
+/* -========================= Entry  Points ==========================- */
+void
+modexEnter() {
+    word i;
+    dword far*ptr=(dword far*)VGA;      /* used for faster screen clearing */
+    word CRTParms[] = {
+       0x0d06,         /* vertical total */
+       0x3e07,         /* overflow (bit 8 of vertical counts) */
+       0x4109,         /* cell height (2 to double-scan */
+       0xea10,         /* v sync start */
+       0xac11,         /* v sync end and protect cr0-cr7 */
+       0xdf12,         /* vertical displayed */
+       0x0014,         /* turn off dword mode */
+       0xe715,         /* v blank start */
+       0x0616,         /* v blank end */
+       0xe317          /* turn on byte mode */
+    };
+    int CRTParmCount = sizeof(CRTParms) / sizeof(CRTParms[0]);
+
+    /* TODO save current video mode and palette */
+    vgaSetMode(VGA_256_COLOR_MODE);
+
+    /* disable chain4 mode */
+    outpw(SC_INDEX, 0x0604);
+
+    /* synchronous reset while setting Misc Output */
+    outpw(SC_INDEX, 0x0100);
+
+    /* select 25 MHz dot clock & 60 Hz scanning rate */
+    outp(MISC_OUTPUT, 0xe3);
+
+    /* undo reset (restart sequencer) */
+    outpw(SC_INDEX, 0x0300);
+
+    /* reprogram the CRT controller */
+    outp(CRTC_INDEX, 0x11); /* VSync End reg contains register write prot */
+    outp(CRTC_DATA, 0x7f);  /* get current write protect on varios regs */
+
+    /* send the CRTParms */
+    for(i=0; i<CRTParmCount; i++) {
+       outpw(CRTC_INDEX, CRTParms[i]);
+    }
+
+    /* clear video memory */
+    outpw(SC_INDEX, 0x0f02);
+    for(i=0; i<0x8000; i++) {
+       ptr[i] = 0x0000;
+    }
+}
+
+
+void
+modexLeave() {
+    /* TODO restore original mode and palette */
+    vgaSetMode(TEXT_MODE);
+}
+
+
+page_t
+modexDefaultPage() {
+    page_t page;
+
+    /* default page values */
+    page.data = VGA;
+    page.dx = 0;
+    page.dy = 0;
+    page.width = SCREEN_WIDTH;
+    page.height = SCREEN_HEIGHT;
+
+    return page;
+}
+
+/* returns the next page in contiguous memory
+ * the next page will be the same size as p, by default
+ */
+page_t
+modexNextPage(page_t *p) {
+    page_t result;
+
+    result.data = p->data + (p->width/4)*p->height;  /* compute the offset */
+    result.dx = 0;
+    result.dy = 0;
+    result.width = p->width;
+    result.height = p->height;
+
+    return result;
+}
+
+
+void
+modexShowPage(page_t *page) {
+    word high_address;
+    word low_address;
+    word offset;
+    byte crtcOffset;
+
+    /* calculate offset */
+    offset = (word) page->data;
+    offset += page->dy * (page->width >> 2 );
+    offset += page->dx >> 2;
+
+    /* calculate crtcOffset according to virtual width */
+    crtcOffset = page->width >> 3;
+
+    high_address = HIGH_ADDRESS | (offset & 0xff00);
+    low_address  = LOW_ADDRESS  | (offset << 8);
+
+    /* wait for appropriate timing and then program CRTC */
+    while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));
+    outpw(CRTC_INDEX, high_address);
+    outpw(CRTC_INDEX, low_address);
+    outp(CRTC_INDEX, 0x13);
+    outp(CRTC_DATA, crtcOffset);
+
+    /*  wait for one retrace */
+    while (!(inp(INPUT_STATUS_1) & VRETRACE)); 
+
+    /* do PEL panning here */
+    outp(AC_INDEX, 0x33);
+    outp(AC_INDEX, (page->dx & 0x03) << 1);
+}
+
+
+void
+modexPanPage(page_t *page, int dx, int dy) {
+    page->dx = dx;
+    page->dy = dy;
+}
+
+
+void
+modexSelectPlane(byte plane) {
+    outp(SC_INDEX, MAP_MASK);          /* select plane */
+    outp(SC_DATA,  plane);
+}
+
+
+void
+modexClearRegion(page_t *page, int x, int y, int w, int h, byte  color) {
+    word pageOff = (word) page->data;
+    word xoff=x/4;       /* xoffset that begins each row */
+    word scanCount=w/4;  /* number of iterations per row (excluding right clip)*/
+    word poffset = pageOff + y*(page->width/4) + xoff; /* starting offset */
+    word nextRow = page->width/4-scanCount-1;  /* loc of next row */
+    byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08};  /* clips for rectangles not on 4s */
+    byte rclip[] = {0x00, 0x01, 0x03, 0x07};
+    byte left = lclip[x&0x03];
+    byte right = rclip[(x+w)&0x03];
+
+    /* handle the case which requires an extra group */
+    if((x & 0x03) && !((x+w) & 0x03)) {
+      right=0x0f;
+    }
+
+    __asm {
+               MOV AX, SCREEN_SEG      ; go to the VGA memory
+               MOV ES, AX
+               MOV DI, poffset         ; go to the first pixel
+               MOV DX, SC_INDEX        ; point to the map mask
+               MOV AL, MAP_MASK
+               OUT DX, AL
+               INC DX
+               MOV AL, color           ; get ready to write colors
+       SCAN_START:
+               MOV CX, scanCount       ; count the line
+               MOV BL, AL              ; remember color
+               MOV AL, left            ; do the left clip
+               OUT DX, AL              ; set the left clip
+               MOV AL, BL              ; restore color
+               STOSB                   ; write the color
+               DEC CX
+               JZ SCAN_DONE            ; handle 1 group stuff
+
+               ;-- write the main body of the scanline
+               MOV BL, AL              ; remember color
+               MOV AL, 0x0f            ; write to all pixels
+               OUT DX, AL
+               MOV AL, BL              ; restore color
+               REP STOSB               ; write the color
+       SCAN_DONE:
+               MOV BL, AL              ; remeber color
+               MOV AL, right
+               OUT DX, AL              ; do the right clip
+               MOV AL, BL              ; restore color
+               STOSB                   ; write pixel
+               ADD DI, nextRow         ; go to the next row
+               DEC h
+               JNZ SCAN_START
+    }
+}
+
+
+void
+modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp) {
+    /* draw the region (the entire freakin bitmap) */
+    modexDrawBmpRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);
+}
+
+
+void
+modexDrawBmpRegion(page_t *page, int x, int y,
+                   int rx, int ry, int rw, int rh, bitmap_t *bmp) {
+    word poffset = (word) page->data  + y*(page->width/4) + x/4;
+    byte *data = bmp->data;//+bmp->offset;
+    word bmpOffset = (word) data + ry * bmp->width + rx;
+    word width = rw;
+    word height = rh;
+    byte plane = 1 << ((byte) x & 0x03);
+    word scanCount = width/4 + (width%4 ? 1 :0);
+    word nextPageRow = page->width/4 - scanCount;
+    word nextBmpRow = (word) bmp->width - width;
+    word rowCounter;
+    byte planeCounter = 4;
+
+       //code is a bit slow here
+    __asm {
+               MOV AX, SCREEN_SEG      ; go to the VGA memory
+               MOV ES, AX
+
+               MOV DX, SC_INDEX        ; point at the map mask register
+               MOV AL, MAP_MASK        ;
+               OUT DX, AL              ;
+
+       PLANE_LOOP:
+               MOV DX, SC_DATA         ; select the current plane
+               MOV AL, plane           ;
+               OUT DX, AL              ;
+
+               ;-- begin plane painting
+               MOV AX, height          ; start the row counter
+               MOV rowCounter, AX      ; 
+               MOV DI, poffset         ; go to the first pixel
+               MOV SI, bmpOffset       ; go to the bmp pixel
+       ROW_LOOP:
+               MOV CX, width           ; count the columns
+       SCAN_LOOP:
+               MOVSB                   ; copy the pixel
+               SUB CX, 3               ; we skip the next 3
+               ADD SI, 3               ; skip the bmp pixels
+               LOOP SCAN_LOOP          ; finish the scan
+
+               MOV AX, nextPageRow
+               ADD DI, AX              ; go to the next row on screen
+               MOV AX, nextBmpRow
+               ADD SI, AX              ; go to the next row on bmp
+
+               DEC rowCounter
+               JNZ ROW_LOOP            ; do all the rows
+               ;-- end plane painting
+
+               MOV AL, plane           ; advance to the next plane
+               SHL AL, 1               ;
+               AND AL, 0x0f            ; mask the plane properly
+               MOV plane, AL           ; store the plane
+
+               INC bmpOffset           ; start bmp at the right spot
+
+               DEC planeCounter
+               JNZ PLANE_LOOP          ; do all 4 planes
+    }
+}
+
+
+void
+modexDrawPlanarBuf(page_t *page, int x, int y, planar_buf_t *bmp) {
     /* TODO - adapt from test code */
        int plane;
        for(plane=0; plane < 4; plane++)
        {
                //fack
-       }\r
-}\r
-\r
-\r
-void\r
-modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp) {\r
-    /* draw the whole sprite */\r
-    modexDrawSpriteRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
-}\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 *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;\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
-modexCopyPageRegion(page_t *dest, page_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
-modexFadeOn(word fade, byte *palette) {\r
-    fadePalette(-fade, 64, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-modexFadeOff(word fade, byte *palette) {\r
-    fadePalette(fade, 0, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-modexFlashOn(word fade, byte *palette) {\r
-    fadePalette(fade, -64, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-modexFlashOff(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
-       modexPalUpdate(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
-        modexPalUpdate(tmppal);\r
-       iter--;\r
-       dim += fade;\r
-    }\r
-}\r
-\r
-\r
-/* save and load */\r
-void\r
-modexPalSave(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
-modexNewPal() {\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
-modexLoadPalFile(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 = modexNewPal();\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
-modexSavePalFile(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
-modexPalBlack() {\r
-    fadePalette(-1, 64, 1, tmppal);\r
-}\r
-\r
-\r
-void\r
-modexPalWhite() {\r
-    fadePalette(-1, -64, 1, tmppal);\r
-}\r
-\r
-\r
-/* utility */\r
-void\r
-modexPalUpdate(byte *p) {\r
-    int i;\r
-    modexWaitBorder();\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
-    modexWaitBorder();     /* 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
-modexWaitBorder() {\r
-    while(inp(INPUT_STATUS_1)  & 8)  {\r
-       /* spin */\r
-    }\r
-\r
-    while(!(inp(INPUT_STATUS_1)  & 8))  {\r
-       /* spin */\r
-    }\r
-}\r
+       }
+}
+
+
+void
+modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp) {
+    /* draw the whole sprite */
+    modexDrawSpriteRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);
+}
+
+void
+modexDrawSpriteRegion(page_t *page, int x, int y,
+                     int rx, int ry, int rw, int rh, bitmap_t *bmp) {
+    word poffset = (word)page->data + y*(page->width/4) + x/4;
+    byte *data = bmp->data;//+bmp->offset;
+    word bmpOffset = (word) data + ry * bmp->width + rx;
+    word width = rw;
+    word height = rh;
+    byte plane = 1 << ((byte) x & 0x03);
+    word scanCount = width/4 + (width%4 ? 1 :0);
+    word nextPageRow = page->width/4 - scanCount;
+    word nextBmpRow = (word) bmp->width - width;
+    word rowCounter;
+    byte planeCounter = 4;
+
+    __asm {
+               MOV AX, SCREEN_SEG      ; go to the VGA memory
+               MOV ES, AX
+
+               MOV DX, SC_INDEX        ; point at the map mask register
+               MOV AL, MAP_MASK        ;
+               OUT DX, AL              ;
+
+       PLANE_LOOP:
+               MOV DX, SC_DATA         ; select the current plane
+               MOV AL, plane           ;
+               OUT DX, AL              ;
+
+               ;-- begin plane painting
+               MOV AX, height          ; start the row counter
+               MOV rowCounter, AX      ; 
+               MOV DI, poffset         ; go to the first pixel
+               MOV SI, bmpOffset       ; go to the bmp pixel
+       ROW_LOOP:
+               MOV CX, width           ; count the columns
+       SCAN_LOOP:
+               LODSB
+               DEC SI
+               CMP AL, 0
+               JNE DRAW_PIXEL          ; draw non-zero pixels
+
+               INC DI                  ; skip the transparent pixel
+               ADD SI, 1
+               JMP NEXT_PIXEL
+       DRAW_PIXEL:
+               MOVSB                   ; copy the pixel
+       NEXT_PIXEL:
+               SUB CX, 3               ; we skip the next 3
+               ADD SI, 3               ; skip the bmp pixels
+               LOOP SCAN_LOOP          ; finish the scan
+
+               MOV AX, nextPageRow
+               ADD DI, AX              ; go to the next row on screen
+               MOV AX, nextBmpRow
+               ADD SI, AX              ; go to the next row on bmp
+
+               DEC rowCounter
+               JNZ ROW_LOOP            ; do all the rows
+               ;-- end plane painting
+
+               MOV AL, plane           ; advance to the next plane
+               SHL AL, 1               ;
+               AND AL, 0x0f            ; mask the plane properly
+               MOV plane, AL           ; store the plane
+
+               INC bmpOffset           ; start bmp at the right spot
+
+               DEC planeCounter
+               JNZ PLANE_LOOP          ; do all 4 planes
+    }
+}
+
+
+/* copy a region of video memory from one page to another.
+ * It assumes that the left edge of the tile is the same on both
+ * regions and the memory areas do not overlap.
+ */
+void
+modexCopyPageRegion(page_t *dest, page_t *src,
+                   word sx, word sy,
+                   word dx, word dy,
+                   word width, word height)
+{
+    word doffset = (word)dest->data + dy*(dest->width/4) + dx/4;
+    word soffset = (word)src->data + sy*(src->width/4) + sx/4;
+    word scans   = width/4;
+    word nextSrcRow = src->width/4 - scans - 1;
+    word nextDestRow = dest->width/4 - scans - 1;
+    byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08};  /* clips for rectangles not on 4s */
+    byte rclip[] = {0x0f, 0x01, 0x03, 0x07};
+    byte left = lclip[sx&0x03];
+    byte right = rclip[(sx+width)&0x03];
+
+    __asm {
+               MOV AX, SCREEN_SEG      ; work in the vga space
+               MOV ES, AX              ;
+               MOV DI, doffset         ;
+               MOV SI, soffset         ;
+
+               MOV DX, GC_INDEX        ; turn off cpu bits
+               MOV AX, 0008h           ;
+               OUT DX, AX
+
+               MOV AX, SC_INDEX        ; point to the mask register
+               MOV DX, AX              ;
+               MOV AL, MAP_MASK        ;
+               OUT DX, AL              ;
+               INC DX                  ;
+
+       ROW_START:
+               PUSH DS
+               MOV AX, ES
+               MOV DS, AX
+               MOV CX, scans           ; the number of latches
+
+               MOV AL, left            ; do the left column
+               OUT DX, AL              ;
+               MOVSB                   ;
+               DEC CX                  ;
+
+               MOV AL, 0fh             ; do the inner columns
+               OUT DX, AL
+               REP MOVSB               ; copy the pixels
+
+               MOV AL, right           ; do the right column
+               OUT DX, AL
+               MOVSB
+               POP DS
+
+               MOV AX, SI              ; go the start of the next row
+               ADD AX, nextSrcRow      ;
+               MOV SI, AX              ;
+               MOV AX, DI              ;
+               ADD AX, nextDestRow     ;
+               MOV DI, AX              ;
+
+               DEC height              ; do the rest of the actions
+               JNZ ROW_START           ;
+
+               MOV DX, GC_INDEX+1      ; go back to CPU data
+               MOV AL, 0ffh            ; none from latches
+               OUT DX, AL              ;
+    }
+}
+
+
+/* fade and flash */
+void
+modexFadeOn(word fade, byte *palette) {
+    fadePalette(-fade, 64, 64/fade+1, palette);
+}
+
+
+void
+modexFadeOff(word fade, byte *palette) {
+    fadePalette(fade, 0, 64/fade+1, palette);
+}
+
+
+void
+modexFlashOn(word fade, byte *palette) {
+    fadePalette(fade, -64, 64/fade+1, palette);
+}
+
+
+void
+modexFlashOff(word fade, byte *palette) {
+    fadePalette(-fade, 0, 64/fade+1, palette);
+}
+
+
+static void
+fadePalette(sbyte fade, sbyte start, word iter, byte *palette) {
+    word i;
+    byte dim = start;
+
+    /* handle the case where we just update */
+    if(iter == 0) {
+       modexPalUpdate2(palette);
+       return;
+    }
+
+    while(iter > 0) {  /* FadeLoop */
+       for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */
+           tmppal[i] = palette[i] - dim;
+           if(tmppal[i] > 127) {
+               tmppal[i] = 0;
+           } else if(tmppal[i] > 63) {
+               tmppal[i] = 63;
+           }
+       }
+        modexPalUpdate2(tmppal);
+       iter--;
+       dim += fade;
+    }
+}
+
+
+/* save and load */
+void
+modexPalSave(byte *palette) {
+    int  i;
+
+    outp(PAL_READ_REG, 0);     /* start at palette entry 0 */
+    for(i=0; i<PAL_SIZE; i++) {
+       palette[i] = inp(PAL_DATA_REG); /* read the palette data */
+    }
+}
+
+
+byte *
+modexNewPal() {
+    byte *ptr;
+    ptr = malloc(PAL_SIZE);
+
+    /* handle errors */
+    if(!ptr) {
+       printf("Could not allocate palette.\n");
+       exit(-1);
+    }
+
+    return ptr;
+}
+
+
+void
+modexLoadPalFile(byte *filename, byte **palette) {
+    FILE *file;
+    byte *ptr;
+
+    /* free the palette if it exists */
+    if(*palette) {
+       free(*palette);
+    }
+
+    /* allocate the new palette */
+    *palette = modexNewPal();
+
+    /* open the file */
+    file = fopen(filename, "rb");
+    if(!file) {
+       printf("Could not open palette file: %s\n", filename);
+       exit(-2);
+    }
+
+    /* read the file */
+    ptr = *palette;
+    while(!feof(file)) {
+       *ptr++ = fgetc(file);
+    }
+
+    fclose(file);
+}
+
+
+void
+modexSavePalFile(char *filename, byte *pal) {
+    unsigned int i;
+    FILE *file;
+
+    /* open the file for writing */
+    file = fopen(filename, "wb");
+    if(!file) {
+       printf("Could not open %s for writing\n", filename);
+       exit(-2);
+    }
+
+    /* write the data to the file */
+    fwrite(pal, 1, PAL_SIZE, file);
+    fclose(file);
+}
+
+
+/* blanking */
+void
+modexPalBlack() {
+    fadePalette(-1, 64, 1, tmppal);
+}
+
+
+void
+modexPalWhite() {
+    fadePalette(-1, -64, 1, tmppal);
+}
+
+
+/* utility */
+void
+modexPalUpdate(byte *p, word *i)
+{
+       word w=0;
+       word q=0;
+       modexWaitBorder();
+       if((*i)==0) outp(PAL_WRITE_REG, 0);  /* start at the beginning of palette */
+       else q=(*i);
+       if((*i)<PAL_SIZE/2 && w==0)
+       {
+//             printf("        %d      1st half\n", (*i));
+               for(; (*i)<PAL_SIZE/2; (*i)++)
+               {
+                       //if(i%3==0 && (p[i+5]==p[i+4] && p[i+4]==p[i+3] && p[i+3]==p[i+2] && p[i+2]==p[i+1] && p[i+1]==p[i] && p[i+5]==p[i]))
+                       if(((*i)-q)%3==0 && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5]))
+                       {
+//                             printf("[%d]", p[((*i)-q)]);    printf("[%d]", p[((*i)-q)+1]);  printf("[%d]", p[((*i)-q)+2]);  printf("[%d]", p[((*i)-q)+3]);                  printf("[%d]", p[((*i)-q)+4]);                  printf("[%d]", p[((*i)-q)+5]);                  printf("        %d [%d]\n", (*i), p[((*i)-q)]);
+                               //printf("              1st break\n");
+                               w++;
+                               //(*i)=(*i)+3;
+                               break;
+                       }
+                       else
+                       {
+                               outp(PAL_DATA_REG, p[(*i)-q]);
+//                             if((*i)>(88*3)) printf("                %d      %d\n", (*i), p[(*i)]);
+                       }
+               }
+       }
+       modexWaitBorder();          /* waits one retrace -- less flicker */
+       if((*i)>=PAL_SIZE/2 && w==0)
+       {
+               //printf("              2nd half\n");
+               for(; (*i)<PAL_SIZE; (*i)++)
+               {
+                       if(((*i)-q)%3==0 && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5]))
+                       {
+//                             printf("[%d]", p[((*i)-q)]);    printf("[%d]", p[((*i)-q)+1]);  printf("[%d]", p[((*i)-q)+2]);  printf("[%d]", p[((*i)-q)+3]);                  printf("[%d]", p[((*i)-q)+4]);                  printf("[%d]", p[((*i)-q)+5]);                  printf("        %d [%d]\n", (*i), p[((*i)-q)]);
+                               //printf("              1st break\n");
+                               w++;
+                               //(*i)=(*i)+3;
+                               break;
+                       }
+                       else
+                       {
+                               outp(PAL_DATA_REG, p[(*i)-q]);
+//                             if((*i)>(88*3)) printf("                %d      %d\n", (*i), p[(*i)]);
+                       }
+               }
+       }
+}
+
+void
+modexPalUpdate2(byte *p)
+{
+       int i;
+       modexWaitBorder();
+       outp(PAL_WRITE_REG, 0);  /* start at the beginning of palette */
+       for(i=0; i<PAL_SIZE/2; i++)
+       {
+               outp(PAL_DATA_REG, p[i]);
+       }
+       modexWaitBorder();          /* waits one retrace -- less flicker */
+       for(; i<PAL_SIZE; i++)
+       {
+               outp(PAL_DATA_REG, p[(i)]);
+       }
+}
+
+void
+modexWaitBorder() {
+    while(inp(INPUT_STATUS_1)  & 8)  {
+       /* spin */
+    }
+
+    while(!(inp(INPUT_STATUS_1)  & 8))  {
+       /* spin */
+    }
+}
index 7cb2782..d887262 100644 (file)
@@ -1,89 +1,90 @@
-/*\r
- * Functions for handling modex and doing other basic graphics stuff.\r
- */\r
-#ifndef MODEX16_H\r
-#define MODEX16_H\r
-#include <conio.h>\r
-#include "src\lib\types.h"\r
-#include "src\lib\bitmap.h"\r
-#include "src\lib\planar.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
-} page_t;\r
-\r
-/* -============================ Functions =============================- */\r
-/* mode switching, page, and plane functions */\r
-void modexEnter();\r
-void modexLeave();\r
-page_t modexDefaultPage();\r
-page_t modexNextPage(page_t *p);\r
-void modexShowPage(page_t *page);\r
-void modexPanPage(page_t *page, int dx, int dy);\r
-void modexSelectPlane(byte plane);\r
-void modexClearRegion(page_t *page, int x, int y, int w, int h, byte color);\r
-void modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp);\r
-void modexDrawBmpRegion(page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp);\r
-void modexDrawPlanarBuf(page_t *page, int x, int y, planar_buf_t *bmp);\r
-void modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp);\r
-void modexDrawSpriteRegion(page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp);\r
-void modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
-\r
-/* Palette fade and flash effects */\r
-void modexFadeOn(word fade, byte *palette);\r
-void modexFadeOff(word fade, byte *palette);\r
-void modexFlashOn(word fade, byte *palette);\r
-void modexFlashOff(word fade, byte *palette);\r
-\r
-/* palette loading and saving */\r
-void modexPalSave(byte *palette);\r
-byte *modexNewPal();\r
-void modexLoadPalFile(char *filename, byte **palette);\r
-void modexSavePalFile(char *filename, byte *palette);\r
-\r
-/* fixed palette functions */\r
-void modexPalBlack();\r
-void modexPalWhite();\r
-\r
-/* utility functions */\r
-void modexPalUpdate(byte *p);\r
-void modexWaitBorder();\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
+/*
+ * Functions for handling modex and doing other basic graphics stuff.
+ */
+#ifndef MODEX16_H
+#define MODEX16_H
+#include <conio.h>
+#include "src\lib\types.h"
+#include "src\lib\bitmap.h"
+#include "src\lib\planar.h"
+
+/* -========================== Types & Macros ==========================- */
+#define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))
+#define PLANE(x) (1<< (x&3))
+#define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)
+
+typedef struct {
+    byte far* data;    /* the data for the page */
+    word dx;           /* col we are viewing on the virtual screen */
+    word dy;           /* row we are viewing on the virtual screen */
+    word width;                /* virtual width of the page */
+    word height;       /* virtual height of the page */
+} page_t;
+
+/* -============================ Functions =============================- */
+/* mode switching, page, and plane functions */
+void modexEnter();
+void modexLeave();
+page_t modexDefaultPage();
+page_t modexNextPage(page_t *p);
+void modexShowPage(page_t *page);
+void modexPanPage(page_t *page, int dx, int dy);
+void modexSelectPlane(byte plane);
+void modexClearRegion(page_t *page, int x, int y, int w, int h, byte color);
+void modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp);
+void modexDrawBmpRegion(page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp);
+void modexDrawPlanarBuf(page_t *page, int x, int y, planar_buf_t *bmp);
+void modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp);
+void modexDrawSpriteRegion(page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp);
+void modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);
+
+/* Palette fade and flash effects */
+void modexFadeOn(word fade, byte *palette);
+void modexFadeOff(word fade, byte *palette);
+void modexFlashOn(word fade, byte *palette);
+void modexFlashOff(word fade, byte *palette);
+
+/* palette loading and saving */
+void modexPalSave(byte *palette);
+byte *modexNewPal();
+void modexLoadPalFile(char *filename, byte **palette);
+void modexSavePalFile(char *filename, byte *palette);
+
+/* fixed palette functions */
+void modexPalBlack();
+void modexPalWhite();
+
+/* utility functions */
+void modexPalUpdate(byte *p, word *i);
+void modexPalUpdate2(byte *p);
+void modexWaitBorder();
+
+/* -======================= Constants & Vars ==========================- */
+extern byte far*  VGA;  /* The VGA Memory */
+#define SCREEN_SEG             0xa000
+#define VIDEO_INT              0x10
+#define SET_MODE               0x00
+#define VGA_256_COLOR_MODE     0x13
+#define TEXT_MODE              0x03
+#define SCREEN_WIDTH           320
+#define SCREEN_HEIGHT          240
+#define PAGE_SIZE              (word)(SCREEN_WIDTH/4 * SCREEN_HEIGHT)
+
+#define AC_INDEX               0x03c0
+#define SC_INDEX               0x03c4
+#define SC_DATA                        0x03c5
+#define CRTC_INDEX             0x03d4
+#define CRTC_DATA              0x03d5
+#define GC_INDEX               0x03ce
+#define MISC_OUTPUT            0x03c2
+#define HIGH_ADDRESS           0x0C
+#define LOW_ADDRESS            0x0D
+#define VRETRACE               0x08
+#define INPUT_STATUS_1         0x03da
+#define DISPLAY_ENABLE         0x01
+#define MAP_MASK               0x02
+#define PAL_READ_REG            0x03C7   /* Color register, read address */
+#define PAL_WRITE_REG           0x03C8   /* Color register, write address */
+#define PAL_DATA_REG            0x03C9   /* Color register, data port */
+#define PAL_SIZE                (256 * 3)
+#endif
index 3c40628..75847e5 100644 (file)
@@ -68,7 +68,7 @@ void main() {
     modexEnter();\r
 \r
     /* fix up the palette and everything */\r
-    modexPalUpdate(bmp.palette);\r
+    modexPalUpdate(bmp.palette, 0);\r
 \r
     /* clear and draw one sprite and one bitmap */\r
     modexClearRegion(&page, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 1);\r
index a6ee75c..17f0aa6 100644 (file)
@@ -58,11 +58,12 @@ void mapGoTo(map_view_t *mv, int tx, int ty);
 void mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y);\r
 void mapDrawRow(map_view_t *mv, int tx, int ty, word y);\r
 void mapDrawCol(map_view_t *mv, int tx, int ty, word x);\r
-void qclean();\r
+void qclean();
+void pdump(map_view_t *pee);\r
 void animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */sword d, short scrolloffsetswitch, int x, int y, int ls, int lp, bitmap_t *bmp);\r
 \r
-#define TILEWH 16\r
-#define QUADWH (TILEWH/4)\r
+#define TILEWH 16
+#define QUADWH                 TILEWH/2\r
 #define SPEED 4\r
 //#define LOOPMAX (TILEWH/SPEED)\r
 \r
@@ -76,7 +77,8 @@ void main() {
        long emmhandle;\r
        long emsavail;\r
        char teststr[80];\r
-       int i;\r
+       int i;
+       static word paloffset=0;\r
        bitmap_t ptmp;//, npctmp; // player sprite\r
        planar_buf_t *p;\r
        const char *cpus;\r
@@ -85,8 +87,8 @@ void main() {
        map_t map;\r
        map_view_t mv, mv2, mv3;\r
        map_view_t *bg, *spri, *mask;//, *tmp;\r
-       byte *pal;\r
-       byte *ptr;\r
+       byte *dpal, *gpal;\r
+       byte *ptr, *mappalptr;\r
        actor_t player;\r
        //actor_t npc0;\r
 \r
@@ -116,24 +118,25 @@ void main() {
                printf("Insufficient pages available\n");\r
                exit(0);\r
        }*/\r
-\r
+
        /* create the map */
-       loadmap("data/test.map", &map/*, 0*/);
+       loadmap("data/test.map", &map);
 //---- map = allocMap(map.width,map.height); //20x15 is the resolution of the screen you can make maps smaller than 20x15 but the null space needs to be drawn properly
-       //if(isEMS()) printf("%d tesuto\n", coretotalEMS());\r
-//---- initMap(&map);\r
-       mv.map = &map;\r
-       mv2.map = &map;\r
-       mv3.map = &map;\r
-\r
-       /* draw the tiles */\r
-       ptr = map.data;\r
-       /* data */\r
-       ptmp = bitmapLoadPcx("data/ptmp.pcx"); // load sprite\r
-       //npctmp = bitmapLoadPcx("ptmp1.pcx"); // load sprite\r
-       /* create the planar buffer */\r
+       //if(isEMS()) printf("%d tesuto\n", coretotalEMS());
+//---- initMap(&map);
+       mv.map = &map;
+       mv2.map = &map;
+       mv3.map = &map;
+
+       /* draw the tiles */
+       ptr = map.data;
+       mappalptr = map.tiles->data->palette;
+       /* data */
+       ptmp = bitmapLoadPcx("data/ptmp.pcx"); // load sprite
+       //npctmp = bitmapLoadPcx("ptmp1.pcx"); // load sprite
+       /* create the planar buffer */
        p = planar_buf_from_bitmap(&ptmp);\r
-\r
+
        /*if(isEMS())\r
        {\r
                XMOVE mm;\r
@@ -164,18 +167,32 @@ void main() {
                //printf("%d\n", emmhandle);\r
        }\r
 */\r
-       /* save the palette */\r
-       pal = modexNewPal();\r
-       modexPalSave(pal);\r
-       modexFadeOff(4, pal);\r
-       modexPalBlack();\r
-\r
-       setkb(1);\r
-       modexEnter();\r
-       modexPalBlack();\r
-       modexPalUpdate(ptmp.palette);\r
-       modexFadeOn(4, ptmp.palette);\r
-       screen = modexDefaultPage();\r
+
+       /* save the palette */
+       dpal = modexNewPal();
+       modexPalSave(dpal);
+       modexFadeOff(4, dpal);
+       modexPalBlack();
+
+       setkb(1);
+       modexEnter();
+       modexPalBlack();
+       //ptmp.offset=(paloffset/3);
+       ptmp.offset=paloffset;
+       modexPalUpdate(ptmp.palette, &paloffset);
+//     printf("        %x\n", ptmp.data);
+       //printf("1:    %d\n", paloffset);
+       map.tiles->data->offset=paloffset;
+       modexPalUpdate(map.tiles->data->palette, &paloffset);
+       //printf("2:    %d\n", paloffset);
+//     printf("        %x\n", map.tiles->data->data);
+       gpal = modexNewPal();\r
+       modexPalSave(gpal);
+       modexSavePalFile("data/g.pal", gpal);
+       modexFadeOn(4, gpal);
+
+       /* setup camera and screen~ */
+       screen = modexDefaultPage();
        screen.width += (TILEWH*2);\r
        screen.height += (TILEWH*2)+QUADWH;\r
        mv.page = &screen;\r
@@ -217,11 +234,11 @@ void main() {
        modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 64, 24, 32, &npctmp);*/\r
        modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 64, 24, 32, &ptmp);\r
 \r
-       modexClearRegion(spri->page, player.triggerx*16, player.triggery*16, 16, 16, 1);\r
-       modexClearRegion(bg->page, player.triggerx*16, player.triggery*16, 16, 16, 1);\r
+       //----modexClearRegion(spri->page, player.triggerx*16, player.triggery*16, 16, 16, 1);\r
+       //----modexClearRegion(bg->page, player.triggerx*16, player.triggery*16, 16, 16, 1);\r
 \r
-       modexClearRegion(spri->page, 5*16, 5*16, 16, 16, 255);\r
-       modexClearRegion(bg->page, 5*16, 5*16, 16, 16, 255);\r
+       //----modexClearRegion(spri->page, 5*16, 5*16, 16, 16, 255);\r
+       //----modexClearRegion(bg->page, 5*16, 5*16, 16, 16, 255);\r
 \r
        modexShowPage(spri->page);\r
        while(!keyp(1) && player.hp>0)\r
@@ -521,8 +538,8 @@ void main() {
        }\r
        if(player.q == (TILEWH/SPEED)+1 && player.d > 0 && (player.triggerx == 5 && player.triggery == 5)){ player.hp--; }\r
        //if(keyp(0x0E)) while(1){ if(xmsmalloc(24)) break; }
-//     modexDrawBmp(bg->page, 0, 0, map.tiles->data);
-//     modexDrawBmp(spri->page, 0, 0, map.tiles->data);
+       if(keyp(25)){ pdump(bg); pdump(spri); }
+
        if(keyp(87))
        {
                modexLeave();\r
@@ -535,8 +552,8 @@ void main() {
        }\r
        }\r
 \r
-       /* fade back to text mode */\r
-       modexFadeOff(4, ptmp.palette);\r
+       /* fade back to text mode */
+       modexFadeOff(4, gpal);\r
        modexPalBlack();\r
        modexLeave();\r
        setkb(0);\r
@@ -554,7 +571,7 @@ void main() {
        printf("player.hp: %d\n", player.hp);\r
        printf("player.q: %d\n", player.q);\r
        printf("player.d: %d\n", player.d);
-       printf("%d\n", map.data[0]);\r
+       printf("palette offset: %d\n", paloffset);
        printf("temporary player sprite 0: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=45556867\n");\r
        printf("temporary player sprite 1: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=44606385\n");\r
        printf("\n");\r
@@ -571,9 +588,9 @@ void main() {
                case 2: cpus = "386 or newer"; break;\r
                default: cpus = "internal error"; break;\r
        }\r
-       printf("detected CPU type: %s\n", cpus);\r
+       printf("detected CPU type: %s\n", cpus);
        modexPalBlack();\r
-       modexFadeOn(4, pal);\r
+       modexFadeOn(4, dpal);\r
 }\r
 \r
 \r
@@ -833,6 +850,20 @@ void qclean()
 {\r
        modexLeave();\r
        setkb(0);\r
+}
+
+void pdump(map_view_t *pee)
+{\r
+       int mult=(QUADWH);\r
+       int palq=(mult)*TILEWH;\r
+       int palcol=0;
+       int palx, paly;
+       for(paly=0; paly<palq; paly+=mult){\r
+               for(palx=0; palx<palq; palx+=mult){
+                               modexClearRegion(pee->page, palx+TILEWH, paly+TILEWH, mult, mult, palcol);\r
+                       palcol++;\r
+               }\r
+       }\r
 }\r
 \r
 void\r
index c84415e..9df6003 100644 (file)
Binary files a/test.exe and b/test.exe differ
index 5d1c1bd..9d517a5 100644 (file)
Binary files a/test2.exe and b/test2.exe differ