; FDSEND - SEND A FILE TO MODEM, FULL DUPLEX ; ; Copyright [c] Noel Alaska Systems Technology, 1983. VMAJOR = 1. ; version equates VMINOR = 0. VSUB = 0. VEDIT = 5. ; 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 ODDB: BLKB D.DDB ; TERMINAL DDB IDDB: BLKB D.DDB ; FILE DDB LAST: BLKB 1 ; last char sent XONOFF: BLKB 1 ; last XON-XOFF status 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 BNE 4$ TYPECR EXIT 4$: FSPEC IDDB(A5),M68 INIT IDDB(A5) OPENI IDDB(A5) 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) CLRW T.POO(A3) CRLF LOOP: TST T.ICC(A3) ; input from remote? BEQ LOOP2 ; NO CALL TTYGET ; YES - get it TSTB D1 ; null byte? BEQ LOOP ; YES - ignroe it CMPB D1,#12 ; this a LF? BNE LOOP1A ; NO CLRB LAST(A5) ; YES - clear wait flag LOOP1A: CMPB D1,#21 ; this a ^Q BNE LOOP1B ; NO MOVB D1,XONOFF(A5) ; YES - reset wait switch LOOP1B: CMPB D1,#23 ; this a ^S BNE LOOP1X ; NO MOVB D1,XONOFF(A5) ; YES - set wait switch LOOP1X: TTY BR LOOP LOOP2: CTRLC BYEBYE ; first check for ^C CMMB #23,XONOFF(A5) ; waiting for ^Q ? BEQ LOOP3 ; YES CMMB #15,LAST(A5) ; waiting for LF? BEQ LOOP3 ; YES FILINB IDDB(A5) TST IDDB+D.SIZ(A5) JEQ BYEBYE CMPB D1,#12 ; this a line feed BEQ LOOP ; YES - NEVER SEND MOVB D1,LAST(A5) ; save last sent CMPB D1,#15 ; this a carriage return? BNE 1$ ; NO MOVB #40,D1 ; YES - send space CALL TTYPUT ; then MOVB #15,D1 ; send carriage return 1$: CALL TTYPUT ; send to remote CMMB #15,LAST(A5) ; this a CR? JNE LOOP ; NO MOVB #23,XONOFF(A5) ; YES - assume ^S JMP LOOP LOOP3: SLEEP #10 ; SLEEP AWHILE... JMP LOOP BYEBYE: CLOSE ODDB(A5) MOV XTDV(A5),T.TDV(A3) ; restore original .TDV to remote CRLF EXIT 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 EVEN END