home *** CD-ROM | disk | FTP | other *** search
- ; B5C8-1E.INS - BYE5 insert for Commodore C128, external modem - 7/21/86
- ;
- ; Modifications by David Giunti, July 20, 1986
- ; change MDCARCK to correct the actual PORT check
- ; Note all the I/O in the C=128 is located in Bank 0, and can
- ; be read and written useing the Z80's IN and OUT with 16bit
- ; pointers.
- ;
- ; Added a CMA in the MDOUTST
- ;
- ; I'm still not sure if MHZ should be 1 rather than 2, as this
- ; .INS could not have worked without MDCARCK
- ; July 21. This .INS will work correctly with MHZ set to 2. If
- ; you have an 80col monitor use Von Ertwine's CONFIG to set 40COL=OFF
- ; as this gives a 10%+ system speed-up. Get a copy of CCP+.LBR and use it.
- ; July 26. The TSTBAUD: routine requires that the Zero flag be set to
- ; know that the baudrate was correctly set, and MDIN2: returns it set
- ; so rather than just comment out the code in the main BYE509 I'll add
- ; some ugly code to set the Zero Flag manually.
- ;
- ; .INS is now very ready for final test
- ; Dave Giunti
- ;======================Original Header============12/12/85===========
- ; IMPORTANT: When going through the options for
- ; BYE5, be sure to set:
- ;
- ; MHZ EQU 1
- ;
- ; regardless what you think it should
- ; be set for. The modem routines built
- ; into the Commodore IOS use "bit-bang-
- ; ing" interrupt control and this value
- ; should be used. (All this does is
- ; control the number of loops used for
- ; timing purposes.)
- ;
- ; = = = = = = = = = = = = = = = = = =
- ;
- ; 12/12/85 Written to work with BYE5 - Irv Hoff
- ; 07/21/86 modified version for BYE509 from work done by
- ; Irv Hoff and George Peace - David Giunti
- ; = = = = = = = = = = = = = = = = = =
- ;
- ; C128 data
- ;
- PORT EQU 6
- MEMRY EQU 0FD4EH
- MDCTL1 EQU MEMRY+1
- SNDDAT EQU MEMRY+2
- RCVDAT EQU MEMRY+3
- MDDCD EQU 10H ; Bit 4 to test for DCD
- MDRCV EQU 01H ; Bit 0 to test for receive ready
- MDSND EQU 80H ; Bit 7 to test for send
- ;
- CBNK EQU 0FD1DH ; Address of the current bank byte
- ;
- ;
- ; Table of baudrate parameters
- ;
- BD300 EQU 6 ; Divisor for 300 baud
- BD1200 EQU 8 ; Divisor for 1200 bps (The Commodore
- ; C128 does not support faster speeds
- ; in the CP/M-128 mode)
- ;
- ;-----------------------------------------------------------------------
- ;
- ; See if we still have a carrier - if not, return with the zero flag set
- ;
- MDCARCK:
- ; LDA 0DD01H ; Get status
- ; this should be an IN like in MDINIT below to work correctly -dag
- PUSH B ; save reg
- LXI B,0DD01H ; point at data port B
- DB 0EDH,78H ; Input to A, pointed by BC
- CMA ; Invert the value for active low
- ANI MDDCD ; Check DCD for carrier from modem
- POP B ; restore B reg
- RET
- ;.....
- ;
- ;
- ; Disconnect and wait for an incoming call.
- ;
- MDINIT: LXI B,0DD01H ; Dataport B
- DB 0EDH,78H ; Input A (Z80 instruction)
- ANI 0F9H
- DB 0EDH,79H ; Output the new value, to disconnect
- MVI B,20 ; 2 seconds to drop DTR
-
- MDIN1: CALL DELAY ; 0.1 second delay
- DCR B
- JNZ MDIN1 ; Keep waiting until carrier drops
- LXI B,0DD01H ; Reset back to normal
- DB 0EDH,78H
- ORI 6
- DB 0EDH,79H
- MVI A,1 ; Set to 8 bits, no parity
- STA MEMRY ; Configure byte in BIOS
- MVI B,BD300 ; Initialize to 300 baud
- ;.....
- ;
- ;
- ; Initialize the port, baudrate is now in the B-reg. find where it goes
- ; and put it there.
- ;
- MDIN2: PUSH B ; Temporarily store the baudrate value
- LHLD 0000H+1 ; Get BIOS address
- LXI D,57 ; CP/M JMP device table
- DAD D ; Index into BIOS
- CALL MDIN3 ; Jumps to address now in HL
- ; returns with HL=char device tbl start
- LXI D,PORT*8+7 ; Offset to RS232 baud rate
- DAD D ; Point to RS232 baud rate byte
- ; Byte now in HL
- POP B ; Get the baudrate value back
- MOV M,B ; Store the requested baud rate
- ;
- ;
- ; Have now stored desired baudrate, find the address in BIOS where the
- ; port will be initialized, put the correct port into the 'C' register
- ; and then initialize that port to baud rate just set, finished.
- ;
- LHLD 0000H+1 ; Get BIOS address
- LXI D,60 ; CP/M init address
- DAD D ; Index into BIOS
- MVI C,PORT ; Tell it what port to initialize
- CALL MDIN3
- ;
- xra a ; clears all bits in Acum, sets Zero flag -dag
- ;
- ;
- ; Jumps to HL address, performs that routine, then returns here
- ;
- IF IMODEM
- CALL IMINIT ; Initialize smartmodem
- ENDIF ; IMODEM
- ;
- RET
- ;...
- ;
- ;
- MDIN3: PCHL ; Jump to that routine then return
- ;.....
- ;
- ;
- ; Input a character from the modem port
- ;
- MDINP: LDA RCVDAT ; Get character
- ;
- ;
- ; We found there was a character, got it, but have to manually reset the
- ; flag to zero saying we did get the character.
- ;
- PUSH H ; Save the current address just in case
- LXI H,MDCTL1 ; Address of status byte
- DB 0CBH,86H ; Reset the 0 bit of the HL status byte
- POP H ; Restore the original address
- RET ; Return with the character
- ;.....
- ;
- ;
- ; Check the status to see if a character is available. if not, return
- ; with the zero flag set. If yes, use 0FFH to clear the flag.
- ;
- ; note that CMA is not required here because of the logical construction
- MDINST: LDA MDCTL1 ; Get status
- ANI MDRCV
- RZ ; No character, return
- ;...
- ;
- ;
- MDINST1:ORI 0FFH ; We have a character, clear the flag
- RET
- ;.....
- ;
- ;
- ; Send a character to the modem
- ;
- MDOUTP: STA SNDDAT ; Output the character
- ;
- ;
- ; Output character has been stored in the BIOS memory location, now set
- ; the flag showing there is a charcter ready.
- ;
- PUSH H ; Save any current address, if needed
- LXI H,MDCTL1 ; Address of the status byte
- DB 0CBH,0FEH ; Set bit 7 of the HL status byte
- POP H ; Get the original address back
- RET ; All done
- ;.....
- ;
- ;
- ; See if the output is ready for another character
- ;
- MDOUTST:LDA MDCTL1 ; Get the status bit
- cma ; invert bits for check -dag
- ANI MDSND ; Check send ready bit
- RET ; If pin is high, not ready
- ;.....
- ;
- ;
- ; Renitialize the modem and hang up the phone by dropping DTR and
- ; leaving it inactive.
- ;
- MDQUIT: IF IMODEM
- CALL IMQUIT
- ENDIF ; IMODEM
- ;
- ;
- ; Called by the main program after caller types BYE
- ;
- MDSTOP: MVI B,BD300 ; Initialize to 300 baud
- CALL MDIN2 ; Set to 300 baud to speed up C128
- LXI B,0DD01H ; Dataport B
- DB 0EDH,78H ; Input A (Z80 instruction)
- ANI 0F9H ; Keep DTR set low permanently
- DB 0EDH,79H ; Output the new value, to disconnect
- RET
- ;.....
- ;
- ;
- ; The following routine sets the baudrte. BYE5 asks for the maximum
- ; speed you have available.
- ;
- SET2400 EQU 0
- ;
- SETINV: MVI A,0FFH
- ORA A ; Make sure the Zero flag isn't set
- RET
- ;.....
- ;
- ;
- SET300: MVI B,BD300 ; Get 300 baud parameters in 'HL'
- JMP MDIN2
- ;
-
- SET1200:MVI B,BD1200
- JMP MDIN2
- ;.....
- ;
- ;
- ;-----------------------------------------------------------------------
- ; CP/M v3.0 routines
- ;
- ; Perform system or hardware dependent PRE-processing. The following
- ; code will be executed by the PATCH subroutine before the BIOS jump
- ; table is overwritten.
- ;
- MDPREP: RET
- ;.....
- ;
- ;
- ; Perform system or hardware dependent POST-processing.
- ; The following code will be executed by the EXCPM routine before re-
- ; turning control to CP/M Plus when the BYE5 program is terminated.
- ;
- MDPOSP: RET
- ;.....
- ;
- ; end
- ;-----------------------------------------------------------------------
- minated.
- ;
- MDPOSP: RET
- ;.....
- ;
- ; end
- ;--------------------------------------