8. ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ МОНИТОРА
8.1. ВВЕДЕНИЕ
Цель этой главы показать, что программы машинного кода могут быть написаны для SP относительно просто, используя большое число подпрограмм, которые всегда имеются в программе монитора.
Во многих случаях метод основан на Бейсике, т.к. соответствующие программы машинного кода разработаны, чтобы заменить простые предписания Бейсика. Эти программы могут быть вызваны в функции USR-ЧИСЛО. Основная программа кода может быть сформирована, объединив вместе ряд небольших программ машинного кода.
Автор не имеет намерения в этой книге обсуждать структурное программирование, но хотел бы отметить, что хорошая программа всегда приносит удовлетворение, как пользователю, так и самому программисту.
8.2. ШЕСТНАДЦАТЕРИЧНЫЙ ВВОД
В главе 6 программа HEX.LOADER (16-ный загрузчик) была так представлена, что читатель может составить программу машинного кода в списке данных DATA и потом выполнить её. Однако HEX.LOADER не совсем подходит для больших программ и предпочтительна следующая программа: 10 LET D=32000: REM HEX INPUT
20 DEF FN A(A$(B))=CODE A$(B)-48-7*(CODE A$(B))>57) 30 DEF FN C A$)=16*FN A(A$,1)+FN A(A$,2) 40 DEF FN G$(F)=CHR$(F+48+7*(F>9))
50 DEF FN H$(E)=FN G$(INT(E/16))+FNC$(E-16*INT(E/16)) 60 DIM A$(2)
70 PRINT FN H$(PEEK D); TAB7; FN H$(INT(D/256)); FN H$(D-256*INT(D/256)) 80 INPUT A$ 90 LET L=1
100 IF A$(1)="U" THEN LET L=-1: GO TO 130
110 IF A$(1)="*" THEN GO TO 160
120 IF A$(1)<>CHR$ 32 THEN POKE D,FN C(A$)
130 PRINT TAB 16; FN H$(PEEK D)
140 LET D=D+L
150 GO TO 70
160 INPUT "PRESS ANY KEY TO RUN THE ROUTINE"; A$ 170 RANDOMIZE USR 32000
Примечание: используйте программу CAPS LOCK SET: ■S введите значение как пару 16-ных символов; ■S используйте ENTER для выполнения шага вперед; ■S используйте "U" и ENTER, выполняя шаг вперед; ■S используйте "*" и ENTER для выполнения программы; S строка 160 дает пользователю вторую возможность. Используя вышеприведенную программу, читатель может просто ввести и проверить программу машинного
кода.
Читатель должен быть хорошо осведомлён о программе SAVE перед тем, как использовать её впервые, так как имеют место частые аварийные ситуации в системе.
Читатель будет рад изменить вышеприведенную программу, чтобы выполнить какое-либо определенное желание, например, 16-ные символы в "нижнем регистре" и т.д.
8.3. КОМАНДА BEEP
В Бейсике команда BEEP имеет форму: BEEP ДЛИТЕЛЬНОСТЬ, ВЫСОТА ТОНА
где ДЛИТЕЛЬНОСТЬ должна быть положительной величиной, не превышающей 10 и ВЫСОТА ТОНА -положительным или отрицательным числом, указывающим, как далеко находится нота от среднего "до".
В программе машинного кода имеются два особых метода, в которых программа BEEP может быть выполнена. По первому методу необходимо вызвать подпрограмму BEEPER с соответствующими величинами в двух регистровых парах DE и HL; в то время как по второму методу надо вызвать команду BEEP с помощью величин для длительности и высоты тона в калькуляторном стеке.
Метод 1
Используя программу HEX.INPUT введите:
7D00 11 05 01 LD DE,+0105 длительность 1 секунда
7D03 21 66 06 LD HL,+0666 высота тона
7D06 CD B5 03 CALL BEEPER
7D09 C9 RET
Когда вышеприведенная программа будет выполнена, она даст тот же эффект, как ВЕЕР 1,0. Величины регистров DE и HL будут следующими:
S - рассмотрите ноту заданной частоты "F", например, среднее "до" принято как 261,63 Гц в SP. S - затем длительность требуемого периода "Т" будет просто F*T. Это задается в регистровой паре DE. ■S - величина для регистровой пары HL представлена как 437.500/F-30.125. Заметьте, что нет ограничения длительности 10 секундами при использовании этого метода.
Метод 2
Используйте программу HEX.INPUT, чтобы ввести программу:
LD A,+01 CALL STACK-A LD А,+00 CALL STACK-A CALL BEEP RET длительность 1 перевод в стек высота тона 0 перевод в стек
7D00 7D02 7D05 7D07 7D0A 7D0D
Когда вышеприведенная программа будет выполнена, она даст тот же эффект, как ВЕЕР 1,0.
Можно использовать программу STACK-A для целых значений, но подпрограмма STK-DATA должна
использоваться для других величин, т.е. для ВЕЕР 1.3,1.12 она будет: |
|
|
7D00 |
EF |
|
|
RST 0028 |
использование |
калькулятора |
7D01 |
34 |
|
|
DEFB +34 |
STK-DATA |
|
|
|
7D02 |
F1 |
|
|
DEFB |
экспонента 81 |
|
|
|
7D03 |
26 |
66 |
66 66 |
DEFBS |
мантисса (=дес |
. 1. |
3) |
|
7D07 |
34 |
|
|
DEFB +34 |
STK-DATA |
|
|
|
7D08 |
F1 |
|
|
DEFB |
экспонента 81 |
|
|
|
7D09 |
8F |
5C |
28 F6 |
DEFBS |
мантисса (=дес |
. 1. |
. 12) |
7D0D |
38 |
|
|
DEFB +38 |
END CALE |
|
|
7D0E |
CD |
F8 |
03 |
CALL BEEP |
|
|
|
7D11 |
C9 |
|
|
RET |
|
|
|
Чтобы получить ряд звуков, величины могут помещаться в таблицу и выбираться как требуется.
8.4. СОХРАНЕНИЕ И ЗАГРУЗКА
Подпрограммы SAVE-BYTES и LOAD-BYTES вызываются из машинного кода простым способом. В любом случае регистровая пара IX должна содержать адрес места назначения и регистровая пара DE -счётчик байтов, например, переслать байты с 7Е00 по 7EFF включительно. Регистровая пара IX будет содержать 7Е00, а DE - 0100
В регистре A записывается величина +FF, чтобы показать, что переписывается блок данных. Перед выполнением LOAD должен быть установлен флаг переноса. Следующая программа сохранит байты.
3E FF LD A,+FF
DD 21 00 7Е LD IX,+START
11 00 01 LD DE,+COUNT
CD C2 04 CALL SAVE-BYTES
C9 RET указатель блока данных установка пары IX установка пары DE выполнить сохранение
7D00 7D02 7D06 7D09 7D0C
байтов.
Заметьте, что байты сохранены без "заголовка", но загрузка будет в том случае, если известно количество
Программа загрузки будет следующая:
FF LD A,+FF
21 00 7Е LD IX,+START 00 01 LD DE,+COUNT
56 05 CALL LOAD-BYTES
RET
7D01 7D03 7D07 7D0A CD 7D0D C9
установка флага переноса (сбрасывается для VERIFY) указатель блока данных установка пары IX установка пары DE выполнить загрузку
8.5. ЭЛЕМЕНТЫ ЦВЕТА
В системе SP все байты атрибутов имеют следующий вид:
бит 7 - 1 для FLASH
бит 6 - 1 для BRIGHT
биты 5-3 цвет PAPER
биты 2-0 цвет INK
Этот вид относится к 768 байтам в области атрибутов и к системным переменным BORDER, ATTR-P, MASK-P, MASK-T. В добавление к атрибутным байтам системная переменная P-FLAG используется для хранения постоянных и временных флагов для PAPER 9, INK 9, INVERSE и OVER.
Чётные биты P-FLAG (биты 6, 4, 2, 0) являются временными флагами, а нечётные биты (7, 5, 3, 1) являются постоянными флагами.
В большинстве случаев SP использует временные величины, когда заполняется значение для атрибутной области. Когда выполняется программа CLS, используются постоянные величины.
Команда BORDER и 6 элементов цвета будут рассматриваться теперь по очереди.
BORDER
В любое время цвет бордюра может изменяться путём использования инструкций OUT (+FE), А. Но эта операция обычно связана с сохранением нового значения цвета в битах 5-3 BORDER. Заметьте, что другие биты, контролируют мигание, яркость и цвет чернил нижней части экрана.
Следующая программа показывает, каким образом цвет бордюра может изменяться, а BORDER заполняться новым значением.
7D00 |
3E |
02 |
LD A,"RED" |
красный бордюр |
7D02 |
D3 |
FE |
OUT (+FE),A |
бордюр изменяется |
7D04 |
07 |
|
RLCА |
цвет бордюра |
пересылается |
7D05 |
07 |
|
RLCА |
в биты 5-3 регистр A |
7D06 |
07 |
|
RLCA |
|
|
7D07 |
CB |
6F |
BIT 5,A |
цвет чернил для нижней |
7D09 |
20 |
02 |
JR NZ,BORD-2 |
части экрана |
- контрастен |
7D0B |
ЕЕ |
07 |
XOR +07 |
|
|
7D0D |
32 |
48 5С |
LD (BORDER) , А |
установить BORDER |
7D10 |
C9 |
|
RET |
|
|
7D00 7D02 7D05
или проще:
3E 02 CD 9B 22 C9
LD A,"RED" CALL BORD-1 RET
красный бордюр установка бордюра
Интересно увидеть, как в вышеприведенной программе цвет INK делается контрастным по сравнению с цветом бордюра.
PAPER
Постоянный цвет бумаги задается битами 5-3 ATTR-P.
Следующая программа показывает для PAPER 0 - PAPER 7 только один метод, с помощью которого эти биты могут изменяться без изменения других атрибутов.
LD A,(ATTR-P)
RRCА
RRCА
RRCA
AND +F8
ADD A,+RED
RLCA
RLCA
RLCA
LD (ATTR-P),A RET
7D00 7D03 7D04 7D05 7D06 7D08 7D0A 7D0B 7D0C 7D0D 7D10
3A 0F 0F 0F E6 C6 07 07 07 32 C9
поиск ATTR-P пересылка битов в биты 2-0
ввести новый цвет сдвиг байта
сохранить ATTR-P
Вышеприведенный метод не очень эффективный, но это "общий метод", который может использоваться в других ситуациях.
PAPER 8 задается отдельно и включает в себя установку битов 5-3 MASK-P, в то время как PAPER 9 включает в себя установку бита 7 P-FLAG.
INK
Постоянный цвет чернил задаётся битами 2-0 ATTR-P, Следующая программа показывает, как эти биты могут изменяться для INK 0 - INK
Приготовить MASK выделить биты 7-3 красные чернила сохранить ATTR-P
Заметьте, что ATTR-P в одном случае рассматривается как адрес IY+53, а в другом - как адрес 5C8D. INK 8 включается установкой битов 2-0 MASK-P, в то время как INK 9 - установкой бита 5 P-FLAG.
FLASH
Можно задать 3 состояния FLASH следующим образом: установка и сброс бита 7 в ATTR-P и MASK-P: FLASH 0 0 для7-го бита ATTR-P
FLASH 1 1 для 7-го бита ATTR-P
3E 8F FD A6 C6 02 32 8D C9
LD A,+F8 AND (ATTR-P) ADD A,+RED LD (ATTR-P),А RET
FLASH 8 1 для 7-го бита MASK-P
BRIGHT
Подобным образом задаются 3 состояния яркости: установка и сброс бита 6 в ATTR-Р и MASK-P: BRIGHT 0 0 для 6-го бита ATTR-P 'RES 6,(ATTR-P)' BRIGHT 1 1 для 6-го бита ATTR-P 'SET 6,(ATTR-P)' BRIGHT 8 1 для 6-го бита MASK-P 'SET 6,(MASK-P)'
Во всех случаях, когда 8-ой режим требует исключения соответствующие биты MASK-P нужно сбросить
опять.
OVER
Два состояния OVER могут быть представлены следующим образом: установка и сброс 1 -го бита в P-FLAG: OVER 1 0 для 1 -го бита P-FLAG 'SET 1,(P-FLAG)'
OVER 0 1 для 1 -го бита P-FLAG 'RES 1,(P-FLAG)
INVERSE
Два состояния INVERSE могут быть представлены следующим образом: установка и сброс бита 3 в P-FLAG аналогично OVER.
Постоянные и переменные.
Большинство операций в SP используют переменные величины. Например, операция RST 0010 является важной программой для использования постоянных цветов.
Чтобы копировать текущее постоянное значение во временные системные, переменные используется CALL TEMPS (CALL 0D4D) и если переменные величины будут использоваться как новые постоянные величины, то используется CALL PERMS (CALL 1CAD). Читатель может написать эквивалентные программы машинного кода: PAPER 4: INK 3: ВЕЕР 2,0 или
ВЕЕР 1,0: BORDER 5: ВЕЕР 2,12: BORDER 2
8.6. КОМАНДЫ CLS И SCROLL
В программе монитора SP имеются подпрограммы для очистки части экранной области и для сдвига ее части. Они вызываются только из программ машинного кода.
CLS
Полная очистка экрана и установка всех атрибутных байтов в постоянные величины получена путём использования: CALL CLS (CALL 0D6B), но важно убедиться, что канал S открыт до того, как вызывается программа. Каналу потребуется потом вторичное открытие, если будет производиться дальнейший вывод на печать. Следующая программа очищает весь экран:
7D00 3E 02 LD A,+2 открыть канал S
7D02 CD 01 16 CALL CHAN-OPEN
7D05 CD 6B 0D CALL CLS очистить экран
7D08 C9 RET
Вышеприведённая программа имеет преимущество при использовании постоянных цветов, но проще во многих случаях использовать подпрограмму CL-LINE.
CL-LINE
Эта подпрограмма используется для очистки определенного числа строк экрана. Эти строки считаются снизу. Постоянные величины используются, когда установлены атрибутные байты.
До того, как сделан вызов подпрограммы, в регистр B должна быть помещена величина в диапазоне 01-18 16-ной, где 18-очистить весь экран.
Следующая программа показывает, как используется эта подпрограмма: 7D00 06 17 LD B,+17 очистить 23 (10-ое) строки
7D02 CD 44 0E CALL CL-LINE оставить одну верхнюю
7D05 C9 RET
CL-SCROLL
Эта интересная подпрограмма, т.к. она даёт возможность пользователю сдвигать определенное число строк дисплея. Подпрограмма кончается использованием подпрограммы CL-LINE для очистки нижней строки и, следовательно, атрибутные байты для этой строки дают постоянные значения.
Регистр B опять используется для хранения величины, которая обуславливает число строк, которые должны передаваться, но в этом случае она является "действительным числом строк без 1", т.е. 16-ный диапазон равен 01-17 (минимально требуется число 2, т.к. это число строк, которое должно быть сдвинуто).
Следующая подпрограмма показывает, как подпрограмма будет использоваться: 7D00 06 16 LD В,+16 оставить верхнюю строку не сдвинутой
7D02 CD 00 0E CALL CL-SCROLL
7D05 C9 RET
_Использование подпрограмм монитора_
Заметьте, что ни подпрограмма CL-LINE, ни подпрограмма CL-SCROLL не влияют на использование текущего канала.
LD A,+02 CALL CHAN-OPEN LD B,+18 CALL CL-LINE LD A,+"AT" RST 0010 LD A,+05 RST 0010 LD A,+00 RST 0010 LD A,"A" RST 0010 LD A,"CR" RST 0010 LD A,+F9 RST 0010 LD A,"CR" RST 0010 LD A,"PAPER" RST 0010 LD A,"RED" RST 0010 LD A,"INK" RST 0010 LD A,"YELLOW" RST 0010 LD A,"B" RST 0010 RET
оператор PRINT
оператор PRINT CHR$ 249
оператор PRINT
оператор PAPER 2 ( временное )
оператор INK 6 ( временное )
8.7. ПОДПРОГРАММА ПЕЧАТИ
Для того, чтобы использовать любую из подпрограмм печати для изображения символов, подпрограмма PRINT-OUTPUT должна быть сделана текущей программой ввода. Это можно легко получить, открыв канал S. Поэтому строка LD A,+02 CALL CHAN-OPEN должна использоваться до того, как вызываются любые подпрограммы.
RST 0010
В системе SP вся печать символов на экране выполняется при использовании этой команды. С открытым каналом подпрограмма PRINT-OUTPUT по адресу 09F4 действует как программа вывода.
Инструкция RST 0010 очень мощная и может использоваться для печати любого символа, изменения текущего положения печати использованием AT и TAB, печати расширенных ключевых слов и временных цветовых элементов.
Следующая программа показывает это; 7D00 3E 02 7D02 CD 01 16 7D05 06 18 7D07 CD 44 0E 7D0A 3E 16 7D0C D7 7D0D 3E 08 7D0F D7 7D10 3E 00 7D12 D7 7D13 3E 41 7D15 D7 7D16 3E 0D 7D18 D7 7D19 3E F9 7D1B D7 7D1C 3E 0D 7D1E D7 7D1F 3E 11 7D21 D7 7D22 3E 02 7D24 D7 7D25 3E 10 7D27 D7 7D2 8 3E 06 7D2A D7 7D2B 3E 42 7D2D D7 7D2E C9
Следует отметить, что в вышеприведенной программе вызов подпрограммы CL-LINE очищает экран, но не устанавливает положение печати "00" (в то время как CALL CLS устанавливает).
Когда используется инструкция RST 0010 для печати цветного элемента, тогда потребуется два отдельных вызова, а когда используется символ контроля AT или TAB, тогда требуется 3 отдельных вызова.
Альтернативный метод изменения положения печати будет следующим:
S загрузите пару регистров BC соответствующими величинами для нового положения печати ^ CALL CL-SET и "CALL 0DD9", которые помещают требуемые величины в S-POSN и DF-C.
Величины в паре регистров BC определяют AT A,B, где регистр B содержит 16-ное 18-А, а регистр C - 16-ное 21 -В. Например: PRINT AT 5,0 требует LD ВС,+1321 CALL 0DD9
Печать строк
Строка символов в SP всегда задаётся парами регистров DE и ВС, где в регистре DE хранится адрес ячейки, содержащей первый символ строки, а в паре регистров BC содержится величина, равная числу символов в строке.
В программе команды PRINT используется подпрограмма PR-STRING для печати любой строки.
Даётся подробное рассмотрение подпрограммы:
PR-STRING=203С
LD А, В выбор старшего байта
OR С DEC ВС RET Z LD A, (DE) INC DE RST 0010
JR PR-STRING переход к следующему Любая строка символов может быть, поэтому напечатана следующим образом: S загрузите стартовый адрес в DE; S загрузите длину в ВС; ^ CALL PR-STRING - "CALL 203C" Поскольку подпрограмма PR-STRING использует инструкцию RST 0010 для действительной печати символа, то строка может содержать коды символов, цветные элементы, атрибуты положения печати и кодов ключевых слов. Как пример использования подпрограммы PR-STRING выполните следующую программу.
7D00 |
3E |
02 |
|
|
LD A,+02 |
открыть канал |
S |
7D02 |
CD |
01 |
16 |
|
CALL CHAN-OPEN |
|
|
7D05 |
06 |
18 |
|
|
LD B,+18 |
|
очистить экран |
7D07 |
CD |
44 |
0E |
|
CAAL CL- |
LINE |
|
|
7D0A |
11 |
14 |
7D |
|
LD DE,+STRING |
начало строки |
|
|
7D0D |
01 |
0F |
00 |
|
LD BC,+LENGTH |
длина строки |
|
|
7D10 |
CD |
3C |
20 |
|
CAAL PR- |
STRING |
печать строки |
|
|
7D13 |
C9 |
|
|
|
RET |
|
|
|
|
7D14 |
11 |
01 |
10 |
09 |
|
|
строка длиной |
0F (16 |
-ное) |
7D18 |
16 |
0А |
05 |
53 |
|
|
начинающаяся |
в 7D14 |
7D1C |
70 |
65 |
63 |
74 |
|
|
|
|
7D2 0 |
72 |
75 |
6D |
|
|
|
|
|
Вышеприведенная программа подобна CLS: PRINT PAPER 1;INC 9,-AT 10,5,-"SP"
Печать чисел
Очень мощная подпрограмма PRINT-FP используется для печати в десятичной форме любых 5-ти байтов чисел с плавающей запятой. Эта подпрограмма в качестве операнда использует верхнее значение стека калькулятора, действительное число выбирается из стека и теряется.
Следующая программа использует подпрограмму PRINT-FP для печати постоянной "PI/2" из таблицы
констант калькулятора. |
|
|
|
7D00 |
3E |
02 |
|
LD А, |
+02 |
открыть канал S |
7D02 |
CD |
01 |
16 |
CALL |
CHAN-OPEN |
|
7D05 |
CD |
6B |
0D |
CALL |
CLS |
очистить экран |
7D08 |
3E |
02 |
|
LD A, |
+02 |
снова открыть |
7D0A |
CD |
01 |
16 |
CALL |
CHAN-OPEN |
канал S |
7D0D |
EF |
|
|
RST 0028 |
использовать калькулятор |
7D0E |
A3 |
|
|
DEFB |
+A3 |
выбрать константу |
7D0F |
38 |
|
|
DEFB |
+38 |
'END-CALE' |
7D10 |
CD |
E3 |
2D |
CALL |
PRINT-FP |
печатать верхнее значение |
7D13 |
C9 |
|
|
RET |
|
в десятичном формате |
Использование строки RANDOMIZE USR 32000
RANDOMIZE USR 32000: PRINT PI/2 показывает идентичность результата. Но интересно рассмотреть, что при получении PI/2 постоянная PI/2 выбиралась из таблицы констант, удвоенных, а затем деленных на 2, чтобы, в конечном счете, получить результат. Во многих случаях, однако, использование аппарата плавающей точки может не потребоваться и по существу, возможно, печатать 10-ные числа в диапазоне 0-9999 путём использования подпрограмм OUT-NUM, которая обычно используется для воспроизведения номера строки в листинге или сообщении. Когда используется программа OUT-NUM-1 (16-ная) 1A1B, число должно находится в паре регистров BC в обычном порядке "старший-младший", но когда используется подпрограмма OUT-NUM-2 (1A28), пара регистров HL используется для непосредственной адресации числа, которое в это время должно быть в порядке "младший-старший".
Заметьте, что, пользуясь этой подпрограммой, ведущие пробелы печатаются, и это может быть вполне
полезно.
Следует обратить внимание: если эти подпрограммы используются с числами, это может привести к превышению десятичного предела 9999.
Следующий пример показывает, как используется подпрограмма OUT-NUM-1 для печати числа.
7D00 3E 02 LD А,+02 открыть канал S
7D02 CD 01 16 CALL CHAN-OPEN
7D05 CD 6B 0D CALL CLS очистить экран
7D08 3E 02 LD A,+02 снова открыть 7D0A CD 01 16 CALL CHAN-OPEN канал S
операция OR с младшим уменьшение счётчика
поиск символа печать символа
7D0D 01 0F 27 LD BC,+270F десятичное 9999
7D10 CD 1B 1A CALL OUT-NUM-1 печать числа
7D13 C9 RET
8.8. КОМАНДЫ PLOT, DRAW И CIRCLE
Эти три команды имеют дело с изображением точек в экранной области. Весь экран состоит из точек в десятичном 256*176, что образует 22 верхние строки. Координаты нижней левой точки принимаются как (0,0), а верхней правой точки (255,175). Системные переменные COORDS-X и COORDS-Y содержат координаты последней точки, которая должна использоваться. Эти системные переменные устанавливаются в 00 командой CLS, или другими командами, такими как RUN, которые вызывают программу CLS.
Заметьте, что в Бейсике три команды обычно используют 8: FLACH 8, BRIGHT 8, PAPER 8, то есть MASK-T содержит 16-ное F8.
PLOT
Эта самая простая из трёх команд, т.к. она включает в себя идентификацию только одного бита в области экрана и его последующую установку или сброс.
Имеется три вполне подходящих точки входа в команду, но третья из них, возможно, самая простая для использования.
1. CALL PLOT - "CALL 22DC".
Для входа в команду PLOT необходимо иметь величины X и Y наверху калькуляторного стека. Величина X находится ниже величины Y. Использование STACK-А для помещения значений в стек очень важно.
2. CALL PLOT-1 - "CALL 22DF".
Вход в этой точке требует, чтобы в регистре B хранилась величина Y, а регистре C - величина X.
После того, как точка выводится, постоянные цветовые величины копируются автоматически в (временные) системные переменные.
3. CALL PLOT-BC - "CALL 22E5".
Опять регистр B должен содержать величину Y, а регистр C - величину X. Подпрограмма выполняет фактическую операцию PLOT. Требуемый бит идентифицируется вызовом FIXED-ADD (22AA) и затем будет установлен или сброшен в соответствии с результатом его состояния и величиной P-FLAG (бит 0 P-FLAG даст постоянное состояние OVER, и бит 2 даст состояние INVERSE).
Следующая программа показывает изображение одиночной точки с помощью PLOT.
7D00 |
3E |
02 |
|
LD А,+02 |
открыть канал S |
7D02 |
CD |
01 |
16 |
CALL CHAN-OPEN |
|
7D05 |
CD |
6B |
0D |
CALL CLS |
очистить экран |
7D08 |
3E |
02 |
|
LD A,+02 |
снова открыть |
7D0A |
CD |
01 |
16 |
CALL CHAN-OPEN |
канал S |
7D0D |
01 |
64 |
32 |
LD BC,+32 64 |
PLOT 100,50 |
7D10 |
CD |
E5 |
22 |
CALL PLOT-ВС |
|
7D13 |
С9 |
|
|
RET |
|
DRAW
Использование DRAW X,Y по существу является расширением PLOT X,Y, описывающей ряд точек, которые составляют прямую линию.
Команда DRAW X,Y,A включает в себя изображение дуги и подобна по многим аспектам CIRCLE X,Y,R.
DRAW X,Y
Имеются две соответствующие точки входа для этой команды:
Точка входа DRAW-1 (2477) с величинами X и Y, которые являются верхними значениями калькуляторного стека. Постоянные цветовые величины переписываются во временные системные переменные после того, как линия уже нарисована.
Точка входа DRAW-3 (24BA) с регистром B, содержащим ABS Y, регистром C, содержащим ABS X, регистром D, содержащим SGN X и регистром E, содержащим SGN Y.
Следующая программа показывает строку, которая должна быть изображена. Заметьте, что пара регистров H'L' должна быть сохранена, а позднее восстановлена для выполнения успешного возврата в Бейсик.
LD А,+02 CALL CHAN-OPEN CALL CLS LD A,+02 CALL CHAN-OPEN ЕХХ PUSH HL ЕХХ
LD (COORDS-X),+64 установить координаты
7D00 7D02 7D05 7D08 7D0A 7D0D 7D0E 7D0F 7D10
3E CD CD 3E CD D9 Е5 D9 FD
открыть канал S
очистить экран снова открыть канал S сохранить
LD DE,+0101 CALL DRAW-3 ЕХХ
7D22 E1 POP HL
7D23 D9 EXX
7D24 C9 RET
Вышеприведенная программа устанавливает последнее положение графики в координате 100,100 и затем выбирает строку +50,+50.
DRAW X,Y,A
Для того, чтобы изобразить дугу, 3 величины X,Y и А должны быть первыми помещены в стек калькулятора, либо в их длинной или короткой форме из пяти байтов. Затем можно вызвать DRAW -ARC (2394).
Следующая программа дает тот же результат, например: DRAW 50,50,1 с последующим положением графики в координатах 100,100.
7D14 FD 36 44 64 7D18 01 32 32
LD (COORDS-Y),+64 LD BC,+3232 оператор
DRAW 5 0,50
7D1B 11 01 01 7D1E CD BA 24 7D21 D9 E1
7D00 |
3E |
02 |
|
|
LD А,+02 |
|
открыть канал S |
7D02 |
CD |
01 |
16 |
|
CALL CHAN-OPEN |
|
|
7D05 |
CD |
6B |
0D |
|
CALL CLS |
|
|
очистить экран |
|
7D08 |
3E |
02 |
|
|
LD A,+02 |
) |
|
снова открыть |
|
7D0A |
CD |
01 |
16 |
|
CALL CHAN-OPEN |
|
канал S |
|
7D0D |
D9 |
|
|
|
ЕХХ |
|
|
сохранить HL |
|
7D0E |
Е5 |
|
|
|
PUSH HL |
|
|
|
|
7D0F |
D9 |
|
|
|
ЕХХ |
|
|
|
7D10 |
FD |
36 |
43 |
64 |
LD (COORDS-X), |
+64 |
установить г |
7D14 |
FD |
36 |
44 |
64 |
LD (COORDS-Y), |
+64 |
координаты |
7D18 |
EF |
|
|
|
RST 0028 |
) |
|
использовать калькулятор |
7D19 |
34 |
|
|
|
DEFB +34 |
|
STK-DATA |
7D1A |
40 |
B0 |
00 |
32 |
DEFBS |
|
|
10-ное+50 |
7D1E |
31 |
|
|
|
DEFB +31 |
|
DUPLICATE |
7D1F |
A1 |
|
|
|
DEFB +A1 |
|
STK-ONE |
7D2 0 |
38 |
|
|
|
DEFB +3£ |
|
|
END-CALE |
7D21 |
CD |
94 |
23 |
|
CALL DRAW-ARC |
изображение |
7D24 |
D9 |
|
|
|
EXX |
|
|
|
7D25 |
E1 |
|
|
|
POP HL |
|
|
восстановить HL |
7D2 6 |
D9 |
|
|
|
EXX |
|
|
|
7D27 |
C9 |
|
|
|
RET |
|
|
|
7D00 |
3E |
02 |
|
|
LD А,+02 |
7D02 |
CD |
01 |
16 |
|
CALL CHAN-OPEN |
7D05 |
CD |
6B |
0D |
|
CALL CLS |
7D08 |
3E |
02 |
L |
/ |
LD A,+02 |
7D0A |
CD |
01 |
16 |
f |
CALL CHAN-OPEN |
7D0D |
D9 |
|
|
|
ЕХХ |
7D0E |
Е5 |
|
|
|
PUSH HL |
7D0F |
D9 |
|
|
|
ЕХХ |
7D10 |
EF |
|
|
|
RST 0028 |
7D11 |
34 |
|
|
|
DEFB +34 |
7D12 |
40 |
B0 |
00 |
64 |
DEFBS+100 |
7D16 |
31 |
|
|
|
DEFB +31 |
7D17 |
34 |
|
|
|
DEFB +34 |
7D18 |
40 |
B0 |
00 |
30 |
DEFBS+4 8 |
7D1C |
38 |
|
|
|
DEFB +38 |
7D1D |
CD |
2D |
23 |
|
CALL CIRCLE-1 |
7D2 0 |
D9 |
|
|
|
ЕХХ |
7D21 |
E1 |
|
|
|
POP HL |
7D22 |
D9 |
|
|
|
EXX |
7D23 |
C9 |
|
|
|
RET |
INT
использовать калькулятор
STK-DATA
10-ное
DUPLICATE
STK-DATA
(10-ное)
END-CALE
изображение окружности восстановить HL
В программе величины, полученные для X, Y, А будут десятичными +50,+50,+1. CIRCLE
Опять три операнда команды должны быть помещены в стек калькулятора до того, как будет сделано обращение к CIRCLE-1 (232D).
Следующая программа показывает выполнение этой команды. Заметьте, что нет заметной экономии времени изображением окружности из машинного кода, т.к. программа команды CIRCLE медленная.
открыть канал S
очистить эк снова открыт канал S сохранить H
Вышеприведенная программа дает тот же результат, как CIRCLE 100,100,48. Заметьте, что при
_Использование подпрограмм монитора_
использовании вышеприведенной программы постоянные цветовые величины копируются во временные системные, одновременно с изображением дуги или окружности.
8.9. POINT, ATTR, SCREENS
Эти три функции могут вызываться из программы машинного кода очень просто, так как каждая имеет отдельную вычислительную подпрограмму. Они могут также вызываться как функции, используя VAL, но этот метод не заслуживает внимания.
POINT
Координаты точки, которые должны быть переданы, вводятся в регистр ВС, и вызывается подпрограмма POINT-1 (22CE). Как обычно, регистр B хранит координату Y, регистр C хранит координату X. Следующая программа показывает выполнение.
7D00 |
3E |
02 |
|
LD А,+02 |
7D02 |
CD |
01 |
16 |
CALL CHAN-OPEN |
7D05 |
CD |
6B |
0D |
CALL CLS |
7D08 |
3E |
02 |
|
LD A,+02 |
7D0A |
CD |
01 |
16 |
CALL CHAN-OPEN |
7D0D |
3E |
11 |
|
LD A,"PAPER" |
7D0F |
D7 |
|
|
RST 0010 |
7D10 |
3E |
05 |
|
LD A,"CYAN" |
7D12 |
D7 |
|
|
RST 0010 |
7D13 |
3E |
FF |
|
LD А,"СОРУ" |
7D15 |
D7 |
|
|
RST 0010 |
7D16 |
3E |
0D |
|
LD A,"CR" |
7D18 |
D7 |
|
|
RST 0010 |
7D19 |
01 |
00 |
04 |
LD ВС,-Ю400 |
7D1C |
CD |
83 |
25 |
" CALL ATTR-1 |
7D1F |
CD |
E3 |
2D |
CALL PRINT-FP |
7D22 |
C9 |
|
|
RET |
Вышеприведённая программа аналогична команде
7D00 |
3E |
02 |
|
LD А,+02 |
открыть канал |
S |
7D02 |
CD |
01 |
16 |
CALL CHAN-OPEN |
|
|
7D05 |
CD |
6B |
0D |
CALL CLS |
очистить экран |
7D08 |
3E |
02 |
|
LD A,+02 |
снова открыть |
|
7D0A |
CD |
01 |
16 |
CALL CHAN-OPEN |
канал S |
|
7D0D |
3E |
41 |
|
LD А,"А" |
печать 'А' |
|
7D0F |
D7 |
|
|
RST 0010 |
|
|
7D10 |
3E |
0D |
|
LD A,"CR" |
переход к, следующей |
7D12 |
D7 |
|
|
RST 0010 |
|
|
7D13 |
01 |
04 |
АЕ |
LD BC,+AE04 |
оператор POINT (4,17 |
7D16 |
CD |
СЕ |
22 |
CALL POINT-1 |
|
|
7D19 |
CD |
E3 |
2D |
CALL PRINT-FP |
печать результата |
7D1C |
C9 |
|
|
RET |
|
|
строке
Вышеприведенная программа аналогична команде PRINT "A"; CHR$ 13; POINT (4,174). ATTR
Номер строки вводится в регистр C, а номер колонки в регистр B, и вызывается подпрограмма как ATTR-1 (2583). Результат выполнения возвращается верхним значением калькуляторного стека. Следующая программа показывает выполнение.
открыть канал S
очистить экран снова открыть канал S
бумага временно становится голубой
печать ключевого слова COPY
переход к следующей строке
P
ична команде PRINT PAPER 5 C
п
;ATTR (0,4).
SCREENS
LD А,+02 CALL CHAN-OPEN CALL CLS LD A,+02 CALL CHAN-OPEN LD A, "Z" RST 0010 LD A,"CR" RST 0010
очистить экран снова открыть канал S
печать символа
переход к следующей строке
Опять номер строки засылается в регистр C, а номер колонки в регистр B. Подпрограмма тогда вызывается путем использования CALL SCREENS-1 (2538). Результат возвращается как входное значение калькуляторного стека, но следует отметить, что это набор параметров строки. Пример:
открыть канал S
7D00 7D02 7D05 7D08 7D0A 7D0D 7D0F 7D10 7D12
3E CD CD 3E CD 3E D7 3E D7
LD ВС,+0000 CALL SCREEN$-1 CALL FETCH CALL PR-STRING RET
оператор SCREENS (0,0)
печать строки
Программа аналогична команде PRINT "Z", CHR$ 13; SCREEN$ (0,0). Помните, что SCREEN$ будет искать только набор символов и, следовательно, ищет коды в диапазоне 16-ном 20-7F.
Ошибка SCREEN$. Двойное запоминание результата не будет иметь место, когда используется входная точка SCREEN$-1.
8.10. PI, RND, INKEYS
Эти функции группируются вместе, потому что их программные вычисления включают вычислитель выражений и невозможно вычислить их непосредственно.
Однако, с использованием программы VAL/VAL$ калькулятора, который вызывается вычислителем выражений, следует рассмотреть преобразование. VAL CHR$ 167 для PI VAL CHR$ 165 для RND
VAL$ CHR$ 166 для INKEY$
PI
Фактическая процедура вычисления для PI будет:
PI=262C
262С RST 0028 использование калькулятора
262D A3 "PI/2"
2 62Е 3B "END-CODE"
262F |
|
|
|
INC (HL) |
удвоение увеличением экспоненты |
|
Процедура занимает 4 адреса и легко копируется. Её можно вызвать VAL CHR$ 167. Пример |
7D00 |
3E |
02 |
|
LD А,+02 |
открыть канал S |
7D02 |
CD |
01 |
16 |
CALL CHAN-OPEN |
|
7D05 |
CD |
6B |
0D |
CALL CLS |
очистить экран |
7D08 |
3E |
02 |
|
LD A,+02 |
снова открыть |
7D0A |
CD |
01 |
16 |
CALL CHAN-OPEN |
канал S |
7D0D |
3E |
А7 |
|
LD А,"Р!" |
кодР1 |
7D0F |
CD |
28 |
2D |
CALL STACK-A |
|
7D12 |
EF |
|
|
RST 0028 |
использовать калькулятор |
7D13 |
2F |
|
|
DEFB +2F |
|
7D14 |
38 |
|
|
DEFB +38 |
строка |
7D15 |
06 |
1D |
|
LD B,+1D |
литерал |
7D17 |
EF |
|
|
RST 0028 |
|
7D18 |
3B |
|
|
DEFB +3B |
|
7D19 |
38 |
|
|
DEFB +38 |
END-COLE |
7D1A |
CD |
E3 |
2D |
CALL PRINT-FP |
|
7D1D |
C9 |
|
|
RET |
|
RND
При включении питания или NEW величина в SEED=0, затем, с помощью 1-го обращения к RND величина SEED становится 74 (10-ное).
сел для SEED 0, 74, 5624,
Это даёт первое случайное число: 74/65535=0,0011291676 последователь 28652...0, 74, т.е. представлены все числа от 0 до 65535.
Правило для изменения величины SEED следующее:
1. Прибавьте 1.
2. Умножьте на 75.
3. Возьмите по модулю 65535, т.е. остаток после деления на 65535.
4. Вычтите 1.
Следующая программа Бейсик показывает эти изменения. 10 INPUT "SEED?";CHR$ 32; SEED 20 PRINT "OLD VALUE=";CHR$ 32; SEED 30 LET SEED=SEED+1 40 LET SEED=SEED*75
50 LET SEED=SEED-65535*INT(SEED/65535) 60 LET SEED=SEED-1
70 PRINT "NEW VALUE="; CHR$ 32; SEED 80 GO TO 30
В программе монитора практическая процедура вычисления RND будет следующей.
RND=2 5FD
RND-END=2625
2 5FD
2601
2604
2605 A1
2606 0F 04 34
80 41 00 00 80 32 02
LD ВС, (SEED) CALL STACK-BC RST 0028
2 60A 260B 260C 2611 2612
2613 A1
2614 03
2615
2616 2617 261A 261E 261F 2620 2622
2624
2625
CALL FP-TO-BC LD (SEED), ВС LD A, (HL) AND А
JR Z,RND-END SUB +10 LD (HL) , A
выборка значения SEED
использование стек "1". SEED-SEED*75
стек "65535"
"N-MOD-M"
"DELETE"
стек "1"
SEED=SEED-1
"DUPLICATE"
"END-CALE"
оператор "CALL 2DA2" новое значение SEED выбор экспоненты проверка на 0
деление на 65535 сохранение экспоненты
Величина для RND теперь представляется верхним значением в калькуляторном стеке. Программа RND может вызываться из программы в машинных кодах рассмотрением результата вычисления. VAL CHR$ 165
Программа для вычисления PI, данная на странице 203, может использоваться с единственным изменением:
7D0D 3E А5 LD A,+A5
INKEYS
Имеется ряд путей, с помощью которых опрос клавиатуры может осуществляться из программы в машинных
кодах:
1. Непосредственным чтением системной переменной LAST-K,
2. Клавиатура может опрашиваться путем использования инструкции IN аналогично KEY-SCAN (028E).
3. Подпрограмма KEY-SCAN может вызываться сама и результат значение клавиши находится по известным таблицам.
4. Действие выполняется по программе INKEY$ (2646 16-ное) могут быть повторены, т.е.
CALL KEY-SCAN: LD C,+00 JR NZ,NO-KEY: CALL KEY-TEST JR NC,NO-KEY: DEC D LD E,A
CALL KEY-CODE
CALL 028E
обеспечение режимов K, L, C не была нажата клавиша регистр или более 2 клавиши
обеспечение режима L или получение номера CALL 0333 И код символа помещается в регистр А.
5. Программа INKEY$ может использоваться вычислением выражения VAL$ CHR$ 166. В следующей программе демонстрируется эта возможность.
7D00 |
3E |
02 |
|
LD А,+02 |
открыть канал S |
7D02 |
CD |
01 |
16 |
CALL CHAN-OPEN |
|
7D05 |
CD |
6B |
0D |
CALL CLS |
очистить экран |
7D08 |
3E |
02 |
|
LD A,+02 |
снова открыть |
7D0A |
CD |
01 |
16 |
CALL CHAN-OPEN |
канал S |
7D0D |
11 |
00 |
08 |
LD DE,+0800 |
установка счётчика на 2048 |
7D10 |
D5 |
|
|
PUSH DE |
|
7D11 |
3E |
А6 |
|
LD A, "INKEY$" |
|
7D13 |
CD |
2B |
2D |
CALL STACK-A |
|
7D16 |
EF |
|
|
RST 0028 |
использование калькулятора |
7D17 |
2F |
|
|
DEFB +2F |
DAVZ |
7D18 |
18 |
|
|
DEFB +18 |
VAL$ |
7D19 |
38 |
|
|
DEFB +38 |
END CALE |
7D1A |
CD |
F1 |
2B |
CALL STK-FETCH |
выбор параметров |
7D1D |
CD |
3C |
20 |
CALL PR-STRING |
печать строки |
7D2 0 |
CD |
BF |
16 |
CALL X-TEMP |
очистка рабочей области |
7D23 |
D1 |
|
|
POP DE |
построение цикла |
7D24 7B LD A,E
7D25 B2 OR D
7D2 6 C8 RET Z
7D27 1B DEC DE уменьшение счётчика
7D2 8 18 E6 JR LOOP
Когда эта программа выполняется, то она аналогична выражению: FOR A=1 ТО 2048: PRINT INKEY$: NEXT A
Возможно, адреса 7D19-7D1F изменить на 1С, 38, CD, E3, 2D, 00, 00. Что даст FOR A=1 ТО 2048: PRINT CODE INKEY$: NEXT A
8.11. BREAK
Во многих случаях полезно, чтобы выход был сделан из программы машинного кода по клавише BREAK.
|
Пример: |
|
|
|
|
BREAK=7D0D |
|
|
|
|
|
7D00 |
3E |
02 |
|
LD А,+02 |
|
открыть канал |
S |
7D02 |
CD |
01 |
16 |
CALL CHAN- |
OPEN |
|
|
7D05 |
CD |
6B |
0D |
CALL CLS |
|
очистить экран |
7D08 |
3E |
02 |
|
LD A,+02 |
|
снова открыть |
|
7D0A |
CD |
01 |
16 |
CALL CHAN- |
OPEN |
канал S |
|
7D0D |
3E |
7F |
|
LD A.+7F |
|
вводной порт |
7FFF |
7D0F |
DB |
FE |
|
IN A,(+FE) |
|
бит 0 регистра A |
7D11 |
1F |
|
|
RRA |
|
сброшен, если |
|
7D12 |
D0 |
|
|
RET NC |
|
нажато BREAK. |
|
7D13 |
18 |
F8 |
|
JR BREAK |
|
|
|
В программе половина ряда клавиатуры от BREAK до B неоднократно просматривается. Выход будет осуществлен только тогда, когда установится бит, который представляет ключ BREAK.
8.12. ЗАКЛЮЧЕНИЕ
Теперь читатель готов к написанию программ в машинных кодах. Программы в машинных кодах могут использоваться в программе на Бейсике. Они вызываются в программе по команде "USR ЧИСЛО". Вся операция может затем повторятся для другой задачи, и, в конце концов, программа Бейсик будет состоять только из одной
строки: 10 RANDOMIZE USR ..............., так как никаких возвратов не будет сделано до тех пор, пока программа
машинного кода не будет выполнена.
VA PRINT
ПРИЛОЖЕНИЕ I ТАБЛИЦА СИМВОЛОВ
10 |
16 |
СИМВОЛ |
МНЕМОНИКА Z80 |
без префикса |
с префиксом #CB |
0 |
00 |
|
NOP |
|
RLC B |
|
1 |
01 |
|
LD BC,nn |
RLC C |
|
2 |
02 |
|
LD (BC |
,A |
RLC D |
|
3 |
03 |
У |
INC BC |
|
RLC E |
|
4 |
04 |
П |
INC B |
|
RLC H |
|
5 |
05 |
Р |
DEC B |
|
RLC L |
|
6 |
06 |
А |
LD B,n |
|
RLC (HL) |
7 |
07 |
В |
RLCA |
|
RLC A |
|
8 |
08 |
Л |
EX AF,AP' |
RRC B |
|
9 |
09 |
Я |
ADD HL,BC |
RRC C |
|
10 |
0A |
Ю |
LD A,(BC) |
RRC D |
|
|
11 |
0B |
Щ |
DEC C |
|
RRC E |
|
|
12 |
0C |
И |
INC C |
|
RRC H |
|
|
13 |
0D |
Е |
DEC C |
|
RRC L |
|
|
14 |
0E |
|
LD C,n |
|
RRC (HL) |
|
15 |
0F |
|
RRCA |
|
RRC A |
|
16 |
10 |
|
DJNZ $+e |
RL B |
|
17 |
11 |
|
LD DE.nn |
RL C |
|
18 |
12 |
|
LD (DE |
,A |
RL D |
|
19 |
13 |
К |
INC DE |
|
RL E |
|
20 |
14 |
О |
INC D |
|
RL H |
|
21 |
15 |
Д |
DEC D |
|
RL L |
|
22 |
16 |
Ы |
LD D,n |
|
RL (HL) |
23 |
17 |
|
RLA |
|
RL A |
|
24 |
18 |
|
JR $+e |
|
RR B |
|
25 |
19 |
|
ADD HL,DE |
RR C |
|
26 |
1A |
|
LD A,(DE) |
RR D |
|
27 |
1B |
|
DEC DE |
|
RR E |
|
28 |
1C |
|
INC E |
|
RR H |
|
29 |
1D |
|
DEC E |
|
RR L |
|
30 |
1E |
|
LD E,n |
|
RR (HL) |
31 |
1F |
|
RRA |
|
RR A |
|
32 |
20 |
пробел |
JR NZ,$+T> |
SLA B |
|
33 |
21 |
! |
LD HL,nn |
SLA C |
|
34 |
22 |
II |
LD (nn |
,HL |
SLA D |
|
35 |
23 |
# |
INC HL |
|
SLA E |
|
36 |
24 |
$ |
INC H |
|
SLA H |
|
37
38 |
25
26 |
I" |
DEC H LD H,n |
|
SLA L SLA (H |
L) |
—Ш |
39 |
27 |
' |
DAA |
|
SLA A |
|
|
40 |
28 |
( |
JR Z,$+e |
SRA B |
|
|
41 |
29 |
) |
ADD HL,HL |
SRA C |
|
|
42 |
2A |
* |
LD HL, |
(nn) |
SRA D |
|
X |
43 |
2B |
+ |
DEC HL |
|
SRA E |
|
44 |
2C |
|
INC L |
|
SRA H |
|
45 |
2D |
- |
DEC L |
|
SRA L |
|
46 |
2E |
|
LD L,n |
|
SRA (HL) |
47 |
2F |
/ |
CPL |
|
SRA A |
|
48 |
30 |
0 |
JR NC,$+e |
[SLI B] |
49 |
31 |
1 |
LD SP,nn |
[SLI C] |
50 |
32 |
2 |
LD (nn |
,A |
[SLI DJ |
51 |
33 |
3 |
INC SP |
|
[SLI E] |
52 |
34 |
4 |
INC (HL) |
[SLI H] |
53 |
35 |
5 |
DEC (HL) |
[SLI L] |
54 |
36 |
6 |
LD (HL |
,n |
[SLI (HL)] |
55 |
37 |
7 |
SCF |
|
[SLI A] |
56 |
38 |
8 |
JR C,$+T> |
SRL B |
|
МНЕМОНИКА Z80
с префиксом #CB
ADD HL,SP LD A,(nn) DEC SP INC A DEC A LD A,n CCF
B |
B |
B |
C |
B |
D |
B |
E |
B |
H |
B |
L |
B |
(HL) |
B |
A |
C |
B |
|
C |
C |
|
C |
D |
|
C |
E |
|
C |
H |
|
C |
L |
C |
(HL) |
C |
A |
D |
B |
D |
C |
D |
D |
D |
E |
D |
H |
D |
L |
D |
(HL) |
D |
A |
LDE, B LD E
C D E H L
(HL) A B C D E H L
(HL) A B C D E H L
(HL) A
57
58
59
60 61 62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 81 82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 101 102
103
104
105
106
107
108
109
110 111 112
113
114
115
116
117
118
39 3A 3B 3C 3D 3E 3F
40
41
42
43
44
45
46
47
48
49 4A 4B 4C 4D 4E 5F
50
51
52
53
54
55
56
57
58
59 5A 5B 5C 5D 5E 5F
60 61 62
63
64
65
66
67
68
69 6A 6B 6C 6D 6E 6F
70
71
72
73
74
75
76
SRL SRL SRL SRL SRL SRL SRL BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT BIT
C D E H L
(HL) A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3
3
4 4 4 4 4 4 4
4
5 5 5 5 5 5 5
5
6 6 6 6 6 6 6
> ?
@
А
В
С
D
Е
F
G
H
I
J
K
L
M
N
О
P
Q
R
S T U
V W X
Y
Z [
LD H LD H LD H LD H LD H LD H LD H LD H
LD LD LD LD LD LD LD LD LD LD LD LD LD LD
J k 1
m n o P
q
r s t u
v
(HL),B (HL),C (HL),D (HL),E (HL),H (HL),L
HALT
B |
IN B,C |
C |
OUT (C),B |
D |
SBC HL,BC |
E |
LD (nn),BC |
H |
NEG |
L |
RETN |
(HL) |
IM 0 |
A |
LD I,A |
B |
IN C,(C) |
C |
|
OUT (C),C |
D |
|
ADC HL,BC |
E |
|
LD BC,(nn) |
H |
|
|
L |
RETI |
(HL) |
|
A |
LD R,A |
B |
IN D,(C) |
C |
OUT (C),D |
D |
SBC HL,DE |
E |
LD (nn),DE |
H |
|
L |
|
(HL) |
IM 1 |
A |
LD A,I |
B |
INE,(C) |
C |
OUT (C),E |
D |
ADC HL,DE |
E |
LD DE,(nn) |
H |
|
L |
|
(HL) |
IM 2 |
A |
LD A,R |
B |
IN H,(C) |
C |
OUT (C),H |
D |
SBC HL,HL |
E |
LD (nn),HL |
H |
|
L |
|
(HL) |
|
A |
RRD |
B |
INL,(C) |
C |
OUT (C),L |
D |
ADC HL,HL |
E |
LD HL,(nn) |
H |
|
L |
|
(HL) |
|
A |
RLD |
B |
IN (HL),(C |
C |
|
D |
SBC HL,SP |
E |
LD (nn),SP |
H |
|
L |
|
(HL) |
|
10 |
16 |
СИМВОЛ |
МНЕМОНИКА Z80 |
без префикса |
с префиксом #CB |
с префиксом #ED |
119 |
77 |
w |
LD (HL),A |
BIT 6,A |
|
120 |
78 |
x |
LD A,B |
BIT 7,B |
IN A,(C) |
121 |
79 |
У |
LD A,C |
BIT 7,C |
OUT (C),A |
122 |
7A |
z |
LD A,D |
BIT 7,D |
ADC HL,SP |
123 |
7B |
{ |
LD A,E |
BIT 7,E |
LD SP,(nn) |
124 |
7C |
| |
LD A,H |
BIT 7,H |
|
125 |
7D |
} |
LD A,L |
BIT 7,L |
|
126 |
7E |
|
LD A,(HL) |
BIT 7,(HL) |
|
127 |
7F |
© |
LD A,A |
BIT 7,A |
|
128 |
80 |
□ |
ADD A,B |
RES 0,B |
|
129 |
81 |
□ |
ADD A,C |
RES 0,C |
|
130 |
82 |
□ |
ADD A,D |
RES 0,D |
|
131 |
83 |
и |
ADD A,E |
RES 0,E |
|
132 |
84 |
□ |
ADD A,H |
RES 0,H |
|
133 |
85 |
л |
ADD A,L |
RES 0,L |
|
134 |
86 |
н |
ADD A,(HL) |
RES 0,(HL) |
|
135 |
87 |
я |
|
ADD A,A |
RES 0,A |
|
|
136 |
88 |
□ |
|
ADC A,B |
RES 1,B |
|
|
137 |
89 |
и |
|
ADC A,C |
RES 1,C |
|
|
138 |
8A |
Е |
|
ADC A,D |
RES 1,D |
|
|
139 |
8B |
И |
ADC A,E |
RES 1,E |
|
140 |
8C |
в |
ADC A,H |
RES 1,H |
|
141 |
8D |
а |
ADC A,L |
RES 1,L |
|
142 |
8E |
в |
ADC A,(HL) |
RES 1,(HL) |
|
143 |
8F |
■ |
ADC A,A |
RES 1,A |
|
144 |
90 |
[А] |
SUB B |
RES 2,B |
|
145 |
91 |
[В] |
SUB C |
RES 2,C |
|
146 |
92 |
[С] |
SUB D |
RES 2,D |
|
147 |
93 |
[D] |
SUB E |
RES 2,E |
|
148 |
94 |
[E] |
SUB H |
RES 2,H |
|
149 |
95 |
[F] |
SUB L |
RES 2,L |
|
150 |
96 |
[G] |
SUB (HL) |
RES 2,(HL) |
|
151 |
97 |
[H] |
SUB A |
RES 2,A |
|
152 |
98 |
[I] |
SBC A,B |
RES 3,B |
|
153 |
99 |
[J] |
SBC A,C |
RES 3,C |
|
154 |
9A |
[K] |
SBC A,D |
RES 3,D |
|
155 |
9B |
[L] |
SBC A,E |
RES 3,E |
|
156 |
9C |
[M] |
SBC A,H |
RES 3,H |
|
157 |
9D |
[N] |
SBC A,L |
RES 3,L |
|
158 |
9E |
[O] |
SBC A,(HL) |
RES 3,(HL) |
|
159 |
9F |
[P] |
SBC A,A |
RES 3,A |
|
160 |
A0 |
[Q] |
AND B |
RES 4,B |
LDI |
161 |
A1 |
[R] |
AND C |
RES 4,C |
CPI |
162 |
A2 |
[S] |
AND D |
RES 4,D |
INI |
163 |
A3 |
[T] |
AND E |
RES 4,E |
OUTI |
164 |
A4 |
[U] |
AND H |
RES 4,H |
|
165 |
A5 |
RND |
AND L |
RES 4,L |
|
166 |
A6 |
INKEY$ |
AND (HL) |
RES 4,(HL) |
|
167 |
A7 |
PI |
AND A |
RES 4,A |
|
168 |
A8 |
FN |
XOR B |
RES 5,B |
LDD |
169 |
A9 |
POINT |
XOR C |
RES 5,C |
CPD |
170 |
AA |
SCREEN$ |
XOR D |
RES 5,D |
IND |
171 |
AB |
ATTR |
XOR E |
RES 5,E |
OUTD |
172 |
AC |
AT |
XOR B |
RES 5,H |
|
173 |
AD |
TAB |
XOR L |
RES 5,L |
|
174 |
AE |
VAL$ |
XOR (HL) |
RES 5,(HL) |
|
175 |
AF |
CODE |
XOR A |
RES 5,A |
|
176 |
B0 |
VAL |
OR B |
RES 6,B |
LDIR |
177 |
B1 |
LEN |
OR C |
RES 6,C |
CPIR |
178 |
B2 |
SIN |
OR D |
RES 6,D |
INIR |
179 |
B3 |
COS |
OR E |
RES 6,E |
OTIR |
180 |
B4 |
TAN |
OR H |
RES 6,H |
|
МНЕМОНИКА Z80
с префиксом #CB
ASN ACS ATN LN EXP INT SQR SGN ABS PEEK IN USR STR$ CHR$ NOT BIN OR
AND
<=
>= <>
LINE TffiN TO STEP DEF FN
CAT FORMAT MOVE ERASE OPEN CLOSE MERGE VERIFY BEEP CIRCLE
INK PAPER FLASH BRIGHT INVERSE OVER OUT LPRINT LLIST STOP READ DATA RESTORE
NEW BORDER CONTINUE DIM REM FOR GO TO GO SUB INPUT LOAD LIST LET PAUSE
181 182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 201 202
203
204
205
206
207
208
209
210 211 212
213
214
215
216
217
218
219
220 221 222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
B5
B6
B7
B8
B9
BA
BB
BC
BD
BE
BF
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED
EE
EF
F0
F1
F2
OR L OR (HL) OR A CP B CP C CP D CP E CP H CP L CP (HL) CP A RET NZ POP BC JP NZ,nn JP nn
CALL NZ,nn PUSH BC ADD A,n RST 0 RET Z RET
JP Z,nn префикс #CB CALL Z,nn CALL nn ADC A,n RST 8 RET NC POP DE JP NC,nn OUT (N),A CALL NC,nn PUSH DE SUB n RST 16 RET C EXX
JP C,nn
IN A,(N)
CALL C,nn
префикс для IX
SBC A,n
RST 24
RET PO
POP HL
JP PO,nn
EX (SP),HL
CALL PO,nn
PUSH HL
AND n
RST 32
RET PE
JP (HL)
JP PE,nn
EX DE,HL
CALL PE,nn
префикс #ED
XOR n
RST 40
RET P
POP AF
JP P,nn
RES RES RES RES RES RES RES RES RES RES RES SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET SET
6 |
L |
|
6 |
(HL) |
|
6 |
A |
|
7 |
B |
LDDR |
7 |
C |
CPDR |
7 |
D |
INDR |
7 |
E |
OTDR |
7 |
H |
|
7 |
L |
|
7 |
(HL) |
|
7 |
A |
|
0 |
B |
|
0 |
C |
|
0 |
D |
|
0 |
E |
|
0 |
H |
|
0 |
L |
|
0 |
(HL) |
|
0 |
A |
|
1 |
B |
|
1 |
C |
|
1 |
D |
|
1 |
E |
|
1 |
H |
|
1 |
L |
|
1 |
(HL) |
|
1 |
A |
|
2 |
B |
|
2 |
C |
|
2 |
D |
|
2 |
E |
|
2 |
H |
|
2 |
L |
|
2 |
(HL) |
|
2 |
A |
|
3 |
B |
|
3 |
C |
|
3 |
D |
|
3 |
E |
|
3 |
H |
|
3 |
L |
|
3 |
(HL) |
|
3 |
A |
|
4 |
B |
|
4 |
C |
|
4 |
D |
|
4 |
E |
|
4 |
H |
|
4 |
L |
|
4 |
(HL) |
|
4 |
A |
|
5 |
B |
|
5 |
C |
|
5 |
D |
|
5 |
E |
|
5 |
H |
|
5 |
L |
|
5 |
(HL) |
|
5 |
A |
|
6 |
B |
|
6 |
C |
|
6 |
D |
|
10 |
16 |
СИМВОЛ |
МНЕМОНИКА Z80 |
без префикса |
с префиксом #CB |
с префиксом #ED |
243 |
F3 |
NEXT |
DI |
SET 6,E |
|
244 |
F4 |
POKE |
CALL P,nn |
SET 6,H |
|
245 |
F5 |
PRINT |
PUSH AF |
SET 6,L |
|
246 |
F6 |
PLOT |
OR n |
SET 6,(HL) |
|
247 |
F7 |
RUN |
RST 4 8 |
SET 6,A |
|
248 |
F8 |
SAVE |
RET M |
SET 7,B |
|
249 |
F9 |
RANDOMIZE |
LD SP,HL |
SET 7,C |
|
250 |
FA |
IF |
JP M,nn |
SET 7,D |
|
251 |
FB |
CLS |
EI |
SET 7,E |
|
252 |
FC |
DRAW |
CALL M,nn |
SET 7,H |
|
253 |
FD |
CLEAR |
префикс для IY |
SET 7,L |
|
254 |
FE |
RETURN |
CP n |
SET 7,(HL) |
|
255 |
FF |
COPY |
RST 56 M |
SET 7,A |
|
ПОЯСНЕНИЯ К ТАБЛИЦЕ СИМВОЛОВ
В первых двух столбцах таблицы приведены коды десятичный (10) и шестнадцатеричный (16). Условные обозначения, встречающиеся в таблице: n 1 байт данных, следующий сразу за кодом команды. Он всегда является последним байтом команды.
nn 16-разрядный операнд (2 байта данных, следующие сразу за кодом команды). Порядок расположения: вначале младший, затем старший.
(nn) 16-разрядный адрес, указанный сразу за кодом команды (сначала младший, затем старший байт). e 8-разрядное смещение относительно адреса в счетчике PC. Располагается сразу за кодом команды.
ПРАВИЛА ПОСТРОЕНИЯ КОДОВ КОМАНД 8-разрядная шина позволяет реализовать непосредственно не более 256 команд. Чтобы снять это ограничение, зарезервированы 4 служебных кода (203 #CB, 221 #DD, 237 #ED и 253 #FD), которые используются как префиксы к кодам. Так, команда LD Н,А имеет код #67, команда BIT 4,A - код #CB #67, а команда RRD - код #ED #67.
Байты #DD и #FD используются как префиксы к командам, работающим соответственно с индексными регистрами IX и IY. Коды команд, использующих в качестве операндов индексные регистры IX и IY, образуются путём добавления префикса к кодам команд, работающих с HL (но без префикса #ED).
Коды команд, использующих индексную адресацию, образуются точно также, только префиксироваться будут команды, работающие с ячейкой памяти, адресуемой (HL). При этом код смещения d всегда является третьим байтом получающегося кода.
Коды недокументированных команд, работающих с частями индексных регистров, образуются из префикса #DD или #FD и кода команды, работающей с регистрами H и L. При этом регистру H соответствуют старшие байты регистров IX и IY (IXh и IYh), а регистру L - младшие (IXl и IYl).
В следующей таблице приведены примеры построения кодов команд, использующих индексные регистры.
ИСХОДНАЯ КОМАНДА |
ПОЛУЧАЕМАЯ КОМАНДА |
Мнемоника |
КОД |
Мнемоника |
Код |
ADD HL,BC |
#09 |
ADD IX,BC |
#DD #09 |
JP (HL) |
#E9 |
JP (IY) |
#FD #E9 |
LD B,(HL) |
#46 |
LD B,(IX+1) |
#DD #46 #01 |
BIT 0,(HL) |
#CB #46 |
BIT 0,(IY-1) |
#FD #CB #FF #46 |
LDA,H |
#7C |
LD A,IXh |
#DD #7C |
LD H,L |
#65 |
LD IXh,IXl |
#DD #65 |
LD L,1 |
#2E #01 |
LD IYl,1 |
#FD #2E #01 |
XOR H |
#AC |
XOR IXh |
#DD #AC |
УПРАВЛЯЮЩИЕ КОДЫ ZX SPECTRUM
10 |
16 |
Вводится с клавиатуры |
Выводится на экран |
0 |
00 |
CS/SS + CS/8 |
Не используется |
1 |
01 |
CS/SS + CS/9 |
Не используется |
2 |
02 |
CS/SS + 8 |
Не используется |
3 |
03 |
CS/SS+ 9 |
Не используется |
4 |
04 |
CS/3 (True Video) |
Не используется |
5 |
05 |
CS/4 (Inverse Video) |
Не используется |
6 |
06 |
CS/2 (Caps Lock) |
Табуляция (аналогично использованию запятой в операторе Бейсика "PRINT") |
7 |
07 |
CS/1 (Edit) |
Не используется |
8 |
08 |
CS/5 |
Backspace (перемещение позиции печати на 1 символ влево) |
9 |
09 |
CS/8 |
Не используется |
10 |
0A |
CS/6 |
Не используется |
10 |
16 |
Вводится с клавиатуры |
Выводится на экран |
11 |
0B |
CS/7 |
Не используется |
12 |
0C |
CS/0 (Delete) |
Не используется |
13 |
0B |
Enter |
CR + LF (Возврат каретки + Перевод строки) |
14 |
0E |
CS/SS (Extend Mode) |
Не используется |
15 |
0F |
CS/9 (Graphics Mode) |
Не используется |
16 |
10 |
CS/SS + 0 |
Код управления цветом тона (INK control) |
17 |
11 |
CS/SS + 1 |
Код управления цветом фона (PAPER control) |
18 |
12 |
CS/SS + 2 |
Код управления мерцанием (FLASH control) |
19 |
13 |
CS/SS + 3 |
Код управления яркостью (BRIGHT control) |
20 |
14 |
CS/SS + 4 |
Код управления инверсией (INVERSE control) |
21 |
15 |
CS/SS + 5 |
код управления наложением (OVER control) |
22 |
16 |
CS/SS + 6 |
Код управления позицией печати (AT control) |
23 |
17 |
CS/SS + 7 |
Код управления табуляцией (TAB control) |
24 |
18 |
CS/SS + CS/0 |
Не используется |
25 |
19 |
CS/SS + CS/1 |
Не используется |
26 |
1A |
CS/SS + CS/2 |
Не используется |
27 |
1B |
CS/SS + CS/3 |
Не используется |
28 |
1C |
CS/SS + CS/4 |
|
Не используется |
29 |
1D |
CS/SS + CS/5 |
|
Не используется |
30 |
1E |
CS/SS + CS/6 |
|
Не используется |
31 |
1F |
CS/SS + CS/7 |
|
Не используется |