PDA

Просмотр полной версии : В поисках утерянных возможностей…



Радио-86РК
09.12.2019, 17:16
Нa многих форумах я нарываюсь на критику со стороны, мол никак за пределы архитектуры «РАДИО-86РК», когда были ещё и «Специалист», и «Орион», и «ZX-Spectrum», и даже «IBM-PC/XT»…
Однако, если глубоко вдуматься, то именно в РК заложен больший нереализованный потенциал.
И это меня очень сильно привлекает.
Давайте по порядку…

ПДП
У ПДП используется всего 1 канал, а остальные 3 навеки заземлены, хотя их можно было бы использовать.
Так, если «Специалист» специально тормозился сигналом «WAIT» от контроллера НГМД, так как особенности архитектуры и жёсткая привязка к тактам не давала никакого шанса на вариации. То с помощью ПДП всё это можно было бы реализовать и без ВГ93…
Если хорошенечко постараться, то и ввод с магнитофона можно было бы реализовать аппаратно.
Даже опрос клавиатуры можно реализовать через ПДП, так как ВГ75 циклически только и запрашивает данные со всех адресов.
Однако, в РАДИО-86РК лишь вывод «INTA» использован нетрадиционно. А в остальном - обычные типовые решения…

ПДП+ВГ75
Редчайший случай, но были игровые программы, которые загружались с ленты без гашения экрана, так как ПДП программировался на более короткие циклы и не мешал процессору.
Конечно, у меня нет этой программы, так как на неё наткнулся один товарищ…
Это говорит в пользу того, что ПДП - не зло, вопреки как, в частности - я, воспринимали его в своё время.

Цикл M1: 48 Кб
Теоретически, адресное пространство РК можно существенно расширить при помощи сигнала «M1»…
Например, по сигналу «СБРОС» включается классическая адресация 16/32 Кб через D11/D13.
Однако по адресам 8000…BFFF располагается дополнительное ОЗУ доступное только на запись, так как D14/D20 никуда пока не делись.
Чтобы это ОЗУ стало доступным, достаточно прочитать команду в адресном диапазоне 8000…BFFF, что из-за недопустимого сигнала «M1» отключит D11, а D14/D20 переместятся на другие адреса и пространство ОЗУ расширится до 48 Кб. Естественно, само ПЗУ с классической программой «МОНИТОР» тоже переключается на более расширенный аналог…
При этом, наряду с остальными схемами, никакие биты ВВ55 программировать не нужно для переключения адресации. Она переключается только по «M1» один раз до очередного сигнала «СБРОС»…

Цикл M1: Префиксы
Да, в отличии от Z80, ВМ80 не имеет префиксов. Однако, с помощью ЛА2 и «M1» можно поймать момент чтения команды «mov a,a» и аппаратно превратить её в префикс установкой специального триггера…
Тогда, когда следующая команда «mov m,a»/«mov a,m» будет писать/читать данные уже без «M1», можно подставить другую страницу памяти и сбросить тот триггер…

Цикл M1: 64 Кб
Естественно, как уже очевидно, можно расширить адресное пространство ОЗУ до полных 64 Кб, а через префиксы подставлять «классическое пространство» со всеми D14/D20, ВГ75 и ПДП…
При этом, адреса «E000…FFFF» можно читать и писать, но нельзя исполнять, так как это временно выключить режим 64 Кб и включит режим 48 Кб, чтобы выполнить подпрограмму ПЗУ. При этом, после «RET» управление передастся на более нижние адреса и включится снова режим 64 Кб…
То есть, нижние 32 Кб присутствуют всегда. Режим 48 Кб включается по «jmp/call 8000…BFFF». А полные 64 Кб имеют ещё более хитрую схему переключения…

P.S.: Есть ещё много разных набросков…

HardWareMan
09.12.2019, 18:39
Цикл M1: Префиксы
Да, в отличии от Z80, ВМ80 не имеет префиксов. Однако, с помощью ЛА2 и «M1» можно поймать момент чтения команды «mov a,a» и аппаратно превратить её в префикс установкой специального триггера…
Тогда, когда следующая команда «mov m,a»/«mov a,m» будет писать/читать данные уже без «M1», можно подставить другую страницу памяти и сбросить тот триггер…
Я делал нечто подобное на Орионе. Для ускорения чтения другой страницы. ИЧСХ работало, но не сохранил схемы. Хотя они восстанавливаются на ура.

Pyk
09.12.2019, 20:26
У ПДП используется всего 1 канал, а остальные 3 навеки заземлены, хотя их можно было бы использовать.
Кстати, из компьютеров, построенных на архитектуре РК, наиболее широко используется ПДП на Партнере - в нем реализован обмен данными с НГМД через ПДП, а также специальный режим регенерации памяти при отключенном ВГ75.

Радио-86РК
09.12.2019, 23:49
Чтoбы примерно представить, что из себя это должно представлять, вот примерный эскиз узла под Z80.
Три элемента «Исключающее ИЛИ» определяет именно код префикса - «mov b,b/c,c/d,d/e,e/h,h/l,l/a,a»…

По сигналу СБРОС JK-триггер выбирает режим «BIOS».
Если происходит переход на адрес FF00…FFFF, JK-триггер переключается между Приложением и БСВВ.

Для БСВВ память представляется следующим образом:

┌─────────────── ───────┐ ┌─────────────── ───────┐ ┌─────────────── ───────┐
│Чтение команды M1-цикла│ │Чтение данных из памяти│ │Запись данных в память │
╞═══════════════ ═══════╡FFFF╞══════ ════════════════ ╡ ╞═══════════════ ═══════╡
│ Триггер │ │ Страница │ │ Страница │
│ RAM «B/A» │ │ RAM «B» │ │ RAM «D» │
├─────────────── ───────┤FF00├────── ──────────────── ┤ ├─────────────── ───────┤
│ Страница │ │ Страница │ │ Страница │
│ RAM «B» │ │ RAM «B» │ │ RAM «D» │
└─────────────── ───────┘0000└────── ──────────────── ┘ └─────────────── ───────┘
Для прикладного кода она не так сильно отличается:

┌─────────────── ───────┐ ┌─────────────── ───────┐ ┌─────────────── ───────┐
│Чтение команды M1-цикла│ │Чтение данных из памяти│ │Запись данных в память │
╞═══════════════ ═══════╡FFFF╞══════ ════════════════ ╡ ╞═══════════════ ═══════╡
│ Триггер │ │ Страница │ │ Страница │
│ RAM «A/B» │ │ RAM «A» │ │ RAM «D» │
├─────────────── ───────┤FF00├────── ──────────────── ┤ ├─────────────── ───────┤
│ Страница │ │ Страница │ │ Страница │
│ RAM «A» │ │ RAM «A» │ │ RAM «D» │
└─────────────── ───────┘0000└────── ──────────────── ┘ └─────────────── ───────┘
Под действием одного из префиксов память для БСВВ и приложения частично меняется:

┌─────────────── ───────┐ ┌─────────────── ───────┐ ┌─────────────── ───────┐
│Чтение команды M1-цикла│ │Чтение данных из памяти│ │Запись данных в память │
╞═══════════════ ═══════╡FFFF╞══════ ════════════════ ╡ ╞═══════════════ ═══════╡
│ Триггер │ │ Страница │ │ Страница │
│ RAM «A/B» │ │ RAM «D» │ │ RAM «A» │
├─────────────── ───────┤FF00├────── ──────────────── ┤ ├─────────────── ───────┤
│ Страница │ │ Страница │ │ Страница │
│ RAM «A»/«B» │ │ RAM «D» │ │ RAM «A»/«B» │
└─────────────── ───────┘0000└────── ──────────────── ┘ └─────────────── ───────┘
(В схеме пока не реализовано…)
Здесь:
«Application»: Пространство приложения
«BIOS»: Пространство БСВВ
«Data»: Область Данных

Где «A»/«B»/«D» - не просто регистры переключения 64 Кб, а комплекс регистров для переключения регионов по 16 Кб из 1 Мб памяти…
(Аналогично примерно как «Защищённый Режим» x86 с Таблицей Дескрипторов…

Пока я точно не знаю, годна ли такая модель памяти.
Прежде всего, сложность вызывает стек, так как при переключении страниц область стека становится недоступна между режимами…
Есть ещё идея изъять у процессора команду «lxi sp,a16», так как она используется крайне редко и её можно заменить на «sphl». А аппаратно код 31 использовать для других целей…

Denn
10.12.2019, 11:18
Есть ещё идея изъять у процессора команду «lxi sp,a16», так как она используется крайне редко и её можно заменить на «sphl». А аппаратно код 31 использовать для других целей…

Использую эту команду достаточно активно! Суть в следующем:



LXI H,0
DAD SP
SHLD M_SAVE_SP

; цикл с использованием ускорения за счёт стековых операций

M_SAVE_SP:EQU $+1
LXI SP,0
RET

Vital72
10.12.2019, 13:15
как-то костыльно всё...

Радио-86РК
10.12.2019, 16:49
Eсли вдуматься, то сама по себе «lxi sp» лишняя, так как классический код (читайте: для военной техники с повышенным требованием к стабильности и без разных сомнительных трюков) совершать предустановку указателя стека должен всегда один раз.
Ради интереса, я и ПДП программировал через «lxi sp,0E006h + push hl»…
Если желаете обфусцировать всё и путать хакера - это всегда пожалуйста!

Потому я и думаю, что теоретически код «31» аппаратно можно изъять и заменить на «rst 7» куда-то. То есть, искусственно симулировать прерывание без прерывания.

Как это должно работать…
Логика видит на шине «M1»+«MREQ»+«READ» и код «31». Тогда схема процессору «FF» и устанавливает специальный триггер, который при следующем «M1» включит к шине ПЗУ с «макрокодом», примерно таким:
3138 E3 |XTHL
3139 D5 |PUSH DE
313A 5E |MOV E,M
313B 23 |INX H
313C 56 |MOV D,M
313D 23 |INX H
313E 33 |INX SP
313F 33 |INX SP
3140 E3 |XTHL
3141 19 |DAD DE
3142 3B |DCX SP
3143 3B |DCX SP
3144 D1 |POP DE
3145 C9 |RETТем самым, искусственно получим команду «DAD const_16».
Естественно, ПЗУ с таким кодом имеет объём 64 Кб и старший байт адреса обозначает код инструкции. А младший байт - подключается к шине адреса процессора.
То есть, при считывании любого кода по «M1» ПЗУ это всегда подключено и схема следит, какой код ПЗУ возвращает.
Если код отличен от 00, то подключается это ПЗУ до команды C9 по всему пространству.

В прикладном режиме можно перехватить и команды «in/out» таким же образом, чтобы БСВВ получала управление и виртуализировала порты.
Например:
API-вызов / виртуальный порт
CD 03 F8 --> DB 83
CD 12 F8 --> DB 82
CD 1B F8 --> DB 8B
CD 15 F8 --> D3 85И даже если физически портовое пространство отсутствует, как в РК, то подобными трюками приложение его может заполучить.

Радио-86РК
13.12.2019, 22:52
Итaк, продолжаю тему…

Наверное, все помнят статьи Драйвер оконного интерфейса (http://www.emuverse.ru/wiki/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_03-90/%D0%94%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80_%D0%BE% D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D 0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0% B0) или Монитор открывает окна (https://kosmoflyko.blogspot.com/2009/03/blog-post_14.html)?
Меня с детства увлекал этот вопрос и как счастливый владелец РК я размышлял, а нельзя ли в саму ПЗУ РК подпрограмму вывода символа на экран подправить так, чтобы изменить регион активной области терминала?
Ведь вывод в экранную область 78×30 через подпрограмму МОНИТОРа и так ограничивается фиксированным окном 64×25 с координатами 8:3.

И вот, спустя 25 лет я этим вопросом активно занялся с помощью онлайн-эмулятора (http://rk86.ru/).
Прежде всего, я устранил некоторые небрежности автора программы МОНИТОР.

А именно, заменил команды по адресам F830/F833 с «JMP» на «LHLD/SHLD», как это сделано в «ОРИОН-128»…
Подчистил операции начальной инициализации служебной области (F836…F86B), чем освободилось ещё 13 ячеек…


.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 C3 44 F8 C3 63 FE C3 98 FB C3 BA FC C3 46 FC C3
F810 BA FC C3 01 FE C3 A5 FC C3 22 F9 C3 72 FE C3 7B
F820 FA C3 7F FA C3 B6 FA C3 49 FB C3 16 FB C3 CE FA
F830 2A 31 76 22 31 76 C9 ?? ?? ?? ?? ?? ?? ?? ?? ?? <-- целых 13 ячеек в резерве
F840 ?? ?? ?? ?? 21 03 80 74 2B AF 77 7C FE 75 C2 48
F850 F8 22 31 76 21 1D 22 22 2F 76 2A 6D F8 F9 CD CE
F860 FA 21 52 FF CD 22 F9 3E C3 32 26 76 .. .. .. .. <-- логика не изменилась
Прежде всего, параметры окна нужно где-то хранить. И есть ячейки, которые МОНИТОР не использует.

7610 - левая граница окна (X1)
7611 - верхняя граница окна (Y1)
7612 - правая граница окна (X2)
7613 - нижняя граница окна (Y2)

Теперь нужно переписать саму подпрограмму по адресам FCBA…FE00 под «оконные амбиции»:

.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
FCB0 F5 E5 D5 2A 12 76 <-- 7612,7613 to C,B - X2,Y2
FCC0 C5 44 4D 2A 02 76 EB 2A 00 76 3A 04 76 3D E3 7D <-- так как A читал Escape-статус, а C уже занят под X2,
FCD0 E3 CD EB FC 22 00 76 21 01 C0 36 80 2B 73 72 EB <-- код символа извлекаем из стека через XTHL в A
FCE0 CD 01 FE 22 02 76 C1 D1 E1 F1 C9 CA F4 FD E2 ?? <-- Escapes
FCF0 ?? F2 ?? ?? E6 7F FE 08 CA 47 FD FE 0A CA 5A FD
FD00 FE 0C CA E7 FD FE 0D CA EA FD FE 18 CA 89 FD FE
FD10 19 CA AA FD FE 1A CA 91 FD FE 1F CA BA FD FE 07
FD20 C2 51 FD 00 01 F0 05 78 FB 3D C2 28 FD 78 F3 3D <-- FD23: NOP
FD30 C2 2E FD 0D C2 27 FD C9 C5 9F 47 EE 4E 90 4F 09 <-- универсальная подпрограмма - шаг вверх/вниз (по CF)
FD40 78 87 3C 82 57 C1 C9 3A 10 76 BB D2 A3 FD 2B 1D <-- 7610
FD50 C9 77 23 7B 1C B9 D8 CD EA FD 78 3D BA D2 38 FD
FD60 D5 E5 CD EA FD 3A 11 76 2F 3C 80 57 79 93 5F 1C <-- 7611
FD70 01 B2 FF D5 E5 14 AF 5E 77 09 7B 15 C2 77 FD E1 <-- скроллим только область окна
FD80 D1 23 1D C2 73 FD E1 D1 C9 23 1C 7B B9 D8 CD EA
FD90 FD AF CD 38 FD 3D B8 D8 3A 11 76 BA D0 CD 38 FD
FDA0 C3 98 FD 23 1C 7B B9 C2 A3 FD 3A 11 76 BA DA 38
FDB0 FD CD 38 FD B8 3F D2 B1 FD C9 A0 C2 D2 FD 21 08 <-- проверяем правую границу окна
FDC0 03 22 10 76 21 47 1B 22 12 76 44 4D 21 C2 77 11 <-- если 0 - создаём стандартное окно
FDD0 08 03 CD E7 FD AF CD 51 FD 7A B8 C2 D5 FD 7B B9 <-- очищаем только область окна
FDE0 C2 D5 FD AF CD 51 FD CD 98 FD 3A 10 76 93 D0 1D
FDF0 2B C3 EA FD CD E7 FD 3E 02 32 04 76 C9 ?? ?? ??
FE00 ??
Так как онлайн-эмулятор позволяет ассемблером писать прямо в ПЗУ, то после прошивки ПЗУ МОНИТОРа проверяем своё творчество и убеждаемся, что МОНИТОР запустился и скроллинг по «D»-директиве работает.
Теперь с помощью директивы «M» можно поиграться с ячейками 7610…7612 и вручную изменить параметры окна, соблюдая крайную аккуратность, так как никакой защиты от дурака нет!

Естественно, никакой речи о сохранении содержимого окон и речи быть не может!
Нас должно интересовать лишь управление ограничивающей области вывода - не более…

Естественно, игры «КСОНИКС», «ПИТОН», и «ЦИРК» уже нормально не отображаются из-за отсутствия реализации позиционирования курсора через «Esc+Y…», над чем ещё стоит попотеть…

К тому же тот «NOP» по «FD23» меня беспокоит как растрачивание драгоценных ячеек.
Да и саму BELL-подпрограмму трогать и перемещать нельзя ни в коем случае!
Предстоит ещё много работы и отладки…

Исходники на ассемблере пока не даю…
(Да и нужны ли они здесь кому?)

P.S.: Надеюсь, моё хобби не отталкивает…:v2_dizzy_punk:
Спасибо!

Bolt
14.12.2019, 02:24
Логика видит на шине «M1»+«MREQ»+«READ» и код «31». Тогда схема процессору «FF» и устанавливает специальный триггер, который при следующем «M1» включит к шине ПЗУ с «макрокодом»
...
В прикладном режиме можно перехватить и команды «in/out» таким же образом, чтобы БСВВ получала управление и виртуализировала порты.

Подобным образом я и хотел сделать для eZ80. Но у него нет M1.

rw6hrm
14.12.2019, 08:10
Не забудьте реализовать загружаемый знакогенератор в ВГ75 дабы хоть игрушки делать более красивые. На этом форуме данный вопрос был рассмотрен и собран в реале, https://zx-pk.ru/threads/20714-pomechtaem-ili-vopros-o-videovykhode.html?p=713206&viewfull=1#post713206 . А то действительно революционная доделка, но про неё никто не в курсе...

Радио-86РК
14.12.2019, 11:36
Не забудьте реализовать загружаемый знакогенератор в ВГ75 дабы хоть игрушки делать более красивые.B большинстве схем подобных знакогенератор переключается либо механически (тумблером), либо битами ППА, хотя ВГ75 поддерживает атрибуты…
У меня была мысль, чтобы знакогенератор грузить через ПДП и графику (384×200) сделать через ПДП.
Знакогенератор перегружается не процессором, а ВГ75+ВТ57 циклами от специального атрибута, после которого все последующие символы будут считываться от ПДП и записываться в ОЗУ знакогенератора
Символ 1F знакогенератора можно аппаратно перехватывать и вместо данных со знакогенератора считывать данные с ПДП непосредственно в виде графики, где старшие 2 бита управляют цветом
В обоих случаях схему развёртки необходимо доработать и добавить регистры задержки на несколько тактов, чтобы скомпенсировать задержку дополнительных циклов ПДП.

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

Радио-86РК
17.12.2019, 00:12
Кaк я уже говорил, код МОНИТОРа в ПЗУ местами можно и подправить, чтобы отвоевать несколько ячеек…
Например, я подкорректировал частично дамп ПЗУ таким вот образом:

.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 C3 40 F8 .. .. .. .. .. .. .. .. .. .. .. .. ..
F810 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F820 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F830 2A 31 76 22 31 76 C9 XX XX XX XX XX XX XX XX XX <- 9 CELLS
F840 21 03 80 36 8A 2B AF 77 7C FE 75 C2 45 F8 22 31
F850 76 2A 6D F8 22 1C 76 F9 CD CE FA 21 50 FF CD 22
F860 F9 21 2A 1D 22 2F 76 3E C3 32 26 76
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F950 .. .. .. .. .. .. .. .. .. .. 21 00 00 1A 13 FE
F960 0D 37 C8 FE 2C C8 FE 20 CA 5D F9 01 AE FA C5 D6
F970 30 F8 FE 0A FA 7D F9 FE 11 F8 FE 17 F0 D6 07 4F
F980 29 29 29 29 D8 06 00 09 C1 C3 5D F9 XX XX XX XX <- 4 CELLS
F990 7C BA C0 7D BB C9 CD A4 F9 CD 90 F9 23 C0 2B 33
F9A0 33 C9 XX XX .. .. .. .. .. .. .. .. .. .. .. .. <- 2 CELLS
Чем получил суммарно 15 байтов (помеченных «XX»).

Здесь, четыре ячейки по F98C можно использовать под «08 20 08 00» и F8E4 вписать их адрес.
Тем самым, в более удобной области FF9E…FFA1 появляется резерв, а там много текста и его можно несколько иначе спланировать…
Например, вот так:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
FF50 .. .. XX XX XX XX XX XX XX XX XX XX XX XX 1F 72 <- 12 CELLS
FF60 61 64 69 6F 2D 38 36 72 2B 00 0D 0A 2D 2D 3E 00
FF70 0D 0A 18 18 18 18 00 0A 0D 0A 20 48 4C 2D 0D 0A
FF80 20 42 43 2D 0D 0A 20 44 45 2D 0D 0A 20 53 50 2D
FF90 0D 0A 20 41 46 2D 19 19 19 19 19 0D 20 50 43 2D
FFA0 19 00
Если продолжать в том же духе, то можно заполучить больше нефрагментированного пространства:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 C3 3D F8 .. .. .. .. .. .. .. .. .. .. .. .. ..
F810 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F820 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F830 2A 31 76 22 31 76 C9 XX XX XX XX XX 21 03 80 36 <- 5 CELLS
F840 8A[0D_0A_2D_2D_3E_00]77 7C FE 75 C2 45 F8 22 31 <- TEXT!!!
F850 76 2A 6D F8 22 1C 76 F9 CD CE FA 21 64 FF CD 22
F860 F9 21 2A 1D 22 2F 76 3E C3 32 26 76 31 CF 76 21
F870 41 F8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F950 .. .. .. .. .. .. .. .. .. .. 21 00 00 1A 13 FE
F960 0D 37 C8 FE 2C C8 FE 20 CA 5D F9 01 AE FA C5 D6
F970 30 F8 FE 0A FA 7D F9 FE 11 F8 FE 17 F0 D6 07 4F
F980 29 29 29 29 D8 06 00 09 C1 C3 5D F9[08_20_08_00]
F990 7C BA C0 7D BB C9 CD A4 F9 CD 90 F9 23 C0 2B 33
F9A0 33 C9 XX XX .. .. .. .. .. .. .. .. .. .. .. .. <- 2 CELLS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
FF50 .. .. XX XX XX XX XX XX XX XX XX XX XX XX XX XX <- 18 CELLS
FF60 XX XX XX XX 1F 72 61 64 69 6F 2D 38 36 72 2B 00
FF70 0D 0A 18 18 18 18 00 0A 0D 0A 20 48 4C 2D 0D 0A
FF80 20 42 43 2D 0D 0A 20 44 45 2D 0D 0A 20 53 50 2D
FF90 0D 0A 20 41 46 2D 19 19 19 19 19 0D 20 50 43 2D
FFA0 19 00Имеем уже 23 ячейки… При этом эстетически интерфейс никак не изменился!

А что же дальше?
Если пожертвовать эстетику, то получим мою…

«WINDOWS'86»
Удалось втиснуть все функции (Escape-позиционирование) в спартанские просторы ПЗУ!
Правда, пришлось многое перекроить, отвоёвывая каждый байт литром крови…
Но, к сожалению, не всё так гладко…
Хоть «ПИТОН» и запустился, но вот «Ксоникс» самовольно перезаписывает указатель на символ под курсором не меняя саму позицию, из-за чего очистка экрана по «1F» уже невозможна и это никак не исправить!
Также «Цирк» и «Вулкан» работают крайне некорректно…

В общем, «кодик мой да с запашком оказывается». И это очень обидно!:v2_dizzy_facepalm:
То есть, кровью и нервами отвоёвывая каждый байт тактически, стратегически я проиграл!:v2_dizzy_vodka4:

Теперь и не знаю, что делать…
Заняться больше и нечем…

Выкладываю это добро здесь…
71048
Вставьте его в ассемблер эмулятора (http://rk86.ru/), прошейте и погоняйте, если не лень!

Работают 7 «точек входа»:
Просто набирайте директивы «G0», «G1», «G2», «G3», «G4» и сами всё увидите…
А именно:
«G0»: Режим максимального окна - 78×30. Довольно любопытно посмотреть, как работают некоторые директивы МОНИТОРа в этом режиме
«G1»: Стандартное окошечко - 64×25. Просто это должно быть встроенным
«G2»: Вывод содержимого памяти ASCII-дампом
«G3»: Среднее окошечко
«G4»: Маленький менеджер окон… Нажатием TAB переключает окна; Курсорные клавиши двигают окна; Пробелом выбирается опция в окне с вопросом; «ВК» подтверждает опцию; Другие клавиши - переход в режим МОНИТОРа
ВАЖНО!
Поддерживается и произвольная Escape-последовательность, но крайне опасно…
Если после сразу после кода 1B не идёт код 59 ('Y'), то управление передаётся на адрес 7626h, где МОНИТОР хранит свою команду JMP.
Тем самым, пользовательский драйвер должен изменять в ячейках тех адрес на свой, чтобы оперативно получать управление прямо из недр подпрограммы вывода символа.
В регистрах - все данные:
B C - Y2 X2 (нижний правый угол окна)
D E - Y X (текущая позиция курсора)
HL - Адрес символа в памяти под курсором
A - символы Escape-последовательности
Тем самым, свободно можно и ANSI-последовательности поддержать на самом базовом уровне!

P.S.: В остальном - вполне любопытные возможности открываются…:v2_dizzy_tired2:

Радио-86РК
12.01.2020, 19:26
Зa выходные удалось исправить некоторые ошибки и удалить лишние команды, отчего появились резервные ячейки и добавилось больше гибкости.

Теперь «ЦИРК» отображается нормально, а «КСОНИКС» не гонет с очисткой экрана, так как код 1F выставляет дефолтные параметры вьюпорта.
Также и «ВУЛКАН» работает, так как МОНИТОР ставит свою заглушку на незнакомые Escape-последовательности при холодном старте…

Чтобы и окошечки функционировали, для очистки окна следует использовать коды «1B+1F».

P.S.: В общем,провёл выходные в бинарном паззле и устранил оплошности…:v2_dizzy_keyboard:

Радио-86РК
14.01.2020, 21:31
Написaл простейший код вывода дампа с поддержкой подсказки длины инструкции…

Радио-86РК
15.01.2020, 21:39
Eсли обратиться к мнемонике системы команд MC6502, то можно вспомнить, что вместо «MOV X,A» инженеры сократили запись инструкции до «TAX». Я неоднократно пытался применить подобный подход и к i8080, так как технически он не так далёк от этого.
А чтобы была возможность и дампом выводить инструкции, я сократил их до двух символов…
Регистры B и C - J и O соответственно
Регистры D и E именуются также
Регистры H и L - V и U соответственно
Регистры M и A именуются так же
Регистровая пара BC - буква X
Регистровая пара DE - буква Y
Регистровая пара HL - буква Z
Регистровая пара PSW - буква W
Указатель SP - буква SВсе MOV-пересылки обозначаются просто двумя буквами - приёмник+источник. Так, вместо «MOV M,E» пишется просто «ME».
Арифметика: ADD - «+», ADC «#»
SUB - «-», SBB - «=»
AND/XOR - «&»/«^»
CMP/OR - «?»/«!»
RLA/RRA - «<<»/«>>»
RLC/RRC - «-<»/«>-»
INR/DCR - «r+»/«r-»
INX/DCX - «p+»/«P-»Написан простой код, который выводит дамп таким же образом…

P.S.: Директиву «M» подкорректировал так, чтобы выдавала целую строку дампа…
Правда код весит 73 байта…

fifan
16.01.2020, 10:35
Радио-86РК, картинки скриншотов не разобрать.

Радио-86РК
16.01.2020, 20:14
Радио-86РК, картинки скриншотов не разобрать.A что именно интересует: Красивые картинки или эскиз концептуальной реализации задумки?
Я могу здесь выложить исходники на ассемблере эмулятора (http://rk86.ru/), если кому-то нужны…

Но, данная тема - исследовательская, прежде всего…

На данный момент я прощупал следующее:
Редактирование дампа одной строкой: Цена - 74 байта
Вывод дампа с разметкой всех байт инструкций: Цена - 100 байт
Вывод дампа с экспресс мнемоникой команд: Цена - 603 байта


Меня давно интересовал вопрос о более компактном размещении функционального кода в адресном пространстве.
Например, само ПЗУ проецировать в памяти страницами и переключать их на лету по мере обращения к отдельным функциям…

Так, у ZX-Spectrum не просто переключать ПЗУ между BASIC и TR-DOS, а переключать все их подпрограммы.
2000…3FFF - подпрограмма вывода символа - 8 Кб
2000…3FFF - подпрограмма вывода точки - 8 Кб
2000…3FFF - подпрограмма загрузки с магнитной ленты - 8 Кб
То есть, все подпрограммы проецируются в одну адресную область, а выбираются - отдельной страницей ПЗУ.

Например, у РАДИО-86РК в области F800…FFFF можно переключать 256 страниц по 2 Кб - 512 Кб ПЗУ…
Разместить там можно абсолютно всё: Бейсики, Редакторы, Трансляторы и т.п…

При этом переделка самого РАДИО-86РК будет минимальной и напомнит картриджи от приставки Денди.
Если помните, картридж занимал в памяти всего 32 Кб, но дополнительным регистром мог переключать страницы ПЗУ до мегабайт…

То есть, если РФ2 из панельки платы РАДИО-86РК выдернуть и вставить туда свой псевдо-картридж, то в памяти он займёт ту же область F800…FFFF, где будет 256 страниц…
Естественно, если развернуть ПЗУ линейно адресами 00000…7FFFF, то каждые 2 Кб должны повторяться JMP-команды набора F800…F836.
Тем самым, все директивы («M», «D», «I», «O», «G» и т.д.) не будут раскиданы по разным адресами в области 2 Кб, а будут иметь одну точку входа, но на разных страницах. А буква - лишь выбирает страницу…
«A» - Ассемблер
«B» - BASIC
«E» - Emu80 (отладчик)
«H» - Help-страница
«J» - Java / C / C--
«K» - Калькулятор (mini-excel)
«N» - Net/Modem/Fido
«P» - Pascal
«Q» - Quick-DOS
«V» - Video-Test
«W» - Редактор WELL
«Z» - Zyxel (терминал работы с модемом)


Думаю, при желании, можно в 512 Кб поместить достаточно много функционала.
Главное - ничего модифицировать в схеме не нужно: Всё - в «картридже»…

kovdry
19.01.2020, 00:09
эскиз концептуальной реализации задумки?
Если говорить о концепции, то давайте так:
В Nintendo была необходимость разработать крутую игру. Но не хватало памяти на картридже.
Инженеры-электронщики задумались напряглись и придумали мапперы, которые расширяют адресное пространство Денди до нужного.
Вы тоже пытаетесь расширить адресное пространство РК, а для чего? Вы разрабатываете супер программу, которая не умещается в 32кб ОЗУ Радио-86РК?
Если нет, то тогда Вы ставите телегу впереди лошади.
Для загрузки перечисленного Вами софта вполне подходит ROM диск. А если сделаете ROM диск на SD-контроллере (https://zx-pk.ru/threads/24092-sd-kontroller-ot-vinxru.html), так это вообще "песня"

Радио-86РК
19.01.2020, 02:03
Вы тоже пытаетесь расширить адресное пространство РК, а для чего?Дoпустим, в 512 Кб можно впихнуть весь объём ПО от РК.
Естественно, страница #0 - сам МОНИТОР. А страницы #1…9 - различные его модификации…
Затем уже идут 90 страниц прикладного ПО и ещё 100 страниц - игровые программы…
Тем самым в эти 200 страниц (480 Кб) можно уместить весь архив имеющихся программ для РК.
Остаётся 56 страниц ≈100 Кб. Туда можно поместить различные (наши) оболочки для работы со всеми страницами: Типа ROM-DOS…

Тем самым, получится, что само ПЗУ (РФ2) как бы и есть, но в нём хранится весь архив программ…
И не требуется подключать никакие внешние устройства.

P.S.: А так - стимул есть некоторый…
(Есть друг за рубежом и он 25 лет назад ещё забросил РК в подвал. Было бы отлично прислать почтой ему такое ПЗУ, которое он бы вставил в панельку, включил в сеть и на экране сразу увидел приглашение с каталогом программ…)

kovdry
19.01.2020, 22:57
Речь как раз о ПО. Предположим завтра кто то удосужится написать прикольную прогу или игрушку для РК.
Чтобы засунуть ее в вашу конструкцию нужно разобрать РК достать флешку и прошить туда пункт меню и новую прогу.
А в SD-контроллере достаточно просто записать файл через картридер с ПК.
Чувствуете разницу?

CodeMaster
19.01.2020, 23:14
Дoпустим, в 512 Кб можно впихнуть весь объём ПО от РК.
Это типа ROM-диска vinxru куда он закинул весь софт для Апогея?


Предположим завтра кто то удосужится написать прикольную прогу или игрушку для РК.
Раз в пятилетку можно достать и перепрошить.

kovdry
20.01.2020, 20:57
Раз в пятилетку можно достать и перепрошить.
Так давайте туда и программатор заодно засунем :)

siemensC35
20.01.2020, 21:22
зачем запихивать, сразу через буфер АП на пзу и на ВВ55 закинем РК-програматор чтобы сам себя зашивал а свежий софт через магнитофонную читалку
Можно конечно же Нулевое пзу в котором класический монитотор + софт управления РК-прогером и через кучу ключейбуферов на пзу Мониторно-софтовое
( во меня понесло ...)

kovdry
21.01.2020, 00:18
Где то я уже такое видел:
Радио 1987 №8 №9

Радио-86РК
21.01.2020, 17:58
Переписaл порядка 70% всего кода Монитора…
(Осталось переписать код опроса клавиатуры…)

Все директивы на месте, но некоторые работают несколько иначе:

Директива «D» выводит содержимое памяти сгруппированными байтами и ASCII-символами, как «L»
Директива «G» вызывает код с возвратом (например, «GF809»), а точка отладки не портит ячейки 0030…0032
Директива «L» дублирует «D»
Директива «M» позволяет просматривать/изменять ячейки памяти не столбиком, а строчкой: 71973
Директива «R» работает как обычно, но имеет параметр #4, загружаемый в D20 ППА клавиатуры канала A
Директива «X» без параметров отображает только регистры HL/BC/DE/SP/AF, без PC
Директива «X<парам.1>,<парам.2>,<парам.3>,< парам.4>» с параметрами передаёт управление пользовательской директиве в ОЗУ (предварительно загрузите «USER_X.rkr» для демонстрации)
Остальные неизвестные директивы (не C/F/I/O/S/T) передают управление на адрес E000

Так же добавились и рабочие ячейки:

Ячейки 7607:7608 задают длительность и тональность BELL-сигнала кода 07 в печати
Ячейки 7610:7611 хранят координаты текущей области окна (стандарт - 8 и 3)
Ячейки 7612:7613 хранят границы текущей оконной области (стандарт - 63 и 24)
Ячейки 7620:7621 хранят адрес пользовательского драйвера перехвата незнакомых Esc-последовательностей
Ячейки 7622 хранит размер экранной строки для корректного вывода символа и прокрутки оконной области
Ячейки 76CD:76CE как дно стека обычно хранит F86C и теперь здесь можно вписать адрес ловушки перед вызовом F806

Чуточку изменилось и само API:

F818 выводит текст как обычно, но помимо терминации строки кодом 0, можно завершить её экономнее - старшим битом (как в таблице токенов Бейсика)
F836 вызывает ловушку через адрес в 76CD:76CE
Код 07 в печати издаёт сигнал длительностью и тональностью указанными ячейками 7607 и 7608
Код 1F в печати сбрасывает окно до стандарта
Комбинация 1B+1F в печати очищает только текущую область окна¹
Код 0A в печати на последней строке прокручивает только область текущего окна
Комбинация 1B+0A в печати прокручивает область над курсором в любой строке¹
(¹ - работает только с внешним драйвером!)
Для запуска кода конкретной директивы используется цикл с перебором таблицы сжатого варианта маскированием.
Потому, при необходимости можно добавить ещё несколько директив, затратив на каждую по 2 байта адреса.
При вызове кода директивы параметры распределяются как обычно, но в аккумуляторе хранится четвёртый параметр.

Монитор специально имеет довольно длинный титульный текст, чтобы зарезервировать ячейки под дополнительные директивы.
Если кому-то не нужна директива «G» с отладочными трюками и директива «X», можно зачистить ячейки FF70…FFFF под свои нужды…
Однако, в #94 (https://zx-pk.ru/threads/31484-narodnoe-golosovanie-chto-luchshe-spektrum-ili-bk).html?p=1051810&viewfull=1#post1051810) я приводил пример и эта версия Монитора справедливо это делает: Если набрать «GF803», будет ожидание нажатия клавиши, после чего Монитор перезапустится, а через «X» можно увидеть код клавиши в аккумуляторе.
Тем самым, Монитор сохраняет все регистры при старте и можно изучить, с каким значениями регистров программа зависла…

Как известно, авторы РК довольно плохо позаботились о поддержки игровых программ в плане динамики прорисовки экрана.
В данной версии, указав в ячейках 7620:7621 адрес своего кода, при любой неверной Esc-комбинации этот код получит управление, где регистры будут содержать все необходимые данные:
Регистр C - позиция крайнего столбца текущей области
Регистр B - позиция самой нижней строки текущей области
Регистр E - абсолютная позиция курсора по горизонтали
Регистр D - абсолютная позиция курсора по вертикали
Регистры HL - адресуемая ячейка в экранном буфере под курсором
Регистр A - незнакомый символ Esc-последовательности

И, аналогично пародии на технологию DirectDraw, можно средствами Монитора работать с экраном на уровне Esc-комбинаций, которых может быть до 124…
Главное, чтобы восстановить все регистры, а в аккумуляторе вернуть 0 или 1.
(Я работаю над этим…)

Радио-86РК
13.03.2020, 19:58
B свете современных облачных услуг (https://habr.com/ru/post/454104/) навязывается мысль сделать подобное облако и для «РАДИО-86РК».
Эмуляторов хоть и много, но все они имеют свои недостатки, как известно.

План очень прост:

Заменить клавиатуру на ОЗУ ёмкостью 64 бита, чтобы производилось сканирование не физической клавиатуры, а логической. Можно использовать и PIC
Управление удалённой клавиатурой происходит посредством обыкновенного TelNet/Putty
Захваченные видео/звук стримится стандартным YouTube-потоком. А так как классическая схема генерации растра адекватно не воспринимается современными средствами, то можно пойти «пиратским путём захвата новинок в кинотеатрах» - настроить китайский портативный ЭЛТ-телевизор под это дело и подобрать камеру. Можно и стриммить сам ПДП-поток напрямую в Терминал, что сэкономит трафик. Но тогда проще уж обойтись эмуляторами и надеяться, что тот или иной код заработает на реальном РК


P.S.: Ща уханьскими помидорами закидают…:v2_dizzy_fear:

Радио-86РК
05.03.2021, 11:11
Зa неделю удалось сдвинуться с мёртвой точки и продолжить доработку собственной поделки…
А именно…

74849

Бейсик-Микрон с поддержкой вьюпорта
Слегка переделанный Бейсик адаптирован под мою версию Монитора.
Функционал оператора «HOME» несколько расширен:
«HOME» без аргументов работает как обычно - очищает экран и устанавливает курсор "домой"
«HOME <ascii>» заполняет активную рабочую область экрана символами указанного кода
«HOME <left>,<top>,<width>,<height>» устанавливает параметры рабочей области экрана
«CUR»/«PRINT AT»/«PLOT»/«LINE» работают в пределах заданной рабочей области вьюпорта
В архивах имеется файлы:
«monitor_view.rom» - файл ПЗУ с оконной версией Монитора. Как выше уже писал, унифицирована работа директив «D»/«L»/«M», «G» работает как «CALL» с возвратом, директива «R» способна грузить ROM-Диск размером до 16 Мб, подпрограмма печати символа работает с произвольной областью экрана, который может размещаться в любом месте ОЗУ и иметь произвольную настройку геометрии
«direct_x.rkr» - демонстрационная загружаемая пользовательская директива «X» Монитора, вызываемая по «X<арг.1>,<арг.2>,<арг.3>,<арг.4>»
«basic_view.rkr» - файл интерпретатора Бейсика вместе с демонстрационным листингом: Просто запускайте сразу «RUN»В Бейсике имеется достаточно обширная демонстрационная программа демонстрации возможностей Монитора.
Также, имеется экспериментальный пример считывания координат светового пера из ВГ75 с рисованием внутри вьюпорта.
(К сожалению, симуляция светового пера мышкой реализована не во всех эмуляторах…)

Переработка не лишена недостатков:
«HOME LEFT,TOP,0,0» приведёт к непредсказуемым результатам порчи данных в ОЗУ
«PLOT»/«LINE» ограничены максимумом в 127 и 49
P.S.: Вариации на тему, каков мог быть Монитор и Бейсик у РАДИО-86РК с самого начала…:v2_dizzy_coder:

P.P.S.: Не рекомендую прошивать в физические ПЗУ данные версии Монитора, так как всё находится на стадии альфа/бета разработки.
Тем не менее, если же Вы рискнули и уже воспользовались данной прошивкой физически, буду признателен выслушать предложения или замечания по поводу проблем совместимости с ПО.

Радио-86РК
10.03.2021, 07:00
Кстaти, вот здесь онлайн (https://rk86.ru/index.html?file=https://gist.githubusercontent.com/Paguo-86PK/5b65168e67bd48542e930395811f5880/raw/bas_test.bin) можете протестировать мой вариант Монитора и модификацию Бейсика.
После загрузки эмулятора по ссылке подождите несколько секунд, пока не загрузится мой образ и не запустится мой Монитор.
Затем по «G0» запустите Бейсик и на «NEW?» отвечайте «N», после чего набирайте «RUN».

Запустится демонстрация поддерживаемых на уровне Монитора псевдо-оконного интерфейса.
В конце демонстрации (можно сразу набрать «RUN 1000») будет рисовалка «световым пером» - просто двигайте мышью по экрану.
(К сожалению, схем и ПО ПК «КРИСТА» пока не нашлось и точное подключение «светового пера» к ВГ75 не известно: Эмулятор поддерживает «световое перо» чисто по справочному материалу).

Естественно, демонстрация крайне скудная, так как довольно сложно дорабатывать Монитор и Бейсик…
(Так, в Бейсике отказала функция «SCREEN$». На днях постараюсь с этим разобраться…)

В Мониторе можете набрать «X1234,5678,9ABC,DE» для проверки пользовательской директивы, размещаемой с адреса 0x7650.


P.S.: Большое Спасибо Alexander Demin (a.k.a. begoon) за реализацию:
Светового пера
Подгрузки файлов
P.P.S.: Использовать данный вариант Монитора для прошивки в ПЗУ не рекомендую: Его разработка всё ещё продолжается…

Радио-86РК
13.03.2021, 01:50
Накидaл кое-как первую игру (https://rk86.ru/index.html?file=https://gist.githubusercontent.com/Paguo-86PK/ea4c74b21253bfeeded47577fef664a7/raw/asterisk.bin) с использованием «светового пера»…
(Кликайте мышью по звёздочкам…)

Сделал кое-как "Жизнь" (https://rk86.ru/index.html?file=https://gist.githubusercontent.com/Paguo-86PK/de1d3b7a18f8dea61ae707370e4f3083/raw/lightlife.bin)» под световое перо…
(Рисуйте мышью клетки…)

Адаптировал под световое перо игру, которая на кассете называлась «МАРС-2», но в файлах представлена как «MARS3».
Вот нормальная адаптация под световое перо игры «МАРС (https://rk86.ru/index.html?file=https://gist.githubusercontent.com/Paguo-86PK/2aea1c59422388bfa5b5895e9ca56022/raw/mars3-lpe.rkr)».
(Игра со звуком! Поставьте галочку внизу на «Sound».)

P.S.: Если эмуляторы NES мышью симулируют пистолет и можно кликами в уток пострелять.
Почему ни в одном из имеющихся эмуляторов РК даже не пробовалось поддерживать «световое перо», хотя ВГ75 его очень легко поддерживает в том же ПК «КРИСТА»?
Сколько возможностей утеряно!