【问题标题】:What does IM0/1 mean in z80.info decoding?z80.info解码中的IM0/1是什么意思?
【发布时间】:2016-09-11 12:59:40
【问题描述】:

我正在写(又一个)Z80 simulator。 我正在使用the decoding page on the z80.info site

在查找/分解表的部分中,它说对于索引 1 和 5,中断模式是 IM0/1。此表参考自 IM 指令 (ED) X=1, Z=6。

IM0/1 究竟是什么意思?

我知道这不是官方说明,但我也在努力支持未记录的说明。

【问题讨论】:

    标签: simulator z80


    【解决方案1】:

    如发现 here,引自 Gerton Lunter:

    指令 ED 4E 和 ED 6E 等效于 IM 0:当 FF 放在总线上时 (物理上)在中断时间,频谱继续正常执行,而 当一个 EF (RST 28h) 被放在公共汽车上时它崩溃了,就像它在那种情况下一样 Z80 处于官方中断模式 0。在 IM 1 中,Z80 只执行 RST 38h (操作码 FF)无论总线上有什么。

    所以它几乎意味着IM 0,我不确定常见的/1来自哪里。

    【讨论】:

    • “/1”表示它可能是“IM 0”或“IM 1”。
    • @IgnacioVazquez-Abrams 好吧,这就是我以前的想法,但根据我能找到的任何内容,这并不是该指令的实际行为方式。
    • 我认为这意味着:最初是由某人使用未加载总线的机器进行测试的。因此,测试人员无法确定他们进入了哪种中断模式,并且必须模糊地记录操作,并且传播广泛。 Gerton 似乎已经发现它们肯定是 IM 0。所以它们是 IM 0,但可能仍被记录为 1/0,因为很长一段时间该模式都是未知的。
    • 在频谱上测试这个有多简单?我的意思是频谱的 ULA 是否会干预接受和处理中断的行为,从而使其崩溃?
    • @Tommy 认为我同意 IM0/1IM0 的重复项,所以我猜它们不在原始文档中,只是后来才被发现……当时没有确切的行为知识。 ..
    【解决方案2】:

    IM0/1/2是设置Z80 CPU int中断模式0/1/2的指令。每种模式处理可屏蔽中断的方式不同。除了 IIRC,我使用这些年:

    1. IM0

      执行外部硬件放置在数据总线上的opc

    2. IM1

      38h调用修复ISR

    3. IM2

      从 ISR 入口点表调用 ISR,该入口点表放置在 i 寄存器点的位置

    这里是从我的模拟器中提取的相关中断C++代码:

    //---------------------------------------------------------------------------
    void Z80::_reset()
        {
        im=0;
        iff1=0;
        iff2=0;
        reg.r16.pc =0x0000;
        reg.r16.af =0xFFFF;
        reg.r16.bc =0xFFFF;
        reg.r16.de =0xFFFF;
        reg.r16.hl =0xFFFF;
        reg.r16.ix =0xFFFF;
        reg.r16.iy =0xFFFF;
        reg.r16.ir =0xFFFF;
        reg.r16.sp =0xFFFF;
        reg.r16._af=0xFFFF;
        reg.r16._bc=0xFFFF;
        reg.r16._de=0xFFFF;
        reg.r16._hl=0xFFFF;
        reg.r16.alu=0xFFFF;
        reg.r16.mem=0xFFFF;
        reg.r16.io =0xFFFF;
        reg.r16.nn =0xFFFF;
        time=0; time0=0; dtime=0;
        busrq=false;
        busack=false;
        }
    //---------------------------------------------------------------------------
    void Z80::_int()
        {
        if (!_enable_int) return;
        if (!iff1) return;
        if (actual->ins==_z80_ins_HALT) reg.r16.pc+=actual->size;
        if ((actual->ins==_z80_ins_EI)||(actual->ins==_z80_ins_DI)) execute();
    
        iff1=0;
        iff2=0;
    
        if (im==0)
            {
            // execute instruction on databus db from peripherials
            mc=0;
            actual=&ins_int0;
            time+=actual->mc[mc]; mc++;     // fetch INT
            BYTE db[4];
            db[0]=db8;
            db[1]=db8;
            db[2]=db8;
            db[3]=db8;
            execute(db);
            }
        else if (im==1)
            {
            mc=0;
            actual=&ins_int1;
            time+=actual->mc[mc]; mc++;     // fetch INT
            _push(reg.r16.pc);
            reg.r16.pc=0x0038;              // fixed vector 38h
            }
        else if (im==2)
            {
            mc=0;
            actual=&ins_int2;
            time+=actual->mc[mc]; mc++;     // fetch INT
            _push(reg.r16.pc);
    
            union { BYTE db[2]; WORD dw; } ubw;
            ubw.db[1]=reg.r8.i;             // H
            ubw.db[0]=db8;                  // L
            reg.r16.pc=_readw(ubw.dw);      // vector from mem[i+db8]
            }
        }
    //---------------------------------------------------------------------------
    void Z80::_nmi()
        {
        if (actual->ins==_z80_ins_HALT) reg.r16.pc+=actual->size;
        if ((actual->ins==_z80_ins_EI)||(actual->ins==_z80_ins_DI)) execute();
    
        iff2=iff1;      // iff2 ide do flagov po ld a,i alebo ld a,r
        iff1=0;
    
        mc=0;
        actual=&ins_nmi;
        time+=actual->mc[mc]; mc++;     // fetch NMI
        _push(reg.r16.pc);
        reg.r16.pc=0x0066;              // fixed vector 66h
        }
    //---------------------------------------------------------------------------
    

    这里所有的IM指令按顺序从这里提取What's the proper implementation for hardware emulation?:

    opc      T0 T1 MC1   MC2   MC3   MC4   MC5   MC6   MC7   mnemonic
    ED46     08 00 M1R 4 M1R 4 ... 0 ... 0 ... 0 ... 0 ... 0 IM0
    ED4E     08 00 M1R 4 M1R 4 ... 0 ... 0 ... 0 ... 0 ... 0 IM0
    ED56     08 00 M1R 4 M1R 4 ... 0 ... 0 ... 0 ... 0 ... 0 IM1
    ED5E     08 00 M1R 4 M1R 4 ... 0 ... 0 ... 0 ... 0 ... 0 IM2
    ED66     08 00 M1R 4 M1R 4 ... 0 ... 0 ... 0 ... 0 ... 0 IM0
    ED6E     08 00 M1R 4 M1R 4 ... 0 ... 0 ... 0 ... 0 ... 0 IM0
    ED76     08 00 M1R 4 M1R 4 ... 0 ... 0 ... 0 ... 0 ... 0 IM1
    ED7E     08 00 M1R 4 M1R 4 ... 0 ... 0 ... 0 ... 0 ... 0 IM2
    

    如你所见:

    IM value: 0  0  1 2 0  0  1 2
    

    还有你的链接页面:

    IM value: 0 0/1 1 2 0 0/1 1 2
    

    所以我希望它只是意味着opc 的编码方式,但你说得对,那里的表格不是很明显。

    IM0/1IM0 的副本,所以我猜它们不在原始文档中,只是在后来才被发现……没有确切的行为知识创建表格的时间...有很多最初未记录的(秘密)说明,因此如果您的信息来源未准确包含它们,则您可能不应该使用它并转向更好的文档以避免将来出现问题和不兼容性...... .

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多