nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 20 Apr 2024 04:36



Reply to topic  [ 27 posts ]  Go to page 1, 2  Next
Квазидиск для Радио-86РК 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22545
Location: Silicon Valley
Reply with quote
Как известно, классический РК-86 имеет в своём мониторе команду R, которая считывает байты из ROM-диска, подключенного ко второму ВВ55 (адреса #Axxx). Классическая схема подразумевает, что порт А запрограммирован на ввод и подключен к шине данных внешних ПЗУх, а порты B и C запрограммированы на вывод и формируют младший байт адреса и старший байт адреса соответственно, причем C7 идёт на OE ПЗУх, т.е. перебираемых адресов всего 32К (хотя монитор не глядя посылает все 16 бит в качестве адреса, правда после окончания передачи, он всегда пишет #FF в порт C).

Есть разные схемы, преодолевающие 32К лимит, например со счётчиком, кнопкой и 7-сегментным индикатором (см. тут) - при этом пользователь вручную переключает странички, или схема с регистром, защёлкивающим порт B, несовместимая с командой монитора R, т.к. много битов порта C являются управляющими сигналами (см. тут)...

Хотелось бы получить такой вариант, который был бы на 100% совместим с классическим монитором, но в тоже время позволял бы программно переключать страницы. Первая мысль была выкинуть ВВ55 и заменить её одним буфером и тремя регистрами, при этом по адресу #A002 стало бы возможным записывать третий байт адреса, однако такой вариант не был бы совместимым с классической РК, в которой ВВ55 неубираем...

_________________
:dj: https://mastodon.social/@Shaos


Last edited by Shaos on 20 Jan 2014 03:55, edited 2 times in total.



18 Jan 2014 23:06
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22545
Location: Silicon Valley
Reply with quote
Post 
Короче идея такая, ВВ55 при сбросе устанавливает все порты на ввод (причём будучи перепрограммированным на вывод, порт сразу же выдаст нули), а монитор этот ВВ55 не перепрограммирует пока не будет вызывана команда R, хотя и пишет #FF по адресу #A002 при инициализации и после выполнения каждой команды.

Мы берём тот же C7, которым управляется выход OE ПЗУх, подтягиваем его резистором к +5В и пускаем его как CLK на регистр со сбросом 74174, защёлкивающий 6 младших битов порта C при переходе С7 от 0 к 1. Если я всё правильно понимаю, сразу после инициализации, в этом регистре будет 0, который будет там оставаться при первом вызове команды монитора R (т.к. монитор пошлёт #FF в порт C только по окончании команды R), т.е. по умолчанию, R будет работать с нулевым 32К окном. Далее, чтобы сдвинуться скажем в первое окно, надо записать по адресу #A002 байт #01 и следом за ним #81 туда же, что должно защёлкнуть 000001 в регистре, сдвинув окно. Из этих 6 битов младшие 5 будут формировать адреса A15, A16, A17, A18, A19, покрывая 1 мегабайт (2 флешины по 512K), а старший бит будет включать режим записи (переподавая C7 на WE вместо OE в случае единицы):
Code:
C5R C7 | OE WE
--------------
 0  0  |  0 1
 0  1  |  1 1
 1  0  |  1 0
 1  1  |  1 1

P.S. Можно сделать так, что посылка #FF в порт C будет сбрасывать регистр в нули (единичками в битах 6 и 7) и возвращать схему из режима записи, если она там была...

_________________
:dj: https://mastodon.social/@Shaos


Last edited by Shaos on 19 Jan 2014 11:24, edited 3 times in total.



19 Jan 2014 00:15
Profile WWW
Junior

Joined: 05 Dec 2011 23:40
Posts: 7
Location: 46.254.245.97
Reply with quote
Post 
Shaos, Зачем использовать директиву R? Ведь плевое дело накорябать нечто вроде ДОСа.


19 Jan 2014 00:29
Profile
Fanat

Joined: 27 May 2011 04:25
Posts: 79
Location: Perm
Reply with quote
Post 
А если значение порта С защелкивать на предмет старших бит в момент прихода на порт B последнего значения из специальной последовательности, например, AA 55 A5 5A 86? Хотя, тут есть сложность, так как схема асинхронная... Распознавание должно происходить в момент смены значения старшего бита, а реальная последовательность записи в порт 2A AA C5 55 25 A5 CA 5A 06 86.
Сложновато, но как концепт...


19 Jan 2014 02:02
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22545
Location: Silicon Valley
Reply with quote
Post 
vovik_vm wrote:
Shaos, Зачем использовать директиву R?...

Для начальной загрузки нечта вроде ДОСа :)

_________________
:dj: https://mastodon.social/@Shaos


19 Jan 2014 04:16
Profile WWW
Junior

Joined: 05 Dec 2011 23:40
Posts: 7
Location: 46.254.245.97
Reply with quote
Post 
Есть же свободные 6Кб в мониторе.


19 Jan 2014 04:50
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22545
Location: Silicon Valley
Reply with quote
Post 
vovik_vm wrote:
Есть же свободные 6Кб в мониторе.

Для ДОСа их не хватит, да к тому же в оригинальном РК нету свободных 6Кб в мониторе, а хотелось бы заполучить универсальное решение :)

_________________
:dj: https://mastodon.social/@Shaos


19 Jan 2014 08:35
Profile WWW
Senior
User avatar

Joined: 11 Jun 2012 07:30
Posts: 128
Reply with quote
Post 
Вот тут vinxru, кажется, реализовал что-то похожее по идеологии:

http://zx-pk.ru/wiki/ROM-%D0%B4%D0%B8%D1%81%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%B0_%D0%90%D0%BF%D0%BE%D0%B3%D0%B5%D0%B9-%D0%91%D0%9A01

http://zx-pk.ru/showthread.php?t=17316

Quote:
Апогей умеет работать только с ПЗУ объемом 64 Кб. Для подключения картриджа объемом 1 Мб потребуется меппер. Меппер я придумал простой, один регистр. При обращении к адресам 8000h, 8001h, 8002h, 8003h..., будет выбираться страница. Размер страницы 32 Кб.

Из монитора Апогея загрузка будет выглядеть так

R8002 (Выбор банка 2)
R3200,45F4,100 (Загрузить область ПЗУ 3200-45F4 в ОЗУ 100-14F4)

Что бы не помнить для всех программ этих цифр, я написал загрузчик. Он загружается простой и запоминающейся командой: "R0,1000". Далее пользователь выбирает стрелками нужную программу и нажимает Enter.
Quote:
Помимо ПЗУ, эта схема ROM-диска содержит микросхему К555ТМ9 и два конденсатора.
ПЗУ разделено на 16 страниц по 32 Кб. Микросхема К555ТМ9 хранит номер выбранной страницы. То есть выход микрсохемы ТМ9 подключен к линиям адреса A15,A16,A17,A18 ПЗУ. Запись номера страницы в ТМ9 осуществляется чтением адресов 8000h-800Fh.
В начале каждой страницы ПЗУ записана программа загрузчик. Это что бы пользователю не приходилось выбирать номер страницы вручную. Загрузчик предлагает пользователю в удобной форме выбрать нужную программу. Затем программа включает нужные страницы ПЗУ, загружает программу в ОЗУ и запускает её.


05 Mar 2014 10:41
Profile WWW
Fanat

Joined: 16 May 2007 01:01
Posts: 93
Location: 212.5.73.205
Reply with quote
Shaos wrote:
Как известно, классический РК-86 имеет в своём мониторе команду R, которая считывает байты из ROM-диска, подключенного ко второму ВВ55 (адреса #Axxx). Классическая схема подразумевает, что порт А запрограммирован на ввод и подключен к шине данных внешних ПЗУх, а порты B и C запрограммированы на вывод и формируют младший байт адреса и старший байт адреса соответственно, причем C7 идёт на OE ПЗУх, т.е. перибераемых адресов всего 32К (хотя монитор не глядя посылает все 16 бит в качестве адреса, правда после окончания передачи, он всегда пишет #FF в порт C)....

Бессмыслено писать в порт С #FF.
ПЗУ ни коим боком не контактирует с шинами РК и ни с кем не конфликтует. Всё общение с РК через ВВ55. Так что просто ROMдиск имеет максимальный размер 64Кбт. А CS на ПЗУ должен глухо сидеть на общем проводе. Такой вариант логичен и прост для ROMдиска. Скорей всего этот байт #FF (старший разряд D7) должен отключать питание с ROMдиска. Но стоит ли функция отключения питания ПЗУ половины объема ROMдиска? Не стоит, потому и нужно использовать все 64Кбт. А то что потом пишет процик в порт С по барабану и для ПЗУ и для ВВ55.


06 Mar 2014 09:55
Profile
God
User avatar

Joined: 13 Nov 2010 04:06
Posts: 1345
Reply with quote
Post 
А просто изменить в Мониторе директиву R так, как нужно, под своё железо?


06 Mar 2014 10:02
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22545
Location: Silicon Valley
Reply with quote
Post Re:
alexcp wrote:
Вот тут vinxru, кажется, реализовал что-то похожее по идеологии:

http://zx-pk.ru/wiki/ROM-%D0%B4%D0%B8%D1%81%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%B0_%D0%90%D0%BF%D0%BE%D0%B3%D0%B5%D0%B9-%D0%91%D0%9A01

http://zx-pk.ru/showthread.php?t=17316

Quote:
Апогей умеет работать только с ПЗУ объемом 64 Кб. Для подключения картриджа объемом 1 Мб потребуется меппер. Меппер я придумал простой, один регистр. При обращении к адресам 8000h, 8001h, 8002h, 8003h..., будет выбираться страница. Размер страницы 32 Кб.

Из монитора Апогея загрузка будет выглядеть так

R8002 (Выбор банка 2)
R3200,45F4,100 (Загрузить область ПЗУ 3200-45F4 в ОЗУ 100-14F4)

Что бы не помнить для всех программ этих цифр, я написал загрузчик. Он загружается простой и запоминающейся командой: "R0,1000". Далее пользователь выбирает стрелками нужную программу и нажимает Enter.
Quote:
Помимо ПЗУ, эта схема ROM-диска содержит микросхему К555ТМ9 и два конденсатора.
ПЗУ разделено на 16 страниц по 32 Кб. Микросхема К555ТМ9 хранит номер выбранной страницы. То есть выход микрсохемы ТМ9 подключен к линиям адреса A15,A16,A17,A18 ПЗУ. Запись номера страницы в ТМ9 осуществляется чтением адресов 8000h-800Fh.
В начале каждой страницы ПЗУ записана программа загрузчик. Это что бы пользователю не приходилось выбирать номер страницы вручную. Загрузчик предлагает пользователю в удобной форме выбрать нужную программу. Затем программа включает нужные страницы ПЗУ, загружает программу в ОЗУ и запускает её.

Да действительно - очень похоже :)

Только без возможности записи и номер страницы задаётся младшим байтом адреса вместо старшего:

Attachment:
Apogey_bk01_romdisk4.jpg
Apogey_bk01_romdisk4.jpg [ 57.43 KiB | Viewed 1365 times ]

P.S. и тут похоже даже чтение делать не надо, как в описании написано, а просто записать адрес #800X в порты половинок адреса и всё - CLK перескочит с 0 в 1 и совершит запись в регистр, правда записывать адрес надо в правильном порядке - сначала младший байт адреса задав биты страницы, а потом - старший байт адреса #80 (т.е. 2 записи в порты ВВ55)
похоже чтобы сделать совместимым с моим вариантом (по чтению), надо на регистр завести биты адреса A8,A9,A10,A11,A12,A13 вместо A0-A3(A4), правда старший байт придётся дважды записать - сначала без единички в старшем бите, а потом с единичкой - т.е. всё равно 2 записи, что у меня, что у винксру :roll:
так что наверное надо мне для единообразия поддержать вариант vinxru в варианте 1МБ :)

Attachment:
apogey_cart_sh.jpg
apogey_cart_sh.jpg [ 47 KiB | Viewed 1363 times ]

либо допилить у себя запись во флеш, как я и планировал изначально

а можно расширить вариант vinxru возможностью записи докидав в схему нужной логики ;)

P.P.S. к тому же схема vinxru на 512 кило уже давно поддержана в Emu80 v4 :)

Attachment:
Screenshot from 2024-01-10 21-55-14.png
Screenshot from 2024-01-10 21-55-14.png [ 21.4 KiB | Viewed 1302 times ]

правда по схеме vinxru только для Апогея:

Attachment:
Screenshot from 2024-01-10 22-56-12.png
Screenshot from 2024-01-10 22-56-12.png [ 20.66 KiB | Viewed 1297 times ]

хотя через конфиг его и можно подключить в конфигурацию РК, но для поддержки размера 1МБ или больше потребуется изменение исходного кода эмулятора...

_________________
:dj: https://mastodon.social/@Shaos


09 Jan 2024 10:03
Profile WWW
Senior
User avatar

Joined: 11 Jun 2012 07:30
Posts: 128
Reply with quote
Хорошая тема, десятилетней выдержки ;)


09 Jan 2024 15:26
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22545
Location: Silicon Valley
Reply with quote
alexcp wrote:
Хорошая тема, десятилетней выдержки ;)

Пришло время собирать хвосты :lol:

_________________
:dj: https://mastodon.social/@Shaos


09 Jan 2024 20:31
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22545
Location: Silicon Valley
Reply with quote
у AT49F040 очень хитрая процедура записи :idea:

Attachment:
Screenshot from 2024-01-09 21-04-40.png
Screenshot from 2024-01-09 21-04-40.png [ 59.37 KiB | Viewed 1351 times ]

запись одного байта осуществляется за время от 10 до 50 микросекунд (порядка 20 килобайт в секунду?),
а полная очистка чипа потребует 10 секунд (при этом флеш выдерживает до 10000 циклов перезаписи)

при чтении /WE=1, а /CE и /OE ходят в 0 вместе

при записи же /OE=1 и теперь /CE с /WE ходят в 0 вместе (и потом ещё надо будет опять читать, чтобы понять когда запись закончилась)

как я и планировал 10 лет назад 6м битиком регистра можно переключать A15 с /OE на /WE, а при записи #FF в старший байт адреса (как это делает директива R по окончанию своей работы) регистр будет сбрасываться в ноль (можно это делать по наличию единичек в битах C7 и C6), переставляя активную страницу в нулевую и отменяя режим записи

если идти по пути vinxru, то номер страницы будет задаваться младшим байтом (порт B), из которого будут браться 6 бит для записи в регистр 74LS174 - 5 старших битов адреса A15-A19 и 1 бит управления записью, но тут можно заложить расширение на будущее, поставив бит управления записью самым старшим B7, оставив битики 5 и 6 незадействованными, чтобы в будущем была возможность расширить память до 4 МБ (т.е. 128 страниц по 32КБ вместо теперешних 32 страниц), а пока запись адреса #8000 будет означать дальнейшее обращение к нулевой странице первого чипа 49F040, а запись адреса #8020 будет означать дальнейшее обращение к нулевой странице второго чипа 49F040, а вот если записать адрес #8080, то это уже будет означать режим записи с выбором нулевого окна первого чипа (все управляющие команды этой флеши пишутся 15-битным адресом т.е. как раз в нулевую страницу). Для записи придётся вручную перепрограммировать на запись порт A, записав туда байт, который надо будет передать во флеш и далее записав скажем адрес #5555 в порты B и C мы произведём запись во флеш по этому адресу, при этом правда придётся далее снова записать адрес #80XX, чтобы закончить строб /WE, что также перезапишет регистр в новый режим XX, который может повторять предыдущий режим, а может и не повторять...

P.S. может ещё спец-режим чтения сделать для того чтобы понять сколько мегабайт на плате расширения? типа при чтении с адреса #FFFF (можно даже дерективой R это делать) выдавать байт с количеством чипов 49F040 на плате расширения - 1,2,4 или 8 (на самом деле это всё также можно делать 2 битиками C7 и C6 - оно будет отключать флешины от порта A и подключать к порту A идентификатор платы: #F1, #F2, #F4 или #F8)

P.P.S. чтобы "ручной" способ переключения страниц продолжал работать
Quote:
R8002 (Выбор банка 2)
R3200,45F4,100 (Загрузить область ПЗУ 3200-45F4 в ОЗУ 100-14F4)
по #FF нельзя обнулять регистр т.к. монитор пошлёт #FF в порт C следом за директивой R8002!
Выходит обнуление регистра надо будет делать только по включению питания (и по кнопке сброса на плате расширения)...

_________________
:dj: https://mastodon.social/@Shaos


09 Jan 2024 22:21
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22545
Location: Silicon Valley
Reply with quote
Проблема с 49F040 состоит в том (кроме очень ограниченного количества циклов перезаписи и невозможности снять защиту с первого 16-килобайтного блока, если она уже установлена), что записывать в неё можно только нули (прожигать), а единички можно записать поверх нулей только стерев весь чип (т.е. дополнять новыми данными уже записанное будет можно, а вот менять старые данные без полного стирания - никак). С другой стороны, если у нас на плате несколько таких чипов, то просто будем считать, что у нас полмеговые сектора ;)

Существует ещё одна полумеговая флешина 29F040 (она у vinxru в схеме тоже "перечислена") с секторами по 64К, которые можно стирать независимо друг от друга (гарантируется миллион циклов перезаписи на сектор). Команды у неё несколько иные (хотя вроде частично совпадают в том смысле, что этот чип только 11 младших битов адреса воспринимает при записи команд, в отличие от предыдущего):

Attachment:
Screenshot from 2024-01-10 19-50-55.png
Screenshot from 2024-01-10 19-50-55.png [ 185.67 KiB | Viewed 1306 times ]
(в 29F040 защита отдельных секторов от записи возможна только в программаторах, которые способны выдавать высокое напряжение записи)

По-идее можно программно определять какие чипы (и сколько) стоят на плате расширения, чтобы включать разные алгоритмы записи/стирания при необходимости...

_________________
:dj: https://mastodon.social/@Shaos


10 Jan 2024 21:06
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 27 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.