diff --git a/src/conio/cterm.c b/src/conio/cterm.c
index 49e97679f80065255223ada51e4ecb20fe478af8..f286f4e8ec5443100250fc7d894d825e4f7e1351 100644
--- a/src/conio/cterm.c
+++ b/src/conio/cterm.c
@@ -444,12 +444,12 @@ static void scrolldown(struct cterminal *cterm)
 {
 	int x,y;
 
-	movetext(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-2,cterm->x,cterm->y+1);
-	x=wherex();
-	y=wherey();
-	gotoxy(1,1);
-	clreol();
-	gotoxy(x,y);
+	cterm->movetext(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-2,cterm->x,cterm->y+1);
+	x=cterm->wherex();
+	y=cterm->wherey();
+	cterm->gotoxy(1,1);
+	cterm->clreol();
+	cterm->gotoxy(x,y);
 }
 
 static void scrollup(struct cterminal *cterm)
@@ -462,14 +462,14 @@ static void scrollup(struct cterminal *cterm)
 			memmove(cterm->scrollback,cterm->scrollback+cterm->width*2,cterm->width*2*(cterm->backlines-1));
 			cterm->backpos--;
 		}
-		gettext(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y,cterm->scrollback+(cterm->backpos-1)*cterm->width*2);
+		cterm->gettext(cterm->x, cterm->y, cterm->x+cterm->width-1, cterm->y, cterm->scrollback+(cterm->backpos-1)*cterm->width*2);
 	}
-	movetext(cterm->x,cterm->y+1,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->x,cterm->y);
-	x=wherex();
-	y=wherey();
-	gotoxy(1,cterm->height);
-	clreol();
-	gotoxy(x,y);
+	cterm->movetext(cterm->x,cterm->y+1,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->x,cterm->y);
+	x=cterm->wherex();
+	y=cterm->wherey();
+	cterm->gotoxy(1,cterm->height);
+	cterm->clreol();
+	cterm->gotoxy(x,y);
 }
 
 static void dellines(struct cterminal * cterm, int lines)
@@ -480,15 +480,15 @@ static void dellines(struct cterminal * cterm, int lines)
 
 	if(lines<1)
 		return;
-	linestomove=cterm->height-wherey();
-	movetext(cterm->x,cterm->y+wherey()-1+lines,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->x,cterm->y+wherey()-1);
-	x=wherex();
-	y=wherey();
+	linestomove=cterm->height-cterm->wherey();
+	cterm->movetext(cterm->x,cterm->y+cterm->wherey()-1+lines,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->x,cterm->y+cterm->wherey()-1);
+	x=cterm->wherex();
+	y=cterm->wherey();
 	for(i=cterm->height-lines+1; i<=cterm->height; i++) {
-		gotoxy(1,i);
-		clreol();
+		cterm->gotoxy(1,i);
+		cterm->clreol();
 	}
-	gotoxy(x,y);
+	cterm->gotoxy(x,y);
 }
 
 static void clear2bol(struct cterminal * cterm)
@@ -496,7 +496,7 @@ static void clear2bol(struct cterminal * cterm)
 	char *buf;
 	int i,j,k;
 
-	k=wherex();
+	k=cterm->wherex();
 	buf=(char *)alloca(k*2);
 	j=0;
 	for(i=0;i<k;i++) {
@@ -506,21 +506,24 @@ static void clear2bol(struct cterminal * cterm)
 			buf[j++]=' ';
 		buf[j++]=cterm->attr;
 	}
-	puttext(cterm->x,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,buf);
+	cterm->puttext(cterm->x,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,buf);
 }
 
 void cterm_clearscreen(struct cterminal *cterm, char attr)
 {
+	if(!cterm->started)
+		cterm_start(cterm);
+
 	if(cterm->scrollback!=NULL) {
 		cterm->backpos+=cterm->height;
 		if(cterm->backpos>cterm->backlines) {
 			memmove(cterm->scrollback,cterm->scrollback+cterm->width*2*(cterm->backpos-cterm->backlines),cterm->width*2*(cterm->backlines-(cterm->backpos-cterm->backlines)));
 			cterm->backpos=cterm->backlines;
 		}
-		gettext(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->scrollback+(cterm->backpos-cterm->height)*cterm->width*2);
+		cterm->gettext(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->scrollback+(cterm->backpos-cterm->height)*cterm->width*2);
 	}
-	clrscr();
-	gotoxy(1,1);
+	cterm->clrscr();
+	cterm->gotoxy(1,1);
 }
 
 static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *speed)
@@ -557,22 +560,22 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 					case 'h':
 						if(!strcmp(cterm->escbuf,"[?25h")) {
 							cterm->cursor=_NORMALCURSOR;
-							_setcursortype(cterm->cursor);
+							cterm->_setcursortype(cterm->cursor);
 						}
 						if(!strcmp(cterm->escbuf,"[?31h")) {
-							i=getvideoflags();
+							i=cterm->getvideoflags();
 							i|=CIOLIB_VIDEO_ALTCHARS;
-							setvideoflags(i);
+							cterm->setvideoflags(i);
 						}
 						if(!strcmp(cterm->escbuf,"[?32h")) {
-							i=getvideoflags();
+							i=cterm->getvideoflags();
 							i|=CIOLIB_VIDEO_NOBRIGHT;
-							setvideoflags(i);
+							cterm->setvideoflags(i);
 						}
 						if(!strcmp(cterm->escbuf,"[?33h")) {
-							i=getvideoflags();
+							i=cterm->getvideoflags();
 							i|=CIOLIB_VIDEO_BGBRIGHT;
-							setvideoflags(i);
+							cterm->setvideoflags(i);
 						}
 						if(!strcmp(cterm->escbuf,"[=255h"))
 							cterm->doorway_mode=1;
@@ -580,22 +583,22 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 					case 'l':
 						if(!strcmp(cterm->escbuf,"[?25l")) {
 							cterm->cursor=_NOCURSOR;
-							_setcursortype(cterm->cursor);
+							cterm->_setcursortype(cterm->cursor);
 						}
 						if(!strcmp(cterm->escbuf,"[?31l")) {
-							i=getvideoflags();
+							i=cterm->getvideoflags();
 							i&=~CIOLIB_VIDEO_ALTCHARS;
-							setvideoflags(i);
+							cterm->setvideoflags(i);
 						}
 						if(!strcmp(cterm->escbuf,"[?32l")) {
-							i=getvideoflags();
+							i=cterm->getvideoflags();
 							i&=~CIOLIB_VIDEO_NOBRIGHT;
-							setvideoflags(i);
+							cterm->setvideoflags(i);
 						}
 						if(!strcmp(cterm->escbuf,"[?33l")) {
-							i=getvideoflags();
+							i=cterm->getvideoflags();
 							i&=~CIOLIB_VIDEO_BGBRIGHT;
-							setvideoflags(i);
+							cterm->setvideoflags(i);
 						}
 						if(!strcmp(cterm->escbuf,"[=255l"))
 							cterm->doorway_mode=0;
@@ -639,44 +642,44 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 			}
 			switch(*p) {
 				case '@':	/* Insert Char */
-					i=wherex();
-					j=wherey();
+					i=cterm->wherex();
+					j=cterm->wherey();
 					k=strtoul(cterm->escbuf+1,NULL,10);
 					if(k<1)
 						k=1;
 					if(k>cterm->width - j)
 						k=cterm->width - j;
-					movetext(cterm->x+i-1,cterm->y+j-1,cterm->x+cterm->width-1-k,cterm->y+j-1,cterm->x+i-1+k,cterm->y+j-1);
+					cterm->movetext(cterm->x+i-1,cterm->y+j-1,cterm->x+cterm->width-1-k,cterm->y+j-1,cterm->x+i-1+k,cterm->y+j-1);
 					for(l=0; l< k; l++)
-						putch(' ');
-					gotoxy(i,j);
+						cterm->putch(' ');
+					cterm->gotoxy(i,j);
 					break;
 				case 'A':	/* Cursor Up */
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i==0)
 						i=1;
-					i=wherey()-i;
+					i=cterm->wherey()-i;
 					if(i<1)
 						i=1;
-					gotoxy(wherex(),i);
+					cterm->gotoxy(cterm->wherex(),i);
 					break;
 				case 'B':	/* Cursor Down */
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i==0)
 						i=1;
-					i=wherey()+i;
+					i=cterm->wherey()+i;
 					if(i>cterm->height)
 						i=cterm->height;
-					gotoxy(wherex(),i);
+					cterm->gotoxy(cterm->wherex(),i);
 					break;
 				case 'C':	/* Cursor Right */
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i==0)
 						i=1;
-					i=wherex()+i;
+					i=cterm->wherex()+i;
 					if(i>cterm->width)
 						i=cterm->width;
-					gotoxy(i,wherey());
+					cterm->gotoxy(i,cterm->wherey());
 					break;
 				case 'D':	/* Cursor Left and Font Select */
 					if(*(p-1)==' ') {	/* Font Select */
@@ -692,7 +695,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 							switch(i) {
 								case 0:	/* Only the primary and secondary font is currently supported */
 								case 1:
-									setfont(j,FALSE,i+1);
+									cterm->setfont(j,FALSE,i+1);
 							}
 						}
 					}
@@ -700,29 +703,29 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 						i=strtoul(cterm->escbuf+1,NULL,10);
 						if(i==0)
 							i=1;
-						i=wherex()-i;
+						i=cterm->wherex()-i;
 						if(i<1)
 							i=1;
-						gotoxy(i,wherey());
+						cterm->gotoxy(i,cterm->wherey());
 					}
 					break;
 				case 'E':	/* Cursor next line */
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i==0)
 						i=1;
-					i=wherey()+i;
+					i=cterm->wherey()+i;
 					if(i>cterm->height)
 						i=cterm->height;
-					gotoxy(1,i);
+					cterm->gotoxy(1,i);
 					break;
 				case 'F':	/* Cursor preceding line */
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i==0)
 						i=1;
-					i=wherey()-i;
+					i=cterm->wherey()-i;
 					if(i<1)
 						i=1;
-					gotoxy(1,i);
+					cterm->gotoxy(1,i);
 					break;
 				case 'G':
 					col=strtoul(cterm->escbuf+1,NULL,10);
@@ -730,7 +733,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 						col=1;
 					if(col>cterm->width)
 						col=cterm->width;
-					gotoxy(col,wherey());
+					cterm->gotoxy(col,cterm->wherey());
 					break;
 				case 'f':
 				case 'H':
@@ -753,34 +756,34 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 						row=cterm->height;
 					if(col>cterm->width)
 						col=cterm->width;
-					gotoxy(col,row);
+					cterm->gotoxy(col,row);
 					break;
 				case 'J':
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					switch(i) {
 						case 0:
-							clreol();
-							row=wherey();
-							col=wherex();
+							cterm->clreol();
+							row=cterm->wherey();
+							col=cterm->wherex();
 							for(i=row+1;i<=cterm->height;i++) {
-								gotoxy(1,i);
-								clreol();
+								cterm->gotoxy(1,i);
+								cterm->clreol();
 							}
-							gotoxy(col,row);
+							cterm->gotoxy(col,row);
 							break;
 						case 1:
 							clear2bol(cterm);
-							row=wherey();
-							col=wherex();
+							row=cterm->wherey();
+							col=cterm->wherex();
 							for(i=row-1;i>=1;i--) {
-								gotoxy(1,i);
-								clreol();
+								cterm->gotoxy(1,i);
+								cterm->clreol();
 							}
-							gotoxy(col,row);
+							cterm->gotoxy(col,row);
 							break;
 						case 2:
 							cterm_clearscreen(cterm, (char)cterm->attr);
-							gotoxy(1,1);
+							cterm->gotoxy(1,1);
 							break;
 					}
 					break;
@@ -788,35 +791,35 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					switch(i) {
 						case 0:
-							clreol();
+							cterm->clreol();
 							break;
 						case 1:
 							clear2bol(cterm);
 							break;
 						case 2:
-							row=wherey();
-							col=wherex();
-							gotoxy(1,row);
-							clreol();
-							gotoxy(col,row);
+							row=cterm->wherey();
+							col=cterm->wherex();
+							cterm->gotoxy(1,row);
+							cterm->clreol();
+							cterm->gotoxy(col,row);
 							break;
 					}
 					break;
 				case 'L':		/* Insert line */
-					row=wherey();
-					col=wherex();
+					row=cterm->wherey();
+					col=cterm->wherex();
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i==0)
 						i=1;
 					if(i>cterm->height-row)
 						i=cterm->height-row;
 					if(i)
-						movetext(cterm->x,cterm->y+row-1,cterm->x+cterm->width-1,cterm->y+cterm->height-1-i,cterm->x,cterm->y+row-1+i);
+						cterm->movetext(cterm->x,cterm->y+row-1,cterm->x+cterm->width-1,cterm->y+cterm->height-1-i,cterm->x,cterm->y+row-1+i);
 					for(j=0;j<i;j++) {
-						gotoxy(1,row+j);
-						clreol();
+						cterm->gotoxy(1,row+j);
+						cterm->clreol();
 					}
-					gotoxy(col,row);
+					cterm->gotoxy(col,row);
 					break;
 				case 'M':	/* ANSI music and also supposed to be delete line! */
 					if(cterm->music_enable==CTERM_MUSIC_ENABLED) {
@@ -836,18 +839,18 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 						cterm->music=2;
 					break;
 				case 'P':	/* Delete char */
-					row=wherey();
-					col=wherex();
+					row=cterm->wherey();
+					col=cterm->wherex();
 
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i==0)
 						i=1;
 					if(i>cterm->width-col+1)
 						i=cterm->width-col+1;
-					movetext(cterm->x+col-1+i,cterm->y+row-1,cterm->x+cterm->width-1,cterm->y+row-1,cterm->x+col-1,cterm->y+row-1);
-					gotoxy(cterm->width-i,col);
-					clreol();
-					gotoxy(col,row);
+					cterm->movetext(cterm->x+col-1+i,cterm->y+row-1,cterm->x+cterm->width-1,cterm->y+row-1,cterm->x+col-1,cterm->y+row-1);
+					cterm->gotoxy(cterm->width-i,col);
+					cterm->clreol();
+					cterm->gotoxy(col,row);
 					break;
 				case 'S':
 					i=strtoul(cterm->escbuf+1,NULL,10);
@@ -865,35 +868,35 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 					break;
 #if 0
 				case 'U':
-					gettextinfo(&ti);
+					cterm->gettextinfo(&ti);
 					cterm_clearscreen(cterm, ti.normattr);
-					gotoxy(1,1);
+					cterm->gotoxy(1,1);
 					break;
 #endif
 				case 'X':
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i<1)
 						i=1;
-					if(i>cterm->width-wherex())
-						i=cterm->width-wherex();
+					if(i>cterm->width-cterm->wherex())
+						i=cterm->width-cterm->wherex();
 					p2=alloca(i*2);
 					j=0;
 					for(k=0;k<i;k++) {
 						p2[j++]=' ';
 						p2[j++]=cterm->attr;
 					}
-					puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1+i-1,cterm->y+wherey()-1,p2);
+					cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1+i-1,cterm->y+cterm->wherey()-1,p2);
 					break;
 				case 'Z':
 					i=strtoul(cterm->escbuf+1,NULL,10);
 					if(i==0 && cterm->escbuf[0] != '0')
 						i=1;
 					for(j=(sizeof(cterm_tabs)/sizeof(cterm_tabs[0]))-1;j>=0;j--) {
-						if(cterm_tabs[j]<wherex()) {
+						if(cterm_tabs[j]<cterm->wherex()) {
 							k=j-i+1;
 							if(k<0)
 								k=0;
-							gotoxy(cterm_tabs[k],wherey());
+							cterm->gotoxy(cterm_tabs[k],cterm->wherey());
 							break;
 						}
 					}
@@ -920,10 +923,10 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 				case 'm':
 					*(p--)=0;
 					p2=cterm->escbuf+1;
-					gettextinfo(&ti);
+					cterm->gettextinfo(&ti);
 					if(p2>p) {
 						cterm->attr=ti.normattr;
-						textattr(cterm->attr);
+						cterm->textattr(cterm->attr);
 						break;
 					}
 					while((p=strtok(p2,";"))!=NULL) {
@@ -1029,7 +1032,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 								break;
 						}
 					}
-					textattr(cterm->attr);
+					cterm->textattr(cterm->attr);
 					break;
 				case 'n':
 					i=strtoul(cterm->escbuf+1,NULL,10);
@@ -1043,7 +1046,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 							break;
 						case 6:
 							if(retbuf!=NULL) {
-								sprintf(tmp,"%c[%d;%dR",27,wherey(),wherex());
+								sprintf(tmp,"%c[%d;%dR",27,cterm->wherey(),cterm->wherex());
 								if(strlen(retbuf)+strlen(tmp) < retsize)
 									strcat(retbuf,tmp);
 							}
@@ -1141,13 +1144,13 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 					}
 					break;
 				case 's':
-					cterm->save_xpos=wherex();
-					cterm->save_ypos=wherey();
+					cterm->save_xpos=cterm->wherex();
+					cterm->save_ypos=cterm->wherey();
 					break;
 				case 'u':
 					if(cterm->save_ypos>0 && cterm->save_ypos<=cterm->height
 							&& cterm->save_xpos>0 && cterm->save_xpos<=cterm->width) {
-						gotoxy(cterm->save_xpos,cterm->save_ypos);
+						cterm->gotoxy(cterm->save_xpos,cterm->save_ypos);
 					}
 					break;
 				case 'y':	/* ToDo?  VT100 Tests */
@@ -1181,18 +1184,15 @@ struct cterminal *cterm_init(int height, int width, int xpos, int ypos, int back
 	char *in;
 	char	*out;
 	int		i;
-	struct text_info ti;
 	struct cterminal *cterm;
 
 	if((cterm=malloc(sizeof(struct cterminal)))==NULL)
 		return cterm;
-	memset(cterm, 0, sizeof(cterm));
+	memset(cterm, 0, sizeof(struct cterminal));
 	cterm->x=xpos;
 	cterm->y=ypos;
 	cterm->height=height;
 	cterm->width=width;
-	gettextinfo(&ti);
-	cterm->attr=ti.normattr;
 	cterm->save_xpos=0;
 	cterm->save_ypos=0;
 	cterm->escbuf[0]=0;
@@ -1213,12 +1213,6 @@ struct cterminal *cterm_init(int height, int width, int xpos, int ypos, int back
 	cterm->cursor=_NORMALCURSOR;
 	if(cterm->scrollback!=NULL)
 		memset(cterm->scrollback,0,cterm->width*2*cterm->backlines);
-	textattr(cterm->attr);
-	_setcursortype(cterm->cursor);
-	if(ti.winleft != cterm->x || ti.wintop != cterm->y || ti.winright != cterm->x+cterm->width-1 || ti.winleft != cterm->y+cterm->height-1)
-		window(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1);
-	cterm_clearscreen(cterm, cterm->attr);
-	gotoxy(1,1);
 	strcpy(cterm->DA,"\x1b[=67;84;101;114;109;");
 	out=strchr(cterm->DA, 0);
 	if(out != NULL) {
@@ -1231,16 +1225,6 @@ struct cterminal *cterm_init(int height, int width, int xpos, int ypos, int back
 		*out=0;
 	}
 	strcat(cterm->DA,"c");
-	/* Did someone call _init() without calling _end()? */
-	if(cterm->playnote_thread_running) {
-		if(sem_trywait(&cterm->playnote_thread_terminated)==-1) {
-			listSemPost(&cterm->notes);
-			sem_wait(&cterm->playnote_thread_terminated);
-		}
-		sem_destroy(&cterm->playnote_thread_terminated);
-		sem_destroy(&cterm->note_completed_sem);
-		listFree(&cterm->notes);
-	}
 	/* Fire up note playing thread */
 	if(!cterm->playnote_thread_running) {
 		listInit(&cterm->notes, LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX);
@@ -1254,9 +1238,50 @@ struct cterminal *cterm_init(int height, int width, int xpos, int ypos, int back
 		for(i=0; i<(sizeof(cterm_tabs)/sizeof(cterm_tabs[0])); i++)
 			cterm->escbuf[cterm_tabs[i]]=1;
 	}
+
+#ifndef CTERM_WITHOUT_CONIO
+	cterm->ciolib_gotoxy=ciolib_gotoxy;
+	cterm->ciolib_wherex=ciolib_wherex;
+	cterm->ciolib_wherey=ciolib_wherey;
+	cterm->ciolib_gettext=ciolib_gettext;
+	cterm->ciolib_gettextinfo=ciolib_gettextinfo;
+	cterm->ciolib_textattr=ciolib_textattr;
+	cterm->ciolib_setcursortype=ciolib_setcursortype;
+	cterm->ciolib_movetext=ciolib_movetext;
+	cterm->ciolib_clreol=ciolib_clreol;
+	cterm->ciolib_clrscr=ciolib_clrscr;
+	cterm->ciolib_setvideoflags=ciolib_setvideoflags;
+	cterm->ciolib_getvideoflags=ciolib_getvideoflags;
+	cterm->ciolib_putch=ciolib_putch;
+	cterm->ciolib_puttext=ciolib_puttext;
+	cterm->ciolib_window=ciolib_window;
+	cterm->ciolib_cputs=ciolib_cputs;
+	cterm->ciolib_setfont=ciolib_setfont;
+	cterm->_wscroll=&_wscroll;
+	cterm->puttext_can_move=&puttext_can_move;
+	cterm->hold_update=&hold_update;
+#endif
+
 	return cterm;
 }
 
+void cterm_start(struct cterminal *cterm)
+{
+	struct text_info ti;
+
+	if(!cterm->started) {
+		cterm->gettextinfo(&ti);
+		cterm->attr=ti.normattr;
+		cterm->textattr(cterm->attr);
+		cterm->_setcursortype(cterm->cursor);
+		cterm->started=1;
+		if(ti.winleft != cterm->x || ti.wintop != cterm->y || ti.winright != cterm->x+cterm->width-1 || ti.winleft != cterm->y+cterm->height-1)
+			cterm->window(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1);
+		cterm_clearscreen(cterm, cterm->attr);
+		cterm->gotoxy(1,1);
+	}
+}
+
 static void ctputs(struct cterminal *cterm, char *buf)
 {
 	char *outp;
@@ -1267,10 +1292,10 @@ static void ctputs(struct cterminal *cterm, char *buf)
 	int		i;
 
 	outp=buf;
-	oldscroll=_wscroll;
-	_wscroll=0;
-	cx=wherex();
-	cy=wherey();
+	oldscroll=*cterm->_wscroll;
+	*cterm->_wscroll=0;
+	cx=cterm->wherex();
+	cy=cterm->wherey();
 	if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL)
 		fputs(buf, cterm->logfile);
 	for(p=buf;*p;p++) {
@@ -1280,27 +1305,27 @@ static void ctputs(struct cterminal *cterm, char *buf)
 				break;
 			case '\n':
 				*p=0;
-				cputs(outp);
+				cterm->cputs(outp);
 				outp=p+1;
 				if(cy==cterm->height)
 					scrollup(cterm);
 				else
 					cy++;
-				gotoxy(cx,cy);
+				cterm->gotoxy(cx,cy);
 				break;
 			case '\b':
 				*p=0;
-				cputs(outp);
+				cterm->cputs(outp);
 				outp=p+1;
 				if(cx>1)
 					cx--;
-				gotoxy(cx,cy);
+				cterm->gotoxy(cx,cy);
 				break;
 			case 7:		/* Bell */
 				break;
 			case '\t':
 				*p=0;
-				cputs(outp);
+				cterm->cputs(outp);
 				outp=p+1;
 				for(i=0;i<sizeof(cterm_tabs)/sizeof(cterm_tabs[0]);i++) {
 					if(cterm_tabs[i]>cx) {
@@ -1315,7 +1340,7 @@ static void ctputs(struct cterminal *cterm, char *buf)
 					else
 						cy++;
 				}
-				gotoxy(cx,cy);
+				cterm->gotoxy(cx,cy);
 				break;
 			default:
 				if(cy==cterm->height
@@ -1323,12 +1348,12 @@ static void ctputs(struct cterminal *cterm, char *buf)
 					char ch;
 					ch=*(p+1);
 					*(p+1)=0;
-					cputs(outp);
+					cterm->cputs(outp);
 					*(p+1)=ch;
 					outp=p+1;
 					scrollup(cterm);
 					cx=1;
-					gotoxy(cx,cy);
+					cterm->gotoxy(cx,cy);
 				}
 				else {
 					if(cx==cterm->width) {
@@ -1342,8 +1367,8 @@ static void ctputs(struct cterminal *cterm, char *buf)
 				break;
 		}
 	}
-	cputs(outp);
-	_wscroll=oldscroll;
+	cterm->cputs(outp);
+	*cterm->_wscroll=oldscroll;
 }
 
 char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen, char *retbuf, size_t retsize, int *speed)
@@ -1355,18 +1380,21 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 	int	olddmc;
 	int oldptnm;
 
-	oldptnm=puttext_can_move;
-	puttext_can_move=1;
-	olddmc=hold_update;
-	hold_update=1;
+	if(!cterm->started)
+		cterm_start(cterm);
+
+	oldptnm=*cterm->puttext_can_move;
+	*cterm->puttext_can_move=1;
+	olddmc=*cterm->hold_update;
+	*cterm->hold_update=1;
 	if(retbuf!=NULL)
 		retbuf[0]=0;
-	gettextinfo(&ti);
+	cterm->gettextinfo(&ti);
 	if(ti.winleft != cterm->x || ti.wintop != cterm->y || ti.winright != cterm->x+cterm->width-1 || ti.winbottom != cterm->y+cterm->height-1)
-		window(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1);
-	gotoxy(cterm->xpos,cterm->ypos);
-	textattr(cterm->attr);
-	_setcursortype(cterm->cursor);
+		cterm->window(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1);
+	cterm->gotoxy(cterm->xpos,cterm->ypos);
+	cterm->textattr(cterm->attr);
+	cterm->_setcursortype(cterm->cursor);
 	ch[1]=0;
 	if(buflen==-1)
 		buflen=strlen(buf);
@@ -1386,6 +1414,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 				if(cterm->font_size) {
 					cterm->fontbuf[cterm->font_read++]=ch[0];
 					if(cterm->font_read == cterm->font_size) {
+						// TODO: Need to make this bit optional...
 						char *buf;
 
 						if((buf=(char *)malloc(cterm->font_size))!=NULL) {
@@ -1519,12 +1548,12 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 				}
 				else if (cterm->music) {
 					if(ch[0]==14) {
-						hold_update=0;
-						puttext_can_move=0;
-						gotoxy(wherex(),wherey());
-						_setcursortype(cterm->cursor);
-						hold_update=1;
-						puttext_can_move=1;
+						*cterm->hold_update=0;
+						*cterm->puttext_can_move=0;
+						cterm->gotoxy(cterm->wherex(),cterm->wherey());
+						cterm->_setcursortype(cterm->cursor);
+						*cterm->hold_update=1;
+						*cterm->puttext_can_move=1;
 						play_music(cterm);
 					}
 					else {
@@ -1545,36 +1574,36 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 									cterm->attr=1;
 									break;
 								case 28:	/* Up (TODO: Wraps??) */
-									l=wherey()-1;
+									l=cterm->wherey()-1;
 									if(l<1)
 										l=cterm->height;
-									gotoxy(wherex(),l);
+									cterm->gotoxy(cterm->wherex(),l);
 									break;
 								case 29:	/* Down (TODO: Wraps??) */
-									l=wherey()+1;
+									l=cterm->wherey()+1;
 									if(l>cterm->height)
 										l=1;
-									gotoxy(wherex(),l);
+									cterm->gotoxy(cterm->wherex(),l);
 									break;
 								case 30:	/* Left (TODO: Wraps around to same line?) */
-									l=wherex()-1;
+									l=cterm->wherex()-1;
 									if(l<1)
 										l=cterm->width;
-									gotoxy(l,wherey());
+									cterm->gotoxy(l,cterm->wherey());
 									break;
 								case 31:	/* Right (TODO: Wraps around to same line?) */
-									l=wherex()+1;
+									l=cterm->wherex()+1;
 									if(l>cterm->width)
 										l=1;
-									gotoxy(l,wherey());
+									cterm->gotoxy(l,cterm->wherey());
 									break;
 								case 125:	/* Clear Screen */
 									cterm_clearscreen(cterm, cterm->attr);
 									break;
 								case 126:	/* Backspace (TODO: Wraps around to previous line?) */
 											/* DOES NOT delete char, merely erases */
-									k=wherey();
-									l=wherex()-1;
+									k=cterm->wherey();
+									l=cterm->wherex()-1;
 
 									if(l<1) {
 										k--;
@@ -1582,13 +1611,13 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 											break;
 										l=cterm->width;
 									}
-									gotoxy(l,k);
-									putch(0);
-									gotoxy(l,k);
+									cterm->gotoxy(l,k);
+									cterm->putch(0);
+									cterm->gotoxy(l,k);
 									break;
 								/* We abuse the ESC buffer for tab stops */
 								case 127:	/* Tab (Wraps around to next line) */
-									l=wherex();
+									l=cterm->wherex();
 									for(k=l+1; k<=cterm->width; k++) {
 										if(cterm->escbuf[k]) {
 											l=k;
@@ -1597,73 +1626,73 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 									}
 									if(k>cterm->width) {
 										l=1;
-										k=wherey()+1;
+										k=cterm->wherey()+1;
 										if(k>cterm->height) {
 											scrollup(cterm);
 											k=cterm->height;
 										}
-										gotoxy(l,k);
+										cterm->gotoxy(l,k);
 									}
 									else
-										gotoxy(l,wherey());
+										cterm->gotoxy(l,cterm->wherey());
 									break;
 								case 155:	/* Return */
-									k=wherey();
+									k=cterm->wherey();
 									if(k==cterm->height)
 										scrollup(cterm);
 									else
 										k++;
-									gotoxy(1,k);
+									cterm->gotoxy(1,k);
 									break;
 								case 156:	/* Delete Line */
 									dellines(cterm, 1);
-									gotoxy(1,wherey());
+									cterm->gotoxy(1,cterm->wherey());
 									break;
 								case 157:	/* Insert Line */
-									l=wherex();
-									k=wherey();
+									l=cterm->wherex();
+									k=cterm->wherey();
 									if(k<cterm->height)
-										movetext(cterm->x,cterm->y+k-1
+										cterm->movetext(cterm->x,cterm->y+k-1
 												,cterm->x+cterm->width-1,cterm->y+cterm->height-2
 												,cterm->x,cterm->y+k);
-									gotoxy(1,k);
-									clreol();
+									cterm->gotoxy(1,k);
+									cterm->clreol();
 									break;
 								case 158:	/* Clear Tab */
-									cterm->escbuf[wherex()]=0;
+									cterm->escbuf[cterm->wherex()]=0;
 									break;
 								case 159:	/* Set Tab */
-									cterm->escbuf[wherex()]=1;
+									cterm->escbuf[cterm->wherex()]=1;
 									break;
 								case 253:	/* Beep */
 									if(!cterm->quiet) {
 										#ifdef __unix__
-											putch(7);
+											cterm->putch(7);
 										#else
 											MessageBeep(MB_OK);
 										#endif
 									}
 									break;
 								case 254:	/* Delete Char */
-									l=wherex();
-									k=wherey();
+									l=cterm->wherex();
+									k=cterm->wherey();
 									if(l<cterm->width)
-										movetext(cterm->x+l,cterm->y+k-1
+										cterm->movetext(cterm->x+l,cterm->y+k-1
 												,cterm->x+cterm->width-1,cterm->y+k-1
 												,cterm->x+l-1,cterm->y+k-1);
-									gotoxy(cterm->width,k);
-									clreol();
-									gotoxy(l,k);
+									cterm->gotoxy(cterm->width,k);
+									cterm->clreol();
+									cterm->gotoxy(l,k);
 									break;
 								case 255:	/* Insert Char */
-									l=wherex();
-									k=wherey();
+									l=cterm->wherex();
+									k=cterm->wherey();
 									if(l<cterm->width)
-										movetext(cterm->x+l-1,cterm->y+k-1
+										cterm->movetext(cterm->x+l-1,cterm->y+k-1
 												,cterm->x+cterm->width-2,cterm->y+k-1
 												,cterm->x+l,cterm->y+k-1);
-									putch(0);
-									gotoxy(l,k);
+									cterm->putch(0);
+									cterm->gotoxy(l,k);
 									break;
 								default:
 									/* Translate to screen codes */
@@ -1688,30 +1717,30 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 									}
 									ch[0] = k;
 									ch[1] = cterm->attr;
-									puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,ch);
+									cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch);
 									ch[1]=0;
-									if(wherex()==cterm->width) {
-										if(wherey()==cterm->height) {
+									if(cterm->wherex()==cterm->width) {
+										if(cterm->wherey()==cterm->height) {
 											scrollup(cterm);
-											gotoxy(1,wherey());
+											cterm->gotoxy(1,cterm->wherey());
 										}
 										else
-											gotoxy(1,wherey()+1);
+											cterm->gotoxy(1,cterm->wherey()+1);
 									}
 									else
-										gotoxy(wherex()+1,wherey());
+										cterm->gotoxy(cterm->wherex()+1,cterm->wherey());
 									break;
 							}
 						}
 						else {
 							switch(buf[j]) {
 								case 155:	/* Return */
-									k=wherey();
+									k=cterm->wherey();
 									if(k==cterm->height)
 										scrollup(cterm);
 									else
 										k++;
-									gotoxy(1,k);
+									cterm->gotoxy(1,k);
 									break;
 								default:
 									/* Translate to screen codes */
@@ -1736,18 +1765,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 									}
 									ch[0] = k;
 									ch[1] = cterm->attr;
-									puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,ch);
+									cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch);
 									ch[1]=0;
-									if(wherex()==cterm->width) {
-										if(wherey()==cterm->height) {
+									if(cterm->wherex()==cterm->width) {
+										if(cterm->wherey()==cterm->height) {
 											scrollup(cterm);
-											gotoxy(1,cterm->height);
+											cterm->gotoxy(1,cterm->height);
 										}
 										else
-											gotoxy(1,wherey()+1);
+											cterm->gotoxy(1,cterm->wherey()+1);
 									}
 									else
-										gotoxy(wherex()+1,wherey());
+										cterm->gotoxy(cterm->wherex()+1,cterm->wherey());
 									break;
 							}
 							cterm->attr=7;
@@ -1822,94 +1851,94 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 										cterm->attr |= 3;
 										break;
 								}
-								textattr(cterm->attr);
+								cterm->textattr(cterm->attr);
 								break;
 
 							/* Movement */
 							case 13:	/* "\r\n" and disabled reverse. */
 							case 141:
-								gotoxy(1, wherey());
+								cterm->gotoxy(1, cterm->wherey());
 								/* Fall-through */
 							case 17:
-								if(wherey()==cterm->height)
+								if(cterm->wherey()==cterm->height)
 									scrollup(cterm);
 								else
-									gotoxy(wherex(), wherey()+1);
+									cterm->gotoxy(cterm->wherex(), cterm->wherey()+1);
 								break;
 							case 147:
 								cterm_clearscreen(cterm, cterm->attr);
 								/* Fall through */
 							case 19:
-								gotoxy(1,1);
+								cterm->gotoxy(1,1);
 								break;
 							case 20:	/* Delete (Wrapping backspace) */
-								k=wherey();
-								l=wherex();
+								k=cterm->wherey();
+								l=cterm->wherex();
 
 								if(l==1) {
 									if(k==1)
 										break;
-									gotoxy((l=cterm->width), k-1);
+									cterm->gotoxy((l=cterm->width), k-1);
 								}
 								else
-									gotoxy(--l, k);
+									cterm->gotoxy(--l, k);
 								if(l<cterm->width)
-									movetext(cterm->x+l,cterm->y+k-1
+									cterm->movetext(cterm->x+l,cterm->y+k-1
 											,cterm->x+cterm->width-1,cterm->y+k-1
 											,cterm->x+l-1,cterm->y+k-1);
-								gotoxy(cterm->width,k);
-								clreol();
-								gotoxy(l,k);
+								cterm->gotoxy(cterm->width,k);
+								cterm->clreol();
+								cterm->gotoxy(l,k);
 								break;
 							case 157:	/* Cursor Left (wraps) */
-								if(wherex()==1) {
-									if(wherey() > 1)
-										gotoxy(cterm->width, wherey()-1);
+								if(cterm->wherex()==1) {
+									if(cterm->wherey() > 1)
+										cterm->gotoxy(cterm->width, cterm->wherey()-1);
 								}
 								else
-									gotoxy(wherex()-1, wherey());
+									cterm->gotoxy(cterm->wherex()-1, cterm->wherey());
 								break;
 							case 29:	/* Cursor Right (wraps) */
-								if(wherex()==cterm->width) {
-									if(wherey()==cterm->height) {
+								if(cterm->wherex()==cterm->width) {
+									if(cterm->wherey()==cterm->height) {
 										scrollup(cterm);
-										gotoxy(1,wherey());
+										cterm->gotoxy(1,cterm->wherey());
 									}
 									else
-										gotoxy(1,wherey()+1);
+										cterm->gotoxy(1,cterm->wherey()+1);
 								}
 								else
-									gotoxy(wherex()+1,wherey());
+									cterm->gotoxy(cterm->wherex()+1,cterm->wherey());
 								break;
 							case 145:	/* Cursor Up (No scroll */
-								if(wherey()>1)
-									gotoxy(wherex(),wherey()-1);
+								if(cterm->wherey()>1)
+									cterm->gotoxy(cterm->wherex(),cterm->wherey()-1);
 								break;
 							case 148:	/* Insert TODO verify last column */
 										/* CGTerm does nothing there... we */
 										/* Erase under cursor. */
-								l=wherex();
-								k=wherey();
+								l=cterm->wherex();
+								k=cterm->wherey();
 								if(l<=cterm->width)
-									movetext(cterm->x+l-1,cterm->y+k-1
+									cterm->movetext(cterm->x+l-1,cterm->y+k-1
 											,cterm->x+cterm->width-2,cterm->y+k-1
 											,cterm->x+l,cterm->y+k-1);
-								putch(' ');
-								gotoxy(l,k);
+								cterm->putch(' ');
+								cterm->gotoxy(l,k);
 								break;
 
 							/* Font change... whee! */
 							case 14:	/* Lower case font */
 								if(ti.currmode == C64_40X25)
-									setfont(33,FALSE,1);
+									cterm->setfont(33,FALSE,1);
 								else	/* Assume C128 */
-									setfont(35,FALSE,1);
+									cterm->setfont(35,FALSE,1);
 								break;
 							case 142:	/* Upper case font */
 								if(ti.currmode == C64_40X25)
-									setfont(32,FALSE,1);
+									cterm->setfont(32,FALSE,1);
 								else	/* Assume C128 */
-									setfont(34,FALSE,1);
+									cterm->setfont(34,FALSE,1);
 								break;
 							case 18:	/* Reverse mode on */
 								cterm->c64reversemode = 1;
@@ -1922,7 +1951,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 							case 7:			/* Beep */
 								if(!cterm->quiet) {
 									#ifdef __unix__
-										putch(7);
+										cterm->putch(7);
 									#else
 										MessageBeep(MB_OK);
 									#endif
@@ -1963,18 +1992,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 									k+=128;
 								ch[0] = k;
 								ch[1] = cterm->attr;
-								puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,ch);
+								cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch);
 								ch[1]=0;
-								if(wherex()==cterm->width) {
-									if(wherey()==cterm->height) {
+								if(cterm->wherex()==cterm->width) {
+									if(cterm->wherey()==cterm->height) {
 										scrollup(cterm);
-										gotoxy(1,wherey());
+										cterm->gotoxy(1,cterm->wherey());
 									}
 									else
-										gotoxy(1,wherey()+1);
+										cterm->gotoxy(1,cterm->wherey()+1);
 								}
 								else
-									gotoxy(wherex()+1,wherey());
+									cterm->gotoxy(cterm->wherex()+1,cterm->wherey());
 								break;
 						}
 					}
@@ -1982,18 +2011,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 						if(cterm->doorway_char) {
 							ctputs(cterm, prn);
 							ch[1]=cterm->attr;
-							puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,ch);
+							cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch);
 							ch[1]=0;
-							if(wherex()==cterm->width) {
-								if(wherey()==cterm->height) {
+							if(cterm->wherex()==cterm->width) {
+								if(cterm->wherey()==cterm->height) {
 									scrollup(cterm);
-									gotoxy(1,wherey());
+									cterm->gotoxy(1,cterm->wherey());
 								}
 								else
-									gotoxy(1,wherey()+1);
+									cterm->gotoxy(1,cterm->wherey()+1);
 							}
 							else
-								gotoxy(wherex()+1,wherey());
+								cterm->gotoxy(cterm->wherex()+1,cterm->wherey());
 							cterm->doorway_char=0;
 						}
 						else {
@@ -2009,7 +2038,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 										fputs("\x07", cterm->logfile);
 									if(!cterm->quiet) {
 										#ifdef __unix__
-											putch(7);
+											cterm->putch(7);
 										#else
 											MessageBeep(MB_OK);
 										#endif
@@ -2021,7 +2050,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 									if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL)
 										fputs("\x0c", cterm->logfile);
 									cterm_clearscreen(cterm, (char)cterm->attr);
-									gotoxy(1,1);
+									cterm->gotoxy(1,1);
 									break;
 								case 27:		/* ESC */
 									ctputs(cterm, prn);
@@ -2039,24 +2068,27 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen
 			prn[0]=0;
 			break;
 	}
-	cterm->xpos=wherex();
-	cterm->ypos=wherey();
+	cterm->xpos=cterm->wherex();
+	cterm->ypos=cterm->wherey();
 #if 0
 	if(ti.winleft != cterm->x || ti.wintop != cterm->y || ti.winright != cterm->x+cterm->width-1 || ti.winleft != cterm->y+cterm->height-1)
-		window(ti.winleft,ti.wintop,ti.winright,ti.winbottom);
-	gotoxy(ti.curx,ti.cury);
-	textattr(ti.attribute);
+		cterm->window(ti.winleft,ti.wintop,ti.winright,ti.winbottom);
+	cterm->gotoxy(ti.curx,ti.cury);
+	cterm->textattr(ti.attribute);
 #endif
 
-	hold_update=olddmc;
-	puttext_can_move=oldptnm;
-	gotoxy(wherex(),wherey());
-	_setcursortype(cterm->cursor);
+	*cterm->hold_update=olddmc;
+	*cterm->puttext_can_move=oldptnm;
+	cterm->gotoxy(cterm->wherex(),cterm->wherey());
+	cterm->_setcursortype(cterm->cursor);
 	return(retbuf);
 }
 
 int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype)
 {
+	if(!cterm->started)
+		cterm_start(cterm);
+
 	cterm->logfile=fopen(logfile, "a");
 	if(cterm->logfile==NULL)
 		return(0);
@@ -2066,6 +2098,9 @@ int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype)
 
 void cterm_closelog(struct cterminal *cterm)
 {
+	if(!cterm->started)
+		cterm_start(cterm);
+
 	if(cterm->logfile != NULL)
 		fclose(cterm->logfile);
 	cterm->logfile=NULL;
diff --git a/src/conio/cterm.h b/src/conio/cterm.h
index 07a5b432a4ded32e7355f2426ff0bf20dd904568..db19a56c02fc5c36d9c494ede18c533ac89067f9 100644
--- a/src/conio/cterm.h
+++ b/src/conio/cterm.h
@@ -79,6 +79,7 @@ struct cterminal {
 	char				DA[1024];		// Device Attributes
 
 	/* emulation state */
+	int					started;		// Indicates that conio functions are being called
 	int					c64reversemode;	// Commodore 64 reverse mode state
 	unsigned char		attr;			// Current attribute
 	int					save_xpos;		// Saved position (for later restore)
@@ -109,6 +110,28 @@ struct cterminal {
 	int					doorway_mode;
 	int					doorway_char;	// Indicates next char is a "doorway" mode char
 	int					cursor;			// Current cursor mode (Normal or None)
+
+	/* conio function pointers */
+	void	(*ciolib_gotoxy)		(int,int);
+	int		(*ciolib_wherex)		(void);
+	int		(*ciolib_wherey)		(void);
+	int		(*ciolib_gettext)		(int,int,int,int,unsigned char *);
+	void	(*ciolib_gettextinfo)	(struct text_info *);
+	void	(*ciolib_textattr)		(int);
+	void	(*ciolib_setcursortype)(int);
+	int		(*ciolib_movetext)		(int,int,int,int,int,int);
+	void	(*ciolib_clreol)		(void);
+	void	(*ciolib_clrscr)		(void);
+	void	(*ciolib_setvideoflags)(int flags);
+	int		(*ciolib_getvideoflags)(void);
+	int		(*ciolib_putch)		(int);
+	int		(*ciolib_puttext)		(int,int,int,int,unsigned char *);
+	void	(*ciolib_window)		(int,int,int,int);
+	int		(*ciolib_cputs)		(char *);
+	int		(*ciolib_setfont)		(int font, int force, int font_num);
+	int 	*_wscroll;
+	int		*puttext_can_move;
+	int		*hold_update;
 };
 
 #ifdef __cplusplus
@@ -121,6 +144,7 @@ int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype);
 void cterm_closelog(struct cterminal *cterm);
 void cterm_end(struct cterminal *cterm);
 void cterm_clearscreen(struct cterminal *cterm, char attr);
+void cterm_start(struct cterminal *cterm);
 #ifdef __cplusplus
 }
 #endif