]> 4ch.mooo.com Git - 16.git/commitdiff
modified: 16/MODEX16.ZIP
authorsparky4 <sparky4@cock.li>
Fri, 25 Jul 2014 02:02:35 +0000 (21:02 -0500)
committersparky4 <sparky4@cock.li>
Fri, 25 Jul 2014 02:02:35 +0000 (21:02 -0500)
deleted:    16/modex16/DP_BPAL.$$$
deleted:    16/modex16/DP_CPAL.$$$
deleted:    16/modex16/DP_OPAL.$$$
deleted:    16/modex16/DP_PREFS
deleted:    16/modex16/DP_SPAL.$$$
deleted:    16/modex16/EDw.PCX
modified:   16/modex16/MAKEFILE
modified:   16/modex16/MODEX16.C
modified:   16/modex16/MODEX16.H
deleted:    16/modex16/PALVIEW.EXE
modified:   16/modex16/PCXTEST.C
modified:   16/modex16/PCXTEST.EXE
deleted:    16/modex16/PCXTEST.SMP
modified:   16/modex16/TEST.C
modified:   16/modex16/TEST.EXE
deleted:    16/modex16/TEST.SMP
deleted:    16/modex16/chikyuu.pcx
new file:   16/modex16/ed.pcx
deleted:    16/modex16/ed2.pcx
deleted:    16/modex16/flower.pcx
new file:   16/modex16/gfx.pal
deleted:    16/modex16/koishi.pcx
deleted:    16/modex16/koishi^^.pcx
new file:   16/modex16/makefile
new file:   16/modex16/modex16.c
new file:   16/modex16/modex16.h
deleted:    16/modex16/palette.c
deleted:    16/modex16/palette.h
new file:   16/modex16/palettec.c
new file:   16/modex16/pcxtest.c
new file:   16/modex16/pcxtest.exe
deleted:    16/modex16/q.pcx
new file:   16/modex16/test.c
new file:   16/modex16/test.exe
new file:   16/modex16/test.txt
new file:   16/modex16/test2.c
new file:   16/modex16/test2.exe
new file:   16/modex16/types.h
deleted:    16/modex16/w.pcx
modified:   16/w_modex/M.BAT
modified:   16/w_modex/TEST.CPP
modified:   16/w_modex/TEST.EXE

43 files changed:
16/MODEX16.ZIP
16/modex16/DP_BPAL.$$$ [deleted file]
16/modex16/DP_CPAL.$$$ [deleted file]
16/modex16/DP_OPAL.$$$ [deleted file]
16/modex16/DP_PREFS [deleted file]
16/modex16/DP_SPAL.$$$ [deleted file]
16/modex16/EDw.PCX [deleted file]
16/modex16/MAKEFILE
16/modex16/MODEX16.C
16/modex16/MODEX16.H
16/modex16/PALVIEW.EXE [deleted file]
16/modex16/PCXTEST.C
16/modex16/PCXTEST.EXE
16/modex16/PCXTEST.SMP [deleted file]
16/modex16/TEST.C
16/modex16/TEST.EXE
16/modex16/TEST.SMP [deleted file]
16/modex16/chikyuu.pcx [deleted file]
16/modex16/ed.pcx [new file with mode: 0644]
16/modex16/ed2.pcx [deleted file]
16/modex16/flower.pcx [deleted file]
16/modex16/gfx.pal [new file with mode: 0644]
16/modex16/koishi.pcx [deleted file]
16/modex16/koishi^^.pcx [deleted file]
16/modex16/makefile [new file with mode: 0644]
16/modex16/modex16.c [new file with mode: 0644]
16/modex16/modex16.h [new file with mode: 0644]
16/modex16/palette.c [deleted file]
16/modex16/palette.h [deleted file]
16/modex16/palettec.c [new file with mode: 0644]
16/modex16/pcxtest.c [new file with mode: 0644]
16/modex16/pcxtest.exe [new file with mode: 0644]
16/modex16/q.pcx [deleted file]
16/modex16/test.c [new file with mode: 0644]
16/modex16/test.exe [new file with mode: 0644]
16/modex16/test.txt [new file with mode: 0644]
16/modex16/test2.c [new file with mode: 0644]
16/modex16/test2.exe [new file with mode: 0644]
16/modex16/types.h [new file with mode: 0644]
16/modex16/w.pcx [deleted file]
16/w_modex/M.BAT
16/w_modex/TEST.CPP
16/w_modex/TEST.EXE

index feed2125f9b2d8efe3583278d0dd58bc6574e450..a1480fab3da70c8e144837caeaf9f4e068414b9a 100644 (file)
Binary files a/16/MODEX16.ZIP and b/16/MODEX16.ZIP differ
diff --git a/16/modex16/DP_BPAL.$$$ b/16/modex16/DP_BPAL.$$$
deleted file mode 100644 (file)
index 06d7405..0000000
Binary files a/16/modex16/DP_BPAL.$$$ and /dev/null differ
diff --git a/16/modex16/DP_CPAL.$$$ b/16/modex16/DP_CPAL.$$$
deleted file mode 100644 (file)
index 06d7405..0000000
Binary files a/16/modex16/DP_CPAL.$$$ and /dev/null differ
diff --git a/16/modex16/DP_OPAL.$$$ b/16/modex16/DP_OPAL.$$$
deleted file mode 100644 (file)
index 1edf027..0000000
Binary files a/16/modex16/DP_OPAL.$$$ and /dev/null differ
diff --git a/16/modex16/DP_PREFS b/16/modex16/DP_PREFS
deleted file mode 100644 (file)
index 2ea3383..0000000
Binary files a/16/modex16/DP_PREFS and /dev/null differ
diff --git a/16/modex16/DP_SPAL.$$$ b/16/modex16/DP_SPAL.$$$
deleted file mode 100644 (file)
index 06d7405..0000000
Binary files a/16/modex16/DP_SPAL.$$$ and /dev/null differ
diff --git a/16/modex16/EDw.PCX b/16/modex16/EDw.PCX
deleted file mode 100644 (file)
index 2427b5d..0000000
Binary files a/16/modex16/EDw.PCX and /dev/null differ
index b073c98fd478ab1ac3d305d0a1256aa8f1d7a20b..c48885b8e88b319ff3c7e970ab100b7310270097 100644 (file)
@@ -1,17 +1,27 @@
-FLAGS=-0 -d\r
-all: test.exe pcxtest.exe\r
+FLAGS=-0 -d3\r
+all: test.exe pcxtest.exe test2.exe\r
 \r
 test.exe: test.obj modex16.obj\r
        wcl $(FLAGS) test.obj modex16.obj\r
        \r
+test2.exe: test2.obj modex16.obj\r
+       wcl $(FLAGS) test2.obj modex16.obj\r
+       \r
 pcxtest.exe: pcxtest.obj modex16.obj\r
        wcl $(FLAGS) pcxtest.obj modex16.obj\r
 \r
 test.obj: test.c modex16.h\r
        wcl $(FLAGS) -c test.c\r
        \r
+test2.obj: test2.c modex16.h\r
+       wcl $(FLAGS) -c test2.c\r
+       \r
 pcxtest.obj: pcxtest.c modex16.h\r
        wcl $(FLAGS) -c pcxtest.c\r
 \r
 modex16.obj: modex16.h modex16.c\r
        wcl $(FLAGS) -c modex16.c\r
+       \r
+clean: \r
+       del *.obj\r
+       del *.exe\r
index 364ff3d2994c4046af9acd3ccb45a73baa317e51..bdc089e524a5330fb7bebff27fac01ff86238771 100644 (file)
@@ -101,28 +101,75 @@ modexLeave() {
 }\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
+modexShowPage(page_t *page) {\r
     word high_address;\r
     word low_address;\r
+    word offset;\r
+    byte crtcOffset;\r
 \r
-    high_address = HIGH_ADDRESS | ((word)(page) & 0xff00);\r
-    low_address  = LOW_ADDRESS  | ((word)(page) << 8);\r
+    /* calculate offset */\r
+    offset = (word) page->data;\r
+    offset += page->dy * (page->width >> 2 );\r
+    offset += page->dx >> 2;\r
 \r
-    /* wait for appropriate timing */\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
-    /* TODO figure out how the $@#! you do horizontal panning */\r
-    *page += dy * SCREEN_WIDTH;\r
+    page->dx = dx;\r
+    page->dy = dy;\r
 }\r
 \r
 \r
@@ -134,45 +181,219 @@ modexSelectPlane(byte plane) {
 \r
 \r
 void\r
-modexClearRegion(page_t page, int x, int y, int w, int h, byte color) {\r
-    byte plane;\r
-    word endx = x + w;\r
-    word endy = y + h;\r
-    word dx, dy;\r
-\r
-    /* TODO Make this fast.  It's SLOOOOOOW */\r
-    for(plane=0; plane < 4; plane++) {\r
-       modexSelectPlane(PLANE(plane+x));\r
-       for(dx = x; dx < endx; dx+=4) {\r
-           for(dy=y; dy<endy; dy++) {\r
-               page[PAGE_OFFSET(dx, dy)] = color;\r
-           }\r
-       }\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, byte sprite) {\r
-    byte plane;\r
-    word px, py;\r
-    word offset;\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
-    /* TODO Make this fast.  It's SLOOOOOOW */\r
-    for(plane=0; plane < 4; plane++) {\r
-       modexSelectPlane(PLANE(plane+x));\r
-       for(px = plane; px < bmp->width; px+=4) {\r
-           offset=px;\r
-           for(py=0; py<bmp->height; py++) {
-               if(!sprite || bmp->data[offset])\r
-                 page[PAGE_OFFSET(x+px, y+py)] = bmp->data[offset];\r
-               offset+=bmp->width;\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
+    __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
+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
+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
+    /* todo */\r
+}\r
+\r
+\r
 /* fade and flash */\r
 void\r
 modexFadeOn(word fade, byte *palette) {\r
index 7bd92bc1dcb5101cfe14e45a97009e2012ccbb00..81960dd8ab4cb979e6685b29e4f00aa5ab503298 100644 (file)
@@ -9,7 +9,6 @@
 /* -========================== Types & Macros ==========================- */\r
 #define PAGE_OFFSET(x,y) (((y)<<6)+((y)<<4)+((x)>>2))\r
 #define PLANE(x) (1<< (x&3))\r
-typedef byte far* page_t;\r
 #define SELECT_ALL_PLANES() outpw(0x03c4, 0xff02)\r
 typedef struct {\r
     byte *data;\r
@@ -18,15 +17,28 @@ typedef struct {
     byte *palette;\r
 } bitmap_t;\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
-void modexShowPage(page_t page);\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, byte sprite);\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 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
 \r
 /* Palette fade and flash effects */\r
 void modexFadeOn(word fade, byte *palette);\r
@@ -53,6 +65,7 @@ bitmap_t modexLoadPcx(char *filename);
 \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
@@ -61,6 +74,7 @@ extern byte far*  VGA;  /* The VGA Memory */
 #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
diff --git a/16/modex16/PALVIEW.EXE b/16/modex16/PALVIEW.EXE
deleted file mode 100644 (file)
index 4c721d3..0000000
Binary files a/16/modex16/PALVIEW.EXE and /dev/null differ
index 3e4f501dde22964f9d65413d2de1443c622e5ce1..6b88f5810f11d9241524f673f540f51b6ef420f5 100644 (file)
@@ -1,60 +1,76 @@
 #include <stdio.h>\r
 #include "modex16.h"\r
 \r
+word far* clock= (word far*) 0x046C; /* 18.2hz clock */\r
+\r
+void\r
+oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite) {\r
+    byte plane;\r
+    word px, py;\r
+    word offset;\r
+\r
+    /* TODO Make this fast.  It's SLOOOOOOW */\r
+    for(plane=0; plane < 4; plane++) {\r
+       modexSelectPlane(PLANE(plane+x));\r
+       for(px = plane; px < bmp->width; px+=4) {\r
+           offset=px;\r
+           for(py=0; py<bmp->height; py++) {\r
+               if(!sprite || bmp->data[offset])\r
+                 page[PAGE_OFFSET(x+px, y+py)] = bmp->data[offset];\r
+               offset+=bmp->width;\r
+           }\r
+       }\r
+    }\r
+}\r
+\r
 void main() {\r
     bitmap_t bmp;\r
-       //bitmap_t bmp2;\r
-       //bitmap_t bmp3;\r
-       //bitmap_t bmp4;\r
-//     int index;\r
-       //int ch=0x0;\r
-\r
-    //bmp = modexLoadPcx("ed.pcx");\r
-       //bmp = modexLoadPcx("w.pcx");\r
-       //bmp2 = modexLoadPcx("q.pcx");
-       printf("=\n");\r
-       bmp = modexLoadPcx("chikyuu.pcx");
-       printf("==\n");\r
-    /*bmp2 = modexLoadPcx("ed2.pcx");\r
-    bmp3 = modexLoadPcx("flower.pcx");\r
-    bmp4 = modexLoadPcx("koishi^^.pcx");*/
-       printf("===\n");\r
-       modexEnter();\r
-       printf("====\n");
-\r
-    /* fix up the palette and everything */
-       printf("=====\n");\r
-       modexPalUpdate(bmp.palette);\r
-       printf("======\n");
-\r
-    /* don't show the drawing page */
-//     printf("=======\n");\r
-    //modexShowPage(VGA + PAGE_SIZE);\r
-//     printf("========\n");
-\r
-    /* clear and draw one sprite and one bitmap */
-//     printf("=========\n");\r
-    //modexClearRegion(VGA, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
-//     printf("==========\n");\r
-       /*modexDrawBmp(VGA, 20, 20, &bmp2, 0);\r
-    modexDrawBmp(VGA, 180, 20, &bmp, 1);\r
-       modexDrawBmp(VGA, 180, 0, &bmp3, 1);\r
-       modexDrawBmp(VGA, 170, 100, &bmp4, 1);*/\r
-       modexDrawBmp(VGA, 0, 0, &bmp, 0);\r
-       //modexDrawBmp(VGA, 100, 40, &bmp2, 1);\r
-       //modexDrawBmp(VGA, 0, 20, &bmp3, 0);\r
-       //modexDrawBmp(VGA, 120, 60, &bmp3, 1);\r
-    //modexShowPage(VGA);\r
-//    for(index = 0; index<500; index++) {\r
-       //while(1/*!kbhit()*/){ // conditions of screen saver\r
-       while (!kbhit()){  /* Wait for a keystroke                         */\r
-               modexWaitBorder();\r
-                               //ch=getch();\r
-                               //if(ch==0x71)break; // 'q'\r
-                               //if(ch==0x1b)break; // 'ESC'\r
-       }\r
-       (void) getch();   /* Clear the keyboard buffer                    */\r
-       modexLeave();\r
+    int i;\r
+    float t1, t2, t3, t4;\r
+    word start;\r
+    page_t page;\r
+\r
+    page=modexDefaultPage();\r
+\r
+    bmp = modexLoadPcx("ed.pcx");\r
+    modexEnter();\r
+\r
+    /* fix up the palette and everything */\r
+    modexPalUpdate(bmp.palette);\r
+\r
+    /* clear and draw one sprite and one bitmap */\r
+    modexClearRegion(&page, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 1);\r
+\r
+    /* non sprite comparison */\r
+    start = *clock;\r
+    for(i=0; i<100 ;i++) {\r
+      oldDrawBmp(VGA, 20, 20, &bmp, 0);\r
+    }\r
+    t1 = (*clock-start) / 18.2;\r
+\r
+    start = *clock;\r
+    for(i=0; i<100 ;i++) {\r
+      modexDrawBmp(&page, 20, 20, &bmp);\r
+    }\r
+    t2 = (*clock-start) / 18.2;\r
+\r
+    start = *clock;\r
+    for(i=0; i<100 ;i++) {\r
+      oldDrawBmp(VGA, 20, 20, &bmp, 1);\r
+    }\r
+    t3 = (*clock-start) / 18.2;\r
+\r
+    start = *clock;\r
+    for(i=0; i<100 ;i++) {\r
+      modexDrawSprite(&page, 20, 20, &bmp);\r
+    }\r
+    t4 = (*clock-start) / 18.2;\r
+    modexLeave();\r
+\r
+    printf("Old non-sprite: %f\n", t1);\r
+    printf("New non-sprite: %f\n", t2);\r
+    printf("Old Sprite: %f\n", t3);\r
+    printf("New Sprite: %f\n", t4);\r
 \r
     return;\r
 }\r
index 05ff8048b64eebbca0caa06e64c3c62c857992b5..d49c06a41c114658e2225a0db03a731cd1ba01dc 100644 (file)
Binary files a/16/modex16/PCXTEST.EXE and b/16/modex16/PCXTEST.EXE differ
diff --git a/16/modex16/PCXTEST.SMP b/16/modex16/PCXTEST.SMP
deleted file mode 100644 (file)
index 9eb89a1..0000000
Binary files a/16/modex16/PCXTEST.SMP and /dev/null differ
index 74a9b8011e0f8f2900874082d185aef35831ac5b..2d261b04f2f02da8ad184dca567850b43e3774e8 100644 (file)
@@ -4,11 +4,9 @@
 word far* clock= (word far*) 0x046C; /* 18.2hz clock */\r
 \r
 void main() {\r
-    int plane;\r
-    int x, y, i;\r
+    int i, j;\r
     word start, end;\r
     page_t page, page2;\r
-    word far* ptr;\r
     float elapsed;\r
     byte *pal, *pal2=NULL;\r
 \r
@@ -19,32 +17,54 @@ void main() {
     pal  = modexNewPal();\r
     modexPalSave(pal);\r
     modexFadeOff(1, pal);\r
-    modexPalBlack();;\r
+    modexPalBlack();\r
 \r
     modexEnter();\r
     modexPalBlack();\r
 \r
-    page= VGA;\r
-    page2=VGA+PAGE_SIZE;\r
+    /* set up the page, but with 16 pixels on all borders in offscreen mem */\r
+    page=modexDefaultPage();\r
+    page2 = modexNextPage(&page);\r
+    page.width += 32;\r
+    page.height += 32;\r
+\r
 \r
-    /* fill the page with one color */\r
-    modexShowPage(page2);\r
-    modexClearRegion(page, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 42);\r
-    modexClearRegion(page, 17, 12, 30, 30, 19);\r
-    modexShowPage(page);\r
+    /* fill the page with one color, but with a black border */\r
+    modexShowPage(&page2);\r
+    modexClearRegion(&page, 16, 16, SCREEN_WIDTH, SCREEN_HEIGHT, 128);\r
+    modexClearRegion(&page, 32, 32, SCREEN_WIDTH-32, SCREEN_HEIGHT-32, 42);\r
+    modexClearRegion(&page, 48, 48, SCREEN_WIDTH-64, SCREEN_HEIGHT-64, 128);\r
+    modexShowPage(&page);\r
 \r
     /* fade in */\r
     modexFadeOn(1, pal2);\r
 \r
-    /* fill page2 up */\r
-    modexClearRegion(page2, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 128);\r
-\r
 \r
     start = *clock;\r
-    for(i=0; i<500; i++) {\r
-       modexShowPage(page);\r
-       page+=SCREEN_WIDTH/4;\r
+    for(i=0; i<5; i++) {\r
+       /* go right */\r
+       for(j=0; j<32; j++) {\r
+           page.dx++;\r
+           modexShowPage(&page);\r
+       }\r
+       /* go left */\r
+       for(j=0; j<32; j++) {\r
+           page.dx--;\r
+           modexShowPage(&page);\r
+       }\r
+       /* go up */\r
+       for(j=0; j<32; j++) {\r
+           page.dy++;\r
+           modexShowPage(&page);\r
+       }\r
+\r
+       /* go down */\r
+       for(j=0; j<32; j++) {\r
+           page.dy--;\r
+           modexShowPage(&page);\r
+       }\r
     }\r
+\r
     end = *clock;\r
 \r
     /* fade back to text mode */\r
@@ -53,6 +73,4 @@ void main() {
     modexLeave();\r
     modexPalBlack();\r
     modexFadeOn(1, pal);\r
-    elapsed = (end-start)/18.2;\r
-    printf("500 frames in %f seconds for %f fps\n", elapsed, 500.0/elapsed);\r
 }\r
index b1f173e9c1812b2b37d5a30a19f3751d9dffb679..58538eb45049e4184a0d49c99bff593e9ec4f109 100644 (file)
Binary files a/16/modex16/TEST.EXE and b/16/modex16/TEST.EXE differ
diff --git a/16/modex16/TEST.SMP b/16/modex16/TEST.SMP
deleted file mode 100644 (file)
index 65f59bb..0000000
Binary files a/16/modex16/TEST.SMP and /dev/null differ
diff --git a/16/modex16/chikyuu.pcx b/16/modex16/chikyuu.pcx
deleted file mode 100644 (file)
index 610a6c3..0000000
Binary files a/16/modex16/chikyuu.pcx and /dev/null differ
diff --git a/16/modex16/ed.pcx b/16/modex16/ed.pcx
new file mode 100644 (file)
index 0000000..41e5631
Binary files /dev/null and b/16/modex16/ed.pcx differ
diff --git a/16/modex16/ed2.pcx b/16/modex16/ed2.pcx
deleted file mode 100644 (file)
index b35305e..0000000
Binary files a/16/modex16/ed2.pcx and /dev/null differ
diff --git a/16/modex16/flower.pcx b/16/modex16/flower.pcx
deleted file mode 100644 (file)
index 92616da..0000000
Binary files a/16/modex16/flower.pcx and /dev/null differ
diff --git a/16/modex16/gfx.pal b/16/modex16/gfx.pal
new file mode 100644 (file)
index 0000000..e98ae60
Binary files /dev/null and b/16/modex16/gfx.pal differ
diff --git a/16/modex16/koishi.pcx b/16/modex16/koishi.pcx
deleted file mode 100644 (file)
index 76d0516..0000000
Binary files a/16/modex16/koishi.pcx and /dev/null differ
diff --git a/16/modex16/koishi^^.pcx b/16/modex16/koishi^^.pcx
deleted file mode 100644 (file)
index 0dbbc0d..0000000
Binary files a/16/modex16/koishi^^.pcx and /dev/null differ
diff --git a/16/modex16/makefile b/16/modex16/makefile
new file mode 100644 (file)
index 0000000..c48885b
--- /dev/null
@@ -0,0 +1,27 @@
+FLAGS=-0 -d3\r
+all: test.exe pcxtest.exe test2.exe\r
+\r
+test.exe: test.obj modex16.obj\r
+       wcl $(FLAGS) test.obj modex16.obj\r
+       \r
+test2.exe: test2.obj modex16.obj\r
+       wcl $(FLAGS) test2.obj modex16.obj\r
+       \r
+pcxtest.exe: pcxtest.obj modex16.obj\r
+       wcl $(FLAGS) pcxtest.obj modex16.obj\r
+\r
+test.obj: test.c modex16.h\r
+       wcl $(FLAGS) -c test.c\r
+       \r
+test2.obj: test2.c modex16.h\r
+       wcl $(FLAGS) -c test2.c\r
+       \r
+pcxtest.obj: pcxtest.c modex16.h\r
+       wcl $(FLAGS) -c pcxtest.c\r
+\r
+modex16.obj: modex16.h modex16.c\r
+       wcl $(FLAGS) -c modex16.c\r
+       \r
+clean: \r
+       del *.obj\r
+       del *.exe\r
diff --git a/16/modex16/modex16.c b/16/modex16/modex16.c
new file mode 100644 (file)
index 0000000..bdc089e
--- /dev/null
@@ -0,0 +1,641 @@
+#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 "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
+static struct pcxHeader {\r
+    byte id;\r
+    byte version;\r
+    byte encoding;\r
+    byte bpp;\r
+    word xmin;\r
+    word ymin;\r
+    word xmax;\r
+    word ymax;\r
+    word hres;\r
+    word vres;\r
+    byte pal16[48];\r
+    byte res1;\r
+    word bpplane;\r
+    word palType;\r
+    word hScreenSize;\r
+    word vScreenSize;\r
+    byte padding[54];\r
+};\r
+\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
+    __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
+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
+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
+    /* todo */\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
+\r
+\r
+bitmap_t\r
+modexLoadPcx(char *filename) {\r
+    FILE *file;\r
+    bitmap_t result;\r
+    struct pcxHeader head;\r
+    long bufSize;\r
+    int index;\r
+    byte count, val;\r
+\r
+    /* open the PCX file for reading */\r
+    file = fopen(filename, "rb");\r
+    if(!file) {\r
+       printf("Could not open %s for reading.\n", filename);\r
+       exit(-2);\r
+    }\r
+\r
+    /* read the header */\r
+    fread(&head, sizeof(char), sizeof(struct pcxHeader), file);\r
+\r
+    /* make sure this  is 8bpp */\r
+    if(head.bpp != 8) {\r
+       printf("I only know how to handle 8bpp pcx files!\n");\r
+       fclose(file);\r
+       exit(-2);\r
+    }\r
+\r
+    /* allocate the buffer */\r
+    result.width = head.xmax - head.xmin + 1;\r
+    result.height = head.ymax - head.ymin + 1;\r
+    bufSize = result.width * result.height;\r
+    result.data = malloc(bufSize);\r
+    if(!result.data) {\r
+       printf("Could not allocate memory for bitmap data.");\r
+       fclose(file);\r
+       exit(-1);\r
+    }\r
+\r
+    /*  read the buffer in */\r
+    index = 0;\r
+    do {\r
+       /* get the run length and the value */\r
+       count = fgetc(file);\r
+       if(0xC0 ==  (count & 0xC0)) { /* this is the run count */\r
+           count &= 0x3f;\r
+           val = fgetc(file);\r
+       } else {\r
+           val = count;\r
+           count = 1;\r
+       }\r
+\r
+       /* write the pixel the specified number of times */\r
+       for(; count && index < bufSize; count--,index++)  {\r
+           result.data[index] = val;\r
+       }\r
+    } while(index < bufSize);\r
+\r
+    /* handle the palette */\r
+    fseek(file, -769, SEEK_END);\r
+    val = fgetc(file);\r
+    result.palette = modexNewPal();\r
+    if(head.version == 5 && val == 12) {\r
+       /* use the vga palette */\r
+       for(index=0; !feof(file) && index < PAL_SIZE; index++) {\r
+           val = fgetc(file);\r
+           result.palette[index] = val >> 2;\r
+       }\r
+    } else {\r
+       /* use the 16 color palette */\r
+       for(index=0; index<48; index++) {\r
+           result.palette[index]  = head.pal16[index];\r
+       }\r
+    }\r
+\r
+    fclose(file);\r
+\r
+    return result;\r
+}\r
diff --git a/16/modex16/modex16.h b/16/modex16/modex16.h
new file mode 100644 (file)
index 0000000..81960dd
--- /dev/null
@@ -0,0 +1,93 @@
+/*\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 "types.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
+typedef struct {\r
+    byte *data;\r
+    word width;\r
+    word height;\r
+    byte *palette;\r
+} bitmap_t;\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 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
+\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
+/* bitmap functions */\r
+bitmap_t modexLoadPcx(char *filename);\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 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
diff --git a/16/modex16/palette.c b/16/modex16/palette.c
deleted file mode 100644 (file)
index 7a7e734..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*\r
- * File: PALETTE.C\r
- * Purpose: This file contains routines for manipulating the VGA palette.\r
- */\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <conio.h>\r
-#include "palette.h"\r
-\r
-static void fadePalette(byte fade, byte start, word iter, byte *palette);\r
-static byte tmppal[PAL_SIZE];\r
-\r
-/* fade and flash */\r
-void\r
-fadeOn(word fade, byte *palette) {\r
-    fadePalette(-fade, 64, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-fadeOff(word fade, byte *palette) {\r
-    fadePalette(fade, 0, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-flashOn(word fade, byte *palette) {\r
-    fadePalette(fade, -64, 64/fade+1, palette);\r
-}\r
-\r
-\r
-void\r
-flashOff(word fade, byte *palette) {\r
-    fadePalette(-fade, 0, 64/fade+1, palette);\r
-}\r
-\r
-\r
-static void\r
-fadePalette(byte fade, byte 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
-       palUpdate(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
-        palUpdate(tmppal);\r
-       iter--;\r
-       dim += fade;\r
-    }\r
-}\r
-\r
-\r
-/* save and load */\r
-void\r
-palSave(byte *palette) {\r
-    int  i;\r
-\r
-    outp(PEL_READ_REG, 0);     /* start at palette entry 0 */\r
-    for(i=0; i<PAL_SIZE; i++) {\r
-       palette[i] = inp(PEL_DATA_REG); /* read the palette data */\r
-    }\r
-}\r
-\r
-\r
-byte *\r
-newPal() {\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
-loadPaletteFile(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 = newPal();\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
-/* blanking */\r
-void\r
-palBlack() {\r
-    fadePalette(-1, 64, 1, tmppal);\r
-}\r
-\r
-\r
-void\r
-palWhite() {\r
-    fadePalette(-1, -64, 1, tmppal);\r
-}\r
-\r
-\r
-/* utility */\r
-void\r
-palUpdate(byte *p) {\r
-    int i;\r
-    waitborder();\r
-    outp(PEL_WRITE_REG, 0);  /* start at the beginning of palette */\r
-    for(i=0; i<PAL_SIZE/2; i++) {\r
-       outp(PEL_DATA_REG, p[i]);\r
-    }\r
-    waitborder();          /* waits one retrace -- less flicker */\r
-    for(i=PAL_SIZE/2; i<PAL_SIZE; i++) {\r
-       outp(PEL_DATA_REG, p[i]);\r
-    }\r
-}\r
-\r
-\r
-void\r
-waitborder() {\r
-    while(inp(INPUT_STATUS_1)  & 8)  {\r
-       /* spin */\r
-    }\r
-\r
-    while(!(inp(INPUT_STATUS_1)  & 8))  {\r
-       /* spin */\r
-    }\r
-}\r
diff --git a/16/modex16/palette.h b/16/modex16/palette.h
deleted file mode 100644 (file)
index dde59dc..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*\r
- * Headers and definitions for the palette routines.\r
- */\r
-#include "constant.h"\r
-\r
-/* fade and flash */\r
-void fadeOn(word fade, byte *palette);\r
-void fadeOff(word fade, byte *palette);\r
-void flashOn(word fade, byte *palette);\r
-void flashOff(word fade, byte *palette);\r
-\r
-/* save and load */\r
-void palSave(byte *palette);\r
-byte *newPal();\r
-void loadPaletteFile(char *filename, byte **palette);\r
-\r
-/* blanking */\r
-void palBlack();\r
-void palWhite();\r
-\r
-/* utility */\r
-void palUpdate();\r
-void waitborder();\r
-\r
diff --git a/16/modex16/palettec.c b/16/modex16/palettec.c
new file mode 100644 (file)
index 0000000..340a930
--- /dev/null
@@ -0,0 +1,16 @@
+#include "modex16.h"\r
+\r
+void\r
+main() {\r
+    byte *pal;\r
+\r
+    modexEnter();\r
+\r
+    pal = modexNewPal();\r
+    modexPalSave(pal);\r
+\r
+    modexSavePalFile("gfx.pal", pal);\r
+\r
+    modexLeave();\r
+\r
+}\r
diff --git a/16/modex16/pcxtest.c b/16/modex16/pcxtest.c
new file mode 100644 (file)
index 0000000..6b88f58
--- /dev/null
@@ -0,0 +1,76 @@
+#include <stdio.h>\r
+#include "modex16.h"\r
+\r
+word far* clock= (word far*) 0x046C; /* 18.2hz clock */\r
+\r
+void\r
+oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite) {\r
+    byte plane;\r
+    word px, py;\r
+    word offset;\r
+\r
+    /* TODO Make this fast.  It's SLOOOOOOW */\r
+    for(plane=0; plane < 4; plane++) {\r
+       modexSelectPlane(PLANE(plane+x));\r
+       for(px = plane; px < bmp->width; px+=4) {\r
+           offset=px;\r
+           for(py=0; py<bmp->height; py++) {\r
+               if(!sprite || bmp->data[offset])\r
+                 page[PAGE_OFFSET(x+px, y+py)] = bmp->data[offset];\r
+               offset+=bmp->width;\r
+           }\r
+       }\r
+    }\r
+}\r
+\r
+void main() {\r
+    bitmap_t bmp;\r
+    int i;\r
+    float t1, t2, t3, t4;\r
+    word start;\r
+    page_t page;\r
+\r
+    page=modexDefaultPage();\r
+\r
+    bmp = modexLoadPcx("ed.pcx");\r
+    modexEnter();\r
+\r
+    /* fix up the palette and everything */\r
+    modexPalUpdate(bmp.palette);\r
+\r
+    /* clear and draw one sprite and one bitmap */\r
+    modexClearRegion(&page, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 1);\r
+\r
+    /* non sprite comparison */\r
+    start = *clock;\r
+    for(i=0; i<100 ;i++) {\r
+      oldDrawBmp(VGA, 20, 20, &bmp, 0);\r
+    }\r
+    t1 = (*clock-start) / 18.2;\r
+\r
+    start = *clock;\r
+    for(i=0; i<100 ;i++) {\r
+      modexDrawBmp(&page, 20, 20, &bmp);\r
+    }\r
+    t2 = (*clock-start) / 18.2;\r
+\r
+    start = *clock;\r
+    for(i=0; i<100 ;i++) {\r
+      oldDrawBmp(VGA, 20, 20, &bmp, 1);\r
+    }\r
+    t3 = (*clock-start) / 18.2;\r
+\r
+    start = *clock;\r
+    for(i=0; i<100 ;i++) {\r
+      modexDrawSprite(&page, 20, 20, &bmp);\r
+    }\r
+    t4 = (*clock-start) / 18.2;\r
+    modexLeave();\r
+\r
+    printf("Old non-sprite: %f\n", t1);\r
+    printf("New non-sprite: %f\n", t2);\r
+    printf("Old Sprite: %f\n", t3);\r
+    printf("New Sprite: %f\n", t4);\r
+\r
+    return;\r
+}\r
diff --git a/16/modex16/pcxtest.exe b/16/modex16/pcxtest.exe
new file mode 100644 (file)
index 0000000..d49c06a
Binary files /dev/null and b/16/modex16/pcxtest.exe differ
diff --git a/16/modex16/q.pcx b/16/modex16/q.pcx
deleted file mode 100644 (file)
index a51d634..0000000
Binary files a/16/modex16/q.pcx and /dev/null differ
diff --git a/16/modex16/test.c b/16/modex16/test.c
new file mode 100644 (file)
index 0000000..2d261b0
--- /dev/null
@@ -0,0 +1,76 @@
+#include "modex16.h"\r
+#include <stdio.h>\r
+\r
+word far* clock= (word far*) 0x046C; /* 18.2hz clock */\r
+\r
+void main() {\r
+    int i, j;\r
+    word start, end;\r
+    page_t page, page2;\r
+    float elapsed;\r
+    byte *pal, *pal2=NULL;\r
+\r
+    /* load our palette */\r
+    modexLoadPalFile("gfx.pal", &pal2);\r
+\r
+    /* save the palette */\r
+    pal  = modexNewPal();\r
+    modexPalSave(pal);\r
+    modexFadeOff(1, pal);\r
+    modexPalBlack();\r
+\r
+    modexEnter();\r
+    modexPalBlack();\r
+\r
+    /* set up the page, but with 16 pixels on all borders in offscreen mem */\r
+    page=modexDefaultPage();\r
+    page2 = modexNextPage(&page);\r
+    page.width += 32;\r
+    page.height += 32;\r
+\r
+\r
+    /* fill the page with one color, but with a black border */\r
+    modexShowPage(&page2);\r
+    modexClearRegion(&page, 16, 16, SCREEN_WIDTH, SCREEN_HEIGHT, 128);\r
+    modexClearRegion(&page, 32, 32, SCREEN_WIDTH-32, SCREEN_HEIGHT-32, 42);\r
+    modexClearRegion(&page, 48, 48, SCREEN_WIDTH-64, SCREEN_HEIGHT-64, 128);\r
+    modexShowPage(&page);\r
+\r
+    /* fade in */\r
+    modexFadeOn(1, pal2);\r
+\r
+\r
+    start = *clock;\r
+    for(i=0; i<5; i++) {\r
+       /* go right */\r
+       for(j=0; j<32; j++) {\r
+           page.dx++;\r
+           modexShowPage(&page);\r
+       }\r
+       /* go left */\r
+       for(j=0; j<32; j++) {\r
+           page.dx--;\r
+           modexShowPage(&page);\r
+       }\r
+       /* go up */\r
+       for(j=0; j<32; j++) {\r
+           page.dy++;\r
+           modexShowPage(&page);\r
+       }\r
+\r
+       /* go down */\r
+       for(j=0; j<32; j++) {\r
+           page.dy--;\r
+           modexShowPage(&page);\r
+       }\r
+    }\r
+\r
+    end = *clock;\r
+\r
+    /* fade back to text mode */\r
+    modexFadeOff(1, pal2);\r
+    modexPalBlack();\r
+    modexLeave();\r
+    modexPalBlack();\r
+    modexFadeOn(1, pal);\r
+}\r
diff --git a/16/modex16/test.exe b/16/modex16/test.exe
new file mode 100644 (file)
index 0000000..58538eb
Binary files /dev/null and b/16/modex16/test.exe differ
diff --git a/16/modex16/test.txt b/16/modex16/test.txt
new file mode 100644 (file)
index 0000000..05adc9e
--- /dev/null
@@ -0,0 +1,258 @@
+64 x 64 Pixels\r
+\r
+0 0 0 \r
+20 0 0 \r
+0 20 0 \r
+20 20 0 \r
+0 0 20 \r
+20 0 20 \r
+0 20 20 \r
+30 30 30 \r
+30 37 30 \r
+29 32 3c \r
+3f 3f 33 \r
+3f 3f 26 \r
+3f 3f 19 \r
+3f 3f c \r
+3f 33 3f \r
+3f 33 33 \r
+3f 33 26 \r
+3f 33 19 \r
+3f 33 c \r
+3f 33 0 \r
+3f 26 3f \r
+3f 26 33 \r
+3f 26 26 \r
+3f 26 19 \r
+3f 26 c \r
+3f 26 0 \r
+3f 19 3f \r
+3f 19 33 \r
+3f 19 26 \r
+3f 19 19 \r
+3f 19 c \r
+3f 19 0 \r
+3f c 3f \r
+3f c 33 \r
+3f c 26 \r
+3f c 19 \r
+3f c c \r
+3f c 0 \r
+3f 0 33 \r
+3f 0 26 \r
+3f 0 19 \r
+3f 0 c \r
+33 3f 3f \r
+33 3f 33 \r
+33 3f 26 \r
+33 3f 19 \r
+33 3f c \r
+33 3f 0 \r
+33 33 3f \r
+33 33 33 \r
+33 33 26 \r
+33 33 19 \r
+33 33 c \r
+33 33 0 \r
+33 26 3f \r
+33 26 33 \r
+33 26 26 \r
+33 26 19 \r
+33 26 c \r
+33 26 0 \r
+33 19 3f \r
+33 19 33 \r
+33 19 26 \r
+33 19 19 \r
+33 19 c \r
+33 19 0 \r
+33 c 3f \r
+33 c 33 \r
+33 c 26 \r
+33 c 19 \r
+33 c c \r
+33 c 0 \r
+33 0 3f \r
+33 0 33 \r
+33 0 26 \r
+33 0 19 \r
+33 0 c \r
+33 0 0 \r
+26 3f 3f \r
+26 3f 33 \r
+26 3f 26 \r
+26 3f 19 \r
+26 3f c \r
+26 3f 0 \r
+26 33 3f \r
+26 33 33 \r
+26 33 26 \r
+26 33 19 \r
+26 33 c \r
+26 33 0 \r
+26 26 3f \r
+26 26 33 \r
+26 26 26 \r
+26 26 19 \r
+26 26 c \r
+26 26 0 \r
+26 19 3f \r
+26 19 33 \r
+26 19 26 \r
+26 19 19 \r
+26 19 c \r
+26 19 0 \r
+26 c 3f \r
+26 c 33 \r
+26 c 26 \r
+26 c 19 \r
+26 c c \r
+26 c 0 \r
+26 0 3f \r
+26 0 33 \r
+26 0 26 \r
+26 0 19 \r
+26 0 c \r
+26 0 0 \r
+19 3f 3f \r
+19 3f 33 \r
+19 3f 26 \r
+19 3f 19 \r
+19 3f c \r
+19 3f 0 \r
+19 33 3f \r
+19 33 33 \r
+19 33 26 \r
+19 33 19 \r
+19 33 c \r
+19 33 0 \r
+19 26 3f \r
+19 26 33 \r
+19 26 26 \r
+19 26 19 \r
+19 26 c \r
+19 26 0 \r
+19 19 3f \r
+19 19 33 \r
+19 19 26 \r
+19 19 19 \r
+19 19 c \r
+19 19 0 \r
+19 c 3f \r
+19 c 33 \r
+19 c 26 \r
+19 c 19 \r
+19 c c \r
+19 c 0 \r
+19 0 3f \r
+19 0 33 \r
+19 0 26 \r
+19 0 19 \r
+19 0 c \r
+19 0 0 \r
+c 3f 3f \r
+c 3f 33 \r
+c 3f 26 \r
+c 3f 19 \r
+c 3f c \r
+c 3f 0 \r
+c 33 3f \r
+c 33 33 \r
+c 33 26 \r
+c 33 19 \r
+c 33 c \r
+c 33 0 \r
+c 26 3f \r
+c 26 33 \r
+c 26 26 \r
+c 26 19 \r
+c 26 c \r
+c 26 0 \r
+c 19 3f \r
+c 19 33 \r
+c 19 26 \r
+c 19 19 \r
+c 19 c \r
+c 19 0 \r
+c c 3f \r
+c c 33 \r
+c c 26 \r
+c c 19 \r
+c c c \r
+c c 0 \r
+c 0 3f \r
+c 0 33 \r
+c 0 26 \r
+c 0 19 \r
+c 0 c \r
+c 0 0 \r
+0 3f 33 \r
+0 3f 26 \r
+0 3f 19 \r
+0 3f c \r
+0 33 3f \r
+0 33 33 \r
+0 33 26 \r
+0 33 19 \r
+0 33 c \r
+0 33 0 \r
+0 26 3f \r
+0 26 33 \r
+0 26 26 \r
+0 26 19 \r
+0 26 c \r
+0 26 0 \r
+0 19 3f \r
+0 19 33 \r
+0 19 26 \r
+0 19 19 \r
+0 19 c \r
+0 19 0 \r
+0 c 3f \r
+0 c 33 \r
+0 c 26 \r
+0 c 19 \r
+0 c c \r
+0 c 0 \r
+0 0 33 \r
+0 0 26 \r
+0 0 19 \r
+0 0 c \r
+20 3f 3f \r
+10 20 20 \r
+20 3f 0 \r
+10 10 0 \r
+3f 3f 20 \r
+3f 20 0 \r
+3f 20 20 \r
+20 10 0 \r
+20 0 3f \r
+20 0 10 \r
+10 20 3f \r
+0 10 20 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+0 0 0 \r
+3f 3e 3c \r
+28 28 29 \r
+20 20 20 \r
+3f 0 0 \r
+0 3f 0 \r
+3f 3f 0 \r
+0 0 3f \r
+3f 0 3f \r
+0 3f 3f \r
+3f 3f 3f 
\ No newline at end of file
diff --git a/16/modex16/test2.c b/16/modex16/test2.c
new file mode 100644 (file)
index 0000000..19f05e0
--- /dev/null
@@ -0,0 +1,22 @@
+#include "modex16.h"\r
+\r
+word far* clock= (word far*) 0x046C; /* 18.2hz clock */\r
+\r
+void main() {\r
+    int i;\r
+    word start;\r
+    float t1, t2;\r
+    page_t page;\r
+\r
+    page=modexDefaultPage();\r
+\r
+    modexEnter();\r
+    start = *clock;\r
+    for(i=0; i<500; i++) {\r
+       modexShowPage(&page);\r
+    }\r
+    t1 = (*clock - start)/18.2;\r
+    modexLeave();\r
+\r
+    printf("Time: %f\n", t1);\r
+}\r
diff --git a/16/modex16/test2.exe b/16/modex16/test2.exe
new file mode 100644 (file)
index 0000000..8b36460
Binary files /dev/null and b/16/modex16/test2.exe differ
diff --git a/16/modex16/types.h b/16/modex16/types.h
new file mode 100644 (file)
index 0000000..039653f
--- /dev/null
@@ -0,0 +1,11 @@
+/*\r
+ * Just some handy typedefs that make it easier to think about the low\r
+ * level code\r
+ */\r
+\r
+typedef unsigned char byte;\r
+typedef unsigned short word;\r
+typedef unsigned long  dword;\r
+typedef signed char sbyte;\r
+typedef signed short sword;\r
+typedef signed long sdword;\r
diff --git a/16/modex16/w.pcx b/16/modex16/w.pcx
deleted file mode 100644 (file)
index ad80879..0000000
Binary files a/16/modex16/w.pcx and /dev/null differ
index a5d88f5d1a4985e50d95b3ef69107bb49d765169..5bcb63a558d16cc2aef68507abbdda81bc527a50 100644 (file)
@@ -1,3 +1,2 @@
-wcl /0 test modex xprim xpal xblitbuf\r
-rem fixed32\r
+wcl386 test modex xprim xpal xblitbuf fixed32\r
 erase *.obj\r
index 2e357b4d0ce49e3af2653988fec31202f7642e36..63d1c46deb071777778c481b4867ab99bc32d179 100644 (file)
@@ -5,7 +5,7 @@
 #include <stdlib.h>\r
 #include <time.h>\r
 \r
-//#include "fixed32.hpp"\r
+#include "fixed32.hpp"\r
 #include "modex.hpp"\r
 #include "xprim.hpp"\r
 #include "xpal.hpp"\r
@@ -326,7 +326,7 @@ main(void)
     unsigned char pal[768];\r
     COORD x1, y1, x2, y2;\r
     Iangle theta1, theta2;\r
-    //----Fixed32 trigSin, trigCos;\r
+    Fixed32 trigSin, trigCos;\r
     blitbuf blit_image, sprite_image;\r
     clock_t begin, end;\r
     short int x, y, temp, done;\r
@@ -535,7 +535,7 @@ main(void)
     aligned_bitblitX(84, 36, &sprite_image);\r
     getch();\r
 \r
-    //----initFixed32();\r
+    initFixed32();\r
 \r
     theta1=0;\r
     count=0;\r
index ce4555c1cf8fa76da7726ec8a71f4aac83a80335..903a5a1ea6fd7d587605ad0498beb53c59687f81 100644 (file)
Binary files a/16/w_modex/TEST.EXE and b/16/w_modex/TEST.EXE differ