Signetics 2650 & 2636 编程/索引分支
外观
这两个指令允许索引分支。BXA 是一个无条件的索引分支,而 BSXA 是一个无条件的索引分支到子程序。寄存器 3 必须指定为索引寄存器。
下面的示例使用 BSXA 指令执行由 R3 中的值选择的四个子程序之一。使用 WinArcadia 调试器逐步执行此操作是了解其工作原理的好方法。
mybyte equ $1F0E ; define a variable lodi,r0 $20 ; initialise program status word, just to be sure! lpsu ; inhibit interrupts, stack pointer=0 lpsl ; register bank 0, without carry, arithmetic compare stra,r0 mybyte loop: lodi,r3 0 ;go and subtract 1 bsxa mysubs,r3 lodi,r3 9 ;go and multiply by 4 bsxa mysubs,r3 lodi,r3 6 ;go and add 16 bsxa mysubs,r3 lodi,r3 3 ;go and divide by 2 bsxa mysubs,r3 bctr,un loop mysubs: x0: bcta,un subtract1 x3: bcta,un divide2 x6: bcta,un add16 x9: bcta,un multiply4 subtract1: loda,r0 mybyte subi,r0 1 stra,r0 mybyte retc,un divide2: loda,r0 mybyte rrr,r0 stra,r0 mybyte retc,un add16: loda,r0 mybyte addi,r0 16 stra,r0 mybyte retc,un multiply4: loda,r0 mybyte rrl,r0 rrl,r0 stra,r0 mybyte retc,un
一些需要注意的要点
- 索引寄存器必须是 R3
- 索引值以三步递增,因为 bcta 指令是三个字节长。
- 如果子程序彼此足够接近,则可以使用 bctr 指令,索引将以两步递增。
- 在某些情况下,分支指令表 mysubs 可以完全省略,但索引值将相当杂乱,并且可能难以维护。
索引分支通常用于在高级语言中使用 "case 语句" 的地方。BSXA 的一个应用是创建状态机来控制程序的部分。它可能是全局性的,例如控制程序的哪个部分正在运行:启动画面、吸引模式、选择关卡画面、游戏玩法或游戏结束画面。它也可以用来控制程序中某些元素的状态。
本教程的代码可以在 '状态机' 中找到。在这个程序中,代码绘制了两个物体,其中一个沿着矩形路径移动,另一个沿着三角形路径移动。这可以通过测试物体的方位并确定在每一帧中应该如何移动它来完成,但这很快就会变得混乱。在状态机模型中,沿着矩形路径移动的物体处于四种状态之一:向右移动、向下移动、向左移动或向上移动。每种状态在每次移动后都会进行检查,以查看它是否已到达终点,此时它会将机器的状态更改为下一个操作。一个变量用于跟踪状态,它充当指向适当子程序的索引。在这个代码中,第二个状态机异步控制沿着三角形路径移动的物体。
- Nystrom, Robert (2014). "状态". 游戏编程模式. Genever Benning. ISBN 0990582906. 检索于 2022 年 1 月 6 日.
{{cite book}}
: 未知参数|month=
被忽略 (帮助) 游戏编程中的状态机,包含高级语言示例。 - 有限状态机:理论与实现
- 人工智能 1:有限状态机
- 为什么开发人员从不使用状态机 状态机的陷阱(注意:它们更正式地被称为有限状态机)以及何时不使用它们。
添加一个第三个状态机,它控制一个蓝色矩形沿着类似于大于符号的路径来回移动,>