home *** CD-ROM | disk | FTP | other *** search
-
- ; Program: T3M-ON1.Z80
- ; Author: Joe Wright
- ; Date: 10 June 1986
- ;
- ; Serial port overlay to TERM III for the Oneac computer.
- ; Z80 DART and 615,385 Hz Baud Rate Generator.
- ;
- MDPORT EQU 92H ; Z80 sio-0 or dart
- M1$DATA EQU MDPORT ; Data port
- M1$STAT EQU MDPORT+1 ; Status port
- RDA EQU 1 ; Receive data available
- TBE EQU 4 ; Transmit buffer empty
- DCD EQU 8 ; Data carrier detect
- RES EQU 10H ; Reset external/status
- ;
- ; Baud rate table. Low order byte is baud rate generator divisor,
- ; High order byte is the Dart divisor (WR4, 1 stop bit).
- ;
- BD300 EQU 0C400H ; /64, /32
- BD1200 EQU 04400H ; /16, /32
- BD2400 EQU 08410H ; /32, /8
- BD4800 EQU 04410H ; /16, /8
- BD9600 EQU 0C420H ; /64, /1
- BD19200 EQU 08420H ; /32, /1
- BD38400 EQU 04420H ; /16, /1
- ;
- ORG 600H ; Base address (600h - 6ffh)
- ;
- ; Modem Support Package
- ;
- M1$INIT:
- JP SM1$INIT ; Initialize dart
- M1$ISTAT:
- JP SM1$ISTAT ; Test input status (rda)
- M1$OSTAT:
- JP SM1$OSTAT ; Test output status (tbe)
- M1$IN:
- JP SM1$IN ; Input a byte from the usart
- M1$OUT:
- JP SM1$OUT ; Output a byte to the usart
- M1$BREAK:
- JP SM1$BREAK ; Cause the usart to issue a break
- MM1$CST:
- JP SM1$CST ; Determine carrier status (detect) on usart
- M1$SPTAB:
- DB 01111111B ; All rates available
- ;
- ; Modem Routines
- ;
- ; Modem 1 Initialization
- ; Function: To initialize the Modem 1 Port
- ; Input Parameters: A=Speed
- ; 0=no set
- ; 1= 300
- ; 2= 1200
- ; 3= 2400
- ; 4= 4800
- ; 5= 9600
- ; 6=19200
- ; 7=38400
- ; Output Parameters: A=Set Speed (same table as above)
- ; ZERO FLAG SET
- ;
- SM1$INIT:
- PUSH HL
- PUSH DE
- PUSH BC
- PUSH AF ; Save all registers
- OR A
- JR Z,NO$BAUD ; No speed selected
- CP 8
- JR NC,NO$BAUD ; Out of range
- ;
- ; Set up to determine if desired speed is available
- ;
- LD B,A ; Save it a moment
- LD C,A ; Two copies
- XOR A ; Clear A
- SCF ; Set carry flag
- ;
- ; Shift carry into A (speed) times corresponding to speed table
- ;
- LOOP: RLA
- DEC C
- JR NZ,LOOP ; Shift into position
- ;
- ; See if we have a match
- ;
- LD HL,M1$SPTAB ; Point to speed table
- AND (HL) ; Check for corresponding bit
- LD A,B ; Get speed
- JR Z,NO$BAUD ; Not available
- ;
- ; Speed value in range, set it up
- ;
- LD DE,BD300
- DEC A
- JR Z,SETBAUD ; Set 300 bps
- LD DE,BD1200
- DEC A
- JR Z,SETBAUD ; Set 1200 bps
- LD DE,BD2400
- DEC A
- JR Z,SETBAUD ; Set 2400 bps
- LD DE,BD4800
- DEC A
- JR Z,SETBAUD ; Set 4800 bps
- LD DE,BD9600
- DEC A
- JR Z,SETBAUD ; Set 9600 bps
- LD DE,BD19200
- DEC A
- JR Z,SETBAUD ; Set 19200 bps
- LD DE,BD38400
- DEC A ; Insure A=0, Set 38400 bps
- ;
- ; Set up the baud rate requested
- ;
- SETBAUD:
- CALL SELBNK ; A=0 returns system port data
- AND 0CFH ; Mask rate generator xx00xxxxB
- OR E ; Selected rate
- LD C,A ; Return it in C
- CALL SELBNK ; A<=>0 sets new rate
- LD A,4
- OUT (M1$STAT),A ; Select WR4
- LD A,D ; Get dart divisor, 1 stop bit
- OUT (M1$STAT),A
- LD A,3
- OUT (M1$STAT),A ; WR3
- LD A,0C1H ; 8 bits, Rx enable
- OUT (M1$STAT),A
- LD A,5
- OUT (M1$STAT),A ; WR5
- LD A,0EAH ; DTR, 8 bits, Tx enable, RTS
- OUT (M1$STAT),A
- ;
- SMINIT$RET:
- POP AF
- ERR$RET:
- POP BC
- POP DE
- POP HL
- OR A ; Set zero flag
- RET
-
- ; Speed value out of range, do nothing, return zero
- ;
- NO$BAUD:
- POP AF ; Adjust stack
- XOR A ; A zero
- JR ERR$RET ; Quit, having failed..
- ;
- ; SELBNK routine in the ON bios gets/sets the baud rate clock
- ; This routine also affects the bank port and the terminal speed.
- ; Please don't play around with it.
- ;
- SELBNK:
- LD HL,(1) ; Bios jump table
- LD L,33H ; Offset to selbnk jump
- JP (HL) ; Do it, return to caller
- ;
- ; Modem 1 Input Status
- ; Function: To return byte ready (RDA) status
- ; Input Parameters: None
- ; Output Parameters: A=0 if no byte, A=0FFH if byte ready
- ;
- SM1$ISTAT:
- IN A,(M1$STAT) ; Get status byte
- AND RDA ; Data available?
- RET Z ; Zero if no data
- LD A,0FFH ; Load with ff
- RET
- ;
- ; Modem 1 Output Status
- ; Function: To return buffer empty (TBE) status
- ; Input Parameters: None
- ; Output Parameters: A=0 if buffer full, A=0FFH if buffer empty (TBE)
- ;
- SM1$OSTAT:
- IN A,(M1$STAT) ; Get status byte
- AND TBE ; Buffer empty?
- RET Z ; Zero if not empty
- LD A,0FFH ; Load with ff
- RET
- ;
- ; Modem 1 Input
- ; Function: To return a byte in the A Reg from Modem 1
- ; Input Parameters: None
- ; Output Parameters: A=byte (MSB NOT cleared)
- ;
- SM1$IN:
- CALL M1$ISTAT ; Get status
- JP Z,M1$IN ; Continue until data available
- IN A,(M1$DATA) ; Get char
- RET
- ;
- ; Modem 1 Output
- ; Function: To output the byte in the A Reg to Modem 1
- ; Input Parameters: A=byte
- ; Output Parameters: None
- ;
- SM1$OUT:
- PUSH AF ; Save byte
- M1OLOOP:
- CALL M1$OSTAT ; Check output status
- JP Z,M1OLOOP ; Wait until empty
- POP AF ; Get byte
- OUT (M1$DATA),A ; Output it
- RET
- ;
- ; Modem 1 Break
- ; Function: To return the status of the break function for Modem 1
- ; and to execute the break if function is available
- ; Input Parameters: A=0 to return status, A=0FFH to break
- ; Output Parameters: A=0 and Zero Flag Set if Break not supported
- ;
- SM1$BREAK:
- XOR A ; Not implemented
- RET
- ;
- ; Modem 1 Carrier Status Detect
- ; Function: Determine if carrier is present
- ; Input Parameters: None
- ; Output Parameters: A=0 if no carrier, A=0FFH if carrier
- ;
- SM1$CST:
- LD A,RES ; Reset external/status
- OUT (M1$STAT),A
- IN A,(M1$STAT) ; Get new status
- AND DCD ; Check data carrier
- RET Z ; No carrier, else..
- OR 0FFH ; Set af
- RET
-
- DB 'End of Oneac serial port drivers'
-
- END