oh ja verzeiht ... mein fehler!!!
mein bootloader (jetzt wirklich)
;*************************************************
; BOOTLOADER
;*************************************************
org 0h ; Startadresse
jmp 07c0h:_start ; Springe zu _start im Segment 07c0h
;************************************************
; VARIABLEN
;************************************************
loadmsg db "Loading "TEST-Kernel 0.7... ",0
resetmsg db "Reseting bootdrive... ",0
readymsg db "ready",13,10,0
keymsg db "Press any key to start TEST-OS 0.7.",13,10,0
;************************************************
; MAIN
;************************************************
_start:
mov ax, cs ; Segmenregister setzen
mov ds, ax
mov es, ax
; Stack einrichten
cli ; Interrputs verbieten
mov ax, 9000h ; Stackadresse
mov ss, ax ; Stacksegment setzen
mov sp, 0 ; Stackpointer auf 0
sti ; Interrupts wieder zulassen
call _clrscr
call _reset ; Bootlaufwerk resten / Kernel laden
mov si, keymsg ; String ausgeben
call _putstr
mov ax, 1000h
push ax
mov ax, 0h
push ax
retf
; jmp 1000h:0000h ; Springe zum Kernel
;************************************************
; FUNKTIONEN
;************************************************
; Einen String ausgeben:
_putstr:
lodsb ; Byte von ds:si nach al laden
or al,al ; Wenn al= 0 dann wird ZF gesetzt
jz _putstr_ende ; Wenn 0-Byte springe zum Ende
mov ah, 0Eh ; Funktionsnummer nach al
mov bh, 00h ; Bildschirmseite nach bh
mov bl, 07h ; Attribut nach bl
int 10h ; Interrupt 10h aufrufen
jmp _putstr
_putstr_ende:
ret ; Return
; auf Tastendruck warten
_waitforkey:
mov ah, 00h ; Funktionsnummer nach al
int 16h ; Interrupt 16h aufrufen
ret ; Return
; Bildschirm löschen
_clrscr:
mov ah, 0fh
int 10h
mov ah, 00h
int 10h
ret
; Bootlaufwerk reseten
_reset:
mov si, resetmsg
call _putstr
push ds ; ds sichern
mov ah, 00h ; Funktionsnummer nach al
mov dl, 00h ; Bootlaufwerk nach dl (0)
int 13h ; Interrupt 13h aufrufen
pop ds ; ds vom Stapel holen
jc _reset ; bei Fehler, erneuter Versuch
mov si, readymsg
call _putstr
mov ax, 1000h ; Adresse für Kernel von Diskette:
mov es, ax ; es:bx = 1000h:0000h
mov bx, 0
; Kernel von Diskette laden
_loadkernel:
mov si, loadmsg ; Offset von loadmsg nach si
call _putstr ; String ausgeben
mov ah, 2 ; Funktionsnummer nach al
mov al, 5 ; Anzahl der zulesenden Sektoren
mov ch, 0 ; Nummer des Cylinders
mov cl, 2 ; Nummer des Startsektors
mov dx, 0 ; Head, Drive = 0
int 13h ; Interrupt 13h aufrufen
jc _loadkernel ; bei Fehler, erneuter Versuch
mov si, readymsg
call _putstr
ret
times 512-($-$$)-2 db 0 ; Dateigröße von 510 Bytes erzeugen
dw 0AA55h ; + 2 Bytes Bootsignatur --> 512 Bytes