Seite 1 von 1

Scanncode der Tastatur

Verfasst: So 30. Okt 2011, 23:51
von PIC18F2550
Hallo,

wie kann ich den aktuellen Scanncode der Tastatur angezeigt bekommen?
Keyboard.spin

Re: Scanncode der Tastatur

Verfasst: Mo 31. Okt 2011, 01:24
von kuroneko
Ich hab mal schnell 16 bytes von $7FF0..$7FFF gestohlen. Der aktuelle Scancode wird dort in einem Ringbuffer abgelegt. Anzeige code muesstest Du dir in SPIN selber schreiben.

Code: Alles auswählen

                        mov     vscl, base
                        add     vscl, indx
                        wrbyte  data, vscl
                        add     indx, #1                ' next location
                        and     indx, #$0F              ' limit to 0..15
look_ret
receive_ack_ret
receive_ret             ret

base                    long    $7FF0
indx                    long    0

Re: Scanncode der Tastatur

Verfasst: Mo 31. Okt 2011, 02:10
von PIC18F2550
Hallo kuroneko,

Ich habe den Code eingefügt und die Variabeln bei

Code: Alles auswählen

' Uninitialized data
base                   res     1
indx                   res     1
erstellt.

da der Tastaturtreiber nicht läuft gehe ich davon aus dass ich die Variabeln falsch deklariert habe.

Leider Habe ich mich mit PASM noch nicht näher befasst so dass ich damit meine Probleme habe.
Köntest Du mir das das alles etwas näher erläutern?.

Wenn ich dich richtig Verstehe steht der scanncode anschließend im Speicher ab Adr. 0x7FF0.
Zum Speicher auslesen hatte ich mal was gefunden. Muß mal Suchen.

Re: Scanncode der Tastatur

Verfasst: Mo 31. Okt 2011, 02:25
von kuroneko
PIC18F2550 hat geschrieben:da der Tastaturtreiber nicht läuft gehe ich davon aus dass ich die Variabeln falsch deklariert habe.
Die beiden Variablen koennen gleich nach dem ret eingefuegt werden. Und es muessen vorinitialisierte Variablen sein (long $7FF0, 0), res hilft da nicht (nicht initialisiert).
Wenn ich dich richtig Verstehe steht der scanncode anschließend im Speicher ab Adr. 0x7FF0. Zum Speicher auslesen hatte ich mal was gefunden. Muß mal Suchen.
Das ganze ist nur ein Hack um an den Code zu kommen. Ich nehm an Du brauchst nur Zugriff um die Tabelle(n) zu vervollstaendigen. $7FF0-$7FFF ist das obere RAM Ende wo i.d.R. niemand umherturnt. Zugriff kann z.B. so erfolgen:

Code: Alles auswählen

repeat n from 0 to 15
  value := byte[$7FF0][n]
  serial.tx(value)

Re: Scanncode der Tastatur

Verfasst: Mo 31. Okt 2011, 02:49
von PIC18F2550
Irgendwie ist da der Wurm drinn.
Ich häng die Datei mal hier drann.
Keyboard.spin
Die Tabelle vervollständigen ist schon mal Richtig denn wer hatt noch eine Tastatur mit 84 Tasten die meisten haben 126.
Da ich den VGA-Zeichensatz auf 256 Zeichen aufgebohrt habe (um die umlaute darzustellen zu können) brauch ich jetzt noch den passenden Tastaturtreiber.

z.Z sind nur äÄöÖüÜß eingefügt mal sehen später soll der ganze ASCII zeichensatz für DE rein.
VGA_2_ASCII_DE.spin

Re: Scanncode der Tastatur

Verfasst: Mo 31. Okt 2011, 03:01
von kuroneko
Die 5 Befehle muessen vor den 3 *_ret Labeln eingefuegt werden genau wie im ersten Posting. Und die Variablen wie folgt:

Code: Alles auswählen

base    long    $7FF0
indx    long    0
Wenn ich vorher long $7FF0, 0 erwaehnt habe, dann nur um zu verdeutlichen dass long anstelle von res benutzt werden muss.

Re: Scanncode der Tastatur

Verfasst: Mo 31. Okt 2011, 03:15
von PIC18F2550
Danke für die Hilfe,

jetzt geht es.

mein letztes Asembler Projekt war vor 30 Jahren auf einem Z1013 da ist eine Menge Eingerostet. :shock:
Jetzt mache ich Feierabend denn Heute ist auch noch ein Tag. :mrgreen:

Re: Scanncode der Tastatur

Verfasst: Mo 31. Okt 2011, 11:44
von PIC18F2550
Hallo kuroneko,

ich habe mir die ganze geschichte heute früh noch mal durch den Kopf gehen lassen und habe noch ein paar Änderungen vorgenommen.
Keyboard_KCode.spin
und das ist die Ausgabe dazu

Code: Alles auswählen

        repeat
            if kyb.gotkey
                vga.pr_chr($e)
                i:=kyb.getkey
                kyb.stop       
                kyb.start(KYB_CLK, KYB_DAT)    'start the keyboard
                vga.pr_chr(i)
                vga.pr_str(string("  "))
                vga.pr_str(str.integerToHexadecimal(i,2))
                vga.pr_str(string("  "))
                i := byte[$7FF0][0]
                i := str.integerToDecimal(i,3)
                vga.pr_str(i)
                vga.pr_str(string("  "))
                repeat n from 0 to 15 
                    i := byte[$7FF0][n]
                    byte[$7FF0][n]:=0
                    i := str.integerToHexadecimal(i,2)
                    vga.pr_str(i)
                    vga.pr_chr(" ")
                vga.pr_chr($d)
Gerade festgestellt STRG+ALT+ENTF der String ist läger als 16 Zeichen :shock:
Da muss ich noch etwas machen :mrgreen:

Re: Scanncode der Tastatur

Verfasst: Di 1. Nov 2011, 02:55
von kuroneko
Hat Dein VGA Object keine hex Ausgabe? Stringkonvertierung ist irgendwie von-hinten-durch-die-Brust-ins-Auge. Normalerweise (unter Benutzung von VGA_Text) sollte ein vga.hex(value, 2) reichen.

Und wieso startest Du den Keyboard driver neu? Merk Dir einfach die letzte Position im Scancode-Buffer (!=0), fuell alles mit 0 and dann starte Deine naechste Ausgabe von der Position. Notfalls kann PASM noch den aktuellen Index in den hub RAM schreiben (z.B. $7FEC) dann weisst Du genau wie lang der Scancode ist (musst Dir allerdings Deine Leseposition merken), z.B.

Code: Alles auswählen

VAR
  long  current

PUB display 

  repeat while current <> long[$7FEC]       ' $7FEC updated by PASM driver
    vga.hex(byte[$7FF0][current], 2)
    current := ++current & 15
    vga.out(32)