mezantrop / **i486SX_soft_FPU ** 公开

为 NetBSD 上的 i486SX CPU 恢复 FPU 模拟

许可协议

BSD-2-Clause license

9 stars 0 forks Branches Tags Activity

为 NetBSD 上的 i486SX 恢复 FPU 模拟

NetBSD 10.x with FPU_emulation on i486sx

这个复古计算项目恢复了 NetBSD 内核中对 x87 浮点单元 (FPU) 模拟的支持,目标是没有硬件 FPU 的传统 486SX 类处理器。 它将最初的 MATH_EMULATE 选项带回 NetBSD 10.x 及更高版本,并还原和重新设计了 commit dfe83e0 中引入的更改,该更改从内核中删除了 FPU 模拟支持。

免责声明

本项目正在开发中,可能包含错误或不完整的功能。 使用风险自负。 作者对因使用造成的任何问题不承担任何责任。

注意事项

x87 FPU 模拟指令

🧠 控制和初始化

指令 | 状态 | 描述 | 操作码 | 例子 ---|---|---|---|--- fninit | ✅ OK | 初始化 FPU | 9B DB E3 | fninit

📤 加载到 FPU 堆栈

指令 | 状态 | 描述 | 操作码 | 例子 ---|---|---|---|--- fld | ✅ OK | 加载浮点值 | D9 /0 | fld st(1) fldt | ✅ OK | 加载 80 位扩展精度 | DB /5 | fldt [mem] filds | ✅ OK | 加载整数 (短) | DB /0 | filds [mem] fildl | ✅ OK | 加载长整数 | DB /A | fildl [mem]

📤 从 FPU 堆栈存储

指令 | 状态 | 描述 | 操作码 | 例子 ---|---|---|---|--- fstps | ✅ OK | 存储并弹出单精度 | D9 /3 | fstps [mem] fstpt | ✅ OK | 存储 80 位扩展精度并弹出 | DB /7 | fstpt [mem]

➕➖✖️➗ 算术运算

指令 | 状态 | 描述 | 操作码 | 例子 ---|---|---|---|--- fadd | ✅ OK | 添加浮点值 | D8 /0 | fadd st(1), st faddl | ✅ OK | 从内存添加长双精度浮点数 | DA /0 | faddl [mem] fsub | ✅ OK | 减去浮点值 | D8 /4 | fsub st(1), st fsubp | ✅ OK | 减去并弹出 | DE /5 | fsubp st(1), st(0) fmul | ✅ OK | 乘以浮点值 | D8 /1 | fmul st(1), st fdiv | ✅ OK | 除以浮点值 | D8 /6 | fdiv st(1), st fdivp | ✅ OK | 除以并弹出 | DE /7 | fdivp st(1), st(0) fscale | ✅ OK | ST(0) 按 ST(1) 缩放 | D9 FD | fscale

🔍 比较

指令 | 状态 | 描述 | 操作码 | 例子 ---|---|---|---|--- fcom | ✅ OK | 比较浮点值 | D8 /2 | fcom st(1) fucom | ✅ OK | 将 ST(0) 与 ST(i) 进行无序比较 | DD E0+i | fucom st(1) fucomp | ✅ OK | 无序比较和弹出 | DD E8+i | fucomp st(1) ftst | ✅ OK | 将 ST(0) 与 0.0 进行比较 | D9 E4 | ftst

🔁 堆栈操作和修改

指令 | 状态 | 描述 | 操作码 | 例子 ---|---|---|---|--- fxch | ✅ OK | 将 ST(0) 与 ST(i) 交换 | D9 C8+i | fxch st(1) fchs | ✅ OK | 更改 ST(0) 的符号 | D9 E0 | fchs fabs | ✅ OK | ST(0) 的绝对值 | D9 E1 | fabs frndint | ✅ OK | 将 ST(0) 四舍五入为整数 | D9 FC | frndint

📈 对数和特殊数学运算

指令 | 状态 | 描述 | 操作码 | 例子 ---|---|---|---|--- fyl2x | ⏳ TBD | 计算 y × log₂(x) (ST(1) × log₂(ST(0))) 并弹出 | D9 F1 | fyl2x fyl2xp1 | ❌ N/A | 计算 y × log₂(x+1) 并弹出 | D9 F9 | fyl2xp1 fxtract | ❌ N/A | 提取: ST(0) → ST = 尾数, ST+1 = 指数 | D9 F4 | fxtract f2xm1 | ✅ OK | 计算 ST(0) 的 2^x - 1 | D9 F0 | f2xm1 fpatan | ❌ N/A | 计算 arctangent(ST(1)/ST(0)) 并弹出 | D9 F3 | fpatan fsqrt | ❌ N/A | 计算 ST(0) 的平方根 | D9 FA | fsqrt

安装

$ cd /usr/src/sys/arch/i386/conf/
$ vi GENERIC_TINY_486SX# 或者 GENERIC_PS2TINY_486SX 或者使用 "options MATH_EMULATE" 创建你自己的内核配置
$ config GENERIC_TINY_486SX
$ cd ../compile/GENERIC_TINY_486SX
$ make depend
$ make
# 如果一切顺利,将新内核安装在 root 下:
# mv /netbsd /netbsd.old
# mv netbsd /

预构建驱动器镜像

查看 Releases 以获取编译的带有 FPU 模拟的 netbsd 内核,以及驱动器镜像

联系方式

如果您有想法、问题或发现了问题,请随时提出 issue 或直接与我联系:Mikhail Zakharov。

我对 Linus Torvalds、William "Bill" Jolitz 和 NetBSD 的原始代码所做的更改均已获得 BSD-2-Clause 许可。