PAGE 75,128 TITLE TERMNL - Terminal Emulation Routines PAGE .XLIST INCLUDE CCBBS.MAC INCLUDE CCBBS.DEF .LIST ;----------------------------------------------- ;SYSTEM DATA SEGMENT ;----------------------------------------------- SYSDATA SEGMENT PARA PUBLIC 'DATA' EXTRN CALLRN:BYTE EXTRN MSSGN:BYTE,MSSGH:WORD EXTRN MSGUCNT:WORD,USERH:WORD DW MSGT02-MSGT01-2 MSGT01 DB 'Modem Error',13 DW MSGT03-MSGT02-2 MSGT02 DB 'No Carrier',13 DW MSGT04-MSGT03-2 MSGT03 DB 'Enter number to dial: ' DW MSGT05-MSGT04-2 MSGT04 DB 'All available lines are in use. ' DW MSGT06-MSGT05-2 MSGT05 DB 'Connected . . .',13 DW MSGT07-MSGT06-2 MSGT06 DB 'Busy',13 DW STRT01-MSGT07-2 MSGT07 DB 'No Dial Tone',13 DW STRT02-STRT01 STRT01 DB 'ATDT' STRT02 EQU $ SYSDATA ENDS ;----------------------------------------------- ;CODE SEGMENT ;----------------------------------------------- CSEG SEGMENT PARA PUBLIC 'CODE' EXTRN TAYSOP:NEAR,MMENU1:NEAR,MMENU2:NEAR EXTRN SENDF:NEAR,NOTYET:NEAR,TSYSOP:NEAR EXTRN ERROR:NEAR,GETBUF:NEAR,FREBUF:NEAR EXTRN QUERY:NEAR,DQCMD:NEAR EXTRN PADB:NEAR,MOVSTL:NEAR,APPBYT:NEAR EXTRN ILINEB:NEAR,MOVSTR:NEAR,WRMSG:NEAR EXTRN FRELBF:NEAR,QYES:NEAR,BINASP:NEAR,FEOF:NEAR EXTRN BINASC:NEAR,STRIP:NEAR,ASCBIN:NEAR EXTRN HAYIND:NEAR,INITLN:NEAR,CONR:NEAR,CONW:NEAR EXTRN CLRIBF:NEAR,ST1200:NEAR,ST300:NEAR,STM8B:NEAR EXTRN STM7B:NEAR,RPOST:NEAR,WPOST:NEAR,TPOST:NEAR EXTRN ST2400:NEAR,MVCSTR:NEAR,XLATE:NEAR PUBLIC TERMNL,TEIN00 ASSUME CS:CSEG,DS:NOTHING,ES:SYSDATA TERMNL PROC NEAR ;-------------------------------------------------------------- ;TERMINAL EMULATION ROUTINE ; BP-2 TEXT STRING ADDRESS ; BP-4 COM PORT NUMBER ;-------------------------------------------------------------- CALL TSYSOP ;AUTHORIZED CALLER? JNZ TERM10 ;YES JMP MMENU2 ;UNKNOWN COMMAND TERM10: FRAME 2 CALL DIAL00 ;GET NUMBER TO DIAL JNC TERM15 ;OK JMP TERM90 ;EXIT TERM15: MOV [BP-2],SI ;DIAL STRING CALL GETLCB ;FIND AVAILABLE LINE JNC TERM20 ;LINE AVAILABLE MOV SI,OFFSET MSGT04 ;NO LINES JMP TERM80 ;EXIT TERM20: MOV [BP-4],AX ;COM PORT NUMBER MOV AL,1DH ;TERMINAL EMULATION POST CODE CALL WPOST ;POST COM TASK MOV AL,BYTE PTR [BX+USRLN] ;OUR LINE NUMBER CALL WPOST ;PASS LINE NUMBER MOV DX,[BP-2] ;DIAL STRING MOV AL,DH ;MSB DIAL STRING CALL WPOST MOV AL,DL ;LSB DIAL STRING CALL WPOST CALL RPOST ;WAIT FOR RESULTS CMP AL,1DH ;CONNECTION READY? JNZ TERM60 ;NO MOV SI,OFFSET MSGT05 ;CONNECT MSG CALL WRCMSG ;DISPLAY IT TERM40: CALL CONR ;WAIT FOR KEYPRESS TEST BYTE PTR [BX+CBFLG],SFITP ;INTER TASK POST? JNZ TERM50 ;ANALYZE POST CODE TEST BYTE PTR [BX+CBFLG],SFTO ;TIMED OUT? JNZ TERM40 ;DON'T CARE ABOUT THAT TERM45: CALL WPOST ;WRITE TO COM PORT JMP TERM40 ;NEXT CHARACTER TERM50: CALL RPOST ;GET POST CODE CMP AL,0 ;END OF CALL? JZ TERM68 ;YES CALL CONW ;WRITE TO CONSOLE JMP TERM40 ;NEXT CHARACTER TERM60: MOV SI,OFFSET MSGT01 ;MODEM ERROR CMP AL,4 ;ERROR? JZ TERM80 ;YES MOV SI,OFFSET MSGT06 ;BUSY CMP AL,7 ;BUSY? JZ TERM80 ;YES MOV SI,OFFSET MSGT07 ;NO DIAL TONE CMP AL,6 ;DIAL TONE? JZ TERM80 ;NO TERM68: MOV SI,OFFSET MSGT02 ;NO CARRIER TERM80: CALL WRCMSG ;ERROR MESSAGE TERM90: MOV SP,BP ;FREE LOCAL STORAGE POP BP ;RESTORE CALLER'S FRAME JMP MMENU1 ;RETURN TO MAIN MENU ;-------------------------------------------------------------- ;TERMINAL EMULATION LINE DRIVER ; BP-2 DIAL STRING ; BP-4 CALLER'S PORT NUMBER ;-------------------------------------------------------------- TEIN00: PUSH BP MOV BP,SP SUB SP,4 ;ALLOCATE LOCAL STORAGE AND [BX+CBFLG],NOT SFSNP ;NO TRACE DURING SESSION CALL RPOST ;GET CALLER'S LINE NUMBER MOV AH,AL ;POSITION FOR WPORT MOV [BP-4],AX CALL RPOST ;MSB DIAL STRING MOV DH,AL CALL RPOST ;LSB DIAL STRING MOV DL,AL MOV [BP-2],DX CALL ILINEB ;FORMAT BUFFER MOV DI,OFFSET STRT01 ;ATDT CALL MVCSTR MOV DI,[BP-2] ;DIAL STRING CMP BYTE PTR [DI],'M' ;MANUAL DIAL REQUEST? JZ TEIN30 ;YES CALL MOVSTR CALL CLRIBF ;CLEAR RESPONSE BUFFER CALL WRMSG ;TELL HAYES TO DIAL TEIN10: CALL HAYIND ;GET MODEM RESPONSE JNC TEIN20 ;NORMAL COMPLETION MOV AL,4 ;MODEM NOT RESPONDING JMP TEIN82 ;ERROR EXIT TEIN20: CMP AL,3 ;NO CARRIER? JZ TEIN82 ;ERROR EXIT CMP AL,4 ;ERROR? JZ TEIN82 ;ERROR EXIT CMP AL,7 ;BUSY? JZ TEIN82 ;ERROR EXIT CMP AL,6 ;NO DIAL TONE? JZ TEIN82 ;ERROR EXIT CMP AL,5 ;1200 BAUD CONNECT? JNZ TEIN22 ;NO CALL ST1200 ;SET 1200 BAUD JMP SHORT TEIN30 ;POST CALLER TEIN22: CMP AL,10 ;2400 BAUD CONNECT? JNZ TEIN24 ;NO CALL ST2400 ;SET 2400 BAUD JMP SHORT TEIN30 ;POST CALLER TEIN24: CMP AL,1 ;300 BAUD CONNECT? JNZ TEIN10 ;IGNORE OTHER CODES CALL ST300 ;SET 300 BAUD TEIN30: MOV AX,[BP-4] ;CALLER'S PORT MOV AL,1DH ;CALL READY POST CODE CALL WPOST ;LET CALLER KNOW TEIN40: CALL CONR ;WAIT FOR LINE TEST BYTE PTR [BX+CBFLG],SFLC ;LOST CARRIER? JNZ TEIN80 ;CALL IS OVER TEST BYTE PTR [BX+CBFLG],SFITP ;INTER-TASK POST? JNZ TEIN50 ;ANALYZE POST CODE TEST BYTE PTR [BX+CBFLG],SFTO ;TIME OUT? JNZ TEIN40 ;DOESN'T MATTER OR AL,AL ;NULL? JZ TEIN40 ;DON'T PASS NULL CALL WPOST ;PASS CHAR TO CALLER JMP TEIN40 ;GET NEXT CHAR TEIN50: CALL RPOST ;GET INPUT CHAR OR AL,AL ;EXTENDED CHARACTER? JNZ TEIN60 ;NO PROBLEM CALL RPOST ;GET COMMAND CHAR CMP AL,2DH ;EXIT? JZ TEIN80 ;YES JMP TEIN50 ;NEXT INPUT TEIN60: CALL CONW ;WRITE TO LINE JMP TEIN40 ;NEXT CHAR TEIN80: MOV AL,0 ;END OF CALL POST CODE TEIN82: CALL WPOST ;TELL CALLER MOV SP,BP ;FREE LOCAL STORAGE JMP INITLN ;WAIT FOR PHONE TO RING DIAL00: MOV DI,OFFSET MSGT03 ;NUMBER TO DIAL CALL ILINEB ;INITIALIZE BUFFER CALL MVCSTR ;MOVE TO BUFFER CALL QUERY JNC DIAL10 ;READ OK DIAL05: STC ;SHOW ERROR RET DIAL10: CALL DQCMD CMP WORD PTR [SI-2],0 ;EMPTY? JZ DIAL05 ;YES CALL XLATE ;MAKE UPPER CASE CLC RET ;------------------------------------------------------------- ;FIND AVAILABLE COMMUNICATION PORT ;------------------------------------------------------------- GETLCB: MOV CX,DS:TSKCNT ;NUMBER OF LCBS MOV DI,CX DEC DI SHL DI,1 ADD DI,OFFSET TSKCNT+2 ;DI -> LAST LCB GETL10: MOV SI,WORD PTR [DI] ;TCB CMP SI,BX ;IS THIS US? JZ GETL20 ;YES - NOT ACCEPTABLE TEST WORD PTR [SI+CBMDM],MDMNULL+MDMNSW ;SPECIAL LINE? JNZ GETL20 ;YES - CAN NOT USE CMP WORD PTR [SI+CBWIT],0 ;WAITING FOR CALL? JNZ GETL30 ;YES - TAKE THIS LINE GETL20: SUB DI,2 ;PREVIOUS LCB LOOP GETL10 ;CHECK IT OUT STC ;SHOW NO LINE AVAILABLE RET GETL30: DEC CX ;RELATIVE LINE NUMBER MOV AH,CL ;RETURN LINE NUMBER MOV CX,WORD PTR [SI+CBWIT] ;TASK WAITING FOR CALL MOV WORD PTR [SI+CBWRD],CX ;NOW WAITING FOR READ MOV WORD PTR [SI+CBWIT],0 ;NOT WAITING FOR CALL CLC ;SHOW LINE FOUND RET WRCMSG: PUSH SI PUSH DI MOV DI,SI ;CONSTANT STRING CALL ILINEB ;INITIALIZE BUFFER CALL MVCSTR ;MOVE TO BUFFER CALL WRMSG ;WRITE STRING POP DI POP SI RET TERMNL ENDP CSEG ENDS END