RUЭВМ
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.
Июль 2024
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
293031    

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

Последние темы
» Вити больше нет!
автор 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 Расширенный поиск


ROM-BIOS для Специалиста на Z80

Перейти вниз

ROM-BIOS для Специалиста на Z80 Empty ROM-BIOS для Специалиста на Z80

Сообщение  barsik Вт Дек 10 2019, 13:43

1
В CP/M нужно иметь кодировку ASCII (т.к иностранные программы используют мелкие латинские буквы), а в Специалисте (если не использовать отдельный драйвер) резидентный в ROM-BIOS драйвер выводит буквы в кодировке КОИ7. В ПЗУ Специалиста предусмотрена замена фонтов (хотя и гораздо хуже, чем в ИРИШЕ, где есть адрес фонта для 8-ми участков фонта, потому не требуется менять весь фонт, можно заменить лишь изображения группы символов). В ПЗУ Специалиста, якобы, ради того, чтобы с'экономить байты и скорость (хотя и экономии нет), адрес фонта хранится в сдвинутом виде, из-за чего старший (!) байт адреса фонта не может быть любым.

Чтобы поиметь строчные латинские буквы, что в ASCII занимают коды $60...$7F, нет смысла заменять весь фонт Специалиста, достаточно где-то в памяти разместить только изображения мелких латинских символов и оперативно переставлять адрес фонта, если на вывод подан символ с кодом в интервале $60...$7F. Таким образом достаточно дополнить процедуру CONOUT несколькими командами ассемблера и где-то в памяти разместить 256 байтов дополнительного фонта. Если речь об ОЗУ, то удобно загружать этот доп.фонт на адрес $F700.

С другой стороны тратить на это ОЗУ жалко, если можно найти место в ПЗУ. При замене команд КР580 на Z80 обычно выигрывается до 4-5% объёма за счёт более удобных и коротких команд. А в зверковско-орловском ROM-BIOS (МК 08.1988) даже при КР580 выигрывается 20% объёма за счёт более грамотного программирования, что позволяет существенно улучшить и дополнить функционал при 100% совместимости.

Хотя ленинградский вариант ПЗУ Специалиста для КР580 уже оптимизирован по максимуму, но я прикинул, что, если Z80 команды, как обычно, дадут выигрыш в объёме 4...5%, то освободится до (4096-768-153)*0.05=  158 ячеек ПЗУ (768 это объём фонта на C500, 153 это объём таблицы кодов клавиш и блок констант, которые нельзя оптимизировать, т.к это не программный код). В версии ПЗУ 3.5, чтобы добавить входы C836/39 для доступа в доп.банки ОЗУ, я уже ранее освободил 50 ячеек выкинув процедуры межмашинного обмена в параллельном интерфейсе (это не фатально, - если уж что-то надо переслать между двумя 8-ми разрядками, то можно воспользоваться обменом через магнитофонные вход/выход и стандартные мониторные команды обмена с МГ-лентой, или просто загрузить свой нужный драйвер обмена).

Эти соображения давали шанс уместить доп.фонт в ПЗУ. Если оптимизацией кода, используя возможности Z80, выиграть недостающие ~80 ячеек ПЗУ, то удастся выиграть требуемые 256 байт и уместить мелкий латинский фонт в ПЗУ. Ну, а если уж чуть не хватит, то можно пожертвовать какой-нибудь редко используемой директивой монитора или подсократить тексты. Но это уж крайний вариант, хотелось бы не курочить, а сохранить всё. Потому что ленинградский монитор Специалиста это шедевр (продукт доработок в течение ряда лет), тогда как в ПЗУ Орлова/Зверкова - код от неопытного программиста.

После всех замен под Z80-команды плюс остаток в 35 байт от удаления директив параллельного обмена, выигрыш в объёме кода составил 185 байтов, точно как исходно и предполагалось. Осталось как-то выиграть ещё около 70 байтов. Пришлось биться за каждый байт, вручную переставляя фрагменты кода так, чтобы образовалось как можно больше JR-переходов и применяя все известные мне другие возможности оптимизации.

Причём, сложности добавляло то, что надо уместить фонт в 256 байт на кратном числу $100 адресе (причём не на каждом адресе фонт работает) и ещё нельзя сдвинуть более 20 внутренних входов внутри ПЗУ (это не считая входы C8xx). И за 12 часов плотного электротраха мне удалось не только уместить доп.фонт в 256 байт, но даже выиграть ещё 19 свободных ячеек. И даже extra-регистры Z80 не задействовал (хотя это дало бы ещё ~20 байтов). Причём ни одного полезного байта кода и ни одной буквы текстов не было заплющено и адрес ни одной нужной внутренней подпрограммы не был сдвинут! Функционал сохранён - все 100%. Даже уже неактуальные директивы вызова редактора и ассемблера в ПЗУ пользователя (они на E000 и E800) оставлены (хотя теперь это ОЗУ, но кто мешает туда загрузить любой код, это полезно для ассемблирования ретро-исходников в формате ассемблера МИКРОН).

Некрасиво хвастать, но мало кто сможет ещё ужать код (хотя я знаю как можно выиграть ещё два десятка байтов, но уже не надо, да и выигрыш каждого байта вызывает перестановку десятков фрагментов, отнимая ~десять минут труда). А переделав и алгоритм работы подпрограмм используя свойства Z80 можно выиграть ещё 50 байт или более.

Вообще-то в ПЗУ Специалиста при наличии дисковода или ROM-диска можно без ущерба выкинуть 2/3 кода, оставив только процедуры вывода на экран и опроса клавиш. Сейчас не требуется "шариться" по ячейкам ОЗУ, грузить с ленты (или писать) в МГ-форматах РК, MSX SP-580, ZX-Spectrum и ОРИОНА и компоновать блоки на ленте (с адресами ввода и без). Если программы запускаются с дисковода (или другого дискового привода) монитор для работы с памятью и МГ-лентой вообще не нужен. А чтобы шарится по ячейкам ОЗУ предназначены отладчики, это не дело для ОС компьютера. Если освободить из 4 кб ROM-BIOS половину, то в ПЗУ (C000...DFFF) можно кроме BDOS уместить и CCP (его размер как раз 2 кб).

Вот здесь лежит исходник ROM-BIOS Специалиста для Z80. В нём по адресам CA00...CAFF (уж так, посередине кода ПЗУ приходится размещать фонт, чтобы срабатывал код А.Волкова) вставлен мелкий латинский фонт. В архиве есть и невидимые транслятор ассемблера и линковщик - чтобы получить код ПЗУ достаточно запустить BAT-файл в Windows XP (или под DosBox в более свежей Windows).

Кстати, в Специалисте не использовать идею от ОРИОНА, т.е сжать фонт в ПЗУ распаковывая его в ОЗУ. Т.к с фонтом КОИ-7 так делать не стОит (программы считают, что фонт КОИ-7 именно на $C500), а сжимать 256 байт дополнительного фонта не только бесполезно (выигрыша из-за большого объёма подпрограммы распаковки вообще не будет), но главное, задача как раз освободить в ОЗУ эти 256 байт.

Вообще и при открытом целиком верхнем ОЗУ в 10 кб и при BDOS в ПЗУ на D000...DFFF, когда верхнего ОЗУ всего 6 кб, в верхнем ОЗУ/ПЗУ места с запасом хватает для CCP, BDOS, BIOS, а также - дисковым буферам и служебным ячейкам CP/M. Даже свободно более 1 кб. Но при использовании винчестера или другого большого накопителя с кучей дисков по 8 Мб (для каждого нужна большая AllocTable), а также под рабочие ячейки драйверов и программ, этого резервного килобайта даже не хватит.

Далее возможно займусь оптимизацией под Z80 кода BDOS CP/M. Он имеет размер 3584 байта и если замена на Z80, как обычно, даст выигрыш в 5%, то это с'экономит аж 180 байтов. Не сомневаюсь, что оптимизацией смогу уплющить код BDOS и на 200 байтов. В менее чем двух килобайтовом коде CCP я ещё в 90-тые годы выиграл ~100 байтов при Z80 и ~40 при КР580. Добавив за счёт этого в CCP команды ECHO, CLS и ASSIGN. ASSIGN был нужен для CP/M, где эл.диск не привод A:, т.к у CP/M есть дурацкая привычка писать всякую гадость именно на диск A:, потому именно диск A: д.быть электронным.

Выигрыш кучи байтов позволит переписать неудобную функцию BDOS для ввода строки, введя не только полноценное редактирование, но и память команд (по типу Dosedit MSDOS, когда по нажатию клавиши курсор вверх выдаются ранее введённые команды, чтобы их снова не набирать). В принципе ужимать код BDOS полезно потому, что тогда в эти 4 кб ПЗУ отведённые для BDOS (D000...DFFF) уместится и дискетный холодный загрузчик, что позволит не иметь ROM-диска для его хранения.

UPD. Сейчас, обдумав разные варианты, я пришёл к выводу, что наименее трудоёмко расширять ОЗУ в Специалисте получается на статическом ОЗУ 62256 (т.к по сути это просто установка микросхемы 62256 в имеющуюся панельку). Это не столь ценно при КР580 (лишь выгодно, если нужно вводить цвет), но при Z80 даёт много преимуществ. Хотя при работе CP/M в ОЗУ сокращение объёма кода CP/M уже не столь важно, BDOS я (как возникнет желание это сделать) всё-равно уплющу с целью экономии (т.к и при работе его из ОЗУ жалко впустую тратить сотни байтов).

Что касается КНГМД, то тут сейчас наиболее доступны, просты и имеют смысл 2 варианта. Первый это тупой лобовой вариант с понижением скорости потока данных из дисковода. Для чего достаточно заменить кварц в КНГМД от ОРИОНА с 8 МГЦ до 7 МГЦ и формат дискеты не 5 секторов на трек, а только 4 сектора на трек. Это сокращает ёмкость дискеты с 800 кб до 630 кб, зато заменить кварц проще, чем добавлять в схему триггер ТМ2, чтобы заменить кварц в самом Специалисте с 8 МГЦ на 10 МГЦ, что даёт ускорение на 25%.

А второй вариант это, естественно, схема Турбо-142% при процессоре Z80. Это даёт эффективный такт в ~2.8 МГЦ, чего вполне достаточно для работы программного КНГМД.
barsik
barsik
Ветеран

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

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

ROM-BIOS для Специалиста на Z80 Empty .

Сообщение  barsik Пн Дек 23 2019, 15:01

2
Обновил выкладку по ссылке, т.к в выложенном выше ПЗУ для Специалиста на Z80 нашёл одну фатальную ошибку: при переводе кода на Z80 в одном месте из трёх не заменил команду OUT (0F9H),A на LD (0F900H),A, потому доступ в другие банки не работал в реале (только в эмуляторе, где эти команды равноценны). В реале при КР580 команда OUT срабатывает, а при Z80 - нет.

В ОРИОНЕ с Z80 можно управлять портами и по OUT, т.к там в программах от рождения есть обращения в порты по OUT, потому ставить Z80 в ОРИОН можно только обеспечив равнозначный доступ в порты по LD и OUT. А в программах Специалиста вроде бы никто не лазил в порт клавиатуры командами OUT, т.к при процессоре Z80 все игры Специалиста, что были у меня в 1990 году, работали. А портов переключающих банки или меняющих режим в базовом Специалисте нет. Потому в Специалист процессор Z80 ставится несколько проще, чем в ОРИОН.

Это ПЗУ я ещё изменю сто раз. Пока это чисто стандартное ПЗУ (и стандартного размера в 4 кб). Но работа с МГ-лентой в разных форматах уже не нужна и фонт мелких латинских букв мне подвернулся какой-то неудачный (это от Специалиста), надо его отредактировать. Удалять ничего не придётся, т.к страничного ПЗУ килограмм, но в 0-вой странице ПЗУ должен стоять именно ROM-BIOS, а не монитор для работы с ОЗУ и МГ-лентой.

Естественно, я странслирую и нестраничную версию ПЗУ в 4 кб с поддержкой ROM-диска (из ROM-диска будет грузиться DOS, в нём будут храниться резидентные программы и графический интерфейс) и для этого волей-неволей придётся выкинуть из ПЗУ C000...CFFF многое ставшее уже ненужным.

При попытке использовать прерывания для прогона программ от РК86 столкнулся с тем, что в виду наличия некорректных РК-игр, что управляют выводом рабочими ячейками надо обеспечить чтобы вызовы F8xx работали точно также как в РК86. А доработка с диодами по включении в окне F800...F8FF участа специалистовского ПЗУ C800...C8FF обеспечивает только JMP-ы из F800 в аналогичные процедуры ПЗУ Специалиста.

Чтобы загрузить в ОЗУ Специалиста ПЗУ от РК86 надо обеспечить в области F800...F8FF не ПЗУ Специалиста, а ОЗУ или ПЗУ с JMP-ами в ОЗУ. Тогда загрузив в ОЗУ эквивалент РК-шного ПЗУ по вызовам F8xx будет прогоняться ПЗУ РК86 (странслированное на другой рабочий адрес: программам до лампочки где расположен исполнительный код). Но ОЗУ в области F800...F8FF не сделать, т.к по записи в этой области находится порт F800 (т.е так сделано в том конфиге эмулятора, что я использую). Если сделать здесь ОЗУ, то порт F800 надо куда-то переносить (можно только на FA00), а изменить конфиг для этого очень сложно и не каждому под силу.

Но т.к ПЗУ C000 имеет 8 страниц (переключаемых портом F800), то легко выкрутиться и без ОЗУ на F800, тем более,что желательно, чтобы РК-игры работали при всего 36 кб ОЗУ, т.е и на Специалистах с РУ3/РУ6. Тогда в одну из страниц ПЗУ прошивается код в котором по адресам C803, C806, C809... стоят JMP-ы в область ОЗУ (т.е ниже 9000). Эти входы с помощью диодов читаемые по F8xx обеспечивают при их вызове из программ РК переход в оригинальный код ПЗУ РК86 загруженный в ОЗУ или даже прошитый в ту же страницу ПЗУ Специалиста. Такой трюк позволяет прогонять часть некорректных РК-игр без переделок. Дорабатывать, причём несложно, нужно только РК-игры, которые напрямую лезут в матрицу клавиш через ППА на 8000. Таких игр мало.

Вот конфиг эмулятора EMU80, дающий КНГМД на ВГ93 от ОРИОНА, 8 страниц ПЗУ (в данном случае окно ПЗУ не 8, а 4К, чтобы оставить 10К верхнего ОЗУ) управляемые портом F800, 16 страниц ОЗУ по 62 кб управляемые портом F900, режим FULL-RAM в банке 0 (совсем отключается ПЗУ битом D7 порта F800) и прерывания 50 ГЦ, включаемые битом D7 порта F900. В адресах F800...F8FF читается фрагмент C800...C8FF текущей страницы ПЗУ. Чтобы пошли прерывания 50 Гц достаточно записать в порт F900 число с битом D7=1 (это разрешает подачу импульсов на вход INT Z80), после чего ещё надо выполнить команду EI.

Если надо увеличить размер страницы ПЗУ до 8 кб, то это делается за 15 секунд (надо изменить все числа 0x1000 на 0x2000, 0x2800 на 0x1800 и соответственно поменять AddressRange окна ПЗУ и верхнего ОЗУ). Если же нужен процессор КР580, то надо заменить строчку с типом процессора и файл с кодом ПЗУ на соответствующий файл для КР580.

Что касается соответствующего конфига для эмулятора EMU, то 3 года назад я разобрался как составить конфиг для РК86 с ОЗУ 2 мб, в разных вариантах. Но потом я всё забыл, а  все примеры (при гибели винта) погибли и снова разобраться в модернизации конфига для EMU не так уж и просто (а главное, лениво, т.к пока для эмуляции Специалиста и РК и эмулятора EMU80 хватает). Впоследствии я, возможно, почитаю тему о эмуляторе EMU на каком-то форуме и узнаю подробности как организовывать доп страницы ОЗУ/ПЗУ в окнах и попробую поэкспериментировать, но не уверен, что удастся так как нужно поиметь страницы ОЗУ и ПЗУ, прерывания, ROM-диск и др.

конфиг для EMU80:
barsik
barsik
Ветеран

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

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

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

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

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