КАЛЬКУЛЯТОР
СПЕКТРУМ содержит в ПЗУ мощный::калькулятор, который
может быть применен для удобства при программировании в машин-
ных кодах.Всего он имеет 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 HLLD DEr;SIART ; текущий канал размещаем в
; ваш&й;; программе Ш:сшраняем
; иёходнйй;:адрес для
; последующего;; восстановления
LD С,(HL)
LD (HL),Е
INC HL
LD В,(HI)
LD (HL) ;D .:;ii!i:iiii;::
PUSH ВС iii;;;;!iiiiCALL 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
RETSPACE DEFS 16
SP_WD DEFW SPACEПрограмма, используемая и упомянутая выше, при вызове берет
верхнее значение со стека калькулятора и выводит его в ASCII как
десятичное число в текущий поток. Число удаляется со стека. Когда
бы ни использовался калькулятор, необходимо быть уверенным в
сбалансированности его стека. Сам калькулятор при правильном его
использовании всегда работает известным образом, но дисбаланс мо-
жет привести к ошибочным результатам. Между "RAMTOP" и
"STKBOT" должно быть оставлено окно для расширения стека каль-
кулятора вверх и роста машинного стека вниз без их пересечения.
Так как некоторые подпрограммы калькулятора используют кальку-
лятор рекурсивно, необходимо оставить больше места, чем предпо-
ложительно будет использоваться, лучше ошибиться в сторону завы-
шения. Если есть сомнения в том, что размещено на стеке
калькулятора после завершения выполнения набора команд, стек
можно очистить путем "CALL 5823 (16BFh)", но помните, что таким
образом сотрется все содержимое стека.
Share your thoughts about this chapter
No comments yet.