打造復古電腦的互動體驗(下)– 繞了一大圈終究回到原點

在腦袋幻想了好幾個方案,試驗 NeXTSTEP 與 DOS 模擬器都無法有效率地在時間達成後,決定換下一個方案––原生 Linux 終端機。原以為這個方案夠簡單了,還是有非常多的小細節卡住。這個方案規劃非常簡單:Linux 的登入畫面(Login 畫面),輸入帳號、密碼,成功了就進去到一個純文字的介面,可以稍為操作一下,就可以了。其實,這就是一開始的方案,只是中間太浪漫地去想著那些漂亮的 NeXTSTEP。
中文顯示
如果現在安裝 Linux,很多情況是裝在遠端的伺服器上,我們用連線的方式進入,如果要顯示中文,大多都是用 UTF-8 編碼,且連線的程式(terminal.app、putty 等)可以顯示得出來,輸入的話也是用連線的該台電腦作業系統輸入。如果我們不使用連線的方式,是接了螢幕鍵盤,把它當個人電腦使用的話,通常裝的 Linux 都會有視窗系統(X Windows),視窗系統現在本身的多國語系等支援都很充足。但如果沒有裝的話,大部份情況,可能也只是連進去打打指令操作,不太會在原生終端的模式顯示或輸入中文。
但我們想要製作的復古體驗,不會有視窗系統,卻要可以顯示中文,在當年確實是這樣使用的。想到這邊,我當時搜尋一下關鍵字:jmcce、yact、chdrv...,當年的回憶都回來了。
可惜去年製作時間緊湊,沒能把詳細的過程記錄下來,這已經是距離現在一年前的事情,僅能從我遺留下來的檔案、工作 VM、記憶與片斷的筆記慢慢還原。
當時,我快速地在腦中推想,要不要裝當年的作業系統版本,如 Slackware 或 Redhat 7.2 之類的東西,還是裝現代的版本,但喬裝成過去的樣子。我主要考量到過去版本的作業系統,可能在現今的硬體上不好裝,而千辛萬苦裝起來後,軟體應該也會碰到很多問題,例如中文編碼 Big5 與 UTF-8 的問題,python 版本太舊可能會有很多潛在安全性上的問題。因此,直接決定裝 Ubuntu 22.04 Server 版(沒有 Desktop),除非遇到其他因素,才考慮裝舊版的東西,看看能不能把這些東西裝起來。
chdrv / yact
搜尋了這些關鍵字後,我彷彿進入了一個漩渦無法自拔。我找到了 chdrv 與 yact 的原始碼,嘗試編譯它們,但 chdrv 裡面竟然有 assembly code!而 yact 似乎需要 32bit kernel,評估後覺得太花時間,我也沒輒,直接放棄。

jmcce 與 svgalib
接著,我找到了《[懷舊] jmcce 1.5 (0) - 從死亡到重生》這篇文章,從大大的 GitHub 直接 clone 上來,但我在 svgalib 上整個大卡住,怎樣都裝不起來。也許我當時太心急,看著他寫的指令發現這個套件早就被移除無法安裝了,就整個偏向處理 svgalib,沒有發現大大似乎有一個 branch 有 framebuffer 的版本。當時為了想辦法安裝 svgalib,我找了最後一版有 svgalib 的 Debian(3.1 r8,2005 出的,因為 Linux kernel 2.6 開始就不會支援 svgalib 了),但這連裝都裝不起來,所以我就放棄這條路了。

fbterm
最後展覽現場使用的是 fbterm。在我測試上述 jmcce、yact、chdrv 的時候,我同時也測了 fbterm。fbterm 很好裝,一下子就跑起來了,但問題是他的終端機畫面就是不對,所以我一直認為 fbterm 的方向是不對的。

然而在 jmcce、yact、chdrv 等方式都撞牆後,我又回來看 fbterm 是不是可能哪裡設錯,或有沒有其他可能的方式,才發現,其實是字型的問題。字型搞定,一切就看起來很「authentic」了!
中文的字型比較沒問題,反倒是英文的字型,到底要如何才能顯示出 8bit 風格的字型?fbterm 預設是用 Deja Vu Sans,太美了,沒全沒有那個年代終端機的感覺。我找到了很酷的 The Ultimate Oldschool PC Font Pack,但當時已經半著魔的我,上網找了其他資訊,把原生 Linux 終端機用的點陣字型(psf 格式)轉成 fbterm 可以吃的 bdf,再設定一下 fontconfig,就大功告成了。
$ cp /usr/share/consolefonts/Lat15-VGA8.psf.gz ./
$ gunzip Lat15-VGA16.psf.gz
$ ./psf2bdf.pl Lat15-VGA16.psf > VGA16.bdf
$ sudo cp VGA8.bdf /usr/local/share/fonts
把內建的 Lat15-VGA8.psf 轉成 VGA16.bdf
$ sudo dpkg-reconfigure fontconfig-config
我其實忘了為什麼要這個步驟,已經不可考了
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<!-- Fallback fonts preference order -->
<alias>
<family>sans-serif</family>
<prefer>
<family>VGA16</family>
<family>AR PL UMing TW</family>
</prefer>
</alias>
<alias>
<family>serif</family>
<prefer>
<family>VGA16</family>
<family>AR PL UMing TW</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>VGA16</family>
<family>AR PL UMing TW</family>
</prefer>
</alias>
</fontconfig>
建立 /etc/fonts/local.conf,這邊設定 fontconfig 主要是讓 fbterm 預設吃 VGA16,找不到字的才吃中文字型,跟 CSS 的 font-family 蠻像的
原生字型
其實現在 Ubuntu Server 版灌好之後,終端機的字型就不是以前看到 CRT 螢幕時的那一種,所以要用下列指令修正一下

$ sudo dpkg-reconfigure console-setup
console-config 的重點在於,選擇 VGA font,再選擇 8x16 這個大小。裡面選項很多,可以玩玩看,終端的畫面會長得不太一樣

但上面的設定還是不太對?為什麼呢?它的解晰度太高了,以往的終端機只能顯示 80x24(一行 80 個英數字行,共 24 行),上面顯示的範圍明顯地超過了。因此我們要更動一些地方,讓它可以開機後,終端機一直維持在同樣的大小。
首先要到 /etc/grub.d/00_header
找到下面這一行並修改
if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=800x600
原本是 GRUB_GFXMODE=auto,改更成 800x600
另外找到 /etc/default/grub
在 GRUB_CMDLINE_LINUX_DEFAULT
與 GRUB_CMDLINE_LINUX
加上 nomodeset
GRUB_CMDLINE_LINUX_DEFAULT="nomodeset"
GRUB_CMDLINE_LINUX="nomodeset"
/etc/default/grub 的設定要加上 nomodeset
最後,update grub
$ sudo update-grub
重新開機後,Ta-da!就有完美的 80x24 的 8bit 字了!

上面是在 VM 裡面跑的,我現在的螢幕是 16:9 的,放在 4:3 的 CRT 看起來會順眼得多。
TUI
最後,就是帳號密碼輸入過後的簡易程式介面了。我熟悉 python,所以自然地想找 python 相關的套件。PyTermGUI 和 Textual 很快就會浮上檯面,看似會是不錯的選擇,我試了 PyTermGUI,但當時的版本有 bug,隨便玩他們的 sample code 就會跳 exception 跑出來,但最大的問題是它無法按 tab 來控制切換 input 控制,只能用滑鼠,不合我們的需求。後來也試了 picotui,但忘了是什麼原因,最後上陣的是 Urwid。
最終成果
如上方影片所示,因為 Ubuntu 的終端機開機後會有一點點小問題,最後我改用 Debian,但也因為這樣,grub 的設定跟 Ubuntu 的不太一樣。我個人非常喜歡這個體驗,從 CRT 映像管發出的高頻聲音、機械鍵盤的敲擊聲,到畫面上的復古原素,都很有感。

然而,也許是太「工程師的浪漫」,想要還原太多東西,讓它感覺很真實(authentic),花費太大的能量在達成這些,如果把一部份的精力移到其他部份,或許可以讓更多的人對於這座體驗更有感。不過,這座復古電腦所有實驗與最後的程式,總共只花了約 30 小時,時程非常壓縮當然也是個問題;但話說回來,究竟為什麼要能顯示中文?因為這是一個參加者年齡層很廣的活動,且以台灣人為大宗,因此,電腦要能顯示中文是當時認為的一個必要條件。
就在復古電腦展出半年過後,VolumeDAO 的 2023 台北生成現場列島雜湊出現了另一個 CRT 終端機、機械鍵盤輸入指令產生美美的生成式視覺,FOLIO,採取了完全不一樣的作法,但體驗感受極佳。不禁讓我思考,就在一切回到原點時,體驗者最終還是會忠於自身的體驗,而工程師的浪漫就只留在自身製作的旅程中了。