Autor Thema: Bootloader  (Gelesen 12438 mal)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« am: 24. January 2005, 15:03 »
hallo zusammen!

ich hab mal nen bootloader geschrieben, der unter bochs auch geht, aber im real-pc net... das hier ist er:


;~~~~~~~~~~~~~~~~~~~~
;~      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...  :cry:

in hoffnung auf hilfe,

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 24. January 2005, 15:30 »
so. ich habe ein bisschen probiert und so weiter, und bin zu dem schluss gekommen, dass bis zu dem switch in den PM alles geht. jetzt muss ich nurnoch den fehler beim switch suchen...

EDIT:
hier in diesem bereich ist was falsch, wenn ich nur wüsste, was...

;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    

ich habe auch schon versucht, die segmentregister richtig zu stellen vor dem switch, aus "angst" vor einem GPF, aber das ging auch net!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 24. January 2005, 15:53 »
hm... hab gerade mitbekommen, dass man das A20-Gate einschalten muss! ich werds mal versuchen...

EDIT: fertig versucht... ging net! ich hab jetzt also den code hier zum PM:

;PM AKTIVIEREN!
;A20-Gate an:
mov al,0xD1
out 0x64,al
mov al,0x03
out 0x60,al
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
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 24. January 2005, 17:47 »
tja, da schreibe ich schon wieder... ich habe mal wieder weiter ge"forscht"... hab herausgefunden, dass der fehler beim swich in den PM ist. keine ahnung, was da falsch ist, aber es gibt mehrere möglichkeiten, denke ich.

1) GDT falsch (aber warum arbeitet die dann unter bochs)
2) man kann an dem rechner cr0 net derartig bearbeiten (währe aber komisch!)
3) der PC ist ein 186 (is er nicht ;-))
4) dem PC fehlt eine IDT! weiß net, aber braucht man die dringend? ich habe die ints net ausgeschaltet, von daher... wie ist das eigendlich? benutzt der keine, wenn er keine IDT hat, oder macht er dann quatsch?
5) eine exception (aber warum gehts unter bochs?!)
6) irgendwas, was ich net weiß

vielen dank bei hilfe,

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 24. January 2005, 17:56 »
Interrupts auf jeden fall ausschalten ohne IDT, sonst macht der sonstwas, nimmt die Alte Interrupt Verktor Tabelle vom RM interpretiert das als neue IDT werte. Det geht nich gut^^
Ansonsten kann ich weiter nix sagen.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #5 am: 25. January 2005, 08:13 »
also das hat mir bisher auch nix gebracht, stürzt immernoch ab! allerdings weiß ich jetzt, dass der wechsel in den PM geht. muss davor scheinbar nochwas hinbauen, das wartet, bis das laufwerk fertig ist, damit es kein int aufruft, wenn ich die wieder anmache. er macht scheinbar den reboot beim flashen...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 25. January 2005, 11:06 »
DS, ES,... sind 16 Bit Breit, EAX 32Bit, das geht eigendlich garnicht.
Warum meckert der Assembler da nicht?
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #7 am: 25. January 2005, 14:01 »
stimmt... aber warum geht es dann unter bochs? ich werds mal testen!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 25. January 2005, 15:13 »
Zitat von: Roshl
DS, ES,... sind 16 Bit Breit, EAX 32Bit, das geht eigendlich garnicht.
Warum meckert der Assembler da nicht?


Zitat
When operating in 32-bit mode and moving data between a segment register and a general-purpose register, the Intel Architecture 32-bit processors do not require the use of the 16-bit operand-size prefix (a byte with the value 66H) with this instruction, but most assemblers will insert it if the standard form of the instruction is used (for example, MOV DS, AX). The processor will execute this instruction correctly, but it will usually require an extra clock. With most assemblers, using the instruction form MOV DS, EAX will avoid this unneeded 66H prefix. When the processor executes the instruction with a 32-bit general-purpose register, it assumes that the 16 least-significant bits of the general-purpose register are the destination or source operand. If the register is a destination operand, the resulting value in the two high-order bytes of the register is implementation dependent. For the Pentium Pro processor, the two high-order bytes are filled with zeros; for earlier 32-bit Intel Architecture processors, the two high order bytes are undefined.


-> http://faydoc.tripod.com/cpu/mov.htm
Dieser Text wird unter jedem Beitrag angezeigt.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #9 am: 25. January 2005, 15:18 »
Vielen dank für diese Info^^
Kann Intel nicht einfach mal konsequent sein und so einen Mist verbieten^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 25. January 2005, 15:49 »
Intel übertreibt's wahrhaftig mit diesen Befehlssätzen, da sind einfach zu viele Möglichkeiten da. Diese CISC-CPUs kann man fast als ELISC-CPUs bezeichen: Extremely Large Intruction Set Computing CPUs. ;)

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #11 am: 25. January 2005, 15:57 »
Ich mag eigentlich CISC Prozessoren mehr als SISC, aber ist Geschmackssache.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 25. January 2005, 16:03 »
Meinst du mit SISC RISC?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 25. January 2005, 17:53 »
Zitat von: elfish_rider
Diese CISC-CPUs kann man fast als ELISC-CPUs bezeichen: Extremely Large Intruction Set Computing CPUs. ;)

Warum nicht ECISC = Extreme Complex Instruction Set Computing? ;)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #14 am: 25. January 2005, 18:00 »
oder vielleicht ESIS = extrem schrottiges instruktion set ;-)
ne, let's get back to topic! ich hab den bootloader auf meinem arbeitsrechner getestet... da geht der jump zumindest... ich werde mal rebooten und den rest testen!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #15 am: 25. January 2005, 18:16 »
EDIT: negativ! hat net funktioniert...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #16 am: 26. January 2005, 14:30 »
hat sonst keiner eine idee? wie macht ihr diesen flash-jump in euren bootloadern?
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 26. January 2005, 15:15 »
Du musst die GDT-Definitionsstruktur (1 Doubleword + 1 Word) ausserhalb der eigentlichen GDT machen! Ausserdem besteht der Null-Deskriptor wirklich nur aus Nullen! Den Deskriptor 1 kannst du lassen, dann sollte es funzen.

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #18 am: 26. January 2005, 15:36 »
hm... geht trotzdem net! hab jetzt das ganze einfach als GDT_strukt gemacht, und da die passenden werte eingesetzt. unter bochs gehts, aber in real mal wieder net!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #19 am: 26. January 2005, 20:12 »
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
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

 

Einloggen