там немного не так. мы привыкли, что на Спектруме, когда задаём таблицу векторов для im2, то мы задаём как правило только старшую часть адреса. Для Z80PIO, когда мы указываем контроллеру адрес вектора для прерываний, мы указываем младшую часть. Таким образом, для примера, мы установили вектор на адрес #a000 (условно, конечно, адрес будет выглядеть как #a0a0), а для PIO адрес #10, то при приходе прерываний будет обращение по адресу #a010. Проц возьмёт от туда 2 байта и выполнит туда jp.в итоге может быть так, что экранные прерывания прилетают на im2 вектор, который мы указали процу, а прерывания от PIO прилетают по другому вектору, но в диапазоне 256.
т.е. в данном примере:
im 2 ; cpu interrupt mode 2 (vectored)
ld a, 0h
ld i, a
ld a, 0fh ; output
out (CNTRLA), a
ld a, 4fh ; input
out (CNTRLB), a
ld a, 28h ; vector address
out (CNTRLB), a
будет вектор по адресу #0028, что в примере и указано, но в примере по этому адресу должны лежать 2 байта, что то вроде
.org 28h
dw procedure_addr
проц берёт этот адрес и делает jp





Ответить с цитированием