Помогите создать загрузочную дискету

Тема в разделе "WASM.BEGINNERS", создана пользователем wcools, 7 сен 2008.

  1. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    если файл записывается проводником из винды, то записывается он в свободные сектора, расположение которых он узнает из таблицы ФАТ, а его имя и первый сектор помещаются в корневой каталог (если файл записывается в корневой каталог, подкаталоги - отдельная история). то есть, для того, чтобы найти файл загрузчик должен для начала уметь найти и считать таблицу ФАТ и прочитать корневой каталог, найти там подходящее имя файла, а затем его считать сектор за сектором согласно таблицы ФАТ. это не очень просто для начинающего, однако такие сектора с загрузчиками в бут-секторе широко присутствуют в инете. естественно, диск с ФАТ должен содержать блок ВРВ и саму ФАТ, иначе врядли система (дос/виндовс) согласится с ним работать. я эту стадию уже проходил ;)
    если вам категорически не нравится ВРВ - я отнюдь не настаиваю, можете использовать другие файловые системы, в т.ч. и своей разработки.
     
  2. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Я еще не знаю нравится он мне или не т, поэтому и спрашивал выше что это такае и как им пользоваться??

    Я не ей пользовался, т.к она глючила, сейчас еще попробую.
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    wcools
    Странно. Я думал, что это Вы написали:
    Видимо обознался.
    Сразу говорю: для текущей задачи и задач подобного рода на ближайшие минимум пару недель BPB Вы просто терпеть не можете.
     
  4. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Но я ведь так и не дождался инструкции к WinHex, поэтому пришлось воспользоваться FDX. Может вседки кратенькую инструкцию выложешь, а то у меня даже в 1 сектор не записывается(вылазит message с Cannot read from [boot.BIN]. Sector 1 does not exist.)
     
  5. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    ВРВ - это структура, которая начинается с 3 байта загрузочного сектора и содержит информацию о геометрии диска. благодаря ей система узнает все необходимые данные, например, размер диска, в каких секторах расположена ФАТ, емкость корневого каталога и т.п. - описывать все здесь не буду, думаю, описаний в инете навалом, в т.ч. и по-русски.

    раз уж трудно скачать пример, приведу один полностью:
    Код (Text):
    1. _bs equ 512
    2. _st equ 18
    3. _hd equ 2
    4. _tr equ 80
    5.  
    6.     org 7C00h
    7.     jmp start
    8.     nop
    9. ;  BPB
    10.     db  "HE-HE OS";     ; 8
    11.     dw  _bs             ; b/s
    12.     db  1               ; s/c  
    13.     dw  1               ; rs
    14.     db  2               ; fats
    15.     dw  224             ; rde
    16.     dw  2880            ; as
    17.     db  0F0h            ; media
    18.     dw  9               ; s/fat
    19.     dw  _st             ; s/t
    20.     dw  _hd             ; h
    21.     dd  0               ; hs
    22.     dd  0               ; --
    23.     db  0               ; drv
    24.     db  0               ; --
    25.     db  29h             ; ebr
    26.     dd  0               ; sn
    27.     db  "NO NAME    ";  ; 11
    28.     db  "FAT12   ";     ; 8
    29. ;=====================================================
    30. start:
    31.     mov   ax,cs
    32.     mov   ds,ax
    33.     mov   cx,count
    34.     mov   si,hello
    35.     mov   bx,7
    36.     mov   ah,0Eh
    37. @@:
    38.     lodsb
    39.     int   10h
    40.     loop  @B
    41.     xor   ah,ah
    42.     int   16h
    43.     int   19h
    44.  
    45. hello   db "Hi! This is disk-invalid!"
    46. count = $ - hello  
    47.    
    48.     rb 7E00h-2-$
    49.     db 055h,0AAh
    - это бут-сектор для "нормальной" дискеты с ФАТ-12 емкостью 1.44Мб, т.е. если записать его на дискету, то она не перестанет читаться из-под дос/винды. вам только нужно заменить код после метки "start" на свой.

    по поводу чтения из бут-сектора файла с диска - у меня нет под рукой такого кода, но такие примеры имеются в инете в достаточном количестве - с них начинают практически все осеписцы.
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    не совсем верно - не идут, а могут идти.
     
  7. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Примеры я видел и BPB как я сейчас понял, тоже. Но никто не написал, что это BPB. Теперь с этим понятно.
    В примере еще было

    cli ; подготовим регистры
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 7c00h
    sti

    Для чего это нужно??
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    wcools
    Начальное состояние регистров не определено.
    Кроме.
    ES:lol: I = Pointer to PnP Installation Check Structure - в старых БИОСах этого не было
    DL = Drive number used for the INT 13h (00h, 80h, etc.)

    CS IP тоже не определены. Определена только связка CS:IP которая указывает на 7C00h, а вот способы задания различные 07C0h:0000h или 0000:7C00h и др. Как видно код выше некорректный.

    Стек тоже нужно настроить, так как при вызове прерывания адрес возврата заноситься в него. А если он 0000 то можно получить ошибку.
    STI - разрешает аппаратные прерывания.
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    А разве новые BIOS'ы это устанавливают при загрузке банального бутсектора (о PnP речь сейчас не идёт)? Мне кажется, что нет...
     
  10. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    org 7C00h
    use16

    jmp start
    nop
    db 'MyDisketa'
    SecSize dw 00200h
    ClustSize db 1
    RezSec dw 1
    Fat db 2
    Rde dw 224
    AllSec dw 2880
    Media db 0f0h
    SecInFat dw 9
    SecInTrek dw 18
    Head dw 2
    HideSec dd 0
    XX dd 0

    NoDisk db 0
    Reserv db 0
    BootSig db 29h
    SerNumber dd 0
    Metka db 'hello'
    TupeSys db 'FAT12'

    start:
    cli
    mov ax,cs типа в cs должен быть 0 и обнуляем ах, а если там не 0 ???
    mov ds,ax
    mov es,ax
    mov ss,ax
    mov sp,7c00h
    sti

    xor ax,ax Тогда зачем обнулять здесь???
    mov es,ax
    mov bx,7e00h
    mov dl,00h
    mov dh,00h
    mov ch,00h
    mov cl,02h
    mov al,01h
    mov ah,02h
    int 13h

    jmp 7e00h
    times (512-2-($-7C00h)) db 0
    db 055H,0AAH

    Заполнил я врв и как теперь закинуть прогу во 2 сектор, или еще что-то нужно???
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    wcools
    Эх. Не слушаете Вы. Ладно... shoo пытается Вам навязать реализацию работы с FAT (для нее и нужен BPB). Я пытаюсь... хм... собственно тоже навязать :) НЕ работать с FAT (никакие BPB не нужны), а просто сыро записать на дискету в первые сектора код и не мучаться...
    Tools->Open Disc->Physical Media->Floppy Disc 0

    Если будут проблемы и не разберетесь сами, то лучше воспользуйтесь этой программкой на фасме (писал на скорую руку, поэтому проверок типа: не превышает ли размер файла объём дискеты, нету):
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32a.inc'
    4.  
    5. OFN_DONTADDTORECENT     equ 2000000h
    6. MAX_PATH                equ 260
    7.  
    8. main:
    9.     invoke GetModuleFileName,NULL,myAppPath,MAX_PATH
    10.     mov dword[ofn.lStructSize],sizeof.OPENFILENAME
    11.     mov dword[ofn.lpstrFilter],typeFilter
    12.     mov dword[ofn.nMaxFile],MAX_PATH
    13.     mov dword[ofn.lpstrTitle],msgTitle
    14.     mov dword[ofn.lpstrFile],filePath
    15.     mov dword[ofn.lpstrInitialDir],myAppPath
    16.     mov dword[ofn.Flags],OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_DONTADDTORECENT or OFN_HIDEREADONLY or OFN_EXPLORER
    17.     invoke GetOpenFileName,ofn
    18.     invoke CreateFile,filePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    19.     mov ebx,eax                         ;ebx - handle to file
    20.         invoke GetFileSize,ebx,NULL
    21.         lea esi,[eax+1FFh]
    22.         and esi,0FFFFFE00h              ;esi - aligned file size
    23.         invoke VirtualAlloc,NULL,esi,MEM_COMMIT,PAGE_READWRITE
    24.         mov edi,eax                     ;edi - pointer to file contents
    25.             invoke ReadFile,ebx,edi,esi,bytesTransferred,0
    26.             invoke CreateFile,floppyPath,GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL
    27.             push eax
    28.                 invoke WriteFile,eax,edi,esi,bytesTransferred,0
    29.             invoke CloseHandle
    30.         invoke VirtualFree,edi,0,MEM_RELEASE
    31.     invoke CloseHandle,ebx
    32. invoke ExitProcess,0
    33.  
    34. align 4
    35. typeFilter    db 'Any File',0,'*.*',0,0
    36. msgTitle      db 'Select the image',0
    37. floppyPath    db '\\.\A:',0
    38.  
    39. data import
    40.         library kernel32,'kernel32.dll',\
    41.                 comdlg32,'comdlg32.dll'
    42.  
    43.         import kernel32,\
    44.                GetModuleFileName,'GetModuleFileNameA',\
    45.                CreateFile,'CreateFileA',\
    46.                ReadFile,'ReadFile',\
    47.                WriteFile,'WriteFile',\
    48.                CloseHandle,'CloseHandle',\
    49.                VirtualAlloc,'VirtualAlloc',\
    50.                VirtualFree,'VirtualFree',\
    51.                GetFileSize,'GetFileSize',\
    52.                ExitProcess,'ExitProcess'
    53.         import comdlg32,\
    54.                GetOpenFileName,'GetOpenFileNameA'
    55. end data
    56.  
    57. ofn               OPENFILENAME <>
    58. myAppPath         db MAX_PATH dup ?
    59. filePath          db MAX_PATH dup ?
    60. bytesTransferred  dd ?
    P.S. Забыл сказать, что программка делает :). Записывает выбранный Вами файл в первые сектора дискеты. Если размер файла не кратен размеру сектора (512 байт), то оставшаяся часть последнего сектора заполняется нулями.
     
  12. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    ну я прямо тут садист :)
    Код (Text):
    1. db 'MyDisketa'  ; 9 байт, а нужно 8
    2. Metka      db  'hello' ; 5 байт, а нужно 11
    3. TupeSys    db  'FAT12' ; 5 байт, а нужно 8
    совет №1: не спешите менять в примере то, чего вы не знаете (даже если это кажется очевидным)
    совет №2: не меняйте в примере много всего сразу, а то потом будет трудно искать причину, из-за которой все перестало работать
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    На дискете могут только теоретически. Практически не могут.
    Обрекаешь на дальнейшие мучения? Пусть берет загрузчик, загружающий файл(ы) из FAT, и работает далее с этим файлом(ами).
     
  14. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Из этого
    ............
    SecSize dw 00200h ;байт на сектор
    ClustSize db 1 ;Секторов на кластер
    RezSec dw 0 ;Резервных секторов перед первой фат
    Fat db 2 ;Количество таблиц фат
    Rde dw 224 ;Элементов в каталоге
    AllSec dw 2880 ;Всего секторов
    Media db 0f0h ;Код типа устройства
    SecInFat dw 9 ;Секторов в фат
    ..............
    следует, что
    1) Резервных сеторов нет
    2) Fat занимает 9 секторов
    3) Fat всего 2
    4) Корневой каталог занимает 18 секторов
    Значит В форматированной под фат дискете первые 18 секторов занимают 2 таблици фат, еще 18 корневой каталог и данные которые я скопирую через проводник будут записываться начиная с 37 сектора. Так ли это???
    Если так , то я могу прочитать данные с 37 сектора 13 прерыванием???
     
  15. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    да насчет 1-3 - это явно
    насчет 4 проверяем:
    224(число эл)*32(байт на элемент)/512(байт на сектор) = 14(секторов)

    найди описание FAT12 и почитай! на форуме некоторые вопросы сложно пересказывать! тем более я сам не все знаю, а то что знал - частично забыл :)

    вкратце:

    за (второй) ФАТ вплотную идет корневой каталог, а за ним - область данных.

    ФАТ12 - все сектора адресуются 12 битами.

    вначале ФАТ идут 3 байта: 0F0h,0FFh,0FFh
    затем идут элементы фат, причем 3 байта (24 бит) содержат 2 элемента - это, наверное, самый сложный момент в фат. каждый элемент фат соответствует одному сектору области данных.

    элемент фат может содержать значения:
    000 - свободный сектор
    FF7 - сбойный сектор (или зарезервированный, может быть в пр. FF0-FF7)
    FFF - последний сектор файла (значения в пределах FF8-FFF)*
    иначе - номер следующего сектора файла*.
    *см. дальше

    корневой каталог:
    элемент содержит:
    11 байт имя файла с расширением (8+3 без точки!)
    1 байт атрибуты файла
    14 байт не помню зачем
    2 байта - номер первого сектора
    4 байта - размер файла в байтах

    как читать файл целиком:
    1.находим корневой каталог
    2.ищем в нем имя файла
    3.когда найдем - смотрим первый сектор
    4.считываем первый сектор
    5.считываем из фат элемент, соответствующий этому сектору
    6.если он FF8-FFF - значит чтение файла завершено
    7.иначе он должен содержать номер следующего сектора
    8.считываем этот сектор и переходим к п.5
    9.по завершению чтения узнаем из размера, выделив его младшие биты, сколько байт в последнем секторе принадлежит файлу, остальные игнорируем.

    замечания:
    1.если известно, файл помещается в один сектор, то лазить по фат необязательно - достаточно узнать номер первого сектора из элемента корневого каталога.
    2.на форматированную дискету без сбойных секторов файлы пишутся подряд, сектор за сектором. "перемешивание" возникает в процессе удаления файлов и последующей записи файлов других размеров, в процессе изменения существующих файлов на диске процессами записи в них или обрезки
     
  16. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    224*32/512=14, не 18!!!
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    shoo, респект)
     
  18. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Вот этот исходник формирует структуру флоппика на 1.44

    Код (Text):
    1. include "mkfloppy.inc"
    2.  
    3. file "bootstub.bin", 512
    4.  
    5. ; fat1
    6. db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0
    7.  
    8. ; fat2
    9. db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0
    10.  
    11. ; root
    12. dent fileid, "README  TXT", FA_ARC
    13. ; ...
    14. rb 33*512-$
    15.  
    16. ; data
    17. stof fileid, "content/readme.txt"
    18. ; ...
    19. rb 2*80*18*512-$
    Т.е. область файловых данных начинается с 33-го сектора (при нумерации с нуля).
     
  19. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    И как это сделать???

    Если я просто форматну дискету под фат, будет тоже самое??? Судя по WinHex , да. Пробовал считать 33 сектор вот так:
    xor ax,ax
    mov es,ax
    mov bx,7e00h
    mov dl,00h ;номер диска
    mov dh,02h ;номер головки
    mov ch,02h ;номер дорожки
    mov cl,15 ;номер сектора
    mov al,01h ;секторов для чтения
    mov ah,02h
    int 13h
    Не получилось :dntknw:

    PS: Может читается, а моя программа в 33 секторе не работает???
    org 7e00h
    use16
    mov ah,9h
    mov al,100
    mov cx,10
    mov bl,3
    mov bh,00h
    int 10h
     
  20. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    как мы узнали, корневой каталог начинается в 19 секторе (0 - бут, 1-9 -фат1, 10-18 - фат2), а длина его 14 секторов
    делаем следующее:
    1.читаем сектор 19
    2.ищем имя нужного файла - см. структура элемента каталога
    3.если не найдено - читаем следующий сектор
    4.если уже считано 14 секторов, значит файл не найден (в корневом каталоге, подкаталогами жизнь не усложняем)
    5.если найдено - значит 28 и 27 байты элемента каталога содержат первый сектор файла.

    далее....
    1.то, что должно выполняться в бут-секторе, практически всегда можно отладить вначале в com-файле из-под мс дос, что гораздо проще.
    2.насколько мне известно, у доса и у биоса нумерация секторов различается (распределение их по дискам)
    3.рекомендую воспользоваться debug:
    l 100 0 21 1
    - это считает сектор 33 (21h) с дискеты в память по адресу 0. посмотрите, что считано и сравните с тем, что считала ваша программа. этим же отладчиком можно и записывать сектора на диск (только аккуратно, иначе может понадобиться вновь форматировать дискету)
    4.воспользуйтесь образом диска для выяснения того, что где расположено - в примерах, которые я предлагал, образы дисков создаются программно в разных вариантах.
    5.WinHex в профессиональном варианте позволяет открывать файлы образов дисков и анализировать их: меню Specialist->Interpret Image File As Disk

    пс: фффухх :)