home *** CD-ROM | disk | FTP | other *** search
- ;*****************************************************************
- ;
- ; MBYE (Modular 'BYE')
- ; D. C. Hayes MicroModem ][ modem I/O routines
- ; v1.0 (02/07/84) by Kim Levitt
- ;
- ; These routines will allow the easy patching of MBYE for any type of
- ; modem/serial port combination. Certain routines must return status
- ; flags, so please be careful to set the flags as directed.
- ;
- ; This version is for the Apple ][ running with a MicroModem ][ card.
- ; It seems to work on those Apples that even APBYE barfed on. The prob-
- ; lem was in the Carrier Detect routine, because the Microsoft Z80 card
- ; screws up on a double strobe type of I/O that they tried to use. Any-
- ; way, that means the Answer Phone routine is a crock, but the thing
- ; works...
- ;
- ; For the Apple, you should set BYELOW to YES. (??)
- ;
- ;-----------------------------------------------------------------------
- ;
- ; 02/07/84 Altered and renamed to work with MBYE - Kim Levitt
- ; 11/27/83 Altered and renamed to work with BYE3 - Irv Hoff
- ; 08/04/83 Updated for use with ByeII version 1.6 - Paul Traina
- ; 04/16/83 General code cleanup and optimization. - Paul Traina
- ; 03/09/83 Fixed a missing '$+OFFSET' in MDANSW
- ; routine, also improved the "flip" logic
- ; needed for checking carrier and ring. - Paul Traina
- ; 10/04/82 Routines added, no fuss, mess, or frills. - Paul Traina
- ;
- ;-----------------------------------------------------------------------
- ;
- ; The following define the slot address to use.
- ;
- BASE: EQU 0E0A6H ;This is the status port location
- ; ;for slot #2
- ;
- ;***********************************************************************
- ;
- ; MMII Modem address equates
- ;
- SPORT: EQU BASE ;Control/status port
- DPORT: EQU BASE+1 ;Data port
- RPORT: EQU BASE-1 ;Baud rate/modem status port
- CPORT: EQU BASE-1 ;Modem control port
- ;
- ; Switch hook and modem commands, output to SPORT
- ;
- BYE: EQU 0 ;on hook or dial-break
- ORIG: EQU 8EH ;off hook originate
- ANSW: EQU 8AH ;off hook answer
- TSB: EQU 8 ;2 stop bits
- NORM: EQU 15H ;8 bits, no parity, 1 stop bit
- F110: EQU 11H ;same w/2 stop bits
- ;
- ; Modem status input
- ;
- RDET: EQU 80H ;ring detect
- CTS: EQU 4 ;carrier detect
- TBMT: EQU 2 ;xmit buffer empty
- DAV: EQU 1 ;data available
- ;
- ; Baud rate divisors
- ;
- B110: EQU 0 ;110 bps
- B300: EQU 1 ;300 bps
- ;
- ;
- ;***********************************************************************
- ;
- ; If any of your routines zaps anything other than the Accumulator, then
- ; you must preserve all other registers.
- ;
- ;***********************************************************************
- ;
- ; This routine should turn off everything on the modem, hang up the
- ; phone, and get it ready to wait for a ring.
- ;
- MDINIT: XRA A
- STA CPORT ;Hang up phone
- STA SPORT ;Turn of Xmit/Recv
- RET
- ;
- ; The following is a routine to determine if there is a character wait-
- ; ing to be received. If none are there, the Zero flag will be set,
- ; otherwise, 255 will be returned in register A. Remember that the
- ; system will like you a little more if you also mask out framing,
- ; parity, and overrun errors.
- ;
- MDINST: LDA SPORT ;Get modem status
- ANI DAV ;Data available?
- RZ ;nope
- ORI 0FFH ;return true
- RET
- ;
- ; The following is a routine to determine if the transmit buffer is
- ; empty. If it is empty, it will return with the Zero flag clear. If
- ; the transmitter is busy, then it will return with the Zero flag set.
- ;
- MDOUTST:LDA SPORT ;Get modem status
- ANI TBMT ;mask out junk
- RET
- ;
- ; The following is a routine that will check to make sure we still have
- ; carrier. If there is no carrier it will return with the Zero flag set.
- ;
- MDCARCK:LDA RPORT ;The Z80 interface likes this dummy load...
- LDA SPORT ;Get modem status
- CMA ;flip/flop the Zero flag
- ANI CTS ;got a carrier?
- RET
- ;
- ; The following routine will check to see if the phone is ringing, if it
- ; isn't, it will return with Zero set, otherwise Zero will be cleared.
- ;
- MDRING: LDA RPORT ;get ring port status
- CMA ;flip/flop the proper bit
- ANI RDET ;ringing?
- RET
- ;
- ; The following is a routine that will input one character from the
- ; modem port. If there is nothing there, it will return garbage... so
- ; use the MDINST routine first.
- ;
- MDINP: LDA DPORT ;get character
- ANI 7FH ;strip parity and other garbage
- RET
- ;
- ; The following is a routine that will output one character in register
- ; A to the modem. REMEMBER, that is register A, not register C.
- ;
- ; **** Use MDOUTST first to see if buffer is empty ****
- ;
- MDOUTP: STA DPORT ;send character
- RET
- ;
- ; The following routine will make the modem answer the phone. It should
- ; set baudrate to 300 baud.
- ;
- MDANSW: MVI A,ANSW ;Answer phone
- STA CPORT
- PUSH D ;save register pair DE
- MVI E,20 ;Wait for modem to turn on
- ;
- ALOP1: CALL DELAY
- DCR E
- JNZ ALOP1
- POP D ;restore registers
- CALL SET300
- PUSH B ;here is the crock I was telling you
- MVI B,30 ; about, I was beating my head for two
- ;
- ALOOP: CALL DELAY ; days trying to figure out why the
- LDA RPORT ; carrier detect routine was not work-
- LDA SPORT ; ing - it turns out this corck here
- LDA DPORT ; will get the modem to work properly.
- LDA DPORT
- DCR B
- JNZ ALOOP
- POP B
- RET
- ;
- ; These next routines set the proper baud rates for the modem. If you
- ; do not support the particular rate, then simply put in a JMP to SETINV.
- ; If the baud rate change was successful, make SURE the Zero flag is set.
- ;
- ; The following routine returns a 255 because we were not able to set to
- ; the proper baud rate because either the serial port or the modem can't
- ; handle it.
- ;
- SET110: ;110 bps too slow to support
- SET450: ;450 bps not supported
- SET600: ;600 bps not supported
- SET710: ;710 bps not supported
- SET1200 ;1200 bps not supported
- ;
- SETINV: ORI 0FFH ;make sure the Zero flag isn't set
- RET
- ;
- ; Set speed to 110 baud.
- ;
- SET110: MVI A,B110+ANSW
- STA CPORT ;Set 110 bps
- MVI A,F110
- STA SPORT ;Set 8 bits, no parity, 2 stop bits
- RET
- ;
- ; Set up for 300 bps
- ;
- SET300: MVI A,B300+ANSW
- STA CPORT ;Set 300 bps
- MVI A,NORM
- STA SPORT ;Set 8 bits, no parity, 1 stop bit
- RET
- ;
- ; Ok, that's all of the modem dependent routines that MBYE uses, so if
- ; you patch this file into your copy of MBYE, then it should work out
- ; well.
- ;
- ;**********************************************************************
- ;