88-SIOA at 9600 baud
- I just finished restoring an 88-SIOA, and discovered that it does not work correctly at 9600 baud, with the baud rate generator set up as described in the 88-SIOA Errata. (The baud rate generator settings in the original manual are wrong too.)
For 9600 baud, the Errata sheet says to set the baud rate generator with [1111 1111 1000]. Putting a scope on my 88-SIOA, I discovered that the baud rate with this setting was fast by about 7.7%- far enough off to make communication either unreliable or outright fail.
I went through the math, and the correct setting for 9600 baud is [111 111 0111]. If you are using an 88-SIO at 9600 baud, I suggest you set the baud rate generator to this value.
Here is the math:
The 88-2SIO Errata gives the formula for calculating the baud rate setting:
Setting = 4100 - (Clock Period (in uS) / 0.5)
where the Clock Period is 16 x the bit time - in other words:
Setting = 4100 - (bit time (in uS) / 8)
Setting = 4100 - 125000/Baud Rate
For 9600 baud, this solves to 4086.979 , which rounds to 4087
Convert to hex, this equals FF7, or [111 111 0111] binary. This is one less than the value given by MITS.
At the lower baud rates, a single-count error like this is no big deal. but at 9600 baud, this becomes a 1/13 = 7.69% error in the baud rate - very close to what I measured with my scope, and out of spec for RS-232.
Testing with a scope shows that at with this new setting, the 9600 baud timing is nearly perfect.
(I am willing to bet that they did their math using integers, and the error is the result of rounding an intermediate calculation.)
Incidentally, if you do the math for 19200 baud, the resulting value is 4093.49, which unfortunately does not round well. With either rounding choice, the error will be about 0.5/7 = 7.1% error, out of spec for RS-232. So I don't think the 88-SIO will perform well at 19200 baud.
I got kind of curious as to why the formula uses 4100 instead of 4096, considering that the baud rate generator is based on a simple binary counter. The answer is that they use a one-shot (an obscure Fairchild 4016 chip) to stretch the carry-out of the counter to 2.4 uS, to generate a clock signal that meets the UART's requirements. They also use this stretched signal as the re-load signal to the counter chain.
But a 2.4 uS pulse is a little more than 4 clock times for the counter (which uses the S-100's 2 MHz clock as its reference). This prevents the clock from counting for 4 cycles at the end/beginning of every count. And this, in turn, adds 4 to the 4096 count times that the counter would normally require. 4+4096 = 4100.
- Funny how you only see your typos after you hit the Send button. Corrected sentence:"I went through the math, and the correct setting for 9600 baud is [1111 1111 0111]. If you are using an 88-SIO at 9600 baud, I suggest you set the baud rate generator to this value."
- Wow I never tried my SIO-A at that high a baud rate. I have two of them and one doesn't have transistors for RTS and CTS. I run one at 300 baud so I can always hook up my ti silent as a terminal. The other I run at 600 for my ADM which is also daisy chained to a reader and a punch even though my high speed reader can do 9600. I actually swap cards when needed because I haven't added my 3rd motherboard yet to my Altair. I will correct that this fall. Too bad to mess around with the SIO-A baud rates requires a soldering iron. Cheers,Corey