跳转到内容

超级任天堂编程/指针

来自维基教科书,开放的世界,开放的书籍

所需工具

[编辑 | 编辑源代码]

指针是游戏或 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,则将从第一个条目的第二个字节和第二个条目的第一个字节读取,这与代码的预期操作不符。

华夏公益教科书