From cc5df35b6ba3d7871eac6734822464c7e176f4b7 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Sun, 29 Mar 2015 03:35:47 -0500 Subject: [PATCH] extended the palette system~ wwww 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 --- data/MAYU.PCX | Bin 5261 -> 5261 bytes data/g.pal | Bin 0 -> 768 bytes data/koishi^^.pcx | Bin 4039 -> 4039 bytes data/koishi~.pcx | Bin 4365 -> 4365 bytes data/ptmp.pcx | Bin 5047 -> 5047 bytes pcxtest.exe | Bin 63233 -> 0 bytes scroll.exe | Bin 60340 -> 61588 bytes src/lib/bitmap.h | 3 +- src/lib/mapread.c | 10 +- src/lib/mapread.h | 2 +- src/lib/modex16.c | 1278 ++++++++++++++++++++++++++++------------------------- src/lib/modex16.h | 179 ++++---- src/pcxtest.c | 2 +- src/scroll.c | 119 +++-- test.exe | Bin 38308 -> 39054 bytes test2.exe | Bin 40101 -> 40847 bytes 16 files changed, 840 insertions(+), 753 deletions(-) create mode 100644 data/g.pal diff --git a/data/MAYU.PCX b/data/MAYU.PCX index 025e7d4a85fb6d271d65a86646e761d783e9bc46..c89f02537eb2e93e5e7d27834a31dd329011d4b0 100644 GIT binary patch delta 693 zcmeCx?A4s$#?rvFfpKD>{=@|KjSa>`N00K7- AC;$Ke delta 693 zcmY+CF=*6q6vjX0zz!WwDCiI{!wpv`^o9&K+;YPyH)P0gNQP3YWay9~XoQrOlMES7 z8d`@A83JZF;gEtyi4ZVLhYmq9RB-5U;DG^;awi&ZpZ=OBA*|%G;71$bV3vC-HRg~;2Q->{=FQo@ityV=*Y&063PN&!F zX_{u5rsFuC=Z!|AD2kFKnM@}0`JAK-sDJ@DfDeQ~3SxO<`Q#- z7dmr?dB8kIL9_u_fC~(P2srHnvl2<5(4^F(Vo)E@88SF#jCLEU3d4Zo!1ob`NK<54 zFd4U@{KoY0TL~6wzuyk)f#zmbU2XOMxYXJN4LZ tp15*)uyHmtr(<_^JiItPF8a&E|ED{pf4#l^Z?*Vn_aAN@9UbYq{ugt4KAZpm diff --git a/data/g.pal b/data/g.pal new file mode 100644 index 0000000000000000000000000000000000000000..7ac648dc4d3e86c6f05717f74db16d5a17a67fbd GIT binary patch literal 768 zcmeH@u?hk)5Jaa6Tck-Wl0^<;kO&c$lZ|+&$Nv9cna{AeVY=Z>@lNM&Kyc120D~Jq zL={zl7tqnY_c2DKlygq0e?ma51S;jx3$NE@yI(})DYCD(_ZYSfGgDOnljV8JY|O1S PRW_ToIUP9+{DXlXx`7RJ literal 0 HcmV?d00001 diff --git a/data/koishi^^.pcx b/data/koishi^^.pcx index 0dbbc0da38a2d790195b3e8321370ef6c9217f91..66523ede7a49153adf88dc93ad4648f6c650455c 100644 GIT binary patch delta 44 ucmX>ue_URGiue_URGil8Ll(vY1`xw~V}mMO!HdcC8_xqA|E9nl)l$^gZa^ zz-Xz_a~qnxZL1gQ?7g?a!%j={0=yaM95)w2&p3gm1=5tHMFZ_X1tY0EH1ifm|x2d31Kn8gpr=ms)T)z*IAq)Z;`>9A<%z-DK(1p7yuy3yE6DFT-AehSaFt|M$LjXEp> zNv<#iDM}DH7(N)q>0Jemi5kK{3E*8Sn*^?SgGUKU`8r7d1&+xYsP()LESG@>lfBz# z2A7Zh`z?6lXu)ssCnY#xGGGbHV6?FrFny=u>qu6}?dGt{giQt*)&>ltq`s`OOIS~G z{iaF!P2|Io?zE=H$*^v&pNFknCrJxfg*@sUsPENi2`UPftY>A;g-Ol<1ACZt#NH&i zFiQnlj(FghmiFk|zD+Svo&&^=LH1Ujhf3%o! z5{b_*QUfPQ1A7v8$#q}-G(e7)qsO^aghzSoQ#ulP=1KC9qakvPG*m1&^dP^4&Wk&ktjD7zQOAi;+z2a( z7?@3Dp@kEAW6+Vt%hCVPIVH=TEb7x&WLzpU*<;G3PAo30qoN08u{={~<*-}8#o%Ia8B`RQY#)_QFJ4);7iJQ8M7-`VGnUOda9>Qt!w$F(1U-H zdsJS<*d2s!+mN`0k7lv=XQ|d1vQD8LWT+vLVui}6vnF~`(==$Vr#5xOH(7%-R52O9 zK?SUfbfV_olPL(7k8dNK#kKap!|C)XV;%#40V_OY*RWECr(w+ zaGvJ2=8>m8tgZgz=lB2enw|E?-`&e^Y=3lO>%B|oublhrlaOV literal 4365 zcmeHK&ub%99B&0d#6yzi;IYa415F}$&_kO%5JXrqvKBmb!d^VMP7dxtL6a6M2#fo~ z)9%639)yKOEP|JUU!Ko#8pjyZ*j;x^DeST=A_#TcgED@;Z<1}(CX`dc{z1hSXL%>jmk}%F*?@4lRV?F8p z7lS9a1)Y=gTUhU51Xw>g{}pQ;j5gL!&d++nD?O>LmQ+?Kw@=NkO?uuuTViPsDfXl0<$QvAg^`95F!nr zdftPs%0L@T=5FQ+TprHvx8O;Fg5T^E)(Zr^~^qowO;jEC=P2-d?8xJsS z^%=%VJ>F%DavHi`R;Roy^5JrK+LCcH?3?A~VJqE9(HwRmk2;6e_j0@h6$MMivy4gy zDV2r}>|xbqdz0kM%oSufGCDB|+chJWhsQi++Oc$sLJo{VLhW(Lggs8c4-@=s{iqofmg7 z8IQ+HqK*@3saoJ5V(9E53oX2%clsSEUXK2U&dFKstRUaeM*bWOu<(vWEQwHA4}BOM z%;eCDs@>rn;$6;shGzl-wU|{Y*b>a*gT-4>j)Gr!=URCC7@jFmX`B{tDR3!pX;c)L zOdsV=&t4g}1UT&Cs?O3X*x=XWVe1tStUD6jdZ8tDxJDD>R6{ip=?d!8WX$ZKqin=k z>&c$b<*wnI0tf#%_ozHan-hd?TjRKykCt%um#Ewsuug&Y8&u;+u|pZuSr)x0t828{ zle;3~n~YEma&*J1Q4{;ZohW-e(@o~`@NI;5ak<_1a5_9S^cCye zHf($qVMHvZLM9@DHCo+YL!ORxP4$mnKl#h+nQ4Fgg}>eX^Q$lRKe$Tg-(Fu_9{OQ7 z>fs7cV^f;_IUzLu=vgXZNqU*Dt-h{`_)SS{jm#dN_P=@79;!Tzl)o zH_u;qp>%E(WN7W<&A*+S?Zr1f$}hY&BpCDH-@Sb4dVSG(>A6=*V<1DzhhezAe>k)h t`|!ulH@9zmvUz#!YW-p?urEBga_-^Rn@N!WV`4I}Tzh9@VOmC4KSwxbr>fG>a#I0FnTb6SQ8U?Ha7GLfLRI?6UakS0CdbA Aq5uE@ diff --git a/pcxtest.exe b/pcxtest.exe index 98fa93af5c2319b0de39ce49b26875c0c4bc32a5..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 63233 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 Zzo!4Q%&7koS#dMzL!<8P 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%0DfG?excEpHp|WIIH7+(m>cY8D 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 T-#>wE#Gc*XcWR{#%L(~EH4`gE delta 21417 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 WWTdyQzKFeC{l*_VmC}%9g#16n%S7b> diff --git a/src/lib/bitmap.h b/src/lib/bitmap.h index 2eefe41b..e0e93c38 100644 --- a/src/lib/bitmap.h +++ b/src/lib/bitmap.h @@ -8,7 +8,8 @@ typedef struct { byte *data; word width; word height; - byte *palette; + byte *palette; + word offset; } bitmap_t; typedef struct { diff --git a/src/lib/mapread.c b/src/lib/mapread.c index a55f21a0..d1187795 100644 --- a/src/lib/mapread.c +++ b/src/lib/mapread.c @@ -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; diff --git a/src/lib/mapread.h b/src/lib/mapread.h index 623bf545..b82369a3 100644 --- a/src/lib/mapread.h +++ b/src/lib/mapread.h @@ -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_*/ diff --git a/src/lib/modex16.c b/src/lib/modex16.c index d0707ffd..83c22788 100644 --- a/src/lib/modex16.c +++ b/src/lib/modex16.c @@ -1,617 +1,671 @@ -#include -#include -#include -#include -#include -#include -#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, ®s, ®s); -} - - -/* -========================= 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; idata + (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; - 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) { +#include +#include +#include +#include +#include +#include +#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, ®s, ®s); +} + + +/* -========================= 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; idata + (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 - } -} - - -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; - 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) { - modexPalUpdate(palette); - return; - } - - while(iter > 0) { /* FadeLoop */ - for(i=0; i 127) { - tmppal[i] = 0; - } else if(tmppal[i] > 63) { - tmppal[i] = 63; - } - } - modexPalUpdate(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; iwidth, 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 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(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)(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 -#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); -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 +/* + * Functions for handling modex and doing other basic graphics stuff. + */ +#ifndef MODEX16_H +#define MODEX16_H +#include +#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 diff --git a/src/pcxtest.c b/src/pcxtest.c index 3c406286..75847e56 100644 --- a/src/pcxtest.c +++ b/src/pcxtest.c @@ -68,7 +68,7 @@ void main() { modexEnter(); /* fix up the palette and everything */ - modexPalUpdate(bmp.palette); + modexPalUpdate(bmp.palette, 0); /* clear and draw one sprite and one bitmap */ modexClearRegion(&page, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 1); diff --git a/src/scroll.c b/src/scroll.c index a6ee75cc..17f0aa6e 100644 --- a/src/scroll.c +++ b/src/scroll.c @@ -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); void mapDrawRow(map_view_t *mv, int tx, int ty, word y); void mapDrawCol(map_view_t *mv, int tx, int ty, word x); -void qclean(); +void qclean(); +void pdump(map_view_t *pee); 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); -#define TILEWH 16 -#define QUADWH (TILEWH/4) +#define TILEWH 16 +#define QUADWH TILEWH/2 #define SPEED 4 //#define LOOPMAX (TILEWH/SPEED) @@ -76,7 +77,8 @@ void main() { long emmhandle; long emsavail; char teststr[80]; - int i; + int i; + static word paloffset=0; bitmap_t ptmp;//, npctmp; // player sprite planar_buf_t *p; const char *cpus; @@ -85,8 +87,8 @@ void main() { map_t map; map_view_t mv, mv2, mv3; map_view_t *bg, *spri, *mask;//, *tmp; - byte *pal; - byte *ptr; + byte *dpal, *gpal; + byte *ptr, *mappalptr; actor_t player; //actor_t npc0; @@ -116,24 +118,25 @@ void main() { printf("Insufficient pages available\n"); exit(0); }*/ - + /* 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()); -//---- initMap(&map); - mv.map = ↦ - mv2.map = ↦ - mv3.map = ↦ - - /* draw the tiles */ - ptr = map.data; - /* data */ - ptmp = bitmapLoadPcx("data/ptmp.pcx"); // load sprite - //npctmp = bitmapLoadPcx("ptmp1.pcx"); // load sprite - /* create the planar buffer */ + //if(isEMS()) printf("%d tesuto\n", coretotalEMS()); +//---- initMap(&map); + mv.map = ↦ + mv2.map = ↦ + mv3.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); - + /*if(isEMS()) { XMOVE mm; @@ -164,18 +167,32 @@ void main() { //printf("%d\n", emmhandle); } */ - /* save the palette */ - pal = modexNewPal(); - modexPalSave(pal); - modexFadeOff(4, pal); - modexPalBlack(); - - setkb(1); - modexEnter(); - modexPalBlack(); - modexPalUpdate(ptmp.palette); - modexFadeOn(4, ptmp.palette); - screen = modexDefaultPage(); + + /* 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(); + modexPalSave(gpal); + modexSavePalFile("data/g.pal", gpal); + modexFadeOn(4, gpal); + + /* setup camera and screen~ */ + screen = modexDefaultPage(); screen.width += (TILEWH*2); screen.height += (TILEWH*2)+QUADWH; mv.page = &screen; @@ -217,11 +234,11 @@ void main() { modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 64, 24, 32, &npctmp);*/ modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 64, 24, 32, &ptmp); - modexClearRegion(spri->page, player.triggerx*16, player.triggery*16, 16, 16, 1); - modexClearRegion(bg->page, player.triggerx*16, player.triggery*16, 16, 16, 1); + //----modexClearRegion(spri->page, player.triggerx*16, player.triggery*16, 16, 16, 1); + //----modexClearRegion(bg->page, player.triggerx*16, player.triggery*16, 16, 16, 1); - modexClearRegion(spri->page, 5*16, 5*16, 16, 16, 255); - modexClearRegion(bg->page, 5*16, 5*16, 16, 16, 255); + //----modexClearRegion(spri->page, 5*16, 5*16, 16, 16, 255); + //----modexClearRegion(bg->page, 5*16, 5*16, 16, 16, 255); modexShowPage(spri->page); while(!keyp(1) && player.hp>0) @@ -521,8 +538,8 @@ void main() { } if(player.q == (TILEWH/SPEED)+1 && player.d > 0 && (player.triggerx == 5 && player.triggery == 5)){ player.hp--; } //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(); @@ -535,8 +552,8 @@ void main() { } } - /* fade back to text mode */ - modexFadeOff(4, ptmp.palette); + /* fade back to text mode */ + modexFadeOff(4, gpal); modexPalBlack(); modexLeave(); setkb(0); @@ -554,7 +571,7 @@ void main() { printf("player.hp: %d\n", player.hp); printf("player.q: %d\n", player.q); printf("player.d: %d\n", player.d); - printf("%d\n", map.data[0]); + printf("palette offset: %d\n", paloffset); printf("temporary player sprite 0: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=45556867\n"); printf("temporary player sprite 1: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=44606385\n"); printf("\n"); @@ -571,9 +588,9 @@ void main() { case 2: cpus = "386 or newer"; break; default: cpus = "internal error"; break; } - printf("detected CPU type: %s\n", cpus); + printf("detected CPU type: %s\n", cpus); modexPalBlack(); - modexFadeOn(4, pal); + modexFadeOn(4, dpal); } @@ -833,6 +850,20 @@ void qclean() { modexLeave(); setkb(0); +} + +void pdump(map_view_t *pee) +{ + int mult=(QUADWH); + int palq=(mult)*TILEWH; + int palcol=0; + int palx, paly; + for(paly=0; palypage, palx+TILEWH, paly+TILEWH, mult, mult, palcol); + palcol++; + } + } } void diff --git a/test.exe b/test.exe index c84415ec306caf5978cc2c3ae888a1eedb524951..9df6003d7b132c61551f2a0bce50b68bb7175f18 100644 GIT binary patch delta 9857 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 Wlc4RTP`(On9ktuX@WN9w5c*#+6cj4} delta 9101 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 T@Ze%B*E&rH(?roxOvwKM00vC& -- 2.11.0