80x42 Tastaturcontroller standalone betreiben?

P

Peter Heitzer

Guest
Am WE habe ich leider erfolglos versucht, einen 8042 Tastaturcontroller
außerhalb des PC zu betreiben. Ich habe einen Quarz an XTAL1/2 gehängt,
EA auf Masse und an A0, -CS, -RD und -WR jeweils einen entprellten
Taster angeschlossen. An DB0..DB7 hatte ich LED Ăźber einen LS245 gepuffert
angeschlossen. An -RESET hing ein 3.3 ÂľF Elko nach Masse.
Nach Einschalten der Betriebsspannung erwartete ich eigenlich, am
Datenport zumindest einen Fehlercode auslesen zu kĂśnnen (A0=1, -CS und
-RD jeweils 0), es kam aber nur 0 an. An den Clock- und Datenleitungen
zur Tastatur tat sich Ăźberhaupt nichts; ohne angeschlossenen Controller
waren Clock und Daten am Oszilloskop sichtbar.
Braucht der Controller erst eine Initialisierung durch ein paar
Befehle am Datenport, damit er seine normale Arbeit aufnimmt?

Mehrere Exemplare zeigten das selbe Verhalten, sodaß ein Defekt der
Controller ausgeschlossen werden kann. Zudem funktionieren sie mit
externem EPROM (mit EA auf High).




--
Dipl.-Inform(FH) Peter Heitzer, peter.heitzer@rz.uni-regensburg.de
HTML mails will be forwarded to /dev/null.
 
Am 13.04.2015 16:32, schrieb Peter Heitzer:

Braucht der Controller erst eine Initialisierung durch ein paar
Befehle am Datenport, damit er seine normale Arbeit aufnimmt?

Aus dem Handbuch zum Original IBM AT:

http://home.arcor.de/sumpfhuhn/AT-Kbd.png


Gruß Dieter
 
Dieter Wiedmann <dieter.wiedmann@t-online.de> wrote:
Am 13.04.2015 16:32, schrieb Peter Heitzer:

Braucht der Controller erst eine Initialisierung durch ein paar
Befehle am Datenport, damit er seine normale Arbeit aufnimmt?

Aus dem Handbuch zum Original IBM AT:

http://home.arcor.de/sumpfhuhn/AT-Kbd.png
Ich lese das eher so, daß ein POR schon reichen sollte.
".. controller is then ready to accept commands from the system microprocessor"
ergäbe fßr mich keinen Sinn, wenn erst Kommandos vom System an den
Controller geschickt werden mĂźssten.

--
Dipl.-Inform(FH) Peter Heitzer, peter.heitzer@rz.uni-regensburg.de
HTML mails will be forwarded to /dev/null.
 
Am 13.04.2015 17:16, schrieb Peter Heitzer:
Dieter Wiedmann<dieter.wiedmann@t-online.de> wrote:
Aus dem Handbuch zum Original IBM AT:

http://home.arcor.de/sumpfhuhn/AT-Kbd.png

Ich lese das eher so, daß ein POR schon reichen sollte.

Ich lese das auch so.

Die Schnittstelle zum Mainboard ist dir bekannt? Oder soll ich nochmal
den Scanner anwerfen?


Gruß Dieter
 
Am 13.04.2015 16:32 schrieb Peter Heitzer:

Braucht der Controller erst eine Initialisierung durch ein paar
Befehle am Datenport, damit er seine normale Arbeit aufnimmt?

Vor Ewigkeiten habe ich mal ein paar von den Dingern
auseinandergenommen. Unten angehängt ist das Programm aus einem
PhÜnix-Controller, der dßrfte repräsentativ sein.


Patrick



---------------------------------------------------------------------------

Keyboardcontroller 8042 fr Phoenix - BIOS
====================================================


1) Liste der untersttzten Befehle:

20: Kommandowort lesen
60: Kommandowort schreiben
AA: Selbsttest
AB: Interface-Test
AC: * direkter Rcksprung in Auswerteschleife
AD: Disable KBD
AE: Enable KBD
B8: * Adresse fr Speicherzugriff festlegen
BA: * internen Speicher des 8042 lesen
BB: * in internen Speicher des 8042 schreiben (nur $60-7F,E0-FF)
C0: Read Input Port (Port1)
D0: Read Output Port (Port2)
D1: Write Output Port (Port2)
E0: Read Test Inputs
Ex: * P2.1-P2.3 schreiben (A20/?/TURBO?)
Fx: Pulse Output Port
Die mit * gekennzeichneten Befehle wurden von IBM nicht dokumentiert.


2) Belegung der Ein-/Ausgabeports:

Port1: bit6: Monochrome / /Color - Jumper pin 33
bit7: /Keylock pin 34
Port2: bit0: /Reset pin 21
bit1: A20 Gate pin 22
bit2: (RAM Sel 1) pin 23
bit3: (Turbo-LED) pin 24
bit4: IRQ1 (Output Buffer Full-Flag) pin 35
bit5: /Input Buffer Full-Flag pin 36
bit6: /KBD Clock (INVERTIERT!!!) pin 37
bit7: KBD Data pin 38
Test0: KBD Clock einlesen pin 1
Test1: KBD Data einlesen pin 39


3) Speicherbelegung:

Register-Bank 0:
R0 Indexregister zur Adressierung der Speicherstellen $20-23
R1 tempor„rer Zwischenspeicher
R2 Daten <->Master <->Tastatur, Z„hler bei Romchecksumme
R3 zum Setzen/L”schen des Fehlerstatus (Routine BA/C1)
R4 Parit„t bei šbertragungen, Prfsumme bei Romchecksumme
R5 Bitz„hler bei šbertragungen
R6 0:warten auf Tasturantwort, 1:Empfangen, 2:Senden
R7 Timeout-Fehlercode

Register-Bank 1:
R0 Adresse beim Zugriff auf internen Speicher, Zwsp. fr A bei Timerint.
R1 Zwischenspeicher fr Daten beim Schreiben in den Speicher
R2 Watchdog-Multiplikator fr verl„ngerte Warteschleife

Speicher:
20 Kommandowort
21 Zwischenspeicher fr Statusport
22 Flag fr Break-Codes bei AT->XT ťbersetzung
23 Zwischenspeicher fr Port2


4) Status-Port: Kommandowort:

Bit0: Ausgabepuffer voll (OBF) Bit0: Interrupt freigeben
Bit1: Eingabepuffer voll ('Busy') (IBF) Bit1: Reserviert 0
Bit2: System Flag (0 bei Pwr-On) (F0) Bit2: System-Flag setzen
Bit3: 1:Command ($64), 0:Data ($60) (F1) Bit3: Keylock ignorieren
Bit4: Tastatur nicht abgeschlossen Bit4: Tastatur anhalten
(Clk Lo)
Bit5: Transmit TimeOut Bit5: PC-Interface nachbilden
Bit6: Receive TimeOut Bit6: Codewandlung AT -> XT
Bit7: Parit„tsfehler Bit7: Reserviert 0


5) Beispiel: ťbertragene Daten fr <ESC> ('76')

1 Start-, 8 Daten-, Odd-Parity- und 1 Stopbit
ÄÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ ÚÄ¿ Ú¿ ÚÄÄÄÄ KBD Clock
ÀÄÙ ÀÄÙ ÀÄÙ ÀÄÙ ÀÄÙ ÀÄÙ ÀÄÙ ÀÄÙ ÀÄÙ ÀÄÙ ÀÄÙÀÄÄÄÄÄÄÄÄÄÄÙ
ÄÄ¿0 0 ÚÄÄÄÄÄÄÄ¿0 ÚÄÄÄÄÄÄÄÄÄÄÄ¿0 0 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ KBD Data
ÀÄÄÄÄÄÄÄÙ1 1 ÀÄÄÄÙ1 1 1 ÀÄÄÄÄÄÄÄÙ1
|Sta| LSB '6' | MSB '7' |Par|Sto|



-0000 00 NOP ; Reset-Einsprung
0001 23 CF MOV A,#0CFH ;
0003 3A OUTL P2,A ;
0004 F5 EN FLAGS ; OBF -> P2.4 (IRQ1), /IBF -> P2.5
0005 04 12 JMP 012H ;

-0007 64 B5 JMP 3B5H ; Timer-Interrupt

0009 23 CF MOV A,#0CFH ;
000B 3A OUTL P2,A ;
000C F5 EN FLAGS ;
000D 04 12 JMP 012H ;

-000F 23 CF MOV A,#0CFH ; Initialisierung nach Selbsttest
0011 3A OUTL P2,A ; (Tastatur ist abgeschaltet!)

-0012 B8 23 MOV R0,#23H ; Port2-Buffer auf #0C initialisiert
0014 B0 0C MOV @R0,#0CH ; (Bit2+3 = 1)
0016 B8 20 MOV R0,#20H ; Kommandowort auf #50
initialisiert
0018 B0 50 MOV @R0,#50H ; (Codebers. ein, KBD disabled)
001A B8 21 MOV R0,#21H ; Statusport auf #10 initialisiert
001C B0 10 MOV @R0,#10H ;

-001E B8 22 MOV R0,#22H ; Break-Code-Flag rcksetzen
0020 B0 00 MOV @R0,#00H ;
0022 BF 00 MOV R7,#00H ; Fehlercode fr Timeout-Routine
0024 BE 01 MOV R6,#01H ; 0: Warten auf Antwort,
1: Empfangen,
2: Senden

Beginn der Hauptschleife:

-0026 BD 09 MOV R5,#09H ; 8 Datenbits
0028 BC 00 MOV R4,#00H ; Parityz„hler
002A B9 00 MOV R1,#00H ;
002C 23 CD MOV A,#0CDH ; Timeout := #CD
002E 62 MOV T,A ;
002F B8 20 MOV R0,#20H ; Kommandowort lesen
0031 F0 MOV A,@R0 ;
0032 92 36 JB4 36H ; KBD disabled ->
0034 04 3A JMP 03AH ;

-0036 D6 JNIBF 036H ; Warten auf Master-WRITE
0038 24 05 JMP 105H ; Master-Anfrage auswerten

-003A FE MOV A,R6 ; R6=0: Antwort vom KBD abholen
003B C6 41 JZ 41H ;
003D D6 JNIBF 41H ; berspringen, wenn keine Daten da
003F 24 05 JMP 105H ; Master Anfrage auswerten
-0041 86 3A JOBF 3AH ; wiederholen bis Daten abgeholt
0043 9A BF ANL P2,#0BFH ; KBD Clk auf Hi legen
0045 56 3A JT1 3AH ; kein Startbit (Lo) auf KBD
Data ->
-0047 36 47 JT0 47H ; warten auf Clock Lo

0049 FE MOV A,R6 ;
004A 96 4E JNZ 4EH ; keine Antwort erwartet ->
004C 04 52 JMP 052H ;

-004E BE 01 MOV R6,#01H ;
0050 25 EN TCNTI ;
0051 55 STRT T ; Watchdog aktivieren

-0052 26 52 JNT0 52H ; warten auf Clock Hi
-0054 36 54 JT0 54H ; warten auf Clock Lo
0056 ED 67 DJNZ R5,67H ; 8 bit holen
0058 46 5D JNT1 5DH ; Data Lo ->
005A 1C INC R4 ; sonst Parity erh”hen
005B 04 5D JMP 05DH ;
-005D 26 5D JNT0 5DH ; warten auf Clock Hi
-005F 36 5F JT0 5FH ; warten auf Clock Lo
0061 8A 40 ORL P2,#40H ; Clock auf Lo legen
0063 35 DIS TCNTI ;
0064 65 STOP TCNT ; Watchdog abschalten
0065 04 71 JMP 071H ;

-0067 97 CLR C ; Carry auf Lo
0068 56 6C JT1 6CH ; Data Hi ->
006A 04 6E JMP 06EH ;

-006C A7 CPL C ; Carry auf Hi
006D 1C INC R4 ; Parit„t erh”hen

-006E 67 RRC A ; Carry einrotieren
006F 04 52 JMP 052H ; und n„chstes Bit holen

-0071 AA MOV R2,A ; R2 hat empfangenes Zeichen
0072 FC MOV A,R4 ; Parity testen
0073 12 88 JB0 88H ; ungerade ->
0075 FE MOV A,R6 ; wurde Antwort erwartet?
0076 C6 80 JZ 80H ; ja ->
0078 BB 80 MOV R3,#80H ; Bit7 Status setzen
007A 14 BA CALL 0BAH ; (Parity Error)
007C BA FF MOV R2,#0FFH ;
007E 04 B3 JMP 0B3H ;
-0080 BB A0 MOV R3,#0A0H ; Bit7/5 Status setzen
0082 14 BA CALL 0BAH ; (Parity Error und Xmit Timeout)
0084 BA FF MOV R2,#0FFH ; Daten:FF
0086 04 9C JMP 09CH ; falls erlaubt Daten zum Master

-0088 BB 1F MOV R3,#1FH ; Statusport rcksetzen
008A 14 C1 CALL 0C1H ;
008C B8 20 MOV R0,#20H ; Kommandowort
008E F0 MOV A,@R0 ;
008F 53 40 ANL A,#40H ; Bit 6
0091 C6 9C JZ 9CH ; 0 dann keine AT->PC ĹĄbersetzung

0093 74 80 CALL 380H ; umkodieren
0095 B8 22 MOV R0,#22H ; REG22=0: Daten zum Controller
0097 F0 MOV A,@R0 ;
0098 C6 9C JZ 9CH ;

009A 04 26 JMP 026H ;

KBD INH testen und falls erlaubt R2 zum Master:

-009C 09 IN A,P1 ; Port 1
009D 53 80 ANL A,#80H ; Bit 7 (KBD INH-Schalter)
isolieren
009F A9 MOV R1,A ;
00A0 C6 A8 JZ 0A8H ; Tastatur abgeschlossen ->

00A2 BB 10 MOV R3,#10H ; Bit 4 (/Keylock) Status setzen
00A4 14 BA CALL 0BAH ;
00A6 04 B3 JMP 0B3H ;
-00A8 BB EF MOV R3,#0EFH ; Bit 4 (/Keylock) Status l”schen
00AA 14 C1 CALL 0C1H ;
00AC B8 20 MOV R0,#20H ; Kommandowort
00AE F0 MOV A,@R0 ;
00AF 72 B3 JB3 0B3H ; Bit3:KBD INH ignorieren ->
00B1 04 B6 JMP 0B6H ;

-00B3 FA MOV A,R2 ;
00B4 74 E9 CALL 3E9H ; Daten zum Master schicken
-00B6 BE 01 MOV R6,#01H ; wieder auf Empfang gehen
00B8 04 26 JMP 026H ; und zurck zur Hauptschleife

Bits im Statusport setzen:

-00BA B8 21 MOV R0,#21H ; REG21
00BC F0 MOV A,@R0 ;
00BD 4B ORL A,R3 ; OR R3
00BE 90 MOV STS,A ; Daten in Statusport
00BF A0 MOV @R0,A ; und nach REG21
00C0 83 RET ;

Bits im Statusport l”schen:

-00C1 B8 21 MOV R0,#21H ; REG21
00C3 F0 MOV A,@R0 ;
00C4 5B ANL A,R3 ; AND R3
00C5 90 MOV STS,A ; Daten in Statusport
00C6 A0 MOV @R0,A ; und nach REG21
00C7 83 RET ;

Checksum Page 0:

-00FE A3 MOVP A,@A ;
00FF 83 RET ;

0100 97 Checksummenfllbyte, diese Zahl + Checksumme = 0

0101 15 DIS I ???
0102 35 DIS TCNTI ???
0103 00 NOP
0104 00 NOP

Master-Anfrage auswerten:

-0105 8A 40 ORL P2,#40H ; KBD Clk auf Lo legen
0107 35 DIS TCNTI ;
0108 65 STOP TCNT ; Watchdog abschalten
0109 BB 1F MOV R3,#1FH ; Status rcksetzen
010B 14 C1 CALL 0C1H ;
010D 76 26 JF1 26H ; A2=1 ($64) -> zur
Befehlsauswertung
010F 22 IN A,DBB ; sonst: Daten vom Master holen
0110 AA MOV R2,A ;
0111 54 97 CALL 297H ; und zur Tastatur senden
0113 BE 00 MOV R6,#00H ; wir warten auf Antwort
0115 D5 SEL RB1 ; RB1.R2 := 0C
(Watchdog-Multiplikator)
0116 BA 0C MOV R2,#0CH ;
0118 C5 SEL RB0 ;

0119 23 CD MOV A,#0CDH ; Timeout := #CD
011B 62 MOV T,A ;
011C 25 EN TCNTI ;
011D 55 STRT T ; Watchdog wieder einschalten

011E B8 20 MOV R0,#20H ; Kommandowort
0120 F0 MOV A,@R0 ;
0121 53 EF ANL A,#0EFH ; Bit 4 l”schen (KBD enable)
0123 A0 MOV @R0,A ;
0124 04 26 JMP 026H ; und zur Hauptschleife

Befehlsauswertung:

-0126 22 IN A,DBB ; Daten vom Master holen
0127 AA MOV R2,A ;
0128 23 20 MOV A,#20H ; Kommando 20: Kommandowort lesen
012A DA XRL A,R2 ;
012B C6 8B JZ 8BH ;
012D 23 60 MOV A,#60H ; Kommando 60: Kommandowort
schreiben
012F DA XRL A,R2 ;
0130 C6 92 JZ 92H ;
0132 23 AA MOV A,#0AAH ; Kommando AA: ROM-Checksumme
prfen
0134 DA XRL A,R2 ;
0135 C6 AE JZ 0AEH ;
0137 23 AB MOV A,#0ABH ; Kommando AB: Leitungstest
0139 DA XRL A,R2 ;
013A 96 3E JNZ 3EH ;
013C 44 08 JMP 208H ;
-013E 23 AC MOV A,#0ACH ; Kommando AC: keine Funktion
0140 DA XRL A,R2 ;
0141 C6 F8 JZ 0F8H ;
0143 23 AD MOV A,#0ADH ; Kommando AD: Disable Keyboard
0145 DA XRL A,R2 ;
0146 C6 F0 JZ 0F0H ;
0148 23 AE MOV A,#0AEH ; Kommando AE: Enable Keyboard
014A DA XRL A,R2 ;
014B 96 4F JNZ 4FH ;
014D 44 00 JMP 200H ;
-014F 23 C0 MOV A,#0C0H ; Kommando C0: Port1 lesen
0151 DA XRL A,R2 ;
0152 96 56 JNZ 56H ;
0154 44 21 JMP 221H ;
-0156 23 D0 MOV A,#0D0H ; Kommando D0: Port2 lesen
0158 DA XRL A,R2 ;
0159 96 5D JNZ 5DH ;
015B 44 26 JMP 226H ;
-015D 23 D1 MOV A,#0D1H ; Kommando D1: Port2 schreiben
015F DA XRL A,R2 ;
0160 96 64 JNZ 64H ;
0162 44 2B JMP 22BH ;
-0164 23 E0 MOV A,#0E0H ; Kommando E0: Testeing„nge lesen
0166 DA XRL A,R2 ;
0167 96 6B JNZ 6BH ;
0169 44 36 JMP 236H ;
-016B 23 B8 MOV A,#0B8H ; Kommando B8: Adresse ausw„hlen
016D DA XRL A,R2 ;
016E 96 72 JNZ 72H ;
0170 84 00 JMP 400H ;
-0172 23 BA MOV A,#0BAH ; Kommando BA: Speicherstelle lesen
0174 DA XRL A,R2 ;
0175 96 79 JNZ 79H ;
0177 84 08 JMP 408H ;
-0179 23 BB MOV A,#0BBH ; Kommando BB: Speicherstelle
schreiben
017B DA XRL A,R2 ;
017C 96 80 JNZ 80H ;
017E 84 0F JMP 40FH ;
-0180 FA MOV A,R2 ;
0181 53 F0 ANL A,#0F0H ;
0183 D3 E0 XRL A,#0E0H ;
0185 96 89 JNZ 89H ;
0187 84 27 JMP 427H ; Kommando Ex: Port2 bit1-3
schalten
-0189 44 44 JMP 244H ; Kommando Fx und alle brigen:
Bit0-3 -> Impuls
P2.0-3

Kommando 20: Kommandowort lesen

-018B B8 20 MOV R0,#20H ; Kommandowort lesen
018D F0 MOV A,@R0 ;
-018E 74 E9 CALL 3E9H ; Daten zum Master schicken
0190 04 26 JMP 026H ; und zurck zur Hauptschleife

Kommando 60: Kommandowort schreiben

-0192 D6 92 JNIBF 92H ; Warten auf Master-WRITE
0193 22 IN A,DBB ; Daten vom Master holen
0195 B8 20 MOV R0,#20H ; in Kommandowort schreiben
0197 A0 MOV @R0,A ;
0198 92 9C JB4 9CH ; Bit4: 1: KBD disable
019A 24 9E JMP 19EH ;
-019C 8A 40 ORL P2,#40H ; Bit4 -> KBD Clock auf Lo legen
-019E 85 CLR F0 ;
019F 52 A3 JB2 0A3H ; Bit2 -> F0 (System Flag:
Status Bit2)
01A1 24 A4 JMP 1A4H ;
-01A3 95 CPL F0 ;
-01A4 12 AA JB0 0AAH ; Bit0 -> INT1 enable
01A6 9A EF ANL P2,#0EFH ; OBF auf Lo kleben (Hi-active!)
01A8 24 AC JMP 1ACH ;
-01AA 8A 10 ORL P2,#10H ;
-01AC 04 26 JMP 026H ; zur Hauptschleife

Kommando AA: ROM-Checksumme prfen, OK:55, FEHLER:FF

-01AE 34 C0 CALL 1C0H ; ROM-Checksumme berechnen
01B0 23 00 MOV A,#00H ; Fllbyte von 0100 holen
01B2 A3 MOVP A,@A ;
01B3 6C ADD A,R4 ; zur Checksumme addieren
01B4 96 BA JNZ 0BAH ; Fehler ->

01B6 23 55 MOV A,#55H ; OK-Code #55
01B8 24 BC JMP 1BCH ;

-01BA 23 FF MOV A,#0FFH ; Fehler-Code #FF
-01BC 74 E9 CALL 3E9H ; Daten zum Master schicken
01BE 04 0F JMP 00FH ; und Register initialisieren

ROM-Checksumme berechnen:

-01C0 BC 00 MOV R4,#00H ;

01C2 BA 00 MOV R2,#00H ;
-01C4 FA MOV A,R2 ;
01C5 14 FE CALL 0FEH ; Bytes aus Page 0
01C7 6C ADD A,R4 ;
01C8 AC MOV R4,A ;
01C9 EA C4 DJNZ R2,0C4H ;

01CB BA FF MOV R2,#0FFH ; Byte $100 nicht mitrechnen
-01CD FA MOV A,R2 ; (Fllbyte)
01CE 34 FE CALL 1FEH ; Bytes aus Page 1
01D0 6C ADD A,R4 ;
01D1 AC MOV R4,A ;
01D2 EA CD DJNZ R2,0CDH ;

01D4 BA 00 MOV R2,#00H ;
-01D6 FA MOV A,R2 ;
01D7 54 FE CALL 2FEH ; Bytes aus Page 2
01D9 6C ADD A,R4 ;
01DA AC MOV R4,A ;
01DB EA D6 DJNZ R2,0D6H ;

01DD BA 00 MOV R2,#00H ;
-01DF FA MOV A,R2 ;
01E0 74 FE CALL 3FEH ; Bytes aus Page 3
01E2 6C ADD A,R4 ;
01E3 AC MOV R4,A ;
01E4 EA DF DJNZ R2,0DFH ;

01E6 BA 00 MOV R2,#00H ;
-01E8 FA MOV A,R2 ;
01E9 94 FE CALL 4FEH ; Bytes aus Page 4
01EB 6C ADD A,R4 ;
01EC AC MOV R4,A ;
01ED EA E8 DJNZ R2,0E8H ;

01EF 83 RET ;

Kommando AD: Bit 4 Kommandowort Hi: Disable Keyboard

-01F0 B8 20 MOV R0,#20H ; Kommandowort OR #10
01F2 F0 MOV A,@R0 ;
01F3 43 10 ORL A,#10H ;
01F5 A0 MOV @R0,A ;
01F6 8A 40 ORL P2,#40H ; Kbd Clk High:Lo ausgeben
-01F8 04 26 JMP 026H ; zurck zur Hauptschleife

Checksum Page 1:

-01FE A3 MOVP A,@A ;
01FF 83 RET ;

Kommando AE: Bit 4 Kommandowort Lo: Enable Keyboard

-0200 B8 20 MOV R0,#20H ; Kommandowort
0202 F0 MOV A,@R0 ;
0203 53 EF ANL A,#0EFH ; Bit 4 low
0205 A0 MOV @R0,A ;
0206 04 26 JMP 026H ; zurck zur Hauptschleife

Kommando AB: Leitungstest

-0208 9A 7F ANL P2,#7FH ; KBD Data Lo ausgeben
020A 23 04 MOV A,#04H ;
020C 56 1F JT1 1FH ; falls Hi Fehlercode 4

020E 8A 80 ORL P2,#80H ; KBD Data Hi ausgeben
0210 07 DEC A ;
0211 46 1F JNT1 1FH ; falls Lo Fehlercode 3
0213 9A BF ANL P2,#0BFH ; KBD Clk Hi ausgeben
0215 23 01 MOV A,#01H ;
0217 26 1F JNT0 1FH ; falls Lo Fehlercode 1
0219 8A 40 ORL P2,#40H ; KBD Clk Lo ausgeben
021B 17 INC A ;
021C 36 1F JT0 1FH ; falls Hi Fehlercode 2
021E 27 CLR A ; sonst OK: Code 0

-021F 24 8E JMP 18EH ; Daten zum Master schicken
und zurck

Kommando C0: Read Input Port

-0221 09 IN A,P1 ; Port 1 lesen
0222 74 E9 CALL 3E9H ; Daten zum Master schicken
0224 04 26 JMP 026H ; und zurck zur Hauptschleife

Kommando D0: Read Output Port

-0226 0A IN A,P2 ; Port 2 lesen
0227 74 E9 CALL 3E9H ; Daten zum Master schicken
0229 04 26 JMP 026H ; und zurck zur Hauptschleife

Kommando D1: Write Output Port (Bit 2/3 werden nicht beachtet)

-022B D6 JNIBF 2BH ; Warten auf Master-WRITE
022D 22 IN A,DBB ; Daten vom Master
022E 53 F3 ANL A,#0F3H ; Bit 2/3 nicht beachten
0230 B8 23 MOV R0,#23H ;
0232 40 ORL A,@R0 ; OR-Verknpfung Register 23
0233 3A OUTL P2,A ; zum Port 2
0234 04 26 JMP 026H ; und zurck zur Hauptschleife

Kommando E0: Testeing„nge lesen

-0236 23 00 MOV A,#00H ; T0 (Kbd Clk) -> Bit0
0238 26 3C JNT0 3CH ;
023A 23 01 MOV A,#01H ; T1 (Kbd Data) -> Bit1
-023C 46 40 JNT1 40H ;
023E 03 02 ADD A,#02H ;
-0240 74 E9 CALL 3E9H ; Daten zum Master schicken
0242 04 26 JMP 026H ; und zurck zur Hauptschleife

Kommando Fx und sonstige: untere 4 Bits Port 2 pulsen
(alle im LSB als 0 angegebenen Bits werden nacheinander gepulst)

-0244 FA MOV A,R2 ;
0245 12 4F JB0 4FH ;

0247 9A FE ANL P2,#0FEH ; Bit 0 pulsen
0249 00 NOP ;
024A 00 NOP ;
024B 00 NOP ;
024C 00 NOP ;
024D 8A 01 ORL P2,#01H ;

-024F FA MOV A,R2 ;
0250 32 5A JB1 5AH ;

0252 9A FD ANL P2,#0FDH ; Bit 1 pulsen
0254 00 NOP ;
0255 00 NOP ;
0256 00 NOP ;
0257 00 NOP ;
0258 8A 02 ORL P2,#02H ;

-025A FA MOV A,R2 ;
025B 52 65 JB2 65H ;

025D 9A FB ANL P2,#0FBH ; Bit 2 pulsen
025F 00 NOP ;
0260 00 NOP ;
0261 00 NOP ;
0262 00 NOP ;
0263 8A 04 ORL P2,#04H ;

-265 FA MOV A,R2 ;
0266 72 70 JB3 70H ;

0268 9A F7 ANL P2,#0F7H ; Bit 3 pulsen
026A 00 NOP ;
026B 00 NOP ;
026C 00 NOP ;
026D 00 NOP ;
026E 8A 08 ORL P2,#08H ;

-0270 04 26 JMP 026H ; zurck zur Hauptschleife

TimeOut-Routine:

-0272 35 DIS TCNTI ;
0273 65 STOP TCNT ;
0274 BB 1F MOV R3,#1FH ; Statusport rcksetzen
0276 14 C1 CALL 0C1H ;
0278 FF MOV A,R7 ; R7:Bit0: Receive Timeout,
Bit1: keine Antwort auf
Befehl,
Bit2: Transmit Timeout

0279 12 85 JB0 85H ; Takt kam nicht

027B 32 8D JB1 8DH ; keine Antwort gekommen

027D BB 20 MOV R3,#20H ; Statusport Bit 5 setzen
027F 14 BA CALL 0BAH ; (Transmit Timeout)
0281 23 FE MOV A,#0FEH ; Code:FE
0283 44 93 JMP 293H ;

-0285 BB 40 MOV R3,#40H ; Statusport Bit 6 setzen
0287 14 BA CALL 0BAH ; (Receive Timeout)
0289 23 FF MOV A,#0FFH ; Code:FF
028B 44 93 JMP 293H ;

-028D BB 60 MOV R3,#60H ; Statusport Bit 5/6 setzen
028F 14 BA CALL 0BAH ; (Keine Antwort auf Befehl)
0291 23 FE MOV A,#0FEH ; Code:FE
-0293 74 E9 CALL 3E9H ; Daten zum Master schicken
0295 04 1E JMP 01EH ; und die Hauptschleife neu
initialis.

Daten zur Tastatur senden:

-0297 8A 40 ORL P2,#40H ; KBD Clock Lo ausgeben

0299 B9 18 MOV R1,#18H ;
-029B E9 9B DJNZ R1,9BH ; Pause

029D 9A 7F ANL P2,#7FH ; KBD Data Lo (Startbit)

029F BF 00 MOV R7,#00H ; Fehlercode fr Timeout-Routine
02A1 BC 00 MOV R4,#00H ; Parity initialisieren
02A3 BD 08 MOV R5,#08H ; 8 Bits
02A5 BE 02 MOV R6,#02H ; wir senden gerade

02A7 23 01 MOV A,#01H ; Timeout := #01
02A9 62 MOV T,A ;
02AA 25 EN TCNTI ;
02AB 55 STRT T ; Watchdog einschalten

02AC 9A BF ANL P2,#0BFH ; KBD Clock Hi ausgeben
02AE FA MOV A,R2 ;
02AF 67 RRC A ; erstes Bit ins Carry
02B0 AA MOV R2,A ;
-02B1 36 B1 JT0 0B1H ; auf Clock Lo warten

02B3 23 CD MOV A,#0CDH ; Timeout := #CD
02B5 62 MOV T,A ;

02B6 F6 C7 JC 0C7H ; 1 senden falls C=1
02B8 44 CA JMP 2CAH ; sonst 0 senden

Anfang Schleife:

-02BA FA MOV A,R2 ; Bit aus R2 ausrotieren
02BB 67 RRC A ;
02BC AA MOV R2,A ;
02BD F6 C5 JC 0C5H ; C=1: 1 senden
-02BF 36 BF JT0 0BFH ; auf Clock Lo warten
02C1 9A 7F ANL P2,#7FH ; KBD Data auf Lo
02C3 44 CA JMP 2CAH ;
-02C5 36 C5 JT0 0C5H ; auf Clock Lo warten
-02C7 8A 80 ORL P2,#80H ; KBD Data auf Hi
02C9 1C INC R4 ; Parity toggeln
-02CA 26 CA JNT0 0CAH ; auf Clock Hi warten
02CC ED BA DJNZ R5,BAH ; 8 Datenbits senden

Ende Schleife:

02CE FC MOV A,R4 ; Parity-Bit (Odd) schicken
02CF 12 D7 JB0 0D7H ; Paritybit Lo ->

02D1 36 D1 JT0 0D1H ; auf Clock Lo warten
02D3 8A 80 ORL P2,#80H ; KBD Data auf Hi (Parity- u.
Stopbit)
02D5 44 DF JMP 2DFH ;

-02D7 36 D7 JT0 0D7H ; auf Clock Lo warten
02D9 9A 7F ANL P2,#7FH ; KBD Data auf Lo (Paritybit)
-02DB 26 DB JNT0 0DBH ; auf Clock Hi warten
-02DD 36 DD JT0 0DDH ; auf Clock Lo warten

-02DF 8A 80 ORL P2,#80H ; KBD Data auf Hi (Stopbit)
-02E1 56 E1 JT1 0E1H ; auf KBD Data Lo warten
02E3 35 DIS TCNTI ;
02E4 65 STOP TCNT ; Watchdog wieder abschalten
02E5 83 RET ;

Checksum Page 2:

-02FE A3 MOVP A,@A ;
02FF 83 RET ;

Umkodiertabelle AT nach XT:

0300 FF 43 41 3F 3D 3B 3C 58-64 44 42 40 3E 0F 29 59 .CA?=;<XdDB@>.)Y
0310 65 38 2A 70 1D 10 02 5A-66 71 2C 1F 1E 11 03 5B e8*p...Zfq,....[
0320 67 2E 2D 20 12 05 04 5C-68 39 2F 21 14 13 06 5D g.- ...\h9/!...]
0330 69 31 30 23 22 15 07 5E-6A 72 32 24 16 08 09 5F i10#"..^jr2$..._
0340 6B 33 25 17 18 0B 0A 60-6C 34 35 26 27 19 0C 61 k3%....`l45&'..a
0350 6D 73 28 74 1A 0D 62 6E-3A 36 1C 1B 75 2B 63 76 ms(t..bn:6..u+cv
0360 55 56 77 78 79 7A 0E 7B-7C 4F 7D 4B 47 7E 7F 6F UVwxyz.{|O}KG~o
0370 52 53 50 4C 4D 48 01 45-57 4E 51 4A 37 49 46 54 RSPLMH.EWNQJ7IFT

ťbersetzung AT -> XT: Make-Code XX -> YY (Taste gedrckt)
Break-Code F0 XX -> ($80+YY) (Taste
losgelassen)

-0380 FA MOV A,R2 ;
0381 D3 F0 XRL A,#0F0H ;
0383 96 8A JNZ 8AH ; kein Break-Code (F0 XX) ->
0385 B8 22 MOV R0,#22H ; REG22:=01 (nicht zum Master
schicken,
0387 B0 01 MOV @R0,#01H ; Break-Code-Flag setzen)
0389 83 RET ;

-038A FA MOV A,R2 ;
038B 96 93 JNZ 93H ; <>00 ->
038D B8 22 MOV R0,#22H ;
038F B0 00 MOV @R0,#00H ; REG22:=00 (Break Flag rcksetzen)
0391 64 B0 JMP 3B0H ;

-0393 B9 7F MOV R1,#7FH ; A:=#7F-A
0395 37 CPL A ;
0396 17 INC A ;
0397 69 ADD A,R1 ;
0398 C6 B0 JZ 0B0H ;
039A F6 B0 JC 0B0H ; Scancode <= #7F ->
039C 23 83 MOV A,#83H ;
039E DA XRL A,R2 ; Scancode <> #83 ->
039F 96 A6 JNZ 0A6H ;

03A1 23 41 MOV A,#41H ; #83 -> #41
03A3 74 DB CALL 3DBH ; Prefix umkodieren
03A5 83 RET ;

-03A6 23 84 MOV A,#84H ;
03A8 DA XRL A,R2 ; Scancode <> #84 ->
03A9 96 AF JNZ 0AFH ;
03AB 23 54 MOV A,#54H ; #84 -> #54
03AD 74 DB CALL 3DBH ; Prefix umkodieren
-03AF 83 RET ;

-03B0 FA MOV A,R2 ; Scancode holen
03B1 E3 MOVP3 A,@A ; Zeichen aus Tabelle holen
03B2 74 DB CALL 3DBH ; Prefix umkodieren
03B4 83 RET ;

TimerInterrupt:

03B5 D5 SEL RB1 ;
03B6 28 XCH A,R0 ; A -> RB1:R0
03B7 C5 SEL RB0 ;
03B8 FE MOV A,R6 ; R6 -> A (Fehlerursache)
03B9 D5 SEL RB1 ;
03BA 96 C5 JNZ 0C5H ; keine Antwort erwartet ->
03BC 28 XCH A,R0 ;
03BD EA C4 DJNZ R2,0C4H ; Multiplikator <> 0 -> Ende

03BF C5 SEL RB0 ; Zeit abgelaufen
03C0 BF 02 MOV R7,#02H ; Fehler 2: keine Antwort vom KBD
03C2 64 D1 JMP 3D1H ;

-03C4 93 RETR ;

-03C5 32 CD JB1 0CDH ; wurde gesendet? ja ->

03C7 28 XCH A,R0 ; sonst wurde wohl empfangen
03C8 C5 SEL RB0 ;
03C9 BF 01 MOV R7,#01H ; Fehler 1: Receive Timeout
03CB 64 D1 JMP 3D1H ;

-03CD 28 XCH A,R0 ;
03CE C5 SEL RB0 ;
03CF BF 04 MOV R7,#04H ; Fehler 4: Transmit Timeout

-03D1 74 DA CALL 3DAH ; Interrupt abbrechen
03D3 8A C0 ORL P2,#0C0H ; KBD /Clk+Data auf Hi, also
Clk auf Lo
03D5 23 20 MOV A,#20H ;
03D7 D7 MOV PSW,A ;
03D8 44 72 JMP 272H ; Timeout-Routine

-03DA 93 RETR ;

Break-Codes umwandeln:

-03DB AA MOV R2,A ; Scancode in R2
03DC B8 22 MOV R0,#22H ; Flag fr Prefix testen
03DE F0 MOV A,@R0 ;
03DF 96 E2 JNZ 0E2H ; ist es Break-Code? ja ->
03E1 83 RET ; sonst zurck
-03E2 FA MOV A,R2 ;
03E3 03 80 ADD A,#80H ; Break-Code generieren
03E5 B0 00 MOV @R0,#00H ; Break-Code-Flag rcksetzen
03E7 AA MOV R2,A ;
03E8 83 RET ;

Daten zum Master senden:

-03E9 02 OUTL DBB,A ;
-03EA D6 ED JNIBF EDH ; vorzeitige Rckkehr bei
Master-WRITE
03EC 83 RET ;
-03ED 86 EA JOBF 0EAH ; Warten auf Master-READ
03EF 83 RET ;

Checksum Page 3:

-03FE A3 MOVP A,@A ;
03FF 83 RET ;

Kommando B8: Zu lesende Speicherstelle ausw„hlen

-0400 D6 JNIBF 00H ; Warten auf Master-WRITE
0402 22 IN A,DBB ; Daten vom Master holen
0403 D5 SEL RB1 ;
0404 A8 MOV R0,A ; in RB1:R0
0405 C5 SEL RB0 ;
0406 04 26 JMP 026H ; und zurck zur Hauptschleife

Kommando BA: Speicherstelle lesen

-0408 D5 SEL RB1 ;
0409 F0 MOV A,@R0 ; [RB1:R0]
040A C5 SEL RB0 ;
040B 74 E9 CALL 3E9H ; Daten zum Master
040D 04 26 JMP 026H ; und zurck zur Hauptschleife

Kommando BB: Speicherstelle schreiben
(nur m”glich bei Speicherstelle $60-$7F und $E0-$FF)

-040F D6 0F JNIBF 0FH ; Warten auf Master-WRITE
0411 22 IN A,DBB ; Daten vom Master holen
0412 D5 SEL RB1 ;
0413 A9 MOV R1,A ; in RB1:R1
0414 F8 MOV A,R0 ;
0415 53 7F ANL A,#7FH ; untere 7 Bits der Adresse
0417 03 A0 ADD A,#0A0H ;
0419 F6 22 JC 22H ; >5F ->

041B C5 SEL RB0 ;
041C BB E0 MOV R3,#0E0H ; Fehlerstatus
041E 14 BA CALL 0BAH ; Bits im Statusport setzen
0420 04 26 JMP 026H ; und zurck zur Hauptschleife

-0422 F9 MOV A,R1 ; in Speicher schreiben
0423 A0 MOV @R0,A ;
0424 C5 SEL RB0 ;
0425 04 26 JMP 026H ; und zur Hauptschleife springen

Kommando Ex: Port 2.1-2.3 setzen/l”schen
Bit0: 0: l”schen, 1: setzen
Bit1-3: 1: wird beeinfluĂĄt, 0: keine Beeinflussung

-0427 0A IN A,P2 ;
0428 A9 MOV R1,A ;
0429 B8 23 MOV R0,#23H ;
042B FA MOV A,R2 ; Bit 0 des Kommandos
042C 12 39 JB0 39H ; 1 -> Bits setzen

042E 53 0C ANL A,#0CH ; Bit 2/3 AND
0430 50 ANL A,@R0 ;
0431 A0 MOV @R0,A ;
0432 23 F1 MOV A,#0F1H ; F1
0434 4A ORL A,R2 ; OR Kommando Bit 1,2,3
0435 59 ANL A,R1 ; AND Port 2
0436 3A OUTL P2,A ; zum Port 2
0437 84 42 JMP 442H ;

-0439 53 0C ANL A,#0CH ; Bit 2/3 OR
043B 40 ORL A,@R0 ;
043C A0 MOV @R0,A ;
043D 23 0E MOV A,#0EH ; 0E
043F 5A ANL A,R2 ; AND Kommando Bit 1,2,3
0440 49 ORL A,R1 ; OR Port 2
0441 3A OUTL P2,A ; zum Port 2

-0442 B8 20 MOV R0,#20H ; Kommandowort
0444 F0 MOV A,@R0 ;
0445 12 4B JB0 4BH ; Bit0:1 -> IRQ1-Leitung freigeben

0447 9A EF ANL P2,#0EFH ; IRQ1 auf Low legen (sperren)
0449 04 26 JMP 026H ; und zur Hauptschleife springen

-044B 8A 10 ORL P2,#10H ; IRQ auf High legen
044D 04 26 JMP 026H ; und zur Hauptschleife

Checksum Page 4:

-04FE A3 MOVP A,@A ;
04FF 83 RET ;
 
Dieter Wiedmann <dieter.wiedmann@t-online.de> wrote:
Am 13.04.2015 17:16, schrieb Peter Heitzer:
Dieter Wiedmann<dieter.wiedmann@t-online.de> wrote:
Aus dem Handbuch zum Original IBM AT:

http://home.arcor.de/sumpfhuhn/AT-Kbd.png

Ich lese das eher so, daß ein POR schon reichen sollte.

Ich lese das auch so.

Die Schnittstelle zum Mainboard ist dir bekannt? Oder soll ich nochmal
den Scanner anwerfen?
Nein, danke. Das AT Referenzmanual habe ich zufälligerweise selber.
Ich denke aber, ich habe immer nur das Statusregister (A0=1 entspr.
0x64 im PC) gelesen und dort ist 0 der Normalfall. Ich wollte aber
den Outputbuffer lesen (dort sollte nach POR ein 0x55 stehen). Dazu
muss ich aber erst das Kommando 0xD0 an den Controller schicken.


--
Dipl.-Inform(FH) Peter Heitzer, peter.heitzer@rz.uni-regensburg.de
HTML mails will be forwarded to /dev/null.
 
Am 14.04.2015 08:41, schrieb Peter Heitzer:

> Das AT Referenzmanual habe ich zufälligerweise selber.

Dann schau doch in der Initialisierung und der Keyboardinterruptroutine
nach, BIOS-Listing ist ja auch drin.


Ich denke aber, ich habe immer nur das Statusregister (A0=1 entspr.
0x64 im PC) gelesen und dort ist 0 der Normalfall. Ich wollte aber
den Outputbuffer lesen (dort sollte nach POR ein 0x55 stehen). Dazu
muss ich aber erst das Kommando 0xD0 an den Controller schicken.

Zu lange her.


Gruß Dieter
 
Dieter Wiedmann <dieter.wiedmann@t-online.de> wrote:
Am 14.04.2015 08:41, schrieb Peter Heitzer:

Das AT Referenzmanual habe ich zufälligerweise selber.

Dann schau doch in der Initialisierung und der Keyboardinterruptroutine
nach, BIOS-Listing ist ja auch drin.
Habe ich schon. Ist etwas mĂźhsam, da sich auf totem Baum nicht so
schÜn suchen lässt. Ich habe aber mittlerweile die originalen Quellen
gefunden. Dort wird explizit ein Selbsttest Kommando an den Controller
geschickt. Ich werde mal ein Mäuseklavier noch dazuhängen und die
Befehle von Hand schicken. Ich hatte gehofft, daß es ohne ginge.
Der Sinn meines Unterfangens war eine einfache MĂśglichkeit, den Scancode
einer Taste mit simpler TTL-Logik auszuwerten. Wenn ich auch noch
senden muss, wird die Statemachine aufwendiger und ich kann gleich
einen ÂľC dafĂźr verwenden.

--
Dipl.-Inform(FH) Peter Heitzer, peter.heitzer@rz.uni-regensburg.de
HTML mails will be forwarded to /dev/null.
 
Am 14.04.2015 um 12:52 schrieb Peter Heitzer:

Der Sinn meines Unterfangens war eine einfache MĂśglichkeit, den Scancode
einer Taste mit simpler TTL-Logik auszuwerten.

c't 3/1992, Seite 244

Praxis - Tastatur

Auf ungewohnten Wegen
PC-Tastatur am Drucker- oder seriellen Port

Ich wollte damals die Scancodes parallel ausgeben und hab die Schaltung
dazu irgendwie modifiziert.

Hanno
 
Am 13.04.2015 um 20:06 schrieb Patrick Schaefer:
Vor Ewigkeiten habe ich mal ein paar von den Dingern
auseinandergenommen. Unten angehängt ist das Programm aus einem
PhÜnix-Controller, der dßrfte repräsentativ sein.

[Listing]

Hallo Patrick,

ich finde das auch interessant, allerdings kommt das hier als sehr
eigentümliche Mischung aus UTF-8 und (mutmaßlich) Codepage 850 an.
KĂśnntest Du das bitte noch mal als Anhang schicken oder vorher irgendwie
konvertieren?

Vielen Dank!
Markus
 
Am 16.04.2015 08:32 schrieb Markus Faust:

ich finde das auch interessant, allerdings kommt das hier als sehr
eigentümliche Mischung aus UTF-8 und (mutmaßlich) Codepage 850 an.
KĂśnntest Du das bitte noch mal als Anhang schicken oder vorher irgendwie
konvertieren?

Das war damals MS-DOS 5.0. IIRC wurde nach dem "kezb gr" die Codepage
431 oder 437 verwendet.


Patrick
 
Patrick Schaefer schrieb:
Am 16.04.2015 08:32 schrieb Markus Faust:

ich finde das auch interessant, allerdings kommt das hier als sehr
eigentümliche Mischung aus UTF-8 und (mutmaßlich) Codepage 850 an.
KĂśnntest Du das bitte noch mal als Anhang schicken oder vorher irgendwie
konvertieren?

Das war damals MS-DOS 5.0. IIRC wurde nach dem "kezb gr" die Codepage
431 oder 437 verwendet.

Naja, die cmd.exe und auhc die powershell von Windows 8.1 verwendet das
im Jahre 2015 noch immer. Es gibt aber auch Codepages fĂźr MSWin1252 oder
UTF8 - die man nur gebrauchen kann, wenn man den Font ebenfalls passend
einstellt.

Guido
 

Welcome to EDABoard.com

Sponsor

Back
Top