Add dev handoff package
Browse files- dev/HANDOFF.md +37 -0
dev/HANDOFF.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 小貓中文 — 接手說明 (HANDOFF)
|
| 2 |
+
|
| 3 |
+
目標:DOS 常駐 (TSR) Big5 中文顯示 + 注音輸入,跑在 js-dos 6.22(瀏覽器/手機),部署到 HF static Space `HelloSun/c_dos`
|
| 4 |
+
(https://hellosun-c-dos.static.hf.space/index.html)。傳統記憶體越少越好(現況常駐約 10 KB,不強制 600K)。授權 GPL-3.0-only。
|
| 5 |
+
|
| 6 |
+
## 現況(已驗證)
|
| 7 |
+
- DOS 提示字元可顯示中文、`Ctrl+Space` 切換注音、候選列在最底列、Backspace 刪整個中文字。
|
| 8 |
+
- 手機尺寸 390x844 + 觸控虛擬鍵盤驗證過;HF 線上版開機正常。
|
| 9 |
+
|
| 10 |
+
## 架構
|
| 11 |
+
- `src/xiaomao.c`:TSR 主程式。`key_service`(INT16 處理)、`out_filter`(INT29 處理)、載入器(`main`)。
|
| 12 |
+
- `src/xms.asm` (NASM OMF):XMS 包裝、INT16/29/2F 掛勾(私有 1 KB 堆疊在 _TEXT,SS=CS)、`vga_tile`(INT10 AX=1100h 載入 8x16 字塊)、`vga_8dot`(8 點寬,去掉 9 點縫)。
|
| 13 |
+
所有 helper 只能改 AX;Watcom 暫存器呼叫 AX,DX,BX,CX;large model 以 `retf` 返回;符號後綴 `_`。
|
| 14 |
+
- 顯示:Big5 前導+後隨位元組 → 取 32 byte 字形(XMS) → 拆左右 8x16 → 載入 VGA 字塊 → 以舊 INT29 輸出兩個字塊字元。
|
| 15 |
+
字塊池:0x80-0xE5(51 對)+低控制碼 12 對=63 對;掃描螢幕找未使用者再覆寫;0xE6-0xFF(13 對) 專給底列候選列。
|
| 16 |
+
- 輸入:INT16 AH=0/1/0x10/0x11 掛勾,按鍵進 IME 狀態機,輸出 Big5 兩個位元組入 16 字佇列;`run` 計數讓 Backspace 一次退兩格。
|
| 17 |
+
- 資料:`FONT.DAT`("ETNF" 18 byte 頭, ASCII 256x16, CJK 32 byte/字, 索引 (lead-0xA1)*157+trail索引) 與 `IME.DAT`("ETNI", 12 byte 頭, 5 byte 記錄 key/offset/count);載入到 XMS,需 HIMEM。
|
| 18 |
+
key=(((ini*4+med)*14+fin)*5+tone);XMS 搬移長度必須為偶數。
|
| 19 |
+
- 常駐大小:build.sh 兩階段編譯,從連結 map 的 STACK 段位址 +0x10 得 `TSR_PARAS`,init 用的大緩衝放在堆疊(不常駐)。
|
| 20 |
+
- 重複載入偵測 INT2F AX=D7A0h→584Dh;再次執行 XIAOMAO 只顯示 MEM 報告。
|
| 21 |
+
- 網頁:`index.html` 虛擬鍵盤 + `Ctrl+Space` 按鈕。開機映像以 base64 放 `dos.b64.js`(HF 對二進位檔回 302 無 CORS,所以不能放 .zip/.img);wdosbox 從 js-dos.com 載入。
|
| 22 |
+
|
| 23 |
+
## 建置 / 部署
|
| 24 |
+
- 工具:OpenWatcom 2.0(`WATCOM=/opt`, 用 `/opt/binl64/wcl`)、nasm、mtools、curl、python3(`pypinyin jieba opencc huggingface_hub`)、`/usr/share/unifont/unifont.hex`。
|
| 25 |
+
- 編譯旗標:`-bt=dos -ml -0 -os -s -zu -k6144`(`-s` 必要:私有堆疊上不可做堆疊檢查)。Watcom 沒有 `_AX` 偽暫存器;`_psp` 需自行 `extern unsigned _psp;`。
|
| 26 |
+
- `./build.sh` 產生 `dist/`;設環境變數 `HF_TOKEN` 才會上傳(token 絕不寫入檔案)。
|
| 27 |
+
- `dos/boot622.img` 是使用者提供的 MS-DOS 6.22 開機磁片,**未放入本 zip(授權)**,需自備放到 `dos/boot622.img` 或用 `DOS_BASE_IMAGE=`。
|
| 28 |
+
CONFIG.SYS:HIMEM + EMM386 NOEMS + DOS=HIGH,UMB;AUTOEXEC.BAT 以 `LH XIAOMAO.EXE` 載入。檔案需 CRLF(build.sh 會轉)。
|
| 29 |
+
- 測試:無本機 DOS 模擬器;用 Playwright chromium + 本機 http.server 載入 dist 內容,`page.keyboard.press('Control+Space')`,截圖檢查。
|
| 30 |
+
Chromium:`/root/.cache/ms-playwright/chromium-1248/chrome-linux64/chrome --no-sandbox --disable-gpu --disable-dev-shm-usage`。
|
| 31 |
+
|
| 32 |
+
## 已知限制 / 待辦
|
| 33 |
+
1. 從零建置:目前依賴自備的 MS-DOS 6.22;可改 FreeDOS 1.4 floppy(需 HIMEM/JEMM,boot 片內沒有)。
|
| 34 |
+
2. 直接寫 B800 的程式(EDIT 等)不顯示中文;CP437 畫框字元連續出現時會被誤判為 Big5。可加開關。
|
| 35 |
+
3. 同畫面不同漢字超過 63 個會互相覆蓋(可考慮 512 字元字型模式)。
|
| 36 |
+
4. 輸入法只有注音;候選限 9 個無翻頁;無詞組/聯想。
|
| 37 |
+
5. 依賴 js-dos.com 提供 wdosbox(可改自架,但 HF 對 .wasm/.js 大檔可能走 LFS,需 base64 方案)。
|