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

Демонстрационные примеры программ в кодах - программы.


6. ДЕМОНСТРАЦИОННЫЕ ПРИМЕРЫ ПРОГРАММ В КОДАХ

Основная цель главы - дать читателю сведения о начальных проблемах, связанных с написанием программ в машинных кодах. Команды Z80 перечислены в главе 5, но не указывается, как ими пользоваться на SP. Настоящая глава содержит серию демонстрационных программ. В главе 8 будут даны советы, как программа машинного кода может быть написана, чтобы иметь полное представление о преимуществе цветного SP и дисплея с высоким разрешением. Имеется три точки зрения, подлежащие обсуждению.

A. Выбор области RAM.

Программист должен определить требуемый объём памяти. В SP имеется несколько областей памяти, которые могут использоваться, но демонстрация программ в этой главе будет представлена в области RAM с адреса 32000 и дальше. Программа в кодах в этой области, если требуется, может сохраняться на ленте (SAVE) или загружаться с ленты (LOAD) как блок данных.

Б. Ввод кодов программы.

В SP можно вводить коды только по команде POKE. Однако операнд этой команды может быть задан как 10-ное или 2-ное число или как выражение. Поэтому следующие строки все равносильны: 10 POKE 32000,201 10 POKE 32000,BIN 1100 1001 10 LET A=201: POKE 32000,A

Каждая может оказаться полезной в определенном случае. Рекомендуемый метод заключается в описании команд машинного кода в их соответствующих 16-ных символах. Следующий 16-ный загрузчик будет использоваться во всей главе!!!

10 D=32000: REM HEX LOADER

20 DEF FN A(A$,B)=CODE A$ (В)-48-7* (CODE A$(B)-57) 30 DEF FN C(A$)=16*FN A (A$,1)+FN A(A$,2)

40 READ A$: IF A$<>"**" THEN POKE D,FN С(А$): LET D=D+1: GO TO 40

Загрузчик будет считывать данные из DATA, в котором каждая пара 16-ных символов заключена в кавычки и отделена от других пар запятыми. Пара символов "**" используется как символ конца. Пример:

50 DATA "00","01","02","**" RUN

Это приведет к тому, что адрес 32000 содержит 0, адрес 32001 содержит 1, адрес 32002 содержит 2.

B. Выполнение программы.

Команда Бейсика "USR число" позволяет остановить выполнение программы монитора в SP и начать выполнять программу в кодах. Важно убедиться, что операнд "USR" установлен на требуемую команду, что программа пользователя кончается командой "RETURN", если необходимо, вернуться в Бейсик, и что величина возвращенной командой "USR" обработана соответствующим образом. Примеры USR:

PRINT USR N - печатает 10-ное значение содержимое регистровой пары BC.

RANDOMIZE USR N - влияет на генератор случайных чисел.

LET A=USR N - изменяет переменную A.

Каждая из этих форм полезна при определенных условиях. Следующие программы представлены в формате ассемблера, и оператор DATA используется совместно с 16-ным загрузчиком. Команды представлены в том же порядке, как и в главе 5.

6.1. ПРОГРАММЫ

Группа 1

Команда "нет операции" (NOP) (см. стр. 33). Эта команда очень простая, и программа машинного кода, содержащая одну или более строк "нет операции", заканчивается "RET".

Следующая программа ассемблера показывает простое использование команды NOP.

Адрес Код Обозначение Комментарии

7D00 00 NOP NOP

7D01 С9 RET возврат

Следующая программа Бейсик показывает, как изменить вышеприведенную программу на ассемблере (ASM)

для SP.

Программа 1. "NOPE" 50 DATA "00","C9","**" 60 LET A=USR 32000

70 PRINT "нормальное завершение NOP"

Группа 2

Программы для непосредственной загрузки регистров (см. стр. 33). Команда "USR число" возвращает

_Демонстрационные примеры программ в кодах_

значение регистра BC как абсолютное 16-битовое число, и команда PRINT отображает в 10-ном виде от 0 до 65535. В следующем примере B и C регистры загружаются постоянными, используя команды из этой группы, и программа 2 Бейсик использует программу кода.

7D00 06 00 LD В,00 регистр B=0

7D02 0Е 00 LD С,+ХХ пользователь вводит различные значения

7D04 С9 RET

В программе 2 команды 'LD B,+ADD' И LD C+ADD' обе используются. Пользователь может задавать различные значения в качестве входных операндов.

Программа 2.

50 DATA "06","00","0Е","00"

51 DATA "C9","**"

60 INPUT "введите значения для регистра С (только 0-255) ";N 70 CLS

80 POKE 32003,N

90 PRINT AT 10,0; "регистр С теперь содержит "; CHR$ 32; USR 32000 100 GO TO 60

Следующая программа показывает команду LD BC,+DDDD 7D00 01 00 00 LD BC,+DDDD пользователь вводит

7D03 С9 RET различные значения

В программе 3 можно задавать различные величины "LD BC,+DDDD". Введенная величина должна быть разбита на младший и старший байты прежде, чем она может быть заслана по POKE. Программа 3. "LD BC,+DDDD"

50 DATA "01,"00","00"

51 DATA "C9","**"

60 INPUT "введите значение для регистра пары BC (только 0-255)"; CHR$ 32;N 70 CLS

80 POKE 32001,N-256*INT(N/256): POKE 32002,INT(N/256)

90 PRINT AT 10,0, "Регистр BC теперь содержат"; CHR$ 32; USR 32000

100 GO TO 60

Группа 3

Команды копирования и обмена регистров (см. стр. 33).

Команды копирования регистр-регистр могут быть показаны загрузкой регистров, отличных от регистров B и C, постоянными, которые затем копируются в B и C регистры для возврата их пользователю. 7D00 06 00 LD B,+00 регистр В=0

7D02 2Е 00 ID L,+00 вводится значение

7D04 4D LD C,L регистр С = регистр L

7D05 С9 RET

В программе 4 переменная заводится в регистр B и пересылается в регистр C. Программа 4. "LD C,L"

50 DATA"06","00","2E","00"

51 DATA "4D","C9","**"

60 INPUT "введите значения для регистра L (только 0-255)"; CHR$ 32; N 70 CLS

80 POKE 32003,N

90 PRINT AT 10,0; "С регистр теперь содержит"; CHR$ 32; USR 32000 100 GO TO 50

Нижеследующие программы воодушевят читателя.

50 DATA "06","00","OE","00"

51 DATA "65","7C","57","5F"

52 DATA "4B","C9","**"

Команда 'EX DE,HL' может также быть включена в программу 4. Пример.

7D00 26 00 LD H,+00 регистр H=0

7D02 2Е00 LD L,+00 вводятся значения

7D04 ЕВ EX DE,HL пересылается в DE

7D05 42 LD B,D регистр B = регистр D

7D06 4В LD C, E регистр С = регистр E

7D07 С9 RET

Это задается следующим оператором DATA.

50 DATA "26","00","2E","00"

51 DATA "EB","42","4B"

52 DATA "C9","**"

и может использоваться с программой 4.

Последние две программы этой группы посвящены командам 'EX AF.'F'' и 'ЕХХ'. Пользователю можно

_Демонстрационные примеры программ в кодах_

использовать альтернативные регистры, кроме Н' и L', содержащие адрес возврата в Бейсик. Читатель может включить эти команды в программу 4. Пример.

50 DATA "06","00","2E","00"

51 DATA "08","D9","D9","06"

52 DATA "4D","C9","**"

Строка 51 переключает все основные регистры, а потом переключает их обратно, не изменяя.

Группа 4

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

Первая программа показывает абсолютную индексацию. Задается адрес 31999, имеющий имя STORE, и команда LD A,(ADDR) используется для выборки содержимого STORE по следующей программе. STORE в строке 1 присваивается значение 31999 (16-ное 7CFF). 7D00 06 00 LD В,+00 регистр В

7D02 3A FF 7С LD A,(STORE) выборка текущего значения

7D05 4F LD С,А

7D06 09 RET

В программе 5 пользователь может вводить различные значения, сохраняемые в STORE, и вышеприведенная программа на ASM возвращает их пользователю. Программа 5. "LD A,(ADDR)"

50 DATA "06","00"

51 DATA "3A","FF","7C"

52 DATA '^,,,"С9","**"

60 INPUT "INTER A VALUE FOR LOCATION STORE(0-255 ONLY)"; CHR$ 32; N 70 CLS

80 POKE 31999,N

90 PRINT AT 10,0; "THE LOCATION STORE NOW HOLDS"; CHR$ 32; USR 32000 100 GO TO 60

Вторая программа показывает косвенную адресацию. В ней адрес STORE загружается в регистр HL до использования команды "LD C,(HL)" STORE=7CFF. 7D00 06 00 LD B,+00 регистр B=0

7D02 21 FF 7С LD HL,+STORE HL указывает на STORE

7D05 4E LD ^(HL) выборка текущего значения

7D06 С9 RET

В программе 6 пользователь может вводить различные величины, сохраняемые в STORE. Программа 6. "LD C,(HL)"

50 DATA "06","00"

51 DATA "21","FF","7C"

52 DATA "4E","C9","**" строки 60-100 как в программе 5.

Третья программа показывает индексную адресаций. В этой программе адрес 31936 (7CC0) называется BASE, а адрес 31999 (7CFF) - STORE, BASE=7TC0 STORE=BASE+3F

7D00 06 LD B,+00 -^регистр B=0

7D02 DD 21 С0 6С LD IX,+BASE установка IX 7D06 DD 4E 3E LD ^(BASE+3F) выборка текущего значения

7D09 С9 RET

В программе 7 пользователь опять вводит различные значения, которые помещаются в STORE. Программа 7.

50 DATA "06","00"

51 DATA "DD","21","C0","7C"

52 DATA "DD","4E","3F"

53 DATA "C9","**" строки 60-100 как в программе 5.

В программе используется регистр IX, но вполне возможно использование регистр IY, но при этом байты машинного кода надо заменить DD на FD. Заметьте, что маскируемое прерывание потребует блокирования, в то время, пока IY содержит новую величину.

Группа 5

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

Первая программа показывает абсолютную адресацию. В программе абсолютный адрес для команды 31999, 16-ной 7CFF, названной 'STORE', используется команда 'LD (ADDR),A'.

STORE

7D00 3E 00 LD A,+XX ввод различных значений

7D02 32 FF 7С LD (STORE), А ввод текущего значения в STORE

7D05 С9 RET

В программе 8 пользователь опять вводит различные значения в STORE. Программа в машинных кодах выполняется использованием через RANDOMIZE USR 32000, и величина STORE задается использованием РЕЕК 31999.

Программа 8. "LD (ADDR),A".

50 DATA "3E","00"

51 DATA "32","FF","7C"

52 DATA "C9","**"

60 INPUT "INTER A VALUE FOR LOCATION STORE (0-255 ONLY) ";N 70 CLS

80 POKE 32001,N: RANDOMIZE USR 32000

90 PRINT AT 10,0;"THE LOCATION STORE NOW HOLDS"; CHR$32; PEEK 31999 100 GO TO 50

Вторая программа показывает косвенную адресацию. В этой программе регистровая пара HL указывает на STORE, а команда 'LD (HD),E' используется для передачи.

STORE=7CFF

7D00 1E 00 LD E,+XX вводится значение

7D02 21 FF 7C LD HL,STORE HL-указывает на STORE

7D05 73 LD (HL),E пересылка

7D06 С9 RET

В программе 9 пользователь опять вводит величину, которая должна передаваться в STORE и обратно считываться с помощью PEEK 31999. Программа 9. "LD (HL),E"

50 DATA "1E","99"

51 DATA "21","FF","7C"

52 DATA "73","C9","**" Строки 60-100 как в программе 8.

В 3-ей программе используется индексная адресация. В этом случае адрес 32061 (7D3D) называется BASE, и STORE поэтому рассматривается как ('BASE-3E'). BASE=7D3D STORE=BASE-3E

7D00 3E 00 LD A,+XX вводится значение

7D02 DD 21 3D 7D LD IX,+BASE IX указывает на BASE

7D06 DD 77 C2 LD (IX-3E),A IX-3E рассматривается как IX+CR

7D09 С9 RET

В программе 10 пользователь опять вводит величины, которые должны быть переданы в STORE, и считывает обратно с помощью PEEK 31999.

Программа 10. "LD (IX+D),A"

50 DATA "3E","00"

51 DATA "DD","21","3D","7D","DD"

52 DATA "77","C2"

53 DATA "C9","**"

Программы 5-10 все использовали 1-байтовые числа и соответствующие команды регистров.

Группа 6.

Команды сложения (см. стр. 36). Команды этой группы позволяют складывать величины вместе (ADD) и увеличивать значение (INC) и складывать с битом переноса.

Первая программа показывает использование команды 'ADD A,B'.

7D00 00 NOP будет использоваться позже

7D01 3E 00 LD A,+XX вводятся значения

7D03 06 00 LD B,+XX

7D05 8 0 ADD A,B суммирование

7D06 06 00 LD B,+00 регистр B=0

7D08 4F LD C,A пересылка результата

7D09 С9 RET

В программе 11 пользователь вводит 2 числа. Эти числа передаются в регистры А и В и складываются вместе в двоичной арифметике. Результат возвращается функцией USR. Программа 11. "ADDA.B".

50 DATA "00","3E","00"

51 DATA "06","00","80"

52 DATA "06","00","4F"

53 DATA "C9","**"

60 INPUT "INTER A FIRST VALUE (0-255) ";CHR$ 32,F 70 INPUT "INTER A SECOND VALUE (0-255)";CHR$ 32;S 80 CLS

90 POKE 32000,F: POKE 32004,S

100 PRINT AT 10,5;F;CHR$ 32;"ADD";CHR$ 32;S;CHR$ 32;"=";CHR$ 32;U SR 32000 110 GO TO 60

Вторая программа для этой группы использует команду INC BC. 7D00 01 00 00 LD B^+ХХХХ вводятся значения

7D03 03 INC BC значение увеличивается

7D04 09 RET

В программе 12 пользователь вводит число в диапазоне 0-65535. Это число затем делится на старшую и младшую части и помещается командой POKE в адреса 7D01 и 7D02. Регистровая пара BC затем увеличивается, и значение возвращается функцией USR. Заметьте эффект ввода значения 65535. Программа 12. "INC BC".

50 DATA "01","00","00"

51 DATA "03","C9","**"

60 INPUT "ENTER A VALUE (0-65535)"; CHR$ 32; N 70 POKE 32002,INT(N/256) 80 POKE 32001,N-256*INT(N/256) 90 CLS

100 PRINT AT 10,0; CHR$ 32;"IN CREMENTS TO GIVE"; CHR$ 32; USR 32000 110 GO TO 60

Третья программа показывает использование команды. Это та же программа, которая используется в программе 11, но изменена для включения команды ADC А,В, а не ADD A,C.

7D00 37 SCF установка флага переноса

7D01 3E 00 LD A,+XX вводятся значения

7D03 06 00 LD B,+XX

7D05 8 8 ADC А, В суммирование с переносом

7D06 06 00 LD B,+00 регистр B=0

7D08 С9 RET

Эта программа используется в программе 13, в которой пользователь складывает 2 числа вместе с битом переноса. Флаг переноса всегда устанавливается.

Используйте эффект замены команды SCF на AND А (16-ное А7), которая даёт сброс флага переноса. Программа 13. "ADC A,B".

50 DATA "37","3E","00"

51 DATA "06","00","88"

52 DATA "06","00","4F"

53 DATA "C9","**"

60 INPUT "ENTER A FIRST VALUE (0-255) "; CHR$ 32;F 70 INPUT "ENTER A SECOND VALUE (0-255)"; CHR$ 32;S 80 CLS

90 POKE 32002,F: POKE 32004,S

100 PRINT AT 10,0;"WITH GARRY SET"; CHR$ 32;F; CHR$ 32;"ADC"; CHR$ 32;S; CHR$ 32;"="; CHR$ 32; USR 32000

Группа 7. Команды вычитания.

Команды в этой группе позволяют вычесть одну величину из другой (SUB), декрементировать значение (DEC) и вычесть бит переноса (SBC).

Первая программа для этой группы команд использует команду 'SUB В'. Состояние флага переноса определяется после вычитания, и величины 0 или 1 сохраняются в STORE.

будет использоваться дальше вводятся значения

вычитание регистр B=0 пересылка результата регистр A=0 сложение с переносом

передать значение флага переноса в STORE

В программе 14 вышеприведенная программа вызывается после того, как пользователь вводит значения для регистров A и B. Значение флага переноса получено использованием PEEK 31999.

STORE

;=7CFF

7D00

00

NOP

7D01

3E

00

LD A,+XX

7D03

06

00

LD B,+XX

7D05

90

SUB В

7D06

06

00

LD B,+00

7D08

4F

LD С, А

7D09

3E

00

LD A,+00

7D0B

СЕ

00

ADC A,+00

7D0D

32

FF 7С

LD (STORE),A

7D10

С9

RET

_Демонстрационные примеры программ в кодах_

Программа 14. "SUB B".

50 DATA "00","3E","00"

51 DATA "06","00","90"

52 DATA "06","00","4F"

53 DATA "3E","00","CE","00"

54 DATA "32","FF","7C"

55 DATA "C9","**"

60 INPUT "INTER A FIRST VALUE (0-255)";CHR$ 32;F 70 INPUT "INTER A SECOND VALUE (0-255)";CHR$ 32;S 80 CLS

90 POKE 32002,F: POKE 32QO4,S

100 PRINT AT 10,0; F; CHR$ 32;"SUB"; CHR$ 32; S; CHR$ 32;"="; CHR$ 32; USR 32000;

CHR$ 32;"WITH GARRY"; CHR$ 32;"SET" AND PEEK 31999;"RESET" AND NOT PEEK 31999 110 GO TO 60

Используйте приведенную программу с числами, которые меньше, больше и равны одно другому. Вторая группа команд содержит команду DEC. Команда DEC BC может быть показана, сделав соответствующие исправления в программе 12. Ими являются. 51 DATA "0B","C9","**"

100 PRINT AT 10,0; H; CHR$ 32;"DECREMENTS TO GIVE"; CHR$ 32; USR 32000

Третья подгруппа команд содержит команду SBC. Команда SBC может быть показана, сделав соответствующие исправление в программе 14. Ими являются:

50 DATA "37","3E","00" для установки С-флага или

51 DATA "A7","3E","00" для сброса С-флага

52 DATA "06","00","98" 'SBC A,B' 100 изменение SUB на SBC

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

Группа 8

Команды сравнения (см. стр. 40). Команды сравнения по Существу такие же, как команды сложения, исключая тот факт, что регистр A не изменяется. Флаг переноса изменяется и в последствии может проверяться.

Команда CP B может быть показана ещё раз, сделав соответствующие изменения в программе 12. 51 DATA "06","00","В8"

100 PRINT AT 10,0;F;CHR$ 32;"CP";CHR$ 32;S,CHR$ 32;"GIVE CARRY";CHR$ 32; и добавить строки

101 RANDOMIZE USR 32000

102 PRINT "RE" AND NOT PEEK 31999;"SET"

Группа 9

Логические команды (см. стр. 40).

Команды в этой группе позволяют осуществлять логические операции AND, OR, XOR над двумя 8-битовыми числами.

Следующая программа показывает команду 'AND B', которая используется в логических операциях над двумя значениями, вводимыми пользователем.

7D0O 3E 00 LD A,+ХХ

7D02 06 00 LD B,+ХХ вводятся значения

7D04 A0 AND B логическое И

7D05 32 FF 7С LD (STORE),A результат в STORE

7D08 С9 RET

В программе 15 используется вышеприведенная программа. Пользователю предлагается ввести 2 значения поочередно, при вводе каждого значения оно показывает в двоичной форме. Результат считывается из STORE с использованием PEEK 31999 и также даётся в двоичной форме. Программа 15. "AND B".

50 DATA "3E","00"

51 DATA "06","00"

52 DATA "A0"

53 DATA "32","FF","7C"

54 DATA "C9","**"

60 INPUT "ENTER A FIRST VALUE (0-255)"; CHR$ 32; F 70 CLS

80 POKE 32001,F

90 PRINT AT 8,4: GO SUB 300

100 PRINT AT 10,8;"AND"

110 PRINT "ENTER A SECOND VALUE (0-255) "; CHR$ 32; S

120 POKE 32003,S 130 PRINT AT 12,4: LET F=S: GO SUB 300 140 PRINT AT 14,7;"GIVES" 150 RANDOMIZE USR 32000

160 PRINT AT 16,4; :LET F=PEEK 31999: GO SUB 300

170 GO TO 60

300 REM BINARY OFF

310 FOR N=7 TO 1 STEP -1

320 LET P=2AN

330 PRINT CHR$(48+INT(F/P)); CHR$ 32;

340 LET F=F-INT(F/P)*P

350 NEXT N

360 PRINT INT F

370 RETURN

Программа 15 может быть применена для демонстрации команд 'OR B' и 'XOR B'. Для OR B требуется внести изменения в строки 52 и 100 следующим образом: 52 DATA "B0" 100 PRINT AT 10,8;"OR" и для 'XOR B' 52 DATA "A8" 100 PRINT AT 10,8;"XOR"

7D00 3E 00 7D02 FE 00

LD А.+ХХ

CP +XX

LD BC.-ЮО0О

JR NEXT

NOP

RET

INC BC RET

7D04 7D07 18 7D09 00 7D0A C9

7D0B 00 00 00 00 7D0F 03 7D10 C9

01 00 00 06

Группа 10

Команды переходов (см. стр. 42). Семнадцать команд этой группы позволяют сделать переходы из одной части программы машинного кода к другой. Переходы могут быть относительными от -128 до +127 от значения счётчика команд, или абсолютными, т. е. задаётся адрес следующей команды. Переход может быть сделан условно в зависимости от состояния основных флагов, хотя только абсолютные команды перехода имеют полный диапазон имеющихся команд.

Следующая программа будет использоваться в программе 16, чтобы показать команды этой группы.

NEXT=7D0E

вводятся 2 значения и сравниваются между собой BC=0

переход на NEXT для дальнейшего использования выход если не было перехода не используется увеличение С если был переход выход

В приведенной программе в паре регистров BC будет возвращено значение 0, если не делается переход, и 1, если делается переход.

Программа 16 приведена для демонстрации команды 'JR E'. Эта команда является безусловной, так что переход будет вне зависимости от результата сравнения величин введенных пользователем. Программа 16. " MR E"

50 DATA "3E","00"

51 DATA "FE","00"

52 DATA "01","00","00"

53 DATA "18","06","00"

54 DATA "C9"

55 DATA "00","00","00","00"

56 DATA "03","C9","**"

60 PRINT AT 4,0;"КОМАНДА" 70 PRINT "JR E" 80 PRINT AT 8,0;

90 INPUT "INTER A FIRST VALUE (0-255) ",CHP$ 32; F 100 PRINT F; CHR$ 32;"CP"; CHR$ 32;

110 INPUT "INTER A SECOND VALUE (0-255)",CHR$ 32; S 120 PRINT S

130 PRINT AT 12,0;"JUMP=" 140 POKE 32001,F: POKE 32003,S

150 LET R=USR 32000: PRINT "NO" AND NOT R; "YES" AND R 160 PRINT AT 21,0;"ANY KEY TO CONTINUE" 170 PAVSE 50

180 IF INKEY$="" THEN GO TO 180 190 CLS: GO TO60

_Демонстрационные примеры программ в кодах_

В программе пользователю предложено ввести две величины, выполняется операция сравнения, а затем, если необходимо, переход.

Переменная R будет = 0, если перехода не было и 1, если необходим переход.

Программа написана так, что пользователь может путём замены только строк 53 и 70 продемонстрировать 14 из 17 переходов.

Для команд перехода изменениями являются: 53 DATA "20","06","00" JR NZ,E 70 PRINT "JR NZ,E" 53 DATA "28","06","00" JR Z,E 70 PRINT "JR Z,E" 53 DATA "30","06","00" JR NC,E 70 PRINT "JRNC.E 53 DATA "38","00","00" JR C,E 70 PRINT "JR C,E"

Команды абсолютного перехода показаны изменением программы машинного кода, так что абсолютный переход осуществляется к адресу NEXT. Строка команды по адресу NEXT (7D0F) будет теперь читаться -JP ADDR.

7D07 C3 0F7D JP NEXT

Изменения в программе 16:

ние этой же программы. Обратите внимание, что

задание счетчика циклов

регистр А содержит печать символа следующая буква

значение

53

DATA "

C3"

,"0F","7D"

JP

ADDR

70

PRINT

"JP

ADDR"

53

DATA "

C2"

,"0F","7D"

JP

NZ,ADDR

70

PRINT

"JP

NZ,ADDR"

53

DATA "

CA"

,"0F","7D"

JP

Z,ADDR

70

PRINT

"JP

Z,ADDR"

53

DATA "

D2"

,"0F","7D"

JP

NZ,ADDR

70

PRINT

"JP

NZ,ADDR"

53

DATA "

DA"

,"0F","7D"

JP

C,ADDR

70

PRINT

"JP

C,ADDR"

53

DATA "

E2"

,"0F","7D"

JP

PO,ADDR

70

PRINT

"JP

PO,ADDR"

53

DATA "

EA"

,"0F","7D"

JP

PE,ADDR

70

PRINT

"JP

PE,ADDR"

53

DATA "

F2"

,"0F","7D"

JP

P,ADDR

70

PRINT

"JP

P,ADDR"

53

DATA "

FA"

,"0F","7D"

JP

M,ADDR

70

PRINT

"JP

M,ADDR"

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

Группа 11

Команды DJNZ E. Эта команда является очень полезной командой и может легко использоваться для получения простых циклов в программе машинного кода. Чтобы использовать команду, программист сначала должен определить число требуемых циклов, и это число должно быть занесено в регистр В. Цикл может быть выполнен по команде 'DJNZ E' аналогично NEXT.

Следующие 4 строки программы Бейсик будут без конца печатать алфавит заглавными буквами. Когда экран будет заполнен, появится вопрос "SCROLL ?". 10 FOR A=65 ТО 90 20 PRINT CHR$ A 30 NEXT A 40 GOTO 10

Следующая программа машинного к программист может использовать только уменьшение на 1. LOOP=7D02

7D00 06 1А LD B,+1A

7D02 3E 5B LD A,+5B

7D04 90 SUB В

7D05 D7 RST 0010

7D06 10 FA DJ NZ,LOOP

7D08 C9 RET

Программа 17 использует вышеприведенную программу для печати алфавита на экране TV-приемника. Каждое обращение USR 32000 будет повторять операцию печати еще и еще раз. Программа 17.

50 DATA "06","1A"

51 DATA "3E","5B"

_Демонстрационные примеры программ в кодах_

52 DATA "90","D7"

53 DATA "10","FA" 55 DATA "C9","**" 60 PRINT

70 RANDOMIZE USR 32000 80 GO TO 70

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

RINT

70 PRINT "CALL NZ,ADDR" 53 DATA "DC","0F","7D" 70 PRINT "CALL C,ADDR" 53 DATA "E4","0F","7D" 70 PRINT "CALL PO,ADDR" 53DATA "EC","0F","7D" 70 PRINT "CALL PE,ADDR" 53 DATA "E4","0F","7D" 70 PRINT "CALL P,ADDR" 53 DATA "FC","0F","7D" 70 PRINT "CALL M,ADDR" Следующая программа машинного кода может использоваться для демонстрации команд RET. Однако она составлена для тренировки читателя, чтобы он сделал необходимые исправления в программе 16. 7D00 3E 00 LD А,+ХХ вводятся 2 значения и

Группа 12

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

7D00 21 00 00 LD HL,+XXXX вводятся значения

7D03 Е5 PUSH HL сохраняются в стеке

7D04 C1 POP BC пересылаются в BC

7D05 C9 RET

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

Программа 18. "PUSH HL и POP BC".

50 DATA "21","00","00"

51 DATA "E5","C1"

52 DATA "С9","**"

60 INPUT "ENTER A VALUE (0-65535) "; CHR$ 32; F 70 POKE 32001,F-INT(F/256)*256: POKE 32002,INT(F/256) 80 CLS

90 PRINT AT 10,0;"VALUE TAKEN OFF STASK="; CHR$ 32; USR 32000 100 GO TO 60

Читателю предлагается использовать альтернативные процедуры в этой программе. Но следует быть уверенным, что число команд PUSH совпадает с POP.

3 и 4 подгруппы содержат команды CALL и RET.

Следующая программа в машинных кодах может использоваться для демонстрации различных команд CALL.

NEXT=7D0F

7D00

3E

00

LD A,+XX

вводятся 2 значения и сравниваются

7D02

FE

00

СР +XX

7D04

01

00

00

LD BC,+0000

BC=0

7D07

CD

0F

7D

CALL NEXT

вызов подпрограммы

7D0A

C9

RET

возврат в Бейсик

7D0B

00

00

00

7D0F

03

INC BC

увеличение BC

7D10

С9

RET

возврат из подпрограммы

Эта процедура может использоваться в программе 18 с последующими изменениями для различных команд. 130 PRINT AT 12,0;"CALL"

CALL NZ,ADDR CALL ADDR CALL Z,ADDR CALL NZ,ADDR CALL C,ADDR CALL PO,ADDR CALL PE,ADDR CALL P,ADDR CALL M,ADDR

53 DATA "C4","0F","7D"

70 PRINT "CALL NZ,ADDR" 53 DATA "CD","0F","7D"

70 PRINT "CALL ADDR" 53 DATA "CC","0F","7D"

70 PRINT "CALL Z,ADDR" 53 DATA "D4","0F","7D"

сравниваются BC=1

возврат, если флаг С=1 уменьшение BC

7D02 FE 00

7D04 01 01 00

7D07 D8

7D08 0В

7D09 C9

СР +XX LD BC,+0001 RET С DEC BC RET

Группа 13

Команды сдвига (см. стр. 49).

Имеется большое количество команд сдвига. В программе 19 используется следующая процедура, чтобы продемонстрировать семь типов сдвига, в качестве примера выбран регистр С.

STORE=7CFF

-? RINT

7D00

AF

XOR A

очистка регистра A

7D01

FE

00

СР +ХХ

сравнен, со значением

0

7D03

06

00

LD B,+00

регистр B=0

7D05

00

LD C,+XX

вводятся значения

7D07

СВ

01

RLC С

сдвиг

7D09

3E

00

LD А,+00

регистр А=0

7D0B

СЕ

00

ADC A,+00

пересылка состояния С-

флага

7D0D

32

FF 7C

LD (STORE),А

в STORE

7D10

C9

RET

В программе 19 пользователю предлагается ввести 0 или 1, чтобы сбросить или установить флаг переноса. Следующая подсказка просит ввести значения. Она передается в регистр C и сдвигается, как требуется. Результат печатается совместно с текущим значением флага переноса. Программа 19. "RLC С".

50 DATA "AF","FE","00"

51 DATA "06","00","0E","00"

52 DATA "CB","01"

53 DATA "3E","00","CE","00"

54 DATA "32","FF","7C"

55 DATA "C9","**"

60 PRINT AT 2,0;"INSTRUCTI0N......"

70 PRINT "RLC C"

80 INPUT "CARRY RESET OR SET? (0/l)"; CHR$ 32; C

90 POKE 32002,C

100 PRINT AT 6,0;"CARRY-"; C

110 INPUT "ENTER A VALUE (0-255) "; CHR$ 32; F 120 POKE 32006,F

130 PRINT AT 10,0,-"INITIAL VOLUE";: GO SUB 300 140 LET F=USR 32000

150 PRINT AT 14,0;"FINAL VALUE": GO SUB 300 160 PRINT AT 18,0;"CARRY-"; PEEK 31999 170 PRINT AT 21,0;"ANY KEY TO CONTINUE" 180 PAUSE 0

190 IF INKEY$="" THEN GO TO 190 200 CLS: GO TO 60 300 REM BINARY OFF 310 FOR N=7 TO 1 STEP -1 320 LET P=2AN

330 PRINT CHR$(48+INT(F/P)) 340 LET F=F-INT(F/P)*P 350 NEXT N 360 PRINT INT F 370 RETURN

Программа 19 может быть использована для демонстрации 7 команд, которые используют регистр C.

52 DATA "СВ","01" 52 DATA "СB","09" 70 PRINT "RRC С" 52 DATA "CB","11" 70 PRINT "RL С" 52 DATA "CB","19" 70 PRINT "RR С" 52 DATA "CB","21" 70 PRINT "SLA С" 52 DATA "CB","29" 70 PRINT "SRA C"

RLC С RRC С

RL С

RR С

SLA С

SRA С

SRL С 52 DATA "CB","39"

70 PRINT "SRL C"

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

LOOP=

:7D05

PRINT

'=7D0C

7D00

21

00 00

LD HL,+XXXX

7D03

06

10

LD В,+10

7D05

CB

BIT 7,H

7D07

3E

30

LD А,"0"

7D09

28

01

JR Z,PRINT

7D0B

3C

INC A

7D0C

D7

RST 0010

7D0D

3E

20

LD A,"SP"

7D0F

D7

RST 0010

7D10

CB

15

RL L

7D12

CB

14

RL H

7D14

10

EF

DJ NZ,LOOP

7D16

C9

RET

вводятся значения счётчик цикла на 10 бит проверяется левый байт подготовка для печати 0 переход, если символ 1 символ 1 печать 0 или 1 печать пробела

сдвиг L сдвиг Н повторить

Группа 14

Команды обработки битов (см. стр. 50).

Команды этой группы могут делиться на три подгруппы. Команды RES и SET не очень часто используются, и здесь не приводятся программы Бейсика, чтобы показать их использование.

Читатель, однако, может попробовать написать простые программы, которые используют эти команды.

Команды BIT в большей степени являются самыми полезными в этой группе, и следующая программа показывает, как BIT 7,H используется.

Программа 20 является программой 2-ной печати. Пользователю предложено ввести целое число в диапазоне 0-65535. Программа машинного кода затем вызывается, чтобы отпечатать 2-ное представление.

Значение помещается пользователем в регистровую пару HL, и 7-ой бит регистра Н считывается и печатается. Регистры Н и L затем сдвигаются влево, перенос из регистра L поступает в регистр Н, опять 7-ой бит регистра Н считывается и печатается. Операция чтения и сдвига выполняется 17 раз, чтобы получить полное двойное число.

Программа представлена следующим образом:

Программа 20 показывает используемую процедуру. Программа 20. "BIT 7,H".

50 DATA "21","00","00"

51 DATA "06","10","CB","7C"

52 DATA "3E","30","28","01"

53 DATA "3C","D7"

54 DATA "3E","20","D7"

55 DATA "CB","15","CB","14"

56 DATA "10","EF","C9","**"

60 INPUT "ENTER A VALUE (0-65535)"; CHR$ 32; F 70 POKE 32001,F-INT(F/256)*256 80 POKE 32002,INT(F/256) 90 CLS

100 PRINT AT 10,8;"BINARY OF "; CHR$ 32 110 PRINT AT 12,14,-"IS" 120 PRINT AT 14,0; 130 RANDOMIZE USR 32000 140 GO TO 60

Группа 15

Команды обработки блока (см. стр. 51).

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

Из всех команд в группе LDIR будет, несомненно, самой распространенной.

Следующая программа использует команду LDIR для копирования верхней трети области экрана в область средней трети. Это означает, что когда программа вызывается, все байты в области адресов 4000-47FF копируются командами в адреса 4800-4FFF Пользователь может увидеть, что это произошло, так как все символы, которые были в строках 0-7, были продублированы в строки 8-15.

Программа представлена следующим образом: 7D00 21 00 40 LD HL,+4000 первая строка экрана

7D03 11 00 48 LD DE,+4800 начало строки

7D06 01 00 08 LD BC,+0800 2048 адресов 7D09 ED B0 LDIR пересылка блока

RINT

7D0B C9 RET

Программа 21 использует эту Процедуру. Программа 21. "LDIR".

50 DATA "21","00","40"

51 DATA "11","00","48"

52 DATA "01","00","08"

53 DATA "ED","B0"

54 DATA "C9","**"

60 INPUT "ENTER YOUR CHARACTEERS-8 LINES"; C$ 70 PRINT C$

80 RANDOMIZE USR 32000

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

Нижеследующая программа демонстрирует команду CPIR. Программа 22, которая использует стандартную программу, даёт адрес первого байта в 16K SP, который хранит специфицированный байт. Когда программа выполняется, можно видеть, что все значения 0-255 м.б. найдены в ROM, но значение 154 впервые встречаются в адресе 11728 и поэтому является редко используемой величиной в этой части ROM.

Программа имеет вид:

7DO0

3E

00

LD A,+XX

7D02

01

FF

3F

LD BC,+3FFF

7D05

21

00

00

LD HL,+0000

7D08

ED

B1

CPIR

7D0A

44

LD B,H

7D0B

4D

LD C,L

7D0C

0B

DEC BC

7D0D

C9

RET

ввод образца старший адрес ROM первый адрес ROM поиск в ROM пересылка адреса байта

указатель на искомый адрес

Программа 22. "CPIR".

50 DATA "3E","00"

51 DATA "01","FF","3F"

52 DATA "21","00","00"

53 DATA "ED","B1","44","4D"

54 DATA "0B","C9","**" 60 FOR F=0 TO 255

70 POKE 32001,F

80 PRINT F; TAB 4;"OCCURS FIRST AT LOC."; CHR$ 32; USR 32000 90 NEXT F

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




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


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

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



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

Похожие статьи:
End - Усе на ентой грусной ноте и кончим!
Форум - М.Бекарев. Расчет адреса экранной области по знакоместу и наоборот.
Железо - схема Cashe памяти для Спектрума.

В этот день...   19 декабря