8. ИНСТРУМЕНТАЛЬНЫЕ ПРОГРАММЫ 8.1 Определение размера свободной памяти.
Длина: 14
Количество переменных: 0
Контрольная сумма: 1443
Назначение:
Дает количество свободного пространства ОЗУ в байтах.
Вызов программы.
PRINT USR адрес
Контроль ошибок: Нет
Комментарий:
Эта программа должна вызываться перед использованием любых подпрограмм, которые могут увеличивать длину программы, чтобы быть уверенным в том, что в ОЗУ достаточно свободного пространства.
ЛИСТИНГ МАШИННЫХ КОДОВ
МЕТКА
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
ВВОДА |
LD HL,0 |
33 |
0 |
0 |
ADD HL,SP |
57 |
|
|
LD DE,(23653) |
237 |
91 |
101 |
AND A |
16 |
|
|
SBC HL,DE |
237 |
82 |
|
LD B,H |
68 |
|
|
LD C,L |
77 |
|
|
RET |
201 |
|
|
92
Как она работает:
В пару регистров HL загружается 0 и это значение суммируется с адресом конца свободной области ОЗУ (адрес хранится в SP). Пара регистров DE загружается адресом начала свободной области ОЗУ и вычитается из HL. HL копируется в BC и программа возвращается в БЕЙСИК.
8.2 Определение длины БЕЙСИК-программы
Длина: 13
Количество переменных: 0 Контрольная сумма: 1544 Назначение:
Дает длину БЕЙСИК-программы в байтах. Вызов программы:
PRINT USR адрес
Контроль ошибок: Нет Комментарий: Нет
ЛИСТИНГ МАШИННЫХ КОДОВ
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
ВВОДА |
LD HL,(23637) |
42 |
75 |
92 |
LD DE,(23635) |
237 |
91 |
83 |
AND A |
167 |
|
|
SBC HL,DE |
237 |
82 |
|
LD B,H |
68 |
|
|
LD C,L |
77 |
|
|
RET |
201 |
|
|
92
Как она работает:
В пару регистров HL загружается адрес области переменных, а в DE загружается адрес БЕЙСИК-программы. DE вычитается из HL, чтобы получить длину программы. HL копируется в ВС и программа возвращается в БЕЙСИК.
8.3 Определение адреса БЕЙСИК-строки.
Длина: 29
Количество переменных: 1
Контрольная сумма: 2351
Назначение:
Возвращает адрес первого символа после кода 'REM' в заданной строке.
Переменные:
Имя - line number
Длина - 2
Адрес - 23296
Комментарии: номер строки, которая должна содержать 'REM'.
Вызов программы:
LET A = USR адрес
Контроль ошибок:
Если заданная строка не существует, или нет выражения REM, программа возвратит значение 0.
Комментарии:
Эта программа может быть использована для нахождения адреса ячейки, в которую может быть помещен машинный код. После выполнения программы переменная A (может быть использована любая переменная) устанавливается по адресу, или в 0, если имеет место ошибка.
Не вводить номер строки более 9999!
ЛИСТИНГ МАШИННЫХ КОДОВ
МЕТКА АССЕМБЛЕР ЧИСЛА ДЛЯ ВВОДА
LD HL,(23296) 42 0 91
LD A,H |
124 |
|
OR L |
181 |
|
JR Z,ERROR |
40 |
5 |
CALL 6510 |
205 |
110 |
JR Z,CONT |
40 |
4 |
LD ВС,0 |
1 |
0 |
RET |
201 |
|
INC HL |
35 |
|
INC HL |
35 |
|
INC HL |
35 |
|
INC HL |
35 |
|
LD A,234 |
62 |
234 |
CP (HL) |
190 |
|
JR NZ,ERROR |
32 |
243 |
INC HL |
35 |
|
LD B,H |
68 |
|
LD C,L |
77 |
|
RET |
201 |
|
25 0
Как она работает:
В пару регистров HL заносится определенный номер строки. Если этот номер равен 0, делается переход к 'ERROR', иначе вызывается подпрограмма ПЗУ по адресу 6510. По возвращении из этой процедуры HL содержит адрес строки. Если флаг нуля установлен, делается переход к 'CONT'. Если флаг нуля не установлен, эта строка не существует, и подпрограмма переходит к 'ERROR', где в ВС загружается 0, и затем происходит возврат в BASIC.
Если программа достигает метки 'CONT', HL увеличивается на 4, чтобы указать на первый оператор в данной строке. Если этот оператор не имеет кода 234, происходит переход к 'ERROR'. Если же это оператор 'REM', HL увеличивается, указывая на следующий символ. Значение HL затем копируется в BC и программа возвращается в БЕЙСИК.
8.5 Копирование данных в памяти.
Длина: 33
Количество переменных: 3 Контрольная сумма: 4022 Назначение:
Эта программа копирует область памяти с одного места в другое.
Переменные:
Имя - start
Длина - 2
Адрес - 23296
Комментарий: адрес источника для копирования. Имя - destination Длина - 2 Адрес - 23298
Комментарий: Адрес, в который происходит копирование. Имя - length Длина - 2 Адрес - 23300
Комментарий: длина блока, подлежащего копированию. Вызов программы:
RANDOMIZE USR адрес
Контроль ошибок: Нет Комментарий:
Эта подпрограмма может быть использована для создания "мультипликации" с помощью следующего метода:
- создание первого экрана информации;
- копирование экрана выше RAMTOP;
- повторить для других экранов;
- копирование экранов в обратном направлении по одному в быстрой последовательности.
ЛИСТИНГ МАШИННЫХ КОДОВ
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
ВВОДА |
LD HL,(23296) |
42 |
0 |
91 |
LD DE,(23298) |
237 |
91 |
2 |
LD ВС,(23300) |
237 |
75 |
4 |
LD A,B |
120 |
|
|
OR C |
177 |
|
|
RET Z |
200 |
|
|
AND A |
157 |
|
|
SBC HL,DE |
237 |
82 |
|
RET Z |
200 |
|
|
ADD HL,DE |
25 |
|
|
JR C,COPY |
56 |
3 |
|
LDIR |
237 |
176 |
|
RET |
201 |
|
|
EX DE,HL |
235 |
|
|
ADD HL,BC |
9 |
|
|
EX DE,HL |
235 |
|
|
ADD HL,BC |
9 |
|
|
DEC HL |
43 |
|
|
DEC DE |
27 |
|
|
LDDR |
237 |
184 |
|
RET |
201 |
|
|
91 91
Как она работает:
В пару регистров HL загружается адрес первого байта памяти для копирования, в DE загружается адрес, в который копируется память, а в ВС загружается количество байтов для копирования. Если ВС=0 или HL=DE, то подпрограмма возвращается в БЕЙСИК. Если HL больше, чем DE, часть памяти копируется, используя инструкцию 'LDIR', и программа возвращает в БЕЙСИК.
Если же DE больше, чем HL, то к обеим парам регистров прибавляется по ВС-1 и память копируется, используя инструкцию 'LDDR', после чего программа возвращается в БЕЙСИК.
Окончание следует.