; TITLE ZMOS-1.Z80 - 01/01/88 - ZMD I/O Overlay for OSBORNE I ; Copyrighted (c) 1987, 1988 ; Robert W. Kramer III PAGE ;- -; ; Update History ; ; ; ; Date Release Comments ; ; -------- ------- ---------------------------------------------- ; ; ; ; 01/01/88 v1.00 - Initial version ; ;- -; ; MODDATP EQU 02A01H ; Data In/Out port MODCTLP EQU 02A00H ; Control/Status port MODRCVB EQU 01H ; Bit to test for receive MODRCVR EQU 01H ; Value when ready MODSNDB EQU 02H ; Bit to test for send MODSNDR EQU 02H ; Value when ready MODDCDB EQU 04H ; Carrier detect bit MODDCDA EQU 04H ; Value when active MODCTSB EQU 08H ; Clear to send bit MODCTSA EQU 08H ; Value when active MODFRME EQU 10H ; Value for framing error MODOVRE EQU 20H ; Value for overrun error MODPARE EQU 40H ; Value for parity error ; ;-------------------------------------------------------------------------; ; Input/Output Jump Table | ;-------------------------------------------------------------------------; ; ORG 0580H ; Start after configuration table JP 0000H ; See CONOUT.INF JP INIT ; Initialization routine JP UNINIT ; Unititialize routine JP SNDCHR ; Send character JP CARCHK ; Test for carrier JP GETCHR ; Get character from modem JP RCVRDY ; Check receive ready JP SNDRDY ; Check send ready ; ;-------------------------------------------------------------------------; ; System startup inititialization routine | ;-------------------------------------------------------------------------; DEST EQU 0A000H ; Base address for modem routines. Must be ; at least 1 page lower than DEST in BYE. INIT: LD BC,PEND-START+1 ; Number of bytes to move LD HL,DEST+PEND-START+1 ; End of moved code LD DE,SOURCE+PEND-START ; End of source code LDIR RET SOURCE EQU $ ; Boundary memory amount OFFSET EQU DEST-SOURCE ; Relocation amount START EQU $+OFFSET ; ;-------------------------------------------------------------------------; ; System exit unititialization routine | ;-------------------------------------------------------------------------; UNINIT: RET ; ;-------------------------------------------------------------------------; ; Send character out modem | ;-------------------------------------------------------------------------; SNDCHR EQU $+OFFSET POP AF ; Get the character back DI ; Disable interrupts OUT (0),A ; Switch to shadow memory LD (MODDATP),A ; Send a data byte OUT (1),A ; Switch back to normal memory EI ; Enable interrupts RET ; ;-------------------------------------------------------------------------; ; Check for carrier | ;-------------------------------------------------------------------------; CARCHK EQU $+OFFSET ; ; The following code should be activated and TESTED if the MODEM port is ; used since that port is supposed to be able to report carrier detect. ; ; DI ; Disable interrupts ; OUT 0 ; Switch to shadow in memory ; LDA MODCTLP ; Get status ; OUT 1 ; Switch back to normal memory ; EI ; Enable interrupts ; ANI MODDCDB ; Get carrier detect bit ; CPI MODDCDA ; Test bit ; ; The following code is a fudge to allow the routine to pass the Zero ; flag clear value back to the caller until the carrier lead can be read. ; XOR A ; Clear accumulator to zeros CP 0 ; Clear the zero flag RET ; ;-------------------------------------------------------------------------; ; Get character from modem | ;-------------------------------------------------------------------------; GETCHR EQU $+OFFSET DI ; Disable interrupts OUT (0),A ; Switch to shadow memory LD A,(MODDATP) ; Send a data byte OUT (1),A ; Switch back to normal memory EI ; Enable interrupts RET ; ;-------------------------------------------------------------------------; ; Check modem receive ready | ;-------------------------------------------------------------------------; RCVRDY EQU $+OFFSET DI ; Disable interrupts OUT (0),A ; Switch to shadow memory LD A,(MODCTLP) ; Get modem status OUT (1),A ; Switch back to normal memory EI ; Enable interrupts PUSH BC ; Save scratch register PUSH AF ; Check error status AND MODFRME+MODOVRE+MODPARE LD B,A ; Save it for a moment POP AF AND MODRCVB ; Isolate ready bit CP MODRCVR ; Test it LD A,B ; Get the error code character back POP BC RET ; ;-------------------------------------------------------------------------; ; Check modem send ready | ;-------------------------------------------------------------------------; SNDRDY EQU $+OFFSET DI ; Disable interrupts OUT (0),A ; Switch to shadow memory LD A,(MODCTLP) ; Get status byte OUT (1),A ; Switch back to normal memory EI ; Enable interrupts AND MODSNDB ; Isolate ready bit CP MODSNDR ; Ready to send? RET PEND EQU $+OFFSET ; End of relocated code END