use16

org 0x7c00
jmp boot_start
msg db "HorizonBoot BOOTLOADER v1.0 first stage",10,13,"Loading second stage...",0
adrpack:
.sz db 10h
.zero db 0
.nsectors dw 16
.off  dw 0x7e00
.seg  dw 0
.lba dq 1
boot_start:

    jmp 0:.setcs
    .setcs:
    mov sp,0x4000
    xor ax,ax
    mov ss,ax
    mov ds,ax
    mov es,ax
    mov fs,ax
    mov gs,ax
        mov [dl_bac],dl

unreal:
    push ds
    lgdt [gdtinfo]
    pop ds
    mov ah,0x41
    mov bx,0x55aa
    mov dl,0x80
    int 13h
    jc error
    mov si,msg
    call printS
    sti
    mov si,adrpack

    mov ah,0x42
    mov dl,[dl_bac]
    int 13h
    cli
    cmp ah,0xc
    je skip
    jc error
    skip:

    mov si,ok
    call printS
    jmp secondstage
errormsg db "Error ",0
ok db "ok",0
error:

    mov si,errormsg
    call printS

        mov al,ah
    mov ah,0x0e

    int 10h
        xor ah,ah
    int 16h
    jmp 0xffff:0
printS:
	pusha

	mov ah, 0Eh			
.repeat:
	lodsb				
	cmp al, 0
	je .done			;

	int 10h				
	jmp .repeat			

.done:
	popa
	ret
	gdtinfo:
   dw gdt_end - gdt - 1   ;last byte in table
   dd gdt                 ;start of table
 
gdt         dd 0,0        ; entry 0 is always unused
flatcode    db 0xff, 0xff, 0, 0, 0, 10011010b, 10001111b, 0 
flatdesc    db 0xff, 0xff, 0, 0, 0, 10010010b, 11001111b, 0
gdt_end:

dl_bac db 0


drive_par:
.sz db 0
.t db 0
.dnum db 0
.cdrconnum db 0
.emulate dd 0
.devspec dw 0
.cdbuff dw 0
.initseg dw 0
.sector dw 0
.cylcount db 0
.seccount db 0
.headcount db 0
testmsg db 10,13,"Entered second stage.",10,13,"Setting up vesa and enter protected mode...",0
times 510-($-$$) db 0	; Pad remainder of boot sector with zeros
	dw 0xAA55		; Boot signature (DO NOT CHANGE!)

dd 0x12345678
secondstage:

    cli
    mov si,testmsg
    call printS
    mov ax,0x4f02
    mov bx,0x4113
    int 10h
    mov eax,cr0
    or al,1
    mov cr0,eax
    jmp 0x8:next
next:
use32
    mov bx,0x10
    mov ds,bx
    mov eax,cr0
    and al,0xfe
    mov cr0,eax
    jmp $
