gpt4 book ai didi

c - 带有系统寄存器和中断的 GameBoy 编译器

转载 作者:太空狗 更新时间:2023-10-29 15:19:33 24 4
gpt4 key购买 nike

我花了很多时间学习 GameBoy 编程,因为我已经熟悉 Z80 Assembly,所以我并不害怕直接使用它。我(当然)会发现用 C 或 C++ 编程效率更高,但是找不到适用于 GameBoy 的完整编译器,我能找到的编译器自行管理所有内容,并且不向程序员提供对系统寄存器的访问权限,并且还有一些可怕的缺点,例如 100% 的 CPU 使用率和不支持中断。
是否可以像 Arduino 的 AVR 编译器一样处理系统寄存器?能够简单地使用其名称来寻址 CPU 或系统寄存器,例如 DDRD = %10101011
我需要做什么才能将中断和系统寄存器添加到编译器中?除了一个系统寄存器之外的所有寄存器都只是一个字节的内存地址,中断 vector 当然是内存位置,唯一一个不是内存地址的系统寄存器只能用两条汇编指令修改 EIDI 但这可能是内联函数,对吗?

最佳答案

通常的策略是创建您自己的系统寄存器指针。我不知道 DDRD 的地址,但像这样的东西应该可以解决问题:

volatile unsigned char *reg_DDRD = (unsigned char *)0xE000;
*reg_DDRD = 0xAB;

大多数 C 编译器不支持二进制常量,但您可以将它们与一些宏 hackery 一起使用。您还可以使用宏来制作更直观的语法:

#define DDRD (*reg_DDRD)
DDRD = 0xAB;

当原始 C 代码也能正常工作时,修改编译器是没有意义的。

处理中断归结为解决 3 个问题。第一种是让中断 vector 地址跳转到 C 函数。由于它在 ROM 中,因此您需要修改 C 运行时环境以对其进行初始化。这非常依赖于系统,但通常您想要做的是添加一个如下所示的汇编语言文件:

     org 38h   ; or wherever the gameboy CPU jumps to on interrupt
jp _intr_function

这应该会导致 CPU 转到 C 程序中的 intr_function()。您可能需要也可能不需要前导下划线。并且您可能无法使用 org 在汇编程序文件中设置目标地址,而是不得不使用链接器和部分。

第二个问题是 C 函数不一定会保存它应该保存的所有寄存器。您可以通过向其添加内联汇编来实现此目的,方法如下:

void intr_function()
{
asm(" push af");
asm(" push bc");
asm(" push de");
asm(" push hl");

// ... now do what you like here.

asm(" pop hl");
asm(" pop de");
asm(" pop bc");
asm(" pop af");
}

最后,可能必须通过操作硬件寄存器来确认中断。但是您可以在 C 代码中执行此操作,因此没有什么特别之处。

我不清楚等待循环的问题。标准 C 编译器没有内置这样的功能。它们调用 main() 并且是否要循环取决于您。确实,Arduino SDK 中使用的类 C 语言有其自己的内置无限循环,可以调用您编写的函数,但这不是普通的 C。

关于c - 带有系统寄存器和中断的 GameBoy 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28035655/

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