gpt4 book ai didi

cpu - Gameboy emulation - 需要对 CD 说明进行说明

转载 作者:行者123 更新时间:2023-12-01 13:38:52 25 4
gpt4 key购买 nike

我目前正在编写一个 Gameboy 模拟器,我注意到一些对我来说似乎很奇怪的事情。

我的模拟器正在执行跳转指令 0xCD,例如 CD B6 FF,但我的理解是跳转应该只跳转到盒式 ROM 中的地址( 0x7FFF 最大值),因为我假设 CPU 只能执行来自 ROM 而不是 RAM 的指令。有问题的 ROM 是马里奥博士,我希望它只会执行有效的操作。 0xFFB6 在高 RAM 中,这对我来说很奇怪。

我的想法正确吗?如果我是,大概这意味着我的程序计数器以某种方式结束在错误的地址并且 CB 实际上是另一条指令数据的一部分,而不是指令本身?

如果您能提供一些说明,我将不胜感激,谢谢。

作为引用,我一直在使用 Gameboy OpcodesCPU docs执行指令。我知道它们包含一些错误,我想我已经解决了这些错误(例如,0xE2 被列为双字节指令,而实际上它只有一个)

最佳答案

刚刚查看了Dr. Mario 1.1,它在启动时复制hFFB6处的VBlank int例程,然后当VBlank发生时,调用0:01A6处的例程,调用OAM DMA传输例程。

在 OAM DMA 传输期间,CPU 只能访问 HRAM,因此需要在 HRAM 中编写一个简短的例程来等待传输完成。 OAM DMA 传输需要 160 µs,因此您通常会创建一个循环,在指定 OAM 传输源后等待这段时间。

这是在启动时运行的初始化例程的一部分,它将 DMA 传输例程复制到 HRAM:

...
ROM0:027E 0E B6 ld c,B6 ;destination hFFB6
ROM0:0280 06 0A ld b,0A ;length 0xA
ROM0:0282 21 86 23 ld hl,2386 ;source 0:2386
ROM0:0285 2A ldi a,(hl) ;copy OAM DMA transfer routine from source
ROM0:0286 E2 ld (ff00+c),a ;paste to destination
ROM0:0287 0C inc c ;destination++
ROM0:0288 05 dec b ;length--
ROM0:0289 20 FA jr nz,0285 ;loop until DMA transfer routine is copied
...

当 VBlank 发生时,它会跳转到 0:01A6 处的例程:

ROM0:0040 C3 A6 01         jp   01A6

其中包含对我们的 OAM DMA 传输例程的调用,等待 DMA 完成:

ROM0:01A6 F5               push af
ROM0:01A7 C5 push bc
ROM0:01A8 D5 push de
ROM0:01A9 E5 push hl
ROM0:01AA F0 B1 ld a,(ff00+B1)
ROM0:01AC A7 and a
ROM0:01AD 28 0B jr z,01BA
ROM0:01AF FA F1 C4 ld a,(C4F1)
ROM0:01B2 A7 and a
ROM0:01B3 28 05 jr z,01BA
ROM0:01B5 F0 EF ld a,(ff00+EF)
ROM0:01B7 A7 and a
ROM0:01B8 20 09 jr nz,01C3
ROM0:01BA F0 E1 ld a,(ff00+E1)
ROM0:01BC FE 03 cp a,03
ROM0:01BE 28 03 jr z,01C3
ROM0:01C0 CD B6 FF call FFB6 ;OAM DMA transfer routine is in HRAM
...

OAM DMA 传输例程:

HRAM:FFB6 3E C0            ld   a,C0
HRAM:FFB8 E0 46 ld (ff00+46),a ;source is wC000
HRAM:FFBA 3E 28 ld a,28 ;loop start
HRAM:FFBC 3D dec a
HRAM:FFBD 20 FD jr nz,FFBC ;wait for the OAM DMA to be completed
HRAM:FFBF C9 ret ;ret to 0:01C3

关于cpu - Gameboy emulation - 需要对 CD 说明进行说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42042581/

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