Программирование в машинных кодах 1993 г.

Использование подпрограмм монитора - шестнадцатеричный ввод; команда beep; сохранение и загрузка; элементы цвета; команды cls и scroll; подпрограмма печати; команды plot, draw и circle; point, attr, screens; pi, rnd, inkeys; break; управляющие коды zx spectrum.


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

3E CD 3E CD CD C9

01 28 00 28 F8

2D

2D 03

секунда

Когда вышеприведенная программа будет выполнена, она даст тот же эффект, как ВЕЕР 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

7D00 37 SCF

7D01 7D03 7D07 7D0A CD 7D0D C9

3E DD 11

установка флага переноса (сбрасывается для 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

8D 5C

F8 02

8D 5C

поиск ATTR-P пересылка битов в биты 2-0

5-3

ввести новый цвет сдвиг байта

сохранить 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

53

5C

Заметьте, что 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

7D00 7D02 7D05 7D07 7D0A

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 не влияют на использование текущего канала.

S

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 ( временное )

оператор PRINT "B"

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

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

02 01 6B 02 01

открыть канал S

очистить экран снова открыть канал S сохранить

16 0D

16

значение H'L'

36 43 64

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

восстановить H'L'

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

переход к следующей строке

оператор ATTR (0,4)

P

ична команде PRINT PAPER 5 C

CHR$ 255;CHR$ 13

п

;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

02 01 6B 02 01 7А

0D

16 0D

16

7D13 01 00 00

7D16 CD 38 25

7D19 CD F1 2B

7D1C CD 3C 20 7D1F C9

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

31 38

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 ТАБЛИЦА СИМВОЛОВ

с префиксом #ED

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

СИМВОЛ

10

16

без префикса

с префиксом #ED

с префиксом #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 LD LD LD LD LD

£ a b

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

СИМВОЛ

10

16

без префикса

с префиксом #ED

с префиксом #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

Не используется




СОДЕРЖАНИЕ:
  1. Принципы Работы Микрокомпьютерной Системы - Z80 - Микропроцессор; 16k Rom; Ula; Pal - Кодировщик; Rom Область; Карта Памяти Экранной Области; Область Атрибутов; Буфер Печати; Системные Переменные; Карты Микродрайвов; Область Информационных Каналов; Область Бейсик-Программы; Формат Строк Бп; Область Переменны; Область Редактора; Рабочая Область; Стек Вычислителя; Резервная Память; Машинный Стек; Go Sub - Стек; Графическая Область, Определенная Пользователем.


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

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



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

Похожие статьи:
Новiны - обзор местных новостей.
Книга - Тайники ZX-Spectrum: Ошибки в Системе.
Сеть - Сетевые новости. Список BBS: ZX-Net 095, Независимые BBS.
Рек-тайм - Реклама и объявления ...
Форум - Усовершенствование Art Studio. Идеи относительно компрессии файлов.

В этот день...   25 апреля