Signetics 2650 & 2636 程式設計/物件完成同步

PVI 有四個主物件,可以重新程式設計以在螢幕上顯示。此處顯示的螢幕截圖,由 本教程的程式 建立,僅使用物件 1。主物件是白色矩形,第一個副本是黃色三角形,第二個副本是綠色三角形。每個事件的形狀、顏色、大小和位置必須在每一幀上程式設計。程式設計的時機必須 與 VRST 同步,這在另一個教程中已經介紹過,還必須與物件影片顯示的完成同步。
當 PVI 輸出物件的最後一行時,它會生成一箇中斷並設定暫存器 $1FCA 中的相應位,在本程式中稱為 objectstatus。
| 位元組 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1FCA |
|
| ||||||||||||||||||||||
處理中斷將在後面的章節中討論,由於處理器沒有其他工作要做,因此該程式將在一個迴圈中輪詢該暫存器,等待相應位被設定。這由子程式 WaitObj 完成
:;=================================================================
:;subroutine - wait for object to finish
:; enter with r1=mask for bit to be tested:
:; obj1=$08, obj2=$04, obj3=$02, obj4=$01
:WaitObj:
00B7 0C1FCA : loda,r0 objectstatus
00BA 41 : andz r1
00BB 187A : bctr,eq waitobj
00BD 17 : retc,un
程式以 r1 = $08 呼叫該子程式,該值用作掩碼來測試 objectstatus 暫存器 $1FCA 中的特定位。如果相應的物件完成位沒有被設定,則 andz 指令的結果將為零,因此程式將迴圈回並再次嘗試,直到該位被設定,andz 操作產生非零結果並且子程式退出。
一旦 VRST 變為高電平,就會設定物件 1 的初始狀態。這由子程式 Object1A 完成,該子程式設定其形狀、大小、顏色(一個小白色矩形)及其水平和垂直座標。它還設定第一個副本的水平座標和垂直偏移量。
然後,程式等待主物件顯示完成,此時子程式 Object1B 會設定新的形狀、大小和顏色(黃色三角形)。它還設定第二個副本的垂直偏移量。
最後,程式等待第一個副本顯示完成,此時子程式 Object1C 會設定新的形狀、大小、顏色(綠色三角形)和第二個副本的水平座標。它還將第三個副本的垂直偏移量設定為一個較大的值,以確保它不在螢幕上並且沒有顯示。
然後,程式迴圈回並等待 VRST 訊號的開始。
bsta,un Vsync0 ; make sure VRST hasn't started
endless:
bsta,un Vsync1 ; wait for VRST to start
bsta,un Object1A ; set initial state of object 1
bsta,un Vsync0 ; wait for VRST to end (SEE BELOW)
lodi,r1 $08
bsta,un WaitObj ; wait for primary object 1 to complete
bsta,un Object1B ; set first duplicate of object 1
lodi,r1 $08
bsta,un WaitObj ; wait for first duplicate to complete
bsta,un Object1C ; set second duplicate of object 1:
bctr,un endless
objectstatus 暫存器中的 物件完成 位由 PVI 重置,無論是在讀取暫存器時還是在 VRST 的下降沿時。等待 VRST 結束 的程式碼行是為了確保在開始處理新幀之前這些位被清除。如果將該行修補掉,您將看到黃色物件不再顯示。
發生的情況是,我們沒有測試第二個副本是否在幀結束時完成,因此在下一幀中,主物件會在 VRST 期間被錯誤地檢測為完成。如果在迴圈結束時插入對物件 1 完成的測試,您將看到問題已解決。
但是,在迴圈開始時等待 VRST 的下降沿是一個更簡潔的解決方案
- 在更復雜的程式中,很可能會有多個副本在幀結束時設定狀態位。
- 在迴圈的第一次傳遞中,我們不能確定狀態位的條件。
在本例中,沒有使用資料表來定義三個物件的形狀,而是以演算法方式建立它們。
建立矩形,子程式 Object1A,是將 $FF 寫入形狀陣列的全部十個位元組的簡單情況。
三角形是透過將 FF 寫入底行,然後是 7F、3F 等來建立的。
lodi,r3 10
lodi,r0 $FF
ppsl withcarry ; include carry in rotate instructions
loop1B:
stra,r0 shape1,r3- ; triangle shape
cpsl carrybit
rrr,r0 ; shift right with 0 from the carry bit
brnr,r3 loop1B
這段程式碼片段首先設定程式狀態字中的 withcarry 位。現在,當執行旋轉指令時,它將進位位包含在迴圈中並作為九位旋轉操作。透過在每次旋轉之前清除進位位,它的行為更像一個移位暫存器,將 1 移出並移入 0。

有時,視覺化程式花費多少時間僅僅等待物件的完成非常有用。這可以透過在子程式 WaitObj 執行時更改螢幕顏色來輕鬆實現
WaitObj: lodi,r0 $19 ; blue stra,r0 backgnd wo2 loda,r0 ocomplete andz r1 bctr,eq wo2 lodi,r0 $00 ; black stra,r0 backgnd retc,un
在本文的螢幕截圖中,通常為黑色的螢幕在 WaitObj 期間變為藍色。在本例中,我們通常有大量時間可以浪費,但也有一些動畫使一些藍色線條几乎消失。仍然有很多程式設計要做,這展示了在幀的哪些地方有時間進行程式設計。