gpt4 book ai didi

interrupt - 如果我关闭了两个 CIA,谁在调用我的中断处理程序?

转载 作者:行者123 更新时间:2023-12-02 02:02:23 24 4
gpt4 key购买 nike

我正在尝试设置一个简单的光栅中断处理程序来更改给定条纹中的背景颜色。但是,我的中断处理程序似乎一直被调用。 (代码使用CA65的格式)

.include "c64.inc"

ROW = 100

.segment "ZPSAVE"

.segment "STARTUP"

sei

;; Turn off BASIC and KERNAL ROM
lda #$35
sta $01

;; Flush CIA IRQs
bit CIA1_ICR
bit CIA2_ICR

;; Turn off CIA interrupts
lda #%011111111
sta CIA1_ICR
sta CIA2_ICR

;; Set target raster line
lda #%01111111
and VIC_CTRL1
sta VIC_CTRL1

lda #ROW
sta VIC_HLINE

;; Enable VIC interrupt
lda #%00000001
sta VIC_IMR

;; Install interrupt handler
lda #<isr
sta $fffe
lda #>isr
sta $ffff
cli

rts

.macro isr_pre
pha
txa
pha
tya
pha
.endmacro

.macro isr_post
pla
tay
pla
tax
rti
.endmacro

;;; Acknowledge VIC interrupt
.macro ack_vic
lda VIC_IRR
and #$01
sta VIC_IRR
.endmacro

.proc isr
isr_pre
ack_vic

;; Uncommenting these lines works around the problem
;; lda VIC_HLINE
;; cmp #ROW
;; bne exit

lda #1
sta VIC_BORDERCOLOR
sta VIC_BG_COLOR0

ldx #50
: dex
bne :-

lda #0
sta VIC_BORDERCOLOR
sta VIC_BG_COLOR0

exit: isr_post
.endproc

如果我在上面的代码中注释掉标记为“解决方法”的三行,那么我的中断处理程序将一直被调用,而不仅仅是在 ROW 行的(开头):

Without workaround

如果我取消注释这三行,它就可以工作,但它非常不稳定,我猜是因为那些相同的意外中断:

With workaround

最佳答案

我在上面发布的代码中发现了几个问题,修复所有这些问题就解决了问题:

  1. 用于关闭 CIA 中断的位掩码是错误的(不小心长了 9 位)——这就是导致所有这些额外中断触发的原因...
  2. ISR postscriptum 宏缺少一个 pla 来恢复 A 寄存器——这完全搞砸了状态,所以无论旧代码或多或少是偶然的...
  3. VIC 中断未在中断设置代码中刷新——因此在解决前两个问题后,现在从未触发过中断。
  4. 在设置代码的末尾没有什么可以rts的,因为我们关闭了内核和 BASIC ROM

所以固定代码如下:

.include "c64.inc"

ROW = 100

;;; Acknowledge VIC interrupt
.macro ack_vic
lda VIC_IRR
and #$01
sta VIC_IRR
.endmacro

.segment "ZPSAVE"

.segment "STARTUP"

sei

;; Turn off BASIC and KERNAL ROM
lda #$35
sta $01

;; Flush CIA IRQs
bit CIA1_ICR
bit CIA2_ICR
ack_vic

;; Turn off CIA interrupts
lda #%01111111
sta CIA1_ICR
sta CIA2_ICR

;; Set target raster line
lda #%01111111
and VIC_CTRL1
sta VIC_CTRL1

lda #ROW
sta VIC_HLINE

;; Enable VIC interrupt
lda #%00000001
sta VIC_IMR

;; Install interrupt handler
lda #<isr
sta $fffe
lda #>isr
sta $ffff
cli
jmp *

.macro isr_pre
pha
txa
pha
tya
pha
.endmacro

.macro isr_post
pla
tay
pla
tax
pla
rti
.endmacro

.proc isr
isr_pre
ack_vic

lda #1
sta VIC_BORDERCOLOR
sta VIC_BG_COLOR0

ldx #50
: dex
bne :-

lda #0
sta VIC_BORDERCOLOR
sta VIC_BG_COLOR0

exit: isr_post
.endproc

正如预期的那样,这会产生纯白色条纹。出于某种未知原因,条纹从屏幕中间水平开始,但我想这是一个单独的 SO 问题。

关于interrupt - 如果我关闭了两个 CIA,谁在调用我的中断处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com