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



         

МАКРООПРЕДЕЛЕНИЯ - часть 3


Во время трансляции текст макроопределения не переводится сразу в машинные коды, а помещается в специальный буфер, из которого затем извлекается по мере необходимости. Поэтому перед вводом команды A необходимо указать размер этого буфера с помощью команды C. Помните, при вводе этой команды сначала запрашивается размер входного буфера Include buffer?, а затем появляется еще один запрос - Macro buffer? На него нужно ввести количество байт, достаточное для размещения текста всех макроопределений, заданных в программе. Если задать слишком маленькое число, то во время первого прохода ассемблирования появится сообщение No Macro Space. В этом случае нужно повторить ввод с большим числом. В приведенном ниже примере для размещения макросов достаточно 300 байт.

ORG 60000 ENT $ ; Печать ASCIIZ-строки в позиции экрана, задаваемой первыми двумя параметрами PRN MAC LD B,=0 LD C,=1 LD HL,=2 CALL PRNZ ENDM ; Позиционирование печати PRAT MAC LD A,22 RST 16 LD A,B RST 16 LD A,C RST 16 ENDM ; Установка цветов INK и PAPER, а также цвета бордюра COLOR MAC LD A,=1*8+=0 LD (23693),A LD A,=1 CALL 8859 ENDM ; Очистка экрана и назначение вывода на основной экран CLS MAC CALL 3435 LD A,2 CALL 5633 ENDM ; Установка PLOT-позиции без рисования точки PSET MAC LD L,=0 LD H,=1 LD (23677),HL ENDM ; Черчение линии из текущей PLOT-позиции DRAW MAC EXX PUSH HL LD DE,=0 LD C,=1 LD B,=2 CALL 9402 POP HL EXX ENDM ; Направления рисования линий UP_RT EQU #0101 ;вверх и вправо DN_RT EQU #FF01 ;вниз и вправо DN_LF EQU #FFFF ;вниз и влево UP_LF EQU #01FF ;вверх и влево ; ------ BEGIN COLOR (5,0) CLS PRN 5,8,TEXT1 PRN 7,7,TEXT2 PSET 48,144 DRAW UP_RT,131,0 DRAW DN_RT,0,39 DRAW UP_LF,131,0 DRAW UP_RT,0,39 PSET 50,142 DRAW UP_RT,127,0 DRAW DN_RT,0,35 DRAW UP_LF,127,0 DRAW UP_RT,0,35 RET ; Подпрограмма печати ASCIIZ-строки, вызываемая макросом PRN PRNZ PUSH HL PRAT PRNZ1 LD A,(HL) INC HL AND A JR Z,PRNZ2 RST 16 JR PRNZ1 PRNZ2 POP HL RET ; ------ TEXT1 DEFB 16,2,19,1 DEFM "*** DEMO ***" DEFB 0 TEXT2 DEFB 16,6,19,1 DEFM "### MACROS ###" DEFB 16,5,0

Имея возможность работать с дисководом, очень удобно собрать все макросы в одном или нескольких файлах (например, по родству выполняемых функций) и затем при необходимости включать их в исходный текст с помощью команды ассемблера *F. Так как макросы сразу не транслируются, то это никак не повлияет на размер исполняемого кода, даже если среди включаемых макросов есть такие, которые ни разу не используются в программе. Они, конечно, займут некоторый объем памяти, но так и останутся в буфере невостребованными.

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




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