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


         

НЕКОТОРЫЕ НЕДОКУМЕНТИРОВАННЫЕ КОМАНДЫ



НЕКОТОРЫЕ НЕДОКУМЕНТИРОВАННЫЕ КОМАНДЫ

К недокументированным относятся те команды, которые не были описаны фирмой-разработчиком микропроцессора Z80A CPU. Вполне возможно, они даже не были запланированы, а получились, если так можно выразиться, как издержки производства. В связи с этим каждый программист «открывает» их для себя, пользуясь методом «научного тыка». Вы также можете поэкспериментировать, используя некоторые правила построения системы команд, о которой мы и хотим здесь рассказать. Внимательно изучив коды, приведенные в предыдущем приложении, вы сможете заметить определенную закономерность. Сравните, например, команды LD HL,NN, LD IX,NN и LD IY,NN. Не правда ли, кодировки очень похожи друг на друга? Команды, использующие индексные регистры, состоят из тех же кодов, что и LD HL,NN, но предваряются специальным префиксом #DD для IX или #FD для IY. Среди «стандартных» мнемоник отсутствуют команды обработки половинок индексных регистров, но воспользовавшись правилами кодировки, не трудно получить такие команды. Они будут соответствовать кодам обработки регистров H и L, перед которыми стоит один из указанных выше префиксов. Например, для загрузки младшей половинки регистра IX числом 32 можно написать следующую последовательность:

DEFB #DD LD L,32

В мнемоническом обозначении такая команда обычно записывается как LD IXL,32. С префиксами #DD и #FD аналогичным образом могут быть получены следующие команды:

ADD A,s ADC A,s AND s CP s DEC s INC s LD r,s LD s,n LD s,r OR s SBC A,s SUB s XOR s

где s - IXH, IXL, IYH или IYL; r - A, B, C, D или E; n - однобайтовое числовое значение. Существует еще целый ряд интересных команд, получаемых с префиксами #DD и #FD, которые могут выполнять сразу два действия - устанавливать или сбрасывать биты одновременно в регистре и в памяти, адресуемой индексными регистрами. Например, команда

SET 1,A(IX+3)

сначала установит бит 1 в ячейке, адресуемой IX со смещением в 3 байта, а затем поместит полученное значение в регистр A. То есть выполняются как бы две команды:




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