From 7b204788231612250d286ca317dd942b78da91b6 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Fri, 21 Apr 2017 08:46:23 -0500 Subject: [PATCH] 16_ca needs huge amounts of work and I should remember what needs to be done soon[going to port rest of code to borland c some time so we can use the core components of id engine here ][going to add 16_us.c eventually but the debug system and CA_ PM_ and MM_ usage is priority now]older zcroll renamed to xcroll][zcroll is now the pre menu game loop system with PROPER data usage with CAMMPM] added 1st scroll back --- 16/modex16/286@12.log | 4 + 16/modex16/286@8.log | 4 + 16/modex16/46113319.pcx | Bin 0 -> 6240 bytes 16/modex16/bitmap.c | 162 ++++++++++ 16/modex16/bitmap.h | 24 ++ 16/modex16/chikyuu.pcx | Bin 0 -> 12071 bytes 16/modex16/computer.pcx | Bin 0 -> 3466 bytes 16/modex16/dos_kb.c | 142 +++++++++ 16/modex16/dos_kb.h | 23 ++ 16/modex16/ed.pcx | Bin 0 -> 2086 bytes 16/modex16/ed2.pcx | Bin 0 -> 26662 bytes 16/modex16/edw.pcx | Bin 0 -> 28073 bytes 16/modex16/gfx.pal | Bin 0 -> 768 bytes 16/modex16/koishi.pcx | Bin 0 -> 6529 bytes 16/modex16/koishi^^.pcx | Bin 0 -> 4039 bytes 16/modex16/koishi~.pcx | Bin 0 -> 4365 bytes 16/modex16/lib/lib_com.cpp | 21 ++ 16/modex16/lib/lib_com.h | 106 +++++++ 16/modex16/makefile | 37 +++ 16/modex16/mayu.pcx | Bin 0 -> 5261 bytes 16/modex16/modex16.c | 605 +++++++++++++++++++++++++++++++++++++ 16/modex16/modex16.h | 86 ++++++ 16/modex16/palettec.c | 16 + 16/modex16/pcxtest.c | 79 +++++ 16/modex16/pcxtest.exe | Bin 0 -> 36196 bytes 16/modex16/q.pcx | Bin 0 -> 6621 bytes 16/modex16/rarity.pcx | Bin 0 -> 8229 bytes 16/modex16/scroll.c | 363 ++++++++++++++++++++++ 16/modex16/scroll.exe | Bin 0 -> 18566 bytes 16/modex16/test.c | 75 +++++ 16/modex16/test.exe | Bin 0 -> 17260 bytes 16/modex16/test.txt | 258 ++++++++++++++++ 16/modex16/test2.c | 19 ++ 16/modex16/test2.exe | Bin 0 -> 17028 bytes 16/modex16/types.h | 11 + 16/modex16/w.pcx | Bin 0 -> 1617 bytes src/0croll.c | 2 +- 37 files changed, 2036 insertions(+), 1 deletion(-) create mode 100755 16/modex16/286@12.log create mode 100755 16/modex16/286@8.log create mode 100755 16/modex16/46113319.pcx create mode 100755 16/modex16/bitmap.c create mode 100755 16/modex16/bitmap.h create mode 100755 16/modex16/chikyuu.pcx create mode 100755 16/modex16/computer.pcx create mode 100755 16/modex16/dos_kb.c create mode 100755 16/modex16/dos_kb.h create mode 100755 16/modex16/ed.pcx create mode 100755 16/modex16/ed2.pcx create mode 100755 16/modex16/edw.pcx create mode 100755 16/modex16/gfx.pal create mode 100755 16/modex16/koishi.pcx create mode 100755 16/modex16/koishi^^.pcx create mode 100755 16/modex16/koishi~.pcx create mode 100755 16/modex16/lib/lib_com.cpp create mode 100755 16/modex16/lib/lib_com.h create mode 100755 16/modex16/makefile create mode 100755 16/modex16/mayu.pcx create mode 100755 16/modex16/modex16.c create mode 100755 16/modex16/modex16.h create mode 100755 16/modex16/palettec.c create mode 100755 16/modex16/pcxtest.c create mode 100755 16/modex16/pcxtest.exe create mode 100755 16/modex16/q.pcx create mode 100755 16/modex16/rarity.pcx create mode 100755 16/modex16/scroll.c create mode 100755 16/modex16/scroll.exe create mode 100755 16/modex16/test.c create mode 100755 16/modex16/test.exe create mode 100755 16/modex16/test.txt create mode 100755 16/modex16/test2.c create mode 100755 16/modex16/test2.exe create mode 100755 16/modex16/types.h create mode 100755 16/modex16/w.pcx diff --git a/16/modex16/286@12.log b/16/modex16/286@12.log new file mode 100755 index 00000000..34027049 --- /dev/null +++ b/16/modex16/286@12.log @@ -0,0 +1,4 @@ +Old non-sprite: 7.032967 +New non-sprite: 1.043956 +Old Sprite: 6.648352 +New Sprite: 1.648352 diff --git a/16/modex16/286@8.log b/16/modex16/286@8.log new file mode 100755 index 00000000..a29ceffc --- /dev/null +++ b/16/modex16/286@8.log @@ -0,0 +1,4 @@ +Old non-sprite: 10.439561 +New non-sprite: 1.373626 +Old Sprite: 9.945055 +New Sprite: 2.362637 diff --git a/16/modex16/46113319.pcx b/16/modex16/46113319.pcx new file mode 100755 index 0000000000000000000000000000000000000000..ce42ed871bc76df879d0a21665ad2707ee44f867 GIT binary patch literal 6240 zcmeI0%aR;N6^64itFpSLF8KuJ9sB?Uk3hf%)&$SM0)hxOuz?kOUV=~%th1`SH5biD z5w<0JBwMz1u_gH`+p=t#=KD`o&&ce&V_~(XyDIDd&pl6`?t`jWIsX0C{X-w_r{R?= zKl|zzKRJK(l|TOS*Z=o4=|6Y7-E+5lI^N&@;V-}Y`EOq>S>T^5{^knz zCx5pv`VW5FrCmDZ?|8@cA zg$OtCq{u*gQD$ENkzf1_kAO}wPJ-qn)n zLac{6K*Np;^qnL@ZiXYZ+{61$`HLPjK~o&ZbQ>_-b&^7v;QA2Dq72=}#S)t(ia%k` z!Imajx?|x>L+8Tx*>y^3h{&D^ewT83D8WJi;yo;eQ#+xv( z&~1%TXM*AS&ew&{U5>uukz!a7JzjeX0;Qys7C3n5;P@`Ld5Cr8uuAwCqA_ks31Qsw z32{J)3~^od-Pp!4bi~w0BJ&c%bij~x1Ad6&+Rks=+>u@2yp+FPN;eUV$?j?@YvM8B z1n??{7L%rf+@c_$6CbR)#t z5+;2chz*A3dX-z66Z|LQ=elqwGC-EWciw8GgzicrSNcjRoYL60&CpswIk&LMMOjoNI(PjR z6Q&E-mG9`z6ypd@1;%~Xl0_2kU`1Y`Js3sw1xg7u6^m?Ge2OGakD>Cpa+q0*l-q;8 z>yJ{7pQl?XmxSa7>Vz&a3_RU~7*~<{!!+=&?Y~POYugkxd2?OQ{$)o>CgxKtt!sMs zf}^OUl?||=Oo$1kD@R4R6Jm7Va5$9%n~x`f6(T?yh-WCVtqkl#*SEAHQv57EmN-lr zOP5>fM1WE5Tt!+JNk(HfQXy^~}c{s(pjlT%r;j(KffJ zAa=(opeZ~Qh~20{MiYBr>>aMT>%v@P$4c!z{4tbHQylH64QtO+>K9=GPT?*Co53F@`hQ!TB;a8tuzRK=bWQ)drid_+6|&awF#-3g>_}I@9+`ue?ZyXk^4dIf zjMM}9l?MAfNr$Bk&33-r& za;(ZxA;|2~IRd>Vl0m6H1soNhZ&24 zk((v=8;)9{jX@MJ2f6z85UsZ8K^%w0+D96xm>R%ls-knI>{3%4$!04(es=z(MLCgIYk)4!=XQgvc^(fd`yi?tyj4dWB} z!%vK)39IS8HP4<41uy7DMna@W*|(l8F{+Br+1%%vKh;oFFEWNa%zoGnXX7N&OrZq6 zwt4l!CR6YdVMHM&LBQW}Hg1J=&osG8&`XN)!rO{7Gnx!#w6H_DGgD^&v13l~F>urr zI%yZI&TeIm>^$^Lj$s%*ieQgkBqsqXep-iSyYf0 zuL?W?UB$8MUnu9f<2!EhScjnufXI~Q)ojAB8m%FY^sX0_6QY?@M6kHYDd0mK>J>Z9 zdRZKql_WoFFnKOg?#58@oy63{H53f!MAA#`Z=yTKi5VTr*OWMVprB_CMHD7?@bFXQ zEoTR44R}414+I*xf>TT;6v%pk4;)^-zJh@5z`iYe?BwBu+3VkQ&V;WblV0DB%>IC$ z(E~Il&|6Z0o7UqT!x_(##f38(*$8Ghct*p+j0|>x((`eh$2rBk;y|~@%ytO;iuQ^j zeIg9nfTQkOz9;d;JacOGI+f(ommC8q;Y7{UDD#X)Okng{bn*TF3r_h+rEGYF<*j=o z>352!TDDO2`u?@7ey&x;kD&%^b~ItYpRt_dRU|ms+bzqV?w4DJQH?&g4E>3O9AVgZ=dKEbI;X(`P|>rqe|UBPG11TVHzAiA+R+b z*$NjID<5j56o@W6gFawMmmC^2crJKoYwYddI9K?p&Ba5(xCF-U8v1R56JTECl6<^( zvHCzz27OqUi}%x)d;a@es1XHs&lYF?JzGWm`oF>DbC#_u4%zs3x1dW$KjBc}Z7KQivBIeT~ryUzvsZ=8{G? z47Y7zv58J_NB4UQzJ80Pv&46FT_9_huGuBa`^%SC?fS$J#ABCEkVpV7u91FuT@k7o zLc3ESmYZt6zJ{0lE+O-zN-i&`YYG%Y*!~fB73YR+9 YKlm5a9|=E3;QuiKzxvJZuUxtEUp8y3fB*mh literal 0 HcmV?d00001 diff --git a/16/modex16/bitmap.c b/16/modex16/bitmap.c new file mode 100755 index 00000000..8287e57d --- /dev/null +++ b/16/modex16/bitmap.c @@ -0,0 +1,162 @@ +#include +#include +#include "bitmap.h" +#include "modex16.h" + +static struct pcxHeader { + byte id; + byte version; + byte encoding; + byte bpp; + word xmin; + word ymin; + word xmax; + word ymax; + word hres; + word vres; + byte pal16[48]; + byte res1; + word bpplane; + word palType; + word hScreenSize; + word vScreenSize; + byte padding[54]; +} head; + + +static void loadPcxStage1(FILE *file, bitmap_t *result) { + long bufSize; + int index; + byte count, val; + long int pos; + + /* read the header */ + fread(&head, sizeof(char), sizeof(struct pcxHeader), file); + + /* get the width and height */ + result->width = head.xmax - head.xmin + 1; + result->height = head.ymax - head.ymin + 1; + + /* make sure this is 8bpp */ + if(head.bpp != 8) { + printf("I only know how to handle 8bpp pcx files!\n"); + fclose(file); + exit(-2); + } +} + + +static void loadPcxPalette(FILE *file, bitmap_t *result) { + byte val; + int index; + + /* handle the palette */ + fseek(file, -769, SEEK_END); + val = fgetc(file); + result->palette = modexNewPal(); + if(head.version == 5 && val == 12) { + /* use the vga palette */ + for(index=0; !feof(file) && index < PAL_SIZE; index++) { + val = fgetc(file); + result->palette[index] = val >> 2; + } + } else { + /* use the 16 color palette */ + for(index=0; index<48; index++) { + result->palette[index] = head.pal16[index]; + } + } +} + + +bitmap_t +bitmapLoadPcx(char *filename) { + FILE *file; + bitmap_t result; + long bufSize; + int index; + byte count, val; + + /* open the PCX file for reading */ + file = fopen(filename, "rb"); + if(!file) { + printf("Could not open %s for reading.\n", filename); + exit(-2); + } + + /* load the first part of the pcx file */ + loadPcxStage1(file, &result); + + /* allocate the buffer */ + bufSize = result.width * result.height; + result.data = malloc(bufSize); + if(!result.data) { + printf("Could not allocate memory for bitmap data."); + fclose(file); + exit(-1); + } + + /* read the buffer in */ + index = 0; + do { + /* get the run length and the value */ + count = fgetc(file); + if(0xC0 == (count & 0xC0)) { /* this is the run count */ + count &= 0x3f; + val = fgetc(file); + } else { + val = count; + count = 1; + } + + /* write the pixel the specified number of times */ + for(; count && index < bufSize; count--,index++) { + result.data[index] = val; + } + } while(index < bufSize); + + loadPcxPalette(file, &result); + + fclose(file); + + return result; +} + + +tileset_t +bitmapLoadPcxTiles(char *filename, word twidth, word theight) { + tileset_t ts; + FILE *file; + bitmap_t result; + int i; + + /* open the PCX file for reading */ + file = fopen(filename, "rb"); + if(!file) { + printf("Could not open %s for reading.\n", filename); + exit(-2); + } + + /* load the first part of the pcx file */ + loadPcxStage1(file, &result); + + /* get the number of tiles and set up the result structure */ + ts.twidth = twidth; + ts.theight = theight; + ts.ntiles = (result.width/twidth) * (result.height/theight); + ts.palette = result.palette; + + /* allocate the pixel storage for the tiles */ + ts.data = malloc(sizeof(byte*) * ts.ntiles); + ts.data[0] = malloc(sizeof(byte) * ts.ntiles * twidth * theight); + for(i=1; i < ts.ntiles; i++) { + ts.data[i] = ts.data[i-1] + twidth * theight; + } + + /* finish off the file */ + loadPcxPalette(file, &result); + + fclose(file); + + return ts; +} diff --git a/16/modex16/bitmap.h b/16/modex16/bitmap.h new file mode 100755 index 00000000..4c4af98e --- /dev/null +++ b/16/modex16/bitmap.h @@ -0,0 +1,24 @@ +/* + * Functions and types for loading and manipulating bitmaps. + */ +#ifndef BITMAP_H +#define BITMAP_H +#include "types.h" +typedef struct { + byte *data; + word width; + word height; + byte *palette; +} bitmap_t; + +typedef struct { + byte **data; + word ntiles; /* the number of tiles */ + word twidth; /* width of the tiles */ + word theight; /* height of the tiles */ + byte *palette; /* palette for the tile set */ +} tileset_t; + +bitmap_t bitmapLoadPcx(char *filename); +tileset_t bitmapLoadPcxTiles(char *filename, word twidth, word theight); +#endif diff --git a/16/modex16/chikyuu.pcx b/16/modex16/chikyuu.pcx new file mode 100755 index 0000000000000000000000000000000000000000..61eac4cca4a06694e7425fe70b7ec3e0e8c88cbc GIT binary patch literal 12071 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 literal 0 HcmV?d00001 diff --git a/16/modex16/dos_kb.c b/16/modex16/dos_kb.c new file mode 100755 index 00000000..dd924189 --- /dev/null +++ b/16/modex16/dos_kb.c @@ -0,0 +1,142 @@ +/* Thanks to Alex Russell for example code */ +/* Thanks to Gary Neal for example code */ +#include "dos_kb.h" + +// keyboard buffer +static byte key[NUM_SCANCODES]; // pressed +static byte kea[NUM_SCANCODES]; // released + +#ifdef __cplusplus /* Function must be declared C style */ +extern "C" { +#endif +static void interrupt (far *oldkb)(void) = NULL; /* BIOS keyboard handler */ +#ifdef __cplusplus +} +#endif + +/* + * Comment out the following #define if you don't want the testing main() + * to be included. + */ +//#define TESTING +#define TESTING2 + +/*****************NEW KEYBOARD 09h ISR***********************/ +void interrupt newkb(void){ + byte kee; + register char qx; + + kee = inp(0x60); /* Read the keyboard scan code */ + + /* Clear keyboard controller on XT machines */ + qx = inp(0x61); /* Get keyboard control register */ + qx |= 0x82; + outp(0x61, qx); /* Toggle acknowledge bit high */ + qx &= 0x7F; + outp(0x61, qx); /* Toggle acknowledge bit low */ + + /* Interpret the scan code and set our flags */ + #ifdef TESTING2 + //printf("%d[%d]\n",kee,key[kee]); + printf("\0"); // bug + #endif + if(kee & 0x80) + key[kee & 0x7F] = 0; // a key is released + else + key[kee] = kea[kee] = 1; // a key is pressed + + /* Acknowledge the interrupt to the programmable interrupt controller */ + outp(0x20, 0x20); /* Signal non specific end of interrupt */ +} + +/* ---------------------- init_keyboard() ---------------- April 17,1993 */ +/* restore the bios keyboard handler */ +/* ---------------------- deinit_keyboard() -------------- April 17,1993 */ +void setkb(int vq){ + int i; /* Index variable */ + if(!vq){ // deinitiation + /* Abort if our function pointer has no valid address */ + if(oldkb == NULL) return; + /* Set address in our function pointer in interrupt vector table */ + _dos_setvect(9, oldkb); + /* Reset our function pointer to contain no valid address */ + oldkb = NULL; + #ifdef TESTING + /* Print the key heap */ + printf("\n"); + for(i=0; itNc%kKhwWEJ@0TN+EdnZwx=DL8#X(-r8~Z*E#)oS zB(~*zOB-s~-iU2@L)TQZ-HEOFnnuWeFTUoH66Ax_oM@nmAEe@edPt9udRjqxg0!NJ zI<^O~9e31H9=R4DcrSr{Es?VpXyi^T-wE3eP)iLE-wXR&@!X4#+)P*!{sJVysG%B0 zBeWaXjX-LuD2u$7U^n=#0htO|}u&-@*$z5QJR|eiuFX z;INN^*fqF-w~7>CxpMwN{K`cRlioXjFTOwPgYyUR!&y)6Ajx5CH4i*O9o?cOcMnoE z$^#GXK?Z2~r1{Q0N#~Hhj3`3_e`+cr=N11zvU9{kfxc^j=Gb|GM1Io*7Kk=uCKMI> zui`5X#px|@lmZp=kBU-+m)atyg+cXEy@vDZB^ru`jo%?_4WcZh=Bp2HdC{oPx;~u723Yl{#`Qgf}3thhx*i~?3}q8rR=85R=uVw zP^;-i#@AE?)lb(pyr#4_hUsq4by#+4aL-3f1+C4DLDDgx;{oMeQ0%3HLI+5828&Dw z$(FKCeQ}7Ev+Zf{EMsU-TJk+%LVZjrVPsuiUX~@5WqB;itE;P&%Ht6a4Bpp!2L9&^ F`~prXe69ch literal 0 HcmV?d00001 diff --git a/16/modex16/ed2.pcx b/16/modex16/ed2.pcx new file mode 100755 index 0000000000000000000000000000000000000000..b35305e35924292109c89292a99af85165843446 GIT binary patch literal 26662 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 literal 0 HcmV?d00001 diff --git a/16/modex16/gfx.pal b/16/modex16/gfx.pal new file mode 100755 index 0000000000000000000000000000000000000000..e98ae60e3d21a9409f12ef6b1f2ad3625750e734 GIT binary patch literal 768 zcmZva!3shl5JhKEB>9@=fri8dTLeWQk6P5D&HVpg<+M_8JdASB=t`nmkGkmbuvWKd z$7rQ>MOAD6tsd+2cDr@XdGDEdp63ukN(sQ_a=Biw_xrt+@_N12b^Xt)kY>__>gCF! zl$E4D)QTn@i=6eAb;Vn2qWPx1XwtDLMW03AMZZPW_-c7;d1^13bS#LlBQPNn zU_=mucIZWujs-JjMr0%gj0BG08NF!Iu?PXDfD~{JfN@4h2q*NSNymanHYAQ@A`xQ} zazY#FMU#$&bFz0bIbkPau((OwUV71_W8u9_UJhQ4Uc@+xKZu{C7fm`A_RUB218>tx AO#lD@ literal 0 HcmV?d00001 diff --git a/16/modex16/koishi.pcx b/16/modex16/koishi.pcx new file mode 100755 index 0000000000000000000000000000000000000000..76d0516082ee63d31c70339eb485dd6665235046 GIT binary patch literal 6529 zcmeI0%WfoD5r(V6NoM5{k2167HQ*^&AhF{akU;7U61)Ixcmei#t-RFTE?3!Zk9+#w z48sgPfIvd#`{R_|JrbMQqUo-z%1ita|B2g)bojw^HsN18`Niau=_ga2f2V)b`Q*EU zK3KR9`ak&h|Nea$7Iq&FNZf|O>ZIdp$JH^kcA3;%ExFo<+U}ByE9u&D_1drIT&+T7 zUnZqpg~Hx)y$Gef=lYW0x8ahzUvu^>xiD^?2P1{c)HzC*pIi%!MN%3$wyERPq ztfT*y%n_LlE?mrdYb3~dn-m7eHVUGM&%xzt z;=}c1AX2tRVCgg(1S%p7^$z!H$)lAxQ88V(2=2zhzmw6P;Tz&mTIlf(9%N~W!ES_} zgq|mZ?GVIgM21xtVdOB*cBn?(h&4&xB)7K4Lq`IGw=p@&vv5-`^pGErERZ}xex4oR z3&%M&iAz1fJ^(8vkGMz-2$!sO%Xyg`ZIjJ8uNCnHAcY^)QkV_PfQ%3_Aq32`+MZ@` z;B<*M#sJbW3;nFoFeiEgPTdieCWBvQnH@8$fVIiS^LhvkWxXVVJuEP(V#7WbN8md`R%~~?Mzz{}CPz&6RJ|R}2=j?ofHH->@#|WxS z)V4=Biz^~|NhuKPFb3N>pg^jPfGtlE&JlkA5v+_WoBcfGB}hpayS~jm(gL=xB54BHS*o*vx_DH`wagY)|%Av-U;6{?id2p{w zTGvrVC!phi|492@Ejliv#}|B-k1B|xe1a=j40q?UAub9(C5@JAC{WZL#8jJFjx#Q8 zg(t=20$^?xdWx(+DN?~8sfGC-B2Bkwk{UHMsp&Xivqnt|SZUtoXi`j7U_JGz&WTKs z#Iyn^T6a`G8fWA_TG*yg(V=1oYK{uekUDb>4bMeGUCF`h4;I7H$@8Qo=mCt-9p*VL zyhuf$5`l;4&;sdQWza6D74WG!3XUBKMRsh(8wT-RYcaf;B}Pvm zyh_rVWxxa-1Tqp4YueL*y|t@ZaYHFWsudilDJdmOTIko>KeRs=;SJv(w5a!>rAKy) z7BU4Hlqg$@oV0W`iZK{<&P%p{@H#ZmVCR=ft+}#u01>R*APii`)~4po89cNV3T&)K z8?Mv>pJP1ikyp0!)8T|uOlt19TS<)rGXr2!FwuVgG57#V{*=*PF7QQ32exZ!_`p!s zgjd+twvsuxh`}0jw(}ESKOezGt|2RqH2fyKbkp)F8c@W~;L*nq0M%nY;0dsJi)Mv& z2E_2f@hTRG$~OI@&1rX7EI%kH^U!fsh*jW zIv}m(oE!muL7MjI9Jk#n>FE#+@)g?g4IH#doTDRdIOVK`AF4m$~-_r8N1rJb~2N#jr~mQ zL04_Bk?}&fSW%j5_^4-4*1%=@kgptG1K;AZ3b=3-soEcK)hfxL(8+iE+;K`}~ShJD9-f2l^m_D$*%m*u{ zC!n{3{Rvsga^py?mtGB5^%j-ej`PJ-%`@YjB^@=<;-Jc>H@h+ykL@$r=@+CiqdnO%u}XWE3zBhBaL*eA%oIko z7Z=sW*ZK=;V5wdlYV_p71!F(b>ZJ-19PJq^8S#tH_Bhb{ga#tSc|93nv7kI9`nigL z{hYlE5`2)Bs+L0$;iY0gyE3zQlxKYdU8doXH(8PP5_MHod{51&6Vr~y2iS8#XcTHr zjFdQ88z)oI2&m@R(}@J4Og(7YDWNCaWx65`aHT z6Dyj7YmyWByNIgn+ww0Fyi2VVHJ%WZ5vP>o^Bskz6=_fNB1XHUU-FAxN&Dh7)kryz zE7d0V)y+SEUP0$&ilgzQIH8Rk<-f8MPn@Zbkxr@+ZG~WUA2Y9s`kNC@nXGCQQhk1Y zCI`2`S-3po69(%=PL4=H;vo(I=KJ&uog$v{MUNm)X!j9N^Hb?iTs8C{sq}iE{snHz2Y!?X@Nmt# zM7}}nOrJ5e2106L-<&X#jS#^|KQMDJj9hLCoIntkHFdRb(k~?=YXN#XfsoegVqh7S zFjk$pF`mr@Rfzun2$dOc%VJ75;IaW(II`eOca|I^)ju2+r8VlhyP%yic0m+jaW$bj zbS+US&|jq!qhjT4TO@G-I*Bp>*;^fzczqtG8wY7PB?z4tli-nn;XGJna;WHQN2(=GA%PBi+T*G8KBFFCjc!BdZJL^?7_x(%bmkQo2%SNWsHZa(YVXMN;hVEm%$} zr{~G40$#6BsY~TVfz=`d-lUfH%8JAauS&fTT=s>+C6EkB z1ZNJB&eEiuYFgD)t_i6Ee<#~0(zq;Dr^)!HaLxKWRH~4cWI?Ockz*jiO52QVv%Wy3 zv>Pirk4RJSgx@Hwj}FZt4=UtF3q$4T0##7kreibc{m?W6S`ziQbdkKA1(Bv@hV@Z9 zk{rv_xgaZpWEqXm)GAA42{$msq>W|rd?tg4B}-^R zHc({p^>ra|r&%@#@f$(r0|^YB&0I2Ag9`F_<_l&RJe^^x2=dxR#;XE&9>*_dQ3AV}j5Brss4Q8cMO41Z9cyNT26mQQa+*$o zvFhXrVpuhYPbm00Re3!vhNgWMB*hu_|YQ&+Xu8n&vRh zXf=`Fax{o)f(#Tk2+Q0_^nIG&K7+*ABZ6`vT3Ib01Yw33Ie3ocn7diTRvu0T5<^EV zpeRAj<`@KEu@^wzMrsEO9E0AsIkjIFp+XgFAV_FLr=solaBMns)l8AgLhj*_k8 z!2_}`!<|txoSrHScARz&LSAxlP{jX0TSmi^H%d%1@5%ry3Ioy%#?<*7bA~`p0VqLR zmM{RCy_W{tL6t`kaV5FCwIUd(%qt^}YONde*#vxJQ!5zESR25iK~d~Yx}{`BadFds8_ts& zdWrpD05!960k65oj?K{60T)|X2vC?a4C2#6Enw?&QEUm6BY?ml#vefJu&w0-JYb7B zz#~ufEg;tj7!Xj?X1m?ys5Xdb>NK|X7(D>-$XIkyOq*>L4Q!NWaQ?&*vjhjU39TJB z!yDQpmvOS#xJV;AA{=i>oWW(>4q`Wg(@Bklid}^uWjjdhNTJ^5b&S4wD%5qpOYrLE zqRuOiQ^EChVeM|MJ+#>8*0nx{Uz}FgagFg&a`RC%qJ|YXG;Po*FF<5{QK*(=IF9)6 zZSj4BCTVEfhB)FqmzNWSfe9Q@y1r@irD*t9ArJvJU3?;>$gg7(bg&V`Ht=#ZxlE@$v1IIzHN3Nwkgkhs|Ig|-XrR~Y zrMKO_b9l!OcJ6)jfkT&OS8m+6e)XrO_tYc*eD>(S>`U*QSv(Sd*3zenZ+!c$U+nLl zcz!?86B|BweADNbM(@9N^pUL}Q+u}D{@Yz&TY2ne|J3f6A#|k zpb?$?_`Au|58YY*X%}t(3Elq;J^bq4SJs|iT&wLkeAm85?|bOEkr!8wb;fDa1E1Xf zv#;!UZu{;(JovEt(!dwL`iXmXec`@i=Fr8l&X;NTzPp~xcm4WThh9GZo9^8o`TCFU z`Q`8T9P2*)>ck)a{MQ!_uPr_Gw+rRk-$F4m4(!2k$`tP1lz2h(UR*TDTo>@fo xP{ZDf2Ya0Zz1I&SeWd)j+rQ_TpC33nbL5q^`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@V clock()) && !kbhit()) ; +} /* End of wait */ \ No newline at end of file diff --git a/16/modex16/lib/lib_com.h b/16/modex16/lib/lib_com.h new file mode 100755 index 00000000..5a203b9d --- /dev/null +++ b/16/modex16/lib/lib_com.h @@ -0,0 +1,106 @@ +#ifndef _LIBCOM_H_ +#define _LIBCOM_H_ +#include +#include +#include // just for wait +#include // just for wait +#include "types.h" + +/* Control codes for all keys on the keyboard */ +//here temperarly +#define KEY_A (0x1E) +#define KEY_B (0x30) +#define KEY_C (0x2E) +#define KEY_D (0x20) +#define KEY_E (0x12) +#define KEY_F (0x21) +#define KEY_G (0x22) +#define KEY_H (0x23) +#define KEY_I (0x17) +#define KEY_J (0x24) +#define KEY_K (0x25) +#define KEY_L (0x26) +#define KEY_M (0x32) +#define KEY_N (0x31) +#define KEY_O (0x18) +#define KEY_P (0x19) +#define KEY_Q (0x10) +#define KEY_R (0x13) +#define KEY_S (0x1F) +#define KEY_T (0x14) +#define KEY_U (0x16) +#define KEY_V (0x2F) +#define KEY_W (0x11) +#define KEY_X (0x2D) +#define KEY_Y (0x15) +#define KEY_Z (0x2C) +#define KEY_1 (0x02) +#define KEY_2 (0x03) +#define KEY_3 (0x04) +#define KEY_4 (0x05) +#define KEY_5 (0x06) +#define KEY_6 (0x07) +#define KEY_7 (0x08) +#define KEY_8 (0x09) +#define KEY_9 (0x0A) +#define KEY_0 (0x0B) +#define KEY_DASH (0x0C) /* -_ */ +#define KEY_EQUAL (0x0D) /* =+ */ +#define KEY_LBRACKET (0x1A) /* [{ */ +#define KEY_RBRACKET (0x1B) /* ]} */ +#define KEY_SEMICOLON (0x27) /* ;: */ +#define KEY_RQUOTE (0x28) /* '" */ +#define KEY_LQUOTE (0x29) /* `~ */ +#define KEY_PERIOD (0x33) /* .> */ +#define KEY_COMMA (0x34) /* ,< */ +#define KEY_SLASH (0x35) /* /? */ +#define KEY_BACKSLASH (0x2B) /* \| */ +#define KEY_F1 (0x3B) +#define KEY_F2 (0x3C) +#define KEY_F3 (0x3D) +#define KEY_F4 (0x3E) +#define KEY_F5 (0x3F) +#define KEY_F6 (0x40) +#define KEY_F7 (0x41) +#define KEY_F8 (0x42) +#define KEY_F9 (0x43) +#define KEY_F10 (0x44) +#define KEY_ESC (0x01) +#define KEY_BACKSPACE (0x0E) +#define KEY_TAB (0x0F) +#define KEY_ENTER (0x1C) +#define KEY_CONTROL (0x1D) +#define KEY_LSHIFT (0x2A) +#define KEY_RSHIFT (0x36) +#define KEY_PRTSC (0x37) +#define KEY_ALT (0x38) +#define KEY_SPACE (0x39) +#define KEY_CAPSLOCK (0x3A) +#define KEY_NUMLOCK (0x45) +#define KEY_SCROLLLOCK (0x46) +#define KEY_HOME (0x47) +#define KEY_UP (0x48) +#define KEY_PGUP (0x49) +#define KEY_MINUS (0x4A) +#define KEY_LEFT (0x4B) +#define KEY_CENTER (0x4C) +#define KEY_RIGHT (0x4D) +#define KEY_PLUS (0x4E) +#define KEY_END (0x4F) +#define KEY_DOWN (0x50) +#define KEY_PGDOWN (0x51) +#define KEY_INS (0x52) +#define KEY_DEL (0x53) + +#define KEY_LWIN (0x73) +#define KEY_RWIN (0x74) +#define KEY_MENU (0x75) + + +//typedef unsigned char byte; +//typedef unsigned int word; +//typedef unsigned short syte; + +void wait(clock_t wait); + +#endif/*_LIBCOM_H_*/ diff --git a/16/modex16/makefile b/16/modex16/makefile new file mode 100755 index 00000000..b11f89a0 --- /dev/null +++ b/16/modex16/makefile @@ -0,0 +1,37 @@ +FLAGS=-0 +all: test.exe pcxtest.exe test2.exe scroll.exe + +scroll.exe: scroll.obj modex16.obj dos_kb.obj bitmap.obj + wcl $(FLAGS) scroll.obj modex16.obj dos_kb.obj bitmap.obj +scroll.obj: scroll.c + wcl $(FLAGS) -c scroll.c +test.exe: test.obj modex16.obj bitmap.obj + wcl $(FLAGS) test.obj modex16.obj bitmap.obj + +test2.exe: test2.obj modex16.obj bitmap.obj + wcl $(FLAGS) test2.obj modex16.obj bitmap.obj + +pcxtest.exe: pcxtest.obj modex16.obj bitmap.obj + wcl $(FLAGS) pcxtest.obj modex16.obj bitmap.obj + +test.obj: test.c modex16.h + wcl $(FLAGS) -c test.c + +test2.obj: test2.c modex16.h + wcl $(FLAGS) -c test2.c + +pcxtest.obj: pcxtest.c modex16.h + wcl $(FLAGS) -c pcxtest.c + +modex16.obj: modex16.h modex16.c + wcl $(FLAGS) -c modex16.c + +dos_kb.obj: dos_kb.h dos_kb.c + wcl $(FLAGS) -c dos_kb.c + +bitmap.obj: bitmap.h bitmap.c + wcl $(FLAGS) -c bitmap.c + +clean: + del *.obj + del *.exe diff --git a/16/modex16/mayu.pcx b/16/modex16/mayu.pcx new file mode 100755 index 0000000000000000000000000000000000000000..025e7d4a85fb6d271d65a86646e761d783e9bc46 GIT binary patch literal 5261 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 literal 0 HcmV?d00001 diff --git a/16/modex16/modex16.c b/16/modex16/modex16.c new file mode 100755 index 00000000..f01116b5 --- /dev/null +++ b/16/modex16/modex16.c @@ -0,0 +1,605 @@ +#include +#include +#include +#include +#include +#include +#include "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; + + __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 +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; i +#include "types.h" +#include "bitmap.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 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); + +/* 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 diff --git a/16/modex16/palettec.c b/16/modex16/palettec.c new file mode 100755 index 00000000..340a9303 --- /dev/null +++ b/16/modex16/palettec.c @@ -0,0 +1,16 @@ +#include "modex16.h" + +void +main() { + byte *pal; + + modexEnter(); + + pal = modexNewPal(); + modexPalSave(pal); + + modexSavePalFile("gfx.pal", pal); + + modexLeave(); + +} diff --git a/16/modex16/pcxtest.c b/16/modex16/pcxtest.c new file mode 100755 index 00000000..7373e885 --- /dev/null +++ b/16/modex16/pcxtest.c @@ -0,0 +1,79 @@ +#include +#include "modex16.h" +#include "bitmap.h" + +word far* clock= (word far*) 0x046C; /* 18.2hz clock */ + +void +oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite) { + byte plane; + word px, py; + word offset; + + /* TODO Make this fast. It's SLOOOOOOW */ + for(plane=0; plane < 4; plane++) { + modexSelectPlane(PLANE(plane+x)); + for(px = plane; px < bmp->width; px+=4) { + offset=px; + for(py=0; pyheight; py++) { + if(!sprite || bmp->data[offset]) + page[PAGE_OFFSET(x+px, y+py)] = bmp->data[offset]; + offset+=bmp->width; + } + } + } +} + +void main() { + bitmap_t bmp; + int i; + page_t page; + word start; + float t1, t2; + + page=modexDefaultPage(); + + bmp = bitmapLoadPcx("46113319.pcx"); + modexEnter(); + + /* fix up the palette and everything */ + modexPalUpdate(bmp.palette); + + /* clear and draw one sprite and one bitmap */ + modexClearRegion(&page, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 1); + + /* non sprite comparison */ + start = *clock; + for(i=0; i<100 ;i++) { + oldDrawBmp(VGA, 20, 20, &bmp, 0); + } + + start = *clock; + for(i=0; i<100 ;i++) { + modexDrawBmp(&page, 20, 20, &bmp); + } + t1 = (*clock-start) /18.2; + + start = *clock; + for(i=0; i<100; i++) { + modexCopyPageRegion(&page, &page, 20, 20, 128, 20, 64, 64); + } + t2 = (*clock-start)/18.2; + + + start = *clock; + for(i=0; i<100 ;i++) { + oldDrawBmp(VGA, 20, 20, &bmp, 1); + } + + + start = *clock; + for(i=0; i<100 ;i++) { + modexDrawSprite(&page, 20, 20, &bmp); + } + modexLeave(); + + printf("CPU to VGA: %f\n", t1); + printf("VGA to VGA: %f\n", t2); + return; +} diff --git a/16/modex16/pcxtest.exe b/16/modex16/pcxtest.exe new file mode 100755 index 0000000000000000000000000000000000000000..de765ece05216f2d419837866388d044bac54429 GIT binary patch literal 36196 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 SV-K$&a@|Mnj(5FAQU47faU*~L literal 0 HcmV?d00001 diff --git a/16/modex16/q.pcx b/16/modex16/q.pcx new file mode 100755 index 0000000000000000000000000000000000000000..a51d634c2db82a406026788c0fb54f3072ac56ca GIT binary patch literal 6621 zcmb7}J8vA<8HSGn1PFo@E>ybM(glkxw%EeW6#4-yh`=S&xtuCM00M!2f_{J#sMHT& zse)XR;#I4wFS0EqDqREtj08c7$@9G5>}nZpWBG9B%=zB;yPq?&>)-zR&Tkt3{?h*F zrT#r?k6L^5$PX@iPWSvb@Za7r_>l|KcIU6{PW$t(-rZS|f7$h$HcW@<#q^st{k9!V zkJ|LVxg1R|xGviCNt@oZuN#2l>2aI>hgD`bT)0Dct?+d?uKc^5OrJN2XQS+8=|T1{ zh_7zRo+CSL@_t5!qLb$Rb$i{W&yb-XP5)%}#@Uhb2%j>)i0~iGeozH|36A)hyQ|!u zwd=V4w&^y87=c^@xe4TinS_^Zfu=K+0D_Ja=d3S-V)dD0!SZ>`5g_R@O}cx=6#x!G zeqqu?#totX_=KBdkpzgmfG=aH8M-bM@|4+$NFxSOP%@`CBbMtqAq8?K7OQ*~lu0?K z0|XiCfRDI67tFPi4XY+VSbrKlctNf%0Ups5qfTI?fR%zV*PHA1sz6mmx(G$li7K2q zr5&!@3o!QASZfqbu>GS+3iXRqU^EAdafFmN9{t5Uv|E z)URPUj&oI=0FP~<>vj!y6Gx)K;XLI8XL~fVVJT?}_=r$i8KyjdnPbeRT+l$a#Oe<} zH{lc>IF-8|lf6)3bQ8 zyEDDx5m8Y@_eQu;dyLu_vs7u-C6!U{><^r7#!kQ1q%CzlxI&*v7*fyfsQQ+2SJGj)W_K@09c_qO| zE@T>omWQ@XE2l^tCTjOj1~JkI*2SGDY0bc*j4BCA+^EFMwmVPMQdkBCr8do);? zt(mH;UbwJk!e?EuCy9hL*KDgeOy74nf_U$MLC_ds$OBSJ(l0E~=C@6-Dccs2M%mt1ckm=$RZa{b(f&D(2z)fOUr^G_(TJjH*-p9;QQb`(O zIjarJylqO0*?gx#nSOl7VFMHZm=?|tbup>ig2u9(wDclyo13d2?&w|GaT<^ps8*! ziU1}ndAzQeq#W&ld<3aOQf68suXH<1Hn%y})pzyO6t6Ad@rnWw0UZu*X=U8r1&%wF zId$vnih|>`4@4AO7ASvn<{7WAc*M}dap5Ii8Er`98*1KnVA=KF2~|ILF~dqSLATn^ zvm8xhqk%!5LegalB}`nM(1)vEHDWg zH`wH<>-P{*6l2EzfseA(fy2v(5Jmt&!x^-=cda;=>f3m!>X3Y<`*?u`o)C-m4NLeu zk}B~k@X>w=g|==#YsWL)_h%txg_|^y_ZPZ!iW{qMAy1L!=~S=EYGC+sA!qd>b3>8v zBd)BNOXREg6s1?l51=s}K9($MWr=`R@i48Z)RFfYDPwm>c9!nR69**tbp|N{bG^;# zu`RILvPmFP_N#A&wMT)Wyy^{^IUPV9j4ch6ei(}n*_V?iI8_CMO-#l18OjYcfv)F9 z;fBp-GCb()6Sp{)%EfhuqK~<+AWO7sD2DycX5`ijxtjezrF%Sm!<67Oo@b-Y5L%?cc%l5O@ z6-)|Y)EGv4fq90e;-IZIh369`vZ9%+0OoBWUlOV>3^6S;cE6cXF;;`k&q*jD7Dl~- z3-v!+Uo4iu@`}LM|Ku(SV5v+HZ8DT};Q1O`sU-)jU_w`d8MkH9gXjlhuJ;2#g~p2M zte;2F9ux6z9iC+`FhYnrYqbKc;*kji*ltKZ=O~0e#-0E06jlo6hfr*sLyqf`#lEg3Cx-^1U#-JiQp#v-==1$}=V_ie^z$KMpSZ zjv8Q!U*3^<03?gy)HBiVdlx*-%^5#A84_TO;V23-l)RUULl^CL`6>FB{FvR^-Me=u zlgZA`&U`+TSkKaBwhubuc_W7~UQXgX8UR@OU`*YPc=fSluo-JRHsrhc}1APlvUP2IZvVw@zrWjmx!d=SFZ39-F(t@j(Inkc9YM#+k%bN?Sh@1Zo1RWcDm1Zy3X-=w=?T@ UrrmA9#_D##*8k=5`#=2YfBZinjsO4v literal 0 HcmV?d00001 diff --git a/16/modex16/rarity.pcx b/16/modex16/rarity.pcx new file mode 100755 index 0000000000000000000000000000000000000000..8e7e32fc365cbfd912284560ba15066047470dd1 GIT binary patch literal 8229 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 literal 0 HcmV?d00001 diff --git a/16/modex16/scroll.c b/16/modex16/scroll.c new file mode 100755 index 00000000..8a960eee --- /dev/null +++ b/16/modex16/scroll.c @@ -0,0 +1,363 @@ +#include "modex16.h" +#include +#include +#include "dos_kb.h" + +//word far *clock= (word far*) 0x046C; /* 18.2hz clock */ + +typedef struct { + bitmap_t *data; + word tileHeight; + word tileWidth; + unsigned int rows; + unsigned int cols; + unsigned int tilex,tiley; // tile position on the map +} tiles_t; + + +typedef struct { + byte *data; + tiles_t *tiles; + int width; + int height; +} map_t; + + +typedef struct { + map_t *map; + page_t *page; + int tx; //???? appears to be the tile position on the viewable screen map + int ty; //???? appears to be the tile position on the viewable screen map + word dxThresh; //???? + word dyThresh; //???? +} map_view_t; + +struct { + int tx; //player position on the viewable map + int ty; //player position on the viewable map +} player; + + +map_t allocMap(int w, int h); +void initMap(map_t *map); +void mapScrollRight(map_view_t *mv, byte offset); +void mapScrollLeft(map_view_t *mv, byte offest); +void mapScrollUp(map_view_t *mv, byte offset); +void mapScrollDown(map_view_t *mv, byte offset); +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); + +#define TILEWH 16 +#define QUADWH (TILEWH/4) +//#define SWAP(a, b) tmp=a; a=b; b=tmp; +void main() { +// int show1=1; + int tx, ty; + int x, y; + //int ch=0x0; +// byte ch; + int q=0; + page_t screen;//,screen2; + map_t map; + map_view_t mv;//, mv2; + map_view_t *draw;//, *show, *tmp; + byte *ptr; + + //default player position on the viewable map + player.tx = 10; + player.ty = 8; + + setkb(1); + /* create the map */ + map = allocMap(160,120); //20x15 is the resolution of the screen you can make maps smaller than 20x15 but the null space needs to be drawn properly + initMap(&map); + mv.map = ↦ +// mv2.map = ↦ + + /* draw the tiles */ + ptr = map.data; + modexEnter(); + screen = modexDefaultPage(); + screen.width += (TILEWH*2); + mv.page = &screen; + mapGoTo(&mv, 16, 16); +// screen2=modexNextPage(mv.page); +// mv2.page = &screen2; +// mapGoTo(&mv2, 16, 16); +// modexShowPage(mv.page); + + /* set up paging */ +// show = &mv; +// draw = &mv2; + draw = &mv; + + //TODO: set player position data here according to the viewable map screen thingy + + while(!keyp(1)) { + //TODO: top left corner & bottem right corner of map veiw be set as map edge trigger since maps are actually square + //to stop scrolling and have the player position data move to the edge of the screen with respect to the direction + //when player.tx or player.ty == 0 or player.tx == 20 or player.ty == 15 then stop because that is edge of map and you do not want to walk of the map + if(keyp(77)){ +// for(q=0; qpage); +// mapScrollRight(draw, 1); +// SWAP(draw, show); +// } + } + + if(keyp(75)){ +// for(q=0; qpage); +// mapScrollLeft(show, 1); +// SWAP(draw, show); +// } + } + + if(keyp(80)){ +// for(q=0; qpage); +// mapScrollDown(show, 1); +// SWAP(draw, show); +// } + } + + if(keyp(72)){ +// for(q=0; qpage); +// mapScrollUp(show, 1); +// SWAP(draw, show); +// } + } + + //keyp(ch); + modexShowPage(draw->page); + + } + + modexLeave(); + setkb(0); +} + + +map_t +allocMap(int w, int h) { + map_t result; + + result.width =w; + result.height=h; + result.data = malloc(sizeof(byte) * w * h); + + return result; +} + + +void +initMap(map_t *map) { + /* just a place holder to fill out an alternating pattern */ + int x, y; + int i; + int tile = 1; + map->tiles = malloc(sizeof(tiles_t)); + + /* create the tile set */ + map->tiles->data = malloc(sizeof(bitmap_t)); + map->tiles->data->width = (TILEWH*2); + map->tiles->data->height= TILEWH; + map->tiles->data->data = malloc((TILEWH*2)*TILEWH); + map->tiles->tileHeight = TILEWH; + map->tiles->tileWidth =TILEWH; + map->tiles->rows = 1; + map->tiles->cols = 2; + + i=0; + for(y=0; ytiles->data->data[i] = 0x24; + else + map->tiles->data->data[i] = 0x34; + i++; + } + } + + i=0; + for(y=0; yheight; y++) { + for(x=0; xwidth; x++) { + map->data[i] = tile; + tile = tile ? 0 : 1; + i++; + } + tile = tile ? 0 : 1; + } +} + + +void +mapScrollRight(map_view_t *mv, byte offset) { + word x, y; /* coordinate for drawing */ + + /* increment the pixel position and update the page */ + mv->page->dx += offset; + + /* check to see if this changes the tile */ + if(mv->page->dx >= mv->dxThresh ) { + /* go forward one tile */ + mv->tx++; + /* Snap the origin forward */ + mv->page->data += 4; + mv->page->dx = mv->map->tiles->tileWidth; + + + /* draw the next column */ + x= SCREEN_WIDTH + mv->map->tiles->tileWidth; + mapDrawCol(mv, mv->tx + 20 , mv->ty-1, x); + } +} + + +void +mapScrollLeft(map_view_t *mv, byte offset) { + word x, y; /* coordinate for drawing */ + + /* increment the pixel position and update the page */ + mv->page->dx -= offset; + + /* check to see if this changes the tile */ + if(mv->page->dx == 0) { + /* go backward one tile */ + mv->tx--; + + /* Snap the origin backward */ + mv->page->data -= 4; + mv->page->dx = mv->map->tiles->tileWidth; + + /* draw the next column */ + mapDrawCol(mv, mv->tx-1, mv->ty-1, 0); + } +} + + +void +mapScrollUp(map_view_t *mv, byte offset) { + word x, y; /* coordinate for drawing */ + + /* increment the pixel position and update the page */ + mv->page->dy -= offset; + + /* check to see if this changes the tile */ + if(mv->page->dy == 0 ) { + /* go down one tile */ + mv->ty--; + /* Snap the origin downward */ + mv->page->data -= mv->page->width*4; + mv->page->dy = mv->map->tiles->tileHeight; + + + /* draw the next row */ + y= 0; + mapDrawRow(mv, mv->tx-1 , mv->ty-1, y); + } +} + + +void +mapScrollDown(map_view_t *mv, byte offset) { + word x, y; /* coordinate for drawing */ + + /* increment the pixel position and update the page */ + mv->page->dy += offset; + + /* check to see if this changes the tile */ + if(mv->page->dy >= mv->dyThresh ) { + /* go down one tile */ + mv->ty++; + /* Snap the origin downward */ + mv->page->data += mv->page->width*4; + mv->page->dy = mv->map->tiles->tileHeight; + + + /* draw the next row */ + y= SCREEN_HEIGHT + mv->map->tiles->tileHeight; + mapDrawRow(mv, mv->tx-1 , mv->ty+15, y); + } + +} + + +void +mapGoTo(map_view_t *mv, int tx, int ty) { + int px, py; + unsigned int i; + + /* set up the coordinates */ + mv->tx = tx; + mv->ty = ty; + mv->page->dx = mv->map->tiles->tileWidth; + mv->page->dy = mv->map->tiles->tileHeight; + + /* set up the thresholds */ + mv->dxThresh = mv->map->tiles->tileWidth * 2; + mv->dyThresh = mv->map->tiles->tileHeight * 2; + + /* draw the tiles */ + modexClearRegion(mv->page, 0, 0, mv->page->width, mv->page->height, 0); + py=0; + i=mv->ty * mv->map->width + mv->tx; + for(ty=mv->ty-1; py < SCREEN_HEIGHT+mv->dyThresh && ty < mv->map->height; ty++, py+=mv->map->tiles->tileHeight) { + mapDrawRow(mv, tx-1, ty, py); + i+=mv->map->width - tx; + } +} + + +void +mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y) { + word rx; + word ry; + rx = (i % t->cols) * t->tileWidth; + ry = (i / t->cols) * t->tileHeight; + modexDrawBmpRegion(page, x, y, rx, ry, t->tileWidth, t->tileHeight, t->data); +} + + +void +mapDrawRow(map_view_t *mv, int tx, int ty, word y) { + word x; + int i; + + /* the position within the map array */ + i=ty * mv->map->width + tx; + for(x=0; xdxThresh && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) { + if(i>=0) { + /* we are in the map, so copy! */ + mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y); + } + i++; /* next! */ + } +} + + +void +mapDrawCol(map_view_t *mv, int tx, int ty, word x) { + int y; + int i; + + /* location in the map array */ + i=ty * mv->map->width + tx; + + /* We'll copy all of the columns in the screen, + i + 1 row above and one below */ + for(y=0; ydyThresh && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) { + if(i>=0) { + /* we are in the map, so copy away! */ + mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y); + } + i += mv->map->width; + } +} diff --git a/16/modex16/scroll.exe b/16/modex16/scroll.exe new file mode 100755 index 0000000000000000000000000000000000000000..237625209c1e852c181a9daaff3091d00438534e GIT binary patch literal 18566 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 G$o~Q>h&k&3 literal 0 HcmV?d00001 diff --git a/16/modex16/test.c b/16/modex16/test.c new file mode 100755 index 00000000..c5b9d7dc --- /dev/null +++ b/16/modex16/test.c @@ -0,0 +1,75 @@ +#include "modex16.h" +#include + +word far* clock= (word far*) 0x046C; /* 18.2hz clock */ + +void main() { + int i, j; + word start, end; + page_t page, page2; + byte *pal, *pal2=NULL; + + /* load our palette */ + modexLoadPalFile("gfx.pal", &pal2); + + /* save the palette */ + pal = modexNewPal(); + modexPalSave(pal); + modexFadeOff(1, pal); + modexPalBlack(); + + modexEnter(); + modexPalBlack(); + + /* set up the page, but with 16 pixels on all borders in offscreen mem */ + page=modexDefaultPage(); + page2 = modexNextPage(&page); + page.width += 32; + page.height += 32; + + + /* fill the page with one color, but with a black border */ + modexShowPage(&page2); + modexClearRegion(&page, 16, 16, SCREEN_WIDTH, SCREEN_HEIGHT, 128); + modexClearRegion(&page, 32, 32, SCREEN_WIDTH-32, SCREEN_HEIGHT-32, 42); + modexClearRegion(&page, 48, 48, SCREEN_WIDTH-64, SCREEN_HEIGHT-64, 128); + modexShowPage(&page); + + /* fade in */ + modexFadeOn(1, pal2); + + + start = *clock; + for(i=0; i<5; i++) { + /* go right */ + for(j=0; j<32; j++) { + page.dx++; + modexShowPage(&page); + } + /* go left */ + for(j=0; j<32; j++) { + page.dx--; + modexShowPage(&page); + } + /* go up */ + for(j=0; j<32; j++) { + page.dy++; + modexShowPage(&page); + } + + /* go down */ + for(j=0; j<32; j++) { + page.dy--; + modexShowPage(&page); + } + } + + end = *clock; + + /* fade back to text mode */ + modexFadeOff(1, pal2); + modexPalBlack(); + modexLeave(); + modexPalBlack(); + modexFadeOn(1, pal); +} diff --git a/16/modex16/test.exe b/16/modex16/test.exe new file mode 100755 index 0000000000000000000000000000000000000000..99404b1a3666201b98a9dba2cbe162f0e6a6d49f GIT binary patch literal 17260 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 mmFybtbc=X(B literal 0 HcmV?d00001 diff --git a/16/modex16/test.txt b/16/modex16/test.txt new file mode 100755 index 00000000..05adc9ec --- /dev/null +++ b/16/modex16/test.txt @@ -0,0 +1,258 @@ +64 x 64 Pixels + +0 0 0 +20 0 0 +0 20 0 +20 20 0 +0 0 20 +20 0 20 +0 20 20 +30 30 30 +30 37 30 +29 32 3c +3f 3f 33 +3f 3f 26 +3f 3f 19 +3f 3f c +3f 33 3f +3f 33 33 +3f 33 26 +3f 33 19 +3f 33 c +3f 33 0 +3f 26 3f +3f 26 33 +3f 26 26 +3f 26 19 +3f 26 c +3f 26 0 +3f 19 3f +3f 19 33 +3f 19 26 +3f 19 19 +3f 19 c +3f 19 0 +3f c 3f +3f c 33 +3f c 26 +3f c 19 +3f c c +3f c 0 +3f 0 33 +3f 0 26 +3f 0 19 +3f 0 c +33 3f 3f +33 3f 33 +33 3f 26 +33 3f 19 +33 3f c +33 3f 0 +33 33 3f +33 33 33 +33 33 26 +33 33 19 +33 33 c +33 33 0 +33 26 3f +33 26 33 +33 26 26 +33 26 19 +33 26 c +33 26 0 +33 19 3f +33 19 33 +33 19 26 +33 19 19 +33 19 c +33 19 0 +33 c 3f +33 c 33 +33 c 26 +33 c 19 +33 c c +33 c 0 +33 0 3f +33 0 33 +33 0 26 +33 0 19 +33 0 c +33 0 0 +26 3f 3f +26 3f 33 +26 3f 26 +26 3f 19 +26 3f c +26 3f 0 +26 33 3f +26 33 33 +26 33 26 +26 33 19 +26 33 c +26 33 0 +26 26 3f +26 26 33 +26 26 26 +26 26 19 +26 26 c +26 26 0 +26 19 3f +26 19 33 +26 19 26 +26 19 19 +26 19 c +26 19 0 +26 c 3f +26 c 33 +26 c 26 +26 c 19 +26 c c +26 c 0 +26 0 3f +26 0 33 +26 0 26 +26 0 19 +26 0 c +26 0 0 +19 3f 3f +19 3f 33 +19 3f 26 +19 3f 19 +19 3f c +19 3f 0 +19 33 3f +19 33 33 +19 33 26 +19 33 19 +19 33 c +19 33 0 +19 26 3f +19 26 33 +19 26 26 +19 26 19 +19 26 c +19 26 0 +19 19 3f +19 19 33 +19 19 26 +19 19 19 +19 19 c +19 19 0 +19 c 3f +19 c 33 +19 c 26 +19 c 19 +19 c c +19 c 0 +19 0 3f +19 0 33 +19 0 26 +19 0 19 +19 0 c +19 0 0 +c 3f 3f +c 3f 33 +c 3f 26 +c 3f 19 +c 3f c +c 3f 0 +c 33 3f +c 33 33 +c 33 26 +c 33 19 +c 33 c +c 33 0 +c 26 3f +c 26 33 +c 26 26 +c 26 19 +c 26 c +c 26 0 +c 19 3f +c 19 33 +c 19 26 +c 19 19 +c 19 c +c 19 0 +c c 3f +c c 33 +c c 26 +c c 19 +c c c +c c 0 +c 0 3f +c 0 33 +c 0 26 +c 0 19 +c 0 c +c 0 0 +0 3f 33 +0 3f 26 +0 3f 19 +0 3f c +0 33 3f +0 33 33 +0 33 26 +0 33 19 +0 33 c +0 33 0 +0 26 3f +0 26 33 +0 26 26 +0 26 19 +0 26 c +0 26 0 +0 19 3f +0 19 33 +0 19 26 +0 19 19 +0 19 c +0 19 0 +0 c 3f +0 c 33 +0 c 26 +0 c 19 +0 c c +0 c 0 +0 0 33 +0 0 26 +0 0 19 +0 0 c +20 3f 3f +10 20 20 +20 3f 0 +10 10 0 +3f 3f 20 +3f 20 0 +3f 20 20 +20 10 0 +20 0 3f +20 0 10 +10 20 3f +0 10 20 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +3f 3e 3c +28 28 29 +20 20 20 +3f 0 0 +0 3f 0 +3f 3f 0 +0 0 3f +3f 0 3f +0 3f 3f +3f 3f 3f \ No newline at end of file diff --git a/16/modex16/test2.c b/16/modex16/test2.c new file mode 100755 index 00000000..9118279f --- /dev/null +++ b/16/modex16/test2.c @@ -0,0 +1,19 @@ +#include "modex16.h" + +word far* clock= (word far*) 0x046C; /* 18.2hz clock */ + +void main() { + int i; + word start; + page_t page; + + page=modexDefaultPage(); + + modexEnter(); + start = *clock; + for(i=0; i<500; i++) { + modexShowPage(&page); + } + modexLeave(); + +} diff --git a/16/modex16/test2.exe b/16/modex16/test2.exe new file mode 100755 index 0000000000000000000000000000000000000000..2b870eff82dc4159ec20cecb40d7e0287b92bca1 GIT binary patch literal 17028 zcmdsfdwf*I-S@fdEy?Br#vq8WAf`kR6Gbp4K!mU>eKZ6D0dJuQc&P|BIVY)Y2uoKq zlS9&KAM2&HO4ZiKS`~}!68b>MXcEBD1S~{Q?!wueh=IgSNR~bCcg`lLt^XC0=FH6RGQaB_?zro5VZ7iFY{DMFG}qV!mmr)@5Co49`+LkS2=+ul_&I)i@%swD z@kxV?xP53`{1yH#RRmK7{kI7Vix-nG0-f&K@*dqK>bDA6`)a*C`ftVA8~S_1%5MFP zKsxU&xr-JC(**tDgr!9btrwD-yxl^z_k3;1`P$<1!4yHiBMBYvx|;^m1$|CJ(Sn7= zORSz(Y_1ZCH?rA}Yjjh4T|;e^zT+3-YnT4E#S6j91pP&`-sT9tFYDuz>IIP(Mkdvt z6oQSiJ_vWaS%CO3)Ak5h?Aoxqaz@nFx+;u0`EeX07AC!gAWhTeX`uK%0 z0Nmuf1wxMnLO82|c>9RAzu6nf6Pvx!E`b9@dV#?hNTijI$uV|?pl8P~1uBLHI!CDH zbG7MhdhY}A+H`G+M2f>=6DjW*8Wqhzmgb8eL>Bq@n{iwCxS@q+VK7P1kHztUEezW* zYBDK^XiHpe9c>+&&(V8A+{G(=Ha?f=jck!I@P5788`X*vq8jGNd(BPu@cWDI`pYa#|K43w9L)@KT>sk5`#$S_-KB)xyMlgWHo>c>IfX%wpu6zeAmiZe;y!Ye?A2_*H)(x-i?sj5m5uv>{Vvk}t*7(aA`5cT*Lyjd;VGe**^8H$R7K$L1Gs?cDr3T+eFdeSy<*&1@hiBA4`$ zBi2(VP!;y}$x2+9%Bro&8%+)hFV{6_J9^Ce_vLq_v$JcSh!?cF^JYzZ%@YyxYz=*5 zo)TBn{!TKA-EZ*Ps8uWP2%Bb|OHlV&yw+$F3WIJzAL{~sj*z_z%nF-XA!Y3?%Gyo3 zbxGjJ8YAeYa|jV>91;Db9f+t(8U(fXgqF&I?9;scmoT9f_wl+8Em8BjdRIwei`Wi0 zH7~g7tmbtCZ#4z|{^RmH;=W@5SM#2IT~_QtQ81*e2CeukXCJY3aEc5JbzYk*P4b>4 z-X37UW?>)(efmr0%oo7#>JQ~O(|snwk|Uk!xhK$Co;S9{{TDfekl^q6v& zSr<0dmAF(e8@ zNb2}EBz^L|Ncv-_9s3G=amM~__z!}(-(d+*-rDmP@fOFnMGLs)a&SibPz$)m&CA$U z+T6iS(vMB@&6eR$;myCdHp|P_X88l(ESq1&wQF#XbYPE=BXYUh+A(LrP=j0KJXoR6 ztp7+3x`eN=)wNc>U&d@|sB72i`b}$NygCmXrTbNjiC!J6HOb%-txIc`IWzT{bxDHy zQT@mAJLcKY(TkS!IBSE%Bb2lS^Pr`AyGi5h>h^H^b7X&go?wi%`t13>KIoCPPoE<| z$XlIW`yV>hH<(7d)g$nIJ;LqAdxgPxL0@GXqJYFPaCGBg)k#|PWulR@(JY^yb=XMB zomFmcdUB;ai)$IVYy|m8JW^wu*jkOc-1X(hc$;9H2(Fa%iQ;^zIBI-gZ2~ONCFnLj z{X()UYhSQg)<-*W-!1E7oMf-KzuF1SEXb8#hUQ)1GPPY^7!+hZ&Pf_KHmE7V@j{{g zt~2ny6f{kJkCU`=MFes4j*Kyj$u4q0vu$ipWc@RzzQZK8`dI?jUKLL$ULUp~I2-Sm z;(c2%YU(vkZED!(NKxZSyS_7_+U7MNdG!`|iG@q3p*yW%mw+q>>sJW+w0P3Q$0-Wl zk8!RY8fUhXoZBwQ^`b!f^f%q4OW){TX4G?7uaE)iww3aBQ2-hFqF;!H*7WhFi_$ku zAk9e&`MSh$13)ZWCD1T004q39r`ngn^!v~IUaQ6k-5_5 zH7Nd=7j6ET4>(-P<-sQa`xFOg06>42z!7C`kB@3qQ8L%zpSj9mS10)g+-iE(;cz~PF_o`>-4yhk9G`irt*@;QUA1)%@o2Su zj`3O6VXZu>DGqSllZvC-HYYHUS=q@o^Uq*9K!Us`aug2QB*lc*ZxQr$E|?uL%5BB! zAGHs1K()OViqsp?&qg(Gxc7eO-e?wR1dZH-?rFhK(0ev|OT5$D@tlB*KoI^^7gycr zKhfatZ%~t~clnRc;+2oZRexaEsz2BwKE7KS1vQ@CU+Gkb<#?lIZmqmWJW@S5x_gds zBGwXA?Pw|8GPsBxSVTmh7tbv&t?K-sX{342^UcGJxWeEBLH|Hlx*!H!8n-~&NJ*4~ z_=0l~#Nr?avDP*S;%m0S(G#Mi0BSM{2?tmqVz{~H?L(nFN+3OZPgu&dpLow}-p;mT z`hUvcdv6CGdXM+sAJre1i4%OBQ_@+M#!XJSyo0o$L0c3RTZwIs@x|aw;foxO4RJ9z z^xE8{}Z1k9o*B^4>l zS3K;QU%smJ{?%(M#wErJLa0ud|LCeUo+Znb6>A^y%(;Hfq)A!RJPXw|*DZSJkyW0u z$I6sdk4*6tt}Rs_TDzvqGiU9ikCi_3z=Mis;))DU(PQ^5FIzR)GjGj`DW0tCn{U4E zhRntXiS0T8ViJ)+(M=Yu2g{Jm`63 z)gx<5A4A=WwQB@f7}$1JuG_W!f-^vq{U^K9$(VXEebbn&qIfb^Q`bg5L+w9Aa)_HB z{9n3%CTtRQhL$7=n;J59W$!8F5C`vdZ`z}eNZiyw_P3pk{Zr-bQ4_DfE0X;pP2ap# ztZT@iTYt#LZ8}=lymNz4bBFn!5P8Sb{Z_4N)?+P=>Do*zfz12_>u?+p75UcgS0^^S z@s9Au{H>X6T>2mWCZ<=X|6L>(a^=$N>&8qLGQwG3YPLj=X9hrw)AFSmH&0i^x&B6a^~9TAFYd3Z{p6!`GOeADd`OI~hMeTH9;$03QyN8rskdEl?p!HnTzE(5ej_mR zeE@nzFeB-e_r*;~P2wvpxa|>N`4G2{#H=ra6O&$PMR}hXG~u7P^&8!V)_9THnSxN) zxGhBpiemTMOO;GQgSkM^KOS=x6)vntmZR%fbZg?8pp+hp1O2V?}U|XwgDK&9t|~dQ;%;_R)C$V5YqzlJ<~s5x`%1ZVes2ShTPh z6D-!IopJ!Oso6~xE;tP5vl}bskZw(pQ0e|wMN$a>99-TZM_+Qi zJLugu!NL;-xY~k{Wx`3SiflZrxN_3Mk~)lxsIldimL=vcS4aAH|H8;5vy3k*?Ec-N zaZPT8ih^W}4#o-kCrMfRVxBoy#1&%#RS`ic$lAyEt#Zf4eabuxw4&^E?xeC&Mn~?N z($f_#tIu5HP_Cl3Z#0$hMk}ua54eq{-22q`QFpoV4=hX+{JUjitC74DuGC+Q(YX0{ z=NYenhfqoujpt*fA4H8`ZZy?|4KsTrK~iOOB6~s)m=>s7c|2*ZZuPHpL^4ms-Q&=g zCFPc?4`(%msiep-Rl+n+S>pdt%G$TkEO!+y(KAv4@4HC8Yldkm4_ZMDtiy{ z*C7aaAa}TU)m%h9!ql(0VQG-AtixHm^?x|9of1<>7uX#xssBUK_*0mQ$_QAHylbjE zh0k{x=BxLMMs0AMV4QL186Ae5_cic#PjXg+(J(|Oi8MoAd|F!^MN?kXvL~I^Zn~3Z zHRxBQ@XeqMFRZaG$ULPLaE;oh+fCeBjrO9f!}@zBb~CmvY0}2%4j9$LcXl|mt3d1N zITeyJo*XsK@q$eoYaE9mBr7g%P8_z26y zD(|rc*4w~5;e4k@apUSx96`aO??^@y$T)!b3$a07W;XawO_(7}P;UrSA`URwB9+dP zNh2ty4i8jHLe&kBu^a|{Z?f^0HoDr0PGF`GhP5dv(0*DfWUf9ch2%>H)9#5k&Z-Xo z?T!?q$r=ttkFg!nP+xAsFtfuDyPKNxCDW;mt?`+er+{48df1kMN{6T<;3}y3&G`;d zfQ2urvpBNePQYva`3?`N^3oGZP)H`Jx@v^u-ho; z%MGQRWNX*CI07C{j%x<-UCJ;Z83@)>2T*ACaSqRSx)iXrnReO%f^k8Pt-jMVjdS{n zWYTQBz|jM73tLW~o=93bzr}b>iOcaxN<28L8{mKpm|1V-g+VD4U$_vFC~)mwpawfP z^k=v-FbJVw@bDW!TV^o>$}bBVOT_&(@UTc%y%n#rT=D-MHX}Fip4!*aeqc}M2W-u7|x^oeW+l!=7M%b zMb^GJu4wyv%Pq6Ggc{dy+U}3bYT%?bV3X?iCx(`CHuGp5-FDvEaa|5c@JsRW}tluH(1+3-LDPX-Tmq^|9oePI6_<^X+8;1AXMga+JJ$@ zCRDqAE-`dFq_tI7z{g$&ayc*qEQV%q9MIGQ{}RE)Q*-o$WY9EIxpA-`w+|c}cVn!p zOjKbnBK(EvZ2E5#L-8hm-Uh)s-zgfencn`Ks(y8=F+?iI!Ug0I*$Z6{9EljCNg%D< zbKwrM9D4U#w5rDzO$8;siwq#5 zIFhkMvN+X;j=%vY?T`4IkXiXQ6s(;JkpS{xTSE^F2vWH{^Ds!yy8+wa@ab+Y6>i}q z2Nk*Z5#wdbshH>*q+%zi_;NyMrfDJg1#t930}x&;ln1&hZp3^upqIS;p-j_~5?eKF zsZYf=%wz4fd=$*vC2gu!6|T(}iM__gJ!HP+M+Mda`s@F#LuzI?&_7BY58%K^DWM;k z5We00!0KN^iy$KPGrZgqy3MQ}F$ZMH-m5+p$}zbE&BG2p>G|vfl@4`8_O6P{wDmS^ zu5FSNRqGQ~TlTIpCro~9Sc>iPl?cs}F<&yi8WdT)4oGbFA#P8mL)r}PN;llQqo5d= z$D!P9Ns`<^zo2Y-s@HH-d$8p#X+iZ|ZrB~% zxKHiexO<(>?S|hujAKSI1}$5R>MuEgu1~Z~Uy1C0o?E}(@Fei7w`b&j2%STdygg(u zirm(*aZ-!|_gK^FAG-OJcCM{!fw}P})aR4sV*>q>`bClCV%qJMY-ss!ZfYM3!+qm!*hYno#cr45dmRr+Ik5> zx)M^>M&N;|@M?%E!Kw^U33?K8hR@2qCrjf|?cUU^ea7qAt>qGFgw)OMR$oRZvN)di zGY*({Bxw~AhQ=Nwl{VwuAxPkBLFpbPtrir!;PJ?z3L$V-3fn~GYb_OV6#t1R=@$2g zouax%9zjxb?scfLHI#&z$h|hQUV_HpQ()EonoYhO>Mr|$IzzTY>JfX+68^$^=mD+- z&H3(}3P+hM$LA`Sxno$uWhO7ilNM_gF_55CNh-(Jky1JI69HCW#Y+GakI&&1ZCMg& z&*R}T?u)u%=X2!;d7s^0HUT0uqrL4!c6)iDHd^e~oXB*^5M6v1IwwR$`a{*Q#^8hB zfZs`uvLmIR#cuz^%?QQHyRk8S!vi!0o=`P3Q#~w;KU?pn8ciJPxk=CwX2O7tL<3_;0>)zJCrY4sKhkxhNHA&f3bT*q+_2 z&Ix#<2$_PLMWquH(-(g?;t=1sp$Ew!$mzg(*w0D0 z3W^*m6=Jpwtd~=0gSEGkTYC{}^>#@4h-^8oT;D5+{*_MTjk&vcyHngYaV%VlF4C_D z5h$?i2CD<n8aaU|0Yd4QaVW?dIanHtvb#myGfS1)}yf=31 z7XoyoVh{93)o!h-FJPBojm|}Yysz0V2pC)r`b916TDf=MxYn$FulrS=YN&2~j+`gE zw&wD&H}1oz&k3oXzrjGlMq>k4+O;L|nzJyg zp%CE#v)lpwpgRPF2%xv2tkEIRiTF}VZ2?T&B&`_vV8qkob$b;1maAQ`KCDTPBEgmR zx%306KuHg*Y`B9?r`mxMTDU-K-l03R(b$_;=B$T9PL3Go{C7BHZ5GMZrggyo#&0?o zPMB6p>folli{Q>Dfo0yp%h+Ofeo5Mlla?L9UxUI)-Ts-lVW3AUyB7wztat-7$@ogU zN79x!G~0#~a^5Q)4v=MAl0c4THY^$AtbQNv$e-bkys?ZdagckY&2arIY-Ad4Hqt(L zv;+As-QbxiWn?|_ZVkavLcN@)e-f*+*WTkc-VEB||3wki?7cZy@ zcvVvJAgP`ZU=8TS2Apwdbju}&th)tnOYxQ(;U-mZ=OJeLI)PG*VpE)G zLeevcn;;omV2-bjVzYh z_OcWQu+fu93(~2t4kukP;BCSVBz=?t z!+}o)eV)lp zcky_!*XWFYO}ybDNXi7(`h0KZ~5qI9QrPS2ccdaYp#y9Zme*?X^M66pvzS5WQ+h8 zST-?tJpc0oo~-ymXLU>FDdRM^Ysf);V+y3dLmj^HaCs60Z@m9QKO|w7zIYe`c)I^0 z7^-Li#IY51{K-X5pP7A#eaNt=7Z!eKIF=O8%bz=Mpv*~`i?TS%;wej@ z%uQJ$Wl5AJQu+ehq7^$ zji>Bt$|lfIofLXTVn3j4B4rtrT}#;{$|h5G9c5D}yPmR4%CacCfwCJZn@ZVDlue^- zI%PLgSV-&^%5o^nrECUeGbx)zSsrD#QZ}2iIh5s7HkUFlWj@Moqih~!KcwtGD7&4q zJ18rlY(8a$lr5laA!S9BEuw5OWyO>&p=>E-cT#p2Wp`6{4`ugKRzle_%6>%Ia?0+b zYz1X2DO*L^{ggdG*@KilMA?ridziA-ls!V(8p_sE_9$gPp{$g$GRhRnRLaUJtDx+s zls!h-&nWvjWtEhzqpXUu^_2N3+d$bbC<{>bIAt3tdxEkjDXXT8P*y{kM%gCHYALIu z?3a}Nin6CDdz!LeQ}&;fJww@VD0`N&=O}xgvKJ`(EoHx>>_y6cPuWY9y-e9=%Kkvv zE0n!T*=v;jk+MHg_Bv(%McEsa{h6{iDfW@A5z9B z`-rlSDQl&yjk0}|?WgP$%Kk~&0m=?i)=t@{lpUh%FlC=n_BmxoC_75oG0Kipc7n2# zl%1mN3(8JYc7`&YvJhn*lo^zDQuZZfXDR!NvM$QbQFflPZpwNn`FJ=UlIBfMiM7jAU%uyQ1aDUpp{pc-jTyERXK{ z(@n8&$7iBH$rO1g8hWwW(SdA*6~X6Xapoxuaw{)QJ!K{ECUTvQz^EPGs+Gzhi199 zZx%<4aa#CQrfLCj(z_afvQfSD(!pPI*n6-sCy8<(hR2&%+chZajkN-KR2^9)1RANF{vK>jKjMf zq>%?>uges~MlWb!d`>9W2;>x<~~?9A@}yO1-ahR+sg0Aou|(BSBlfrTz{oB zRh`C75I(W7ueMUENJ7(t>g^3rbIvXXGwXKlA$M%QoYmh7$!T&-joWz};iKk8`BP zcJGGy5^|7#=asSq7o8vL*>9P|{@m*nw?Fr4H4*(qukjUbE~D3dpKeUeT69F>xB5SUUOphhNU>aya=+?XMU>YB3}vRgsX+YsmSrt@9flV^PSjlFjS zuJ*yK-2oh1O|NTCN9_+ z=y^2zT-83(Wwgd7Sy;3^MX-`CQGJ4SKnUl;vKr36)!R0Y8|eslRYh+T_lix~18NE$ zMdU0iQ*LW=X8woq^?%fixUD+1z&ObxFC~#Cr-0)HgF=dj_Ygxa=|>uCgLefH5LL41OS+Ula3Jo3H5LF7DTsoE z=11_cK&`hwUAtVL>kKqYWEUss@f=^u`YUS7`{xBNn9BZ|R08Sk<#K0!ieWVSQgH4n zH8Smn-P1--J#*vesk^6r_g~jd{P~7U^;<8MzUg2 zrw)>Icp;efNV6}EYnndImqvW41QxO{h4_+iux1k!&-yFwQ|}EU;;t+V*j?IHnh!(? zYrY6S?(6H*=HonDS55vEljk&h&&Lb7H&skVA_zKjiutGISzPX1g+n>olBj;8gCk=h z$%nVtrxo{yJOhR=wAO|x)+#UJsw&Uo`cvg8T$d^ut}E3NYwEK9dFs&fLg;G5x}-cM zHDI^#1!8IVb^*(bLPNz?;EP&J#glsZl1GWRo^nkvoE7^Imo!Dat8fiZe$eB^Q>Rw@a@-#7Sxvlkq3%Xqk`GD*eZj~+pV8wuy= zM_Rrc;q{Wv*&-#2+)d8wtgg9QahRWe?3q*o)!nsS5Jv7LpYj``oIN;kHL?}h57i-M zC8a1YVa?AOPjjDi-JgxWV5jwBQ(~Ki9^oBq3UdD6on=y}h_`SD@Q2ZVZS;hu@kWnw z{Utch$56?Wf7so-KuP_pf$cn`*aq&-W41=iWYjOC&T3L849w zkZ`_iQ?48wFsiNRr$l+wdJL&T)~nx0LkB5_#AR0C7EDJ<`uvqw6sgm#)j%?Ec0pcW z|4lz8_)zhvNGDbg&!`Fl1C=Nv};=?lOCZ0mg2x)}gIqm|?*Sxb{ce~ds^Zott9EC%0j z@VQhwrZ+ZV#aaR8;87YZU4PtWY__oTL7?h<{JNds$hh}Q`k=8gm3PhjB;zkJ+uEYu zV#E#N1pi9uLX1xH!6hK-T%JI>N-OTfUfT{Af87O+wwBr@_9mb07GCr41%OZ(1L3^< z4G16ih580Cs7)~b3;i$zX))TG^W89|Iq6cYd1`!|g{qyQj|Z&hS{xyS80i#wAO-Xv zKx>WnY&G%+VFWnNR?|$g=E)0=31TK(0Og3){8hD2H1pjd4fEj(w@`r3i?dC5HUA2J zN(OU=)(jL`v1c34aA;#D%5BF)WH}Ijw5oYLbFh+(u!53sN`!m_%65kv{R+=Kb7uvy zzrG=l;n;?m6J2ob9 zD(w*Dw&UMD9$>t$%|zc%GaDwML))3QIR$YhXi!FKj95V;6myJj8`wFA;HO2;q59V#uzVu#kM(HBT-QtKn!w zy^uSn3TkZCcHiTO&uQL6g9cVHIS?3#hfHdybn0*7OhO6mZJ!O3#W?rt!l&aJ6sh;b zQ@GiBVQwwOWe?!wu3{#46`c&`KXM3jt#b`um@j_^_0QWK#vDOwI_CoI?Jh=fk zazEKa`m%OsnW#eu->PfWs`}wTmi(>e#YG~|BYLCNR{`2zAowhYer`e%T>yc;HW9Zk zkJjKINyPLYbJd#zkoba6*U;o6cJkEga?{Dd3o;0a(Rw%&UPyt&R%?2 zatUt}iWUq}@2FPN&eM4~hO`@5M90%lw)IYb3ZxuC_P{2sc?r}U?FBSIrn>*%$w~3; z7Y}3F5GZx(zmHM#5VUJ=d*G0O4?Dq6H7{Lo_)m(NXGlBe=TI7g6+^&-C~Y9qTx@{b zbSA>&ZP)*4r4$>~Yp{!t?}r{lha1Q_VE@Q>H!1oyeZs9^%W_AmqE+9rABV@be1cum zfn-vsV&CCj+UHfKiERA$b&XsQl)M0jDhQ-)P63(D+N!=ZCmW}EFJcm&P9FP8J_5xtX$xEh3`s-Q{yK@LF^7nb)CM`| zzdstSEr{UQ#sHj{EWYwlGms2Vn1NXH=`fP6O5)(@Zb-q<(;{@KKK(elh5Q9k@zUwB zcq^0>ptApDG`qX(M_3x*Xuv6mbj|HQ9wp`B?7ii8BGI3*7Y8)1s%uEsMuX!614!ia zY1F)QWF=r&;D+-V{hJPFx2xCl#5THG2S%^U-e2zF?;$sB1O^;szu%6N=Fe}JgwU^r z(2GLo8Nnz@*OJ9gaX#cAI^v9k>PklfBc055@MCBN(VWCGoZRY1pr@cOo!nu=LHz;* zZSKJ7i!hqg#YFT=H|Hmz;|%emj6|Hu!-r|_PD;cnl+q96oA71{UO;LME5$hk>&cyt z+?iETf%>p!PZzE8vDSv5keNnz#;1IM4opLi;FPt9vvMDa=$lS%N+-z{us41i*vkQ| zYY5mOpuU2Y44gJf={#RQS}kV>#mg;SXPYuT@vC^sK?BD$7@|Ub|wsvdZ)5^3|&pW!02; zq4d6QwXfx$&o8m=XutyS^b#j z;WcY3JP+chto1y&e9g+$t2{T~_voXZM_2sR8n0~J_suvsTIs6gD=``t^*t+&eO_bD zdf!9JBg-H4tX!@vpCbJGCpdiWOMr49JY`C$xqGdQCSgFsED|tBBJJq`v4J_QF-Soj~WaDqmR%B=tkvzfXHhr z`Un*rtL#IZ-El7|2QTjdAu(k(8mW}L-~ysEzq_h^`#EWI)wD2776KG z`X!1_6nMY;DlW~}RT<0pyPvmwJAwaj0#E1bf6W5|hQpy!N^5P5sjA9a+cXU`FPF>J zYPH#Hy!X4^?szs-FX~zXPCu=92lYpat88?VM8(xp@H40Hi=Ah=NLjA`B=6k(&of(L_C>&< literal 0 HcmV?d00001 diff --git a/src/0croll.c b/src/0croll.c index 3a91e173..4ea630f8 100755 --- a/src/0croll.c +++ b/src/0croll.c @@ -1,4 +1,4 @@ -//from https://github.com/sparky4/16/commit/a19d7592507e5f7aa91f4a6b6611e021bd1a3e8d +//from https://github.com/sparky4/16/commit/7872dbf5d0240f01177588bd7966c3e042ced554 #include "16/src/lib/omodex16.h" #include "16/src/lib/bitmap.h" #include -- 2.39.2