7 / 382
Версия для печати
DivMMC на мелкой логике для компьютера «Байт»
DivMMC - (если говорить простым языком) это устройство, позволяющее ZX-Spectrum работать с системой esxDOS, загружаемой с SD-карты, эмулирующее Beta Disk Interface и загрузку данных с ленты.
С историей создания операционной системы esxDOS и DivMMC можно ознакомиться по ссылке: https://www.spectrumforeveryone.com/features/history-esxdos-divmmc-divmmc-enjoy/
Изначально DivMMC создавался как конструкция на ПЛИС. Однако некоторое время назад AlexEKB на основе логики работы DivMMC сделал вариант на корпусах мелкой логики. Этот вариант DivMMC несколько отличается от «классического» в сторону упрощения: нет возможности перепрошивки ПЗУ DivMMC Спектрумом и не реализован бит 6 (mapram - подмена ПЗУ на страницу ОЗУ) порта #E3.
Описываемая в этой статье конструкция основана на разработке от AlexEKB и адаптирована под системный разъём компьютера «Байт».
DivMMC для компьютера «Байт»
DivMMC для компьютера «Байт»
Описание работы схемы
Тактирование DivMMC осуществляется частотой 7МГц. Частота 14МГц с генератора на транзисторе VT1 делится на 2 на триггере DD10.1, после чего получаются два сигнала частотой 7МГц - CLK_7M и CLK_7M, в противофазе друг к другу.
При работе DivMMV ПЗУ компьютера отключается сигналом ROMCS, и в его адресное пространство #0000-#3FFF включается ПЗУ DD1 (в адреса #0000-#1FFF) и ОЗУ DD4 (в адреса #2000-#3FFF).
DivMMC сделан таким образом, чтобы запуститься не сразу при включении компьютера, а только при первом «сбросе» после включения. Для этого, во-первых, постоянная RC-цепочки R6C4 (20K + 47 мкФ), формирующей сигнал RST_DIVMMC выбрана заведомо больше, чем у RC-цепочки (8,2K + 47 мкФ), формирующей сигнал RESET компьютера «Байт». Таким образом, при включении компьютер запускается раньше, чем снимается сигнал RST_DIVMMC.
Во-вторых, на DD7 и DD11 сделана схема формирования сигнала TRIG_DIV. Этот сигнал используется для активизации DivMMC при первом сбросе после включения компьютера.
При включении компьютера формируется отрицательный импульс RST_DIVMMC (цепочка R6C4). Этот импульс сбрасывает триггер DD11.1 и формирует сигнал TRIG_DIV=1, не дающий DivMMC запуститься в момент включения.
При первом после включении сбросе компьютер выполняет команду по адресу #0000. При CLK7M=1 включается та «половинка» ПЗУ DD1, которая используется для перехвата точек входа в DivMMC. При TRIG_DIV=1 из ПЗУ читается байт, записанный по адресу #C000. Значение этого байта - #BD (%10111101). Бит 1 - это сигнал DIV_SW. Его значение равно 0, оно фиксируется регистром DD3 и попадает на DD7.4. Так как при этом мы всё ещё выполняем команду в ПЗУ, то на выходе DD7.2 появится лог.0 (сигналы C7_RD + M1 + CPU0 будут в лог.0 при выполнении команды из ПЗУ), после чего на выходе DD7.4 тоже появится лог.0, который заставит «перекинуться» триггер DD11.1 в противоположное значение (с 1 в 0), после чего сигнал TRIG_DIV переключится в 0 и включит «нижнюю» часть ПЗУ DD1, где расположена прошивка DivMMC. Заодно низкий уровень TRIG_DIV переключит DIVMMC_ACT в лог.0, что приведёт ко включению DivMMC и отключению внутреннего ПЗУ компьютера. Не забываем, что всё это происходит в тот момент, когда процессор выполняет команду по адресу #0000! В результате начнёт выполняться прошивка DivMMC с адреса #0000, и вы на экране увидите загрузочное меню DivMMC.
При дальнейшей работе компьютера сигнал DIV_SW неактивен. И даже при сбросе кнопкой RESET триггер DD11.1 не изменит своего состояния, сигнал TRIG_DIV останется в лог.1, и компьютер осуществит как обычно сброс в Basic.
Регистр DD14 служит для записи номера банка статического ОЗУ DivMMC (задаётся битами 0-5 порта #E3).
Сдвигающий регистр DD16 (74HC595N) служит для чтения байта с SD-карты (порт #EB). Сигнал MISO_SD с карты имеет уровень 3,3В, однако его, как правило, достаточно для нормальной работы 74HC595, пусть и на пределе.
Сдвигающий регистр DD17 (КР1533ИР9) служит для записи байта на SD-карту (порт #EB).
Регистр DD12 (74HC595N) формирует 8-импульсные пачки для тактирования SD-карты.
SD-карта питается напряжением 3,3В от стабилизатора DA1. При этом входные и выходные уровни сигналов карты тоже являются 3,3-вольтовыми. Чтобы «привести» подаваемые на карту 5-вольтовые сигналы (CS_SD0, MOSI_SD, CLK_SD) к 3,3-вольтовому уровню используются делители напряжения на диодах VD5-VD11.
Кнопка «NMI» работает только когда DivMMC неактивен.
Кнопка «Reset» просто дублирует аналогичную кнопку на корпусе компьютера.
ПЗУ
ПЗУ используется в двух режимах - хранение прошивки DivMMC и перехват точек входа для DivMMC. Режим работы ПЗУ (прошивка/перехват) определяется фазой (уровнем) сигнала CLK_7M.
При CLK_7M=0 включаются «нижние» 32К ПЗУ, где расположена прошивка DivMMC. Содержимое ПЗУ при этом доступно по адресам #0000-#1FFF.
При CLK_7M=1 включаются «верхние» 32К ПЗУ, которые используются для перехвата точек входа для DivMMC и для дешифрации портов DivMMC.
Соответственно, значение выходных сигналов ПЗУ «запоминается» в регистрах DD2 (для режима работы в качестве прошивки DivMMC) и DD3 (для режима работы в качестве перехвата точек входа и выборки портов).
Выбор сигналов для перехвата точек входа и адресации портов происходит следующим образом: при CLK_7M=1 происходит дешифрация сигналов в ПЗУ, затем при спаде сигнала CLK_7M содержимое ПЗУ фиксируется в регистре DD3 сигналом CLK_7M, который в это же время меняет уровень с 0 до 1.
Аналогичным образом происходит фиксация байта данных в режиме работы ПЗУ в качестве прошивки для DivMMC: при CLK_7M=0 происходит выбор байта данных из ПЗУ, затем при смене сигнала CLK_7M с 0 до 1 содержимое ПЗУ фиксируется в регистре DD2 сигналом CLK_7M, который в это же время меняет уровень с 1 до 0.
Выдача зафиксированного в DD2 байта на шину данных происходит по сигналу ROM_RD, который вырабатывается при чтении из области CPU0 и при включенном DivMMC (DIVMMC_ACT = 0).
ОЗУ
DivMMC в своей работе использует собственное ОЗУ (минимально требуемый объём - 128КБ, можно не «гнаться» за установкой ОЗУ большего объёма - эта лишняя память по сути не будет использоваться).
Содержимое ОЗУ «подставляется» в адресное пространство #2000-#3FFF при низком уровне сигнала DIVMMC_ACT (то есть при включенном DivMMC). ОЗУ «разбито» на банки памяти объёмом по 8КБ.
Объём ОЗУ DivMMC может составлять от 128 до 512КБ. Плата позволяет установить ОЗУ объёмом 128КБ (при этом микросхема 61c1024 устанавливается на место DD4.2), 256КБ (при этом две микросхемы 61c1024 устанавливаются на места DD4.1 и DD4.2), либо 512КБ (при этом микросхема AS6C4008 устанавливается на место DD4). Объём ОЗУ выбирается перемычкой JP7 (RAM_TYP_SEL). Положение перемычки для разных объёмов ОЗУ указано на печатной плате DivMMC рядом с самой перемычкой.
Точки входа
Инициализация DivMMC происходит при первом после включении компьютера сбросе (при последующих нажатиях RESET компьютер «сбрасывается» в обычный Basic-48). Кроме того её можно принудительно запустить выполнив RESET с зажатой кнопкой «пробел».
Адреса точек входа:
#0000 - START - сюда мы попадаем при сбросе компьютера;
#0008 - ERROR-1 - обработчик ошибок;
#0038 - MASK-INT - обработчик маскируемого прерывания (по приходу сигнала INT);
#0066 - RESET - обработчик немаскируемого прерывания (NMI);
#04C6 - SA-BYTES - подпрограмма записи данных на ленту;
#0562 - LD-BYTES - подпрограмма загрузки данных с ленты;
#3D00-#3DFF - диапазон адресов для эмуляции TR-DOS.
При выполнении команды по любому из этих адресов происходит включение DivMMC, который перехватывает управление на себя.
Кнопка NMI с зажатым пробелом вызывает файловое меню (при инициализированном DivMMC).
Ограничения
DivMMC требователен к содержимому прошивки ПЗУ с Basic-48. На «модифицированных» прошивках работа DivMMC не гарантируется. Однако с компьютером «Байт», несмотря на изменённую по сравнению с оригинальным Basic-48 прошивку ПЗУ, DivMMC работает нормально.
Этот вариант DivMMC не будет работать на «турбированных» ZX-Spectrum - не хватает быстродействия ПЗУ DD1.
Эмуляция TR-DOS работает корректно только для программ, использующих стандартные точки входа в TR-DOS. Загрузчики, обращающиеся напрямую к портам ВГ93, не будут работать.
Расширение ОЗУ компьютера «Байт» до 128К и дополнительные опции платы
Кроме DivMMC на этой плате расположена схема расширения ОЗУ для компьютера «Байт» до 128К с музыкальным сопроцессором. Схема расширения ОЗУ работает отдельно от DivMMC и никак с ним не связана. Если вам не нужна расширенная память компьютера, вы можете не паять эту часть схемы (микросхемы DD20, DD21, DD22, DD24, DD25).
Схема расширения ОЗУ аналогична применяющейся в контроллерах дисковода BZ128 и в «новодельном» BDI. Инструкции по увеличению объёма ОЗУ компьютера «Байт» до 128К и описание работы схемы расширения смотрите в соответствующих разделах сайта по ссылкам выше.
ПЗУ DD19 является опциональным и необязательно к установке. При необходимости оно может использоваться для замены внутренного ПЗУ компьютера «Байт» на другое (например, на оригинальный Basic-48). Технически можно, конечно, использовать ПЗУ объёмом 32КБ с Меню-128, однако для нормальной работы DivMMC Меню-128 не требуется, поэтому в момент сброса DivMMC «перехватывает» управление на себя и переключает банк ПЗУ в Basic-48 путём установки бита 4 порта #7FFD в 1. Однако процедура «перехвата» и смены страницы ПЗУ при сбросе не всегда корректно работает, из-за чего могут быть глюки. Поэтому использование ПЗУ с Меню-128 не рекомендуется. Кроме того в качестве DD19 можно использовать ПЗУ с тестами памяти для диагностики неисправностей ОЗУ компьютера.
Перемычки платы
JP1 (DIVMMC_OFF) - принудительное отключение DivMMC. При установленной перемычке DivMMC не будет включаться ни при каких обстоятельствах.
JP2-JP6 - определяют конфигурацию работы ПЗУ DD19. Возможны четыре варианта работы ПЗУ компьютера «Байт» с платой DivMMC:
- Вариант 1: используется ПЗУ компьютера «Байт» (объём ОЗУ компьютера неважен), при этом ПЗУ DD19 не ставится. Устанавливаем перемычку JP5, остальные снимаем:
- Вариант 2: компьютер «Байт» имеет 48К ОЗУ, схема расширения ОЗУ до 128К не используется, но вы хотите использовать внешнее ПЗУ DD19 (используется ПЗУ объёмом 16К и ниже) для работы. Для этого устанавливаем перемычки JP3, JP4, JP6, остальные снимаем:
- Вариант 3: компьютер «Байт» имеет 128К ОЗУ, вы хотите использовать прошивку ПЗУ 32КБ с Menu-128. Для этого устанавливаем перемычки JP2, JP4, JP6, остальные снимаем:
- Вариант 4: вам нужно тестовое ПЗУ (27c16, например), объём ОЗУ компьютера «Байт» не имеет значения. Для этого используйте положение перемычек как для варианта №2:
Способ установки 24-выводного ПЗУ в 28-выводную панельку смотрите в разделе сайта с тестами памяти.
JP7 (RAM_TYP_SEL) - выбор объёма установленного в плату DivMMC статического ОЗУ. Положение перемычки для разных объёмов ОЗУ указано на печатной плате DivMMC рядом с самой перемычкой:
Особенности сборки и наладки
В случае неустойчивой работы ПЗУ DD1 (когда установлена слишком «медленная» микросхема) можно понизить частоту генератора (но не ниже 8МГц).
Работа DivMMC мной проверялась с микросхемами ПЗУ Winbond W27C512-45 и SST 27C512-15. Эти микросхемы ПЗУ работали нормально, понижения частоты генератора не требовалось.
С некоторыми экземплярами 74HC595N (особенно «грешат» этим «перемаркированные» чипы с Aliexpress) не получается сформировать пакеты по 8 импульсов (это делается микросхемой DD12) для работы с SD-картой. В этом случае придётся подбирать нормально работающий экземпляр микросхемы.
Пакет из 8 импульсов (сигнал CLK_SD) в момент обращения к SD-карте должен выглядеть примерно так:
Несколько пакетов из 8 импульсов при старте DivMMC и попытке загрузить систему с SD-карты:
В моём случае микросхема DD3 (КР1533ИР23) не всегда корректно выдавала управляющие сигналы, в результате чего при работе в Basic-48 компьютер иногда вёл себя странно (самопроизвольно появлялись символы вопроса, если долгое время не трогать клавиатуру):
Проблема решилась заменой микросхемы на серию К555.
Работа с DivMMC
Этот раздел страницы ни в коей мере не претендует на полноту описания работы с системой esxDOS, а просто описывает минимум действий, чтобы убедиться в работоспособности подключенной к компьютеру «Байт» платы DivMMC.
В первую очередь вы должны подготовить SD-карту с системой esxDOS. При инициализации DivMMC система будет загружаться с этой карты. Для этого на отформатированную в FAT32 карту помещаем содержимое архива с системой esxDOS (ссылка в конце этой статьи).
Вставляем SD-карту в DivMMC и включаем компьютер. Инициализация DivMMC происходит при первом после включения «сбросе» компьютера. Это может выглядеть приблизительно так:
После завершения инициализации компьютер «сбрасывается». Это нормально, т.е. так задумано.
Кроме того инициализацию можно выполнить принудительно сделав RESET с зажатой кнопкой «пробел». Процесс инициализации будет точно такой же, как на видео выше.
После успешной инициализации DivMMC вы можете его использовать. Например, нажав кнопку NMI на плате DivMMC совместно с зажатой кнопкой «пробел» вы попадёте в файловое меню системы esxDOS (то же самое произойдёт если вы в Basic-48 выполните компанду «.browse»):
В файловом меню вы можете с SD-карты выбрать tap, trd, z80, sna файл и загрузить его. При этом процесс загрузки с ленты или с BDI эмулируется DivMMC.
Например, в вышеприведенном архиве с esxDOS можно запустить тест ОЗУ на плате DivMMC (в папке PROGS/DIVRAMKA.TAP):
Вы можете записать на SD-карту нужные вам программы и запускать их.
Карта портов DivMMC
| Биты |
Адрес |
Режим |
Описание |
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
#E3 (227dec) | Write | Control Register |
| 1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
#E7 (231dec) | Write | Порт выбора SD-карты |
| 1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
#EB (235dec) | Read/Write | SPI-port |
Серым цветом выделены биты, по которым производится дешифрация адреса.
Порты DivMMC никак не конфликтуют с портами компьютера «Байт», поэтому никаких доработок компьютера не требуется.
Порт #E3 (Control Register)
Биты 0-5 - № банка ОЗУ DivMMC, доступного в адресном пространстве #2000-#3FFF;
Бит 6 (mapram) - подмена ПЗУ на страницу ОЗУ (в текущей реализации DivMMC этот бит не используется);
Бит 7 - принудительное включение DivMMC:
0 - DivMMC работает в обычном режиме;
1 - DivMMC принудительно включен.
Порт #E7
бит 0 - выбор SD-карты №1 (0 - карта выбрана, 1 - карта неактивна);
бит 1 - выбор SD-карты №2 (0 - карта выбрана, 1 - карта неактивна). В текущей реализации DivMMC используется только одна карта №1.
Порт #EB (SPI-port)
В режиме чтения из него берётся байт данных с активной SD-карты;
В режиме записи из порта посылается байт данных на активную в SD-карту.
Карта портов расширения ОЗУ компьютера «Байт» до 128К
| Биты |
Адрес |
Режим |
Описание |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
#7FFD (32765dec) | Write | Порт управления режимом 128К |
| 1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
#BFFD (32765dec) | Write | Порт музыкального сопроцессора |
| 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
#FFFD (32765dec) | R/W | Порт музыкального сопроцессора |
Серым цветом выделены биты, по которым производится дешифрация адреса.
| Схемы и документация по DivMMC |
|
|
esxdos 0.8.9Архив с системой esxDOS 0.8.9 (для записи на SD-карту)
|
|
|
Прошивка ПЗУ DD19 с Меню-128 для компьютера «Байт»В прошивке производится глушение КР580ВИ53 при старте. Использование прошивки с Меню-128 не рекомендуется из-за возможных глюков при инициализации DivMMC
|
|
|
Версия DivMMC от AlexEKBВерсия DivMMC, взятая за основу платы DivMMC для компьютера «Байт»
|
|
|
Версия DivMMC v1.1Версия DivMMC v1.1, описанная в этой статье. Внутри архива схемы, перечень элементов, гербер-файлы
|