I have an idea why the 8251 does not pass the BIOS check on a Rainbow-100
The startup code uses an internal loopback to check the communication, printer and keyboard ports (all serial) for framing errors.
Bit 4 and bit 5 in 8088 register 0A (diagnostic write) are used in the process.
This is done in a way that the output of one port is connected to another when bit 5 is set.
We neither have COMM, PRINTER, nor loopback connected to anything. So the Rainbow startup code literally falls apart (as tests are incremental; COM -> PRN -> KBD -> FLOPPY ...)
Bit 4 uses a similar concept to validate the video and floppy controller signals with the help of a printer port.
Info pieces are from chapter 184.108.40.206 and 220.127.116.11 of AA-V523A-TV (PDF March 83).
WRITE8_MEMBER(rainbow_state::diagnostic_w) // 8088 (port 0A WRITTEN). Fig.4-28 + table 4-15
// * BIT 4: DIAG LOOPBACK (0 at power-up; 1 directs RX50 and DC12 output to printer port)
/* 18.104.22.168 DIAGNOSTIC LOOPBACK Maintenance Bit - The DIAGNOSTIC LOOPBACK bit is a
maintenance bit that is cleared on power - up.This bit, when set to 1,
allows the floppy data separator and the serial video output to be tested
through the use of the printer port. The following table shows how signals are routed.
DIAGNOSTIC LOOPBACK = 0 DIAGNOSTIC LOOPBACK = 1 SIGNAL INPUT
SIGNAL SOURCE SIGNAL SOURCE TO
PRT RDATA(J2) VIDEO OUT PRT RXD(7201)
PRT RXTXC 500 KHZ PRT RXTXC(7201)
MASTER CLK 250 KHZ VIDEO CLK(DCO11)
FLOPPY RAW DATA PRT TXD(7201) FLOPPY DATA SEPARATOR
During Diagnostic Loopback, the - TEST input of the 8088 is connected to the
interrupt output of the MPSC.Thus, using the 8088's WAIT instruction in a
polled I / O loop, the diagnostic firmware will be able to keep up with the
500 Kb data rate on the MPSC.
if (data & 16)
printf("\nWARNING: UNEMULATED DIAG LOOPBACK (directs RX50 and DC12 output to printer port) ****");
if (data & 32)
/* BIT 5: PORT LOOPBACK (1 enables loopback for COMM, PRINTER, KEYBOARD ports)
22.214.171.124. of AA-V523A-TV (PDF Mar83) says how the signals are routed:
port_loopback_0 | port_loopback_1 SIGNAL INPUT TO
COMM RCV DATA.......COMM TXD..........COMM_RXD
PRT RCV DATA.......KBD TXD...........PRT RDATA
KBD RCV DATA.......PRT TXD...........KBD RXD
printf("\nWARNING: UNEMULATED PORT LOOPBACK (COMM, PRINTER, KEYBOARD ports) ****");
I could use some help here ;-)
of low and high ROM