nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 03 Apr 2020 23:05



Reply to topic  [ 91 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7  Next
Emu80 v.4 
Author Message
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
Post 
barsik wrote:
EMU80 теперь поддерживает КНГМД на ВГ93?
Напрашивается вывод, что никто из регулярно читающих форум не использует EMU80 для эмуляции ОРИОНА с дисководом.

EMU80 поддерживает дисковод для ОРИОНА и поддерживает уже несколько лет. Только об этом нигде не написано и ODI-образов в дистрибутиве нет. В версиях с QT-библиотекой это ясно из интерфейса, но в старых версих об этом не узнать. Я узнал изучая конфиг. Раньше не использовал EMU80 для эмуляции ОРИОНА (своего эмулятора хватает), использовал его только для Специалиста и РК86, где, кстати, никаких проблем не было.

С эмуляцией ОРИОНА познакомился только сейчас, причём не могу судить о новых версиях. Новых релизов не скачиваю потому, что у EMU80, как только в марте 2018 разработчик перешёл на QT библиотеку не только объём кода эмулятора увеличился в 3-4 раза (и во столько же тормознулась работа), но у меня в Win XP EMU80 вообще перестал работать. Точнее можно заставить работать, если вручную скачать десяток отсутствующих DLL библиотек QT из Интернета (я это делал, чтобы посмотреть, интерфейс стал удобнее).

Форматёры дискет, как и в других эмуляторах, не работают (хотя есть достаточно много DOS для ОРИОНА, в которых формат дискеты не 1 кб, а 512 байт). Например, если бы был образ диска MSDOS 720К и эмулятор поддерживал бы формат с секторами в 512 байт, то MS-Commander С.Коровкина не зависал бы при попытке считать дискету.

Я знаю как это исправить, надо ввести в реальные форматёры дискет заглушки (сделав бутафорию, CALL PAUSE вместо CALL TRK_FRM), а цель использования такого форматёра для эмулятора в том, что он меняет блок служебной информации в начале образа диска. Это позволит получать образы любых дискет, записав в начало образа нужную служ.информацию (что и делает реальный форматёр).

Но доводить размер образа до нужного придётся вручную (например для HD-дискет 1.2 мб, 1.4 мб или дискет с иным числом секторов или для 83-х вместо 80 физических треков). Если просто изменить служ.информацию, например, при форматировании образа диска 800К задать 83 физ.сектора, то SteinBlume будет ругаться, что не верен размер образа. Тогда надо вручную увеличить размер файла с 800К до 830К, заполнив кодами Е5. Проблема как из программы узнать, что она запущена в эмуляторе.

Пока создать образ дискеты у которой иное число треков, каталог на иной дорожке и т.п. можно только вручную. Такую программку при желании легко нацарапать на ассемблере 8086 или TP для MSDOS. В EMU80 версий до 03.2018 поддержка НГМД на ВГ93 для ОРИОНА ещё сырая. Некоторые работающие в реале инсталляторы не работают. В сути пока не разобрался, возможно проблема со сменой дискет. Но в принципе, осторожно в сочетании со SteinBlume и только с одним форматом дискет пользоваться можно. Может быть дело в загрузчиках или в использовании другого кода DOS с другим DPB (и соответственно другими байтами служ.параметров в BOOT-секторе дискеты).

ORDOS 2.40 не работает, если не убрать из ROM-диска файл VC$. Есть программы из 1991-92, что нуждаются в ORDOS 2.40, например, MOZART$ и просто так подставить код старой ORDOS в начало ROM-диска не получится.

 
.
На ОРИОНЕ неудобно, что надо иметь 2 загрузчика дисковода. Не составляло проблемы написать универсальный автоматический загрузчик (в отличие от того что сделал error404, три в одном, но с ручным выбором). Загрузчик сам должен анализировать BOOT-сектор и решать в какую банку перекинуть вторичный загрузчик. Я это не сделал, потому что не сообразил, что так можно сделать, к тому же это мне не требовалось. Всё отличие загрузчиков в том, что байт в BOOT-секторе задающий номер банки в OSDOS сдвинут, так что программно определить тип ДОС легко. Любопытно, что BOOT-сектор никто кроме меня не менял. А я менял, чтобы ускорить загрузку DOS (единым блоком физическими секторами, а не медленно по частям и ф-ями BDOS логическими секторами), а также это было надо для HD-дискет. Если найду энтузиазм для ОРИОНА сделаю такой загрузчик.
.

Для Специалиста дисковод с контроллером на ВГ93 ещё не проверен (вскоре это попробую). Думаю, что даже частоту CPU не понадобится менять с 2.5 МГЦ до 2.0 МГЦ, там же просто отлавливаются команды записываемые в ВГ93 и их работа имитируется без привязок ко времянкам.

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

Другое дело, если бы ODI-файл отображал реальный поток байтов дискеты, как в эмуляторе для Apple-II, что нужно для использования защищённых от копирования дискет. Защищённых дискет много для Apple-II (и их иначе не использовать), а для ОРИОНА это не надо (хотя защищённые дискеты были).

Аналогичная ситуация с квазидисками ОРИОНА. И в EMU и EMU-80 они после загрузки остаются пустыми. Какой смысл выходить в VC$ по старту и затем вручную грузить в квазидиски файлы из магнитофона. В моих эмуляторах эти квазидиски заполняются файлами из соответствующих папок.
.


Last edited by barsik on 17 Nov 2019 01:56, edited 2 times in total.



16 Nov 2019 10:08
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
Блин... достала кнопка [quote] на своих постах. Когда же её удалят (помогло бы, если бы был запрос, что уверен, что хочешь комментировать себя после нажатия кнопки [сохранить])? Помогло бы если бы кнопка [quote] была бы в ином месте (например внизу) или очень-очень маленького размера, чтобы кнопки нельзя было перепутать по рассеянности. А если бы как на всех форумах, была возможность удалить своё последнее сообщение, то проблемы бы не было. Кому вредит возможность удалить своё последнее сообщение?


Last edited by barsik on 17 Nov 2019 02:19, edited 3 times in total.



17 Nov 2019 01:39
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
ещё раз промахнулся мимо [edit] и попал на [quote]


17 Nov 2019 01:57
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Плохому танцору, как я смотрю, на всех форумах что-то да мешает... :-?

_________________
iLavr


18 Nov 2019 13:04
Profile
Novelist

Joined: 22 Mar 2018 21:46
Posts: 41
Reply with quote
Не могу в эмуле запустить ни один диск СР/М. Открываю образ, запускаю ВООТ$ и ничего. Может образы не те или с лыжами что-то?!
Может кто выложить образ диска СР/М в формате эмулятора? Желательно системный диск от Орион-Сервис.


21 Nov 2019 23:22
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
Post 
gdv2002 wrote:
Может кто выложить образ диска СР/М в формате эмулятора?
Из вредности можно было бы переспросить "Какого?" Ведь эмуляторов много, хороших и разных (встречаются и сырые и неполноценные). И для какого компьютера? Встречал образы CP/M для эмуляторов в форматах DSK, KDI, ODI, RDI и др.

По автору поста ясно, что речь об ОРИОНЕ. Хотя у меня и на ОРИОНЕ было два типа КНГМД - от Корвета и от РК86 (кстати, у меня гораздо больше ПО для РК-КНГМД). Просто для сведения, диск CP/M для РК-КНГМД имеет другую структуру, чем образ CP/M для КНГМД с ВГ93 и такой образ годится лишь для эмулятора EMU80.
gdv2002 wrote:
Желательно системный диск от Орион-Сервис.
Увы, у меня все файлы TD0 чуждых ДОС и их инсталяторы погибли при крахе винта 20 лет назад. Имея ODI-образ с любой загружающейся с диска CP/M и файлы инсталляторов (обычно называемые SG.COM), сделать любой диск ODI системным - легко. Достаточно загрузиться в любую CP/M (с дискеты или удобнее запуском файла CP/M из ROM-диска) и запустить SG.COM, указав как цель нужный дискетный привод.

Вообще образы не нужны. Нужны отдельно архивы в виде папок и наличие утилиты SteinBlume. Какой смысл хранить ODI-файлы, если просто отметив по ^A все файлы в папке и перетащив на окно SteinBlume, нужный ODI-диск создаётся за полсекунды. SteinBlume позволяет записать и систему на системные треки (если она была ранее считана в файл). Но проще с этим не возиться, а просто иметь один загрузочный образ (причём желательно со всеядной CP/M, т.е не привязанной к единственной реализации ОС) и на ней собрать все имеющиеся SG-файлы. Или же можно образы пустой дискеты (blank.ODI) уже сразу иметь с записанной на её сист.треки той версией ДОС которой пользуетесь, например, от ОРИОН-СЕРВИС.

Вот в этот каталог я накидал своих ODI-файлов, что как раз на днях сделал себе.

Всё только для Z80. И EMU и EMU80 поддерживают Z80, так что, если ещё это не сделали, измените в конфиге строку про тип процессора. На днях выложу эмулятор EMU80 с конфигами Специалиста с хитрым конфигом, где ОЗУ расширяется банками по 62К (можно "написать" себе хоть 127 банок по 62 кб, - это немногим менее 8 мб).

При пользовании инсталляторами из системы, где привод A: - эл.диск, указывайте как целевой диск - B или C, иначе при попытке инсталляции DOS на эл.диск A: произойдёт улёт.


Last edited by barsik on 18 Jan 2020 06:30, edited 5 times in total.



22 Nov 2019 00:37
Profile
Novelist

Joined: 22 Mar 2018 21:46
Posts: 41
Reply with quote
Спасибо! Попробую эту утилитку.
Получилось! :rotate:
Теперь работа над книжкой дальше пойдет!


Attachments:
рис_69.jpg
рис_69.jpg [ 34.32 KiB | Viewed 1483 times ]
22 Nov 2019 01:15
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
gdv2002 wrote:
Получилось!
Плохо получилось. EMU80 даёт неразмытые чёткие картинки и они для монохроной картинки занимают в PNG-формате всего 4...8 кб. Такая размытость у меня получается, если я делаю скриншот в PNG-формат прямо с экрана PC при прогоне своего эмулятора ОРИОНА запущенного под DosBox (скрин-шот можно сделать лишь в DosBox, т.к я перехватываю INT 9), а затем картинку удваиваю в разрешении рисайзером. И то получается лучшее качество.


22 Nov 2019 05:55
Profile
Novelist

Joined: 22 Mar 2018 21:46
Posts: 41
Reply with quote
barsik wrote:
gdv2002 wrote:
Получилось!
Плохо получилось. EMU80 даёт неразмытые чёткие картинки и они для монохроной картинки занимают в PNG-формате всего 4...8 кб. Такая размытость у меня получается, если я делаю скриншот в PNG-формат прямо с экрана PC при прогоне своего эмулятора ОРИОНА запущенного под DosBox (скрин-шот можно сделать лишь в DosBox, т.к я перехватываю INT 9), а затем картинку удваиваю в разрешении рисайзером. И то получается лучшее качество.

Ну, можно и вот так:
 
Attachment:
рис_69.jpg
рис_69.jpg [ 41.53 KiB | Viewed 1470 times ]


22 Nov 2019 06:13
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
Post 
Всё равно нечётко и размер файла раз в 7 больше, чем должно быть для скриншота монохромного экрана. Вот смотрите, я даже не делал BMP в EMU80 (а BMP без потери качества конвертируется в PNG), просто скрин-шот прямо с экрана PC, и то качество намного лучше, - как в оригинале видны пиксели. И на размер посмотрите, даже в цвете всего 7 кб. Это потому-что края пикселей между цветами чёткие. Это я хотел этот MSDOS форматёр Luksian дизассемблировать, забить в нём физический формат, сделав бутафорию, чтобы можно было сделать скриншот экрана с отображением процесса форматирования.

 
Image

По поводу файлов ROM-диска с CP/M. Они содержат ORDOS и файл какой-либо CP/M. Я практически не пользовался CP/M загружаемой и тем более подкачиваемой с дискеты. Это слишком противно и долго. Т.к в середине 90-тых я догадался, что загрузку с дискеты можно существенно ускорить, если грузить всю CP/M одним сплошным массивом физическими секторами в 1 кб (в оригинале CP/M от Корвета CCP и BDOS грузятся медленно логическими секторами в 128 байт, что тормозит).

Потому и на дискете у меня DOS хранятся сплошным массивом. Это и позволило для всех DOS делать версию для ROM-диска. Если один блок, то не важно грузится ли он с дискеты, стартует $-ORD-файлом из ROM-диска, или читается с магнитофона. Терять впустую ёмкость дискеты под систему незачем, потому на 83 физ.дорожках я получал полезную ёмкость DD-диска на 50 кб больше. В CP/M-PLUS вообще нет системных треков, лишь BOOT-сектор, BDOS+BIOS в виде файла CP/M+ (16 кб) в 14-м юзере, а COMMAND.COM тоже отдельный файл.

Чтобы файл CP/M стартовал автоматически по сбросу, используется свойство ORDOS, она автоматически стартует файл с именем VC$. Потому для автозагрузки CP/M с ROM-диска достаточно прошить CP/M в виде ORD-файла в ROM-диск и перименовать его в VC$.

Чтобы в EMU80 задать нужный ROM-диск, в файле <orion.conf> замените в такой строке имя файла.
Code:
@ROM_DISK = "orion/romdiski/ACPM165E.DAT"
#@ROM_DISK = "orion/romdiski/DOS20I.DAT"
#@ROM_DISK = "orion/romdiski/DOS20E.DAT"
#@ROM_DISK = "orion/romdiski/DOS20H.DAT"
#@ROM_DISK = "orion/romdiski/DOS20K.DAT"
#@ROM_DISK = "orion/romdiski/CPM_only_RAM_D8.DAT"
#@ROM_DISK = "orion/romdiski/ORDOS.DAT"
#@ROM_DISK = "orion/romdiski/LOADER.DAT"
Тут видно, что все ROM-диски я храню в подкаталоге ROMDISKI, чтобы не было загромождения в папке ORION, там только конфиги. Все образы дискет для ВГ93 я помещаю в папку Diski_800, а все ПЗУ F800 помещаю в папку ROMS. Соответственно надо откорректировать строки в файлах <orion.conf> и <orion.inc>. Кстати, не пытайтесь удалить в конце файла <orion.conf> строку 'include orion.inc' и вставить на это место содержимое самого инклюдэ-файла (чтобы было не 2 файла, а один), у меня не получилось почему-то.

Если не хочется тратить ROM-диск, то можно грузить DOS и с дискеты, тогда, чтобы не мыкаться вручную с загрузчиками, откомментируйте строку @ROM_DISK = "orion/romdiski/LOADER.DAT". Кстати, правильнее для файлов данных расширение DAT, а не BIN. На том же основании файлы данных можно называть HEX или OCT.

При пользовании эмулятором всё-время приходится менять строки типа:
Code:
diskA.fileName = "orion/DISKI_800/DOS20I.ODI"
diskB.fileName = "orion/DISKI_800/blank.ODI"
Хорошо бы сам эмулятор менял эти строки, типа в окне выбора при загрузке файла ставим галочку. Или тащим файл ODI на иконку эмулятора и он стартует поставив ODI-файл в привод A:.


22 Nov 2019 07:06
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
Post 
.
Для практического использования удобно конфиг файл перестроить под свои нужды.

Документации о устройстве и командах конфиг файла нет, но опытным путём, путём тысячи проб можно выяснить, что можно делать в конфиге, а что нет. Сейчас я научился как путём модификации конфига получить почти любую традиционную архитектуру на базе Специалиста и РК86, т.е можно "нарисовать" любую машину с экраном и клавиатурой, как в этих компьютерах. Менять можно размер и положение окон ОЗУ, ПЗУ, адреса портов для БИС и упр.регистров, назначение разрядов и т.п. Я даже могу вводить страничность ОЗУ и ПЗУ в отдельных окнах.

Что касается эмуляции РК86, к сожалению, в отличие от EMU, EMU80 не поддерживает коммутацию фонтов. Т.е то, что в реале легко достигается соединением куском проволоки ножки А10 ПЗУ РФ2 знакогенератора с выводом одного из разрядов запасного ППА D14, или PC1/PC2 ППА клавиатуры. Что не только позволяет с пользой использовать вторую половину РФ2, но и кардинально улучшает свойства РК86.

Чтобы понять как редактировать конфиг достаточно иметь образец конфига с реализованными нужными свойствами, чтобы использовать его как прототип. Т.о посмотрев на используемые мной конфиги РК с страничными ОЗУ и ПЗУ, каждый сможет понять как это сделать под свою архитектуру. Если кому интересно, то можете почитать вот здесь.

Вот например, полезный совет. При серъёзном пользовании эмулятора с эмуляцией дисковода, часто надо переставлять дискеты. Это можно делать в эмуляторе вручную одновременно нажав АЛЬТ+А (или АЛЬТ+B) и выбрав в окне выбора файлов нужный образ. Но делать это всякий раз утомляет. Потому удобнее в конфиге отредактировать строку:

diskA.fileName = "rk86/DISKS/Мой_диск_N36.rkdisk"

задав имя нужного файла с образом дискеты. Это приходится делать очень часто. А к сожалению эта строка в конфиг файле находится спустя полторы сотни других конфигурирующих строк, а перенести её в начало не получается (т.к в начале файла ещё не заданы другие "железные" объекты архитектуры). И искать нужные строки листая и просматривая текст утомляет. Но можно все нужные параметры, которые в ходе эксплуатации EMU80 постоянно приходится менять в текстовом редакторе (и для чего надо искать нужные строки в тексте конфига) с помощью вот такого трюка перенести в начало файла, где они сразу перед глазами. Например, чтобы задавать имя образа диска вставляем в начале файла строку:

@OOOO = "rk86/DISKS/Мой_любимый_диск_458.rkdisk"

а в глубине текста конфига, в строке где задаётся имя образа диска пишем:

diskA.fileName = @OOOO

Таким образом все часто меняемые переменные выносим в начало текстового файла и нам не надо шариться по тексту выискивая их. Вообще полезно всякие ненужные непонятные строки из конфига убрать в инклюдэ файл, чтобы не загромождали. И естественно при отладке программ для КР580 в конфиг-файле надо иметь следующие строки (их в дистрибутивных конфигах нет):

cpu.debugOnHalt = yes
cpu.debugOnIllegalCmd = yes

PS. Если кому интересно, наблюдал такое явление. Если сразу после загрузки Windows XP запустить старую версию эмулятора EMU80, например 271, а затем более новую, например 292, то в новой версии перестаёт правильно эмулироваться РК-КНГМД при эмуляции РК86. Но в старой версии 271 EMU80 всё, что в этой версии положено, работает. Если перезагрузить Windows и сразу использовать новую версию, то и с новой и старой версиями проблем нет.

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


Last edited by barsik on 16 Jan 2020 03:40, edited 3 times in total.



07 Jan 2020 11:52
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
.
После того, как я разобрался с работой РК-КНГМД в эмуляторе EMU80, наконец появилась возможность странслировать РК86-версию CP/M работающей с дисководом. Версию CP/M для РК86 работающую вместо дисковода с его заменителем - с RAM-диском, я давно странслировал и пользуюсь. Это было сделано пару лет тому назад, но для другого эмулятора (EMU с 512 кб ОЗУ), т.к тогда EMU80 ещё не поддерживал банковость ОЗУ в эмуляции РК86. Сейчас я сделал такую же версию и для EMU80.

На базовом и совместимом РК86, естественно, возможны лишь две версии CP/M: для базового железа без доп.ОЗУ (это CP/M с TPA всего 20 кб, практически бесполезная, т.к в ней можно запускать только маленькие программы) и версия CP/M, которая по подобию RK-DOS работает из памяти вне основного ОЗУ, т.е из области выше 8000, а именно, - в добавленном верхнем ОЗУ включённом в области A000...BFFF вместо запасного ППА D14 (которое переадресуется на 8400 за счёт разбиения области 8000...9FFF доп.дешифратором ИД7 на 8 участков).

Версия CP/M в верхнем ОЗУ даёт максимально возможный TPA в 29 кб. Этого, естественно, недостаточно для фирменных пакетов CP/M и компиляторов ЯВУ, но по крайней мере все имеющиеся программы РК86 можно записать на дискету из ОЗУ и запускать с дискеты (кстати, в RK-DOS TPA меньше, там максимальный размер файла - 27 кб).

У меня сохранились исходники многих версий DOS использующих РК-КНГМД. Но все они не для РК86, а для ОРИОНА. Там код не только для Z80, но и переделан под другую, в 3 раза большую скорость CPU. А т.к все DOS для РК-КНГМД основаны на точных времянках, то хотя вся логика процедур Е.Седова сохранена, но задержки изменены. Вернув задержки, я пытаюсь отладить, но пока это не удалось.

Чтобы хранить код разных DOS понадобилось ввести страничное ПЗУ в эмуляцию РК86. Просто расширить ПЗУ до 8 кб (в окне E000) легко, это делается за 15 секунд (просто заменив файл с кодом ПЗУ и изменив в конфиге адреса окна ПЗУ). А вот чтобы ввести страничность ПЗУ и, особенно, страничность ОЗУ, надо знать много ещё нигде недоступной информации (и образцов конфигов из которых можно было бы что-то понять также нет, из конфига для ОРИОНА ничего не взять, там всё пригодное только для ОРИОНА)

Я уже раньше имел страничное ПЗУ при эмуляции Специалиста и проблем не имел, но тут вдруг получил облом. Дело оказалось в том, что страничность ПЗУ в эмулятор EMU80 введена только с версии 277, а я пытался её ввести на версии 271. Или в более ранних версиях это делается как-то иначе (т.е ключевые слова иные).

Вот как в версиях выше 271 вводится страничность ПЗУ и доп.ОЗУ 256К в окне A000. Это продвинутый конфиг, в котором добавлено ОЗУ и ПЗУ. Также оригинальный РК-КНГМД сохранён (хотя при процессоре Z80 не будет работать оригинал RK-DOS с командами IN/OUT). В качестве RK-DOS при Z80 надо использовать универсальную версию RK-DOS 2.96 или версию специально для Z80 2.98 (что в кодах Z80).

 файл rk86X.conf
Code:
@NAME = "Радио-86РК Z80 RAM 32*8K ROM 16*2K"

@CPU_FREQUENCY = 2000000
@CRT_FREQUENCY = 1333333

@ROM_0  = "rk86/ROMS/rom0.DAT"
@ROM_1  = "rk86/ROMS/rom1.DAT"
@ROM_2  = "rk86/ROMS/rom2.DAT"
@ROM_3  = "rk86/ROMS/rom3.DAT"
@ROM_4  = "rk86/ROMS/rom4.DAT"
@ROM_5  = "rk86/ROMS/rom5.DAT"
@ROM_6  = "rk86/ROMS/rom6.DAT"
@ROM_7  = "rk86/ROMS/rom7.DAT"
@ROM_8  = "rk86/ROMS/rom8.DAT"
@ROM_9  = "rk86/ROMS/rom9.DAT"
@ROM_10 = "rk86/ROMS/rom10.DAT"
@ROM_11 = "rk86/ROMS/rom11.DAT"
@ROM_12 = "rk86/ROMS/rom12.DAT"
@ROM_13 = "rk86/ROMS/rom13.DAT"
@ROM_14 = "rk86/ROMS/rom14.DAT"
@ROM_15 = "rk86/ROMS/rom15.DAT"

@ROM_otl = "rk86/ROMS/otlad.DAT"

@F806_ADDR = 0xfb98
@F80C_ADDR = 0xfc46
@F803_ADDR = 0xfe63

CpuZ80 cpu

@SYM_GEN  = "rk86/sgr.bin"       
@FONT     = "rk86/fontr.bin"
@DOS =      "rk86/RKDOS.DAT"
@OPT_FILE = "rk86/rk86.opt"

@ROM_DISK = "rk86/romdisk.DAT"



######## Window ########

EmuWindow window
window.caption = @NAME

# Default window size for window.windowStyle = fixed (default = 800, 600)
window.defaultWindowSize = 960, 640

# Window style: autosize, sizable, fixed, fullscreen (default = autosise)
window.windowStyle = autosize
#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 #####

Ram ram = 0x8000
Rom otlad = @ROM_otl,0x1000

Rom rom0  = @ROM_0,0x800
Rom rom1  = @ROM_1,0x800
Rom rom2  = @ROM_2,0x800
Rom rom3  = @ROM_3,0x800
Rom rom4  = @ROM_4,0x800
Rom rom5  = @ROM_5,0x800
Rom rom6  = @ROM_6,0x800
Rom rom7  = @ROM_7,0x800
Rom rom8  = @ROM_8,0x800
Rom rom9  = @ROM_9,0x800
Rom rom10 = @ROM_10,0x800
Rom rom11 = @ROM_11,0x800
Rom rom12 = @ROM_12,0x800
Rom rom13 = @ROM_13,0x800
Rom rom14 = @ROM_14,0x800
Rom rom15 = @ROM_15,0x800

AddrSpaceMapper rom = 16
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
rom.page = 8, &rom8
rom.page = 9, &rom9
rom.page = 10, &rom10
rom.page = 11, &rom11
rom.page = 12, &rom12
rom.page = 13, &rom13
rom.page = 14, &rom14
rom.page = 15, &rom15

Ram ram0  = 0xC000
Ram ram1  = 0xC000
Ram ram2  = 0xC000
Ram ram3  = 0xC000
Ram ram4  = 0xC000
Ram ram5  = 0xC000
Ram ram6  = 0xC000
Ram ram7  = 0xC000
Ram ram8  = 0xC000
Ram ram9  = 0xC000
Ram ram10 = 0xC000
Ram ram11 = 0xC000
Ram ram12 = 0xC000
Ram ram13 = 0xC000
Ram ram14 = 0xC000
Ram ram15 = 0xC000
Ram ram16 = 0xC000
Ram ram17 = 0xC000
Ram ram18 = 0xC000
Ram ram19 = 0xC000
Ram ram20 = 0xC000
Ram ram21 = 0xC000
Ram ram22 = 0xC000
Ram ram23 = 0xC000
Ram ram24 = 0xC000
Ram ram25 = 0xC000
Ram ram26 = 0xC000
Ram ram27 = 0xC000
Ram ram28 = 0xC000
Ram ram29 = 0xC000
Ram ram30 = 0xC000
Ram ram31 = 0xC000

AddrSpaceMapper pages = 32
pages.page = 0,  &ram0
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
pages.page = 16, &ram16
pages.page = 17, &ram17
pages.page = 18, &ram18
pages.page = 19, &ram19
pages.page = 20, &ram20
pages.page = 21, &ram21
pages.page = 22, &ram22
pages.page = 23, &ram23
pages.page = 24, &ram24
pages.page = 25, &ram25
pages.page = 26, &ram26
pages.page = 27, &ram27
pages.page = 28, &ram28
pages.page = 29, &ram29
pages.page = 30, &ram30
pages.page = 31, &ram31

Rom fdcRom = @DOS, 0x1000

Ppi8255 ppi1
Ppi8255 ppi2
Ppi8255 fdcPpi

# ROM pages
PageSelector romPageSelector
romPageSelector.mapper = &rom

Translator Rom_Select = &romPageSelector
Rom_Select.writeAndMask = 0x7

# RAM pages
PageSelector pageSelector
pageSelector.mapper = &pages

Translator Xram_Select = &pageSelector
Xram_Select.writeAndMask = 0x01F

Dma8257 dma
dma.frequency = @CPU_FREQUENCY

Crt8275 crt
crt.frequency = @CRT_FREQUENCY
crt.dma = &dma, 2

Rk86Renderer crtRenderer
crtRenderer.font = @SYM_GEN
crtRenderer.altFont = @FONT
crtRenderer.altRenderer = no
crtRenderer.crt = &crt

Rk86Core core
core.window = &window
core.crtRenderer = &crtRenderer
crt.core = &core

RkFddRegister fddReg
RkFddController fdc
fdc.fddRegister = &fddReg
fdcPpi.circuit = &fdc

AddrSpace fdcAddrSpace
fdcAddrSpace.range = &fdcPpi, 0, 3
fdcAddrSpace.range = &fddReg, 4, 4
fdcAddrSpace.addrMask = 7

AddrSpace addrSpace
addrSpace.range = &ram,               0x0000, 0x7FFF
addrSpace.range = &ppi1,              0x8000, 0x83FF
addrSpace.range = &ppi2,              0x8400, 0x87FF
addrSpace.writeRange = &Xram_Select,  0x8800, 0x8CFF
addrSpace.range = &otlad,             0x9000, 0x9FFF
addrSpace.range = &pages,             0xA000, 0xBFFF
addrSpace.range = &crt,               0xC000, 0xDFFF
addrSpace.writeRange = &dma,          0xE000, 0xEFFF
addrSpace.readRange = &fdcRom,        0xE000, 0xEFFF
addrSpace.range = &fdcAddrSpace,      0xF000, 0xF7FF
addrSpace.writeRange = &Rom_Select,   0xF800, 0xF8FF
addrSpace.readRange = &rom,           0xF800, 0xFFFF

cpu.frequency = @CPU_FREQUENCY
cpu.startAddr = 0xF800
cpu.addrSpace = &addrSpace
cpu.core = &core

dma.addrSpace = &addrSpace
dma.cpu = &cpu

RkKeybLayout kbdLayout
RkKeyboard keyboard

RkPpi8255Circuit ppiCircuit
ppiCircuit.rkKeyboard = &keyboard

ppi1.circuit = &ppiCircuit

RkRomDisk romDisk = @ROM_DISK
  ppi2.circuit = &romDisk

######## File I/O ########

RkFileLoader loader
loader.addrSpace = &addrSpace
loader.filter = "Файлы РК-86 (*.rkr, *.gam)|*.rkr;*.gam;*.RKR;*.GAM|Файлы RK-совместимых ПК (*.rk?)|*.rk;*.rk?;*.RK;*.RK?|Все файлы (*.*)|*"

TapeRedirector tapeInFile
tapeInFile.mode = "r"
tapeInFile.filter = "Файлы РК-86 (*.rkr, *.gam)|*.rkr;*.gam;*.RKR;*.GAM|Файлы RK-совместимых ПК (*.rk?)|*.rk;*.rk?;*.RK;*.RK?|Файлы BSM (*.bsm)|*.bsm;*.BSM|Файлы EDM (*.edm)|*.edm;*.EDM|Все файлы (*.*)|*"
#tapeInFile.fileName = "program.gam"

TapeRedirector tapeOutFile
tapeOutFile.mode = "w"
tapeOutFile.filter = "Файлы РК-86 (*.rkr)|*.rkr|Файлы RK-совместимых ПК (*.rk)|*.rk|Файлы BSM (*.bsm)|*.bsm|Файлы EDM (*.edm)|*.edm|Все файлы (*.*)|*"

FdImage diskA = 80, 2, 1, 3125
diskA.label = A
diskA.readOnly = NO
diskA.filter = "Образы дисков РК-86 (*.rkdisk, *.rdi)|*.rkdisk;*.rdi;*.RDI|Все файлы (*.*)|*"
diskA.fileName = "rk86/PROGS/CPM.rkdisk"

FdImage diskB = 80, 2, 1, 3125
diskB.label = B
diskB.filter = "Образы дисков РК-86 (*.rkdisk, *.rdi)|*.rkdisk;*.rdi;*.RDI|Все файлы (*.*)|*"
#diskB.fileName = "rk86/DISKS/BLANK.rkdisk"

fdc.fdImage = 0, &diskA
fdc.fdImage = 1, &diskB

RkTapeInHook tapeInHook = @F806_ADDR
tapeInHook.tapeRedirector = &tapeInFile
cpu.addHook = &tapeInHook

RkTapeOutHook tapeOutHook = @F80C_ADDR
tapeOutHook.tapeRedirector = &tapeOutFile
cpu.addHook = &tapeOutHook

CloseFileHook closeFileHook = @F803_ADDR
closeFileHook.addTapeRedirector = &tapeInFile
closeFileHook.addTapeRedirector = &tapeOutFile
cpu.addHook = &closeFileHook

EmuObjectGroup tapeGrp
tapeGrp.addItem = &tapeOutHook
tapeGrp.addItem = &tapeInHook
tapeGrp.addItem = &closeFileHook
#tapeGrp.enabled = no

######## 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.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

#window.fieldsMixing
ConfigRadioSelector mixSelector = &window, fieldsMixing, "Смешивание полукадров"
mixSelector.addItem = none, "Выкл."
mixSelector.addItem = mix, "Вкл."
configTab.addControl = 2, &mixSelector

#crtRenderer.altRenderer
ConfigRadioSelector rendSelector = &crtRenderer, altRenderer, "Шрифт ВГ8275"
rendSelector.addItem = no, "Оригинальный шрифт"
rendSelector.addItem = yes, "8×16 / 8×12 / 8×8"
configTab.addControl = 2, &rendSelector

#crtRenderer.colorMode
ConfigRadioSelector colorSelector = &crtRenderer, colorMode, "Режим цвета"
colorSelector.addItem = mono, "Ч/б"
colorSelector.addItem = color1, "Цветной (схема Толкалина)"
colorSelector.addItem = color2, "Самоцвет-М (схема Акименко)"
configTab.addControl = 2, &colorSelector

#kbdLayout.layout
ConfigRadioSelector laSelector = &kbdLayout, layout, "Раскладка клавиатуры"
laSelector.addItem = qwerty, "Qwerty"
laSelector.addItem = jcuken, "Йцукен"
configTab.addControl = 3, &laSelector

#tapeGrp.enabled
ConfigRadioSelector tapeSelector = &tapeGrp, enabled, "Перехват обращений к магнитофону"
tapeSelector.addItem = yes, "Вкл."
tapeSelector.addItem = no, "Выкл."
configTab.addControl = 3, &tapeSelector

cpu.debugOnHalt = yes
cpu.debugOnIllegalCmd = yes

Этот конфиг годится только для версии EMU80 277 и выше. При попытке так ввести страницы ПЗУ в версии ниже 277, возникает вот такое обидное сообщение. Прежние версии не поддерживают многостраничность.

Переключение страниц ПЗУ размером в 2 кб в окне F800...FFFF тут управляется записью чисел 0...15 (дес) в тот же адрес F800...FFFF (это возможно т.к ПЗУ выбирается только по /RD). Это логичный и самый простой вариант управления, т.к после установки по рекомендациям Е.Седова дешифратора ИД7 на область E000...FFFF (что аналогично Микроше), как раз и возникает единственный и бесплатный чип-селект на запись. Потому добавив на плату РК регистр 1533ТМ9 (подав на C-вход ТМ9 объединённые на вентиле ЛЛ1 сигналы /WR и /F800, на входы ТМ9 - D0...D3 из ШД и сигнал сброса - на вход RESET ТМ9) и подав выходы ТМ9 на входы A11...A14 ПЗУ 27256 получаем страничное ПЗУ в окне 2 кб.

Разумеется крошечное окошко в 2 кб удобно только для загрузки из доп.страниц ПЗУ резидентных программ. Для работы других программ из самогО большого ПЗУ всё же удобнее иметь окно ПЗУ в 8 кб с адреса E000 (это легко делается, если адрес РК-КНГМД из F000, что мешает этому, переставить в другое место).

Вы можете сами по данному образцу ввести себе и другие страницы ПЗУ в эмуляцию РК86. Например, если не важен именно оригинал RK-DOS, то за счёт переноса его адреса, без конфликтов с имеющимися программами можно расширить окно ПЗУ аж до 15 кб в области C400...FFFF. И хранить там резидентный бейсик РК86 (самый большой бейсик РК86 занимает всего 8.75 кб). В данном конфиге область CRT C000...DFFF не использована. Оставив 1 кб для CRT (C000...C3FF) можно ввести в окне 7 кб C400...DFFF ещё ОЗУ или ПЗУ, одностраничные или многостраничные.

Введение доп.ОЗУ здесь сделано в окне A000...BFFF (на месте запасного ППА D14). Чтобы освободить эту область адресного пространства, ППА D14 перенесён на адрес 8400. А на адрес 8800 поставлен управляющий регистр страницы ОЗУ 555 ТМ9, в который для переключения доп.ОЗУ по адресу 8800 записывается номер 0...31 (дес) участка дополнительного ОЗУ (размером в 8 кб).

Чтобы не пропадал участок 9000...AFFF, тут в него включено ПЗУ 4 кб с отладчиком странслированным на этот адрес (отладчик сам работает из ПЗУ, но использует ещё $94 ячейки ОЗУ ниже 7500). Это позволяет отлаживать отладчиком любую из имеющихся программ РК86. Но это отладчик для КР580. Отладчики для Z80 очень большие по объёму. Потому я использую мини-дизассемблер в мнемониках Z80, который расширяет монитор РК86 (вводим там команду 'точка', - после ввода команды '.ADDR<ВК>' на экран выводится 24 строки дизассемблера, далее используя клавиши <вверх>/<вниз> можно листать.

Используя этот конфиг как прототип вы можете сделать себе почти любую традиционную архитектуру со страницами ОЗУ и ПЗУ в РК86, Специалисте и ОРИОНЕ.

Для доступа в доп.ОЗУ 256К сквозь окно в 8 кб надо записать в порт 8800 номер нужной 8-ми килобайтовой страницы и затем можно читать и писать байты в окне A000...BFFF. Т.к основное ОЗУ не переключается, то для работы с доп.ОЗУ сквозь окно не требуется перепрошивка ПЗУ F800 и наличие в нём подпрограмм F836/39.


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



11 Jan 2020 04:48
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
Post 
Сегодня проверил исправлена ли в эмуляторе неверная работа эмулятора EMU80 при эмуляции ВГ75 о которой я писал 3 года назад, - оказалось, что так ничего и не исправлено.

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

Во вложении код ПЗУ РК86, в котором, кстати, при сохранении функционала (удалена лишь ненужная директива X) за счёт оптимизации кода я освободил 256 ячеек памяти и который странслирован с ключом дающим "большой" курсор (и линия подчёркивания посередине знакоместа). Я уже 30 лет пользуюсь на РК86 именно таким большим курсором и на ОРИОНЕ мои драйвера D6,D7 и D8 используют только большой курсор, т.к он намного более приятный, чем крошечная едва заметная тонкая чёрточка (которая на ч/б ламповом телевизоре с малой полосой пропускания почти не видна).

Кстати, кто-нибудь может уплющить ПЗУ РК86 ещё больше? При процессоре Z80 легко выигрывается ещё ~50 ячеек.

Используя освободившееся место, позже я вероятно займусь мелкими доработками монитора РК86. Видимо, исправлю директиву М (будет как в М3-EXT), директива поиска будет искать не только один байт, а цепочку (хотя по сути это в мониторе излишество, монитор это инструмент пользователя, не программиста и это работа для отладчика), изменю директиву D, чтобы выводила в дампе ASCII и не требовала ввода второго параметра, и устраню неприятный недостаток монитора РК, что заключается в том, что разделителем в директивах может быть только запятая, тогда как некоторые люди привыкли использовать для этого пробел.

А если это не делать (т.е не улучшать директивы D и M), то этого места хватит, чтобы ввести в монитор директиву ввода с МГ-ленты в формате с именем. Чтобы не вводить новые сущности, это вероятно будет формат Специалиста с именем (его директив I/O). Чтобы хранить на МГ-ленте файлы для дискетных DOS, а главное автоматизировать их ввод, нужен формат с именем. Тогда первые 8 символов специалистовского имени до точки или пробела будут считаться DOS-именем файла, а последующие 3 символа - расширением. Это позволит хранить на МГ-ленте файлы с именами в общепринятом для текстовых DOS формате 8.3.


Attachments:
ROM RK86 большой курсор.rar [1.69 KiB]
Downloaded 22 times


Last edited by barsik on 01 Feb 2020 22:01, edited 2 times in total.

16 Jan 2020 03:29
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
.
В эмуляторах обычно принцип эмуляции ввода с магнитофона основан на отлове точки входа в подпрограмму LDBYTE (в EMU также и точки выхода из неё) и последующем определении того, что ввод закончился (обычно по долгой паузе или вызове других стандартных п/п-мм не относящихся к магнитофону). Принципы эмуляции магнитофона в EMU и EMU80 немного отличаются.

При первом вызове п/п-ммы LDBYTE в обоих эмуляторах открывается окно для выбора загружаемого файла. Для РК86 это может быть файл RKR или GAM (отличие между ними только в стартовом байте E6, в RKR сдуру этот байт убрали, что фатально нарушило логику, - т.е E6 перед контрольной суммой есть, а перед адресами загрузки нет, потому формат RKR я не люблю - во всём нужна логичность). Если выбран файл RKR, то эмулятор сам при открытии файла имитирует чтение байта E6, а для GAM-файла байт Е6 читается из файла.

Для EMU в конфиге задаётся адрес входа в п/п-мму LDBYTE и точка выхода из неё (адрес команды RET). Для EMU80 задаются только адреса входа в LDBYTE и адрес входа в п/п-мму CONIN. Это позволяет загрузку многоблочных программ с паузой между блоками.

В конфиге EMU80 адреса точек перехвата задают следующие строки.
Code:
@F806_ADDR = 0xFB98
@F80C_ADDR = 0xFC46
@F803_ADDR = 0xFE63
.
Эти строки нам неинтересны, если ПЗУ F800 не меняется. Но если код ПЗУ F800 перерабатывается и адреса исполнительных частей подпрограмм сдвигаются, то без изменения этих строк возникают чудеса - случайным образом открывается окно выбора файла и после отказа возникает завис. Чтобы этого избежать надо редактировать эти строки.

Чтобы пользователю не заморачиваться с конфигами при использовании модернизированного ПЗУ в эмуляторах, при модернизации ПЗУ я сохраняю положение точек, что используют эмуляторы. Чтобы на этапе отладки не возникало "чудес" из-за точек перехвата, в EMU строчки (cas) задающие точки входа/выхода в LDBYTE/SVBYTE можно закомментировать.

А вот в EMU80 закомментирование не помогает, т.к тогда возникает ошибка. Потому в EMU80 на этапе отладки кода ПЗУ надо не закомментировать эти строки, а изменить в них адреса так, чтобы программа при работе ПЗУ в них не пробегала. Например так:
Code:
@F806_ADDR = 0xF7FF
@F80C_ADDR = 0xF7FE
@F803_ADDR = 0xF7FD
.
Отладив модернизированный код ПЗУ, далее требуется подогнать все фиксированные точки входа (нестандартные для наглых игр и точки используемые EMU80). Это легко делается путём перестановки фрагментов кода, т.к в коде много коротких фрагментов (заканчивающихся на RET или JMP). В принципе точки для EMU80 можно не подгонять, а подставить актуальные значения в конфиг. Но тогда такое ПЗУ будет работать только с этим конфигом. После подгона всех входных точек, чтобы в эмуляторе работали магнитофонные директивы I/O, надо восстановить адреса в вышеупомянутых трёх строках задающих точки перехвата МГ-процедур.


23 Jan 2020 15:44
Profile
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 492
Location: С-Петербург
Reply with quote
Post 
В позапрошлом посте я написал, что EMU80 неверно обслуживает байт задающий форму курсора. Такой вывод был на основании того, что тот монитор РК, что я использовал в реале почти 30 лет без всяких проблем в эмуляторе давал искажения.

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

Ранее, т.к при курсоре на всё знакоместо линию подчёркивания обязательно на 9-той линии сверху иметь не надо, а можно и даже необходимо иметь посередине знакоместа (это необходимо для правильного вывода 11-ти аппаратных символов для рисования рамок), то у меня (т.к я как раз имел доработку до такой аппаратной псевдографики) уровень линии подчёркивания одновременно перемещался с низу на середину знакоместа (по вертикали). Т.к линия подчёркивания это одновременно линия прохождения горизонтали псевдографики.

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


31 Jan 2020 10:38
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 91 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7  Next

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.