【问题标题】:Why does the 6502 read from the stack before writing it?为什么6502在写入之前先从堆栈中读取?
【发布时间】:2021-05-17 05:54:08
【问题描述】:

我正在构建一个基于 W65C02S 的计算机,我尝试自己构建基本上所有的工具。包括汇编器(是的,我知道它们存在,我只是想自己从头开始制作一切,为了好玩)。

在处理JSR操作码(绝对寻址模式)时,我发现在将程序计数器放入堆栈之前,它先从堆栈中读取一个字节(此时程序计数器设置为80 2e ,堆栈指针为01b6):

READ  address:   80 2e   data:   20   JSR   ; Read the opcode
READ  address:   80 2f   data:   14   14    ; Read the LO byte of operand
READ  address:   01 b6   data:   74   't'   ; Read the stack (why?!)
WRITE address:   01 b6   data:   80   ---   ; Write HI byte of PC
WRITE address:   01 b5   data:   30   '0'   ; Write LO byte of PC
READ  address:   80 30   data:   80   80    ; Read HI byte of operand
READ  address:   80 14   data:   8d   STA   ; Read opcode at `80 14` (the JSR operand)

它工作正常,但它首先从堆栈中读取的原因是什么?

(更新:解释表格。这是来自我自己的工具。我正在使用 Arduino 来查看数据和地址总线,看看那里发生了什么。它是一个只运行我自己的代码的硬件 CPU。)

【问题讨论】:

    标签: stack 6502


    【解决方案1】:

    我绝不是 6502 专家,但我确实有一个猜想。有更多6502经验的朋友可以指正我这里说的不对...

    除其他外,您的输出仅指示每个时钟周期总线上的内容。我相信您看到的初始“堆栈读取”根本不是真正的读取,而只是 CPU 在该时钟周期内将堆栈地址断言到地址总线上,且 RWB(读/写位)为高电平(以免无意中写入堆栈)但不是为了将当时该地址的堆栈内容实际读取到内部寄存器中。有了地址总线上的稳定地址,在下一个周期,CPU 将要写入的数据呈现在数据线上,并降低 RWB 信号以将值写入该地址的堆栈。

    【讨论】:

    • 我也在retrocomputing.stackexchange.com 上问过,并在那里得到了答案。基本上这是因为 6502 不能做任何事情没有地址周期。因此,当不需要时,它只是“随机”读取。
    • @BartFriederichs 好的,我认为这符合并证实了我的猜想。 :) 6502 需要额外的周期来呈现地址。尽管读取信号处于活动状态,但此时 CPU 实际上并没有关注地址总线。该信号必须被读取或写入。出于显而易见的原因,您不希望写入信号,因此它看起来像“随机读取”,但实际上根本没有读取。
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 2021-03-05
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多