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:有限狀態機
- 為什麼開發人員從不使用狀態機 狀態機的陷阱(注意:它們更正式地被稱為有限狀態機)以及何時不使用它們。
新增一個第三個狀態機,它控制一個藍色矩形沿著類似於大於符號的路徑來回移動,>