Проблемы с чтением CF через int13h на некоторых старых BIOS

Описания, советы, ремонт, эксплуатация старых IBM PC-совместимых ПК
Gleb
Member
Сообщения: 165
Зарегистрирован: 30.10.2016,20:46
Откуда: Прага

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение Gleb » 03.08.2020,18:02

Да, архивы с шестеркой бинарно идентичны.

Декремента достаточно, но я подменял int12h не для урезания памяти, а для получения управления еще перед тем, как ДОС начнет подменять int13h.

i8088
Advanced Member
Сообщения: 3057
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение i8088 » 04.08.2020,07:00

Заработала первая версия исправления CF bug со стартом из MBR. В стандартном
DOS MBR оказалось вполне достаточно места для смены векторов прерываний,
загрузки нового int13r в ДОЗУ и декремента размера памяти в 40h:13h. А сам патч
int13h размещается в секторах 2 и 3 первой дорожки.

Для установки патча я написал на Си программу CFI.EXE. Синтаксис:

CFI mb drv - сделать backup оригинального MBR диска drv в файл mbr.bin.
drv - это номер диска в нотации int13h - 80, 81, 82 или 83.

CFI mr drv - восстановить MBR из файла mbr.bin.

И главная опция
CFI ci drv - установить модифицированный MBR и патч int13h.
В одном каталоге с программой должны находиться файлы cfmbr.bin
(модифицированный MBR) и int13r.bin (патч int13h).

ВНИМАНИЕ! Программа написана совсем недавно, возможны ошибки, поэтому не
запускайте ее на диске с важными данными, сделайте копию перед этим. Я пока что
испытал ее с MS-DOS3.3, PC-DOS5.02 и DR-DOS7. CF работали на BIOS-ах AMI 1989г и
AWARD 3.01 с CF багом

Прилагаю программу и исходники


upd. Расскажу еще об одной проблеме (непосредственно с темой не связана). Я часто ставлю DOS
с одного HDD на другой, проходя FDISK/FORMAT/SYS D: с загрузочного HDD с такой же версией DOS.
Обычный DOS не позволяет сделать диск D: активным, если в системе уже есть активный HDD.
Это можно сделать сторонними средствами или позже, загрузившись с floppy. Однако FDISK от DR-DOS
спокойно позволяет сделать это, однако в байт активности раздела вместо 80h пишет номер диска
(в формате int13h), в данном случае 81h. Из дизассемблированного кода MBR очевидно, что это
приведет к сообщению <Invalid Partition Table> и остановке системы, что и происходит.

Решение - просто поменять байт активности раздела на 80h любым удобным способом. В Norton diskedit
можно просто снять флаг активности и взвести его заново, можно использовать PTEDIT (она правда
тяжеловесна и требует 386), можно просто вручную отредактировать MBR.
Вложения
cfbv05.zip
(18.54 КБ) 14 скачиваний

i8088
Advanced Member
Сообщения: 3057
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение i8088 » 04.08.2020,11:23

Проверил новую программу CFI.EXE с MS-DOS 4.01 - заработало нормально.

Один нюанс. Если DOS будет ставится не на целевой машине, то перед созданием раздела и
форматированием нужно убедиться, что в SETUP установлен режим CHS (NORMAL). Дело в том,
что CF даже объемом менее 504MB обычно поддерживают LBA (в отличие от равных по емкости
HDD), и BIOS может включить трансляцию (столкнулся с этим на AWARD, плата LS-486E). В результате
на целевой машине DOS может не загружаться. Или же для установки использовать машину уже без
CF бага, но еще без трансляции. Это большинство 386 (BIOS AMI Hi-Flex и редкий для них AWARD), ранние
486. А если DOS уже стоит, то установить CF_FIX можно и на целевой машине, запустив CFI.EXE с дискеты.

i8088
Advanced Member
Сообщения: 3057
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение i8088 » 04.08.2020,17:52

Внес изменения.

CFI.EXE - мелкие изменения, теоретически улучшающие совместимость с разными BIOS

INT13R.BIN - добавил в конце кода строку INT13R V0.7, чтобы посмотрев bin файл, можно было
сразу понять, что за версия

CFMBR.BIN - переделал код загрузчика, теперь при старте будет выводиться сообщение:
Install CFMBR V0.7 ... Done (Done - если все нормально).
Так сразу видно, установлен загрузчик или нет

Программа и новые исходники приложены.
Вложения
cfiv07.zip
(18.7 КБ) 9 скачиваний

i8088
Advanced Member
Сообщения: 3057
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение i8088 » 05.08.2020,07:09

Хочу спросить совета по одной проблеме.

286 BIOS-сы с CF bug-ом разработаны до появления загрузочных спецификаций, и номера ATA дисков
master/slave 80h и 81h просто жестко закодированы в коде. Те, при установке внешнего ISA контроллера
со своим BIOS (SCSI, MFM 8-bit) и одновременного наличия ATA дисков, у BIOS-а внешнего ISA
контроллера два выбора:

1. Полностью перехватить int13h (кроме FDD части, int40h), тогда с него можно будет загрузиться, но
ATA диски будут недоступны. Так обычно работают 8-bit XT MFM контроллеры.

2. "Встроиться" в штатный int13h, но номера SCSI дисков будут идти после ATA, и загрузиться со SCSI
при наличии ATA невозможно. Так работают обычно SCSI 16-bit контроллеры.

В коде патча int13h я проверяю номера дисков, и управление передается патчу только если обнаружена
команда чтения для дисков с номерами 80h и 81h. С 80h вопросов нет - коль скоро мы уже загружаемся
с CF, и читаем ее MBR, то и номер CF диска однозначно будет 80h. Однако если в системе есть еще и
SCSI, то он получит номер 81h, и патч команды чтения для ATA полностью нарушит работу SCSI системы.
Я проверил, так и есть.

Первоначальною я думал проверять в коде int13h патча адрес исходного обработчика int13h, и если он
не в F_seg, то не делать патч для диска 81h. Однако ведь вполне возможна ситуация, когда в системе
две CF (master/slave) и тогда, даже при наличии SCSI диска, номера 80h и 81h будут все же
соответствовать ATA (CF в данном случае). Соответственно, "отвалится" патч чтения для slave CF.

Я пока только придумал, на случай, если в системе только одна CF и SCSI, ставить специальный
перехватчик int13r.bin, который работает только для диска 80h. Не совсем это удобно, конечно.

Вот измененный кусок кода. Для вышеприведенного случая надо просто поставить константу
MAX_DRV на 80h, для остальных случаев - 81h. Перекомпилировать, заменить int13r.bin в каталоге с
CFI.EXE, и установить патч заново.
=====================================================================
MAX_DRV EQU 80h

CODE SEGMENT PARA PUBLIC 'CODE'
ORG 00h
ASSUME CS:CODE, DS:CODE, ES:CODE, SS:CODE;

START:

bios_addr_off dw ?
bios_addr_seg dw ?

new_int13h proc far
cmp dl, 80h
jb orig_int13h ; floppy, jump to original handler

cmp dl, MAX_DRV ; if disk more than MAX_DRV, jump to original handler
ja orig_int13h

cmp ah, 02h ; chk command, if read command, jump to new handler
je new_read
=====================================================================

i8088
Advanced Member
Сообщения: 3057
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение i8088 » 07.08.2020,17:01

Версия 1.0

INT13R - в конце добавлена строчка MAX_DRV = 80h(или 81h) , чтобы сразу было видно,
для какого количества дисков скомпилирована. Приложены файлы int13r80.bin и int13r81.bin -
нужный нужно переименовать в int13r.bin. В большинстве случаев простых систем с одной CF
использовать int13r80.bin.

CFMBR - сильно оптимизирован код, я изменил и стандартную часть MBR. В результате
код стал более легко читаемым, и размер уменьшился

CFI.EXE - оптимизация
Вложения
cfiv10.zip
(19.98 КБ) 11 скачиваний

i8088
Advanced Member
Сообщения: 3057
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение i8088 » 09.08.2020,07:19

Еще один теоретический вопрос - а будет ли интересено развитие проекта CFMBR, в таком
направлении (CFMBR будет уже его частью)?

Допустим, есть BIOS, где предусмотрены только фиксированные типы, и конечно же нет нужного, а
модификация BIOS по разным причинам нежелательна или невозможна.

Можно предложить добавить автоопределение в MBR (точнее загрузку и исполнение модуля
автоопределения из MBR), формирование новой HDPT уже в RAM, исполнение hdd_param_init и
передача управления загрузчику DOS. DOS после этого примет диск уже с его native params.

Установить DOS в таком случае лучше на другой машине, где есть user type или auto, но если требуется
чистая установка, то:

Берем чистый HDD/CF, ставим на него загрузчик (таблицы разделов пока нет, впрочем, если есть
старая, это не должно помешать). Загружаемся с дискеты, запускаем резидентную программу, которая
сделает то-же, что предполагается делать в загрузчике. После этого обычным порядком размечаем
диск fdisk-ом (удаляем старые разделы, если были), format, sys, итд.

Это только скорее всего не сработает с HDD от Conner Peripherals, они при подаче им команды
INITIALIZE_DEVIZE_PARAMS (что сделает BIOS), запоминают поданную им геометрию, и даже не на сеанс,
а на совсем (неправильная геометрия будет отдаваться по ATA_IDENTIFY и после отключения/включения
питания). Чтобы вернуть правильную геометрию, нужно заново подать INITIALIZE_DEVIZE_PARAMS, но
уже с правильной геометрией.

Скорее всего удастся ограничиться "откусыванием" 1KB, в крайнем случае 2KB от base RAM.

i8088
Advanced Member
Сообщения: 3057
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение i8088 » 09.08.2020,14:12

Хех, обнаружил что AMIDIAG плюет на int12h, и при выходе нагло затирает откушенный кусок памяти!
То же происходит и на штатном BIOS, если поставить Scratch RAM на 2. Просто в этом случае затирается
HDPT, а она не будет нужна до тех пор, пока кому нибудь не понадобится выполнить функцию 09h int13h.

Может быть поможет уменьшение памяти не только в 40h:13h, но и CMOS (штатный BIOS CMOS не
трогает, когда Scratch RAM == 2). Поэтому и я не трогал.

Тем временем, прилагаю весию 1.1. В основном оптимизировал и вычистил int13r от мусора (случайно
попали в него 2 ненужные функции).
Вложения
cfiv11.zip
(19.95 КБ) 10 скачиваний

i8088
Advanced Member
Сообщения: 3057
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Проблемы с чтением CF через int13h на некоторых старых BIOS

Сообщение i8088 » 12.08.2020,16:06

Я доделал первый вариант программы с autodetect-ом (подменой геометрии при исполнении MBR), и
загрузился в AWARD 3.01 с ST3660A (1057/16/63, работает как 1024/16/63), и нескольких CF. Тип в SETUP
можно выставить любой, но надо, чтобы его параметры C/H/S были меньше, чем native params Вашей CF
или HDD (чтобы не было DISK ERROR во время POST). Хорошо подходит тип 1. DOS надо поставить заранее,
на машине, где можно выставить правильную геометрию, а загрузчик можно установить где угодно.
Загружаться ТОЛЬКО с Primary Master! Те не пытайтесь загрузиться например с Secondary master на более
современной машине, если загрузчик стоит! Удалить его можно как обычно - fdisk /mbr. Чтению же
файлов с такого диска (при подключении его как дополнительного, не-загрузочного HDD) на другой
машине загрузчик не мешает, тк не трогает partition table.

В загрузчик добавляется autodetect и исправление CF bug (только для Primary Master!). Потребление
памяти прежнее, 1KB.

Потенциальная проблема может быть, если BIOS не может обработать повышенное количество C/H/S.
С секторами и головками проблема маловероятна, здесь уже постараться надо, чтобы баг сделать:)
А с цилиндрами может быть проблема, если разработчик поленился учесть старшие два бита
регистра CL, это теоретически может быть, если цилиндров более 256. Пока-что я не обнаружил
такой BIOS.

Программа установки - AUTOI.EXE, подобна CFI.EXE. Для установки загрузчика ключ AI
Вложения
autobv14.zip
(19.56 КБ) 10 скачиваний

Ответить