仿真 – 独立测试中的6502与Commodore PET中断的行为

我正在FPGA上构建Commodore PET.我已经在Kansas Lava中实现了我自己的6502核心(代码可以在 https://github.com/gergoerdi/mos6502-kansas-lava获得),并且通过在其周围放置足够的IO( https://github.com/gergoerdi/eightbit-kansas-lava),我能够在其上启动原始的Commodore PET ROM,获得闪烁的光标并开始键入.

但是,在输入经典的BASIC程序之后

10 PRINT "HELLO WORLD"
20 GOTO 10

它会在一段时间后(几秒钟后)崩溃

?ILLEgal QUANTITY ERROR IN   10

因为我的代码具有相当合理的每操作码测试覆盖率,并且它通过了AllSuiteA,我想我会考虑更复杂行为的测试,这就是我到达Klaus Dormann’s interrupt testsuite的方式.在堪萨斯熔岩模拟器中运行它指出了大量的我原来的中断实现中的错误

>进入中断处理程序时未设置I标志
> B旗满满的
> IRQ中断被完全忽略,除非我们在他们到达时未设置(正确的行为似乎是在我设置时排队中断,当它被取消时,它们仍应被处理)

修好这些之后,我现在可以成功运行Klaus Dormann测试,所以我希望将我的机器加载到真正的FPGA上,运气好的BASIC崩溃可能会消失.

然而,修复了所有这些中断错误并在模拟器中通过中断测试的新版本现在无法响应键盘输入,甚至只是在真实FPGA上闪烁光标.请注意,键盘输入和光标闪烁都是响应外部IRQ(从屏幕VBlank信号连接)完成的,所以这意味着固定版本以某种方式打破了所有中断处理…

我正在寻找任何可能出错的模糊建议或如何开始调试.

完整的代码可以在https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite获得,违规提交(修复测试和打破PET的那个)是7a09b794af.我意识到这与最小可行再现完全相反,但是改变本身很小,因为我没有想法哪里出错了,因为重现问题需要一台功能足以引导库存Commodore PET ROM的机器,我不知道如何缩小它……

添加

我设法在同一个硬件上用一个非常简单的(我敢说最小的)ROM而不是库存PET ROM重现相同的问题:

.org $C000        

reset:
        ;; Initialize PIA
        LDY #$07
        STY $E813

        LDA #30
        STA $42
        STA $8000
        CLI
        JMP *

irq:
        CMP $E812               ; ACK irq

        DEC $42
        BNE endirq

        LDX $8000
        INX
        STX $8000

        LDA #30
        STA $42            
endirq: RTI

        .res $FFFC-*

        .org $FFFC
resetv: .addr reset
irqv:   .addr irq

解决方法

中断没有排队;中断线在每条指令的倒数第二个周期被采样,如果它是有效的,然后我取消设置,则接下来发生跳转到中断而不是取指/解码.令人困惑的是,IRQ是水平触发的,而不是边缘触发的,并且通常在一段时间内保持高位,而不是一个周期?因此清除I将导致中断立即发生,如果它已经在进行中.在cpu确认它之前,看起来PET中断是否保持活动状态?

还要注意语义:SEI和CLI在最后一个周期中调整标志.关于是否跳转到中断的决定是之前的循环.所以当SEI作为最后一个中断进入时,你将进入我设置的中断例程.如果在命中CLI时中断处于活动状态,则处理器将在分支之前执行CLI之后的操作.

我正在打电话,所以很难评估得比提供这些陈词滥调更彻底;我稍后会尝试正确复习.有什么有用的吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?
Java菜单驱动程序以检查数字类型
使用Junit的Maven项目 - 检查银行账号
JAVA编程基础
在Java中使用throw、catch和instanceof来处理异常
在Java中,将数组分割为基于给定查询的子数组后,找到子数组的最大子数组和
如何在Java中从给定的字符串中删除HTML标签?
在PHP中,IntlChar getBlockCode()函数的翻译如下:
如何在Android中实现按下返回键再次退出的功能?
如何使用Java中的流式API解析JSON字符串?
Java中的模式类