2

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

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

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

我需要一些示例源代码。

亲切的问候

拉法尔·R。

4

3 回答 3

2

首先,我面前没有 Z80。

参考:Z80asm 指令

使用 org 在指定地址“手动”定位“功能”。因此,要编写一个 IM1 处理程序:

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

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

快乐编码!

于 2011-11-21T22:41:33.290 回答
1

在 IM 1 中,当发现一个挂起的中断(在操作码结束前的最后一个周期的上升沿采样;IRQ 线只是采样,与 NMI 不同)时,清除 IFF1 和 2 并RST 38h执行 an。所以你应该在 0x38 结束 PC,禁用中断和堆栈顶部的旧程序计数器。您需要做任何您必须做的事情来响应中断,然后执行EI, RETEI, 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
于 2011-11-21T22:54:24.713 回答
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 处。所以处理程序是对的。另外,请记住初始化堆栈指针。如果不这样做,您将无法从中断处理程序返回到程序。

于 2011-11-25T12:15:53.717 回答