; > &.Doc180.Kernel.Serial Title: Serial extensions/1 Version: 0.06 Started: 08-Apr-88 Last updated: 28-Sep-88 Status: Complete Serial Line Extensions ---------------------- The Arthur serial line interface is very closely modelled on the Beeb serial line interface. That in turn was modelled on the 6850 ACIA chip in the Beeb. This document describes extensions to the RS423 serial line interface in RISC OS 2.00. These extensions are in addition to fixing some of the problems in Arthur 1.20, which are caused by a faulty ACIA chip. Extensions to FX 7 and 8 ------------------------ OSBYTE calls 7 and 8 are used to set the receive and transmit baud rates respectively. The range of parameters has been extended to allow access to the baud rates available on the 6551 ACIA which were not available on earlier BBC machines. The full set of parameters is as follows:- 0 => 9600 9 => 50 1 => 75 10 => 110 2 => 150 11 => 134.5 3 => 300 12 => 600 4 => 1200 13 => 1800 5 => 2400 14 => 3600 6 => 4800 15 => 7200 7 => 9600 8 => 19200 SWI OS_SerialOp (&57) --------------------- in: R0 = reason code Other input registers as determined by reason code out: V=1 => R0 -> error V=0 => R0 preserved Other registers may return values, as determined by reason code Reason code R0=0 (Read/write serial states) ------------------------------------------- This call is used to read and write various states of the serial system. These states are presented as a 32-bit word. The call performs the operation New state = (Old state AND R2) EOR R1 in: R1 = EOR mask R2 = AND mask out: R1 = old value of state R2 = new value of state The bits in the serial state have the following meanings:- Read/Write flags ---------------- Bit Meaning --- ------- 0 Clear => No software flow-control (must rely on hardware handshaking). Set => Use XON/XOFF flow-control protocol. The hardware will still do CTS handshaking (ie if CTS goes low transmission will stop), but we will not make RTS go low from our end. 1 Clear => If the ~DCD bit in the status register goes high, then cause an RS423 event. Also, if a character is received when ~DCD is high, then cause an RS423 event, and do not enter character into buffer. Set => Ignore the state of the ~DCD bit (apart from maintaining a soft copy of this bit for the user to read). Note, however, that both GTE and CMD chips prevent reception when the ~DCD bit is high, and the GTE chip causes transmit problems when this bit is high. 2 Clear => If the ~DSR bit in the status register is high, then do not transmit characters. Set => Ignore the state of the ~DSR bit (apart from maintaining a soft copy of this bit for the user to read). 3 Clear => DTR bit in command register programmed to 1 (data terminal ready). Set => DTR bit in command register programmed to 0 (data terminal not ready). Note that in this state, the ACIA cannot transmit or receive characters. Any characters currently being transmitted or received when this state is selected may be garbled. The user should deselect this state before attempting to transmit or receive again. 4..15 Undefined - do not modify these bits. Read-only flags --------------- Bit Meaning --- ------- 16 Clear => Your transmission has not been stopped by the reception of an XOFF character (always clear if XON/XOFF not being used). Set => Your transmission has been stopped by the reception of an XOFF character. 17 Clear => You intend the other end to be in the XON (enabled) state. Set => You intend the other end to be in the XOFF (disabled) state. When a character is received, and the buffer is nearly full (as determined by OSBYTE 203), and XON/XOFF protocol is being used, then this bit gets set, and on the next transmit interrupt an XOFF character will be sent. When sufficient characters have been removed from the input buffer to render it not nearly full, this bit is cleared and on the next transmit interrupt an XON character is sent. Note that the fact that this bit is set does not imply that the other end has received an XOFF character yet. 18 Clear => the ~DCD bit in the status register is low, indicating that carrier is present. Set => the ~DCD bit in the status register is high, indicate absence of carrier. In this state the ACIA receiver is disabled (and on GTE chips transmission is affected, too) 19 Clear => the ~DSR bit in the status register is low, indicating a 'ready' state. Set => the ~DSR bit in the status register is high, indicating a 'not-ready' state. If bit 2 of the serial state is clear, then no characters will be transmitted in this state. 20 Clear => the ring indicator bit in IOC is low. Set => the ring indicator bit in IOC is high. 21..31 Undefined - do not modify these bits. Reason code R0=1 (Read/write data format) ----------------------------------------- in: R1 = -1 => just read format R1 <> -1 => R1 determines new format Bits 0,1 : 0 => 8 bit word 1 => 7 bit word 2 => 6 bit word 3 => 5 bit word Bit 2 : 0 => 1 stop bit 1 => 2 stop bits OR 1.5 stop bits if 5 bit word without parity OR 1 stop bit if 8 bit word with parity Bit 3 : 0 => parity disabled (no parity bit) 1 => parity enabled Bits 4,5 : 0 => odd parity 1 => even parity 2 => parity bit always 1 on TX (ignored on RX) 3 => parity bit always 0 on TX (------""-----) out: R1 = old format in bits 0..5 as above Reason code R0=2 (Send break) ----------------------------- in: R1 = length of break in centiseconds out: R1 preserved This call sets the ACIA to transmit a break, then waits in the foreground with IRQs on for R1 centiseconds before resetting it to normal. Note that any character being transmitted at the time the call is made may be garbled. After sending the break the remaining characters in the output buffer (if any) will be transmitted. Reason code R0=3 (Send byte) ---------------------------- in: R1 = character to be sent out: R1 preserved C=0 => character sent C=1 => character not sent (because buffer full) This call puts a character in the RS423 output buffer, and reenables the transmit interrupt if it had previously been disabled by the MOS. Reason code R0=4 (Get byte) --------------------------- in: - out: C=0 => R1 = character read C=1 => R1 preserved, no character read, input buffer empty This call removes a character from the RS423 input buffer, if one is present. If removing a character leaves the input buffer with more free spaces than are specified by OSBYTE 203, then the other end is encouraged to start transmitting again - this may involve either reenabling RTS or the transmission of an XON character, depending on which protocol has been selected (see above). Note that reception must have been enabled with FX2,2 (or FX2,1) before this call can be used. Reason code R0=5 (Read/set receive baud rate) --------------------------------------------- in: R1 = -1 => just read receive baud rate R1 = 0..15 => set receive baud rate to this value (as for FX 7 or 8) out: R1 = old receive baud rate, in range 0..15 Reason code R0=6 (Read/set transmit baud rate) --------------------------------------------- in: R1 = -1 => just read transmit baud rate R1 = 0..15 => set transmit baud rate to this value (as for FX 7 or 8) out: R1 = old transmit baud rate, in range 0..15