Signetics 2650 & 2636 程式設計/同步到 VRST
到目前為止,我們的程式在很大程度上是靜態的——PVI 只被設定過一次,然後就被忽略了。在本教程中,您將學習如何同步到垂直復位訊號,並改變螢幕上的內容,以實現每一幀的變化。
VRST 是由同步發生器晶片生成的訊號。它在影片訊號的每 20 毫秒幀中持續約 2.7 毫秒,在這段時間內,CRT 的電子束被關閉,並且正在移動回指向螢幕頂部的點。
此訊號連線到微處理器的 Sense 輸入,其狀態由 PSU 暫存器的第 7 位指示。VRST 的上升沿也設定了 PVI 中暫存器 $1FCB 的第 6 位 (VRLE),儘管這不是一個方便的檢查位置。
VRST 具有兩點意義。首先,它為我們的程式提供了每 20 毫秒一個規律的時鐘滴答,我們可以利用它來確定螢幕上物體移動的速度。其次,PVI 要求我們在 VRST 的下降沿之前設定所有主要物件的垂直座標。與後者相關的是,我們還需要在掃描期間開始處理其他與更改 PVI 暫存器相關的即時事件,這將在下一章中討論。
本教程的程式碼可以在 教程程式碼 - 同步到 VRST 中找到。
這兩個子例程負責檢測 VRST 訊號的狀態
:;=================================================================
:; subroutine - wait for VRST to clear
:Vsync0:
0058 B480 : tpsu sense
005A 187C : bctr,eq Vsync0 ; wait for Sense bit to clear
005C 17 : retc,un
:;=================================================================
:; subroutine - wait for VRST to set
:Vsync1:
005D B480 : tpsu sense ; wait for Sense bit to be set
005F 1A7C : bctr,lt Vsync1
0061 17 : retc,un
:;=================================================================
指令 TPSU 測試程式狀態字高位元組中的各個位。常量 sense 透過語句 sense equ $80 被等效於值 $80,所以我們正在測試 PSU 的第 7 位,即處理器的 sense 輸入,它反過來由 VRST 訊號提供。
在子例程 Vsync0 中,程式在 sense 為高時一直迴圈,或者換句話說,它一直等待 sense 為低。反之,子例程 Vsync1 在 sense 為低時一直迴圈,或者換句話說,它一直等待 sense 為高。
這是程式的主迴圈
:endless: 002D 3F0058 : bsta,un Vsync0 ; make sure VRST hasn't started 0030 3F005D : bsta,un Vsync1 ; wait for VRST to start 0033 0C1F0C : loda,r0 vc1 ; increment vertical position of object 1 0036 8401 : addi,r0 1 0038 CC1F0C : stra,r0 vc1 003B 0C1F0A : loda,r0 hc1 ; decrement horizontal position of object 1 003E A401 : subi,r0 1 0040 CC1F0A : stra,r0 hc1 0043 1B68 : bctr,un endless
兩個子例程 Vsync0 和 Vsync1 協同工作,實際上是在等待 VRST 訊號從低到高的過渡。當這種情況發生時,物件 1 的垂直座標加 1,其水平座標減 1。因此,該物件以每 20 毫秒幀一個畫素的速度斜向移動,因此每掃描大約需要 5 秒。
不要忘記,垂直座標必須在 VRST 週期結束之前設定好。這是因為在那個時候,暫存器中的值被傳輸到一個計數器,該計數器在每條水平線上的值都會遞減,直到它達到零,然後顯示物件的第 1 行。所以,在 VRST 開始後儘快設定垂直座標是一個好主意。WinArcadia 偵錯程式允許我們看到這是在哪裡發生的
- 開啟 blanking 顯示:選項 > VDU > Blanking 區域?
- 在 0033 處設定斷點:bp $0033
- 開啟導向光線:gr
- 逐步執行程式:s
您應該看到,在垂直 blanking 週期的前幾條水平線期間,這兩個座標都被設定了。X 和 Y 座標也顯示在 WInArcadia 輸出視窗中。
重要的是,這每幀只執行一次,這就是我們同步到 VRST 的過渡的原因。如果沒有第一個子例程呼叫,Vsync0,顯示會變得不穩定。嘗試將它修補掉,或者透過在該行的開頭重新組裝程式碼時新增一個註釋, ;bsta,un Vsync0 ,或者透過使用 WinArcadia 記憶體編輯器將程式碼替換為 NOP,002D C0 C0 C0。
- 更改每幀座標變化的量。