В части 1 мы уже говорили о том, что для печати символов на экране используется команда процессора RST 010 (код D7 HEX) . Она вызывает исполнение системной процедуры из ПЗУ, которая и выполнит печать нужного Вам символа. Правда, прежде, чем обращаться к RST010, Вы должны предусмотреть, чтобы код того символа, который Вы хотите напечатать, был помещен в аккумулятор. Коды всех символов, управляющих кодов, символов графики пользователя, токенов ключевых слов Вы можете найти в "Справочнике ..." (ч. 3, табл . 1) .
Для того, чтобы выполнить печать, надо предварительно решить три вопроса:
- что печатать (какой символ, найти его код) ;
- как печатать (каким цветом, на каком фоне);
- где печатать;
Вы знаете, что экран "Спектрума" имеет 24 строки по 32 позиции, причем нижние две строки являются системным окном для вывода сообщений от операционной системы и печать в этих строках требует специальных ухищрений, а лучше пока там не печатать .
Все эти вопросы решаются помещением в аккумулятор нужного кода и вызовом RST 010.
Рассмотрим конкретный пример. Допустим, Вы хотите напечатать в центре экрана фразу "ZX-Spectrum", причем выполнить ее желтым цветом по синему фону.
Это значит, что позиция начала печати должна быть AT 11,10 -двенадцатая строка сверху ( с учетом нулевой ) и одиннадцатая колонка слева.
Цветовые коды должны быть установлены: INK = 6 ( желтые буквы) ; PAPER = 1 ( синий фон) .
Но прежде, чем начинать печать на экране, надо открыть канал экрана и очистить экран.
Канал открывается вызовом системной процедуры ПЗУ
"CHAN_OPEN", находящейся по адресу 1601, а очистка экрана -процедурой "Clear LINES", находящейся по адресу 0Е44.
6502 |
3E02 |
LD |
A,02 |
6592 |
CD0116 |
CALL |
1601 |
6595 |
0618 |
LD |
B, 18 |
6597 |
CD4 4 0E |
CALL |
0E4 4 |
659A |
3E16 |
LD |
A,16 |
65 9C |
D7 |
RST |
10 |
65 9D |
3E0B |
LD |
A, 0B |
65 9F |
D7 |
RST |
10 |
65A0 |
3E0A |
LD |
A, 0A |
65A2 |
D7 |
RST |
10 |
65A3 |
3E11 |
LD |
A,11 |
65A5 |
D7 |
RST |
10 |
65A6 |
3E10 |
LD |
A,01 |
65A8 |
D7 |
RST |
10 |
65A9 |
3E10 |
LD |
A,01 |
65AB |
D7 |
RST |
10 |
65AC |
3E0 6 |
LD |
A,0 6 |
65AE |
D7 |
RST |
10 |
65AF |
3E5A |
LD |
A, 5A |
65B1 |
D7 |
RST |
10 |
65B2 |
3E5 8 |
LD |
A,58 |
65B4 |
D7 |
RST |
10 |
65B5 |
3E2D |
LD |
A,2D |
65B7 |
D7 |
RST |
10 |
65B8 |
3E7 3 |
LD |
A,7 3 |
65BA |
D7 |
RST |
10 |
65BB |
3E7 0 |
LD |
A,7 0 |
65BD |
D7 |
RST |
10 |
65BE |
3E65 |
LD |
A,65 |
65C0 |
D7 |
RST |
10 |
65C1 |
3E63 |
LD |
A,63 |
65C3 |
D7 |
RST |
10 |
65C4 |
3E7 4 |
LD |
A,7 4 |
Открываем канал "S"
Количество очищаемых строк (2 4DEC) Очистка 24-х строк
В акк-р помещаем управл. код AT за которым пойдут координаты позиции печати
Вывод кода AT
Установка номера строки (11)
Ввод номера строки
Установка номера столбца
Ввод номера столбца
Установка кода PAPER
Ввод кода PAPER
Установка цвета фона
Ввод цвета фона (синий = 1)
Установка кода INK
Ввод кода INK
Установка цвета символов
Ввод цвета символов (желтый = 6)
Установка кода буквы Z
Печать буквы "Z"
Установка кода буквы "X"
Печать буквы "X"
Установка кода знака "-"
Печать знака "-"
Установка кода буквы "s"
Печать знака "s"
Установка кода буквы "p"
Печать буквы "p"
Установка кода буквы "e"
Печать буквы "e"
Установка кода буквы "с"
Печать буквы "с"
Установка кода буквы "t"
АДРЕС |
МАШ.КОД |
МНЕМОНИКА |
65С6 |
D7 |
RST |
10 |
65С7 |
3E72 |
LD |
A, 72 |
65C9 |
D7 |
RST |
10 |
65CA |
3E7 5 |
LD |
A, 75 |
65CC |
D7 |
RST |
10 |
65CD |
3E6D |
LD |
A, 6D |
65CF |
D7 |
RST |
10 |
65D0 |
C9 |
RET |
|
КОММЕНТАРИЙ печать буквы "t" Установка кода буквы "r" Печать буквы "r" Установка кода буквы "u" Печать буквы "u" Установка кода буквы "m" Печать буквы "m" Возврат
Запускается данная процедура RANDOMIZE USR 2 6000.
Теперь мы можем поэкспериментировать с кодами управления печатью. Вы, конечно, знаете, какую роль играет разделитель <,> (ЗАПЯТАЯ) в оператре БЕЙСИКа PRINT. Она вызывает печать того, что за ней стоит на другой половине экрана. Код этого управляющего символа 06. Попробуйте заменить по адресу 65B6 код 2D (знак минус) на код 06 и снова запустить процедуру RANDOMIZE USR 26000.
Теперь попробуйте поставить туда же код 0D (ENTER, он же СR - CARRIDGE RETURN = ВОЗВРАТ КАРЕТКИ, он же "КОНЕЦ СТРОКИ") и опять стартуйте процедуру.
Если все, что Вы сделали, выглядит для Вас понятным, но достаточно скучным, то отметим, что в ПЗУ "Спектрума" есть и более мощная процедура для печати. Она позволяет печатать сразу целые строки ("стринги"), называется PR-STRING и находится по адресу 2 03С. Это процедура более высокого уровня, чем RST 10 и при своей работе использует обращения к RST 10, как к подпрограмме .
Чтобы использовать эту процедуру, надо в регистр DE загрузить адрес, в котором начинается тот текст, котрый Вы хотите выдать на печать (с управляющими кодами AT, TAB, INK, PAPER и др.) . Длина этой строки помещается в пару BC, а вызывается процедура CALL 2 03C.
Для справки мы даем здесь текст этой процедуры.
АДРЕС МАШ.КОД МНЕМОНИКА КОММЕНТАРИЙ
2 03С 78 LD A, B Это проверка BC на 0, т. е. напе-
203D B1 OR C чатана вс строка или нет
DEC BC Уменьшение счетчика на единицу.
RET Z Если в счетчике был 0, т.е. вся
строка напечатана, то выход. LD A, (DE) Загрузка в акк-р очередного
символа из Вашей строки. INC DE Переход к очередному символу.
RST 10 Печать символов.
JR 203C Переход для повтора.
2 03E 0B 2 03F C8
2 040 1A
2041 |
13 |
2042 |
D7 |
2043 |
18F7 |
Давайте с помощью этой процедуры распечатаем ту же фразу ZX-spectrum с теми же атрибутами в том же месте экрана.
Длина нашей строки = 11 печатных символов + 3 кода управления (AT, INK, PAPER) + 2 числа установки позиции начала печати + 2 числа установки цветовых атрибутов = 18 (12HEX) .
АДРЕС МАШ.КОД
6590 |
011200 |
LD |
BC , |
0012 |
В BC загружается длина |
6593 |
119A65 |
LD |
DE , |
65 9A |
В DE - адрес начала стр |
6596 |
CD3C2 0 |
CALL 2 |
03C |
Вызов процедуры печати |
6599 |
C9 |
RET |
|
|
Возврат в вызывающую пр |
659A |
16 |
|
|
|
"AT" |
659B |
0B |
|
|
|
Строка 11. |
65 9C |
0A |
|
|
|
Столбец 10. |
65 9D |
11 |
|
|
|
"PAPER" |
659E |
01 |
|
|
|
Цвет синий. |
65 9F |
10 |
|
|
|
"INK" |
65A0 |
06 |
|
|
|
Цвет желтый. |
65A1 |
5A |
|
|
|
Z |
65A2 |
58 |
|
|
|
X |
65A3 |
2D |
|
|
|
|
65A4 |
73 |
|
|
|
s
p |
65A5 |
70 |
|
|
|
65A6 |
65 |
|
|
|
e |
65A7 |
63 |
|
|
|
с |
65A8 |
74 |
|
|
|
t |
АДРЕС МАШ.КОД МНЕМОНИКА КОММЕНТАРИЙ
65A9 72 r
65AA 75 u
65AB 6D m