8.5. Составление списка переменных Длина: 94 Количество переменных: 0 Контрольная сумма: 10295 Назначение: эта подпрограмма составляет список имен всех пе- ременных, имеющихся в настоящий момент в памяти. Вызов программы: RANDOMIZE USR адрес Контроль ошибок: если перемен- ных в памяти нет, программа воз- вращается в BASIC. Комментарий: это большая по- мощь при отладке программ, осо- бенно длинных и сложных. ЛИСТИНГ МАШИННЫХ КОДОВ МЕТКА АССЕМБЛЕР ЧИСЛА ДЛЯ ВВОДА147. RES 0,(IY+2) 253 203 2 134 LD HL,(23627) 42 75 92 N_VAR LD A,13 62 13 RST 16 215 LD A,32 62 32 RST 16 215 LD A,(HL) 126 CP 128 254 128 RET Z 200 BIT 7,A 203 127 JR Z,BIT 5 40 62 BIT 6,A 203 119 JR Z,N_BIT 40 31 BIT 5,A 203 111 JR Z,STR_AR 40 9 SUB 128 214 128 LD DE,19 17 19 0 PRINT RST 16 215 ADD HL,DE 25 JR N_VAR 24 225 STR_AR SUB 96 214 96 RST 16 215 LD A,36 62 36 BRACK RST 16 215 LD A,40 62 40 RST 16 215 LD A,41 62 41 POINT INC HL 35 LD E,(HL) 94 INC HL 35 LD D,(HL) 86 INC HL 35 JR PRINT 24 234 N_BIT BIT 5,A 203 111 JR Z,ARRAY 40 19 SUB 64 214 64 RST 16 215 NEXT_C INC HL 35 LD A,(HL) 126 BIT 7,A 203 127 JR NZ,LAST_C 32 3 RST 16 215 JR NEXT_C 24 247 LAST_C SUB 128 214 128 JUMP LD DE,6 17 6 0 JR PRINT 24 211 ARRAY SUB 32 214 32 JR BRACK 24 216 BIT 5 BIT 5,A 203 111 JR NZ,JUMP 32 243 ADD A,32 198 32 RST 16 215 LD A,36 62 36 JR POINT 24 211 2 Как она работает: Бит 0 байта по адресу 23612 сбрасывается, чтобы символы, вы- водимые на печать, появились в верхней части экрана. В HL заг- ружается адрес области перемен- ных. В аккумулятор загружается признак ENTER и вызывается под- программа ПЗУ по адресу 16. В аккумулятор затем загружается код пробела и вновь вызывается та же самая подпрограмма ПЗУ. В аккумулятор загружается байт по адресу в HL. Если значение этого байта равно 128, програм- ма возвращается в BASIC, т.к. достигнут конец области перемен- ных. Если бит 7 аккумулятора уста- новлен в 0, программа переходит к BIT 5, т.к. встретились стро- ковая переменная или число, имя которых состоит только из одной буквы. Проверяется 6 бит аккуму- лятора. Если он равен 0, делает- ся переход к N_BIT, т.к. опреде- лены массив или число, имя кото- рых более, чем одна буква. Если бит 5 аккумулятора равен 0, программа переходит к STR_AR. Программа достигает этой точ- ки, если найденная переменная является управляющей переменной цикла FOR/NEXT. В этом случае из аккумулятора вычитается 128 - результатом является код симво- ла для вывода на печать. В пару DE загружается число 19, указы- вая на следующую переменную при прибавлении к HL. Символ в акку- муляторе выводится на печать, DE прибавляется к HL, а программа возвращается к поиску следующей переменной N_VAR. Если программа находит строко- вый массив (достигает STR_AR), то из аккумулятора вычитается число 96, что дает код имени найденного массива. Это значе- ние выводится на печать, ис- пользуя подпрограмму ПЗУ. Знак доллара и левая скобка выводят- ся на печать, а в аккумулятор загружается код правой скобки. HL увеличивается, указывая на байты, содержащие длину массива. Это значение загружается в DE, так что прибавление к HL дает адрес следующей переменной. Де- лается переход к PRINT, где пра- вая скобка выводится на печать и DE прибавляется к HL. В процедуре N_BIT проверяется бит 5 аккумулятора. Если он ус- тановлен в 0, т.е. это числовой массив, то происходит переход к ARRAY. Если он установлен в 1, то это числовая переменная, имя которой длиннее, чем одна лите- ра. Из аккумулятора вычитается 64, а полученный в результате символ выводится на печать. За- тем программа выполняет цикл, выводя на печать каждый встре- тившийся символ до тех пор, по- ка находится хоть один символ с битом 7, установленным в 1. Из кода этого последнего символа вычитается 128, в DE загружает- ся смещение для следующей пере- менной, а программа переходит к PRINT. Если массив найден, 32 вычи- тается из аккумулятора, чтобы получить правильный код и де- лается переход на поиск скобок - BRACK. В процедуре BIT 5, если найде- но число, имя которого имеет только одну букву, программб возвращается к JUMP. Окончание подпрограммы рабо- тает, когда встречающиеся пере- менные - строковые. Прибавление 32 к аккумулятору дает код для вывода на печать. Наконец, в ак- кумулятор загружается код знака доллара и делается переход к POINT.