.TITLE CALL.MAC .IDENT /V1.0/ .ENABL LC ; ; DF03 MODEM COMMUNICATION PROGRAM - NOEL CARBONI 10/13/81 ; .MCALL QIOW$C,ALUN$C,ALUN$S,EXIT$C,SPND$S,WTSE$C .MCALL EXIT$S,MRKT$C,CMKT$S,ASTX$S,QIOW$S .MCALL GCMLB$,GCML$,FSRSZ$,QIO$C,QIO$S ; ; EQUATES ; MODEM= 36 ; TERMINAL NUMBER OF MODEM PORT ; ; DATA ; .EVEN ; IOST: .BLKW 2 ; I/O STATUS BLOCK BSF: .WORD 1 ; WHETHER TO TRANSLATE DEL TO BS FLAG FDX: .WORD 0 ; FULL/HALF DUPLEX FLAG SFL: .WORD 0 ; SPEED FLAG ; TBSY: .ASCII <12><15>/CALL -- FATAL: UNABLE TO COMMUNICATE WITH MODEM/<15><12> TBSYL= . - TBSY ; END: .ASCII <12><15>/CALL -- SESSION TERMINATED/<15> ENDL= . - END ; TRY: .ASCII <12><15>/CALL -- DIALING/<15> TRYL= . - TRY ; CNCT: .ASCII <12><15>/CALL -- CONNECT/<12><15> CNCTL= . - CNCT ; MNC: .ASCII <12><15>/CALL -- MODEM COULD NOT CONNECT/<15> MNCL= . - MNC ; PRMPT: .ASCII <12><15>/CALL>/ PRMPTL= . - PRMPT ; ; GET MODEM ATTENTION CODES ; HEY: .ASCII <1><2><2> HEYL= . - HEY ; ; PHONE NUMBER DIAL BUFFER ; DIAL: .ASCII <1><2> DLBUF: .BLKB 30. ; ; OUTPUT BUFFERS ; TO: .BLKB 10. ; TI: OUTPUT AREA MO: .BLKB 10. ; MODEM OUTPUT AREA ; ; COMMAND LINE CONTROL BLOCK ; .EVEN ; CMDBLK: GCMLB$ 1,,,3 ;INIT GCML CONTROL BLOCK ; ; SET MULTIPLE CHARACTERISTICS DATA ; ; SET NOREMOTE: ; .EVEN ; NRX: .BYTE TC.BIN,1 ; SET /RPA=TTmodem: .BYTE TC.RSP ; RECEIVE SPEED SP1: .BYTE 0 .BYTE TC.XSP ; TRANSMIT SPEED SP2: .BYTE 0 NRXL= . - NRX ; SETM: .BYTE TC.ABD,0 ; TURN OFF AUTOBAUD .BYTE TC.XSP,S.1200 ; 1200 BAUD .BYTE TC.RSP,S.1200 LSETM= . - SETM ; NB: .BYTE TC.BIN,0 ; SET /NORPA=TTmodem: .BYTE TC.XSP,S.1200 .BYTE TC.RSP,S.1200 .BYTE TC.ABD,1 ; TURN ON AUTOBAUD NBL= . - NB ; NDLU: .BYTE TC.DLU,0 ; SET /NOREMOTE=TTmodem: NDLUL= . - NDLU ; DLU: .BYTE TC.DLU,1 ; SET /REMOTE=TTmodem: DLUL= . - DLU ; ; FSRSZ$ 1 ; FOR GCML (IN CASE OF @) ;+ ; ; CALL ; ; CALL IS A ROUTINE WHICH MAY BE USED TO COMMUNICATE WITH A DIGITAL ; DF03 MODEM. ; ; ; CODE ; .EVEN ; ;------------------------------------------------------------------------------ ; ; START UP ROUTINE ; CALL: ALUN$C 1,TI,0 ; ASSIGN LUN 1 TO TI ALUN$C 3,TI,0 ; ALSO LUN 3 ALUN$C 2,TT,MODEM ; ASSIGN LUN 2 TO DIAL UP ; QIOW$C SF.SMC,2,1,,,, ; SETUP MODEM ; CMDL: GCML$ #CMDBLK,#PRMPT,#PRMPTL ; GET COMMAND LINE ; ; CMDBLK+G.CMLD+2 = ADDRESS OF COMMAND LINE ; CMDBLK+G.CMLD = LENGTH OF COMMAND LINE ; BCC SNDAT ; BRANCH IF NOT EOF OR ERROR ; QIOW$C SF.SMC,2,1,,,, ; DROP DTR FOR A WHILE MRKT$C 1,3,2 ; WAIT 3 SECS WTSE$C 1 ; WAIT ; QIOW$C SF.SMC,2,1,,,, ; BRING DTR BACK UP ; EXIT$S ; QUIT ; SNDAT: CLR FDX ; DEFAULT IS HALF DUPLEX ; MOV CMDBLK+G.CMLD+2,R0 ; GET ADDRESS OF INPUT MOV CMDBLK+G.CMLD,R1 ; GET LENGTH OF INPUT BEQ CMDL ; NO INPUT - BRANCH MOV #DLBUF,R2 ; GET ADDRESS OF DIAL BUFFER ; MVPHN: MOVB (R0)+,(R2)+ ; MOVE NUMBER INTO OUTPUT AREA CMPB -1(R2),#'F ; INPUT A 'F'? BNE TSTH ; NO - BRANCH ; INC FDX ; YES - SET FDX FLAG BR CKNUM ; GO TEST NUMBER FOR VALIDITY ; TSTH: CMPB -1(R2),#'H ; INPUT A 'H'? BNE CKDL ; NO - CHECK IF NUMERIC ; CLR FDX ; YES - SET TO HALF DUPLEX ; CKDL: CMPB -1(R2),#'D ; DON'T CONVERT DELETE TO BS? BNE CKBS ; CLR BSF ; DON'T CONVERT BR CKNUM ; CKBS: CMPB -1(R2),#'B ; CONVERT DELETE TO BS BNE CK1200 ; NO - BRANCH ; INC BSF ; CONVERT ; CK1200: CMPB -1(R2),#'A ; 1200 BAUD? BNE CKNUM ; NO - BRANCH ; INC SFL ; SHOW 1200 BAUD DESIRED ; CKNUM: CMPB -1(R2),#'0 ; LESS THAN NUMERIC? BLT KILLIT ; YES - NOT NUMBER - GO REMOVE IT CMPB -1(R2),#'9 ; GREATER THAN NUMERIC? BLE CTDN ; NO - LET IT THROUGH ; KILLIT: DEC R2 ; KNOCK OFF THAT CHARACTER ; CTDN: SOB R1,MVPHN ; LOOP TILL ALL MOVED ; SUB #DIAL,R2 ; MAKE R2 LENGTH OF NUMBER INCLUDING ; CONTROL-A AND CONTROL-B ; MOVB #S.300,SP1 ; DEFAULT TO 300 BAUD MOVB #S.300,SP2 TST SFL ; 1200? BEQ SECHR ; MOVB #S.1200,SP1 ; SET TO 1200 BAUD MOVB #S.1200,SP2 ; SECHR: MRKT$C ,2,2,ATF ; MARK TIME FOR COMMUNICATIONS (2 SEC) ; QIO$C IO.WAL,2,,,,, ; GET ATTENTION OF MODEM QIOW$C IO.RVB,2,1,,,, ; READ 1 CHARACTER (SHOULD BE 'G') ; BICB #128.,MO ; KNOCK OFF TOP BIT IF SET CMPB MO,#'G ; DID WE GET A 'G'? BEQ DMDM ; YES - BRANCH JMP ATF ; NO - GO PRINT MESSAGE AND EXIT ; DMDM: CMKT$S ; CANCEL MARK TIME ; QIOW$C IO.WVB,1,1,,,, ; PRINT MESSAGE TO TI: QIO$S #IO.WAL,#2,,,,,<#DIAL,R2> ; DIAL NUMBER QIOW$C IO.RVB,2,1,,,, ; WAIT ON CONNECT ; BICB #128.,MO ; KNOCK OFF TOP BIT IF SET CMPB MO,#'A ; CONNECTED? BEQ ATM ; YES - BRANCH ; QIOW$C IO.WVB,1,1,,,, ; COULD NOT CONNECT MESSAGE TO TI: JMP CMDL ; GO TRY TO GET ANOTHER COMMAND LINE ; ATM: QIOW$C IO.WVB,1,1,,,, ; CONNECTED!!!! QIOW$C SF.SMC,2,1,,,, ; SET MODEM TO /RPA AND SPEED ; QIOW$C IO.ATA,2,1,,,, ; ATTACH MODEM QIOW$C IO.ATA,1,1,,,, ; ATTACH TI: ; SPND$S ; SUSPEND TASK ; ;------------------------------------------------------------------------------ ; ; UNSOLICITED CHARACTER AST INPUT ROUTINE ; ; INPUT IS ON TOP OF STACK ; LOW ORDER OF WORD CONTAINS INPUT CHARACTER ; HIGH ORDER OF WORD CONTAINS LUN NUMBER (PARM 2 OF QIO.ATA) ; ASTIO: BICB #^B10000000,(SP) ; KNOCK OFF TOP BIT CMPB #1,1(SP) ; WHICH LUN ENTERED THAT CHARACTER? BEQ ONE ; LUN #1 - BRANCH JMP TWO ; LUN #2 - BRANCH ; ;------------------------------------------------------------------------------ ; ; PROCESS INPUT ENTERED BY TI:. THIS INVOLVES ECHOING THE CHARACTERS TO THE ; SCREEN (IF FDX IS CLEAR) AND TRANSMITTING THEM DOWN LINE. ; ; SPECIAL CASES ARE: ; ; * IF BSF IS SET AND IS INPUT: ; MODEM <- TI: <- ; ; * IF BSF IS CLEAR AND IS INPUT: ; MODEM <- TI: <- ; ; * IS INPUT: ; MODEM <- TI: <- ; ; * IS INPUT: ; PROGRAM EXITS ; ONE: MOVB (SP),R0 ; GET INPUT CHARACTER CMPB R0,#26. ; CONTROL - Z? BNE CONT1 ; NO - CONTINUE JMP QUIT ; YES - GO EXIT PROGRAM ; CONT1: MOV #TO,R4 ; POINTER TO TI: OUTPUT AREA MOV #MO,R5 ; POINTER TO MODEM OUTPUT AREA ; CMPB R0,#177 ; DELETE CHARACTER? BNE CKCR ; NO - BRANCH ; MOVB #8.,(R4)+ ; PUT INTO TI: OUTPUT AREA MOVB #32.,(R4)+ MOVB #8.,(R4)+ ; TST BSF ; TRANSLATE TO BS? BNE DELBS ; YES - BRANCH ; MOVB #177,(R5)+ ; PUT INTO MODEM OUTPUT AREA BR OUT1 ; GO PUT DATA OUT ; DELBS: MOVB #8.,(R5)+ ; PUT INTO MODEM OUTPUT AREA BR OUT1 ; GO PUT DATA OUT ; CKCR: CMPB R0,#13. ; INPUT? BNE STD1 ; NO - STANDARD CHARACTER ; MOVB #13.,(R4)+ ; PUT INTO TI: OUTPUT MOVB #10.,(R4)+ ; MOVB #13.,(R5)+ ; PUT INTO MODEM OUTPUT BR OUT1 ; GO PUT DATA OUT ; STD1: MOVB R0,(R4)+ ; WRITE CHAR OUT AS IS MOVB R0,(R5)+ ; OUT1: SUB #TO,R4 ; MAKE R4 LENGTH OF TI: OUTPUT SUB #MO,R5 ; MAKE R5 LENGTH OF MODEM OUTPUT ; TST FDX ; OPERATING IN FDX? BNE MOUT ; YES - DON'T ECHO CHARACTER ; QIOW$S #IO.WAL,#1,#1,,,,<#TO,R4> ; WRITE TI: OUTPUT ; MOUT: QIOW$S #IO.WAL,#2,#1,,,,<#MO,R5> ; WRITE MODEM OUTPUT ; JMP EXIT ; AST EXIT ; ;------------------------------------------------------------------------------ ; ; CHARACTER RECEIVED FROM MODEM. FOR THE MOST PART, PASS IT AS IS. ; ; SPECIAL CASES ARE: ; ; IS RECEIVED: ; TI: <- ; ; OR IS RECEIVED: ; TI: <- '>' ; TWO: MOVB (SP),R0 ; GET INPUT CHARACTER ; MOV #TO,R4 ; POINTER TO TI: OUTPUT AREA ; CMPB R0,#19. ; CONTROL-S? BEQ EXIT ; YES, SKIP IT ; CMPB R0,#7 ; BELL? BNE 1$ ; NO, CONTINUE ; MOVB #'>,(R4)+ ; OUTPUT PROMPT BR OUT2 ; OUTPUT DATA ; 1$: CMPB R0,#8. ; RECEIVED? BNE STD2 ; NO - BRANCH ; MOVB #8.,(R4)+ ; MOVE TO OUTPUT AREA MOVB #32.,(R4)+ MOVB #8.,(R4)+ ; BR OUT2 ; GO OUTPUT DATA ; STD2: MOVB R0,(R4)+ ; MOVE INPUT TO OUTPUT AREA ; OUT2: SUB #TO,R4 ; MAKE R4 INTO LENGTH OF TI: OUTPUT ; QIOW$S #IO.WAL,#1,#1,,,,<#TO,R4> ; WRITE TI: OUTPUT ; BR EXIT ; EXIT AST ; ;------------------------------------------------------------------------------ ; ; AST EXIT ; EXIT: TST (SP)+ ; POP STACK ASTX$S ; AST EXIT ; ;------------------------------------------------------------------------------ ; ; TALK SESSION TERMINATE ROUTINE ( WAS ENTERED BY TI:) ; QUIT: QIOW$C IO.WVB,1,1,,,, ;PRINT TERMINATE MSG TO TI: ; QIOW$C IO.DET,1,1 ; DETACH TERMINAL QIOW$C IO.DET,2,1 ; DETACH MODEM ; QIOW$C SF.SMC,2,1,,,, ; NOW SET MODEM TO /NORPA ; JMP CMDL ; GO GET NEXT COMMAND LINE ; ;------------------------------------------------------------------------------ ; ; AST ROUTINE FOR MARKTIME ; ATF: QIOW$C IO.WAL,1,1,,,, ; BUSY TERMINAL MESSAGE QIOW$C SF.SMC,2,1,,,, ; NOW SET MODEM TO /NORPA EXIT$S ; EXIT ; .END CALL