home *** CD-ROM | disk | FTP | other *** search
- ; CP/M console I/O module supporting terminal and modem in "parallel"
- ;
- ; Terminal is attached to Disk Jockey serial port
- ; Modem is PMMI S100 board
- ;
- BEGIN
- ;
- ; Entry points
- ;
- ENTRY CONST,CONIN,CONOUT
- ;
- ; External references
- ;
- EXTRN FLUSH
- ;
- ; Local data storage (initialized)
- ;
- CONNECT: DB 0 ; false - modem not connected
- ;
- ; Terminal access
- ;
- DJROM EQU 0F800H
- DJCIN EQU DJROM+3
- DJCOUT EQU DJROM+6
- DJTSTAT EQU DJROM+21H
- ;
- ; Modem access
- ;
- PMMI EQU 0C0H ; base port address
- USTAT EQU PMMI ; uart status input
- UCONT EQU PMMI ; uart and modem control output
- UDATA EQU PMMI+1 ; uart incoming and outgoing data
- MSTAT EQU PMMI+2 ; modem status input
- MRATE EQU PMMI+2 ; timer rate regester and temp reg for int mask
- MINT EQU PMMI+3 ; input moves rate register to int mask reg
- MCONT EQU PMMI+3 ; modem control register
- PROCEDURE CONST
- CALL DJTSTAT
- MVI A,0FFH
- RZ ; return if terminal input data ready
-
- CALL MISTAT ; check modem input status
- RET
- PROCEDURE CONOUT
- PUSH B
- CALL FLUSH
- POP B
- CALL DJCOUT ; output character to terminal
- CALL MOUT ; output character to modem if connected
- RET
- PROCEDURE CONIN
- CALL FLUSH
- LOOP
- CALL DJTSTAT
- IF ( ZERO ) ; data waiting
- CALL DJCIN ; get data from terminal
- ANI 7FH
- RET
- FIN
- CALL MISTAT
- IF ( NOT ZERO ) ; data waiting
- CALL MINP ; get data from modem
- ANI 7FH
- RET
- FIN
- FIN
- PROCEDURE MISTAT
- LDA CONNECT
- ORA A
- WHEN ( ZERO ) ; modem disconnected
- IN MSTAT
- ANI 2
- IF ( ZERO ) ; ringing
- CALL CONSEQ ; start connect sequence
- STA CONNECT
- FIN
- MVI A,0 ; no data waiting
- FIN
- ELSE
- IN MSTAT
- ANI 4
- WHEN ( NOT ZERO ) ; carrier lost
- CALL DCONSEQ ; start disconnect sequence
- STA CONNECT
- MVI A,0 ; no data waiting
- FIN
- ELSE
- IN USTAT
- CMA
- ANI 2 ; data available (low true)
- SUI 1 ; if ( DAV = 0 ) A=FF
- SBB A ; else A=0
- FIN
- FIN
- ORA A ; set zero flag
- RET
- PROCEDURE CONSEQ
- MVI A,7FH ; DTR,300,ESS
- OUT MCONT
-
- CALL DELAY
-
- MVI A,5EH ; 2s, NP, 8 bits, Answer
- OUT UCONT
-
- PUSH B
- MVI B,150 ; 15 seconds
- REPEAT
- CALL DELAY
- IN MSTAT
- ANI 4
- BREAK IF ( ZERO ) ; carrier detected
- DCR B
- UNTIL ( ZERO )
- POP B
-
- CALL DELAY
- IN UDATA
- IN UDATA ; clear uart receiver
-
- MVI A,52 ; 300 baud
- OUT MRATE
-
- MVI A,5CH ; 2s, NP, 8 bits, Normal (auto hangup if carrier lost)
- OUT UCONT
-
- IN MSTAT
- ANI 4
- MVI A,0
- RNZ ; return if no carrier
-
- ;+++++++++++++ send signon message and password request
-
- MVI A,0FFH ; connect flag
- RET
- PROCEDURE DELAY
- MVI A,250 ; .1 sec
- OUT MRATE
- REPEAT
- IN MSTAT
- ANI 80H
- UNTIL ( ZERO ) ; timer bit low
- REPEAT
- IN MSTAT
- ANI 80H
- UNTIL ( NOT ZERO ) ; timer bit high
- RET
- PROCEDURE DCONSEQ
- MVI A,3FH ; 300, ESS
- OUT MCONT ; force hangup
- XRA A ; connect false flag
- RET
- PROCEDURE MOUT
- LDA CONNECT
- ORA A
- IF ( NOT ZERO ) ; connected
- REPEAT
- IN MSTAT
- ANI 4
- BREAK IF ( NOT ZERO ) ; carrier lost
- IN USTAT
- ANI 1
- UNTIL ( NOT ZERO ) ; transmit buffer empty (TBMT)
- CPI 1 ; TBMT
- IF ( ZERO )
- MOV A,C
- OUT UDATA ; send data through modem
- FIN
- FIN
- MOV A,C
- RET
- PROCEDURE MINP
- IN UDATA
- RET
- END
- END-OF-FILE