Am 13.04.2015 16:32 schrieb Peter Heitzer:
Show Quoted Text
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 ;