2 Commits

Author SHA1 Message Date
9f5dd6cbdd Switch CD image to the native boot
No floppy emulation anymore. No attempts to save changed settings on
the blue screen.
2025-02-22 20:03:31 +00:00
e633ea8eac Fix extended_primary_loader for native CD boot
When the extended primary loader for CD was introduced in 2008-2009 it
used to load a relatively small secondary loader. Later the secondary
loader was integrated into the kernel, hence the primary loader had to
load the kernel which is 100kB+. The EDD BIOS specification allows to
read less than 0x80 sectors at once using Int 0x13 0x42 service. For a
512-byte sector this is less than 0x10000 bytes which is a 64kB limit.
The same limit of 64kB is reached on a CD with only 0x20 sectors,
because the sector size is 2048 bytes here. This commit changes the
maximum number of sectors that can be read by the loader at once from
0x7f to 0x20, i.e. reading is done in 64kB blocks now.
2025-02-22 20:03:24 +00:00
5 changed files with 36 additions and 17 deletions

View File

@@ -139,7 +139,7 @@ a named subitem "group=path/<groupname>" and the file should be put in <groupnam
--]]
extra_files = {
{"/", "common/distr_data/autorun.inf"},
{"/", "common/distr_data/KolibriOS_icon.ico"},
{"/", "common/distr_data/kolibrios.ico"},
{"Docs/stack.txt", "../kernel/trunk/docs/stack.txt"},
{"HD_Load/9x2klbr/", "common/HD_load/9x2klbr/LDKLBR.VXD"},
{"HD_Load/MeOSLoad/", SRC_PROGS .. "/hd_load/meosload/AUTOEXEC.BAT"},
@@ -370,6 +370,9 @@ distr_extra_files = {
{"/readme.txt", build_type .. "/distr_data/readme_distr.txt"},
}
end
tup.append_table(distr_extra_files, {
{"distribution_kit/kolibri.img", VAR_DATA .. "/kolibri.img"},
})
--[[
Files to be included in kolibri.iso outside of kolibri.img, but not distribution kit.
Same syntax as extra_files.
@@ -384,6 +387,12 @@ iso_extra_files = {
{"/readme.txt", build_type .. "/distr_data/readme.txt"},
}
end
tup.append_table(iso_extra_files, {
-- files for native CD boot
{"cdboot.bin", VAR_KERNEL .. "/bootloader/extended_primary_loader/cdfs/bootsect.bin"},
{"kernel.mnt", VAR_KERNEL .. "/kernel.mnt.ext_loader"},
{"kolibri.img", VAR_DATA .. "/kolibri.img"},
})
-- Programs that require FASM to compile.
if tup.getconfig('NO_FASM') ~= 'full' then
@@ -909,7 +918,6 @@ end
tup.definerule{inputs = input_deps, command = make_img_command1, outputs = {"kolibri.img"}}
-- generate command and dependencies for mkisofs
input_deps = {VAR_DATA .. "/kolibri.img"}
iso_files_list = ""
for i,v in ipairs(iso_extra_files) do
iso_files_list = iso_files_list .. ' "' .. v[1] .. '=' .. v[2] .. '"'
@@ -923,14 +931,16 @@ else volume_id = "KolibriOS"
end
tup.definerule{inputs = input_deps, command =
'^ MKISOFS kolibri.iso^ ' .. -- for tup: don't write full command to logs
'mkisofs -U -J -pad -b kolibri.img -c boot.catalog -hide-joliet boot.catalog -graft-points ' ..
'-A "KolibriOS AutoBuilder" -p "CleverMouse" -publisher "KolibriOS Team" -V "' .. volume_id .. '" -sysid "KOLIBRI" ' ..
'-iso-level 3 -o %o ' .. VAR_DATA .. '/kolibri.img' .. iso_files_list .. ' 2>&1',
'mkisofs -U -J -pad -b cdboot.bin -no-emul-boot -c boot.catalog'
.. ' -hide-joliet boot.catalog -hide-joliet cdboot.bin'
.. ' -hide-joliet kernel.mnt -graft-points'
.. ' -A "KolibriOS AutoBuilder" -p "CleverMouse"'
.. ' -publisher "KolibriOS Team" -V "' .. volume_id .. '" -sysid "KOLIBRI"'
.. ' -iso-level 3 -o %o ' .. iso_files_list .. ' 2>&1',
outputs = {"kolibri.iso"}}
-- generate command and dependencies for distribution kit
cp = 'cp "%f" "%o"'
tup.definerule{inputs = {VAR_DATA .. "/kolibri.img"}, command = cp, outputs = {"distribution_kit/kolibri.img"}}
for i,v in ipairs(distr_extra_files) do
cmd = cp:gsub("%%f", string.gsub(v[2], "%%", "%%%%")) -- input can be a group, we can't rely on tup's expansion of %f in this case
if string.sub(v[1], -1) == "/"
@@ -1019,9 +1029,15 @@ for i,v in ipairs(raw_files) do
table.insert(input_deps, v.group or local_file)
end
tup.definerule{inputs = {}, command = "echo '" .. make_raw_command1 .. "' > %o", outputs = {'make_raw_command1_file'}}
tup.definerule{inputs = {}, command = "echo '" .. make_raw_command2 .. "' > %o", outputs = {'make_raw_command2_file'}}
tup.definerule{inputs = {}, command = "echo '" .. make_raw_command3 .. "' > %o", outputs = {'make_raw_command3_file'}}
tup.definerule{inputs = {}, command = "^ Prepare command file #1 for the raw image^"
.. "echo '" .. make_raw_command1 .. "' > %o",
outputs = {'make_raw_command1_file'}}
tup.definerule{inputs = {}, command = "^ Prepare command file #2 for the raw image^"
.. "echo '" .. make_raw_command2 .. "' > %o",
outputs = {'make_raw_command2_file'}}
tup.definerule{inputs = {}, command = "^ Prepare command file #3 for the raw image^"
.. "echo '" .. make_raw_command3 .. "' > %o",
outputs = {'make_raw_command3_file'}}
table.insert(input_deps, 'make_raw_command1_file')
table.insert(input_deps, 'make_raw_command2_file')

View File

@@ -1,2 +1,2 @@
[AutoRun]
icon=KolibriOS_icon.ico
icon=kolibrios.ico

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -170,9 +170,10 @@ read_sectors:
do_read_sectors:
push ax
push cx
cmp cx, 0x7F
; read no more than 64kB at once, i.e. 0x20 sectors
cmp cx, 0x20
jbe @f
mov cx, 0x7F
mov cx, 0x20
@@:
; create disk address packet on the stack
; dq starting LBA
@@ -182,7 +183,7 @@ do_read_sectors:
; dd buffer
push es
push bx
; dw number of blocks to transfer (no more than 0x7F)
; dw number of blocks to transfer (no more than 0x20)
push cx
; dw packet size in bytes
push 10h

View File

@@ -156,10 +156,12 @@
es:bx указывает на конец буфера, в который были прочитаны данные
если произошла ошибка чтения, флаг CF установлен
1. В цикле (шаги 2-4) читает секторы, следит за тем, чтобы на каждой итерации
число читаемых секторов не превосходило 7Fh (требование спецификации
EDD BIOS).
2. Если число секторов для чтения больше 7Fh, уменьшает его (для текущей
итерации) до 7Fh.
число читаемых секторов не превосходило 20h. Требование спецификации
EDD BIOS не более 7Fh секторов за раз, что почти 64кБ для 512-байтного
сектора. Однако при размере сектора 2048 байт размер буфера в 64кБ
достигается уже при 20h секторах.
2. Если число секторов для чтения больше 20h, уменьшает его (для текущей
итерации) до 20h.
3. Формирует в стеке пакет для int 13h (кладёт все нужные данные командами
push, причём в обратном порядке: стек - структура LIFO, и данные в
стеке хранятся в обратном порядке по отношению к тому, как их туда