bond/misc/legacy_bootloader/inc/boot/loader.asm

249 lines
4.3 KiB
NASM

org 0100h
jmp BEGIN
%include "pm.inc"
;GDT
DESC_VOID: Descriptor 0,0,0
DESC_GRAPH: Descriptor 0b8000h,0ffffh,DA_DRW | DA_DPL3
DESC_FLAT_C: Descriptor 0,0fffffh,DA_CR | DA_32 | DA_LIMIT_4K
DESC_FLAT_RW: Descriptor 0,0fffffh,DA_DRW | DA_32 | DA_LIMIT_4K
DESC_FLAT_USER_C: Descriptor 0,0fffffh,DA_CR | DA_32| DA_LIMIT_4K | DA_DPL3
DESC_FLAT_USER_RW: Descriptor 0,0fffffh,DA_DRW | DA_32 | DA_LIMIT_4K | DA_DPL3
GDTLEN equ $ - DESC_VOID
GDTPTR: dw GDTLEN - 1
dd LOADERINFLAT + DESC_VOID
;Paging
PDEBASE equ 100000h
PTEBASE equ 101000h
;kernel
LOADERBASE equ 09000h
LOADEROFFSET equ 0100h
LOADERINFLAT equ LOADERBASE*10h
KERNELFILENAME db 'KERNEL BIN',0
KERNELBASE equ 03000h
KERNELOFFSET equ 0000h
KERNELINFLAT equ KERNELBASE*10h + KERNELOFFSET
;Selectors
SLCT_FLAT_C equ DESC_FLAT_C - DESC_VOID
SLCT_GRAPH equ DESC_GRAPH - DESC_VOID
SLCT_FLAT_RW equ DESC_FLAT_RW - DESC_VOID
;==================Section .DATA==============================
;Variables
;Operating System Information
;OS:
OSINFO1: db 'Hyper-Assembler Operating System 1.0',0
OSINFO2: db "Loader written by Orange'S, Kernel written by Hyper-Assembler",0
KERNELFILELOADCOMPLETE db 'Kernel.bin Loaded to 0x30000',0
;GETMEMORY
RAMINFO1: db "Memory Information:",0
RAMTABLE16: db ' BASE L BASE H Length L Length H Type ',0
RAMSIZE: db 'RAM SIZE:',0
GETMEMFAIL: db 'Failed to Get The Memory',0
RAMAVAILABLE: db ' - Available',0
RAMRESERVED: db ' - Reserved',0
;Protected Mode:
PMINFO: db 'Protected Mode Entered...',0
PMINFO32 equ PMINFO + LOADERINFLAT
;PAGING:
PGINFO: db 'Paging Started...',0
PGINFO32 equ PGINFO + LOADERINFLAT
PTEINFO: db 'PTE Table BASE: ',0
PTEINFO32 equ PTEINFO + LOADERINFLAT
PDEINFO: db 'PDE Table BASE: ',0
PDEINFO32 equ PDEINFO + LOADERINFLAT
CR3INFO: db 'cr3: ',0
CR3INFO32 equ CR3INFO + LOADERINFLAT
;Variables Used in Functions
IO16_SPACE: db ' ',0
IO32_SPACE equ IO16_SPACE + LOADERINFLAT
IO16_RETURN: db 0Ah,0
IO32_RETURN equ IO16_RETURN + LOADERINFLAT
GRAPHPOS: dd 0
GRAPHPOS_32 equ GRAPHPOS + LOADERINFLAT
GETMEMBUFF: times 1024 db 0
GETMEMNUM: dd 0
GETMEMNUM_32 equ GETMEMBUFF + LOADERINFLAT
DISPMEMTOTAL: dd 0
DISPMEMTOTAL_32 equ DISPMEMTOTAL + LOADERINFLAT
KERNELLOADED: db 'KERNEL LOADED IN MEM.',0
KERNELLOADED_32 equ KERNELLOADED + LOADERINFLAT
%include "FAT12Header.inc"
;=========================STACK32=============================
[bits 32]
STACK32BASE:
times 1024 db 0
TOP:
STACK32TOP equ LOADERINFLAT + TOP
;==========================CODE16==============================
[bits 16]
%include "io16.lib"
%include "fat12readfile.lib"
BEGIN:
mov ax,cs
mov ds,ax
mov ss,ax
mov es,ax
mov ax,0003h
int 10h ;clear
xor eax,eax
mov eax,OSINFO1
push eax
call DISPSTR16
add esp,4
call DISPRETURN16
xor eax,eax
mov eax,OSINFO2
push eax
call DISPSTR16
add esp,4
call DISPRETURN16
call DISPRETURN16
xor eax,eax
mov eax,RAMINFO1
push eax
call DISPSTR16
add esp,4
call DISPRETURN16
call GETMEM16
mov eax,dword [ds:GETMEMNUM]
cmp eax,0
jne GETMEMSUCCESSFUL
xor eax,eax
mov eax,GETMEMFAIL
push eax
call DISPSTR16
pop eax
GETMEMSUCCESSFUL:
call DISPMEM16
call DISPRETURN16
;FAT12ReadFile(ULONG16 Base,ULONG16 Offset,ULONG16 OffsetFileName)
push KERNELFILENAME
push KERNELOFFSET
push KERNELBASE
call FAT12ReadFile
add esp,6
xor eax,eax
mov eax,KERNELFILELOADCOMPLETE
push eax
call DISPSTR16
add esp,4
call DISPRETURN16
;load gdt
lgdt [GDTPTR]
;close interupt
cli
;open A20
in al,92h
or al,00000010b
out 92h,al
;prepare to switch to the protected mode
mov eax,cr0
or eax,1
mov cr0,eax
jmp dword SLCT_FLAT_C:(CODE32_START + LOADERINFLAT)
;===================CODE32======================
[bits 32]
%include "mem32.lib"
%include "io32.lib"
CODE32_START:
mov ax,SLCT_FLAT_RW
mov ss,ax
mov ds,ax
mov es,ax
mov gs,ax
mov ax,SLCT_GRAPH
mov gs,ax
mov sp,STACK32TOP
mov eax,PMINFO32
push eax
call near DISPSTR32
pop eax
;Setup paging
call PAGINGINIT32
call DISPRETURN32
mov eax,PGINFO32
push eax
call near DISPSTR32
pop eax
call DISPRETURN32
;Print PDE Table Base
mov eax,PDEINFO32
push eax
call DISPSTR32
pop eax
mov eax,PDEBASE
push eax
call DISPINTEAX32
pop eax
call DISPRETURN32
;Print PTE table base
mov eax,PTEINFO32
push eax
call DISPSTR32
pop eax
mov eax,PTEBASE
push eax
call DISPINTEAX32
pop eax
call DISPRETURN32
;Print cr3
mov eax,CR3INFO32
push eax
call DISPSTR32
pop eax
mov eax,cr3
push eax
call DISPINTEAX32
pop eax
;Jump to The Kernel
jmp SLCT_FLAT_C:KERNELINFLAT