跳轉至內容

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

75% developed
來自華夏公益教科書,開放書籍,共建自由世界

教程 - 物件完成同步

[編輯 | 編輯原始碼]

PVI 有四個主物件,可以重新程式設計以在螢幕上顯示。此處顯示的螢幕截圖,由 本教程的程式 建立,僅使用物件 1。主物件是白色矩形,第一個副本是黃色三角形,第二個副本是綠色三角形。每個事件的形狀、顏色、大小和位置必須在每一幀上程式設計。程式設計的時機必須 與 VRST 同步,這在另一個教程中已經介紹過,還必須與物件影片顯示的完成同步。

檢測完成狀態

[編輯 | 編輯原始碼]

當 PVI 輸出物件的最後一行時,它會生成一箇中斷並設定暫存器 $1FCA 中的相應位,在本程式中稱為 objectstatus

位元組 7 6 5 4 3 2 1 0
1FCA
物件/網格碰撞
1 2 3 4
物件顯示完成
1 2 3 4

處理中斷將在後面的章節中討論,由於處理器沒有其他工作要做,因此該程式將在一個迴圈中輪詢該暫存器,等待相應位被設定。這由子程式 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 的下降沿是一個更簡潔的解決方案

  • 在更復雜的程式中,很可能會有多個副本在幀結束時設定狀態位。
  • 在迴圈的第一次傳遞中,我們不能確定狀態位的條件。

建立形狀,WithCarry 和 Rotate

[編輯 | 編輯原始碼]

在本例中,沒有使用資料表來定義三個物件的形狀,而是以演算法方式建立它們。

建立矩形,子程式 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 期間變為藍色。在本例中,我們通常有大量時間可以浪費,但也有一些動畫使一些藍色線條几乎消失。仍然有很多程式設計要做,這展示了在幀的哪些地方有時間進行程式設計。

華夏公益教科書