diff --git a/gr-sim/Makefile b/gr-sim/Makefile
index e67ebd35..58a320b6 100644
--- a/gr-sim/Makefile
+++ b/gr-sim/Makefile
@@ -28,12 +28,20 @@ text.o:	text.c
 
 ####
 
-tfv:	tfv.o gr-sim.o
-	$(CC) $(LFLAGS) $(SDL_LIBS) -o tfv tfv.o gr-sim.o
+tfv_opener.o:	tfv_opener.c tfv_utils.h
+	$(CC) $(CFLAGS) -c tfv_opener.c
+
+tfv_utils.o:	tfv_utils.c tfv_utils.h
+	$(CC) $(CFLAGS) -c tfv_utils.c
 
 tfv.o:	tfv.c gr-sim.h backgrounds.h tfv_sprites.h
 	$(CC) $(CFLAGS) -c tfv.c
 
+tfv:	tfv.o tfv_opener.o tfv_utils.o gr-sim.o
+	$(CC) $(LFLAGS) $(SDL_LIBS) -o tfv tfv.o tfv_opener.o tfv_utils.o gr-sim.o
+
+
+
 
 ###
 
diff --git a/gr-sim/sparkle.c b/gr-sim/sparkle.c
index 03e61bbb..884c0a20 100644
--- a/gr-sim/sparkle.c
+++ b/gr-sim/sparkle.c
@@ -98,6 +98,7 @@ label140:
 		for(l=(y-S);l<=(y+S);l+=(r/4)+1) {
 			for(k=(x-S);k<=(x+S);k+=r) {
 				basic_plot(k,l);
+				grsim_update();
 			}
 		}
 	}
diff --git a/gr-sim/tfv.c b/gr-sim/tfv.c
index 483a205d..67abd041 100644
--- a/gr-sim/tfv.c
+++ b/gr-sim/tfv.c
@@ -4,182 +4,25 @@
 #include <string.h>
 
 #include "gr-sim.h"
+#include "tfv_utils.h"
+#include "tfv_zp.h"
 
 #include "tfv_sprites.h"
 #include "backgrounds.h"
 
-/* Page Zero */
-
-#define COLOR1	0x00
-#define COLOR2	0x01
-#define MATCH	0x02
-#define XX	0x03
-#define YY	0x04
-#define YADD	0x05
-#define LOOP	0x06
-#define MEMPTRL	0x07
-#define MEMPTRH	0x08
-#define DISP_PAGE	0x09
-#define DRAW_PAGE	0x0a
-
 /* stats */
-static unsigned char level=0;
-static unsigned char hp=50,max_hp=100;
-static unsigned char limit=2;
-static unsigned char money=0,experience=0;
-static unsigned char time_hours=0,time_minutes=0;
-static unsigned char items1=0xff,items2=0xff;
-static unsigned char steps=0;
+unsigned char level=0;
+unsigned char hp=50,max_hp=100;
+unsigned char limit=2;
+unsigned char money=0,experience=0;
+unsigned char time_hours=0,time_minutes=0;
+unsigned char items1=0xff,items2=0xff;
+unsigned char steps=0;
 
 /* location */
-static unsigned char map_x=5;
-static char tfv_x=15,tfv_y=19;
-static unsigned char ground_color;
-
-static void page_flip(void) {
-
-	if (ram[DISP_PAGE]==0) {
-		soft_switch(HISCR);
-		ram[DISP_PAGE]=1;
-		ram[DRAW_PAGE]=0;
-	}
-	else {
-		soft_switch(LOWSCR);
-		ram[DISP_PAGE]=0;
-		ram[DRAW_PAGE]=1;
-	}
-}
-
-static void draw_segment(void) {
-
-	for(ram[LOOP]=0;ram[LOOP]<4;ram[LOOP]++) {
-		ram[YY]=ram[YY]+ram[YADD];
-		if (ram[XX]==ram[MATCH]) color_equals(ram[COLOR1]*3);
-		else color_equals(ram[COLOR1]);
-		vlin(ram[DRAW_PAGE],10,ram[YY],9+ram[XX]);
-		if (ram[XX]==ram[MATCH]) color_equals(ram[COLOR2]*3);
-		else color_equals(ram[COLOR2]);
-		if (ram[YY]!=34) vlin(ram[DRAW_PAGE],ram[YY],34,9+ram[XX]);
-		ram[XX]++;
-	}
-	ram[YADD]=-ram[YADD];
-}
-
-static void draw_logo(void) {
-
-	ram[XX]=0;
-	ram[YY]=10;
-	ram[YADD]=6;
-	ram[COLOR1]=1;
-	ram[COLOR2]=0;
-	draw_segment();
-	ram[COLOR2]=4;
-	draw_segment();
-	ram[COLOR1]=2;
-	draw_segment();
-	draw_segment();
-	draw_segment();
-	ram[COLOR2]=0;
-	draw_segment();
-
-	page_flip();
-
-	grsim_update();
-}
-
-static int repeat_until_keypressed(void) {
-
-	int ch;
-
-	while(1) {
-		ch=grsim_input();
-		if (ch!=0) break;
-
-		usleep(10000);
-	}
-
-	return ch;
-}
-
-static int select_menu(int x, int y, int num, char **items) {
-
-	int result=0;
-	int ch,i;
-
-	while(1) {
-		for(i=0;i<num;i++) {
-			basic_htab(x);
-			basic_vtab(y+i);
-
-			if (i==result) {
-				basic_inverse();
-				basic_print("--> ");
-			}
-			else {
-				basic_print("    ");
-			}
-
-			basic_print(items[i]);
-			basic_normal();
-			grsim_update();
-		}
-
-
-		ch=repeat_until_keypressed();
-		if (ch=='\r') break;
-		if (ch==' ') break;
-		if (ch==APPLE_RIGHT) result++;
-		if (ch==APPLE_DOWN) result++;
-		if (ch==APPLE_LEFT) result--;
-		if (ch==APPLE_UP) result--;
-		if (result>=num) result=num-1;
-		if (result<0) result=0;
-	}
-
-	return result;
-}
-
-
-
-static void apple_memset(char *ptr, int value, int length) {
-
-	a=value;
-	x=length;
-	y=0;
-
-	while(x>0) {
-		ptr[y]=a;
-		y++;
-		x--;
-	}
-}
-
-
-static int opening(void) {
-
-	/* VMW splash */
-
-	ram[MATCH]=100;
-	draw_logo();
-
-	usleep(200000);
-
-	for(ram[MATCH]=0;ram[MATCH]<30;ram[MATCH]++) {
-		draw_logo();
-		grsim_update();
-
-		usleep(20000);
-	}
-
-	basic_vtab(21);
-	basic_htab(9);
-	basic_print("A VMW SOFTWARE PRODUCTION");
-	grsim_update();
-
-	repeat_until_keypressed();
-
-	return 0;
-}
+unsigned char map_x=5;
+char tfv_x=15,tfv_y=19;
+unsigned char ground_color;
 
 static char *title_menu[]={
 	"NEW GAME",
@@ -482,16 +325,6 @@ static void show_map(void) {
 	repeat_until_keypressed();
 }
 
-void print_u8(unsigned char value) {
-
-	char temp[4];
-
-	sprintf(temp,"%d",value);
-
-	basic_print(temp);
-
-}
-
 
 /*
           1         2         3         4
@@ -664,13 +497,6 @@ List hits
 
 */
 
-static void print_byte(unsigned char value) {
-	char temp[4];
-	sprintf(temp,"%3d",value);
-	temp[3]=0;
-	basic_print(temp);
-}
-
 /* Enemies: */
 /*   Killer Crab, Tree, Big Fish, Procrastinon */
 
diff --git a/gr-sim/tfv_opener.c b/gr-sim/tfv_opener.c
new file mode 100644
index 00000000..dbbd1fe6
--- /dev/null
+++ b/gr-sim/tfv_opener.c
@@ -0,0 +1,73 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include "gr-sim.h"
+#include "tfv_utils.h"
+#include "tfv_zp.h"
+
+
+static void draw_segment(void) {
+
+	for(ram[LOOP]=0;ram[LOOP]<4;ram[LOOP]++) {
+		ram[YY]=ram[YY]+ram[YADD];
+		if (ram[XX]==ram[MATCH]) color_equals(ram[COLOR1]*3);
+		else color_equals(ram[COLOR1]);
+		vlin(ram[DRAW_PAGE],10,ram[YY],9+ram[XX]);
+		if (ram[XX]==ram[MATCH]) color_equals(ram[COLOR2]*3);
+		else color_equals(ram[COLOR2]);
+		if (ram[YY]!=34) vlin(ram[DRAW_PAGE],ram[YY],34,9+ram[XX]);
+		ram[XX]++;
+	}
+	ram[YADD]=-ram[YADD];
+}
+
+static void draw_logo(void) {
+
+	ram[XX]=0;
+	ram[YY]=10;
+	ram[YADD]=6;
+	ram[COLOR1]=1;
+	ram[COLOR2]=0;
+	draw_segment();
+	ram[COLOR2]=4;
+	draw_segment();
+	ram[COLOR1]=2;
+	draw_segment();
+	draw_segment();
+	draw_segment();
+	ram[COLOR2]=0;
+	draw_segment();
+
+	page_flip();
+
+	grsim_update();
+}
+
+int opening(void) {
+
+	/* VMW splash */
+
+	ram[MATCH]=100;
+	draw_logo();
+
+	usleep(200000);
+
+	for(ram[MATCH]=0;ram[MATCH]<30;ram[MATCH]++) {
+		draw_logo();
+		grsim_update();
+
+		usleep(20000);
+	}
+
+	basic_vtab(21);
+	basic_htab(9);
+	basic_print("A VMW SOFTWARE PRODUCTION");
+	grsim_update();
+
+	repeat_until_keypressed();
+
+	return 0;
+}
+
diff --git a/gr-sim/tfv_utils.c b/gr-sim/tfv_utils.c
new file mode 100644
index 00000000..952c6c9a
--- /dev/null
+++ b/gr-sim/tfv_utils.c
@@ -0,0 +1,121 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include "gr-sim.h"
+
+#include "tfv_sprites.h"
+#include "backgrounds.h"
+
+/* Page Zero */
+
+#define COLOR1	0x00
+#define COLOR2	0x01
+#define MATCH	0x02
+#define XX	0x03
+#define YY	0x04
+#define YADD	0x05
+#define LOOP	0x06
+#define MEMPTRL	0x07
+#define MEMPTRH	0x08
+#define DISP_PAGE	0x09
+#define DRAW_PAGE	0x0a
+
+
+int repeat_until_keypressed(void) {
+
+	int ch;
+
+	while(1) {
+		ch=grsim_input();
+		if (ch!=0) break;
+
+		usleep(10000);
+	}
+
+	return ch;
+}
+
+int select_menu(int x, int y, int num, char **items) {
+
+	int result=0;
+	int ch,i;
+
+	while(1) {
+		for(i=0;i<num;i++) {
+			basic_htab(x);
+			basic_vtab(y+i);
+
+			if (i==result) {
+				basic_inverse();
+				basic_print("--> ");
+			}
+			else {
+				basic_print("    ");
+			}
+
+			basic_print(items[i]);
+			basic_normal();
+			grsim_update();
+		}
+
+
+		ch=repeat_until_keypressed();
+		if (ch=='\r') break;
+		if (ch==' ') break;
+		if (ch==APPLE_RIGHT) result++;
+		if (ch==APPLE_DOWN) result++;
+		if (ch==APPLE_LEFT) result--;
+		if (ch==APPLE_UP) result--;
+		if (result>=num) result=num-1;
+		if (result<0) result=0;
+	}
+
+	return result;
+}
+
+void apple_memset(char *ptr, int value, int length) {
+
+	a=value;
+	x=length;
+	y=0;
+
+	while(x>0) {
+		ptr[y]=a;
+		y++;
+		x--;
+	}
+}
+
+void print_u8(unsigned char value) {
+
+	char temp[4];
+
+	sprintf(temp,"%d",value);
+
+	basic_print(temp);
+
+}
+
+void print_byte(unsigned char value) {
+	char temp[4];
+	sprintf(temp,"%3d",value);
+	temp[3]=0;
+	basic_print(temp);
+}
+
+void page_flip(void) {
+
+	if (ram[DISP_PAGE]==0) {
+		soft_switch(HISCR);
+		ram[DISP_PAGE]=1;
+		ram[DRAW_PAGE]=0;
+	}
+	else {
+		soft_switch(LOWSCR);
+		ram[DISP_PAGE]=0;
+		ram[DRAW_PAGE]=1;
+	}
+}
+
diff --git a/gr-sim/tfv_utils.h b/gr-sim/tfv_utils.h
new file mode 100644
index 00000000..1a08b4ce
--- /dev/null
+++ b/gr-sim/tfv_utils.h
@@ -0,0 +1,6 @@
+int repeat_until_keypressed(void);
+int select_menu(int x, int y, int num, char **items);
+void apple_memset(char *ptr, int value, int length);
+void print_u8(unsigned char value);
+void print_byte(unsigned char value);
+void page_flip(void);
diff --git a/gr-sim/tfv_zp.h b/gr-sim/tfv_zp.h
new file mode 100644
index 00000000..6ea312d0
--- /dev/null
+++ b/gr-sim/tfv_zp.h
@@ -0,0 +1,30 @@
+/* Page Zero */
+
+#define COLOR1	0x00
+#define COLOR2	0x01
+#define MATCH	0x02
+#define XX	0x03
+#define YY	0x04
+#define YADD	0x05
+#define LOOP	0x06
+#define MEMPTRL	0x07
+#define MEMPTRH	0x08
+#define DISP_PAGE	0x09
+#define DRAW_PAGE	0x0a
+
+/* stats */
+extern unsigned char level;
+extern unsigned char hp,max_hp;
+extern unsigned char limit;
+extern unsigned char money,experience;
+extern unsigned char time_hours,time_minutes;
+extern unsigned char items1,items2;
+extern unsigned char steps;
+
+/* location */
+extern unsigned char map_x;
+extern char tfv_x,tfv_y;
+extern unsigned char ground_color;
+
+int opening(void);
+