ZX Ассемблер 1969 г.

Раздел 8 - представление двоично-десятичных чисел. Прерывания. Команла рестарта (RST).


Прслставленис лвоично-колированных лесятичных чисел.

Двоично-кодированное десятичное представление по английски сокращается как BCD
(BINARY-CODED DECIMAL). Зто - один из способов представления информации в десятичной фор-
ме.

Чтобы закодировать каждую из цифр от 0 до 9 необходимо всего 4 бита, и 6 допустимых
кодов не будут в зтом представлении использоваться.

Поскольку для кодирования десятичной цифры необходимо 4 бита, в каждом байте можно за-
кодировать две цифры. Зто называется двоично-кодированным десятичным представлением.

Например, 0000 0000 -двоично-кодированное десятичное предста-
вление десятичного числа 00
1001 1001 -двоично-кодированное десятичное предста-
вление десятичного числа 99.

Арифметические действия над двоично-кодированными
десятичными числами

Зта странная система обозначений для представления чисел может повести к потенциальным
проблемам при сложении и вычитании,
попробуем сложить следующие числа
BCD 08 0000 1«00
BCD 03 0000 0011

BCD И 0000 1011

Вы заметите, что результат второй операции неверен и является недопустимы* в представ-
лении двоично-кодированном десятичным числом. Для компенсации этих трудностей необходимо
применять особую команду, "DAA", называемую "десятичная настройка арифметических
действий", чтобы исправить результат сложения, (т.е. добавлять 6, если результат превыша-
ет 9).

Следующую трудность иллюстрирует тот же пример, будет генерироваться бит переноса из
младшего разряда двоично-кодированного десятичного числа (самого первого) в самый левый.
Этот' внутренний перенос должен быть учтен и добавлен во второй разряд двоично-кодирован-
ного десятичного.

Для выявления этого переноса используется "флаг половинного переноса", "н".

ld а, 12н: load literal bcd "12"
add а. 24н: add literal bcd "24"

daa: Decimal adjust result

LD (ADDR), a: STORE RESULT
LOAD LITERAL - загрузить литерал- ADD LITERAL - добавить литерал; DECIMAL ADJUST RESULT -
десятичная настройка результата STORE RESULT - запоминание результата.

При программировании вам вряд ли потребуется двоично- кодированное десятичное
представление. Но неплохо знать, что чип Z80 все-таки поддерживает это представление, и
команда DAA облегчает жизнь небольшой группе пользователей двоично-кодированного десятич-
ного представления.

Прерывания

Прерывание -это посылаемый микропроцессору сигнал, который может появиться в любое
время и, вообще говоря, приостановит выполнение текущей программы (так, что программа да-
же не узнает об этом).

Z80 предоставляет три механизма осуществления прерываний: запрос шины (BUSRG), не-
маскируемое прерывание (NMI) и обычное прерывание (INT).

^С^точки зрения программирования мы рассмотрим только обычное маскируемое прерывание

Команда DI (блокировка прерывания) применяется для сброса (маскирования), а команда EI
(разблокирование прерывания) для установки (размаскирования).

В общем случае обычное прерывание приведет к тому, что текущий счетчик команд будет
помещен в стек, а управление (в оригинале возможно опечатка. Перевод дается
по смыслу. (
примеч. пер. ). С помощью команды RST будет передано на нулевую страницу ПЗУ. Для возвра-
щения из прерывания требуется команда RETI (возврат из прерывания).

При нормальном режиме работы у "спектрум " прерывания разблокированы (EI), и на самом
деле программа прерывается 50 раз в секунду. Зто прерывание позволяет программе
ПЗУ осу-
ществлять сканирование клавиатуры.

Вам может понадобиться заблокировать прерывания в вашей программе, поскольку это уско-
ряет выполнение. Вы все-таки сможете получать информацию с клавиатуры, при условий
использования своей собственной программы для этого. Обязательно разблокируйте прерыва-
ния, когда закончите выполнение программы, поскольку иначе система не сможет получать ин-
формацию с клавиатуры.

Команла рестарта (RST)

Зто - скорее всего "рудименты" чипа 8080, реализованные в целях совместимости. Поэтому
вы вряд ли станете применять команду RST в своей программе.

Команда RST выполняет те же самые действия, что и вызов, но позволяет совершать пере-
ход только по восьми адресам, расположенным в первых 256 ячейках памяти:
00н, 08н, 10н,
18н, 20н, 28н, 30н, и ЗВн. ....

Преимущество команды RST состоит в том, что часто используемые подпрограммы можно выз-
вать, затрачивая на это всего один байт. Кроме того, команда RST занимает
меные времени,
чем команда CALL.

Недостатком команды RST является то, что ее можно применять только для обращения к од-
ной из восьми приведенных выше допустимых ячеек.

Поскольку все эти ячейки расположены в ПЗУ, вы можете воспользоваться этим поеимушест-
вом в своей собственной программе. Есть, однако, возможность использовать подпрограммы
ПЗУ. если вы знаете, что они делают, и тем самым использовать команды RST.

бы сможете больше узнать о командах RST из нашей книги " UNDERSTANDING YOUR SPECTRUM",
написанной доктором Яном Логаном.

Написание программ аая "Спектрум"
Планирование вашей программы на машинном языке

Программирование на машинном языке обладает чрезвычайной гибкрртыо в том смысле, что
позволяет вам делать все, что угодно. '

Поскольку от всех языков более высокого уровня в конечном счете нужно переходить к ма-
шинному языку, все, что вы можете запрограммировать на языке "фортран" или "кобол", или
любом другом, можно запрограммировать на машинном языке.

Дополнительным преимуществом будет то, что программа на машинном языке вьполняется
быстрее.

Зта абсолютная гибкость может, однако, оказаться ловушкой для неосторожного програм-
миста. При наличии такой полной свободы, можно делать все, что угодно. В отличие от опера-
ционной системы "спектрум" для языка бейсик", например, отсутствуют проверки предложений
на допустимость.

Поскольку любые вводимые вами числа будут командами того или иного типа, чип Z80 будет
обрабатывать все на свете.

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

Поэтому огромное значение приобретает самодисциплина при разработке программ на машин-
ном языке. Невозможно преувеличить значение концепции "нисходящего" подхода в программи-
ровании в целом, но в особенности это касается программирования на машин ном языке.

"Нисходящий" подход заставляет вас разбивать задачу на более мелкие единицы и позволя-
ет проверить логику вашей разработки, на протяжении долгого времени не записывая ни одной
строки текста программы.

Предположим, вам захотелось написать программу посадки на луну:
самый первый путь мог бы напомнить нечто подобное:
INSTR выдача на экран инструкций

переход назад на INSTR, пока не будет нажата клавиша

DRAW нарисовать ландшафт, начать движение спускаемого

аппарата с вершины экрана
LAND движение спускаемого аппарата

если горючее кончилось, перейти на CRASH
перейти назад на LAND, если поверхность не
достигнута
GROUND напечатать поздравления

перейти назад на INSTR для следующего прогона
CRASH напечатать соболезнования по поводу неудачной по-
садки

перейти назад на INSTR для следующего прогона.

Обратите внимание, что вся эта "программа" написана на русском языке. На этом зтапе не
принималось никаких решений, будет ли программа писаться на языке "бейсик" или на машин-
ном языке. Такое решение и не нужно принимать - концепция программы посадки на луну не
зависит от способа записи ее текста.

Теперь наступает зтап логической проверки.

Вы выполняете роль ЗВМ и смотрите, все ли возможности, которые вы хотели включить в
программу, имеются в наличии.

Нет ли переходов на объекты, которые вы хотели написать, но забыли? Все ли есть? Нет

ли избыточных программ ? Не следует ли некоторые обьекты перенести в подпрограммы ?

Давайте снова посмотрим на программу" - ох-ох-ох! - № забыли как-нибудь закончить
программу!

Описанная выше логика может быть прекрасной для некоторых прикладных задач, таких как
игровая ЭВМ, но в своей программе вам может приити в голову, что неплохо бы иметь возмож-
ность выключить работу программы.

Теперь мы изменим последнюю часть программы следующим образом:
GROUND напечатать поздравления
перейти на

CRASH напечатать соболезнования по поводу неудачной по-
садки

FINISH спросить игрока, нужно ли закончить
если нет, перейти на INSTR
если да, STOP

Обратите внимание, что мы использовали метки для описания определенных строк програм-
мы. Метки - очень ценный аппарат, особенно если вы будете выбирать их краткими и содержа-
тельными.

Когда этот уровень закончен, вы перемещаетесь на уровень глубже, чтобы проделать то же
самое с одной из строк или модулей, приведенных выше.
Именно поэтому этот подход называется нисходящим.

Например, мы можем следующим образом расписать модуль "FI- NISH", приведенный вьвве:
FINISH очистить экран

напечатать: "хотите ли закончить?"
Опросить клавиатуру в ожидании ответа
если ответ = да, то закончить
перейти на INSTR

Еще одно преимущество нисходящего подхода состоит в том, что вы можете тестировать и
выполнять конкретный модуль автономно, так что он будет отлажен для включения в оконча-
тельный текст программы.

Давайте спустимся еще на один уровень и посмотрим на строку очистить зкран более под-
робно.

На этом этапе нам нужно решить, на каком языке мы будем писать программу, и давайте
выберем машинный язык "синклера".

Если бы вы писали программу на языке "бейсик", то вам было бы достаточно написать:
900 CLS,

но на машинном языке это простое предложение "очистить экран" может оказаться обманчивьм.
(Так в оригинале, открывающей скобки нет. (Примеч. Пер. ))
Поэтому мы могли бы сделать что-то в таком роде:
CLEAR найти начало экрана

заполнить следующие 6144 позиции пробелами
№ все еще не написали ни строчки текста программы, но, очевидно,
подход основан на
машинном языке. Давайте посмотрим более пристально, что должна делать эта программа
очистки экрана и что она делает на самом деле.

Вы, возможно, помните из руководства по "спектрум", что экран состоит из 6144 ячеек и
что есть еще 768 ячеек, описывающих атрибуты экрана: цвет бумаги, цвет чернил и т.п.

Приведенное выше краткое описание программы, конечно, очистит часть экрана, но никак
не повлияет на файл атрибутов. Если не у всех позиций экрана совпадает цвет бумаги или
если позиции некоторых литер имеют включенные атрибуты мигания или яркости, то ясная
программа очистки экрана, приведенная выше, окажется явно неадекватной.

Нам придется также обработать и файл атрибутов. (Обратите внимание, насколько сложнее
оказываются некоторые задачи на машинном языке, чем на языке "бейсик")

Поэтому нам нужно расширить программу до следующего вида
найти начало экрана

заполнить следующие 6144 байта пробелами
найти начало файла атрибутов

заполнить следующие 768 байтов требуемыми значениями атрибутов бумаги (чернил)
следующий
ниже лежащий уровень - это уже тот; на котором вы должны, наконец, писать

текст программы, так что давайте посмотрим, как экран заполняется проделами:

CLEAR LD HL, SCREEN: SCREEN START
LD вс, 6144: BYTES то CLEAR
LD D, 0: D=BLANK

LOOP LD (ftL), D: FILL BLANK
INC HL: NEXT POSITION
DEC вс: REDUCE COUNT
LD а, в

OR c: TEST IF bc=0

JR NZ, LOOP: AGAIN IF NOT END

SCREEN START-начало экрана; BYTES то CLEAR - очищаемые байты: BLANK - пробел; FILL
BLANK - заполнение пробелом: NEXT POSITION - следующая позиция; REDUCE COUNT - уменьшение
счетчика; TEST - проверка; AGAIN IF NOT ENL - повторение, если не достигнут конец.

Теперь вы достаточно легко можете работать с программами такой длины и таким способом
строить достаточно большие программы.

Кстати, вы теперь без сомнения понимаете, почему программы на машинном языке часто так
велики по объему и почему люди изобрели программы на языках высокого уровня!

Ответы

Есть несколько "правильных" ответов - единственная проверка будет ли это работать ?
Иными словами, делает ли программа то, что вам нужно ?

С помощью DJNZ":
CLEAR LD HL, SCREEN
LD a, 0

LD в, 24: SET в=24
BIGLOOP PUSH вс: SAVE VALUE
LD в, a: SET в=256
LITLOOP LD (ftL), a:

INC HL: FILL IN 256 BLANKS
DJNZ LITLOOP

pop вс: GET BACK VALUE OF В
DJNZ BIGLOOP: DO IT UNTIL END

SET - установить; SAVE VALUE - запомнить значение; FILL IN 256 BLANKS - заполнить 256
пробелов; GET BACK VALUE OF в - получит назад значение в; DO IT UNTIL END - выполнять до
достижения конца.

№ смогли использовать 24 раза по 256 (=6144) для очистки экрана.

Нужно отметить следующее:

Мы можем задать в = 0, чтобы пройти цикл DJNZ 256 раз. ( почему?) Зта процедура обычно
не будет применяться в программе, если мы только не станем использовать регистр с для
доугих целей.

Применение LDIR:

CLEAR LD HL, SCREEN: SOURCE
PUSH HL
pop DE

INC DE: DEST = HL + 1
LD вс, 6144: HOW MANY
LD (HL). 0: LAT POS = 0
LDIR: MiVE IT

SOURCE - источник; HOW - сколько; LAT - первая; MOVE - пеоемецение.

Обратите внимание, что мы получили DE =HL + 1, задавая DE= HL и давая приращение DE.
Зто можно сделать проще, загружая значение SCREEN + 1 в DE непосредственно, но для woro
требуется на один байт больше!

Причина, по которой эта команда LDIR срабатывает, состоит в том, что используется
факт, что в процессе обработки данные перезаписываются в блок. Здесь происходит примене-
ние с положительным результатом задачи, рассмотренной нами в главе о перемещении блоков.

Если просуммировать потребную память, то при первом методе требуется 14 байтов, при
втором - 16 байтов, а при последнем 13 байтов.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Наши новости - Скоро будет FunTop-98.
Вступление - Oб авторах журнала и о журнале.
20 Things To Do While Loading a Game From Disk

В этот день...   18 июня