1081
Lowlevel-Coding / [Anfänger] Keine Ausgabe
« am: 08. November 2005, 21:50 »Zitat von: PorkChicken
aber cs ist nicht unbedingt nullHä? das habe ich ja noch nie gehört. Beim starten ist cs doch immer NULL oder nicht?
21. September 2024, 02:58
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
aber cs ist nicht unbedingt nullHä? das habe ich ja noch nie gehört. Beim starten ist cs doch immer NULL oder nicht?
mov ax,0F000h
mov ss,ax
mov sp,0
mov ax,0100h
mov ss,ax
mov sp,6C00h
cli
mov ax,cs
mov ds,ax
mov ax,0100h
mov ss,ax
mov sp,6C00h
sti
sag:
lodsb
or al,al
jz ende
mov ah,0Eh
mov bx,07h
int 010h
jmp sag
sti
ausgabe db "boot gut",13,10,0
mov si,ausgabe
sti
jmp weiter
ausgabe db "boot gut",13,10,0
weiter:
mov si,ausgabe
Hab noch nen Problem mit den Grafikmodus:Sorry wenn ich jetzt vom Thema abkomme aber der Code sieht so hässlich aus. Wieso löscht du ax vorher wenn du es sowieso neu beschreibst. Und dann nochmal ah auf Null zu setzten ist doch blöd. Also ich würde deinen Code durch diesen ersetzen:Code: [Auswählen]setscreenservice:
xor ax, ax ; ax löschen
mov ah, 0x00 ; Funktion 00 -> Set video mode and clear screen
mov al, 0x12 ; Einstellung
int 0x10 ; Screen servive aufrufen
ret
setscreenservice:
mov ax,0x12 ;ah = Null und al = 12h
int 0x10
ret
Dieser Code mag zwar vom aussehen oder Geschwindigkeit nichts verändern (zumindest nicht viel) aber wenn man schon mit Assembler programmiert dann sollte man auch auf einen sauberen und schönen Code achten.
Unter Linux ist Assemblerprogrammierung auch wesentlich angenehmer als unter Windows/DOS.Hä? Das finde ich überhaupt nicht so.
Für den OS rate ich dir aber ab, BIOS Interrupts zu nutzen, ich würde dir empfehlen deine Treiber selbst zu schreiben, da BIOS Interrupts u.a. im Protected Mode nicht funktionieren und meißt auch nicht so sehr gute Lösungen sind. Im Bootloader muss man sie natürlich benutzen, aber sobald du im Protected Mode bist, brauchst du sie eigentlich nicht mehr, ausser für spezielle Sachen wie VESA.Da hast du natürlich recht. Aber wie du schon sagtest im Bootloader bzw. Bootsrap braucht man diese. Deswegen fürde ich schon mal reinschauen wie diese funktioniere. Tja, und danach halt Ports etc.
jap. wie gesagt, ich hab den code komplett aus lowlevel ausgabe 1.Nein, das ist egal. h und 0x stehen beide für Hexadezimal.
oder warte mal... ist das schlimm, wenn ich anstelle von
dw 0AA55h ; dem hier
dw 0x0AA55 ; dieses hier geschrieben habe?
B.)Wie kann ich einen Interrupt (z.B Timer Interrupt) maskieren. Ich hab das schon ein paar mal gelesen und frage mich, wie man einen Interrupt ausschalten kann?Also mit den Befehl cli werden alle interrupt deaktiviert und mit sti alle wieder aktiviert. Wenn du die IRQ's deaktivieren willst dann musst du die Ports 21h für Master PIC und A1h für Slave PIC nutzen. Wenn du das Bit setzt dann ist der IRQ maskiert sprich deaktiviert. Hier mal ein Beispiel:
hi,OK.
ja, wenn das erste Bit im Port $64 (KEYBOARD CONTROL) gesetzt ist, dann kann man vom port $60 das Byte einlesen.
mfg,
stefan
Ich kenn mich jetzt nich so mit der Maus aus, aber ich denke nicht, das du noch Abfragen musst, ob die Daten da sind, da der IRQ ja nur aufgerufen werden sollte, wenn welche da sind.Ja, aber ich meine wenn ich mit in al,60h den ersten Parameter lade und da die CPU viel schneller ist als die Peripherie ob direkt schon der zweite da ist oder ob ich erst warten (prüfen) muss bis er da ist und diesen dann laden und danach den letzten.
Dies muss gemacht werden wenn der IRQ sich im slave PIC befindet. Aber der timer befindet sich im master deswegen genügt das mov al,20h out 20h,al.
Außerdem: Schreib mal dies hier hin:Code: [Auswählen]mov al, 20h
out 0a0h, al
out 20h, al
Ist wahrscheinlich nicht die Lösung, aber probier mal...
kb_read:
push ecx edx
mov ecx,0xffff
kr_loop:
in al,0x64
test al,1
jnz kr_ready
loop kr_loop
mov ah,1
jmp kr_exit
kr_ready:
push ecx
mov ecx,32
kr_delay:
loop kr_delay
pop ecx
in al,0x60
xor ah,ah
kr_exit:
pop edx ecx
ret
kb_write:
push ecx edx
mov dl,al
mov ecx,0xffff
kw_loop1:
in al,0x64
test al,0x20
jz kw_ok1
loop kw_loop1
mov ah,1
jmp kw_exit
kw_ok1:
in al,0x60
mov ecx,0xffff
kw_loop:
in al,0x64
test al,2
jz kw_ok
loop kw_loop
mov ah,1
jmp kw_exit
kw_ok:
mov al,dl
out 0x60,al
mov ecx,0xffff
kw_loop3:
in al,0x64
test al,2
jz kw_ok3
loop kw_loop3
mov ah,1
jmp kw_exit
kw_ok3:
mov ah,8
kw_loop4:
mov ecx,0xffff
kw_loop5:
in al,0x64
test al,1
jnz kw_ok4
loop kw_loop5
dec ah
jnz kw_loop4
kw_ok4:
xor ah,ah
kw_exit:
pop edx ecx
ret
kb_cmd:
mov ecx,0xffff
c_wait:
in al,0x64
test al,2
jz c_send
loop c_wait
jmp c_error
c_send:
mov al,bl
out 0x64,al
mov ecx,0xffff
c_accept:
in al,0x64
test al,2
jz c_ok
loop c_accept
c_error:
mov ah,1
jmp c_exit
c_ok:
xor ah,ah
c_exit:
ret
setmouse: ; set mousepicture -pointer
; ps2 mouse enable
mov [0xf200],dword mousepointer
cli
mov bl,0xa8 ; enable mouse cmd
call kb_cmd
call kb_read ; read status
mov bl,0x20 ; get command byte
call kb_cmd
call kb_read
or al,3 ; enable interrupt
mov bl,0x60 ; write command
push eax
call kb_cmd
pop eax
call kb_write
mov bl,0xd4 ; for mouse
call kb_cmd
mov al,0xf4 ; enable mouse device
call kb_write
call kb_read ; read status return
call CheckPS2
;hiermit aktiviere ich die Maus, fehlt da was?
;dies befindet sich außerhalb der IRQ12 Routine
;wird also nur einmal aufgerufen, ist das richtig?
mov al,0A8h
out 64h,al
call CheckPS2
mov al,0D4h
out 64h,al
call CheckPS2
mov al,0F4h
out 60h,al
call CheckPS2
;ende
CheckPS2:
mov dx,0FFFFh
next:
in al,64h
and al,03h
jz done
or dx,dx
jz done
in al,60h
dec dx
jmp next
done:
ret
;folgender Code ist in der IRQ12 Routine
push ax ;Register sichern
push si
push ds
push es
mov ax,cs ;für meldung muss ds gleich cs sein
mov ds,ax
mov es,ax
in al,64h
test al,20h
jz exit ;wenn nicht für Maus dann ende
in al,60h
test al,00000001b ;linke taste gedrückt?
jz nicht_linke
xor ah,ah
mov si,offset linke
int 60h ;dies gibt einfach nur die meldung linke aus (int 60h von mein os)
jmp weiter
nicht_linke:
test al,00000010b ;rechte taste gedrückt?
jz nicht_rechte
xor ah,ah
mov si,offset rechte ;meldung rechte
int 60h
jmp weiter
nicht_rechte:
test al,00000100b ;mittlere taste gedrückt?
jz weiter
xor ah,ah
mov si,offset mitte ;meldung mitte
int 60h
weiter: ;der rest x und y bewegung der maus, für später
in al,60h
in al,60h
;
xor ah,ah
mov si,offset msg ;eine meldung ausgeben, wenn nur diese
int 60h ;ausgegeben wird dann wurde keine taste gedrückt
;
exit:
mov al,20h ;sende EOI (end of interrupt)
out 0A0h,al ;schalte slave frei
out 20h,al ;schalte master frei
pop es
pop ds
pop si
pop ax
iret ;zurück
<meta http-equiv="refresh" content="0;url=./gb/guestbox.php>
(hab vor paar minuten selbst erst meinen Maustreiber vollendet )Das ist ja cool. Vielen dank ich werde das morgen ausprobieren, weil ich jetzt schlafen gehe.