跳轉到內容

Signetics 2650 & 2636 程式設計/同步到 VRST

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

到目前為止,我們的程式在很大程度上是靜態的——PVI 只被設定過一次,然後就被忽略了。在本教程中,您將學習如何同步到垂直復位訊號,並改變螢幕上的內容,以實現每一幀的變化。

什麼是 VRST?

[編輯 | 編輯原始碼]
另請參閱:控制檯硬體 和 模擬電視

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

  • 更改每幀座標變化的量。


華夏公益教科書