Итак, очередной этап разработки готов к тестированию. На этот раз мы имеем 2 крупных изменения.
В биосе формируется таблица из 4 слов, содержащих адрес поля DRVMASK каждого из 4 DPB. Еще раз подчеркиваю - указатели показывают именно на байт с маской, а не начало официального DPB (CPMTxx).
В вызов SELDSK добавлен вариант C=FE. При этом в HL возвращается адрес этой таблицы. Теперь mount берет адреса DPB именно из этого вызова. Если он нарвется на старый биос, не поддерживающий это расширение, то в HL вернется признак ошибки 0000, и mount об этом скажет.
Также я обучил mount работать через bdos GETVER, и для microdos он теперь показывает только 2 диска. Проверить я этого пока не могу - нужен патч на микродос.
Второе изменение касается идеи ESL о mount-диске. Я хорошо подумал, и добавил в BIOS еще один диск с параметрами, идентичными рамдиску, и тоже прошитыми в биос намертво. Теперь рамдиск переехал на F, а на E монтируется образ EXRTOOLS.DSK, лежащий в корне карты (ну или прямо в каталоге extrom эмулятора). Расширение DSK я использовал потому, что это совсем не KDI файл. Он не имеет ни инфосектора, ни системных дорожек, а сразу начинается с каталога, и имеет размер 144К. Его параметры, как и для рамдиска, жестко забиты в биос, и перемонтировать его невозможно. Сейчас диск доступен для чтения-записи, в будущем запись надо отключить, во избежании разрушения информации на нем. И сделать через API включение разрешения записи для возможности обновления содержимого диска. На диск можно положить mount, pip, stat, ну и что там еще бывает часто нужно. С микродосом, как я понимаю, такой вариант не пройдет - там невозможно добавить еще один DPB. Там придется или пожертвовать рамдиском, или что-нибудь еще придумать.
Соответственно, контроллер и эмулятор обучены корректно обрабатывать вызовы с DRV=4. Патчи для эмулятора я прикладываю, прошивка контроллера будет завтра - что-то после недельного отдыха мой корвет сглючил, надо его подремонтировать.
ESL. Тебе придется сделать следующие изменения в биосах (в моем биосе все уже изменено, можешь прямо брать оттуда куски кода):
1. Создать таблицу адресов масок, как я в начале написал. У меня в биосе она называется DRVMASKTBL. Для CP/M эти поля физически существуют в блоках DPB. Для микродоса создавай такую же таблицу, но из 2 слов (поскольку в системе только 2 диска), и реально использоваться там будет только слово для B, поскольку А всегда эмулируемый. Оно должно также указывать на адрес байта, в который mount будет записывать маску, а тебе в вызовах READ и WRITE придется ее проверять. И обнулить при старте системы.
2. В вызове SELDSK при C=FE вернуть адрес этой таблицы в HL.
3. В вызове READ и WRITE перенести проверку на рамдиск с DRV==4 на DRV==5. А при 4 принудительно перейти к обработке эмулируемых дисков, поскольку диск E не может быть физическим.
4. Создать в биосе еще одну таблицу DPB, эквивалентную таблице рамдиска. Также создать для этого диска 18-байтовый массив распределения ALV, и головную таблицу DPH, поставив ссылку из нее на DPB и ALV.
5. В таблицу списка устройств DRVTAB внести адрес созданной DPH в позицию E, а то, что там было раньше, перенести на позицию F.
Вот вроде и все. В архиве прикладываю патчи для эмулятора, новый BIOS, новый mount, и EXRTOOLS.DSK - образ диска E. Его надо положить в корень карты, а в эмуляторе - в каталог EXTROM.
Теперь насчет предложения заставить mount проверять наличие контроллера FDC и при его отсутствии не давать монтировать физические диски. Идея отличная. Только, как думаешь, можно ли из прикладной программы срать в порты FDC? Не нарушит ли это работу биоса? Вроде бы не должно. Завтра починю корвет, а потом добавлю это в mount.




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