From: sparky4 <sparky4@cock.li>
Date: Fri, 24 Jul 2015 21:35:17 +0000 (-0500)
Subject: ====scroll.exe coverted and bakapi.exe converted!! this is a major commit!
X-Git-Url: http://4ch.mooo.com/gitweb/?a=commitdiff_plain;h=6b585194480dbbfb1ca8ae9d4564418b24e79d48;p=16.git

====scroll.exe coverted and bakapi.exe converted!! this is a major commit!
	modified:   16.exe
	modified:   16.hed
	renamed:    scroll.exe -> _scroll.exe
	modified:   bakapi.exe
	modified:   exmmtest.exe
	modified:   fontgfx.exe
	modified:   inputest.exe
	modified:   makefile
	modified:   maptest.exe
	modified:   palettec.exe
	modified:   pcxtest.exe
	modified:   scroll.exe
	modified:   sountest.exe
	modified:   src/bakapi.c
	modified:   src/lib/16_head.h
	modified:   src/lib/16_in.h
	modified:   src/lib/bakapee.c
	modified:   src/lib/bakapee.h
	modified:   src/lib/modex16.c
	modified:   src/lib/modex16.h
	modified:   src/lib/scroll.c
	modified:   src/lib/scroll16.c
	modified:   src/lib/scroll16.h
	modified:   src/scroll.c
	modified:   test.exe
	modified:   test2.exe
	modified:   tsthimem.exe
---

diff --git a/16.exe b/16.exe
index 755921db..1d6be61b 100644
Binary files a/16.exe and b/16.exe differ
diff --git a/16.hed b/16.hed
index 26b5fb21..f138c24b 100644
Binary files a/16.hed and b/16.hed differ
diff --git a/_scroll.exe b/_scroll.exe
new file mode 100644
index 00000000..4052f6db
Binary files /dev/null and b/_scroll.exe differ
diff --git a/bakapi.exe b/bakapi.exe
index 901f024c..4feb2416 100644
Binary files a/bakapi.exe and b/bakapi.exe differ
diff --git a/exmmtest.exe b/exmmtest.exe
index 16ed980b..a180d7a4 100644
Binary files a/exmmtest.exe and b/exmmtest.exe differ
diff --git a/fontgfx.exe b/fontgfx.exe
index 3d7992f0..633fbcac 100644
Binary files a/fontgfx.exe and b/fontgfx.exe differ
diff --git a/inputest.exe b/inputest.exe
index 842c7b7d..37ca5d82 100644
Binary files a/inputest.exe and b/inputest.exe differ
diff --git a/makefile b/makefile
index abbbd750..82200449 100644
--- a/makefile
+++ b/makefile
@@ -30,7 +30,7 @@ DOSLIBOBJ = adlib.$(OBJ) midi.$(OBJ) 8254.$(OBJ) 8259.$(OBJ) dos.$(OBJ) cpu.$(OB
 16LIBOBJS = bakapee.$(OBJ) 16_in.$(OBJ) 16_mm.$(OBJ) wcpu.$(OBJ) 16_head.$(OBJ) scroll16.$(OBJ) 16_ca.$(OBJ)
 GFXLIBOBJS = modex16.$(OBJ) bitmap.$(OBJ) planar.$(OBJ) 16text.$(OBJ)
 
-TESTEXEC =  exmmtest.exe test.exe pcxtest.exe test2.exe palettec.exe maptest.exe fmemtest.exe fonttest.exe fontgfx.exe sountest.exe tsthimem.exe inputest.exe
+TESTEXEC =  exmmtest.exe test.exe pcxtest.exe test2.exe palettec.exe maptest.exe fmemtest.exe fonttest.exe fontgfx.exe sountest.exe tsthimem.exe inputest.exe scroll.exe
 #testemm.exe testemm0.exe fonttes0.exe miditest.exe
 EXEC = 16.exe bakapi.exe $(TESTEXEC)
 
@@ -47,10 +47,11 @@ bakapi.exe: bakapi.$(OBJ) 16.lib
 #
 #Test Executables!
 #
-scroll.exe: scroll.$(OBJ) 16.lib mapread.$(OBJ) jsmn.$(OBJ)# dos_kb.$(OBJ)
-	wcl $(FLAGS) scroll.$(OBJ) 16.lib mapread.$(OBJ) jsmn.$(OBJ)# dos_kb.$(OBJ)
+scroll.exe: scroll.$(OBJ) 16.lib mapread.$(OBJ) jsmn.$(OBJ)
+	wcl $(FLAGS) scroll.$(OBJ) 16.lib mapread.$(OBJ) jsmn.$(OBJ)
 scroll.$(OBJ): $(SRC)scroll.c
 	wcl $(FLAGS) -c $(SRC)scroll.c
+
 sega.exe: sega.$(OBJ)
 	wcl $(FLAGS) -c sega.$(OBJ)
 sega.$(OBJ): $(SRC)sega.c
diff --git a/maptest.exe b/maptest.exe
index 72086a5f..bd0d2852 100644
Binary files a/maptest.exe and b/maptest.exe differ
diff --git a/palettec.exe b/palettec.exe
index 44c1f731..7cf347c9 100644
Binary files a/palettec.exe and b/palettec.exe differ
diff --git a/pcxtest.exe b/pcxtest.exe
index e011ca41..34901601 100644
Binary files a/pcxtest.exe and b/pcxtest.exe differ
diff --git a/scroll.exe b/scroll.exe
index 4052f6db..49eb80da 100644
Binary files a/scroll.exe and b/scroll.exe differ
diff --git a/sountest.exe b/sountest.exe
index 87ad9cd7..4aa8c2b3 100644
Binary files a/sountest.exe and b/sountest.exe differ
diff --git a/src/bakapi.c b/src/bakapi.c
index 16ef8956..073ff676 100644
--- a/src/bakapi.c
+++ b/src/bakapi.c
@@ -1,4 +1,4 @@
-/* Project 16 Source Code‾
+/* Project 16 Source Code~
  * Copyright (C) 2012-2015 sparky4 & pngwen & andrius4669
  *
  * This file is part of Project 16.
@@ -28,8 +28,7 @@
 void
 main(int argc, char *argv[])
 {
-	global_game_variables_t gamevars;
-	bakapee_t bakapee;
+	static bakapee_t bakapee;
 	page_t screen;
 	word key,d,xpos,ypos,xdir,ydir;
 	int ch=0x0;
@@ -42,13 +41,15 @@ main(int argc, char *argv[])
 	ydir=1;
 	bakapee.xx = rand()&0%SCREEN_WIDTH;
 	bakapee.yy = rand()&0%SCREEN_HEIGHT;
-	bakapee.gq = LGQ;
+	bakapee.qq = 0;
+	bakapee.gq = 0;
 	bakapee.sx=0;
 	bakapee.sy=0;
 	bakapee.bakax=0;
 	bakapee.bakay=0;
+	bakapee.coor=0;
 
-	/* setup camera and screen‾ */
+	/* setup camera and screen~ */
 	screen = modexDefaultPage();
 	screen.width += (TILEWH*2);
 	screen.height += (TILEWH*2);
@@ -58,6 +59,9 @@ main(int argc, char *argv[])
 	//modexDrawBmp(VGA, 0, 0, &bmp, 0); //____
 	//getch(); //____
 
+	VGAmodeX(1);
+	modexShowPage(&screen);
+
 // screen savers
 #ifdef BOINK
 	while(d!=0)	// on!
@@ -68,17 +72,22 @@ main(int argc, char *argv[])
 		}
 		else
 		{
-			setVGAmodeX(&gamevars, 0);
+			VGAmodeX(0);
+			//modexLeave();
 			// user imput switch
-			printf("Enter 1, 2, 3, 4, or 6 to run a screensaver, or enter 0 to quit.Â¥n", getch());  // prompt the user
+			printf("Enter 1, 2, 3, 4, or 6 to run a screensaver, or enter 0 to quit.\n", getch());  // prompt the user
 			scanf("%d", &key);
 			//if(key==3){xx=yy=0;} // crazy screen saver wwww
-			if(key==0) d=0;
-			setVGAmodeX(&gamevars, 1);
+			if(key==0){ d=0; }else{
+				screen = modexDefaultPage();
+				screen.width += (TILEWH*2);
+				screen.height += (TILEWH*2);
+				VGAmodeX(1);
+				modexShowPage(&screen);
+			}
 		}
 	}
 #else
-	setVGAmodeX(&gamevars, 1);
 	while(1)
 	{ // conditions of screen saver
 		while(!kbhit())
@@ -118,7 +127,7 @@ main(int argc, char *argv[])
 		mxOutText(xpos+1, ypos+SCREEN_HEIGHT-24, "|    |$line3");
 		mxOutText(xpos+1, ypos+SCREEN_HEIGHT-16, "|    |$line4");
 		mxOutText(xpos+1, ypos+SCREEN_HEIGHT-8,  "========================================");
-		mxFillBox(xpos+QUADWH, ypos+QUADWH+(TILEWH*12), TILEWH*2, TILEWH*2, 9, OP_SET); //portriat‾
+		mxFillBox(xpos+QUADWH, ypos+QUADWH+(TILEWH*12), TILEWH*2, TILEWH*2, 9, OP_SET); //portriat~
 		getch();
 		mxBitBlt(0, BS, SCREEN_WIDTH, TILEWH*BUFFMX, xpos, ypos+(TILEWH*12)); //copy background
 		getch();++++*/
@@ -151,8 +160,8 @@ main(int argc, char *argv[])
 	if(ch==0x71)break; // 'q'
 	if(ch==0x1b)break; // 'ESC'
 	}
-	setVGAmodeX(&gamevars, 0);
+//	VGAmodeX(0);
 #endif
-	printf("bakapi ver. 1.04.13.04¥nis made by sparky4(≧ω≦) feel free to use it ^^¥nLicence: GPL v3¥n");
+	printf("bakapi ver. 1.04.13.04\nis made by sparky4i†ƒÖ…j feel free to use it ^^\nLicence: GPL v3\n");
 }
 //pee!
diff --git a/src/lib/16_head.h b/src/lib/16_head.h
index c0bc4cfb..4a923a8c 100644
--- a/src/lib/16_head.h
+++ b/src/lib/16_head.h
@@ -138,7 +138,7 @@
 
 static dword far* clockdw= (dword far*) 0x046C; /* 18.2hz clock */
 //static dword clockdw=0;
-extern	int			profilehandle,debughandle;
+extern	int			profilehandle,debughandle;	//make it into game global
 
 #define	nil	((void *)0)
 
@@ -154,6 +154,10 @@ typedef	enum	{false,true}	boolean;
 //I hope this is correct!
 //__self
 typedef void __based(__self) * memptr;
+typedef struct
+{
+	int old_mode;	//old video mode before game!
+} global_game_variables_t;
 
 /* local function */
 void wait(clock_t wait);
diff --git a/src/lib/16_in.h b/src/lib/16_in.h
index bb0e8e61..8008ab86 100644
--- a/src/lib/16_in.h
+++ b/src/lib/16_in.h
@@ -28,7 +28,8 @@
 #define	__16_IN__
 
 #include <string.h>
-#include "src/lib/16_head.h"
+#include "src/lib/16_head.h"
+#include "src/lib/bitmap.h"
 
 #ifdef	__DEBUG__
 //#define	__DEBUG_InputMgr__
@@ -215,12 +216,13 @@ typedef	struct
 	int triggery; //player's trigger box tile position on the viewable map
 	int setx; //NOT USED YET! player sprite sheet set on the image x
 	int sety; //NOT USED YET! player sprite sheet set on the image y
-	word q; //loop variable
-//	word d; //direction
-	//bitmap_t data; //supposively the sprite sheet data
-	int hp; //hitpoints of the player
+	word q; //loop variable
+	word speed;		//player speed!
+	bitmap_t data; //supposively the sprite sheet data
+	int hp; //hitpoints of the player
+	word persist_aniframe;    /* gonna be increased to 1 before being used, so 0 is ok for default */
 	CursorInfo	info;
-	ControlType	Controls;
+	ControlType	Controls;
 } player_t;
 
 /*
diff --git a/src/lib/bakapee.c b/src/lib/bakapee.c
index 8dbca62b..90ff502d 100644
--- a/src/lib/bakapee.c
+++ b/src/lib/bakapee.c
@@ -22,33 +22,6 @@
 
 #include "src/lib/bakapee.h"
 
-/////////////////////////////////////////////////////////////////////////////
-//                                                                         //
-// setvideo() - This function Manages the video modes					  //
-//                                                                         //
-/////////////////////////////////////////////////////////////////////////////
-void setVGAmodeX(global_game_variables_t *vid, boolean vq)
-{
-	union REGS in, out;
-
-	if(!vq)
-	{ // deinit the video
-		// change to the video mode we were in before we switched to mode 13h
-		modexLeave();
-		in.h.ah = 0x00;
-		in.h.al = vid->old_mode;
-		int86(0x10, &in, &out);
-
-	}else if(vq==1){ // init the video
-		// get old video mode
-		in.h.ah = 0xf;
-		int86(0x10, &in, &out);
-		vid->old_mode = out.h.al;
-		// enter mode
-		modexEnter();
-	}
-}
-
 void pdump(page_t *pee)
 {
 	int mult=(QUADWH);
@@ -141,7 +114,7 @@ void dingo(bakapee_t *pee)
 
 void dingas(bakapee_t *pee)
 {
-	if(pee->gq == BONK) dingu(pee);
+	if(pee->qq == BONK) dingu(pee);
 	if(!pee->bakax)
 	{
 		#ifdef TILE
@@ -181,8 +154,10 @@ void dingu(bakapee_t *pee)
 	if(pee->coor < HGQ && pee->coor < LGQ) pee->coor = LGQ;
 	if(pee->coor < HGQ)
 	{
+		pee->qq++;
 		pee->coor++;
 	}else{ pee->coor = LGQ;
+		pee->qq = 0;
 		pee->bakax = rand()%3; pee->bakay = rand()%3;
 	}
 }
@@ -196,32 +171,33 @@ void ding(page_t *page, bakapee_t *pee, word q)
 	switch(q)
 	{
 		case 1:
-			if(pee->gq<BONK)
+			if(pee->qq<BONK)
 			{
 				if(pee->xx==SCREEN_WIDTH){pee->bakax=0;}
 				if(pee->xx==0){pee->bakax=1;}
 				if(pee->yy==SCREEN_HEIGHT){pee->bakay=0;}
 				if(pee->yy==0){pee->bakay=1;}
-				pee->gq++;
-			}else pee->gq = LGQ;
+				pee->qq++;
+			}else pee->qq = 0;
 		break;
 		case 2:
-			if(pee->gq<BONK)
+			if(pee->qq<BONK)
 			{
+				dingu(pee);
 				dingas(pee);
 				dingo(pee);
 				dingpp(page, pee);	//plot the pixel/tile
 #ifdef TILE
-				modexClearRegion(page, (rand()*TILEWH)%SCREEN_WIDTH, (rand()*TILEWH)%(SCREEN_HEIGHT), TILEWH, TILEWH, 0);
+				modexClearRegion(page, (rand()*TILEWH)%page->width, (rand()*TILEWH)%(page->height), TILEWH, TILEWH, 0);
 #else
-				modexputPixel(page, rand()%SCREEN_WIDTH, rand()%(SCREEN_HEIGHT), 0);
+				modexputPixel(page, rand()%page->width, rand()%page->height, 0);
 #endif
 				pee->bakax = rand()%3; pee->bakay = rand()%3;
-				pee->gq++;
-			}else pee->gq = LGQ;
+				pee->qq++;
+			}else pee->qq = 0;
 		break;
 		case 3:
-			if(pee->gq<BONK)
+			if(pee->qq<BONK)
 			{
 				if(pee->xx!=SCREEN_WIDTH||pee->yy!=SCREEN_HEIGHT)
 				{
@@ -251,18 +227,19 @@ void ding(page_t *page, bakapee_t *pee, word q)
 				{
 					pee->xx++;
 				}
-				pee->gq++;
-			}else pee->gq = LGQ;
+				pee->qq++;
+			}else pee->qq = 0;
 		break;
 		case 4:
-			if(pee->gq<BONK)
+			if(pee->qq<BONK)
 			{
+				dingu(pee);
 				dingas(pee);
 				dingo(pee);
 				dingpp(page, pee);	//plot the pixel/tile
 				pee->bakax = rand()%3; pee->bakay = rand()%3;
-				pee->gq++;
-			}else pee->gq = LGQ;
+				pee->qq++;
+			}else pee->qq = 0;
 		break;
 		case 5:
 			colortest(page, pee);
@@ -297,31 +274,29 @@ void ding(page_t *page, bakapee_t *pee, word q)
 		break;
 
 		case 16:	//interesting effects
-			if(pee->gq<BONK)
+			if(pee->qq<BONK)
 			{
 				if(!pee->bakax){ pee->xx--;}
 				else if(pee->bakax>0){ pee->xx++; }
 				if(!pee->bakay){ pee->yy--;}
 				else if(pee->bakay>0){ pee->yy++; }
+				dingu(pee);
 				dingas(pee);
 				tx+=pee->xx+TILEWH+4;
 				ty+=pee->yy+TILEWH+4;
 				modexClearRegion(page, tx, ty, 4, 4, pee->coor);
 #ifdef TILE
-				modexClearRegion(page, (rand()*TILEWH)%SCREEN_WIDTH, (rand()*TILEWH)%(SCREEN_HEIGHT), TILEWH, TILEWH, 0);
+				modexClearRegion(page, (rand()*TILEWH)%page->width, (rand()*TILEWH)%(page->height), TILEWH, TILEWH, 0);
 #else
-				modexputPixel(page, rand()%SCREEN_WIDTH, rand()%(SCREEN_HEIGHT), 0);
+				modexputPixel(page, rand()%page->width, rand()%(page->height), 0);
 #endif
 				pee->bakax = rand()%3; pee->bakay = rand()%3;
 				//printf("%d %d %d %d %d %d\n", pee->xx, pee->yy, tx, ty, TILEWH);
-				pee->gq++;
-			}else pee->gq = LGQ;
-		break;
-		case 0:
-		return;
+				pee->qq++;
+			}else pee->qq = 0;
 		break;
 		default:
-		return;
 		break;
 	}
+	//pee->coor++;
 }
diff --git a/src/lib/bakapee.h b/src/lib/bakapee.h
index 672d8046..fd0a1a0a 100644
--- a/src/lib/bakapee.h
+++ b/src/lib/bakapee.h
@@ -32,19 +32,16 @@
 #define LGQ	     32
 #define HGQ	     55
 
+#define TILE
+
 typedef struct {
-	word gq;
+	word gq;
+	word qq;
 	sword bakax, bakay;
 	sword xx, yy, sx, sy;
 	byte coor;
 } bakapee_t;
 
-typedef struct
-{
-	int old_mode;	//old video mode before game!
-} global_game_variables_t;
-
-void setVGAmodeX(global_game_variables_t *vid, boolean vq);
 void pdump(page_t *pee);
 void cls(page_t *page, byte color, byte *Where);
 void colortest(page_t *page, bakapee_t *pee);
diff --git a/src/lib/modex16.c b/src/lib/modex16.c
index 2bb0a348..a0ffccb4 100644
--- a/src/lib/modex16.c
+++ b/src/lib/modex16.c
@@ -28,7 +28,37 @@
 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 byte tmppal[PAL_SIZE];
+int old_mode;
+
+/////////////////////////////////////////////////////////////////////////////
+//																														//
+// setvideo() - This function Manages the video modes												//
+//																														//
+/////////////////////////////////////////////////////////////////////////////
+void VGAmodeX(sword vq)
+{
+	union REGS in, out;
+
+	if(!vq)
+	{ // deinit the video
+		// change to the video mode we were in before we switched to mode 13h
+		modexLeave();
+		//in.h.ah = 0x00;
+		//in.h.al = old_mode;
+		//int86(0x10, &in, &out);
+
+	}
+	else if(vq==1)
+	{ // init the video
+		// get old video mode
+		//in.h.ah = 0xf;
+		//int86(0x10, &in, &out);
+		//old_mode = out.h.al;
+		// enter mode
+		modexEnter();
+	}
+}
 
 static void
 vgaSetMode(byte mode)
@@ -647,7 +677,7 @@ modexPalWhite() {
 }
 
 
-/* utility */
+/* utility */
 void
 modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset)
 {
diff --git a/src/lib/modex16.h b/src/lib/modex16.h
index 30802c9a..4426f733 100644
--- a/src/lib/modex16.h
+++ b/src/lib/modex16.h
@@ -55,6 +55,7 @@ typedef union
 
 /* -============================ Functions =============================- */
 /* mode switching, page, and plane functions */
+void VGAmodeX(sword vq);
 void modexEnter();
 void modexLeave();
 page_t modexDefaultPage();
@@ -102,6 +103,7 @@ void modexWaitBorder();
 
 /* -======================= Constants & Vars ==========================- */
 extern byte far*  VGA;  /* The VGA Memory */
+extern int old_mode;
 #define SCREEN_SEG		0xa000
 #define VIDEO_INT		0x10
 #define SET_MODE		0x00
diff --git a/src/lib/scroll.c b/src/lib/scroll.c
index bf2f4143..62460593 100644
--- a/src/lib/scroll.c
+++ b/src/lib/scroll.c
@@ -56,7 +56,7 @@ void mapDrawRow(map_view_t *mv, int tx, int ty, word y, word poopoffset);
 void mapDrawCol(map_view_t *mv, int tx, int ty, word x, word poopoffset);
 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y);
 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x);
-void animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */short d1, short d2, int x, int y, int ls, int lp, bitmap_t *bmp);
+void animatePlayer(map_view_t *src, map_view_t *dest, short d1, short d2, int x, int y, int ls, int lp, bitmap_t *bmp);
 
 #define TILEWH 16
 #define QUADWH (TILEWH/4)
@@ -72,7 +72,7 @@ void main() {
 	bitmap_t ptmp; // player sprite
 	word q=1;
 	const char *cpus;
-	static int persist_aniframe = 0;    /* gonna be increased to 1 before being used, so 0 is ok for default */
+	//static int persist_aniframe = 0;    /* gonna be increased to 1 before being used, so 0 is ok for default */
 	page_t screen, screen2, screen3;
 	map_t map;
 	map_view_t mv, mv2, mv3;
@@ -132,7 +132,7 @@ void main() {
 	//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
 
-	#define INC_PER_FRAME if(q&1) persist_aniframe++; if(persist_aniframe>4) persist_aniframe = 1;	
+	#define INC_PER_FRAME if(q&1) persist_aniframe++; if(persist_aniframe>4) persist_aniframe = 1;
 
 	//temp testing
 		/*if(bg->tx >= 0 && bg->tx+20 < MAPX && player.tx == bg->tx + 10)
@@ -442,7 +442,7 @@ mapScrollLeft(map_view_t *mv, byte offset, short lp) {
 	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;
@@ -539,7 +539,7 @@ mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y) {
 }
 
 
-void 
+void
 mapDrawRow(map_view_t *mv, int tx, int ty, word y, word poopoffset) {
 	word x;
 	int i;
@@ -557,7 +557,7 @@ mapDrawRow(map_view_t *mv, int tx, int ty, word y, word poopoffset) {
 }
 
 
-void 
+void
 mapDrawCol(map_view_t *mv, int tx, int ty, word x, word poopoffset) {
 	int y;
 	int i;
@@ -566,7 +566,7 @@ mapDrawCol(map_view_t *mv, int tx, int ty, word x, word poopoffset) {
 	/* location in the map array */
 	i=ty * mv->map->width + tx;
 
-	/* We'll copy all of the columns in the screen, 
+	/* We'll copy all of the columns in the screen,
 	   i + 1 row above and one below */
 	for(y=poopoffset; y<(SCREEN_HEIGHT+mv->dyThresh)/(poopoffset+1) && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {
 	if(i>=0) {
@@ -577,7 +577,7 @@ mapDrawCol(map_view_t *mv, int tx, int ty, word x, word poopoffset) {
 	}
 }
 
-void 
+void
 mapDrawWRow(map_view_t *mv, int tx, int ty, word y) {
 	word x;
 	int i;
@@ -593,7 +593,7 @@ mapDrawWRow(map_view_t *mv, int tx, int ty, word y) {
 	}
 }
 
-void 
+void
 mapDrawWCol(map_view_t *mv, int tx, int ty, word x) {
 	int y;
 	int i;
@@ -601,7 +601,7 @@ mapDrawWCol(map_view_t *mv, int tx, int ty, word x) {
 	/* location in the map array */
 	i=ty * mv->map->width + tx;
 
-	/* We'll copy all of the columns in the screen, 
+	/* 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) {
@@ -612,8 +612,11 @@ mapDrawWCol(map_view_t *mv, int tx, int ty, word x) {
 	}
 }
 
-void
-animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */short d1, short d2, int x, int y, int ls, int lp, bitmap_t *bmp)
+//		animatePlayer(map_view_t *src, map_view_t *dest, 1, 1, player.x, player.y, persist_aniframe, q, &ptmp);
+//		animatePlayer(bg, spri, 0, 1, player.x, player.y, persist_aniframe, q, &ptmp);
+//		animatePlayer(bg, spri, 0, 0, player.x, player.y, persist_aniframe, q, &ptmp);
+//		animatePlayer(map_view_t *src, map_view_t *dest, player_t *player, word playnum, sword scrolloffsetswitch, int ls, bitmap_t *bmp)
+void	animatePlayer(map_view_t *src, map_view_t *dest, short d1, short d2, int x, int y, int ls, int lp, bitmap_t *bmp)
 {
 	short dire=32*d1; //direction
 	short qq; //scroll offset
diff --git a/src/lib/scroll16.c b/src/lib/scroll16.c
index 40acf484..9ddbe90b 100644
--- a/src/lib/scroll16.c
+++ b/src/lib/scroll16.c
@@ -24,51 +24,545 @@
 */
 #include "src/lib/scroll16.h"
 
-/*void animatePlayer(player_t *player,word playnum, short scrolloffsetswitch, int ls, bitmap_t *bmp)
+void walk(map_view_t *pip, player_t *player, word pn)
+{
+	#define INC_PER_FRAME if(player[pn].q&1) player[pn].persist_aniframe++; if(player[pn].persist_aniframe>4) player[pn].persist_aniframe = 1;
+	//right movement
+	switch(player[pn].info.dir)
+	{
+		case 3:
+			if(pip[0].tx >= 0 && pip[0].tx+20 < pip[0].map->width && player[pn].tx == pip[0].tx + 10 &&
+			!(pip[0].map->data[(player[pn].tx)+(pip[0].map->width*(player[pn].ty-1))] == 0))//!(player[pn].tx+1 == TRIGGX && player[pn].ty == TRIGGY))	//collision detection!
+			{
+				if(player[pn].q<=(TILEWH/(player[pn].speed)))
+				{
+					INC_PER_FRAME;
+					animatePlayer(pip, player, pn, 1);
+					mapScrollRight(pip, player, 0, pn);
+					mapScrollRight(pip, player, 1, pn);
+					modexShowPage(pip[1].page);
+					player[pn].q++;
+				} else { player[pn].q = 1; player[pn].info.dir = 0; player[pn].tx++; }
+			}
+			else if(player[pn].tx < pip[0].map->width && !(pip[0].map->data[(player[pn].tx)+(pip[0].map->width*(player[pn].ty-1))] == 0))//!(player[pn].tx+1 == TRIGGX && player[pn].ty == TRIGGY))
+			{
+				if(player[pn].q<=(TILEWH/(player[pn].speed)))
+				{
+					INC_PER_FRAME;
+					player[pn].x+=(player[pn].speed);
+					animatePlayer(pip, player, pn, 0);
+					modexShowPage(pip[1].page);
+					player[pn].q++;
+				} else { player[pn].q = 1; player[pn].info.dir = 0; player[pn].tx++; }
+			}
+			else
+			{
+				modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x-4, player[pn].y-TILEWH, player[pn].x-4, player[pn].y-TILEWH, 24, 32);
+				modexDrawSpriteRegion(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 32, 24, 32, &player[pn].data);
+				modexShowPage(pip[1].page);
+				player[pn].info.dir = 0;
+			}
+			player[pn].triggerx = player[pn].tx+1;
+			player[pn].triggery = player[pn].ty;
+		break;
+
+		//left movement
+		case 1:
+			if(pip[0].tx > 0 && pip[0].tx+20 <= pip[0].map->width && player[pn].tx == pip[0].tx + 10 &&
+			!(pip[0].map->data[(player[pn].tx-2)+(pip[0].map->width*(player[pn].ty-1))] == 0))//!(player[pn].tx-1 == TRIGGX && player[pn].ty == TRIGGY))	//collision detection!
+			{
+				if(player[pn].q<=(TILEWH/(player[pn].speed)))
+				{
+					INC_PER_FRAME;
+					animatePlayer(pip, player, pn, 1);
+					mapScrollLeft(pip, player, 0, pn);
+					mapScrollLeft(pip, player, 1, pn);
+					modexShowPage(pip[1].page);
+					player[pn].q++;
+				} else { player[pn].q = 1; player[pn].info.dir = 0; player[pn].tx--; }
+			}
+			else if(player[pn].tx > 1 && !(pip[0].map->data[(player[pn].tx-2)+(pip[0].map->width*(player[pn].ty-1))] == 0))//!(player[pn].tx-1 == TRIGGX && player[pn].ty == TRIGGY))
+			{
+				if(player[pn].q<=(TILEWH/(player[pn].speed)))
+				{
+					INC_PER_FRAME;
+					player[pn].x-=(player[pn].speed);
+					animatePlayer(pip, player, pn, 0);
+					modexShowPage(pip[1].page);
+					player[pn].q++;
+				} else { player[pn].q = 1; player[pn].info.dir = 0; player[pn].tx--; }
+			}
+			else
+			{
+				modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x-4, player[pn].y-TILEWH, player[pn].x-4, player[pn].y-TILEWH, 24, 32);
+				modexDrawSpriteRegion(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 96, 24, 32, &player[pn].data);
+				modexShowPage(pip[1].page);
+				player[pn].info.dir = 0;
+			}
+			player[pn].triggerx = player[pn].tx-1;
+			player[pn].triggery = player[pn].ty;
+		break;
+
+		//down movement
+		case 4:
+			if(pip[0].ty >= 0 && pip[0].ty+15 < pip[0].map->height && player[pn].ty == pip[0].ty + 8 &&
+			!(pip[0].map->data[(player[pn].tx-1)+(pip[0].map->width*(player[pn].ty))] == 0))//!(player[pn].tx == TRIGGX && player[pn].ty+1 == TRIGGY))	//collision detection!
+			{
+				if(player[pn].q<=(TILEWH/(player[pn].speed)))
+				{
+					INC_PER_FRAME;
+					animatePlayer(pip, player, pn, 1);
+					mapScrollDown(pip, player, 0, pn);
+					mapScrollDown(pip, player, 1, pn);
+					modexShowPage(pip[1].page);
+					player[pn].q++;
+				} else { player[pn].q = 1; player[pn].info.dir = 0; player[pn].ty++; }
+			}
+			else if(player[pn].ty < pip[0].map->height && !(pip[0].map->data[(player[pn].tx-1)+(pip[0].map->width*(player[pn].ty))] == 0))//!(player[pn].tx == TRIGGX && player[pn].ty+1 == TRIGGY))
+			{
+				if(player[pn].q<=(TILEWH/(player[pn].speed)))
+				{
+					INC_PER_FRAME;
+					player[pn].y+=(player[pn].speed);
+					animatePlayer(pip, player, pn, 0);
+					modexShowPage(pip[1].page);
+					player[pn].q++;
+				} else { player[pn].q = 1; player[pn].info.dir = 0; player[pn].ty++; }
+			}
+			else
+			{
+				modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x-4, player[pn].y-TILEWH, player[pn].x-4, player[pn].y-TILEWH, 24, 32);
+				modexDrawSpriteRegion(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 64, 24, 32, &player[pn].data);
+				modexShowPage(pip[1].page);
+				player[pn].info.dir = 0;
+			}
+			player[pn].triggerx = player[pn].tx;
+			player[pn].triggery = player[pn].ty+1;
+		break;
+
+		//up movement
+		case 0:
+			if(pip[0].ty > 0 && pip[0].ty+15 <= pip[0].map->height && player[pn].ty == pip[0].ty + 8 &&
+			!(pip[0].map->data[(player[pn].tx-1)+(pip[0].map->width*(player[pn].ty-2))] == 0))//!(player[pn].tx == TRIGGX && player[pn].ty-1 == TRIGGY))	//collision detection!
+			{
+				if(player[pn].q<=(TILEWH/(player[pn].speed)))
+				{
+					INC_PER_FRAME;
+					animatePlayer(pip, player, pn, 1);
+					mapScrollUp(pip, player, 0, pn);
+					mapScrollUp(pip, player, 1, pn);
+					modexShowPage(pip[1].page);
+					player[pn].q++;
+				} else { player[pn].q = 1; player[pn].info.dir = 0; player[pn].ty--; }
+			}
+			else if(player[pn].ty > 1 && !(pip[0].map->data[(player[pn].tx-1)+(pip[0].map->width*(player[pn].ty-2))] == 0))//!(player[pn].tx == TRIGGX &&  player[pn].ty-1 == TRIGGY))
+			{
+				if(player[pn].q<=(TILEWH/(player[pn].speed)))
+				{
+					INC_PER_FRAME;
+					player[pn].y-=(player[pn].speed);
+					animatePlayer(pip, player, 0, pn);
+					modexShowPage(pip[1].page);
+					player[pn].q++;
+				} else { player[pn].q = 1; player[pn].info.dir = 0; player[pn].ty--; }
+			}
+			else
+			{
+				modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x-4, player[pn].y-TILEWH, player[pn].x-4, player[pn].y-TILEWH, 24, 32);
+				modexDrawSpriteRegion(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 0, 24, 32, &player[pn].data);
+				modexShowPage(pip[1].page);
+				player[pn].info.dir = 0;
+			}
+			player[pn].triggerx = player[pn].tx;
+			player[pn].triggery = player[pn].ty-1;
+		break;
+	}
+}
+
+/*map_t
+allocMap(int w, int h) {
+	map_t result;
+
+	result.width =w;
+	result.height=h;
+	result.data = malloc(sizeof(byte) * w * h);
+	//result.data = (byte *)alloc_emem(((int)sizeof(byte) * w * h)/1024);
+	if(isEMS() || checkEMS())
+	{
+		XMOVE mm;
+		//emmhandle = mallocEMS(coretotalEMS());//alloc_emem((int)sizeof(map))
+		mm.length=sizeof(result);
+		mm.sourceH=0;
+		mm.sourceOff=ptr2long(&result);
+		mm.destH=emmhandle;
+		mm.destOff=0;
+		ist = move_emem(&mm);
+		if(!ist){ dealloc_emem(emmhandle); exit(5); }
+		printf("%d\n", coretotalEMS());
+	}
+
+	return result;
+}*/
+
+/*void
+initMap(map_t *map) {
+	// just a place holder to fill out an alternating pattern
+	int x, y, xx, yy;
+	int i, q;
+//	int tile = 1;
+	//if(!isEMS() || !checkEMS())
+//		map->tiles = malloc(sizeof(tiles_t));
+	//else
+	//	map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));
+
+	 //create the tile set
+	//if(!isEMS() || !checkEMS())
+//		map->tiles->data = malloc(sizeof(bitmap_t));
+	//else
+	//	map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));
+//	map->tiles->data->width = (TILEWH);
+//	map->tiles->data->height= TILEWH;
+	//if(!isEMS() || !checkEMS())
+//		map->tiles->data->data = malloc((TILEWH*2)*TILEWH);
+	//else
+	//	map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);
+//	map->tiles->tileHeight = TILEWH;
+//	map->tiles->tileWidth =TILEWH;
+//	map->tiles->rows = 1;
+//	map->tiles->cols = 1;//2;
+
+	q=0;
+	//for(y=0; y<map->height; y++) {
+	//for(x=0; x<map->width; x++) {
+	i=0;
+	for(yy=0; yy<TILEWH; yy++) {
+	for(xx=0; xx<(TILEWH); xx++) {
+		//if(x<TILEWH){
+		  map->tiles->data->data[i+1] = map->data[q];//28;//0x24;
+//		  printf("[%d]", map->tiles->data->data[i]);
+		//}else{
+		  //map->tiles->data->data[i] = map->data[q];//0;//0x34;
+		  //printf("]%d[==[%d]", i, map->tiles->data->data[i]);
+		//}
+		i++;
+	}
+//	printf("\n");
+	}
+//	printf("[%d]", map->data[q]);
+	q++;
+//	}
+	//printf("\n\n");
+//	}
+
+	i=0;
+	for(y=0; y<map->height; y++) {
+		for(x=0; x<map->width; x++) {
+//			map->data[i]=255;
+			printf("[%d]", map->data[i]);
+			//tile = tile ? 0 : 1;
+			i++;
+		}
+		//tile = tile ? 0 : 1;
+	}
+}*/
+
+void mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)
+{
+	word x, y;  /* coordinate for drawing */
+
+	/* increment the pixel position and update the page */
+	mv[id].page->dx += player[plid].speed;
+
+	/* check to see if this changes the tile */
+	if(mv[id].page->dx >= mv[id].dxThresh )
+	{
+	/* go forward one tile */
+	mv[id].tx++;
+	/* Snap the origin forward */
+	mv[id].page->data += 4;
+	mv[id].page->dx = mv[id].map->tiles->tileWidth;
+	}
+
+	/* draw the next column */
+	x= SCREEN_WIDTH + mv[id].map->tiles->tileWidth;
+	if(player[plid].q%4)
+		if(id==0)
+			mapDrawCol(&mv[0], mv[0].tx + 20 , mv[0].ty-1, x, player, mv->page->dx);
+		else
+			modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*17);
+	//}
+}
+
+
+void mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)
+{
+	word x, y;  /* coordinate for drawing */
+
+	/* increment the pixel position and update the page */
+	mv[id].page->dx -= player[plid].speed;
+
+	/* check to see if this changes the tile */
+	if(mv[id].page->dx == 0)
+	{
+	/* go backward one tile */
+	mv[id].tx--;
+
+	/* Snap the origin backward */
+	mv[id].page->data -= 4;
+	mv[id].page->dx = mv[id].map->tiles->tileWidth;
+	}
+
+	/* draw the next column */
+	x= 0;
+	if(player[plid].q%4)
+		if(id==0)
+			mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, mv->page->dx);
+		else
+			modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*17);
+	//}
+}
+
+
+void mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)
+{
+	word x, y;  /* coordinate for drawing */
+
+	/* increment the pixel position and update the page */
+	mv[id].page->dy -= player[plid].speed;
+
+	/* check to see if this changes the tile */
+	if(mv[id].page->dy == 0 )
+	{
+	/* go down one tile */
+	mv[id].ty--;
+	/* Snap the origin downward */
+	mv[id].page->data -= mv[id].page->width*4;
+	mv[id].page->dy = mv[id].map->tiles->tileHeight;
+	}
+
+	/* draw the next row */
+	y= 0;
+	if(player[plid].q%3)
+		if(id==0)
+			mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, mv->page->dy);
+		else
+			modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*22, mv[id].map->tiles->tileHeight);
+	//}
+}
+
+void mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)
+{
+	word x, y;  /* coordinate for drawing */
+
+	/* increment the pixel position and update the page */
+	mv[id].page->dy += player[plid].speed;
+
+	/* check to see if this changes the tile */
+	if(mv[id].page->dy >= mv[id].dyThresh )
+	{
+	/* go down one tile */
+	mv[id].ty++;
+	/* Snap the origin downward */
+	mv[id].page->data += mv[id].page->width*4;
+	mv[id].page->dy = mv[id].map->tiles->tileHeight;
+	}
+
+	/* draw the next row */
+	y= SCREEN_HEIGHT + mv[id].map->tiles->tileHeight;
+	if(player[plid].q%3)
+		if(id==0)
+			mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+15, y, player, mv->page->dy);
+		else
+			modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*22, mv[id].map->tiles->tileHeight);
+	//}
+}
+
+
+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) {
+		mapDrawWRow(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;
+	//if(i==0) i=2;
+	if(i==0)
+	{
+		//wwww
+		modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 0); //currently the over scan color!
+	}
+	else
+	{
+	rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);
+	ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);
+////0000	printf("i=%d\n", i);
+	//mxPutTile(t->data, x, y, t->tileWidth, 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, player_t *p, word poopoffset)
+{
+	word x;
+	int i;
+	poopoffset%=p[0].speed;
+//printf("y: %d\n", poopoffset);
+	/* the position within the map array */
+	i=ty * mv->map->width + tx;
+	for(x=poopoffset; x<(SCREEN_WIDTH+mv->dxThresh)/(poopoffset+1) && 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, player_t *p, word poopoffset)
+{
+	int y;
+	int i;
+	poopoffset%=p[0].speed;
+//printf("x: %d\n", poopoffset);
+	/* 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=poopoffset; y<(SCREEN_HEIGHT+mv->dyThresh)/(poopoffset+1) && 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;
+	}
+}
+
+void mapDrawWRow(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 mapDrawWCol(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;
+	}
+}
+
+void qclean()
+{
+	modexLeave();
+	//setkb(0);
+}
+
+void pdump(page_t *pee)
+{
+	int mult=(QUADWH);
+	int palq=(mult)*TILEWH;
+	int palcol=0;
+	int palx, paly;
+	for(paly=0; paly<palq; paly+=mult){
+		for(palx=0; palx<palq; palx+=mult){
+				modexClearRegion(pee, palx+TILEWH, paly+TILEWH, mult, mult, palcol);
+			palcol++;
+		}
+	}
+}
+
+void animatePlayer(map_view_t *pip, player_t *player, word playnum, sword scrollswitch)
 {
 	sword dire=32; //direction
 	sword qq; //scroll offset
+	word ls = player[playnum].persist_aniframe;
 
-	if(scrolloffsetswitch==0) qq = 0;
-	else qq = ((player[playnum]->p)*player[playnum]->speed);
-	switch (player[playnum]->dir)
+	if(scrollswitch==0) qq = 0;
+	else qq = ((player[playnum].persist_aniframe)*player[playnum].speed);
+	switch (player[playnum].info.dir)
 	{
 		case 0:
 			//up
-			dire*=player[playnum]->dir;
-			player[playnum]->x=player[playnum]->x-4;
-			player[playnum]->y=player[playnum]->y-qq-TILEWH;
+			dire*=player[playnum].info.dir;
+			player[playnum].x=player[playnum].x-4;
+			player[playnum].y=player[playnum].y-qq-TILEWH;
 		break;
 		case 1:
 			// right
-			dire*=(player[playnum]->dir-2);
-			player[playnum]->x=player[playnum]->x+qq-4;
-			player[playnum]->y=player[playnum]->y-TILEWH;
+			dire*=(player[playnum].info.dir-2);
+			player[playnum].x=player[playnum].x+qq-4;
+			player[playnum].y=player[playnum].y-TILEWH;
 		break;
 		case 2:
 		break;
 		case 3:
 			//down
-			dire*=(player[playnum]->dir-2)
-			player[playnum]->x=player[playnum]->x-4;
-			player[playnum]->y=player[playnum]->y+qq-TILEWH;
+			dire*=(player[playnum].info.dir-2);
+			player[playnum].x=player[playnum].x-4;
+			player[playnum].y=player[playnum].y+qq-TILEWH;
 		break;
 		case 4:
 			//left
-			dire*=(player[playnum]->dir+2)
-			player[playnum]->x=player[playnum]->x-qq-4;
-			player[playnum]->y=player[playnum]->y-TILEWH;
+			dire*=(player[playnum].info.dir+2);
+			player[playnum].x=player[playnum].x-qq-4;
+			player[playnum].y=player[playnum].y-TILEWH;
 		break;
 	}
-//	modexCopyPageRegion(dest->page, src->page, x-4, y-4, x-4, y-4, 28, 40);
-//	if(2>ls && ls>=1) { modexDrawSpriteRegion(dest->page, x, y, 48, dire, 24, 32, bmp); }else
-//	if(3>ls && ls>=2) { modexDrawSpriteRegion(dest->page, x, y, 24, dire, 24, 32, bmp); }else
-//	if(4>ls && ls>=3) { modexDrawSpriteRegion(dest->page, x, y, 0, dire, 24, 32, bmp); }else
-//	if(5>ls && ls>=4) { modexDrawSpriteRegion(dest->page, x, y, 24, dire, 24, 32, bmp); }
+	modexCopyPageRegion(pip[1].page, pip[0].page, player[playnum].x-4, player[playnum].y-4, player[playnum].x-4, player[playnum].y-4, 28, 40);
+	if(2>ls && ls>=1) { modexDrawSpriteRegion(pip[1].page, player[playnum].x, player[playnum].y, 48, dire, 24, 32, &player[playnum].data); }else
+	if(3>ls && ls>=2) { modexDrawSpriteRegion(pip[1].page, player[playnum].x, player[playnum].y, 24, dire, 24, 32, &player[playnum].data); }else
+	if(4>ls && ls>=3) { modexDrawSpriteRegion(pip[1].page, player[playnum].x, player[playnum].y, 0, dire, 24, 32, &player[playnum].data); }else
+	if(5>ls && ls>=4) { modexDrawSpriteRegion(pip[1].page, player[playnum].x, player[playnum].y, 24, dire, 24, 32, &player[playnum].data); }
 	//TODO: mask copy //modexCopyPageRegion(dest->page, src->page, x-4, y-4, x-4, y-4, 28, 40);
 	//modexClearRegion(top->page, 66, 66, 2, 40, 0);
 	//modexCopyPageRegion(dest->page, top->page, 66, 66, 66, 66, 2, 40);
 	//turn this off if XT
 	//XTif(detectcpu() > 0)
-//	modexWaitBorder();
-}*/
+	modexWaitBorder();
+}
diff --git a/src/lib/scroll16.h b/src/lib/scroll16.h
index 71a0cbf3..f4e0b9cb 100644
--- a/src/lib/scroll16.h
+++ b/src/lib/scroll16.h
@@ -24,11 +24,45 @@
 #define __SCROLL16_H_
 
 #include "src/lib/16_head.h"
+#include "src/lib/modex16.h"
 #include "src/lib/16_in.h"
+#include "src/lib/bitmap.h"
+#include "src/lib/planar.h"
+#include "src/lib/mapread.h"
 
-//#define TILEWH 16
-//#define SPEED 4
+typedef struct {
+	map_t *map;
+	page_t *page;
+	int tx; //appears to be the top left tile position on the viewable screen map
+	int ty; //appears to be the top left tile position on the viewable screen map
+	word dxThresh; //????
+	word dyThresh; //????
+} map_view_t;
 
-//void animatePlayer(player_t *player, short scrolloffsetswitch, int ls, bitmap_t *bmp);
+typedef struct
+{
+	map_view_t *mv;
+} map_view_db_t;
+
+#define TILEWH 16
+#define QUADWH			TILEWH/2
+//#define LOOPMAX (TILEWH/(player[0].speed))
+
+//map_t allocMap(int w, int h);
+//void initMap(map_t *map);
+void walk(map_view_t *pip, player_t *player, word pn);
+void mapScrollRight(map_view_t *mv, player_t *player, word id, word plid);
+void mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid);
+void mapScrollUp(map_view_t *mv, player_t *player, word id, word plid);
+void mapScrollDown(map_view_t *mv, player_t *player, word id, word plid);
+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, player_t *p, word poopoffset);
+void mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *p, word poopoffset);
+void mapDrawWRow(map_view_t *mv, int tx, int ty, word y);
+void mapDrawWCol(map_view_t *mv, int tx, int ty, word x);
+void pdump(page_t *pee);
+void qclean();
+void animatePlayer(map_view_t *pip, player_t *player, word playnum, sword scrollswitch);
 
 #endif /*__SCROLL16_H_*/
diff --git a/src/scroll.c b/src/scroll.c
index 30032eef..03411b3c 100644
--- a/src/scroll.c
+++ b/src/scroll.c
@@ -20,92 +20,37 @@
  *
  */
 
-#include "src/lib/dos_kb.h"
+#include "src/lib/scroll16.h"
 #include "src/lib/mapread.h"
 #include "src/lib/wcpu/wcpu.h"
-#include "src/lib/planar.h"
 //====#include "src\lib\ems.c"
 
 //word far *clock= (word far*) 0x046C; /* 18.2hz clock */
 
-//optimize scroll*!!!!
-
-typedef struct {
-	map_t *map;
-	page_t *page;
-	int tx; //appears to be the top left tile position on the viewable screen map
-	int ty; //appears to be the top left tile position on the viewable screen map
-	word dxThresh; //????
-	word dyThresh; //????
-} map_view_t;
-
-typedef struct {
-	int x; //player exact position on the viewable map
-	int y; //player exact position on the viewable map
-	int tx; //player tile position on the viewable map
-	int ty; //player tile position on the viewable map
-	int triggerx; //player's trigger box tile position on the viewable map
-	int triggery; //player's trigger box tile position on the viewable map
-	int setx; //NOT USED YET! player sprite sheet set on the image x
-	int sety; //NOT USED YET! player sprite sheet set on the image y
-	word q; //loop variable
-	word d; //direction
-	bitmap_t data; //supposively the sprite sheet data
-	int hp; //hitpoints of the player
-} actor_t;
-
-typedef struct
+void main()
 {
-	map_view_t *mv;
-} map_view_db_t;
-
-map_t allocMap(int w, int h);
-void initMap(map_t *map);
-void mapScrollRight(map_view_t *mv, byte offset, word id);
-void mapScrollLeft(map_view_t *mv, byte offest, word id);
-void mapScrollUp(map_view_t *mv, byte offset, word id);
-void mapScrollDown(map_view_t *mv, byte offset, word id);
-void mapGoTo(map_view_t *mv, int tx, int ty);
-void mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y);
-void mapDrawRow(map_view_t *mv, int tx, int ty, word y);
-void mapDrawCol(map_view_t *mv, int tx, int ty, word x);
-void qclean();
-void pdump(map_view_t *pee);
-void animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */sword d, short scrolloffsetswitch, int x, int y, int ls, int lp, bitmap_t *bmp);
-
-#define TILEWH 16
-#define QUADWH			TILEWH/2
-#define SPEED 4
-//#define LOOPMAX (TILEWH/SPEED)
-
-//place holder definitions
-//#define MAPX 200
-//#define MAPY 150
-//#define TRIGGX 10
-//#define TRIGGY 9
-
-void main() {
-//++++	size_t oldfreemem=GetFreeSize();
-	/*long emmhandle;
-	long emsavail;
-	char teststr[80];*/
-	word panswitch=0, panq=1, pand=0, panpagenum=0; //for panning!
+//	word panswitch=0, panq=1, pand=0;
+	word panpagenum=0; //for panning!
 	int i;
 	static word paloffset=0;
-	bitmap_t ptmp;//, npctmp; // player sprite
 	planar_buf_t *p;
 	const char *cpus;
-	static int persist_aniframe = 0;    /* gonna be increased to 1 before being used, so 0 is ok for default */
+	//static int persist_aniframe = 0;    /* gonna be increased to 1 before being used, so 0 is ok for default */
 	page_t screen, screen2, screen3;
 	map_t map;
-	map_view_t mv[3];//mv, mv2, mv3;
+	map_view_t mv[3];
 	map_view_t *bg, *spri, *mask;//, *tmp;
 	//map_view_db_t pgid[4];
 	byte *dpal, *gpal;
 	byte *ptr;
 	byte *mappalptr;
-	actor_t player;
-	//actor_t npc0;
+	player_t player[MaxPlayers];
+
+	player[0].persist_aniframe=0;
+	player[0].speed=4;
+	//extern struct inconfig inpu;
+
+	//player_t npc0;
 
 //	atexit(qclean());
 	/*if(!emmtest())
@@ -151,12 +96,12 @@ void main() {
 	mappalptr = map.tiles->data->palette;
 	/* data */
 //0000	printf("Total used @ before image loading:		%zu\n", oldfreemem-GetFreeSize());
-	ptmp = bitmapLoadPcx("data/ptmp.pcx"); // load sprite
+	player[0].data = bitmapLoadPcx("data/ptmp.pcx"); // load sprite
 	//npctmp = bitmapLoadPcx("ptmp1.pcx"); // load sprite
 
 	/* create the planar buffer */
 //0000	printf("Total used @ before planar buffer creation:	%zu\n", oldfreemem-GetFreeSize());
-	p = planar_buf_from_bitmap(&ptmp);
+	p = planar_buf_from_bitmap(&player[0].data);
 //0000	printf("Total used @ after planar buffer creation:	%zu\n", oldfreemem-GetFreeSize());
 
 	/*if(isEMS())
@@ -190,18 +135,21 @@ void main() {
 	}
 */
 
+	/*	input!	*/
+	IN_Startup();
+	IN_Default(0,&player,ctrl_Joystick);
+
 	/* save the palette */
 	dpal = modexNewPal();
 	modexPalSave(dpal);
 	modexFadeOff(4, dpal);
 
-	setkb(1);
-	modexEnter();
+	VGAmodeX(1);
 	modexPalBlack();	//reset the palette~
 //	printf("Total used @ before palette initiation:		%zu\n", oldfreemem-GetFreeSize());
-	ptmp.offset=(paloffset/3);
-	modexPalUpdate(&ptmp, &paloffset, 0, 0);
-	//printf("	%d\n", sizeof(ptmp.data));
+	player[0].data.offset=(paloffset/3);
+	modexPalUpdate(&player[0].data, &paloffset, 0, 0);
+	//printf("	%d\n", sizeof(ptmp->data));
 	//printf("1:	%d\n", paloffset);
 	map.tiles->data->offset=(paloffset/3);
 	//XTmodexPalUpdate(map.tiles->data, &paloffset, 0, 0);
@@ -236,15 +184,15 @@ void main() {
 
 	//TODO: put player in starting position of spot
 	//default player position on the viewable map
-	player.tx = bg->tx + 10;
-	player.ty = bg->ty + 8;
-	player.x = player.tx*TILEWH;
-	player.y = player.ty*TILEWH;
-	player.triggerx = player.tx;
-	player.triggery = player.ty+1;
-	player.q=1;
-	player.d=0;
-	player.hp=4;
+	player[0].tx = bg->tx + 10;
+	player[0].ty = bg->ty + 8;
+	player[0].x = player[0].tx*TILEWH;
+	player[0].y = player[0].ty*TILEWH;
+	player[0].triggerx = player[0].tx;
+	player[0].triggery = player[0].ty+1;
+	player[0].q=1;
+	player[0].info.dir=2;
+	player[0].hp=4;
 	//npc
 	/*npc0.tx = bg->tx + 1;
 	npc0.ty = bg->ty + 1;
@@ -255,196 +203,29 @@ void main() {
 	npc0.q=1;
 	npc0.d=0;
 	modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 64, 24, 32, &npctmp);*/
-	modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 64, 24, 32, &ptmp);
+	modexDrawSpriteRegion(spri->page, player[0].x-4, player[0].y-TILEWH, 24, 64, 24, 32, &player[0].data);
 
 	modexShowPage(spri->page);
 //	printf("Total used @ before loop:			%zu\n", oldfreemem-GetFreeSize());
 	modexClearRegion(mv[2].page, 0, 0, mv[2].page->width, mv[2].page->height, 1);
 	modexFadeOn(4, gpal);
-	while(!keyp(1) && player.hp>0)
+	while(!IN_KeyDown(sc_Escape) && player[0].hp>0)
 	{
+		IN_ReadControl(0,&player);
 	//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
-	#define INC_PER_FRAME if(player.q&1) persist_aniframe++; if(persist_aniframe>4) persist_aniframe = 1;
+	//when player[0].tx or player[0].ty == 0 or player[0].tx == 20 or player[0].ty == 15 then stop because that is edge of map and you do not want to walk of the map
 
 	//player movement
-	//TODO: make movement into a function!
-	if(!panswitch){
-	//right movement
-	if((keyp(77) && !keyp(75) && player.d == 0) || player.d == 2)
-	{
-		if(player.d == 0){ player.d = 2; }
-		if(bg->tx >= 0 && bg->tx+20 < map.width && player.tx == bg->tx + 10 &&
-		!(bg->map->data[(player.tx)+(map.width*(player.ty-1))] == 0))//!(player.tx+1 == TRIGGX && player.ty == TRIGGY))	//collision detection!
-		{
-			if(player.q<=(TILEWH/SPEED))
-			{
-				INC_PER_FRAME;
-				//animatePlayer(bg, spri, mask, 1, 1, player.x, player.y, persist_aniframe, q, &ptmp);
-				animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);
-				mapScrollRight(mv, SPEED, 0);
-				mapScrollRight(mv, SPEED, 1);
-				//mapScrollRight(mask, SPEED);
-				modexShowPage(spri->page);
-				player.q++;
-			} else { player.q = 1; player.d = 0; player.tx++; }
-		}
-		else if(player.tx < map.width && !(bg->map->data[(player.tx)+(map.width*(player.ty-1))] == 0))//!(player.tx+1 == TRIGGX && player.ty == TRIGGY))
-		{
-			if(player.q<=(TILEWH/SPEED))
-			{
-				INC_PER_FRAME;
-				player.x+=SPEED;
-				//animatePlayer(bg, spri, mask, 1, 0, player.x, player.y, persist_aniframe, q, &ptmp);
-				animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);
-				modexShowPage(spri->page);
-				player.q++;
-			} else { player.q = 1; player.d = 0; player.tx++; }
-		}
-		else
-		{
-			modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);
-			modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 32, 24, 32, &ptmp);
-			modexShowPage(spri->page);
-			player.d = 0;
-		}
-		player.triggerx = player.tx+1;
-		player.triggery = player.ty;
-	}
-
-	//left movement
-	if((keyp(75) && !keyp(77) && player.d == 0) || player.d == 4)
-	{
-		if(player.d == 0){ player.d = 4; }
-		if(bg->tx > 0 && bg->tx+20 <= map.width && player.tx == bg->tx + 10 &&
-		!(bg->map->data[(player.tx-2)+(map.width*(player.ty-1))] == 0))//!(player.tx-1 == TRIGGX && player.ty == TRIGGY))	//collision detection!
-		{
-			if(player.q<=(TILEWH/SPEED))
-			{
-				INC_PER_FRAME;
-				//animatePlayer(bg, spri, mask, 3, 1, player.x, player.y, persist_aniframe, q, &ptmp);
-				animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);
-				mapScrollLeft(mv, SPEED, 0);
-				mapScrollLeft(mv, SPEED, 1);
-				//mapScrollLeft(mask, SPEED);
-				modexShowPage(spri->page);
-				player.q++;
-			} else { player.q = 1; player.d = 0; player.tx--; }
-		}
-		else if(player.tx > 1 && !(bg->map->data[(player.tx-2)+(map.width*(player.ty-1))] == 0))//!(player.tx-1 == TRIGGX && player.ty == TRIGGY))
-		{
-			if(player.q<=(TILEWH/SPEED))
-			{
-				INC_PER_FRAME;
-				player.x-=SPEED;
-				//animatePlayer(bg, spri, mask, 3, 0, player.x, player.y, persist_aniframe, q, &ptmp);
-				animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);
-				modexShowPage(spri->page);
-				player.q++;
-			} else { player.q = 1; player.d = 0; player.tx--; }
-		}
-		else
-		{
-			modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);
-			modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 96, 24, 32, &ptmp);
-			modexShowPage(spri->page);
-			player.d = 0;
-		}
-		player.triggerx = player.tx-1;
-		player.triggery = player.ty;
-	}
-
-	//down movement
-	if((keyp(80) && !keyp(72) && player.d == 0) || player.d == 3)
-	{
-		if(player.d == 0){ player.d = 3; }
-		if(bg->ty >= 0 && bg->ty+15 < map.height && player.ty == bg->ty + 8 &&
-		!(bg->map->data[(player.tx-1)+(map.width*(player.ty))] == 0))//!(player.tx == TRIGGX && player.ty+1 == TRIGGY))	//collision detection!
-		{
-			if(player.q<=(TILEWH/SPEED))
-			{
-				INC_PER_FRAME;
-				//animatePlayer(bg, spri, mask, 2, 1, player.x, player.y, persist_aniframe, q, &ptmp);
-				animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);
-				mapScrollDown(mv, SPEED, 0);
-				mapScrollDown(mv, SPEED, 1);
-				//mapScrollDown(mask, SPEED);
-				modexShowPage(spri->page);
-				player.q++;
-			} else { player.q = 1; player.d = 0; player.ty++; }
-		}
-		else if(player.ty < map.height && !(bg->map->data[(player.tx-1)+(map.width*(player.ty))] == 0))//!(player.tx == TRIGGX && player.ty+1 == TRIGGY))
-		{
-			if(player.q<=(TILEWH/SPEED))
-			{
-				INC_PER_FRAME;
-				player.y+=SPEED;
-				//animatePlayer(bg, spri, mask, 2, 0, player.x, player.y, persist_aniframe, q, &ptmp);
-				animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);
-				modexShowPage(spri->page);
-				player.q++;
-			} else { player.q = 1; player.d = 0; player.ty++; }
-		}
-		else
-		{
-			modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);
-			modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 64, 24, 32, &ptmp);
-			modexShowPage(spri->page);
-			player.d = 0;
-		}
-		player.triggerx = player.tx;
-		player.triggery = player.ty+1;
-	}
-
-	//up movement
-	if((keyp(72) && !keyp(80) && player.d == 0) || player.d == 1)
-	{
-		if(player.d == 0){ player.d = 1; }
-		if(bg->ty > 0 && bg->ty+15 <= map.height && player.ty == bg->ty + 8 &&
-		!(bg->map->data[(player.tx-1)+(map.width*(player.ty-2))] == 0))//!(player.tx == TRIGGX && player.ty-1 == TRIGGY))	//collision detection!
-		{
-			if(player.q<=(TILEWH/SPEED))
-			{
-				INC_PER_FRAME;
-				//animatePlayer(bg, spri, mask, 0, 1, player.x, player.y, persist_aniframe, q, &ptmp);
-				animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);
-				mapScrollUp(mv, SPEED, 0);
-				mapScrollUp(mv, SPEED, 1);
-				//mapScrollUp(mask, SPEED);
-				modexShowPage(spri->page);
-				player.q++;
-			} else { player.q = 1; player.d = 0; player.ty--; }
-		}
-		else if(player.ty > 1 && !(bg->map->data[(player.tx-1)+(map.width*(player.ty-2))] == 0))//!(player.tx == TRIGGX &&  player.ty-1 == TRIGGY))
-		{
-			if(player.q<=(TILEWH/SPEED))
-			{
-				INC_PER_FRAME;
-				player.y-=SPEED;
-				//animatePlayer(bg, spri, mask, 0, 0, player.x, player.y, persist_aniframe, q, &ptmp);
-				modexShowPage(spri->page);
-				animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);
-				player.q++;
-			} else { player.q = 1; player.d = 0; player.ty--; }
-		}
-		else
-		{
-			modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);
-			modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 0, 24, 32, &ptmp);
-			modexShowPage(spri->page);
-			player.d = 0;
-		}
-		player.triggerx = player.tx;
-		player.triggery = player.ty-1;
-	}
-}else{
+	//if(!panswitch){
+		walk(mv, player, 0);
+	/*}else{
 //88 switch!
 	//right movement
-	if((keyp(77) && !keyp(75) && pand == 0) || pand == 2)
+	if((IN_KeyDown(77) && !IN_KeyDown(75) && pand == 0) || pand == 2)
 	{
 		if(pand == 0){ pand = 2; }
-			if(panq<=(TILEWH/SPEED))
+			if(panq<=(TILEWH/(player[0].speed)))
 			{
 				switch(panpagenum)
 				{
@@ -468,10 +249,10 @@ void main() {
 			} else { panq = 1; pand = 0; }
 	}
 	//left movement
-	if((keyp(75) && !keyp(77) && pand == 0) || pand == 4)
+	if((IN_KeyDown(75) && !IN_KeyDown(77) && pand == 0) || pand == 4)
 	{
 		if(pand == 0){ pand = 4; }
-			if(panq<=(TILEWH/SPEED))
+			if(panq<=(TILEWH/(player[0].speed)))
 			{
 				switch(panpagenum)
 				{
@@ -495,10 +276,10 @@ void main() {
 			} else { panq = 1; pand = 0; }
 	}
 	//down movement
-	if((keyp(72) && !keyp(80) && pand == 0) || pand == 3)
+	if((IN_KeyDown(72) && !IN_KeyDown(80) && pand == 0) || pand == 3)
 	{
 		if(pand == 0){ pand = 3; }
-			if(panq<=(TILEWH/SPEED))
+			if(panq<=(TILEWH/(player[0].speed)))
 			{
 				switch(panpagenum)
 				{
@@ -522,10 +303,10 @@ void main() {
 			} else { panq = 1; pand = 0; }
 	}
 	//up movement
-	if((keyp(80) && !keyp(72) && pand == 0) || pand == 1)
+	if((IN_KeyDown(80) && !IN_KeyDown(72) && pand == 0) || pand == 1)
 	{
 		if(pand == 0){ pand = 1; }
-			if(panq<=(TILEWH/SPEED))
+			if(panq<=(TILEWH/(player[0].speed)))
 			{
 				switch(panpagenum)
 				{
@@ -548,12 +329,13 @@ void main() {
 				panq++;
 			} else { panq = 1; pand = 0; }
 	}
-}
+}*/
+
 
 	//the scripting stuf....
 
-	//if(((player.triggerx == TRIGGX && player.triggery == TRIGGY) && keyp(0x1C))||(player.tx == 5 && player.ty == 5))
-	if(((bg->map->data[(player.triggerx-1)+(map.width*(player.triggery-1))] == 0) && keyp(0x1C))||(player.tx == 5 && player.ty == 5))
+	//if(((player[0].triggerx == TRIGGX && player[0].triggery == TRIGGY) && IN_KeyDown(0x1C))||(player[0].tx == 5 && player[0].ty == 5))
+	if(((bg->map->data[(player[0].triggerx-1)+(map.width*(player[0].triggery-1))] == 0) && IN_KeyDown(0x1C))||(player[0].tx == 5 && player[0].ty == 5))
 	{
 		short i;
 		for(i=800; i>=400; i--)
@@ -562,27 +344,27 @@ void main() {
 		}
 		nosound();
 	}
-	if(player.q == (TILEWH/SPEED)+1 && player.d > 0 && (player.triggerx == 5 && player.triggery == 5)){ player.hp--; }
+	if(player[0].q == (TILEWH/(player[0].speed))+1 && player[0].info.dir != 2 && (player[0].triggerx == 5 && player[0].triggery == 5)){ player[0].hp--; }
 	//debugging binds!
-	//if(keyp(0x0E)) while(1){ if(xmsmalloc(24)) break; }
-	if(keyp(2)){ modexShowPage(bg->page); panpagenum=0; }
-	if(keyp(3)){ modexShowPage(spri->page); panpagenum=1; }
-	if(keyp(4)){ modexShowPage(mask->page); panpagenum=2; }
-	if(keyp(25)){ pdump(bg); pdump(spri); }	//p
-	if(keyp(24)){ modexPalUpdate0(gpal); paloffset=0; pdump(bg); pdump(spri); }
-	if(keyp(22)){
-	paloffset=0; modexPalBlack(); modexPalUpdate(&ptmp, &paloffset, 0, 0);
+	//if(IN_KeyDown(0x0E)) while(1){ if(xmsmalloc(24)) break; }
+	if(IN_KeyDown(2)){ modexShowPage(bg->page); panpagenum=0; }
+	if(IN_KeyDown(3)){ modexShowPage(spri->page); panpagenum=1; }
+	if(IN_KeyDown(4)){ modexShowPage(mask->page); panpagenum=2; }
+	if(IN_KeyDown(25)){ pdump(bg->page); pdump(spri->page); }	//p
+	if(IN_KeyDown(24)){ modexPalUpdate0(gpal); paloffset=0; pdump(bg->page); pdump(spri->page); }
+	if(IN_KeyDown(22)){
+	paloffset=0; modexPalBlack(); modexPalUpdate(&player[0].data, &paloffset, 0, 0);
 	printf("1paloffset	=	%d\n", paloffset/3);
 	 modexPalUpdate(map.tiles->data, &paloffset, 0, 0);
 	printf("2paloffset	=	%d\n", paloffset/3);
-	 pdump(bg); pdump(spri); }
+	 pdump(bg->page); pdump(spri->page); }
 	//pan switch
-	if(keyp(88)){if(!panswitch) panswitch++; else panswitch--; }	//f12
+	//if(IN_KeyDown(88)){if(!panswitch) panswitch++; else panswitch--; }	//f12
 	//TSR
-	if(keyp(87))	//f11
+	if(IN_KeyDown(87))	//f11
 	{
-		modexLeave();
-		setkb(0);
+		VGAmodeX(0);
+		IN_Shutdown();
 		__asm
 		{
 			mov ah,31h
@@ -590,7 +372,7 @@ void main() {
 		}
 	}
 
-	if((player.q==1) && !(player.x%TILEWH==0 && player.y%TILEWH==0)) break;	//incase things go out of sync!
+	if((player[0].q==1) && !(player[0].x%TILEWH==0 && player[0].y%TILEWH==0)) break;	//incase things go out of sync!
 
 	}
 
@@ -599,18 +381,18 @@ void main() {
 	modexPalSave(gpal);
 	modexSavePalFile("data/g.pal", gpal);
 	modexFadeOff(4, gpal);
-	modexLeave();
-	setkb(0);
+	VGAmodeX(0);
+	IN_Shutdown();
 	printf("Project 16 scroll.exe\n");
 	printf("tx: %d\n", bg->tx);
 	printf("ty: %d\n", bg->ty);
-	printf("player.x: %d", player.x); printf("		player.y: %d\n", player.y);
-	//if(player.hp==0) printf("%d wwww\n", player.y+8);
-	//else printf("\nplayer.y: %d\n", player.y);
-	printf("player.tx: %d", player.tx); printf("		player.ty: %d\n", player.ty);
-	printf("player.triggx: %d", player.triggerx); printf("	player.triggy: %d\n", player.triggery);
-	printf("player.hp: %d", player.hp);	printf("	player.q: %d", player.q);	printf("	player.d: %d\n", player.d);
-	printf("tile data value at player trigger position: %d\n", bg->map->data[(player.triggerx-1)+(map.width*(player.triggery-1))]);
+	printf("player[0].x: %d", player[0].x); printf("		player[0].y: %d\n", player[0].y);
+	//if(player[0].hp==0) printf("%d wwww\n", player[0].y+8);
+	//else printf("\nplayer[0].y: %d\n", player[0].y);
+	printf("player[0].tx: %d", player[0].tx); printf("		player[0].ty: %d\n", player[0].ty);
+	printf("player[0].triggx: %d", player[0].triggerx); printf("	player[0].triggy: %d\n", player[0].triggery);
+	printf("player[0].hp: %d", player[0].hp);	printf("	player[0].q: %d", player[0].q);	printf("	player[0].info.dir: %d\n", player[0].info.dir);
+	printf("tile data value at player trigger position: %d\n", bg->map->data[(player[0].triggerx-1)+(map.width*(player[0].triggery-1))]);
 	printf("palette offset:	%d\n", paloffset/3);
 //++++	printf("Total used: %zu\n", oldfreemem-GetFreeSize());
 //++++	printf("Total free: %zu\n", GetFreeSize());
@@ -635,343 +417,3 @@ void main() {
 	printf("detected CPU type: %s\n", cpus);
 	modexFadeOn(4, dpal);
 }
-
-
-map_t
-allocMap(int w, int h) {
-	map_t result;
-
-	result.width =w;
-	result.height=h;
-	result.data = malloc(sizeof(byte) * w * h);
-	//result.data = (byte *)alloc_emem(((int)sizeof(byte) * w * h)/1024);
-	/*if(isEMS() || checkEMS())
-	{
-		XMOVE mm;
-		//emmhandle = mallocEMS(coretotalEMS());//alloc_emem((int)sizeof(map))
-		mm.length=sizeof(result);
-		mm.sourceH=0;
-		mm.sourceOff=ptr2long(&result);
-		mm.destH=emmhandle;
-		mm.destOff=0;
-		ist = move_emem(&mm);
-		if(!ist){ dealloc_emem(emmhandle); exit(5); }
-		printf("%d\n", coretotalEMS());
-	}*/
-
-	return result;
-}
-
-void
-initMap(map_t *map) {
-	/* just a place holder to fill out an alternating pattern */
-	int x, y, xx, yy;
-	int i, q;
-//	int tile = 1;
-	//if(!isEMS() || !checkEMS())
-//		map->tiles = malloc(sizeof(tiles_t));
-	//else
-	//	map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));
-
-	/* create the tile set */
-	//if(!isEMS() || !checkEMS())
-//		map->tiles->data = malloc(sizeof(bitmap_t));
-	//else
-	//	map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));
-//	map->tiles->data->width = (TILEWH/**2*/);
-//	map->tiles->data->height= TILEWH;
-	//if(!isEMS() || !checkEMS())
-//		map->tiles->data->data = malloc((TILEWH*2)*TILEWH);
-	//else
-	//	map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);
-//	map->tiles->tileHeight = TILEWH;
-//	map->tiles->tileWidth =TILEWH;
-//	map->tiles->rows = 1;
-//	map->tiles->cols = 1;//2;
-
-	/*q=0;
-	//for(y=0; y<map->height; y++) {
-	//for(x=0; x<map->width; x++) {
-	i=0;
-	for(yy=0; yy<TILEWH; yy++) {
-	for(xx=0; xx<(TILEWH); xx++) {
-		//if(x<TILEWH){
-		  map->tiles->data->data[i+1] = map->data[q];//28;//0x24;
-//		  printf("[%d]", map->tiles->data->data[i]);
-		//}else{
-		  //map->tiles->data->data[i] = map->data[q];//0;//0x34;
-		  //printf("]%d[==[%d]", i, map->tiles->data->data[i]);
-		//}
-		i++;
-	}
-//	printf("\n");
-	}
-//	printf("[%d]", map->data[q]);
-	q++;
-//	}
-	//printf("\n\n");
-//	}*/
-
-	/*i=0;
-	for(y=0; y<map->height; y++) {
-		for(x=0; x<map->width; x++) {
-//			map->data[i]=255;
-			printf("[%d]", map->data[i]);
-			//tile = tile ? 0 : 1;
-			i++;
-		}
-		//tile = tile ? 0 : 1;
-	}*/
-}
-
-
-void
-mapScrollRight(map_view_t *mv, byte offset, word id)
-{
-	word x, y;  /* coordinate for drawing */
-
-	/* increment the pixel position and update the page */
-	mv[id].page->dx += offset;
-
-	/* check to see if this changes the tile */
-	if(mv[id].page->dx >= mv[id].dxThresh ) {
-	/* go forward one tile */
-	mv[id].tx++;
-	/* Snap the origin forward */
-	mv[id].page->data += 4;
-	mv[id].page->dx = mv[id].map->tiles->tileWidth;
-
-	/* draw the next column */
-	x= SCREEN_WIDTH + mv[id].map->tiles->tileWidth;
-		if(id==0)
-			mapDrawCol(&mv[0], mv[0].tx + 20 , mv[0].ty-1, x);
-		else
-			modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*17);
-	}
-}
-
-
-void
-mapScrollLeft(map_view_t *mv, byte offset, word id)
-{
-	word x, y;  /* coordinate for drawing */
-
-	/* increment the pixel position and update the page */
-	mv[id].page->dx -= offset;
-
-	/* check to see if this changes the tile */
-	if(mv[id].page->dx == 0) {
-	/* go backward one tile */
-	mv[id].tx--;
-
-	/* Snap the origin backward */
-	mv[id].page->data -= 4;
-	mv[id].page->dx = mv[id].map->tiles->tileWidth;
-
-	/* draw the next column */
-	x= 0;
-		if(id==0)
-			mapDrawCol(&mv[0], mv[0].tx-1, mv[0].ty-1, 0);
-		else
-			modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*17);
-	}
-}
-
-
-void
-mapScrollUp(map_view_t *mv, byte offset, word id)
-{
-	word x, y;  /* coordinate for drawing */
-
-	/* increment the pixel position and update the page */
-	mv[id].page->dy -= offset;
-
-	/* check to see if this changes the tile */
-	if(mv[id].page->dy == 0 ) {
-	/* go down one tile */
-	mv[id].ty--;
-	/* Snap the origin downward */
-	mv[id].page->data -= mv[id].page->width*4;
-	mv[id].page->dy = mv[id].map->tiles->tileHeight;
-
-	/* draw the next row */
-	y= 0;
-		if(id==0)
-			mapDrawRow(&mv[0], mv[0].tx-1 , mv[0].ty-1, 0);
-		else
-			modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*22, mv[id].map->tiles->tileHeight);
-	}
-}
-
-
-void
-mapScrollDown(map_view_t *mv, byte offset, word id)
-{
-	word x, y;  /* coordinate for drawing */
-
-	/* increment the pixel position and update the page */
-	mv[id].page->dy += offset;
-
-	/* check to see if this changes the tile */
-	if(mv[id].page->dy >= mv[id].dyThresh ) {
-	/* go down one tile */
-	mv[id].ty++;
-	/* Snap the origin downward */
-	mv[id].page->data += mv[id].page->width*4;
-	mv[id].page->dy = mv[id].map->tiles->tileHeight;
-
-	/* draw the next row */
-	y= SCREEN_HEIGHT + mv[id].map->tiles->tileHeight;
-		if(id==0)
-			mapDrawRow(&mv[0], mv[0].tx-1 , mv[0].ty+15, y);
-		else
-			modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*22, mv[id].map->tiles->tileHeight);
-	}
-}
-
-
-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;
-	//if(i==0) i=2;
-	if(i==0)
-	{
-		//wwww
-		modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 0); //currently the over scan color!
-	}
-	else
-	{
-	rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);
-	ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);
-////0000	printf("i=%d\n", i);
-	//mxPutTile(t->data, x, y, t->tileWidth, 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;
-	}
-}
-
-void qclean()
-{
-	modexLeave();
-	setkb(0);
-}
-
-void pdump(map_view_t *pee)
-{
-	int mult=(QUADWH);
-	int palq=(mult)*TILEWH;
-	int palcol=0;
-	int palx, paly;
-	for(paly=0; paly<palq; paly+=mult){
-		for(palx=0; palx<palq; palx+=mult){
-				modexClearRegion(pee->page, palx+TILEWH, paly+TILEWH, mult, mult, palcol);
-			palcol++;
-		}
-	}
-}
-
-void
-animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */sword d, short scrolloffsetswitch, int x, int y, int ls, int lp, bitmap_t *bmp)
-{
-	sword dire=32*d; //direction
-	sword qq; //scroll offset
-
-	if(scrolloffsetswitch==0) qq = 0;
-	else qq = ((lp)*SPEED);
-	switch (d)
-	{
-		case 0:
-			//up
-			x=x-4;
-			y=y-qq-TILEWH;
-		break;
-		case 1:
-			// right
-			x=x+qq-4;
-			y=y-TILEWH;
-		break;
-		case 2:
-			//down
-			x=x-4;
-			y=y+qq-TILEWH;
-		break;
-		case 3:
-			//left
-			x=x-qq-4;
-			y=y-TILEWH;
-		break;
-	}
-	modexCopyPageRegion(dest->page, src->page, x-4, y-4, x-4, y-4, 28, 40);
-	if(2>ls && ls>=1) { modexDrawSpriteRegion(dest->page, x, y, 48, dire, 24, 32, bmp); }else
-	if(3>ls && ls>=2) { modexDrawSpriteRegion(dest->page, x, y, 24, dire, 24, 32, bmp); }else
-	if(4>ls && ls>=3) { modexDrawSpriteRegion(dest->page, x, y, 0, dire, 24, 32, bmp); }else
-	if(5>ls && ls>=4) { modexDrawSpriteRegion(dest->page, x, y, 24, dire, 24, 32, bmp); }
-	//TODO: mask copy //modexCopyPageRegion(dest->page, src->page, x-4, y-4, x-4, y-4, 28, 40);
-	//modexClearRegion(top->page, 66, 66, 2, 40, 0);
-	//modexCopyPageRegion(dest->page, top->page, 66, 66, 66, 66, 2, 40);
-	//turn this off if XT
-	//XTif(detectcpu() > 0)
-	modexWaitBorder();
-}
diff --git a/test.exe b/test.exe
index 9bb2f6ae..030e3f27 100644
Binary files a/test.exe and b/test.exe differ
diff --git a/test2.exe b/test2.exe
index 69f2adc9..af316409 100644
Binary files a/test2.exe and b/test2.exe differ
diff --git a/tsthimem.exe b/tsthimem.exe
index 465bcca1..99f79a9e 100644
Binary files a/tsthimem.exe and b/tsthimem.exe differ