Последние темы
» Вити больше нет!автор 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
Самые активные пользователи за месяц
Нет пользователей |
Поиск
ROM-BIOS для Специалиста на Z80
Страница 1 из 1 • Поделиться
ROM-BIOS для Специалиста на Z80
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 МГЦ, чего вполне достаточно для работы программного КНГМД.
Чтобы поиметь строчные латинские буквы, что в 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- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия, СПб
.
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-диск и др.
В ОРИОНЕ с 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:
@NAME = "Специалист. ОЗУ 512 кб, ПЗУ 32 кб, КНГМД на ВГ93"
# Тактовая частота
@FREQUENCY = 3200000
# Основное ПЗУ и адреса перехвата работы с МГ
@ROM_0 = "specbars/rom0.bin"
@ROM_1 = "specbars/rom1.bin"
@ROM_2 = "specbars/rom2.bin"
@ROM_3 = "specbars/rom3.bin"
@ROM_4 = "specbars/rom4.bin"
@ROM_5 = "specbars/rom5.bin"
@ROM_6 = "specbars/rom6.bin"
@ROM_7 = "specbars/rom7.bin"
@C806_ADDR = 0xC377
@C80C_ADDR = 0xC3D0
@C803_ADDR = 0xC337
# Файл настроек
@OPT_FILE = "specbars/spec.opt"
# ROM-диск
@ROM_DISK = "specbars/romdisk.bin"
######## Window ########
EmuWindow window
window.caption = @NAME
# Default window size for window.windowStyle = fixed (default = 800, 600)
#window.defaultWindowSize = 768, 512
window.defaultWindowSize = 800, 600
# Window style: autosize, sizable, fixed, fullscreen (default = autosise)
window.windowStyle = fixed
#window.windowStyle = sizable
# Window scaling option: 1x, 2x, 3x, fit, bestFit, fitKeepAR (default = bestFit)
window.frameScale = 2x
#window.frameScale = fitKeepAR
#window.frameScale = bestFit
# Window fields mixing: none, mix, interlace (default = none)
#window.fieldsMixing = mix
# Image antialiasing (default = no)
window.antialiasing = no
# Aspect correction (default = no)
window.aspectCorrection = no
#window.aspectCorrection = yes
######## Platform ########
Rom rom0 = @ROM_0, 0x1000
Rom rom1 = @ROM_1, 0x1000
Rom rom2 = @ROM_2, 0x1000
Rom rom3 = @ROM_3, 0x1000
Rom rom4 = @ROM_4, 0x1000
Rom rom5 = @ROM_5, 0x1000
Rom rom6 = @ROM_6, 0x1000
Rom rom7 = @ROM_7, 0x1000
AddrSpaceMapper rom = 8
rom.page = 0, &rom0
rom.page = 1, &rom1
rom.page = 2, &rom2
rom.page = 3, &rom3
rom.page = 4, &rom4
rom.page = 5, &rom5
rom.page = 6, &rom6
rom.page = 7, &rom7
Ram ram1 = 0xF800
Ram ram2 = 0xF800
Ram ram3 = 0xF800
Ram ram4 = 0xF800
Ram ram5 = 0xF800
Ram ram6 = 0xF800
Ram ram7 = 0xF800
Ram ram8 = 0xF800
Ram ram9 = 0xF800
Ram ram10 = 0xF800
Ram ram11 = 0xF800
Ram ram12 = 0xF800
Ram ram13 = 0xF800
Ram ram14 = 0xF800
Ram ram15 = 0xF800
Ram lowerRam0 = 0x9000
SpecVideoRam videoRam = 0x3000
Ram upperRam0 = 0x2800
AddrSpace page0
page0.range = &lowerRam0, 0x0000, 0x8FFF
page0.range = &videoRam, 0x9000, 0xBFFF
page0.range = &rom, 0xC000, 0xCFFF
page0.range = &upperRam0, 0xD000, 0xF7FF
AddrSpaceMapper pages = 16
pages.page = 0, &page0
pages.page = 1, &ram1
pages.page = 2, &ram2
pages.page = 3, &ram3
pages.page = 4, &ram4
pages.page = 5, &ram5
pages.page = 6, &ram6
pages.page = 7, &ram7
pages.page = 8, &ram8
pages.page = 9, &ram9
pages.page = 10, &ram10
pages.page = 11, &ram11
pages.page = 12, &ram12
pages.page = 13, &ram13
pages.page = 14, &ram14
pages.page = 15, &ram15
CpuZ80 cpu
PeriodicInt8080 periodicInt = &cpu,7,50
Translator intTranslator = &periodicInt
intTranslator.writeRShift = 7
intTranslator.writeAndMask = 0x1
# RAM pages
PageSelector pageSelector
pageSelector.mapper = &pages
Translator pageSelectorTranslator = &pageSelector
pageSelectorTranslator.writeAndMask = 0x0F
pageSelectorTranslator.readOrMask = 0xFF
# ROM pages
PageSelector romPageSelector
romPageSelector.mapper = &rom
Translator romSelectorTranslator = &romPageSelector
romSelectorTranslator.writeAndMask = 0x7
Splitter f900Splitter
f900Splitter.device = &pageSelectorTranslator
f900Splitter.device = &intTranslator
Fdc1793 orionFdc
OrionFddControlRegister orionFddReg
orionFddReg.fdc = &orionFdc
orionFddReg.type = standard
OrionFddQueryRegister orionFddQReg
orionFddQReg.fdc = &orionFdc
AddrSpace orionFddSpace
orionFddSpace.range = &orionFdc, 0x00, 0x03
orionFddSpace.range = &orionFddQReg, 0x04, 0x04
orionFddSpace.range = &orionFddReg, 0x20, 0x20
AddrSpace addrSpace
addrSpace.range = &pages, 0x0000, 0xF7FF
addrSpace.readRange = &rom, 0xF800, 0xF8FF
addrSpace.writeRange = &romSelectorTranslator, 0xF800, 0xF8FF
addrSpace.range = &f900Splitter, 0xF900, 0xF9FF
addrSpace.range = &fdcAddrSpace, 0xFB00, 0xFBFF
addrSpace.range = &orionFddSpace, 0xFC00, 0xFCFF
addrSpace.range = &romDiskPpi, 0xFE00, 0xFEFF
addrSpace.range = &mainPpi, 0xFF00, 0xFFFF
SpecRenderer crtRenderer
crtRenderer.screenMemory = &videoRam
crtRenderer.colorMode = 8color
SpecCore core
core.window = &window
core.crtRenderer = &crtRenderer
cpu.frequency = @FREQUENCY
cpu.startAddr = 0xC000
cpu.addrSpace = &addrSpace
cpu.core = &core
RkKeybLayout kbdLayout
SpecKeyboard keyboard
#keyboard.matrix = "original"
SpecPpi8255Circuit ppiCircuit
ppiCircuit.specKeyboard = &keyboard
ppiCircuit.videoRam = &videoRam
mainPpi.circuit = &ppiCircuit
RkRomDisk romDisk = @ROM_DISK
romDiskPpi.circuit = &romDisk
######## File I/O ########
SpecFileLoader loader
loader.addrSpace = &addrSpace
loader.filter = "Файлы Специалиста (*.rks)|*.rks;*.RKS|Все файлы (*.*)|*"
TapeRedirector tapeInFile
tapeInFile.mode = "r"
tapeInFile.filter = "Файлы Специалиста (*.rks)|*.rks;*.RKS|Файлы RK-совместимых ПК (*.rk?)|*.rk;*.rk?;*.RK;*.RK?|Все файлы (*.*)|*"
TapeRedirector tapeOutFile
tapeOutFile.mode = "w"
tapeOutFile.filter = "Файлы Специалиста (*.rks)|*.rks|Файлы RK-совместимых ПК (*.rk)|*.rk|Все файлы (*.*)|*"
FdImage diskA = 80,2,5,1024
diskA.label = A
diskA.filter = "Образы дисков Ориона (*.odi)|*.odi;*.ODI|Все файлы (*.*)|*"
diskA.fileName = "specbars/PROGS/1.ODI"
FdImage diskB = 80,2,5,1024
diskB.label = B
diskB.filter = "Образы дисков Ориона (*.odi)|*.odi;*.ODI|Все файлы (*.*)|*"
diskB.fileName = "specbars/PROGS/2.ODI"
orionFdc.fdImage = 0, &diskA
orionFdc.fdImage = 1, &diskB
RkTapeOutHook tapeOutHook = @C80C_ADDR
tapeOutHook.outReg = A
tapeOutHook.tapeRedirector = &tapeOutFile
cpu.addHook = &tapeOutHook
RkTapeInHook tapeInHook = @C806_ADDR
tapeInHook.tapeRedirector = &tapeInFile
#tapeInHook.enabled = no
cpu.addHook = &tapeInHook
CloseFileHook closeFileHook = @C803_ADDR
closeFileHook.addTapeRedirector = &tapeInFile
closeFileHook.addTapeRedirector = &tapeOutFile
cpu.addHook = &closeFileHook
EmuObjectGroup tapeGrp
tapeGrp.addItem = &tapeOutHook
tapeGrp.addItem = &tapeInHook
tapeGrp.addItem = &closeFileHook
tapeGrp.enabled = yes
######## Include Saved Options ########
include @OPT_FILE
######## Configuration Window ########
ConfigTab configTab = @NAME
configTab.optFileName = @OPT_FILE
#window.frameScale
ConfigRadioSelector scaleSelector = &window, frameScale, "Масштабирование"
scaleSelector.addItem = 1x, "1x"
scaleSelector.addItem = 2x, "2x"
scaleSelector.addItem = 3x, "3x"
scaleSelector.addItem = fit, "Растянуть во все окно"
scaleSelector.addItem = fitKeepAR, "Растянуть с сохранением пропорций"
scaleSelector.addItem = bestFit, "Растянуть с целым коэффициентом"
configTab.addControl = 1, &scaleSelector
#window.windowStyle
ConfigRadioSelector styleSelector = &window, windowStyle, "Размер окна"
styleSelector.addItem = autosize, "Автоматически подстраивать"
styleSelector.addItem = sizable, "Изменяемый пользователем"
styleSelector.addItem = fixed, "Фиксированный"
configTab.addControl = 1, &styleSelector
#window.fieldsMixing
#ConfigRadioSelector mixSelector = &window, fieldsMixing, "Смешивание полукадров"
#mixSelector.addItem = none, "Выкл."
#mixSelector.addItem = mix, "Вкл."
#configTab.addControl = 2, &mixSelector
#window.antialiasing
ConfigRadioSelector aaSelector = &window, antialiasing, "Сглаживание"
aaSelector.addItem = no, "Выкл."
aaSelector.addItem = yes, "Вкл."
configTab.addControl = 1, &aaSelector
#window.aspectCorrection
ConfigRadioSelector arSelector = &window, aspectCorrection, "Учитывать Aspect Ratio"
arSelector.addItem = no, "Нет (1:1)"
arSelector.addItem = yes, "Оригинальный AR"
configTab.addControl = 2, &arSelector
#crtRenderer.colorMode
ConfigRadioSelector colorSelector = &crtRenderer, colorMode, "Цветовой режим"
colorSelector.addItem = mono, "Монохромный"
colorSelector.addItem = 4color, "4-цветный"
colorSelector.addItem = 8color, "8-цветный"
configTab.addControl = 2, &colorSelector
#kbdLayout.layout
ConfigRadioSelector laSelector = &kbdLayout, layout, "Раскладка клавиатуры"
laSelector.addItem = qwerty, "Qwerty"
laSelector.addItem = jcuken, "Йцукен"
configTab.addControl = 3, &laSelector
ConfigRadioSelector tapeSelector = &tapeGrp, enabled, "Перехват магнитофона"
tapeSelector.addItem = yes, "Вкл."
tapeSelector.addItem = no, "Выкл."
configTab.addControl = 3, &tapeSelector
barsik- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия, СПб
Похожие темы
» Литература по ATM Turbo
» ROM-BIOS ИРИШИ
» ПЗУ F800 для РК86
» Программирование для CP/M Специалиста
» Low TPA CP/M для Специалиста
» ROM-BIOS ИРИШИ
» ПЗУ F800 для РК86
» Программирование для CP/M Специалиста
» Low TPA CP/M для Специалиста
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения