Apple II Slot system

Apple II Slot System is the powerful and flexible system which every Apple II and Apple ][+ has.

Apple II has eight almost identical 50-pin expansion slots, named from SLOT0 up to SLOT7. They are almost identical because SLOT0 and SLOT7 are a little different from others.

SLOT0 is special because It DOES NOT HAVE the 256 bytes spaces (/IOSEL) as all others slots have. It is used typically for the firmware card or the 16 KB Apple II Language Card.

SLOT7 is special because it has the same signals all other slots have plus two exclusive signals. It is used for Video related boards, like PAL Encoder Card in Apple II EuroPlus. These two additional signals are: (1) on pin 35 a signal of 3.5Mhz COLOR REFerence from video generator; (2) on pin 19 the SYNC signal from video generator.

All I/O is memory mapped (6502 does not have exclusive I/O oriented instructions like z80 has). In Apple II architecture, a window of 4KB is reserved for I/O with addresses between $C000 and $CFFF, this memory range is called I/O space.

The 4KB I/O space is divided in two halves of 2KB each: (1) space for 8 slots I/O, addresses from $C000 to $C7FF; (2) common area for all slots, addresses from $C800 to $CFFF. In this first half, each slot has 16 bytes for register use plus 256 bytes for address use, in this space there is also the soft switches; The second half is shared among all slots, used when card’s firmware is big and the 256 bytes from slot exclusively are insufficient.

(128 bytes)
$C000..$C07F = Soft switches 

(16 bytes each region)
$C080..$C08F = Slot 0 /DEVSEL
$C090..$C09F = Slot 1 /DEVSEL
$C0A0..$C0AF = Slot 2 /DEVSEL
$C0B0..$C0BF = Slot 3 /DEVSEL
$C0C0..$C0CF = Slot 4 /DEVSEL
$C0D0..$C0DF = Slot 5 /DEVSEL
$C0E0..$C0EF = Slot 6 /DEVSEL
$C0F0..$C0FF = Slot 7 /DEVSEL

(256 bytes each region)
$C100..$C1FF = Slot 1 /IOSEL
$C200..$C2FF = Slot 2 /IOSEL
$C300..$C3FF = Slot 3 /IOSEL
$C400..$C4FF = Slot 4 /IOSEL
$C500..$C5FF = Slot 5 /IOSEL
$C600..$C6FF = Slot 6 /IOSEL
$C700..$C7FF = Slot 7 /IOSEL

(2048 bytes)
$C800..$CFFF = Common area (2KB ROM)

The common area for all slots has 2KB, in address range from $C800 to $CFFF. This area is shared among all slots. Whenever some slot wants to use data from its ROM mapped into this area is must access (read or write?) address $CFFF to deselect all eventually ROM that could be mapped into this area; after this the correct ROM should be selected. In summary, the protocol is simple: wherever somebody access address $CFFF, all cards that has a ROM mapped in common area must deselect it (inhibit its output).