Как написать игру для ZX Spectrum на ассемблере


         

РАБОТА СКАЛЬКУЛЯТОРОМ - часть 6


Округление чисел не всегда может оказаться удовлетворительным решением. Иногда требуется сохранить число в первозданном виде и для этого можно применить вызов процедуры ПЗУ, находящейся по адресу 11249. Она выполняет действие, обратное подпрограмме 10934 и извлекает из стека калькулятора все 5 байт числа, а затем последовательно размещает их на регистрах A, E, D, C и B. Выделив в программе на ассемблере область в 5 байт с помощью директивы DEFS 5, можно сохранить там полученный результат, чтобы впоследствии вновь им воспользоваться при расчетах.

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

В процедуре укладки в стек пятибайтовой переменной не повредит предварительная проверка на предмет наличия свободной памяти. Для этого вызовем подпрограмму 13225, которая проверит, можно ли разместить на стеке 5 байт, и в случае нехватки памяти выдаст сообщение об ошибке Out of memory. Затем перенесем 5 байт переменной на вершину стека калькулятора и увеличим системную переменную STKEND, выполняющую ту же роль, что и регистр SP для машинного стека. Перед обращением к процедуре в паре HL нужно указать адрес пятибайтовой переменной.

PUTNUM CALL 13225 ;проверка наличия свободной памяти LD BC,5 ;переносим 5 байт LD DE,(23653) ;адрес вершины стека калькулятора LDIR ;переносим LD (23653),DE ;новый адрес вершины стека RET

Процедура GETNUM будет выполнять противоположное действие: перемещение пяти байт числа с вершины стека калькулятора и уменьшение указателя STKEND. Адрес переменной также будем указывать в HL. Заодно можно выполнить проверку перебора стека, так как именно эта ошибка наиболее опасна.

GETNUM PUSH HL LD DE,(23653) ;проверка достижения «дна» стека LD HL,(23651) ;системная переменная STKBOT, адресующая ; основание стека калькулятора AND A SBC HL,DE ;сравниваем значения STKEND и STKBOT JR NC,OUTDAT ;переход на сообщение, если стек ; полностью выбран POP HL LD BC,5 ADD HL,BC ;указываем на последний байт переменной DEC HL DEC DE EX DE,HL LDDR ;переносим 5 байт из стека в переменную INC HL LD (23653),HL ;обновляем указатель на вершину ; стека калькулятора RET OUTDAT RST 8 ;сообщение об ошибке DEFB 13 ; Out of DATA




Содержание  Назад  Вперед