HelloSun commited on
Commit
9a6936b
·
verified ·
1 Parent(s): a07c37f

Add dev handoff package

Browse files
Files changed (1) hide show
  1. 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 方案)。