forked from KolibriOS/kolibrios
multiboot kernel
git-svn-id: svn://kolibrios.org@847 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
94030d053e
commit
ebacfa0899
151
kernel/branches/kolibri_pe/core/init.asm
Normal file
151
kernel/branches/kolibri_pe/core/init.asm
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
DWORD equ dword
|
||||||
|
WORD equ word
|
||||||
|
BYTE equ byte
|
||||||
|
|
||||||
|
PTR equ
|
||||||
|
|
||||||
|
_init:
|
||||||
|
push esi
|
||||||
|
push ebx
|
||||||
|
sub esp, 4
|
||||||
|
mov eax, DWORD PTR [_boot_mbi]
|
||||||
|
test BYTE PTR [eax], 2
|
||||||
|
je .L2
|
||||||
|
push ecx
|
||||||
|
push ecx
|
||||||
|
push DWORD PTR [eax+12]
|
||||||
|
push .LC0
|
||||||
|
call _printf
|
||||||
|
add esp, 16
|
||||||
|
.L2:
|
||||||
|
mov eax, DWORD PTR [_boot_mbi]
|
||||||
|
test BYTE PTR [eax], 4
|
||||||
|
je L4
|
||||||
|
push edx
|
||||||
|
push edx
|
||||||
|
push DWORD PTR [eax+16]
|
||||||
|
push .LC1
|
||||||
|
call _printf
|
||||||
|
add esp, 16
|
||||||
|
.L4:
|
||||||
|
mov eax, DWORD PTR [_boot_mbi]
|
||||||
|
test BYTE PTR [eax], 8
|
||||||
|
je .L6
|
||||||
|
push esi
|
||||||
|
xor esi, esi
|
||||||
|
push DWORD PTR [eax+24]
|
||||||
|
push DWORD PTR [eax+20]
|
||||||
|
push .LC2
|
||||||
|
call _printf
|
||||||
|
mov eax, DWORD PTR [_boot_mbi]
|
||||||
|
mov ebx, DWORD PTR [eax+24]
|
||||||
|
jmp .L22
|
||||||
|
.L9:
|
||||||
|
mov eax, DWORD PTR [ebx-12]
|
||||||
|
inc esi
|
||||||
|
push DWORD PTR [ebx-8]
|
||||||
|
mov DWORD PTR [_pg_balloc], eax
|
||||||
|
push eax
|
||||||
|
push DWORD PTR [ebx-16]
|
||||||
|
push .LC3
|
||||||
|
call _printf
|
||||||
|
.L22:
|
||||||
|
mov eax, DWORD PTR [_boot_mbi]
|
||||||
|
add esp, 16
|
||||||
|
mov edx, ebx
|
||||||
|
add ebx, 16
|
||||||
|
cmp esi, DWORD PTR [eax+20]
|
||||||
|
jb .L9
|
||||||
|
mov edx, DWORD PTR [edx-16]
|
||||||
|
push ebx
|
||||||
|
push ebx
|
||||||
|
sub edx, 536870912
|
||||||
|
lea eax, [edx+512]
|
||||||
|
mov DWORD PTR [_rd_fat], eax
|
||||||
|
lea eax, [edx+4790]
|
||||||
|
push edx
|
||||||
|
push .LC4
|
||||||
|
mov DWORD PTR [_rd_fat_end], eax
|
||||||
|
lea eax, [edx+9728]
|
||||||
|
mov DWORD PTR [_rd_root], eax
|
||||||
|
lea eax, [edx+16896]
|
||||||
|
mov DWORD PTR [_rd_base], edx
|
||||||
|
mov DWORD PTR [_rd_root_end], eax
|
||||||
|
call _printf
|
||||||
|
add esp, 16
|
||||||
|
.L6:
|
||||||
|
mov eax, DWORD PTR [_boot_mbi]
|
||||||
|
xor esi, esi
|
||||||
|
test BYTE PTR [eax], 64
|
||||||
|
je .L13
|
||||||
|
push ecx
|
||||||
|
push DWORD PTR [eax+44]
|
||||||
|
push DWORD PTR [eax+48]
|
||||||
|
push .LC5
|
||||||
|
call _printf
|
||||||
|
mov eax, DWORD PTR [_boot_mbi]
|
||||||
|
add esp, 16
|
||||||
|
mov ebx, DWORD PTR [eax+48]
|
||||||
|
jmp .L14
|
||||||
|
.L15:
|
||||||
|
push edx
|
||||||
|
push DWORD PTR [ebx+20]
|
||||||
|
push DWORD PTR [ebx+12]
|
||||||
|
push DWORD PTR [ebx+16]
|
||||||
|
push DWORD PTR [ebx+4]
|
||||||
|
push DWORD PTR [ebx+8]
|
||||||
|
push DWORD PTR [ebx]
|
||||||
|
push .LC6
|
||||||
|
call _printf
|
||||||
|
add esp, 32
|
||||||
|
cmp DWORD PTR [ebx+20], 1
|
||||||
|
jne .L16
|
||||||
|
mov eax, DWORD PTR [ebx+4]
|
||||||
|
add eax, DWORD PTR [ebx+12]
|
||||||
|
and eax, -4096
|
||||||
|
cmp esi, eax
|
||||||
|
jae .L16
|
||||||
|
mov esi, eax
|
||||||
|
.L16:
|
||||||
|
mov eax, DWORD PTR [ebx]
|
||||||
|
add eax, 4
|
||||||
|
lea ebx, [eax+ebx]
|
||||||
|
.L14:
|
||||||
|
mov edx, DWORD PTR [_boot_mbi]
|
||||||
|
mov eax, DWORD PTR [edx+48]
|
||||||
|
add eax, DWORD PTR [edx+44]
|
||||||
|
cmp ebx, eax
|
||||||
|
jb .L15
|
||||||
|
cmp esi, 268435456
|
||||||
|
jbe .L13
|
||||||
|
mov esi, 268435456
|
||||||
|
.L13:
|
||||||
|
mov DWORD PTR [_mem_amount], esi
|
||||||
|
pop eax
|
||||||
|
pop ebx
|
||||||
|
pop esi
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
.LC0:
|
||||||
|
db "boot_device = 0x%x",10,0
|
||||||
|
.LC1:
|
||||||
|
db "cmdline = %s",10,0
|
||||||
|
.LC2:
|
||||||
|
db "mods_count = %d, mods_addr = 0x%x",10,0
|
||||||
|
.LC3:
|
||||||
|
db " mod_start = 0x%x, mod_end = 0x%x, string = %s",10,0
|
||||||
|
.LC4:
|
||||||
|
db " rd_base = %x",10,0
|
||||||
|
.LC5:
|
||||||
|
db "mmap_addr = 0x%x, mmap_length = 0x%x",10,0
|
||||||
|
.LC6:
|
||||||
|
db " size = 0x%x, base_addr = 0x%x%x, length = 0x%x%x, type = 0x%x",10,0
|
||||||
|
|
||||||
|
|
||||||
|
restore DWORD
|
||||||
|
restore WORD
|
||||||
|
restore BYTE
|
||||||
|
|
||||||
|
restore PTR
|
||||||
|
|
@ -556,57 +556,27 @@ _zone_create:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
_init_mm:
|
_init_mm:
|
||||||
push esi
|
|
||||||
xor eax, eax
|
|
||||||
push ebx
|
push ebx
|
||||||
xor esi, esi
|
sub esp, 24
|
||||||
sub esp, 20
|
mov eax, DWORD PTR [_mem_amount]
|
||||||
mov ebx, DWORD PTR [_mem_counter]
|
mov DWORD PTR [esp], .LC3
|
||||||
test ebx, ebx
|
mov ebx, eax
|
||||||
jle .L93
|
shr ebx, 12
|
||||||
xor ecx, ecx
|
mov DWORD PTR [esp+8], ebx
|
||||||
xor edx, edx
|
|
||||||
jmp .L94
|
|
||||||
.L95:
|
|
||||||
add ecx, 1
|
|
||||||
add edx, 20
|
|
||||||
cmp ecx, ebx
|
|
||||||
je .L103
|
|
||||||
.L94:
|
|
||||||
cmp DWORD PTR [_mem_table+edx+16], 1
|
|
||||||
jne .L95
|
|
||||||
mov eax, DWORD PTR [_mem_table+edx]
|
|
||||||
add eax, DWORD PTR [_mem_table+edx+8]
|
|
||||||
and eax, -4096
|
|
||||||
cmp esi, eax
|
|
||||||
jae .L95
|
|
||||||
add ecx, 1
|
|
||||||
add edx, 20
|
|
||||||
cmp ecx, ebx
|
|
||||||
mov esi, eax
|
|
||||||
jne .L94
|
|
||||||
.L103:
|
|
||||||
cmp esi, 268435456
|
|
||||||
mov eax, esi
|
|
||||||
ja .L104
|
|
||||||
mov esi, eax
|
|
||||||
shr esi, 12
|
|
||||||
.L93:
|
|
||||||
mov DWORD PTR [_mem_amount], eax
|
|
||||||
mov [pg_data.mem_amount], eax
|
|
||||||
mov [pg_data.pages_count], esi
|
|
||||||
|
|
||||||
mov DWORD PTR [esp+8], esi
|
|
||||||
mov DWORD PTR [esp+4], eax
|
mov DWORD PTR [esp+4], eax
|
||||||
mov DWORD PTR [esp], .LC1
|
call _printf
|
||||||
call _printf
|
mov eax, DWORD PTR [_pg_balloc]
|
||||||
|
mov DWORD PTR [esp], .LC4
|
||||||
mov DWORD PTR [esp+8], esi
|
mov DWORD PTR [esp+8], eax
|
||||||
|
lea eax, [ebx+ebx*4]
|
||||||
|
sal eax, 2
|
||||||
|
mov DWORD PTR [esp+4], eax
|
||||||
|
call _printf
|
||||||
|
mov DWORD PTR [esp+8], ebx
|
||||||
mov DWORD PTR [esp+4], 0
|
mov DWORD PTR [esp+4], 0
|
||||||
mov DWORD PTR [esp], _z_core
|
mov DWORD PTR [esp], _z_core
|
||||||
|
|
||||||
call _zone_create
|
call _zone_create
|
||||||
mov DWORD PTR [esp+8], esi
|
mov DWORD PTR [esp+8], ebx
|
||||||
mov DWORD PTR [esp+4], 0
|
mov DWORD PTR [esp+4], 0
|
||||||
mov DWORD PTR [esp], _z_core
|
mov DWORD PTR [esp], _z_core
|
||||||
call _zone_release
|
call _zone_release
|
||||||
@ -616,17 +586,14 @@ _init_mm:
|
|||||||
shr eax, 12
|
shr eax, 12
|
||||||
mov DWORD PTR [esp+8], eax
|
mov DWORD PTR [esp+8], eax
|
||||||
call _zone_reserve
|
call _zone_reserve
|
||||||
add esp, 20
|
add esp, 24
|
||||||
pop ebx
|
pop ebx
|
||||||
pop esi
|
ret
|
||||||
ret
|
.LC3:
|
||||||
.L104:
|
db "last page = %x total pages = %x",10,0
|
||||||
mov eax, 268435456
|
.LC4:
|
||||||
mov esi, eax
|
db "conf_size = %x free mem start =%x",10,0
|
||||||
shr esi, 12
|
|
||||||
jmp .L93
|
|
||||||
.LC1:
|
|
||||||
db 'memory size = %x total pages = %x',10,0
|
|
||||||
|
|
||||||
_frame_free:
|
_frame_free:
|
||||||
push ebx
|
push ebx
|
||||||
|
@ -67,9 +67,9 @@ keymap_alt:
|
|||||||
boot_pal_vga db 'Setting VGA 640x480 palette',0
|
boot_pal_vga db 'Setting VGA 640x480 palette',0
|
||||||
boot_failed db 'Failed to start first app',0
|
boot_failed db 'Failed to start first app',0
|
||||||
boot_mtrr db 'Setting MTRR',0
|
boot_mtrr db 'Setting MTRR',0
|
||||||
if preboot_blogesc
|
;if preboot_blogesc
|
||||||
boot_tasking db 'All set - press ESC to start',0
|
; boot_tasking db 'All set - press ESC to start',0
|
||||||
end if
|
;end if
|
||||||
|
|
||||||
new_process_loading db 'K : New Process - loading',13,10,0
|
new_process_loading db 'K : New Process - loading',13,10,0
|
||||||
new_process_running db 'K : New Process - done',13,10,0
|
new_process_running db 'K : New Process - done',13,10,0
|
||||||
@ -134,6 +134,13 @@ mode_640_480_16:
|
|||||||
mode_320_240_8:
|
mode_320_240_8:
|
||||||
dw 320,240,8,60
|
dw 320,240,8,60
|
||||||
|
|
||||||
|
|
||||||
|
bx_from_load: dw 'r1' ; ñòðóêòóðà äëÿ õðàíåíèÿ ïàðàìåòðîâ- îòêóäà ãàøðóçèëèñü, áåðåòñÿ íèæå èç bx ; {SPraid}[13.03.2007]
|
||||||
|
; a,b,c,d - âèí÷åñòåðû, r - ðàì äèñê
|
||||||
|
; # äèñêà... ñèìâîë, à íå áàéò. '1', à íå 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; mike.dld {
|
; mike.dld {
|
||||||
db 0
|
db 0
|
||||||
dd servetable-0x10000
|
dd servetable-0x10000
|
||||||
@ -256,6 +263,17 @@ endofcode:
|
|||||||
gdte:
|
gdte:
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
|
|
||||||
|
__edata: ;equ $-OS_BASE
|
||||||
|
|
||||||
|
align 4096
|
||||||
|
|
||||||
|
_sys_pdbr rb 4096
|
||||||
|
|
||||||
|
rb 8192-512
|
||||||
|
|
||||||
|
__os_stack rb 512
|
||||||
|
|
||||||
cur_saved_data rb 4096
|
cur_saved_data rb 4096
|
||||||
fpu_data: rb 512
|
fpu_data: rb 512
|
||||||
|
|
||||||
@ -293,6 +311,9 @@ large_block_list rd 31
|
|||||||
mem_block_mask rd 2
|
mem_block_mask rd 2
|
||||||
large_block_mask rd 1
|
large_block_mask rd 1
|
||||||
|
|
||||||
|
|
||||||
|
_boot_mbi rd 1
|
||||||
|
|
||||||
_mem_amount rd 1
|
_mem_amount rd 1
|
||||||
_rd_base rd 1
|
_rd_base rd 1
|
||||||
_rd_fat rd 1 ;RAMDISK + 512
|
_rd_fat rd 1 ;RAMDISK + 512
|
||||||
@ -322,7 +343,6 @@ event_start rd 1
|
|||||||
event_end rd 1
|
event_end rd 1
|
||||||
event_uid rd 1
|
event_uid rd 1
|
||||||
sys_page_map rd 1
|
sys_page_map rd 1
|
||||||
os_stack_seg rd 1
|
|
||||||
|
|
||||||
srv.fd rd 1
|
srv.fd rd 1
|
||||||
srv.bk rd 1
|
srv.bk rd 1
|
||||||
|
@ -40,7 +40,7 @@ proc Parser_params
|
|||||||
locals
|
locals
|
||||||
buff db 4 dup(?) ; for test cd
|
buff db 4 dup(?) ; for test cd
|
||||||
endl
|
endl
|
||||||
mov eax,[OS_BASE+0x10000+bx_from_load]
|
mov eax,[bx_from_load]
|
||||||
mov ecx,sysdir_path
|
mov ecx,sysdir_path
|
||||||
mov [ecx-64],dword 'sys'
|
mov [ecx-64],dword 'sys'
|
||||||
cmp al,'r' ; if ram disk
|
cmp al,'r' ; if ram disk
|
||||||
@ -69,7 +69,7 @@ endl
|
|||||||
cmp [edx],dword 'MENU'
|
cmp [edx],dword 'MENU'
|
||||||
jne .next_cd
|
jne .next_cd
|
||||||
jmp .ok
|
jmp .ok
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
sub al,49
|
sub al,49
|
||||||
mov [ecx],dword 'HD?/' ; if hard disk
|
mov [ecx],dword 'HD?/' ; if hard disk
|
||||||
|
@ -73,102 +73,4 @@ init_BIOS32:
|
|||||||
.end:
|
.end:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
align 4
|
|
||||||
proc test_cpu
|
|
||||||
locals
|
|
||||||
cpu_type dd ?
|
|
||||||
cpu_id dd ?
|
|
||||||
cpu_Intel dd ?
|
|
||||||
cpu_AMD dd ?
|
|
||||||
endl
|
|
||||||
|
|
||||||
mov [cpu_type], 0
|
|
||||||
xor eax, eax
|
|
||||||
mov [cpu_caps-OS_BASE], eax
|
|
||||||
mov [cpu_caps+4-OS_BASE], eax
|
|
||||||
|
|
||||||
pushfd
|
|
||||||
pop eax
|
|
||||||
mov ecx, eax
|
|
||||||
xor eax, 0x40000
|
|
||||||
push eax
|
|
||||||
popfd
|
|
||||||
pushfd
|
|
||||||
pop eax
|
|
||||||
xor eax, ecx
|
|
||||||
mov [cpu_type], CPU_386
|
|
||||||
jz .end_cpuid
|
|
||||||
push ecx
|
|
||||||
popfd
|
|
||||||
|
|
||||||
mov [cpu_type], CPU_486
|
|
||||||
mov eax, ecx
|
|
||||||
xor eax, 0x200000
|
|
||||||
push eax
|
|
||||||
popfd
|
|
||||||
pushfd
|
|
||||||
pop eax
|
|
||||||
xor eax, ecx
|
|
||||||
je .end_cpuid
|
|
||||||
mov [cpu_id], 1
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
cpuid
|
|
||||||
|
|
||||||
mov [cpu_vendor-OS_BASE], ebx
|
|
||||||
mov [cpu_vendor+4-OS_BASE], edx
|
|
||||||
mov [cpu_vendor+8-OS_BASE], ecx
|
|
||||||
cmp ebx, dword [intel_str-OS_BASE]
|
|
||||||
jne .check_AMD
|
|
||||||
cmp edx, dword [intel_str+4-OS_BASE]
|
|
||||||
jne .check_AMD
|
|
||||||
cmp ecx, dword [intel_str+8-OS_BASE]
|
|
||||||
jne .check_AMD
|
|
||||||
mov [cpu_Intel], 1
|
|
||||||
cmp eax, 1
|
|
||||||
jl .end_cpuid
|
|
||||||
mov eax, 1
|
|
||||||
cpuid
|
|
||||||
mov [cpu_sign-OS_BASE], eax
|
|
||||||
mov [cpu_info-OS_BASE], ebx
|
|
||||||
mov [cpu_caps-OS_BASE], edx
|
|
||||||
mov [cpu_caps+4-OS_BASE],ecx
|
|
||||||
|
|
||||||
shr eax, 8
|
|
||||||
and eax, 0x0f
|
|
||||||
ret
|
|
||||||
.end_cpuid:
|
|
||||||
mov eax, [cpu_type]
|
|
||||||
ret
|
|
||||||
|
|
||||||
.check_AMD:
|
|
||||||
cmp ebx, dword [AMD_str-OS_BASE]
|
|
||||||
jne .unknown
|
|
||||||
cmp edx, dword [AMD_str+4-OS_BASE]
|
|
||||||
jne .unknown
|
|
||||||
cmp ecx, dword [AMD_str+8-OS_BASE]
|
|
||||||
jne .unknown
|
|
||||||
mov [cpu_AMD], 1
|
|
||||||
cmp eax, 1
|
|
||||||
jl .unknown
|
|
||||||
mov eax, 1
|
|
||||||
cpuid
|
|
||||||
mov [cpu_sign-OS_BASE], eax
|
|
||||||
mov [cpu_info-OS_BASE], ebx
|
|
||||||
mov [cpu_caps-OS_BASE], edx
|
|
||||||
mov [cpu_caps+4-OS_BASE],ecx
|
|
||||||
shr eax, 8
|
|
||||||
and eax, 0x0f
|
|
||||||
ret
|
|
||||||
.unknown:
|
|
||||||
mov eax, 1
|
|
||||||
cpuid
|
|
||||||
mov [cpu_sign-OS_BASE], eax
|
|
||||||
mov [cpu_info-OS_BASE], ebx
|
|
||||||
mov [cpu_caps-OS_BASE], edx
|
|
||||||
mov [cpu_caps+4-OS_BASE],ecx
|
|
||||||
shr eax, 8
|
|
||||||
and eax, 0x0f
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
|
@ -105,145 +105,154 @@ pci_data_sel equ (pci_data_32-gdts)
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; 16 BIT ENTRY FROM BOOTSECTOR ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
use16
|
|
||||||
org 0x0
|
|
||||||
jmp start_of_code
|
|
||||||
|
|
||||||
version db 'Kolibri OS version 0.7.1.0 ',13,10,13,10,0
|
|
||||||
|
|
||||||
include "boot/bootstr.inc" ; language-independent boot messages
|
|
||||||
include "boot/preboot.inc"
|
|
||||||
|
|
||||||
if lang eq en
|
|
||||||
include "boot/booteng.inc" ; english system boot messages
|
|
||||||
else if lang eq ru
|
|
||||||
include "boot/bootru.inc" ; russian system boot messages
|
|
||||||
include "boot/ru.inc" ; Russian font
|
|
||||||
else if lang eq et
|
|
||||||
include "boot/bootet.inc" ; estonian system boot messages
|
|
||||||
include "boot/et.inc" ; Estonian font
|
|
||||||
else
|
|
||||||
include "boot/bootge.inc" ; german system boot messages
|
|
||||||
end if
|
|
||||||
|
|
||||||
include "boot/bootcode.inc" ; 16 bit system boot code
|
|
||||||
include "bus/pci/pci16.inc"
|
|
||||||
include "detect/biosdisk.inc"
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; SWITCH TO 32 BIT PROTECTED MODE ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
; CR0 Flags - Protected mode and Paging
|
|
||||||
|
|
||||||
mov ecx, CR0_PE
|
|
||||||
|
|
||||||
; Enabling 32 bit protected mode
|
|
||||||
|
|
||||||
sidt [cs:old_ints_h]
|
|
||||||
|
|
||||||
cli ; disable all irqs
|
|
||||||
cld
|
|
||||||
mov al,255 ; mask all irqs
|
|
||||||
out 0xa1,al
|
|
||||||
out 0x21,al
|
|
||||||
l.5: in al, 0x64 ; Enable A20
|
|
||||||
test al, 2
|
|
||||||
jnz l.5
|
|
||||||
mov al, 0xD1
|
|
||||||
out 0x64, al
|
|
||||||
l.6: in al, 0x64
|
|
||||||
test al, 2
|
|
||||||
jnz l.6
|
|
||||||
mov al, 0xDF
|
|
||||||
out 0x60, al
|
|
||||||
l.7: in al, 0x64
|
|
||||||
test al, 2
|
|
||||||
jnz l.7
|
|
||||||
mov al, 0xFF
|
|
||||||
out 0x64, al
|
|
||||||
|
|
||||||
lgdt [cs:tmp_gdt] ; Load GDT
|
|
||||||
mov eax, cr0 ; protected mode
|
|
||||||
or eax, ecx
|
|
||||||
and eax, 10011111b *65536*256 + 0xffffff ; caching enabled
|
|
||||||
mov cr0, eax
|
|
||||||
jmp pword os_code:B32 ; jmp to enable 32 bit mode
|
|
||||||
|
|
||||||
align 8
|
|
||||||
tmp_gdt:
|
|
||||||
|
|
||||||
dw 23
|
|
||||||
dd tmp_gdt+0x10000
|
|
||||||
dw 0
|
|
||||||
|
|
||||||
dw 0xffff
|
|
||||||
dw 0x0000
|
|
||||||
db 0x00
|
|
||||||
dw 11011111b *256 +10011010b
|
|
||||||
db 0x00
|
|
||||||
|
|
||||||
dw 0xffff
|
|
||||||
dw 0x0000
|
|
||||||
db 0x00
|
|
||||||
dw 11011111b *256 +10010010b
|
|
||||||
db 0x00
|
|
||||||
|
|
||||||
include "data16.inc"
|
|
||||||
|
|
||||||
use32
|
use32
|
||||||
org $+0x10000
|
org 0x100000
|
||||||
|
|
||||||
|
mboot:
|
||||||
|
dd 0x1BADB002
|
||||||
|
dd 0x00010003
|
||||||
|
dd -(0x1BADB002 + 0x00010003)
|
||||||
|
dd mboot
|
||||||
|
dd 0x100000
|
||||||
|
dd __edata - OS_BASE
|
||||||
|
dd LAST_PAGE
|
||||||
|
dd __start
|
||||||
|
|
||||||
|
|
||||||
|
align 16
|
||||||
|
__start:
|
||||||
|
cld
|
||||||
|
|
||||||
|
mov esp, __os_stack-OS_BASE
|
||||||
|
push 0
|
||||||
|
popf
|
||||||
|
|
||||||
|
cmp eax, 0x2BADB002
|
||||||
|
mov ecx, sz_invboot
|
||||||
|
jne .fault
|
||||||
|
|
||||||
|
bt dword [ebx], 3
|
||||||
|
mov ecx, sz_nomods
|
||||||
|
jnc .fault
|
||||||
|
|
||||||
|
bt dword [ebx], 6
|
||||||
|
mov ecx, sz_nommap
|
||||||
|
jnc .fault
|
||||||
|
|
||||||
|
mov [_boot_mbi-OS_BASE], ebx
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
cpuid
|
||||||
|
cmp eax, 0
|
||||||
|
mov ecx, sz_nopse
|
||||||
|
jbe .fault
|
||||||
|
|
||||||
|
mov eax, 1
|
||||||
|
cpuid
|
||||||
|
bt edx, 3
|
||||||
|
mov ecx, sz_nopse
|
||||||
|
jnc .fault
|
||||||
|
|
||||||
|
; ENABLE PAGING
|
||||||
|
|
||||||
|
mov ecx, 32
|
||||||
|
mov edi, _sys_pdbr+(OS_BASE shr 20)-OS_BASE
|
||||||
|
mov eax, PG_LARGE+PG_SW
|
||||||
|
@@:
|
||||||
|
stosd
|
||||||
|
add eax, 4*1024*1024
|
||||||
|
loop @B
|
||||||
|
|
||||||
|
mov dword [_sys_pdbr-OS_BASE], PG_LARGE+PG_SW
|
||||||
|
mov dword [_sys_pdbr-OS_BASE+4], PG_LARGE+PG_SW+4*1024*1024
|
||||||
|
mov dword [_sys_pdbr-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
|
||||||
|
|
||||||
|
mov ebx, cr4
|
||||||
|
or ebx, CR4_PSE
|
||||||
|
and ebx, not CR4_PAE
|
||||||
|
mov cr4, ebx
|
||||||
|
|
||||||
|
mov eax, _sys_pdbr-OS_BASE
|
||||||
|
mov ebx, cr0
|
||||||
|
or ebx,CR0_PG+CR0_WP
|
||||||
|
|
||||||
|
mov cr3, eax
|
||||||
|
mov cr0, ebx
|
||||||
|
|
||||||
|
mov ebx, [_boot_mbi]
|
||||||
|
|
||||||
|
mov edx, [ebx+20]
|
||||||
|
mov esi, [ebx+24]
|
||||||
|
mov ecx, LAST_PAGE
|
||||||
|
test edx, edx
|
||||||
|
jz .no_mods
|
||||||
|
.scan_mod:
|
||||||
|
mov ecx, [esi+4]
|
||||||
|
add esi, 16
|
||||||
|
dec edx
|
||||||
|
jnz .scan_mod
|
||||||
|
|
||||||
|
.no_mods:
|
||||||
|
add ecx, 4095
|
||||||
|
and ecx, not 4095
|
||||||
|
|
||||||
|
lgdt [gdts]
|
||||||
|
jmp pword os_code:high_code
|
||||||
|
|
||||||
|
|
||||||
|
.fault:
|
||||||
|
; push ecx
|
||||||
|
; call _lcls
|
||||||
|
; call __bprintf
|
||||||
|
_hlt:
|
||||||
|
hlt
|
||||||
|
jmp _hlt
|
||||||
|
|
||||||
|
sz_invboot db 'Invalid multiboot loader magic value',0x0A
|
||||||
|
db 'Halted',0
|
||||||
|
|
||||||
|
sz_nomods db 'No modules loaded',0x0A
|
||||||
|
db 'Halted',0
|
||||||
|
|
||||||
|
sz_nommap db 'No memory table', 0x0A
|
||||||
|
db 'Halted',0
|
||||||
|
|
||||||
|
sz_nopse db 'Page size extensions not supported',0x0A
|
||||||
|
db 'Halted',0
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
B32:
|
|
||||||
mov ax,os_stack ; Selector for os
|
|
||||||
mov ds,ax
|
|
||||||
mov es,ax
|
|
||||||
mov fs,ax
|
|
||||||
mov gs,ax
|
|
||||||
mov ss,ax
|
|
||||||
mov esp,0x3ec00 ; Set stack
|
|
||||||
|
|
||||||
; CLEAR 0x280000 - HEAP_BASE
|
; CLEAR 0x280000 - HEAP_BASE
|
||||||
|
|
||||||
xor eax,eax
|
; xor eax,eax
|
||||||
mov edi,0x280000
|
; mov edi,0x280000
|
||||||
mov ecx,(0x800000-0x280000) / 4
|
; mov ecx,(0x800000-0x280000) / 4
|
||||||
cld
|
; cld
|
||||||
rep stosd
|
; rep stosd
|
||||||
|
|
||||||
mov edi,0x40000
|
; mov edi,0x40000
|
||||||
mov ecx,(0x90000-0x40000)/4
|
; mov ecx,(0x90000-0x40000)/4
|
||||||
rep stosd
|
; rep stosd
|
||||||
|
|
||||||
; CLEAR KERNEL UNDEFINED GLOBALS
|
; CLEAR KERNEL UNDEFINED GLOBALS
|
||||||
mov edi, endofcode-OS_BASE
|
; mov edi, endofcode-OS_BASE
|
||||||
mov ecx, (uglobals_size/4)+4
|
; mov ecx, (uglobals_size/4)+4
|
||||||
rep stosd
|
; rep stosd
|
||||||
|
|
||||||
; SAVE & CLEAR 0-0xffff
|
; SAVE & CLEAR 0-0xffff
|
||||||
|
|
||||||
xor esi, esi
|
; xor esi, esi
|
||||||
mov edi,0x2F0000
|
; mov edi,0x2F0000
|
||||||
mov ecx,0x10000 / 4
|
; mov ecx,0x10000 / 4
|
||||||
rep movsd
|
; rep movsd
|
||||||
xor edi, edi
|
; xor edi, edi
|
||||||
mov ecx,0x10000 / 4
|
; mov ecx,0x10000 / 4
|
||||||
rep stosd
|
; rep stosd
|
||||||
|
|
||||||
call test_cpu
|
; call test_cpu
|
||||||
bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc
|
bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc
|
||||||
|
|
||||||
call init_BIOS32
|
; call init_BIOS32
|
||||||
|
|
||||||
mov dword [sys_pgdir-OS_BASE], PG_LARGE+PG_SW
|
mov dword [sys_pgdir-OS_BASE], PG_LARGE+PG_SW
|
||||||
mov dword [sys_pgdir-OS_BASE+4], PG_LARGE+PG_SW+4*1024*1024
|
mov dword [sys_pgdir-OS_BASE+4], PG_LARGE+PG_SW+4*1024*1024
|
||||||
@ -261,7 +270,6 @@ B32:
|
|||||||
and ebx, not CR4_PAE
|
and ebx, not CR4_PAE
|
||||||
mov cr4, ebx
|
mov cr4, ebx
|
||||||
|
|
||||||
; ENABLE PAGING
|
|
||||||
|
|
||||||
mov eax, sys_pgdir-OS_BASE
|
mov eax, sys_pgdir-OS_BASE
|
||||||
mov ebx, cr0
|
mov ebx, cr0
|
||||||
@ -277,15 +285,14 @@ align 4
|
|||||||
bios32_entry dd ?
|
bios32_entry dd ?
|
||||||
tmp_page_tabs dd ?
|
tmp_page_tabs dd ?
|
||||||
|
|
||||||
use16
|
;use16
|
||||||
org $-0x10000
|
;org $-0x10000
|
||||||
include "boot/shutdown.inc" ; shutdown or restart
|
;include "boot/shutdown.inc" ; shutdown or restart
|
||||||
org $+0x10000
|
;org $+0x10000
|
||||||
use32
|
;use32
|
||||||
|
|
||||||
__DEBUG__ fix 1
|
__DEBUG__ fix 1
|
||||||
__DEBUG_LEVEL__ fix 1
|
__DEBUG_LEVEL__ fix 1
|
||||||
include 'init.inc'
|
|
||||||
|
|
||||||
org OS_BASE+$
|
org OS_BASE+$
|
||||||
|
|
||||||
@ -297,62 +304,150 @@ MEM_UC equ 0 ;uncached memory
|
|||||||
include 'printf.inc'
|
include 'printf.inc'
|
||||||
include 'core/mm.asm'
|
include 'core/mm.asm'
|
||||||
|
|
||||||
|
include 'core/init.asm'
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc test_cpu
|
||||||
|
locals
|
||||||
|
cpu_type dd ?
|
||||||
|
cpu_id dd ?
|
||||||
|
cpu_Intel dd ?
|
||||||
|
cpu_AMD dd ?
|
||||||
|
endl
|
||||||
|
|
||||||
|
mov [cpu_type], 0
|
||||||
|
xor eax, eax
|
||||||
|
mov [cpu_caps], eax
|
||||||
|
mov [cpu_caps+4], eax
|
||||||
|
|
||||||
|
pushfd
|
||||||
|
pop eax
|
||||||
|
mov ecx, eax
|
||||||
|
xor eax, 0x40000
|
||||||
|
push eax
|
||||||
|
popfd
|
||||||
|
pushfd
|
||||||
|
pop eax
|
||||||
|
xor eax, ecx
|
||||||
|
mov [cpu_type], CPU_386
|
||||||
|
jz .end_cpuid
|
||||||
|
push ecx
|
||||||
|
popfd
|
||||||
|
|
||||||
|
mov [cpu_type], CPU_486
|
||||||
|
mov eax, ecx
|
||||||
|
xor eax, 0x200000
|
||||||
|
push eax
|
||||||
|
popfd
|
||||||
|
pushfd
|
||||||
|
pop eax
|
||||||
|
xor eax, ecx
|
||||||
|
je .end_cpuid
|
||||||
|
mov [cpu_id], 1
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
cpuid
|
||||||
|
|
||||||
|
mov [cpu_vendor], ebx
|
||||||
|
mov [cpu_vendor+4], edx
|
||||||
|
mov [cpu_vendor+8], ecx
|
||||||
|
cmp ebx, dword [intel_str]
|
||||||
|
jne .check_AMD
|
||||||
|
cmp edx, dword [intel_str+4]
|
||||||
|
jne .check_AMD
|
||||||
|
cmp ecx, dword [intel_str+8]
|
||||||
|
jne .check_AMD
|
||||||
|
mov [cpu_Intel], 1
|
||||||
|
cmp eax, 1
|
||||||
|
jl .end_cpuid
|
||||||
|
mov eax, 1
|
||||||
|
cpuid
|
||||||
|
mov [cpu_sign], eax
|
||||||
|
mov [cpu_info], ebx
|
||||||
|
mov [cpu_caps], edx
|
||||||
|
mov [cpu_caps+4],ecx
|
||||||
|
|
||||||
|
shr eax, 8
|
||||||
|
and eax, 0x0f
|
||||||
|
ret
|
||||||
|
.end_cpuid:
|
||||||
|
mov eax, [cpu_type]
|
||||||
|
ret
|
||||||
|
|
||||||
|
.check_AMD:
|
||||||
|
cmp ebx, dword [AMD_str]
|
||||||
|
jne .unknown
|
||||||
|
cmp edx, dword [AMD_str+4]
|
||||||
|
jne .unknown
|
||||||
|
cmp ecx, dword [AMD_str+8]
|
||||||
|
jne .unknown
|
||||||
|
mov [cpu_AMD], 1
|
||||||
|
cmp eax, 1
|
||||||
|
jl .unknown
|
||||||
|
mov eax, 1
|
||||||
|
cpuid
|
||||||
|
mov [cpu_sign], eax
|
||||||
|
mov [cpu_info], ebx
|
||||||
|
mov [cpu_caps], edx
|
||||||
|
mov [cpu_caps+4],ecx
|
||||||
|
shr eax, 8
|
||||||
|
and eax, 0x0f
|
||||||
|
ret
|
||||||
|
.unknown:
|
||||||
|
mov eax, 1
|
||||||
|
cpuid
|
||||||
|
mov [cpu_sign], eax
|
||||||
|
mov [cpu_info], ebx
|
||||||
|
mov [cpu_caps], edx
|
||||||
|
mov [cpu_caps+4],ecx
|
||||||
|
shr eax, 8
|
||||||
|
and eax, 0x0f
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
high_code:
|
high_code:
|
||||||
mov ax,os_stack
|
mov ax,os_stack
|
||||||
mov bx,app_data
|
mov dx,app_data
|
||||||
mov ss,ax
|
mov ss,ax
|
||||||
add esp, OS_BASE
|
mov esp, __os_stack
|
||||||
|
|
||||||
mov ds,bx
|
mov ds, dx
|
||||||
mov es,bx
|
mov es, dx
|
||||||
mov fs,bx
|
mov fs, dx
|
||||||
mov gs,bx
|
mov gs, dx
|
||||||
|
|
||||||
mov dword [sys_pgdir-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
|
push ecx
|
||||||
|
push ebx
|
||||||
|
|
||||||
bt [cpu_caps], CAPS_PGE
|
; mov dword [sys_pgdir-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
|
||||||
jnc @F
|
|
||||||
|
|
||||||
or dword [sys_pgdir-OS_BASE+(OS_BASE shr 20)], PG_GLOBAL
|
; bt [cpu_caps], CAPS_PGE
|
||||||
|
; jnc @F
|
||||||
|
|
||||||
mov ebx, cr4
|
; or dword [sys_pgdir-OS_BASE+(OS_BASE shr 20)], PG_GLOBAL
|
||||||
or ebx, CR4_PGE
|
|
||||||
mov cr4, ebx
|
; mov ebx, cr4
|
||||||
|
; or ebx, CR4_PGE
|
||||||
|
; mov cr4, ebx
|
||||||
@@:
|
@@:
|
||||||
xor eax, eax
|
; xor eax, eax
|
||||||
mov dword [sys_pgdir], eax
|
; mov dword [sys_pgdir], eax
|
||||||
mov dword [sys_pgdir+4], eax
|
; mov dword [sys_pgdir+4], eax
|
||||||
|
|
||||||
mov eax, cr3
|
|
||||||
mov cr3, eax ; flush TLB
|
|
||||||
|
|
||||||
|
; mov eax, cr3
|
||||||
|
; mov cr3, eax ; flush TLB
|
||||||
|
|
||||||
mov edx, 0x3fB
|
mov edx, 0x3fB
|
||||||
mov eax, 3
|
mov eax, 3
|
||||||
out dx, al
|
out dx, al
|
||||||
|
|
||||||
; MEMORY MODEL
|
call test_cpu
|
||||||
|
call _init
|
||||||
mov ecx, 1280*1024
|
|
||||||
fastcall _balloc
|
|
||||||
mov [_display_data], eax
|
|
||||||
|
|
||||||
mov ecx, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \
|
|
||||||
(unpack.lc+unpack.lp)))*4
|
|
||||||
fastcall _balloc
|
|
||||||
mov [unpack.p], eax
|
|
||||||
|
|
||||||
mov ecx, (RING0_STACK_SIZE+512)
|
|
||||||
fastcall _balloc
|
|
||||||
mov [os_stack_seg], eax
|
|
||||||
|
|
||||||
lea esp, [eax+RING0_STACK_SIZE]
|
|
||||||
|
|
||||||
mov [tss._ss0], os_stack
|
mov [tss._ss0], os_stack
|
||||||
mov [tss._esp0], esp
|
mov [tss._esp0], __os_stack
|
||||||
mov [tss._esp], esp
|
mov [tss._esp], __os_stack
|
||||||
mov [tss._cs],os_code
|
mov [tss._cs],os_code
|
||||||
mov [tss._ss],os_stack
|
mov [tss._ss],os_stack
|
||||||
mov [tss._ds],app_data
|
mov [tss._ds],app_data
|
||||||
@ -370,11 +465,27 @@ high_code:
|
|||||||
mov ax,tss0
|
mov ax,tss0
|
||||||
ltr ax
|
ltr ax
|
||||||
|
|
||||||
|
xchg bx, bx
|
||||||
|
|
||||||
|
mov ecx, 1280*1024
|
||||||
|
fastcall _balloc
|
||||||
|
mov [_display_data], eax
|
||||||
|
|
||||||
|
mov ecx, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \
|
||||||
|
(unpack.lc+unpack.lp)))*4
|
||||||
|
fastcall _balloc
|
||||||
|
mov [unpack.p], eax
|
||||||
|
|
||||||
|
; MEMORY MODEL
|
||||||
|
|
||||||
call init_kernel_heap ; FIXME initialize heap after pager
|
call init_kernel_heap ; FIXME initialize heap after pager
|
||||||
|
|
||||||
call _init_mm
|
call _init_mm
|
||||||
mov [pg_data.pg_mutex], 0
|
mov [pg_data.pg_mutex], 0
|
||||||
|
|
||||||
|
hlt
|
||||||
|
|
||||||
|
|
||||||
; SAVE REAL MODE VARIABLES
|
; SAVE REAL MODE VARIABLES
|
||||||
mov ax, [BOOT_VAR + 0x9031]
|
mov ax, [BOOT_VAR + 0x9031]
|
||||||
mov [IDEContrRegsBaseAddr], ax
|
mov [IDEContrRegsBaseAddr], ax
|
||||||
@ -629,23 +740,18 @@ include 'detect/disks.inc'
|
|||||||
; mov [dma_hdd],1
|
; mov [dma_hdd],1
|
||||||
; CALCULATE FAT CHAIN FOR RAMDISK
|
; CALCULATE FAT CHAIN FOR RAMDISK
|
||||||
|
|
||||||
mov [_rd_base], OS_BASE+0x100000
|
|
||||||
mov [_rd_fat], OS_BASE+0x100000 + 512
|
|
||||||
mov [_rd_fat_end], OS_BASE+0x100000 + 512 + 4278
|
|
||||||
mov [_rd_root], OS_BASE+0x100000 + 512*19
|
|
||||||
mov [_rd_root_end], OS_BASE+0x100000 + 512*33
|
|
||||||
|
|
||||||
call calculatefatchain
|
call calculatefatchain
|
||||||
|
|
||||||
|
|
||||||
mov ax,[OS_BASE+0x10000+bx_from_load]
|
; mov ax,[OS_BASE+0x10000+bx_from_load]
|
||||||
cmp ax,'r1' ; if using not ram disk, then load librares and parameters {SPraid.simba}
|
; cmp ax,'r1' ; if using not ram disk, then load librares and parameters {SPraid.simba}
|
||||||
je no_lib_load
|
; je no_lib_load
|
||||||
; LOADING LIBRARES
|
; LOADING LIBRARES
|
||||||
stdcall dll.Load,@IMPORT ; loading librares for kernel (.obj files)
|
; stdcall dll.Load,@IMPORT ; loading librares for kernel (.obj files)
|
||||||
call load_file_parse_table ; prepare file parse table
|
; call load_file_parse_table ; prepare file parse table
|
||||||
call set_kernel_conf ; configure devices and gui
|
; call set_kernel_conf ; configure devices and gui
|
||||||
no_lib_load:
|
;no_lib_load:
|
||||||
|
|
||||||
; LOAD FONTS I and II
|
; LOAD FONTS I and II
|
||||||
|
|
||||||
@ -718,7 +824,7 @@ no_lib_load:
|
|||||||
|
|
||||||
mov dword [SLOT_BASE+256+APPDATA.app_name], dword 'OS/I'
|
mov dword [SLOT_BASE+256+APPDATA.app_name], dword 'OS/I'
|
||||||
mov dword [SLOT_BASE+256+APPDATA.app_name+4], dword 'DLE '
|
mov dword [SLOT_BASE+256+APPDATA.app_name+4], dword 'DLE '
|
||||||
mov edi, [os_stack_seg]
|
mov edi, __os_stack-8192+512
|
||||||
mov dword [SLOT_BASE+256+APPDATA.pl0_stack], edi
|
mov dword [SLOT_BASE+256+APPDATA.pl0_stack], edi
|
||||||
add edi, 0x2000-512
|
add edi, 0x2000-512
|
||||||
mov dword [SLOT_BASE+256+APPDATA.fpu_state], edi
|
mov dword [SLOT_BASE+256+APPDATA.fpu_state], edi
|
||||||
@ -828,11 +934,11 @@ no_lib_load:
|
|||||||
stdcall map_page,tss._io_map_1,\
|
stdcall map_page,tss._io_map_1,\
|
||||||
(tss._io_map_1-OS_BASE), PG_MAP
|
(tss._io_map_1-OS_BASE), PG_MAP
|
||||||
|
|
||||||
mov ax,[OS_BASE+0x10000+bx_from_load]
|
; mov ax,[OS_BASE+0x10000+bx_from_load]
|
||||||
cmp ax,'r1' ; if not rused ram disk - load network configuration from files {SPraid.simba}
|
; cmp ax,'r1' ; if not rused ram disk - load network configuration from files {SPraid.simba}
|
||||||
je no_st_network
|
; je no_st_network
|
||||||
call set_network_conf
|
; call set_network_conf
|
||||||
no_st_network:
|
; no_st_network:
|
||||||
|
|
||||||
; LOAD FIRST APPLICATION
|
; LOAD FIRST APPLICATION
|
||||||
cli
|
cli
|
||||||
@ -891,13 +997,13 @@ first_app_found:
|
|||||||
|
|
||||||
; START MULTITASKING
|
; START MULTITASKING
|
||||||
|
|
||||||
if preboot_blogesc
|
;if preboot_blogesc
|
||||||
mov esi, boot_tasking
|
; mov esi, boot_tasking
|
||||||
call boot_log
|
; call boot_log
|
||||||
.bll1: in al, 0x60 ; wait for ESC key press
|
;.bll1: in al, 0x60 ; wait for ESC key press
|
||||||
cmp al, 129
|
; cmp al, 129
|
||||||
jne .bll1
|
; jne .bll1
|
||||||
end if
|
;end if
|
||||||
|
|
||||||
; mov [ENABLE_TASKSWITCH],byte 1 ; multitasking enabled
|
; mov [ENABLE_TASKSWITCH],byte 1 ; multitasking enabled
|
||||||
|
|
||||||
@ -5163,16 +5269,16 @@ yes_shutdown_param:
|
|||||||
mov edx, OS_BASE+0x70000
|
mov edx, OS_BASE+0x70000
|
||||||
call fileread
|
call fileread
|
||||||
|
|
||||||
mov esi, restart_kernel_4000+OS_BASE+0x10000 ; move kernel re-starter to 0x4000:0
|
; mov esi, restart_kernel_4000+OS_BASE+0x10000 ; move kernel re-starter to 0x4000:0
|
||||||
mov edi,OS_BASE+0x40000
|
; mov edi,OS_BASE+0x40000
|
||||||
mov ecx,1000
|
; mov ecx,1000
|
||||||
rep movsb
|
; rep movsb
|
||||||
|
|
||||||
mov esi,OS_BASE+0x2F0000 ; restore 0x0 - 0xffff
|
mov esi,OS_BASE+0x2F0000 ; restore 0x0 - 0xffff
|
||||||
mov edi, OS_BASE
|
mov edi, OS_BASE
|
||||||
mov ecx,0x10000/4
|
mov ecx,0x10000/4
|
||||||
cld
|
cld
|
||||||
rep movsd
|
rep movsd
|
||||||
|
|
||||||
call restorefatchain
|
call restorefatchain
|
||||||
|
|
||||||
@ -5181,8 +5287,8 @@ yes_shutdown_param:
|
|||||||
out 0xA1, al
|
out 0xA1, al
|
||||||
|
|
||||||
if 1
|
if 1
|
||||||
mov word [OS_BASE+0x467+0],pr_mode_exit
|
; mov word [OS_BASE+0x467+0],pr_mode_exit
|
||||||
mov word [OS_BASE+0x467+2],0x1000
|
; mov word [OS_BASE+0x467+2],0x1000
|
||||||
|
|
||||||
mov al,0x0F
|
mov al,0x0F
|
||||||
out 0x70,al
|
out 0x70,al
|
||||||
@ -5316,3 +5422,7 @@ __REV__ = __REV
|
|||||||
uglobals_size = $ - endofcode
|
uglobals_size = $ - endofcode
|
||||||
diff16 "end of kernel code",0,$
|
diff16 "end of kernel code",0,$
|
||||||
|
|
||||||
|
align 16
|
||||||
|
|
||||||
|
__end:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user