PDA

Просмотр полной версии : Печать текста.



boo_boo
29.03.2006, 23:19
Пожалуйста, подскажите, каким образом можно организовать печать текста на экране не по RST 16. Приводить здесь код не обязательно, достаточно лишь общее описание алгоритма.. Сам я что-то в затруднении.. :v2_conf2: по координатам x,y вычислить адрес верхнего байта знакоместа, (*) взять код символа, по коду символа и адресу фонта найти адрес первого из 8и байт графики символа. взять байт символа, положить в экранный адрес, перейти к следующему байту символа и адресу в экране на пиксел ниже, и так 8 раз. перейти к экранному адресу для следущего символа, повторять все это, начиная с (*), до тех пор, пока строка не закончится.

fk0
30.03.2006, 11:15
Построчно будет быстрей. Т.е. вначале верхняя строка всей строки, потом вторая и т.п.

CityAceE
30.03.2006, 14:15
Например, если я использую стандартный шрифт, размещающийся с адреса 15616 (тоже, кстати, непонятно - ведь для запуска TR-DOS мы обращаемся из Бейсика по этому адресу, а там - шрифт) и мне нужно вывести на печать символ, например "H" (код 72) .
Каждый символ в ПЗУ занимает 8 байт. Шрифт начинается с символа пробела. Его код - 32. Значит реальное начало шрифта, то есть символа с кодом 0, находится по адресу 15616-32*8. Чтобы получить адрес буквы "Н" в шрифте очевидно нужно сделать так: (15616-32*8)+(72*8). Следующие за этим адресом 8 байт и будут составляющие символа Н.

Что же касается TR-DOS, то контроллер Beta Disk устроен так, что при попытке перехода на определённую область адресов ПЗУ, в которую как раз и входит упомянутый адрес 15616, включается ПЗУ TR-DOS, которое заменяет собой стандартное ПЗУ с Бейсиком. А в ПЗУ TR-DOS по этим адресам находтся уже не шрифт, а код программы работы с дисководом.

Wlodek
30.03.2006, 15:03
Общий принцип такой:
Физический адрес видеопамяти:
Адрес=16384+2048*I+32*J+256*K+X,
где:
I=0...2 - номер трети экрана (сверху вниз);
J=0...7 - номер строки символов в трети (сверху вниз);
K=0...7 - номе линии (байта) в символе (сверху вниз);
X=0...31 - номер знакоместа в строке (слева направо).

Sayman
22.11.2008, 17:29
Построчно будет быстрей. Т.е. вначале верхняя строка всей строки, потом вторая и т.п.
интересно, это как? кто нить подскажет как такое могет быть?

GriV
22.11.2008, 19:06
Когда работаешь со стандартным набором - 8 бит в ширину и точность вывода 1 знакоместа разницу заметить трудно. Когда же делаешь точность печатания до пиксела + нестандартная длина, действительно удобнее..

Sayman
22.11.2008, 19:55
я поясню, когда надо вывести чисто текст, длина которого от одной строки к другой меняется, да ещё эскейп последовательности, то почему то мне в голову приходит что вариант вывода построчно отпадает. т.е. если вести речи о драйвере, то вапще отпадает...

Splinter
02.12.2008, 22:13
вобще то все проста как мандарин. если нет заморочек со шрифтом 42 в строке (тут придется юзать сдвиги), то,

1) считать код символа
2) найти его в таблице знакогенератора
3) перебросить в последнее свободное знакоместо
4) если не конец строки, то исх адрес +1
4a) если конец строки, то DOWN HL и HL-32
4b) если конец экрана, то scroll

грубо, но в целом так....

Добавлено через 2 минуты
чуть не забыл, HL подразумеваю адрес назначения доставки символа из знакогенератора

Sayman
03.12.2008, 16:00
перебросить в последнее свободное знакоместо
это немного не то...это не строчный вывод символов, а обычный посимовльный.

James DiGreze
09.12.2008, 14:27
я поясню, когда надо вывести чисто текст, длина которого от одной строки к другой меняется, да ещё эскейп последовательности, то почему то мне в голову приходит что вариант вывода построчно отпадает. т.е. если вести речи о драйвере, то вапще отпадает...Легко + более рационально.
Сначала "печатаем" в линейный буфер, по коду CR перекидываем буфер на экран.
общий алгоритм такой:
есть переменные х,у,с (где с-цвет)
есть внутренняя переменная ф (флаг текущей операции)
есть процедура типа рст№10
есть буфер на 256 байт (8х32)

изначально переменные = 0
на вход процедуры последовательно начинаем пихать коды символов и управляющие, где, например: 13 - вывести буфер на экран, 14 - установить цвет (после этого кода идет код цвета), 15 - установить координаты (следом два байта координат).


Процедура Печать(код)
Если ф = 0 Тогда
Если код = 13 Тогда
ВывестиБуферНаЭкран()
ИначеЕсли код = 14 Тогда
ф = 1
ИначеЕсли код = 15 Тогда
ф = 2
Иначе
ПереписатьОбразСимволаВБуфер(код)
КонецЕсли
ИначеЕсли ф = 1 Тогда
с = код
ф = 0
ИначеЕсли ф = 2 Тогда
х = код
ф = 3
ИначеЕсли ф = 3 Тогда
у = код
ф = 0
Иначе
АбнормалПрограммТерминатион() // :-D
КонецЕсли
Возврат
КонецПроцедуры

надеюсь понятно выразил свои мысли ;)

Barmaley_m
11.12.2008, 15:48
Построчный вывод текста имеет смысл только в случае, если используется шрифт с числом символов в строке, не кратным 32 (обычно 42, 51 или 64). Данный способ позволяет ускорить работу процедуры за счет того, что можно исключить некоторые операции считывания из видеопамяти и/или логические операции (AND/OR). Но при выводе 32 символов в строке все эти проблемы все равно не возникают.

Построчный вывод, насколько мне известно, впервые был реализован Andrew Strikes Code в его музыкальном редакторе ASM.

James DiGreze
12.12.2008, 07:10
Есть специфические случаи при которых построчный вывод практически единственный возможный. Например пропорциональная печать или печать в окнах.

drbars
12.12.2008, 10:10
А зачем юзать RST, если можно свою процедуру написать. Оно и быстрее и к переменным непривязано.

Barmaley_m
12.12.2008, 16:08
Есть специфические случаи при которых построчный вывод практически единственный возможный. Например пропорциональная печать или печать в окнах.

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

Может быть, если речь идет о выравнивании правого края - тогда да, только построчно. Потому что до того, как строка закончится, неизвестно, какие делать промежутки между словами. Но и тут не обязательно печатать сначала в буфер, а потом переносить изображение на экран. Это неэффективно. Лучше запоминать в буфере символы, а потом выводить их на экран за раз.

Shadow Maker
13.12.2008, 14:57
Я совершенно согласен с Barmaley_m. Вообще не понимаю, какой смысл так тормозить процедуру вывода. К примеру можно даже универсальную процедуру печати сделать - на любую ширину символа - по сути принцип работы будет тот же - берется строчка из экрана, смещается в нужную позицию символ и делается XOR/AND/XOR этого символа для двух или одного знакоместа. Нафига тут огород городить мне лично непонятно...

Vitamin
13.12.2008, 15:18
Потому что до того, как строка закончится, неизвестно, какие делать промежутки между словами.
А что, промежутки между словами обязательно в реалтайме высчитывать?
У меня в QHTS реализована посимвольная печать пропорциональным шрифтом. Сначала в буфер, ибо строки могут быть очень длинными, а дополнительные проверки на переполнение займут больше времени, нежели переброска. А насчет выравнивания- прекомпиляция со вставкой пробелов нужной длины (с точностью до пиксела) плюс автоматическая расстановка переносов:)

Barmaley_m
17.12.2008, 02:36
А что, промежутки между словами обязательно в реалтайме высчитывать?

Если содержимое текста, который выводится, заранее неизвестно - то да, только в реалтайме.

Если это текст из файла, и промежутки в нем заранее рассчитаны и сохранены вместе с текстом - тогда можно сэкономить.

Vitamin
17.12.2008, 08:48
Если содержимое текста, который выводится, заранее неизвестно - то да, только в реалтайме.
Я имею в виду в реалтайма во время печати

Barmaley_m
17.12.2008, 15:58
Я имею в виду в реалтайма во время печати

Объясни подробнее, а то мне что-то непонятно, чем различаются мои и твои представления о "реалтайме".

Vitamin
17.12.2008, 18:24
Объясни подробнее, а то мне что-то непонятно, чем различаются мои и твои представления о "реалтайме".
В какой момент ты расстанавливаешь пробелы для выравнивания? Во время печати или до?

Barmaley_m
17.12.2008, 18:50
Я даже не представляю, как можно расставлять пробелы во время печати в случае выравнивания правого края.

Разумеется, до. Когда сформировалась полная строка, тогда только становится ясно, какой ширины должны быть пробелы.

James DiGreze
18.12.2008, 10:30
Я лично делал процедуру печати символов в окнах, работающую посимвольно, а не построчно.Как говорится: на вкус и цвет...
Ты лучше скажи, чем "твой" подход удобнее "моего", так сказать для конечного потребителя, т.е. печатающей программы? Явных преимуществ "твоего" я не вижу. Может быть быстродействие выше, но тоже не факт, особенно с учетом конечной отрисовки на экране. А в целом, оба подхода имеют право на жизнь, просто в каких-то применениях будет удобнее более простой "твой" подход, в более сложных случаях - "мой". Так что... не вижу смысла спорить. ;)

Shadow Maker
21.09.2015, 20:44
Вот я тоже хочу пропорциональную печать. Знаю у Витамина в QHT была. Но там какой-то аласм на трд-дискетке, чет я пока не хочу туда копаться.

А еще кто делал?

shurik-ua
22.09.2015, 01:16
А еще кто делал?
Первый раз узнал о пропорциональной печати из пакета программ "Instruments v 4.01", потом оттуда же и выдрал процедуру печати. Правда это было лет 15 назад - поэтому скорее всего та процедура не особо оптимизирована.

Shadow Maker
22.09.2015, 02:10
Ну зачем такую древность, наверное кто-то писал уже что-то более адекватное за эти годы.

James DiGreze
22.09.2015, 07:53
Делал лет 15 назад, но сейчас наверно только в бумажном виде сохранилось.
В принципе повторить не сложно, но нужно хотя бы в общих чертах представлять область применения.

Shadow Maker
22.09.2015, 09:17
Я не понял. Процедура для печати в любом месте экрана (можно по Y прибитому к знакоместам, по X в любом месте).

Vitamin
22.09.2015, 19:49
Вот я тоже хочу пропорциональную печать. Знаю у Витамина в QHT была. Но там какой-то аласм на трд-дискетке, чет я пока не хочу туда копаться.
Была и есть. С обработкой (жирно/наклонно/подчеркивание/зачеркивание) и цветом. Весьма быстрая.

А еще аж джве процедуры были в ZX-Ревю.

Barmaley_m
24.09.2015, 01:13
Как говорится: на вкус и цвет...
Ты лучше скажи, чем "твой" подход удобнее "моего",
При чем здесь то, какой подход лучше? Я просто возразил тому, что твой подход является единственно возможным. Ты сказал ранее:

Есть специфические случаи при которых построчный вывод практически единственный возможный. Например пропорциональная печать или печать в окнах.
А на самом деле можно в обоих вышеприведенных случаях печатать и посимвольно.

Преимущества того или иного подхода - это отдельный вопрос, и я в его обсуждение пока не включался.

---------- Post added at 01:13 ---------- Previous post was at 01:09 ----------

А вообще предлагаю объявить конкурс на самую быструю процедуру печати шрифтами по 32, 42, 51 символов в строке, или пропорциональным шрифтом. Аналогично тому, как вылизывали процедуры для синуса в соответствующей теме. Ведь получились умопомрачительно гениальные варианты!