- Pascal 69.1%
- C# 25.8%
- JavaScript 4.3%
- Python 0.4%
- PowerShell 0.4%
| artifacts | ||
| DvccLab | ||
| original | ||
| tools | ||
| .gitignore | ||
| README.md | ||
| 逆向分析与重写方案.md | ||
DVCC 组成原理实验系统(DvccLab)
DvccLab 是面向 DVCC 组成原理实验系统的 C# 重写项目。项目依据原程序资源、逆向分析结果及实机通信记录,逐步恢复原有界面和设备交互,并以便携式 Windows 桌面程序的形式提供。
项目仍在持续开发中,当前版本实现了部分常用界面和通信流程,尚未达到原程序的完整功能覆盖。涉及设备的功能应以当前实现和实机验证情况为准。
功能概览
- 原版界面布局:恢复主要停靠区域、工具栏分组和原版图标;程序 RAM 页面按原版显示地址、十六进制值和 8 位二进制值。
- 串口连接:枚举可用串口,按 9600 波特率、8 位数据、奇校验、1 位停止位进行通信,并支持本地模拟器。
- 存储器读回:程序 RAM 和微指令 ROM 使用各自已确认的刷新流程。程序 RAM 默认读
@000–@014共 21 个地址,微指令 ROM 默认读@101–@110共 16 行(第 n 行由@101+n读回);若已打开或上传的初始化文件写到更高的地址,刷新会相应读到该文件的最后一行。 - 初始化文件:支持
$P、$M和$Z记录的解析、编辑、校验、保存及另存。$P(程序 RAM)和$M(微指令 ROM)可通过已实现的上传流程发送;$Z用于保存微指令表中的显示文本,不会发送到设备。 - 单步与状态显示:支持已确认的
D2单步请求,并以原始字节形式显示两组状态数据。组成结构图可叠加部分高置信候选寄存器值。 - 实验面板与 ALU 预览:提供数据、微地址和控制开关操作,以及本地 ALU 运算预览。该预览只在本机运行,不会向实验箱发送开关或脉冲命令。
- 通信记录:可在图形界面中记录原始串口收发数据;便携包还提供命令行抓包工具。
- 原版帮助:内置原版帮助文件的 44 个主题和 83 张配图。
- 便携配置:保存窗口、串口、最近文件和标签页等设置。
程序 RAM 页面启动时显示的 00 是默认占位值,并不代表实验箱当前内容。连接实验箱并执行“刷新程序 RAM”后,读回数据会更新到对应地址。
运行便携版
- 从发布包或本地构建结果取得
DvccLab-portable.zip,完整解压到可写目录。 - 运行解压目录中的
DvccLab.exe。 - 在串口下拉框中选择实验箱对应的端口,点击“联接”。也可选择“模拟器(本地)”体验已实现的模拟流程。
- 连接后,使用第二行工具栏中的“刷新程序 RAM”或“刷新微指令 ROM”读取数据。
程序不会在启动时自动向未知设备发送读写命令。便携模式下,配置保存在 DvccLab.exe 同目录的 config.json。升级程序文件时,请保留该文件。
运行程序的计算机需安装 .NET Framework 4.8 或更高版本。
初始化文件格式
文件使用 ASCII 文本,每条记录单独占一行。空行会被忽略。
| 记录类型 | 格式 | 用途 |
|---|---|---|
$P |
$P + 2 位十六进制地址 + 2 位十六进制数据 |
程序 RAM 一个字节,上传为 A0 + 这 4 个字符 |
$M |
$M + 2 位十六进制行地址 + 6 位十六进制微指令 |
微指令 ROM 一行,上传为 A1 + 这 8 个字符 |
$Z |
$Z + 2 位十进制长度 + 对应长度的 ASCII 文本 |
微指令表显示文本,不发送到设备 |
$P 地址范围为 00–FF。$M 行地址范围为 00–FE:已确认的读回地址为 @101–@1FF,因此行 FE 可读回;行 FF 会映射到尚未确认的 @200,当前会被拒绝。上传线路字节与原版相同;这里说明的是文件字段的语义划分。
例如:
$P0001
$M00000000
$Z05HELLO
保存和上传前会检查记录类型、字段长度、十六进制格式以及 $Z 的文本长度。$Z 文本须为单行 ASCII,长度不超过 99 个字符。
串口抓包工具
便携包内的 Tools\Capture\DvccLab.Capture.exe 可单独记录原始通信数据。它只执行已经确认的 O/M 握手;握手成功后持续记录收发字节,不发送读写或单步命令。按 Ctrl+C 停止记录。
.\Tools\Capture\DvccLab.Capture.exe COM3 .\capture.log
从源码构建
环境要求
- Windows 桌面开发环境
- Visual Studio 2019 或 2022 Build Tools
- .NET Framework 4.8 Developer Pack
- PowerShell
解决方案使用经典 C# 项目文件,目标语言版本为 C# 7.3,应用目标框架为 .NET Framework 4.8。当前构建不需要通过 NuGet 安装依赖。
构建便携包
在仓库根目录运行:
.\tools\build-portable.ps1
脚本会构建 Release 配置,并在以下位置生成便携包:
DvccLab\dist\DvccLab-portable.zip
如未能自动找到 MSBuild,可指定其完整路径:
.\tools\build-portable.ps1 -MSBuildPath "C:\Path\To\MSBuild.exe"
也可以使用 Visual Studio 打开 DvccLab\DvccLab.sln,选择 Debug 或 Release 配置进行构建。
重新生成原版帮助资源
此步骤仅在需要从原版帮助文件重新导出主题和配图时使用,普通构建和运行不需要 Python:
python -m pip install winhlp==0.4.3
python .\tools\export-winhelp.py .\original\Dvcc.hlp .\original\Dvcc.cnt .\DvccLab\DvccLab.UI\Assets\HelpTopics.json
单元测试(跨平台)
DvccLab/DvccLab.Tests/ 用 .NET 10 SDK 编译 Core、Transport、Protocol、Storage 四个模块的同一份源码(语言版本仍锁定 C# 7.3),可在 Windows、macOS 或 Linux 上运行。该项目不在 DvccLab.sln 中,不影响 net48 构建。测试用的设备回复取自抓包实录。
dotnet test DvccLab/DvccLab.Tests
DvccLab/DvccLab.Tests/Net48Check/ 把全部产品源码(含 WinForms 界面)按 .NET Framework 4.8 参考程序集编译一遍,用于在非 Windows 系统上做类型检查;产物不可运行,也不随发布包分发:
dotnet build DvccLab/DvccLab.Tests/Net48Check
目录结构
.
├─ DvccLab/
│ ├─ DvccLab.sln Visual Studio 解决方案
│ ├─ DvccLab.App/ WinForms 程序入口
│ ├─ DvccLab.UI/ 主窗体、图表和界面资源
│ ├─ DvccLab.Core/ 领域模型
│ ├─ DvccLab.Protocol/ 设备会话与协议流程
│ ├─ DvccLab.Transport/ 串口及本地模拟传输
│ ├─ DvccLab.Storage/ 初始化文件、配置和抓包记录
│ ├─ DvccLab.Capture/ 命令行抓包工具
│ └─ dist/ 本地构建输出
├─ original/ 逆向分析所用的原版程序及资源
├─ tools/ 构建与资源导出脚本
└─ 逆向分析与重写方案.md 协议证据和重写方案
当前范围与限制
- 当前版本是逐步重写成果,不保证与原程序的所有功能、布局细节和设备行为完全一致。
- 本地模拟器返回的是模拟数据,不能代替实验箱实机验证。
- 连续运行通过重复调用已确认的单步流程实现;暂停会在当前状态数据接收完成后生效,该功能仍需实机回归。
- 第二个单步按钮因对应设备行为尚未确认而保持禁用。
- 微指令 ROM 可通过上传
$M记录写入;在 ROM 表格中直接修改后单独写回的操作尚未开放。 ljwave实时采样映射及动态调试图中部分状态标签仍需进一步实机交叉确认。
通信流程、数据格式和当前实现边界详见《逆向分析与重写方案》。