80x42 Tastaturcontroller standalone betreiben?

Am WE habe ich leider erfolglos versucht, einen 8042 Tastaturcontroller

EA auf Masse und an A0, -CS, -RD und -WR jeweils einen entprellten

Nach Einschalten der Betriebsspannung erwartete ich eigenlich, am

-RD jeweils 0), es kam aber nur 0 an. An den Clock- und Datenleitungen

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?

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.
Reply to
Peter Heitzer
Loading thread data ...

Am 13.04.2015 16:32, schrieb Peter Heitzer:

Aus dem Handbuch zum Original IBM AT:

formatting link

Reply to
Dieter Wiedmann

".. controller is then ready to accept commands from the system microprocessor"

--
Dipl.-Inform(FH) Peter Heitzer, peter.heitzer@rz.uni-regensburg.de 
HTML mails will be forwarded to /dev/null.
Reply to
Peter Heitzer

Ich lese das auch so.

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

Reply to
Dieter Wiedmann

Am 13.04.2015 16:32 schrieb Peter Heitzer:

Vor Ewigkeiten habe ich mal ein paar von den Dingern

Patrick

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

====================================================

20: Kommandowort lesen 60: Kommandowort schreiben AA: Selbsttest AB: Interface-Test

AD: Disable KBD AE: Enable KBD

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)

R5 Bitz?hler bei ?bertragungen R6 0:warten auf Tasturantwort, 1:Empfangen, 2:Senden R7 Timeout-Fehlercode

Register-Bank 1:

Speicher: 20 Kommandowort

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

1 Start-, 8 Daten-, Odd-Parity- und 1 Stopbit

|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

001A B8 21 MOV R0,#21H ; Statusport auf #10 initialisiert 001C B0 10 MOV @R0,#10H ;

0020 B0 00 MOV @R0,#00H ;

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 ;

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

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

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 ;

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

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

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

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

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

-01AE 34 C0 CALL 1C0H ; ROM-Checksumme berechnen

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 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

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 ;

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

Kommando C0: Read Input Port

-0221 09 IN A,P1 ; Port 1 lesen 0222 74 E9 CALL 3E9H ; Daten zum Master schicken

Kommando D0: Read Output Port

-0226 0A IN A,P2 ; Port 2 lesen 0227 74 E9 CALL 3E9H ; Daten zum Master schicken

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 ;

0233 3A OUTL P2,A ; zum Port 2

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

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 ;

TimeOut-Routine:

-0272 35 DIS TCNTI ; 0273 65 STOP TCNT ;

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)

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?=;.)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

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 ;

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 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

03DE F0 MOV A,@R0 ; 03DF 96 E2 JNZ 0E2H ; ist es Break-Code? ja ->

-03E2 FA MOV A,R2 ; 03E3 03 80 ADD A,#80H ; Break-Code generieren

03E7 AA MOV R2,A ; 03E8 83 RET ;

Daten zum Master senden:

-03E9 02 OUTL DBB,A ;

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 ;

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

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

-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

-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 ;

Reply to
Patrick Schaefer

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.
Reply to
Peter Heitzer

Am 14.04.2015 08:41, schrieb Peter Heitzer:

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

Zu lange her.

Reply to
Dieter Wiedmann

gefunden. Dort wird explizit ein Selbsttest Kommando an den Controller

einer Taste mit simpler TTL-Logik auszuwerten. Wenn ich auch noch senden muss, wird die Statemachine aufwendiger und ich kann gleich

--
Dipl.-Inform(FH) Peter Heitzer, peter.heitzer@rz.uni-regensburg.de 
HTML mails will be forwarded to /dev/null.
Reply to
Peter Heitzer

Am 14.04.2015 um 12:52 schrieb Peter Heitzer:

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

Reply to
Hanno Foest

Am 13.04.2015 um 20:06 schrieb Patrick Schaefer:

Hallo Patrick,

ich finde das auch interessant, allerdings kommt das hier als sehr

konvertieren?

Vielen Dank! Markus

Reply to
Markus Faust

Am 16.04.2015 08:32 schrieb Markus Faust:

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

431 oder 437 verwendet.

Patrick

Reply to
Patrick Schaefer

Patrick Schaefer schrieb:

50 an.

gendwie

Naja, die cmd.exe und auhc die powershell von Windows 8.1 verwendet das

oder UTF8 - die man nur gebrauchen kann, wenn man den Font ebenfalls passend einstellt.

Guido

Reply to
Guido Grohmann

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.