Гибридный электронный диск для ПРК ОРИОН
Привет всем поклонникам Ориона :)
Родилась у меня идейка скрафтить т.н. гибридный Электронный Диск (далее - ЭД), тобишь это будут совмещённые "в одном флаконе" ROM- и RAM-диски в виде небольшой платки, которая подключается в стандартный порт #F5 ROM-диска ПРК "Орион". Идея родилась исходя из завалявшихся с древних времён комплектующих и реальной потребности в таковом устройстве. Возможно, кого-то тоже заинтересует такой девайс для своего Ориона.
Итак, по порядку. Часть, отвечающая за ROM-диск. Здесь я упёрся в нехватку стандартных 64 Кб, а в хозяйстве уже 15 лет валяется ПЗУ AM27C040 (512К x 8).
Итого получается объём в восемь раз больше максимального стандартного ROM-диска. Были мысли сделать больше (1 Мб), но прикинув, понял, что ни к чему. Прикидка простая: средний размер софтинки для Ориона грубо считаем 2 Кб, максимальное кол-во файлов на диске - 255, т.е. как раз и получается 2x256=512 Кб. Большее кол-во файлов потребует серьёзное изменение ОС, дополнительный объём ОЗУ для каталога, да и физически проматывать список из более 200 файлов - это заморочка. В связи с тем, что на самом деле 64 Кб "немного" не хватает для полного счастья, 8-кратное его увеличение - это "вообще щастье"!
Часть, отвечающая за RAM-диск. Здесь ноги идеи растут из привычных и "вполне достаточных для счастья" 780 Кб ГМД, а также имеющихся в наличии (и, что немаловажно, ныне ещё доступных для покупки!) микросхем статического ОЗУ CY7C1049D-10VXI (512K x 8). За "щастье" беру ориентир на 1 Мб, т.е. на две такие микросхемы. Дело в том, что доступ к RAM-диску будет не "туполинейный" (а-ля ORDOS-стайл, все файлы друг за дружкой, без FAT), а будет кластерная организация, т.е. каталог + FAT + кластеры. Также две микросхемы ОЗУ не превышают "болевой порог" по цене, их дешифрация достаточно проста, габариты и потребление (в режиме хранения) в самых разумных пределах.
Далее. Интерфейс должен быть стандартный от ROM-диска Ориона, т.е. это три 8-битных линии ВВ55'ой + питание. Опционально потребуется "дежурный" микромощный источник питания для хранения данных RAM-диска. Без этой опции информация будет сохраняться при выключении питания ПРК с помощью 3-вольтовой батарейки типа CR2032.
Также с "точки зрения" загрузчика программы "Монитор" девайс должен видится как стандартный ROM-диск Ориона, а доступ к расширенным "фишкам" осуществляться через имеющиеся линии порта.
В результате некоторого мыслительного процесса родилась следующая схемка:
http://denn.ru/8bit/orion/128/e-disk/e-disk.jpg
Девайс имеет четыре режима:
1). Чтение данных из ROM-диска;
2). Чтение данных из RAM-диска;
3). Запись данных в RAM-диск;
4). Z-состояние (режим StandBy: микропотребления, если это кого-то сегодня волнует :))
Выбор режима осуществляется записью соответствующего значения в старшие разряды шины адреса (линии C7 и C8 порта Ориона). "Украденные" на управление режимом старшие адресные линии, а также линии виртуального адреса (совсем старшие линии адреса, которые нужны для доступа свыше 64 Кб) берутся из 6-ти младших линий и защёлкиваются триггером ТМ9. Защёлкивание производится по фронту при переходе в режим Z-состояния (StandBy). Сброс защёлки осуществляется сигналом RESET от ПРК (дополнительная линия на порт - B9), либо сделать RC-цепочку начального сброса от питания (ещё не определился, как лучше).
При старте ПРК, загрузчик программы монитор читает данные по младшим адресам, т.о. автоматом девайс будет в режиме чтения данных из ROM-диска. Т.о. при oldschool-доступе, первые 16 Кб ROM-диска читаются без проблем, что позволит загрузить ОС и необходимый драйвер, который будет поддерживать работу с гибридным ЭД в полном объёме.
Для гарантии сохранения информации во время переходных процессов подачи/снятия питания применена микросхема контроллера SRAM - DS1210. Она при уменьшении питающего напряжения ниже 4,75в моментально переводит вход CE ОЗУ в лог."1", т.о. запись в м-сх блокируется.
Если интересно, то можно обсудить. Проект пока ещё только на бумаге, но в ближайших планах воплотить его в железе :)
Программная поддержка RAM-диска ЭД
Программная поддержка RAM-диска ЭД:
Код:
; *** Процедуры работы с RAM-диском ЭД ***
; (C) Denn /St.-Petersburg/, 05.08.2016
; Порт ROM/RAM-диска:
PT_CFG:EQU 0F503H
PT_ADR:EQU 0F501H
PT_DAT:EQU 0F500H
PT_KBD:EQU 0F402H; порт банка ROM/RAM и CE RAM-диска
LDRAMD:
; Чтение блока из RAM-диска
; Вх: [A]-номер банка в RAM-диске (0..15), [HL]-а/н блока в RAM-диске,
; [DE]-а/н буфера загрузки блока, [BC]-длина блока
ANI 0FH; защита блока выбора режима ЭД
; включить режим "RD RAM"
ORI 80H; режим "01" + выбор банка
STA PT_ADR+1
LDA PT_KBD
ORI 04H
STA PT_KBD
XRI 06H; = XRI 04h & ORI 02h
STA PT_KBD
LDRAM0:
SHLD PT_ADR
INX H
DCX B
LDA PT_DAT
STAX D
INX D
MOV A,C
ORA B
JNZ LDRAM0
ROM_ON:
; Вкл. режима "RD ROM"
LDA PT_KBD
ORI 06H
XRI 06H
STA PT_KBD
; сброс банка на нулевой (для доступности ROM-диска после HW-RESET)
XRA A
SVBANK:
STA PT_ADR+1
LDA PT_KBD
ORI 04H
STA PT_KBD
XRI 04H
STA PT_KBD
RET
SVRAMD:
; Запись блока в RAM-диск
; Вх: [A]-номер банка в RAM-диске (0..15), [HL]-а/н блока в RAM-диске,
; [DE]-а/н буфера записываемого блока, [BC]-длина блока
ANI 0FH; защита блока выбора режима ЭД
; включить режим "WR RAM"
ORI 40H; режим "10" + выбор банка
CALL SVBANK
; перепрограммируем порт на запись данных
MVI A,80H
STA PT_CFG
SVRAM0:
; выставляем адрес и байт данных
SHLD PT_ADR
LDAX D
STA PT_DAT
; импульс записи байта в RAM-диск
; бит C1: CS_RAM "0" -> "1" -> "0"
LDA PT_KBD
ORI 02H
STA PT_KBD
XRI 02H
INX D
INX H
DCX B
STA PT_KBD
MOV A,C
ORA B
JNZ SVRAM0
; перепрограммируем порт на чтение данных
MVI A,90H
STA PT_CFG
; Вкл. режима "RD ROM", банк 0
JMP ROM_ON
END
Некоторые пояснения. Работа с RAM-диском предполагается не в т.н. линейном, а в кластерном варианте, т.е. ПО заранее рассчитывает целевой кластер (номер банка и адрес блока внутри банка). Т.о. считается, что при чтении/записи блока мы не выйдем за границу банка, в противном случае, в данном варианте процедур произойдёт "заворачивание" адреса на начало текущего банка. Этот момент должен контролировать программист самостоятельно.
В конце каждой процедуры делается перевод ЭД в режим "RD ROM" и выборка нулевого банка. Это делается потому, что режим ЭД переключается программно и аппаратный сброс его не меняет (не сбрасывает на ROM-диск), а загрузчик ПЗУ "Монитора" не "знает" ничего про банки и ЭД, и соответственно не сможет загрузиться с ROM-диска, если его режим будет в каком-то произвольном состоянии.
При использовании блоков данных (кластеров) размером 256 байт процедуры обмена можно ощутимо "ускорить", что и сделано в реализации под DSDOS.
П.С. Немного цифр. Копирование 35 файлов суммарным объёмом около 64 Кб с RAM-диска на квазидиск, с процессором ВМ80 (CLK=2,5МГц) у меня занимает 13 секунд. Для сравнения, на этой же системе копирование этих же файлов с ROM-диска в квазидиск происходит за 9,8 секунд. Оптимизацию кода вполне можно считать успешной :)