include "mkfloppy.inc"
file "bootcode.bin", 512
; fat1
db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0
; fat2
db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0
; root
dent io, "IO SYS", FA_RO or FA_HID or FA_SYS or FA_ARC
dent msdos, "MSDOS SYS", FA_RO or FA_HID or FA_SYS or FA_ARC
dent command, "COMMAND COM", FA_ARC
dent drvspace, "DRVSPACEBIN", FA_RO or FA_HID or FA_SYS or FA_ARC
dent autoexec, "AUTOEXECBAT", FA_ARC
dent command2, "COMMAND", FA_DIR
rb 33*512-$
; data
stof io, "content/IO.SYS"
stof msdos, "content/MSDOS.SYS"
stof command, "content/COMMAND.COM"
stof drvspace, "content/DRVSPACE.BIN"
stof autoexec, "content/AUTOEXEC.BAT"
defdir command2
{
dent fdisk, "FDISK EXE", FA_ARC
dent format, "FORMAT COM", FA_ARC
dent sys, "SYS COM", FA_ARC
dent defrag, "DEFRAG EXE", FA_ARC
dent scandisk1, "SCANDISKEXE", FA_ARC
dent scandisk2, "SCANDISKINI", FA_ARC
dent keyrus, "KEYRUS COM", FA_ARC
}
stod command2, root
stof fdisk, "content/COMMAND/FDISK.EXE"
stof format, "content/COMMAND/FORMAT.COM"
stof sys, "content/COMMAND/SYS.COM"
stof defrag, "content/COMMAND/DEFRAG.EXE"
stof scandisk1, "content/COMMAND/SCANDISK.EXE"
stof scandisk2, "content/COMMAND/SCANDISK.INI"
stof keyrus, "content/COMMAND/KEYRUS.COM"
rb 2*80*18*512-$
bootloader + qemu
[ORG 0x7C00]
start:
cli
mov ax, cs
mov ds, ax
mov ss, ax
mov sp, start
sti
mov si, msg
call kputs
cli
hlt
jmp short $
kputs:
.loop:
lodsb
test al, al
jz .quit
mov ah, 0x0E
int 0x10
jmp short .loop
.quit:
ret
msg: db "Hello from the world of real programming!",0x0A,0x0D,0
times 510-($-$$) db 0
db 0xAA, 0x55
Скомпилировал этот загрузчик с помощью nasm:
$ nasm -fbin start.asm -o start.bin
И вот я пытаюсь запустить данный загрузчик на qemu:
$ qemu -fda ./start.bin -boot a
В итоге получаем:
Boot from Floppy 0 failed
FATAL: Not a bootable disk
Что хотелось бы добавить. Вообще эта процедура описывалась не для qemu, а для VMWare, но надо бы попытаться запустить на qemu.
А теперь вопросик, я наверно что нить не так делаю, что именно? )
вот два пути, которые я пробовал, хотя они и на фасме. образ проверял как-раз на qemu.
Яяясно, я подозревал что там не все чисто. Спасибо. Если не влом напиши как ты собираешь эти образики и наращиваешь их, но это если не влом, а так сам посижу подумаю (типа совсем обленился).
http://www.winasm.net )
если все настроено, то собирается по ctrl+enter, а запускается командой "выполнить". если собирать их из winasm studio, то надстройку fasm нужно брать последнюю с форума (в закачки еще не добавлена, так как не завершена). если будут проблемы в начале - могу проконсультировать.
это шаблоны для winasm studio + fasm add-in (
если все настроено, то собирается по ctrl+enter, а запускается командой "выполнить". если собирать их из winasm studio, то надстройку fasm нужно брать последнюю с форума (в закачки еще не добавлена, так как не завершена). если будут проблемы в начале - могу проконсультировать.
org 7C00h
start:
mov ax,cs
mov ds,ax
mov ss,ax
cli
mov sp,start
sti
mov cx,count
mov si,hello
mov ah,0Eh
printf:
lodsb
int 10h
loop printf
xor ah,ah
int 16h
int 19h
hello db "Real coding shcoding!",0x0a,0x0d
count equ $-hello
times 510-($-$$) db 0
db 055h,0AAh
Соответственно компиляция:
$ nasm -fbin bootn.asm -o bootn.bin
Соответственно запуск:
$ qemu ./bootn.bin
или:
$ qemu -fda bootn.bin -boot a
На размер вообщемто ему пофиг )) (типа можно подсовывать и 512b). В реальных условиях не проверял, т.к. нет flop'ика но чутье подсказывает что будет все ок. Чет у меня там было наворочено в исходники, че именно не понял ). Ща с помощью твоего исходника все прояснил и составил свой понятный исходник.
db "HE-HE OS"; ; 8
dw _bs ; b/s
db 1 ; s/c
dw 1 ; rs
db 2 ; fats
dw 224 ; rde
dw 2880 ; as
db 0F0h ; media
dw 9 ; s/fat
dw _st ; s/t
dw _hd ; h
dd 0 ; hs
dd 0 ; --
db 0 ; drv
db 0 ; --
db 29h ; ebr
dd 0 ; sn
db "NO NAME "; ; 11
db "FAT12 "; ; 8
Что он делает? Вот это хотелось бы прояснить. А файл fat12.inc к чему, там мощно всего наворочено? Это типа к таблице fat'овской?
при ассемблировании boot_fat.asm создается не только код загрузочного сектора, но и полная структура диска с файловой системой фат12 (образ), при этом в этот образ автоматически добавляются указанные файлы:
fat12 \
"A TXT","a.txt",ff0,\
"B TXT","b.txt",ff1,\
"KERNEL BIN","kernel.bin",ff2
"KERNEL BIN" - имя файла в образе (обязательно 8+3 символа)
"kernel.bin" - имя исходного файла на диске
ff2 - "очередная метка" (ну не сделал автоматически :)
файлов может быть максимум - см. емкость корневого каталога. подкаталоги не поддерживаются. также длина файла выравнивается на два сектора, так что могут быть пустые промежутки между файлами в 512 байт (но они не теряются, просто макрос не может их заполнить)
на счет переполнения образа не проверял (надеюсь на совесть :)
на диске в бут-секторе идет произвольный текст по смещению + 3 (8 байт), а за ним - заголовок BPB (Bios parameter block), в котором указываются параметры диска. если его опустить - машина может загрузится (я так пробовал), но диск не будет видим из под дос даже если вся остальная структура сохранена.
выражаясь проще: fasm boot_fat.asm сформирует образ дискеты с загрузочным сектором, включив в него также указанные файлы. вот.
cli
mov sp,start
sti
===
я читал в литературе, что если mov ss/mov sp идут подряд, то прерывания между ними запрещены, то есть в данном случае cli/sti не нужны.
db 1 ; sectors per cluster
dw 1 ; boot reserved sectors
db 2 ; count of fats
dw 224 ; root directory entries count
dw 2880 ; total sectors
db 0F0h ; media type
dw 9 ; sectors per fat
dw _st ; sectors per track
dw _hd ; heads count
dd 0 ; hidden sectors
dd 0 ; --
db 0 ; drv
db 0 ; --
db 29h ; extended boot record
dd 0 ; drive serial number
db "NO NAME "; ; 11 disk label
db "FAT12 "; ; 8 file system id
С прерываниями разберусь. Просто мне чето попадалось типа того что при изменение указателя стека(sp) надо отключать прерывания. А вот эти переменный они для чего нужны. Ты их расшифровал, а где ты их используешь?
cli
mov ss,ax
mov sp,start
sti
я их использую в макросе, формирующем фат. но они не для меня, а для операционной системы, чтобы она знала геометрию диска. в реальной жизни они заполняются при форматировании, когда, например, указываешь, сколько дорожек, секторов на дорожку и т.п., а не по умолчанию. возьми любую дискету и посмотри бут-сектор - полезно ;)
насчет древних процов (не увидел сразу ответ) - я как раз читал об этом в нашей кгижке о 1810ВМ86
mov ss,ax
cli
mov sp,start
sti
Тока явно, т.к. из твоей фразы(повторюсь) я понял следующее:
mov ss,ax
[прерывания отключаются на одну команда] - автоматическм
... (любая команда)
[прерывания включаются] - автоматически
Я непраильно понял?
boot-сектор посмотреть? Если ты мне подскажешь как это сделать, то очень облегчишь мне задачу, а я за это скажу большое спасибо. Но в принципе уже и так большое спасибо ).
По поводу посмотреть boot на дискете, это типа сделать ее образ и посмотреть данный образ под "микроскопом", так штоль?
2.конечно, нужно смотреть бут-сектора, чтобы видеть, как оно сделано. самый простой способ - debug. вот скриншот одной команды:
load L [адрес] [диск] [превый_сектор] [число]
l 100 0 0 1 загрузит 1 сектор, начиная с 0 (boot), с диска 0 (А) по адресу 100. затем можно его смотреть через d 100 в шестнадцатиричном виде, либо через u дизассемблировать. Если в бут-секторе используются 286+ команды - можно попробовать grdb.
есть другие, более удобные способы: например, дисковый редактор DOS Navigator, или различные другие редакторы вроде WinHex, и т.п. - все возможное сложно перечислить, но работать вслепую - неэффективно.
Цитата:
times 510-($-$$) db 0
db 0xAA, 0x55
db 0xAA, 0x55
2-й рабочий вариант:
Цитата:
times 510-($-$$) db 0
db 055h,0AAh
db 055h,0AAh
разница заметна, а это - важная сигнатура
О, shoorick, это не просто важная сигнатура, это очень важная сигнатура, спасибо. В принципе это и есть ответ на мой самый первый вопрос )), т.к. после исправления все работает как надо! Так держать.
2.конечно, нужно смотреть бут-сектора, чтобы видеть, как оно сделано. самый простой способ - debug. вот скриншот одной команды:
load L [адрес] [диск] [превый_сектор] [число]
l 100 0 0 1 загрузит 1 сектор, начиная с 0 (boot), с диска 0 (А) по адресу 100. затем можно его смотреть через d 100 в шестнадцатиричном виде, либо через u дизассемблировать. Если в бут-секторе используются 286+ команды - можно попробовать grdb.
есть другие, более удобные способы: например, дисковый редактор DOS Navigator, или различные другие редакторы вроде WinHex, и т.п. - все возможное сложно перечислить, но работать вслепую - неэффективно.[/QUOTE]
Че за команда load? Это команда в какомто дебаггере, если не сложно говори по понятней: типа че за дебаггер. И ваще я понял ты винду используешь. Так что мне не плохо было бы понять общую технологию, типа не команда load, а чтонить типа берем сымаем образ с дискеты залезаем hex-editer'ом. А что это за d 100? u? ты не подумай что я тут тебя засираю, просто мне реально не понятно что это значит. Единственное что я понял, что нужен некий дисковый редактор.
а вообще посмотри здесь: http://board.flatassembler.net/forum.php?f=11 - там много чего
Вот теперь я все понял, что ты хотел сказать )). Мне это нужно для того чтоб я спроецировал на себя (о как ))! ). У меня просто винда отсутствует, поэтому я и просил чисто в абстракциях на пальцах или еще как нить объяснить, теперь я все понял.
есть программа, грузящаяся с дискеты.
хочу запустить её через qemu.
Как создать образ дискеты из бинарного файла программы?
Я эту тему прочитал и так и не понял, как это сделать.
Не понял до конца вопрос...
Вопрос можно сформулировать так:
1)В каком формате должен быть файл, чтобы qemu могла загрузить с него, как с дискеты.
2)Как получить файл в таком формате.
Погуглив по запросу diskdupe я выяснил, что бывает формат .ddi и получить его можно с помощью diskdupe.exe
Проблема в том, что diskdupe под винду, а у меня линукс.
У пингвинов есть утилита dd. Помнится она для того же.
Ещё есть dosemu/wine
Цитата: Vov4ick
Хм.. Всю жизнь думал, что diskdupe под DOS ;-)
Ой. Просто у меня .exe сразу ассоциируется с windows...
Цитата: Vov4ick
У пингвинов есть утилита dd. Помнится она для того же.
Ещё есть dosemu/wine
Ещё есть dosemu/wine
Сейчас посмотрел man по dd. Ничего про образ дискеты там не написано...
А самому это образ дискеты сделать можно? Что он должен из себя представлять? Где можно найти документацию?
Вообщето обычный бинарник или ваще любой файл можно вставить в vmware. И все работает отлично.
http://www.chrysocome.net/dd
dd if=\\.\a: of=c:\temp\disk1.img bs=1440k
А можно делать образ сразу (не через дискету), используя mtools, например.
dd if=\\.\a: of=c:\temp\disk1.img bs=1440k
А можно делать образ сразу (не через дискету), используя mtools, например.
Кто хочет делать образы дискет путем компиляции fasm'ом, обращайтесь! Вот вам пример исходника:
это странно, потому что когда я доращивал до 1440кб не работало...
Осталась такая проблема: в дискете где-то записано, загрузочная она или нет, а где - непонятно: qemu считает, что моя дискета не загрузочная, и запускает её только если дать ему параметр -no-fd-bootchk
как сделать дискету загрузочной?
Признак загрузочного сектора - "Uк" (55h, 0aah) в его конце присутствует?
или в конце кода?
я вставил в конце кода, но не работает.
должно быть в конце т.е. 511 и 512 байты
Спасибо, всё работает.