From 7b204788231612250d286ca317dd942b78da91b6 Mon Sep 17 00:00:00 2001
From: sparky4 <sparky4@cock.li>
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
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
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 <stdio.h>
+#include <stdlib.h>
+#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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
Je*1eW|IcE*<EQ`t

literal 0
HcmV?d00001

diff --git a/16/modex16/computer.pcx b/16/modex16/computer.pcx
new file mode 100755
index 0000000000000000000000000000000000000000..07da0a5cc389f85abb9ff2a95af908b332827c16
GIT binary patch
literal 3466
zcmeHKO=ufO6#i5aHdI>eq4*N2c){f2IVezau@9b0E_OkN#>mKm)ujlEAp$j|6vGM{
z(-If#OQBQ?n@dQL3pH3mK?H>L!??D<E~eDzqCn+KdT^jV1oGf@Bqu~_T4)QsX$E#5
z-}~9`eLR+#cP|DmL9dyBf(-2TOrW4Q3WeT7zZQDtLT|C&FJG4Vx9a|WKA(>>GXgSj
zp7h_IJ6yAZX3(r#&EO70SM0CfU%^4MrXAJ*zQeo0w;|JNhKAC2*u2yT*EDYa84tfV
zRvQnQ@0(Y~ue|LXt7~7RX-0;=X@(m;xS#Tup5X+mW;Q}W9bX&2FjUFfH6wNNogu7d
z?M9m6!KzlsJm0lYa|r*@3`H7)YUs#jPzOiq)=-<)UN~aa2lf1Epr6+&GdJIuBm0#W
zBTdeQ80j$5VKf7y85qsLXa@fO83^^ykN@K2d3t)<>2!{cj_UP#xm@1d+|)<X_4Rev
zb+g%QI-QQk<8yO!)6>(@Xmny?f`L=uSKt?5AE*M`z(XJptN|{N1=7G05CbH@?KW2`
z?ECDx>^LkX+qN!3kCODQq_1rH4Bch4QYhYp_aTUmi5?SqL@V?nNoSJIY&t{t7_A11
z-^258_bxKaSiA`-aY)Gq$s*bJ2^(GHTKKexl!s$FenO8u@^ZA2qNF5glMT{@-ZWtB
z!>Gd8hVc+a9>y9B7e*FF8paZg7%oV(nFrXAB(jM#OLV(vwNNa+CX~VAq9&AlLUN1j
zM+A@Xbr&lwEEkdVdNNe|GUV7v^<}uqxTx6-5c&s-K5z3$h1)(Ky1eIbRdUJZ0{A<e
z<Zy5sr4;;mtlmK8IuetRtQ)8>`^+x0!z`I?ec#}xIN8HN2_+x?DpqeHlR!f1_-7q{
zddTf2|6JvREp9&Gs?U`T-pcWV4Ew3)-#E|K6P<ethq?JZH&*?8wv@S1_(b0Sc*ajn
zZ8+EOC9dV>qqk#|w`Q+8(q5PupPjlauU(#sj!oLu-`#JN5Gp3r9ie=ol<<|fqeQHS
nejt=1)S6Ibv8jZs#78PB)RItN3boyf{XvN@l!)tC{fGGjSSiHA

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; i<NUM_SCANCODES; i++){
+			if(i==NUM_SCANCODES/2) printf("================================\n");
+			printf("%03d[%d][%d]",i+1,key[i],kea[i]);
+			if(key[i]==1)printf("====");
+			printf(",\n");
+		}
+		#endif
+	}else if(vq == 1){ // initiation
+		byte far *lock_key;
+
+		/* Abort if our function pointer has a valid address. */
+		if(oldkb != NULL) return;
+
+		/* Clear the keyboard buttons state arrays */
+		for(i = 0; i < NUM_SCANCODES; i++)
+			key[i] = kea[i] = 0;
+
+		/* save old BIOS key board handler */
+		oldkb = _dos_getvect(9);
+
+		// turn off num-lock via BIOS
+		lock_key = MK_FP(0x040, 0x017); // Pointing to the address of the bios shift state keys
+		*lock_key&=(~(16 | 32 | 64)); // toggle off the locks by changing the values of the 4th, 5th, and 6th bits of the address byte of 0040:0017
+		oldkb();	// call BIOS keyhandler to change keyboard lights
+
+		/* setup our own handler */
+		_dos_setvect(9, newkb);
+	}
+}
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * keyp							      *
+ *									 *
+ * Returns the status of the key requested.				*
+ * The status is 1 if the key is pressed or has been pressed since the     *
+ * last call to this function for that particular key.		     *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+int keyp(byte c){
+	register char retVal;
+
+	/* Key value in range of keyboard keys available */
+	c &= 0x7F;
+
+	/* Get the status of the key requested */
+	retVal = key[c] | kea[c];
+
+	/* Reset the was pressed status for the requested key */
+	kea[c] = 0;
+
+	/* Return the requested key's state */
+	return retVal;
+}
+
+
+/*
+ * The library testing routines follows below.
+ */
+
+#ifdef TESTING
+
+/*
+ * Library test (program) entry point.
+ */
+
+void main(void)
+{
+	byte q;
+	setkb(1);
+	while(!keyp(1))
+	{
+		keyp(q);
+	}
+	setkb(0);
+}
+
+#endif
diff --git a/16/modex16/dos_kb.h b/16/modex16/dos_kb.h
new file mode 100755
index 00000000..ea81462a
--- /dev/null
+++ b/16/modex16/dos_kb.h
@@ -0,0 +1,23 @@
+#ifndef _DOSLIB_KB_H_
+#define _DOSLIB_KB_H_
+#include "lib\lib_com.h"
+
+/* Maximum number of scan codes on keyboard controllers */
+#define NUM_SCANCODES   128
+
+#ifdef __cplusplus      /* Functions must be declared C style */
+extern "C" {
+#endif
+void interrupt far newkb(void);
+//extern void interrupt (far *oldkb)(void);
+void setkb(int vq);
+int keyp(byte c);
+
+/* Define macro */
+//#define kepn(c) key[c & 0x7F]
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif/*_DOSLIB_KB_H_*/
diff --git a/16/modex16/ed.pcx b/16/modex16/ed.pcx
new file mode 100755
index 0000000000000000000000000000000000000000..41e56317fb0a8f2d6192ed73c49ba29ecf00a739
GIT binary patch
literal 2086
zcmeHH&2HN;3??PZqK7?7Z+(F6Y5Y!o9m#*O<uvJvpvWO8ilW$IhaHApvyXP17R9<@
z*P)7&kl#mA7D@4gV<D_h_+0P>tNc%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|<c-Wv<g@PA@Z5+AfFew`;>}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=B<KDVODHx=dJ$N
zpfzHSfHU6|IcImA72KS-IpuIwsxF94&n8#;*+MHBpDkwYWDyX5uI=9}4373j5X3;k
zXj}ckqMjP@jR;Gh{+>p2HdC{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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
JdUEgj{{f@Rru+Z^

literal 0
HcmV?d00001

diff --git a/16/modex16/edw.pcx b/16/modex16/edw.pcx
new file mode 100755
index 0000000000000000000000000000000000000000..2427b5da5a94c3f52410fe6d78aa0165dbd4ce2c
GIT binary patch
literal 28073
zcmbuo2|$$hoj3k~g3*|O*2Z|CuA1FyG)I9nsR@q?UR(uH1i4Q!0Rt$BrWDPKirL{x
z_Z<$q`+uMvzzm>y<%swvkl*i_gJV!mMN9}@F~+u00X2=v`}zI`lQ#Qy*JfJ{GBeNj
zzJJF|v9ozh!vFrsX08qW#Q*Tq#>QrXBt4Elk3T+r`t+x#JItIp^XaFbo;`c^;>C-f
zdFGj){p@E;mMmGha;0Rm(8fmEXFK%pX)BCJ{_mJ<{r?x^KgVS2zxri2dZR<UY?9rs
z((kv$Z$_E5xH!%7cq2Y0+Tfr@s1DIF@o#v{a!O?_?Xp`7ee!F3^1kdmb6RBh<CE-I
zk5`{$>&1HP*co;`JTm?%XVx+%-@}LQ$f-}oMg#}29@{S@Th<d0;_jH>Os|j0w`A8@
zvEh&Tos(<_B-T4AEapuYdUZ^`Ake6?YeMAXb`K=GU<VJE0m9pZH?PTV^6Z$Yc4LxR
z@_RgbwuRmp#2Z&ZxQD|epE0RJ^0JTE?n*C>$(QM6_W;{g$#zU?lLEqLxY83B@zzE8
z%?SH3>8xa{N&)T())zmQouen)w$P`~O6*Le)0q4@KKq%xJ&g5?NduB?o5Z@O&Y+jZ
z<N?{m@iEYkPoI|Tqrut$UhS8i9PHSjQBsH4AeU@bvVJbHA$EaX<`>wYWMlB;Hn#Zn
ziuoE|?)O}|+Sfl|<0c*$%!7h?;HF6dzw%wZ(v$VGL3Y`6ja_Az=`l|)Pc9&-7uXOW
z_H!F9@j-wXG)Z<5AhjRZyJa_3o*nM1N-B^8x+<|jq6Gg|ZCF2k1Gp>vD!T#_2Jr#b
zwaSNe`)>*g4~>mVNKD$1%9D8tQ(4;{rt%b?oVp_^F(EEC(miOCKkN2cwbIi@BJ$Z)
zenpT5QalCdi&mC_Niqxqad+6$WAYhL)hoXl=3@f2lK334@sKDRPqiOBT;bOM5#sO(
z2y}Oh+qNTlSK8sak9lijGiz;S&7AROwUzO@!|an?DLb}#IJyT1toEcQ)vIiXxFfPi
z91sr)o&*FkjFQ(>_Gco2Oy12P&kFM)nY2Ja>>`&`@ze#dLSpS_T|WMS5m5;{HZbE!
z#_OATHP1I?@JybuFUx@c@_mMk^u77TA2c*KGJY~`!;ZwL(BJ?c)<qf{BH^+x2$lrC
zx`2p-8jEB*^(j)$nA|Blg?k%>c03IdAA(GbHbN;-iR9@Y92%FjfqhcPIA=BGI<9a{
zUQ4cqXK@YwsQ7EhQgidTMyu#5YnmB@OxP!H@9>BW@?Q!3Pz(NEfW2^1Heqie!FzJa
zCu}y1|1^j=C9iYvg>AOt6C^DOwnXN3fnR2yOE3v<b|xY&iM3UI++3ZXo{^agbgHgJ
z&vi!p)vG#_UZ?6yIq1`BvNAK$^NX7qKfGsMT<B)j4OvL+5?~2?2OVUK+@=K<;SMi3
zB~%e@*Gg!|X?#cliSGgg*%KJOEjjHZW6kwCEitUoa>bzIdfhRdzKH9Nb?J_A{V|mY
z$m6-0xqG#R^+Fo#ljLnNL4JU7L5N~V0&jv(GCvdiPhx$M2oM&K(Js$mXDpBp=z~?N
z7svuwPjGZ%%E`utVxFE^P^2qW%fWOJSMrq>ZN5>PZwAVOq5^|9Pis&hhoVZoPSL_R
zimMw>vbIFWAm5b$M+OBmBr7COHB0ud6UH&QRdx!qZMVJ*tPs?Y*QC&GDTf(ntWhb-
z&&<s$QFR7jh5ogQNvkUTKt<BWE1Ep;`-fUm{oxJUq659aD@jeLQG!tmbgj}<#DrF$
zYmsAEUni0eR859yvx@bG#ig=OnyS+?a<w|O9AZ_p97d%IEL<_`RA6htPeo@|RILjA
z>s7GH^E3W6zosgAdpPS`<tb4_L#QD&ehOpijU;T}%5JUltdLH;E&<^c7*^ND$Zb2J
z%|->JYZRTnl2CHMHGnsr0mcPR1yZBZ2Bap%sMTl-N}%!5LY=Z#&CG9TW|o~vF`J;E
z&lzm1SDKt)mfh}yL!<2A+a}q<qSc2?vU6U6QK?mpAMDP^*YnEq(xL)24+s?_U|Z;?
zwhfG#2y-FVDJ6Sh$Q-1V^72w`Ze}rKhm+%iSdZ1MAvZSIDS11<a16+Q6iB8ZqESL1
zsa}R{Z{424%&fImo0*ZT04E9ccX^r|Sgu)T1h*!|fPZuGmwxAh0HY50RYk~HSIf)w
ziiT$vK)omTB!shG8(~KjLR4uI@{|gGxg6~)!GdgzurGFw^@Jt7U02LAige{QMG6>2
za47xXItUIN7Z4&tw$cJk3Q4zsXA|Dhh&M`!%)H#+X%u~VlU|$gR`JKX62pC27l#vr
zW!CLrl-<5XN_XS3^Hj5BYZg9q4&gmv7c)01`!X_1^yM{`gt$N{EG_)skSAals9NA{
zB?AI~s;&z%2m5+mA)zF5Qwqy#N|jump@lJ9c5ZX`g-H!|Nx`t(2Xb5h@od{6*?I<f
z?D{x;ccz}#RF)Ko*at8qKJY-Gp~7slkSNy{@Dlo`s<dg1U|J~?l7%ak7G`VqW@c#{
zd6RzMTf3WBd%{*9KG=<TFpU$7H)M9hB0G3dOcFVYq83F+-tReqQ6}yWjN9{mgKkW@
zp=k3z(CthJT8Y;$s|YZ#4@$a-E`zoaT;?|nvU=kdoWc2VBL!e<?j4d=l2gFt&u@%P
zhV=9mW6DiMs}vopW#*J9c4n1C&ODBo33x^+#EIasPPbwCFLHuC4DWk@*2oPqyF-%>
z^TtZJZT6UQQTQ*{ebjh(N9eDFg<5&Bf;341GnfE5B7Y;tvL4tm!UhqE944{zfeC3f
zAHa^ua7)INOG=5NYg6)a^BdE)1+9WnQYt6eh{py^l6SO8W}n@X@5&DBA|*Ivw?U*}
zxay#PO!CQwLQPg4Gy`DQ0TKqU$yJavQlbLz8HC^Off>n_-S5hy;Mny^m;n9&AjxEi
zU9k1unpoBF&L3cDIwEZtq*Z|1B3)KS!{Max)yS&&C>Q}x*HfX1VL(a>X#>TVM396u
z2K^mVKCaikS3<@EAa{^liZb&WKi(4+076Lq983}B$DBxyBl2u}{9+<8*#Lvh%Ajpk
zwTPa2@@Q2l8dI(**<2}sXH}48B64Xns}Cn`U5QErK^M|!l>%n68|>yS6wxTt66{cf
zfF=={CEv(o#v2gybb6Bl3;Rmp*$7LmfL@@}>$F^>`#2?r^4jN;jV)E8zB7j9>$00k
zp5ZH$+7IGH7H5N=8@H#`W@?U>D~Ndt+(QM#Yk=5+Um$s<vRsqVP?ZqqY0EC0l335Q
zTk=hL8tbtD1c~X2XHZgIZC;jAu7|^EAzl(ROiP!o)#Sm6OL%TW-HvcCb_IdgAbH2$
zg!{y^ZUR6iu{t#Q<KJmYQNa`_lsmNrW6CWE+X&G>Ob8HpN@ZzQehpJ&STE&ANZTm+
z#N2>z;=MZ{XDEBnKWZm(hPJR&0UWN&hBU^MKPm8RgfIiq1;`37)n*norg;Q-il_QL
z5f@SU`NVuJ|5=XrK>>uUZ!>|NNjUt6tip2CRP<m4NP_EerHq$!zy)=Pyg3w`8tM`Q
z;f9bWr}{DG&+?y$wN_LTc*Vv$D2bUHGIH^G075Z>kOR)fls_ukE)Yn7xE6r4dHKw;
zBb=QlP!t}>oMQeY|51K}^;lnlnF_<7;GSBPud6L9$WuhrhJYxFQ5+?~gI`ht2!!lQ
zcQ+-6A`8NvNblaUe}oxqM?FWK0IJSG1dyxjeCUQ_$U#(}@x59k($c~YMRso?7raCo
zfD;PU;xpO`omz?<l#A4%uTdIy#rUE}xCoEyZ<V~K!-+V&8-H(Hl&?_so9QQt$4gXT
z+W5xoY)Idmo2TgB=jHV}MU)Hp0ot!C*)SS%2%)R|ERp@o^~bb(vv@{BS`_O;6;C-%
z@Y6FxrKn`Zf^N?#fKnU<Rr-+R7nN507OHXbl15%x3wac1v!OD|<kmO^bPyZR)#{Xd
z4WX;#D5SNTUuR~#Q(P72Z^KYL5ITg1zFGW+D)Y{Z@|W^Db_P1>CvQX)MEBqo%34m=
zeatMZwZ2AQgfx|}QA&9wd@&C;tb_d-6tH+f$wnDLsf~&layOtuq|D6KR@T(BRsf*B
zr7dPPv}3hQdnXmlG2o@nHJF00N*Fhx3G+xyMOtN++G>vSOerk~LX^MRg-G63gx9Rn
zL?sAh_2v44+`T-bx|x|z?nzDD9vd3I$%pr&Dx|z)l%}{Kxm^aLa4z~+#CK}kNaQvv
zeJ2G)qT#3_CTn$hBw10JX(%pI9zoD3F%Uk)Gb&8-^k~SKr79&UE;MMPpC`gBAPI;h
zQv)J3+<59$3>zF!;i8#_u+gKbqQ8?oSEAeO3k*$2O+&QHNBPN1VToWw^b!aR!o8t2
zpv!z`cLU>TsUD$$tk-816(oSguc6}`Z;NeNf4k)Hg^WhObD9r~1jR4n2qiM~w5-?H
zTV3^iXLc1$=2dCc#!!!BFkGwWS;8nub@*eAkmS9HDevX+TE?q(#JO)=39hbD%0RQs
zSNW`3&3aiMI$_ue;v8Zh{=}-V*vs-P*2f2d9Wub1p6numyI&Mf+Lo|ADl$AU0Id;v
zL=pv>tn=QRq7!#AOEGK|%;sx^w^VRl1tpJC?cR(AX4sV&y3w0B7(}}*nD%7d0fFJs
zQQH%?@uc`)*&rPd4Mxc~frE%kvdd#oyDE9XX@Cr|ygN1xeN<x;tnegjPuY<W<-XY$
z4J+OjP~isQ345sb(B*0NQpQJ3g8HEXSq+|~)8^(EHrFvVAq?3E#1G-YE+5vrDIzK{
zbwe66qgidLZD>9j=SL9;Inv(w5(o*SXh~7RD|%-`UWu|-TVDf0U_QJqEqPn)R@Uc*
zQV8`E0Yv@m@iybt`!psIN_D0By!7h2l(-<)4aHx^=Pr2qhed5mNvq?nXpS3;_Hu0&
zBFJhHT7l^LCHXw%!)SB?gm{Q`h3;y|tf(nRbkEC7N6}Z@(8SEUlA^Zyp?g7`1W>Q7
z2|Lm0!^e~&k;gA8MHO&0#P-^zT^>Oo?gH7Hgh|P-!s6HMWaj4T;@#;yBU1~w<@L(G
z=AAL<^*QDqD2^R2Vu+Q%x+RRAFrVoUPpQ>t(JL2Hna#5(dMWjdkb-&Fw#Z3fTtH_-
zo~$Q4v8tBm!pY%ymy~RSqS=>Ko3<^?+f&Ht0_)loorFHBwXt47*PY38v&eAu<+{B}
z<E{vrHw>ZtM5paD15Q6E56Ld}WE&hN!uo@E)MRSQi?VWwZha*>ouj2XO(st-ZmLR+
z+9d332&rQzz%iK_nh<ZSbdYQ6YwMDuSsyHhV#i9K!1z=IDOSwiLW`^~|A<!>l@@ZP
zpa^0^;7tx&Wo<*vQh@Ui=m>9@*hPt*+qjK!1?`anDp0xW(Oc{Cb2D~lDm5gMWFn)V
zU$I#gwC!YL1$ia~*b;Ko0;QfA69P%n=$O3&qeQz^qs`#ySz29fsY*>{g;Id%tiWhL
z-Vq45K`1~}Xpx>A!YD7^%Zy*iI-t~^xVqn$DyUAZV~o7qtjt`VmyZ^T`h(qXHPod#
z2H0S-bqN~ki)Cs>zM@0P0BQ=fT=$2flxSb}B`o8jC)kQ-EzDfK`<+}}y*1tNeHsJm
z0<^lw!HRzO$wYs2GBHrfpzMSJAyI)6*#^L`td6Z3QmX5Ag!)qImOO2?Ce`iE{a9N;
zp$Ju=mS<DaR>>rw6<(s<n_ZYu-;}$%E-?rn=U4qgchpsr!=6*hi|gWip~VYS!jcOD
zQ}1j-JCzL5M)Hi<RXe0;YteCe1g?ZEP@%)J5)L<KP(`gO6=srpE2VAdNZY8%ZDyZ%
zkf~B-%({XTn31(s8<dIxrBu_97D?|=#FMCfgA;@dVn7;;YKP(h7`)^eyo0so4Jmt-
z%383w8m|r6urB}jv|^p|hZ0Jg$f4gMMcC2S<W}#DMP=xT3Zo}FxvsX-MEJByeaco(
zO5reQstXKK^k?MuNp>ob6Tf(a5BYEVIA04c6>V02<IcE^=#pt3G~^qzt6BwPYBsQ;
zA#PVtt?Tj|H-sWMi%)n?@<?kg&O|{`aZb_d6irjoB+ThVBZ!y*gub&sl|Plk2s;#L
zZN+?|4(Dg+FHtIMtlJi31H1Ub(>wI-`chN`h1pcb0ULD)qW9)XeX{#XSmEdFicJ_w
zZ6!-{0r^#*nSU}4(^~-L$lpPqg0<;hBuM%zjCqLkm#fhuLhJMux%nUOaQ7DPg{IVJ
zY0(zLX{ZW;??Q$2&ttk{$>A%7%utp$<)e7g6$xpgcFnC#qheCzH=u>=D1X|<o~QY?
zJ@II5&Cn4KZP`%^61CtGV#!yUHbi>!%Ql{&Z#TozF|2ur*MfgkHl~EH5=dE3%&sQX
zDoE*NT!E27u6h*6x}w_TV3-uzYv{ONRL6GC1HkJ*NrWuP*P|{ytEMvdGC_X7BCmF5
zj1StlD_)@x0i2L)kt;~9;@?W4R#Tr6feed|CMvBVPgknbmK2o?Df)a3FU`$ld>iW{
z;o2Zgg%8N*<k_s-D6J&BfdnoiU+hG%1~^!bsuWl?R|7ljM#@I2h~8PPg^y@4vVlTr
zM#fS9leG6X><p#45r#>)oAH{c-oHR`t*>(Q7EuK64*|1J!a1Oxinwee3=7T>xT8T^
zspolmGFjCARNLtawbf~{-c+w%Vck(x$Ea%=Q_vln!D(JYS}Zz?Yp|g~!dP8UsYmyq
zD^zrVQK;h@eQ928N)Q`jm#J01fXPh=s?I*F6U0#;+dnSg;@s~LqrHM+fmo9TNt4<2
zCDi5TmDd*h0csyp5D!X-U45x0?{FOJg(@zCvb5Sf1>H^oYK03z6B>PG9tqo@jJ8#Z
z?+4DukQzm_8<%okiSCjJFN6~nPbFhJLstpU-m<O<VVMIJq0H8nlnJ3|o02y2%b3SO
z3re{Tm8uTGo^*wn2%Tx_tD<4aqyaQ7_O55;vvMrepYYMk8+SAo>2-N~-!HW4mhvVU
z6+ECgISkXTE1qE+YBRF9zJP4XYEXrxV1p&Yo1r2pd_yzR=Q!RHfft=0!~q!1$$|LH
z70)&)@+_7-Tmyg?b`8~>k2?HsxxA8V@F`L*G^1qakdo1c>l@c?B9HTOtomJMc_s8u
zs9{|&*WXnmu%d#)I6e^3v!)^+4}sk)^j|_-s?W`@+s?Xqf170Id<JMEkx-E7;Z5g*
zQkt<!fbRPX`Ydq@gnM<ByO}xRSF~<&!5^6zBSP(7j4sSde(lKw6t-88(YgW>-)|^~
zF9`{Ki3vA|{#|bEPIr<n>g_XfpPY*EJt^xd>rG(1_Cu(m<j-J_3@EdPnPa^0)|Hh(
zDVS1&b)iT|N{^P9B_r#ggkK%S%=IugR7N1L5XM&m^HCLKAcGFp6Tq&uOMXs$z~<0K
z$fVG;;=D>dswr@<yP-6_vpZ!giH~)~GIRPnO*NUwT=;WCDaV3I`FsC%GMeHGq<AiT
z&+eOoAD+!M$MjkGRnat)>2HxD`mi{ZYKNf{B-bC1#CTSoUT9e$smXkgSrYxpgV-Rf
zD39wkP?Au)(v;*+YDfN0VwU$t;eC*?UX$6FO3MnqPQ3u_fP^T*DAk+iqpRxkVS5E7
zca)OGsu*}MEux(dO{>i<8n-)57F@x76<)sL9d)>|1hYm1$(8I()5y$GtP4w&sua<S
zMNt<!6#pg(@;tMn*%}4WuR#J?mHNzv<W1ln<+Xnzv%HmF1G+QIYckTACBc_WOA1aY
z&iF{cM^@768A}QDM1TUhz0N&y7kbnfDj(^E{@BC$;GL`;av==4HUB4l_sKX)KCCNZ
zXYoV$`-*pk!TMMFdYpVKy$R4QO2si|h({zFvgR?O-k}H7+qck6g?+jym9b2XURNN(
z3yl1Rg7B4<4uXQnH~qKOYf6Pz7AYTZ^W#@nh3&!<S(SIFB&sM<s#!}Aie%C?;E7}@
z1-Nu$$!(eiRVOU1iSorC3Y6@-aKB@99`KuMt3prK?*mwUUanQ-DD(XiJ}%M~A=p*d
z#jWO85TcGUh9HGdF9ShLN@lHk?Ov`F!Q9DeZ=wpyLw@;SLy)kBE?7hB?uVw>#NUAd
z!RKH<VY`a=@tWK*C8szgm?8vnkx81=Ew@qM@|2HpoOaf~Dz>g(K@Ea}K_JN5TVI~B
zyDr{~NFa0HjUJ_l#vYIr9N}=Zm|C#z?RYB#I3B>M;OueUv?c;1Y;Xn^``e(@aGDFi
zpU5-LZAq;jQxI<;?Tq@=&E(QUfhomWrQ*KwQD!v^h_X*tU`lgFE{2A;0o90ss}`zB
zMtwa*MF~wArgmXz%grD=`wA9BQG|C9?4y~Pa=udW7e$NiHeXYJIC>SjxgNwH_<hkm
z*f!${-u#+RY+WTqbqK#CTUQqa=KwV}kdqY))*_rbv4R>+D8*kaviT=92*VKmp)|rc
zuC0n>=6v`}#WzZ36EjAz^Zc5BQZvF3st$a(KJ$Ye><qs^X>lAhmmCQ4B!WuvA|tYi
zNZZ{8;zkq<U=iu{`PFX+QQ%q?$XXz^-K;g0isGy6LfFpYeU(SKrgTJvKuqhhm8Nu|
z6swZ06bHDT#`<f*1TrMn@4F37iISaDNe?V2%Lq$m{^1x92FbDB#0I_YJ`h<Fu+}~3
z8Fg~^zM9HBO}RjWhSCIHKn9`^Qcar_N8rODutC&t#KRDJ=Ad1T??Dz1k&qC;N(O69
zL{$SaRyi^QdK9iL`UaTHk+3iuKQiEb<v>+>8<80kJguf##Q#eV`5_rSc^Zqku6Cl&
zAag=JfN1CiZ!0?@Ot(ZgYR#m&QcZeu@@Ckm=hmIIdL;aBl=NMqIPnbLz}VhQqy|m)
zEqofXKw*`Q^&@&zfoZIU1=7mwkkAV)s`fgc0_N#(Mi`o?%&CUlxTE;JCSJym^5cdh
z{5U_VmZ>E?JLgc2@S?Jk(~9;i7;R2Ns|-r}Hzqfut1SF|Ho6?t1BEw~h8+Py!;yz;
zu(p)lqm&sGR3FIKfJB396?T@hpXboO%8bB3*p8MR;Z5%qrv##$r-(tBA4O>FDe?&}
zhndLXARC*|DxO|*=+yp0oGJignNG=}8UzFAc17DsBVV*-6yQMwDywa*wG`zT6ay(x
z!19h`6oM~Pj?B)<wt_I_wC~@?>k*3`fkQMZw1^Ko4nBoF52>tAEZC99*!U(e3s0}-
zhb;T~p=_R`5Cb5C=qaN@nrELCX%aO<{WjJ^gAdjp$ILaF0&p(uv;q|R@N0fa&6Er1
z<xad)f}$T~tC~aX9N}dM%sJ|zw*CK$|9d)&Ey)j!G}0F9aq0k3)5L7#TrkRm{39ni
zj~~TDNOL(z|MY0iAk-vEQN5;FsN_pe#F3hO4Jg#!Rw|e=6eO@S$qgFJiBN@U(3FUI
zwgIXsJ9_H)5q_d1uX$%U(uWAMMk$66KS`b~>;{5@d$9AdhbxPY9_c($cBHICtHM~o
zWeLcEbUsD+B_2`FYN}aVAd19r*3KCAW1s;*=>1x$-V@{lAzj(Jvsi;|0*EmhRC!nj
zDnpQjnfw;y=wOT|_;K}wdfa&8_>rSrR~IK@o3It56x@N$2rhO+85xhL*4Y)mBs5$9
z-hFUCK`1-UkCX}F>IT0jDz`W-9KLbQCK&s5kU&veLLDGkP{vwltsLXE&??mUrGmE4
zskH!S&=*)dT2_+%TfYC)!TtQ;fBgGz$oOfxLt7WnTl*$iK-W)bnu@eatqR@<+Esk8
z{{K@CyxVr*UG)HngTB<`f;4gnMRx|Vq5uUN8pXZoheILZt2P^v-qC?Qqz<K9b!vd1
zZ7Ak&dgeH71Ju|E+N>aR_V*n4kAFW{oaSzAo`lbW649W>5^e4js;&MHl_CP2i>=Fi
z4};DoZct68D%GSKn)rziwcrnw62mZXL}#+|9@KC|Xr8__GrcYr&kuP9>}cMHGGtte
zx)SIYrC%4`iK<J_EEh7=4&ZsJ;o*K|;5<h?xIeq>_=zSJIC&NSgbTbN;>f=-4n>1N
zQAC6h$yh|B{ZXP!>1TadNn$2!Y1+Wo^L1@&`8vLS1OJ4XnraX71N*Z{N7-sl3&Mm_
z(rGO^L2!9)MqQLAe7rA_wPxgsstjr`)P1c~R8tv`L132$;~81yh#zQz`xR>Kir}XB
zS$6!WvY#I~Slh%*RqPYK;d|7(7;rO7>PC_#h(s-D=h}`aHcJ%8WT9+m!sd1B*RADi
z=FFY{%wqNz(=hwX;%Da1<!k1yUANu}!EoYe4jHbF@;+8(U~UhohcD%3kX&ff3OZLS
z2bhu|@1xJSp;VwWqc^?KS6CS+)D<8$QWMjPc%|g*KluBjCzwG9Zv8qAQUoRUOv8?g
zpHb)VHESV8_X!BbLlg~7k_WL6jU_<dZ!>{^J~7gR&zV1O(GoVoNBJGo7{9|u*~pTG
z^XBt8cz8WY;RNK5Jw|0eq+hGAL|w`gJVE{t(U_jEFGNWXlPJ{PR7l@=r~4sWuzDii
zf{0y4Qa?ddLws|If`y=fjk3Gy9m9S04N<Xd$pRw6!*L=4#OEA5m?Q_HeyTwN<#^#!
zc7CGcvkaeSci9+wu#7KhT{w>~<W^V@*d6sg8-515z&0{wIHBbHmLeKV0O1W(qRQC2
zuVz~yHXLrN$;<_dcvaEfQi>7`fk};+fl`5>6!a?<Mws3HvL;CSlMSHw88!^i->^IE
zHUzh1QTxJwUbKuo01<cb>iri4&7bm#>{F8z(vFhW6}<_Fo-mQ0pXB&FyU%aE$R6;e
zOBS^)T+Ej^vU}kD4*Lc`?<|=Q!LMh=6J`4kqOwMfS=LPii{?|SsZ2AZq?OZThN6EF
zeycjl(ff1cb5si`h4Wz)MCkgpYv#;bLV&qdM5CN&ZCUut!bLw{w3I(!-?G23`!709
z;^!wqng}KsGp%a_xiewo6JU8(Dfhd3{QUWO&pyu{JPYF(W_MpS-+`t^LG{RTn972M
zu%BTd8J;tj490K*S^OMPBcg*+QIc;c&IcpecNAlBK3>J(rceB^igf+jx#IadY~&er
z-oi!8_z1fPR1XYy%n$f2_Taf^=fCiCk4V@6*@0P_K}1GlXe4OFe<wP6y!gVrXW4`2
zml{U-UBewt^bK>+XM|~uvN3*t*@8K1*Pm=c_%JJFXGNK#%{63Xp(#V-z%w&;<KLJV
z?Ij0mI=O!BocTh{cb6~Z3t*t2$^e?wJH`hP1<1Ph+_Upu_}LuCiKr%6KbAX)swYHD
zhI^r>p6EE2L)9>hzs&pRXBY8>i_|5H@q;h=XPD><q#BiM_x6$n^P#D`{QjDC?33)A
zGW4y8(cKUc%0ui5tNf@5qjVw}f2c^NPKRSUUkSaNl!6{qEqE`dq%8Xw`()i3=;F>2
zK5yZ2pnw~|MecxNp?|_|SVI40Bmc7KImr1IzdzS;BBFx`$FPAA;sZNtsCq_p1{W|^
zHnMCv6n=XMsv&3n`FdtJkaObr{@?PloH2!_8rYL?RR7zYBggk2V21TSM;M_G<3YH#
z_;HUtnD00VUco+}V3zD$T510ub$W<J2vMI-boZDCO!vMRSq{sZw`M&veRzmEY+8||
zabGsJFdeF3ruA#)eFd1$dPGui_!PiwXJVDd1bEX#i~e1B@K`Eb6oj*p=Y~d>^HJ~)
zD>WV1fBeXyoH8rr+OiM%p)#V|w0`b_g-hAp3nQFJHjFHTe);(cEmAB|>tI5QK7o*S
zPjsCB0vUl24S|NNhnKwoS&z=$zzjK9sS$E9phx66Fe%7nF6m+!G<^ZoKgXBxd&`!x
zd-Djx#1<)>Fa%pMP@MSriyU6cm$7@7$ylDBH}~xm2M!%CJ7gug1UfG}bg=2|x$^+_
z?hBlBLsq$r-NIu_*@K@8*KUy}w_-1%YruE3e>%zWg%_UzY{HI*M)?vL$3ix`U~Scb
zgZ%h@D}pk92(81xs<qGH6AR(^qomO9Ff4tBjlJmTj^%{&6Ja&@!}?q>Ry6>b6YIvX
z1Th71MRNDx0vo&a9XbNGaKVdgZ0?2=hxn0k11j4Kj`p6|Fc(4`Td<IiE*!^4GN5?L
z$2?HjpMy4hX0-s#46`Ic0{njthyhE_kxGU}Uf|F)@&H2e{Iyj_1$=BG$!V-wJD-3P
z!{0Fjs-A-+@LA{@w%967BjC{hPCKUon~(9O!c_?NvgHU*Feg&@-Fa)?ZaQ!fb3<|f
zP{03R)2=lO_$UkqpR@vouC3t7&Dtaf18sR~k;Baxva!Jl@Gr!Zr7#9^6(Cq*B>QK#
zm(78Xy?fxe75H!Y@q^@7bKp)(5XqNaAjg6ck#|Am?7@q|xjt`|o+R=^%%U9peBva>
zx#U!2Z4_5Q7M=zV_%U}KAvj@0u-}Sc-CSU%40;=&M=!!<@DQ?`P{Di;cepQ__A@Oq
zcAN$fj&a9@EfXaw{*v>M0zfDmnYWIazQ=Lm_<?tsVcooOn?q>EhsOnKMPYU7R>{uQ
z3>2xpW@I8l5##X;yJr^Ai5@`y9>Moa9OS50#u0#gFaZ>>qI)f%X{jhCu#3luK+pC<
zsHQw8>Ijd2aRhJ?-daW$ljIK^92d;N<0q_=2X7+ZTOqcI*g%`1Y@d?djDR=;^Fc0=
zGehJf2&@n|hcwtd0}>IQ9bK?yL({?i;~LE=JO0~)O&iuMAUdJ@FG(fro+JGNQ(@=Z
zq-jJbCif2`4*SbeI5$Ze{~@*r0YKkncjm2S#-{OzhRj=5k#m9>VeNO|wj`_Nm+*1?
zV;Kw?7~m%Jfup-kiZ)}{u$$}vEJXRwpMPlU1pc;)M-BK(yaU;7aH1|D^Q4kxY{>%r
zyt8B>Qpo!MAJO7r<TymGaAN%&^0j%3P!o;LBO1uEplz})0OSx0hry8Ht0dUlLSQiI
z=McGw{Rp#+ux^mu1#O6kA_%})`SNAmBPxJ_DwTw=d@;cUvm;1OV~f|aPb$cs9|p3V
zvLpK|*e7cjvpb6s=SV1EgM`-t&G2O%kPBcg;S@aCgBPsm!$|s1j^lm-QDZ3x#OIcF
zlBQ5@lEp)-M7EVH<Z?2&B}iQc3eV$#4WatOvP1jfy=(9;r^o?HRiPL0uo29tpafQm
zG)u$?LdKp)e1#l>iI5Ph86bE=49_5FK^TzOvQ7w3rRPa4sCq`0KC=XJzdHwx_n{yF
z6O}_BGSj*_q_X7@&~1E-1ipL;Gyn#SP-llwsnEgF=U?z}XP>sg%?UA_T^JzhK>qw+
zAtsX`hXmAnt)Q6%s*WyOxQN)ByRPcPL%K4q#cDmpM(u|s`C4==$Ew!NMeJQ5Xdu^L
zVuIrSmVl*;KtN=>6hPRqeni$!$e{ph+I((_L5ORa5z!cY!-j|@^etpsaE9enNS!#C
zQ-%tDJjY|QRRo3XKY;>i4(tFT8d*Y(4+=(-1&9YI3zR^Ca@lfH020)k7=&y;R}=Y&
zE9+}Pyf`mKdXQnm6+zBY7|kMB5}r38kWnxrixU1qYJLD|AYhZ#-FKY3zUoB2wt{w(
zj43o5<;sWH63VqFs@AVrE=Yp-M)(7(f&fSWGmk8%2(tV+G7XerNOEKB{v5{%P*L|f
zxQHs7WEa*$)O|W3#^c53pQU_u4+P#uoevFDq%a_S!htC$f=pN+)h;B3x#%}c6$h20
zWjW)7Re&&zp>!WA2dUgzI~OL)$!YkaC14F63#QcD$gzM02PAVsun@lk>(b|6L@LF0
zSlZmjL7Ovno+6A-aP)Zo1uJRer4t@OC5->vdjUkDLRAHUWSi=u#lQkS7a&cct7zPd
z;U(3+B)c{&<!9%7NPW(_xeMr1@N5*=pbpUloZ+u3s6+521q<pBT3?`KEXZq@oJ=6i
z2^;g!>re#&o$_1HEnoEP63Ck44_O2sX@x~VgfIs3+Ie&4uH67}?awX(1w>0b^r)g>
zKdQ?))W{4Q*3O;35co;9qPk}zj(o|&7K(f$%l>8AlI4hBuspJ`+x$MFaJw{%D4Eqd
zP6*2PzaY#%XIS(sO7-Q|zo^;)^fq;vc>lrtHRx(h%<v)KFUGP&2<`WznHKCxDLa<U
z4{4d9YQwrU^ARbC7KnQJl11o`RWu?5cj=Plix=UQMWVE)2IN_yCV{B=={PlO=FVI2
z><fS(dTjM>%jom!s1XGx8P&39=gr}BiINkT5n!eyHh(^}Zc-Lf5qfS+g{j})ux{>}
zIUKFdh+(`bfsP)S0TI6f!M)}G#OKXjLp02wxNnlTW2-S6^!8vzj5pTIU5vu<8`8Fl
z8Nu@)7|#LJ7!3{B-Ng&$VrD_jzNx7(=fHj#v?AuH;{;)-Rz&2KfSiNB!8Sk)AkfaQ
znX|x=-7($g->B3#-r-ho!;3M<!34yZxVl}6BazG?VrbIQdIXOe@u)f%LzemT=Fgq4
z&QtMo9)~#i+Vz5lM)iR9_=zLhgP8t6CxQrsVhojOsZ7CqRXwg8eD?rCGw7f}5=J3_
zVIeT87+V;b=}3K|Z@cvR_xQaN>UU$fFNQvE)5MCeZC#^cV77jP7&&pn2^~geaOV@~
zmU3v%xp0|IvJC1)4q;BO96Z1eDkrQ^c3Gjct-$~ZP~K*rRFP>ly?3BKk@d7o)4oGK
zxDr$IBbf))cMtrBm^+=s)Xuo;ZPSLgcVQ=#`6QnD@BrT3U#6Zos{9tLWBLnr(fx}a
zPMD{P@ibx}WKwo;{~_&hObm`I`{}U?8nKx8cMu6Y89AtZ_rSs2BUnCU-Q&{OPCIJ*
z*%wmm$>MaSsXU+d+hO<U2l@Q>{22dz1^=+(_t?Kl|3?pvlRp)zc;nFT^05I&SCFUG
z*XZ^ZWBbO%cIge`F#+*(Nb--x?#udp8QRLyy_!5MN)^JaG19VvIt@@*Z_2?gWMnmL
z-Tw%)gJZ09S5$yS!oni_80)Oq#u=7$xHw%~S&mZzG!P>gv^Adoe@ZwiR#6IZW@4|V
z2rx2=>#%!?^;@jo=Y%s&m^EX;dSleCn%`r8uD%k@Kka*gFs)EpX}2{ROFG>I;Ch@N
z%Ks2Myf%rgBNl5=arOZqTHhSBSsk8qxH=O|7ZqTKr`Vcb08Nb3gk==0xd=)*G8An(
z{-AD01QtGMoP2?fZi;xB%DQn(VhFE*w6~e1L7NF!L;>{qJvg{Nen$i#%F6Y5nR)e$
z?~22^7nq_`susyhz;pGZQ<+#+A15*lJ3s$bC<uG;9}<VfN7~H*{`KW$xz@uihzrCP
zK(%8rrQ2Dg8vIA4l7ZHIu+k*<om{Y?Q#Z{D&jnYcG;Cd@|F<e;QVDixlr-0+#M0p#
zEIZKD17|LJk@C&*BrMKgVolUxD@nh1;P#z0f5^~c=R5ZB^6%hKOu^iUc53JDZo*lp
zRn`?1EMm|OGFp%nwG7tHIc?R$I2IEkqF?d}-&Vy~tv0U+<4Dm*ifvq2Qm@eIv2kCM
zn};2;hm%MVwC50mC0frUD%+$<=)p|#RA{(oBdx27cd_)p(m!&?;f8#1CZ}lJ1+W7S
z=R|d|5p3s-!J31FQv~DCHnQG!DMXaoW;vXsC)rGL!odd|mZim0aS(=VF*do5F}((>
zKI1mnMq7C`y2iScC|Y8{AQ&MMo4c^n6!U=YNT-l?=}9W%9MC4Ar(+$nLaZymkSh#<
z^{)zyOQ~zXcKYwEx+rgNMm6JaZx5!r4~BM`UBUrMqU5oJ6-<2$g@rr8jBS^^omuCr
zti^$K108fkr#`T7gJW{o#*GtT<IH2(_9Glp-j%Qw`>gQ+D28aneoUg)C&HBtU`E?6
zMVjHiZZqIJs=Q(*C?%K}m6K_JH|#hM!q#ka^D$A?jw#r9pd4#tmOTk!zO=>mJIF)A
zFt==HU#qgSce@l%^v*_L_!GN{Qx+gO8k@$%3MIJ`wvEu~O0oahD=1;l`_)zx#TKB7
z>i2gg;LtrNz!q&AobAS%6j?o#?trbf1FVys#(B6m$qzgTjWZR3FotN>ifaryoWw$(
znM{V3G6LgROI>aHTe+1@HF|6-7Ux3rst!9SjM#0|f`f`<%2hGF&Ca3eBJB}{=fTEt
zz!$6ESva;@iP57b{jCq`Sj+Yx(vtPSsn{^UE=oa(tOM4BLox%?+9e++Gv*NiV$X;>
z>oCdeCTo9ve8Wq><h435Y6ni3H*0^Bo~h{Td3h0zm0(jP+=&t=oh>mUNZkM>Mw|eq
zu%aRY7tm2`Jw9E5^C-eea7uMG_N77&0obI>P6Lw#ZG@i-;kWKt31;o^8D?>%Q{Na_
zO`ts?xOsq`-x8CQR#Uti@ev0&b=rI!G$9HQ!RTNv2!U9xBMc#;Aq0ai69o^B*sE3Z
zu$`<1hh;P0DQ;w+?1<g8%F71F%(*xLp-SEnsSFo1nB)~<?UFqWXTpUrHnJ8sP(wNj
z8{gSVON<oO;2NI(5!?1)hx<nb*xz2DJBpLL&;y-!HwvQYG?X|=OZuU6MqEz^WO8|?
z76*i}r9L!ZC6+J|4k&zKG%<D7iZ*#yV7oL`jJFUqx|3QVj7~S!?h#CgX>}fPZqNp<
z+!GYP0|%qAy+02d!OKf^`GmuSslEZ8`d6rNA|Iiv5=VXV(syG|+u_tWocgBde1TxK
zN>gUM%uct<uKvK#Dmmcp472<bi?p4cvdFJ8bsFx=z%C736EW_S<Y*g1x4lhg-u1u9
z+^4BfOJNB(GYj>@5U$b2VIw*_4V|mSu|u4j(d4FQDYzj4Y)4Zd8lorwMri9W)NCJ1
zo&siJm9xFzjwAsm_+>O49~py#BzRIwtUaytL3Kh2*usFH{VRQgqITeL2QS7s2OMdl
zD2ns8Fhm@~hbfR<KrCijEfQ`*!YI_{W~5htoR%8D)erQ5H4(??rh$NHS7yNt3~&zY
zlC+)KLPHLth(BQ~I$^V}F#)tg0a1^3D&SGFhb!2?65uY*>xk3i9EYluLIZf$T2B*0
zD_3ZLoJhnlSr~6A+$3Mk6^ASiCntn%q^(XQ7>bi%a)?r!U8D=^Xhl$>VByd%`8u~?
z4vn}y=_NRD=jn$8;ZYnK#krz~5uVQO4#D+TZV63DscNdu&&bpi74lM?W5D$QbZ!%^
zEe@|!<S^hh&A#+}Tnmu0Epii%aagO0%P<mR(N@9{A=;}Wg@c-QD>d!Gu+cL#6^|gY
z@M0H8bak}1rLA)KJlPlAms{n_uSnj3k=v51=m1YME=$PW`v+`X#@=w~3A>%(y*fi7
zHZ#+$0a{%>T^mr9f@=e;snu#RSds>C6?YWa&gvEGcGy!GMl{6ZC4)5MRSW`1CaIeq
z)+{Qmrhca+TLhDyO?0fQuK9z^bUH=|O%&;kx(dkTk_fC6*>KiEslX}hjC>sZO-oLQ
z48%!uoU!;EQia(e;n~6)*(D0w{yxaWi9IqqJ<AIg6HVmIMuq6WI(o>aS3H4GV}eLX
zAP@~*a6%qH$E#LPiiq2>>o99=t}Rv6Jlr2ax%(QtSo1p^!qMn(jE%9@x}7_=(~T9h
zWGn7j0SK{y5cyBY*k(e=8?)_szwK-T+@(Wit+7}WH%cBv4CT%c)_z9*<r8esRtmzM
z2%_#GdJtfReg=gHz>KZ&<-C7TOky%M4b2TaKXYFeu3Q*XzCdG;kMq#DNTV20%)pGv
ziLqhgQV|KJBA%ASEek^VfZZED^JTcMiVbT-8aoZzD9*Cp)K;uxvFqZW@Uc#WT7&${
zt+3zt70xm246Rr|Zxn73sbGb;jt0Nc`Krq{t2ephfE8Uo(%M{KQ;u^O$HtT)Iv0gQ
zMp$|yk<rn=h)rUR{xZ&pQuRnM08$lv!;o+p&Mz6vrE`Oz55<KA#~g8-A7PP}*&@+1
zuu}*=ouGQFDosOqz$`Cq5Azcxo&n_)&V2wRRW09LRRe*ZhmqmbSu!@^;DjV^uGOJ<
zya-dPWpvCEU0HHsd}yGb_ex|$iXPuRjLZah7l}lO!gnj`0oI{{0{JCu1%wcBb55cU
zj2-)GiNx&|vNP6+Y${HOwg@G2Y1(U$>8r0e$81It?WcgRLbcpR#eFM8F3!hY_VnBA
z9-9F3dta$;r~rliD441nc=h{-ckS2~6|u<=n?dnGgnT@=Qiu)-3%j)XZS5nSz}x^k
zOUF{>mxTPxGXJa<kvc|f`<;$z-vkO>{Mx0!J*=}AltF~AQQm*)sfYkv*?@#&Gr>PF
zG(I5}clel_8j6j(-^xJcfQ<D~jk&1?XPn9nr3PeFol=A&*}7u}eXXIUsix`w81ODd
z(5&>gcE6?Kz+4SC?@EPKgZ*)Fj%w2<*@b(M@Y=?y17$EW)MM>ah1nyYqAzK~o&{uA
zbgSM@-_zIvOGPYuBaHQ(1*{1xSD}Uviik}}N~SKJbc&;W4YkL#n#>F{9kJW@8@l=i
zm#&;bw&z(Yy^O1PG!?b=xD!Yyy=qr-QbH6?qxwSav~kI10@?U!IK$LwE-PNMj1!75
z+UdgjD1e!y$?eF62qG}WSZg+PJ2fsyc#JB)y254J6MlV?kpco;lH|>LiPG(fJ5qL5
z@wyuLFRFyy>FQf*dPY9-k|7Vij4;zmxAg3Li{l-h&Uf?TYMePV)K%?FNlo;K4Go&)
z$5-){;>skWL<iHUEA*Wj>--8EIQ>1Tr%;ba(9VyUw5EtkW-2qf^^B8vit=`Q>a;LB
zoGHVK8o~m<tcv81x^9)Pe_&W>OkBdY9VvTuvQJdhnFh#}(=|#p^$qogMqXcTtcO1v
zn;~$Eda^1Fw<;wi#5snB1qS%y7=}nx0wUT46jOselHb&LXR=LE<HDn@#@UIK-VuSY
zJcEdJ#VIUgH6&PDtc$YFhXg~`(EY$GE;FpxaZ#zxhm5d#ikzI>edVgvegRv8!$PBD
z<2@1**YVWkl(+fLG-gaYS;a9EsWP49_>J$}lY&dB*6~D-xY+2>@Zc>0IG5P%y~-+6
zAm>Ad3*_i<_rcSWZ9w>R7oxlGd*QZh1b%dUy)I-19Ci>!LN-Znuz`mp_reBP%dF^N
z)`MgX1t1U75l<7T%o;u+a*?;Fv-jk<HL2G>VA7_*psis%+}#rD&cnmD2H{4pjsCdN
z3mXwd+@*Mq^V0O7HBlhv;4Nf0Z0*2t?R6{IK>s+Y<XiCT(@)XCI?#*j9@?;pY#I@Z
zkB2eyLu#>s9NEdj+G9_FN-`>IDiZ}c#DS8Su;F438<S^emzi$tB0f|Y4*LQzOemSk
zQTR>2&!q4WReEB@z~9o*5lWJ1ksN6!n=|Vr0FaBn%R?$GkflYQrS{u7xKCm|MyUhu
zlWh9i#Wr*m=aEepESC)+hVJGv^cxXHIX(vFy6wZ`onBfo4TyjF5HSkF7W?rqV!`%J
zb{&>BjSX~<JHmkcGzIic6p&tWn(i>g4_azN9b@RXS!u8_;Rw2Eh*;+r@beP5MQp?=
ze8IgaHE?2_PK|>TLq8TpajJQm6KjDExcut$za|Cw>{Nn9ngRwp<X8**vHgcsAR1GF
z%Q{|mnHduX0iddeNP&Qi5qF}2=~I#c8L|cXHo}NdisCg)Ub^kWq7zd0Amt30{uAOA
z?iMMMcCR{PDC(QUPIrCJzA8=r1-TYR1gSrb2@kRJG!tZ)J|8j>Tc;#kG-g11*edY1
z;F7Vx@E8y0msTL!o)$$orU`$;D#A;rXk3tRyk~b{t2MiBLDyjU0bZ=>3)C;WI{hR%
zJOt<4dqn+akj$Xq^kBP$Qs3KdN?7C@vt54ynNriyiH77qp&N+zY?r2-vc_b%W4uM$
z!Vol0f6pi^dGas1<=2>H#mlZqPsKa<Vc3PIsA?rqb`Ym1OL{j>LZXT$e3n;1VdoFT
ziJnwu?Lpv&_K>eb7WMRCr{wR#KTL{b+71~QWMe04gqv*OWp-U1jF|aGj6?WT_LaRI
z;tlr6<LJE)u0FJ%{CK!S%=DQ~F094b9!2S!13$nC!#z!n7Y;C-!WR873%PFR_q;)B
zlYfD-t&>AOTsEL9d4*jkyPUypzDgFg;+2<Ki>r&%?5Ac-i;anN;1S`*FxpJoJ(Y*^
z2#3g+*l9C<I@>AL^`)0zSwUv>Ditojc#O>ZO*dHuSU2AJLt%ih4hM@AOa}*MAOyj>
z{#xeh;N(3V&vwX$&kXV_L8=tTPMfJ`y7?*}U=~A%aYY<L!ej6lLkH}Muu@vJbnbbK
zODkuxn+Qx)hEl2Zw_3*=9Q$)DQam9?d5B1Y&5o=C7bkVXtiEP{q_SpQ9Ru<!kE_y8
zUOOkdJ%!C$FAvD94H#_SbUXJ0S(D;WrdzPp3M^Z2ssqPKF^Y6Gf(&%L)@tcLgZ-&0
zP5E!Yz7%MY+{sdKi=Ph&7rC(ge*ke{1`OD1W+zVNOr=DQPH-}75i{K%Pbqb^D8?*O
zh&YpDlxHAjdLgrQ{8&mU4Y7fzFha16?*j8~@?(JhlI-@Qc^44dw_0#avkOP795EN4
z!3He<0|HMy?M?T5N|AI_%LQf?!qoo>y!J3uGE^cscZ-8?@DfkR5CO&XW2tPBU!x;l
zu<{7&;W}qO3#BfYDYX~>Z)^W=%o2`5szzX;^K@<z9k5CZ?%(^7;AkMU9i|;dCl{T3
zNk45r9@a~kr`UR9qR=P1cSw;maQTsRQF9Y-3%ckus1xg@Q03>uZvJSwVV>cFc@s>A
zb<gU<*;$7U31>V02ii5tD+mUi!*#Z^NIu)y0HpbMqu76=SA+Z-&Zc9kf$@+TCrQuX
zFmogp>M)2xgrLdUkCWsqgZvA2y+evPOMVQ?!&SQ&QlssSrXlr@13DYgU8u*-`7G=P
zFtJF1T;lX9B^~*fQ~zPp2H&=`F^IeAj18P{m}s}NI5HoCLh1TTKZbRCsG8ulhj&Q!
ztOeTd20XHK+Zf6?Kay{-J>APB(V=VG>E|d;V9HIb`#HU)V(Rh_^NoquEMgk=&84Yy
z7lJcxi39i$RJcgtKLVsG&1UUkWa((kda)`2*3aX1jt<FTh1-t-h~w(pu{#g_M<k-*
z8C-=ydg=B+nbOJ3KPHTM1)-0HS)T{2S*!;tO2wSuM}R^g#N^G^+v8JQK;m#p3j4*1
zf1I8!DFS9YfD2PXpjOn&(X0i@;Qv*M{1;Aq3gWhR{R~i^Mi|9XZ8SQne-OrL$$R@C
z?yZSNPluZJA9|Xp_NOI>&mmE`BfH-Hk34-2`QC*_3n6rMkF#CZKlpHa1eAba)jN9#
zcOgyp>csP?88NC7rS)Ica(_pF{ql-vy7)5|j(T3cC`WWkuQTdZ&OR!HGc=Zn_dX?s
z)16o$5Cu*1P+9doIs|6f&U#=1^nd(#%=IEjadQedCHZb=mUE8^s1G@HmOr)+^v$Mg
zvD{{ey##$vF-!lWf<PNg74(1;mg~{LA~yJ7dy3m<bX~eCN86r~>}IinM-~o^W(7EV
zN-&soUXj0$!%s^Av)RCzN2Q5?&{}5_I|JdgNnr>E7v!sQuoVuq!rhMwt4n^>d5e{n
zDXw1th%<~g0B5L#%1%Ej7%VRdipD_&I9-*$#1(?4CA&8<8tHswa=_YvlRa%=KtSo6
z`K5eK_F%p6XnzmZ@yJlnTXizaEO5fQe{xO!N}lF@TJrk|qt_pqCD^=JEbU|+33jI?
zpIF)LOI-IDi>yO8d*gC9OidphoS1ontPb4X(kVH}Zr9-8DC48OU_)M!yWFT_dPFBh
zqt)&RmTbdZ+`f|kBuCnIqJ(N;r#l`M0=j_HOm#qRhOayPiM*>_cA%;oJ$;ZfH3W}H
z3*rRkHLhVC1HXtrLqK2zkUAy%H_7j@LV~9Ckzlbu{t{)I#c2vsFbZ|q?N7MaG!h|<
z^~Ph0i0Q>6fqCMW6!2EW`FDw<57%W}`3fm_;`S|wXh6{WXn<aU36Pvx9DF(<rJM3C
z+0h#!LsG%Lz^udkC<Nj2PyCXqH0Pi$$t#*}prxs2JnO+x(LOL{dK4%$4#UbhZk3>t
z(JXn#4C7+l8GZm6o=UyZqj7{mkZY)qfZ&TmCvMkqKku6X-IDzbvSt2gP`0v`Hz#*X
zb{?bhFe%>&7mlM?_KI*}kEo)J*k6LvE)-AMnc27T#T2ej_DJ?|tbHa8fc}1#I!zax
zzdHRaT`vsf&<)BCR9>|}49I-{)uZR+*QTG5+>wVy@swM<=w!qa>wooBKXweXxc6f3
zOAPSc!KKo(=(1AV)4)X?i(A+C(~%!!RIyUZZocwVh$nbUpi8ddV=iHRlAp&4xBkET
z9HujvM|C)b`}9gvo$ui~?r5BDLK4FWne{|CvyQWW_gO62cBDG^_2Rnp2e_^LDSIGu
zz!QCc_X%3zc8Rv@g9(h0IxVuRJNAYk@6v`gF?wfx4$do(QN9}k{eV%#Y=8)$L@nY;
z7`{*h$W?iI0A9i$l;x~9!s(UQXdH$9>2Cp<Fmywf9iJ&-x$@=;X9qht9Ds4jF5Y_a
zI_@_K14*`6FzyL|6DzR1(*i*FgqTeIfF$d5l(o-}pkT{UFw>R%22f>^r&06SEBORZ
zqtP|*Z2JK{-_N&9G|uT@Ei<OF?z56zEIm!sAo07n`yl+bNC6JkMMLa}LhNeCtn#nu
zfd!y@9%l?(qD*ghinPZTq%eFLgBh?W!FWsoJ!d4Jka)V+5tTd%i1=csF>(`(;U{ZD
zYPEe6NfuzRLN?X=9QG<eXY@S-?Q)DAzRjgC><w3Vxcc`P!h^0e!s(N}k@Q_LZFm$x
z06WIQy@>=8claBrv|{rL8pof!MzbQg+_-Qt(Ufc>XM~eh@!`p{t>5HuN}e_K3}(Tw
z&c2`+e5-?sCFYwCNk=s(NXB9UZbtn~3ihym4MnFsBSf<OjLa<d6_g04Rn(|fOmG0K
zyV5SRRxATKO$+n>T$=m_eSrskk;nAO7bJh0*t0eoGh^`>Q^_eWTSvHVVo1Hm<;|FI
zdmpR~oq_excYpNC)26@*L4Ox+N`y6T36G9*a(xM`cA(T504_v7nw4VdSHM$AU#IX+
zD?VXls;kqCnDEJdUijV|B*`=JD7mcP=mDzb=^;p2=OrJ1b|xqyIzGY4*_E}tw2Nb{
zoUfRnN{_j+_Ls3kti{#YDdF|#h^g$1zqe>KZTqFkICKSA^xYi&^7g6NdI1c`pS0YA
z^#fa9y8w1(N=VSuu<*yQw<{z#gq^_{yvGZbAElyh$twtU(2wT_<k=DUiXI~-7f{HM
z<QG26`qentbR@gPPWFO7|5>ud_XdFtb|%^xF>MUpIDOd;zVQGHv_P%W4vLHPeLjBS
z+tF8Bzp&_n>=KW;IPUDjm+tgQ-odf!=q>t^p3AbcV+ia1Rsu8LA<=NO%XsywoD@5i
z^&wUgmE86kl^TBRx+C7FZwUHIcKM0BJ*87rcVAPS@Uahn1Ag%p-u$!dgk2c8NSDIL
z2o@5<9I@8|_^#p2Te8!%h!DTqFykri@w2gjFoxoupkhAkGAlkJ*q-%#g#s-gBqH`r
z7X)b`U_yFVSUbK!DJ;a^&ex0V*vpso*@uKV#QzjG+n{zqeK00p!DlI6xH!++KFtv`
z|M0LU_|(VQ^~a|^5f<)_ng6uyvz!p;tU*OMGW|l|h-Cf0^&6k4fI#E~M5}`73nUQw
z#qVtxJWJSh@eh14)!x;wL`6l##>Q^nzCAH9arf@sd-m-4^{;=uckkYJ-+g!g{{0=H
zUR}|ixw*MLLB8F=zI|JM)w{+24E_ZApV{Q!8@Tb@X8*oTn+5`Yb#`;WnZV7xTLRB+
z-h6Izz`&+}^Z2uQ^Jf78pKje$TwGjMR#sJot-{P~Hn+94ojrSYU|?WyaPXUNzWMgs
zZy!8(Fg7-3Ya>m-F53yxFP6{BdEM9Y#_F>f8@da(d{r5A?c->ChnB6a&BO^d6DHV9
zvY+ty6lwBf6Q@3IJAL{DhbJdL{q%%6PuV)nwVnCY<i(37Em+|Av!6Zb<TO{7AHyk+
z7hn9RmtX$bx>e6bgg@ow<?83-8W{NU>#zSjEbLdB_nv#_oz=<7n`2_4<KyEr|GKWI
z(Dz8W`)_`e{!yJ@^Tz=d<!^O$hV`|^oI4wRdt}{bhKM_(>&@o3Zx3%69o}$z#B+Gq
z_x7;&@GZa55#K-F^&B3-ufDfN{J*~Kdt=mZbl7ir#Q)AM-@C&;qr?8g!<&bP18xud
z-M;02d&K|d*PCyR1l%3|)va5Bqj>#R!0_;vksF)tjBdPgDfZ6r#+$=iZjEgI^T?*r
zTbpm++&p|Mcz7i6&M<!6a{K0%;agj84+q}4vH8x(=FwZhqc^vHH5hwmWXtG{;M>DN
zcW!ODbtCl7*TKWL!bXQf|9CBScsOkIX6W6ox84~Expw*WZ}7;ih?`%>-o6nzIubQ}
zHfD4<=H}N4s#<jKdi3?)v<H`CuU^hLaiV(U)~}6*rtU7&&9AG!{POCz-+pud{<mXe
z_ib#YiFUSj_7f&OHgWP4yPrPg_+aclS)r{odV7@AX=?-3((m+jX%i*M4&R$*BiTvP
zBuSbqN%&?pe23Z;NqS=T?70gUF8bNemL?>;{?=Q&2L?WUaDVLnz58c2Z8^6w@Z6@&
n0|8skZQ62vWAH#g@cE5f&jsMc;DJq>2mQ9557_+K#=!pzHHof_

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;<h4s>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
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

literal 0
HcmV?d00001

diff --git a/16/modex16/koishi^^.pcx b/16/modex16/koishi^^.pcx
new file mode 100755
index 0000000000000000000000000000000000000000..0dbbc0da38a2d790195b3e8321370ef6c9217f91
GIT binary patch
literal 4039
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

literal 0
HcmV?d00001

diff --git a/16/modex16/koishi~.pcx b/16/modex16/koishi~.pcx
new file mode 100755
index 0000000000000000000000000000000000000000..58a03bb4f6620271a3402bd1a0755ef8d8ae4d4c
GIT binary patch
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<O?ZFw_q-uLtU
ze1E*}`_AO)Cug6U!QcD%=fBTCT{ri{m)XY5>`dc{z1hSXL%>jmk}%F*?@4lRV?F8p
z7lS9a1)Y=gTUhU51Xw>g{}pQ;j5gL!&d++nD?O>LmQ+?Kw@=N<Qh8-5iMvDAeW~3$
z7#gTpiPI7Ue8k7P!_VZj#j$kwsVfFrgPAAD<w4^2$5Hj<sMW4iWnZWTPdo%N%FC!V
zWTp(hrJi^I+-;1O9KW_B$UZQ*2y^`029I)ELe0UOK4#Qf0GxJxL31Q1MI{ZiFMW5<
zu*OSU(Deqo8C@iyY$cWJV;spOQslZw3slrL!5&w|qrToaiCR*kU7;c}Swx;B)!}13
z(i$h@C`fczs}R|PO_ye<j;ql>kO?uuuTViPsDfXl0<$QvAg^`95F<r4gn|dU(BYWb
z4_AvwbCQgpw}&dz6%rin0q01ZUDdKJyu8loJoeL7j1a!b&UgvVkI)q@aF%ieUCMho
z%uQWKx`_}KScE27%;4u}p1`5tgO;j(B*8He!3;DHeTy=B9#=fUqj}1C!ms}Yj>!nr
zdftPs%0L@T=5FQ+TprHvx8O;Fg5T^<j`f&HgT>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%oSufGCD<RAH#6)jv9_67{q0G6snNY;K}$^586L)#4!@=6m09f
z%KCFUi#g)`(dfiUI6kjRHRVtZXA*bLbtr%8YmS$r$5~W`M|qs&s$y*$ouP^=7_`kE
zC&3`ERh$lsJDRF$TUV8>B|+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^cC<ovBLv)0V^4JYS^*k
zB}njH72rKc<-l0^Z(4Y7vAqhqjKFRp24f||R`3;To1CAr^lx<fHim4Osw*KD8~b|7
zMpAqb<;(cbk?`q@;!t*1pcA29qC8E9#Fqx2<0f`A%8DHb{}kH<%v#W(Rj-LJvL>ye
zHf($qVMHvZLM9@DHCo+YL!ORxP4$mnKl#h+nQ4Fgg}>eX^Q$lRKe$Tg-(Fu_9{OQ7
z>fs<f+IrM|Z}Y~>7cV^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<Qa1e*j6Q^;Q4?

literal 0
HcmV?d00001

diff --git a/16/modex16/lib/lib_com.cpp b/16/modex16/lib/lib_com.cpp
new file mode 100755
index 00000000..19ad2ddf
--- /dev/null
+++ b/16/modex16/lib/lib_com.cpp
@@ -0,0 +1,21 @@
+//#include "src\lib\lib_com.h"
+#include "lib\lib_com.h"
+
+/* local function */
+void wait(clock_t wait);
+
+/* Function: Wait **********************************************************
+*
+*     Parameters:    wait - time in microseconds
+*
+*     Description:    pauses for a specified number of microseconds.
+*
+*/
+void wait(clock_t wait){
+	clock_t goal;
+
+	if(!wait) return;
+
+	goal = wait + clock();
+	while((goal > 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 <dos.h>
+#include <stdio.h>
+#include <conio.h> // just for wait
+#include <time.h> // 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 <dos.h>
+#include <string.h>
+#include <mem.h>
+#include <conio.h>
+#include <stdio.h>
+#include <stdlib.h>
+#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, &regs, &regs);
+}
+
+
+/* -========================= Entry  Points ==========================- */
+void
+modexEnter() {
+    word i;
+    dword far*ptr=(dword far*)VGA;      /* used for faster screen clearing */
+    word CRTParms[] = {
+	0x0d06,		/* vertical total */
+	0x3e07,		/* overflow (bit 8 of vertical counts) */
+	0x4109,		/* cell height (2 to double-scan */
+	0xea10,		/* v sync start */
+	0xac11,		/* v sync end and protect cr0-cr7 */
+	0xdf12,		/* vertical displayed */
+	0x0014,		/* turn off dword mode */
+	0xe715,		/* v blank start */
+	0x0616,		/* v blank end */
+	0xe317		/* turn on byte mode */
+    };
+    int CRTParmCount = sizeof(CRTParms) / sizeof(CRTParms[0]);
+
+    /* TODO save current video mode and palette */
+    vgaSetMode(VGA_256_COLOR_MODE);
+
+    /* disable chain4 mode */
+    outpw(SC_INDEX, 0x0604);
+
+    /* synchronous reset while setting Misc Output */
+    outpw(SC_INDEX, 0x0100);
+
+    /* select 25 MHz dot clock & 60 Hz scanning rate */
+    outp(MISC_OUTPUT, 0xe3);
+
+    /* undo reset (restart sequencer) */
+    outpw(SC_INDEX, 0x0300);
+
+    /* reprogram the CRT controller */
+    outp(CRTC_INDEX, 0x11); /* VSync End reg contains register write prot */
+    outp(CRTC_DATA, 0x7f);  /* get current write protect on varios regs */
+
+    /* send the CRTParms */
+    for(i=0; i<CRTParmCount; i++) {
+	outpw(CRTC_INDEX, CRTParms[i]);
+    }
+
+    /* clear video memory */
+    outpw(SC_INDEX, 0x0f02);
+    for(i=0; i<0x8000; i++) {
+	ptr[i] = 0x0000;
+    }
+}
+
+
+void
+modexLeave() {
+    /* TODO restore original mode and palette */
+    vgaSetMode(TEXT_MODE);
+}
+
+
+page_t
+modexDefaultPage() {
+    page_t page;
+
+    /* default page values */
+    page.data = VGA;
+    page.dx = 0;
+    page.dy = 0;
+    page.width = SCREEN_WIDTH;
+    page.height = SCREEN_HEIGHT;
+
+    return page;
+}
+
+/* returns the next page in contiguous memory
+ * the next page will be the same size as p, by default
+ */
+page_t
+modexNextPage(page_t *p) {
+    page_t result;
+
+    result.data = p->data + (p->width/4)*p->height;  /* compute the offset */
+    result.dx = 0;
+    result.dy = 0;
+    result.width = p->width;
+    result.height = p->height;
+
+    return result;
+}
+
+
+void
+modexShowPage(page_t *page) {
+    word high_address;
+    word low_address;
+    word offset;
+    byte crtcOffset;
+
+    /* calculate offset */
+    offset = (word) page->data;
+    offset += page->dy * (page->width >> 2 );
+    offset += page->dx >> 2;
+
+    /* calculate crtcOffset according to virtual width */
+    crtcOffset = page->width >> 3;
+
+    high_address = HIGH_ADDRESS | (offset & 0xff00);
+    low_address  = LOW_ADDRESS  | (offset << 8);
+
+    /* wait for appropriate timing and then program CRTC */
+    while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));
+    outpw(CRTC_INDEX, high_address);
+    outpw(CRTC_INDEX, low_address);
+    outp(CRTC_INDEX, 0x13);
+    outp(CRTC_DATA, crtcOffset);
+
+    /*  wait for one retrace */
+    while (!(inp(INPUT_STATUS_1) & VRETRACE)); 
+
+    /* do PEL panning here */
+    outp(AC_INDEX, 0x33);
+    outp(AC_INDEX, (page->dx & 0x03) << 1);
+}
+
+
+void
+modexPanPage(page_t *page, int dx, int dy) {
+    page->dx = dx;
+    page->dy = dy;
+}
+
+
+void
+modexSelectPlane(byte plane) {
+    outp(SC_INDEX, MAP_MASK);          /* select plane */
+    outp(SC_DATA,  plane);
+}
+
+
+void
+modexClearRegion(page_t *page, int x, int y, int w, int h, byte  color) {
+    word pageOff = (word) page->data;
+    word xoff=x/4;       /* xoffset that begins each row */
+    word scanCount=w/4;  /* number of iterations per row (excluding right clip)*/
+    word poffset = pageOff + y*(page->width/4) + xoff; /* starting offset */
+    word nextRow = page->width/4-scanCount-1;  /* loc of next row */
+    byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08};  /* clips for rectangles not on 4s */
+    byte rclip[] = {0x00, 0x01, 0x03, 0x07};
+    byte left = lclip[x&0x03];
+    byte right = rclip[(x+w)&0x03];
+
+    /* handle the case which requires an extra group */
+    if((x & 0x03) && !((x+w) & 0x03)) {
+      right=0x0f;
+    }
+
+    __asm {
+		MOV AX, SCREEN_SEG      ; go to the VGA memory
+		MOV ES, AX
+		MOV DI, poffset		; go to the first pixel
+		MOV DX, SC_INDEX	; point to the map mask
+		MOV AL, MAP_MASK
+		OUT DX, AL
+		INC DX
+		MOV AL, color		; get ready to write colors
+	SCAN_START:
+		MOV CX, scanCount	; count the line
+		MOV BL, AL		; remember color
+		MOV AL, left		; do the left clip
+		OUT DX, AL		; set the left clip
+		MOV AL, BL		; restore color
+		STOSB			; write the color
+		DEC CX
+		JZ SCAN_DONE		; handle 1 group stuff
+
+		;-- write the main body of the scanline
+		MOV BL, AL	  	; remember color
+		MOV AL, 0x0f		; write to all pixels
+		OUT DX, AL
+		MOV AL, BL		; restore color
+		REP STOSB		; write the color
+	SCAN_DONE:
+		MOV BL, AL		; remeber color
+		MOV AL, right
+		OUT DX, AL		; do the right clip
+		MOV AL, BL		; restore color
+		STOSB			; write pixel
+		ADD DI, nextRow		; go to the next row
+		DEC h
+		JNZ SCAN_START
+    }
+}
+
+
+void
+modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp) {
+    /* draw the region (the entire freakin bitmap) */
+    modexDrawBmpRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);
+}
+
+
+void
+modexDrawBmpRegion(page_t *page, int x, int y,
+                   int rx, int ry, int rw, int rh, bitmap_t *bmp) {
+    word poffset = (word) page->data  + y*(page->width/4) + x/4;
+    byte *data = bmp->data;
+    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<PAL_SIZE; i++) { /* loadpal_loop */
+	    tmppal[i] = palette[i] - dim;
+	    if(tmppal[i] > 127) {
+		tmppal[i] = 0;
+	    } else if(tmppal[i] > 63) {
+		tmppal[i] = 63;
+	    }
+	}
+        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<PAL_SIZE; i++) {
+	palette[i] = inp(PAL_DATA_REG); /* read the palette data */
+    }
+}
+
+
+byte *
+modexNewPal() {
+    byte *ptr;
+    ptr = malloc(PAL_SIZE);
+
+    /* handle errors */
+    if(!ptr) {
+	printf("Could not allocate palette.\n");
+	exit(-1);
+    }
+
+    return ptr;
+}
+
+
+void
+modexLoadPalFile(byte *filename, byte **palette) {
+    FILE *file;
+    byte *ptr;
+
+    /* free the palette if it exists */
+    if(*palette) {
+	free(*palette);
+    }
+
+    /* allocate the new palette */
+    *palette = modexNewPal();
+
+    /* open the file */
+    file = fopen(filename, "rb");
+    if(!file) {
+	printf("Could not open palette file: %s\n", filename);
+	exit(-2);
+    }
+
+    /* read the file */
+    ptr = *palette;
+    while(!feof(file)) {
+	*ptr++ = fgetc(file);
+    }
+
+    fclose(file);
+}
+
+
+void
+modexSavePalFile(char *filename, byte *pal) {
+    unsigned int i;
+    FILE *file;
+
+    /* open the file for writing */
+    file = fopen(filename, "wb");
+    if(!file) {
+	printf("Could not open %s for writing\n", filename);
+	exit(-2);
+    }
+
+    /* write the data to the file */
+    fwrite(pal, 1, PAL_SIZE, file);
+    fclose(file);
+}
+
+
+/* blanking */
+void
+modexPalBlack() {
+    fadePalette(-1, 64, 1, tmppal);
+}
+
+
+void
+modexPalWhite() {
+    fadePalette(-1, -64, 1, tmppal);
+}
+
+
+/* utility */
+void
+modexPalUpdate(byte *p) {
+    int i;
+    modexWaitBorder();
+    outp(PAL_WRITE_REG, 0);  /* start at the beginning of palette */
+    for(i=0; i<PAL_SIZE/2; i++) {
+	outp(PAL_DATA_REG, p[i]);
+    }
+    modexWaitBorder();	    /* waits one retrace -- less flicker */
+    for(i=PAL_SIZE/2; i<PAL_SIZE; i++) {
+	outp(PAL_DATA_REG, p[i]);
+    }
+}
+
+
+void
+modexWaitBorder() {
+    while(inp(INPUT_STATUS_1)  & 8)  {
+	/* spin */
+    }
+
+    while(!(inp(INPUT_STATUS_1)  & 8))  {
+	/* spin */
+    }
+}
diff --git a/16/modex16/modex16.h b/16/modex16/modex16.h
new file mode 100755
index 00000000..77573105
--- /dev/null
+++ b/16/modex16/modex16.h
@@ -0,0 +1,86 @@
+/*
+ * Functions for handling modex and doing other basic graphics stuff.
+ */
+#ifndef MODEX16_H
+#define MODEX16_H
+#include <conio.h>
+#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 <stdio.h>
+#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; py<bmp->height; 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
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
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 <stdio.h>
+#include <stdlib.h>
+#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 = &map;
+//	mv2.map = &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; q<TILEWH; q++) {
+		mapScrollRight(draw, 1);
+//		modexShowPage(draw->page);
+//		mapScrollRight(draw, 1);
+//		SWAP(draw, show);
+//		}
+	}
+
+	if(keyp(75)){
+//		for(q=0; q<TILEWH; q++) {
+ 		mapScrollLeft(draw, 1);
+//		modexShowPage(draw->page);
+// 		mapScrollLeft(show, 1);
+//		SWAP(draw, show);
+//		}
+	}
+
+	if(keyp(80)){
+//		for(q=0; q<TILEWH; q++) {
+		mapScrollDown(draw, 1);
+//		modexShowPage(draw->page);
+//		mapScrollDown(show, 1);
+//		SWAP(draw, show);
+//		}
+	}
+
+	if(keyp(72)){
+//		for(q=0; q<TILEWH; q++) {
+		mapScrollUp(draw, 1);
+//		modexShowPage(draw->page);
+//		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; y<TILEWH; y++) {
+	for(x=0; x<(TILEWH*2); x++) {
+		if(x<TILEWH)
+		  map->tiles->data->data[i] = 0x24;
+		else
+		  map->tiles->data->data[i] = 0x34;
+		i++;
+	}
+	}
+
+	i=0;
+	for(y=0; y<map->height; y++) {
+		for(x=0; x<map->width; 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; x<SCREEN_WIDTH+mv->dxThresh && 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; y<SCREEN_HEIGHT+mv->dyThresh && 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 <stdio.h>
+
+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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

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
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

literal 0
HcmV?d00001

diff --git a/16/modex16/types.h b/16/modex16/types.h
new file mode 100755
index 00000000..039653f2
--- /dev/null
+++ b/16/modex16/types.h
@@ -0,0 +1,11 @@
+/*
+ * Just some handy typedefs that make it easier to think about the low
+ * level code
+ */
+
+typedef unsigned char byte;
+typedef unsigned short word;
+typedef unsigned long  dword;
+typedef signed char sbyte;
+typedef signed short sword;
+typedef signed long sdword;
diff --git a/16/modex16/w.pcx b/16/modex16/w.pcx
new file mode 100755
index 0000000000000000000000000000000000000000..ad8087965eb0d26aa6a4ff2a60504485eb562f02
GIT binary patch
literal 1617
zcmeH{p=v`h6o&sh7>qGdQCSgFsED|tBBJJq`v4J_QF-Soj~WaDqmR%B=tkvzfXHhr
z`Un*rtL#IZ-E<U^5mP&Q^5>l7|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^?sz<g2L~aDgLLROy*hyt&>s-FX~zXPCu=92lY<ipI*9AUttADKn+M*@
z*2~_@$%_P?#P7v#B?Xb22LO-223&(VsAd?(h*J=`d0-4zhHJx(VGe58)NCqFLFDFv
zwLG`nSYBA>pat88?VM8(xp@H40Hi=Ah=NLjA`B=6k(&of(L_<H$S9&9L#iY-p%g@J
e9%xOarm3cxCJLI7o{}yp1(BNv*>C>&<?RO|nAL><

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 <stdio.h>
-- 
2.39.5