nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 25 Apr 2024 08:49



Reply to topic  [ 204 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7 ... 14  Next
Paguo-86PK - XXI BEK 
Author Message
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Какиe 15 входов? Какие 15 диодов? К РФ2 подходит всего 11 линий адреса. Забыли?
Это-то как раз я имел в виду, когда это писал. Я исходил из того, что надо сложить чип-селект /F800, /RD и ещё 10 адресов. Всего 12 входов и ещё один вход на передачу между вентилями. Итого, одним 4-х входовым И-НЕ плюс одним 8-ми входовым И-НЕ не обойтись, - надо именно два 8-ми входовых. Итого, два 8-ми входовых И-Не плюс инвертор.
Paguo-86PK wrote:
Нe будете возражать, если я начну здесь продвигать свой движок эмулятора?
Это свободная страна и форум не мой. Хотя я и не понял о чём это. Но вообще-то имеющиеся скрипто-настраиваемые эмуляторы EMU/EMU80 считаются хорошими.

 
.
У меня тоже есть свой эмулятор РК86 и ОРИОНА, но он написан на ассемблере 8086 (11 тысяч строк ассемблера плюс 500 строк на Си, писал и отлаживал 3 года). А работа с файлами в нём на Турбо-Си. Причём, удивитесь, даже не на 3.1, а версии TC 2.0, из самого 1987 года. Начал писать в середине 90-тых на том, что было, а когда захотел переделать на TC 3.1, то уже не получилось (разбираться не стал). Версия эмулятора для MSDOS сейчас уже никому не интересна.
.

С другой стороны, настроить эти эмуляторы так, чтобы страницы переключались по чтению лучше сделает автор (возможно это не реализовано и нужна новая версия). Хотя я думаю, что у меня, по крайней мере для EMU80, написать конфиг, чтобы переключение страниц было по чтению получится, т.к там в команде для упр.порта указывается, что это на запись. Но это не значит, что эмулятор заведомо поддерживает переключение по чтению, надо экспериментировать. Завтра вечером постараюсь попробовать. СамомУ интересно, управляется ли в эмуляторе запись в управляющий режимом регистр по чтению.
Paguo-86PK wrote:
Просто копаться в чужом и встраивать туда мапперы банков памяти - лень…
Трудоёмкость написания эмулятора и редактирования конфига соотносятся на ~5 порядков. Одно делается минуты, другое - годы. Значит потратить минуты лень, а трахаться долгие годы не лень.
Paguo-86PK wrote:
Стиль x86 хоть и громоздкий, но более информативный и приятный
А Вы напишИте в ассемблере Z80 исходники хотя-бы для пары законченных программ по 2-3 килобайта объектных кодов каждый. Тогда Вы сразу передумаете, что мнемоника 8080/8086 лучшая. Я макрокомандами переделывал мнемонику 8086 под Z80. Всё-равно при разработке на 8086 из-за недалёкости переходов по флагам надо использовать макрокоманды (чтобы не заморачиваться многострочными конструкциями).


19 Jan 2020 15:53
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Но вообще-то имеющиеся скрипто-настраиваемые эмуляторы EMU/EMU80 считаются хорошими.
Замучaлся с чёрными экранами… :mrgreen:

P.S.: Ещё вариант… Сдвиговым регистром…
Защиты логикой нет, только перемычками…
Платкой не так уж плохо смотрится… :mrgreen:


Attachments:
File comment: Баловство…
shifted-pcb.png
shifted-pcb.png [ 158.56 KiB | Viewed 5456 times ]
File comment: JP1 - Режим «Классика»/«Расширение»
JP2 - Запрет переключения страниц
JP3 - Селектор части ПЗУ

shifted-rom.png
shifted-rom.png [ 54.39 KiB | Viewed 5474 times ]


Last edited by Paguo-86PK on 19 Jan 2020 21:42, edited 2 times in total.

19 Jan 2020 16:23
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
barsik wrote:
Но вообще-то имеющиеся скрипто-настраиваемые эмуляторы EMU/EMU80 считаются хорошими.
Замучaлся с чёрными экранами…
Да, в этих эмуляторах, особенно в EMU, нет вывода протокола ошибок конфига. В случае серъёзной ошибки просто чёрный экран, а часто и улёт. В EMU80, если ему не удаётся создать объект или не найден второстепенный файл, то выдаётся ERROR LOG, но тоже не всегда, иногда (когда проблема архитектуры) просто происходит улёт.

Обычно чёрный экран, если эмулятор не нашёл важного файла указанного в одном из конфигов (в EMU80 два или три конфига и инклюдэ). Например, если не найдено файла ПЗУ, одного из файлов фонтов, OPT-файла и других. Или конфликт по адресам устройств. Потому менять конфиг надо очень медленно и постепенно по одной строке. Тогда сразу ясно из-за какой строки завис. Если не прошло, то откатываем и ищем причину проблемы.


19 Jan 2020 16:38
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Это-то как раз я имел в виду, когда это писал. Я исходил из того, что надо сложить чип-селект /F800, /RD и ещё 10 адресов. Всего 12 входов и ещё один вход на передачу между вентилями. Итого, одним 4-х входовым И-НЕ плюс одним 8-ми входовым И-НЕ не обойтись, - надо именно два 8-ми входовых. Итого, два 8-ми входовых И-Не плюс инвертор.
Попробовaл набросать универсальную схему…
Надеюсь, маразм ещё не до конца меня одолел и вариант - работоспособный…
  • Стандартный режим - удалить JP3, а JP2 позволяет выбрать один из двух МОНИТОРов
  • Режим FFFE/FFFF -JP3 перекинуть вправо и JP1 вставить(вариант 1)/удалить(вариант 2)
  • Режим FFF0…FFFF -JP3 перекинуть влево JP1 удалить(вариант 1)/вставить(вариант 2)
  • JP2 определяет чётные/нечётные страницы 2 Кб внутри 4 Кб
Тем самым, используется 155ИР1 в двух режимах, 155ЛА2 и 155ЛА4…

Схема достаточно компактна для размещения на платке 40×46…
И детали - одни из самых доступных…
Как видно, регистром выбирается один из 16 сегментов по 4 Кб.
А перемычка JP2 выбирает нижние и верхние 2 Кб в выбранных 4 Кб.
Тем самым, мы имеем как программный контроль, так и ручной механический…


Attachments:
File comment: Универсальная схема - вариант 2
Universal-ROM.png
Universal-ROM.png [ 62.98 KiB | Viewed 5433 times ]
File comment: Универсальная схема - вариант 1
Universal-ROM.png
Universal-ROM.png [ 63.64 KiB | Viewed 5434 times ]
20 Jan 2020 13:42
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Я вижу, что /CS_F800 приходит на регистр. Но без участия сигнала /RD в процессе записи номера страницы схема не вполне корректная и может не работать.


20 Jan 2020 16:31
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Я вижу, что /CS_F800 приходит на регистр. Но без участия сигнала /RD в процессе записи номера страницы схема не вполне корректная и может не работать.
Тaк-с…
Сигнал /CS_F800 идёт от D4.3 (после Сброса) или D11 (в остальной период).
Когда процессор выдаёт HLDA, адрес переходит в Z-состояние и, фактически, D11 выбирает D17 по адресу FFFF…

Хм…
Что ж…
Дурень! :oops:

Слишком увлёкся всем этим и упустил из внимания элементарное!

Спасибо!

В таком случае моя схема всегда будет выбирать банк #15 в режиме «Parallel» или шагать по банкам #1-3-7-15 в режиме «Serial».

Короче - мусор! :obye:

Надо отвлечься…

Глянул я на схему любимца в очередной раз и вспомнил, что потенциал D11 реализован наполовину, так как Y0…Y3 выбирают ОЗУ.
Если в оригинале дешифрация такая:
Code:
D11:Y0 - 0000…1FFF
D11:Y1 - 2000…3FFF
D11:Y2 - 4000…5FFF
D11:Y3 - 6000…7FFF
D11:Y4 - 8000…9FFF
D11:Y5 - A000…BFFF
D11:Y6 - C000…DFFF
D11:Y7 - E000…FFFF
Если схему легонечко прооперировать, можно добиться более компактной дешифрации:
Code:
D11:Y0 - 8000…8FFF
D11:Y1 - 9000…9FFF
D11:Y2 - A000…AFFF
D11:Y3 - B000…BFFF
D11:Y4 - C000…CFFF
D11:Y5 - D000…DFFF
D11:Y6 - E000…EFFF
D11:Y7 - F000…FFFF
Если же вывод 5 с земли убрать и подать на него A11 (на схеме зелёным), то можно добиться и такого:
Code:
D11:Y0 - 8000…87FF
D11:Y1 - 9000…97FF
D11:Y2 - A000…A7FF
D11:Y3 - B000…B7FF
D11:Y4 - C000…C7FF
D11:Y5 - D000…D7FF
D11:Y6 - E000…E7FF
D11:Y7 - F000…F7FF
Это ещё любопытнее, но МОНИТОР отвалился

P.S.: В публикациях РАДИО было не мало вариантов доработки схем с добавлением дополнительного дешифратора.
Вопрос: Что теперь делать с D5.3 и D10.4? :mrgreen:
ОЗУ некуда управлять… :lol:


Attachments:
File comment: Сфальсифицированная схема
Compact-DC.jpeg
Compact-DC.jpeg [ 93.04 KiB | Viewed 5411 times ]
20 Jan 2020 17:20
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
можно подключить внешнее ПЗУ объёмом до 16 Мб! Например, если подработать МОНИТОР вот так ...
Идею большого ROM-диска, вы воплотили в коды модификации ПЗУ для получения многобанковой директивы R. В ней Вы третий параметр (адрес куда грузить) заменили на номер банки ROM-диска. Сначала я не оценил саму директиву (думал там сделано нормально), обратил внимание лишь сегодня читая другой форум, где Вы продублировали эту идею большого ROM-диска. Кстати, будьте на том форуме осторожнее, там за посты без грамматических ошибок и длиннее 30 строк забанивают навечно.
Paguo-86PK wrote:
Директива «R1234,5678,90» загружает данные из 0x901234…905678 в ОЗУ 0x1234…5678, т.к 90 - индекс страницы, выдаваемый через D20.
На такое редактирование директивы R можно ответить только вопросом: Когда Вы прекратите заниматься маразмом? - редактировать ПЗУ в машинных кодах. Естественно, когда программы пишут в машинных кодах, то можно сделать только незначительные модификации. Начните работать с исходниками, используя текстовый редактор и макроассемблер. Иначе Вы и дальше обречены на такие несуразные директивы. Специально для Вас выложил исходник ПЗУ РК со свободным местом. Если нормальная мнемоника не устраивает, так перекодируйте в мнемонику КР580 (я несколько раз выкладывал ссылку на закачку конверторов).

Это что же адрес загрузки в ОЗУ должен совпадать с адресом хранения в банке ROM-диска? Это значит, что нельзя файлы сваливать в ROM-диск сплошным массивом, все файлы впритык друг к другу. Т.к большинство игр с нуля, значит при этом чуть ли не по одному крошечному файлу на целую банку ROM-диска. Это слишком расточительно, ПЗУ даже сейчас ещё недостаточно дёшево, чтобы так варварски его использовать.

Кто мешает ввести четвёртый параметр директивы? Тогда и адрес загрузки останется и N банки будет. В M3-EXT для ОРИОНА есть директивы с 4-мя параметрами, есть директивы с цифровыми параметрами и символьными (именами файлов). И кто заставляет использовать совсем тупой формат ROM-диска, где файлы свалены в кучу, без адресов, опознователей или разделителей, имён и даже каталога?

Если уж так хочется упражняться в машинных кодах, то гораздо удобнее хранить файлы в формате RKR, но без блока КС в конце (там к телу файла в конце прицепляют два нуля, байт E6 и два байта КС в изуродованном виде, т.е с переставленными msb-lsb). Первыми двумя байтами до начала блока ставим нач.адрес (куда грузить), затем конечный адрес (адрес куда грузить последний байт), а уж далее сам массив игры. Порядок байтов в этих адресах неважен, т.к загрузка побайтовая, а не словом (т.е перестановка msb-lsb тут не вредит). И получать такие коды просто - берём файл RKR и отпиливаем от него в конце 5 байтов.

Тогда в директиве R нет нужды указывать адрес конца файла в ROM-диске и куда грузить, а сама директива читает из ROM-диска адреса загрузки. При таком формате хранения файлов в ROM-диске в директиве остаётся передавать всего два параметра - адрес блока в конкретной банке ROM-диска и номер этой банки. И код директивы остаётся такой же простой, что можно написать его и в машинных кодах.

А вообще в ПЗУ РК86 CCP (интерпретатор командной строки) не оптимальный. И процедуры директив неоптимальные. Гораздо грамотнее CCP сделан в M3-EXT и коды всех директив там лучше по качеству и меньше по объёму. Например, DIR_D даёт и HEX и ASCII (отпадает дурная директива L), DIR_M позволяет шагать и вверх и вниз, и вводить не только HEX, но и ASCII. DIR_S ищет не только один байт (от чего польза нулевая).

Так, что если переписать в РК86 весь монитор эффективнее (имеется в виду код директив, п/п ввода/вывода трогать нельзя), то можно иметь директиву D без параметров выдающую в 4 столбца список игр вашего Супер-ROM-диска. И директиву "цифра" для запуска игр Супер-ROM-диска. Например, чтобы запустить игру, что в списке под номером 38, вводим командную строку: 38<ВК>.

Ну, а если хочется сделать поддержку Супер-ROM-диска тупо и минимальным трудом, введите директиву P, что будет задавать номер банки ROM-диска. Сначала задаём номер банки, а затем директивой R со старой лексикой читаем оттуда в ОЗУ блок кодов.
Paguo-86PK wrote:
В публикациях РАДИО было немало вариантов доработки схем с добавлением дополнительного дешифратора.
На самом деле - лишь вариант дешифратора И.Крыловой, что усердно пропагандировала 580 ВИ53 в дурном варианте использования с всего одним каналом звука (три публикации об одном и том же) и дешифратор Е.Седова, чтобы совместить РК по доп.чип-селектам с Микрошей (что позволяет использовать РК-КНГМД от Микроши).

Вариант Е.Седова оправдан, чтобы совместить RK-DOS с Микрошей. Но с точки зрения расширения ПЗУ он плохой, потому, что мешает использовать всё окно E000...FFFF отведённое для ПЗУ под ПЗУ в 8 кб (или страничное с окном 8 кб).

Правильнее иметь один дешифратор, чем два. Где ставить ВИ53 непринципиально, а адрес РК-КНГМД также не проблема перенести (в адрес КНГМД лезет только сама DOS и форматёр дискет, так что поменять адрес не проблема). Исполняемый код RK-DOS также может размещаться в любом месте памяти.

Но точку входа в RK-DOS E001 менять нельзя, т.к туда лезут все прикладные программы. Пусть их не очень много, но их дизассемблировать и менять в них адрес BDOS - не только утомительно, но и вредно нарушать совместимость. Т.к не исключено, что кто-нибудь из фанатов РК86 завтра сойдёт с ума и начнёт штамповать в огромном количестве и качестве программы для оригинальной RK-DOS или кто-то из Лианозово откопает в лесу сундучок с дискетами полными программ для RK-DOS.

Удобно получается, если область 8000...9FFF делим дешифратором под порты, а ПЗУ увеличиваем до 8 кб в области E000...FFFF. А ещё лучше под доп.порты только 8000...8FFF, а область 9000...9FFF отдаём под ПЗУ для отладчика (точно как сделано в конфиге, которым я пользуюсь).
Paguo-86PK wrote:
Вопрос: Что теперь делать с D5.3 и D10.4? ОЗУ некуда управлять…
Вопрос неясен. Вы хотите использовать идею, что использует PVV здесь, в таком варианте эти вентили свободны.


Last edited by barsik on 22 Jan 2020 11:12, edited 1 time in total.



21 Jan 2020 13:45
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Идею большого ROM-диска, вы воплотили в коды модификации ПЗУ для получения многобанковой директивы R. В ней Вы третий параметр (адрес куда грузить) заменили на номер банки ROM-диска.
Дa, именно! :mrgreen:
barsik wrote:
Сначала я не оценил саму директиву (думал там сделано нормально), обратил внимание лишь сегодня читая другой форум, где Вы продублировали эту идею большого ROM-диска.
Смотрю в сторону Китая и практикуюсь в подделке оригинала… :D
barsik wrote:
Кстати, будьте на том форуме осторожнее, там за посты без грамматических ошибок и длиннее 30 строк забанивают навечно.
Замечание приму к сведению. Спасибо!
Однако, с подобной активностью там на проблемы вряд ли нарвусь: Зарегистрирован уж 10 лет (оказывается) и написал 30 сообщений… Хм… :no:
(Хотя, даже тут умудрился набуратинить! :o )
barsik wrote:
На такое редактирование директивы R можно ответить только вопросом: Когда Вы прекратите заниматься маразмом? - редактировать ПЗУ в машинных кодах.
Блокнотом я накидываю дампы какой-то идеи и смотрю на размер, а потом перевожу в листинг с мнемониками… То есть, я - уже робот!
barsik wrote:
Естественно, когда программы пишут в машинных кодах, то можно сделать только незначительные модификации. Начните работать с исходниками, используя текстовый редактор и макроассемблер. Иначе Вы и дальше обречены на такие несуразные директивы. Специально для Вас выложил исходник ПЗУ РК со свободным местом. Если нормальная мнемоника не устраивает, так перекодируйте в мнемонику КР580 (я несколько раз выкладывал ссылку на закачку конверторов).
Спасибо!
А исходник МОНИТОРа я давно переписал (каждую строчку) в стиль x86 (весь вечер потратил), когда испытывал свой ассемблер.
(Если интересно глянуть - прикрепил)
barsik wrote:
Это что же адрес загрузки в ОЗУ должен совпадать с адресом хранения в банке ROM-диска?
Да, выбирается лишь страница для загрузки дампа адрес к адресу… Можно готовые замороженные Бейсики так грузить, по идее…
barsik wrote:
Это значит, что нельзя файлы сваливать в ROM-диск сплошным массивом, все файлы впритык друг к другу. Т.к большинство игр с нуля, значит при этом чуть ли не по одному крошечному файлу на целую банку ROM-диска. Это слишком расточительно, ПЗУ даже сейчас ещё недостаточно дёшево, чтобы так варварски его использовать.
В народе шутят, что Internet Explorer нужен лишь для загрузки других браузеров…
Тем самым, в моём случае директива «R» (мой вариант) нужна лишь для загрузки оболочки: «R,F,FF»+«G» - загрузит и запустит некий код в 0000…000F с адреса FF0000…FF000F.
В этих 16 байтах, по идее, нужно лишь разместить следующее:
Code:
    org  0
Loader:
    ld   hl,6000h ; Для нашей основной оболочки работы с ROM-диском
    ld   de,6FFFh ; этих 4 Кб кода будет даже слишком много
    ld   c,e      ; Адрес в ПЗУ - FF6000…FF6FFF
    push hl       ; Запомним адрес загрузки/входа
    call 0FA68h   ; попросим МОНИТОР загрузить эту оболочку
    ret           ; Запускаем…
То есть - всего 12 байтов даже требуется!
barsik wrote:
Кто мешает ввести четвёртый параметр директивы?
Пространство оригинального ПЗУ МОНИТОРа, которое я своими заплатками уродую…
Оконный вывод символа втиснул со скрипом. Сейчас - до «R» добрался.
Код как бы и на месте, но работает несколько иначе, как видите…
barsik wrote:
Тогда и адрес загрузки останется и N банки будет. В M3-EXT для ОРИОНА есть директивы с 4-мя параметрами, есть директивы с цифровыми параметрами и символьными (именами файлов).
Публикации кода, включая Бейсики и редактор Penx я изучал давно…
barsik wrote:
И кто заставляет использовать совсем тупой формат ROM-диска, где файлы свалены в кучу, без адресов, опознователей или разделителей, имён и даже каталога?
О чём я и говорю. Можно «R»-директивой самому напрягаться и ботанить. А можно ею просто грузить ту оболочку…
Потому я и прикидывал пародию на DOS-API выше…
barsik wrote:
Если уж так хочется упражняться в машинных кодах, то гораздо удобнее хранить файлы в формате RKR
Это уже я проходил 15 лет назад, когда познакомился с эмуляторами. :D
barsik wrote:
Например, DIR_D даёт и HEX и ASCII (отпадает дурная директива L), DIR_M позволяет шагать и вверх и вниз, и вводить не только HEX, но и ASCII. DIR_S ищет не только один байт (от чего польза нулевая).
Так можно все «R», «S», «T» и «C» так же переделать на свой лад.
Об этом я думал: Выпилить вообще ссылки на них из «switch»-кучи, чтобы МОНИТОР забыл про них…
Место освободится фрагментарно под многое. В частности, одной директивой оболочку нашу с ROM-диска запускать можно одной лишь буквой…
Но, имеется ли смысл так сильно бомбить МОНИТОР?
barsik wrote:
Так, что если переписать в РК86 весь монитор эффективнее (имеется в виду код директив, п/п ввода/вывода трогать нельзя), то можно иметь директиву D без параметров выдающую в 4 столбца список игр вашего Супер-ROM-диска. И директиву "цифра" для запуска игр Супер-ROM-диска. Например, чтобы запустить игру, что в списке под номером 38, вводим командную строку: 38<ВК>.
Это в планах имеется тоже :roll:
Руки чешутся аккуратно переписать МОНИТОР на ассемблере целиком на свой лад, но сохранив позиции ключевых подпрограмм. Свой код печати символа я уже сделал - сами знаете…
А вот умный вывод дампа и однострочная «M» - не вмещаются… Выше я снимки экрана эмулятора давал…
barsik wrote:
На самом деле - лишь вариант дешифратора И.Крыловой, что усердно пропагандировала 580 ВИ53 в дурном варианте использования с всего одним каналом звука (три публикации об одном и том же) и дешифратор Е.Седова, чтобы совместить РК по доп.чип-селектам с Микрошей (что позволяет использовать РК-КНГМД от Микроши).
Были и другие публикации в других журналах (где-то видел), но отцом выписывался лишь РАДИО и «Микропроцессорные средства и системы»…
barsik wrote:
Но точку входа в RK-DOS E001 менять нельзя, т.к туда лезут все прикладные программы. Пусть их не очень много, но их дизассемблировать и менять в них адрес BDOS - не только утомительно, но и незачем
Как-то обрадовался, что в сети нашёл наконец-то тот RK-DOS!
Но изучать, оказалось, было уже утомительно. Да и не покушаюсь я на это всё…
Лишь в пространстве самого МОНИТОРа пинцетиком работаю на Hex-уровне! :ebiggrin:
barsik wrote:
Вопрос неясен. Вы хотите использовать идею, что использует PVV здесь, в таком варианте эти вентили свободны.
Значит, это уже было…
Что ж… Сейчас буду изучать…

P.S.: Идеально было бы всю схему компьютера перетряхнуть вот так, чтобы она ровнее стала с тем же набором элементов…
Но я пока лишь ограничусь прошивками ПЗУ…


Attachments:
File comment: Неудачный вариант ассемблера
В списке - версии ПИТОНа и МОНИТОР

i8080asm.zip [34.1 KiB]
Downloaded 241 times
21 Jan 2020 20:28
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
директива «R» (мой вариант) нужна лишь для загрузки оболочки: «R,F,FF»+«G» - загрузит и запустит некий код в 0000…000F с адреса FF0000…FF000F. В этих 16-ти байтах, по идее, нужно лишь разместить следующее:
Code:
    ORG  0
LOADER:
    LD   HL,6000H ; Для нашей основной оболочки работы с ROM-диском
    LD   DE,6FFFH ; этих 4 Кб кода будет даже слишком много
    LD   C,E      ; Адрес в ПЗУ - FF6000…FF6FFF
    PUSH HL       ; Запомним адрес загрузки/входа
    CALL 0FA68H   ; попросим МОНИТОР загрузить эту оболочку
    RET           ; Запускаем…
То есть - всего 12 байтов даже требуется!
После замены CALL+RET на JMP будет 11 байтов и можно даже меньше. В общем случае, когда мы видим последовательно стоящие CALL и RET, то возможны лишь четыре вывода, - что это часть большой макрокоманды, что это код из под ЯВУ, что в подпрограмме анализируется адрес возврата или что программист новичок. А в вашем случае зачем сохранять адрес в стеке, а процедуре загрузки быть подпрограммой. Пусть сама сразу и запускает считанный код. Тогда расход кода будет на 5 байтов меньше. Всё равно директива R в таком виде, для считываний не нужна, единственная польза от неё - старт оболочки.

По научному это называется первичный загрузчик. Его задача загрузить и запустить вторичный загрузчик. Это имеет преимуществом то, что вторичный загрузчик может меняться, в случае загрузки DOS - грузить разные варианты DOS (на разные адреса и разного размера). В Вашем случае это даёт сокращение объёма кода истраченного на считывание оболочки, а также при этом можно не перешивая ПЗУ F800 менять адрес загрузки и размер оболочки.

Но вводить директиву R при запуске компьютера утомительно и при перезагрузке оболочки всякий раз вручную набирая строку директивы R по 20 раз в день, в итоге захочется повеситься. Я в 1994 ввёл в ПЗУ РК86 загрузчик с НГМД. Так вот, чтобы грузить с дисковода, я ввёл директиву B без параметров (кстати, место под такой крупный загрузчик в 551 байт было получено выкидыванием МГ-подпрограмм и заменой драйвера матричной клавиатуры на драйвер ASCII-клавиатуры, что на порядок короче, т.к такая клавиатура выдаёт готовый ASCII-код, отчего задача драйвера лишь ждать флаг готовности, а по получению забрать готовый код).

Если и однобуквенную директиву B набирать лениво, то можно обойтись и без команд. Тогда, если при сбросе удерживать кнопку РУС/ЛАТ (что на PC7), то делается JMP BOOT. Расход кода на такую загрузку всего 4 байта.
Code:
        LD      HL,PPAKBD+3
        LD      (HL),8AH
        DEC     HL
        CALL    PUSK_VG
        INC     (HL)
        JP      P,BOOT
.


22 Jan 2020 00:02
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
После замены CALL+RET на JMP будет 11 байтов и можно даже меньше. В общем случае, когда мы видим последовательно стоящие CALL и RET, то возможны лишь четыре вывода, - что это часть большой макрокоманды, что это код из под ЯВУ, что в подпрограмме анализируется адрес возврата или что программист новичок.
Вернo подметили про новичка. Ведь преобразование «CALL+RET» в «JMP» - уже наинизший уровень обфускации и может сбить с толку начинающего… Я и так согрешил и вместо «LD C,0FFH» применил «LD C,E» :rotate:
Если бы посмотрели внимательнее на код вывода символа, то заметили бы, что при скроллинге экрана код не завершается по «RET», а сразу стыкуется с кодом опроса клавиатуры, так как в FE00 не хватило места под RET :lol:
У новичка будет ступор, а я подумал, что скроллинг - и так медленный, так что пусть опрашивается клавиатура дважды :twisted:
barsik wrote:
А в вашем случае зачем сохранять адрес в стеке, а процедуре загрузки быть подпрограммой. Пусть сама сразу и запускает считанный код. Тогда расход кода будет на 5 байтов меньше. Всё равно директива R в таком виде, для считываний не нужна, единственная польза от неё - старт оболочки.
Выше я уже сказал, что из-за спортивного интереса в частности я правлю МОНИТОР пинцетиком и жонглирую кодом как фигурками Тетриса: Втискиваю свой функционал в рамки стандартного :mrgreen:
barsik wrote:
Но вводить директиву R при запуске компьютера утомительно и при перезагрузке оболочки всякий раз вручную набирая строку директивы R по 20 раз в день, в итоге захочется повеситься.
МОНИТОР дважды ссылается на адрес F000: При директиве «U» (F88C…F890) и когда директива не опознана (ячейки F8D9…F8DB). Тем самым, ещё 5 ячеек можно отыграть, но весь код придётся двигать. Об этом я давно думаю, но лень пока копаться (ассемблером)…
 Подсказка для «роботов»
Code:
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F87F .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 21
F880 6C F8 E5 CD 2C F9 2A 2B 76 44 4D 2A 29 76 EB 2A
F890 27 76 3A 33 76 FE 44 CA C5 F9 FE 43 CA D7 F9 FE Директивы D C
F8A0 46 CA ED F9 FE 53 CA F4 F9 FE 54 CA FF F9 FE 4C Директивы F S T L
F8B0 CA 08 FA FE 4D CA 26 FA FE 47 CA 3F FA FE 4F CA Директивы M G O
F8C0 2D FB FE 49 CA 86 FB FE 58 CA D3 FF FE 42 CA XX Директивы I X B
F8D0 XX FE 52 C2 00 F0 79 0E 00 C3 68 FA .. .. .. .. Директива R и остальное
F~~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
FA68 .. .. .. .. .. .. .. .. D3 80 3E 90 D3 A3 22 01 Директива R на 256 страниц и начальным
FA70 A0 DB A0 02 03 CD 99 F9 C3 6E FA .. .. .. .. .. выравниванием кратным 256 байтам

Пяти ячеек мало? Однако, как нарочно, там (F8D3…F8D8) идёт кейс директивы «R». То есть, в те 5 ячеек можно к «R» добавить ещё чуток функционала.
Code:
    ORG  0F8CFH
    CP   A,'R'
    JP   NZ,0F000H
    LD   A,C         ; Младший байт третьего аргумента - индекс страницы
    OUT  (080H),A    ; Его мы выводим через канал A ППА клавиатуры
    JP   MONITOR_R
; Директива R от меня
    ORG  0FA68H
MONITOR_R:
    LD   C,000H      ; Обнуляем младший байт погрузочного адреса
    LD   A,090H
    OUT  (0A3H),A    ; Настраиваем D14 - адрес A3A3h
MONITOR_R_LOOP:
    LD   (0A001H),HL ; Выдаём адрес на каналы «B» и «C» D14
    IN   A,(0A0H)    ; Читаем ПЗУ из канала «A» D14 по A0A0h
    LD   (BC),A      ; Записываем в ОЗУ по зеркальному адресу
    INC  BC
    CALL CMP_HL_DE
    JP   MONITOR_R_LOOP
Вуаля! Теперь директива грузит код в произвольную область ОЗУ, но кратную 256.
Так, «RBA98,CDEF,4567» загружает из ПЗУ 0x67BA98…67CDEF в ОЗУ 0x4500…5867. Уже гибкость выше!
barsik wrote:
Тогда, если при сбросе удерживать кнопку РУС/ЛАТ…
Типа, как Windows при загрузке проверяла клавишу «Ctrl» и выдавала аварийное меню… :idea:
Можно ещё считывать бит статуса ВГ75 и отсчитать 1 секунду по кадрам. Если пользователь не нажал никакую из клавиш после сброса - начинаем загрузку альтернативной БСВВ.

P.S.: Сброс я тоже хотел бы доработать и сохранять регистры для анализа, если какая-то программа зависла…
Да, адрес инструкции не узнать, но SP тоже немало скажет…


22 Jan 2020 10:02
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
пинцетиком работаю на Hex-уровне!
Paguo-86PK wrote:
я правлю МОНИТОР пинцетиком и жонглирую кодом как фигурками Тетриса: втискиваю свой функционал в рамки стандартного
Paguo-86PK wrote:
5 ячеек можно отыграть, но весь код придётся двигать. Об этом я давно думаю, но лень пока копаться
Да не 5 ячеек выигрывается, а 205. И весь код можно и нужно двигать, но соблюдая неизменность нескольких внутренних точек на которые делают вызовы игры идиотов и несколько фатальных внутренних точек, что наложили эмуляторы EMU, EMU80 (сохранять которые важно только для эмуляторов, для реала это не надо).

Но это легко делается, лишь когда программируют нормальными инструментами, а не занимаются мазохизмом, программируя отладчиком. Вы считаете, что это спортивно, но это не советский спорт. Это спорт мазохистов, потому что так программировать это мазохизм. Никто не писал так даже в 1975 году. Тогда не было ни отладчиков, ни ассемблеров. Но писали на бумаге на ассемблере (лишь функцию компилятора выполняли вручную).

По поводу нехватки объёма ПЗУ. Если, как в ОРИОНЕ, объявить обязательным наличие ROM-диска, то легко снимаются все проблемы нехватки объёма ПЗУ F800. ROM-диск позволяет иметь в ПЗУ F800 оверлейные директивы. Резидентными достаточно иметь лишь директивы I и G (как в М3 ОРИОНА). А остальные директивы легко можно сделать оверлейными. Например, после ввода директивы D исполнительный код выполняющий вывод дампа считывается в ОЗУ (основное или дополнительное) из ROM-диска и прогоняется. Для пользователя это без разницы.

Код всех директив умещается в 100 байт, ноничто не мешает изобрести новую директиву с кодом бОльшим (т.к монитор это не отладчик, основное ОЗУ вниз от RAMTOP можно затирать). Т.о за счёт ROM-диска можно одновременно расширить количество и улучшить качество директив, да ещё и освободить в ПЗУ F800 до килобайта свободного места.

Так можно встроить в монитор директивы обслуживания DOS (так было сделано в RK-DOS V1.0). Когда у меня случится очередной припадок для ковыряния в ПЗУ РК86, то возможно на этом принципе встрою в ПЗУ РК86 RAMDOS от Специалиста (там CCP команды RAMDOS являются расширением директив монитора).
Paguo-86PK wrote:
при скроллинге экрана код не завершается по «RET», а сразу стыкуется с кодом опроса клавиатуры
Ещё один метод с'экономить один байт. Можно применить, если прижмёт.
Paguo-86PK wrote:
Сброс я тоже хотел бы доработать и сохранять регистры для анализа, если какая-то программа зависла… Да, адрес инструкции не узнать, но SP тоже немало скажет…
Анализа регистров после сброса у Вас не получится, т.к по сбросу во всех процессорах все регистры гибнут и SP в том числе. Регистры можно анализировать, если использовать NMI в Z80. Но программы виснут не в конкретной точке, знание которой даёт информацию, а обычно происходит улёт с гибелью всего или части кода и зацикливанием в совершенно случайной точке.

На эту тему упомяну автостартовый хук введённый в M3 (во все версии кроме стартовой M3.1). Там после изменения 4-х ячеек после сброса происходит принудительный переход. Это было средство для получения слепков памяти, рестарта системы и для защиты от кракеров.
Code:
COLDST: LD      HL,(0F3C1H)
        LD      SP,0F3BFH
        POP     BC
        PUSH    HL         ; теперь в стеке адрес ухода
        SCF
        ADC     HL,BC
        RET     Z          ; уход
.
Например, чтобы по нажатию на кнопку СБРОС был переход, допустим, на точку BC00, кладём число BC00 в ячейки F3C1/F3C2, а в ячейки F3BF/F3C0 кладём число BC00 в дополнительном коде минус 1. Тогда по нажатию на кнопку сброс всегда будет переход на BC00. В М3 реализовано на порядок больше идей, чем в М1/М2.

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

Как я и упоминал ранее, даже от таких отвлечённых от реальных потребностей обсуждений бывает польза. И не только в плане моральной поддержки. Во-первых, я вспомнил о забытой на 25 лет идее оверлейного монитора, а во-вторых, вспомнил о резидентных DOS, которые (ради экономии объёма ПЗУ) не имея собственного CCP, в качестве него используют CCP монитора. Так работала RAMDOS для Специалиста и так же работала RK-DOS первой версии.

Всё это навело на мысль, что пора бы уже исковырять ПЗУ РК86 более существенно (до того, я лишь оптимизировал, не меняя имеющийся код, с целью выиграть байты ПЗУ). Потому вчера я решил посмотреть можно-ли в РК некоторые директивы заменить более удобными в пользовании директивами из монитора Специалиста.

В частности, не очень удачны директивы D, M, T, L и S. Директива М не показывает и не позволяет вводить ASCII и перемещаться по коду вверх-вниз, T не допускает перехлёст областей, а S ищет только один байт. При грамотной директиве D директива L вообще не нужна. А процедура конверсии строки с параметрами неудачна, т.к в качестве разделителя параметров использует запятую и вводит всего 3 параметра. Вместе с тем, стоит заметить, что весь код ПЗУ РК написан на весьма высоком уровне, меньшего объёма кода директив добиться почти невозможно (выигрывается лишь по паре байтов то тут, то там).

Собственно сам монитор неинтересен, его улучшение в виде замены родных директив другими, взятых от других машин не представляет даже спортивного интереса, не требует особого труда и не требует ума. Тем не менее, чтобы использовать CCP монитора для RAMDOS пришлось заменить GETLIN и процедуру конверсии строки с параметрами в HEX-значения, т.к CCP РК не позволяет ввод имён. Родная процедура GETLIN не универсальная (не допускает ввода точки, что необходима для имён файлов). Потому пришлось менять не только код самих директив, но и п/п-мму ввода строки и процедуру её анализа. В итоге на скорую руку скомпилировал новую версию РК-монитора. На этом я потерял более сотни байт, зато теперь можно ввести загрузку из ROM-диска расширения монитора. Это должно делаться автоматически по сбросу, если ROM-диск обнаружен.

Загружать можно любое расширение монитора, т.е можно не только добавить новые директивы, но любую резидентную директиву монитора можно заменить на другую. Например, резидентная директива S ищет один байт (в таком виде она вообще не нужна, отладчики ищут цепочку байт). Но после инсталяции расширения CCP для работы с DOS, директива S в виде:

--> S Имя_файла, Начальный_адрес, Конечный_адрес

записывает файл на дисковый привод (что в зависимости от конкретной DOS м.быть дискетой, винтом или RAM-диском). Если же загрузка DOS из ROM-диска не нужна (когда DOS прошита в ПЗУ, например с E000 или с 9000), то и загрузка директив извне не нужна и экономится ~20 байтов.

Вот пока ради эксперимента странслировал монитор с изменёнными директивами D, M и C. В директиве D теперь можно вводить только нач.адрес. Конечный адрес установится по умолчанию. Т.к достаёт вводить конечный адрес всякий раз когда надо посмотреть дамп. В дампе теперь выдаётся и ASCII представление, как принято в дампах. Директива М позволяет переходить к предыдущей и последующей ячейкам клавишами "курсор-вверх" и "курсор вниз". Для ввода символа ASCII - нажимаем на <АР2>, затем на клавишу символа. Нажимать <ВК> теперь не требуется, ввод автоматически происходит после набора второй цифры (что резко ускоряет ручной ввод дампа и текстов).

Все нестандартные входные точки, кроме одной сохранены. Убрана вх.точка F92C (т.к в применённом теперь CCP логика работы аналогичной п/п-ммы иная). F92C это п/п-мма для преобразования строки с тремя HEX-параметрами в загрузку ячеек PAR_HL, PAR_DE и PAR_BC шестнадцатеричными значениями.

В эту нестандартную вх.точку игры РК никогда не лезут. Из всех программ РК я встретил только одну РК-программу из 1987 года (мини-дизассемблер, 5000...5B18, KS:8DEE), которая нагло лезла в эту точку. Потому эта программа у меня не заработала в эмуляторе РК на ОРИОНЕ (т.к там в ПЗУ F800 только п/п-ммы ввода/вывода, директив монитора за ненадобностью и отсутствия места там нет). А вот в подпрограмму GETLIN (F8EE), также используемую CCP, некоторые РК-игры лезут.


Attachments:
$.rar [3.27 KiB]
Downloaded 247 times


Last edited by barsik on 23 Jan 2020 17:28, edited 1 time in total.

22 Jan 2020 14:48
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Например, DIR_D даёт и HEX и ASCII (отпадает дурная директива L), DIR_M позволяет шагать и вверх и вниз, и вводить не только HEX, но и ASCII.
Пoд это дело требуется как минимум 70 символов в строке.
Это достижимо только в моей «Windows'86»… :idea:
Code:
MONITOR_D:
     PUSH DE
     PUSH HL
     LD   A,L
     AND  A,0F0h
     LD   L,A
     OR   A,00Fh
     LD   E,A
     LD   D,H
     CALL 0F9C5h
     POP  HL
     CALL 0FA0Bh
     POP  DE
     CALL 0F996h
     JP   MONITOR_D ; 24 байта
barsik wrote:
Да не 5 ячеек выигрывается, а 205.
Этo если применять радикально тяжёлую артиллерию и перфоратором всё бомбить… :esurprised:
barsik wrote:
И весь код можно и нужно двигать, но соблюдая неизменность нескольких внутренних точек на которые делают вызовы игры идиотов и несколько фатальных внутренних точек, что наложили эмуляторы EMU, EMU80 (сохранять которые важно только для эмуляторов, для реала это не надо).
Как Вы и заметили: Я это и делаю с высокой степенью аккуратности.
barsik wrote:
Когда у меня случится очередной припадок для ковыряния в ПЗУ РК86, то возможно на этом принципе встрою в ПЗУ РК86 RAMDOS от Специалиста (там CCP команды RAMDOS являются расширением директив монитора).
Можете заранее предупредить про припадок, чтобы и мой вариант прошить-проверить? :ewink:
(На реальном железе, разумеется…)
barsik wrote:
Анализа регистров после сброса у Вас не получится, т.к по сбросу во всех процессорах все регистры гибнут и SP в том числе.
Если верить справочникам по i8080 и z80:
Quote:
Z80:RESET
Reset - Сброс Вход.
Активный уровень – низкий.
Сигнал /RESET имеет самый высокий приоритет и приводит ЦП в начальное состояние:
  • сброс счетчика команд PC=0000H
  • сброс триггера разрешения прерываний очистка регистров I и R
  • установка режима прерываний IM0
Для корректного сброса сигнал /RESET должен быть активен не менее 3-х периодов тактовой частоты. В это время адресная шина и шина данных находятся в высокоомном состоянии, а все выходы сигналов управления неактивны

barsik wrote:
Всё это навело на мысль, что пора бы уже исковырять ПЗУ РК86 более существенно (до того, я лишь оптимизировал, не меняя имеющийся код, с целью выиграть байты ПЗУ).
Лет 25 мечтаю это сделать со школы ещё, но понимаю сейчас, что не дорос ещё :oops:
Это - не какой-то IBM-PC с Windows и как попало написанным индусами кодом!
Это - РАДИО-86РК :exclaim:
barsik wrote:
Родная процедура GETLIN не универсальная (не допускает ввода точки, что необходима для имён файлов).
Можно поступить по буржуйски - код точки заменить на Esc/АР2 :)
barsik wrote:
В эту нестандартную вх.точку игры РК никогда не лезут. Из всех программ РК я встретил только одну РК-программу из 1987 года (мини-дизассемблер, 5000...5B18, KS:8DEE), которая нагло лезла в эту точку. Потому эта программа у меня не заработала в эмуляторе РК на ОРИОНЕ (т.к там в ПЗУ F800 только п/п-ммы ввода/вывода, директив монитора за ненадобностью и отсутствия места там нет). А вот в подпрограмму GETLIN (F8EE), также используемую CCP, некоторые РК-игры лезут.
Про что я и говорю. Я не имею избыточной информации про все программы. Всё нужно трассировать и проверять вызываемые ими подпрограммы из ПЗУ. Потому я иду своим путём с аккуратной правкой… :ebiggrin:

Кстати, я проснулся и понял, что дамп выше я сделал ошибочным. Вот так надо:
 Дамп
Code:
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F87F .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 21
F880 6C F8 E5 CD 2C F9 2A 2B 76 44 4D 2A 29 76 EB 2A
F890 27 76 3A 33 76 FE 44 CA C5 F9 FE 43 CA D7 F9 FE Директивы D C
F8A0 46 CA ED F9 FE 53 CA F4 F9 FE 54 CA FF F9 FE 4C Директивы F S T L
F8B0 CA 08 FA FE 4D CA 26 FA FE 47 CA 3F FA FE 4F CA Директивы M G O
F8C0 2D FB FE 49 CA 86 FB FE 58 CA D3 FF FE 52 CA 6A Директивы I X R
F8D0 FA FE 50 C2 00 F0 79 0E 00 C3 68 FA .. .. .. .. Директива P (делает выравнивание) и остальное
F~~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
FA68 .. .. .. .. .. .. .. .. D3 80 3E 90 D3 A3 22 01 Директива R практически теперь
FA70 A0 DB A0 02 03 CD 99 F9 C3 6E FA .. .. .. .. .. не изменилась
Чем удалось и «R» сохранить - работает привычно. И «P» добавить, которая та же «R», но выбирает страницу через ППА клавиатуры…

Вообще-то можно кнопку «Сброс» переделать на разрыв, чтобы сбрасывалось отпусканием. Но более глубоким нажатием должен срабатывать секретный контакт и предустанавливаться бит для активации оригинальной РФ2.
То есть, при холодном старте и при аварии - жмём Сброс глубже, активируя классический режим. А в остальное время - «лёгким движением руки» касаемся Сброса…
Тогда можно на E000…FFFF повесить SRAM на 8 Кб, куда можно залить любую прошивку.
Заливать SRAM через свободные каналы ПДП. Это лучше, чем механическим путём всякими секретными тумблерами включать/отключать защиту банков памяти от записи. Наши программы смогут без нашего механического участия перезаписывать SRAM тогда…
Конечно, ОЗУ можно заменить на РУ5 и переключать две страницы - кажется, это где-то было. Но при этом не использовать биты порта C ППА клавиатуры. Я вообще не понимаю, что за деревянные доработки всюду предлагались, где знакогенератор переключался тумблером или ППА, когда ВГ75 имеет атрибуты и команды «стоп ПДП», что позволяет и атрибут добавить в 76D0 для переключения страницы, и ПДП прервать на 7FF3, чтобы ВГ75 не ожидала лишний символ и экран не поехал. И Emu80 это эмулирует верно, если ввести этот код и запускать его директивами «G0»…«G7» по очереди:
Code:
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
0000 CF CF CF CF CF CF CF CF C1 79 87 87 F6 80 21 60
0010 7B 77 23 23 36 F1 0E 0C CD 09 F8 2A 00 76 23 23
0020 22 00 76 C3 58 F8
P.S.: А с «Супер-РФ2» так и не договорились… :roll:
(Идея с заменой одной лишь ПЗУ довольно любопытна…)


Last edited by Paguo-86PK on 23 Jan 2020 19:08, edited 1 time in total.



23 Jan 2020 07:35
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
barsik wrote:
DIR_D даёт и HEX и ASCII
Пoд это дело требуется как минимум 70 символов в строке.
А кто заставляет выводить дамп с 16-ю байтами в строке? В Специалисте, ОРИОНЕ и ИРИШЕ выводят в дампе по 8 байтов в строке и никто ещё не жаловался.
Paguo-86PK wrote:
Тогда можно на E000…FFFF повесить SRAM на 8 Кб, куда можно залить любую прошивку.
На E000...FFFF легко включается большое ПЗУ, т.к оно не создаёт конфликт с ПДП (потому, что из него нет чтения), а вот ОЗУ в этой области можно включить лишь громоздко. Т.к, чтобы поиметь тут ОЗУ, надо коммутировать область F000...F7FF где стоит ПДП, т.е в одной конфигурации тут надо включать ПДП, в другой - ОЗУ. Потому-то, чтобы не иметь мороки с коммутацией, дополнительное ОЗУ и включают обычно на месте запасного ППА на A000...BFFF (перенося это ППА куда-то в другое место).
Paguo-86PK wrote:
не понимаю, что за деревянные доработки всюду предлагались, где знакогенератор переключался тумблером или ППА, когда ВГ75 имеет атрибуты и команды «стоп ПДП», что позволяет и атрибут добавить в экран для переключения страницы, и ПДП прервать на 7FF3
Да, обслуживание атрибутов EMU80 эмулирует, но атрибуты мы не можем использовать, их уже заняли на цвет. Якобы цветные игры выглядят намного лучше.


23 Jan 2020 19:05
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Кстaти, можно свитч директив из «CMP+JZ» оформить в цикл с таблицей, примерно вот так:
Code:
        ORG     0F883H
        LD      A,(07633H)
        SUB     A,041H
        LD      C,A
        LD      A,0C9H          ; __CD_FG_ <-- маскируем 24 бита неиспользуемых директив
        LD      HL,0648EH       ; I__LM_OP_RST___X
        LD      DE,TABLE
LOOP:   ADD     HL,HL   ; Прокручиваем
        ADC     A,A     ; 24 бита влево
        JP      Z,0F000H; Директива не опознана
        DEC     C       ; Сверяемся с литерой
        JP      C,LOOP  ; Если бит пропуска - игнорируем сверку
        JP      Z,EXEC  ; Иначе начинаем исполнять, если нашли
        INC     DE      ; В противном случае
        INC     DE      ; адрес директивы пропускаем
        JP      LOOP    ; и продолжаем цикл
EXEC:   LD      HL,07627H
        LD      A,(DE)  ; Когда директива найдена
        LD      (HL),A  ; Читаем её адрес
        INC     DE
        INC     HL
        LD      A,(DE)  ; И помещаем в ячейки
        LD      (HL),A  ; директивы M
        CALL    0F92CH
        LD      A,L     ; Здесь четвёртый параметр
        LD      HL,(0762BH)
        LD      C,L
        LD      B,H
        LD      HL,(07629H)
        EX      HL,DE
        LD      HL,(07627H)
        JP      07626H  ; Итого - 59 байт (F883…F8BC)
TABLE:  DW      MONITOR_C,MONITOR_D,MONITOR_F,MONITOR_G,MONITOR_I
        DW      MONITOR_L,MONITOR_M,MONITOR_O,MONITOR_P,MONITOR_R
        DW      MONITOR_S,MONITOR_T,MONITOR_X
        ; Итого - 26 байтов (F8BD…F8D3)
        ; Освободились ячейки F8D4…F8DB
А директиву «P» лучше переработать вот так:
Code:
MONITOR_P:
        LD      A,L
        LD      L,000h
        JP      MONITOR_R
        ORG     0FA68H
MONITOR_R:
        OUT     (080h),A
        LD      A,090H
        OUT     (0A3H),A
MONITOR_R_LOOP:
        LD      (0A001),HL
        IN      A,(0A0H)
        LD      (BC),A
        INC     BC
        CALL    CMP_HL_DE_LOOP
        JP      MONITOR_R_LOOP

        ORG    0F957H
        NOP             ; Разблокируем чтение четвёртого параметра
        NOP
        NOP
Теперь страница ПЗУ для ППА клавиатуры выбирается младшей тетрадой первого аргумента и грузить её можно, соответственно, в любую область ОЗУ.
Например, «R8765,9ABC,1234» загрузит из ПЗУ 0x658700…659ABC в ОЗУ 0x1234…23F0… :roll:
Думаю, это удобнее…

P.S.: Как Вы и предлагали, можно уже с лёгкостью использовать и 4 параметра.
Если поставить nop'ы, можно командовать так «R<rom_from>,<rom_last>,<ram_address>,<rom_page>»… :mrgreen:


23 Jan 2020 19:10
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 583
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Вы изобрели уникальный метод для пропуска незадействованных в директивах букв с помощью битовой маски. Возможно, это новое слово в разработке компактных мониторов. Может быть попробую эту идею, если она даст реальную экономию (я на днях освободил в ПЗУ еще 5 байтов, теперь 214 свободно, но ещё десяток свободных байт не повредит).

А вообще традиционный способ перехода по таблице адресов для сокращения объёма повсюду используется (пример, BDOS CP/M). Но этот метод даёт выигрыш лишь когда букв работающих директив (или номеров функций) достаточно много. Всегда хотел посчитать, сколько директив минимум, когда табличный метод начинает окупаться. При малом числе букв цепочка непосредственных сравнений и джампов по объёму кода даёт выигрыш над табличным методом.

Но если все нужные буквы в начале алфавита и таблицу переходов укоротить (лишь для букв C...T), то будет экономия уже при меньшем числе директив.

 табличный метод
Code:
        PUSH    HL
        SUB     'A'
        ADD     A,A
        LD      HL,TABLE
        ADD     A,L
        LD      L,A
        LD      A,(HL)
        INC     HL
        LD      H,(HL)
        LD      L,A
        EX      (SP), HL
        RET     
       
TABLE:  DW      DIR_A        ; должна размещаться целиком в границах страницы (256)
        DW      DIR_B
        DW      DIR_C
        DW      DIR_D
        DW      DIR_E
        DW      DIR_F
        DW      DIR_G
        DW      DIR_H
        DW      DIR_I
        DW      DIR_J
        DW      DIR_K
        DW      DIR_L
        DW      DIR_M
        DW      DIR_N   ; несравнение
        DW      DIR_O
        DW      DIR_P
        DW      DIR_Q
        DW      DIR_R
        DW      DIR_S
        DW      DIR_T
        DW      ERROR   ; DIR_U
        DW      ERROR   ; DIR_V
        DW      DIR_W
        DW      DIR_X
        DW      DIR_Y
        DW      ERROR   ; DIR_Z
.

Вы собираетесь использовать 13 директив: C D F G I L M O P R S T X (к стандартным 12-ти, не считая U, Вы добавили P). Хотя X сразу надо выкинуть, а директива G сокращается до одного байта [ JP (HL) ]. Директива L не нужна, если Вы доработаете D до ASCII (да и без доработки не нужна). Директива S тоже никем не используется. Для реальной жизни достаточно оставить директивы: I, O, D, M, T, F, R. И, может быть, полезно добавить директиву V (Verify) - проверка МГ-записи путём сравнения записи на МГ-ленте с кодом в ОЗУ.

Не освободив место оптимизацией и выкидыванием бесполезных директив, невозможно сделать серъёзных, дающих реальную пользу модификаций ПЗУ. Кстати, освободив место в ПЗУ, можно встроить директивы I/O работающие без гашения экрана (для этого придётся кракнуть коммерческую защиту и выдрать оттуда процедуру чтения работающую без гашения, а вот процедуру записи придётся писать по образцу, т.к инсталляторов многоблочных защищённых от копирования МГ-программ, естественно, не распространялось).

И если всё делается ради ROM-диска, то значит он есть. Что позволяет иметь оверлейные из ROM-диска директивы. В минимуме нужна всего лишь одна директива - I с автозапуском. Ну и для порядка директива G. Если G не надо, то монитор вырождается в загрузку и старт по сбросу, как в Специалисте в минимальном варианте (когда в нём стоит всего одна РФ2 с загрузчиком).

Тогда, если ROM-диска нет, то по сбросу выводится титр и сообщение "НАЖМИ КЛАВИШУ ДЛЯ НАЧАЛА ЗАГРУЗКИ". И пользователь нажимает на клавишу, когда услышит в динамике магнитофона начало пилотона. Но если ROM-диск при сбросе обнаружен, то доступны все нужные директивы (загружаемые при их исполнении оверлейно из ROM-диска).

Кстати, директиву U при наличии расширяющего ПЗУ на F000 полезно заменить на пробел. Тогда все директивы, что должны обрабатываться в ПЗУ F000 можно начинать с пробела и этим директивам доступны те же самые буквы D, S, X... Тогда эти же буквы будут командами не RAM-монитора, а DOS. А вот переход на F000 по ненайденности директивы наоборот надо заменить на JMP WARMST (F86C), т.к иначе, если на F000 стоит РК-КНГМД происходит улёт.


24 Jan 2020 01:52
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 204 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7 ... 14  Next

Who is online

Users browsing this forum: Hammer and 28 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.