Наконец-то я добрался до компьютера - а тут уже столько информации... Даже темы разделились, что меня поначалу сбило с толку.
После некоторго, может быть не до конца вдумчивого, ознакомления с твоими, ESL, рассуждениями, я понял твою идею до конца. Итак. Я предлагал написать собственный универсальный биос, и использовать для работы только его. Ты же предлагаешь пойти более сложным путем - загружать тот биос, что есть на текущем образе диска А, и модифицировать его на ходу, встроив код эмулируемых дисков в дырку перед буфером каталога.
Преимущество твоего метода - мы действительно можем использовать любой биос с любой дискеты. В том числе и микродос, что в моем случае практически невозможно. Недостатки, как я вижу, тут такие.
1. Тебе придется втиснуть весь код в щель размером 762 байта, судя по твоей таблице. Это не так уж и много как может показаться. Но тут будет видно, когда станем писать драйвер эмулируемых дисков.
2. Тебе придется держать во вторичном загрузчике базу всех известных биосов, и идентифицировать загруженный биос по каким-либо признакам - сигнатуре, контрольной сумме, ну или что ты там уже придумал. С учетом того, что если биоса в базе не найдется, придется подставлять резервный, если я правильно понял твою мысль. А если биос идентифицируется неправильно - получим крах системы в самый непредсказуемый момент.
Пока в голову приходит только это, может к утру еще чего придумается. Вроде бы не так уж и много, но вот оно того стоит? Я не ною, и согласен вести разработку по любому пути, если это действительно даст какие-либо преимущества.
Впрочем, наши с тобой методы можно и скомбинировать - и свои биос сделать, и встраивалку в чужие. Тем более что ты уже берешься за этот этап работы. Единственная тонкость - это убедиться, что в биосе там действительно дыра. Уж больно странная она. Беглый взгляд показал, что внутри лежат огрызки кода, в молодости бывшие куском явно какого-то отладчика. По крайней мере, все ссылки из этого кода ведут в младшие юзерские адреса типа E00. Твой эксперимент с заполнением области константой меня почти убедил, но я завтра попробую и сам, ты уж не обижайся. В идеале - попробую доработать отладчик эмулятора, чтобы срабатывал точкой останова на обращение к данным на указанном участке памяти.
Далее. Ты предлагаешь перехватывать вызовы только 2 подпрограмм - чтения сектора и записи сектора. Сразу говорю, что этого мало. Как минимум SELDSK работает с дискетой напрямую, да и еще кое-где я видел обращение и к флопу, и к регистру выбора устройства. Или мне так только показалось? Вообщем, тут путь один - раскопать дисковую подсистему одного биоса полностью, до последнего байта. Я биос особо плотно не копал, меня больше BDOS интересовал. Теперь, похоже, пора заняться. Вот на выходных, на даче, и займусь.
Ладно, это дело не самого близкого будущего. Нам до биоса пока далеко как пешком до китая. Я для себя наметил такой план.
1. Добываю SD-гнездо и на следующей неделе подключаю к меге SD-карту. Разбираюсь с ее протоколом, с драйвером vfat, учусь читать файлы.
2. Пишу для корвета загрузчик 1 уровня (тот который 256 байт) и поддержку в меге для него. Допаиваю от бокового порта к меге проводки порта С (там их потребуется штук 6, как я прикинул). Разбираюсь с двунаправленным режимом ВВ55 - я раньше с ним никогда не сталкивался, придется разбираться с нуля. В конце должна получиться система, умеющая загружать в корвет произвольный код с SD-карты, тот же КТДП к примеру, и запускать его.
3. Делаю в AVR обработчик запросов, поступающих из корвета через боковой порт. То самое API, про которое мы говорили ранее. Пока хотя бы функции чтения и записи секторов. Всякие там монтирование и прочее можно отложить на самый конец.
Вот после этих трех шагов уже можно будет готовить различные варианты загрузчиков 2 уровня, биосов итд. Я думаю, что это займет пару недель, не меньше, мне же не только корветом заниматься приходитсяНадеюсь на активную помощь от сообщества и в первую очередь ESL как основного генератора идей.
Задача осложняется тем, что все драйвера vfat написаны на С. Мне бы очень не хотелось писать на С задачи реального времени типа начального загрузчика. Можно скомбинировать код на С и ассемблере, но для AVR я такого не делал никогда. Даже не представляю, какие там соглашения о связях, сохранении регистров, стеке итд. Придется разбираться, ну или все писать на С с риском не влезть по времени между стробом адреса и посылкой данных в порт.




Надеюсь на активную помощь от сообщества и в первую очередь ESL как основного генератора идей.
Ответить с цитированием