123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- org 0x10000
- jmp Label_Start
- %include 'fat12.inc'
- Base_Of_Kernel_File equ 0x00
- Offset_Of_Kernel_File equ 0x100000
- Base_Tmp_Of_Kernel_Addr equ 0x00
- Offset_Tmp_Of_Kernel_File equ 0x7e00
- Memory_Struct_Buffer_Addr equ 0x7e00
- [SECTION gdt]
- LABEL_GDT: dd 0,0
- LABEL_DESC_CODE32: dd 0x0000FFFF,0x00CF9A00
- LABEL_DESC_DATA32: dd 0x0000FFFF,0x00CF9200
- GdtLen equ $ - LABEL_GDT
- GdtPtr dw GdtLen - 1
- dd LABEL_GDT
- SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
- SelectorData32 equ LABEL_DESC_DATA32 - LABEL_GDT
- [SECTION .s16]
- [BITS 16]
- Label_Start:
- mov ax, cs
- mov ds, ax
- mov es, ax
- mov ax, 0x00
- mov ss, ax
- mov sp, 0x7c00
-
- mov ax, 0x1301
- mov bx, 0x000f
- mov dx, 0x0100
- mov cx, 23
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, Message_Start_Loader
- int 0x10
-
-
- push ax
- in al, 0x92
- or al, 0x02
- out 0x92, al
- pop ax
- cli
- db 0x66
- lgdt [GdtPtr]
-
- mov eax, cr0
- or eax, 1
- mov cr0, eax
-
- mov ax, SelectorData32
- mov fs, ax
-
- mov eax, cr0
- and al, 11111110b
- mov cr0, eax
- sti
- mov word [SectorNo], SectorNumOfRootDirStart
- Label_Search_In_Root_Dir_Begin:
- cmp word [RootDirSizeForLoop], 0
- jz Label_No_KernelBin
- dec word [RootDirSizeForLoop]
- mov ax, 0x00
- mov es, ax
- mov bx, 0x8000
- mov ax, [SectorNo]
- mov cl, 1
- call Func_ReadOneSector
- mov si, Kernel_FileName
- mov di, 0x8000
- cld
- mov dx, 0x10
- Label_Search_For_LoaderBin:
- cmp dx, 0
- jz Label_Goto_Next_Sector_In_Root_Dir
- dec dx
- mov cx, 11
- Label_Cmp_FileName:
- cmp cx, 0
- jz Label_FileName_Found
- dec cx
- lodsb
- cmp al, byte [es:di]
- jz Label_Go_On
- jmp Label_Different
- Label_Go_On:
- inc di
- jmp Label_Cmp_FileName
- Label_Different:
- and di, 0xffe0
- add di, 0x20
- mov si, Kernel_FileName
- jmp Label_Search_For_LoaderBin
- Label_Goto_Next_Sector_In_Root_Dir:
- add word [SectorNo], 1
- jmp Label_Search_In_Root_Dir_Begin
- Label_No_KernelBin:
-
- mov ax, 0x1301
- mov bx, 0x000c
- mov dx, 0x0200
- mov cx, 24
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, Message_No_Loader
- int 0x10
- jmp $
- Label_FileName_Found:
- mov ax, RootDirSectors
-
- and di, 0xffe0
- add di, 0x1a
- mov cx, word [es:di]
- push cx
- add cx, ax
- add cx, SectorBalance
- mov eax, Base_Tmp_Of_Kernel_Addr
- mov es, eax
- mov bx, Offset_Tmp_Of_Kernel_File
- mov ax, cx
- Label_Go_On_Loading_File:
- push ax
- push bx
-
- mov ah, 0x0e
- mov al, "."
- mov bl, 0x0f
- int 0x10
- pop bx
- pop ax
-
- mov cl, 1
- call Func_ReadOneSector
- pop ax
-
- push cx
- push eax
- push fs
- push edi
- push ds
- push esi
- mov cx, 0x0200
- mov ax, Base_Of_Kernel_File
- mov fs, ax
- mov edi, dword [OffsetOfKernelFileCount]
- mov ax, Base_Tmp_Of_Kernel_Addr
- mov ds, ax
- mov esi, Offset_Tmp_Of_Kernel_File
- Label_Move_Kernel:
-
- mov al, byte [ds:esi]
- mov byte [fs:edi], al
- inc esi
- inc edi
- loop Label_Move_Kernel
-
- mov eax, 0x1000
- mov ds, eax
- mov dword [OffsetOfKernelFileCount], edi
- pop esi
- pop ds
- pop edi
- pop fs
- pop eax
- pop cx
- call Func_GetFATEntry
- cmp ax, 0x0fff
- jz Label_File_Loaded
- push ax
- mov dx, RootDirSectors
- add ax, dx
- add ax, SectorBalance
-
- jmp Label_Go_On_Loading_File
- Label_File_Loaded:
-
- mov ax, 0x1301
- mov bx, 0x000f
- mov dx, 0x0200
- mov cx, 20
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, Message_Kernel_Loaded
- int 0x10
-
-
-
- mov ax, 0xB800
- mov gs, ax
- mov ah, 0x0F
- mov al, '.'
- mov [gs:((80 * 2 + 20) * 2)], ax
- Label_Kill_Motor:
-
-
- push dx
- mov dx, 0x03F2
- mov al, 0
- out dx, al
- pop dx
-
-
- mov ax, 0x1301
- mov bx, 0x000F
- mov dx, 0x0300
- mov cx, 34
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, Message_Start_Get_Mem_Struct
- int 0x10
- mov ax, 0x00
- mov es, ax
- mov di, Memory_Struct_Buffer_Addr
- mov ebx, 0
- Label_Get_Mem_Struct:
-
-
-
-
-
- mov eax, 0xe820
- mov ecx, 20
- mov edx, 0x534d4150
- int 0x15
- jc Label_Get_Mem_Fail
- add di, 20
- cmp ebx, 0
- jne Label_Get_Mem_Struct
- jmp Label_Get_Mem_OK
- Label_Get_Mem_Fail:
-
-
- mov ax, 0x1301
- mov bx, 0x000c
- mov dx, 0x0400
- mov cx, 33
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, Message_Get_Mem_Failed
- int 0x10
- jmp $
- Label_Get_Mem_OK:
-
- mov ax, 0x1301
- mov bx, 0x000f
- mov dx, 0x0400
- mov cx, 39
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, Message_Get_Mem_Success
- int 0x10
- jmp Label_Get_SVGA_Info
- Label_Get_SVGA_Info:
-
- mov ax, 0x1301
- mov bx, 0x000f
- mov dx, 0x0500
- mov cx, 30
- push ax
- mov ax, ds
- mov es, ax
- pop ax
- mov bp, Message_Start_Get_SVGA_Info
- int 0x10
- jmp $
- Func_ReadOneSector:
- push bp
- mov bp, sp
- sub esp, 2
- mov byte [bp-2], cl
- push bx
- mov bl, [BPB_SecPerTrk]
- div bl
- inc ah
- mov cl, ah
- mov dh, al
- shr al, 1
- mov ch, al
- and dh, 1
- pop bx
- mov dl, [BS_DrvNum]
-
-
- Label_Go_On_Reading:
-
- mov ah, 2
- mov al, byte [bp-2]
- int 0x13
- jc Label_Go_On_Reading
- add esp, 2
- pop bp
- ret
- Func_GetFATEntry:
-
-
- push es
- push bx
- push ax
-
- mov ax, 00
- mov es, ax
- pop ax
- mov byte [Odd], 0
-
- mov bx, 3
- mul bx
- mov bx, 2
- div bx
- cmp dx, 0
- jz Label_Even
- mov byte [Odd], 1
- Label_Even:
- xor dx, dx
-
- mov bx, [BPB_BytesPerSec]
- div bx
- push dx
-
- mov bx, 0x8000
- add ax, SectorNumOfFAT1Start
- mov cl, 2
- call Func_ReadOneSector
- pop dx
- add bx, dx
- mov ax, [es:bx]
- cmp byte [Odd], 1
- jnz Label_Even_2
- shr ax, 4
- Label_Even_2:
- and ax, 0x0fff
- pop bx
- pop es
- ret
- RootDirSizeForLoop dw RootDirSectors
- SectorNo dw 0
- Odd db 0
- OffsetOfKernelFileCount dd Offset_Of_Kernel_File
- Message_Start_Loader: db "[DragonOS] Start Loader"
- Message_No_Loader: db "[ERROR] No Kernel Found."
- Message_Kernel_Loaded: db "[INFO] Kernel loaded"
- Message_Start_Get_Mem_Struct: db "[INFO] Try to get memory struct..."
- Message_Get_Mem_Failed: db "[ERROR] Get memory struct failed."
- Message_Get_Mem_Success: db "[INFO] Successful to get memory struct."
- Message_Start_Get_SVGA_Info: db "[INFO] Try to get SVGA info..."
- Kernel_FileName: db "KERNEL BIN", 0
|