PC-01 Lviv http://pc01.lviv.ua/forum/ |
|
Оператор PAINT http://pc01.lviv.ua/forum/viewtopic.php?f=22&t=210 |
Page 1 of 1 |
Author: | liberation [ 17 Dec 2012, 11:39 ] |
Post subject: | Оператор PAINT |
В этот пост призываются силы разума в лице ivagor и sadfsdfsdaf! Работа оператора PAINT меня заинтересовала после сообщения vinxru на форуме zx.pk.ru, где он прямо пишет: Quote: В справке написано, что надо записать цвет границы в переменную BRD_COLOR. Но её нет.
Я просмотрел стандартные доки по ПК-01. Обнаружил любопытный момент. В версии #1 оператор PAINT в качестве процедуры из стандартного ПЗУ упоминается, там же упоминается злополучная переменная BRD_COLOR (но нигде не указан конкретный адрес ее размещения), однако в версии #2 (от 1990 года) оператор PAINT из описания ПЗУ уже напрочь исключен. Хм... Ради интереса я заглянул в тот образ ПЗУ, что идет с эмулем "Башкирия", нашел процедуру PAINT (0xE774), и увидел невооруженным глазом, что там зачем-то активно юзаются переменные 0xBEA3, 0xBEA4 и 0xBEA5, которые вообще-то отвечают за работу с магнитофоном. У меня возникло подозрение, что значение BRD_COLOR накладывается на переменную AUTOSTART по адресу 0xBEA3.Описал и проверил все нужные функции BIOS. Не рабоатет только PAINT. Что думаю по этому поводу знатоки и ценители? Где же на самом деле хранится значение BRD_COLOR? |
Author: | Zelya [ 17 Dec 2012, 12:20 ] |
Post subject: | Re: Оператор PAINT |
Пока нет времени дизассемблировать, попробовал просто потыкать этот оператор в эумле. Так он вобще странно работает! Я зарисовывал прямоугольник с левым верхним углом (10,10). Так вот, если PAINT`у указать стартовую точку (15, 15) то он будет зарисовывать только от нее, т.е. не весь прямоугольник, а как бы вправо и вниз. Надо будет попозже поиграться детальнее. |
Author: | liberation [ 17 Dec 2012, 13:49 ] |
Post subject: | Re: Оператор PAINT |
Пересмотрел избранные реплики sadfsdfsdaf [#1, #2]. Оказывается, сам по себе оператор PAINT расположен в ПЗУ по адресу 0xE748, где код начинается так: Code: E748: LDA BE52 E74B: STA BEA3Что совпадает с тем, что написано в мануале по Бэйсику: Quote:
Оператор PAINT используется для закрашивания области экрана видеотерминала сплошным цветом.
По коду дальше видно, что 0хBEA3 действительно может принимать независимое значение.Формат оператора: <номер строки> PAINT (<Х - коорд>, <Y - коорд> ), <цвет> [, <граница>] где <Х - коорд>, <Y - коорд> - выражения, значения которых равны соответственно координате Х и координате Y - точки, с которой начинается закрашивание области; <цвет> - выражение, задающее значение номера цвета закраски (если опущено, то используется цвет переднего плана, определенный ранее); <граница> - выражение, определяющее номер цвета границы области закраски (если опущено, то номер цвета границы совпадает с номером цвета закраски). Параметр <граница> указывается в том случае, если цвет закрашивания не совпадает с цветом границы закрашиваемой области. Точка начала закраски области может быть любой точкой внутри области (но не на границе). Оператор PAINT проверяет наличие границ только по вертикали и горизонтали - и объект признается ограниченным, если ограничены вертикаль и горизонталь. Но малейшая прореха в границе позволяет оператору PAINT "пролезть" наружу и там закрасить область экрана (а том числе и всего). Так что, все сходится. Переменная BRD_COLOR прописана по адресу 0хBEA3, по которому одновременно проживает и AUTOSTART. Такая вот коммуналка. Наличие явной баги составители доки отметили, но проблему в результате решили без затей: просто удалили описание процедуры PAINT. Это по-нашенски. Зато PAINT теоретически можно было бы использовать для создания каких-либо неожиданных эффектов при работе с магнитофоном. |
Author: | ivagor [ 22 Jan 2013, 08:40 ] |
Post subject: | Re: Оператор PAINT |
Так в чем проблема то? Цвет границы для PAINT перед вызовом E774 пишем в BEA3 (ну и X, Y, цвет заливки в свои ячейки) и все работает. Единственный сценарий использования, который приходит на ум и может вызвать "проблему": 1. Задаем все параметры PAINT, в т.ч. BEA3 и закрашиваем то, что нужно. 2. Загружаем что-нибудь (с автостартом или без). 3. Оставляем BEA3 как есть после загрузки, и пытаемся что-то заPAINTить. Если нужный цвет границы не 2 (после загрузки с автостартом) или не 0 (после загрузки без автостарта), то fail. Коммунальное использование переменных конечно нехорошо, но в данном случае мне кажется не критичным. Quote: Зато PAINT теоретически можно было бы использовать для создания каких-либо неожиданных эффектов при работе с магнитофоном.
Скорее наоборот - можно было бы использовать загрузку с магнитофона для скрытого задания цвета границы фигуры при заливке.
|
Author: | sadfsdfsdaf [ 02 Aug 2020, 22:59 ] |
Post subject: | Re: Оператор PAINT |
Я не удивлюсь, что кто-то из разработчиков ошибся, там есть странная переменная 0BE3Ah, которая инициализируется при старте: Code: ROM:E0E3 2E 38 mvi l, BORDER - SYS_VARS ; байт заполнения рамки ROM:E0E5 36 0F mvi m, 0Fh ; BORDER = 0Fh (подряд 4 точки цвета 1 ROM:E0E5 ; - это "синий" для палитры по умолчанию) ROM:E0E7 ROM:E0E7 ROM:E0E7 23 inx h ROM:E0E8 23 inx h ROM:E0E9 36 01 mvi m, 1 ; ??? BE3A ???Но кто-то ошибся и стал использовать 0BEA3h ? Причину мы уже не узнаем..... |
Page 1 of 1 | All times are UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |