Строим дискеты в фасме. Вдруг кому-то пригодится.

Тема в разделе "WASM.ASSEMBLER", создана пользователем l_inc, 24 янв 2011.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    В очередной раз игрался с макросами. И доигрался до следующего. Простейший вариант построить рабочий образ пустой дискеты выглядит так:
    Код (Text):
    1. include 'floppy.inc'
    2. floppy_image <@@: jmp @B>
    3. endfi
    Эти три строки сгенерируют 1,4-мегабайтный образ дискеты с зацикленным кодом в загрузочном секторе и валидной FAT12.
    Макрос floppy_image принимает два параметра, первый из которых обязателен и должен раскрываться в код, помещаемый в загрузочный сектор. Вторым параметром должен/может быть некоторый идентификатор, символизирующий корневую директорию.
    Макрос endfi подчищает ненужное и выравнивает размер образа до 1,4 мегабайта.

    Код (Text):
    1. include 'floppy.inc'
    2. floppy_image <db 0xf4,0xeb,0xfd>,root
    3.     directory root,\
    4.         "C:\windows\system32\taskmgr.exe","mgr.exe"
    5. endfi
    Этот код создаст образ дискеты с одним файлом в корневой директории. Файл будет взят по адресу "C:\windows\system32\taskmgr.exe" и помещён в корень образа под именем "mgr.exe". Код загрузочного сектора для порядка изменён на более щадящий.
    Макрос directory может использоваться только между вызовами макросов floppy_image и endfi и принимает первым обязательным параметром один из ранее описанных идентификаторов директорий (в данном случае корневой директории). Далее идут пары параметров. Первый параметр в каждой паре является либо идентификатором, символизирищующим очередную директорию (такие идентификаторы не могут повторяться), либо строкой представляющей собой полный (не обязательно, но об этом позже) путь к файлу (строка в первом параметре означает, что определён файл, а не директория). Второй параметр в каждой паре не является обязательным и определяет имя файла/директории, под которым он/она будет помещён в образ. Если параметр пропущен, то его имя будет выбрано по возможности совпадающим с именем файла или идентификатора директории в первом параметре.

    Т.к. писать код загрузочного сектора в опкодах в одну строку, мягко говоря, не очень удобно, следующий пример показывает наиболее стандартный вариант оформления загрузчика (смещение кода заранее установлено с помощью org 7C00h + sizeof(BPB)):
    Код (Text):
    1. macro bootCode
    2. {
    3.     USE16  
    4.     jmp 0:loader.configure
    5.     loader.configure:
    6.         xor ax,ax
    7.         mov ds,ax
    8.         mov es,ax
    9.         cli
    10.         mov ss,ax
    11.         mov sp,7c00h
    12.         sti
    13.        
    14.         mov si,loader
    15.         mov di,loader.start
    16.         mov cx,loader.end-loader.start
    17.         cld
    18.         rep movsb
    19.     jmp loader.start
    20.  
    21.     loader:
    22.     org 600h
    23.     loader.start:
    24.         push 0b800h
    25.         pop es
    26.         mov si,msg
    27.         xor di,di
    28.         mov cx,(loader.end-msg)/2
    29.         rep movsw
    30.        
    31.         @@: hlt
    32.         jmp @B
    33.         msg db 'H',7,'e',7,'l',7,'l',7,'o',7,' ',7,'W',7,'o',7,'r',7,'l',7,'d',7,'!',7
    34.     loader.end:
    35. }
    36.  
    37. include 'floppy.inc'
    38. floppy_image bootCode,root
    39.     cd "C:\fasm\BootLoad"
    40.     directory root,\
    41.                 windows,,\
    42.                 "bootload.bin",,\
    43.                 "floppy.asm", "source.txt",\
    44.                 "D:\empty.bin", "empty"
    45.     cd "C:\windows\"
    46.     directory windows,\
    47.                 system32,"system",\
    48.                 temp,,\
    49.                 "system32\taskmgr.exe"
    50.     directory system32,\
    51.                 "notepad.exe","click_me.exe"
    52. endfi
    Этот код построит образ дискеты со следующим деревом каталогов в формате FAT12:
    Код (Text):
    1. \-+
    2.   |
    3.   +- WINDOWS -+
    4.   |           |
    5.   |           +- SYSTEM -+
    6.   |           |          |
    7.   |           |          +- CLICK_ME.EXE
    8.   |           |
    9.   |           +-  TEMP  -+
    10.   |           |
    11.   |           +- TASKMGR.EXE
    12.   |
    13.   +- BOOTLOAD.BIN
    14.   |
    15.   +- EMPTY
    16.   |
    17.   +- SOURCE.TXT
    Макрос cd предназначен только для того, чтобы не приходилось указывать полные пути ко всем файлам, включаемым в образ дискеты. Он принимает ровно один обязательный параметр, указывающий базовый путь, относительно которого могут выбираться файлы, включаемые в образ. Если при включении файла указывается полный путь, то базовый путь игнорируется (как это происходит в примере с файлом empty.bin).

    Все необходимые макросы и структуры приложены в архиве.

    P.S. Аналогичные макросы для создания образов ISO предлагаю написать в качестве домашнего задания. :)
     
  2. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    l_inc
    Спасибо!
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В ISO более строгий порядок следования файловых записей. С таблицами путей тоже пришлось повозиться. Сначала я просто резервировал под них область определенного размера. В новой версии они будут размещаться в конце образа и строиться на основе анализа структуры каталогов. Пользователю остается лишь расположить файловые записи в правильном порядке в отдельно взятом каталоге. Кстати описанное здесь - это прямой конкурент моему mkfloppy.inc. Посмотрю содержимое архива, расскажу о плюсах и минусах предложенного решения в сравнении с моим вариантом.
     
  4. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Судя по описанию (и по сложности кода :)) решение вполне достойное. У меня реализация попроще, но возможности аналогичны. Если по мелочам, то идентификатор root зарезервирован за корнем. Файловые записи и файловые данные описываются отдельно. На первый взгляд это менее эффективное решение, но зато более простое и позволяющее управлять размещение файлов и каталогов в области файловых данных. Длинные и коротки имена у меня задаются как отдельные параметры (даже есть отдельный макрос, работающий только с короткими именами). Если автор реализовал преобразование длинного имени в короткое по всем правилам (описанным в известном руководстве), то он достоин похвалы - я только размышлял над тем, стоит ли это делать или нет. Многие дисковые утилиты и эмуляторы позволяют работать с сокращенными образами. Поэтому у меня в качестве заполнителя можно указать "?" (либо вообще ничего не указывать) в макросе finimage. В макросе orgimage указывается имя файла, содержащего бутсектор. Если этот параметр не указан, bpb будет сформирован автоматически (сигнатура бутсектора тоже). Короче предложенное решение во многом более высокоуровневое, чем мое. Однако мое решение позволяет более гибко управлять структурой образа.

    Код (Text):
    1. include "mkfloppy.inc"
    2.  
    3. defdir root
    4. {
    5. dent fileid,"FILE    TXT",FA_ARC
    6. dent dirid,"DIR",FA_DIR
    7. }
    8.  
    9. defdir dirid {}
    10.  
    11. orgimage "bootstub.bin"
    12.  
    13. stof fileid,"content/file.txt"
    14. stod dirid,root
    15.  
    16. finimage
    Где-то на этом форуме есть описание (одной из прошлых версий). Если интересно, можете поискать.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Phantom_84
    А взглянуть на реализацию позволяется? :) Ссылка отсюда уже мертва. Имеет смысл прицепить архив к сообщению, чтобы он жил столько, сколько будет жить форум.
    Не-а. Не достоин. :) Длинные имена не поддерживаются (которые в спецфайлах должны храниться). Расширения длиннее трёх символов игнорируются. Имена файлов длиннее восьми символов просто обрубаются. Если при этом получатся несколько одинаковых имён в пределах одной директории, то они так и останутся одинаковыми. Проверок на валидность имени почти нету. Эти недочёты оставлены на откуп составителю образа.
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Там есть ссылка на буржуйский форум.

    Последняя версия: mkfloppy.zip

    Примеры для предыдущей версии (нет макросов orgimage/finimage):
    GrubOnFloppy.zip
    GrubOnFloppy-198.zip

    Тогда это недочет. У меня есть макрос lent, который можно использовать вместо dent:
    Код (Text):
    1. lent fileid,"LONGNAMETXT",FA_ARC,"Long name.txt"
    Я уже подумываю сделать формирование короткого имени (второй параметр) на основе длинного автоматически (кстати в руководстве описано, как поступать, когда при построении короткого имени возникает повторение). Меня пока останавливает все то же стремление к гибкости, а именно возможность указывать совершенно непохожие короткое и длинное имена. Думаю, даже если сделаю автоматическое формирование короткого имени, все равно оставлю возможность указывать короткое имя явно.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Phantom_84
    Моё скромное мнение: это что-то страшное. :) Не мне, разумеется, рассказывать Вам, как писать правильно: у каждого свой стиль. Поэтому просто обосную своё мнение:
    1) Ну чем Вам не угодили отступы? Неужели
    Код (Text):
    1. macro reset id
    2. {
    3. local count, cur, disp, val, var
    4. times 511-($+511) mod 512 db 0
    5. if id#_size>0
    6. count=(id#_size+511)/512
    7. cur=id#_base/512-(33-2)
    8. repeat count
    9. if %=count
    10. val=0FFFh
    11. else
    12. val=cur+1
    13. end if
    14. if cur and 1
    15. val=val shl 4
    16. end if
    17. disp=(cur*3)/2
    18. load var word from 512+disp
    19. var=var or val
    20. store word var at 512+disp
    21. store word var at 10*512+disp
    22. cur=cur+1
    23. end repeat
    24. end if
    25. }
    читается проще, чем
    Код (Text):
    1. macro reset id
    2. {
    3.     local count, cur, disp, val, var
    4.     times 511-($+511) mod 512 db 0
    5.     if id#_size>0
    6.         count=(id#_size+511)/512
    7.         cur=id#_base/512-(33-2)
    8.         repeat count
    9.             if %=count
    10.                 val=0FFFh
    11.             else
    12.                 val=cur+1
    13.             end if
    14.             if cur and 1
    15.                 val=val shl 4
    16.             end if
    17.             disp=(cur*3)/2
    18.             load var word from 512+disp
    19.             var=var or val
    20.             store word var at 512+disp
    21.             store word var at 10*512+disp
    22.             cur=cur+1
    23.         end repeat
    24.     end if
    25. }
    ?

    2) Жесточайший хардкодинг. Имена структур, константы... ничего нет (за исключением пары мелочей). Есть куча чисел. Помимо того, что нечитабельно... А что если у пользователя bootimage содержит, например, поле BPB_Media равным F8? Тогда будет собрана невалидная FAT. К тому же, почему мне, как пользователю, нужно задумываться, как заполнять поля BPB, если я хочу вписать свой загрузочный код? В Вашем варианте надо не просто задуматься, но ещё и разобрать Ваши (трудночитабельные) макросы, чтобы проверить, а нет ли противоречий между пользовательским BPB и Вашим кодом. В моём варианте о BPB задумываться не нужно: пользователь просто пишет код, который будет вставлен в загрузочный сектор. Об остальном заботятся макросы.

    3) Сторонние инклуды должны минимизировать побочные эффекты в случае их подключения. В качестве примера: при подключении моей инклуды пользователь не может использовать макрос directory за пределами области между строками floppy_image и endfi. Т.е. даже если пользователь перед подключением моей инклуды определил в своём коде макрос directory, то за пределами определения образа он может использовать этот макрос в значении, которое он определил, а не в том, которым Вы перекрыли его в своей инклуде. Директива fix вообще без крайней необходимости не есть хороший тон (нет, об этом нигде не сказано, это только ИМХО).

    Весь код смотрится подозрительно. :) Особенно разбор длинных имён. Но на данный момент у меня совсем нет времени аргументировать... даже отвечаю, сидя на паре по статистике.
     
  8. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Вот уже универсальный, проверенный и обкатанный вариант. Для создания образа дискетки нужен только fasm.
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    NoName
    Универсальный? Не смешите. Ничего не умеет, никак не модифицируется, исходный код жёстко завязан на приложенный бинарник.
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    l_inc
    А я особо не стремился сделать код читабельным. Мне в нем ориентироваться не сложно. Про отступы комментировать не буду. Что касается констант, тут вы правы, но мне на момент написания так было проще. Лучше оцените удобство описания структуры диска и качество формируемого образа.
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Кстати я сразу сказал, что представленный здесь вариант более высокоуровневый, чем мой. Чего только стоят мои короткие имена типа "NAME EXT", хотя после пары рассмотренных примеров даже обычные пользователи, далекие от понимания структуры FAT, могут сделать несложную корректировку "скрипта" под свои нужды. Вот один из таких примеров.
    Код (Text):
    1. include "mkfloppy.inc"
    2.  
    3. format binary as "ima"
    4.  
    5. defdir root {
    6. dent io______sys,"IO      SYS",FA_ARC+FA_SYS+FA_HID+FA_RO
    7. dent autoexecbat,"AUTOEXECBAT",FA_ARC
    8. dent config__sys,"CONFIG  SYS",FA_ARC
    9. dent setramd_bat,"SETRAMD BAT",FA_ARC
    10. dent readme__txt,"README  TXT",FA_ARC
    11. dent findramdexe,"FINDRAMDEXE",FA_ARC
    12. dent ramdrivesys,"RAMDRIVESYS",FA_ARC
    13. dent aspi4dossys,"ASPI4DOSSYS",FA_ARC
    14. dent btcdrom_sys,"BTCDROM SYS",FA_ARC
    15. dent aspicd__sys,"ASPICD  SYS",FA_ARC
    16. dent btdosm__sys,"BTDOSM  SYS",FA_ARC
    17. dent aspi2dossys,"ASPI2DOSSYS",FA_ARC
    18. dent aspi8dossys,"ASPI8DOSSYS",FA_ARC
    19. dent aspi8u2_sys,"ASPI8U2 SYS",FA_ARC
    20. dent flashpt_sys,"FLASHPT SYS",FA_ARC
    21. dent extract_exe,"EXTRACT EXE",FA_ARC
    22. dent fdisk___exe,"FDISK   EXE",FA_ARC
    23. dent drvspacebin,"DRVSPACEBIN",FA_ARC
    24. dent command_com,"COMMAND COM",FA_ARC
    25. dent himem___sys,"HIMEM   SYS",FA_ARC
    26. dent oakcdromsys,"OAKCDROMSYS",FA_ARC
    27. dent ebd_____cab,"EBD     CAB",FA_ARC
    28. dent display_sys,"DISPLAY SYS",FA_ARC
    29. dent country_sys,"COUNTRY SYS",FA_ARC
    30. dent ega3____cpi,"EGA3    CPI",FA_ARC
    31. dent mode____com,"MODE    COM",FA_ARC
    32. dent msdos___sys,"MSDOS   SYS",FA_ARC+FA_SYS+FA_HID+FA_RO
    33. dent ebd_____sys,"EBD     SYS",FA_ARC+FA_SYS+FA_HID+FA_RO
    34. dent gcdrom__sys,"GCDROM  SYS",FA_ARC
    35. dent bcdw_cl_com,"BCDW_CL COM",FA_ARC
    36. dent fdemuoffcom,"FDEMUOFFCOM",FA_ARC
    37. dent keyb____com,"KEYB    COM",FA_ARC
    38. dent keybrd3_sys,"KEYBRD3 SYS",FA_ARC
    39. }
    40.  
    41. orgimage "bootcode.bin"
    42.  
    43. stof io______sys,"content/io.sys"
    44. stof autoexecbat,"4bcdw/autoexec.bat"
    45. stof config__sys,"4bcdw/config.sys"
    46. stof setramd_bat,"content/setramd.bat"
    47. stof readme__txt,"content/readme.txt"
    48. stof findramdexe,"content/findramd.exe"
    49. stof ramdrivesys,"content/ramdrive.sys"
    50. stof aspi4dossys,"content/aspi4dos.sys"
    51. stof btcdrom_sys,"content/btcdrom.sys"
    52. stof aspicd__sys,"content/aspicd.sys"
    53. stof btdosm__sys,"content/btdosm.sys"
    54. stof aspi2dossys,"content/aspi2dos.sys"
    55. stof aspi8dossys,"content/aspi8dos.sys"
    56. stof aspi8u2_sys,"content/aspi8u2.sys"
    57. stof flashpt_sys,"content/flashpt.sys"
    58. stof extract_exe,"content/extract.exe"
    59. stof fdisk___exe,"content/fdisk.exe"
    60. stof drvspacebin,"content/drvspace.bin"
    61. stof command_com,"content/command.com"
    62. stof himem___sys,"content/himem.sys"
    63. stof oakcdromsys,"content/oakcdrom.sys"
    64. stof ebd_____cab,"content/ebd.cab"
    65. stof display_sys,"content/display.sys"
    66. stof country_sys,"content/country.sys"
    67. stof ega3____cpi,"content/ega3.cpi"
    68. stof mode____com,"content/mode.com"
    69. stof msdos___sys,"content/msdos.sys"
    70. stof ebd_____sys,"content/ebd.sys"
    71. stof gcdrom__sys,"4bcdw/gcdrom.sys"
    72. stof bcdw_cl_com,"4bcdw/bcdw_cl.com"
    73. stof fdemuoffcom,"4bcdw/fdemuoff.com"
    74. stof keyb____com,"4bcdw/keyb.com"
    75. stof keybrd3_sys,"4bcdw/keybrd3.sys"
    76.  
    77. finimage 0
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Phantom_84
    Некоторые из замечаний в #7 вполне можно отнести к удобству/качеству.

    Помимо прочего, честно говоря, я так и не понял, каким образом необходимость описывать отдельно файловые данные и отдельно файловые записи даёт гибкость в размещении. Порядок записей о файлах может отличаться от порядка данных? ИМХО абсолютно бесполезно... я бы ещё сомневался, если бы можно было указывать кластеры, в которых размещать тот или иной файл, но это очередной геморрой на голову составителя образа. Если я правильно понимаю, для директорий необходимо вообще по три макроса использовать: (defdir + dent/lent + stod/orgdir).

    Ну не нравится мне идея пользовательского загрузочного сектора в виде отдельного бинарника: отдельно компилировать, проверять соответствие остальному образу. Неудобно. Когда я писал свой вариант, это было одним из пунктов, которые надо было во что бы то ни стало избежать.

    Слишком много условностей. Все и не упомнить:
    1) макрос root нужно создать до вызова orgimage.
    2) пустые папки требуют тройного определения так же, как и заполненные.
    3) По сути вытекает из предыдущего, но требует дополнительного внимания. Там, где написал FA_DIR, там надо не забыть сделать именно stod, а не stof. И наоборот. Если директорию abc описал в директории bcd через defdir, то не дай Бог сделать потом что-то в духе stod abc, root.
    4) stod (store directory) сохраняет директори в ранее описанную (т.е. куда). stof (store file) сохраняет файл из файла на хостовой системе (т.е. откуда). Неудачно выбранный синтаксис. В результате легко можно перепутать родительскую директорию с дочерней.
    5) Что бы Вы про "обычных пользователей" не говорили, а я постоянно забывал то сделать буквы большими в именах, то имя файла перед расширением до восьми символов доравнять.

    Во многих из перечисленных случаев шаг влево, шаг вправо — образ невалидный.

    Ну и в конце концов сравните варианты описания одного и того же:
    Код (Text):
    1. include 'floppy.inc'
    2. floppy_image bootCode, root
    3.     cd "C:\fasm\BootLoad"
    4.     directory root,\
    5.                 windows,,\
    6.                 "bootload.bin",,\
    7.                 "floppy.asm", "source.txt",\
    8.                 "C:\empty.bin", "empty"
    9.     cd "C:\windows\"
    10.     directory windows,\
    11.                 system32,"system",\
    12.                 temp,,\
    13.                 "system32\taskmgr.exe"
    14.     directory system32,\
    15.                 "notepad.exe","click_me.exe"
    16. endfi
    и
    Код (Text):
    1. include "mkfloppy.inc"
    2. defdir root
    3. {
    4.     dent windows,"WINDOWS",FA_DIR
    5.     dent bootload,"BOOTLOADBIN",FA_ARC
    6.     dent floppy,"SOURCE  TXT",FA_ARC
    7.     dent empty,"EMPTY   BIN",FA_ARC
    8. }
    9.  
    10. orgimage "bootstub.bin"
    11.     defdir windows
    12.     {
    13.         dent system32,"SYSTEM",FA_DIR
    14.         dent temp,"TEMP",FA_DIR
    15.         dent taskmgr,"TASKMGR EXE",FA_ARC
    16.     }
    17.     defdir system32
    18.     {
    19.         dent notepad,"CLICK_MEEXE",FA_ARC
    20.     }
    21.     defdir temp {}
    22.  
    23.     stod windows,root
    24.     stod system32,windows
    25.     stod temp,windows
    26.     stof bootload,"C:\fasm\BootLoad\bootload.bin"
    27.     stof floppy,"C:\fasm\BootLoad\floppy.asm"
    28.     stof empty,"Z:\empty.bin"
    29.     stof taskmgr,"C:\windows\system32\taskmgr.exe"
    30.     stof notepad,"C:\windows\notepad.exe"
    31. finimage 0
    Ясно, что разница в высокоуровневости, но Вы ведь и спрашивали об удобстве. :)

    Ну и под конец можно что-то хорошее сказать. :) У Вас я вижу два преимущества: поддержка длинных имён и возможность задавать произвольные атрибуты. Обе возможности могут быть довольно быстро реализованы и у меня без потери удобства.
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Может быть полезным разместить файл/каталог первым в области файловых данных или размещать файлы/каталоги в нужном порядке, вне зависимости от их положения в структуре каталогов.

    В найденной вами теме это предельно понятно описано. defdir и stod - это альтернатива orgdir/findir (последний вариант - это фактически просто раскрытый макрос stod, когда содержимое каталога описывается в области файловых данных между orgdir и findir).

    Писать bpb поверх пользовательского кода не сложно. Но я к примеру в своем загрузчике для флоппика использую сокращенный bpb. Получается, если писать все, то мой код будет разрушен. А если писать только основное, то для других загрузчиков bpb будет прописан не полностью. Вообще флоппик для меня - это особый случай - я ввел поддержку только для формата 2x80x18 (загрузчик, драйвер устройства), написал средство для создания соответствующих образов и забыл про флоппик, как про страшный сон (утрирую конечно). Кстати из-за вашего шаманства с бутсектором я так и не смог собрать образ, хотя перепробовал большинство из представленных здесь примеров. Может нужна какая-нибудь из последних версий fasm'а?

    В последней версии есть readme.txt. Единственное, из-за чего может действительно возникнуть проблема, так это использование уже задействованных имен в качестве идентификаторов. Кстати я спрятал размещение каталога root в макросе orgimage только в последней версии. Долго сомневался на этот счет. Хотел даже для FAT1x вводить спец. макрос для размещения именно корня. От резервирования имени скорее всего тоже не трудно избавиться, но это все автор-специфичные вещи. В mkisofs.inc для одного из объектов ФС я резервирую еще идентификатор boot.

    Не спорю, мой вариант не рассчитан на противодействие ошибкам "от дурака". Его назначение - делать качественный образ на основе правильно написанного "скрипта".

    Ну и на том спасибо :)

    p.s. Содержимое всех каталогов (при использовании defdir и stod) лучше описывать до orgimage (см. readme.txt) - можно в любом порядке.
     
  14. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    p.p.s.
    Код (Text):
    1. rb (777+(33-2))*512-$ ; 777 - номер стартового кластера
    2. stof fileid,"content/file.txt"
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Phantom_84
    Ну у меня это тоже возможно... Правда, только если файл/каталог в корневой директории. Могу представить только один случай, когда это может быть нужно.
    Не улавливаю пользы.
    Я вроде как и показал, что разобрался, представив аналогичную структуру в Ваших макросах. Неудачно слеши поставил, но сути это не меняет, т.к. требуется трижды работать с каждой директорией: описание её файловой записи, описание её структуры, сохранение её данных (ну 2,5 раза в случае orgdir/findir).

    А никто и не говорил, что надо писать поверх. В моих макросах проблема решена.

    Т.е. Вы предлагаете держать перед собой постоянно readme.txt? :) Это даже ещё хуже, чем постоянно следить за соблюдением упомянутых условностей, просто запомнив их. Кстати, пытался я readme.txt использовать. Без "найденной мной темы" вряд ли бы мне удалось на одном этом readme.txt более-менее быстро разобраться, как построить образ.

    Эм... мой тоже далеко не от всех ошибок защищает. Но Ваши макросы не просто не продиводействует ошибкам, они их поощрают избыточностью синтаксиса... ИМХО.

    :) Ну что Вы как маленький? Стянуть с оффсайта меньше метра последней версии и проверить, заработает ли, — поторы-две минуты времени.
    Никакого шаманства с бутсектором у меня нет. Дело совсем не в нём. А то, что директива rept работает с нечисловыми параметрами только начиная с версии 1.69, — известный факт. У совсем старых версий может быть проблема при использовании dup с нечисловым параметром.
    В любом случае пара очевидных корректировок заставят скомпилироваться образ и на более старых версиях. Но признаю, следовало упомянуть о требованиях к версии. Хотя я не очень понимаю людей, которые сидят на версиях многолетней давности open-source программ размером в несколько сотен килобайт.

    Ну это даже не смешно. С тем же успехом можно сделать include 'floppy.inc' с моими макросами, после чего весь образ описать в директивах db. При этом невозмутимо утверждать, что макросы поддерживают любые навороты, вот только защита "от дурака" у них не очень.
     
  16. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Спорить у кого дискета круче это уже перебор.
     
  17. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    NoName
    :) Phantom_84 попросил оценить его макросы. Стандартный процесс оценивания в формате вопрос-ответ (наезд-встречный наезд :)).
     
  18. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я также просил оценить качество образа. Лучше иметь более низкоуровневый синтаксис, но при этом делать качественные образы, чем иметь высокоуровневый синтаксис, но при этом делать кривые образы.

    Мог бы этого не делать, но все-таки дам наводку. Условия тестирования: один единственный файл ненулевого размера в корневом каталоге. Результат тестирования: парамтры bpb совпадают, таблицы FAT совпадают, однако в "вашем" образе образ файла находится не на своем месте. В "моем" образе смещение 0x4200, в "вашем" - 0x6600. Что скажете?

    Кстати ваше средство так и не позволило мне прикрутить мой загрузочный код к образу. Судя по выдаваемой fasm'ом ошибке, не хватает места в бутсекторе, хотя когда я говорил про возможность использовать сокращенный bpb, вы ответили, что в ваших макросах проблема решена.
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Phantom_84
    Ну знаете ли прежде чем делать грязные намёки имеет смысл получить подтверждение своей аргументации. И мне вообще непонятно Ваше понятие качества. Здесь есть только два варианта: валидный образ и невалидный. В первом случае ни о каком качестве речи нет, т.к. это естесственное поведение. Во втором случае не имеет смысла говорить об образе, какое уж там качество...

    Дам наводку. :) Образ файла на своём месте и параметры BPB не совпадают.

    Разумеется, решена. Только не проблема раздутых до невозможности кодов загрузочного сектора. Код можно увеличить и до таких размеров, что он только без bpb влезет в первый сектор. Что тогда построят Ваши макросы? Неужели опять валидную FAT? В общем, какие-то ограничения должны быть. Т.к. Ваши макросы вообще не строят BPB в случае пользовательского кода, это позволяет более гибкую настройку. Но это не преимущество Ваших макросов, это преимущество их отсутствия.

    Ну и раз пошла такая пьянка, дам и я Вам наводку насчёт кривости. Не подскажете код простейшего полноценного пустого образа с дефолтным загрузочным сектором в Ваших макросах? :)
     
  20. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я свой косяк готов признать. Хотя мой ли он? "jmp word" всегда делал то, что от него собственно и требовалось!

    Вы, видимо, нет. Мне что исходник и образ приложить. Или вы будете отказываться даже от своих исходников.