这是一篇关于在任天堂 DS(Nitro)上用 Rust 语言实现 Advent of Code 2024 的文章,主要内容如下:
- 准备工作:了解任天堂 DS 的基本架构,包括两个处理器(ARM9 和 ARM7)及其分工,还准备了一些参考资料如 GBATEK、Infinite Space 游戏及 ARM v5 架构参考手册,并设置了 ARM 交叉编译器。
- 生成可运行的 ROM:编写示例程序,配置 Cargo 以针对 Nitro 构建,解决编译错误,将生成的 ARM9 代码打包成 ROM 并在 NO$GBA 模拟器中运行,发现代码运行位置错误等问题。
- 编写链接脚本:通过编写链接脚本,告诉编译器和代码将代码加载和运行在 0x02000000 处,安排数据和只读数据部分,设置指向数据紧密耦合内存(DTCM)的栈指针等。
- C 运行时(C Runtime):在项目中添加汇编文件
start.s
来实现 C 运行时的功能,如设置栈指针、设置协处理器 15 进行内存保护、清零 BSS 段等。 - 协处理器 15(Coprocessor 15):详细介绍了协处理器 15 的功能和寄存器用途,借鉴已编译游戏的代码来设置协处理器 15,包括设置内存保护区域、缓存控制等。
- 模拟器设置:选择 melonDS 和 DeSmuME 模拟器进行调试,启用它们的 GDB stub,在链接脚本中取消丢弃调试部分,以便在调试时使用 GDB。
- 实现功能:添加依赖库
spin
、talc
和portable-atomic
来实现多线程和内存管理功能,处理内存映射 I/O 以确保临界区操作的正确性,设置堆分配器并实现 Advent of Code 2024 的 Day 1 Part 1 解决方案,将输出显示在 Nitro 的屏幕上,包括处理中断和垂直同步等。 - 结论:指出当前解决方案存在一些问题,如硬编码谜题输入、需要添加输入功能等,但总体来说项目实施相对容易,后续可扩展为完整的 SDK。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。