2012年11月14日 星期三

[懷舊] jmcce 1.5 (0) - 從死亡到重生

jmcce 是一套中文終端機, linux 誕生之後的幾年, 在中文還要修修補補才能使用的年代, 有好幾套中文終端機, yact, bcs16, chdrv, jmce, zhcon ... 現在己經不太流行了。
ref: http://www.linux.org.tw/CLDP/OLD/Chinese-HOWTO-4.html

若你也經歷過那時期, 應該聽過 jmcce, 我使用過的 linux 中文終端機有 yact, chdrv, jmce。注意 jmce 和 jmcce 是不同的。 jmcce 則是我最後用過的中文終端機, 也是我覺得最好用的一個。最後一版應該是 jmcce 1.4, 那標題的 jmcce 1.5 是那裡來的, 當然是我自己修改的 XD

根據這篇: http://lists.linux.org.tw/pipermail/cle-devel/2002-May/002331.html jmcce 1.4 大約是在 2001 左右出現的, 那時候我還向開發者回報一些問題, 很快就得到修正的版本, 那時候的我還無法參與修改; 十年後 - 2012 年, 我把 jmcce 1.4 rc2 重新修改, 原有的 autobuild tool script 已經過時, 無法在新版本的 autotool 使用, 這東西實在煩人, 我只略懂, 不想花時間在上面, 我改為人工手寫 makefile, 至少可以 compile 了, 當然也很容易 cross compile。印象中 jmcce 有 1.4 正式版本, 不過我只找到 rc2 的版本, 我是從這版本改起。

jmcce 有些程式碼似乎是從 yact 來的, 我看了一下 yact source code, 裡頭有些 code 很雷同, yact 很偉大阿!

對於 opensource 的開發方式並不陌生, 不過我從來沒想過我也可以參與 opensource 開發。jmcce 成為我的第一次, 儘管她有點過時了, 不過讓死掉的專案復活, 爽度暴增。

為什麼挑上 jmcce? 繪圖模式下的終端機有, fbcon, fbterm ... fbcon 是由 linux kernel module 提供的, 相容性最好, 不過我不知道能不能顯示多國語言。

而因為我只喜歡在需要的時候才進入繪圖模式, 使用 svgalib 撰寫的 jmcce 符合這原則, 不過畢竟是古老的系統, 在 utf8 當道的現今, 她還是只能使用 big5。而使用 linux framebuffer 的終端機並不受我青睞, 但在非 x86 環境下, 就只能使用 linux framebuffer。

fbterm 似乎很先進, 有很多功能。jmcce 要做到 fbterm 還有很多程式碼要寫, 但是 jmcce 有著另外的優勢, 就是很多輸入法, 這就是 fbterm 沒有的了。fbterm 有用到 libx86, 這是幹嘛用的? 很神奇, 下一篇再講。

有一個 v86d 就是用 libx86 寫的。我的 fb 測試需要用到它。

NAME
       v86d - daemon to run x86 code in an emulated environment

SYNOPSIS
    v86d

DESCRIPTION
    v86d  provides  a  backend for kernel drivers that need to execute x86 BIOS code. The
    code is executed in a controlled environment and the results are passed back  to  the
    kernel via the netlink interface.

    v86d should NOT be run by the user, the kernel will call it, when it is needed.

AUTHOR
    v86d is written by Michal Januszewski.

    This  manual page was written by Evgeni Golov , for the Debian
    project (but may be used by others).

module uvesafb.ko 會需要 v86d, 真奇怪, kernel module 竟然需要 user mode daemon??

linux fb test:

測試 fb 是否有驅動起來
fbset -s
open /dev/fb0: No such file or directory

沒看到這字串就是有啟動 framebuffer, 這時可以看看解析度是多少。

在我的 eeepc 901 上測試 linux fb 時, 需要移除 i915 module, 並且安裝 v86d, 再 modprobe uvesafb, 然後使用 fbset 設定解析度為 640X480X256 color (jmcce 在這模式下才有最正常的畫面)。i915 gpu module 除了補強 x driver 外, 似乎還有著 framebuffer 的功能。

fbset -xres 640 -yres 480 -vxres 640 -vyres 480 -depth 8

也可以單純改顏色為 8bit, jmcce 畫面只會佔用 640x480
fbset -depth 8

若是直接使用 grub vga=769 這參數, 似乎無法使用 fbset 改變解析度。

提供另外的 fb command 作為參考。

hwinfo --framebuffer | grep Mode

linux svgalib test:

在 debian 關閉 linux framebuffer module 才能正常 (使用 uvesafb 則可以執行)。不保證能在 debian 以外的環境能正常執行。測試時最好不要開啟 framebuffer, 我是把 framebuffer module 刪除。不過在載入 uvesafb 時, svgalib 版本還是可以執行, 但是顏色有點問題。有問題就別掙扎了, 改用 fb 模式會愉快些, 這不是容易搞定的問題。

我打算用 c++ compiler, 就算不用 c++ 物件導向的功能, 也可以享受 c++ 標準程式庫帶來的便利性, 是的, jmcce 1.5 已經是 c++ 程式了, .c 結尾的程式名稱其實是 c++ 程式, 我懶得改了。爽快的使用 c++ 帶來的語言特性吧!

會重新開發這個程式只是想懷舊一下 svgalib 程式, 意外發現還看得懂 jmcce 的程式碼, 就順手改了起來, 原本以為只要花點時間改 makefile 會動就好, 沒想到到會動花了我 3 天時間, 更糟糕的是, 我還愈做愈有興趣 xD。看到 jmcce 成功秀出中文時, 那時的興奮之情到現在都還無法忘記。

20121009 ~ 20121030 這段期間我總共修改了:
  • build system: manual makefile
  • pseudo-terminal - use openpty()
  • remove old chewing chinese input method
  • add libchewing support
  • compile by g++4
  • remove asm function (asm_routine.S)
  • limit support utf8 chinese
  • compile linux fb without svgalib
  • use svgalib gl_xxx function, implement scroll function, display speed faster than vga_xxx, resolution fixed to 640x480x256 (vga_xxx is 640x480x16)
其實只要修改幾個地方就可以復活, 不過我加入 gl_xxx 系列的繪圖函式, 修改了捲動部份, 花了一點時間, 原本的 vga_xxx 沒有繼續修正, 不過也不需要了, gl_xxx 快很多。而組合語言的部份我拿掉了, 這會和 1.9.x 的 svgalib 相衝。

libchewing 已經改為使用 utf8 編碼, 我還特地將 utf8 -> big5, 有些字無法轉換成 big5, 有點蠢阿!

目前能使用 big5 和有限的 utf8 中文編碼, 有限度的支援中文 utf8, 為什麼有限度, 因為我是將 utf8 編碼轉成 big5 在 jmcce 上畫出, 一定會有 utf8 無法轉成 big5 的中文字, 要整個改版實在困難, 先將就著用吧!按下 ctrl+alt+8 直接切換 big5/utf8, 痛快。

我想如果沒支援 linux framebuffer 和 utf8, 這個中文終端機大概沒人會想用, 畢竟 x 環境和早期相比, 已經進步不少, 沒必要使用 console 中文終端機了。其實我自己也不想用; 現在頂多拿來上 ptt bbs, 已經勉強可以用酷音輸入; 在 keymap 的這邊似乎還有點問題, 先到這邊就好了, 我花了很多時間在找資料, 不過這部份資料實在不好找, 期待有強者改善這部份。暫時就這樣, 在改下去可能會是無底洞。

key function:
ctrl+alt+3 注音
ctrl+alt+7 酷音
ctrl+alt+8 utf8/big5 toggle

這只是個開始, 離能用還遠得很, 我也不見得會繼續完善她, 我的重心還是擺在 simple os 開發, 希望有其他朋友能一起參與 jmcce。









原本的 svgalib vga_xx function, 捲動速度實在很慢。 解析度: 640x480x16 color。

改用 svgalib gl_xx function, 捲動速度快了不少, 還我本速。 解析度: 640x480x256 color。

捲動處理:
console.c
scroll_down
scroll_up

酷音輸入法 api 使用方式:

todo list:
  • use linux framebuffer more mode, ex: 640X480X24bit color, 1024X768X32bit color
  • fixed linux keymap
  • real utf8 support
  • freetype2 supoort 
  • tune libchew input method

我希望能完成上述功能, 不過再來的進度不會這麼快, 慢慢來吧!

source code:
https://github.com/descent/jmcce

apt-get install libchewing3-dev libsvga1-dev
cd jmcce/src
make vgatest
make 
./jmcce

depend library:
libchewing
svgalib
ncurses

有興趣的朋友自己玩玩看, 有編譯上的問題可以問我。執行 jmcce 前可先執行 vgatest, 看看能否正常顯示 640X480X256 的模式。

lfb branch 有個只 support fb 的版本, 不使用 svgalib。

要是你看到 "descent modify jmcce 1.4 rc2" 覺得很不爽, grep VERSION_STRING 改成你喜歡的字串。

#define VERSION_STRING "descent modify jmcce 1.4 rc2 80x24"


6 則留言:

  1. 老大,

    首先感謝您的提供修正.

    請教一下
    1)您的OS是Linux何版Debian?
    2)從您修正後的版版, 意思是可在Linux kernel 2.6.x以上版本跑, 是嗎?
    3)從gitHub下載source, 接下動做?

    Thanx.

    回覆刪除
  2. 你好嘉義小子,

    可以參考 jmcce/src/makefile, make -f makefile.lfb
    可以編出"只有"支援 framebuffer 的版本, 這應該在多數的 linux 套件都可以成功。不熟悉 vgalib 我建議使用這個編譯方式。

    執行 jmcce 這個執行檔就可以了。不過需要從 console 下執行, 而不是 x terminal。

    README.md 有所需要的 library, 你可以參考看看。我使用的 debian 是 unstable, 目前在 linux kernel 3.11 下也可正常使用。

    你怎麼會對這個有興趣? 這應該已經不是很有用的軟體了。

    我有計劃支援真正的 utf8 版本, 不過工程很大, 會需要很多時間來完成, 目前重心也沒擺在這裡。

    回覆刪除
  3. 感謝大大的回應,
    JMCCE我們再努力裝看看.
    JMCCE雖是古老...但他是中文系統, 有些人是需要的. 你知道嗎, 保齡球館居然還在跑386CPU呢. 更何況我家軟體需要在JMCCE環境下才能跑.
    但因現在硬體越來越新, 舊有的JMCCE快 hold不住, 所以網路查詢, 居然查到大大有修正版, 真是太感謝了! 更期待有UTF8版 可在X console跑.
    若有安裝困難, 不知可否電話聯絡諮詢, 該給的費用, 我們樂意給. 屆時再跟您要號碼.
    感恩!

    回覆刪除
  4. 真是讓我意外, 還有人在使用 jmcce, jmcce 目前只支援 640X480, 我想這會是一個小問題。

    我實在無法想像有什麼軟體會需要在 jmcce 環境中才能執行, 希望你能順利裝起來。

    回覆刪除
  5. B&Q特力屋 的結帳系統好像 也跑JMCCE.

    回覆刪除

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。