home *** CD-ROM | disk | FTP | other *** search
- ;
- ; MCQXS798.ASM
- ;
- ; Patches for overlaying distribution version of MODEM798
- ;to work with EPSON QX-10 computer and DC Hayes Smartmodem 1200.
- ;
- ;You will want to look this file over carefully, there are a number
- ;of options that you can use to configure MODEM798 to suit your taste.
- ;
- ;After you have finished editing this file use DDT to overlay the HEX
- ;file onto MODEM798 and SAVE 64 MODEM798.COM.
- ;
- ;All users should set CLOCK to the right value for their system.
- ;
- ;PMMI users should set PUSERATE and CLDBOOT to their proper values.
- ;
- ;Non-PMMI, non-QX-10 users who want to get MODEM798 working quickly
- ;and who do not need to set their modem parameters using this program
- ;should change VERMSG, INIT, SETUP, CLEAR and PMMI to FALSE and
- ;change the equates for MODDATP, MODCTLP, MODSNDB, MODSNDR, MODRCVB
- ;and MODRCVR before assembly.
- ;
- ;
- ; TO USE: First edit this file filling in answers for your own
- ; equipment. Then assemble with ASM.COM or equivalent
- ; assembler. Then use DDT to overlay the the results
- ; of this program to the original MODEM798.COM file:
- ;
- ; A>DDT MODEM798.COM
- ; DDT VERS 2.2
- ; NEXT PC
- ; 4080 0100
- ; -IMCQXS798.HEX (note the "I" command)
- ; -R (loads in the .HEX file)
- ; NEXT PC
- ; 4080 0000
- ; -G0 (return to CP/M)
- ; A>SAVE 64 MODEM798.COM (now have modified .COM file)
- ;
- ;12/31/82 - Fixed "illegal FCB" bug when batch mode and smart-
- ; modem commands are used together. ;BRR
- ;
- ;12/27/82 - Added additional command-line baud rates. ;BRR
- ;
- ;12/26/82 - Modified to allow baud rate on SET command line ;BRR
- ; Also added smartmodem command logic.
- ;
- ;12/24/82 - Modified to work with version 7.97 of MODEM7 ;BRR
- ;
- ;12/20/82 - Modified to work with version 7.96 of MODEM7 ;B. RATOFF
- ;
- ;12/08/82 - Modified to work with version 7.95 of MODEM7 ;G. KANTOR
- ;
- ;11/26/82 - Modified to work with version 7.94 of MODEM7 ;PLK
- ;
- ;11/19/82 - Modified to work with version 7.92 of MODEM7 ;PLK
- ;
- ;11/02/82 - Modified to work with version 7.90 of MODEM7.
- ; Included "how to use" instructions at start of file. ;IMH
- ;
- ;10/20/82 - Modified to work with version 7.89 of MODEM7. ;IMH
- ;
- ;10/16/82 - Modified to work with version 7.71 of MODEM7. ;PLK
- ;
- ;10/15/82 - Fixed lack of ENDIF after IF VERMSG AND (NOT PMMI) ;PLK
- ;
- ;10/12/82 - Modified to give version message. ;PLK
- ;
- ;10/09/82 - Modified to work with version 7.70 of MODEM7. ;PLK
- ;
- ;10/04/82 - Fixed so can also be easily used for making optional
- ; changes with PMMI modem. ;PLK
- ;
- ;10/03/82 - First version of this file. ;PLK
- ;
- TRUE EQU 0FFH
- FALSE EQU 0
- ;
- BELL EQU 07H ;bell
- CR EQU 0DH ;carriage return
- LF EQU 0AH ;linefeed
- ESC EQU 1BH ;escape
- ;
- VERMSG EQU true ;change to TRUE if you have given at
- ;location SYSVERMSG the name of the
- ;system for which MODEM7 has been
- ;configured.
- ;
- INIT EQU TRUE ;change to TRUE if you have written a
- ;routine at location INITMOD in this
- ;file to initialize your modem port
- ;on MODEM7 execution. PMMI users should
- ;use FALSE here.
- ;
- SETUP EQU TRUE ;change to TRUE if you have written a
- ;routine at location SETUPR to change
- ;baud rate, etc and MSPEED. PMMI users
- ;should use FALSE here.
- ;
- EOSCLR EQU TRUE ;change to TRUE if you have defined the
- ;clear to end of screen sequence for
- ;your terminal. Clear to end of screen is
- ;used on returning from terminal mode to
- ;keep the screen from becoming jumbled if
- ;the remote can position your cursor.
- ;
- SCRNCLR EQU true ;change to TRUE if you have defined the
- ;home cursor and clear screen sequence
- ;for you terminal.
-
- PMMI EQU FALSE ;change to TRUE for PMMI.
- ;
- IF NOT PMMI
- ;THE FOLLOWING MUST BE CHANGED FOR YOUR MICRO IF YOU DON'T HAVE AN EPSON
- ;QX-10 OR A PMMI MODEM BOARD.
- MODDATP EQU 011H ;data port for QX-10
- MODCTLP EQU MODDATP+2 ;modem status port for QX-10
- MODSNDB EQU 04H ;bit to test for ready to send
- MODSNDR EQU MODSNDB ;change to 0 if bit is 0 when
- ;ready to send
- MODRCVB EQU 1 ;bit to test for received data
- MODRCVR EQU MODRCVB ;change to 0 if bit is 0 when
- ;data received
- ENDIF ;NOT PMMI
- ;
- ;CHANGE CLR1, CLR2, CLR3, AND CLR4 TO THE APPROPRIATE VALUES FOR
- ;YOUR TERMINAL IF YOU DO NOT HAVE AN EPSON QX-10 AND EOSCLR IS TRUE.
- IF EOSCLR
- CLR1 EQU 1BH ;QX-10 Zapple clear to end
- CLR2 EQU 'Y' ;of screen sequence
- CLR3 EQU 0 ;the unused bytes MUST be 0
- CLR4 EQU 0
- ENDIF ;EOSCLR
- ;
- ;CHANGE SCLR1, SCLR2, SCLR3, AND SCLR4 TO THE APPROPRIATE VALUES FOR
- ;YOUR TERMINAL IF YOU DO NOT HAVE AN EPSON QX-10 AND SCRNCLR IS TRUE.
- IF SCRNCLR
- SCLR1 EQU 1ah ;EPSON QX-10 home cursor
- SCLR2 EQU 0 ;and clear screen sequence
- SCLR3 EQU 0 ;the unused bytes MUST be 0
- SCLR4 EQU 0
- ENDIF ;SCRNCLR
- ;
- ;IF YOU HAVE A PMMI YOU MAY NEED TO CHANGE THE BASE ADDRESS.
- ;ALSO, CHANGE PORT NUMBER IN THE PMMI MESSAGE BELOW SYSVERMSG.
- IF PMMI
- PORT EQU 0C0H ;PMMI BASE ADDRESS
- MODCTLP EQU PORT ;MODEM CONTROL PORT
- MODDATP EQU PORT+1 ;MODEM DATA PORT
- BAUDRP EQU PORT+2 ;BAUD RATE PORT
- MODCTL2 EQU PORT+3 ;2ND MODEM CONTROL PORT
- ENDIF ;PMMI
- ;
- ;
- ;CLOCK SHOULD BE CHANGED TO SUIT YOUR SYSTEM.
- ;PMMI USERS SHOULD ALSO CHANGE PULSERATE AND CLDBOOT AS NECESSARY.
- ;
- ;You can change locations 107H to 120H, and 123H to 125H
- ;to suit your taste.
- ;
- ;*** WARNING - DO NOT INSERT OR DELETE LINES BEFORE SYSVERMSG: ***
- ; THE DEFINED LOCATIONS ARE GIVEN ON THE RIGHT MARGIN.
- ;
- ;
- ORG 100H
- ;
- DS 3 ;(for JMP START)
- PMMIBYTE: DB PMMI ;don't change this line 103H
- SETUPTST: DB SETUP ;don't change this line 104H
- SCRNTEST: DB SCRNCLR ;test for home cursor and clear screen 105H
- ;routine at CLRSCRN, don't change this
- CLOCK: DB 4 ;clock rate in MHz, 8 MHz maximum 106H
- BAKUPBYTE: DB TRUE ;true=make .BAK file 107H
- CKSUMDFLT: DB TRUE ;true=default to Checksum checking 108H
- ;false=default to CRC checking
- TOGGLECRC: DB TRUE ;true=allow toggling of Checksum to CRC 109H
- CONVBKSP: DB FALSE ;true=convert backspace to rub 10AH
- TOGGLEBK: DB TRUE ;true=allow toggling of bksp to rub 10BH
- ADDLF: DB FALSE ;true=add LF after CR 10CH
- TOGGLELF: DB TRUE ;true=allow toggling of LF after CR 10DH
- TRANLOGON: DB TRUE ;true=allow transmission of logon 10EH
- ;write logon sequence at location LOGON
- SAVCCP: DB TRUE ;true=do not overwrite CCP 10FH
- LOCONEXTCHR: DB FALSE ;true=local command if EXTCHR precedes 110H
- ;false=not local command if EXTCHR precedes
- TOGGLELOC: DB TRUE ;true=allow toggling of LOCONEXTCHR 111H
- LSTTST: DB TRUE ;true=allow toggling of printer on/off 112H
- ;in terminal mode, set to false if your
- ;printer can't keep up with the modem
- XOFFTST: DB true ;true=allow testing of XOFF from remote 113H
- ;while transmitting a file in terminal mode
- XONWAIT: DB FALSE ;true=wait for XON after sending CR 114H
- ;while transmitting a file in terminal mode
- TOGXOFF: DB TRUE ;true=allow toggling of XOFF testing 115H
- MSPEED: DB 5 ;0=110 1=300 2=450 3=600 4=710 5=1200 116H
- ;6=2400 7=4800 8=9600
- ;default modem speed, PMMI routines
- ;reset this value and so should your own
- ;modem routines
- BYTDLY: DB 0 ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec 117H
- ;default time to send character in
- ;terminal mode file transfer
- CRDLY: DB 0 ;0=0 delay, 1=0.08 sec, -- ,9=0.72 sec 118H
- ;default time for extra wait after CR
- ;in terminal mode file transfer
- BELRPT: DB 30 ;bell repeat time = value*0.03 sec 119H
- EXITCHR: DB 'E'-40H ; ^E = Exit without disconnect 11AH
- LOGCHR: DB 'O'-40H ; ^O = Send logon 11BH
- LSTCHR: DB 'P'-40H ; ^P = Toggle printer 11CH
- UNSAVE: DB 'W'-40H ; ^W = Close input text buffer 11DH
- TRANCHR: DB 'T'-40H ; ^T = Transmit file to remote 11EH
- SAVECHR: DB 'Y'-40H ; ^Y = Open input text buffer 11FH
- EXTCHR: DB '^'-40H ; ^^ = Send next character 120H
- ;
- ;Equates used only by PMMI routines grouped together here.
- PULSERATE: DB 125 ;125 for 20pps, 250 for 10pps on PMMI 121H
- ;not used if PMMI FALSE
- CLDBOOT: DW 00000H ;currently set to warm boot with 122H
- ;BYE routine for PMMI, put your cold
- ;boot entry here if you have one and
- ;desire to do on BYE
- BRKCHR: DB '@'-40H ; ^@ = Transmit "BREAK" with PMMI 124H
- CHGBAUD: DB 'B'-40H ; ^B = Used with PMMI in terminal 125H
- ; mode to change baud rate on fly
- DISCCHR: DB 'D'-40H ; ^D = PMMI Disconnect 126H
- ;
- IN$MODCTLP: IN MODCTLP ! RET ;in modem control port 127H
- OUT$MODDATP: OUT MODDATP ! RET ;out modem data port 12AH
- IN$MODDATP: IN MODDATP ! RET ;in modem data port 12DH
- ;
- IF NOT PMMI
- ANI$MODSNDB: ANI MODSNDB ! RET ;bit to test for send ready 130H
- CPI$MODSNDR: CPI MODSNDR ! RET ;value of send bit when ready 133H
- ANI$MODRCVB: ANI MODRCVB ! RET ;bit to test for receive ready 136H
- CPI$MODRCVR: CPI MODRCVR ! RET ;value of rcv. bit when ready 139H
- DS 15 ;PMMI only calls 13CH
- LOGONPTR: DW LOGON ; 14BH
- JMP$INITMOD: JMP INITMOD ;go to user written routine 14DH
- ENDIF ;NOT PMMI
- ;
- IF PMMI
- DS 12 ;not changed 130H
- IN$BAUDRP: IN BAUDRP ! RET ;in baudrate port 13CH
- OUT$BAUDRP: OUT BAUDRP ! RET ;out baudrate port 13FH
- OUT$MODCTL2: OUT MODCTL2 ! RET ;out modem control port #2 142H
- OUT$MODCTLP: OUT MODCTLP ;out modem control port 145H
- DS 9 ;not changed 147H
- ENDIF ;PMMI
- ;
- JMP$SETUPR: ; 150H
- ;
- IF SETUP
- JMP SETUPR
- ENDIF ;SETUP
- ;
- IF NOT SETUP
- RET
- NOP
- NOP
- ENDIF ;NOT SETUP
- ;
- CLREOS: CALL JMP$ILPRT ; 153H
- ;
- IF EOSCLR
- DB CLR1,CLR2,CLR3,CLR4,0
- ENDIF ;EOSCLR
- ;
- IF NOT EOSCLR
- DB 0,0,0,0,0
- ENDIF ;NOT EOSCLR
- ;
- RET
- ;
- CLRSCRN: CALL JMP$ILPRT ; 15CH
- ;
- IF SCRNCLR
- DB SCLR1,SCLR2,SCLR3,SCLR4,0
- ENDIF ;SCRNCLR
- ;
- IF NOT SCRNCLR
- DB 0,0,0,0,0
- ENDIF ;NOT SCRNCLR
- ;
- RET
- ;
- JMP$ILPRT: DS 3 ; 165H
- JMP$ILCOMP: DS 3 ; 168H
- JMP$INBUFF: DS 3 ; 16BH
- JMP$SYSVERMSG:
- IF PMMI
- DS 3 ; 16EH
- ELSE
- JMP SYSVERMSG ; 16EH
- ENDIF
- JMP$DIALPL: DS 3 ; 171H
- JMP$DISCONNT: DS 3 ; 174H
- ;
- SYSVERMSG: ; 16EH
- ;
- IF (NOT VERMSG) AND (NOT PMMI)
- CALL JMP$ILPRT
- DB 'Version for: UNSPECIFIED SYSTEM',CR,LF,0
- ;NOTE: 0 MUST BE AT END OF ALL ILPRT MESSAGES
- RET
- ENDIF ;NOT VERMSG AND NOT PMMI
- ;
- ;This is where the message goes giving the system for
- ;which MODEM7 has been customized.
- IF VERMSG AND (NOT PMMI)
- LXI D,0CCCCH ;Take opportunity to force
- MVI C,12 ;TPM into CP/M 2.2 compatibility mode
- CALL 5
- CALL SETMSPEED ;Adjust MSPEED for QX-10 CMOS value
- CALL JMP$ILPRT
- DB 'Version for: EPSON QX-10 and Hayes Smartmodem 1200',CR,LF,0
- RET
- ENDIF ;VERMSG AND NOT PMMI
- ;
- ;
- IF NOT PMMI
- ;INSERT YOUR LOGON HERE, MUST END IN 0.
- ;FOR A LOGON, PMMI USERS MUST MODIFY MODEM798.ASM
- LOGON:
- DB '+++' ; ATTENTION STRING FOR SMARTMODEM
- DB 0
- ENDIF ;NOT PMMI
- ;
- IF (NOT INIT) AND (NOT PMMI)
- INITMOD:
- RET
- ENDIF ;NOT INIT AND NOT PMMI
- ;
- ;*** WARNING - IF YOU MAKE INITMOD AND SETUPR TOO LONG YOU MAY ***
- ;*** GO BEYOND THE LENGTH OF THE PMMI INITMOD ROUTINE. ***
- ;*** YOU CAN MODIFY UP TO THE BYTE BEFORE NUMBLIB: ***
- ;*** NUMBLIB CURRENTLY IS AT 617H. ***
- ;*** IF YOU NEED MORE SPACE USE AN APPROPRIATE DS BEFORE NUMBLIB: ***
- ;
- TPORTS EQU 7 ; TIMER SETUP PORT
- TPORTC EQU 6 ; TIMER COUNTER PORT
- ;
- CRAM EQU 35 ; CMOS RAM BAUD RATE STORAGE
- MOSADR EQU 3DH ; CMOS RAM ADDRESS PORT
- MOSDAT EQU 3CH ; CMOS RAM DATA PORT
- ;
- DSBCD MACRO
- DB 0EDH,52H
- ENDM
- ;
- ;
- ; MAKE MODEM'S SPEED FLAG MATCH QX-10'S
- SETMSPEED:
- MVI A,CRAM
- OUT MOSADR
- IN MOSDAT
- ANI 0FH
- LXI H,MSPDTBL
- ADD L
- MOV L,A
- JNC SETMSPD2
- INR H
- SETMSPD2:
- MOV A,M
- STA MSPEED
- RET
- ;
- ;
- ; THIS TABLE GIVES MSPEED VALUES FOR QX-10 CMOS BAUD RATE VALUES
- ; NOTE THAT LOWER RATES DO NOT MATCH AND APPROXIMATIONS ARE USED
- MSPDTBL:
- DB 0,0,0,1,3,5,6,7,8
- ;
- ; THIS TABLE GIVES THE TIMER CHIP DIVISORS FOR EACH BAUD RATE
- CSPDTBL:
- DW 110,1135 ; 0
- DW 135,924 ; 1
- DW 150,832 ; 2
- DW 300,416 ; 3
- DW 600,208 ; 4
- DW 1200,104 ; 5
- DW 2400,52 ; 6
- DW 4800,26 ; 7
- DW 9600,13 ; 8
- ;
- ;
- ;
- ;The following routine changes the baud rate for the QX-10 from
- ;the MENU. Write your own routine here to change your modem
- ;parameters from the menu.
- ;
- ;
- IF SETUP OR INIT
- ;
- SETUPR:
- LDAX D ;Look at passed-in byte count
- CPI 5 ;Enuf for possible baud rate?
- JC AGAIN ;No, prompt for one
- MOV B,A ;Save byte count
- INX D ;Point to first byte
- CALL NXTARG ;Skip to next argument
- MOV A,B
- JNC SETUP1
- AGAIN: CALL JMP$ILPRT
- DB 'Input Baud Rate: ',0
- LXI D,KEYBUF
- CALL JMP$INBUFF ;read baud rate from console
- LXI D,KEYBUF+1
- LDAX D
- INX D
- SETUP1:
- MOV L,A ;Force null at end of buffer
- MVI H,0
- DAD D
- MVI M,0
- LXI H,0
- GDLUP:
- LDAX D
- ORA A
- JZ GDONE
- SUI '0'
- JC BADRATE
- CPI 10
- JNC BADRATE
- MOV B,H
- MOV C,L
- DAD H
- DAD H
- DAD B
- DAD H
- MVI B,0
- MOV C,A
- DAD B
- INX D
- JMP GDLUP
- BADRATE:
- CALL JMP$ILPRT
- DB CR,LF,'++ Invalid baud rate -- try again ++',CR,LF,0
- JMP AGAIN
- GDONE:
- MOV A,H
- ORA L
- JZ QUIT
- ;
- ; ENTER HERE WITH BAUD RATE IN HL TO SET BAUD RATE FROM INITMOD
- ;
- FINDRATE:
- PUSH H
- LXI H,CSPDTBL
- SHLD TBLADR
- POP H
- LXI B,900H
- CLP:
- PUSH H
- LHLD TBLADR
- MOV E,M
- INX H
- MOV D,M
- INX H
- XTHL
- XCHG
- ORA A
- DSBCD
- XCHG
- XTHL
- JZ DOIT
- INX H
- INX H
- SHLD TBLADR
- POP H
- INR C
- DCR B
- JNZ CLP
- JMP BADRATE
- ;
- DOIT:
- POP D
- MVI A,0B6H
- OUT TPORTS
- MOV A,M
- INX H
- OUT TPORTC
- MOV A,M
- OUT TPORTC
- CALL IN$MODDATP
- CALL IN$MODDATP
- MVI A,CRAM
- OUT MOSADR
- MOV A,C
- OUT MOSDAT
- QUIT:
- JMP SETMSPEED
- ;
- NXTARG:
- CALL SCNTOB
- RC
- SCNNB:
- LDAX D
- CPI ' '
- RNZ
- INX D
- DCR B
- JNZ SCNNB
- STC
- RET
- ;
- SCNTOB:
- LDAX D
- CPI ' '
- RZ
- RC
- INX D
- DCR B
- JNZ SCNTOB
- STC
- RET
- ;
- ;
- TBLADR: DW 0
- ;
- KEYBUF DB 5,0,0,0,0,0,0,0
- ;
- ENDIF ;SETUP OR INIT
- ;
- ;
- IF INIT
- INITMOD:
- LDAX D ; GET COMMAND BYTE COUNT
- MOV B,A
- INX D
- MOV L,A
- MVI H,0 ; FORCE CR AT END OF BUFFER
- DAD D
- MVI M,0DH
- ;
- PUSH D
- PUSH B
- LXI D,5CH+9 ; LOOK AT FIRST FILETYPE
- CALL JMP$ILCOMP ; CHECK FOR VALID BAUD RATE
- DB '110',0
- LXI H,110
- JNC GOTRATE
- CALL JMP$ILCOMP
- DB '300',0
- LXI H,300
- JNC GOTRATE
- CALL JMP$ILCOMP
- DB '600',0
- LXI H,600
- JNC GOTRATE
- CALL JMP$ILCOMP
- DB '120',0
- LXI H,1200
- JNC GOTRATE
- CALL JMP$ILCOMP
- DB '240',0
- LXI H,2400
- JNC GOTRATE
- CALL JMP$ILCOMP
- DB '480',0
- LXI H,4800
- JNC GOTRATE
- CALL JMP$ILCOMP
- DB '960',0
- LXI H,9600
- JC NORATE
- GOTRATE:
- CALL FINDRATE
- NORATE:
- POP B ; RESTORE COMMAND LINE BYTE COUNT
- POP D ; RESTORE COMMAND LINE TEXT POINTER
- SCNBSL:
- LDAX D ; LOOK AT FIRST CHAR OF ARG
- CPI '\' ; BACKSLASH?
- JZ GOTBSL
- CALL NXTARG
- JNC SCNBSL
- RET
- GOTBSL:
- MVI A,0DH ; MAKE STUFF AFTER \ DISAPPEAR
- STAX D ; SO MFACCESS ISN'T CONFUSED
- INX D
- LXI H,6CH+1 ; POINT TO 2ND FCB
- MOV A,M
- CPI '\' ; DID WE WIND IN 2ND FILENAME?
- JNZ BSLOK ; NO, SKIP AHEAD
- DCX H
- MVI M,0 ; ZAP DRIVE OF 2ND FCB
- MVI B,11
- ZFL1:
- INX H
- MVI M,' '
- DCR B
- JNZ ZFL1
- MVI B,4
- ZFL2:
- INX H
- MVI M,0
- DCR B
- JNZ ZFL2
- BSLOK:
- CALL MIN ; EMPTY GARBAGE CHARS FROM MODEM
- JNC BSLOK ; LOOP TILL TIMEOUT
- LXI H,ATS ; SEND INITIAL STRING TO MODEM
- CALL SEND
- CALL GET ; LOOK FOR REPLY
- TIM:
- JC TIMOT ; WE MIGHT HAVE TIMED OUT
- JNZ ERR
- LXI H,AT ; GET ATTENTION STRING
- CALL SEND ; SEND IT
- XCHG ; NOW SEND OUR COMMAND
- CALL SEND
- MVI C,CR ; END IT WITH RETURN
- CALL PUT
- CALL MIN ; READ THE ECHOED CR
- CALL GETX ; GET RESULT (NO TIMEOUT)
- JNZ ERR
- CPI '1' ; ON LINE?
- JZ ONLIN
- CPI '5' ; ON LINE 1200?
- JZ ONLIN
- CPI '0' ; OTHER NORMAL RESULT?
- RZ ; YUP, QUIT
- PUSH PSW ; SAVE STATUS
- LXI H,ATV1
- CALL SEND ; RESTORE VERBOSE MODE
- POP PSW
- CPI '3'
- JZ CAR ; NO CARRIER ?
- CPI '4'
- JZ BAD ; BAD COMMAND?
- ERR:
- CALL JMP$ILPRT
- DB CR,LF,'Bad response from DC Hayes.',0
- RET
- GET:
- CALL MIN ; READ WITH TIMEOUT
- RC
- MOV C,A ; SAVE CHAR
- CALL MIN
- RC
- CPI CR ; 2ND SHOULD BE CR
- MOV A,C
- RET
- GETX:
- CALL MINX ; READ W/O TIMEOUT FOR RESULT
- MOV C,A ; COULD TAKE A WHILE FOR DIALING, ETC.
- CALL MINX ; GET FOLLOWING CR
- CPI CR
- MOV A,C
- RET
- MINX:
- CALL MRCVRDY ; CHECK FOR A CHAR
- JZ MXGOT ; JUMP IF WE GOT ONE
- PUSH B
- PUSH D
- PUSH H
- MVI C,11 ; DO ABORT CHECK
- CALL 5
- ORA A
- JZ NO ; SKIP IF NO KEY STRUCK
- MVI C,1
- CALL 5 ; GOT KEY -- EAT IT
- CALL PUT ; SEND IT TO MODEM (WILL CAUSE ABORT)
- NO:
- POP H
- POP D
- POP B
- JMP MINX
- GOT:
- POP D
- MXGOT:
- CALL IN$MODDATP
- ANI 7FH
- RET
- MIN:
- PUSH D
- LXI D,16000 ;SET A TIMEOUT
- WTST:
- CALL MRCVRDY ;CHECK FOR READY
- JZ GOT ;EXIT WITH CHARACTER
- DCX D
- MOV A,D ;COUNT DOWN TIMEOUT
- ORA E
- JNZ WTST
- STC
- POP D ;QUIT WITH TIMEOUT
- RET
- ;
- MRCVRDY: ; TEST FOR MODEM RECEIVE READY
- CALL IN$MODCTLP
- CALL ANI$MODRCVB
- CALL CPI$MODRCVR
- RET
- ;
- SEND:
- MOV A,M ;GET A CHARACTER
- INX H
- ORA A ;END OF THE STRING?
- RZ
- CPI 0DH
- RZ
- ANI 7FH
- MOV C,A ;NO, SEND IT
- CALL PUT
- CALL MIN ;EAT ECHO
- JNC SEND
- POP H ;DITCH RETURN
- JMP TIMOT ;GO COMPLAIN
- PUT:
- CALL IN$MODCTLP ;GET MODEM STATUS
- CALL ANI$MODSNDB ;TEST SEND BITS
- CALL CPI$MODSNDR
- JNZ PUT
- MOV A,C
- JMP OUT$MODDATP
- ;
- TIMOT:
- CALL JMP$ILPRT
- DB CR,LF,'No response from DC Hayes.',0
- RET
- ONLIN:
- CALL JMP$ILPRT
- DB CR,LF,'On line.',0
- RET
- CAR:
- CALL JMP$ILPRT
- DB CR,LF,'No carrier detected.',0
- RET
- BAD:
- CALL JMP$ILPRT
- DB CR,LF,'Bad command.',0
- RET
- ;
- AT:
- DB 'AT ',0
- ATV1:
- DB 'AT V1',CR+80H,0
- ATS:
- DB 'AT S10=30 V0 X1 ',CR+80H,0
- ;
- ENDIF ;INIT
- ;
- END
-