Установка и сброс битов
До сих пор все команды, с которыми мы работали, включали обработку 8-битовых или
16-оитовых чисел.
Группа "установка и сброс битов" позволяет нам обрабатывать отдельные биты регистров
и/или содержимое ячеек памяти. Из-за очень трудоемкого характера работы с отдельным би-
тами это - не очень широко используемая группа команд.
Более того, как правило, установка отдельного бита в регистре иди ячейке памяти зани-
мает даже больше, чем изменение или чтение всех 8 битов этой ячейки памяти или регистра.
Тем не менее, есть ситуации, когда вам необходимо знать установлен или сбронен бит в
середине байта, или даже установить бит. Обратите/ тем не мене, внимание, что установка и
сброс битов может выполняться с помощью логических операторов. ■
Группа команд "установки и сброса битов" позволяет включить" или "выключить* по жела-
нию произвольный бит, или даже просто посмотреть на заданный бит, чтобы проверить, в ка-1
ком он состоянии.
Давайте посмотрим на первый набор команд:
SET Nl (HL)
SET N, IX +д)
SET N| (IY +s>
Команда "SET" включает" (т. E. =1) Бит с номером "N" (в обозначениях 0 - 7) в регист-
ре Т или заданной ячейке памяти.
Никакие флаги не изменяются.
Группа команд "RESET" дейавует на ту же в точности группу регистров или ячеек памяти,
но вместо "включения" битов она их "вьключает" (т. Е. =0).
Команды "BIT" на самом деле нужно читать "BIT?", Поскольку функция этой команды состо-
ит в проверке содержимого указанного бита.
Никаких изменений в регистры или память не вносятся, но флаг нуля изменяется в соот-
ветствии с состоянием проверяемого бита.
Если бит = 0, то флаг нуля устанавливается (= 1).
Если бит s 1, то флаг нуля сбрасывается (= 0).
Зто на первый взгляд может показаться запутанным, но нужно посмотреть на это следупрм
образом: если бит равен нулю, то устанавливается флаг нуля; если бит установлен, то,
естественно, флаг нуля подниматься не будет.
Савиги и дикаичсскис савиги
Вы можете сдвигать регистры влево, вправо, как захотите.
Сложность состоит в том, чтобы различать различные сдвиги и циклические сдвиги с тем,
чтобы знать, какие и когда нужно использовать, и помнить, что бит переноса часто можно
рассматривать в качестве 9-го бита регистров. (Т. Е. Бит переноса является восьмым битом,
если биты пронумерованы от 0 до 7).
Некоторые команды циклического сдвига захватывают бит переноса (в качестве девятого
бита), так что циклический сдвиг в целом составляет цикл из 3 битов.
Например, давайте рассмотрим команду "RLA" (смысл каждой команды будет объяснен ниже в
этой же главе):
Другие циклические сдвиги захватывают только 8-оитовыи цикл,, хотя флаг переноса изме-
няется в соответствии со значением бита, которому приходится проделывать кружной путь".
Примером может служить команда "RLCA":
Зто означает, что при циклическом сдвиге влево, как, например, показано выше, содержи-
мое бита 0 перемещается в бит 1, бита 1 - в бит 2 и так далее, а содержимое бита 7 пере-
мещается и в бит 0, ив бит переноса. Сравните это с командой "RLA", описанной выше, где
бит 7 перемещается в бит переноса, а бит переноса - в бит 0.
Циклические сдвиги влево
в основном есть два типа циклических сдвигов влево:
циклический сдвиг влево регистров (циклический сдвиг влево круговой - "круговой" озна-
чает, что цикл охватывает только 8 битов, как в команде RLC а, описанной вине) - это
3-битовый сдвиг влево, аналогичный показанному выше для И. а".
RL а - циклический сдвиг влево накопителя";
RL R - "циклический сдвиг влево регистра R"
RLC а - циклический сдвиг влево круговой регистра "а"
RLC R - циклический сдвиг влево круговой регистра "R"
RLC (HL) - циклический сдвиг влево круговой регистра (HL)
RLC (IX+ д) - циклический сдвиг влево круговой (IX +
RLC (IY+ д) - циклический сдвиг влево круговой (IY +)
Помимо этих двух команд циклического сдвига влево, есть еще команда сдвига влево, но
она может обрабатывать только регистр "а".
SL а сдвиг накопителя влево
Отличие этой команды состоит в том, что содержимое бита переноса теряется, а нулевой
бит заполняется нулем. По-существу это сводится к умножению "а" на 2, поскольку ничего в
накопитель не переносится. (Обдумайте работу команды "SL а" в случае а = 80н).
Циклические сдвиги вправо
Вновь у нас два основных режима циклического сдвига, но на этот раз вправо. Вращение
вправо охватывает тот же диапазон допустимых ячеек памяти и вращений (так в оригинале,
возможно, здесь имеется опечатка. Скорее всего нужно: регистров. (Примеч. Пер. ), что и
вращения влево.
RR а циклический сдвиг накопителя вправо
RR Р циклический сдвиг регистра вправо
RRC а - циклический сдвиг вправо круговой регистра "а"
RRC R - циклический сдвиг вправо круговой регистра Т
RRC (HL) - циклический сдвиг вправо круговой регистра (HL)
RRC (IX+ д) - циклический сдвиг вправо круговой ИХ +)
RRC (IY+ д) - циклический сдвиг вправо круговой (IY +)
Имеется сдвиг вправо, аналогичный сдвигу влево:
SRL R - логический сдвиг вправо регистра "R"
В данном случае это - чистое деление на 2, если мы используем числа без знака (т. Е.
Диапазон чисел, которые мы хотим представлять, составляет 0 - 255).
Поскольку в некоторых прикладных задачах мы применяем соглашение о том, что для зада-
ния отрицательных чисел бит 7 устанавливается равны* 1 (что дает нам диапазон от -128 до
+12 7), имеется дополнительная (в оригинале, очевидно, опечатка ADDITION SHIR (примеч.
Пер. ). Команда сдвига вправо2 называющаяся
SRA R - арифметическим сдвиг вправо регистра "R"
Как видите, это - тоже деление ча 2, но оно сохраняет бит знака.
ВвОА И ВЫ BOA
Вопросы ввода и вывода - одни из самых простых в программировании на машинном языке.
ЦП Z80 имеет 256 портов ввода/йывода.
Клавиатура и кассетный магнитофон имеют порт вв/выв FEH (десятичное 254), так что для
получения данных с клавиатуры вы применяете команду
Теперь вы можете задать себе вопрос, как 40 клавиш на клавиатуре организованы так, что
они представляются 8-битовыми байтами.
Ответ для вас будет скорее всего неожиданным - клавиатура за один раз передает инфор-
мацию только от 5 клавиш. Значение регистра "а" определяет в момент открытия порта какая
группа из 5 клавиш будет просматриваться!
Клавиатура разделена на 4 ряда, каждый из которых содержит два блока по 5 клавиш:
3 0 1 2 3 4 5 6 7 8 9 0 (=4
2 = Q U E R i Q U I 0 P (=5
1 = A S D F G H J К L N/L (= 6
0 =) SFT Z X С V В N И. SPC
Легко видеть, что имеется 8 блоков литер, и мы поэтому можем увязать их с 8 битами ре-
гистра "а".
Именно так и обстоит дело:
Все биты регистра "а" устанавливаются в положение включено за исключением одного би-
та, задающего подлежащий чтению блок.
шТак, чтобы прочитать клавиши из блока "1 2 3 4 5", должен быть вьключен бит 3 регистра
9 ' а = 1 1 1 1 0 1 1 1 = F7
Содержимое посланной с клавиатуры информации поступает в регистр а в его младвие би-
ты1 . .
т.е. клавиша 'Г - бит 0 регистра а
клавиша '2" -) бит 1 регистра "а"
Вы можете считать, что информация поступает в регистр ъ ^сначала с внешних сторон
клавиатуры, так что и "0" и "1" попадут в бит "0" регистра "а".
Для некоторых игр вам может понадобиться позволить считывать весь верхний ряд, причем
весь его можно читать одной командой (а не двумя, как потребовалось бы при чтении одного
блока за раз).
Для этого посыльного обманывают, чтобы он выдал вам сразу две порции информации:
например, а = 11100111 = е7
обратите внимание, что оба бита "3" и "4" "вьключены".
Такое рукопожатие говорит посыльному, что ЦП нужна информация из блоков 3 и 4, и имен-
но ее он и получит. Конечно, две порции информации оказываются перемешанным, так что вы
не сможете сказать, была нажата клавиша '0 или "1", например, обе установят бит 0 ре-
гистра "а".
т.е. "1" или "0" -) бит 0 регистра а
"2" или "9" -) бит 1 регистра а ....
Зто полезно для динамических игр, поскольку позволяет использовать клавиви 5 и 8 в
качестве указателя направления движения направо и налево, хотя они и находятся в разных
блоках клавиатуры.
Обратите внимание, что если вы применяете команду
INR, (с),
где регистр с задает используемый вами порт, то содержимое регистра в определяет, какой
блок клавиатуры выбирается.
Другие порты, представляющие для вас интерес, очевидно, двери ввода-вывода с кассетно-
го магнитофона.
Зто - порт FE, как сказано выпе, основная возникающая проблема связана с синхронизаци-
ей ввода и вывода данных; проблемы такого типа требуют большого опыта программирования на
машинном язьке и вычисления времени выполнения каждой команды.
Команда OUT также применяется для генерирования звукового сигнала на "спектрум" и
установления цвета окаймления.
Биты для команды OUT: 0, 1, 2 - цвет окаймления
3 - посылает импульс на гнезда MIC и EAR
4 - посылает импульс на внутренний громкоговоритель
Чтобы изменить цвет окаймлечия, нужно загрузить в регистр а соответствуйте значение
цвета, а затем выполнить команду OUT (FE), а. Обратите внимание, что это - ливь TDfORARY
( временное) изменение цвета окаймления. Чтобы постоянно изменить цвет окаймления, вы
должны вьполнить приведенную выпе команду OUT и также изменить значение ячейки памяти
23624, представляющую собой переменную BORDCR операционной системы
Причина этого состоит в том, что аппаратура "спектрум" ( чип ULA "спектрум") управляет
цветом окаймления и она получает информацию о нем, просматривая содержимое этой ячейки
памяти. Вы можете предотвратить всю эту волынку ЦП с цветом окаймления-.только заблокиро-
вав все прерьвания (команда DI). Обратите внимание, что некоторые подпрограммы в ПЗУ
разблокируют прерывания (команда EI).
Самостоятельная генерация звукового сигнала
Вы можете сгенерировать свой собственный звуковой сигнал на "спектрум", но для пользо-
вателей, имеющих только 16к памяти с произвольным доступом имеются определенные ограниче-
ния, порождаемые особенностями аппаратуры.
Поскольку экрал постоянно обновляется, аппаратура регулярно прерывает вьполнение зада-
ний Z80 для того, чтобы показать, что находится в файле дисплея. Зто вышняется путем
снижения напряжения в схеме WAIT.
В результате оказывается невозможным создание какой бы то ни было программы, требующей
точной или регулярной синхронизации, поскольку невозможно предсказать результаты синхро-
низации с помощью этих прерывании WAIT. Конструкция "спектрум" такова, что прерывание 280
осуществляется при попытке обработки информации, содержащейся в первых 16к памяти с про-
извольным доступом. Такого прерывания не происходит, если программа и данные, к которым
осуществляется доступ Z80, находятся в ПЗУ или верхних 32к памяти.
Обобщить все зто в терминах, понятных непосвященным, можно следующим образом: вы може-
те воспроизводить звуки и шумы с помощью команды OUT на ЗВМ с 16к памяти, но зто не будут
чистые ноты. (Обойти зто можно с помощью программы веер из ПЗУ. см. главу о средствах
"спектрум").
Для генерации звука вы должны послать импульс для включения громкоговорителя (или (и)
на гнездо МГС, если его нужно усиливать). Затем, спустя некоторое время, вам нужно
послать другой импульс для его выключения. Затем еще спустя некоторое время вновь вклю-
чить и т.д...
Таким образом создается звук. Интервал времени между двумя последовательными включени-
ями громкоговорителя определяет чистоту звука. Продолжительность интервала времени, в те-
чении которого громкоговоритель остается включенным, в противоположность интервалу време-
ни между импульсами, может дать вам минимальную степень контроля громкости звука.
Обратите внимание, что вы должны применять для включения и выключения такое значение
а, чтобы цвет окаймления не изменялся. В противном случае частотная характеристика полу-
ченного звука будет напоминать звуки загрузки.