Вход

Просмотр полной версии : Как на РК вывести символ с кодом 07h ?



Denn
09.02.2017, 23:52
Вопрос к знатокам программирования РАДИО-86РК. Как вывести на экран символ псевдографики с кодом 07h (правый верхний уголок) ?

https://pp.vk.me/c636330/v636330907/518e4/C_sDPpF-X40.jpg

Вывод кода 07h стандартными подпрограммами Монитора (F809h и F818h) выводит звуковой сигнал, что в общем-то логично.
А как вывести этот чёртов уголок?! :v2_dizzy_botan:

HardWareMan
10.02.2017, 01:11
ПДП.

Denn
10.02.2017, 01:38
Т.е. через стандартные п/п Монитора совсем никак? (пишу ПО, которое обязано работать на совершенно разных железках, через стандартные средства BIOS, напрямую лазать в экран низя).

tnt23
10.02.2017, 07:30
Записать в нужную ячейку экрана код 07?

HardWareMan
10.02.2017, 11:44
tnt23, Я уже это предложил, но ТС сказал низзя.

Denn
10.02.2017, 12:29
А нет ли случайно какой-нибудь магии через 1Bh+<чего-то там>+07h ?
Ради одного уголка писать код определения платформы и вычисления адреса экранной области как-то бессмысленно...

barsik
10.02.2017, 13:20
В драйверах вывода многих компьютеров (не только ОРИОНА) используется искейп-последовательность 1B,01,код, которая позволяет выводить любой код как печатаемый символ (игнорируя управляющие способности кода). В драйверах С.Коровкина и во всех моих драйверах, где есть символы с кодом менее 20H, этот код был поддержан. Этот упр.код есть также в драйверах других авторов, но конкретно у кого, уже не помню.



.ESC,01,BYTE - вывод графических символов с кодами 0..1F
.01,BYTE - полный аналог ESC,01,BYTE (вывод кодов до 20H)

01,BYTE
~~~~~~~~~~~
Этот код новый. Старый код ESC,01,BYTE есть во многих старых (моих и
чужих) драйверах. Но код 01,BYTE - новый. Этот код есть во многих маши-
нах - АТМ-Турбо, Ямаха и др. Это уже не ESC-код, а единственный код,
как-бы образующий новую управляющую последовательность. Смысл его введе-
ния в том, чтобы упростить вывод псевдографики с кодами 0...1F. Теорети-
чески при использовании этого кода с более высокими символами от 20 до
FF (которые выводятся на консоль и без префиксирования), вместо базово-
го фонта должен был бы включаться альтернативный (дающий еще 224 изобра-
жения псевдографики). Однако в моих драйверах этого нет.


Во вложении - доки к драйверам (~1996), где описаны все упр.коды моих драйверов для всех ДОС.

Denn
10.02.2017, 13:30
barsik, увы, не прокатило :( По крайней мере в симуляторе. Полагаю, на реале будет тоже самое.

http://denn.ru/8bit/radio-86rk/img/rk07h.gif

Не высекается уголок :(

Боевая задача - использовать родные драйвера, которые в ПЗУ Монитора.
Вот тут в доках про 1Bh+01h+<00..1Fh> нету - http://retrocomputer.ru/RK/DOC/CTRLCODES.html

barsik
10.02.2017, 14:48
... не прокатило
Ну что Вы? Это Вы пошутили.

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

Вывести управляющий код как символ в РК86 корректным образом нельзя. Именно поэтому в знаконераторе (стандартном фонте) РК86 на месте управляющих кодов пустоты.

Вообще-то это явный просчёт авторов РК86, т.к при возможности иметь в фонте лишь 128 кодов, глупо терять кучу символов. Например, могли бы вместо пустот добавить в фонт сиволы 'Ё' и 'Ъ'. Кстати тратить код 0 впустую также глупо, т.к пробел делает то же самое. Замечу, что ввести теперь вместо "пустышек" в фонте какие-либо символы мы уже не можем, т.к такие пустые знакоместа используются как маркированные пустоты в программах, и если в фонте их заменить на какой-либо полезный символ, то в многих играх на экране возникнет "мазня".

Я недавно чуть "уплющил" код ПЗУ РК86. Для КР580 выиграл 20 байтов, а при удалении бесполезной директивы X и удалении в директиве G стоп-точки, освобождается ещё 80 байт. Ну а для ПЗУ РК86 на Z80 осовобождается целых 200 байт. В 20 байтов, а тем более в 100 байтов, засунуть один дополнительный искейп-код нетрудно. Я могу это сделать без проблем за 15 минут. Ещё проще ввести флаг игнорирования упр.кодов. Тогда при установке этого флага в неноль, все символы 0...127 будут печатными. Это расход 7-ми байтов в ПЗУ.

Что за дамп? Мне этот дамп следует ввести и дизассемблировать?


Увы не прокатило, по крайней мере, в симуляторе.

Что за симулятор? Наверное, имеется ввиду эмулятор РК86. Судя по вражеским сайтам, под симулятором в данной теме обычно понимают эмулятор только процессора, например 6502, непривязанный к архитектуре конкретной ЭВМ. В частности, эмуляторы CP/M по такой терминологии являются одновременно симуляторами, т.к тоже не привязан к конкретной ЭВМ. Симулятор обычно имеет отладчик и даже иногда интегрированную среду (т.е встроенный удобный редактор тестов с подстветкой и поиском синтаксических ошибок и возможность трансляции и запуска) и служит для обучения и проверки программ не привязанных к конкретным машинам. А эмулятор уже привязан к конкретной машине и служит для использования чужих программ на кросс-ЭВМ.


писать код определения платформы и вычисления адреса экранной области как-то бессмысленно...

Если Вы делаете универсальную программу РК/ОРИОН, то Вам в любом случае придётся делать определение типа машины. Т.к экранные координаты РК86 из-за его извращённого использования ВГ75 приходится пересчитывать (добавлять +3 и +8 к позициям POSY, POSX). Я с этим столкнулся, когда стал делать эмулятор РК86 и захотел перетранслировать на РК некоторые свои текстовые программки от ОРИОНА. Вместо универсальных программ я использовал условную трансляцию.

Например, в текстовом редакторе изменяется только работа с координатами POSX,POSY и подпрограммы ролика экрана вверх-вниз (что неизбежно для приличного экранного редактора, т.к перевыводить весь экран - тормознуто визуально, тогда как ролик, особенно стеком, - мгновенен). Так что вполне можно делать программы для РК86 и при необходимости перетранслировать их на ОРИОН и наоборот. А вот, чтобы сделать универсальную программу, придётся определять тип машины, т.к даже работа стандартных подпрограмм отличается.

Только, когда будете писать код определения РК86 и ОРИОНА, не опирайтесь на код ПЗУ, как делали некоторые авторы универсального софта для РК-платформы. В частности, программы МИКРОШИ, где программы делаются так, чтобы одна и та же программа работала и на МИКРОШЕ и на РК86. В МИКРОШЕ по адресу F800 стоит команда отличная от JMP F836H, что и используется как критерий. Если тут стоит код JMP F836H, то считается, что это РК86 и программа соответственно перенастривается.

Если Вы делаете программу для РК-платформы, учитывайте наличие кучи полу-клонов РК86. Они полу-клоны, потому что у них ПЗУ, его служебные ячейки, адреса В/У и экрана - разные.

Грамотно, хотя и сложно, определять тип машины по адресам портов. Размер ОЗУ 16 или 32 кб определяйте по текущему при старте программы стеку, а не по коду в ПЗУ. Т.к ПЗУ РК должно иметь возможность меняться. Можно определять тип РК-клона и по служебным ячейкам ПЗУ, в частности по абсолютным экранным координатам и по POSX,POSY (они во всех клонах имеют разные адреса, но работа ячеек одинаковая, т.к код ПЗУ нагло передирался от РК86).

Т.е, для детектирования можно использовать единственный искейп-код РК и клонов. Можно выдавать на консоль код 1B,59 и позиционировать курсор куда-то. А затем проверять ячейки "абсолютный экранный адрес" (в РК 7600) и координаты POSX,POSY (в РК 7602). Или же очищать экран кодом 1FH, что одновременно позиционирует курсор и выводить символ 'A' и затем искать его в началах экранов разных клонов РК86.

Если наплевать на клоны РК86, то отличить РК86 ещё проще. Для этого используется разница в работе в п/п-мы запроса положения курсора. Которая в РК86 и в ОРИОНЕ работает по разному.

В отличие от ОРИОНА, в РК86 несбалансированные подпрограммы позиционирования и запрос положения курсора. Логично, чтобы те же координаты, что задаются при позиционировании, возвращались и подпрограммой "Запрос положения курсора" (ASKCUR: F81E). Так и сделано в ОРИОНЕ.

Но в РК86 подпрограмма "Запрос положения курсора" (F81E) выдаёт значение координат, которое отличается от координат заданных при позиционировании на константы +8 +3.

Поэтому, чтобы узнать, что мы на РК86, достаточно куда-то позиционировать курсор с помощью управляющих кодов 1B,59, а затем вызвать п/п-му "Запрос положения курсора" (F81E). Если возвращённое число равно заданным координатам, значит мы на ОРИОНЕ. В противном случае - это какой-то из клонов РК86.

Denn
10.02.2017, 16:57
Ну что Вы? Это Вы пошутили.

И мне и Вам прекрасно известно, что в ПЗУ РК86 поддержан только один искейп-код 1B,59, других нет.

Отнюдь. Я грубо говоря вчера узнал что такое РК, да и то - по-наслышке. Знал бы, тему не создавал.



Вывести управляющий код как символ в РК86 корректным образом нельзя. Именно поэтому в знаконераторе (стандартном фонте) РК86 на месте управляющих кодов пустоты.

В итоге я тоже пришёл к этой мысли.



Я недавно чуть "уплющил" код ПЗУ РК86. Для КР580 выиграл 20 байтов, а при удалении бесполезной директивы X и удалении в директиве G стоп-точки, освобождается ещё 80 байт. Ну а для ПЗУ РК86 на Z80 осовобождается целых 200 байт. В 20 байтов, а тем более в 100 байтов, засунуть один дополнительный искейп-код нетрудно. Я могу это сделать без проблем за 15 минут. Ещё проще ввести флаг игнорирования упр.кодов. Тогда при установке этого флага в неноль, все символы 0...127 будут печатными. Это расход 7-ми байтов в ПЗУ.

Это здесь к чему?



Что за симулятор?

http://bashkiria-2m.narod.ru/index/emul/0-8



Если Вы делаете универсальную программу РК/ОРИОН, то Вам в любом случае придётся делать определение типа машины. Т.к экранные координаты РК86 из-за его извращённого использования ВГ75 приходится пересчитывать (добавлять +3 и +8 к позициям POSY, POSX).

Если я пользуюсь стандартными п/п Монитора (а я очень хочу пользоваться только ими!), то никаких отличий при позиционировании курсора на экране нет: что в РК, что в том же Орионе оно работает одинаково. Если речь про математику ПДП, то это не интересно.



Только, когда будете писать код определения РК86 и ОРИОНА...

Здесь тема только про вывод 07h.

Pyk
10.02.2017, 18:53
Боюсь, что barsik прав, и вывести этот код штатными средствами Монитора действительно нельзя. Если это поможет, могу подсказать еще один способ. Дело в том, что в первых двух ячейках системной области Монитора хранится адрес позиции видео-ОЗУ, в которой в настоящее время находится курсор. В РК-86, Партнере и Микроше это адреса 7600-7601H, но в Апогее - E100-E101, в а РК-86 16Кб - 3600-3601H.

HardWareMan
10.02.2017, 19:07
А перехватить вывод символа нельзя? Там же вроде хук был в ОЗУ. По крайней мере в Специалисте был и можно было подменить на печать на принтер.

uart
10.02.2017, 19:52
В любом случае F809 - медленно. И универсальный код для таких машин все равно бессмысленнен.

Denn
10.02.2017, 19:52
Джентльмены, всем спасибо, вопрос исчерпан - от идеи использовать псевдографику отказываюсь в пользу "порнографических" минусиков-плюсиков, зато которые "унисекс".

barsik
10.02.2017, 20:15
Если речь про математику ПДП...

Не знаю что за математика ПДП. Или Вы так обзываете наглые программы, которые нагло лезут в экранное ОЗУ. ПДП здесь не при чём. Программисту для чисто текстового режима не требуется знать о "железе", о микросхеме ПДП ВТ57, так как, каким способом символы визуализируются нас не волнует. Если Вы хотите делать универсальные программы РК-ОРИОНА, то Вам доступна всего одна функция, реализуемая искейп-кодом 1B,59. Таким образом Ваше нежелание определять тип машины, обрекает на усложнённые или убогие программы (убогие, в смысле без окон, а вывод рамок, как я понял, нужен для обрамления окон).

Поясняю. Подпрограммы F81E (запрос координат курсора) в РК и ОРИОНЕ отличаются, так что в универсальной программе это Вы использовать не сможете (посмотрите мой предыдущий пост). В РК86 есть п/п-мма RD_SYM (F821), позволяющая считывать символ с позиции курсора. Но в ОРИОНЕ такой подпрограммы нет. Таким образом чтобы в корректной и универсальной программе иметь окна, или придётся перевыводить весь экран заново по закрытию окна, или же иметь в ОЗУ свою текстовую копию экрана, что позволит по закрытию окна восстановить экран под окном.

Кстати, без определения типа клона РК86, Вы не сможете выводить цвет. Это ещё один довод в пользу определения типа машины для универсальных программ.


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


от идеи использовать псевдографику отказываюсь
Напрасно.

Pyk предложил отличный вариант решающий все Ваши проблемы. Но надо только определить тип машины РК+клон или ОРИОН. И если это РК или РК-клон, то просто позиционируете курсор на правый угол окна и из "ячейки абсолютного экранного адреса" 7600 (или E000, если это Апогей) считываете этот адрес и затем кладете по этому адресу код 7. И простейшим способом получается универсальная программа. Кстати, это одновременно способ "вычисления" экранного адреса по координатам.

Правда, при отказе от псевдографики, Ваша программа смогла бы работать и на других ЭВМ с входами в области F800. Интересно посмотреть полный список всех отечественных ЭВМ, что имеют ПЗУ F800 (тогда можно делать программы сразу для всех них).

Извиняюсь, что этот пост "вышел" уже после закрытия темы, но начал я его набирать до этого, пару часов назад. Если это так уж фатально, то модераторам следует удалить этот пост.

Denn
10.02.2017, 22:50
barsik, идея с практически халявным обнаружением адреса экранной области целевого символа и записью кода прямо в экран хороша, но не подходит.
К сожалению, я изначально не совсем корректно сформулировал задачу, сказав что мне это нужно на РК. Как раз основная задача - вывод не на конкретном ПК, а на разных машинах, без какой-либо привязки к аппаратной реализации вывода символов, используя только стандартные подпрограммы.
У одного РК два варианта ОЗУ, т.е. две разных реализации экрана! Если я для всех 8-биток буду подстраиваться под железо, то код вывода уголка получится больше самой программы, а это уже бессмыслица. Оно не стоит того.

NEO SPECTRUMAN
11.02.2017, 00:51
Вывод кода 07h стандартными подпрограммами Монитора (F809h и F818h) выводит звуковой сигнал, что в общем-то логично.
трипл феиспальм
никак не логично
подстраиваться под ненужные функции какого то дремучего стандарта в ущерб функциональности
при этом делать один и тот же комп с разной картой памяти
городить городуху чтоб комп стартовал не 0000h адреса для совместимости с каким то мифическим цпм под который ничего кроме компиляторов то и нет (вообще кто додумался лепить туда не ПЗУ изначально скажите мне????)
а потом ищо писать, что разработчик настоятельно рекомендует использовать стандартные подпрограммы пзу для обеспечения совместимости...

rw6hrm
11.02.2017, 09:38
Немного отвлеку от основной темы, но для РКшки уважаемый Alex_LG (http://zx-pk.ru/members/7683-alex_lg.html) уже давно сваял возможность загружаемого знакогенератора, http://zx-pk.ru/threads/20714-pomechtaem-ili-vopros-o-videovykhode.html?p=713206&viewfull=1#post713206 . Так что псевдографика немного устарела...

Stampmaker
11.02.2017, 10:04
возможность загружаемого знакогенератора,

не подходит, потому как


пишу ПО, которое обязано работать на совершенно разных железках