diff --git a/src/sbbs3/dosxtrn/dosxtrn.c b/src/sbbs3/dosxtrn/dosxtrn.c
index df162b0ae138f462ea3d710f0819cb5d5f55cdbb..b90e81d669544e63ed3e9982adee069642dd163c 100644
--- a/src/sbbs3/dosxtrn/dosxtrn.c
+++ b/src/sbbs3/dosxtrn/dosxtrn.c
@@ -191,26 +191,26 @@ void vdd_getstatus(vdd_status_t* status)
 
 WORD PortStatus()
 {
-	WORD			status=0x0008;			/* AL bit 3 (change in DCD) always set */
+	WORD			status=FOSSIL_MDM_STATUS_DCD_CHNG; /* AL bit 3 (change in DCD) always set */
 	vdd_status_t	vdd_status;
 
 	vdd_getstatus(&vdd_status);
 
 	if(vdd_status.online)			/* carrier detect */
-		status|=0x0080;				/* DCD */
+		status|=FOSSIL_MDM_STATUS_DCD;
 
 	if(vdd_status.inbuf_full)		/* receive data ready  */
-		status|=0x0100;				/* RDA */
+		status|=FOSSIL_LINE_STATUS_RDA;
 
 /*	if(vm->overrun)					/* overrun error detected */
 /*		status|=0x0200;				/* OVRN */
 
 	if(vdd_status.outbuf_full
 		<vdd_status.outbuf_size/2)	/* room available in output buffer */
-		status|=0x2000;				/* THRE */
+		status|=FOSSIL_LINE_STATUS_THRE;
 
 	if(!vdd_status.outbuf_full)		/* output buffer is empty */
-		status|=0x4000;				/* TSRE */
+		status|=FOSSIL_LINE_STATUS_TSRE;
 
 	return(status);
 }
@@ -256,6 +256,7 @@ void interrupt winNTint14(
 	BYTE			ch;
 	BYTE far*		p;
 	WORD			buf_seg;
+	int				rd;
 	int				wr;
 	vdd_status_t	vdd_status;
     fossil_info_t info = { 
@@ -288,22 +289,23 @@ void interrupt winNTint14(
 		case FOSSIL_FUNC_PUT_CHAR: /* write char to com port, with wait */
 			ch=_ax&0xff;
 			_asm mov buf_seg, ss;
-			vdd_buf(VDD_WRITE, 1, buf_seg, (WORD)&ch);
+			wr = vdd_buf(VDD_WRITE, 1, buf_seg, (WORD)&ch);
 			_ax = PortStatus();
+			if(wr != 1)
+				_ax |= FOSSIL_LINE_STATUS_TIMEOUT;
 			break;
 		case FOSSIL_FUNC_GET_CHAR: /* read char from com port, with wait */
 			_asm mov buf_seg, ss;
-			_ax = vdd_buf(VDD_READ, 1, buf_seg, (WORD)&ch);
-			if(!_ax) {
-				_ax = 0x8000;	/* timed-out */
+			rd = vdd_buf(VDD_READ, 1, buf_seg, (WORD)&ch);
+			_ax = ch;
+			if(rd != 1) {
 				vdd_op(VDD_YIELD);
-			} else {
-				_ax = ch;
+				_ax = FOSSIL_LINE_STATUS_TIMEOUT;
 			}
 			break;
 		case FOSSIL_FUNC_GET_STATUS:	/* request status */
 			_ax=PortStatus();
-			if(_ax==0x6088)
+			if(_ax == FOSSIL_MDM_STATUS_DCD_CHNG | FOSSIL_MDM_STATUS_DCD | FOSSIL_LINE_STATUS_THRE | FOSSIL_LINE_STATUS_TSRE)
 				vdd_op(VDD_MAYBE_YIELD);
 			break;
 		case FOSSIL_FUNC_INIT:	/* initialize */
@@ -323,32 +325,23 @@ void interrupt winNTint14(
 			vdd_op(VDD_INBUF_PURGE);
 			break;
 		case FOSSIL_FUNC_WRITE_CHAR:	/* write char to com port, no wait */
-        	if(0 /*RingBufFree(&vm->out)<2 */) {
-            	_ax=0; /* char was not accepted */
-                break;
-            }
 			ch=_ax&0xff;
 			_asm mov buf_seg, ss;
 			_ax = vdd_buf(VDD_WRITE, 1, buf_seg, (WORD)&ch);
+			if(_ax != 1)
+				vdd_op(VDD_YIELD);
 			break;
         case FOSSIL_FUNC_PEEK:	/* non-destructive read-ahead */
-			vdd_getstatus(&vdd_status);
-			if(!vdd_status.inbuf_full) {
-				_ax=0xffff;	/* no char available */
-				vdd_op(VDD_YIELD);
-				break;
-			}
 			_asm mov buf_seg, ss;
-			_ax = vdd_buf(VDD_PEEK, 1, buf_seg, (WORD)&ch);
-			if(_ax == 0)
+			rd = vdd_buf(VDD_PEEK, 1, buf_seg, (WORD)&ch);
+			_ax = ch;
+			if(rd == 0) {
 				vdd_op(VDD_YIELD);
+				_ax = FOSSIL_CHAR_NOT_AVAILABLE;
+			}
 			break;
         case FOSSIL_FUNC_READ_BLOCK:	/* read block, no wait */
-			vdd_getstatus(&vdd_status);
-			if(!vdd_status.inbuf_full)
-				_ax = 0; /* no data available */
-			else
-				_ax = vdd_buf(VDD_READ, _cx, _es, _di);
+			_ax = vdd_buf(VDD_READ, _cx, _es, _di);
 			if(_ax == 0)
 				vdd_op(VDD_YIELD);
 			break;
@@ -374,7 +367,7 @@ void interrupt winNTint14(
         	_ax=wr;
             break;
 		case FOSSIL_FUNC_GET_KB:
-			_ax=0xffff;
+			_ax = FOSSIL_CHAR_NOT_AVAILABLE;
 			break;
 	}
 }
@@ -625,7 +618,7 @@ int main(int argc, char **argv)
 
 		vdd_str(VDD_LOAD_INI_SECTION, getfname(arg[0]));
 
-		sprintf(str,"%s, rev %u, %s %s mode=%u", __FILE__, DOSXTRN_REVISION, __DATE__, __TIME__, mode);
+		sprintf(str,"%s, rev %u %s/%s, %s %s mode=%u", __FILE__, DOSXTRN_REVISION, GIT_BRANCH, GIT_HASH, __DATE__, __TIME__, mode);
 		vdd_str(VDD_DEBUG_OUTPUT, str);
 
 		i=vdd_op(VDD_OPEN);
@@ -685,7 +678,7 @@ int main(int argc, char **argv)
 #ifdef DEBUG_DOS_CALLS
 		for(i=0;i<0x100;i++) {
 			if(dos_calls[i]>100) {
-				sprintf(str,"int21h function %02X calls: %u\n"
+				sprintf(str,"int21h function %02X calls: %u"
 					,i, dos_calls[i]);
 				vdd_str(VDD_DEBUG_OUTPUT, str);
 			}
diff --git a/src/sbbs3/fossdefs.h b/src/sbbs3/fossdefs.h
index 999cbdb349c122c2e208a7e1a3e44ec8200738f0..365ce4e1bdfc20ba490ea71d82a775c567bbb734 100644
--- a/src/sbbs3/fossdefs.h
+++ b/src/sbbs3/fossdefs.h
@@ -1,9 +1,5 @@
-/* fossdefs.h */
-
 /* FOSSIL (FSC-15) structure and constant definitions */
 
-/* $Id: fossdefs.h,v 1.3 2018/07/24 01:11:07 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -122,6 +118,23 @@ unsigned fossil_stop_bits[] = { 1, 2 };
 
 unsigned fossil_data_bits[] = { 5, 6, 7, 8 };
 
+#define FOSSIL_MDM_STATUS_CTS_CHNG	(1<<0)	// Delta clear to send (not reliable)
+#define FOSSIL_MDM_STATUS_DSR_CHNG	(1<<1)	// Delta data set ready (not reliable)
+#define FOSSIL_MDM_STATUS_RI_CHNG	(1<<2)	// trailing edge of ring indicator (documented wrong in X00REF.DOC)
+#define FOSSIL_MDM_STATUS_DCD_CHNG	(1<<3)	// Delta data carrier detect 
+#define FOSSIL_MDM_STATUS_CTS		(1<<4)	// Clear to send
+#define FOSSIL_MDM_STATUS_DSR		(1<<5)	// Data set ready
+#define FOSSIL_MDM_STATUS_RI		(1<<6)	// Ring indicator
+#define FOSSIL_MDM_STATUS_DCD		(1<<7)	// Data carrier detect
+
+#define FOSSIL_LINE_STATUS_RDA		(1<<8)	// input data is available in buffer
+#define FOSSIL_LINE_STATUS_OVRN		(1<<9)	// the input buffer has been overrun
+#define FOSSIL_LINE_STATUS_THRE		(1<<13)	// room is available in output buffer
+#define FOSSIL_LINE_STATUS_TSRE		(1<<14)	// output buffer is empty
+#define FOSSIL_LINE_STATUS_TIMEOUT	(1<<15)	// Timeout (set by functions 1 and 2 only)
+
+#define FOSSIL_CHAR_NOT_AVAILABLE	0xffff
+
 #if defined(__GNUC__)
 	#define PACKED_STRUCT __attribute__((packed))
 #else	/* non-GCC compiler */