forked from KolibriOS/kolibrios
92 lines
6.1 KiB
Plaintext
92 lines
6.1 KiB
Plaintext
|
; Copyright (c) 2008-2009, diamond
|
|||
|
; All rights reserved.
|
|||
|
;
|
|||
|
; Redistribution and use in source and binary forms, with or without
|
|||
|
; modification, are permitted provided that the following conditions are met:
|
|||
|
; * Redistributions of source code must retain the above copyright
|
|||
|
; notice, this list of conditions and the following disclaimer.
|
|||
|
; * Redistributions in binary form must reproduce the above copyright
|
|||
|
; notice, this list of conditions and the following disclaimer in the
|
|||
|
; documentation and/or other materials provided with the distribution.
|
|||
|
; * Neither the name of the <organization> nor the
|
|||
|
; names of its contributors may be used to endorse or promote products
|
|||
|
; derived from this software without specific prior written permission.
|
|||
|
;
|
|||
|
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
|
|||
|
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|||
|
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|||
|
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
|||
|
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|||
|
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|||
|
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|||
|
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
|
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|||
|
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
Спецификация на первичный загрузчик KordOS.
|
|||
|
Загрузчик должен предоставлять следующие сервисы:
|
|||
|
1. При загрузке компьютера, получив управление от BIOS'а, загружать
|
|||
|
файл loader из папки kord по адресу 1000:0000.
|
|||
|
Размер файла loader не превосходит 30000h = 192 Kb.
|
|||
|
2. При этом устанавливать следующие регистры:
|
|||
|
ax идентифицирует устройство:
|
|||
|
al = тип:
|
|||
|
'f' - флопик
|
|||
|
'h' - HDD
|
|||
|
'c' - CD/DVD
|
|||
|
'u' - USB флешка
|
|||
|
'?' - неизвестное устройство
|
|||
|
ah = номер устройства (среди всех устройств фиксированного типа)
|
|||
|
bx = тип файловой системы:
|
|||
|
'12' = FAT12
|
|||
|
'16' = FAT16
|
|||
|
'32' = FAT32
|
|||
|
'nt' = NTFS
|
|||
|
'is' = ISO-9660
|
|||
|
ds:si = far-указатель на callback-сервис
|
|||
|
3. Предоставлять callback-сервис для вторичного загрузчика - far-процедуру:
|
|||
|
на входе: ax = запрашиваемая функция
|
|||
|
на выходе: CF=1, если функция не поддерживается; CF=0 иначе
|
|||
|
Загрузчик может разрушать все регистры, включая сегментные,
|
|||
|
за исключением ss и sp.
|
|||
|
4. Всегда должна поддерживаться callback-функция 1:
|
|||
|
назначение: прочитать файл, расположенный на загрузочном устройстве
|
|||
|
на входе: ax = 1, ds:di = указатель на информационную структуру:
|
|||
|
dw:dw far-указатель на буфер,
|
|||
|
первое слово - смещение, второе - сегмент
|
|||
|
dw максимальное число 4Kb-блоков для чтения (0x1000 байт)
|
|||
|
должно быть ненулевым и строго меньше 0x100
|
|||
|
ASCIIZ имя файла в формате "<папка1>/<папка2>/<файл>"
|
|||
|
Если имя файла содержит символы из старшей половины
|
|||
|
ASCIIZ-таблицы или не является 8.3-именем (в смысле, одна из компонент
|
|||
|
имени файла имеет имя длиннее 8 символов или расширение длиннее 3),
|
|||
|
загрузчик может не найти такой файл, даже если он есть
|
|||
|
(а может и найти).
|
|||
|
на выходе: bx = статус:
|
|||
|
0 = успешно
|
|||
|
1 = файл оказался слишком большим, буфер заполнен целиком
|
|||
|
и есть ещё данные файла
|
|||
|
2 = файл не найден
|
|||
|
3 = произошла ошибка чтения
|
|||
|
dx:ax = размер файла или FFFF:FFFF, если файл не найден
|
|||
|
5. Всегда должна поддерживаться callback-функция 2:
|
|||
|
назначение: продолжить чтение файла, частично загруженного функцией 1
|
|||
|
на входе: ax = 2, ds:di = указатель на информационную структуру:
|
|||
|
dw:dw far-указатель на буфер,
|
|||
|
первое слово - смещение, второе - сегмент
|
|||
|
dw максимальное число 4Kb-блоков для чтения (0x1000 байт)
|
|||
|
должно быть ненулевым и строго меньше 0x100
|
|||
|
на выходе: bx = статус:
|
|||
|
0 = успешно
|
|||
|
1 = файл оказался слишком большим, буфер заполнен целиком
|
|||
|
и есть ещё данные файла
|
|||
|
3 = произошла ошибка чтения
|
|||
|
dx:ax = размер файла
|
|||
|
Функцию можно вызывать только в случае, когда последний вызов функции
|
|||
|
1 и все последующие вызовы функции 2 вернули bx=1 (иными словами,
|
|||
|
только для продолжения загрузки файла, который уже был частично
|
|||
|
загружен, но ещё не загружен полностью).
|
|||
|
Загрузчик может быть уверен, что данные в областях памяти 0-9000 и
|
|||
|
60000-A0000 не будут модифицированы ядром.
|