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