RUЭВМ
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.
Март 2024
ПнВтСрЧтПтСбВс
    123
45678910
11121314151617
18192021222324
25262728293031

Календарь Календарь

Последние темы
» Вити больше нет!
автор bug19 Пн Фев 20 2023, 19:54

» Собираем оригинальный Орион 128
автор bug19 Пн Фев 20 2023, 19:47

» Проблема плющеного экрана ОРИОНА
автор kanzler Пн Ноя 28 2022, 12:05

» Орион 128 и его клоны возрождение 2019-2022 год
автор kanzler Пн Ноя 28 2022, 12:03

» Электроника КР-04. Информация, документы, фото.
автор kanzler Пн Ноя 28 2022, 12:02

» Новости форума
автор kanzler Пн Ноя 28 2022, 11:52

» Орион-128 НГМД запуск 2021 года
автор matrixplus Сб Сен 10 2022, 17:36

» ПЗУ F800 для РК86
автор ведущий_специалист Сб Сен 10 2022, 10:37

» Микропроцессорная лаборатория "Микролаб К580ИК80", УМК-80, УМПК-80 и др.
автор Электротехник Вт Июл 26 2022, 19:33

» Орион-128 SD карта в Орионе
автор matrixplus Чт Июн 02 2022, 09:00

» 7 Мая. День Радио!
автор Viktor2312 Чт Май 12 2022, 10:58

» Серия: Массовая радио библиотека. МРБ
автор Viktor2312 Ср Май 11 2022, 12:17

» Полезные книги
автор Viktor2312 Пн Май 09 2022, 15:07

» Орион 128 Стандарты портов и системной шины Х2
автор matrixplus Вс Май 08 2022, 23:08

» Орион-128 и Орион ПРО еще раз про блоки питания
автор matrixplus Вс Май 08 2022, 19:09

» Орион-128 Программаторы
автор matrixplus Вс Май 08 2022, 19:02

» Орион ПРО история сборки 2021 до 2022
автор matrixplus Вс Май 08 2022, 18:47

» Анонсы монет (New coin).
автор Viktor2312 Сб Май 07 2022, 23:11

» Хочу свой усилок для квартиры собрать не спеша
автор Viktor2312 Сб Май 07 2022, 19:33

» Амфитон 25у-002С
автор Viktor2312 Сб Май 07 2022, 09:38

» Майнер: T-Rex
автор Viktor2312 Вс Май 01 2022, 09:12

» GoWin. Изучение документации. SUG100-2.6E_Gowin Software User Guide. Среда разработки EDA.
автор Viktor2312 Пн Апр 25 2022, 01:01

» GoWin. Изучение документации. UG286-1.9.1E Gowin Clock User Guide.
автор Viktor2312 Сб Апр 23 2022, 18:22

» GoWin. Documentation Database. Device. GW2A.
автор Viktor2312 Ср Апр 20 2022, 14:08

» GOWIN AEC IP
автор Viktor2312 Ср Апр 20 2022, 12:08

Самые активные пользователи за месяц
Нет пользователей

Поиск
 
 

Результаты :
 


Rechercher Расширенный поиск


Радио-86РК: Расширение ПЗУ

Перейти вниз

РК86 - Радио-86РК: Расширение ПЗУ Empty Радио-86РК: Расширение ПЗУ

Сообщение  barsik Ср Ноя 22 2017, 23:41

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

Заниматься маленькими постепенными доработками на старой базовой плате РК имеет смысл потому, что сделав какие-то доработки вручную, можно заняться разработкой ПО для этого улучшенного железа. А постепенное накопление проверенных и снабжённых программами доработок даст дополнительный стимул для разработчиков печ.плат заняться внедрением этих доработок на плате новодела РК.

Благодаря тому, что в адресном пространстве РК86 можно выделить много "дыр" между адресами портов и тому, что каждый порт занимает всего несколько смежных адресов, то можно придумать тысячу вариантов расширения ПЗУ. К тому же ПЗУ не обязано быть в виде единой сплошной области (что желательно для ОЗУ), так что теоретически при сохранении совместимости можно расширить ПЗУ до 32 кб минус 17 байтов, расположив его в неиспользуемых "дырах" адресного пространства.

Если РК-КНГМД не используется, то проще и удобнее всего поставить вторую РФ2 на адрес F000, как сделано в некоторых клонах, что хорошо тем, что возникает сплошной участок в 4 кб. Для этого можно поставить дешифратор (см.ж.Радио 02.1993), что даёт 4 чип селекта в области E000...FFFF. Тогда выборка E000 отдаётся ПДП, выборка E800 не используется, а выборки F000 и F800 подключаются к входам /CS двух ПЗУ РФ2. Можно использовать и более простой вариант без дешифратора.


РК86 - Радио-86РК: Расширение ПЗУ PZUF000dlyaRK86.1546101965


Если же используется РК-КНГМД, то увы, для расширения ПЗУ остаётся только родное окно ПЗУ в области F800. В этом случае для расширения ПЗУ можно ввести две или более страниц ПЗУ в двух-килобайтовом окне F800...FFFF. Для этого проще всего напаять на имеющуюся РФ2 панельку, куда устанавливается вторая ПЗУ РФ2. Для выбора текущей страницы ПЗУ, если используется РК-матрица клавиш, то для переключения страниц можно использовать свободный бит ППА D20. Если же использована клавиатура MS7007, где нет свободных битов ППА, то для коммутации можно применить бит PB0 запасного ППА D14 (PC0 обычно тратят на выбор альтернативного фонта).

Расход деталей составляет один корпус, панелька и, естественно, РФ2. Это простейший способ расширить ПЗУ до 4 кб. Например, можно иметь два ROM-BIOS (например, один м.быть совместимым с МИКРОШЕЙ). Если хочется получить много страниц ПЗУ в окне F800...FFFF, то можно заменить панельку на 24 ноги на 28-ми-ногую и применить 27256. Но большое ПЗУ всё-же удобнее иметь в большем окне.


РК86 - Радио-86РК: Расширение ПЗУ 2bankiRF2dlyaRK86.1546102937


Второй способ расширения ПЗУ был использован в плате РК-КНГМД от Е.Седова. При этом используется тот факт, что в ПДП, т.е по адресу E000...E008 процессор только пишет, но никогда не читает. Поэтому в адресах E000...EFFF может стоять ПЗУ, что и сделано в плате РК-КНГМД. Это даёт в системе 4 кб сплошного ПЗУ (не считая ПЗУ F800).

Легко сообразить, что если не нужно тратить чип-селект F000 на контроллер НГМД, то ПЗУ может занимать всё окно E000...FFFF, которое в базовой схеме занимает ПДП. А это даёт уже 8 кб сплошного ПЗУ. Применение РК-КНГМД в оригинальном виде мешает этому, т.к конфликтует с адресом F000, что использует РК-КНГМД. Но если есть возможность перетранслировать РК-ДОС на иные адреса размещения и портов, то проблема решается.

Если РК-КНГМД не нужен или, если использовать для РК-КНГМД другой адрес, то полученные 8 кб ПЗУ очень удобны для резидентного ПО. Можно также организовать 4 страницы ПЗУ по 8 кб, используя 27256, переключая страницы битами PB0, PB1 запасного ППА D14. Панельку для 27256 в оригинальной плате РК86 удобно ставить в уже имеющиеся отверстия около ПЗУ с фонтом. Будем считать это третьим вариантом расширения ПЗУ, дающим 8 кб сплошного ПЗУ.


РК86 - Радио-86РК: Расширение ПЗУ PZUE000.1546092804


В вышепоказанном варианте за счёт использования большой ПЗУ на 32 кб организовано 4 коммутируемые портом F000 страницы ПЗУ. По сбросу, естественно, устанавливается страница 0. Установка страницы ПЗУ в окне 8 кб производится записью номера страницы (0...3) в порт F000. Естественно такого порта в базовом РК нет. В данной схеме он организуется с помощью разделения области E000...FFFF на две половинки - E000...EFFF, которая остаётся для выбора ПДП, и область F000...FFFF, которая читается как ПЗУ, а запись в эту область управляет страницей ПЗУ.

Кстати, ещё один интересный вариант получения строба для записи в регистр страниц ПЗУ - это использование 4-х ЛЛ1 (или одного 4-х входового ИЛИ, типа ЛЕ7). Которые объединяют /CS ППА клавиатуры, адреса CPU А0, А1 и сигнал /WR. На выходе формируется строб при записи в порт А клавиатуры. Сам РК в этот порт не пишет и запись в этот порт ППА не вредит, т.к порт А ППА клавиатуры всегда запрограммирован на ввод.

Теоретически при РК-матрице клавиатуры 8*8 для управления страницами ПЗУ можно использовать PC1 и PC2 порта клавиатуры. Однако это не очень правильный выбор, т.к тогда не будет совместимости с пользователем имеющим клавиатуру MS7007 (с матрицей 8*11), которому придётся для управления ПЗУ придумать какой-то иной порт.

Вариант со страничным ПЗУ в окне 8 кб, на мой взгляд, самый выгодный для расширения ПЗУ. Хотя если нужно, чтобы из ПЗУ работала программа объёмом более 8 кб, то можно применить схему получения 15-ти килобайт сплошного ПЗУ.

Вариант расширения ПЗУ до 15 кб сплошного ПЗУ получается, если для адресации ВГ75, стоящего по адресам C000...DFFF, оставить только 1 кб в области C000...C3FF. Совместимости это не нарушит, т.к процессор пишет только в адреса C000...C0C0, C1C1, C2C2 и C3C3, т.е всё в пределах оставленной для адресации области. Тогда ПЗУ может занимать сплошную область размером в 15 кб, а именно C400...FFFF. Естественно, при применении вместо ПЗУ 27128 микросхем 27256 можно поиметь двухстраничную организацию (например, управляя каким-нибудь битом порта D14 или PC1 ППА клавиатуры).

Но в данной теме речь только про ПЗУ. Потому прилагаю схему расширения ПЗУ до 15 кб. Возможно, используя 556 РТ4 можно чуть сократить схемотехнику, но вряд-ли за счёт этого удастся выиграть хоть один TTL-корпус (зато добавит проблему прошивки РТ4).

Интересно, что благодаря тому, что в этой схеме ИД7 выбирается в области C000...DFFF и из её выходов использована только выборка  C000...C3FF и т.к РК не пишет в область C400...DFFF, то остальные формируемые этим ИД7 чип-селекты с шагом в 1 кб можно задействовать под устройства вывода (например, ВИ53 только для звуков, без чтения).

РК86 - Радио-86РК: Расширение ПЗУ RasshireniePZUvRK86.1523267512

Конечно можно занять под ПЗУ и второе окно, например, 8400...BFFF, но это не выгодно. Окно 8400 (где в отличие от области E000, допустимо ОЗУ) более ценно для целей расширения ОЗУ. И если уж требуется поставить много ПЗУ странично, то окно в 15 кб невыгодно, т.к страничное окно лучше иметь кратным (т.е более пригодным для страничной коммутации). Лучше всего в приведённой ранее схеме с окном в 8 кб применить очень большое ПЗУ, например на 128 кб.

8 кб достаточно большой сплошной кусок, чтобы разместить здесь какую-нибудь программу, а при использовании ПЗУ лишь в качестве хранилища резидентных программ (которые для прогона всегда копируются в ОЗУ) размер окна, через которое мы имеем доступ к ПЗУ не играет роли.

Окно ПЗУ размера 8 кб, выгоднее также потому, что даёт возможность удобно расширить ОЗУ до 56 кб, хотя (ради совместимости) и с использованием двухрежимной коммутации. Здесь же идёт речь лишь о случае когда в РК требуется иметь максимально большое сплошное ПЗУ, а не о какой-то иной несовместимой архитектуре.

Спойлер:


Последний раз редактировалось: barsik (Пн Янв 06 2020, 15:05), всего редактировалось 1 раз(а)
barsik
barsik
Ветеран

Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия

Вернуться к началу Перейти вниз

РК86 - Радио-86РК: Расширение ПЗУ Empty ROM-BIOS РК86 с функциональными клавишами

Сообщение  barsik Сб Дек 29 2018, 20:07

2
Это не новый пост, а лишь восстановленный после редактирования предыдущего.

После расширения ПЗУ в РК86 разумно сделать хоть какую-то его поддержку ROM-BIOS-ом. Т.к в противном случае, чтобы воспользоваться ПЗУ придётся с МГ-ленты грузить какую-то программку, которая предоставит Вам доступ к этому резидентному ПЗУ, что явно неудобно.

В предыдущем посте рассказано о возможных методах установки дополнительного ПЗУ в РК86. Из чего ясно, что в РК наиболее удобно ввести или ПЗУ 15 кб в адресах C400...FFFF или в окне в 8 кб по адресам E000...FFFF. Последний вариант более выгодный, т.к кратное окно позволяет организовать страницы (размером по 8 кб) и использовать ПЗУ бОльшего размера. Например, удобно применить ПЗУ 27256 с 4-мя страницами по 8 кб, что даёт 30 кб для резидентных программ.

ПЗУ стоящее в адресном пространстве имеет неоспоримые преимущество перед ROM-диском, т.е ПЗУ считываемым через интерфейс ППА D14, т.к программа может работать прямо из окна ПЗУ в адресном пространстве процессора не нуждаясь в перегрузке в ОЗУ (это экономит ОЗУ, что важно, например, для DOS или бездисководного ассемблера).

С другой стороны, при наличии неизвестного старым программам ОЗУ в области A000...BFFF, ROM-диск тоже удобен, например, для загрузки оттуда ОС. Т.к ROM-диски можно оперативно переставлять, имея несколько ROM-дисков. Базовое ПЗУ РК имеет рудиментарную поддержку ROM-диска в виде директивы R. Более удобно ROM-диск поддержан в ОРИОНЕ. Использованный там метод размещения файлов в виде сплошного связанного списка удобен для ПЗУ, и хорошо себя зарекомендовал.

Исходя из вышеизложенного я странслировал модифицированный ROM-BIOS РК86 (для клавиатуры с матрицей РК86, не MS7007). В него внесены следующие доработки:

Как всегда обеспечил совместимость. Причём в данном случае не только по стандартным и нестандартным внутренним точкам ПЗУ, а также и по 4-м внутренним точкам перехвата, которые используют эмуляторы EMU и EMU80 (что не нужно для реала, но на что впустую приходится тратить память).

Добавлена директивы K и H - подсчёт контрольной суммы блока и HEX-арифметика, подсчёт суммы и разности 16-ти ричных чисел

Удалена директива X (печать содержимого регистров). Для этого предназначен полноценный отладчик.

Удалена директива R (чтение блока ROM-диска). Это была неудобная директива, вместо этого теперь файл из ROM-диска грузится и стартует по нажатию клавиш СС+F5 (правила оформления ROM-диска см.ниже).

Директива G теперь не имеет второго параметра - стоп точки. Зато теперь введён возврат из запуска по G по RET, т.е теперь G работает по CALL, а не по JMP (как во всех компютерах в мире). И что важно, введена возможность передавать два параметра (второй и третий, они передаются в регистрах DE и BC, первый параметр в команде G это адрес запуска).

Звук выдается не только по DI/EI, но и по PC0 ППА клавиатуры (это сделано для тех у кого Z80 или HD64180).

Поддерживается расширение ОЗУ на 32 кб самым примитивным способом - цельно полубанковой коммутацией. Для чего введены две новые стандартные подпрограммы, аналогичные подпрограммам ОРИОНА, - подпрограммы для чтения/записи байта - F836/39. Работа этих п/п-мм идентична аналогичным п/п-мам ОРИОНА.

В данной версии регистр управления полу банками - бит PC1 в ППА РК-клавиатуры. При записи 1 в ППА по биту PC1 в окне 0...7FFF должна включаться вторая половина банки РУ5. Т.е это самый простой вариант дополнительного ОЗУ для тех у кого ОЗУ на РУ5. В данной версии есть доступ только к 32-м дополнительным килобайтам (а содержимое рег.A в этих подпрограммах не важно). Для интереса посмотрите, что делают эти подпрограммы. Несложно их изменить, если у Вас доп.ОЗУ 1 МБ, коммутируется в окне A000...BFFF.

По сбросу инициализируется и запасной ППА. Это важно, т.к при этом выходы его порта C программируются на вывод, что позволяет использовать этот ППА для управления режимами РК86. Тогда, используя свойство ППА, что по инициализации его выходы ставятся в  0, устанавливается стандартный режим, т.е - базовый фонт, режим монохром, банк ROM-диска 0, текущая страница ПЗУ E000...FFFF - тоже 0.

Введены, так называемые программные клавиатурные прерывания, подобно тому, как были клавиатурные прерывания на D000,D003,D006... в Специалисте (по нажатию НР+Fn) или в М3 ОРИОНА по нажатию УС+СС+симв.клавиша в ОРИОНЕ. Т.е программные переходы по нажатию на клавиатуре определённого сочетания клавиш на какой-то адрес, причём по команде CALL, а не JMP (потому правильное название клавиатурные прерывания, а не переходы). Если по этому адресу стоит процедура, сохраняющая регистры и выполняющая возврат по RET, то по RET происходит возврат в первоначальную программу в то же самое место из которого было вызвано клавиатурное прерывание.

Контроль на сочетание клавиш происходит при выполнении основных подпрограмм ПЗУ - F803, F809, F812 и F81B. Т.е клавиатурное прерывание срабатывает всегда, когда программа использует стандартные функции ввода/вывода.

Если в Специалисте клавиатурные прерывания были фиксированными (т.е по навсегда фиксированному адресу), а в ОРИОНЕ, наоборот, требовалась загрузка внешнего обработчика таких прерываний (что, как бы добавляло клавишу АЛЬТ=УС+СС и загружаемые функции), то в данном ПЗУ РК86 использованы оба способа.

В ОРИОНЕ, где тоже РК-клавиатура, используется сочетание клавиш УС+СС. В данном ПЗУ переходы вызываются по нажатию клавиш F1...F5, если заранее нажата и удерживается клавиша СС (что тоже самое, что НР или Shift). Это не сокращает  объём кода (но так нажимать проще), а возможным это стало потому, что символьные клавиши не используются, только F1...F5. В эмуляторах обычно роль клавиши СС играет клавиша Shift.

Есть две версии. В одной пользователь может, как изначально настроить адреса переходов на конкретные адреса ПЗУ (например E000), так и оперативно изменить адреса обработки всех пяти клавиатурных прерываний, т.к адреса переходов расположены в ОЗУ. Это удобно, например загрузка ОС может изменить работу клавиатурных прерываний. В альтернативной версии, адреса переходов оперативно не меняются (что прошито в ПЗУ в табличке на FFF6, туда и переход по CALL).

7614 - адрес куда происходит CALL по Shift+F1 (по умолчанию адрес из FFF6)
7616 - адрес куда происходит CALL по Shift+F2 (по умолчанию адрес из FFF8)
7618 - адрес куда происходит CALL по Shift+F3 (по умолчанию адрес из FFFA)
761A - адрес куда происходит CALL по Shift+F4 (по умолчанию адрес из FFFC)
761C - адрес куда происходит CALL по Shift+F5 (по умолчанию адрес из FFFE)

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

Клавиатурные прерывания также дают возможность ввода так называемых ключевых команд, по типу того как это было на Роботроне-1715. Там можно было задать в соответствие функциональной клавише определённой строки. Например, можно задать по нажатию <F2> выдачу на консоль команды DIR B:<ВК>. Т.е клавитурные прерывания позволяют программировать команды в DOS.

Как выше указано, по сбросу адреса переходов устанавливаются в соответствии с прошитой в ПЗУ табличкой, которую перед прошивкой может изменить каждый пользователь самостоятельно. Эта табличка имеет размер 2*5= 10 байт и расположена в самом конце ПЗУ по адресу FFF6.

В данной прошивке ПЗУ в табличке такие адреса:

Shift+F1 - E000
Shift+F2 - Pause
Shift+F3 - F86C (Warm Boot монитора)
Shift+F4 - F86C (Warm Boot монитора)
Shift+F5 - старт самого первого файла из ROM-диска

Т.е по нажатию Shift+F1 стартует RK-DOS (или что-то ещё, что находится по E000). По нажатию Shift+F2 происходит зацикливание до нажатия клавиши <ВК>, что удобно для останова для просмотра текста при его ролике, например по TYPE в DOS. Сочетание Shift+F3 я чуть позднее сделаю CLS, а Shift+F4 это очень полезное свойство - выход в монитор на WARM START из любой программы (экран не очищается).

Сочетание Shift+F5 предназначена для загрузки ОС с ROM-диска (удобно ОС из ROM-диска грузить в доп.ОЗУ, например, на A000). При этом в отличие от ORDOS ОРИОНА грузится не фиксированный объём кода в фиксированные места. Размер ОС задаётся в самом файле расположенном в ПЗУ по адресу 0, а адрес загрузки можно задать в коде ПЗУ (сейчас там 7000/A000).

Т.е адрес загрузки определяется не меткой ORDOS-файла в ROM-диске, а прошивкой данного ROM-BIOS, т.к адрес загрузки одновременно является признаком наличия ROM-диска (по типу того, как ORDOS определяла наличие ROM диска байтом C3 по адресу с оффсетом 7FD). Стартовый файл ROM-диска должен располагаться в ROM-диске с адреса 0 и быть в обычном формате ORDOS, т.е это код файла снабжённый ORDOS-заголовком в 16 байт. Никакого специального кода ОС в 800 байтов, как в ORDOS ОРИОНА нет. Это удобнее, т.к не ограничивает адрес и размер ОС.  Адрес загрузки (оффсет 8 ) должен совпадать с адресом прошитым в ROM-BIOS, а длина в ячейке с оффсетом 10 может быть любой. По нажатию Shift+F5 данный файл грузится и стартует. Формат всех остальных файлов в ROM-диске может быть любым и определяется уже самой загруженной ОС, хотя и нет особых поводов менять хорошо себя зарекомендовавший формат файлов квази-дисков ОРИОНА.

Позднее выложу микро-ОС (аналог ORDOS, но в 4 раза короче), позволяющую запускать файлы из ROM-диска и RAM-диска в 32 кб из верхнего ОЗУ РУ5-тых, а также Changer позволяющий загружать RAM-диск  с МГ-ленты или проводной линии. При установке одной 62256 в окно A000...BFFF, общий размер RAM-диска достигает 64 кб (при этом, естественно, и п/п-ммы F836/39 немного меняются). Эта микро-ОС не аналог ORDOS, т.к содержит всего 4 функции - считать/записать/удалить файл и считать каталог, причём в варианте для базового РК эти функции оверлейные, отчего микро-ОС сокращает доступное ОЗУ всего на 200 байт, а не на 2 кб.

Удобно иметь ПЗУ на E000 (всё-равно на E000 обычно стоит RK-DOS). Если же такого ПЗУ нет, то разумно иметь ROM-диск и ОЗУ на A000, куда могут грузиться системные программы из ROM-диска (отдадчик и DOS, в т.числе и RK-DOS перетранслированная на A000 и CP/M).

Так как все исполнительные адреса клавиатурных прерываний всё-же не в ПЗУ, а в ОЗУ (7614...761D), то в ходе работы любое клавиатурное прерывание можно изменить. Если же это не делать, то работают те адреса, что прошиты в ПЗУ.

А чтобы Вам более детально понять, что делает загрузчик ОС из ROM-диска привожу полный код этого загрузчика:

Спойлер:

Таким образом, чтобы грузить Вашу ОС в другие адреса замените параметр в команде LD DE,0A000H на тот адрес? куда должна грузиться Ваша ОС.

Можно также посмотреть как устроены п/п-ммы чтения/записи байта из второй половины РУ5-тых. Видно, что здесь упрощённый доступ (т.е не к 1 мб на SIMMS-30, а только к 32 кб в верхних адресах РУ5-тых).

Спойлер:

Вопросы и просьбы изменить что-то (например, автостарт ОС из ROM-диска или E000, как в ОРИОНЕ), помочь настроить код под иные адреса - пишите в личку. Кстати, как всегда, это не последняя версия ПЗУ, это будет меняться по мере доработки и моих потребностей (периодически смотрите дату упаковки RAR-архива).

Выложенная здесь версия странслирована под самый общий случай, т.е для случая когда и ППА D14 ещё стоит по базовому адресу A000 (и соответственно, ОЗУ на A000 нет), а полубанково-коммутируемое дополнительное ОЗУ самое минимальное - 32К, всего одна дополнительная полу-банка из верхней части РУ5-тых.

Если же у Вас запасной ППА переставлен на 8400, чтобы в области A000...BFFF поставить ОЗУ (любое, открытием верхней памяти РУ5-тых, или, что приятнее, - сделано из двух 62256, что даёт прокачку в окне 8 кб дополнительных 64 кб, коммутируемых битами запасного ППА по адресу 8400), то используйте версию для ППА D14 на 8400, что также включена в архив. Не перепутайте, т.к версия ПЗУ для D14 на 8400 не будет работать на базовом РК86, где нет дешифратора ИД7 на область 8000...9FFF. Т.к тогда обращения на 8400 будут попадать на 8000 (т.е не в D14, а в ППА клавиатуры на 8000), что приведёт к ужасному завису...

PS. Учтите, что для РК86 я встречал несколько универсальных игр, что контроллируют команду LD SP,76CF (или LD SP,36CF) по адресу F836, определяя по байту 76 или 36 размер ОЗУ и соответственно корректируя код игры. Правильнее было бы проконтроллировать старший байт регистра SP при запуске игры. В данном ПЗУ, т.к число входов увеличено (да и код начала совсем иной), на адресе F836 находится совсем другой код, потому эти игры вероятно будут улетать. Если обнаружите такие игры, пришлите мне, исправить их - дело нескольких минут.

В выложенный по ссылке архив вложен отладчик, странслированный на адрес E000, что позволяет установить ПЗУ с ним в панельку ROM-диска и выходить в него по Shift+F1. Это обычный отладчик, он не предназначен для входа в него по CALL и возврата из него по RET. Так что после прерывания программы по Shift+F1 с целью отладки возврата не будет. Чуть позднее я переделаю отладчик, чтобы он работал в более удобной мнемонике (Z80) и введу вход/выход в отладчик по CALL.

Обращаю внимание, что эмуляторы EMU и EMU80 содержат ошибку. С моими модификациями мониторов РК86 с большим курсором в этих эмуляторах неверно отображается курсор. На реале всё нормально. Потому в архиве есть версии странслированные как для большого курсора, так и для обычного курсора в виде чёрточки, что нормально отображаются в эмуляторах.

Чтобы использовать эти файлы ПЗУ в эмуляторе переименуйте файл ПЗУ в то имя, что указано в конфиг-файле конкретного эмулятора. Или отредактируйте конфиг файл, указав там имя данного файла в качестве файла ПЗУ, вместо ранее указанного.

Скачать ПЗУ F800
barsik
barsik
Ветеран

Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия

Вернуться к началу Перейти вниз

РК86 - Радио-86РК: Расширение ПЗУ Empty как устранить конфликт большого ПЗУ на E000 и РК-КНГМД

Сообщение  barsik Вс Янв 05 2020, 23:51

3
Теоретически архитектуру РК86 можно доработать множеством способов. Но сейчас уже нет никакого смысла в изменении самой платформы, т.к ясно, что для этого нет и не придвидится программ. И всё-же некоторые несложные дополнения к базовой архитектуре, которые служат лишь цели улучшения сервиса и удобства пользования и делаются вручную на базовой плате, имеют смысл.

В частности дополнительное ПЗУ, если в нём помещён не ROM-BIOS, а только резидентные программы, не меняет архитектуру для программ, а лишь освобождает пользователя от длительной загрузки с МГ-ленты. Например, очень удобно иметь в области E000...EFFF или 9000...9FFF отладчик, а в области F000...F7FF загрузчики  с дискеты и из ROM-диска. А небольшое дополнительное ОЗУ в 8 или 12 кб, что используется только для целей DOS и системы, также не меняет ничего для прикладных программ.

Под ПЗУ полезно занять всю область в 8 кб выделенную дешифратором D11 для ПЗУ, что достигается заменой панельки на 28-ми ногую. Но так просто расширить ПЗУ до 8 кб можно только в машине, где не используется РК-КНГМД с RK-DOS от Е.Седова (см. журнал Радио 01.1993). Потому, что для этой ДОС в плату РК дополнительно монтируется дешифратор ИД7 и область F000...F7FF занимается под обращение в РК-КНГМД. А это, естественно, конфликтует с большим ПЗУ 2764 в окне E000...FFFF.

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

А добавлять ОЗУ выше 8000 необходимо для CP/M или любой другой DOS с размером более 4 кб. Такая DOS может располагаться только вне основного ОЗУ, т.е в ОЗУ или ПЗУ выше 8000, т.к если CP/M при работе размещается ниже 7600, то из-за большого размера самой DOS в ней можно будет запускать только программы маленького размера, что лишает такую DOS всякого смысла.

Таким образом возникает необходимость иметь два дешифратора - один для РК-КНГМД, второй, чтобы поиметь новый чип-селект для ППА D14 при совместимом расширении ОЗУ в окне A000...BFFF. Учитывая, что убрав дешифратор введённый Е.Седовым на области E000, мы тем самым разрешаем расширение окна ПЗУ до 8 кб, то становится совершенно ясно, что логично иметь лишь один общий (для ППА D20, РК-КНГМД, ППА D14) дополнительный дешифратор в области 8000 (вместо двух), формируя с его помощью чип-селекты как для нового адреса ППА D14, так и для РК-КНГМД. Адрес РК-КНГМД не принципиален и его можно менять, т.к его используют только две программы - форматёр дискеты и сама RK-DOS, заменить в которых адрес не проблема. Адрес ППА D14 также не принципиален, т.к используется только в директиве U монитора и в программе прошивателя УФ-ПЗУ.

Перенеся адрес РК-КНГМД из области F000 мы решаем сразу две задачи - экономим один дешифратор ИД7 и устраняем фатальное препятствие для расширения ПЗУ за счёт монтажа более много_выводной панельки для него. В итоге, если удовлетвориться окном доп.ОЗУ всего в 8 кб (используя для него лишь базовую область адресации ППА D14 на A000), то для расширения ОЗУ до 8 кб и ПЗУ до 8 кб, вообще не тратятся доп.детали (учитывая наличие уже ранее установленного для RK-DOS дешифратора E000, теперь он просто переносится на 8000).

Учитывая, что есть программы, которые используют команды IN/OUT, для портов требуется иметь участок адресации не менее, чем в 1 кб, разумно ввести 4 доп.порта в области 8000...8FFF с шагом в 1 кб. Например при обращении в порт 8000+3 используют команду OUT (83),A, отчего реальное обращение происходит в адрес 8383. Потому отдавать портам для БИС менее, чем 1 кб в РК нельзя.

Тогда, например можно так: на 8000 - клавиатура, на 8400 - ППА D14, на 8800 - РК-КНГМД и адрес 8C00 остаётся для винчестера или контроллера microSD. А область 9000...BFFF размером в 12 кб удобно остаётся для доп.ОЗУ или доп.ПЗУ. Доп.ОЗУ выше $8000 при ОЗУ 565 РУ5 делается просто логикой, а если ОЗУ на двух банках 565 РУ3, то доп.ОЗУ выше $8000 удобно выполнить на статике 6264 или 62256.

При выделении для адресации РК-КНГМД участка 8400...87FF, т.е размером всего в 1 кб, нельзя просто перетранслировать оригинал RK-DOS под другой адрес порта. Т.к из-за команд IN/OUT в регистр по адресу PORT+4 (в оригинале F004) оригинальная RK-DOS обращается командами IN A,(0F4H), что из-за особенностей КР580 приводит к обращению в адреса F4F4, т.е уже за пределы одного килобайта. Потому с новой адресацией РК-КНГМД должна использоваться переделанная версия RK-DOS в которой команды IN/OUT заменены на LD. Например, версия RK-DOS, что приведена здесь, а лучше вот здесь.

http://ipic.su/img/img7/fs/MAP_RAM_9000_ROM_E000.1578315665.png

После расширения ПЗУ до 8 кб по сбросу компьютер стартует с кода ПЗУ E000, а не с адреса F800, что при ПЗУ на РФ2. Т.е если в 2764 прошить стандартное ПЗУ F800 (в старшую четверть), то надо обеспечить, чтобы первой командой в ПЗУ (которая при сбросе читается с адреса 0), т.е по адресу E000 стоял JMP F800.

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

Представленное выше расширение является самым оптимальным из не меняющих платформу. Для программ, расширение ПЗУ до 8 кб без разницы. РК-программы волнует только, чтобы клавиатура была на 8000, ВГ75 - на C000, ВТ57 - на E000 (только запись), чтобы на F800 было ПЗУ и адрес экрана был запрограммирован на 76D0. Если это выполнено, то совместимость остаётся.

А расширение ОЗУ на 12 (или на 8 ) кб в окне 9000...BFFF (или A000...BFFF) в основном необходимо для CP/M. Для РК-ДОС достаточно оставить входной JMP на E001 и расширенного ПЗУ и для неё после смены адреса РК-КНГМД теперь можно истратить аж 6 кб ПЗУ (E000...F7FF), что на 2 кб больше, чем ранее, да и дешевле (т.к одно ПЗУ 2764 или 27256 стоит дешевле, чем три штуки 573 РФ2). Т.о расширив ПЗУ до 8 кб мы имеем возможность поиметь RK-DOS улучшенного качества.

А в случае использования CP/M (что размещается и работает в доп.ОЗУ выше 8000) в добавленных 6 кб ПЗУ (E000...F7FF) удобно разместить CP/M-BIOS (или 2 кб загрузчик DOS с дискеты и отладчик в 4 кб).

Что касается размера окна доп.ОЗУ вводимого выше 8000. Если это доп.ОЗУ некоммутируемое, т.е нестраничное, то выгоднее его размер в 12 кб (9000...BFFF). Но если это доп.ОЗУ сделано страничным, т.е в этом окне прокачивается огромное дополнительное ОЗУ, то размер этого окна доп.ОЗУ должен быть кратным двойке, т.е иметь размер всего в 8 кб, т.е занимать лишь область A000...BFFF. При этом участок 9000...9FFF удобно отдать под ПЗУ с отладчиком (т.к отладчик работающий из адресов выше 8000, позволяет отлаживать программы в любых адресах основного ОЗУ ниже 8000).
barsik
barsik
Ветеран

Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия

Вернуться к началу Перейти вниз

РК86 - Радио-86РК: Расширение ПЗУ Empty две страницы ПЗУ на двух РФ2 в окне F800 без расхода ППА D14

Сообщение  barsik Вт Янв 28 2020, 13:21

4
Каждый из методов расширения ПЗУ имеет некоторые недостатки. Например, расширение ПЗУ в окне E000 размером 8 кб или ПЗУ 4 кб в области F000...FFFF конфликтует с РК-КНГМД включаемым в той же области E000. А установка двух или более страниц ПЗУ в маленьком окне F800...FFFF требует наличия сигналов управления переключающих страницы. Эти сигналы можно формировать отдельной схемой, например брать с доп.порта организованного на 1533ТМ9 или же использовать для этого биты запасного ППА D14, причём в последнем случае надо решать задачу, чтобы до запрограммирования режима ППА D14 и сразу после этого выбиралась нулевая страница ПЗУ.

До запрограммирования ППА у неё на всех выходах Z-состояние (что без резисторов привязки входами ПЗУ читается как уровень единицы). А после запрограммирования порта на вывод, на всех его выводах оказывается ноль. Эта проблема легко решается путём подключения к входам ПЗУ куда идёт управление от ППА D14 резистора 150 Ом на землю. Когда выходы ППА в Z-состоянии резистор утягивает адресные входы ПЗУ на землю обеспечивая выбор страницы 0. После запрограммирования данного порта ППА D14 на вывод, на его ножках возникают уровни 0, т.е выбор страницы ПЗУ 0 сохраняется.

Если страниц ПЗУ немного, например, всего две (две включённые в параллель РФ2), то ставить доп.регистры (что требует не только организации их сброса, но и узел для формирования сигналов записи в них) или же тратить на коммутацию ПЗУ запасной ППА D14 (которому есть более полезное применение в виде ROM-диска, точнее ROM-картриджа, т.к в РК86 нет ORDOS и называть это диском неправильно) - не оптимальные решения.

Вместе с тем, если посмотреть трезвым взглядом на использование клавиатурного ППА D20, то обнаружится, что два бита ППА клавиатуры, а именно PC1 и PC2 всегда запрограммированные на вывод не используются. Потому у всех изобретателей доработок РК86 давно тянутся их грязные ручонки к этим битам ППА с целью нагрузить их какой-нибудь полезной работой. Например, неплохо использовать их для выдачи трёхголосной программной классической музыки или же для одноголосной музыки, но зато с 8-ю уровнями громкости (используя и PC0 как третий канал или вес). Но одно дело придумать бесполезную железяку, а совершенно другое - поддержать это "изобрЕтение" программно.

Если использовать PC1 и PC2 для переключения страниц ПЗУ, то возникает проблема из-за того, что и базовое ПЗУ постоянно пишет в PC1 и PC2 нули и программы пользователя, что перенастраивают режим ППА также выводят нули на этих выводах. Т.о на этих выводах возникают единицы до установки режима ППА и нули после этого. Если учесть, что это всегда одинаковые сигналы, т.е или 11 или 00, то можно из двух этих выводов формировать один сигнал - номер страницы ПЗУ. При этом отпадает необходимость привязки на 0 (чтобы при выходах ППА в Z-состоянии была включена страница ПЗУ 0), хотя всё-равно желательна привязка на +5В, т.к нехорошо иметь Z-состояние на TTL-входах 1533ЛП5.

Есть такой странный тип TTL-вентиля под названием 1533 ЛП5 (научно называется исключающее-ИЛИ). Он как раз даёт на выходе 0, когда оба входных сигнала равны и даёт единицу, когда на одном из входов ноль, а на другом единица. Т.к в имеющихся программах уровни сигналов на PC1 и PC2 всегда равны, то обеспечивается включение базового ПЗУ РФ2 всегда в имеющихся программах. Но если программно (побитовой командой или даже байтом) вывести в PC1 (или в PC2) единицу, то включится альтернативная страница ПЗУ F800.

Таким образом не затрачивая запасное ППА D14 и не нагружая шину получаются две страницы ПЗУ и совместимость с имеющимися программами не нарушается. Но это возможно только переделав ПЗУ F800, т.к без модификации ПЗУ F800 при каждом вызове F81B, F812, F803 базовое ПЗУ РК86 от авторов РК принудительно устанавливает страницу ПЗУ 0 (т.к зачем-то кидает на порт C ППА клавиатуры байт 0).


РК86 - Радио-86РК: Расширение ПЗУ 4KupravlyaemyeD20.1580204839
barsik
barsik
Ветеран

Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия

Вернуться к началу Перейти вниз

РК86 - Радио-86РК: Расширение ПЗУ Empty ROM-BIOS РК86 работающий в ОЗУ

Сообщение  barsik Пн Фев 24 2020, 19:28

5
При отладке ROM-BIOS и для других задач удобно, чтобы ROM-BIOS работал не из ПЗУ, а из ОЗУ. Наподобие того, как делается во многих IBM PC, где при процедуре инициализации содержимое ПЗУ копируется в ОЗУ и оттуда работает. Это обычно делается из-за того, что микросхемы ОЗУ намного скоростнее, чем микросхемы ПЗУ.

В РК86 и Специалисте тоже можно поиметь псевдо-ПЗУ, если применить теневое стартовое ПЗУ с адреса 0 и "открыть" ОЗУ на месте ПЗУ, т.е в случае РК, - в адресах F800...FFFF. Тогда по сбросу начинает исполняться программа в ПЗУ с 0, которая выполняет загрузку в область F800 содержимого ROM-BIOS и по окончании её отключает ПЗУ с 0, восстанавливая в области 0...7FFF ОЗУ.

В ОРИОНЕ-128 с процессором КР580 так не сделать, т.к там применяются команды OUT F8, OUT F9, OUT FA, которые портят (под-ПЗУ-шечное) ОЗУ по адресам F8F8, F9F9 и FAFA из-за свойства КР580 (что неприятно отличает КР580 от Z80). Из-за чего нужна отдельная схема для защиты "под-ПЗУ-шечного" ОЗУ от записи, что резко усложняет эту доработку.

На Специалисте с Z80 в 1990 году у меня использовалось теневое ПЗУ 0...7FFF и после сброса ROM-BIOS копировался из этого ПЗУ на адрес C000 в ОЗУ (ОЗУ было 62 кб до F7FF). Причём никакой защиты от записи ОЗУ C000...F7FF не было, но это не вызывало никаких проблем, т.к программы Специалиста в ПЗУ не пишут, не повреждают тем самым ОЗУ в этой области. Это было удобно для отладки версий ПЗУ и для работы CP/M.

В РК86 также можно поиметь псевдо-ПЗУ в виде ОЗУ. Это удобно для отладки версий ПЗУ, а также можно динамически загружать в эту область директивы монитора из ROM-диска, что снимает всякие ограничения по объёму при улучшении ROM-BIOS.

Маленькое окно в 2 кб неудобно. К сожалению, 8 кб ОЗУ в адресах E000...FFFF мы сделать не можем, это можно сделать только в виде ПЗУ, т.к в ПДП по адресам E000...E3FF производится запись. Т.о область E000...E7FF непригодна для ОЗУ. А сокращённое окно в 6 кб E800...FFFF - это некратное окно, непригодное для страничности. Потому волей-неволей приходим к идее организации окна ОЗУ в окне F000...FFFF размером в 4 кб. Для ROM-BIOS этого достаточно. Кстати, ПЗУ 4 кб с F000 сделано в Микроше и ещё в каких-то других развитых РК-подобных.

ОЗУ 4 кб с адреса F000 легко организовать при использовании на плате РК ОЗУ 565 РУ5 с объёмом в 64 кб, в котором в базовой архитектуре впустую пропадают 32 кб из 64. Потому при РУ5 "открыть ОЗУ" в области F000...FFFF несложно (ценой в 1 корпус 155-той серии). ПЗУ РФ2 стоящее на плате будет выполнять роль "теневого ПЗУ с 0".

Для выключения этого теневого ПЗУ годится тот же триггер 155 ТМ2, что в базовой схеме формирует сигнал НП (Начальный Пуск), которым это же ПЗУ принудительно включается с адреса 0. Только теперь этот триггер будет формировать не сигнал НП, а сигнал ТП (акроним от слов "Теневое ПЗУ") и должен опрокидываться не по единице на адресе А15, а как-то иначе и переключаться не автоматически, а специальной командой микропроцессора КР580.

Дешевле всего для опрокидывания этого триггера ТП использовать имеющиеся чип-селекты, а именно чип-селект запасного ППА D14, что в базовой схеме стоит на A000 (хотя при доработках его обычно переносят на иное место, чтобы освободить окно A000...BFFF для других целей). Тогда "теневое ПЗУ" 573 РФ2 будет выключаться по команде записи в ППА D14, точнее при задании режима его работы.

В области F000...FFFF ОЗУ (из 565 РУ5) должно быть всегда, т.е и при включённом теневом ПЗУ. Тогда программа инициализации в теневом ПЗУ с 0 копирует код ROM-BIOS в область F000 и передаёт ему управление. Код ROM-BIOS первым делом задаёт режим работы запасного ППА D14 и при этом автоматически отключается и теневое ПЗУ РФ2 и вместо него возникает область стандартного ОЗУ 0...7FFF размером в 32 кб.

Чтобы загрузить ROM-BIOS в ~4 кб и теневое ПЗУ должно иметь размер в 4 кб, т.е должно состоять из двух микросхем 573 РФ2 или одной микросхемы 2732 (у которой корпус тот же DIP-24, но её ёмкость вдвое больше - 4 кб). Можно иметь теневое ПЗУ всего в 2 кб, хранить там только загрузчик, а код ROM-BIOS грузить с его помощью на F000 из ROM-диска. Это позволит при старте выбрать тип ПЗУ, например, ПЗУ совместимое с Микрошей, чтобы использовать часть программ Микроши или версии ПЗУ для разных матриц клавиатуры.

Такая доработка достаточно проста - всего пара ИМС 155-той серии вторым этажом, но даёт массу удобств. Например удобно проверять и отлаживать версии ПЗУ ROM-BIOS (как размером в 2 кб, так и размером в 4 кб). Кроме того в объём 4 кб влезет не только ROM-BIOS, но и резидентная DOS.

Эта резидентная DOS из-за малого объёма вынужденно будет простой, даже примитивной, хотя и достаточной для удобного хранения и запуска программ. Что-то вроде Хамелеон-DOS, которая имеет рекордный размер для дискетных DOS (объём кода всего 2 кб). Благодаря общему ПЗУ в качестве CCP DOS будет использоваться командный процессор монитора (что экономит 0.5 кб кода DOS). Если использовать часть объёма в ПЗУ F800, то для DOS будет доступен объём в 2.5 кб. В качестве привода резидентная DOS может использовать дисковод, винчестер, RAM-диск и флэш-диск 2 Гб работающий через контроллер для microSD (но из-за нехватки места лишь одно из вышеперечисленных устройств).

Применять какие-либо меры по защите области ОЗУ F000...FFFF от записи не нужно, т.к РК-программы туда вообще не пишут. Хотя в случае улёта отлаживаемой программы это ОЗУ может разрушаться и потребуется нажимать конопку СБРОС. Если же в окне F000...FFFF включить статическое ОЗУ 6264 или даже 62256, то можно поиметь 2 или 8 страниц "псевдо ПЗУ" в этом окне ПЗУ.

Естественно, эта идея не нова, т.к её полезность очевидна любому здравомыслящему. Я встречал в Интернете даже не одно, а несколько сообщений о том, что разные люди делали в своём РК86 ОЗУ на месте ПЗУ. Для разработчика ПЗУ или отладки доп.железа это большое удобство.
barsik
barsik
Ветеран

Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия

Вернуться к началу Перейти вниз

РК86 - Радио-86РК: Расширение ПЗУ Empty использование ПЗУ для размещения эмулятора BDOS

Сообщение  barsik Ср Окт 28 2020, 08:04

6
В 80-тые годы программисты любители вынужденно пользовались в качестве инструментария ассемблером (и даже не макро ассемблером), т.к компиляторы ЯВУ требуют наличия DOS, для которой в свою очередь нужен дисковод, которые были тогда ещё недоступны населению (а о том, что дисковод можно заменить самодельным микродрайвом никто не знал).

В то же время повсюду почему-то пишут, что эффективность программирования на ЯВУ выше, чем на ассемблере. Для 16-ти и более разрядных это давно доказано. А вот применительно к РК86, Специалисту и Ирише пока нет подтверждающей это информации. Т.к пока всего двое пытались что-то писать на ЯВУ для РК86 (не говоря уж о других 8-ми разрядках). Я имею ввиду, что Kakos-nonos ещё три года назад странслировал для РК игру на PL/M-80 и я попытался кое-что совсем простенькое написать на PL/M. Но у меня, очевидно из-за слабого уровня освоения PL/M, получалось не только не быстрее, чем на ассемблере, но даже, как минимум, в 5 раз медленнее.

Компиляторы ЯВУ для трансляции под 8-ми разрядки стали доступны с первой половины, но для большинства всё-же ближе к концу 90-тых годов, когда население поимело IBM PC. Для владельцев IBM PC доступны как кросс-компиляторы, так и CP/M-овские прогоняемые в эмуляторах. Есть даже кросс-компиляторы ЯВУ с IDE. Они к сожалению, обычно для Z80 и по сути их практически нет - попадалось несколько сырых полуфабрикатов (в виде курсовых работ студентов) плюс несколько дорогих коммерческих. Если кому-то удалось достать пригодный компилятор ЯВУ с IDE поделитесь с народом.

При программировании программы для 8-ми разрядки без CP/M возникает проблема ввода/вывода (даже для программ не использующих обращения к диску), т.к программа странслированная CP/M-овским компилятором ввод/вывод делает вызовом функций, как минимум, BDOS по CALL 5, а также делает и обращения к подпрограммам CP/M-BIOS (обычно для небуферизованного ввода).

Т.о чтобы программа из под ЯВУ могла работать на РК86 без наличия на нём ОС CP/M требуется, чтобы хотя бы вызов из программы BDOS командой CALL 5 чисто консольных функций работал. Эта задача решается перехватом обращений к CP/M BDOS по CALL 5. Для этого программа стразу после старта инициализирует вход по адресу 5 размещая по этому адресу команду JMP на эмулятор BDOS. Эмулятор BDOS должен эмулировать, как минимум, все недисковые функции CP/M.

Впервые идею эмулятора BDOS CP/M придумал С.Н.Попов (он же разработчик РК86) опубликовав исходник в ж.МПСС (06.1987, стр.18), а коды такого эмулятора консольных функций CP/M уже специально для РК он же опубликовал в 1988 в ж.Радио. Эмулятор консольных функций позволяет прогон на РК86 недисковых CP/M-программ и в частности программ странслированных компиляторами ЯВУ.

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

Эмулятор всех текстовых функций BDOS и BIOS может располагаться в вершине базового ОЗУ РК86 или быть загруженным в доп.ОЗУ выше $8000. Но удобнее всего, прошить его раз и навсегда в резидентное ПЗУ, которое удобнее всего иметь в окне E000...FFFF. Это м.быть страничное ПЗУ на 27256 (см.схему выше) или второе ПЗУ РФ2 вставленное в область F000...F7FF. Код эмулятора BDOS составляет всего 256 байт и с запасом уместится в 2 Кб.

Если разместить (прошив в УФ-ПЗУ) эмулятор BDOS и BIOS с адреса E000, то по вызову п/п-ммы E000+3 будет осущестляться инициализация эмулятора CP/M, т.е система будет включаться в режим эмуляции усечённой CP/M (только с консольными вызовами). Кстати, при попытке вызвать любую дисковую процедуру эмулятор делает JMP F800.

С таким ПЗУ программе странслированной компилятором ЯВУ при её старте достаточно выполнить инициализацию CP/M сделав CALL E003 (E000 адрес использовать нельзя, т.к там д.быть JMP F800 переход на точку входа в ROM-BIOS, что надо для правильной работы начального пуска). А следующий вход E006 это будет вход в BDOS. Но на адресе 5 будет стоять не CALL E006, а JMP на 75F0, а уже на адресе 75F0 д.быть JMP E006. Так нужно потому, что по аргументу JMP-а на адресе 5 CP/M программы и особенно странслированные ЯВУ узнают RAMTOP, т.к в реальной CP/M это вершина BDOS. И программы соответственно ставят стек на эту вершину и используют всё ОЗУ ниже этого адреса под свои данные. Таким образом РК-программа странслированная компилятором ЯВУ увидит на адресе 0006 число 75F0 и подумает, что она запущена в CP/M с вершиной TPA на этом адресе (т.е TPA имеет размер 75F0-100= 74F0, что соответствует сравнительно большой величине в ~29 Кб.

Т.к программе на ЯВУ требуется, как минимум, 1 кб для данных (точнее динамических переменных и стека), то получается, что на ЯВУ для базового РК можно компилировать программу до тех пор пока она не превысит объёма 28 Кб. Это достаточно большая величина ОЗУ. Если считать что применяемый Вами компилятор ЯВУ генерит код, который всего в ~5 раз менее плотный, чем код программы написанной человеком на ассемблере, то получается, что на ЯВУ можно писать игры уровня соответствующего ассемблерным программам размером в 4-5 Кб. Значительная часть РК-игр имеет объём меньше 5 Кб. Так например, XONIX (ксоникс) имеет размер менее 2 Кб, а игровой аспект у него самый высокий из всех имеющихся РК-игр. А вот эр-кашные пэкманы имеют огромный размер, т.к содержат в своём коде ёмкие лабиринты. Но и объём лабиринтов можно сократить, если кодировать их побитово. А если и тогда не хватит ОЗУ, то придётся думать о расширении его.

Кстати, в 80-тые годы некоторые люди, которые хорошо разбирались в разработке схем на TTL-микросхемах, когда им не хватало ОЗУ в 32 Кб, дорабатывали свой РК так, чтобы поиметь дополнительное ОЗУ в области 8800...BFFF (что легко делается, если основное ОЗУ выполнено на 565 РУ5, тогда ОЗУ в этом окне просто "открывается" путём припайки двух недорогих TTL-микросхем 155-й серии, если же применены РУ3, то доп.ОЗУ придётся делать на статике, т.к припаивать 565 РУ3 аж в три этажа не громоздко). Такая доработка добавляет ОЗУ совместимо, но оющее ОЗУ 32+14 Кб становится фрагментированным.

Эту победительную идею не удастся использовать для размещения в ОЗУ выше $8000 кода из под ЯВУ, т.к для ЯВУ требуется сплошное непрерывное ОЗУ (ЯВУ не умеет выдавать фрагментарный код). Иное дело ассемблерные вставки. Программы странслированные компилятором ЯВУ без проблем способны вызывать ассемблерные подпрограммы располагаемые выше $8000. Правда загружать такую игру менее удобно, чем нефрагментированную (надо грузить монитором две части кода, - кусок в основное ОЗУ и кусок в дополнительное). Что поделать - порты стоящие посередине адресного пространства это не лучший подарок от разработчиков РК.

Таким образом при разработке РК-игр используя компилятор ЯВУ из CP/M нужен эмулятор BDOS и BIOS и удобнее всего его иметь в ПЗУ, что становится сильным доводом в пользу расширения ПЗУ до 8 Кб (или хотя бы до 4 Кб). Отладку программ с использованием эмулятора BDOS и BIOS в ПЗУ E000...FFFF удобно делать в эмуляторе. И как раз для эмулятора EMU сохранился конфиг обеспечивающий как расширенное ПЗУ 8 Кб на E000, так и доп.ОЗУ в области 8800...BFFF (кстати, там даже фонт 8*8).

Т.к эмулятор BDOS и BIOS маленький (а реальные BDOS и BIOS займут более 6 Кб, в одной странице ПЗУ уместится только BIOS с загрузчиком, а BDOS придётся размещать в ОЗУ или задействовать и вторую страницу ПЗУ 27256), то в оставшееся место как раз умещается бездисковый отладчик адаптированный для РК из CP/M.

Вот какую архитектуру можно считать не плохой (но не самой оптимальной). Здесь добавляется ПЗУ E000...FFFF, открывается ОЗУ под портами. Порт ППА D14 переносится куда-то на добавленный чип-селект. Область С000...DFFF делится дешифратором на 8 участков, что даёт 7 дополнительных чип-селектов (1 из 8 остаётся для ВГ75). Здесь нарисовано, что область делится на 4 просто для удобства рисования (как видите, если делить на 4, то не остаётся чип селекта для музыкалки). В такой архитектуре, чтобы поиметь сплошные 48К нужно заблокировать и отключить только один чип-селект. Это делается добавленным в систему регистром управления с помощью которого можно включать прерывания, включать режим 48К и т.п. Построение дешифратора на область 8000 реализующего представленную ниже карту памяти существенно упрощает применение 155РЕ3 (можно и соответствующую GAL), которая имеет 8 выходов и 5 адресных входов, чего хватает для дешифрации областей памяти с шагом 2 кб (но можно и с шагом 1 Кб, т.к в данном случае /А15 можно подать на /CS).


РК86 - Радио-86РК: Расширение ПЗУ MAP_dop_RAM_14K.1603872976
barsik
barsik
Ветеран

Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия

Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения