Z80软件延迟

use*_*205 5 z80

我正在尝试创建一个软件延迟.这是我正在做的示例程序:

    Address  Data   Opcode  Comment    
    1800      06    LD, B   Load register B with fix value
    1801      “ “           Fixed value
    1802      05    DEC, B  Decrement value in register B
    1803      C2    JP cc   Jump to 1802 if value is not 0
    1804      02    -       Address XX
    1805      18    -       Address XX
Run Code Online (Sandbox Code Playgroud)

我的问题是如何计算加载到寄存器B所需的固定值,以便将值递减到0的过程需要2秒?

在我的手册中,运行指令的时间基于4MHz CPU,但我使用的Z80 CPU的速度为1.8MHz.知道如何计算这个吗?谢谢.这里的PS是手册中的减量(DEC)和跳转(JP cc)指令:

Instruction    M Cycles    T states   4 MHz E.t
DEC r             1           4         1.00
JP cc             3       10 (4,3,3)    2.50
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 4

如果 1.8MHz 指的是 1,800,000 Hz,那么要获得 2 秒的延迟,您需要延迟 3,600,000 个 T 状态。您当前的延迟循环每次迭代需要 14 个 T 状态,这意味着您的初始值B必须为 3600000/14 == 257143,这显然不适合一个字节。

您可以使用 8 位寄存器指定的最大迭代次数为 256,并且要通过 256 次迭代达到 3,600,000 个 T 状态,每次迭代必须采用 14,062 个 T 状态。那是一个循环体。

如果我们使用 16 位计数器,事情就会变得更容易管理。在 65,536 次迭代中,每次迭代只需要 55 个 T 状态即可达到总共 3,600,000 个 T 状态。下面是一个示例:

    ; Clobbers A, B and C
    ld      bc,#0
1$:
    bit     #0,a    ; 8
    bit     #0,a    ; 8
    bit     #0,a    ; 8
    and     a,#255  ; 7
    dec     bc      ; 6
    ld      a,c     ; 4
    or      a,b     ; 4
    jp      nz,1$   ; 10, total = 55 states/iteration
    ; 65536 iterations * 55 states = 3604480 states = 2.00248 seconds
Run Code Online (Sandbox Code Playgroud)