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

Глава 8 - использование подпрограмм монитора.


8. использование подпрограмм монитора.

8.1 ВВЕДЕНИЕ.

Цель этой главы - показать, что программы машинного кода могут бьпъ
написаны для SPECTRUM относительно просто, используя большое число
подпрограмм, которые всегда имеются в программе монитора. Во многих
случаях метод основан на бэйсике, так как соответствующие программы
машинного кода разработаны, чтобы выполнить простые предписания
бэйсика. Эти программы могут бьггъ вызваны функцией USR-ЧИСЛО.
Основная программа может быть сформирована, объединив вместе ряд
небольших программ машинного кода.

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

8.2 ШЕСТНАДЦАТИРИЧНЫЙ ВВОД

В главе 6 программа HEX. LOADER (шестнадцатиричный загрузчик)
была представлена для того, чтобы читатель мог составить программу
машинного кода в списке данных DATA и потом выполнить ее. Однако
HEX. LOADER не совсем подходит для больших программ и предпочтительна
следующая программа :

10 let d-32000: rem hex input

15 rem ua3age

20 def fn a (a&b)-code a$(b)-48*(code a&b)>57)
30 def fn с (a$)-16*fn a(a$t 1)+fn a(a$,2)
40 def fn g$(f)-chr$(f+48+7*(f>9))
50 def fn h$(e)-fnn g$(!nt(e/16)}+fn g$(e-16*int(e/16))
60 dim a$(2)

70 print fn h$(peek d); tab 7;
fn h$(innt(d/256)); fn h$(d-256*int(d/256));
80 input a$
90 let-1

100 if asflj-'u" then let z-7: goto 130

110 if a$( 1}-я'в then goto 160

120 if a$(1)<> chr$ 32 then poke d, fn c(a$)

130 print tab 16; fn h$(peek d)

140 let d-d+l

150 goto 70

160 input 'press any key to run the rotine"; a$
170 randomize usr 32000

Программа HEX. INPUT

Примечание: используйте программу CAPS LOCK SET

- введите значение как пару шестнадцатиричных символов

- используйте ENTER для выполнения шага вперед

- используйте "1Г и ENTER, выполняя шаг вперед

- используйте и ENTER для выполнения программы

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

и проверить программу машинного кода.

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

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

8.3 КОМАНДА ВЕЕР.

В бэйсике команда ВЕЕР имеет форму: ВЕЕР длительность, высота
тона, где длительность должна быть положительной величиной, не
превышающей 10; и высота тона - положительным или отрицательным
числом, указывающим, как далеко находится нота от среднего идо".

В программе машинного кода имеются два особых метода, с помощью
которых программа ВЕЕР может быть выполнена. По первому методу
необходимо вызвать подпрограмму BEEPER с соответствующими величинами
в двух регистровых парах DE и HL, в то время как по второму методу надо
вызвать команду ВЕЕР с помощью величин для длительности и высоты тона
в калькуляторном стеке.
Метод 1.

Используя программу HEX.INPUT введите:

7D00 11 05 01 LDDE,+0105 длительность 1 секунда
7D03 21 66 06 LD HL,+0666 высота тона
7D06 CD В5 03 CALL BEEPER
7D06 CD RED

Когда вышеприведенная программа будет выполнена, она даст тот же
эффект, как ВЕЕР 1,0.

Величины регистровых пар DE и HL будут следующими :

- рассмотрите ноту заданной частоты "Р, например, среднее

ндои принято как 261,63 Гц в SPECTRUM.

Затем длительность требуемого периода Т будет просто РТ. Это
задается в паре регистров DE.

- величина для пары регистров HL представлена KaK.437.500/F-

30.125 Заметьте, что нет ограничения длительности 10 секундами

при использовании этого метода.

Метод 2.

Используйте программу HEX. INPUT, чтобы ввести прграмму.

7D00 ЗЕ 01 LDA,+01 длительность 1 секунда

7D02 CD 28 2D CALL STACK-A перевод в стек

7D05 ЗЕ 00 LD А, 4-00 высота тона 0

7D07 CD 28 2D CALL STACK-A перевод в стек

7D0A CD F8 03 CALL ВЕЕР

7D0D С9 RET

Когда вышеприведенная программа будет выполнена, она даст тот же
эффект, как ВБЕР 1,0. Можно использовать программу STACK-А для целых
значений, но подпрограмма STK-DATA должна использоваться дня других
величин, то есть для ВЕЕР 1.3,1.12 она будет:

Чтобы получить ряд звуков, величины могут помещаться в таблицу и
выбираться когда потребуется.

&4СОХРАНЕНРЕ И ЗАГРУЗКА.

Подпрограммы SAVE-BYTES и LOAD-BYTES вызываются из машинного
коДа простым способом. В любом случае регистровая пара IX должна
содержать адрес места назначения, и регистровая пара DE - счетчик байтов,
например, чтобы переслать байты 7Е00 и 7EFF включительно, регистровая
пара IX должна содержать 7Е00, a DE - 0100. В регистр А записывается
величина +FF, чтобы показать, что переписывается блок данных. Перед
выполнением LOAD должен быть установлен флаг переноса.

Следующая программа сохранит байты:

Заметьте, что байты сохранены без "заголовка", но загрузка возможна в
том случае, если известно количество байтов.
Программа загрузки будет следующая:

8.5 ЭЛЕМЕНТЫ ЦВЕТА

8.5 ЭЛЕМЕНТЫ ЦВЕТА

В системе SPECTRUM байты атрибутов имеют следующее назначение:

бит 7 - 1 для FLASH

бит 6 - 1 для BRIGHT

биты 5-3 - цвет PAPER

биты 2-0 - цвет INK

Это относится к 768 байтам в области атрибутов и к системным
переменным BORDER, ATTR-P, MASK-P, MASK-T. В добавление к
атрибутным байтам системная переменная P-FLAG используется для
хранения постоянных и временых флагов для PAPER 9, INK 9, INVERSE
и OVER. Четные биты P-FLAG (биты 6,4,2,0) являются временными
флагами, а нечетные биты (7,5,3,1) являются постоянными флагами.

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

Команда BORDER и 6 элементов цвета будут рассматриваться теперь по
очереди.

■ border.

В любое время цвет бордюра можно изменять путем использования
инструкций OUT(+FE),A. Но эта операция обычно связана с сохранением
нового значения цвета в битах 5-3 BORDER. Заметьте, что другие биты
контролируют мигание, яркость и цвет чернил нижней части экрана.

Следующая программа показывает, каким образом цвет бордюра может
быть изменен, a BORDER заполнен новым значением.

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

В PAPER

Постоянный цвет бумаги задается битами 5-3 ATTR-P. Следующая
программа показывает для PAPER 0 - PAPER 7 только один метод, с
помощью которого эти биты могут изменяться без изменения других
атрибутов величин.

7D00 ЗА 8D 5С LD A,(ATTR-P) поиск ATTR-P

7D03 OF RRCA пересылка битов 5-3

7D04 OF RRCA в бита 2-0

7D05 OF RRCA

7D06 Е6 F8 AND,+F8

7D08 С6 02 ADD A,+RED ввести новый цвет

7D0A 07 RLCA сдвиг байга

7 DOB 07 RLCA

7D0D 32 8D 5C LD (ATTR-R),A сохранить ATTR-P
7D10 C9 RET

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

PAPER 8 задается отдельно и включает в себя установку битов 5-3
MASK-P, в то время как PAPER 9 включает в себя установку бита 7 P-FLAG.

■ ink.

Постоянный цвет чернил задается битами 2-0 ATTR-P. Следующая
программа показывает, как эта биты могут изменяться для INK 0 -INK 7.

7D00 ЗЕ 8F LD A,+F8 приготовить MASK

7D02 FD A6 53 AND (ATTR-P) выделить биты 7-3
7D05 C6 02 ADD A,+RED красные чернила

7D07 32 8D 5C LD (ATTR-P),А сохранить ATTR-P
7D0A C9 RET

Заметьте, что A1TR-P в одном случае рассматривается как адрес А653,
а в другом - как адрес 8D5C.

INK 8 включается установкой битов 2-0 MASK-P, в то время как INK 9
- установкой бита 5 P-FLAG.

■ flash.

Можно задать три состояния FLASH следующим образом: установка и
сброс бита 7 в ATTR-P и MASK-P:

FLASH 0 0 для 7-го бита ATTR-P
FLASH 1 1 для 7-го бита ATTR-P
FLASH 8 1 для 7-го бита MASK-P.

■ bright.

Подобным образом задаются три состояния яркости: установка и сброс
бита 6 в ATTR 6 и MASK-P:

BRIGHT 0 0 для 6-го бита ATTR-P 'RES 6,(ATTR-P)1
BRIGHT 1 1 для 6-го бита ATTR-P 'SET 6,(ATTR-P)'
BRIGHT 8 1 Для 6-го бита MASK-P 'SET 6,(MASK-P)'

Во всех случаях, когда восьмой режим требуется выключить,
соответствующие биты MASK-P нужно сбросить.

■ over.

Два состояния OVER могут быть представлены следующим образом:
установка и сброс 1-го бита в P-FLAG:

OVER 1 0 для 1-го бита P-FLAG 'SET 1,(P-FLAG)'
OVER 0 1 для 1-го бита P-FLAG 'RES 1,(P-FLAG)'

■ inverse.

Два состояния INVERSE могут быть представлены следующим образом:
установка и сброс бита 3 в P-FLAG аналогично OVER._

■ Постоянные ■ переменные.

Большинство операций в SPECTRUM используют переменные величины.
Но, например, операция RST 0010 CLS является важной программой, в
которой используются постоянные цвета.

для того, чтобы копировать текущее постоянное значение во временные
системные переменные используется CALL TEMPS "CALL 0D4D" и, если
переменные величины будут использоваться как новые постоянные
величины, используется CALL PERMS "CALL 1CAD".

8.6 КОМАНДЫ CLS И 8CROLL.

В программе монитора SPECTRUM имеются подпрограммы для очистки
части экранной области и для сдвига ее части. Эти подпрограммы могут
вызываться только из программ машинного кода.

В CLS.

Полная очистка экрана и установка всех атрибутных байтов в постоянные
величины получена путем использования CALL CLS -"CALL 0D6BH, но
важно убедиться, что канал S открыт до того, как вызывается программа.
Потребуется потом вторичное открытие, если будет производиться
дальнейший вывод на печать. Следующая программа очищает весь экран:

7D00 ЗЕ 02 LD А,+2 открыть канал S

7D02 CD 01 16 CALL CHAN-OPEN
7D05 CD 6B 0D CALL CLS очистить экран

7D08 C9 RET

Вышеприведенная программа имеет приемущество при использовании
постоянных цветов, но проще во многих случаях использовать подпрограмму
CL-UNE.

Подрограмма CL-LINE.

Используется для очистки определенного числа строк экрана. Эти
строки считаются снизу. До того, как сделан вызов подпрограммы, в регистр
В должна быть помещена величина в диапазоне 01- 18h, где 18-очисгигь весь
экран.

Следующая программа показывает, как используется эта подпрограмма:
7D00 0617 LD В,+17 очистить 23 (десятичое) строки 7D02 CD 44 0Е CALL
CL-LINE и оставить одну верхнюю 7D05 С9 RET

■ CL-SCROLL.

Эта подпрограмма дает возможность пользователю сдвигать определенное
число строк дисплея. Подпрограмма кончается использованием
подпрограммы CL-LINE для очистки нижней строки, и, следовательно,
атрибутные байты для этой строки имеют постоянные значения.

Регистр В опять используется для хранения величины, которая
обуславливает число строк, которые должны передвигаться, но в этом
случае она является Действительным числом строк, уменьшеным на Г, то
есть диапазон равен 01-17h.

Следующая программа показывает, как подпрограмма может
использоваться:

7D00 С6 16 LD В,+16 оставить верхнюю строку не сдвинутой
7D02 CD 00 0Е CALL CL-SCROLL
7D05 С9 RET

Заметьте, что ни подпрограмма CL-LINE, ни подпрограмма CL-SCROLL
не влияют на использование текущего канала.

&7 ПОДПРОГРАММА ПЕЧАТИ,

Для того, чтобы использовать любую из подпрограмм печати для
изображения символов, подпрограмма PRINT-OUTPUT должна бьпъ сделана
текущей программой вывода. Это можно легко получить, открыв канал S.
Поэтому строки LD А,+02 CALL CHAN-OPEN должны использоваться до
того, как вызываются любые подпрограммы.

В RST 0010

В системе SPECTRUM вся печать символов на экране выполняется при
использованию! этой команды. С открытым каналом S подпрограмма
PRINT-OUTPUT по адресу 09F4 действует как программа вывода.

Инструкция RST 0010 очень мощная и может использоваться для печати
любого символа, изменения текущего положения печати использованием
AT и TAB, печати расширенных ключевых слов и временных цветовых
элементов. Следующая программа показывает это:

7D00 ЗЕ 02 LD А,+02 открыть канал S

7D02 CD 01 16 CALL CHAN-OPEN
7D05 08 18 LD В,+ 18

7D07 CD 44 0E CALL CL-LINE очистить экран

7D0A ЗЕ 16 LD A,+AT

7D0C D7 RST 0010 оператор

7D0D ЗЕ 08 LD A,+05 PRINT AT 5,0

7D0F D7 RST 0010

7D10 3E 00 LD A,+00

7D12 D7 RST 0010

7D13 3E 41 LD A/A'

7D15 D7 RST 0010

7D16 3E ODLDA/CR оператор PRINT

7D18 D7 RST 0010

7D19 3E F9 LD A,+09 оператор

7D1B D7 RST 0010 PRINT CHRS 249

7D1C 3E 0D LDA/CR'

7D1E D7 RST 0010 оператор PRINT

7D1F 3E 11 LD A, PAPER

7D21 D7 RST 0010 оператор PAPER 2

7D22 3E 00 LDA/RED' (временное)

7D24 D7 RST 0010

7D25 3E 06 LD А/ * оператор PRINT

7D27 D7 RST 0010

7D28 3E 42 LDA,'B' оператор

7D2A D7 RST 0010 PRINT НВИ

7D2B C9 RET

Следует отметить, Зто в вышеприведенной программе вызов
подпрограммы CL-LINE очищает экран, но не устанавливает положение
печати "00й (в то время как CALL, CLS устанавливают).

Когда используется инструкция RST 0010 для печати цветного элемента,
тогда потребуется два отдельных вызова, а когда используется символ
контроля AT или TAB, тогда требуется 3 отдельных вызова.

Альтернативный метод изменения положения печати будет следующим:
-загрузите пару регистров ВС соответствующими величинами
для нового положения печати;

-CAAL CL-SET и "CAAL 0DD9**, которые помещают требуемые
величины в S-POSN и DF-C. Величины в паре регистров ВС
определяют AT А,В.
Например:

PRINT AT 5,0 требует:
LD ВС,+ 1321
CAAL0DD9

■ Печать строк:

Строка символов в SPECTRUM всегда задается парами регистров DE и
ВС, где в паре регистров DE хранится адрес ячейки, содержащей первый
символ строки, а в паре регистров ВС содержится величина, равная числу
символов в строке. В программе команды PRINT используется подпрограмма
PR-STRING для печати любой строки:

PR-STRING = 203С
LD А,В выбор старшего байта

OR С операция OR с младшим

DEC ВС уменьшение счетчика
RET Z

LD A,(DE) поиск символа
INC DE печать символа
RST0010

JR PR-STRING переход к следующему

Любая строка символов может быть поэтому напечатана следующим
образом:

-загрузите стартовый адрес в DE
-загрузите длину в ВС
-CAAL PR-STRING - HCAAL 203СИ
Поскольку подпрограмма PR-STRING использует инструкцию RST 0010
для действительной печати символа, строка может содержать коды символов,
цветные элементы, атрибуты положения печати и кодов ключевых слов.

Как пример использования подпрограммы PR-STRING выполните
следующую программу.

7CF0 11 01 10 09 строка длиной OFh

7CF4 16 OA 05 53 начинающаяся в 6CF0

7CF8 70 65 63 74
7CFC 72 75 6D

7D00 ЗЕ 02 LD А,+02 открыть канал S

7D02 CD 01 16 CAAL CHAN-OPEN

7D05 06 18 LD В,+18 очистить экран

7D07 CD 44 0Е CAAL CL-LINE

7D0A И ГО 7С LD DE,+STRING начало строки

7D0D 01 0F 00 LD BC,+LENGTH длина строки

7D10 CD ЗС 20 CAAL PR-STRING печать строки

7D13 С9 RET

Вышеприведенная программа подобна

CLS: PRINT PAPER 1; INC 9;АТ 10,5;"SPECTRUNr

■ Печжгь *шсел:

Очень мощная подпрограмма PRINT-FP используется для печати в
десятичной форме любых 5-ти байтов чисел с плавающей запятой. Эта
подпрограмма в качестве операнда использует верхнее значение стека
калькулятора, действительное число выбирается из стека и после
использования теряется.

Следующая программа использует подпрограмму PRINT-FP для печати
постоянной НР1/2И из таблицы констант калькулятора,

7D00 ЗЕ 02 LD А,+02 открыть канал S

7D02 CD 01 16 CAAL CHAN-OPEN

7D05 CD 6В 0D CAAL CLS очистить экран

7D08 ЗЕ 02 LD А,+02 снова открыть

7D0A CD 01 16 CAAL CHAN-OPEN канал S

7D0D EF RST 0028 использовать калькулятор

7DOE A3 DEFB +A3 выбрать константу

7D0F 38 DEFB+38 END-CALE

7D10 CD 3E 2D CAAL PRINT-FP печатать верхнее значс-

7D13 C9 RET ние в десятичном формате

Использование строки RANDOMIZE USR32000: PRINT НР1/2И показывает
идентичность результата. Но интересно рассмотреть, что при получении
PI/2 постоянная PI/2 выбиралась из таблицы констант, удваивалась, а затем
делилась на 2, чтобы в конечном счете получить результат.

Во многих случаях, однако, использование аппарата плавающей точки
может не потребоваться, и по существу, возможно печатать десятичные
числа в диапазоне 0-9999 путем использования подпрограммы OUT-NUM,
которая обычно используется для воспроизведения номера строки в листинге
или сообщении.

Когда используется программа OUT-NUM-1 (lAlBh), число должно
находиться в паре регистров ВС в обычном порядке "старший-младший**, но
когда используется подпрограмма OUT-NUM-2 (lA28h), пара регистров HL
используется для непосредственной адресации числа, которое в это время
должно быть в порядке нмладший-старшийн.

Заметьте, что эта подпрограмма пробелы печатает, и это может бьпъ
вполне полезно.

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

Следующий пример показывает, как используется подпрограмма OUT-
NUM-1 для печати числа.

7D00 как в предыдущих

программах

7D0C...........

7D0D 01 0F 27 LDBC.+270E десятичное 9999

7D10 CD IB 1А CAAL OUT-NUM-1 печать числа
7D13 C9 RET

Эти три команды имеют дело с изображением точек в экранной области.
Весь экран состоит из точек (256*176), что образует 22 верхние строки.
Координаты нижней левой точки принимаются как 0*0, а верхней правой
точки - 255* 175. Системные переменные COORDS-X и COORDS-Y
содержат координаты последней точки, которая должна использоваться.
Эти системные переменные устанавливаются в 00 командой CLS или
другими командами, такими как RUN, которая вызывает программу CLS.

Заметьте, что в бэйсике эти три команды обычно используют FLACH 8,
BRIGHT 8, PAPER 8, то есть MASK-T содержит F8h.

■ Команда PLOT.

Эта самая простая из трех команд, так как она включает в себя
идентификацию только одного бита в области экрана и его последующую
установку или сброс.

Имеется три вполне подходящих точки входа в команду, но третья из
них, возможно, самая простая для использования.

1.CALL PLOT "CALL 22DC"

Для входа в команду PLOT необходимо иметь величины X и Y наверху
калькуляторного стека. Величина X находится ниже величины Y.
Использование STACK-A для помещения значений в стек очень важно.

2. CALL PLOT - 1 "CALL 22DF"

Вход в этой точке требует, чтобы в регистре В хранилась величина Y, а
регистре С величина - X.

После того, как точка выводится, постоянные цветовые величины
копируются автоматически в (временные) системные переменные.

3. CALL PLOT - ВС "CALL 22Е5".

Опять регистр В должен содержать величину Y, а регистр С -величину
X. Подпрограмма выполняет фактическую операцию PLOT. Требуемый бит
идентифицируется вызовом F1XED-ADD (22АА) и затем будет установлен
или сброшен в соответствии с результатом его состояния и величиной Р-
FLAG (бит 0 P-FLAG даст постоянное состояние OVER, и бит 2 даст
состояние INVERSE).

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

7D00 — как в предыдущих программах

7D0C

7D0D 01 64 32 LD ВС,+3264 PLOT 100,50

7D10 CD Е5 22 CALL PLOT-ВС

7D13 С9 RET

DRAW

Использование DRAW X,Y , по существу является расширением PLOT
X,Y, описывающей ряд точек, которые составляют прямую линию.

Команда DRAW X,Y,A включает в себя изображение дуги и подобна по
многим аспектам CIRCLE X,Y,R.

■ DRAW X,Y

Имеются две точки входа для этой команды:

1. Точка входа DRAW-1 (2477h) с величинами X и Y, которые являются

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

2. Точка входа DRAW-3 f24BAh) с регистром В, содержащим ABS Y,
регистром С, содержащим ABS X, регистром D, содержащим SGN X, и
регистром Е, содержащим SGN Y.

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

7D00 как и в предыдущих

программах

7D0C

7bOD D9 ЕХХ сохранить значение HL

7D0E £5 PUSH HL

7D0F D9 ЕХХ

7D10 FD 36 43 64 LD (COORDS-X),+64 установить координаты

7D14 FD 36 44 64 LD (COORDS-Y),+64

7D18 01 32 32 LD ВС,+3232 оператор

7D1B И 01 01 LDDE,+0101 DRAW 50,50

7D1E CD BA 24 CALL DRAW-3

7D21 D9 ЕХХ восстановить HL

7D22 El POP HL

7D23 D9 EXX

7D24 C9 RET

Вышеприведенная программа устанавливает начальное положение
строки в координате 100,100 и затем рисует линию до +50,+50.

■ DRAW X,Y,A

Для того, чтобы изобразить дугу величины X,Y и А должны бьпъ
первыми помещены в стек калькулятора либо в их полной, либо упакованной
форме из пяти байтов. Затем можно вызвать DRAW-ARC (2394h).

Следующая программа дает тот же результат, что и DRAW 50,50,1 с
начальным положением в координатах 100,100.

7D00
7D0C

7D0D D9 ЕХХ сохранить HL

7D0E Е5 PUSH HL

7D0F D9 ЕХХ

7D10 FD 36 43 64 LD(COORDS-X),+64 установить

7D14 FD 36 44 64 LD(COORDS-Y),+64 координаты

7D18 EF RST 0028 использовать калькулятор

7D19 34 DEFB+34 STK-DATA

7D1A 40 B0 00 32 DEFBS 10-ное+50

7D1E 31 DEFB+31 DUPLICATE

7D1F Al DEFB +A1 STK-ONE

7D20 38 DEFB+38 END-CALE

7D21 CD 94 23 CALL DRW-ARC изображение

7D24 D9 EXX

7D25 El POP HL восстановить HL

7D26 D9 EXX

7D27 G9 RET

В программе величины, полученные для X, Y, А , будут десятичными
+50,+50,+1.

■ CIRCLE.

Опяп* три операнда команды должны быть помещены в стек калькулятора
до того, I3IK будет сделано обращение к CIRCLE-1 (232Dh).

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

7D00 как в предыдущих программах

7D0C

7D0D D9 ЕХХ сохранить HL

7D0E Е5 PUSH HL

7D0F D9 ЕХХ

7D10 EF RST0028 использовать калькулятор

7D11 34 DEFB+34 STK-DATA

7D12 40 ВО 00 64 DEFBS +100(10-ное)

7D16 31 DEFB+31 DUPLICATE

7D17 34 DEFB+34 STK-DATA

7D18 40 ВО 00 30 DEFBS +48 (10-ное)

7D1C 38 DEFB +38 END-CALE

7D1D CD 2D 23 CALL CIRCLE-1 изображение окружности

7D20 D9 ЕХХ

7D21 El POP HL восстановить HL

7D22 D9 EXX

7D23 C9 RET

Вышеприведенная программа дает тот же результат, как CIRCLE
100,100,48. Заметьте, что при использовании программы постоянные цветовые

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

8.9 POINT ATTR И SCREEN$.

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

■ ROINT

Координаты точки, которые должны быть переданы, вводятся в регистр
ВС, и вызывается подпрограмма POINT-1 (22CEh). Как обычно регистр В
хранит координату Y, регистр С хранит координату X. Следующая программа
показывает выполнение.

7D00 как в предыдущих программах
7D0C

7D0D 3E 41 LDA/A* печать 'А*

7D0F D7 RST0010

7D10 ЗЕ OD LDA/CR' переход к следующей строке

7D12 D7 RST0010

7D13 01 04 AE LD ВС,+АЕ04 оператор POINT (4,174)

7D16 CD СЕ 22 CALL POINT-1

7D19 CD ЕЗ 2D CALL PRINT-FP печать результата

7D1C C9 RET

Вышеприведенная программа аналогична команде: PRINT "A": CHRS 13:
POINT (4, 174).

■ ATTR

Номер строки вводится в регистр С, а номер колонки - в регистр В, и
вызывается подпрограмма ATTR-1 (2583h). Результат выполнения
возвращается верхним значением калькуляторного стека. Следующая
программа показывает выполнение.

7D00 как в предыдущих программах

7D0C

7D0D ЗЕ И LD A,TAPER* бумага временно

7D0F D7 RST0010 становится голубой

7D10 ЗЕ 05 LDA/CYAN1

7D12 D7 RST 0010

7D13 ЗЕ FF LD A,'COPY печать ключевого слова

7D15 D7 RST0010 COPY

7D16 ЗЕ 0D LDA/CR* переход к следующей строке

7D18 D7 RST0010

7D19 01 00 04 LD ВС,+0400 оператор ATTR (0,4)

7D1C CD 83 25 CALL ATTR-1

7D1F CD ЕЗ 2D CALL PRINT-FP
7D22 C9 RET

Вышеприведенная программа аналогична команде: PRINT PAPER
5;CHR$ 255;CHR$ 13;ATTR (0,4)

Ш SCREENS

Опять номер строки засылается в регистр С, а номер колонки - в регистр
В. Подпрограмма вызывается путем использования CALL SCREENS-1
(2538h). Результат возвращается как верхнее значение калькуляторного
стека, но следует отметить, что это набор параметров строки.
Пример:

7D00 как в предыдущих программах
7D0C.................

7D0D ЗЕ 7А LD A,'Z' печать символа

7D0F D7 RST0010

7D10 ЗЕ 0D LDA/CR* переход к следующей строке

7D12 D7 RST0010

7D13 01 00 00 LD ВС,+0000 оператор SCREENS (0,0)

7D16 CD 38 25 CALL SCREENS-1

7D19 CD F1 2B CALL FETCH печать строки

7D1C CD ЗС 20 CALL PR-STRING

7D1F C9 RET

Программа аналогична команде PRINT nZ": CHRS 13: SCREENS (0,0).
Помните, что SCREENS будет искать только набор символов и,
следовательно, ищеткодыв диапазоне'(20-7ЕЬ). Ошибка SCREENS (двойное
запоминание результата) не будет иметь место, когда используется входная
точка SCREENS-1.

8.10 pi, RND, INKEY$.

Эти функции группируются вместе, потому что их невозможно вычислить
непосредственно. Вычисления выполняются с использованием программы
VAL/vALS калькулятора.

Следует рассмотреть преобразование:

VAL CHRS 167 для PI
VAL CHRS 165 для RND
VALS CHRS 166 для INKEYS

■ PI:

Фактическая процедура вычисления для PI будет.
PI = 262С

262С RST0028 использование калькулятора

262D A3 'PI/2'

262Е ЗВ 'END-COLF

262F INC (HL) удвоение увеличением экспоненты

Процедура занимает 4 адреса и легко копируется. Ее можно вызвать VAL
CHRS 167. Пример:

7D00 как в предыдущих программах
7D0C

7D0D ЗЕ А7 LD А/РГ код PI

7D0F CD 28 2D CALL STACK-A

7D12 EF RST0028 использовать калькулятор

7D13 2F DEFB +2F

7D14 38 DEFB+38 строка

7D15 06 ID LD B,+1D литерал

7D17 EF RST0028

7D18 3B DEFB+3B

7D19 38 DEFB+38 END-COLE

7D1A CD ЕЗ 2B CALL PRINT-FP

7D1D C9 RET

■ RND

При включении питания или в результате выполнения NEW величина в

SEED=0. Затем, после первого обращения к RND, величина SEED становится
равной 74 (дес.). Это дает первое случайное число: 74/65535=0,0011291504
последовательность чисел для SEED 0,74,5624,28652...0,74 т.е. Представлены
все числа от 0 до 65535.

Правило для изменения величины SEED следующее:

1. Прибавьте 1

2. Умножте на 75

3. Возьмите остаток после деления на 65537.

4. Вычтите 1

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

10 input seed?m;char$ 32; seed

20 print яold value-';char$ 32; seed

30 let seed-seed+1

40 let seed-seedv5

50 let seed-seed-65537*int(seed/65537)

60 let seed-seed-!

70 print яnew value- ; chars 32; seed
80 go to 30

В программе монитора практическая процедура вычисления RND будет
следующей.

RND=25FD
RND-END=2625
25FD LD ВС,(SEED) выборка значения SEED
2601 CALL STACK-BC

2604 RST 0028 использование калькулятора

2605 А1 стек 1.

2606 OF SEED=SEED* 75
260А 04

260В 34

260С 80 41 00 00 80 стек'65537

2611 32 'N-MOD-NT

2612 02 'DELETE'

2613 А1 стек'Г

2614 03 SEED=SEED-1

2615 31 'DUPLICATE'

2616 38 'END-CALE

2617 CALL FP-TO-BC оператор 'CALL 2DA2'
261A LD (SEED),ВС новое значение SEED
261E LD A,(HL) выбор экспоненты
261F AND А проверка на 0

2620 JR Z,RND-END

2622 SUB +10 деление на 65536

2624 LD (HL)A сохранение экспоненты

262 5...............

Величина для RND теперь представляется верхним значением в
калькуляторном стеке.

Программа RND может вызываться из программы в машинных кодах
как результат вычисления VAL CHRS 165. При этом программа для
вычисления PI, приведенная выше, может использоваться с единственным
изменением:

7D0D ЗЕА5: LDA,+A5

■ INKEYS

Имеется ряд путей, с помощью которых опрос клавиатуры может
осуществляться из программы в машинных кодах:

1.Непосредственным чтением системной переменной LAST-K.

2. Клавиатура может опрашиваться путем использования инструкции IN
аналогично KEY-SCAN (028Е).

3. Подпрограмма KEY-SCAN может вызываться сама, и результат
значения клавиши находится по известным таблицам.

4. Действия выполняемые по программе INKEYS (2646h), могут быть
повторены:

CALL KEY-SCAN: CALL028E

LDC,+00 обеспечение режимов K,L,C

JR NZ,NO-KEY: не была нажата клавиша

CALL KEY-TEST регистр или более двух клавиш
JR NC,NO-KEY:

DEC D; обеспечение режима L или получение

LD ЕЛ номера

CALL KEY-CODE CALL 0333 Код символа помещается в регистр А.

5. Может использоваться вычисление выражения VALS CHARS 166. В
следующей тг лограмме демонстрируется эта возможность.

7D00 как в предыдущих программах
7D0C...............

7D0D 11 00 08 LD DE.+08 00 установка счетчика на 2048

7D10 D5 PUSH DE

7D11 ЗЕ А6 LD A,'INKEYS'
7D13 CD 28 2D CALL STACK-A

7D16 EF RST0028 использование калькулятора

7D17 2F DEFB +2F DAVZ

7D15 38 DEFB +38 END CALE

7D1A CD F1 2B CALL STK-FETCH выбор параметров

7D1D CD 3C 20 CALL PR-STRING печать строки

7D20 CD BF 16 CALL Х-темр очистка рабочей области

7D23 D1 POP DE построение цикла

7D24 7B LD А,Е

7D25 В2 OR D

7D26 СВ RET Z

7D27 IB DECDE уменьшение счетчика

7D28 18 E6 JR LOOP

1. Когда эта программа выполняется, то она аналогична выражению:
FOR А=1 ТО 2048: PRINT INKEYS NEXT А

2. Возможно адреса 7D19-7D1F изменить на 1С, 38, CD, ЕЗ, 2D, 00, 00.

Это даст FOR А=1 ТО 2048: PRINT CODE INKEYS; NEXT A

8.11 BREAK*

Во многих случаях полезно, чтобы выход был сделан из программы
машинного кода по клавшие BREAK

Пример:

BREAK=7D0D

7DOO как в предыдущих программах

7D0C

7D0D ЗЕ 7F LD A,+7F вводной порт 7FFF

7D0F DB FE IN A,(+FE) бит 0 регистра А

7D11 IF PRA сброшен, если

7D12 DO RET NC нажато BREAK.

7D13 18 F8 JR BREAK

В программе половина ряда, клавиатуры от BREAK до В неоднократно
просматривается. Выход будет осуществлен только тогда, когда установится
бит, который состветствуетет клавише BREAK.

8. f2 ЗАКЛЮЧЕНИЕ.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
BBS - список станций BBS ZXNet.
Доска почета - О CD-ROM проекте из города Кемерово.
Реклама - Реклама и объявления ...
Mast is a skinflint?! - Freeman откывает правду про Mast'a.
IM2 еще раз о наболевшем - Проблема вектора прерываний.

В этот день...   21 ноября