PS:
hier ist mein aktueller code:
;~~~~~~~~~~~~~~~~~~~~
;~ HighOS ~
;~~~~~~~~~~~~~~~~~~~~
;@typ : bootloader
;@author : Joachim Neu
;@date : 17.01.2005 - 23.01.2005
;@version: 1.0
[ORG 0x7C00] ;startup
[BITS 16] ;16 bit
mov [bootdrv],dl ;bootdrive sichern
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
xor esi,esi
xor edi,edi
;STACK AUFBAUEN!
mov ax,0x9000
mov ss,ax
mov sp,0xFFFF
;VESA AKTIVIEREN!
push ds
;vorbereitungen treffen
mov di,0x50
mov es,di
xor di,di
mov al,'V'
stosb
mov al,'B'
stosb
mov al,'E'
stosb
mov al,'2'
stosb
xor di,di
mov ax,0x4F00
int 0x10 ;vesa auslösen
;verfügbarkeit testen
cmp ax,0x004F
jne near vesa_error
mov si,0x50
mov ds,si
xor si,si
lodsb
lodsb
cmp al,'E'
jne near vesa_error
mov cx,0x06
rep lodsw
lodsw
;liste der modi holen
mov bx,ax
lodsw
mov ds,ax
mov si,bx
push ds
push si
;mode suchen (0x0118)
find_right_mode1:
lodsw
cmp ax,0xFFFF
je check_115_mode
cmp ax,0x0118
jne find_right_mode1
mov bx,0x0118
jmp before_set_vesa
check_115_mode:
pop si
pop ds
;mode suchen (0x0115)
find_right_mode2:
lodsw
cmp ax,0xFFFF
je near vesa_error
cmp ax,0x0115
jne find_right_mode2
mov bx,0x0115
jmp set_vesa_mode
before_set_vesa:
pop si
pop ds
;modeinfos holen
set_vesa_mode:
mov cx,bx
pop ds
mov [vesa_mode],cx
push ds
mov ax,0x4F01
mov di,0x50
mov es,di
xor di,di
int 0x10
;modeinfos auslesen
mov si,0x50
mov ds,si
xor si,si
mov cx,0x0C
rep lodsw
lodsb
lodsb
pop ds
mov [vesa_bits_per_pixel],al
push ds
mov si,0x50
mov ds,si
xor si,si
mov cx,0x14
rep lodsw
lodsd
pop ds
mov [vesa_physical_base_adress],eax
;vesamode setzen
mov bx,[vesa_mode]
;mov bx,0x115
;mov word [vesa_mode],0x115
add bx,0x4000
mov ax,0x4F02
int 0x10
;KERNEL LADEN!
load:
xor ax,ax ; Funktion 0 (reset)
mov dl,[bootdrv] ; Dieses Laufwerk ist gewünscht
int 13h ; Reset
jc load ; Fehler? -> Noch mal!
load1:
mov ax,0x50 ; ES:BX = 0x500
mov es,ax ; adresse mit ES:BX bilden (0x50:0x00)
xor bx,bx
mov ah,0x02 ; Funktion 2 (Lesen)
mov al,0x11 ; Lese 11h, also 17 Sektoren
mov cx,0x0002 ; Cylinder=0,Sector=2
xor dx,dx ; Head=0,Laufwerk=0
mov dl,[bootdrv] ; bootlaufwerk
int 13h ; ES:BX = Daten vom Laufwerk
jc load1 ; Fehler? Noch mal!
load2:
mov ax,0x270 ; ES:BX = 0x2700
mov es,ax ; adresse mit ES:BX bilden (0x270:0x00)
xor bx,bx
mov ah,0x02 ; Funktion 2 (Lesen)
mov al,0x12 ; Lese 12h, also 18 Sektoren
mov cx,0x0001 ; Cylinder=0,Sector=1
mov dh,0x01 ; Head=1,Laufwerk=0
mov dl,[bootdrv] ; bootlaufwerk
int 13h ; ES:BX = Daten vom Laufwerk
jc load2 ; Fehler? Noch mal!
load3:
mov ax,0x4B0 ; ES:BX = 0x4B00
mov es,ax ; adresse mit ES:BX bilden (0x4B0:0x00)
xor bx,bx
mov ah,0x02 ; Funktion 2 (Lesen)
mov al,0x12 ; Lese 12h, also 18 Sektoren
mov cx,0x0101 ; Cylinder=1,Sector=1
xor dh,dh ; Head=0,Laufwerk=0
mov dl,[bootdrv] ; bootlaufwerk
int 13h ; ES:BX = Daten vom Laufwerk
jc load3 ; Fehler? Noch mal!
;PM AKTIVIEREN!
cli ;interrupts ausmachen
;A20-Gate an:
mov al,0xD1
out 0x64,al
mov al,0x03
out 0x60,al
lgdt [GDT] ;gdt laden
mov ax,dseg-GDT
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov eax,cr0
or eax,1
mov cr0,eax ;pm an
jmp dword 0x08:flash ;flashen
[BITS 32]
flash: ;flashen fertig
mov eax,dseg-GDT ;+
mov ds,eax ;|
mov es,eax ;>richtigstellen der datenregister
mov fs,eax ;|
mov gs,eax ;|
mov ss,eax ;+
mov esp,0x9FFFF ;stack einrichten
mov dl,[bootdrv] ;übergabe des bootdrives an den kernel
mov al,[vesa_bits_per_pixel] ;übergabe der bits pro pixel an den kernel
mov cx,[vesa_mode] ;übergabe des modus
mov ebx,[vesa_physical_base_adress] ;übergabe der physbaseptr-var an den kernel
jmp dword 0x08:0x500 ;zum kernel springen
jmp $ ;stop, damit kein crash in die vars erfolgt
[BITS 16]
;fehlerbehandlung
vesa_error:
pop ds
mov si,vesa_error_text
call putstr
call getkey
call reboot
;funktionen
; 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:
ret
; Warte auf einen Tastendruck
getkey:
mov ah, 0 ; Funktion 0
int 016h ; Ausführen
ret
; Rebooten (HEX Dump).
reboot:
db 0EAh
dw 0000h
dw 0FFFFh
;vars
bootdrv db 0x00
vesa_bits_per_pixel db 0x00
vesa_physical_base_adress dd 0x00000000
vesa_mode dw 0x0000
vesa_error_text db "Error in VESA 2.0!",13,10,0
;global deskriptor tabelle
GDT:
dw gdt_limit ; GDT+0-Deskriptor
dd GDT
dw 0
cseg dd 0x0000FFFF,0x00CF9800 ; code segment,32-bit,0 bis 4GB
dseg dd 0x0000FFFF,0x00CF9200 ; data segment,32-bit,0 bis 4GB
gdt_limit equ $-GDT-1
times 512-($-$$)-2 db 0 ; Dateilänge: 512 Bytes
dw 0AA55h ; Bootsignatur
in hoffnung,
J!N