- PVSM.RU - https://www.pvsm.ru -
Многие помнят эту замечательную ПЭВМ. У меня такая появилась, когда мне было 11. Прошло 28 лет и сейчас я решил в порядке хобби сделать устройства расширения, которых мне так не хватало тогда.
В сети я видел несколько вариантов SD загрузчиков для подобных ПЭВМок, мне не нравилось наличие в них микроконтроллеров, хотелось сделать по «винтажной, теплой DIPовой» схемотехнике, именно поэтому я решил делать на отечественной логике «КР1533».
В качестве доп. ОЗУ я применил UT62256. Это единственная импортная микросхема в проекте. Конечно, можно было поставить КР537РУ10 или КР537РУ25А, но во-первых, их бы пришлось ставить не одну, а две (я планировал 4 кБ доп. ОЗУ), а во-вторых UT62256 у меня была, а КР537 не было, и заказывать не хотелось. Поэтому я позволил себе вольность поставить импорт, и тогда пришла идея использовать все 32кБ доп.ОЗУ, со страничным переключением.
Для ПЗУ выбрал КР573РФ5, как раз было две чистых.
Посидев за чашкой чая, я нарисовал вот такую блок-схему.
Здесь микросхема ОЗУ, микросхема ПЗУ, и блок «ПОРТ». Блок «ПОРТ» есть параллельный интерфейс, имеющий 8 входов и 8 выходов. При записи по адресу EFFF, записываемый код выставляется на выходах, а при чтении из этого-же адреса, прочитанное значение соответствует состоянию входов. Три из выходов и один из входов подключены к SD карте через преобразователь уровней.
ОЗУ представлено микросхемой UT62256 и имеет 32кБ памяти. Поскольку диапазон адресов E000-EFFE есть почти 4кБ (4095 байт), то получается 8 страниц, которые выбираются блоком «ПОРТ», битами 1,2 и 3. То есть запись по адресу EFFF приводит к установке страницы в соответствии с этими тремя битами. Также чтение из этого порта показывает какая страница сейчас выбрана (в этих же битах). Итого, мы имеем 32760 байт дополнительного ОЗУ (4095x8стр).
Микросхема ПЗУ есть КР573РФ5. Она подключена в адресное пространство F000-F7FF, и содержит код БСВВ (BIOS), задача этого кода инициализировать SD карту, загрузить с нее OS и передать ей управление.
Соответственно после включения ПЭВМ, набираем в Системном Мониторе GF000 и нажимаем ВК.
В дальнейшем есть идея доработать родное ПЗУ Системного Монитора, для автоматической загрузки OS с SD карты, и ПЭВМ выходит в стандартное приглашение Монитора если загрузка не удалась или была прервана, например, нажатием какой-то клавиши.
Об этом еще подумаю.
Примерно 2-3 часа за компьютером, и я нарисовал в EAGLE следующую схему.
Увеличить [1]
Рисовал опираясь на те микросхемы, которые у меня были. Возможно, что число микросхем логики можно сократить, если использовать другие вентили, но у меня были только такие. И в дальнейшем, я скорее всего оптимизирую схему.
Низкоуровневый разбор схемы…
Сейчас травить плату в домашних условиях у меня возможности нет, и я, взяв кусок фольгированного двухстороннего текстолита, выпилил из него необходимый прямоугольник.
Этот прямоугольник плотно вставлялся в слот «внутренний интерфейс» ПЭВМ, не болтался и не сдвигался. Далее я процарапал контактные площадки с задней и передней сторон. Получилось неплохо. Затем грубая расстановка микросхем и сверлежка отверстий. С лицевой стороны рассверлил крупным сверлом, чтобы выводы микросхем не контактировали с лицевой фольгой. С обратной стороны отцарапал периметр каждого контактного ряда и разделил на контактные площадки.
Следующим этапом поставил все микросхемы (и панельку) и пропаял с обратной стороны. Много времени отнял монтаж, который я вел тонким МГТФом. Вел проводки с обоих сторон, с лицевой подпаивал прямо к ножкам микросхем, с обратной к площадкам.
Когда процесс пайки был окончен, я решил уделить внимание преобразователю уровней сигналов. Дело в том, что SD карта работает с напряжением 3,3в., а микросхемы КР1533АП6 и КР1533ИР22 ТТЛ 5в. Поэтому пришлось сделать небольшую платку переходника, на котором уровни ограничивались стабилитронами.
Сигнал идущий от SD карты к контроллеру я просто подтянул к источнику 3,3в. резистором 10к. Как показала практика, этот сигнал в преобразовании не нуждается.
Хотя в конечном варианте я, наверное, сделаю обратный преобразователь на основе компаратора.
В качестве держателя карты использовал переходник microSD в SD.
В общем, проблем особых в сборке макета не возникло, хотя я боялся, что некоторые из микросхем могут быть неисправны.
Первым делом я проверил работу ОЗУ, записал в область E000-EFFE с помощью директивы «F» Системного Монитора паттерны «AA», «55», «F0» и «0F» и проверил их с помощью директивы «D». Все оказалось в норме.
Далее директивой «M» начал записывать в адрес EFFF разные значения, и смотреть мультиметром изменения на ножках регистра КР1533ИР22, состояния соответствовали записаным кодам. Также при чтении из этого порта в коде содержалась выбранная страница, в соответствии с задуманным, и еще при замыкании MISO сигнала на землю в младшем бите оказывался 0, а при размыкании 1.
Даже было как-то подозрительно, что все микросхемы исправны и монтаж удался без ошибок.
Конечно никаких специальных инструментов для написания программ под КР580ВМ80А у меня не было. Пришлось писать программу в блокноте (notepad), затем переводить в коды вручную.
Создал файл в редакторе под DOS «HIEW» и начал заполнять кодами. Для основы взял свой проект под AVR, в котором имелась стандартная инициализация SD карты. Проект был старый, и в нем не использовалось никакой файловой системы, просто логгер.
Сначала написал низкоуровневую функцию программного интерфейса SPI, а потом высокоуровневую подпрограмму инициализации SD карты.
Получился примерно такой алгоритм…
В подпрограмме инициализации также читался регистр OCR карты, и 2й байт в нем записывался по адресу EFFE. Это было нужно для определения типа карты.
В случае SDSC — 80h, а в случае SDHC — C0h.
Если инициализация не проходила, то выводилось сообщение «ОШИБКА SD КАРТЫ» и затем происходил выход в Монитор без сброса.
Такую БСВВ я конвертировал в WAV и загружал в ПЭВМ через магнитофонный вход, затем отлаживал, правил исходник и снова загружал.
Теперь у меня есть дополнительное ОЗУ, размером 32760 байт, разделенное на 8 страниц. Но как осуществлять переход между страницами? Как программа, выполняющаяся в первой странице, может вызвать подпрограмму, находящуюся в четвертой?
Для решения этой задачи я предусмотрел программные мосты. Мост — это небольшая область в ПЗУ, которая является посредником при передаче управления.
Например, выполняющийся код должен передать управление на страницу номер 3, в адрес E4B5. Тогда, выполняющийся код помещает младшие 12 бит (4B5) в регистровую пару HL процессора, а в старшие четыре бита помещает значение 3 — номер страницы. Теперь в регистровой паре HL записано значение 34B5. И код делает прыжок (JMP) в область ПЗУ, которая называется JMP-Bridge, это просто переход по фиксированному адресу в ПЗУ. Код в этой области извлекает номер страницы из старших битов регистровой пары HL и записывает их в регистр блока «ПОРТ» по адресу EFFF. Теперь в область E000-EFFE отображается третья страница ОЗУ. Программа JMP-Bridge обнуляет четыре старших бита регистровой пары HL и записывает туда «E». Теперь в регистровой паре HL находится уже физический адрес E4B5, и вот на него программа JMP-Bridge передает управление.
Таким образом передается управление между страницами.
Есть мост CALL-Bridge, он нужен для вызова подпрограммы с возвратом, и отличается от JMP-Bridge сохранением текущей страницы в стеке, и обратной процедуры для возврата.
Следующие два моста STA-Bridge и LDA-Bridge. Как следует из названий, первый записывает регистр Аккумулятор по логическому адресу (в HL), а второй читает в этот регистр данные из логического адреса.
Благодаря этим двум мостам, программа исполняющаяся из какой-то страницы, может хранить данные в другой.
Если взглянуть на загрузочный сектор SD карты, то можно заметить, что по адресам 1AC-1D4 расположен текст «Disk error, press any key to restart».
Да, так странно как на фото он выглядит, потому-что кодировка символов Микроши не совпадает с ASCII.
Я решил использовать эту область, что-бы расположить там данные для загрузки ПЭВМ.
Первым делом я поставил код 00 в позицию 1BA, и тем самым урезал запись. Теперь, должно выводиться просто «Disk error» и все. Остальные байты мои. Принцип простой, 6 байт сигнатура «MicrOS», и 4 байта адрес на SD карте начала файла с OS. В БСВВ я записал, после получения загрузочного сектора с SD карты, проверяется сигнатура, и если она есть, то взять 4 следующих байта и использовать в качестве адреса сектора для загрузки OS.
Если сигнатура отсутствует, то выводится сообщение «ОШИБКА ЗАГРУЗКИ OS» и происходит выход в Системный Монитор без сброса.
И вот, наконец-то все, работает. БСВВ написана, но мне еще требуется записать ее в ПЗУ.
А для этого мне нужно отредактировать все адреса вызовов подпрограмм и переходов, так-как в этом процессоре абсолютная адресация. А я писал БСВВ для области 6000-67FF, чтобы грузить в ОЗУ. Но теперь надо поменять все 6xxx на Fxxx.
Кроме того, я в «попаданецких» условиях. Программатор ПЗУ у меня есть, но он старенький, под LPT порт. И нет ни одного компьютера с LPT. Но есть пара Atmega32A, в PDIP40 корпусе и макетная плата. Возможно придется эмулировать LPT с помощью AVR. Но может все обойдется…
На этом, пока, все. Спасибо за внимание! Продолжение следует…
Автор: ZEvS_Poisk
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/staroe-zhelezo/352797
Ссылки в тексте:
[1] Увеличить: https://hsto.org/webt/l4/2y/da/l42yda66s_satrk-1-dclqbqijq.jpeg
[2] Источник: https://habr.com/ru/post/500816/?utm_source=habrahabr&utm_medium=rss&utm_campaign=500816
Нажмите здесь для печати.