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


         

ДИРЕКТИВЫ УСЛОВНОЙ ТРАНСЛЯЦИИ - часть 2


CHAN 2

получится последовательность инструкций

LD A,2 CALL 5633

а если задать

CHAN 0

то такая макрокоманда оттранслируется иначе:

XOR A CALL 5633

Приведем другой, более серьезный пример применения команд условной трансляции в макросах:

ORG 60000 UP EQU 1 DN EQU %10 RT EQU %100 LF EQU %1000 SCRL MAC PUSH BC LD HL,=1*256+=0 LD (COL),HL LD HL,=3*256+=2 LD (LEN),HL IF =4 & UP ;если 5-й параметр = UP CALL SCR_UP END IF =4 & DN ;если 5-й параметр = DN CALL SCR_DN END IF =4 & RT ;если 5-й параметр = RT CALL SCR_RT END IF =4 & LF ;если 5-й параметр = LF CALL SCR_LF END POP BC ENDM ; ------ LD B,16 SCRL1 SCRL 10,4,5,7,UP DJNZ SCRL1 LD B,16 SCRL2 SCRL 10,4,5,7,RT DJNZ SCRL2 LD B,16 SCRL3 SCRL 10,4,5,7,DN DJNZ SCRL3 LD B,16 SCRL4 SCRL 10,4,5,7,LF DJNZ SCRL4 RET

COL DEFB 0 ROW DEFB 0 LEN DEFB 0 HGT DEFB 0

В выражениях ассемблера GENS отсутствует знак равенства, но из этого затруднения можно выйти, если употребить поразрядную операцию «И» - AND, обозначаемую символом «амперсанд» (&), а в соответствующем параметре использовать отдельные биты, указывающие на различные действия. В приведенном макросе после определения графических переменных COL, ROW, LEN и HGT в зависимости от последнего параметра вызывается одна из четырех процедур скроллингов (напомним, что сами процедуры были описаны в 6-й главе). Как видите, благодаря командам условной трансляции стало возможно объединить их в одном макросе. В результате и текст программы заметно сократился и стал значительно более удобочитаемым. Правда, при этом несколько возрос размер исполняемого модуля, но этот недостаток также можно устранить, слегка доработав макрос. Например, можно добавить еще один условный блок в самом начале, в котором проверяется значение самого первого параметра и только если он не равен 0, транслируются команды определения переменных, а в противном случае они будут пропускаться.




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