PDA

Просмотр полной версии : Новый старый квазидиск



Improver
18.07.2018, 12:54
Нашёл тут в форуме интересную тему: Квазидиск | Контроллер дисковода (Кишинев): 2016 (http://zx-pk.ru/threads/26139-kvazidisk-kontroller-diskovoda-(kishinev)-2016.html), там artyr_n воссоздал кишенёвскую схему/плату квазидиска (за что ему отдельное спасибо), и меня это сподвигло сделать тот же квазидиск, но на современных чипах памяти. По работе он не должен отличатся от классического кишенёвского квазидиска. Вот что получилось в первом приближении:
65769

Архив со схемой: 65770
Всё сделано чисто на логике, никаких ПЛИСов, никакой прошивки или наладки, по идее, не требуется. Ориентируясь на схему квазидиска из Вектор-Юзера №18, заменил триггеры ТМ2 на ТМ9, что сократило число микросхем. Также получилось избавится от ПЗУ-хи, немного сократить число чипов в обвязке. Но нужно ещё тщательно проверить схему, в том числе на задержки в чипах, поэтому прошу знающих людей посмотреть/покритиковать/предложить... :)

Комбодевайс, конечно, хорошая разработка, но такой вариант квазидиска, мне кажется, тоже будет интересен. И, кстати, его можно будет развить до "RAM-картриджа" -- микросхемки памяти потребляют немного, достаточно будет дать им питание через диодную развязку от старого телефонного аккумулятора и данные при отключении они терять не будут. Можно ещё его разделить на две платы -- контроллер и память с батарейкой, горячей замены, конечно, не будет, но менять память после выключения это позволит более просто.

------------------------------------------------------
Последний вариант схемы + разводка платы (проверено -- всё работает). (https://zx-pk.ru/threads/29342-novyj-staryj-kvazidisk.html?p=996956&viewfull=1#post996956)

svofski
18.07.2018, 16:44
ЗПВВ и ЧТВВ точно не перепутаны?
БЛК кажется висит в воздухе?

Improver
18.07.2018, 17:23
ЗПВВ и ЧТВВ точно не перепутаны?Да, это я явно перепутал, линию надо к ЗПВВ провести, спасибо.

БЛК кажется висит в воздухе?Ещё один этот косяк не заметил... :) Оттуда должна линия идти на вывод 6 Д2 и выводы 2 и 14 дешифратора U2.

Меня ещё вот озадачил такой момент: в исходной схеме квазидиска на линии CAS в качестве буфера стоят последовательно два элемента микросхемы ЛА3, время задержки на ней по даташиту на включение 15 нс, на выключение 22 нс, итого будет 37 нс. По адресным линиям ШАП стоят элементы ЛП5 с задержкой 30 нс, соответственно получается, что сигнал CAS задерживается на 7 нс относительно ШАП. Я же, в погоне за сокращением корпусов ИМС, заменил буфер на линии CAS, и теперь там задержка такая же, как и на ШАП. Насколько это будет критично для работы? Есть ли на реальном Векторе задержка подачи CAS после ШАП? И может лучше заменить и буферы в ШАП, например на К555АП6, там задержка всего 10 нс, но разница тогда составит 20 нс?

svofski
18.07.2018, 18:04
Я могу только сказать, что мне пришлось подвигать туда-сюда моменты захвата ШАП, причем для RAS и CAS отдельно. Поскольку часть из этого — издержки синхронизации (тут сигнал захватили на два такта позже, поэтому у этой шины возьмем состояние с трех тактов назад итд), мой опыт вряд ли можно напрямую перевести в дискретную схему. Лучше пусть кто-нибудь более искушенный в задержках на ЛА3 и RC-цепочках выскажется.

Еще не знаю, насколько это существенный для твоей схемы момент, для меня он был заметным. ЧТЗУ может прийти как после CAS, так и до него. Вот моя недавняя картинка (http://zx-pk.ru/threads/29311-leshadok-pompe-plata-rasshireniya-dlya-vektora-06ts.html?p=970932&viewfull=1#post970932). В оригинале, как я понимаю, чтение — это "действие по умолчанию", а ЧТЗУ просто пропускает данные с выхода ОЗУ, так что это работает без проблем.


наладки, по идее, не требуется
Правильно, надо начинать с лошадиной (лешадковой) дозы оптимизма в таких делах :v2_biggr:

dk_spb
18.07.2018, 19:18
Всё сделано чисто на логике, никаких ПЛИСов, никакой прошивки или наладки, по идее, не требуется.
Я в своё время уже хвастался своим вариантом: КД Баркаря + IDE. Потом стал добавлять FDC, но вышел Комбодевайс, и острота вопроса спала.
http://oldpc.su/0/vec.jpg
Ну и эта схема еще не оптимизирована. ВА86 там вполне может быть лишней, ну и логику может можно в РТху спрятать. Ставилась задача чтобы вся элементная база (кроме памяти) была тех лет.

Syntal
18.07.2018, 19:53
На схеме у всех ОЗУшек запараллелены и к тому же константны CE1 и CE2 - такое работать не будет.

Improver
20.07.2018, 09:32
Я в своё время уже хвастался своим вариантом: КД Баркаря + IDE.А можно про схему Баркаря по-подробнее? Я попытался воссоздать то, что было в журнале "Радио-Любитель №11/1995", но без прошивки ПЗУ-хи логику изменений не понял...


На схеме у всех ОЗУшек запараллеленыЧто запараллелены? Адресные входы и линии данных? Так это ж вроде не страшно -- на них по даташиту должно быть состояние "High Z" при отсутствии управляющих сигналов...

и к тому же константны CE1 и CE2 - такое работать не будет.А это интересное замечание. Вроде бы криминала в том нет, но долгий гуглёж дал скудные комментарии, что при постоянном включении по СЕ1 и СЕ2 эти микрухи памяти перегреваются и сгорают, поэтому немного поменял схему.
Наиболее оптимальным, как мне показалось после разглядывания эпюр работы КД из документации, а также картинки svofski, их следует подключить к сигналу "БЛК", что и было сделано... Кроме того, я всё-таки поменял логические элементы на линии ШАП на буфер 74HC244, у которого задержка передачи около 20нс -- пусть лучше адрес будет получен немного раньше сигнала CAS.

Новая схема со всеми (надеюсь) исправлениями и дополнениями:
65794

Архив: 65795

И ещё один момент: случайно в библиотеке нашёл упоминание (http://www.sensi.org/scalar/ware/803/), что, оказывается, к Вектору можно было подключить до восьми квази-дисков. Не вижу особой проблемы в том, чтобы расширить этот контролёр до эмуляции двух-трёх, или даже всех восьми дисков, но вопрос -- а поддерживается ли это какими-либо ДОСами или программами?

UPD: В схеме обнаружена ошибка -- сингал RAS для буфера следует инвертировать, для этого необходимо вывод 2 микросхемы Д5:А подключить через сопротивление к +5В вместо массы.

Syntal
20.07.2018, 11:27
А это интересное замечание. Вроде бы криминала в том нет, но долгий гуглёж дал скудные комментарии, что при постоянном включении по СЕ1 и СЕ2 эти микрухи памяти перегреваются и сгорают, поэтому немного поменял схему.
Ничего не сгорает, хоть оба CE все время держать притянутыми к земле. Насчет логики работы я ошибся, Вы банки разруливаете с помощью разных WE и OE. Мне кажется более оптимальным было бы, WE и OE подавать одинаковыми на все ОЗУшки, а с помощью CE1 и CE2 выбирать банк.

svofski
20.07.2018, 11:41
Improver, вот тут сразу две ветки (http://zx-pk.ru/threads/29311-leshadok-pompe-plata-rasshireniya-dlya-vektora-06ts.html?p=971625&viewfull=1#post971625), в которых обсуждается множественный квазидисказм у Векторов. tl;dr это химера.

Improver
20.07.2018, 12:59
Мне кажется более оптимальным было бы, WE и OE подавать одинаковыми на все ОЗУшки, а с помощью CE1 и CE2 выбирать банк.В принципе да, оба эти способа работы памяти допустимы. И можно также объединить и все линии WE (тогда половина дешифратора ИД4 будет незадействована)... Попробую прикинуть это на схеме.

dk_spb
20.07.2018, 13:35
А можно про схему Баркаря по-подробнее? Я попытался воссоздать то, что было в журнале "Радио-Любитель №11/1995", но без прошивки ПЗУ-хи логику изменений не понял...
Если я правильно помню там еще две области памяти выделены под окна и в 10h для этого задействованы два старших бита.

Improver
23.07.2018, 10:28
В прошедшие выходные посмотрел в инете доступность в продаже микросхем памяти, и оказалось, что те, которые я планировал вначале можно либо купить в китае либо задёшево б/у с ~10% вероятностью брака, либо дороже, чем в России (в том же "Чипе и Дипе") аналогичные, но с ёмкостью в два раза больше... В общем, на этой волне перерисовал схему:
65815

Архив: 65816
Изменения:
- заменил микросхемы памяти на другие, что позволило избавится от дешифратора.
- откатил назад схему генерации сигнала БЛК.
- управление памятью сделал по CE, как рекомендовал Syntal.
- исправил некоторые ошибки, добавил новые... :)

Syntal
23.07.2018, 12:22
- исправил некоторые ошибки, добавил новые... :)

OE постоянно на землю не прокатит - забьешь шину данных.

Хотя может и прокатит, но мне кажется Вы ориентируетесь только на таблицу истинности режимов работы SRAM в даташите. Нужно еще учитывать временные характеристики подачи сигналов. Везде в даташитах указано, что сперва должен поступать CE, а потом OE. Что будет при обратном поступлении сигналов не указано. Возможно все будет и нормально, а может и сбоить в одном из тысячи случаев, замучаетесь искать потом.

Improver
23.07.2018, 13:19
OE постоянно на землю не прокатит - забьешь шину данных.Не уверен... Смотрим страницу 8 даташита (https://html.alldatasheet.com/html-pdf/115232/UMC/UM621024C-70LL/664/10/UM621024C-70LL.html) на память, первый график там -- цикл записи с управлением по WE, и внизу примечание №6 к нему: "OE is continuously low", т.е. при записи этот вывод постоянно на нуле. И в том же даташите на циклах чтения при управлении по СЕ (см. "Read Cycle 2 (https://html.alldatasheet.com/html-pdf/115232/UMC/UM621024C-70LL/396/6/UM621024C-70LL.html)" и "Read Cycle 3 (https://html.alldatasheet.com/html-pdf/115232/UMC/UM621024C-70LL/597/9/UM621024C-70LL.html)") тоже указано в примечании №4: "OE = Vil", так что, думаю, работать должно...

- - - Добавлено - - -

Дополнение к дополнению... :)

Везде в даташитах указано, что сперва должен поступать CE, а потом OE. Что будет при обратном поступлении сигналов не указано.Указано -- см. те же графики с управлением по СЕ.

Syntal
23.07.2018, 13:46
Указано -- см. те же графики с управлением по СЕ.
Тогда сорри

KTSerg
23.07.2018, 18:16
В прошедшие выходные посмотрел в инете доступность в продаже микросхем памяти, и оказалось, что те, которые я планировал вначале можно либо купить в китае либо задёшево б/у с ~10% вероятностью брака, либо дороже, чем в России (в том же "Чипе и Дипе") аналогичные, но с ёмкостью в два раза больше... ...
А что, на али сообщают когда б/у товар продают?
Сколько выбранная память в "Чип и Дип" стоит, 230руб. за штуку?
Была ссылка на али, там около 380р за 10 штук, или это они и есть б/у ?

Improver
24.07.2018, 08:19
А что, на али сообщают когда б/у товар продают?Как обычно, "Бесплатная доставка новое поступление крутые бинты удовлетворитель женщин" :D


Сколько выбранная память в "Чип и Дип" стоит, 230руб. за штуку?Да... И пока я склоняюсь к тому, что при близкой стоимости мегабитная память всё-таки будет удобнее в применении на квази-диске, чем 512-килобитная. Ещё лучше подошла бы двухмегабитная (256к*8), тогда хватило бы одного чипа, и с мультиплексора две линии просто можно было подавать на старшие адресные, но найти такую память сложнее.


Была ссылка на али, там около 380р за 10 штук, или это они и есть б/у ?Судя по комментариям -- да, это б/у, хотя продавец об этом не пишет... Есть ещё вариант на али -- искать по lp621024 (https://ru.aliexpress.com/wholesale?SearchText=lp621024), примерно по 600 руб./10 шт., но там тип корпуса несколько другой... А вот на ебее (https://www.ebay.com/sch/i.html?_nkw=lp621024) с нужными корпусами есть, но доставка дорогая.

dk_spb
24.07.2018, 09:30
На али бывают 512Kx8 регулярно, но на али _очень_ тупой поиск.

Например, https://www.aliexpress.com/item/Freeshipping-K6T4008C1B-DB70-K6T4008C1B/1000006372306.html
Недёшево, зато один чип, а не кучка.
И это статика, можно с регенерацией не заморачиваться. И она - low power, то есть можно и о батареечке подумать (хотя зачем - непонятно ;-) )

Improver
24.07.2018, 15:34
Обнаружил досадную ошибку в схеме... Я рисовал её на основе схемы из журнала "Радиолюбитель", а там, как оказалось, опечатка -- на триггеры был заведён сигнал "СТЕК" вместо "ШД4". Соответственно, все предыдущие мои варианты имеют эту ошибку. Исправленная схема:
65823

И архив: 65824

KTSerg
25.07.2018, 05:28
Чет не могу найти внятных характеристик РУ-шек применяемых в Векторе и Квазидиске...
Мне интересно, сопоставимо ли быстродействие микросхем статики и РУ-шек?
Не будет ли конфликтов на этой почве...

ivagor
25.07.2018, 06:33
РУ5 - Микропроцессорные средства и системы 1985-3 (https://yadi.sk/d/AaXjKjmSgxYG5) стр. 91
РУ6 - МПСиС 1986-1 (http://www.wdigest.ru/mpss_pdf/1986/mpss-1986-01.pdf) стр. 88
Но проблемы с быстродействием SRAM вряд ли возникнут, они в разы, а некоторые и на порядок быстрее РУ5/6. Некоторую проблему представляет специфическое формирование управляющих сигналов для озу вектором, но вроде все разработчики КД смогли с этим справиться.
Оффтоп. У меня создалось впечатление, что чуть ли не каждый (или каждый второй) обладатель реала разрабатывает свою версию КД.

KTSerg
25.07.2018, 06:45
РУ5 - Микропроцессорные средства и системы 1985-3 (https://yadi.sk/d/AaXjKjmSgxYG5) стр. 91
РУ6 - МПСиС 1986-1 (http://www.wdigest.ru/mpss_pdf/1986/mpss-1986-01.pdf) стр. 88
Но проблемы с быстродействием SRAM вряд ли возникнут, они в разы, а некоторые и на порядок быстрее РУ5/6. Некоторую проблему представляет специфическое формирование управляющих сигналов для озу вектором, но вроде все разработчики КД смогли с этим справиться.
Спасибо.


Оффтоп. У меня создалось впечатление, что чуть ли не каждый (или каждый второй) обладатель реала разрабатывает свою версию КД.
Ну так это естественно, и думаю касается не только КД. При отсутствии оригинала устройства, каждый пытается создать его аналог, из той комплектухи, что ему доступна на данный момент.

ivagor
25.07.2018, 07:24
Ну так это естественно, и думаю касается не только КД. При отсутствии оригинала устройства, каждый пытается создать его аналог, из той комплектухи, что ему доступна на данный момент.
Тут не совсем соглашусь. Есть как минимум два варианта, доступных для сборки/повторения:
1) Combodevice (http://zx-pk.ru/threads/22217-combodevice.html) (Syntal)
2) Реплика оригинального КД (http://zx-pk.ru/threads/26139-kvazidisk-kontroller-diskovoda-(kishinev)-2016.html) (artyr_n). Правда не знаю, собирал/запускал ли кто-то данный вариант.
Т.е. или других реальщиков не устраивают эти варианты, или важна радость творчества (можете подставить тут какое-нибудь менее пафосное название того же самого).

- - - Добавлено - - -

И, кстати, у некоторых есть даже КД из старого времени.

dk_spb
25.07.2018, 07:52
или других реальщиков не устраивают эти варианты, или важна радость творчества
Когда я делал КД была идея сделать комбо, но сделал только КД+IDE. На этапе добавления туда FDC что-то меня отвлекло (сейчас уже не помню, может на работе очередной аврал), потом этот проект как-то отложился, а потом появился девайс Syntal'а. Ну а раз проблема с внешними устройствами оказалась решена, я на свой проект окончательно забил ;-)
Про радость творчества: для меня важно было поставить одну м/с ОЗУ и это был мой первый опыт с ПЛМ.
А КД из старого времени у меня, насколько я помню, у Вас и купленный. Всем хорош, но разветвитель на две платы расширения на проводках требует регулярной подпайки отвалившихся проводков, а это бесит ;-)

KTSerg
25.07.2018, 08:01
Ещё когда в 90-ых цеплял "бутерброд" из контроллера Дисковода и двух КД, замеры показали, что каждый КД ест примерно по 0.5А. Что для тех времён было не мало... Трансы приходилось искать "зелёные" и КРЕНки садить на хорошие радиаторы...
Думаю современные реплики на статике должны быть менее прожорливы.

svofski
25.07.2018, 11:36
каждый (или каждый второй) обладатель реала разрабатывает свою версию КД
Реалов очень мало и, по крайней мере тут, владельцы реалов все такие любители поразрабатывать. Было бы реалов больше, было бы иначе.

ivagor
25.07.2018, 11:47
Пропустил вариант svofski, получается уже 3 доступных для повторения.

svofski
25.07.2018, 11:52
Шадков пока рано заносить в список готовых конструкций, хотя кваз работает, факт.

Improver
25.07.2018, 15:38
Если я правильно помню там еще две области памяти выделены под окна и в 10h для этого задействованы два старших бита.Да, так и есть, седьмым битом открывается область A000h-FFFFh, а шестым -- 8000h-9FFFh, все остальные функции полностью совпадают с кишенёвским вариантом. Медитация над схемой доработки помогла, с описанием из журнала. В общем, вот новая схема квази-диска, которая имеет доработку Баркаря:
65834

Схема в архиве: 65835
Для оптимизации пришлось серьёзно переработать схему, так что не исключено, что вылезут ещё косяки... По сути, с этом варианте будет достаточно отключить и притянуть массе выводы 13 и 4 микросхемки Д8, и тогда квазидиск будет работать без схемы Баркаря, как "стандартный" диск. Можно даже сделать это джамперами, если будет такое желание.

KTSerg
25.07.2018, 18:20
Да, так и есть, седьмым битом открывается область A000h-FFFFh, а шестым -- 8000h-9FFFh, все остальные функции полностью совпадают с кишенёвским вариантом. ...
Это вроде доработка для работы с цветным МикроДосом, который не сохранился. Или я ошибаюсь?

ivagor
25.07.2018, 18:39
Это вроде доработка для работы с цветным МикроДосом, который не сохранился.
Насчет цветного доса не знаю, знаю про кишиневские досы Филиппова FP с поддержкой такого кваза. Его версии не дошли до современной широкой общественности, но есть модификация Фролова (FPH) под hdd. И есть бейсик и граф. редактор (или редактор спрайтов, уже не помню) с поддержкой такого доса и КД. И есть еще пара игрушек, к которым я приложил руку.

KTSerg
25.07.2018, 18:46
... но есть модификация Фролова (FPH) под hdd. И есть бейсик и граф. редактор (или редактор спрайтов, уже не помню) с поддержкой такого доса и КД. И есть еще пара игрушек, к которым я приложил руку.
В смысле, все перечисленные работают и на обычном КД и на доработанном (с утерянным Досом)?
Хотя что такого, если ДОС придерживается стандарта, любая прога этого стандарта будет с ним работать...

ivagor
25.07.2018, 19:04
все перечисленные работают и на обычном КД и на доработанном (с утерянным Досом)?
Нет, все перечисленные программы работают только с КД Баркаря. Но есть их (досы, бейсик, редактор вроде тоже) версии для стандартного КД.

Improver
03.08.2018, 16:42
Разрисовал разводку платы для квази-диска... В связи с тем, что у китайцев стоимость изготовления плат резко увеличивается при размерах больше 100х100 мм, пришлось ужаться до этого размера, в результате чего часть разъёма "ВУ" висит в воздухе. Но это, мне кажется, не страшно -- там всего-то три линии "соплями" прокинуть: АС40, АС41 и АС43... Ну ещё +5В задублировать не помешает. В то же время лишние 15 мм платы поднимают стоимость изготовления почти в шесть раз (5$ против 28$). Размещать разъём по диагонали, как у "лешадок", я не стал... Кстати, вопрос к знатокам: а где сейчас можно купить разъём СНП34-90? А то в интернете их только скупают всякие золотоискатели...

В общем, вот архив со всеми файлами -- схема, два варианта разводки платы (полная и 93х100 мм) и гербер-архив для изготовления: 65900

И отдельно, дополненная схема:
https://s8.hostingkartinok.com/uploads/thumbs/2018/08/2e0855d6fd61544ed52d1f4817f9ac05.png (https://hostingkartinok.com/show-image.php?id=2e0855d6fd61544ed52d1f4817f9ac05)

Замечания по плате: дополнил схему двумя джамперами для выбора адреса квази-диска: J5 -- младший байт (х0 или х1) и J6 -- старший байт (1х или 2х), в итоге теперь ими можно настроить адрес одним из четырёх вариантов (10, 11, 20 или 21), думаю, этого будет более чем достаточно.

Кроме того, дополнил разъёмами для возможности сборки "бутерброда", почти как сделано на шилдах у ардуины. Это позволит к плате легко подключать другие контроллеры, например тот же комбодевайс, или "лешадок"... только плату свою прийдётся рисовать, под эти разъёмы. А ещё можно собрать до четырёх одинаковых квази-дисков в единый "слоёный пирог", выставив на них, соответственно, разные адреса джамперами. :v2_dizzy_punk:

И да, ещё добавил разъём для аккумулятора с диодной развязкой, но это пока чисто для экспериментов, диод Д14 можно просто заменить перемычкой, а Д13 не ставить вообще.

svofski
03.08.2018, 16:49
а где сейчас можно купить разъём СНП34-90?
Я не мудрил и купил в чиподипе. Наверное переплатил в 10 раз, конечно.

Improver
03.08.2018, 17:05
Я не мудрил и купил в чиподипе. Наверное переплатил в 10 раз, конечно.
У них только розетку (https://www.chipdip.ru/product1/8000168725) нахожу, а есть ссылка на вилку?

svofski
03.08.2018, 17:29
Improver, тоже не вижу. Видимо все съели. Могу прислать штучку.

artyr_n
03.08.2018, 20:27
Кстати, вопрос к знатокам: а где сейчас можно купить разъём СНП34-90?
http://zx-pk.ru/threads/22616-vektor-06ts-2014.html?p=669296&viewfull=1#post669296
правда прошло 4 года.

Improver
06.08.2018, 08:42
Improver, тоже не вижу. Видимо все съели. Могу прислать штучку.Спасибо, воспользуюсь предложением, но немного позже -- нашёл временное (или альтернативное) решение, вот такая гребёнка по шагу контактов полностью совпадает с разъёмом:
65922
Контакты, мне кажется, немного толстоваты, но в разъём они входят без деформаций:
65923

У китайцев есть ещё такие же контакты с шагом 1,27мм, там штырьки тоньше и короче, можно попробовать взять их и проредить (через один), тогда тоже получится разъём с шагом на 2,54мм.

Думаю, пока собрать на одном из этих вариантов, а потом, если всё заработает нормально, перепаять на родной разъём.


http://zx-pk.ru/threads/22616-vektor-06ts-2014.html?p=669296&viewfull=1#post669296
правда прошло 4 года.
Ок, тоже буду иметь в виду... На украинском сайте по ссылке оттуда, кстати, есть такое примечание: "могут сочленяться с соединителями СНО58,СНО59 (http://connector.com.ua/notes/14)", это немного расширяет зону поиска.

KTSerg
06.08.2018, 11:20
Спасибо, воспользуюсь предложением, но немного позже -- нашёл временное (или альтернативное) решение, вот такая гребёнка по шагу контактов полностью совпадает с разъёмом:
...
Я бы не рискнул использовать такие контакты.
Если решение временное, подключил-бы короткими проводами дополнительный разъём/разъёмы параллельно штатному.

Improver
06.08.2018, 11:41
Я бы не рискнул использовать такие контакты.Почему? Такую линейку можно в Китае заказать даже золочёную, в чём тут будет риск?


Если решение временное, подключил-бы короткими проводами дополнительный разъём/разъёмы параллельно штатному.Ну... Паять в Вектор дополнительный разъём в качестве временного решения -- это не комильфо как-то...:confused: Ладно, если не паять параллельно, а воткнуть в разъём одножильными проводками (сам так ранее подключал джойстик к ПУ) -- так это практически то же самое, только менее удобно.

svofski
06.08.2018, 12:37
Я как-то давно от нежелания искать и ждать сто лет совершенно недобываемый разъем из C64 делал так:
http://zx-pk.ru/threads/8266-pitanie-commodore-c64c.html?p=168092&viewfull=1#post168092
Но с 90 пинами (даже с 45) я бы наверное не стал такое повторять ;)

Syntal
06.08.2018, 12:54
Такую линейку можно в Китае заказать даже золочёную, в чём тут будет риск?

Шаг различный, у советских микрух и разъемов шаг - 2,50 мм. На 10 контактах будет норм, на 20 уже не влезет. Только если разделять на секции и подпиливать.

Improver
06.08.2018, 13:01
Я как-то давно от нежелания искать и ждать сто лет совершенно недобываемый разъем из C64 делал так:
http://zx-pk.ru/threads/8266-pitanie-commodore-c64c.html?p=168092&viewfull=1#post168092Кстати, я тоже делал что-то подобное, но только вместо бетона использовал "холодную сварку"... :)

- - - Добавлено - - -


Шаг различный, у советских микрух и разъемов шаг - 2,50 мм. На 10 контактах будет норм, на 20 уже не влезет. Только если разделять на секции и подпиливать.Хм... Да, 0,04х45=1,8 мм разбега на всю длину разъёма, может и не подойти. Надо будет подумать...

svofski
06.08.2018, 13:20
Импортные разъемы с метрическим шагом 2.5 в природе существуют, но мне никогда не попадалось что-то наподобие гребенки. Было бы прикольно найти замену слегка адовому СНП34-90, но я не уверен, что так просто получится. В защиту СНП34-90 могу сказать, что из него хороший хребет платы получается. Придает необходимую жесткость конструкции.

artyr_n
06.08.2018, 17:31
Почему? Такую линейку можно в Китае заказать даже золочёную, в чём тут будет риск?
родные контакты плоские, а китайские квадратные, есть риск что родной контакт потом не будет контачить.

dk_spb
06.08.2018, 18:37
какие-то у Вас тут ужасы...
Нет проблем купить вилку СНП34с-90, если не её, то -135
Или их аналоги серий УСНП34, СНП260

Improver
07.08.2018, 08:15
родные контакты плоские, а китайские квадратные, есть риск что родной контакт потом не будет контачить.Родные контакты, судя по чертежу, не плоские, а имеют квадратное сечение со стороной 0,5мм. Да, это в два раза меньше, чем на китайских "линейках" с шагом 2,54мм, но более-менее безопасно, мне кажется, можно воткнуть штырьки от линейки 1,27мм -- на них указана толщина 0,7мм максимум...


какие-то у Вас тут ужасы...
Нет проблем купить вилку СНП34с-90, если не её, то -135
Или их аналоги серий УСНП34, СНП260Ок, изначально заданный вопрос, где купить? В России все перечисленные видел только на сайте "Западприбор" (http://zapadpribor.com/snp34s/), там кто-нибудь заказывал?

dk_spb
07.08.2018, 10:01
Ок, изначально заданный вопрос, где купить?
Рассказываю: есть несколько специальных сайтов для поиска компонентов. Да, там не вся информация правдива, да, не все указанные там фирмы будут с Вами работать. Но для такого "ширпотреба" как СНП34с вообще никаких проблем. Пример:
http://www.chipfind.ru/search/?part=%D1%81%D0%BD%D0%BF34%D1%81-90%D0%B2&s=1&p=1

- - - Добавлено - - -

Да и вообще, кажется Вам просто лень искать:
https://meshok.net/item/88814350_%D0%A0%D0%B0%D0%B7%D1%8A%D1%91%D0%BC_%D0% A1%D0%9D%D0%9F34_135%D0%92_%D0%92

А вот и ГДРовские аналоги всего по 30 (ТРИДЦАТЬ !!!!!) рублей
https://meshok.net/item/92606149_%D0%A0%D0%90%D0%97%D0%AA%D0%81%D0%9C_%D0% A1%D0%9D%D0%9F34%D0%A1_135%D0%92_%D0%92_%D0%BF%D0% B0%D0%BF%D0%B0_%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B 3_%D0%B3%D0%B5%D1%80%D0%BC%D0%B0%D0%BD%D0%B8%D1%8F
"В наличии несколько сотен."
И есть такие же в Кирове, но уже по 130

Improver
07.08.2018, 11:43
Возвращаемся к теме... Нарисовал схему и развёл плату для подключения HDD, плата сделана, как дополнение к этому квази-диску, т.е. подключается через соответствующие разъёмы на нём вторым слоем.
Схема подключения стандартная, взял тут (http://www.sensi.org/scalar/ware/537/), единственно, в этой схеме не указаны контакты разъёма IDE для IOW и IOR, но, думаю, угадал их по названию верно. Размер платы -- 60х96мм.

Комплект (схема, плата и гербер-архив):66585
Просто схема:
https://s8.hostingkartinok.com/uploads/thumbs/2018/10/c98588832bb31365ff0a6e568d9b851b.png (https://hostingkartinok.com/show-image.php?id=c98588832bb31365ff0a6e568d9b851b)

Improver
09.08.2018, 15:17
Вот тут (http://zx-pk.ru/threads/29311-leshadok-pompe-plata-rasshireniya-dlya-vektora-06ts.html?p=974886&viewfull=1#post974886) была затронута тема и сделали предположение, что квази-диск при обращении с обоими сигналами ЧТЗУ и WE возможно производит регенерацию памяти, так это или нет -- тут надо более глубокое изучение, но так как для статической памяти регенерация не нужна, решил добавить обработку ситуаций, когда оба сигнала, ЧТЗУ и WE, равны нулю или единице. Добавление логики для этого не потребовалось, просто перекоммутировал существующие логические элементы так, чтобы сигнал CAS не подавался на память в таких ситуациях. Это изменение, кстати, добавило задержку передачи CAS примерно до 70нс.

Кроме того в схеме заменил дешифратор К155ИД4 (SN74155) на К1564ИД14 (SN74HC139). Особой необходимости в том не было, просто последний должен быть немного по-быстрее.

Новая схема, разводка, разводка для платы 92х100мм и гербер-архив: 65950
Схема отдельно:
https://s8.hostingkartinok.com/uploads/thumbs/2018/08/e3696b4ecfd83c7dbb1224143df3c47e.png (https://hostingkartinok.com/show-image.php?id=e3696b4ecfd83c7dbb1224143df3c47e)

svofski
09.08.2018, 15:50
Но все-таки, одновременно ЧТЗУ==0 и ЗПЗУ==0 я никогда не видел и очень сильно удивился бы, если б увидел. Оба они формируются из слова состояния процессора. Регенерация это по идее просто RAS без CAS, адреса строк при этом на ШАП. В случае кваза на РУ6 она происходит автоматически тем же механизмом, что регенерация основного ОЗУ.

Improver
09.08.2018, 17:19
Но все-таки, одновременно ЧТЗУ==0 и ЗПЗУ==0 я никогда не видел и очень сильно удивился бы, если б увидел.
Это не особо принципиально -- даже если такой вариант невозможен, в последней схеме "исключающее ИЛИ" отсекает оба варианта, и две единицы, и два нуля. Т.е. обращение к памяти будет разрешено только при наличии одного из сигналов, ЧТЗУ или ЗПЗУ.


Регенерация это по идее просто RAS без CAS, адреса строк при этом на ШАП. В случае кваза на РУ6 она происходит автоматически тем же механизмом, что регенерация основного ОЗУ.Да, РУ-шки умели делать только такой метод регенерации, но мне пока не известно, какую роль при регенерации играют сигналы ЧТЗУ и ЗПЗУ? Подозреваю, что они оба в этот момент установлены в "1".

svofski
09.08.2018, 19:23
какую роль при регенерации играют сигналы ЧТЗУ и ЗПЗУ? Подозреваю, что они оба в этот момент установлены в "1".
Никакого. Я сморозил, думая о содержимом ПЗУ. Сейчас я думаю, что в ПЗУ для этих входных значений что-то записано просто потому, что нельзя было не записать ничего.

Вот в этом посту (http://zx-pk.ru/threads/28207-vremennye-diagrammy-vektora.html?p=970562&viewfull=1#post970562) сняты сигналы с шины, где видно счетчик строк и RAS: $26, $27, $28, $29, $2a, $2b, $2c, $2d...

Интересней было бы поймать момент, когда счетчик добирается до адресов кваза, включенного "как ОЗУ", тогда точно будет RAS без CAS несмотря на развесившийся БЛК.

- - - Добавлено - - -

P.S. может быть и нет, для БЛК нужно совпадение адресов на ШАВВ.

Improver
10.08.2018, 08:26
Никакого.Не сомневаюсь, что тут Вы правы... :)


Сейчас я думаю, что в ПЗУ для этих входных значений что-то записано просто потому, что нельзя было не записать ничего.И здесь тоже. Хотя, невозможные комбинации в ПЗУ можно было просто забить нулями, или FF...


Вот в этом посту сняты сигналы с шины, где видно счетчик строк и RAS: $26, $27, $28, $29, $2a, $2b, $2c, $2d...Интересно, в приведённом графике VU_CAS_N всё время = 1, даже когда идёт обращение к памяти. Время подачи сигнала CAS настолько мало, что его не видно на графике, или я что-то не понимаю?

ivagor
10.08.2018, 09:01
в приведённом графике VU_CAS_N всё время = 1, даже когда идёт обращение к памяти.
Обращений к памяти квазидиска нет, соответственно и CAS на ВУ неактивен.

Improver
10.08.2018, 10:41
Обращений к памяти квазидиска нет, соответственно и CAS на ВУ неактивен.Т.е. на ВУ сигналы ЧТЗУ и ЗПЗУ проходят в любом случае, а CAS только когда есть обращение к КД? Хм... :confused:

ivagor
10.08.2018, 10:46
Если более полно, то CAS на ВУ будет, если БЛК=0. А квазидиск делает БЛК=0 при обнаружении обращения к себе.

Improver
10.08.2018, 11:59
Если более полно, то CAS на ВУ будет, если БЛК=0. А квазидиск делает БЛК=0 при обнаружении обращения к себе.Тогда понятно, почему на графике CAS-а нет.

svofski
10.08.2018, 12:10
Improver, вот тут (http://zx-pk.ru/threads/29311-leshadok-pompe-plata-rasshireniya-dlya-vektora-06ts.html?p=970932&viewfull=1#post970932) я пару недель назад рассуждал о процессах на шине. К текущему вопросу это только косвенно относится, но CAS на диаграмме видно.

(Для себя: уже тогда надо было сообразить захватывать слово состояния, а не пытаться вымучить чего-то полезное из инвалида-ЧТЗУ)

Improver
10.08.2018, 13:18
Improver, вот тут (http://zx-pk.ru/threads/29311-leshadok-pompe-plata-rasshireniya-dlya-vektora-06ts.html?p=970932&viewfull=1#post970932) я пару недель назад рассуждал о процессах на шине. К текущему вопросу это только косвенно относится, но CAS на диаграмме видно.Разглядывая график посчитал (как смог), что процесс чтения байта из КД длится около 0,8-0,9мкс (считал продолжительность, от получения всех трёх сигналов, ЧТЗУ, RAS и CAS, до отключения ЧТЗУ). И примерно через 0,1мкс после появления трёх сигналов в ШД должен быть выдан байт, всё верно?

svofski
10.08.2018, 13:55
Отключение ЧТЗУ вопреки предполагаемому здравому смыслу не влияет вообще ни на что.

Вот эта картинка хорошая:
https://i.imgur.com/g9QW62Q.png

The data presented to the processor must have stabilized prior to both the "ф1-data set-up" interval (tDS1), that precedes the falling edge of the ф1 pulse defining state T3, and the "ф2-data set-up" interval (tDS2), that precedes the rising edge of ф2 in state T3. This same data must remain stable during the "data hold" interval (tDH) that occurs following the rising edge of the ф2 pulse. Data placed on these lines by memory or by other external devices will be sampled during T3.

В общем если СТРОБЪ это SYNC, то у кваза ориентировочно полтора клока до выдачи данных. При 3МГц тактовой, теоретическая верхняя граница получается 0.5мкс.

ivagor
10.08.2018, 14:10
если СТРОБЪ это SYNC, то у кваза ориентировочно полтора клока до выдачи данных.
Если бы на ВУ был сразу виден весь адрес, то да, а так придется ждать ras и cas. Или вывести вторую половину адреса без мультиплексирования в дополнение к ШАВВ проводками (8 штук) и забыть про ras/cas.

svofski
10.08.2018, 14:16
Я должен был сказать "время между выдачей СТРОБ и стабильными данными на шине должно быть меньше 0.5мкс".

Improver
10.08.2018, 14:57
Ок, но вот только проблемка -- железный квазидиск не использует сигнал СТРОБ, и потому сложно вести отсчёт от этой границы... А если, допустим, принять за константу время от строба до выработки Вектором сигнала CAS, сколько останется от этих 0,5мкс на ответ? Ну или возвращаясь к изначальному вопросу (http://zx-pk.ru/threads/29311-leshadok-pompe-plata-rasshireniya-dlya-vektora-06ts.html?p=974865&viewfull=1#post974865), за какое время КД должен отдавать данные, чтобы mdos не глючил?

Improver
13.08.2018, 10:54
Для общего понимания (не для повторения) решил разрисовать схему квази-диска на РУ7 из Вектор-Юзера №18, с последующими исправлениями. Как там написали, "он использует идеи стандартного диска", но по схеме из журнала понять его работу практически невозможно -- слишком уж всё путано изображено.

Итак, перерисованная схема:
https://s8.hostingkartinok.com/uploads/thumbs/2018/08/8be42e3e3b589a601f18e6ca377959de.png (https://hostingkartinok.com/show-image.php?id=8be42e3e3b589a601f18e6ca377959de)

Что можно тут увидеть:
1. Да, обращение к квази-диску ничем не должно отличаться от стандартного, доработки Баркаря в нём нет, но сделать её можно тем же методом.
2. Сигнал WE (он же ЗПЗУ) заведён непосредственно на микросхемы памяти, на все сразу и без какой-либо промежуточной логики или буферов.
3. Сигнал ЧТЗУ управляет только работой шинных формирователей АП26 на ШД и больше ни на что не влияет.
4. Сигнал CAS попадает на микросхемы памяти через разрешающую логику при наличии сигнала БЛК.
5. Ну и всё остальное (счётчики, ещё один мультиплексор) предназначены для работы с банками памяти по RAS/CAS, и углублённо рассматривать их работу не вижу особого смысла.

Вот теперь думаю, может в очередной раз изменить схему с учётом пунктов 2-4? Т.е. просто забить на ЧТЗУ...

svofski
13.08.2018, 11:32
3. Сигнал ЧТЗУ управляет только работой шинных формирователей АП26 на ШД и больше ни на что не влияет.
4. Сигнал CAS попадает на микросхемы памяти через разрешающую логику при наличии сигнала БЛК.
3. ЧТЗУ наверное сделан таким, чтобы избежать нескольких источников на одной шине. То есть как команда не годится, а как разрешающий сигнал вполне.
4. Зачем гейтовать дополнительно CAS, если он уже перекрыт внутри Вектора?

Improver
13.08.2018, 12:28
3. ЧТЗУ наверное сделан таким, чтобы избежать нескольких источников на одной шине. То есть как команда не годится, а как разрешающий сигнал вполне.Что ещё раз подтверждает, что при отсутствии шинных формирователей он не нужен.


4. Зачем гейтовать дополнительно CAS, если он уже перекрыт внутри Вектора?Полагаю, что это нужно для совместной работы нескольких квази-дисков -- при этом на каждом будет вырабатываться свой БЛК, а CAS от Вектора будет приходить один на всех.

Кстати, это правильный вопрос: из него есть следствие, что отдавать на ВУ сигнал БЛК тоже нужно через буфер -- иначе два (и более) квази-диска будут мешать работе друг друга, и это не было учтено ни в одной из схем! :(

svofski
13.08.2018, 12:57
Вот ведь точно, несколько квазидисков.

Improver
14.08.2018, 15:48
Новая схема, без использования ЧТЗУ:

https://s8.hostingkartinok.com/uploads/thumbs/2018/08/1963dcb8700409d21e65406b63837fab.png (https://hostingkartinok.com/show-image.php?id=1963dcb8700409d21e65406b63837fab)

Архив со схемой, разводкой платы и гербер-архивом (93х100мм): 65970

Кстати, заглянул в схему ERAM, так там ЧТЗУ не использовали вообще, что ещё раз подтверждает то, что этот сигнал не очень-то и нужен для квази-диска.

- - - Добавлено - - -

Ахтунг... Сейчас решил посмотреть Омский вариант квази-диска, и там, в документации, увидел очевидную вещь, которая была всё время на виду и на которую я почему-то не обращал внимания... И это то, что во время всего цикла чтения/записи с КД на шине ШАВВ присутствует старший разряд адреса памяти, а при сигнале CAS на шину ШАП подаётся младший разряд. Выходит, при использовании статической памяти можно просто не обращать внимания на сигнал RAS и выкинуть микросхемы Д3 и Д4 (по последней схеме)! Как Вам такой вариант?

svofski
14.08.2018, 15:52
Адреса строк и столбцов, то есть то, что стробируется по RAS и CAS на ШАП, перемешаны хитрым образом:


RA = {a9,a10,a11,a12,a13,a1,a2,~a14}
CA = {a3,a4,a5,a6,a7,a8,a16,~a15}

(обсуждение в треде про Временные диаграммы (http://zx-pk.ru/threads/28207-vremennye-diagrammy-vektora.html?p=970562&viewfull=1#post970562))

Improver
14.08.2018, 16:11
Адреса строк и столбцов, то есть то, что стробируется по RAS и CAS на ШАП, перемешаны хитрым образом
Жаль, а такая интересная идея была... :( Но, с другой стороны, это тоже можно использовать как-то, например, запоминать по RAS не все биты, а только а1 и а2...

svofski
14.08.2018, 16:30
Вообще все нелепо, потому что на шину адреса выделено 16 проводов, то есть её всю целиком можно было вывести напрямую как есть, а вместо этого там фарш 5-й категории. А всё потому, что у Вектора экран при развертке обходится ходом коня.

Syntal
14.08.2018, 16:43
Адреса строк и столбцов, то есть то, что стробируется по RAS и CAS на ШАП, перемешаны хитрым образом
То что они перемешаны, не мешает стробированные сигналы без переконвертирования подавать на адресные линии SRAM. Только если для каких-то задач нужно знать абсолютный адрес, тогда стоит учитывать этот момент, для квазидиска на SRAM пофиг как в ОЗУ будут байты валяться.

svofski
14.08.2018, 16:51
Syntal, половину адреса все равно придется запоминать в регистре. А если было бы четко младший-старший, можно было бы брать прямо с проводов.

Improver
15.08.2018, 09:47
Для общего улучшения и для исключения ситуации, когда сигнал БЛК будет сформирован позже сигнала RAS (а такое возможно, если сигнал СТЕК будет получен вместе или позже RAS), немного поправил схему:

https://s8.hostingkartinok.com/uploads/thumbs/2018/08/a3621c6bd0bbec8778d41cae2b60ac42.png (https://hostingkartinok.com/show-image.php?id=a3621c6bd0bbec8778d41cae2b60ac42)

Теперь буфер Д4 открыт постоянно (может его вообще убрать?), а сигнал RAS получает разрешение по БЛК, также, как и CAS. Это даёт необходимую задержку для нормальной работы Д3.

Полный архив: 65975

dk_spb
17.08.2018, 23:40
Мы победили в себе склеротИк и откопали такой мы антИк

Syntal
18.08.2018, 06:51
Мы победили в себе склеротИк и откопали такой мы антИк
А с другой стороны сфоткай коробушку и что внутри.

dk_spb
18.08.2018, 10:26
С другой стороны посредине лейбла кишиневского завода с логотипом и серийником (такая же пластина как на самом векторе).
Внутри квазидиск ;-)
Попозжее постараюсь сделать фото.

Improver
25.10.2018, 15:02
Уже больше месяца прошло, как исправил схему КД, но вот только сейчас увидел, что не разметил тут те исправления: :confused:
1. Микросхема D7 заменена на 74HC273. В принципе, работать будет и в предыдущем варианте, вот только при сбросе с ней триггеры не будут обнуляться.
2. Микросхема D8 заменена на К1533ЛР13, только из соображений быстродействия. К сожалению, это потянуло за собой значительное изменение разводки платы.
3. Ну и попутно немного оптимизировал разводку...

https://s8.hostingkartinok.com/uploads/thumbs/2018/10/dd1832af9d30c3b62b4dfe4528ecde77.png (https://hostingkartinok.com/show-image.php?id=dd1832af9d30c3b62b4dfe4528ecde77)

Архив со схемой, разводкой и гербером: 66680

P.S. Диоды D13 и D14 лучше использовать какие-нибудь Шотки, например 1N5819, -- на них меньше падение напряжения. Или же просто поставить перемычку вместо D14, а D13 не ставить совсем, если использование аккумулятора не планируется.

Alex_LG
26.10.2018, 08:11
2. Микросхема D8 заменена на К1533ЛР13, только из соображений быстродействия. К сожалению, это потянуло за собой значительное изменение разводки платы.

А почему бы D1+D2+D12 и D5+D6+D8 не заменить на РТ4?

Improver
26.10.2018, 10:26
А почему бы D1+D2+D12 и D5+D6+D8 не заменить на РТ4?Наверно, по той же причине, почему бы не заменить всю конструкцию на ПЛИС и не получить при этом "Комбодевайс2"... :) А если серьёзно -- если что-то можно решить на обычной логике достаточно малым числом корпусов МС, то я не вижу особой необходимости делать это на ПЗУ. Так же, собственно, было сделано и в последующей конструкции КД (на РУ7) (http://zx-pk.ru/threads/29342-novyj-staryj-kvazidisk.html?p=975404&viewfull=1#post975404)...

- - - Добавлено - - -

И ещё, могу уже похвалиться собранной конструкцией по последней схеме (http://zx-pk.ru/threads/29342-novyj-staryj-kvazidisk.html?p=983801&viewfull=1#post983801):

66690

Только вот микросхем памяти пока что ещё нет, т.к. они в доставке с ибея... Но всё остальное, что возможно, протестил -- работает так, как и было задумано. :)

Может, кому пригодится, вот мои тесты для контроллера КД:
Как написано в документации к оригинальному КД, начальный тест -- это просто включение Вектора с подключённым диском. Если загрузке Вектора собранный КД не мешает, то значит всё в порядке. :)Проверка правильности работы схемы дешифратора адреса порта КД и регистра конфигурации (микросхемы D1, D2:A, D12:A,B,C и D7). Результат тестирования проверяется мультиметром, на соответствующих выводах D7 должны появляться сигналы "1". Запускать с отключённым сигналом "БЛК" (например, без установленной D8), иначе Вектор подвиснет.
Текст теста на ассемблере для запуска в любом мониторе-отладчике:

.ORG 00100h
L_0100: LDA L_DATA
RLC
STA L_DATA
OUT 010h ; отправляем в порт
LDA L_DT
INR A
STA L_DT
LXI D, L_TEXT
MVI C, 009h
CALL 5 ; вывод сообщения
MVI C,1
LXI D,2000h
CALL 5 ; ожидание нажатия клавиши
LDA L_DATA
CPI 080h ; проверка
JNZ L_0100 ; цикл
MVI A, '0'
STA L_DT
RET ; выход ---->>>>
L_TEXT: .db 0Dh, 0Ah, "OUT DATA: "
L_DT: .db "0$"
L_DATA: .db 080h
.ENDПроверка работы в режиме "стек", проверяется формирователь сигнала "БЛК" на МС D8 (и, конечно, дополнительно и то, что проверялось в тесте 1). Этим тестом производится запись данных во все четыре банка КД по адресам, совпадающим с экранной областью монитора-отладчика, и в случае сбоя на экране будут видны "артефакты".

.ORG 00100h
L_0100: LXI D, L_DATA
PUSH D ; сохраняем в стеке ссылку
L_MAIN: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
RZ ; выход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 0000h ; заполнение памяти
DAD SP ; SP+0 в HL
SHLD L_SAVE ; сохранить указатель на стек
LXI D, 55AAh ; чем заполнять
LXI H, 1000h ; сколько/2
LXI SP,0E000h ; свой указатель на стек
L_LOOP: PUSH D ; заполняем через стек...
DCX H
MOV A, L
ORA H
JNZ L_LOOP ; зациклено
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
LXI D, L_TEXT
MVI C, 009h
CALL 5 ; вывод сообщения
MVI C,1
LXI D, 2000h
CALL 5 ; ожидание нажатия клавиши
JMP L_MAIN ; цикл
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- DONE --$"
L_DATA: .db 1Ch ; 00011100b -- вкл. 0 банк как стек на КД
.db 18h ; 00011000b -- вкл. 1 банк как стек на КД
.db 14h ; 00010100b -- вкл. 2 банк как стек на КД
.db 10h ; 00010000b -- вкл. 3 банк как стек на КД
.db 00h ; конец
.ENDПроверка работы КД в режиме "замена ОЗУ" по стандартной конфигурации. Дополнительно к предыдущим тестам, проверяются правильность работы МС D5 и D6. Ошибка выдаётся в случае совпадения последнего записанного в КД байта и считанного из ОЗУ после отключения КД.

.ORG 00100h
L_0100: LXI D, L_DATA
PUSH D ; сохраняем в стеке ссылку
L_MAIN: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
RZ ; выход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
OUT 010h ; отправляем в порт
LXI H, 02000h ; заполнение памяти -- сколько
LXI B, 0C000h ; с какого адреса
L_LOOP: MVI A, 055h ; чем заполнять
STAX B ; пишем
INX B
DCX H
MOV A, L
ORA H
JNZ L_LOOP ; пока HL не обнулится
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
DCX B ; на шаг назад
LDAX B ; считываем последний байт
CPI 055h ; сравниваем с тем, что писали
LXI D, L_ERRT ; ссылка на сообщение об ошибке
JZ L_DONE ; если равны -- значит КД работает не правильно
LXI D, L_TEXT
L_DONE: MVI C, 009h
CALL 5 ; вывод сообщения
MVI C,1
LXI D, 2000h
CALL 5 ; ожидание нажатия клавиши
JMP L_MAIN ; цикл
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- DONE --$"
L_ERRT: .db 0Dh, 0Ah, "-- ERROR --$"
L_DATA: .db 23h ; 00100011b -- вкл. 0 банк как ОЗУ A000h-DFFFh
.db 22h ; 00100010b -- вкл. 1 банк как ОЗУ A000h-DFFFh
.db 21h ; 00100001b -- вкл. 2 банк как ОЗУ A000h-DFFFh
.db 20h ; 00100000b -- вкл. 3 банк как ОЗУ A000h-DFFFh
.db 00h ; конец
.ENDТо же самое, что и в третьем тесте, но только для схемы доработки Баркаря

.ORG 00100h
L_0100: LXI D, L_DATA
PUSH D ; сохраняем в стеке ссылку
L_MAIN: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
RZ ; выход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
OUT 010h ; отправляем в порт
LXI H, 02000h ; заполнение памяти -- сколько
CPI 080h
LXI B, 08000h ; с какого адреса 1
JC L_LOOP ; если A < 080h
LXI B, 0E000h ; с какого адреса 2
L_LOOP: MVI A, 055h ; чем заполнять
STAX B ; пишем
INX B
DCX H
MOV A, L
ORA H
JNZ L_LOOP ; пока HL не обнулится
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
DCX B ; на шаг назад
LDAX B ; считываем последний байт
CPI 055h ; сравниваем с тем, что писали
LXI D, L_ERRT ; ссылка на сообщение об ошибке
JZ L_DONE ; если равны -- значит КД работает не правильно
LXI D, L_TEXT
L_DONE: MVI C, 009h
CALL 5 ; вывод сообщения
MVI C,1
LXI D, 2000h
CALL 5 ; ожидание нажатия клавиши
JMP L_MAIN ; цикл
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- DONE --$"
L_ERRT: .db 0Dh, 0Ah, "-- ERROR --$"
L_DATA: .db 43h ; 01000011b -- вкл. 1 банк как ОЗУ 8000h-9FFFh
.db 42h ; 01000010b -- вкл. 2 банк как ОЗУ 8000h-9FFFh
.db 41h ; 01000001b -- вкл. 3 банк как ОЗУ 8000h-9FFFh
.db 40h ; 01000000b -- вкл. 4 банк как ОЗУ 8000h-9FFFh
.db 83h ; 10000011b -- вкл. 1 банк как ОЗУ E000h-FFFFh
.db 82h ; 10000010b -- вкл. 2 банк как ОЗУ E000h-FFFFh
.db 81h ; 10000001b -- вкл. 3 банк как ОЗУ E000h-FFFFh
.db 80h ; 10000000b -- вкл. 4 банк как ОЗУ E000h-FFFFh
.db 00h ; конец
.END
А дальше, я думаю, надо ставить память и тестировать стандартными программами, типа "дождь" и т.д.

Все тесты откомпилированные для монитора-отладчика в одном архиве: 66691
Запускать можно под любым монитором-отладчиком, режим распределения памяти МО рекомендую выбирать <2>.

Improver
16.11.2018, 11:15
Пришла мне память... Поставил -- ни один из стандартных тестов не сказал "ОК". :( На основе одного из предыдущих, по-быстрому написал ещё несколько тестов:
В этом тесте будем пробовать что-то записать в память, а потом считать записанное в экранную область монитора для контроля записи. (Режим "ОЗУ")
Рекомендую после каждого запуска менять записываемый байт по адресу 113h (в "MVI A, 055h"), сделать это можно командой монитора "S113", далее новое значение и выход по точке.

.ORG 00100h
L_0100: LXI D, L_DATA
PUSH D ; сохраняем в стеке ссылку
L_MAIN: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
RZ ; выход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
OUT 010h ; отправляем в порт
LXI H, 02000h ; заполнение памяти -- сколько
LXI B, 0C000h ; с какого адреса
L_LOOP: MVI A, 055h ; чем заполнять
STAX B ; пишем
INX B
DCX H
MOV A, L
ORA H
JNZ L_LOOP ; пока HL не обнулится
LXI H, 02000h ; считываем -- сколько
LXI B, 01000h ; куда
LXI D, 0C000h ; откуда
CALL L_MOVE
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LXI H, 02000h ; переброска считанного в экран -- сколько
LXI B, 0C000h ; куда
LXI D, 01000h ; откуда
CALL L_MOVE ; наблюдаем и наслаждаемся...
LXI D, L_TEXT
L_DONE: MVI C, 009h
CALL 5 ; вывод сообщения
MVI C,1
LXI D, 2000h
CALL 5 ; ожидание нажатия клавиши
JMP L_MAIN ; цикл
L_MOVE: LDAX D ; пп переброски данных
STAX B
INX D
INX B
DCX H
MOV A, L
ORA H
JNZ L_MOVE
RET
;
L_TEXT: .db 0Dh, 0Ah, "-- DONE --$"
L_DATA: .db 23h ; 00100011b -- вкл. 1 банк как ОЗУ A000h-DFFFh
.db 22h ; 00100010b -- вкл. 2 банк как ОЗУ A000h-DFFFh
.db 21h ; 00100001b -- вкл. 3 банк как ОЗУ A000h-DFFFh
.db 20h ; 00100000b -- вкл. 4 банк как ОЗУ A000h-DFFFh
.db 00h ; конец
.ENDПроверка работы КД на запись/чтение данных в режиме "стек"

.ORG 00100h
L_0100: LXI D, L_DATA
PUSH D ; сохраняем в стеке ссылку
L_MAIN: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
RZ ; выход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 0000h ; заполнение памяти
DAD SP ; SP+0 в HL
SHLD L_SAVE ; сохранить указатель на стек
LXI D, 55AAh ; чем заполнять
LXI H, 1000h ; сколько/2
LXI SP,0E000h ; свой указатель на стек
L_LOOP: PUSH D ; заполняем через стек...
DCX H
MOV A, L
ORA H
JNZ L_LOOP ; зациклено
LXI H, 0C000h ; куда
LXI B, 1000h ; сколько/2
L_LP2: POP D ; забираем из стека
MOV M, E ; записываем в экранную область
INX H
MOV M, D
INX H
DCX B ; счётчик
MOV A, C
ORA B
JNZ L_LP2 ; зациклено 2
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
LXI D, L_TEXT
MVI C, 009h
CALL 5 ; вывод сообщения
MVI C,1
LXI D, 2000h
CALL 5 ; ожидание нажатия клавиши
JMP L_MAIN ; цикл
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- DONE --$"
L_DATA: .db 1Ch ; 00011100b -- вкл. 3 банк как стек на КД
.db 18h ; 00011000b -- вкл. 2 банк как стек на КД
.db 14h ; 00010100b -- вкл. 1 банк как стек на КД
.db 10h ; 00010000b -- вкл. 0 банк как стек на КД
.db 00h ; конец
.ENDЭто, скорее, не тест, а заполнение всего КД в режиме "стек" с последующим частичным контролем записи чтением записанного в режиме "ОЗУ". Пригодится при запуске предыдущих тестов, поэтому стартовый адрес сделан 0200h.

.ORG 00200h
L_0200: LXI D, L_DATA
PUSH D ; сохраняем в стеке ссылку
L_MAIN: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
JZ L_DONE ; переход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 0000h ; заполнение памяти
DAD SP ; SP+0 в HL
SHLD L_SAVE ; сохранить указатель на стек
LXI D, 0FFFFh ; чем заполнять
LXI H, 8000h ; сколько/2
LXI SP,0000h ; свой указатель на стек
L_LOOP: PUSH D ; заполняем через стек...
DCX H
MOV A, L
ORA H
JNZ L_LOOP ; зациклено
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
JMP L_MAIN
;
L_DONE: MVI A, 023h ; 00100011b -- вкл. 3 банк как ОЗУ A000h-DFFFh
OUT 010h ; отправляем в порт
LXI H, 02000h ; считываем -- сколько
LXI B, 01000h ; куда
LXI D, 0C000h ; откуда
CALL L_MOVE
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LXI H, 02000h ; переброска считанного в экран -- сколько
LXI B, 0C000h ; куда
LXI D, 01000h ; откуда
CALL L_MOVE ; наблюдаем и наслаждаемся...
LXI D, L_TEXT
MVI C, 009h
CALL 5 ; вывод сообщения
RET ; выход из программы
;
L_MOVE: LDAX D ; пп переброски данных
STAX B
INX D
INX B
DCX H
MOV A, L
ORA H
JNZ L_MOVE
RET
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- DONE --$"
L_DATA: .db 1Ch ; 00011100b -- вкл. 3 банк как стек на КД
.db 18h ; 00011000b -- вкл. 2 банк как стек на КД
.db 14h ; 00010100b -- вкл. 1 банк как стек на КД
.db 10h ; 00010000b -- вкл. 0 банк как стек на КД
.db 00h ; конец
.END
Эти тесты в откомпилированном виде: 67032

Погонял тесты, поизучал тему "Временные диаграммы Вектора (https://zx-pk.ru/threads/28207-vremennye-diagrammy-vektora.html)", а также даташиты на микросхемы, результаты таковы:
- чтение данных из КД в режиме "ОЗУ" работает без проблем.
- запись данных в КД в режиме "ОЗУ" имеет некоторые проблемы -- иногда в последней четверти записываемого блока размером 2000h не проходит запись по одному-трём случайным байтам, т.е. значение в записываемой ячейке не меняется.
- запись данных в КД в режиме "стек" ни разу ошибок не показала.
- чтение данных из КД в режиме "стек" -- это практически 100% ошибок. Причина там в том, что сигнал "СТЕК" и, соответственно, вырабатываемый по его наличию сигнал "БЛК", приходит слишком поздно, в тот момент, когда на ШАП уже сформирована вторая половина адреса, в результате чего чтение происходит с неправильного адреса памяти КД.

Полагаю, что нужно два исправления:
1. Отключаем блокировку сигнала RAS: у микросхемы Д2 отрезаем от линии BLK_INT (по схеме) вывод 5 и соединяем с выводом 6. Теперь микросхема Д3 будет сохранять все адреса, даже во время регенерации памяти, но, думаю, это будет для неё нормальная нагрузка. Заодно такую же операцию делаем и с выводом 8 той же микросхемы Д2, отключив его от BLK_INT и соединив с выводом 9 -- сигнал CAS так тоже не будет блокироваться.
2. Поднять напряжение +5В (сейчас, если верить моему мультиметру, БП Вектора выдаёт 4,7-4,8В), возможно так память будет лучше работать и пропадут случайные ошибки записи в режиме "ОЗУ".

Improver
29.11.2018, 10:22
Отключение BLK_INT от Д2 дало определённо положительный эффект: теперь тест "Дождь" (http://www.sensi.org/scalar/ware/803/) даже при продолжительном тестировании не показывает ошибок, "Тест квазидиска" (http://www.sensi.org/scalar/ware/620/) тоже, но "жёлтый" тест КД (http://www.sensi.org/scalar/ware/619/) бракует все микросхемы, да и ещё стандартный "Тест устройств" (http://www.sensi.org/scalar/ware/621/) случайным образом бракует чипы. Также MDOS 2.0 (http://sensi.org/scalar/ware/754/) грузится и по "8" не показывает ошибок... но глючит на записи в КД.

Значит, исправляем схему в соответствии с последней доработкой:
https://s8.hostingkartinok.com/uploads/thumbs/2018/11/79ede8458dc17924a3555c382c1229eb.png (https://hostingkartinok.com/show-image.php?id=79ede8458dc17924a3555c382c1229eb)

Новая схема и разводка в архиве (гербер не делал): 67069

И продолжаем тестировать:
Очистка всего КД и заполнение значением 0AA55h в режиме "стек" с последующим контролем и подсчётом ошибок
.ORG 00100h
L_0100: LXI D, L_DATA
PUSH D ; сохраняем в стеке ссылку
L_MAIN: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
JZ L_DONE ; переход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 0000h ; заполнение памяти
DAD SP ; SP+0 в HL
SHLD L_SAVE ; сохранить указатель на стек
LXI D, 0FFFFh ; чем заполнять -- предварительная очистка памяти
LXI H, 8000h ; сколько/2
LXI SP,0000h ; свой указатель на стек
L_LP0: PUSH D ; заполняем через стек...
DCX H
MOV A, L
ORA H
JNZ L_LP0 ; зациклено
LXI D, 0AA55h ; чем заполнять
LXI H, 8000h ; сколько/2
LXI SP,0000h ; свой указатель на стек
L_LP1: PUSH D ; заполняем через стек...
DCX H
MOV A, L
ORA H
JNZ L_LP1 ; зациклено
LXI H, 8000h ; сколько/2
L_LP2: POP B ; вычитываем и проверяем записанное
MOV A, B
CMP D ; если старший байт прочитанного не равен записанному
JNZ L_ERROR ; обработка ошибки
MOV A, C
CMP E ; если младший байт прочитанного не равен записанному
JNZ L_ERROR ; обработка ошибки
L_RET: DCX H
MOV A, L
ORA H
JNZ L_LP2 ; зациклено
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
LXI D, L_TEXT2 ; вывод количества найденных ошибок
MVI C, 009h
CALL 5 ; вывод сообщения
LHLD L_ERRS ; считываем количество
CALL L_BHEX ; выводим H в шестнадцатиричном виде
MOV H, L
CALL L_BHEX ; выводим L в шестнадцатиричном виде
LXI H, 00000h
SHLD L_ERRS ; обнуляем счётчик ошибок
JMP L_MAIN
;
L_ERROR:SHLD L_SAVE2 ; сохранить счётчик
LHLD L_ERRS ; считываем количество ошибок
INX H
SHLD L_ERRS ; количество ошибок +1
LHLD L_SAVE2 ; восстановить счётчик
JMP L_RET ; возврат в цикл
;
L_DONE: LXI D, L_TEXT
MVI C, 009h
CALL 5 ; вывод сообщения
RET ; выход из программы
;
L_BHEX: MOV A, H ; H-входное значение для вывода
RRC
RRC
RRC
RRC ; сдвиг вправо на 4 бита
CALL L_BIT ; выводим старшие 4 бита
MOV A, H ; восстанавливаем значение
L_BIT: ANI 00Fh ; оставляем младшие 4 бита
CPI 00Ah
JM L_B10 ; если меньше 10
ADI 007h ; +7
L_B10: ADI 030h ; +30h
MVI D, 000h
MOV E, A
MVI C, 002h ; вывод символа
PUSH H ; сохраняем HL
CALL 5
POP H ; восстанавливаем HL
RET
;
L_SAVE: .dw 0000h
L_SAVE2:.dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- konec testa --$"
L_TEXT2:.db 0Dh, 0Ah, "o{ibok = $"
L_DATA: .db 1Ch ; 00011100b -- вкл. 3 банк как стек на КД
.db 18h ; 00011000b -- вкл. 2 банк как стек на КД
.db 14h ; 00010100b -- вкл. 1 банк как стек на КД
.db 10h ; 00010000b -- вкл. 0 банк как стек на КД
.db 00h ; конец
L_ERRS: .dw 0000h ; количество ошибок
.ENDТест КД в режиме "ОЗУ" с предварительной полной очисткой, в т.ч. областей по доработке Баркаря, с подсчётом ошибок записи.
.ORG 00100h
L_0100: LXI D, L_DATA ; для начала очистка КД
PUSH D ; сохраняем в стеке ссылку
L_CLEAR:POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
JZ L_NEXT ; переход, если там ноль ---->>>>
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 0000h
DAD SP ; SP+0 в HL
SHLD L_SAVE ; сохранить указатель на стек
LXI D, 0FFFFh ; чем заполнять -- предварительная очистка памяти
LXI H, 8000h ; сколько/2
LXI SP,0000h ; свой указатель на стек
L_LP0: PUSH D ; заполняем КД через стек...
DCX H
MOV A, L
ORA H
JNZ L_LP0 ; зациклено
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
JMP L_CLEAR ; цикл очистки
;
L_NEXT: LXI D, L_TEXT1
MVI C, 009h
CALL 5 ; вывод сообщения об окончании очистки КД
L_CHK: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
JZ L_DONE ; переход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 08000h ; заполнение памяти -- сколько
LXI B, 08000h ; с какого адреса
L_LP1: MVI A, 055h ; чем заполнять
STAX B ; пишем
LDAX B ; читаем в A
CPI 055h ; сравниваем
JZ L_GOOD ; значения равны
PUSH H ; сохранить счётчик
LHLD L_ERRS ; считываем количество ошибок
INX H
SHLD L_ERRS ; количество ошибок +1
POP H ; восстановить счётчик
L_GOOD: INX B
DCX H
MOV A, L
ORA H
JNZ L_LP1 ; пока HL не обнулится
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
EI ; разрешаем прерывания
LXI D, L_TEXT2 ; вывод количества найденных ошибок
MVI C, 009h
CALL 5 ; вывод сообщения
LHLD L_ERRS ; считываем количество
CALL L_BHEX ; выводим H в шестнадцатиричном виде
MOV H, L
CALL L_BHEX ; выводим L в шестнадцатиричном виде
LXI H, 00000h
SHLD L_ERRS ; обнуляем счётчик ошибок
JMP L_CHK ; цикл проверки
;
L_DONE: LXI D, L_TEXT
MVI C, 009h
CALL 5 ; вывод сообщения об окончании проверки КД
RET ; выход из программы
;
L_BHEX: MOV A, H ; H-входное значение для вывода
RRC
RRC
RRC
RRC ; сдвиг вправо на 4 бита
CALL L_BIT ; выводим старшие 4 бита
MOV A, H ; восстанавливаем значение
L_BIT: ANI 00Fh ; оставляем младшие 4 бита
CPI 00Ah
JM L_B10 ; если меньше 10
ADI 007h ; +7
L_B10: ADI 030h ; +30h
MVI D, 000h
MOV E, A
MVI C, 002h ; вывод символа
PUSH H ; сохраняем HL
CALL 5
POP H ; восстанавливаем HL
RET
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- konec testa --$"
L_TEXT1:.db 0Dh, 0Ah, "-- o~istka kd wypolnena --$"
L_TEXT2:.db 0Dh, 0Ah, "o{ibok = $"
L_DATA: .db 01Ch ; 00011100b -- вкл. 3 банк как стек на КД
.db 018h ; 00011000b -- вкл. 2 банк как стек на КД
.db 014h ; 00010100b -- вкл. 1 банк как стек на КД
.db 010h ; 00010000b -- вкл. 0 банк как стек на КД
.db 000h ; на второй этап
.db 0E3h ; 11100011b -- вкл. 3 банк как ОЗУ 8000h-FFFFh
.db 0E2h ; 11100010b -- вкл. 2 банк как ОЗУ 8000h-FFFFh
.db 0E1h ; 11100001b -- вкл. 1 банк как ОЗУ 8000h-FFFFh
.db 0E0h ; 11100000b -- вкл. 0 банк как ОЗУ 8000h-FFFFh
.db 000h ; конец
L_ERRS: .dw 0000h ; количество ошибок
.ENDАналогичен предыдущему тесту, только тут тестирование выполняются в два этапа -- сначала цикл записи, а потом цикл проверки. В конце также показывается количество ошибок.
.ORG 00100h
L_0100: LXI D, L_DATA ; для начала очистка КД
PUSH D ; сохраняем в стеке ссылку
L_CLEAR:POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
JZ L_NEXT ; переход, если там ноль ---->>>>
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 0000h
DAD SP ; SP+0 в HL
SHLD L_SAVE ; сохранить указатель на стек
LXI D, 0FFFFh ; чем заполнять -- предварительная очистка памяти
LXI H, 8000h ; сколько/2
LXI SP,0000h ; свой указатель на стек
L_LP0: PUSH D ; заполняем КД через стек...
DCX H
MOV A, L
ORA H
JNZ L_LP0 ; зациклено
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
JMP L_CLEAR ; цикл очистки
;
L_NEXT: LXI D, L_TEXT1
MVI C, 009h
CALL 5 ; вывод сообщения об окончании очистки КД
L_CHK: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
JZ L_DONE ; переход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 08000h ; заполнение памяти -- сколько
LXI B, 08000h ; с какого адреса
L_LP1: MVI A, 055h ; чем заполнять
STAX B ; пишем
INX B
DCX H
MOV A, L
ORA H
JNZ L_LP1 ; пока HL не обнулится
LXI H, 08000h ; считываем -- сколько
LXI B, 08000h ; с какого адреса
L_LP2: LDAX B ; читаем в A
CPI 055h ; сравниваем
JZ L_GOOD ; значения равны
PUSH H ; сохранить счётчик
LHLD L_ERRS ; считываем количество ошибок
INX H
SHLD L_ERRS ; количество ошибок +1
POP H ; восстановить счётчик
L_GOOD: INX B
DCX H
MOV A, L
ORA H
JNZ L_LP2 ; пока HL не обнулится
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
EI ; разрешаем прерывания
LXI D, L_TEXT2 ; вывод количества найденных ошибок
MVI C, 009h
CALL 5 ; вывод сообщения
LHLD L_ERRS ; считываем количество
CALL L_BHEX ; выводим H в шестнадцатиричном виде
MOV H, L
CALL L_BHEX ; выводим L в шестнадцатиричном виде
LXI H, 00000h
SHLD L_ERRS ; обнуляем счётчик ошибок
JMP L_CHK ; цикл проверки
;
L_DONE: LXI D, L_TEXT
MVI C, 009h
CALL 5 ; вывод сообщения об окончании проверки КД
RET ; выход из программы
;
L_BHEX: MOV A, H ; H-входное значение для вывода
RRC
RRC
RRC
RRC ; сдвиг вправо на 4 бита
CALL L_BIT ; выводим старшие 4 бита
MOV A, H ; восстанавливаем значение
L_BIT: ANI 00Fh ; оставляем младшие 4 бита
CPI 00Ah
JM L_B10 ; если меньше 10
ADI 007h ; +7
L_B10: ADI 030h ; +30h
MVI D, 000h
MOV E, A
MVI C, 002h ; вывод символа
PUSH H ; сохраняем HL
CALL 5
POP H ; восстанавливаем HL
RET
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- konec testa --$"
L_TEXT1:.db 0Dh, 0Ah, "-- o~istka kd wypolnena --$"
L_TEXT2:.db 0Dh, 0Ah, "o{ibok = $"
L_DATA: .db 01Ch ; 00011100b -- вкл. 3 банк как стек на КД
.db 018h ; 00011000b -- вкл. 2 банк как стек на КД
.db 014h ; 00010100b -- вкл. 1 банк как стек на КД
.db 010h ; 00010000b -- вкл. 0 банк как стек на КД
.db 000h ; на второй этап
.db 0E3h ; 11100011b -- вкл. 3 банк как ОЗУ 8000h-FFFFh
.db 0E2h ; 11100010b -- вкл. 2 банк как ОЗУ 8000h-FFFFh
.db 0E1h ; 11100001b -- вкл. 1 банк как ОЗУ 8000h-FFFFh
.db 0E0h ; 11100000b -- вкл. 0 банк как ОЗУ 8000h-FFFFh
.db 000h ; конец
L_ERRS: .dw 0000h ; количество ошибок
.ENDАрхив с откомпилированными тестами: 67070

Что получается:
1. Тест в режиме "стек" ни разу не показал ни одной ошибки. :)
2. Тест в режиме "ОЗУ" в один этап показывает от 0 до 10 случайных ошибок, в два этапа до 30. Это плохо... Есть подозрение на большие задержки в Д5 и Д6, но, с другой стороны, данные на ШАВВ должны появляться раньше, чем на ШАП будет сформирован полный адрес. Надо ещё подумать...

И ещё остаётся питание. Проблемы в нём точно есть, но пока у меня не готов БП на замену.

Improver
05.12.2018, 14:46
Ну что ж... Могу констатировать, что квази-диск работает! :v2_dizzy_punk:
В кратце: написал очередной супер-мега-тест, и он показал, что при ошибках записи данных в режиме ОЗУ запись происходит по неверному адресу, сбой происходит на 12 и 11 бите адреса, причём во всех случаях вместо "1" там попадает "0". Заменил микросхему Д4 с 74HC244 на 74ABT240 -- по выводам они полностью совпадают, только 240-я с инверсией выходов и быстрее (20нс против 5,5нс), ну и как результат -- теперь все тесты проходят на 100% без ошибок, МДОСы работают и не глючат, файлы на КД сохраняются... Правда, я не уверен точно, инверсия адреса на это повлияла, или скорость, но КД заработал, факт.

И да, чем тестировал и нашёл причину сбоев:Алгоритм теста такой:
1. Очищаем весь КД в режиме "стек" (заполняем 0FFh).
2. Пишем байт в режиме ОЗУ в доступной области.
3. Считываем и проверяем -- если совпало с записанным, то стираем и идём к следующему адресу и в п.2
4. Если не совпало и не равно 0FFh -- выводим ошибку, стираем и к следующему адресу и в п.2.
5. Если не совпало и равно 0FFh -- выводим ошибку.
6. Ищем по всему диску в режиме "стек" байт, не равный 0FFh и если находим, то выводим его адрес и значение, очищаем и снова в п.2.

Вот как-то так... А результаты можно интерпретировать так:
- если байты в момент сбоя не пишутся на КД вообще -- это проблема с сигналом WE (ЗПЗУ).
- если байты пишутся по неправильному адресу -- проблема с адресной шиной, микросхемами Д3 или Д4. По результатам теста можно сравнить адреса и определить сбойные биты.
- ну третий вариант -- пишется неправильный байт (такого не было). Тогда надо проверять шину данных или циклы записи...

Откомпилированный тест в архиве: 67172
Исходники теста на ассемблере:
.ORG 00100h
L_0100: LXI D, L_DTST ; для начала очистка КД
PUSH D ; сохраняем в стеке ссылку
L_CLEAR:POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
JZ L_NEXT ; переход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 0000h
DAD SP ; SP+0 в HL
SHLD L_SAVE ; сохранить указатель на стек
LXI D, 0FFFFh ; чем заполнять -- предварительная очистка памяти
LXI H, 8000h ; сколько/2
LXI SP,0000h ; свой указатель на стек
L_LP0: PUSH D ; заполняем КД через стек...
DCX H
MOV A, L
ORA H
JNZ L_LP0 ; зациклено
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
JMP L_CLEAR ; цикл очистки
;
L_NEXT: LXI D, L_TEXT1
MVI C, 009h
CALL 5 ; вывод сообщения об окончании очистки КД
LXI D, L_DTOZU ; ссылка на кофигурацию КД "ОЗУ"
PUSH D ; сохраняем в стеке ссылку
L_CHK: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
JZ L_DONE ; переход, если там ноль ---->>>>
INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 08000h ; заполнение памяти -- сколько
LXI B, 08000h ; с какого адреса
L_LP1: MVI A, 055h ; чем заполнять
STAX B ; пишем
MOV A, M ; читаем в A из другой ячейки (для смены адреса)
LDAX B ; читаем записанное ранее в A
CPI 055h ; сравниваем
JZ L_GOOD ; значения равны -- двигаемся дальше...
MOV D, A ; сохраняем считанное значение в D
MVI A, 0FFh ; очищаем найденную ячейку
STAX B ; пишем
STAX B ; пишем второй раз, для надёжности
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
EI ; разрешаем прерывания
PUSH H ; сохранить счётчики
PUSH B
PUSH D ; сохраняем D
LXI D, L_TEXT2 ; сообщение об ошибке по адресу
MVI C, 009h
CALL 5 ; вывод сообщения
POP D
POP H ; восстанавливаем адрес
PUSH H
PUSH D ; сохраняем D
CALL L_BHEX ; выводим старший байт адреса в шестнадцатиричном виде
MOV H, L
CALL L_BHEX ; выводим младший байт адреса в шестнадцатиричном виде
LXI D, L_TEXT3 ; сообщение о считанном байте
MVI C, 009h
CALL 5 ; вывод сообщения
POP H ; восстанавливаем плохой байт
CALL L_BHEX ; выводим считанный байт в шестнадцатиричном виде
MOV A, H
CPI 0FFh ; сравниваем c 0FFh
CZ L_FDATA ; если так, то запускаем поиск по всему КД
POP B ; восстановить счётчики
POP H
POP D ; считываем адрес на конфигурацию КД
PUSH D ; и сохраняем
DCX D
LDAX D ; загружаем A по ссылке
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт -- снова включаем КД
L_GOOD: MVI A, 0FFh ; очищаем ячейку
STAX B ; пишем
STAX B ; пишем второй раз, для надёжности
INX B
DCX H
MOV A, L
ORA H
JNZ L_LP1 ; пока HL не обнулится
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
EI ; разрешаем прерывания
LXI D, L_TEXT4 ; сообщение о переходе к другому банку КД
MVI C, 009h
CALL 5 ; вывод сообщения
JMP L_CHK ; цикл проверки
;
L_DONE: LXI D, L_TEXT
MVI C, 009h
CALL 5 ; вывод сообщения об окончании проверки КД
RET ; выход из программы
;
L_BHEX: MOV A, H ; H-входное значение для вывода
RRC
RRC
RRC
RRC ; сдвиг вправо на 4 бита
CALL L_BIT ; выводим старшие 4 бита
MOV A, H ; восстанавливаем значение
L_BIT: ANI 00Fh ; оставляем младшие 4 бита
CPI 00Ah
JM L_B10 ; если меньше 10
ADI 007h ; +7
L_B10: ADI 030h ; +30h
MVI D, 000h
MOV E, A
MVI C, 002h ; вывод символа
PUSH H ; сохраняем HL
CALL 5
POP H ; восстанавливаем HL
RET
;
; ПП поиска по всему КД
L_FDATA:LXI D, L_TEXT5 ; сообщение о начале поиска на КД
MVI C, 009h
CALL 5 ; вывод сообщения
LXI D, L_DTST ; конфигурация КД
PUSH D ; сохраняем в стеке ссылку
L_FNC: POP D ; считываем ссылку
LDAX D ; загружаем A по ссылке
ORA A
JNZ L_FNXT ; если не ноль
LXI D, L_TEXT6 ; сообщение о том, что ничего не нашли
MVI C, 009h
CALL 5 ; вывод сообщения
RET ; выход из ПП ---->>>>
L_FNXT: INX D ; DE=DE+1
PUSH D ; сохраняем в стеке новую ссылку
DI ; запрещаем прерывания
OUT 010h ; отправляем в порт
LXI H, 0000h
DAD SP ; SP+0 в HL
SHLD L_SAVE ; сохранить указатель на стек
LXI H, 00000h ; нач.адрес
LXI SP,00000h ; свой указатель на стек
L_LPF: POP D ; считываем из стека два байта
MOV A, E
CPI 0FFh ; если младший байт прочитанного не равен 0FFh
JNZ L_FERR ; выход из цикла с сообщением
INX H ; адрес +1
MOV A, D
CPI 0FFh ; если старший байт прочитанного не равен 0FFh
JNZ L_FERR ; выход из цикла с сообщением
INX H ; адрес +1
MOV A, L
ORA H
JNZ L_LPF ; зациклено, пока адрес не обнулится
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
LXI D, L_TEXT4 ; сообщение о переходе к другому банку КД
MVI C, 009h
CALL 5 ; вывод сообщения
JMP L_FNC ; цикл поиска
;
L_FERR: STA L_EBYT ; сохраняем найденный байт
SHLD L_EADR ; сохраняем адрес
LXI D, 0FFFFh ; очищаем ячейку
PUSH D
XRA A ; обнуляем аккумулятор
OUT 010h ; отправляем в порт -- отключаем КД
LHLD L_SAVE ; считать сохранённый указатель на стек в HL
SPHL ; восстанавливаем SP
EI ; разрешаем прерывания
POP D ; считываем ссылку (для удаления её из стека)
LXI D, L_TEXT2 ; сообщение об ошибке по адресу
MVI C, 009h
CALL 5 ; вывод сообщения
LHLD L_EADR ; читаем найденный адрес
CALL L_BHEX ; выводим старший байт адреса в шестнадцатиричном виде
MOV H, L
CALL L_BHEX ; выводим младший байт адреса в шестнадцатиричном виде
LXI D, L_TEXT3 ; сообщение о считанном байте
MVI C, 009h
CALL 5 ; вывод сообщения
LDA L_EBYT ; читаем найденный байт
MOV H, A
CALL L_BHEX ; выводим считанный байт в шестнадцатиричном виде
RET ; завершаем поиск
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- konec testa --$"
L_TEXT1:.db 0Dh, 0Ah, "-- o~istka kd wypolnena --$"
L_TEXT2:.db 0Dh, 0Ah, "o{ibka po adresu $"
L_TEXT3:.db ", s~itan bajt: $"
L_TEXT4:.db 0Dh, 0Ah, "perehod k sledu`}emu"
.db " banku kd $"
L_TEXT5:.db 0Dh, 0Ah, "i}em bajt na kd...$"
L_TEXT6:.db 0Dh, 0Ah, "ni~ego ne na{li. :-)"
.db " prodolvaem test.$"
L_DTST: .db 01Ch ; 00011100b -- вкл. 3 банк как стек на КД
.db 018h ; 00011000b -- вкл. 2 банк как стек на КД
.db 014h ; 00010100b -- вкл. 1 банк как стек на КД
.db 010h ; 00010000b -- вкл. 0 банк как стек на КД
.db 000h ; конец
L_DTOZU:.db 0E3h ; 11100011b -- вкл. 3 банк как ОЗУ 8000h-FFFFh
.db 0E2h ; 11100010b -- вкл. 2 банк как ОЗУ 8000h-FFFFh
.db 0E1h ; 11100001b -- вкл. 1 банк как ОЗУ 8000h-FFFFh
.db 0E0h ; 11100000b -- вкл. 0 банк как ОЗУ 8000h-FFFFh
.db 000h ; конец
L_EADR: .dw 0000h
L_EBYT: .db 00h
.END
Окончательный вариант схемы КД сделаю и выложу тут чуть позже... Хотя, он мало отличается от предыдущего.

svofski
05.12.2018, 15:42
Поздравляю! Следующим этапом дисковод? Или дисковод уже есть?

Improver
05.12.2018, 16:26
Поздравляю! Следующим этапом дисковод? Или дисковод уже есть?Спасибо. :)
Не, не хочу что-то возиться с дискетами... Думаю о подключении жесткого диска -- у меня как раз завалялся такой вот IDE на 64 мегабайта:
https://www.dreamhardware.com/media/catalog/product/cache/1/base_image/1200x/17f82f742ffe127f42dca9de82fb58b1/t/r/transcend_64mb_1_.jpg
Где-то ещё его применить, из-за малого объёма, не получится, а для Вектора будет в самый раз.

svofski
05.12.2018, 16:41
Твердость диска это хорошо, но для Вектора есть некоторое количество программ, хотя наверное не очень большое, которые общаются с контроллером дисковода напрямую. В основном это демки, конечно.

У меня еще были тайные помыслы сделать простой адаптер SD-карт. Чтобы он был железно прост и потому легко повторим. Опять же, блаженные пуристы, не зная ничего про контроллер флеша в SD-карте, будут думать, что их дисковод не сложнее их компьютера (спойлер: все равно они будут заблуждаться). А со стороны Вектора написать для него драйвер для МикроДОС-а и, может быть, загрузчик. Но я даже не пробовал задуматься, что на самом деле потребуется для такого проекта.

Improver
06.12.2018, 11:04
Вот проверенная работающая схема КД:
67187

Изменения по отношению к предыдущей версии:
- заменена микросхема Д4 на 74АВТ240
- вернул блокировку сигнала CAS -- на ошибки КД это никак не влияет, но пригодится при совместной работе с другими дисками.

Архив со схемой, разводкой платы и гербер-архивом платы, урезанной до 100х94мм: 67188

- - - Добавлено - - -


Твердость диска это хорошо, но для Вектора есть некоторое количество программ, хотя наверное не очень большое, которые общаются с контроллером дисковода напрямую. В основном это демки, конечно.Меня это не сильно пугает. Понадобится дисковод -- сделаю потом... :) Кстати, появилась ещё пара идей, чем заняться в выходные: во-первых, подключить батарейку к памяти КД, чтобы не терять данные при выключении, разводка-то уже вся есть. Думаю, для начала попробовать простую CR2032. Во-вторых, попробовать подключить второй КД к первому. Можно сделать его так, чтобы работал только в режиме "стек" -- замены ОЗУ хватит и с одного диска. Естественно, надо будет что-то придумывать с ОС, или написать свою програмку-копировщик с одного КД на другой.


У меня еще были тайные помыслы сделать простой адаптер SD-карт. Чтобы он был железно прост и потому легко повторим. Опять же, блаженные пуристы, не зная ничего про контроллер флеша в SD-карте, будут думать, что их дисковод не сложнее их компьютера (спойлер: все равно они будут заблуждаться). А со стороны Вектора написать для него драйвер для МикроДОС-а и, может быть, загрузчик. Но я даже не пробовал задуматься, что на самом деле потребуется для такого проекта.Тоже интересная идея. А начать её можно с драйвера FAT для Вектора, чтобы можно было отформатированные на PC дискетки читать, а потом уже переходить к SD... Это если не делать обращение к SD аппаратным, эмулирующим ту же дискету.

Improver
11.12.2018, 11:00
Для тех, кто пока не заменил загрузчик на Векторе (как я) на более новый, сделал запуск системы с КД в виде отдельной программки:
Собственно загрузчик, стартует с адреса 7E00h, указанного в первой строке:
.ORG 07E00h
L_7E00: LXI H, 0FF00h ; проверка наличия КД
SHLD 0DED5h
XRA A
STA 0DED2h
STA 0DED3h
INR A
STA 0DED4h
CALL L_0576
CALL Lx04E8 ; проверка наличия OS.COM
JZ L_7E00 ; возврат.
; переход на загрузку с КД
L_050C: LXI H, 00100h
SHLD 0DED5h
MOV B, H
LXI H, 0FF10h ; ссылка на первую запись в директории на КД +10h
L_051E: MVI C, 010h ; <<<---- цикл
L_0520: MOV A, M
ORA A
JZ 0100h ; --------->>>>>>>>> запуск системы
PUSH PSW
PUSH H
STA 0DED3h
MVI A, 001h
L_0553: STA 0DED4h
PUSH PSW
CALL L_0576
JZ L_0562
MVI A, 0FFh
STA 0DED2h
L_0562: POP PSW
LHLD 0DED5h
LXI D, 00080h
DAD D
SHLD 0DED5h
INR A
CPI 009h
JNZ L_0553
POP H
POP PSW
MOV A, B
ADI 004h
MOV B, A
LDA 0DED2h
ORA A
JNZ L_7E00 ; что-то не так.... сброс.
INX H
DCR C
JNZ L_0520
CALL L_04E9 ; проверка наличия OS.COM
JZ 0100h ; ------>>>>>>> запуск 2
LXI D, 0010h
DAD D
JMP L_051E
;
L_0576: PUSH B
PUSH D
LXI H, 00000h
DAD SP
SHLD 0DED0h
LDA 0DED4h
LXI D, 0FF80h
LXI H, 00400h
L_05B8: DAD D
DCR A
JNZ L_05B8
XCHG
LDA 0DED3h
CMA
CPI 0FCh
JNC L_05C9
SUI 010h
L_05C9: SUI 004h
MOV L, A
RLC
RLC
ANI 0FCh
MOV H, A
MOV A, L
MVI L, 000h
DAD D
RLC
RLC
RLC
RLC
ANI 00Ch
PUSH B
MOV C, A
MVI A, 010h
ORA C
POP B
DI
OUT 010h ; подключаем КД
SPHL
LHLD 0DED5h
XRA A
MVI C, 020h
L_058C: POP D ; грузим в цикле
ADD E
ADD D
MOV M, E
INX H
MOV M, D
INX H
;
POP D
ADD E
ADD D
MOV M, E
INX H
MOV M, D
INX H
;
DCR C
JNZ L_058C
MOV C, A
MVI A, 000h ; отключаем КД
OUT 010h
LHLD 0DED0h
SPHL
EI
MOV A, C
PUSH PSW
PUSH D
LXI H, 00000h
DAD SP
SHLD 0DED0h
LDA 0DED3h
MOV L, A
MVI H, 000h
DAD H
DAD H
DAD H
DAD H
MVI A, 0F0h
ADD H
MOV H, A
LDA 0DED4h
DCR A
ADD A
ADD L
MOV L, A
MVI A, 01Ch ; подключаем КД
DI
OUT 010h
SPHL
POP D
MVI A, 000h ; отключаем КД
OUT 010h
LHLD 0DED0h
SPHL
EI
XCHG
POP D
POP PSW
CMP H
JNZ L_061D
SUB L
JZ L_061E
L_061D: MVI A, 0FFh
L_061E: POP D
POP B
RET
;
Lx04E8: MVI A, 000h
JNZ L_04FE
LXI H, 0FF00h
L_04E9: PUSH H
LXI D, L_0500 ; ссылка на строку "OS COM"
MVI C, 00Ch
L_04EF: LDAX D
CMP M
MVI A, 000h
JNZ L_04FD
INX D
INX H
DCR C
JNZ L_04EF
DCR A
L_04FD: POP H
L_04FE: ORA A
RET
;
L_0500:.db 000h ; <_>
.db 04Fh ; <O>
.db 053h ; <S>
.db 020h ; < >
.db 020h ; < >
.db 020h ; < >
.db 020h ; < >
.db 020h ; < >
.db 020h ; < >
.db 043h ; <C>
.db 04Fh ; <O>
.db 04Dh ; <M>
.END
Программка-перемещалка для возможности запуска с адреса 0100h
.ORG 00100h
L_0100: LXI H, 0038h ; адрес для ПП прерываний RST7
MVI A, 0C9h ; записываем туда код RET
LXI H, 013Ch ; сколько
LXI D, L_1000+3 ; откуда
LXI B, 07E00h ; куда
L_018C: LDAX D ; переброска данных
STAX B
INX D
INX B
DCX H
MOV A, L
ORA H
JNZ L_018C
L_1000: JMP 07E00h ; запускаем то, что перебрасывали
;
.END
Инструкция по сборке:
1. Компилируем оба фрагмента
2. Копируем бинарники в один файл, сначала модуль перемещения, а потом загрузчик, например, так:

copy /b MOVER.obj+BOOTKD.obj BOOTKD.romАрхив с откомпилированным и собранным загрузчиком: 67266
После загрузки просто запускаем по БЛК-СБРОС и если на КД записана ОС, то она сразу стартует.

Сам код взял из загрузчика BOOT45 (http://www.sensi.org/scalar/ware/541/), сильно не оптимизировал, почти всё оставил, как было, главное -- он работает. :)

ivagor
11.12.2018, 17:10
Или вот вариант сокращенный до одного блока

Improver
30.01.2019, 10:38
Нашёл небольшой косяк в своей схеме КД: если попытаться присоединить два и более КД к Вектору, то они работать не будут. Причина в D12.D, выходы этой микросхемы нельзя объединять по схеме "монтажное И", для этого требуется микросхема с открытым коллектором на выходе. Можно, конечно, заменить 74HC86 (кр1564лп5) на 74ALS136 (кр1533лп12), подтянув к плюсу все четыре её выхода, но я решил пойти другим путём, а именно для сигнала БЛК использовать одиночный буфер SN74LVC1G07DBVR (https://www.chipdip.ru/product/sn74lvc1g07dbvr-3), а микросхему D12 оставить только для выбора адреса КД. Впаял этот буфер "на соплях" с предыдущий вариант схемы диска -- всё работает. Вот обновлённая схема:

67881
https://s8.hostingkartinok.com/uploads/thumbs/2019/01/31734dd9e4764e9aa88a2eae23609a8e.png (https://hostingkartinok.com/show-image.php?id=31734dd9e4764e9aa88a2eae23609a8e)
И архив со схемой, разводкой платы и гербер-архивом для изготовления: 67882
Примечание: На втором и всех последующих подключаемых квази-дисках сопротивление R3 ставить не обязательно.