Пишемся в boot sector
Требуется произвести запись в бут сектор дискетки. Без прямого использования int 26h :)
Я так подумал, если можно открыть файл с именем COM1 и писать в порт, то вероятно возможно так же примерно поработать со флоппиком без вызывания прерываний доса/биоса на прямую... Прав ли я?
Народ, есть задача.
Требуется произвести запись в бут сектор дискетки. Без прямого использования int 26h :)
Я так подумал, если можно открыть файл с именем COM1 и писать в порт, то вероятно возможно так же примерно поработать со флоппиком без вызывания прерываний доса/биоса на прямую... Прав ли я?
А почему 26h DOS`а, а не 13h BIOS`а? Можно получить вектор обработчика прерывания и передать на него управление вручную. :)
А почему 26h DOS`а, а не 13h BIOS`а? Можно получить вектор обработчика прерывания и передать на него управление вручную. :)
Дык, [quote]без вызывания прерываний доса/биоса на прямую[/qoute]
Смысл в том, чтобы, например, поработать с флоппиком как с портом, или как с любым файлом. Если такое сделать моно, то соббственно вопрос, какого будет имя файла.
ну, например
open("COM1", O_RDWR);
мы рабоатем с портом. А с флоппиком так моно?
Дык, [quote]без вызывания прерываний доса/биоса на прямую[/qoute]
Смысл в том, чтобы, например, поработать с флоппиком как с портом, или как с любым файлом. Если такое сделать моно, то соббственно вопрос, какого будет имя файла.
ну, например
open("COM1", O_RDWR);
мы рабоатем с портом. А с флоппиком так моно?
Полная ерунда. Конечно нельзя. Твое open как раз использует прерывания и DOS, и BIOS. Поддержка для COM есть и в DOS, и в BIOS. Чтобы обойти эти прерывания, следует программировать контроллер FDD (FDC) на прямую. Советую книжку Кулакова В. "Программирование дисковых подсистем", там все достаточно подробно описано.
Суть решения такова (упрощенно):
- перенаправить прерывания дос для работы с FDD на свой обработчик, обработчик должен лишь устанавливать переменную-флаг.
- включить мотор и выбрать дисковод для работы, инициализировать FDC в режиме DMA
- послать команду рекалибровки (установим при этом на дорожку 0)
- запрограммировать контроллер DMA на передачу 512 байт данных из памяти
- послать команду записи контроллеру
- выключить мотор, восстановить обработчик прерываний DOS
Процедуры посылки команды также есть в приведенной литературе. Следует проверять состояние прерывания на наличие ошибки, а также проверить наличие дискеты в дисководе, чтобы избежать длительного зависания программы. Писать все лучше на ассемблере.
Во вложении есть все необходимое для чтения/записи секторов с адресацией CHS (цилиндр-головка-сектор, 0-79, 0-1, 1-18), общепринятого для FDD. Процедуры корректно реагируют на ошибки и на отсутствие дискеты в дисководе. Есть также оболочка для просмотра содержимого секторов в ASCII формате, клавишей "w" можно записать в сектор ASCII таблицу (0-255 с повторами). Содержит также процедуры для вывода на экран(оптимизированные). Данный часть кода легко изменить на свой (для записи бут-сектора).