BOOTZ.asm:
Code: Select all
%define ADDR 0x1000
%define Drive 0x00
%define SectorAmount 1
%define Cylinder 0
%define Sector 2
%define Head 0
[BITS 16]
[ORG 0]
jmp 07C0h:reset ; Goto segment 07C0
reset:
mov ah, 0 ;Reset FLP OPcode
mov dl, Drive ;Drive Num(0-A:)
int 13h ;Floppy int
jc reset ;ERROR => reset again
buf:
mov ax, ADDR ; ES:BX = 1000:0000
mov es, ax ;
mov bx, 0 ;
read:
mov ah, 2 ; Read
mov al, SectorAmount ; number of sectors
mov ch, Cylinder ; cylinder number
mov cl, Sector ; sector number
mov dh, Head ; head number
int 13h ; Read!
mov ah,0Ah
mov al,'!'
mov cx,12
int 0x10
mov ah,0x00
int 16h
jmp ADDR:0x00
times 510-($-$$) db 0
dw 0AA55h
CORELD.asm:
Code: Select all
[BITS 16]
jmp init
string1 db 'Succesfully loaded CORELD,Initializing Kernel... '
string2 db 'GDT has been set succesfully... '
string3 db 'A20 Enabled... '
string4 db 'PMODE has been set succesfully... '
string5 db 'PC is now ready to run the kernel in 32 bit mode.'
%include "C:\Users\Mark\Desktop\OS\source\gdt.inc" ; Gdt routines
echo:
add dh,1
mov ah,13h
mov al,1
mov bl,0x02
mov cx,49
mov bp,si
int 10h
ret
init:
mov ah,0x00
mov al,3h
int 0x10
mov si,string1
call echo
memmap:
cli
lgdt [gdt_point]
mov si,string2
call echo
set32bit:
mov ah,0x00
int 16h
mov si,string4
call echo
mov si,string5
call echo
mov eax, cr0
or eax, 1 ; set PE (Protection Enable) bit in CR0 (Control Register 0)
mov cr0, eax
jmp 08h:x32
[BITS 32]
x32:
mov ax, 0x10
mov ds, ax
mov es, ax
mov gs, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp,0x00FFFFFF
hlt
times 512-($-$$) db 0
gdt.inc:
Code: Select all
[BITS 16]
gdt_start:
dd 0
dd 0
;CodeSeg:
code equ $-gdt_start
dw 0xFFFF
dw 0
db 0
db 10011010b
db 11001111b
db 0
;Dataseg:
data equ $-gdt_start
dw 0xFFFF
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_point:
dw gdt_point - gdt_start - 1
dd gdt_start
as you suggested i added the
in CORELD in memmap.
however,when i jump to x32 after setting pmode i get a restart and the following message... if i just put hlt after pmode everything is ok... so iguess the problem is in the jmp offset or something:
probably a wrong offset as i cant get their idea...(gate 0 unsuported)
so how one can jump to the 32bit code after setting pmode? thanks in advance