136 lines
3.5 KiB
PHP
136 lines
3.5 KiB
PHP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; ;;
|
|
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
|
;; Distributed under terms of the GNU General Public License ;;
|
|
;; ;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
$Revision$
|
|
|
|
|
|
read_ramdisk:
|
|
; READ RAMDISK IMAGE FROM HD (only for IDE0, IDE1, IDE2, IDE3)
|
|
|
|
cmp byte [BOOT.dev+0x10000], 1
|
|
jne no_sys_on_hd.1
|
|
|
|
xor ebp, ebp
|
|
.hd_loop:
|
|
lea eax, [ebp+'0']
|
|
mov [read_image_fsinfo.name_digit], al
|
|
movzx eax, byte [DRIVE_DATA+2+ebp]
|
|
test eax, eax
|
|
jz .next_hd
|
|
push eax
|
|
mov esi, 1
|
|
.partition_loop:
|
|
mov eax, esi
|
|
push -'0'
|
|
@@:
|
|
xor edx, edx
|
|
div [_10]
|
|
push edx
|
|
test eax, eax
|
|
jnz @b
|
|
mov edi, read_image_fsinfo.partition
|
|
@@:
|
|
pop eax
|
|
add al, '0'
|
|
stosb
|
|
jnz @b
|
|
mov byte [edi-1], '/'
|
|
push esi edi
|
|
mov esi, bootpath1
|
|
mov ecx, bootpath1.len
|
|
rep movsb
|
|
call read_image
|
|
test eax, eax
|
|
jz .yes
|
|
cmp eax, 6
|
|
jz .yes
|
|
pop edi
|
|
push edi
|
|
mov esi, bootpath2
|
|
mov ecx, bootpath2.len
|
|
rep movsb
|
|
call read_image
|
|
test eax, eax
|
|
jz .yes
|
|
cmp eax, 6
|
|
jz .yes
|
|
pop edi esi
|
|
inc esi
|
|
cmp esi, [esp]
|
|
jbe .partition_loop
|
|
pop eax
|
|
.next_hd:
|
|
inc ebp
|
|
cmp ebp, 4
|
|
jb .hd_loop
|
|
jmp no_sys_on_hd
|
|
.yes:
|
|
DEBUGF 1, "K : RD found: %s\n", read_image_fsinfo.name
|
|
pop edi esi eax
|
|
|
|
call register_ramdisk
|
|
jmp yes_sys_on_hd
|
|
;-----------------------------------------------------------------------------
|
|
; Register ramdisk file system
|
|
register_ramdisk:
|
|
mov esi, boot_initramdisk
|
|
call boot_log
|
|
call ramdisk_init
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
iglobal
|
|
align 4
|
|
read_image_fsinfo:
|
|
dd 0 ; function: read
|
|
dq 0 ; offset: zero
|
|
dd 1474560 ; size
|
|
dd RAMDISK ; buffer
|
|
.name db '/hd'
|
|
.name_digit db '0'
|
|
db '/'
|
|
.partition:
|
|
rb 64 ; should be enough for '255/KOLIBRI/KOLIBRI.IMG'
|
|
|
|
bootpath1 db 'KOLIBRI.IMG',0
|
|
.len = $ - bootpath1
|
|
bootpath2 db 'KOLIBRI/KOLIBRI.IMG',0
|
|
.len = $ - bootpath2
|
|
endg
|
|
|
|
read_image:
|
|
mov ebx, read_image_fsinfo
|
|
pushad
|
|
call file_system_lfn_protected
|
|
popad
|
|
ret
|
|
|
|
no_sys_on_hd:
|
|
DEBUGF 1, "K : RD not found\n"
|
|
.1:
|
|
; test_to_format_ram_disk (need if not using ram disk)
|
|
cmp byte [BOOT.dev+0x10000], 3
|
|
jne not_format_ram_disk
|
|
; format_ram_disk
|
|
mov edi, RAMDISK
|
|
mov ecx, 0x1080
|
|
xor eax, eax
|
|
@@:
|
|
stosd
|
|
loop @b
|
|
|
|
mov ecx, 0x58F7F
|
|
mov eax, 0xF6F6F6F6
|
|
@@:
|
|
stosd
|
|
loop @b
|
|
|
|
mov [RAMDISK+0x200], dword 0xFFFFF0 ; fat table
|
|
mov [RAMDISK+0x4200], dword 0xFFFFF0
|
|
|
|
not_format_ram_disk:
|
|
yes_sys_on_hd:
|