我想在 Z80 上使用 IM 1 中断模式。
在中断模式 1 中,处理器跳转到内存中的 38h 地址(对吗?),然后继续中断。如何在我的代码中指定它?我读过:
defs [,] ds [,] 这个伪指令在代码段中插入一个字节块
我需要一些示例源代码。
亲切的问候
拉法尔·R。
首先,我面前没有 Z80。
参考:Z80asm 指令
使用 org 在指定地址“手动”定位“功能”。因此,要编写一个 IM1 处理程序:
org 0x38
; IM1 handler
ld a, 100 ; ... whatever
ret
另外,我不确定您的正常起始地址是,但原始 Z80 是从位置 0 开始的。如果是这种情况,您应该在代码的早期 JMP 越过 0x38 处理程序。(你只有 56 个字节可以玩)
快乐编码!
在 IM 1 中,当发现一个挂起的中断(在操作码结束前的最后一个周期的上升沿采样;IRQ 线只是采样,与 NMI 不同)时,清除 IFF1 和 2 并RST 38h
执行 an。所以你应该在 0x38 结束 PC,禁用中断和堆栈顶部的旧程序计数器。您需要做任何您必须做的事情来响应中断,然后执行EI, RET
或EI, RETI
(这里没有区别,因为两个 IFF 标志在中断确认之后具有相同的值)。
在 Z80 上,PC 在上电或重置时设置为 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
我已经弄清楚了当你不是从 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 处。所以处理程序是对的。另外,请记住初始化堆栈指针。如果不这样做,您将无法从中断处理程序返回到程序。