КАЛЬКУЛЯТОР
СПЕКТРУМ содержит в ПЗУ мощный::калькулятор, который
может быть применен для удобства при программировании в машин-
ных кодах.
Всего он имеет 66 разных подпрограмм. Я объясню в деталях лишь
некоторые наиболее употребимые.Для:йтользования калькулятора
необходимо уяснить, в какой ;форме СПЁКШРУМ содержит числа,
как их размещать, чтобы они;были доступны калькулятору и как
получать ответ по:окончании расчетов..
Все используемые калькулятором числа размещаются в пяти бай-
тах, либо в двоичном^вдё:Е::Плавающей точкой, либо в виде целого
числа.
□ МАЛОЕ ЦЕЛ0Е ПРЕДСТАВЛЕНИЕ
Первый байт всегда 0.
Второй байт - знак„ 255: (FFh):для отрицательных, 0 - для поло-
;: жительных ;шшёл.
Третий и четвертый байш - само число в стандартном формате
;;:;::::;:!й^;г:первый байт младший.
Последний:бдит:всегда 0. Число 0 рассматривается как положи-
тельноё:::::::;:::::::::;:;:::::;:'
□ ПРЕДСТАВЛЕНИЕ С ПЛАВАЮЩЕЙ ТОЧКОЙ
Первый байт - показатель степени: это количество перемещений
двоичной точки влево или вправо до активизации бита 7. Бит 7
показателя степени определяет направление движения. Установлен
- точка двигалась влево, сброшен - вправо. Рассмотрим пример: Де-
сятичное число 126 (7Eh), в двоичном виде 01111110. Двоичная точка
(как мы должны ее показать) будет справа. Она должна совершить
семь перемещений влево, чтобы последний установленный бит был
от нее справа. Картинка такая:
0 перемещений 01111110
1 перемещение 0111111.0
2 перемещения 01 1 1 1 1.10
3 перемещения 01 1 1 1.1 10
так до тех пор пока
7 перемещений 0.1111110
Любые биты слева от точки всегда должны быть сброшены и могут
быть опущены, т.к. мы знаем ее местоположение. Обычно мы сами
делаем это для десятичных чисел, хотя и неосознанно, не указывая
десятичную точку справа от целого числа т.к. и так ясно, где она.
Этот процесс дает нам ту часть числа, которая известна как ман-
тисса, в приведенном примере это 11111110b двоичном виде и пока-
затель степени (количество перемещений двоичной точки влево)
равен семи. Самый важный бит - бит, определяющий знак числа, он
всегда должен быть задан, активизирован для отрицательных и сбро-
шен для положительных чисел. Показатель также выражен в двоич-
ном виде, бит 7 установлен, если двоичная точка двигалась влево,
сброшен - вправо. Поэтому в приведенном примере, когда мантисса
равна 7 (в двоичном виде 00000111), но точка двигалась влево, бит 7
должен быть установлен, значит 100000111 или 135 в десятичном
виде. Теперь число может быть представлено в полной пятибайтовой
форме:
Обычно приведенное в примере число размещается в малом
целом представлении, но здесь оно было использовано для простоты.
Калькулятор использует собственный стек, на котором держит
любые числа, с которыми работает. Первое, что нужно сделать перед
проведением расчетов - поместить числа, с которыми будете рабо-
тать, на стек калькулятора. Это может быть достигнуто тремя основ-
ными способами:
1) Число может быть помещено на стек из регистра или пары
регистров, используя подпрограмму ПЗУ для перевода в
вид, требуемый калькулятором.::::::::::::::::..
2) ^исло может быть приведено к виду, понйшёьшму калькуля-
тором, и затем помещено на стек. ; .:
3) Число может быть записано в память в ASCII представлении и
программа проверки синтаксиса БЕЙСИКа, используемая
для его считывания и размещения наутек калькулятора,
приведет его к кврректной форме. КаЩый;;иЗ:1шособов
имеет свои преимущества и недостатки, й каждый приме-
ним к определенному типу чисел;;;Я сейчас по очереди рас-
смотрю их применение.
1) Для небольших целых чисел можно использовать две подпрог-
раммы:
□ CALL 11560 (2D28h)
Используется для помещения в.регистр «А» числа, пересылаемого
на стек калькулятора. Очевидной ;тао;чнсло ограничено 0-255 (0-FFh)
и должно быть положительным.
□ CALL 11563 (2D2Bh)
Заберет чисша Интервале 0-65535;;(0*FFFFh) из пары регистров
"ВС". Опять такй чиёШ::Шжет быть тдлшб положительным, в про-
тивном случае начало подпрограммы будет пропущено. Вызов тогда
делается к 11569 (2D31h), с нулём; в регистре «А», и 255 (FFh) в
регистре "Е", тогда число будет передано в калькулятор как отрица-
тельное.
2) Для чисел в; пятиб^твой форме, готовой к применению,
можно использовав подпрограммы:
□ iiCALL 10934 (2AB6h)
Пятйбайтсхвое представление числа в форме, описанной выше,
должно быть;в;р&шстрах "А", "Е", "D", "С", "В"; показатель степени
в регистре «А»,^ Щнтисса в других четырех по порядку.
3) Представление ASGIiii
□ CALL 11419(2C9Bh)
Найдя число во введенной строке, интерпретатор БЕЙСИКа по-
мещает пятибайтовую двоичную форму числа, готовую для исполь-
зования при выполнении программы после версии ASCII. Программа,
используемая для этого, может быть применена для конвертирования
чисел программы в машинных кодах, написанной пользователем.
Это сохраняет все проблемы конвертирования чисел пользователем
или написания подпрограммы конвертирования внутри ваших про-
грамм, и достойно более детального рассмотрения.
При использовании этой программы для загрузки стека кальку-
лятора системная переменная БЕЙСИКа "CH_ADD 23645 (5C5Dh)"
должна содержать адрес первого кода числа, помещаемого на стек,
регистр «А» - код цифры из "CH_ADD". Первая цифра обычно самый
левый разряд десятичного числа, но т.к. эта программа используется
для сканирования строк БЕЙСИКа, это может быть двоичный символ
196 (C4h), если следующие разряды - двоичные числа. Двоичное
число может достигать 16 разрядов (число 65535 (FFFh)). Любые
попытки превысить эти значения приведут к переходу в программу
обработки ошибок БЕЙСИКа. Если нужно, можно использовать "Е"
формат, тогда число будет переделано сразу после того, как появится
в строке на БЕЙСИКе.
После цифр, входящих в число, и показателя, если он использу-
ется, должен быть добавлен определенный байт, содержащий 13
(ODh). Так программе дают понять, что конец числа достигнут и
больше ничего просматривать не нужно.
Есть две подпрограммы, обратные подпрограммам "STACK А" и
"STACK ВС". Они берут последнее число со стека калькулятора и
округляют до целого, если это возможно. Когда число слишком вели-
ко - флаг переноса при возврате активизируется, и, если число отри-
цательное, флаг 0 сбрасывается. Для положительного числа флаг О
установлен. Число будет вычеркнуто из стека изменением указателя,
но пара регистров "DE" по-прежнему укажет на него в памяти, допу-
ская восстановление, если возврат не был успешным, хотя проще
продублировать число перед попыткой возврата, а затем удалить
копию при успешном выполнении. Вызываемые адреса:
□ STACK ТО A: CALL 11733 (2DD5h) STACK ТО ВС:
CALL 11685 (2DA5h)
Есть процедура, обратная программе (2) (см. выше) с 11249
(2BFlh), которая возвращает последнее значение со стека в тот же
регистр. Эта программа также удаляет число со стека, но т.к. она не
может не возвратить число, флаги не устанавливаются. Если требу-
ется, чтобы число осталось на стеке после возврата, должна быть
сделана копия.
□ STACK TO A, E, D, С, B: CALL 11249 (2BF1h)
Когда числа генерируются внутри программы, процедура, печа-
тающая число со стека может быть использоваш;для вывода числа в
область памяти - процесс, обратный выводу на экран;Н;в;форме ASCII.
Максимальное число свободных ячеек в памяти;1 трёбуёмОт для од-
ного числа - 14.
Это достигается написанием программы,;^которая при каждом
вызове помещает содержимое регистра «А» Щ следующую ячейку
памяти, открывая канал, указывающий на ващ^ лодарограмму, и
делая этот канал текущим, помещая его 6a30Bbi^ aS^c;B;;iCURCHL
23633 (5С5 lh). Для вывода числа может быть вызвана подпрограмма
ПЗУ с 11747 (2DE3h). Затем подпрограмма вызывается с каждой
цифрой числа по очереди, помещая числа в ячейкипамяти готовыми
для дальнейшего использования. Помните, что указание адреса, в
котором цифры сохранены, не может содержаться в регистре между
вызовами вашей программы и не может быть сохранено на машинном
стеке, поэтому два байта памяти нужно Зарезервировать для сохра-
нения этого адреса. Программа, выполняющая ;зто, выглядит при-
мерно так:
SET_UP LD HUSPACEili!!;:::,
LD (SP WD) r HL
LD HL,[23633) ;CUR_H!L ^ПИППИ
PUSH HL
LD DEr;SIART ; текущий канал размещаем в
; ваш&й;; программе Ш:сшраняем
; иёходнйй;:адрес для
; последующего;; восстановления
LD С,(HL)
LD (HL),Е
INC HL
LD В,(HI)
LD (HL) ;D .:;ii!i:iiii;::
PUSH ВС iii;;;;!iiii
CALL 11747 ;программа вывода чисел
;Рз0Р;; ВС {восстанавливаем исходный
;адрес и текущий канал
: POP :Ш;;;;;:;;::
LD ( HL:);;,;B;;;;;; ;f BOCCT анаВЛИВаеМ МеСТО
назначения канала
INC HL
LD (HL)гВ
;далее идет остаток программы
STARTLD HLr(SP_WD)
LD (HL)rА
INC HL
LD (SP_WD),HL
RET
SPACE DEFS 16
SP_WD DEFW SPACE
Программа, используемая и упомянутая выше, при вызове берет
верхнее значение со стека калькулятора и выводит его в ASCII как
десятичное число в текущий поток. Число удаляется со стека. Когда
бы ни использовался калькулятор, необходимо быть уверенным в
сбалансированности его стека. Сам калькулятор при правильном его
использовании всегда работает известным образом, но дисбаланс мо-
жет привести к ошибочным результатам. Между "RAMTOP" и
"STKBOT" должно быть оставлено окно для расширения стека каль-
кулятора вверх и роста машинного стека вниз без их пересечения.
Так как некоторые подпрограммы калькулятора используют кальку-
лятор рекурсивно, необходимо оставить больше места, чем предпо-
ложительно будет использоваться, лучше ошибиться в сторону завы-
шения. Если есть сомнения в том, что размещено на стеке
калькулятора после завершения выполнения набора команд, стек
можно очистить путем "CALL 5823 (16BFh)", но помните, что таким
образом сотрется все содержимое стека.