; HDTALK - TALK TO MODEM, HALF DUPLEX ; ; Any char except ^C, TAB, and rubout sent unmodified, but ; only printables, CR, LF, BS, TAB echoed. Rubout sends @, ; echos as BS, SPACE, BS. ^C sends break, does not echo. ; TAB sends expanded tabs (spaces), echos as tab. ; ; Obviously, the character selected to escape is neither ; sent nor echoed, so choose it carefully. I like ^X. ; ; Copyright [c] Noel Alaska Systems Technology, 1983. VMAJOR = 1. ; version equates VMINOR = 0. VSUB = 0. VEDIT = 8. ; CHANGE EACH EDIT <----------- VWHO = 0. SEARCH SYS ; AMOS librarys SEARCH SYSSYM SEARCH TRM SEARCH MFN ; my library DSECT .=0 ; define impure area XTDV: BLKL 1 ; orig term driver ODDB: BLKB D.DDB ; TERMINAL DDB ESCAPE: BLKB 1 ; escape char EVEN IMPURE = . .=0 PSECT BEGIN: PHDR -1,-1,PH$REE!PH$REU GETIMP IMPURE,A5 ; get memory BYP LIN BNE 1$ TYPECR EXIT 1$: FSPEC ODDB(A5),TRM ; set term name CALL TRMSRH ; find it MOV A3,D7 ; found? BNE 2$ ; YES TYPECR EXIT 2$: TST T.JLK(A3) ; detached? BEQ 3$ ; YES TYPECR EXIT 3$: BIS #T$ECS!T$ILC!T$IMI,T.STS(A3) MOV T.TDV(A3),XTDV(A5) ; set status bits MOV TRMTDC,A0 ; and switch to PSEUDO.TDV ADD #10,A0 MOV A0,T.TDV(A3) CLRB ODDB+D.FLG(A5) MOVW #[TRM],ODDB+D.DEV(A5) INIT ODDB(A5) OPENO ODDB(A5) MOV #1,ODDB+D.SIZ(A5) ; use single byte output JOBIDX A0 BIC #J.CCC,JOBSTS(A0) MOV JOBTRM(A0),A4 BIS #T$ECS!T$ILC!T$IMI,T.STS(A4) TYPESP ; acquire the escape char KBD CTRLC BYEBYE ; but quit if ^C is entered here MOVB D1,ESCAPE(A5) CLRW T.POO(A3) CRLF CRLF LOOP: TST T.ICC(A3) ; input from remote? BEQ LOOP1 ; NO CALL TTYGET ; YES - get it TSTB D1 BEQ LOOP CMPB D1,#177 BEQ LOOP CMPB D1,#40 BGE 1$ CMPB D1,#15 BEQ 1$ CMPB D1,#12 BEQ 1$ CMPB D1,#11 BEQ 1$ CMPB D1,#10 BEQ 1$ BR LOOP 1$: TTY ; send to local LOOP1: JOBIDX A0 BIT #J.CCC,@A0 ; ^C waiting? BEQ LOOP2 ; NO BIC #J.CCC,@A0 ; YES - reset it CALL SNDBRK ; send break BR LOOP LOOP2: TST T.ICC(A4) ; input from local? BEQ LOOP4 ; NO KBD ; YES - get it CMPB D1,ESCAPE(A5) ; is it escape char? BEQ BYEBYE ; YES - quit CMPB D1,#177 ; is it rubout? BNE LOOP3 ; NO MOVB #'@,D1 ; YES - remote gets '@' instead CALL TTYPUT TTYI ; local gets BS, SPACE, BS BYTE 10,40,10,0 EVEN JMP LOOP LOOP3: CALL TTYPUT ; send to remote CMPB D1,#40 BGE 1$ CMPB D1,#15 BEQ 1$ CMPB D1,#12 BEQ 1$ CMPB D1,#11 BEQ 1$ CMPB D1,#10 BEQ 1$ JMP LOOP 1$: TTY ; send to local JMP LOOP LOOP4: TST T.ICC(A3) ; no sleep if input still ready JNE LOOP ; on the remote end... SLEEP #10 ; sleep awhile JMP LOOP BYEBYE: CLOSE ODDB(A5) MOV XTDV(A5),T.TDV(A3) ; restore original .TDV to remote CRLF EXIT SNDBRK: SAVE A0-A6,D1 MOV A3,A5 BIS #T$BRK,@A5 ; tell '.IDV' we want breaks MOV #5,D3 ; send 5 nulls MOV #200,D1 TRMBFQ REST A0-A6,D1 1$: SLEEP #1 BIT #T$OIP,@A3 BNE 1$ TST T.OQX(A3) BNE 1$ RTN TTYGET: SAVE A5 MOV A3,A5 TTYIN AND #177,D1 REST A5 RTN TTYPUT: PUSH D1 1$: SLEEP #2 ; wait a bit BIT #T$OIP,@A3 ; is output still in progress? (RMT) BNE 1$ ; YES TST T.OQX(A3) ; is output still queued? (RMT) BNE 1$ ; YES BIT #T$OIP,@A4 ; is output still in progress? (LCL) BNE 1$ ; YES TST T.OQX(A4) ; is output still queued? (LCL) BNE 1$ ; YES MOVW T.POO(A3),T.POO(A4) ; sync POO incase this is TAB AND #177,D1 ; remove parity ; CMPB D1,#11 ; is this a tab? ; BNE 2$ ; NO ; BISB #200,D1 ; YES - set parity bit 2$: MOV ODDB+D.BUF(A5),A6 MOVB D1,@A6 OUTPUT ODDB(A5) POP D1 RTN TRMSRH: MOV TRMDFC,A3 ; index TRMDEF chain 1$: CMM ODDB+D.FIL(A5),4(A3) BNE 2$ ; wrong one ADD #10,A3 ; right one - advance to TRMDEF proper RTN 2$: MOV @A3,A3 ; move up chain MOV A3,D7 BNE 1$ ; unless end RTN EVEN END