Autor Thema: Readln  (Gelesen 3792 mal)

Scorpion

  • Beiträge: 57
    • Profil anzeigen
Gespeichert
« 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!

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 30. July 2004, 13:57 »
du musst noch bei dem return 0 an das stringende anhängen... sonst wird beim ausgeben darüber hinweg gelesen...
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,...

Franz1299

  • Beiträge: 37
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 30. July 2004, 18:00 »
hmm, ist ja schön und gut, aber das wird im Protected Mode nicht funzen, da die BIOS Interrupts 16Bit sind ...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #3 am: 30. July 2004, 18:39 »
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
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #4 am: 30. July 2004, 19:13 »
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
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #5 am: 30. July 2004, 19:16 »
Meiner war ja schon fertig...aba isa ja nu wech... meiner war allerdings komplett in asm geschrieben^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #6 am: 30. July 2004, 19:21 »
hat auch zuerst ne asm version die hat auch gefunzt aber hab den dann irgendwann in c neu gecodet ich finds irgendwie übersichtlicher
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #7 am: 30. July 2004, 19:26 »
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
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #8 am: 30. July 2004, 19:39 »
Jo poste die aufjedenfall mal
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

 

Einloggen