ISA
- Industry Standard Architecture, ISA may also refer to Instruction Set Architecture.
The Industry Standard Architecture (ISA) bus was created for the original IBM PC back in 1981. At that stage, it was an 8-bit, 5MHz bus (2.39MB/s), but was later upgraded to 16-bits at 8MHz (8.33MB/s). Today, the ISA bus is archaic and incredibly slow, but it is still commonly found in older machines, and many of the most common, basic devices are connected to it. For this reason, it is still supported by many operating systems. It is slowly being replaced by the Super I/O chip that is common amongst modern machines. For more information on the history and implementation details of the bus, visit the Wikipedia page on the subject.
Device Conflicts
There are broadly four types of resources that cause device conflicts (listed in the order problems are generally experienced):
Managing these resources becomes the responsibility of the operating system. Fortunately, Microsoft has created a standard called Plug-and-Play (PnP) that helps with this. Not all ISA cards support it, however, so some luck is required in that the person building the system has set the correct jumpers.
ISA Plug-and-Play Overview
The following is a general overview of the ISA Plug-and-play specification. The goal of this section is to clarify the documentation as there are many forward references to the appendices. See the original document (ISA PnP 1.0A) for more authoritative information (including timeouts). There are three 8-bit ports specified by the ISA PnP standard that are used for accessing configuration spaces.
Address | Name | R/W |
---|---|---|
0x279 (Same is LPT status, but W) | ADDRESS | W |
0xA79 | WRITE_DATA | W |
0x203-0x3FF (Relocatable) | READ_DATA | R |
Note: ISA ports use 12-bit decode (PnP 1.0A 7)
The ADDRESS port is an 8-bit port that takes two bytes. The first byte send is the CSN, or card select number. The second is the offset in the configuration space. The address is the same as the printer status, but ports are bidirectional on PCs.
Cards in PnP mode are disabled on startup and are in a "Wait for Key" state. Once configured, they should be returned to this state. The Initiation Key is a 32-byte sequence sent to the ADDRESS port that will put the cards in configuration mode. Send zero twice to clear any previous address before sending this key.
; Warning: not tested SendKey: pushfd ; Save IF cli cld mov dx,ADDRESS mov esi,Key mov ecx,32+2 rep outsb popfd ; Restore IF, nothing else changed ret
The key is defined as:
Key: ; Zero bytes to clear ADDRESS DW 0 ; The actual key DB 0x6A,0xB5,0xDA,0xED,0xF6,0xFB,0x7D,0xBE DB 0xDF,0x6F,0x37,0x1B,0x0D,0x86,0xC3,0x61 DB 0xB0,0x58,0x2C,0x16,0x8B,0x45,0xA2,0xD1 DB 0xE8,0x74,0x3A,0x9D,0xCE,0xE7,0x73,0x39
AMD recommends (PCnet-ISA II 3) disabling interrupts while performing the IO operation to prevent anything else from interfering (as shown above). No other ports should be accessed. It is also recommended to send it twice in case the key is not received the first time.
Before doing anything with ISA cards, the number of CSNs should be obtained using the PnP BIOS. CSNs are always sequential and start from one (zero represents unidentified cards).
Configuration Space
Appendix A specifies the actual configuration space. Here is an overview of what the card control section looks like:
Offset | Name | What it does |
---|---|---|
0x00 | Set READ_DATA | Set the READ_DATA address |
0x01 | Serial Isolation | (TODO: Add this) |
0x02 | Config Control | See below for spec |
0x03 | Wake[CSN] | Put card[WRITE_DATA] in isolation mode |
Note: Some operations appear to be global is scope
If it is not clear, writing to the Wake[CSN] port sets the actual CSN to perform the wake operation.
The Set READ_DATA port (also referred to as RD_DATA) is an 8-bit value that relocates the READ_DATA port to the range specified above. It is practically shifted left by three and or'ed with the 10-bit binary number "11" (Page 15). The value written to this register would be:
Set_READ_DATA = (PhysicalPort & 0x3F8) >> 3.
Reading this register does nothing, the programmer must assign this port and check for conflicts. There is only one for all cards.
Index | Purpose |
---|---|
0 | Reset all logical devices |
2 | Reset CSN to zero |
Toggling bits in the CCR will perform several commands. The bits are reset once the task is performed.
External Links
PCnet-ISA II programming guide. This has some useful information on PnP. https://www.amd.com/system/files/TechDocs/PCnet-ISA_II.pdf#:~:text=The%20Initiation%20Key%20places%20the%20PCnet-ISA%20II%20Plug,the%20Plug%20and%20Play%20auto-configuration%20ports%20are%20enabled.