В присоединенном файле дизассемблированная прошивка с комментариями.
По поводу формата диска. Все разделы расположены начиная с дорожки 1, разделы выровнены по дорожкам. На нулевой дорожке записаны сектора с описанием геометрии диска и таблицей разделов. Сама прошивка осуществляет поиск по четырём сторонам и первым пяти секторам в дорожке.
Формат сектора описания разделов:
Слово 0 - ключ 052251, по этому значению прошивка считает, что это сектор с описанием разделов. В противном случае ищется следующий сектор.
Слово 1 - 0177757, не используется, назначение не известно;
Слово 2 - 0177377, не используется, назначение не известно;
Слово 3 - 02000, не используется, назначение не известно;
Слово 4 - количество секторов в дорожке на одной сторон;
Слово 5 - количество секторов в дорожке на всех сторонах. Если это слово (слово 5) поделить на слово 4, то получим количество сторон.
Со слова 6 по слово 13, всего восемь слов, это таблица начальных дорожек для разделов с HD0 по HD7.
Со слова 14 по слово 21, всего восемь слов, это таблица размеров разделов в секторах, с HD0 по HD7.
Если раздела нет, то в соответствующих словах записаны нули.
Распределение памяти, используемое прошивкой:
В ОЗУ ЦП используется только ячейка с адресом 0140, так называемый вектор. В нём хранится адрес блока параметров для операций чтения-записи.
Сам блок параметров состоит из пяти слов:
Слово 0 - байт ошибок. 0 - ещё идёт операция, положительный байт - операция завершена успешно, отрицательный байт - произошла ошибка.
Слово 1 - номер начального блока для операции;
Слово 2 - адрес в памяти ОЗУ ЦП;
Слово 3 - количество считываемых/записываемых слов. Положительное значение - чтение, отрицательное - запись. Ноль - запрос объёма раздела.
Слово 4 - номер устройства.
Для реализации запроса объёма тома (SPFUN 373) необходимо в слово 4 записать номер устройства, а в слово 3 - ноль. Ответ будет получен в слове 1.
В ОЗУ ПП сама программа и данные располагаются в области векторов прерываний и используют неиспользуемые ячейки.
0120 - 0171 - там располагается подпрограмма для запуска выполнения операций.
0204 - байт ошибок;
С 0206 по 0257 располагается считанная информация с сектора описания разделов:
0206 - 0177757, не используется, назначение не известно;
0210 - 0177377, не используется, назначение не известно;
0212 - 02000, не используется, назначение не известно;
0214 - количество секторов в дорожке на одной сторон;
0216 - количество секторов в дорожке на всех сторонах. Если это слово (слово 5) поделить на слово 4, то получим количество сторон.
0220 - 0237 - таблица начальных дорожек для разделов с HD0 по HD7;
0240 - 0257 - таблица размеров разделов в секторах, с HD0 по HD7;
0260 - номер блока. Меняется во время операции.
0262 - адрес в ОЗУ ЦП в формате РА. Меняется во время операции.
0264 - количество слов, меняется во время операции.
0266 - размер текущего раздела.
0270 - сохраняется ССП перед операцией. Хотя эта ячейка являетя адресом первой видеостроки, но видеострока невидимая, так что никакого эффекта нет.
0274 - номер устройства * 2, индекс для доступа к таблицам разделов.
0276 - адрес блока параметров в ОЗУ ЦП в формате РА.
Блок с 0344 по 0355 используется для засылки в регистры IDE:
0344 - номер стороны, в регистр 0110002;
0346 - номер дорожки (старший байт), в регистр 0110004;
0350 - номер дорожки (младший байт), в регистр 0110006;
0352 - номер сектора, в регистр 0110010;
0354 - количество секторов, в регистр 0110012.
0356 - если при переводе из номера блока с CHS возникла ошибка, то там -1, иначе 0.
0360-0401 - подпрограмма для запуска начальной инициализации и считывания сектора с описанием разметки. Используется только при первоначальном запуске прошивки.
Таким образом, чтобы прочесть/записать информацию, необходимо сформировать блок параметров из пяти слов. Обязательно очистить байт ошибок. В ячейку 0140 записать адрес этого блока. В ПП вызвать подпрограмму по адресу 0120. Анализировать байт ошибок. Как только он стал ненулевой, то операция завершилась. Отрицательный байт - ошибка, положительный - всё успешно.




Ответить с цитированием