C64 GB2312 文本渲染器(han64)
A Commodore 64 之 GB2312 中文文本渲染器,用 8×8 位图字体,具动态字符缓存功能.
范围 v1(渲染)
- 2501+ 简体中文字符(GB2312 行 $B0-$D7)
- 8×8 像素位图字体(每字 8 字节)
- 自二进制文件显示 GB2312 编码文本
- 动态字符缓存(256字符槽位)
- 基于排名的GB2312→字形ID查询
- Python离线表生成
- C64运行时渲染于6502汇编(ACME)
范围v1.5(当前:多字符集)
- 双字符集支持(512字符槽位)以光栅中断
- 8×7像素位图字体(每字形7字节)以节位
范围v2(未来:即时通讯输入法)
- 拼音输入法带候选选择
- 交互式文本编辑
- 光标移动与滚动
- 参见下方“未来工作”部分
核心架构(v1)
GB2312 text file (chabuduo.bin)
↓
GB2312 → glyphID lookup (rank-based tables)
↓
Cache check (2502-byte cache array)
↓
Copy glyph bitmap (8×8) if not cached
↓
Write character code to screen RAM
↓
VIC-II renders using custom charset
主要原则
- 运行时无Unicode
- 密集内部字形ID(0..2500)
- GB2312惟用于輸出入
- 所有重負處理皆離線
- 自修碼以速製字形複本
字形集
正確二百五十一字
皆為:
- GB2312可碼
- BMP Unicode(無UTF-16代理對)
附加字符:
- 約七十ASCII
- 8 GB2312 标点符号(行1至15)
字形存储
font8.bin或font7.bin(适用于v1.5)
布局:
- 字形ID × 8字节(v1.5为7字节)
- 每行1字节,8位使用:8×8位图(v1.5为8×7)
字形ID排序(重要)
字ID乃依GB2312行列序而配之
何故:
- 简GB2312编解码之术
- 得复用一字ID于gb2312表
- 书文渲染时增其近便
- 免再设逆映之表
频次之理,不系于字ID编号,而在IME候选序中理之
编码:GB2312
- ASCII:
0x00–0x7F(今版本一暂略) - 汉字: 2 字节
- hi 字节(行):
0xB0–0xD7(40 行所支) - lo 字节(列):
0xA1–0xFE(每行94 列)
- hi 字节(行):
- 未用/无效: 其他字节范围
- 无 BOM
- 无状态,宜流式
GB2312者,严为I/O之格式,非用于内里之理也。
GB2312查寻之实
运行时用基于位次之编列以缩GB2312→字形ID之对应:
每行($B0-$D7)有表,其列:
- 基字形ID(2字):此行字形ID之始
- 位次之数组(94字):凡列($A1-$FE),存秩(0..count-1)或$FF若阙
此使阙字得效存,不须分符ID于未用GB2312码
运行表(v1)
以Python离线成之(tools/gb40.py)
gb40_rows.asm
含四十行表(gb_row_B0以降)gb_row_D7者,各具
!word baseGlyphID ; 2 bytes
!byte rank[94] ; 94 bytes: rank or $FF if missing
。gb_row_ptr_lo與gb_row_ptr_hi二表所引,見於主檔__main.asm__。
字符緩存
緩存(主檔__main.asm__中佔2501字節以上)。
- 以字體ID(自0至2501)為索引。
- 若字體已載入,則存其字符槽位(自0至255);若未緩存,則存0。
- 当缓存满时(字符指针至256),后续字符显为空格
此限可见之独字符为256,然可通缓存于2501字以上之文
Python构建之流
输入:
gb2312_chars.txt(2501汉字带GB2312码)- 字体位图数据(8×8位图)
输出:
font8.bin(二百五十有一乘八字节)font7.bin(二百五十有一乘七字节,为v1.5之用)gb40_rows.asm(四十行之表,具秩码)
众表皆以!binary与!source入汇编。
运行时(C64 / 6502)
- 无UTF-8之用
- 运行时无Unicode
- 无动态之内存
- 众表皆为只读
- 汇编者:ACME
- 构建:
acme main.asm(或参看Makefile)
渲染路径(v1):
- 自文本流中读GB2312字对
- 依
GB2312_LookupGlyphID(基于排名)查字形ID - 检字形ID索引之缓存数组
- 若未缓存,则经
CopyGlyph8将8×8位图复制至定制字符集 - 将字符槽写入屏幕RAM
- VIC-II显示使用自定义字符集于$3000
此非何物
- 非UTF-16
- 非Unicode运行时
- 非基于词典(尚非)
- 非繁体中文
- 非GBK/GB18030运行时(但离线兼容)
未来之业(v2 - IME)
拼音输入法之特色
- 拼音输入法,音节解析
- 初桶(b, p, m, f, d, t, n, l等,元音初始者加Ø)
- 人才遴选界面
- 短语词典(2-4字)
- 简品缩写模式
- MRU学之
- 频次排序
渲染之强化
- 双字符集之支援(512字符位借由光栅中断)
- 字符集一用于屏上之半
- 字符集二用于屏下之半
- 光栅中断于行十三(扫描线百零四)以切换
- 次中断于行二十五(扫描线二百)以切换回
- 滚动之支援(行复制加中断调整)
- 光标移位(依色或专用符)
- 互动文本编辑
数据之源
- 雲漢資料庫為拼音對照
- SUBTLEX-CH(中文版)或简达(Jun Da)以获取频率数据
- UTF-8之载入载出之器
设计之旨
- 结构胜于巧思
- 离线之繁,运行之简
- 编码非语言
- 6502为先,现代工具次之
文本渲染(v1)
- VIC-II文本模式,定制字符集
- 40×25字符
- 定制字符集位于$3000(第6组)
- 屏幕RAM位于$0400
- 色彩RAM位于$D800(现设为浅灰$0F)
- 一屏同现之字,止二百五十六符
输入法渲染(其二——其来者)
- 首行:输入法之入与候选之域
- 示候选至十:
ying 1英 2婴 3鹰 4应 5营 6蝇 7迎 8赢 9盈 0影 - 若候选逾十,则页次之标显>十候选
- 下二十四行:常文之观域
- 光标移于文域,非入法域












