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


         

Наиболее удачным для такой таблицы


Наиболее удачным для такой таблицы представляется байт 255 (#FF). В этом случае обработчик прерываний должен находиться по адресу 65535 (#FFFF). На первый взгляд может показаться странным выбор такого адреса, ведь остается всего один байт! Но и этого единственного байта оказывается достаточным, если в него поместить код команды JR. Следующий байт, находящийся уже по адресу 0, укажет смещение относительного перехода. По нулевому адресу в ПЗУ записан код команды DI (#F3), поэтому полностью команда будет выглядеть как JR 65524. Далее в ячейке 65524 можно разместить уже более «длинную» команду JP address и заданный в ней адрес может быть совершенно произвольным.

Приведем пример такой подпрограммы установки прерываний:

IMON LD A,24 ;код команды JR LD (65535),A LD A,195 ;код команды JP LD (65524),A LD (65525),HL ;в HL - адрес обработчика прерываний LD HL,#FE00 ;построение таблицы для векторов прерываний LD DE,#FE01 LD BC,256 ;размер таблицы минус 1 LD (HL),#FF ;адрес перехода #FFFF (65535) LD A,H ;запоминаем старший байт адреса таблицы LDIR ;заполняем таблицу DI ;запрещаем прерывания на время ; установки второго режима LD I,A ;задаем в регистре I старший байт адреса ; таблицы для векторов прерываний IM 2 ;назначаем второй режим прерываний EI ;разрешаем прерывания RET

Перед обращением к ней в регистровой паре HL необходимо указать адрес соответствующей процедуры обработки прерываний. Учтите, что в области памяти, начиная с адреса 65024, менять что-либо не желательно. Если все же возникнет такая необходимость, убедитесь прежде, что своими действиями вы не затроните установленные процедурой байты.

Подпрограмма восстановления первого режима выглядит заметно проще и в комментариях уже не нуждается:

IMOFF DI LD A,63 LD I,A IM 1 EI RET

При составлении процедуры обработки прерываний нужно придерживаться определенных правил. Во-первых, написанная вами подпрограмма должна выполняться за достаточно короткий промежуток времени. Желательно, чтобы ее быстродействие было сопоставимо с «пульсом» прерываний, то есть чтобы ее продолжительность не превышала 1/50 секунды. Это правило не является обязательным, но в противном случае трудно будет получить эффект «параллельности» процессов. Во-вторых, и это уже совершенно необходимо, все регистры, которые могут изменить свое значение в вашей процедуре, должны быть сохранены на входе и восстановлены перед выходом. Это же относится и к любым переменным, используемым не только в прерывании, но и в основной программе. В связи с этим не рекомендуется обращаться к подпрограммам ПЗУ, по крайней мере, до тех пор, пока вы не знаете совершенно точно, какие в них используются регистры и какие системные переменные при этом могут быть изменены. Вызов подпрограмм ПЗУ не желателен еще и потому, что некоторые из них разрешают прерывания, что совершенно недопустимо во избежание рекурсии (т. е. самовызова) обработчика, который должен работать при запрещенных прерываниях. Однако использовать команду DI в самом начале процедуры не обязательно, так как это действие выполняется автоматически и вам нужно только позаботиться о разрешении прерываний перед выходом.


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