PC-01 Lviv

It is currently 28 Mar 2024, 22:56

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 5 posts ] 
Author Message
 Post subject: Оператор PAINT
PostPosted: 17 Dec 2012, 11:39 
Offline
User avatar

Joined: 11 Aug 2008, 17:05
Posts: 1405
Location: Украина
В этот пост призываются силы разума в лице 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?

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
PostPosted: 17 Dec 2012, 12:20 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Пока нет времени дизассемблировать, попробовал просто потыкать этот оператор в эумле. Так он вобще странно работает! Я зарисовывал прямоугольник с левым верхним углом (10,10). Так вот, если PAINT`у указать стартовую точку (15, 15) то он будет зарисовывать только от нее, т.е. не весь прямоугольник, а как бы вправо и вниз. Надо будет попозже поиграться детальнее.


Top
   
PostPosted: 17 Dec 2012, 13:49 
Offline
User avatar

Joined: 11 Aug 2008, 17:05
Posts: 1405
Location: Украина
Пересмотрел избранные реплики 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

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
PostPosted: 22 Jan 2013, 08:40 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Так в чем проблема то? Цвет границы для PAINT перед вызовом E774 пишем в BEA3 (ну и X, Y, цвет заливки в свои ячейки) и все работает.
Единственный сценарий использования, который приходит на ум и может вызвать "проблему":
1. Задаем все параметры PAINT, в т.ч. BEA3 и закрашиваем то, что нужно.
2. Загружаем что-нибудь (с автостартом или без).
3. Оставляем BEA3 как есть после загрузки, и пытаемся что-то заPAINTить. Если нужный цвет границы не 2 (после загрузки с автостартом) или не 0 (после загрузки без автостарта), то fail.

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


Top
   
PostPosted: 02 Aug 2020, 22:59 
Offline

Joined: 07 Dec 2010, 16:54
Posts: 227
Я не удивлюсь, что кто-то из разработчиков ошибся, там есть странная переменная 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 ? Причину мы уже не узнаем.....


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 5 posts ] 

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


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:
cron
Powered by phpBB® Forum Software © phpBB Limited