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"
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
Группа 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 важно, т к. она открывает канал для основной области экрана. Если эта команда или подобная ей опускается, тогда будет сделана печать в области редактирования
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
СР +XX LD BC,+0001 RET С DEC BC RET
Группа 13
Команды сдвига (см. стр. 49).
Имеется большое количество команд сдвига. В программе 19 используется следующая процедура, чтобы продемонстрировать семь типов сдвига, в качестве примера выбран регистр С.
STORE=7CFF
7D00 |
AF |
|
XOR A |
очистка регистра A |
|
7D01 |
FE |
00 |
СР +ХХ |
сравнен, со значением |
0 |
7D03 |
06 |
00 |
LD B,+00 |
регистр B=0 |
|
|
7D05 |
0Е |
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 |
7С |
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 пересылка блока
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
Читатель может переписать эти программы, используя неавтоматические команды. Здесь не приводятся программы для команд ввода-вывода, команд прерываний и небольшой группы смешанных команд, но читатель может написать их сам.