2.6 УПРАВЛЕНИЕ ЦВЕТОМ БОРДЮРА
При работе в машинном коде здесь есть небольшая сложность,
заключающаяся в том, что для изменения цвета бордюра требуется
два действия, т.к. к этой цели ведут два пути.
Дело в том, что существует текущий цвет бордюра (тот, ко-
торый Вы в данный момент видите на экране) и есть установленный
цвет бордюра (тот, который записан в памяти компьютера и будет
установлен, как только ПЗУ компьютера перехватит управление от
Вашей программы в машинных кодах, например при нажатии
какой-либо клавиши).
Ваша задача состоит в изменении обоих цветов - и текущего
и установленного, т.к. изменение только текущего будет иметь
кратковременный характер, а изменение только установленного
вообще никак не отразится на экране в данный момент.
Текущий цвет бордюра изменяется выдачей байта по 254-ому
внешнему порту (бордюрная часть экрана является для "Спектрума"
внешним устройством, подключенным к порту FEH). Это можно
сделать даже из БЕЙСИКа, воспользовавшись командой OUT:
OUT 254,цвет
В машинном коде эта команда выглядит удивительно похоже:
LD A,цвет
OUT (FEH),A
Установленный цвет бордюра, с которым работает ПЗУ, посто-
янно хранится в отведенной для него ячейке памяти в области
системных переменных. Ее название - BORDCR. Ее адрес - 23624
(5C48H). Три бита этой переменной отвечают за цвет бордюра:
г===T===T===T===T===T===T===T===¬
¦ X ¦ X ¦BRD¦BRD¦BRD¦ X ¦ X ¦ X ¦
L===¦===¦===¦===¦===¦===¦===¦===-
Прочие биты занимаются другими делами, в частности, они
задают цвет нижней части экрана, используемой для работы INPUT
и пр.
Оба переключения одновременно можно сделать вызовом проце-
дуры ПЗУ BORDER_A, расположенной по адресу 2297H (8855). Пред-
варительно код цвета надо установить в аккумуляторе процессора.
У нее есть и побочное воздействие. Если при вызове этой проце-
дуры что-то содержится в системных нижних двух строках компью-
тера, то она обойдется с ними достаточно "гуманно". Чтобы бор-
дюр не скрыл информацию, цвет INK этих строк будет установлен
контрастным к цвету бордюра.
2.7. ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ
128-КИЛОБАЙТНЫХ МАШИН
"Спектрумы" со 128 килобайтной памятью имеют не одну, а
две экранных области. (См. "ZX-РЕВЮ", N1,с.4; N2, с.26; М.:
ИНФОРКОМ, 1991), каждая из которых может быть использована для
хранения изображения, если Вы работаете в режиме 128К.
Первая экранная область, как обычно занимает адреса 4000H
- 5AFFH, а вторая расположена в адресах C000H - DAFF на седьмой
странице оперативной памяти. Первая область называется нулевым
экраном, а вторая - первым экраном. Очевидно, что только одна
область из двух может быть воспроизведена на экране телевизора
в данный момент.
Раскладка экрана-1 точно такая же, как и экрана-0 и мы
можем считать, что разница состоит во-первых в 15-ом бите, а
во-вторых в том, что он расположен не на нулевой странице ОЗУ,
а на седьмой.
Если развернуть регистровую пару HL в виде шестнадцати
битов, то получится побитовая карта для дисплейных файлов,
приведенная ниже на Рис. 14.
H L
-------------+-------------¬ --------------+-------------¬
¦ ¦ ¦ ¦
г==T===T===T===T===T===T===T===T===T===T===T===T===T===T===T==¬
¦X ¦ 1 ¦ 0 ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X ¦ X¦
L==¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦==-
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ L----- L-------- L-------- L----------------
Номер Номер Номер Номер Номер столбца
экрана сегмента линии ряда
0...1 0...2 0...7 0...7 0 ... 31
Рис. 14
Тот экран, который в настоящее время задействован, называ-
ется активным. Обратите внимание на интересную особенность пер-
вого (дополнительного) экрана. После того, как он был задейст-
вован, уже нет необходимости седьмой странице ОЗУ оставаться
"впечатанной". Т.е. экран-1 может оставаться активным незави-
симо от того, какие страницы ОЗУ "впечатаны" в данный момент.
Есть еще одна особенность: процедуры ПЗУ могут работать
только с нулевым (основным) экраном. Они не умеют печатать и
рисовать на втором экране. Ни PLOT ни PRINT, ни DRAW ни даже
машиннокодовая команда RST 10H не работают с первым экраном. С
ним не работают ни автоматический листинг, ни система
редактирования, ни INPUT.
"Спектрум-128", как это ни странно, не содержит в своем
ПЗУ-128 совершенно ничего, чтобы переключаться с одного экрана
на другой и пользователю приходится самому писать для этого
процедуру, например такую, как показано ниже. Точками входа в
нее являются метки SCR_0 и SCR_1, соответствующие тому, какой
экран Вы хотите вызвать.
1E00 SCR_0 LD E,00 ; Все биты выключены.
1802 JR SELECT ; Переход на переключение
экрана.
1E08 SCR_1 LD E,08 ; Включен бит-3.
3A5C5B SELECT LD A,(BANK_M); Системная переменная
; BANK_M (5B5CH) - служит
; в 128-килобайтных маши-
; нах как указатель стра-
; ниц ОЗУ, ПЗУ, экрана и
; режима (см. рис. 15).
; За номер экрана отвеча-
; ет бит 3.
E6F7 AND F7 ; Включили все биты в ак-
; кумуляторе, кроме 3-го.
B3 OR E ; Третий бит включается
; или выключается в зави-
; симости от того, через
; какую точку мы вошли в
; эту процедуру.
325С5B LD (BANK_M),A; Переключили BANK_M на
; экран-1. Но он еще не
; активен. Это только под-
; готовка.
01FDF7 LD BC,7FFD ; Установили в BC номер
; внешнего порта, служа-
; щего для физического
; переключения страниц и
; режимов.
ED79 OUT (C),A ; Переключение экрана.
C9 RET ; Выход
Примечание: Обязательный порядок всех переключений в 128-х
машинах - сначала перенастраиваем BANK_M и только потом выдаем
команду по порту 7FFD. Системные прерывания компьютера вызывают
запуск его процедур ПЗУ, которые, заканчивая работу, выдают по
порту 7FFD содержимое BANK_M. Так что, если Вы будете делать
наоборот, есть высокая степень вероятности, что у Вас ничего не
получится. Правда, из машинного кода прерывания можно и
отключать (см. "Первые шаги в машинном коде").
7 6 5 4 3 2 1 0
г===T===T===T===T===T===T===T===¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L=T=¦=T=¦=T=¦=T=¦=T=¦=T=¦=T=¦=T=-
L-T-- ¦ ¦ ¦ L---+----
Не используются---- ¦ ¦ ¦ ¦
¦ ¦ ¦ Номер страницы ОЗУ
Переключатель режимов---- ¦ L--- Номер экрана
128 К / 48 К ¦
Номер страницы ПЗУ
Рис. 15 Системная переменная BANK_M (5B5CH - 23388).
И еще одно предостережение для тех, кто работает с RAM-
диском на 128-килобайтных машинах (о RAM-диске см. "ZX-РЕВЮ",
N12,с.235-240; М.:ИНФОРКОМ, 1991.). Когда Вы выгружаете что-
либо в RAM-диск, используя для этого новую команду SAVE!, файлы
сохраняются в памяти в виде стека - один над другим. Начало
области - 1C000 и далее вверх до 1FFFF, потом с 3C000 по
3FFFF, с 4C000 по 4FFFF, с 6C000 по 6FFFF и, наконец, с 7C000 и
вверх.
Одновременно с этим образуется второй стек. Он начинается
в адресе 7EBFF и развивается вниз. В нем содержатся только
имена и адреса файлов, выгруженных на RAM-диск. Короче говоря,
этот стек содержит ту информацию, которую Вы получаете,
воспользовавшись новой командой CAT! . Таким образом, эти два
стека развиваются навстречу друг другу. Встречаться они не
должны. При появлении такой опасности компьютер выдаст
сообщение об ошибке "4 Out of memory". Стек каталога не может
также опуститься ниже 7C000 - именно поэтому установлено
ограничение на количество сохраняемых файлов - 562.
Итак, все сделано, чтобы эти стеки не встретились и не
испортили друг друга, но ничего не сделано для того, чтобы они
не затерли экран-1. Этот экран может быть испорчен как стеком
файлов, так и каталожным стеком. И даже наоборот, работая с
экраном-1, Вы можете испортить эти стеки.
Будьте внимательны. Работая в машинном коде, использовать
экран-1 можно только если Вы не очень активно используете
виртуальный диск. Смело можете хранить до 216 файлов
с суммарной длиной не более 64К.