Autor Thema: Daten direkt von Diskette ins Video RAM schreiben  (Gelesen 6129 mal)

Der Fleckenzwerg

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« am: 08. December 2005, 19:39 »
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?!

Mihail121

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 08. December 2005, 20:01 »
Hmm.. so auf den ersten Blick seh ich keine Fehler. Post mal bitte den vollständigen Code.
_p.wur$t

Der Sensemann owz ya

Der Fleckenzwerg

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 09. December 2005, 13:55 »
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

Mihail121

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 09. December 2005, 20:37 »
Da ich offensichtlich immer noch keine Fehler in deinem Code sehe, schreibe ich jetzt selber einen solchen Bootstrap und poste meine Erfahrungen dann hier.
_p.wur$t

Der Sensemann owz ya

Der Fleckenzwerg

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 09. December 2005, 20:53 »
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

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #5 am: 13. December 2005, 12:35 »
Das Problem hatte ich auch mal. Irgendwie funktioniert es nîcht, wenn man Daten direkt in den Videospeicher schreibt. Wenn du jedoch alles zuerst an einen anderen Ort speicherst und dann in den Viedeospeicher kopierst sollte es die Grafik anzeigen.

Der Fleckenzwerg

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 13. December 2005, 17:56 »
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

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 13. December 2005, 20:48 »
Klar das nirgendwo steht, dass das so ist. Dieses Verhalten ist ja auch absolut normal, wenn Daten per DMA-Transfer übertragen werden. Der DMA Controller wird doch vor dem Datentransfer darauf eingestellt, Daten vom FDC über den I/O Bus einzulesen, und direkt in den RAM zu speichern. NUR der Video-Speicher ist NICHT der RAM der über den Speicherbus angesteuert wird, sondern extra Speicher, der über den I/O Bus an der GraKa angesteuert wird. Daher wirds warscheinlich schon funktionieren, nur leider stehen die Daten dann da wo man nicht drauf zugreifen kann.
Agieren statt Konsumieren!

 

Einloggen