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

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

在腦袋幻想了好幾個方案,試驗 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 了),但這連裝都裝不起來,所以我就放棄這條路了。

去年太急,現在看來照理說是改一下 VirtualBox 就可以搞定把 Debian 3.1r8 裝起來,不過,我今天快速地試了一下,似乎也不是那麼容易搞得定

fbterm

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

英文字太漂亮,中文字好薄都快要看不到了,但可能是 16:9 的螢幕讓它看起來不太對

然而在 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/grubGRUB_CMDLINE_LINUX_DEFAULTGRUB_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 相關的套件。PyTermGUITextual 很快就會浮上檯面,看似會是不錯的選擇,我試了 PyTermGUI,但當時的版本有 bug,隨便玩他們的 sample code 就會跳 exception 跑出來,但最大的問題是它無法按 tab 來控制切換 input 控制,只能用滑鼠,不合我們的需求。後來也試了 picotui,但忘了是什麼原因,最後上陣的是 Urwid

最終成果

如上方影片所示,因為 Ubuntu 的終端機開機後會有一點點小問題,最後我改用 Debian,但也因為這樣,grub 的設定跟 Ubuntu 的不太一樣。我個人非常喜歡這個體驗,從 CRT 映像管發出的高頻聲音、機械鍵盤的敲擊聲,到畫面上的復古原素,都很有感。

好可惜現場太忙碌,沒有在現場的環境錄到操作的影片

然而,也許是太「工程師的浪漫」,想要還原太多東西,讓它感覺很真實(authentic),花費太大的能量在達成這些,如果把一部份的精力移到其他部份,或許可以讓更多的人對於這座體驗更有感。不過,這座復古電腦所有實驗與最後的程式,總共只花了約 30 小時,時程非常壓縮當然也是個問題;但話說回來,究竟為什麼要能顯示中文?因為這是一個參加者年齡層很廣的活動,且以台灣人為大宗,因此,電腦要能顯示中文是當時認為的一個必要條件。

就在復古電腦展出半年過後,VolumeDAO 的 2023 台北生成現場列島雜湊出現了另一個 CRT 終端機、機械鍵盤輸入指令產生美美的生成式視覺,FOLIO,採取了完全不一樣的作法,但體驗感受極佳。不禁讓我思考,就在一切回到原點時,體驗者最終還是會忠於自身的體驗,而工程師的浪漫就只留在自身製作的旅程中了。