Машинные коды 1993 г.

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


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

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

а. выбор области ram.

Программист должен определить требуемый объем памяти. В
SPECTRUMe имеется несколько областей памяти, которые могут
использоваться, но демонстрация программ в этой главе будет представлена

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

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

В SPECTRUM можно вводить коды только по команде РОКЕ. Однако
операнд этой команды может быть задан как десятичное или двоичное
число или как выражение. Поэтому следующие строки все равносильны:

10 РОКЕ 32000,201

10 РОКЕ 32000, BIN 1100 1001

10 LET А-201; POKE 32000А

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

10 LET D-32000: REM HEX LOADER

20 DEF FN A(A$,B)-CODE A$(B)-48-7*(CODE A$(B)>57)

30 DEF FN C(A$)-16*FN A(AS, 1)+FN A(A$,2)

40 READ A$: IF A$<>m"m THEN POKE D,

FN C(A$); LETD-D+1; GO TO 40

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

Пример:

50 DATA я00в,Ю1У02т,"*я
RUN

32002И25ДеТ КТ°МУ> 410 32000 будет содержать 0, адрес 32001 - 1, адрес

с выполнение программы.

Команда бэйсика "USR число** позволяет остановить выполнение
программы монитора SPECTRUMa и начать выполнять программу в кодах.
Важно убедиться, что операнд "USR** установлен на требуемую команду,
что программа пользователя кончается командой MRET если необходимо
вернуться в бэйсик.

Примеры USR :

PRINT USR N - печатает десятичное значение содержимое в регистре

ВС.

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

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

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

6.1 ПРОГРАММЫ.

Груша 1. Команда мНет операции** (NOP). Эта команда очень простая.
Программа в машинных кодах, содержащая одну или более строк мнет
операции** заканчивается RET. Следующая программа ассемблера показывает
простое использование команды NOP.

шщ££ мапт, Коп обозкукнис комментарии

7D00 00 NOP нет операции

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

Программа 1 позволяет загрузить выше приведенную программу на
ассемблере (ASM) в SPECTRUM.

■ Программа 1. NOP

50 DATA т00т,тС9Ув

60 LET A-USR 32000

70 PRINT "НОРМАЛЬНОЕ ЗАВЕРШЕНИЕ NOP9

Группа 2. Программы для непосрсдствсной загрузки регистров.

Команда **USR число** возвращает значение регистра ВС как абсолютное
16-битовое число, и команда PRINT отображает его в десятичном виде в
диапазоне от 0 до 65535. В следующем примере В и С регистры загружаются
постоянными, используя команды из этой группы. Программа 2
демонстрирует это, используя программу в кодах:

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

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

Пользователь может задавать различные значения в качестве входных
операндов.

■ Программа 2. LD B,+DD

50 DATA я06УООУОЕУООя

51 DATA яС9т,т0фт

60 INPUT :ВВЕДИТЕ ЗНАЧЕНИЯ ДЛЯ РЕГИСТРА С ( ТОЛЬКО 0-255)m;N

70cls

80 РОКЕ 32003, N

90 PRINT AT 10,0; "РЕГИСТР С ТЕПЕРЬ СОДЕРЖИТ ; CHR$ 32,USR 32000

100 GOTO 60

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

00 00 LD BC,+DDDD пользователь вводит71Х)3 C9RET различные значения
В програме 3 можно задавать различные величины "LD DC,+ DDDD".
Введенная вличина-должна быть разбита на младший и старший байты
прежде, чем она может бьпъ загружена в регистр командой РОКЕ.

■ Программа 3. LD BCf+DDDD

50 DATA т0Г,в00У00в

51 DATA mC9V"m

60 INPUT "ВВЕДИТЕ ЗНАЧЕНИЕ ДЛЯ РЕГИСТРОВОЙ ПАРЫ ВС (ТОЛЬКО 0-
255)";CHR$ 32;N

70 CLS

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

90 PRINT AT 10,0, "ВС РЕГИСТР ТЕПЕРЬ СОДЕРЖИТ; CHR$ 32; USR 32000

100 GOTO 60

Группа 3. Команды копирования и обмена регистров.
Команды копирования типа регистр-регистр могут быть
продемонстрированы загрузкой регистров, отличных от регистров В и С,
постоянными, которые затем копируются в В и С для возврата их
пользователю.

7D00 Об 00 LD В,+00 регистр В=0

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

7D04 4D LD C,L в регистр С копируется регистр L

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

В программе 4 переменная величина записывается в регистр В и
пересылается в регистр С.

■ Програма 4. LD C,L

50 DATA "06я,т00т,ЯЯ,"00я

51 DATA m4Dm;C9m;**m

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 60

СЛЕДУЮЩИЕ ДАЛЕЕ ПРОГРАММЫ ВООДУШЕВЯТ ЧИТАТЕЛЯ.

50 DATA Я06Я,Я00Я,ЯЯГ00Я

51 DATA 965m;7Ctm5r;5r

52 DATA яя,'С9я,тффя

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

■ Пример.

7D00 2600 LD Н,+00 регистр Н=0

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

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

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

7D06 4В LD С,Е регистр С = регистру Е

7D07 С9 RET

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

50 DATA m26V00V2E",M00m

51 DATA ЯЕВЯ,Я42Я/4ВЯ

52 DATA ЯС9Я,яффя

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

Последние две программы этой группы посвящены командам EX AF,F
и ЕХХ. Можно использовать и другие регистры, кроме Н и 1„ которые
содержат адрес возврата в бэйсик. Читатель может включить эти команды
в программу 4.

■ Пример.

50 DATA "06""00","2В""00я

51 DATA "08","D9'f"D9","06"

52 DATA m4DVC9m;**m

В строке 51 переключаются все основные регистры на альтернативные,
а затем производится обратное переключение без изменения их содержимого.
Группа 4. Команды загрузки регистров из памяти.
Команды в этой группе позволяют пользователю загрузить регистр
содержимым ячейки памяти. Эта адресация может бьггь абсолютной,
косвенной и индексной.

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

7D00 06 00 LD В,+00 загрузка регистра В

7D02 ЗА FF 7С LD A,(STORE) выборка значения из

памяти

7D05 4F LD С,А

7D06 09 RET

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

■ Программа 5. LD A, (ADDR)

50 DATA "06я,"00е

51 DATA m3Am/FFe,m7Cm

52 DATA m4FVC9V0m"

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

80 POKE 31999,N 90 PRINT AT 100; яTHE LOCATION STORE NOW HOLDS";
CHR$ 32; USR 32000

100 GOTO 60

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

7D00 0600 LD В,+00 регистр В=0

7D02 21 FF 1С LD HL,+STORE HL указывает на STORE
7D05 4Е LD C,(HL> выборка значения

7D06 С9 RET

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

■ Программа 6. LD C,(HL).

50 DATA "06Y009

51 DATA я21m,mFFwfm7Cm
53 DATA -4EYC9Y0m-

Строки 60-100 как в программе 5.

Третья программа показывает индексную адгоссацию. В этой программе
адрес 31936 (7CC0h) называется BASE, а адрес 31999 (7CFFh)-STORE.

BASE=7CC0
STORE=BASE+3F
7D00 06 LD В,+00 регистр В=0

7D02 DD 21 СО 7CLD DC,+BASE установка IX
7D06 DD 4Е 3F LD C,(BASE+3F) выборка значения из памяти
7D09 С9 RET

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

Программа 7. LD 1X,+BAS£

50 DATA V6V00я

51 DATA "DD"2J" "CO","7С"

52 DATA mDDe,m4EV3F-

53 DATA ЯС9УФ0Я

Строки 60-100 как в программе 5.

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

Группа 5. Команды загрузки памяти константами или данными,
хранящимися в регистрах.

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

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

STORE=7CFFh

7D00 3E00 LD А,+хх ввод различных значений

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

STORE

7D05 С9 RET

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

■ Программа 8. LD (ADDR),А

50 DATA яЗЕт/00в

51 DATA m32YFFY7Cm

52 DATA вС9",

60 INPUT яENTER A VALUE FOR LOCATION STORE (0-255 ONLY)";

70CLS

80 POKE 32001,N; RANDOMIZE USR 32000

90 PRINT AT 10.0;THE LOCATION STORE NOW HOLDS ; CHR$ 32; PEEK
31999

100 GOTO 60

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

STORE=7CFF

7D00 IE 00 LD Е,+хх вводится значение в регистр Е

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

7D05 73 LD (HL),E пересылка из Е в память

7D06 С9 RET

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

■ Программа 9. LD (HL),E

50 DATA ят,т99я

51 DATA "2 / * "FF", m7Cm

52 DATA а73я,яС9я,я**в

Строки 60-100 как в программе 8.

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

BASE=7D3D
STORE=BASE-3E
7D00 3E00 LDA,+xx вводится значение

7D02 DD 21 3D 7D LD DC,+BASE DC указывает на BASE
7D06 DD 77 С2 LD (IX-3E),A IX-3E рассматривается как IX+C2
7D09 С9 RET

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

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

50 DATA яЗЕяя009

51 DATA "DD",Я2Г,"3D","7D"

52 DATA m77VC2e

53 DATA eC9"fm**"

Группа 6. Команды сложения.

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

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

7D01 ЗЕ 00 LD А,+хх вводится значение 00 в регистр А

7D03 06 00 LD В,+хх вводится значение 00 в регистр В

7D05 80 ADD А,В суммирование

7D06 0600 LD В,+00 регистр В=0

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

7D09 С9 RET

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

Программа 11. ADD А,В

50 DATA "ОО'/ЗГ/ОО"

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

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

53 DATA вС9У*т

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 32000,F.POKE 32004,S

100 PRINT AT 10,5,F;CHR$ 32, "ADD";CHR$ 32,S;CHR$ 32; "-";CHR$ 32;USR

32000
110 GOTO 60

Вторая программа для этой группы использует команду INC ВС

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

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

7D04 С9 RET

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

Программа 12.INC ВС

50 DATA ЮГГООУОО"

51 DATA ЮЗя,яОЗя,яС9я,я0фя

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

100 PRINT AT 10.0;CHR$ 32;"INCREMENTS TO GIVE";CHR$ 32; USR 32000
110 GOTO 60

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

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

7D01 ЗЕОО LDA,+xx вводятся значения

7D03 0600 LD B,+xx

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

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

7D08 С9 RET

Эта программа используется в программе 13, в которой пользователь
складывает 2 числа вместе с битом переноса. Флаг переноса всегда
устанавливается. Используйте эффект замены команды SCF на AND А
(A7h), которая даст сброс флага переноса.

■ Программа 13 ADC А,В

50 DATA яЗГ,яЗЕт;00я

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

52 DATA "06я "00я e4F"

53 DATA яС9",тф0Я

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

90 POKE 32002,F:POKE 32004,S 100PRINT AT 10,0, 'WITH GARRY SET,CHR$
32;F;CHR$ 32; mADC,CHR$ 32;S, CHR$ 32;"-m,CHR$ 32;USR 32000

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

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

STORE=7CFF

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

7D01 3E00 LDA,+xx вводятся значения

7D03 0600 LD В,+хх

7D05 90 SUB В вычитание

7D06 0600 LD В,+00 регистр В=0

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

7D09 3E00 LD А,+00 регистр А=0

7D0B СЕ 00 ADC А,+00 сложение с переносом
7D0D 32 FF 7С LD (STORE) передача значения флага переноса

в STORE

7D10 С9 RETURN

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

■ Программа 14 SUB В

50 DATA ЮОУЗЕУОО"

51 DATA "06е,"00","90я

52 DATA я06я,я00:я

53 DATA "3E",'00',"CEe,"00"

54 DATA "32","FF',"7Cr

55 DATA "С9","ффя

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;F;CHR$ 32;mSUBe;CHR$ 32;S;CHR$ 32 9-m;CHR$ 32;USR
32000;CHR$ 32 *WITH GARRr;CHR$ 32; "SET AND PEEK
31999;mRESET AND NOT PEEK 31999

110 GOTO 60

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

Вторая группа команд содержит команду DEC. Команда DEC ВС может
бьпъ показана после соответствующих исправлений в программе 12. Ими
являются:

51 DATA ЮВЯ,ЯС9Я,ЯФФЯ

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

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

50 DATA яЗГ,"ЗЕ",я00" ДЛЯ УСТАНАВКИ С-ФЛАТА ИЛИ

50 DATA яА7я,яЗЕя;00я ДЛЯ СБРОСА С-ФЛАТА

51 DATA я06я,я00я,я98я SBC А,В

100 изменение SUB на SBC

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

Группа 8. Команды сравнения.

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

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

51 DATA "06",900в,тВ8"

100 PRINT AT 10,0,F;CHR$ 32;9CPm;CHR$ 32;S;CHR$ 32; 9GIVE GARRU9;CHR$
32;

и добавить строки

101 RANDOMIZE USR 32000

102 PRINT 9RE9 AND NOT PEEK 31999'SET

Группа 9. Логические команды.

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

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

7D00 3E00 LD А,+хх

7D02 0600 LD В,+хх вводятся значения

7D04 АО AND В логическое "Ии

7D05 32FF70 LD(STORE) результат в STORE
7D08 С9 RET

В программе 15 используется вышеприведенная подпрограмма.
Пользователю предлагается ввести 2 значения поочередно. При вводе
каждого Значения оно показывается в двоичной форме. Результат считывается
из STORE с использованим РЕЕК 31999 и также дается в двоичной форме.

■ Программа 15. AND В

50 DATA "ЗЕ","00"

51 DATA "06", "00"

52 DATA ЯА0Я

53 DATA "32","FF",m7C"

54 DATA тС9'ГФт

60 INPUT "ENTER A FIRST VALUE(0-255)m;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&O SUB 300

140 PRINT AT 14,7;*GIVESm
150 RANDOMIZE 32000

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

170 GOTO 60

300 REM BINARY OF F

3WFORN-7TO I STEP-1

320 LET P-2

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

340 LET F-F-INT{F/P)*P

350 NEXT N

360 PRINT INT F

370 RETURN

Программа IS может быть применена для демонстрации команд OR В
и XOR В. Для OR В требуется внести изменения в строки 52 и 100
следующим образом:

52 DATA вВ0я

100 PRINT AT W,8;"ORa

И для XOR В:

52 DATA 'А8'

100 PRINT AT W,8;mXORm

Группа 10. Команды переходов.

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

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

NEXT=7D0B>

7D00 3E00 LD А,+хх вводятся 2 значения и сравни-

7D02 FE00 CP +хх ваются между собой

7D04 0100 00 LD ВС.+0000 ВС=0

7D07 1806 JRNEXT переход на NEXT

7D09 00 NOP для дальнейшего использования

7D0A С9 RET выход, если не было перехода

7D0B 00000000 не используется

7D0F 03 INC ВС увеличение С, если был переход

7D10 С9 RET выход

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

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

■ Программа 16. JR Б

50 DATA тЗЕт,"00"

51 DATA JFE","00"

52 DATA ЮГ/ОО'/ОО9

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

54 DATA "C9"

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

56 DATA '03','C9',""

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

90 INPUT "ENTER A FIRST VALUE (0-255)";CHR$ 32;F
100 PRINT F;CHR$ 32;'CP';CHR$ 32;
110 INPUT "ENTER A SECOND VALUE(0-255)';CHR$ 32;S
120 PRINTS

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 PAUSE 50

180 IF INKEY$-A THEN GOTO 180
190 CLS.GOTO 60

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

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

53 DATA "20","06","00" -JR NZ,E
70 PRINT "JR NZ,E:

53 DATA я28V06V00m -JR Z,E

70 PRINT'JR ZE9

53 DATA яЗОУОбУОО' -JR NQE

70 PRINT-JR NC,E

53 DATA -38-/00-/00- ~JR C,E

70 PRINT -JR C,E-

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

7D07 C3 0F7D JP NEXT

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

JP ADDR 53 DATA "СЗY0Fy7D"

70 PRMINT "JP ADDR**
JP NZ,ADDR 53 DATA MC2yOFy7D"

70 PRINT "JP NZ,ADDR-
JP Z,ADDR 53 DATA f,CAV,0F,/7DH

70 PRINT "JP ZADDR"
JP NZ,ADDR 53 DATA "D2Y0F"7D"

70 PRINT "JP NZ ADDR"
JP C,ADDR 53 DATA "DAy0F77D"

70 PRINT MJP C,ADDR"
JP POADDR 53 DATA "Е2и,"0Р,'7Ои

70 PRINT "JP POADDR"
JP PEADDR 53 DATA "EA'V'OF'.^D"

70 PRINT "JP PE,ADDR"
JP P,ADDR 53 DATA "F27'0FY7D"

70PR1NT "JP PADDR"
JP M,ADDR 53 DATA "FAyOF^D"

70PRINT "JP M,ADDR"

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

Группа 11 команды DJNZ,E

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

10 FOR А-65 ТО 90
20 PRINT CHR$ А

30 NEXT А

40 GOTO 10

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

ШОР=7ЕЮ2

7D00 06 1А LD В,+1А задание счетчика циклов

7D02 ЗЕ SB LD А,+5В

7D04 90 SUB В регистр А содержит значение

7D05 D7 RST0010 печать символа

7D06 10 FA DJNZ,LOOP следующая буква
7D08 С9 RET

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

■ Программа 17.

50 DATA "00я/1 А"

51 DATA вЗЕв,вя

52 DATA '909

53 DATA я10я,"FA"

55 DATA -С9Я,""

60 PRINT

70 RANDOMIZE USR 32000

80 GOTO 70

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

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

7D00 21 00 00 LD HL,+XXXX вводятся значения
7D03 Е5 PUSH HL сохраняются в стеке

7D04 01 POP ВС пересылаются в ВС

7D05 С9 RET

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

Программ» 18. PUSH HL ■ POP ВС.

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

51 DATA 'E5';C1"

52 DATA "С9У"

60 INRUT "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-";CHRS 32;USR 32000
100 GOTO 60

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

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

NEXT=7D0Fh

7D00 3E00 LD А,-Нос вводятся 2 значения и

сравниваются

7D02 FE00 СР+хх

7D04 0100 00 LDBC.+0000 ВС=0

7D07 CD OF 7D CALL NEXT вызов подпрограммы

7D0A С9 RET возврат в бэйсик

7 D0B 000000

7D0F 03 INC ВС увеличение ВС

7D10 С9 RET возврат из подпрограммы

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

130 PRINT AT 12,0 "CALL"

CALL N7.ADDR 53 DATA "C4","0F77D"

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

70 PRINT "CALL ADDR"
CALL ZADDR 53 DATA "CCY0F,"7D"

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

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

70 PRINT "CALL C.ADDR"
CALL PO^DDR 53 DATA "E4","0F"7D"

70 PRINT "CALL PO.ADDR"
CALL PEADDR 53DATA "EC","0F,"7D"

70 PRINT "CALL PEADDR"
CALL PADDR 53 DATA "E4","0F"7D"

70 PRINT HCALL P,ADDR"
CALL M,ADDR 53 DATA "FCyOF-^D"

70 PRINT "CALL M,ADDR"

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

7D00 ЗЕ 00 LD А,+хх вводятся 2 значения и

7D02 FE 00 CP +хх сравниваются

7D04 01 0101 LD ВС,+0001 ВС=1

7D07 D8 RET СС возврат, если флаг С=1

7D08 0В DEC ВС уменьшение ВС

7D09 C9RET

Группа 13. Команды сдвига.

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

STORE=7CFF

7D00 AF XOR очистка регистра А

7D01 FE 00 CP +хх сравнение с 0

7D03 06 00 LD В,+00 регистр В=0

7D05 0В 00 LD С,+хх вводятся значения

7D07 СВ 01 RLC С сдвиг

7D09 ЗЕ 00 LD А,+00 регистр А=0

7D0B СЕ 00 ADC А,+00 пересылка состояния С

7D0D 32 FF 7С LD (STORE),А флага в STORE
7D10 C9RET

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

■ Программа 19. RLC С

50 DATA -AFYFEVOO"

51 DATA я06т,т00т,т0ЕГ00т

52 DATA 'СВУ0Г

53 DATA m3Em;00m;CEV00m

54 DATA m32VFFY7Cw

55 DATA mC9m,***"

60 PRINT AT 2,0, "INSTRUCTION....."

70 PRINT "RLC С"

80 INPUT mGARRY RESET OR SET?(0/1)m,CHR$ 32;C
90 POKE 32002, С

100 PRINT AT 6,0;GARRY-',C
110 INPUT яENTER A VALUE (0-255)' CHR$ 32;F
120 POKE 32006, F

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

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

190 IF INKEY$-"" THEN GOTO 190

200 CLS.GOTO 60

300 REM BINARY OF F

310 FOR N-7 TO 1 STEP-!

320 LET P-2

330 PRINT CHR$(48-h!NT(F/P));CHR$ 32

340 LET F-F-INT(F/P)0P

350 NEXT N

360 PRINT INT F

370 RETURN

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

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

Группа 14. Команды обработки битов.

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

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

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

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

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

LOOP=7D05
PRINTS DOC

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

7D03 06 10 LD В,+10 счетчик цикла на 16 бит

7D05 СВ 1С ВГГ 7,N проверяется левый байт

7D07 ЗЕ 30 LD А/О* подготовка для печати 0

7JD09 28 01 JR Z,PRINT переход, если символ 1

7D0B ЗС INC А символ 1

7D0C D7 RST 0010 печать 0 или 1

7D0D ЗЕ 20 LD A/SF печать пробела
7D0FD7 RST0010

7D10CB15RLL сдвиг L

7D12CB14RLH сдвиг Н

7D14 10 EF DJNZ,LOOP повторить
7D16C9RET

Программа 20 использует данную процедуру.
■ Программа 20. BIT 7,Н

50 data я21т,я00я,я00т

51 data ят;10в;свя;7ст

52 data "зе","30","28я,"01"

53 data "3cm,md7m

54 data "3e","20m,"d7m

55 data "св'/15m,'cb','14'

56 data m10',mef",'c9',"**m

60 input 'enter a value(0-65535)m; chr$ 32;f
70 poke 32001,f'1nt(f/256i*256
80 poke 32002,!nt(f/256)
90 cls

100 print at 10,8; 'binary of ';chr$ 32;f
110 print at 12,14;ais"

120 PRINT AT 14.0;

130 RANDOMIZE 32000

140 GOTO 60

Группа 15. Команды обработки блока.

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

7D00 21 00 40 LDHL,+4000 первая строка экрана

7D03 1100 48 LDDE,+4800 начало строки

7D06 0100 08 LD ВС,+0800 2048 адресов

7D09 ED ВО LDIR пересылка блока

7D0B С9 RET

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

■ Программа 21. LDIR

50 DATA '21в,'00я,'40я

51 DATA Я1 Iя,я00я,я48я

52 DATA ЮГ,"00я,"08"

53 DATA :ED'/BOя

54 DATA 'С9ЯГ*Я

60 INPUT "ENTER YOUR CHARACTERS-8 LINES';C$

70 PRINT C$

80 RANDOMIZE USR 32000

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

Программа 22, которая использует команду CPIR, дает адрес первого
байта в ROM SPECTRUMa, который хранит заданный байт. Выполняя
программу, можно обнаружить, что все значения 0-2SS могут быть найдены
в ROM, но значение 154 впервые встречается в адресе 11728.
Программа имеет вид:

7D00 3E00 LD А,+хх ввод образца

7D02 01 FF 3F LD BC,+3FFF старший адрес ROM
7D05 2100 00 LDHL,+0000 первый адрес ROM

7D08 EDB1 CPIR поиск в ROM

7D0A 44 LD В,Н пересылка адреса байта

7D0B 4D LD C,L

7DOC OB DEC ВС указатель на искомый адрес

7D0D С9 RET

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

50 data "зе'/оо"

51 data "0r,'ffe,m3f"

52 data *219"00*,'00*

53 data 'edvb1y44v4dя

54 data яв;с9т;*фя
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

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




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
ZX-Обоз - Итог всем предыдущим номерам газеты.
Top chart
Опрос - Анкета фирмы "Scorpion".
Интeрвью - Flying^DR: Твoрeц кoдa.
От авторов - Наконец-то появился постоянный кодер, графику нам по прежнему рисует Циркуль.

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