Die Drucker-Modelle K6311, K6312, K6313 und K6314 haben eine baugleiche
Interface-Kassette.
Sie unterscheiden sich im wesentlichen durch
ihre ROM- und RAM-
Diese Drucker gab es mit folgenden Interface-Kassetten, soweit ich weiß:
Download Schaltplan IFSS
Will man mit der Zeit gehen und eine USB-Interfacekassette entwickeln, stellt sich die Frage, ob man mit einem heutigen Mikrocontroller die Z80-PIO einsparen kann, d.h. den Mikrocontroller direkt am Z80-Bus betreiben kann. So ein Z80-Bus ist ja verglichen mit heutigen Mikrocontrollern „quasistatisch“, und die Drucker liefen IMHO mit U880B, also max. 2,5 MHz Taktfrequenz. Da dauern Lese- und Schreibzyklen (mit 3..4 Takten) über 1 µs, kein Problem mehr.
Ein ATmega32U4, etwa auf einem Board „Pro Micro“ erscheint schnell genug, und es sind auch genug Pins verfügbar. Er kann sich dediziert um den Z80-Bus kümmern, da die USB-Seite hardware-unterstützt ist. Auf der USB-Seite wird man wohl die Drucker-Klasse (inklusive PnP) und/oder die CDC-Klasse (serielle Schnittstelle) implementieren. Auch eine PIC, etwa PIC18F25K50 bietet sich zur Implementierung an, da es diesen Chip im bastelfreundlichen Durchsteckgehäuse gibt, der das Zwischenboard auf der Lochrasterplatine erspart und keinen (!) Quarz benötigt. 16- und 32-Bit-Controller machen sich hier nicht so gut, weil es keine Typen mit 5-V-E/A-Spannungen gibt. Folgende Signale sind abzugreifen:
Busleitung | Richtung am µC | Bedeutung | Portlesen | Portschreiben | Intvektor lesen | Int-Ende | Reset |
---|---|---|---|---|---|---|---|
D7..D0 | bidirektional | Datenbus | out | in | out | in (ED-4D) | Z |
Eingang | Chipselect | L | L | x | x | x | |
C/ | Eingang | Adressbit 1 | auswerten | x | x | x | |
B/ | Eingang | Adressbit 0 | auswerten | x | x | x | |
Eingang | Befehlslesen (Opcode) | H | H | L | L | x | |
Eingang | Ein-/Ausgabeanforderung | L | L | L | H | x | |
Eingang | Lesen | L | H | L | L | x | |
Eingang | Rücksetzen | H | H | H | H | L | |
C | entfällt | Takt | x | x | x | x | x |
IEI | Eingang | Interruptfreigabeeingang | x | x | H | H | x |
IEO | Ausgang | Interruptfreigabeausgang | IEI & (internes) | H | |||
Ausgang (L oder Z) | Interruptanforderung | je nachdem | H |
Signal | D7..D0 | C/ | B/ | IEI | ||||
---|---|---|---|---|---|---|---|---|
Daten-Ausgabe | anlegen | L | auswerten | H | L | L | x | |
Daten-Eingabe | auslesen | L | auswerten | H | L | H | x | |
Interruptvektor-Ausgabe | anlegen | x | x | x | L | L | L | H |
Interrupt-Ende (1) | 0xED | x | x | x | L | H | L | H |
Interrupt-Ende (2) | x | x | x | x | H | H | H | H |
Interrupt-Ende (3) | 0x4D | x | x | x | L | H | L | H |
Am schwierigsten macht sich die Auswertung der Interruptgeschichten.
Während die Standardzyklen überall im Web publiziert sind,
findet es sich schlecht für die
Interruptannahme
und erst recht für das Interruptende.
In beiden Fällen darf der Mikrocontroller nur bei IEI = H aktiv werden.
Da hier IEO nicht verwendet wird
(d. h. das Interface-Modul ist das letzte Glied der Interruptprioritätskette)
kann man dieses Signal einsparen.
Da die Interruptanforderung
Es ist zu vermuten, dass die RETI-Dekodierlogik bei jeder Z80-Peripherie durcheinanderkommt, wenn ein Mehrbytebefehl ohne Datenlesephase mit 0xED (beispielhaft CB-ED =SET 5,L
) endet und danach ein Befehl 0x4D (=LD C,L
) kommt.
Die Hauptarbeit ist dann nur noch die Emulation
der Z80-PIO (aka U855D) in der Firmware des ATmega32U4
oder PIC18F25K50.
Wie man sieht genügt eine ISR,
die pegelgetriggert mit
TODO