Zolatron 自製微型電腦:VIA 架構用戶端連接埠與印表機介面設計解析

Published on: | Last updated:

今天要來聊聊...嗯,怎麼讓自己做的電腦跟外面世界溝通。

一台電腦,如果只能自己跟自己玩,那老實說,它就是個會發熱的盒子。它的價值在於跟外部的東西互動,不管是感測器、開關,還是一些奇奇怪怪的周邊。而 6522 這顆晶片,全名叫 Versatile Interface Adapter (VIA),就是個好東西,它很多才多藝,很適合拿來做這件事。

我之前已經在 Zolatron 這台自製電腦上用過它了,那時候是為了驅動一個小小的 LCD 螢幕,但那還是在麵包板上亂插的階段。等到要把它們做成正式的 PCB 板,可以插到 Zolatron 的背板上時,我就覺得...嗯,不該只為了一件事設計一張卡。我想保留 6522 的那種「多功能性」。

所以這篇會一次講兩塊板子,因為它們骨子裡幾乎是同個東西,一塊算是另一塊的特化版。

先來看看最酷的應用:搞定一台老印表機

我想,對很多人來說,最有感的應用,大概就是接上一台並列埠 (parallel port) 印表機吧。我手邊還有一台 1983 年買的 Epson MX-80 F/T III 點陣式印表機,到現在還能動,蠻神奇的。讓 Zolatron 可以控制這台印表機,感覺...很有那個年代的味道。

要跟這種老印表機溝通,你需要一些訊號線:

  • 首先是八條資料線,剛好用掉 VIA 上的一個 Port,我就選了 Port A。
  • 然後還需要一堆控制跟狀態的訊號線。全部接滿的話,Port B 的八隻腳其實不太夠。不過好消息是,不是每一條都非接不可。

我自己是挑了幾個關鍵的來接:像是 `/STROBE` (告訴印表機有資料來了)、`/ACK` (印表機回報說收到了)、`BUSY` (印表機正在忙),還有 `/INIT` (叫印表機重置一下)。老實說,有這幾條就差不多能用了,其他的算是...嗯,讓生活品質好一點的選項。加一加,剛好八個訊號,塞滿 Port B 剛剛好。

讓老舊的點陣印表機重獲新生
讓老舊的點陣印表機重獲新生

說到這個,要在台灣找一台還能動的 Epson MX-80 可能有點挑戰,大概要去一些二手市集或特定的論壇挖寶。這點跟國外不太一樣,他們有時候在車庫拍賣 (garage sale) 就會看到這種老古董。不過零件倒還好,像 6522 這種晶片,以前要去光華商場樓下找,現在直接上網訂,像 Digi-Key 或 Mouser 這種全球性的網站,其實蠻方便的。

還有個細節,我沒有直接把 6522 的腳位拉到印表機接頭上。我想了想,中間加個緩衝 (buffer) 好像比較保險。我用了兩顆 74LV541 八進八出的驅動晶片。它的作用很單純,就是把訊號「放大」一點,也順便整理一下波形,算是一種保護措施,免得哪天不小心把貴桑桑的 VIA 晶片燒了。

最後...嘿,當然少不了「燈號」(blinkenlights)。我在板子上加了四顆 LED,分別對應到錯誤、連線、自動換行跟忙碌狀態。看著那些燈在閃,才真的有「東西在動」的感覺,蠻酷的。

這塊板子是怎麼想的?通用 I/O 的設計

OK,剛剛說的印表機板,其實是從一張更通用的 I/O 板改來的。這張通用板的目標很簡單:把 6522 晶片上的 Port A 和 Port B 的所有腳位,全部拉出來,做成方便連接的排針 (pin headers)。這樣不管以後我想接什麼,感測器也好、LED 也罷,都有一塊現成的板子可以用。

但這裡有個核心問題:當 Zolatron 的背板上插了那麼多張卡,CPU 怎麼知道它現在到底在跟誰說話?

位址解碼的運作概念
位址解碼的運作概念

這就要靠「位址解碼」(Address Decoding)。簡單講,就是每張卡都要有一個獨一無二的「門牌號碼」。我用的方法是拿一顆 74HC138 晶片,它是一個「3 到 8 線解碼器」。我把 CPU 位址匯流排 (address bus) 的高位元 A13、A14、A15 這幾條線接給它,它就會根據這幾條線的訊號,決定要啟用它的八個輸出中的哪一個(把它拉到低電位)。

然後,我把這八個輸出接到一排跳線針腳 (jumper) 上。每張卡上都有這麼一組。我只要用一個小小的跳線帽,插在我想指定的位址上,那張卡就有了自己的門牌號碼。例如,我把跳線插在 `/Y0` 的位置,那張卡的位址就是 `$A000` 開頭。這種做法比直接焊死在板子上,或是像 Apple II 那樣每個插槽位址都固定,要靈活多了。

核心中的核心:把 VIA 晶片接上系統

位址搞定了,再來就是把 6522 VIA 晶片本身接上 Zolatron 的系統匯流排。

大部分的接線都很直觀。八條資料線接資料匯流排、`/RES` 接重置線、`PHI2` 接時脈...等等。比較特別的是 `/IRQ` 這支腳,也就是中斷請求。我是透過一個蕭特基二極體 (Schottky diode) 才接到系統的 `/IRQ` 線上。這樣做可以讓 VIA 把 `/IRQ` 線拉低來發出請求,但又不會主動把它拉高,效果類似於「開漏極」(open drain) 輸出。算是一個小技巧。

再來是晶片致能 (`Chip Enable`) 的部分。6522 有兩支致能腳,`CS1` (高電位致能) 和 `/CS2` (低電位致能),要兩個同時有效,晶片才會理你。我把 `/CS2` 接到剛剛說的 74HC138 的輸出,所以只要 CPU 發出的位址對了,這裡就會被致能。

至於 `CS1`...老實說,我當時把它接到了位址線 `A13` 上。因為在我的 I/O 位址空間裡,`A13` 永遠是高的,所以這樣做也能動。不過呢,我自己是覺得,如果我要再做一版,我可能會直接用一顆電阻把它接上 +5V (pull-up)。這樣更單純,有時候簡單就是最好的設計。

實際打造出來的通用 I/O 板
實際打造出來的通用 I/O 板

寫程式怎麼控制?暫存器定址這回事

硬體都接好了,那在寫程式的時候要怎麼用它?關鍵在於讀寫 6522 晶片內部的「暫存器」(Register)。

6522 有 16 個內部暫存器,由四支腳 `RS0` 到 `RS3` 來選擇。所以我就把 CPU 位址匯流排最低的四條線 `A0` 到 `A3`,直接接到這四支腳上。

這樣一來,事情就變得很直觀。假設我的卡片位址設在 `$A000`。

  • 當我寫程式去存取 `$A000` 這個位址時,因為 `A0` 到 `A3` 都是 0,所以選中的是第 0 號暫存器。
  • 當我存取 `$A001` 時,`A0` 是 1,選中的就是第 1 號暫存器。
  • 存取 `$A002` 就是第 2 號、`$A003` 就是第 3 號...以此類推,一直到 `$A00F` (二進位的 1111),就是第 15 號暫存器。

所以,用 6502 組合語言來寫,就會像這樣:

LDA #$FF      ; 準備要寫入的值 (例如把 Port B 全部設為輸出)
STA $A002     ; 把它存到 $A000 這張卡的第 2 號暫存器 (DDRB)

讀取暫存器就更簡單了:

LDA $A000     ; 讀取 $A000 這張卡的第 0 號暫存器 (Port B 的值)

對,你可能會發現,我的位址解碼給了這張卡 1024 個位址空間 (從 `$A000` 到 `$A3FF`),但我實際上只用到了前面的 16 個。這看起來很浪費,但在這種自製電腦的設計裡...嗯,還蠻常見的。這樣做可以簡化很多解碼邏輯,讓事情不容易出錯。

通用板 vs. 印表機板,到底差在哪?

說了這麼多,這兩張板子其實就是兄弟。我整理了一下它們的異同:

比較項目 通用 I/O 板 並列印表機板
核心晶片 就一顆 65C22S VIA,很單純。 一樣是 65C22S,沒變。
主要用途 不知道要幹嘛,所以什麼都能幹。把腳位拉出來就對了。 目標明確,就是要跟老印表機溝通。
額外晶片 除了位址解碼的 74HC138,沒別的了。 多了兩顆 74LV541 當訊號緩衝,還有一顆 74LV14 用來反相訊號給 LED。
連接頭 用一般的排針,方便插杜邦線。 除了排針,還焊了一個 D-Sub 25 接頭,專門給印表機線用。
特殊設計 沒有,就是基本款,求一個「穩」字。 有緩衝、有上拉電阻、還有那幾顆看了就開心的閃爍 LED 燈。

一些你可能會踩到的坑(或是我差點踩到的)

在做這個的時候,有幾個地方我覺得可以提出來分享一下。

第一個就是剛剛提到的「位址浪費」。千萬不要想說「哦,`$A010` 到 `$A3FF` 都沒用到,我拿來接別的東西好了」。這是一個陷阱。因為雖然我們只看 `A0-A3` 來選暫存器,但更高的位址線(像 `A4`、`A5`)的變化,還是會影響到 `A0-A3` 的組合,這會讓你的定址變得一團亂,自找麻煩。

第二個,就是我前面反省過的 `CS1` 接法。把它接到 `A13` 能動,但沒什麼道理。直接用電阻上拉到 +5V,邏輯上更乾淨。設計這種東西,有時候「能動」跟「好設計」是兩回事。

最後是緩衝。印表機板我加了緩衝晶片,但通用 I/O 板就沒有。這是一種取捨。如果你確定你接的東西很單純,耗電量小,那直連通常沒問題。但如果要接到另一個獨立的設備,特別是線拉很長,或是對方是什麼來路不明的東西,加個緩存晶片就像買保險,總是比較安心。

總之,就是這樣。用一個核心的 6522 設計,變出兩張實用的擴充卡。這顆晶片真的...嗯,很靈活。我腦子裡已經有下一個想用它來做的東西了,不過那就是另一個故事了。


換你動動腦:

如果你也有一塊 6522,你第一個會想拿它來接什麼東西?是閃爍的 LED 燈條、溫濕度感測器、還是一樣想找台老印表機來挑戰?在下面留言分享你的點子吧!

Related to this topic:

Comments

  1. Guest 2025-10-17 Reply
    我兒子最近很愛搞自組電腦,那天還突然問我6522 VIA怎麼接資料匯流排,我想了半天才想起一點點印象。說真的,家裡這些材料本來就不多,像什麼I/O板、解碼器這些小零件,有時候要買還真麻煩。好像如果能有附近的爸媽一起湊個社群,互通有無會輕鬆很多。LED指示燈要讓它一閃一閃,光靠自己摸索其實挺累,有時真的覺得,這種東西還是一起折騰才比較好玩吧。
撥打專線 LINE免費通話