Vorab: Das was ich hier schreibe ist nur eine Überlegung und ich weiß nicht, ob es richtig ist! Hoffentlich blamiere ich mich nicht

Ich habe in verschiedenen Postings nach Schaltplänen gesucht, z. B. für parallele und serielle Schnittstellen. Im Zuge dessen habe ich erfahren, dass der ATARI Geräte-IDs für Erweiterungen am PBI nutzen kann, um so einen 2KB großen ROM pro Gerät zur Verfügung zu stellen. Diese 2KB werden im Bereich $D800 bis $DFFF eingeblendet.
Die Verwaltung findet über $D1FF statt: Wird auf $D1FF geschrieben, kann das Gerät am PBI erkennen, ob sein BIT gesetzt wurde. Wenn ja, blendet es den eigenen ROM ein. Wird auf $D1FF gelesen, muss mein Gerät mitteilen, ob es einen IRQ ausgelöst hat.
$D1FF ist aber eine Hardware-Adresse, dort gibt es kein RAM. Wie kann ich also lesend oder schreibend darauf zugreifen? Jedes Gerät am PBI muss dabei genau ein BIT beobachten bzw. zur Verfügung stellen. So langsam ahnte ich, dass man selbst den Adressbus prüfen und entsprechend auf R/W reagieren muss.
Wie erhalte ich eigentlich die Information, dass auf $D1FF zugegriffen wird? Welche Signale liegen am PBI an? Unter anderem der Adressbus, der Datenbus, das R/W-Signal, das /MPD-Signal (MathePack des OS abschalten), das /EXTSEL-Signal (RAM abschalten), das IRQ-Signal und weitere...
Wie selektiere ich nun $D1FF? Binär wäre die Zahl 1101000111111111, was wichtig ist, da wir nur mit Bits (einzelnen Leitungen A0 bis A15) arbeiten. Die Leitungen A13, A11, A10, A9 sind LOW, der Rest ist HIGH. Hier könnte man einen 74LS260 nutzen, der mir ein HIGH signalisiert, wenn alle 5 Eingänge LOW sind. Da wir nur 4 Leitungen haben, müssen wir den 5. Eingang einfach auf GND setzen (LOW). Wenn also A13, A11, A10 und A9 LOW sind, habe ich am 74LS260 (2x 5-fach NOR-Gatter) ein Signal von +5V (HIGH).
Jetzt muss ich noch die restlichen Leitungen prüfen. Dafür nehme ich einen 74LS21, der 2x 4 Eingänge hat und, wenn die jeweils alle HIGH sind, mir auch ein HIGH signalisiert (2x 4-fach AND-Gatter). Also gehen A15, A14, A12 und A8 an ein Gatter. Sind alle 4 HIGH, ist der Ausgang dazu auch HIGH. Nun nehme ich einen zweiten 74LS21 und schiebe dort noch A0 bis A7 rein und bekomme ebenfalls 2x HIGH als Signal. Diese 4 Antworten schiebe ich in den letzten freien 4-fach AND-Gatter und sollte nun ein HIGH erhalten, wenn genau $D1FF auf dem Adressbus anliegt. Nennen wir dieses letzte Signal DS (DeviceSelect). Drei Chips, um diese Aufgabe zu lösen.
2x 74LS21, 1x 74LS260
Nun wird auf diese Adresse geschrieben, das heißt, R/W wird auf LOW gesetzt. Wenn also R/W LOW ist und DS HIGH, müssen wir uns merken, was an die Adresse $D1FF geschrieben wird... aber nur das BIT, das für unser Gerät zuständig ist. Sagen wir also, unser Gerät hat die ID 7, damit müssen wir BIT 7 überwachen... oder anders ausgedrückt die Leitung D7 (vom Datenbus D0-D7).
Was nun an D7 anliegt (0/1), müssen wir uns merken. Merken kann man sich etwas in einem Flip-Flop wie dem 74LS74. Wenn am Flip-Flop der Clock gesetzt ist, wird an DataIn das BIT im Flip-Flop gespeichert und an Q ausgegeben. DataIn ist eindeutig unser D7. Aber die Clock? Im Prinzip müsste das DS kombiniert mit R/W sein. Dafür müssen wir diese beiden Signale wieder verknüpfen. Wir müssen aus dem R/W LOW ein HIGH machen, das mit dem HIGH des DS per AND verknüpft wird, und erhalten dann das Clock-Signal (CLK).
Das kann man mit einem 4x 2-fach NAND-Gatter (74LS00) machen. Das R/W-Signal wird an beide Eingänge eines Gatters gelegt und somit invertiert. Nun haben wir ein HIGH. Dem nächsten Gatter führen wir das invertierte R/W-Signal zu und das DS-Signal, und nun haben wir LOW, welches wir wieder invertieren, indem wir dieses LOW an ein drittes Gatter an beiden Eingängen setzen und dann das invertierte Signal erhalten, was unserem CLK entspricht.
Kleine Anmerkung: Man muss immer HIGH-Signale bei einem AND/NAND-Gatter vergleichen. H AND H = H, alles andere L bzw. H NAND H = L, alles andere H. Jetzt steht im Flip-Flop unser D7 und bleibt dort, bis erneut etwas auf die Adresse $D1FF geschrieben wird. Nennen wir das Signal RA (RomActive)
1x 74LS74, 1x 74LS00
Okay, nun müssen wir aber auch noch bei einem Lesezugriff mitteilen, ob der IRQ von uns kam. Ein IRQ wird durch ein LOW-Signal mitgeteilt. An der Adresse $D1FF sollen wir im Falle eines IRQ aber ein HIGH liefern. Außerdem wird das Programm die Adresse $D1FF erst abfragen, nachdem ein IRQ ausgelöst wurde; dann ist das Signal aber schon längst nicht mehr auf LOW. Okay, wir müssen uns also merken, wenn wir einen IRQ ausgelöst haben. Den 74LS74 haben wir schon, und er bietet 2 Flip-Flops an... supi.
Aber wie bekommen wir nun den IRQ in das Flip-Flop? Die IRQ-Leitung wird zudem auch von den anderen IRQs genutzt. Ich muss also irgendwie den IRQ meines Chips an die IRQ-Leitung weitergeben... aber nur in eine Richtung, damit ich selbst erkennen kann, dass mein Chip den IRQ ausgelöst hat. Dafür eignet sich ein Tri-State-Buffer. Wenn man ihn per LOW-Signal aktiviert, gibt er den Eingang an den Ausgang weiter. Wenn er deaktiviert ist, ist der Ausgang hochohmig.
Da mein IRQ ein LOW-Signal ist, muss ich meinen IRQ also an den Tri-State-Eingang und an den Tri-State-Einschalter liefern. Der Tri-State-Ausgang ist mit der IRQ-Leitung verbunden. Der Flip-Flop möchte aber nun mein IRQ-Signal invertiert haben... hier greifen wir diesmal auf ein NOT-Gatter (74LS04) zurück. Der IRQ unseres Gerätes geht also (vorm Tri-State-Buffer) direkt in unser NOT-Gatter an den DataIn des Flip-Flops.
Nun muss auch noch das CLK-Signal bedient werden. Wann genau soll CLK immer ausgelöst werden? Immer wenn ein IRQ stattfindet. Egal von welchem Gerät. Also geht die IRQ-Leitung ebenfalls an unser NOT-Gatter und dann an CLK. Nun wird unser Flip-Flop auf HIGH gesetzt, wenn unser Chip den IRQ ausgelöst hat, und auf LOW, wenn es ein fremder Chip war. Fertig... naja, nicht ganz. Ich brauche noch einen Pull-Up-Widerstand, der das eigene IRQ-Signal standardmäßig auf HIGH hält.
1x 74LS125, 1x 74LS04, 1x 3k Widerstand
Das Signal DS ist also HIGH, R/W ist HIGH, dann möchten wir wissen, was das Flip-Flop sich gemerkt hat. Das heißt, Q (DataOut) muss nun an D7 gelegt werden... aber nur, wenn wir den Lesezugriff haben! Perfekt, den Tri-State haben wir ja schon, und er bietet noch 3 weitere Buffer. Q des Flip-Flops verbinden wir mit dem Eingang des Tri-State. Unser DS- und R/W-Signal kombinieren wir mit dem letzten NAND des 74LS00, und dieses Ergebnis können wir direkt am Tri-State zur Aktivierung der Ausgabe nutzen.
Okay, an der Stelle haben wir es geschafft, die Adresse $D1FF zu bedienen, und nutzen 7 Chips und einen Widerstand.
Nun möchten wir den Zugriff auf unser ROM erlauben.
An unserem ersten Flip-Flop erkennen wir, ob unser (EP)ROM aktiv oder inaktiv sein soll. Nun müssen wir aber wissen, ob überhaupt auf den Bereich $D800 zugegriffen wird. $D800 ist 1101100000000000, die unteren 11 Bits interessieren uns nicht, also bleibt über 11011. $E000 ist 1110000000000000, uns interessieren wieder die unteren Bits nicht: 11100. Also ein Zugriff zwischen $D800 bis $DFFF hat die obere Bit-Sequenz 11011.
Da nutzen wir doch glatt wieder einen 74LS21. A15, A14, A12 und A11 gehen in den 4-fach AND rein und ergeben HIGH, wenn alles HIGH war. A13 invertieren wir mit unserem NOT-Gatter. Nun haben wir 2x HIGH vorliegen, wenn $D800-$DFFF adressiert ist. Unser Flip-Flop liefert auch ein HIGH, wenn das ROM aktiv ist. Diese 3 Signale führen wir wieder in den 74LS21 (das vierte Signal wird auf +5V gesetzt) und erhalten ein HIGH, wenn der Adressbereich stimmt und unser Chip selektiert werden soll

1x 74LS21
Das (EP)ROM hat einen Eingang ChipSelect und einen Eingang OutputEnable, die beide LOW sein müssen, damit vom ROM gelesen werden kann. Dort wird unser Signal-RS hin verbunden. Nun ist unser ROM aktiv!
ABER wir müssen das MathPack des OS abschalten und auch aufpassen, dass nicht das RAM unter dem ROM aktiv ist. /MPD und /EXTSEL müssen also auf LOW gezogen werden... aber nur in diesem Fall. Da hilft uns wieder der Tri-State-Buffer, dessen Eingang wir mit GND verbinden und dessen Aktivierungsleitung mit unserem RS-Signal. Der Ausgang wird mit /MPD und /EXTSEL verbunden.
Diese Schaltung hat nun folgende Bauteile:
3x 74LS21, 1x 74LS260, 1x 74LS74, 1x 74LS00, 1x 74LS125, 1x 74LS04 und 1x 3k Widerstand
8 Chips zuzüglich des (EP)ROMs und einem Widerstand.
Wie ich schon mehrfach geschrieben habe, kann ich keine Erweiterungen entwerfen und weiß auch nicht, ob dieser theoretische Ansatz richtig ist. Vielleicht ist alles einfach falsch!
Natürlich könnte man einiges der Logik durch einen GAL-Baustein ersetzen, aber das wäre der nächste Schritt und hier nicht relevant.
Die Frage ist: Bin ich auf dem Holzweg?
Getestet ist die Schaltung natürlich nicht, da es nur eine Überlegung ist, wie man das Problem lösen kann.
Grüße
Janko