hallo zusammen!
ich hab mal nen bootloader geschrieben, der unter bochs auch geht, aber im real-pc net... das hier ist er:
was könnte also einen echten PC dabei zu einem reboot bewegen, was bochs nix ausmacht? ich hab bis jetzt noch nix gefunden...
in hoffnung auf hilfe,
J!N
ich hab mal nen bootloader geschrieben, der unter bochs auch geht, aber im real-pc net... das hier ist er:
Code: [Auswählen]
;~~~~~~~~~~~~~~~~~~~~
;~ 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!
lgdt [GDT] ;gdt laden
mov eax,cr0
or eax,1
mov cr0,eax ;pm an
jmp 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 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
putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
ret
getkey:
mov ah, 0
int 016h
ret
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 ; NULL-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
was könnte also einen echten PC dabei zu einem reboot bewegen, was bochs nix ausmacht? ich hab bis jetzt noch nix gefunden...
in hoffnung auf hilfe,
J!N

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken


Gespeichert
)