О флэш контроллере SD-контроллер от vinxru Орион-128

Флэшка в Орионе 128

Продаю платы и наборы микросхем, куплю микросхемы Продаю печатные платы ПК Ори сериион-128

О флэш контроллере SD-контроллер от vinxru

Я (от автора статьи) не собирал флэш-контроллер от vinxru и имею смутное представление о нём. Могу ошибаться, но из прочтения форумов на эту тему у меня сложилось мнение, что контроллер является закрытым для сторонних программ устройством. Разработка состоит из двух частей - из собственно контроллера, обеспечивающего доступ к micro-SD с файловой системой FAT16 и программы-оболочки типа Нортон для управления файлами в кодах КР580.

Таким образом это устройство заменяет только магнитофон (и даже не полностью, т.к не является эмулятором магнитофона). Конечно, запускать игры удобно и это устройство вполне устраивает тех, кому надо только посмотреть старое ПО и затем поставить ретро-компьютер на полку. В условиях когда запись на micro-SD невозможна (хотя другие подобные изделия это могут) такое решение наилучшее.

Но даже, если бы запись была возможна, для тех, кто более серьёзно пользуется компьютером, у данной концепции есть недостатки. Для магнитофонных программ более правильным был бы эмулятор магнитофона, так, как это сделано в эмуляторах.

Если речь идёт о низкоуровневой эмуляции магнитофона, т.е обслуживании контроллером самого МГ-входа и выхода (т.е контроле и управлении сигналов прямо на ножке ППА), то я считаю, что это не очень полезная и намного более сложная в реализации затея. Во-первых, есть разные форматы, например, MSX-двухчастотка, РК-двухфазка, а в ZX-Spectrum для защиты от пиратства применяются и более хитрые форматы.

Если цифровой МГ не будет хранить данные в WAV-формате, а декодировать принятые данные в байты и хранить их уже в виде кодов, то можно сделать цифровой магнитофон пригодный только для РК86 и близких по МГ-формату компьютеров. Владельцам ZX такое устройство не подойдёт. А вот хранение записей в WAV формате полностью заменит обычный магнитофон, хотя цифровой магнитофон проще купить в магазине, а цифровой диктофон есть в любом телефоне. Однако WAV-формат неудобен, т.к при этом скорость обмена та же, как с реальным магнитофоном (составляет всего 200 байт в секунду), тогда как эмулятор магнитофона работает мгновенно.

Более простой программный эмулятор магнитофона на базе внешнего привода устроен так. Пользователь выбирает файл или маркирует группу файлов в файловой панели, а затем по выходе из оболочки на вектор ПЗУ-шной подпрограммы F806 вешается побайтовая процедура чтения из открытого и считанного в буфер файла, причём к файлу вначале и, если надо и в конце, добавляются байты, которые входят в МГ-формат данного компьютера (в случае РК и ОРИОНА это пилот-тон в 256 нулевых байтов, затем синхробайт Е6, нач.адрес в формате старший, младший, затем сам файл, после блока файла следуют два нуля и КС блока). Впрочем, проще хранить данные прямо в МГ-формате, используя, например, простейший алгоритм для сжатия повторяющихся байтов (если пилотон сжать в 3 байта, то служ.байтов от МГ-формата всего десяток).

А на вектор F80F тоже вешает обработчик вызовов. В случае, если ещё нет открытого на запись файла, то при первом вызове F80F начинается процедура ожидания пилот-тона с поиском синхробайта. После обнаружения факта выдачи на F80F синхробайта, считываются 4 байта адресов (начальный и конечный) и, для запроса имени записываемого файла, открывается окно. После ввода имени файла управление возвращается программе вызвавшей F80F, и все последующие вызовы F80F до тех пор пока не будет получено указанное в заголовке число байтов, передают байты в буфер. После передачи указанного числа байтов, файл автоматически закрывается и пишется на диск, а вывод завершающих 5 байтов в блочке КС игнорируется. Если на вывод выведено меньшее число байтов, чем заказано, то в эмуляторах критерием конца записи файла является пауза в вызовах F80F длительностью более 2-3 секунд (меньшее время помешает записи/чтению с ленты многоблочных программ).

Но ввод и вывод с магнитофона по сути нужен только двум программам - бейсику и текстовому редактору. Если не учитывать многоблочные программы, то для обычных файлов способ попадания кода в ОЗУ вообще не важен и применённая концепция намного удобнее, чем возня с командной строкой в которой набирается директива для МГ-ввода. Для текстового редактора можно обойтись загрузкой блока в буфер, т.к любой редактор РК имеет запрос NEW?

Но и для бейсика и для текстового редактора уже с 1993 существует дисковое решение - это дисководные верcии текстовых редакторов и бейсика-плюс для РК-ДОС. Получается, что имея дисковод с РК-ДОС магнитофон вообще низачем не нужен.

Потому я считаю, что вместо мало кому интересной разработки эмулятора магнитофона, стоило бы сделать на порядок более простую работу. А именно, обеспечить программистский интерфейс для доступа к micro-SD как к обычному приводу с посекторным обменом. Для этого надо ввести всего несколько функций - чтение сектора размером в 512 байт и запись такого сектора на micro-SD.

Адресацию по диску можно сделать традиционную - через указание номера трека и номера сектора. Для этого даже не нужны как в DOS отдельные функции типа "установка N трека" и "установка N сектора". Можно просто указывать трек и сектор в регистрах при вызове процедур чтения/записи сектора. А можно использовать сплошную адресацию по типу LBA в винчестере, когда просто задаётся порядковый номер сектора в парном регистре (т.е адресация максимум до 65535 секторов по 512 байт и максимум в 32 мб, чего для дисков 8-ми разрядок более, чем достаточно). Хотя все DOS работают с секторами и треками, но пересчёт в LBA это всего десяток команд процессора, что не существенно усложнит BIOS в DOS 8-ми разрядки.

Высокоуровневый формат micro-SD не важен. Он может оставаться FAT16 или можно использовать низкоуровневый доступ, т.е micro-SD без файлового формата, когда напрямую читаются/пишутся сектора с заданным номером. Удобнее для считывания и записи на PC и в телефоне сохранить формат FAT16.

Если остаётся формат FAT16, то для организации дисков для конкретной дискеты создаются файлы образы дисков (которые могут иметь, например, расширение DSK). С помощью функции "выбор диска" выбираем какой-либо файл. После чего все обращения на чтение/запись выполняются с этим файлом. Например, если вызвана операция чтения сектора номер 100, то из файла в буфер читается 512 байт с отступом в 512*100 байтов от начала файла.

Например, для дисков оригинальной РК-ДОС создаются файлы образы размером в 400 кб (для чуть изменённой РК-ДОС размер диска может быть до 8*0.5*255= 1020 кб. Это максимальный размер, который возможен в РК-ДОС (т.к в одном байте VTOC таблицы занятости описывающем один трек можно описать лишь 8 секторов, а число треков ограничено в 255, хотя это макс.число треков при желании можно изменить).

Для CP/M диски могут быть намного большего размера, но для удобства в силу отсутствия подкаталогов неудобны диски с размером более 2 мб.

Для меня неинтересен контроллер от vinxru, даже с записью. Мне нужен именно контроллер внешнего привода. Совсем неважно как устроен этот привод, реальный он или на базе излишнего ОЗУ компьютера. Нужны лишь процедуры записи и чтения сектора с указанным номером. Модификация имеющихся DOS для 8-ми разрядки простейшая, в них убираются имеющиеся процедуры работы с физическим носителем и вставляется десяток команд вызывающих процедуру контроллера. Таким образом контроллер работает как аппаратно-программный драйвер DOS.

На базе флэш-памяти можно сделать также устройства с побайтовым обменом. Тогда имеющиеся DOS даже не надо модифицировать. Например, и для РК и для ОРИОНА есть версии RK-DOS, CP/M и других DOS в которых в качестве привода А использован эл.диск из излишнего ОЗУ. Интерфейс происходит всего двумя подпрограммами - чтение и запись байта из излишнего ОЗУ - F836 и F839. Программе без разницы откуда и как берётся и куда записывается байт. Потому эти DOS для работы на флэш даже не требуется модифицировать (чуть-чуть модифицируется лишь ПЗУ, чтобы п/п-ммы F836/39 работали иначе).

Т.к реально 8-ми разрядки используют дополнительное банковое ОЗУ только для целей эл.диска, то контроллер с побайтовым обменом эквивалентен, т.е заменяет, расширение ОЗУ на большой объём.

Например, если к ОРИОНУ с всего двумя банками РУ5-тых подключить флэш-карту и все обращения по F836/39 выше, чем в банку N1 переадресовывать во внешний носитель (а флэш-память это как раз быстрый носитель), то программа будет считать, что это ОРИОН, который имеет 256 банок памяти по 64 кб. В ORDOS достаточно забить одну команду, а вместо родного ПЗУ поставить соответствующе модифицированное и получится ORDOS с 255 квазидисков (реально лишь 26, для большего не хватит букв латинского алфавита для названия дисков).

Естественно побайтовый обмен с флэш-памятью не работает побайтово, а буферизуется. В реальности байты читаются/пишутся подряд. Потому при первом обращении в буфер считывается целый сектор и чтение последующих байтов происходит без повторного обращения к флэш, а до достижения адресацией конца сектора байты читаются из буфера

Вот такое устройство контроллера флэш-памяти для 8-ми разрядок решает все проблемы 8-ми разрядок, заменяя дисковод и винчестер и позволяет использовать и сохраняет всё имеющееся ПО без переделок, а если есть побайтовый обмен, то и заменяет расширение ОЗУ. А текущий вариант контроллера от vinxru не решает ни магнитофонных ни дисководных проблем, а может использоваться лишь для запуска игр. Сообщение alemorf Ср Дек 19 2018, 17:50

6
Ну дак оно так и работает. В память, по любому адресу, загружается маленький драйвер (SDBIOS). У драйвера есть множество команд, вот, например:

Открыть файл (A=2, D=0, HL=имя файла / A=код ошибки)
Установить позицию чтения записи файла (A=3, B=режим, DE:HL=позиция / A=код ошибки, DE:HL=позиция) (С начала B=0, с текущего положения B=1, с конца B=2)
Прочитать из файла (A=4, HL=размер, DE=адрес / A=код ошибки, HL=сколько загрузили)
Записать в файл (A=5, HL=размер, DE=адрес / A=код ошибки)

Что бы вызвать команду надо заполнить соответствующие регистры и сделать CALL этого драйвера. Драйвер - простейшая штука, просто выдает в параллельный 8-битные код эти команды. Можно и порт писать.

---

Протокол открытый, описанный:
alemorf. ru/comps/specialist_lin/sd.html

---

Например:

; Выбираем образ диска
mvi a, 2
lxi hl, disk_name
call 0C800h

; Устанавливаем сектор
mvi a, 3
lxi hl, 120 // Сектор + дорожка + сторона
lxi de, 0
call 0C800h

; Закписываем сектор
mvi a, 5
lxi hl, 256 // Размер сектора
lxi de, buffer
call 0C800h

disk_name: .db "disk1.dsk";

---

Я кстати CPM к этому драйверу подключал.

 

Автор под псевдонимом, источник  https://ruecm.forum2x2.ru/

Доработки и схемы прочие... непроверенные

 

 

Купить платы на Орион ПРО, классический Орион, Орион Восточный Экспресс 512, наборы микросхем на Орион-128, КР565РУ5В, КР565ру7В, к565ру5г AU, к565ру7г Au в позолоте к1818вг93, Z80, куплю микросхемы

 

Полезные и интересные статьи

На предыдущую страницу  На главную страницу  На следующую страницу