运行时架构总览

多种运行时环境满足不同场景需求

运行时语言用途特性
VMLRuntimeC# (.NET)核心指令执行引擎完整 SYSCALL、MMIO 设备、浮点/双精度
VMLRuntimeCC99跨平台原生运行时无依赖、VGA 渲染、音频录音、~100KB 体积
ConsoleEmulatorC# (.NET)终端模拟器VGA 文本模式、键盘脚本、多种设备类型
FullDevicesEmulatorC# (Avalonia)GUI 全设备模拟器图形界面、设备可视化、AI 面板集成
VMLIdeC# (Avalonia)桌面 IDE代码编辑、编译、运行、AI 辅助

VMLRuntime — 核心执行引擎

C# 实现的 VML 虚拟机,完整支持 92 条指令 + 30+ 系统调用

核心能力

  • 92 条 VML 指令完整实现 (NOP=0 ~ LAST=91)
  • 16 个通用寄存器 R0-R15 + 8 浮点 F0-F7 + 4 双精度 D0-D3
  • 栈帧管理 (ENTER/LEAVE/LEA)
  • 内存管理: SYSCALL 40 malloc / 41 free
  • 30+ 系统调用 (I/O/文件/时间/设备/FFI)
  • 中断处理 CLI/STI/IRET + 异常 TRY/CATCH
  • MMIO 内存映射 I/O 设备模拟
  • VMB 二进制格式加载与保存

内存布局

地址空间 (32-bit)
0x000000 ┌──────────┐
         │ 代码段    │ .text
0x000400 ├──────────┤
         │ 数据段    │ .data / .rodata
0x008000 ├──────────┤
         │ 堆 →      │ malloc 向上增长
         │ ← 栈      │ 栈向下增长
0xFFFFFF └──────────┘

特殊地址:
0xE000  FFI 函数指针表 (OS 模式)
0xE030  FFI 初始化标志
0xF000  MMIO 设备寄存器

VML 程序执行流程

从加载 VMB 到程序结束的完整执行周期

1. 加载
读取 .vml / .vmb解析指令
↓ VMLAssembler 汇编或 VMB 反序列化 ↓
2. 初始化
设置 .entry 地址初始化 R13(SP)加载 BIOS
↓ VmRuntime.LoadProgram(program) ↓
3. 取指-译码-执行
Fetch → Decode → Execute 循环
↓ 每条指令: 读取 OpCode → 查表跳转 → 执行处理函数 ↓
4. SYSCALL
I/O内存文件FFI
↓ HALT 指令或超时 ↓
5. 结束
清理资源返回退出码

ConsoleEmulator — 终端模拟器

最常用的 VML 程序运行工具,支持多种设备和调试模式

基本命令

命令说明
consoleemulator -r file.vml运行 VML 程序
consoleemulator -r file.vml --debug启用调试跟踪
consoleemulator -r file.vml --timeout 6060 秒超时 (0=无限制)
consoleemulator -r file.vml --mode osOS 模式 (全部 SYSCALL)
consoleemulator -s file.vml --debug单步调试
consoleemulator -v显示版本

模拟设备类型

参数设备CPU内存显示
--device apple2Apple II6502 @1MHz64KB280×192 6色
--device c64Commodore 646510 @1MHz64KB320×200 16色
--device zxspectrumZX SpectrumZ80 @3.5MHz48KB256×192 15色
--device msxMSX1Z80 @3.58MHz64KB256×192 16色
--device cpc464Amstrad CPCZ80 @4MHz64KB640×200 27色
--device pet2001Commodore PET6502 @1MHz32KB40×25 文本

按键脚本自动化

# script.txt — 自动输入脚本
wait 1000           # 等待 1 秒
key Space           # 按空格
key 4
key 5
key Enter           # 确认
# 注释: 支持 a-z, 0-9, Space, Enter, Up, Down, Left, Right, F1-F12
# 组合键: key ctrl+a, key ctrl+shift+a
$ consoleemulator -r program.vml -k script.txt

VMLRuntimeC — C 跨平台运行时

纯 C99 实现,零依赖,可编译到任何有 C 编译器的平台 (~100KB)

特性

  • 92/92 VML OpCode 全部实现
  • 与 C# 运行时 100% 兼容 (同号同义)
  • VGA 80×25 文本模式渲染 (ANSI 彩色)
  • PC 扬声器模拟 + WAV 录音
  • MCU/OS 双模式
  • Makefile + CMake 双构建系统
  • 支持静态链接 (单文件分发)

构建 & 使用

# 编译
cd VMLFast/VMLRuntimeC
make              # 标准编译
make release      # 发布编译
make static       # 静态编译
make install      # 安装到 /usr/local/bin

# 运行
./vmlrun program.vml          # VML 文本
./vmlrun program.vmb          # VMB 二进制
./vmlrun --os program.vml     # OS 模式
./vmlrun -d program.vml       # 调试模式
./vmlrun --vga program.vml    # VGA 渲染
./vmlrun --record-audio out.wav program.vml

OpCode 同步

VMLFast/VMLRuntimeC/include/vml_opcodes.h 必须与 VMLAssembler/OpCode.cs 值一一对应。C# OpCode.cs 是唯一权威定义。

VMLIde — 桌面 IDE (~70%)

基于 Avalonia 的跨平台桌面 IDE,集成代码编辑、编译、运行、AI 辅助

代码编辑器

语法高亮、代码补全、多标签页、22 种语言支持。集成前端编译器一键编译到 VML。

VML 调试器

断点设置、单步执行 (Step/Next/StepOut)、寄存器查看、内存浏览、反汇编视图。

设备可视化

FullDevicesEmulator 集成,VGA 显示输出、键盘输入、设备状态面板实时更新。

AI 面板

代码解释、编译器错误分析、VML 汇编优化建议。

中断与异常处理

VML 支持硬件中断和软件异常的完整机制

指令值说明
CLI78清除中断标志(关中断)
STI79设置中断标志(开中断)
IRET80从中断返回(恢复上下文)
TRY81尝试执行代码块,捕获异常
CATCH—异常处理入口标签
ENDCATCH82异常处理结束
SYSCALL #70—寄存器快照 (调试)
SYSCALL #71—寄存器恢复 (调试)