Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Scorpion am 30. July 2004, 13:02
-
Hi Leute,
da oft gefragt wird, wie man mit (n)asm einen Kernel schreibt, der etwas einliest,
hab ich hier mal meine Lösung abgedruckt (putstr und getkey ist aus lowlevel 1) [ich
hoffe, dass es diese version noch nicht gibt, denn die readln-funktion ist nur von
mir]:
mov ax,1000h ; Start
mov ds,ax
mov es,ax
start:
call readln
int 0x19
buffer db 0
readarray db 0
times 20 db 0
putstr: ; Normale Ausgabe-Funktion aus
lodsb ; Lowlevel 1
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
getkey: ; GetKey-Funktion aus Lowlevel 1
mov ah,0
int 16h
retn
readln: ; readln-Funktion
call getkey ; Taste holen
cmp al,13 ; wenn enter...
je Return ; ...Return
mov [buffer],al ; Buffer = al (Buchstabe)
mov si,buffer ; Buchstabe anzeigen
call putstr ; ...
mov [readarray+1],al ; Buchstabe zu Array hinzufügen
jmp readln ; Wiederholen
Return:
ret
Ich hoffe ich konnte jemanden helfen.
MfG Scorpion
PS: Ihr habt doch mal nach einer sicheren Reboot-Funktion gefragt (irgendein thread).
Hier eine Lösung: int 0x19
funktioniert super!
-
du musst noch bei dem return 0 an das stringende anhängen... sonst wird beim ausgeben darüber hinweg gelesen...
-
hmm, ist ja schön und gut, aber das wird im Protected Mode nicht funzen, da die BIOS Interrupts 16Bit sind ...
-
Im Protected Mode gehn überkeine Interrupts vom Bios/VGABios/Dos, weil wie Franz richtig sagt das nur 16Bit ist. AUsserdem müsste man die Interrupt Tabelle dafür neu programmiern da auch die nicht kompatibel ist.
Jedenfalls ist dieses Stück Code nur den Realmode zu gebrauchen. Ob man die Funktion jetzt noch optimieren könnte will ich garnicht gucken, denn schliesslich ist TJ's PM Tut ja schon ne weile da und die meisten werden den Sprung in den PM gepackt haben, von daher ist der nutzen eher beschränkt.
Aber das Grundprinzip bleibt im PM das selbe, nur das die Tasten anders geholt werden müssen
-
An der Stelle poste ich einfach ma meinen Pmode Keyboard Treiber, den ich schon lange fertig schreiben will aber einfach nich zukomme. Aufjedenfall funktioniert der schon ganz gut.
http://mitglied.lycos.de/lobmann/keyboard.c
-
Meiner war ja schon fertig...aba isa ja nu wech... meiner war allerdings komplett in asm geschrieben^^
-
hat auch zuerst ne asm version die hat auch gefunzt aber hab den dann irgendwann in c neu gecodet ich finds irgendwie übersichtlicher
-
also meine asm funktion war kürzer als deine in C , naja werds demnächst eh alles neutexten dürfn
by the way wegn neutextn
hab ein macro in nasm gemacht zum ladn von allem nötign zeugs meines os
%macro loadfloppy 8
loadfloppy_%8:
push ds
mov ax, 0
mov dl, 0
int 13h
pop ds
jc loadfloppy_%8
.%8_2:
mov ax,%6
mov es,ax
mov bx,%7
mov ah,2
mov al,%1
mov ch,%2
mov cl,%3
mov dh,0
mov dl,0
int 13h
jc .%8_2
%endmacro
und wenn ich dann
loadfloppy 4,0,2,0,[bootdr],0x1000,0,1 ;Kernel laden
mache verfängt sich bochs innerhalb das interrupts 13 beim lesen weiss vielleicht jemand warum? obs ohne bochs geht hab ich noch nich probiert
-
Jo poste die aufjedenfall mal