Autor Thema: tastatur-'treiber'..  (Gelesen 8583 mal)

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« am: 23. January 2005, 22:27 »
hallo,

also ich hab einen meiner lehrer jetzt dazu gebracht mit einigen von uns ein wenig assembler zu machen (jedoch hat der lehrer keinen plan von x86 micro-prozessoren).

und zwar ist unser erstes projekt eine 'schreibmaschine'; die ' ' deshalb, weil ich noch keinen weg gefunden habe einen drucker anzusprechen (falls das jemand weiss, nur raus damit!).
die ausgabe auf dem bildschirm ist ja nun nicht wirklich ein problem, aber ich wuerde gerne bei jedem tastendruck eine eigene routine (interrupt) ausgeloest haben - so weit kein problem eine passende routine zu schreiben..aber wie zum teufel bekomm ich die routine dazu auch wirklich aufgerufen zu werden, wenn ich in die tastatur reinklopfe?

da hier sicher schon erfahrungen mit tastatur-treibern gemacht worden sind hoffe ich, dass mir hier geholfen wird. :)

danke im vorraus,
lg, hannibal
\\o
o//
\o/

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 24. January 2005, 14:12 »
naja, da gibbet so'n zeug, das nennt sich IRQ  :twisted: ... und das 2. irq (nummer 1) wird bei jedem tastendruck aufgerufen. bist du im RM oder PM? im PM muss man sich das selber belegen, im RM wird int 0x09 aufgerufen. und das verbiegste halt dann einfach auf deine eigene routine.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #2 am: 24. January 2005, 16:11 »
bin im rm - ...jetzt ist bloss die frage wie ich das verbieg ;)

einfach 0x09 (glaub das war irq2) auf die adresse meiner isr setzen?

lg, hannibal

edit: keybord ist irq1 auf 0x09 :o
\\o
o//
\o/

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #3 am: 24. January 2005, 17:01 »
Fürs Interrupt umbiegen einfach mal in Lowlevel Ausgabe 3 reinschauen :)
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #4 am: 24. January 2005, 17:10 »
Zitat von: Roshl
Fürs Interrupt umbiegen einfach mal in Lowlevel Ausgabe 3 reinschauen :)


mh, ja.. hab ich schon geschaut.. nur steht da nur was von software-interrupts, und nichts von den schoenen interrupt service routines (wies so schoen heisst) - die naemlich nicht im code aufgerufen werden, sondern so richtig wie es sich fuer einen interrupt gehoert: von der hardware ;) :)
\\o
o//
\o/

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #5 am: 24. January 2005, 17:13 »
Zitat von: hannibal
Zitat von: Roshl
Fürs Interrupt umbiegen einfach mal in Lowlevel Ausgabe 3 reinschauen :)


mh, ja.. hab ich schon geschaut.. nur steht da nur was von software-interrupts, und nichts von den schoenen interrupt service routines (wies so schoen heisst) - die naemlich nicht im code aufgerufen werden, sondern so richtig wie es sich fuer einen interrupt gehoert: von der hardware ;) :)


jo, und vom PIC (programmable interrupt controller) wird das software-int 9 aufgerufen, und das musste nur umbiegen ;-)
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 24. January 2005, 17:35 »
Vom Code her macht das nur den Unterschied das du am Ende ein EOI Signal schicken musst. Sonst ist es das selbe
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #7 am: 24. January 2005, 23:37 »
ich hab jetzt leider keine moeglichkeit das zu testen, da mein fd-controller scheinbar schlapp gemacht hat und ich noch keinen weg gefunden hab das irgendwie zu umgehen..


org 0x7c00

; setting up stack
cli
mov ax, 0x9000
mov ss, ax
xor sp, sp
xor ax, ax
sti

; writing isr-pointer at 0x09 (interrupt vector table) for keyboard
mov bx, 0x09
mov ax, __int_0x09
mov [bx], ax

jmp END


; interrupt-service-routine for recieving keyboard-data
__int_0x09:
; read data and print on screen
in al, 0x60
mov ah, 0x09
mov bx, 0x0007
int 0x10

; sending EOI to PIC

mov al, 0x20
out 0x20, al

iret

END:


.. koennte bitte mal jemand schaun, ob das so in etwa passt, oder ob da schwerwiegende fehler drinnen sind? (ist ja nicht wirklich allzuviel code, insofern sollte das ja ok sein :) )

edit: achja..kompilieren laesst sich das ohne probleme, insofern bin ich zuversichtlich, dass der code relativ in ordnung ist. ;)
\\o
o//
\o/

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #8 am: 25. January 2005, 08:05 »
*räusper*... ein pointer ist meines wissens 16bit lang im RM. und noch dazu kommt das segment. sprich jedes int hat da 4 bytes. also musst du bx * 4 nehmen, bevor du das int einträgst, und auch noch cs eintragen!

; writing isr-pointer at 0x09 (interrupt vector table) for keyboard
mov bx, 0x09
mov ax, __int_0x09
mov [bx], ax
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #9 am: 25. January 2005, 08:22 »
was muss ich denn ins cs eintragen? hab das bis jetzt noch nicht verstanden wofuer das ueberhaupt gut ist  :oops:
\\o
o//
\o/

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #10 am: 25. January 2005, 10:28 »
CS ist das CodeSegment. du musst nur das aktuelle codesegment einbauen. ich weiß zwar net, in welcher reihenfolge, aber du musst bx an die adresse 9*4 bringen, dann den pointer auf den handler dahin schreiben (__int__0x09 bei dir) und dann auch noch das aktuelle CS, indem du einfach auf die adresse noch 2 addierst, und dann CS dahinschiebst.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #11 am: 25. January 2005, 12:37 »
also ich hab jetzt das ganze so gemacht:



;stack init
; [...]

mov ax, __int_0x09
add ax, ax
add ax, ax  ; bx * 4

mov bx, 0x09
mov [bx], ax

add ax, 2
mov cs, ax


jmp END

__int_0x09:
; [...]

END:
jmp END


aber das will auch nicht so ganz funktionieren .. :(
*intel tret* :x
\\o
o//
\o/

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #12 am: 25. January 2005, 12:44 »
oeh.. is das das gleiche?  :shock:

also irgendwie scheine ich da einiges falsch verstanden zu haben :?
\\o
o//
\o/

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #13 am: 25. January 2005, 12:53 »
Hm versuch mal mit der Funktion eine ISR zusetzen, ist grade spontan geschrieben, keine Ahnung ob es funktioniert:

SetISR:
push bp
mov bp,sp
pusha
cli
push 0
pop es
mov bx,[bp+6]
mov ax,[bp+4]
shl bx,2
mov WORD [es:bx],ax
mov ax,[bp+2]
inc bx
inc bx
mov WORD [es:bx],ax
popa
sti
mov sp,bp
pop bp
ret

Als Parameter in folgender Reihenfole auf den Stack:
Int-Nummer,Funktionsoffset,Segment. Also so:
push 21
push Funktionsname
push cs
call SetISR

Keine Ahnung ob das so geht, hab mit RM nicht mehr so viel am Hut
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #14 am: 25. January 2005, 17:01 »
soo.. bin jetzt ein riesenstueckchen weitergekommen mit meiner 'schreibmaschine'.

funktioniert soweit richtig gut!

(hab auch einen weg gefunden das ganze zu testen... ohne floppy ;o)

ich kann euch gar nicht sagen, was sich da bei mir fuer gluecksgefuehle entfachen .. =)

http://brainsware.org/alex/schule/schreibmaschine/schreibmaschine.asm
8)
\\o
o//
\o/

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 25. January 2005, 17:56 »
Portier das Teil doch einfach nach DOS (dazu solltest du den Original-Interrupt abspeichern und beim Programmende wieder zurueckschreiben). Dann habe ich mit meinem Nadeldrucker noch ein echtes Feeling :-)

Duerfte nicht eigentlich wirklich schwer sein. Org 0x100 wenn ich recht habe und am Ende auf ne bestimmte Taste mit Int 21 Fkt 4Ch reagieren :-)

Svenska

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 01. September 2005, 19:21 »
ich hätte da vllt noch ne verbesserung für deine ISR:
Ich würd' des mit den scancode to ascii mit 'nem vector
machen, des spart einfach code. z.B. so:

_keyb_table db 0,0x1b,...; <- hier alle ascii-zeichen eintragen...

und dann kannzu mit:

[_key_table+scancode], drauf zugreifen...

Is doch praktisch, oder??

 

Einloggen