跳转到内容

Signetics 2650 & 2636 编程/索引分支

0% developed
来自维基教科书,开放世界中的开放书籍

BSXA 和 BXA

[编辑 | 编辑源代码]

这两个指令允许索引分支。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:有限状态机
  • 为什么开发人员从不使用状态机 状态机的陷阱(注意:它们更正式地被称为有限状态机)以及何时不使用它们。

添加一个第三个状态机,它控制一个蓝色矩形沿着类似于大于符号的路径来回移动,>

华夏公益教科书