Zilog Z80 - 如何使用中断模式1(IM 1指令)

时间:2011-11-21 22:15:30

标签: interrupt mode z80

我想在Z80上使用IM 1中断模式。

在中断模式下,1个处理器跳转到内存中的38h地址(我是对吗?)然后继续中断。如何在我的代码中指定它? 我读过:

  

defs [,] ds [,]这个伪   指令将一个字节块插入代码段

我需要一些示例源代码。

亲切的问候

RafałR。

3 个答案:

答案 0 :(得分:2)

首先,我面前没有Z80。

参考:Z80asm directives

使用org'手动'在指定地址找到'功能'。 所以,写一个IM1处理程序:

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

另外,我不确定你的正常起始地址是,但是原始Z80从位置0开始。如果是这种情况,你应该在你的代码中早期JMP超过0x38处理程序非常 。 (你只能玩56个字节)

快乐的编码!

答案 1 :(得分:1)

在IM 1中,一旦发现挂起的中断(在操作码结束之前的最后一个周期的上升沿采样; IRQ线刚刚被采样,与NMI不同)IFF1和2被清除并且{{ 1}}被执行。因此,您最终应该将PC设置为0x38,禁用中断,并在堆栈顶部使用旧程序计数器。您需要做任何必须做的事情来响应中断,然后执行RST 38hEI, RET(这里没有区别,因为两个IFF标志在中断确认后具有相同的值)。

在Z80上,PC在上电或复位时设置为0,因此您可能已经对内存末端的代码进行了一些控制。确切的语法取决于你的汇编程序,但你可能想要这样的东西:

EI, RETI

答案 2 :(得分:0)

我已经弄清楚当你没有从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。 所以处理程序是正确的。另外,请记住初始化堆栈指针。如果你没有,你将无法从中断处理程序返回到程序。