Beiträge anzeigen

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.


Nachrichten - Der Fleckenzwerg

Seiten: [1]
1
Hallo jeb, vielen Dank für deine Antwort, jetzt weiß ich endlich warum es nicht funktioniert.

Leider wurde dieses Verhalten weder in der Referenz auf dieser Website noch in anderen Referenzen die ich bei Google gesucht habe erwähnt. Hat jemand vielleicht Tipps für mich wo ich in Zukunft nachschauen soll bzw. kennt jemand Links zu besseren Referenzen?

Etwas seltsam finde ich auch, dass der Interrupt keinen Fehler per Carry-Flag meldet...naja
2
Vielen Dank für deine Mühe.

Die Tatsache, dass du auch keinen Fehler findest zeigt mir wenigstens das ich nicht ganz doof bin und das ich im Vergleich zu meinem ersten Post (http://www.lowlevel.brainsware.org/forum/viewtopic.php?t=1107) schon Fortschritte gemacht habe, das ist ja auch schonmal was wert :D
3
Vielen Dank das du dir meinem Code mal angesehen hast.

Hier der komplette Code:

org 0x7C00 ; Startadresse

start:
cli             ; Keine Interrupts!
xor ax,ax
mov ds,ax
mov es,ax
mov ax, 0x8000  ; Stackadresse
mov ss, ax      ; SS = 9000 (unser Stack)
mov sp, 0xFFFE  ; SP = FFFE  (der Stackpointer)
sti             ; Interrupts zulassen
mov [bootdrv], dl

mov si, msg
call putstr

call reset_disk
call init_vga


mov dl, [bootdrv] ; Laufwerk setzen bevor die Segmentregister ein Setzen verhindern

xor bx, bx
mov ax, 0xA000
mov es, ax ; Daten schreiben nach ES:BX = 0xA000:0x0000
mov ds, ax

load1:
mov ah, 0x02 ; Funktion Nr. 2
mov al, 1 ; 1 Sektoren zu lesen
mov cx, 1       ; Track=0, Sector=1
mov dh, 0 ; Head 0
int 13h         ; den Interrupt ausführen
jc load1        ; Fehler? Noch mal!

mov byte [320*100+160], 0x07          ; farbiger Pixel in die Mitte des Bildschirms, funktioniert

ende: jmp ende

; ----------------------------------------------
; Funktionen und Variablen
; ----------------------------------------------

bootdrv db 0 ;Das Bootlaufwerk
msg db "booting...",13,10,0 ; 13=carriage return, 10=linefeed

; Einen String ausgeben:
putstr:

lodsb             ; Byte laden
or al,al
jz short putstrd  ; 0-Byte? -> Ende!

mov ah,0x0E       ; Funktion 0x0E
mov bx,0x0007     ; Attribut-Byte (wird nicht benötigt)
int 0x10          ; schreiben
jmp putstr        ; Nächstes Byte
putstrd:
retn

reset_disk:
push ds            ; Sichere DS
mov ax, 0          ; Die gewünschte Funktion (reset)
mov dl, [bootdrv]  ; Dieses Laufwerk ist gewünscht
int 13h            ; Den Interrupt ausführen
pop ds             ; DS wiederherstellen
jc reset_disk      ; Geht nicht? -> Noch mal!
retn

init_vga:

MOV AX, 0013h
INT 10h
retn

times 512-($-$$)-2 db 0   ; Dateilänge: 512 Bytes
dw 0AA55h                 ; Bootsignatur
4
Wie der Titel schon vermutem lässt würde ich gerne Daten (erstmal nur einen Sektor) von der Diskette direkt ins Video RAM (A000h:0000h) schreiben. (Ich befinde mich natürlich noch im RealMode)

Ich setze also ES:BX auf A000h:0000h bevor ich die 2. Funktion des 13. Interrupts ausführe, die soll dann die eingelesenen Daten direkt nach ES:BX, also ins Video RAM schreiben. Da ich mich zu diesem Zeitpunkt schon im "VGA Mode 13h" befinde erwarte ich, dass der Inhalt des gelesenen Sektors (des Bootsektors) sofort als lustige bunte Pixel auf dem Bildschirm angezeigt wird. Leider bleibt der Bildschirm jedoch schwarz.

hier der interessante Auszug meines Codes:
call reset_disk
call init_vga

mov dl, [bootdrv] ; Laufwerk setzen bevor die Segmentregister ein Setzen verhindern ([bootdrv] liegt in einem anderen Block)

xor bx, bx
mov ax, 0xA000
mov es, ax ; Daten schreiben nach ES:BX = 0xA000:0x0000
mov ds, ax

load1:
mov ah, 0x02 ; Funktion Nr. 2
mov al, 1 ; 1 Sektor zu lesen
mov cx, 1       ; Track=0, Sector=1 (sollte der Bootsektor sein)
mov dh, 0 ; Head 0
int 13h         ; den Interrupt ausführen
jc load1        ; Fehler? Noch mal!

mov byte [0], 0x07          ; Dieser Pixel wird korrekt angezeigt

ende: jmp ende

Und hier die Unterfunktionen, da es sich hierbei um 3rd Party Code handelt glaube ich nicht, dass hier der Fehler liegt.
reset_disk:
push ds            ; Sichere DS
mov ax, 0          ; Die gewünschte Funktion (reset)
mov dl, [bootdrv]  ; Dieses Laufwerk ist gewünscht
int 13h            ; Den Interrupt ausführen
pop ds             ; DS wiederherstellen
jc reset_disk      ; Geht nicht? -> Noch mal!
retn

init_vga:

MOV AX, 0013h
INT 10h
retn


Sieht jemand meinen Fehler, oder soll ich mal den kompletten Code posten?!
5
Lowlevel-Coding / Textausgabe im Bootloader
« am: 07. December 2005, 18:49 »
vielen Dank, sowas hatte ich mir schon gedacht...
aber warum setzt der Beispiel-Bootloader die Segmentregister nicht ?! Schliesslich wird dort auch ein String auf den Bildschirm geschrieben.
6
Lowlevel-Coding / Textausgabe im Bootloader
« am: 07. December 2005, 16:55 »
Hi Leute!

Vorweg, ich bin noch ein ziemlicher n00b also seid bitte nachsichtig :D

Also, ich habe die ersten Ausgaben des LowLevel Magazins gelesen und bin schwer begeistert. Hab das Beispiel aus der ersten Ausgabe (StupidOS 1.0) sofort erfolgreich ausprobiert, und angefangen die Sourcen ein bisschen umzuschreiben. Prinzipiell klappt das schon ganz gut, zB hab ich bisher die getkey-Routine aus der kernel.asm dazu benutzt die Eingabe auf der Tastatur auf die Textausgabe forzuwarden und auch der VGA Mode 13h funzt schon (nach einigem rumprobieren). Naja, jedenfalls wollte ich dann mal den Bootloader recoden aber irgendwie schaffe ich es nicht etwas auf die Textausgabe zu schreiben.

Warum erzeugt folgender Code keine Ausgabe auf dem Bildschirm:

org 0x7C00 ; Startadresse

start:

cli             ; Keine Interrupts!
mov ax, 0x9000  ; Stackadresse
mov ss, ax      ; SS = 9000 (unser Stack)
mov sp, 0       ; SP = 0000  (der Stackpointer)
sti             ; Interrupts zulassen

mov si,msg
call putstr     ; Meldung ausgeben

ende: jmp ende

; ----------------------------------------------
; Funktionen und Variablen
; ----------------------------------------------

msg db "Hello World",13,10,0

; Einen String ausgeben:
putstr:
lodsb             ; Byte laden
or al,al
jz short putstrd  ; 0-Byte? -> Ende!

mov ah,0x0E       ; Funktion 0x0E
mov bx,0x0007     ; Attribut-Byte (wird nicht benötigt)
int 0x10          ; schreiben
jmp putstr        ; Nächstes Byte
putstrd:
retn

times 512-($-$$)-2 db 0   ; Dateilänge: 512 Bytes
dw 0AA55h                 ; Bootsignatur


Ich benutze übrigens VMWare 5 zum testen meiner Images (bochs tut net)
Seiten: [1]

Einloggen