logo search
ZX-Review-1992-01-12

2. Особенности регистровой пары H'L' (альтернативной).

Эта ошибка (неточность) связана с тем, как в "Спектруме" обрабатываются маскируемые прерывания. Вы знаете, что обычно компьютер 50 раз в секунду приостанавливает исполнение своей текущей программы и обращается по адресу 0038H = 56 DEC для запуска процедуры обработки маскируемого прерывания. Эта процедура увеличивает на единицу показания системных часов компьютера (трехбайтную системную переменную FRAMES) и вызывает подпрограмму сканирования клавиатуры в поисках нажатой клавиши. Благодаря этому и возможен диалог между Вами и компьютером.

Ошибка связана с тем, что увеличение на единицу системных часов производится некорректно. Младшие два байта увеличиваются командой INC HL и с ними все в порядке, но когда они переполняются и надо увеличить старший байт, расположенный по адресу 5С7АН (33674), для этого используется команда процессора

INC (IY+40)

Программист, который писал эту процедуру, предполагал, что во время ее работы в регистровой паре IY должно быть значение 5С3АH (23610) указание на системную переменную ERR NR. в принципе так оно и должно бы быть.

Когда вы вызываете подпрограмму, написанную в машинном коде с помощью RANDOMIZE USR nn, процедура калькулятора, занимающаяся обработкой функции USR nn (она расположена по адресу 34В3Н) автоматически сохраняет на стеке адрес 2D2EH. Поэтому, когда Вы вернетесь по RET из своей подпрограммы, то попадете сначала в адрес 2D2BH (процедура STACK_BC). Здесь восстанавливается нормальное содержимое пары IY = 5C3AH.

Таким образом, у Вас все было бы в полном порядке, если бы не одно "но". Ведь во время работы самой Вашей процедуры тоже может пройти системное прерывание. И если Вы изменили содержимое IY, то вместо приращения системных часов получите что угодно.

Ошибка ПЗУ состоит в том, что в процедуре обработки маскируемого прерывания следовало бы выставлять в IY значение 5С3А, а только потом наращивать старший байт системных часов, а перед выходом восстанавливать в IY Ваше значение.

Достаточно обидно иметь в своем распоряжении регистровую пару IY и не иметь возможности ею воспользоваться. И пользоваться ею можно, если при этом соблюдать некоторые меры предосторожности.

1.Если Вы намерены использовать регистровую пару IY, то возьмите себе за правило прежде, чем что либо изменять в этой паре, отключать системные прерывания командой процессора DI DISABLE INTERRUPTS, а перед выходом из процедуры восстанавливать их командой EI ENABLE INTERRUPTS.

2.Может быть, Вам захочется даже создать свою собственную процедуру для обработки прерываний.