超级任天堂编程/指针
外观
< 超级任天堂编程
- The WLA-65816 宏汇编器
- 一款 SNES 模拟器
- 一个初始化例程和一个头文件。
指针是游戏或 ROM 的重要组成部分。在超级任天堂中,这些指针通常由以特定顺序组织的各种地址组成。例如,指针表可能包括游戏关卡在 ROM 中的位置列表,或指向代码特定部分的指针。指针可能与文件名相关;例如,C:\WINDOWS\explorer.exe 指向 WINDOWS 文件夹中的 explorer.exe 文件。
假设你有一个包含三个关卡的游戏。你已经将它们插入了你的 ROM 中,但你需要你的游戏能够读取这些关卡。这可以通过在表中使用指向三个关卡的指针来解决,有点像这样
.dl Level_1
.dl Level_2
.dl Level_3
该表现在将包含 ROM 中关卡 1、关卡 2 和关卡 3 的地址。游戏随后可以从该表中读取,并知道在哪里查找这些关卡文件。
.dl、.dw 和 .db 是 WLA-65816 的三个汇编指令。这意味着它们告诉汇编器执行某些操作,在本例中,它们告诉汇编器创建一个字节、两个字节或三个字节,这些字节共同组成一个地址。.db 创建一个单字节数字,.dw 创建一个双字节数字,.dl 创建一个三字节数字。请注意,尽管在本教程中它们用于指针,但这三个命令也可以用于保存绝对值。
在 65816 ASM 中,访问表相对容易。如果你已经熟悉 65c816 中的 A 和 X,那么下一部分对你来说应该不成问题。
; This code will read from a table of 3-byte entries. Load X with the entry you wish to read, and
; the code will read that entry for you.
LDA Table,X ; This is the important part. Table here refers to a label, and ",X" means "Plus the value of X". So,
; A is loaded with the value at (The position of Table) + the value of X.
JMP ETable ; Jump past the table, otherwise the CPU will attempt to execute it as code, and easily crash.
Table: ; This allows the LDA above to find this table.
.dw Pointer_1
.dw Pointer_2
.dw Pointer_3
ETable: ; End of the table. This label is jumped to by JMP, making sure the 65c816 doesn't try to execute
; the data as code.
此代码将获取 X,然后从 (Table + X) 读取以获取一个值,然后将其存储到累加器 (A)。请注意,需要将 X 加倍才能读取正确的条目。如果 X 为 1,则将从第一个条目的第二个字节和第二个条目的第一个字节读取,这与代码的预期操作不符。