После некоторого перерыва, возвращаюсь к разработке. Даю отчет о проделанной работе.
Итак, что сделано.
1. Полностью собрал схему контроллера. Она получилась на удивление простой - Мега32, 9 резисторов, 1 конденсатор, 1 светодиод, регулятор напряжения LM317, ну и разъемы. От корвета к плате идут 16 проводков, из них 2 - питание и земля.
2. Написал программу для контроллера. Она умеет заливать в корвет загрузчики 1 и 2 фазы, разбирается с файловой системой FAT на карте SD, ну и рудиментарно эмулирует пресловутое API, которое мы тут так долго обсуждали. Пока реализовано только 2 операции - чтение и запись логических секторов, и только для одного образа диска. Доделывать API дальше я не вижу смысла без реализации клиентской части.
3. Написал загрузчик 1 фазы, тот, который 256 байт. Он заливается в nvram и оттуда грузится в корвет при старте. Его единственная задача - получить и запустить загрузчик 2 фазы. Для расширения функциональности я добавил туда возможность выбора файла для загрузки. Работает это так. По умолчанию грузится с карты файл loader.bin - это загрузчик CP/M, как мы тут ранее и обсуждали. Если же во время тестов ОПТС нажать и удерживать одну из кнопок 0-7 на клавиатуре, то вместо loader.bin будет загруже файл ROMn.BIN, n-нажатая кнопка. Это позволяет, например, загрузить КТДП, если положить его на карту, обозвать ROM0.BIN, и при старте удерживать кнопку 0.
4. Написал загрузчик 2 фазы. Его цель - получить из смонтированного образа диска А системные дорожки, разместить их в памяти, и передать управление на точку входа биоса BOOT. Этот загрузчик уже взаимодействует с контроллером через дисковое API. Адрес точки входа, адрес загрузки, размер системной области и прочие параметры загрузчик берет из инфосектора диска.
В результате, после муторной отладки получилась вполне достойная вещь. Система уже функционирует полностью и грузит CP/M с образа KDI, записанного на карту. Но на этом и все. Сама CP/M, естественно, функционировать нормально не может, так как биос ничего не знает о дисковом APIЕсли подключен дисковод - начинает работать с реальным дисководом как с диском А. Если не подключен - просто виснет.
Итак, железо готово, и программная поддержка API в контроллере имеется и более-менее отлажена. Теперь, для полного функционирования системы, надо написать BIOS, который имел бы в себе драйвер эмулируемых дисков.
Я тут, пока писал загрузчики, попрограммировал немного на ассемблере 8080. Блин, это АД и П#$%ец. Регистров всего 7, большинство операций требует аккумулятор, обрабатывается всего 8 бит за раз... Простейшая операция 16-разрядного деления превращается в монстра на полэкрана. Видимо, я уже зажрался современными процессорами. А ведь в конце 80-х, собрав свой первый РК-86, я много писал на этом ассемблере.
Вообщем, надо браться за биос. Не очень прятная работа, но хорошее упражнение для мозгов. Только с силами соберусь. Проблема еще и в том, что отлаживать его придется почти вслепую - поди пойми, что там, внутри корвета, виснет... Я предполагаю делать это так:
1. Выбрать из имющихся исходных текстов тот, который можно собрать ассемблером на PC.
2. Собрать целиком образ системных дорожек из исходников, и загрузить их в корвет, чтобы убедиться, что все собралось правильно.
3. Потихонечку добавить в исходники биоса свой драйвер эмулируемых дисков.
4. Собрать новый образ системных дорожек, уже с моим биосом, и начать муторную отладку.
Кстати, непоянтно еще, чем эти исходники собирать. Для Z80 есть отличный кроссасемблер Z80asm. Но все исходники биосов идут в нотации Intel (которую я терпеть не могу), а вот чем транслировать такой код (под линуксом, естественно) я пока толком не нашел. Только всякие странные полуживые проекты.
Тут ESL предлагал другой путь - взять готовый биос, напихать в дырку между биосом и буфером каталога свой код, и попроавить указатели в биосе на наши функции. Тоже хороший вариант. Только вот я теперь сомневаюсь, что весь код влезет в дыру меньше килобайта. У меня загрузчик второй фазы почти полкило весит, а он устроен гораздо проще, чем биос.
Ну или, может быть, кто-нибудь соберет себе такой же контроллер, да поможет мне с написанием кода? На вставной макетке сделать его можно меньше чем за час, а паять только провода к разъемам придется.
Ну, ладно. Прилагаю архив с исходниками. Туда же положил принципиальную схему моего варианта устройства. Понятно, что реализовать схему можно как угодно, необязательно точно так, как у меня. Например, регулятор напряжения LM317 (делающий 3.3v для СД-карты) некоторые заменяют просто парой диодов. Ну и так далее.
Надеюсь, кого-нибудь это все же заинтересует и я не зря старался.




Если подключен дисковод - начинает работать с реальным дисководом как с диском А. Если не подключен - просто виснет.
Ответить с цитированием