;MODEM CONTROL PROGRAM BY DALE HEATHERINGTON ; 4/4/77 ; ENTERED BY R.J.S. 01/01/78 ; ; MODIFIED BY DAVE JAFFE ; FOR: BDOS CALLS ; RETURN TO CP/M ON CONTROL C ; MODS FOR J A STARK SYSTEM (Switch port & User I/O ) ; 4/13/79 -4/24/79 ;Further mods 5/20/79 - main loop ala Hayes vs Link ; Merge with link78 & eol to 00 4/15/79 ; MORE BY JAS 30-AUG-79 ; ; ON INPUT SYSTEMS EXPECT: ; ATS: CR,00,00,LF,CTL-Q,INPUT,CR ; CMS: CR,LF,CTL-S,'.',CTL-Q,INPUT,CR ; UNIX: CR,01,01,01,01,01,LF,INPUT,CR (EX IS DIFFERENT) ; ; ;MODEM CONTROL BYTES ORIG300 EQU 5 ;300 BPS ORIGINATE ANSW300 EQU 1 ;300 BPS ANSWER ORIG110 EQU 4 ;110 BPS ORIGINATE ANSW110 EQU 0 ;110 BPS ANSWER OFFHOOK EQU 80H ;OFF HOOK MASK ONHOOK EQU 7FH ;ON HOOK MASK TXE EQU 2 ;XMTR ON MASK TXOFF EQU 0FDH ;XMTR OFF MASK WORD EQU 1FH ;8 BITS, NO PARITY, 2 STOP BITS ; ;PORT ASSIGNMENTS ;Note the next 3 are repeated with different names ;in the LINK78 equates ; ; DATA EQU 80H ;MODEM DATA I/O PORT STAT EQU DATA+1 ;STATUS PORT MODE EQU DATA+2 ;MODE CONTROL PORT ; ; SYSTEM EQUATES BDOS EQU 5 TOM EQU 0C5H ;top of memory (page) for 56K CP/M ; ORG 100H ; This module from LINK78.ASM to lib & has equates ; 4/15/79 J A STARK ; LINK - SUPPORT COMMUNICATIONS LINK WITH CYBER ; ; L.E. HUGHES EDCAM JULY, 1977 ; mods by J A STARK Dec. 1978 for timesharing & HytypeII printer ;routines for CMS added 12/29/78 ; HYTYPE is now in ROM at F040H 4/15/79 ; BDOS ENTRY POINT AND FUNCTION CODES ;BDOS is EQU in DCHAYES.ASM OFFC EQU 15 ;OPEN FILE CFFC EQU 16 ;CLOSE FILE DFFC EQU 19 ;DELETE FILE RRFC EQU 20 ;READ RECORD WRFC EQU 21 ;WRITE RECORD MFFC EQU 22 ;MAKE FILE ROMPRT EQU 0F040H ;HYTYPE in ROM ; Input CHAR MUST BE IN C CRPOS EQU 0DE98H CRCNT EQU 0DE9AH BHB EQU 0DE9CH ; DEFAULT FCB AND FIELD DEFINITIONS FCB EQU 5CH FN EQU 1 ;FILE NAME FIELD (REL) FT EQU 9 ;FILE TYPE FIELD (REL) NR EQU 32 ;NEXT RECORD FIELD (REL) DBUF EQU 80H ;DEFAULT DISK BUFFER ADDRESS ; ASCII CONTROL CHARACTERS LF EQU 012Q ;LINE FEED CR EQU 015Q ;CARRIAGE RETURN DEL EQU 177Q ;DELETE ; I/O PORT ADDRESSES COND EQU 01H ;CONSOLE DATA PORT CONS EQU 000H ;CONSOLE STATUS PORT MODD EQU 80H ;MODEM DATA PORT MODS EQU 81H ;MODEM STATUS PORT ;CONT EQU 018H ;SIO CONTROL PORT FOR MODEM BRK EQU 09H ;hardware 240ms break function port ; STATUS PORT BIT DEFINITIONS MTBE EQU 02H ;TRANSMIT BUFFER READY FOR ANOTHER BYTE MRDA EQU 01H ;READ DATA AVAILABLE CTBE EQU 80H ;CONSOLE WRITE CRDA EQU 01H ;CONSOLE KEYBD ;console data ready low, modem high ;SENSE SWITCH 8 Port 9 IS USED FOR SPEED SELECT.UP IS 300 BAUD ;DOWN IS 110 BAUD. ; ;SENSE SWITCH 1 -At present Stark's switches are inverted ; UP WILL SUPRESS ECHO CHAR TO CONSOL ON DATA TRANSMISSION ;sens.sw. 2=1 supplies LF after CR. If =0 then waits for called system LF (usual case) ;sens.sw. 3=1 will block all CTL-CHAR in PCC subrout. ;Must be =0 for normal operation ;sens. sw. 4=1 for full duplex modem, =0 for half duplex ;(0= no char. echo back to calling system) ;SENS. SW. 5=1 FOR SAVE OF KEYBOARD INPUT TO MODEM. 0= NO SAVE OF KEYBOARD. ; START JMP SIGNON OUTPUT JMP USEROT ;JUMP TO USER OUT ROUTINE INPUT JMP USERIN ;JUMP TO USER IN ROUTINE INSTAT JMP USERST ;JUMP TO USER CONSOLE STATUS ;CHECK ROUTINE. RETURNS 'FF' ;IF A BYTE IS WAITING OR ; '00' IF NOT. ; ;THIS ROUTINE LOOPS UNTIL THE LINE RINGS OR A ;CONTROL B IS TYPED ON THE CONSOLE. ; SIGNON: LXI SP,STKTOP LXI H,SIGN ;POINT TO SIGNON MESSAGE CALL PRINTM MVI A,0 OUT STAT ;CLEAR MODEM REGISTER RINGCK: CALL INSTAT ;GET CONSOLE STATUS CNZ INPUT ;GET BYTE IF READY CPI 2 ;CHECK FOR "STX" OR CONTROL B JZ MAKCALL ;GOTO ORIG ROUTINE CPI 3 ;CONTROL C? JZ 0 ;BACK TO CP/M IN STAT ;GET MODEM STATUS ANI 80H ;ISOLATE RING DET. BIT JNZ RINGCK ;LOOP UNTIL IT GOES LOW ANCALL: CALL AN110 ;SET TO ANSWER MODE CALL OFFHK ;GO OFFHOOK LDA MDBYTE ;GET MODE ORI TXE STA MDBYTE OUT MODE ;TURN ON XMITTER LXI H,CALLIN ;Point to CALLIN MSG CALL PRINTM ;print it JMP CARR-3 ;JMP TO DATA HANDLING ROUTINE MAKCALL: LXI SP,STKTOP CALL OR110 ;SET TO ORIGINATE MODE LXI H,MNUM ;POINT TO STRING "NUMBER" CALL PRINTM ;PRINT THE STRING CALL DIAL ;GET AND DIAL A PHONE NUMBER LXI D,400 ;SETUP FOR A 20 SECOND DELAY CARR: CALL SPEED ;SET SPEED IN STAT ;LOOK FOR A CARRIER ANI 40H ;ISOLATE CARRIER BIT JNZ CONNECT ;JUMP IF TRUE CALL DELAY ;WAIT 50 MS DCX D ;COUNT IT MOV A,D ;TEST FOR D&E =0 ORA E JNZ CARR ;LOOP IF NOT TIMED OUT LXI H,NOASW ;POINT TO STRING "NO ANSWER" CALL PRINTM ;PRINT THE STRING JMP EOT ;DISCONNECT CONNECT: LDA MDBYTE ;GET MODE ORI TXE ;TURN ON XMTTR OUT MODE STA MDBYTE ANI 4 ;ISOLATE ORIG/ANSW BIT CZ SAB ;SEND ANSWER/BACK TTY: IN STAT ;GET MODEM STATUS ANI 40H ;ISOLATE CARRIER DETECT BIT JNZ OK ; LXI H,LOSTC ;POINT TO STRING "LOST CARRIER" CALL PRINTM ;PRINT THE STRING JMP EOT OK: CALL SPEED ;SET SPEED ;from lnk2.lib LINK2: XRA A ;CLEAR CHAR BUFFERS STA INCH STA OUTCH STA FLAG ;CLEAR TEXT SAVE FLAG LXI H,TBUF ;SET PTR TO TBUF SHLD PTR LXI H,0 ;SIZE = 0 SHLD SIZE CALL WCCR ;WRITE CR/LF TO CONSOLE lxi h,RDY call wcs CALL WCCR ;cr, lf ;Find out if calling (IBM) CMS, set flag LXI H,CMS ;send message CALL WCS CALL RCC ;get ans. from console CALL WCC ;echo CPI 'Y' JZ SETFLG CPI 'Y'+20H ;U/L case JZ SETFLG XRA A ;not cms, flg=0 STA CMSFLG ;is in data area CALL WCCR JMP LINK3 SETFLG: MVI A,1 ;is CMS, flg=1 STA CMSFLG CALL WCCR JMP LINK3 RDY: DB 'READY ',0 CMS: DB 13,10,10,' SENS. SW. 3=1 for block of CTL-CHAR in PCC subrout.',13,10 DB 'CMS ? Y/N ',0 SYS: DB 'SIGN ON ANOTHER SYSTEM ?',0 CALLIN: DB 13,10,'CALL COMING IN',13,10,0 SPDCAR: DB 80H ; MAIN LOOP LINK3: LXI H,SPDCAR ;point to count store DCR M ;each 256 passes check speed & carrier JNZ OK2 CALL SPEED IN STAT ANI 40H JNZ OK2 LXI H,LOSTC CALL PRINTM JMP EOT OK2: IN STAT ;get modem status ANI 1 ;check for data byte JZ C3 ;JUMP IF NO DATA GETC: IN DATA ;GET A MODEM BYTE ANI 7FH ;KILL PARITY CPI 4 ;CHECK FOR EOT JZ EOT1 ; JC OK2 ;SKIP IF