Zilog Z80 - Как использовать режим прерывания 1 (инструкция IM 1) - PullRequest
2 голосов
/ 22 ноября 2011

Я хочу использовать режим прерывания IM 1 на Z80.

В режиме прерывания 1 процессор переходит на 38-часовой адрес в памяти (я прав?), А затем продолжает прерывание.Как я могу указать это в моем коде?Я читал о:

defs [,] ds [,] Эта псевдо-инструкция вставляет блок байтов в сегмент кода

Мне нужен пример исходного кода.

С уважением

Rafał R.

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Прежде всего, у меня нет Z80 передо мной.

Ссылка: Директивы Z80asm

Используйте org, чтобы «вручную» найти функциюпо указанному адресу.Итак, чтобы написать обработчик IM1:

org 0x38
; IM1 handler 
ld a, 100 ; ... whatever
ret

Кроме того, я не уверен, что ваш нормальный начальный адрес есть, но исходные Z80 начинаются с местоположения 0. Если это так, вы должны JMP мимоОбработчик 0x38 очень в начале вашего кода.(У вас есть только 56 байтов для игры)

Счастливое кодирование!

1 голос
/ 22 ноября 2011

В IM 1, при обнаружении ожидающего прерывания (которое выбирается по переднему фронту последнего цикла перед концом кода операции; в отличие от NMI линия IRQ просто выбирается), IFF1 и 2 очищаются и RST 38h выполнен.Таким образом, у вас должен получиться ПК с разрешением 0x38, прерывания отключены и счетчик старой программы на вершине стека.Вы захотите сделать все, что вам нужно, чтобы ответить на прерывание, а затем выполнить EI, RET или EI, RETI (здесь нет никакой разницы, потому что два флага IFF имеют одинаковое значение после подтверждения прерывания).

На Z80 ПК устанавливается в 0 после включения или сброса, так что, вероятно, у вас уже есть некоторый контроль над кодом внизу на этом конце памяти.Точный синтаксис зависит от вашего ассемблера, но вы, вероятно, хотите что-то вроде:

org 0

; setup initial state here, probably JP somewhere at the end
; possibly squeeze in another routine if you've the space

org 0x38
; respond to interrupt
EI
RET
0 голосов
/ 25 ноября 2011

Я понял, что делать, если вы не начинаете с 0h:

org 1800h
START: ;Do the start, but It can't take more than 38 instructions
LD SP, 0x2000 ;Initialize SP!
JP MAIN ;Continue to rest of the program

ds 0x1838-$,0 ;Allocate block of memory for interrupt handler
INT:
  ;interrupt sub
  LD E, 0
  LD A, E
  OUT (066), A
  EI
  RETI

ds 0x1840-$,0 ;Alloc space for the rest of program.
MAIN:
  ;Rest of program here

Насколько это возможно, процессор поместит инструкцию JP 01838h по адресу 038h. Так что обработчик прав. Также не забудьте инициализировать указатель стека. Если вы этого не сделаете, вы не сможете вернуться из обработчика прерываний в программу.

...