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