; FDGET - TALK TO MODEM, FULL DUPLEX, WITH LOG FILE ; ; Any char except ^C, TAB, and rubout sent unmodified, but ; only printables, CR, LF, BS, TAB echoed. Rubout sends @, ; but does not echo. ^C sends break, does not echo. TAB ; sends expanded tabs (spaces), does not echo. ; ; 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 = 4. ; CHANGE EACH EDIT <----------- VWHO = 0. SEARCH SYS ; AMOS librarys SEARCH SYSSYM SEARCH TRM SEARCH MFN ; my library DSECT .=0 XTDV: BLKL 1 ; orig term driver OPOS: BLKL 1 ; output position OSPC: BLKL 1 ; saved-up spaces OTAB: BLKL 1 ; saved-up tabs ODDB: BLKB D.DDB ; TERMINAL DDB LDDB: BLKB D.DDB ; LOG 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$: BYP LIN ; filename entered? BNE 4$ ; YES TYPE TTYL DEFDDB CRLF LEA A2,DEFDDB ; NO - use default 4$: FSPEC LDDB(A5),LOG INIT LDDB(A5) LOOKUP LDDB(A5) ; file exists? BNE 5$ ; NO TYPE PFILE LDDB(A5) CRLF OPENA LDDB(A5) ; YES - append BR 6$ 5$: OPENO LDDB(A5) 6$: 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$: CALL TTYOUT ; 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 LOOP3: CALL TTYPUT ; send to remote 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) ; close remote LEA A0,CRLFS ; send CRLF to log/local 1$: MOVB (A0)+,D1 BEQ 2$ CALL TTYOUT BR 1$ 2$: CLOSE LDDB(A5) ; close log file MOV XTDV(A5),T.TDV(A3) ; restore original .TDV to remote 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 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 TTYOUT: TTY ; type char on local CMPB D1,#40 ; this a space or control? BLO 4$ ; is control BNE 2$ INC OSPC(A5) ; increase space count INC OPOS(A5) ; advance position MOV OPOS(A5),D1 ; check to see if spaces can be AND #7,D1 ; converted to tabs yet BEQ 1$ RTN 1$: INC OTAB(A5) ; increase tab count CLR OSPC(A5) ; clear space count RTN 2$: TST OTAB(A5) ; is tab count zero yet? BEQ 25$ ; YES PUSH D1 ; NO - output tab MOVB #11,D1 ; - reduce count FILOTB LDDB(A5) ; - loop till it is POP D1 DEC OTAB(A5) BR 2$ 25$: TST OSPC(A5) ; is space count zero yet? BEQ 3$ ; YES PUSH D1 ; NO - output space MOVB #40,D1 ; - reduce count FILOTB LDDB(A5) ; - loop till it is POP D1 DEC OSPC(A5) BR 25$ 3$: CLR OSPC(A5) ; clear space count CLR OTAB(A5) ; clear tab count INC OPOS(A5) ; advance position FILOTB LDDB(A5) ; output char RTN 4$: CMPB D1,#11 ; this a tab? BEQ 1$ ; YES - handle like generated one CMPB D1,#10 ; is this a BS? BEQ 2$ ; YES - handle as not-space CLR OPOS(A5) ; NO - presume CR, clear pos CLR OSPC(A5) ; - clear spaces CLR OTAB(A5) ; - clear tabs FILOTB LDDB(A5) ; - send the control char RTN CRLFS: BYTE 15,12,0 DEFDDB: ASCII /FDGET.LOG / EVEN END