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

       

Действие процедуры BIGSYM



Рисунок 6.1. Действие процедуры BIGSYM

Приведем теперь текст программы BIGSYM, которая удваивает высоту одного символа, причем его код должен быть предварительно помещен в ячейку памяти по адресу 23296.

ORG 60000 ENT $ LD A,(23296) ;загружаем код печатаемого символа BIGSYM LD L,A LD H,0 ;переписываем этот код в HL ADD HL,HL ;умножаем код на 8 ADD HL,HL ADD HL,HL LD DE,(23606) ;в DE загружаем адрес начала ; текущего фонта ADD HL,DE EX DE,HL LD HL,(23684) ;в HL помещаем адрес в видеобуфере, ; по которому будет выводиться первый ; байт измененного символа LD B,4 PUSH HL ;делаем две копии HL, чтобы PUSH HL ; использовать их во втором цикле BIGS1 LD A,(DE) ;считываем байт из фонта LD (HL),A ;переписываем в видеобуфер INC H LD (HL),A ;еще раз - ниже INC H INC DE ;переходим к следующему байту DJNZ BIGS1 POP HL ;восстанавливаем HL LD BC,32 ;вычисляем адрес первого байта ADD HL,BC ; второго знакоместа LD B,4 BIGS2 LD A,(DE) ;аналогично циклу BIGS1 LD (HL),A INC H LD (HL),A INC H INC DE DJNZ BIGS2 POP HL ;восстанавливаем HL INC HL ;увеличиваем HL на 1 для подготовки ; печати следующего символа LD (23684),HL ;записываем в системную переменную ; адрес следующего знакоместа экрана RET

Обращаем ваше внимание на то, что процедура BIGSYM получилась не совсем универсальной. Сделано это с единственной целью упростить и сократить ее исходный текст. Применяя ее, нужно следить, чтобы символы при печати не выходили за пределы экрана ни по вертикали, ни по горизонтали. Кроме того, верхняя и нижняя половинки выводимых знаков не должны попадать в разные трети экрана, то есть не допускается позиционирование курсора на 7-ю и 15-ю строки экрана.

Чтобы посмотреть, как выглядит на экране целая строка удлиненных символов, введите небольшую программку на Бейсике. Само собой разумеется, что перед ее запуском ассемблерная программа должна быть оттранслирована.

10 PRINT AT 5,5; 20 LET a$="Starting program BIGSYM!" 30 FOR n=1 TO LEN a$ 40 POKE 23296,CODE a$(n) 50 RANDOMIZE USR 60000 60 NEXT n

Насладившись созерцанием новых букв, возможно, вы захотите воспользоваться процедурой BIGSYM в собственной программе. Впоследнем разделе этой главы, где приводится программа и описание многокадровой заставки, можно посмотреть, как это лучше сделать. Пока же можем сказать следующее: перед вызовом процедуры из ассемблера необходимо установить позицию печати в нужное место экрана, воспользовавшись командой RST 16, а в аккумулятор занести код выводимого символа. В этом случае надобность в команде LD A,(23296), предваряющей в приведенном примере процедуру BIGSYM, отпадает.



Содержание раздела