; ; TERM.A86 ; ;Terminal routines with text file I/O for MODEM9.xx. ; DSKSAVE: CALL CKMODM MOV AL,BYTE PTR .FCB+1 ;FIRST CHAR OF FILENAME CMP AL,' ' ;FILE SPEC'D JNZ GOODNM ;YES, GOOD NAME MOV NFILFLG,TRUE MOV SAVEFLG,FALSE JMP TERM ; GOODNM: CALL ERASFIL CALL MOVE2 MOV DX,OFFSET FCB3 MOV CL,MAKE INT 224 MOV DX,OFFSET FCB3 MOV CL,OPEN INT 224 MOV BX,OFFSET BOTTRAM MOV HLSAVE,BX MOV NFILFLG,0 MOV LISTMOR,0 ;STOP ANY BUFFERED PRINTER OUTPUT TERM: TEST LISTMOR,0FFH ;ANY BUFFERED PRINTER OUTPUT? JZ TERM1 CALL GOLIST ;GO IF SO TERM1: CALL STAT ;KEYPRESS? JNZ TERM2 JMP TERML ;NO, CHECK LINE TERM2: CALL KEYIN ;GET CHAR FROM KBD CMP AL,' ' JC TERM3 JMP NOTOG ;GO IF NOT CONTROL CHARACTER TERM3: MOV CH,AL ;SAVE CMP AL,BKSP ;TEST FOR BACKSPACE JNZ NOBKSP TEST CONVBKSP,0FFH ;CONVERT BACKSPACE TO RUB? JZ NOBKSP ;GO IF NO CONVERSION MOV AL,RUB JMP NOTOG NOBKSP: TEST EXACFLG,0FFH ; EXACT ? MOV EXACFLG,0 ;CLR FOR NEXT TIME JZ NOTEXAFLG ;GO OF EXAFLG FALSE TEST LOCONEXTCHR,0FFH ;SHOULD WE SEND ON EXAFLG? MOV AL,CH JNZ NOBKSP1 JMP NOTOG ;YES, IF LOCONEXTCHR FALSE NOBKSP1: MOV AL,EXTCHR ;WE WANT TO SEND EXTCHR IN ANY CASE CMP AL,CH MOV AL,CH JNZ NOBKSP2 JMP NOTOG ;SEND IF EXTCHR NOBKSP2: JMP LOCCHK ;OTHERWISE DO LOCAL STUFF NOTEXAFLG: MOV AL,EXTCHR ;TREAT NEXT CHARACTER IN SPECIAL WAY? CMP AL,CH JNZ NOTEXA1 JMP EXTFLG ;YES, SET EXAFLG FOR NEXT CHAR NOTEXA1: MOV AL,LOCONEXTCHR OR AL,AL ;SHOULD WE SEND IF NOT EXAFLG MOV AL,CH JZ LOCCHK JMP NOTOG ;YES, IF LOCONEXTCHR TRUE LOCCHK: MOV AL,EXITCHR ;RETURN TO MENU? CMP AL,CH JNZ LOCCHK1 JMP EXITMEN ;YES, RETURN TO MENU LOCCHK1: MOV AL,TRANCHR ;OUTPUT TEXT FILE TO REMOTE? CMP AL,CH JNZ LOCCHK2 CALL TRANSFER ;SEND-A-FILE (BLIND SEND) LOCCHK2: JNZ LOCCHK3 JMP TERM ;LOOP LOCCHK3: MOV AL,TRANLOGON OR AL,AL JZ SKPLOGON MOV AL,LOGCHR ;SEND LOGON? CMP AL,CH JNZ SKPLOGON JMP SENDLOG SKPLOGON: MOV AL,LSTTST OR AL,AL JZ NOLST MOV AL,LSTCHR CMP AL,CH JNZ NOLST MOV AL,LISTFLG NOT AL MOV LISTFLG,AL CALL CRLF CALL CRLF CALL LSTMSG CALL CRLF JMP TERML NOLST: MOV AL,UNSAVECHR ;CLOSE INPUT BUFFER? CMP AL,CH JZ S2A ;IF YES, DISABLE COPY MOV AL,SAVECHR ;OPEN INPUT BUFFER? CMP AL,CH MOV AL,CH ;RESTORE CHARACTER TYPED JZ NOLST1 JMP NOTOG NOLST1: MOV AL,NFILFLG ;DO NOT ALLOW SAVE IF.. CMP AL,TRUE ;..THIS FLAG IS SET. JNZ NOLST1A JMP TERML NOLST1A: MOV AL,TRUE ;0FFH -- ALLOW COPY INTO FILE JMP S2B S2A: MOV AL,FALSE ;0 -- STOP COPY INTO FILE S2B: MOV SAVEFLG,AL CALL BUFMSG JMP TERML ; BUFMSG: CALL ILPRT DB CR,LF,LF,'** Memory buffer ',0 TEST SAVEFLG,0FFH JZ BUFMSG2 CALL ILPRT DB 'open **',CR,LF,LF,':',BELL,0 RET ; BUFMSG2: CALL ILPRT DB 'closed **',CR,LF,LF,BELL,0 RET ; EXITMEN: CALL CRLF CALL CLREOS ;CLEAR TO END OF SCREEN TO CLEAN UP ANY MESS JMP MENU0 ; SENDREADY: CALL INMODCTLP CALL ANIMODSNDB CALL CPIMODSNDR RET ; SENDLF: CALL SENDREADY JNZ NOLFYET ;GO IF NOT READY FOR OUTPUT YET MOV AL,LF JMP NOTOG ;SEND LF NOLFYET: CALL EXITTEST JNC EXITMEN ;GO IF SO, SO DON'T GET HUNG UP JMP SENDLF ;ELSE KEEP TRYING TO SEND LF ; SENDLOG: PUSH BX SNDLG2: CALL STAT JZ SNDLG2 CALL KEYIN CALL UCASE CMP AL,'L' ;TEST IF LIST OF STRINGS REQUESTED JZ GIVESTRS SUB AL,'0' CMP AL,10 JNC ENDLOG ADD AL,AL ;X2 ADD AL,AL ;X4 ADD AL,AL ;X8 ADD AL,AL ;X16 MOV DL,AL MOV DH,0 PUSH DX POP BX ADD BX,DX ;X32 IN HL MOV DX,OFFSET STRINGS ;DE POINTS TO START OF STRINGS ADD BX,DX LOGLP: CALL SENDREADY JNZ NOSENDLOG ;GO IF NOT READY MOV AL,BYTE PTR [BX] ;GET LOGON BYTE INC BX CMP AL,0 ;IS IT THE END? JZ ENDLOG ;GO IF SO CALL OUTMODDATP JMP LOGLP NOSENDLOG: CALL EXITTEST ;TEST SO DON'T GET HUNG UP JNC EXITLOG ;GO IF OPERATOR WANTS EXIT JMP LOGLP ; ENDLOG: POP BX JMP TERML ; EXITLOG: POP BX JMP EXITMEN ; EXITTEST: CALL STAT ;KEYPRESS? JZ NOKEY CALL KEYIN MOV CH,AL MOV AL,EXITCHR ;SEE IF OPERATOR WANTS EXIT CMP AL,CH JNZ NOKEY ;GO IF WRONG KEY STC CMC ;RESET FOR EXIT RET NOKEY: STC ;SET FOR NO KEY OR WRONG KEY RET ; GIVESTRS: CALL ILPRT DB CR,LF,' List of Strings',CR,LF,LF,LF,0 MOV BX,OFFSET STRINGS MOV STRSAVE,BX MOV CH,'0' GVSTRS1: MOV AL,CH CALL TIPE CALL ILPRT DB ' = ',0 MOV BX,STRSAVE MOV AL,BYTE PTR [BX] CMP AL,0 JNZ NONULL CALL ILPRT DB '* null string *',0 JMP GVSTRS2 NONULL: MOV BX,STRSAVE NONUL2: MOV AL,BYTE PTR [BX] CMP AL,0 JZ GVSTRS2 CMP AL,CR JZ NONUL3 CALL TIPE NONUL3: JNZ NOTACR PUSH BX CALL ILPRT DB '',0 POP BX NOTACR: INC BX JMP NONUL2 ; GVSTRS2: MOV AL,'9' CMP AL,CH JZ GVSTRS3 INC CH MOV BX,STRSAVE MOV DX,OFFSET 32 ADD BX,DX MOV STRSAVE,BX CALL CRLF JMP GVSTRS1 ; GVSTRS3: CALL ILPRT DB CR,LF,LF,'Enter number to transmit string',CR,LF,0 POP BX JMP SENDLOG ; EXTFLG: MOV AL,TRUE MOV EXACFLG,AL JMP TERML ; RCVREADY: CALL INMODCTLP CALL ANIMODRCVB CALL CPIMODRCVR RET ; LSTMSG: MOV AL,LISTFLG OR AL,AL JZ LSTMSG2 CALL ILPRT DB 'Printer is on',CR,LF,0 RET LSTMSG2: CALL ILPRT DB 'Printer is off',CR,LF,0 RET ; NOTOG: PUSH AX NOTOG1: CALL SENDREADY JNZ NOTOG1 POP AX CALL OUTMODDATP MOV CH,AL MOV AL,LOCFLG OR AL,AL JNZ LTYPE MOV AL,ECHOFLG OR AL,AL JZ CHKCR LTYPE: MOV AL,CH CALL TIPE CALL CHKSAVE ;TO STORE LOCAL IF BUFFER OPEN CALL CHKPRNT CHKCR: MOV AL,CR CMP AL,CH JNZ TERML MOV AL,ADDLF OR AL,AL JZ TERML JMP SENDLF ; TERML: CALL RCVREADY ;TEST FOR RECEIVED CHARACTER JZ TERML1 JMP TERM TERML1: CALL INMODDATP AND AL,7FH ;STRIP PARITY JNZ GIVLF JMP TERM GIVLF: MOV CH,AL CALL TIPE CALL CHKSAVE CALL CHKPRNT MOV AL,ECHOFLG OR AL,AL JZ NOECHO MOV AL,CH CALL OUTMODDATP NOECHO: MOV AL,CR CMP AL,CH JZ NOECHO1 JMP TERM NOECHO1: MOV AL,ADDLF JNZ NOECHO2 JMP TERM NOECHO2: MOV AL,ECHOFLG OR AL,AL JZ NOECHO3 JMP SENDLF NOECHO3: MOV AL,LF JMP GIVLF ; CHKSAVE: MOV AL,SAVEFLG OR AL,AL JNZ CHKSAVE1 RET CHKSAVE1: MOV BYTE PTR [BX],CH INC BX MOV HLSAVE,BX ;MENU COMMAND DESTROYS HL-REG.. MOV AL,LF CMP AL,CH JNZ NOCOLON ;..TYPE ":" AFTER EACH LINE FEED.. MOV AL,':' ;..WHEN MEMORY SAVE ACTIVE. CALL TIPE NOCOLON: CALL GETMAX CMP AL,BH PUSH CX JNZ NOCOLON1 CALL INTDSKSV NOCOLON1: POP CX RET ; GETMAX: MOV AL,XAST SHR 8 ;END OF RESERVED BUFFER HAS BEEN RET ;..REACHED AND DISKSAVE IS NEEDED. ; CHKPRNT: TEST LISTFLG,0FFH ;OUT TO PRINTER? JNZ CHKPRNT1 RET ;RETURN IF NOT CHKPRNT1: TEST NFILFLG,0FFH ;IS BUFFER USED FOR FILE? JZ NOBUFF ;DON'T BUFFER PRINTER IF SO, HOWEVER CHARACTERS ;WILL BE LOST IF PRINTER IS SLOWER THAN MODEM CALL GETMAX ;GET MAXIMUM FOR BUFFER MOV BX,HLSAVE1 CMP AL,BH ;ARE WE THERE? JNZ NOTMAX ;GO IF NOT MOV BX,OFFSET BOTTRAM ;FLUSH BUFFER MOV HLSAVE1,BX MOV HLSAVE2,BX NOTMAX: MOV BYTE PTR [BX],CH ;SAVE CHARACTER IN BUFFER INC BX ;INCREMENT END OF BUFFER MOV HLSAVE1,BX MOV AL,TRUE ;SET FLAG FOR PRINTER OUTPUT MOV LISTMOR,AL RET ; NOBUFF: CALL LSTSTAT JNZ NOBUFF1 RET ;RETURN IF PRINTER BUSY NOBUFF1: MOV CL,CH ;ELSE PRINT CHARACTER CALL LISTER RET ; GOLIST: CALL LSTSTAT JNZ GOLIST1 RET ;RETURN IF PRINTER BUSY GOLIST1: MOV BX,HLSAVE2 ;GET LOCATION OF NEXT CHARACTER TO PRINT MOV CL,BYTE PTR [BX] ;GET CHARACTER INC BX ;INCREMENT POINTER MOV HLSAVE2,BX CALL CMPBUFF ;CHECK FOR END OF BUFFER CALL LISTER ;PRINT RET ; ;ROUTINE CHECKS FOR END OF BUFFER, RESETS BUFFER IF SO AND STOPS ;PRINTER OUTPUT ; CMPBUFF: MOV BX,HLSAVE2 CMP BX,HLSAVE1 JZ CMPBUFF1 RET CMPBUFF1: MOV BX,OFFSET BOTTRAM MOV HLSAVE1,BX MOV HLSAVE2,BX MOV LISTMOR,0 RET ; INTDSKSV: MOV AL,XOFF ;SEND A CTRL-S TO STOP.. CALL OUTMODDATP ;..REMOTE COMPUTER OUTPUT. MOV DH,0 ;D IS THE BUFFER COUNT CALL INMODEM ;GET LAST BYTES SENT.. MOV LASTBYT1,AL ;..AFTER CTRL-S. CALL INMODEM ;ADD MORE CALLS TO INMODEM.. MOV LASTBYT2,AL ;..AND STA LASTBYT# IF YOU ARE.. PUSH DX CALL NUMREC1 CALL WRTDSK ;WRITE THE RECORDS POP DX MOV BX,OFFSET BOTTRAM INC DH DEC DH ;TEST BUFFER COUNT FOR ZERO JZ CTRLQ MOV AL,LASTBYT1 ;GET THE LAST BYTES THAT WERE.. MOV BYTE PTR [BX],AL ;..SAVED AND PUT THEM IN.. INC BX ;..BOTTRAM. CALL TIPE DEC DH JZ CTRLQ MOV AL,LASTBYT2 MOV BYTE PTR [BX],AL INC BX CALL TIPE CTRLQ: MOV AL,XON ;SEND START CHARACTER.. CALL OUTMODDATP ;..TO REMOTE COMPUTER. RET ; ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET ;TO STORE THE CHARACTER. A MAXIMUM OF TWO CHARACTERS ARE STORED, ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSKSV" ;ABOVE). ; INMODEM: PUSH BX MOV BX,OFFSET 625 CALL FIXCNT PUSH BX POP CX POP BX TIMERL: CALL RCVREADY JZ GETBYTE DEC CX MOV AL,CH OR AL,CL JNZ TIMERL RET ; GETBYTE: CALL INMODDATP INC DH RET ; NUMRECS: MOV BYTE PTR [BX],EOFCHAR INC BX MOV DX,OFFSET 127 ADD BX,DX NUMREC1: MOV DX,-(OFFSET BOTTRAM) ADD BX,DX MOV AL,BL ;DIVIDE HL BY 128.. RCL AL,1 ;High bit set if sector to save MOV AL,0 ;Save in carry RCL AL,1 ;Now see if needed MOV BL,BH ;..NUMBER OF SECTORS MOV BH,0 PUSH AX ADD BX,BX POP AX ADC AL,BL MOV BL,AL ;RETURNS WITH NUMBER OF.. RET ;..128 BYTE RECORDS IN HL. ; WRTDSK: MOV DX,OFFSET BOTTRAM NEXTWRT: MOV CL,STDMA CALL BDOSRT PUSH DX MOV DX,OFFSET FCB3 MOV CL,WRITE CALL BDOSRT POP DX ADD DX,128 DEC BX JNZ NEXTWRT RET ; CLOSE3: MOV DX,OFFSET FCB3 MOV CL,CLOSE INT 224 RET ; BDOSRT: PUSH CX PUSH DX PUSH BX PUSH AX INT 224 POP AX POP BX POP DX POP CX RET ; MOVE2: MOV BX,OFFSET FCB3 CALL INITFCBS MOV BX,OFFSET FCB MOV DX,OFFSET FCB3 MOV CH,12 CALL MOVE RET ; ;FILE TRANSFER ROUTINE - CALLED WITH ;CONTROL-T FROM TERMINAL ROUTINE. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X. ; TRANSFER: PUSH BX PUSH DX PUSH CX PUSH AX MOV BX,OFFSET FCB4 CALL INITFCBS ;INITIALIZES FCBS POINTED.. MOV BX,OFFSET FCB+16 ;..TO BY HL REG. CALL INITFCBS GET: CALL GETNAME MOV AL,CMDBUF+2 ;WAS FILE ENTERED CMP AL,20H JZ TRANSL2 CALL MOVE4 CALL OPEN4 CMP AL,0FFH ;RETURN WITH 0FFH MEANS JNZ CONTIN ;FILE DOES NOT EXIST TRANSL1: CALL ILPRT DB CR,LF,'++ File does not exist ++',CR,LF,0 TRANSL2: CALL ILPRT DB 'Type "R" to return to modem',CR,LF DB 'Type "A" to re-enter name: ',BELL,0 CALL KEYIN CALL UCASE PUSH AX CALL TIPE ;ECHO RESPONSE CALL CRLF POP AX CMP AL,'A' JNZ TRANSL3 JMP GET TRANSL3: CMP AL,'R' JNZ TRANSL2 JMP RETURN ; CONTIN: MOV DX,OFFSET 80H MOV CL,STDMA INT 224 READMR: CALL READ80 CMP AL,1 ;END OF FILE JZ RETURNS CMP AL,2 ;BAD READ JZ RETURNU CALL SEND80C CMP AL,EOFCHAR ;END OF FILE - OMIT IF OBJECT.. JZ RETURNS ;..CODE IS TO BE SENT. CMP AL,CAN ;CANCELLATION? JZ TRANCAN JMP READMR ; RETURNS: CALL ILPRT DB CR,LF,'File transfer completed',CR,LF,BELL,0 JMP RETURN ; RETURNU: CALL ILPRT DB CR,LF,'++ File transfer unsuccessful ++',CR,LF,BELL,0 JMP RETURN ; TRANCAN: CALL ILPRT DB CR,LF,LF,'++ Transfer cancelled ++',CR,LF,BELL,0 RETURN: POP AX POP CX POP DX POP BX RET ; INITFCBS: ;ENTRY AT +2 WILL LEAVE.. MOV BYTE PTR [BX],0 ;..DRIVE NO. INTACT. INC BX ;WILL INITIALIZE AN FCB.. MOV CH,11 ;..POINTED TO BY HL-REG. FILLS 1ST POS LOOP10: MOV BYTE PTR [BX],' ' ;..WITH 0, NEXT 11 WITH.. INC BX ;..WITH BLANKS, AND LAST.. DEC CH ;..21 WITH NULLS. JNZ LOOP10 MOV CH,21 LOOP11: MOV BYTE PTR [BX],0 INC BX DEC CH JNZ LOOP11 RET ; GETNAME: CALL ILPRT DB CR,LF,'Enter file name to be transferred - TO QUIT: ',0 MOV DX,OFFSET CMDBUF CALL INBUFF CALL CRLF RET ; MOVE4: MOV DX,OFFSET CMDBUF MOV BX,OFFSET FCB4 CALL CPMLINE RET ; OPEN4: MOV DX,OFFSET FCB4 MOV CL,OPEN INT 224 RET ; READ80: MOV DX,OFFSET FCB4 MOV CL,READ INT 224 RET ; SEND80C: MOV CH,80H MOV BX,OFFSET 80H SENDCH1: PUSH DX CALL SPEED POP DX MOV AL,BYTE PTR [BX] CMP AL,EOFCHAR JNZ SENDCH3 MOV AL,EOFSEND OR AL,AL JNZ SENDCH2 RET SENDCH2: MOV AL,BYTE PTR [BX] SENDCH3: CALL MODOUT CMP AL,EOFCHAR JNZ SENDCH4 RET SENDCH4: CALL STAT ;TEST TO SEE IF OR AL,AL ;CANCELLATION REQUESTED JZ SKIP12 CALL KEYIN CMP AL,CAN JNZ SKIP12 RET SKIP12: INC BX DEC CH JNZ SENDCH1 RET ; MODOUT: PUSH AX MODOUTL: MOV AL,XOFFTST OR AL,AL JZ MODOUTL1 CALL TXOFF MODOUTL1: CALL SENDREADY JNZ MODOUTL MOV AL,STRLF OR AL,AL JZ NOLFTST POP AX PUSH AX CMP AL,LF JZ NOTMOUT NOLFTST: POP AX PUSH AX MOV SAVEOUT,AL ;SAVE OUTPUT FOR POSSIBLE ECHO TEST CALL OUTMODDATP MOV AL,ECHWAIT ;DO WE WANT TO TEST FOR ECHOED CHAR? OR AL,AL JZ NOTMOUT CALL WAITECHO ;GO IF SO NOTMOUT: POP AX CALL TIPE CMP AL,CR JZ DLYCR RET ; DLYCR: MOV AL,XONWAIT ;WAIT FOR XON AFTER CR? OR AL,AL JNZ WAITXON MOV AL,CRDLY ;EXTRA DELAY AFTER CR JMP DLYCR2 ; SPEED: MOV AL,BYTDLY ;GET SPEED VALUE (0-9) ;DELAY IS FROM 0.02 SEC FOR SPDVAL = 1 ;TO 0.18 SEC FOR SPDVAL = 9 DLYCR2: OR AL,AL JNZ DLYCR3 RET ;RETURN IF 0 DLYCR3: MOV CL,AL SPDLP: CALL SPD1 ;OUTER LOOP DEC CL JNZ SPDLP RET ; SPD1: PUSH BX MOV BX,OFFSET 357 ;ABOUT 0.02 SEC MOV AL,XOFFTST OR AL,AL JZ SPD2 MOV BX,OFFSET 102 ;ADJUST FOR XOFF TESTING MOV AL,ECHOFLG OR AL,AL JZ SPD2 MOV AL,LOCFLG OR AL,AL JZ SPD2 MOV BX,OFFSET 76 ;ADJUST AGAIN FOR REMOTE ECHO SPD2: CALL FIXCNT PUSH BX POP DX POP BX SPDLP1: DEC DX ;INNER LOOP MOV AL,XOFFTST OR AL,AL JZ SPDLP2 CALL TXOFF SPDLP2: MOV AL,DL OR AL,DH JNZ SPDLP1 RET ; TXOFF: CALL RCVREADY JZ TXOFF1 RET TXOFF1: CALL INMODDATP AND AL,7FH CMP AL,XOFF JNZ TXOFF2 CALL WAITXON TXOFF2: RET ; WAITXON: CALL RCVREADY JNZ WTXON2 CALL INMODDATP AND AL,7FH CMP AL,XON JNZ WTXON2 RET WTXON2: CALL STAT ;TEST TO SEE IF OR AL,AL ;CANCELLATION REQUESTED JZ WAITXON ;SO DON'T GET HUNG UP CALL KEYIN CMP AL,CAN JNZ WAITXON RET ; WAITECHO: MOV AL,50 ;1 SECOND MAXIMUM DELAY WAITING FOR ECHO MOV MECHDLY,AL WTECH1: CALL RCVREADY ;IS THERE INPUT? JNZ WTECH2 ;GO IF NOT CALL INMODDATP ;GET INPUT AND AL,7FH MOV CL,AL ;SAVE INPUT MOV AL,SAVEOUT ;GET OUTPUT CMP AL,CL ;ARE THEY THE SAME? JNZ WTECH1A RET ;RETURN IF SO WTECH1A: MOV AL,SAVEOUT ;GET OUTPUT CMP AL,TAB ;CHECK IF TAB JNZ WTECH2 ;GO IF NOT MOV AL,SPACE ;MAYBE REMOTE CONVERTS TABS TO SPACES CMP AL,CL JNZ WTECH2 RET ;RETURN IF SPACE ECHOED ON TAB OUTPUT WTECH2: MOV AL,MECHDLY ;LOOP FOR 1 SECOND DEC AL MOV MECHDLY,AL JNZ WTECH3 RET WTECH3: MOV AL,1 ;0.02 SECOND CALL DLYCR2 JMP WTECH1 ; ; Check for any garbage characters on line. ; CKMODM: CALL RCVREADY ;ANY CHARACTERS READY TO RECEIVE? JZ CKMODM1 RET ;IF NOT, RETURN CKMODM1: CALL INMODDATP ;OTHERWISE GET THE CHARACTER AND IGNORE JMP CKMODM ;CHECK FOR ANY ADDITIONAL CHARACTERS ;