我想在Z80上使用IM 1中断模式。
在中断模式下,1个处理器跳转到内存中的38h地址(我是对吗?)然后继续中断。如何在我的代码中指定它? 我读过:
defs [,] ds [,]这个伪 指令将一个字节块插入代码段
我需要一些示例源代码。
亲切的问候
RafałR。
答案 0 :(得分:2)
首先,我面前没有Z80。
使用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 38h
或EI, 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。 所以处理程序是正确的。另外,请记住初始化堆栈指针。如果你没有,你将无法从中断处理程序返回到程序。