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. Но её нет.

Описал и проверил все нужные функции BIOS. Не рабоатет только PAINT.
Я просмотрел стандартные доки по ПК-01. Обнаружил любопытный момент. В версии #1 оператор PAINT в качестве процедуры из стандартного ПЗУ упоминается, там же упоминается злополучная переменная BRD_COLOR (но нигде не указан конкретный адрес ее размещения), однако в версии #2 (от 1990 года) оператор PAINT из описания ПЗУ уже напрочь исключен. Хм... Ради интереса я заглянул в тот образ ПЗУ, что идет с эмулем "Башкирия", нашел процедуру PAINT (0xE774), и увидел невооруженным глазом, что там зачем-то активно юзаются переменные 0xBEA3, 0xBEA4 и 0xBEA5, которые вообще-то отвечают за работу с магнитофоном. У меня возникло подозрение, что значение BRD_COLOR накладывается на переменную AUTOSTART по адресу 0xBEA3.

Что думаю по этому поводу знатоки и ценители? Где же на самом деле хранится значение 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 используется для закрашивания области экрана видеотерминала сплошным цветом.

Формат оператора:
<номер строки> PAINT (<Х - коорд>, <Y - коорд> ), <цвет> [, <граница>]
где <Х - коорд>, <Y - коорд> - выражения, значения которых равны соот­ветственно координате Х и координате Y - точки, с которой начинается закрашивание области;
<цвет> - выражение, задающее значение номера цвета закраски (если опущено, то используется цвет переднего плана, определенный ранее);
<граница> - выражение, определяющее номер цвета границы области закраски (если опущено, то номер цвета границы совпадает с номером цвета закраски).

Параметр <граница> указывается в том случае, если цвет закрашивания не совпадает с цветом границы закрашиваемой области. Точка начала закраски области может быть любой точкой внутри области (но не на границе). Оператор PAINT проверяет наличие границ только по вертикали и горизонтали - и объект признается ограниченным, если ограничены вертикаль и горизонталь. Но малейшая прореха в границе позволяет оператору PAINT "пролезть" наружу и там закрасить область экрана (а том числе и всего).
По коду дальше видно, что 0хBEA3 действительно может принимать независимое значение.

Так что, все сходится. Переменная BRD_COLOR прописана по адресу 0хBEA3, по которому одновременно проживает и AUTOSTART. Такая вот коммуналка.

Наличие явной баги составители доки отметили, но проблему в результате решили без затей: просто удалили описание процедуры PAINT. Это по-нашенски. Зато PAINT теоретически можно было бы использовать для создания каких-либо неожиданных эффектов при работе с магнитофоном. :D

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 теоретически можно было бы использовать для создания каких-либо неожиданных эффектов при работе с магнитофоном. :D
Скорее наоборот - можно было бы использовать загрузку с магнитофона для скрытого задания цвета границы фигуры при заливке.

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/