大家好,
这是我的CAD工具,用于拍摄面膜ROM并提取零件的照片,以便可以恢复ROM的内容。
该工具中的键盘快捷键是可选的。在开始探索之前,请阅读下面的GUI文档。
如果您发现此工具很有用,请为您自己或聪明的学生购买我的有关微控制器的书的副本。
- Travis Goodspeed

GBROM-TUTOIAL会教您如何从Gameboy的Mask ROM的照片开始,然后努力进行准确的ROM图像。
MyK82 ROM在Fortezza卡中从Myk82芯片中保存了完整的ROM转储。这是快船芯片的后继产品,存储库不仅包含所有ROM位,还包括重新校正的重新拍摄。
WERSI-SLM2-51173是来自音乐合成模块的Zilog Z8 ROM。
master - 通过避免列表中的深层副本来改进性能。现状栏中的适当位计数和状态栏现在使用固定宽度字体。
2024-08-18- Gatorom的求解器设置选项现在使用描述性fiilenames。 GUI现在可以用文件/导出/求解程序导出一组解决的结果。更清晰的选择矩形。现在,当用户混淆它们时, R和C将绘制正确的行类型。 ^H现在设置了家庭位置。缩放和移动键现在在第二视图中起作用。现在, V键在DRC期间淘汰了完美的重复线条。现在将行和列存储为排序列表而不是集合。现在,在文件导出中,行和列的顺序是一致的。性能在位标记,背景位标记和对齐方式中提高。 MacOS通用二进制。 Romalignertilting可以更好地适用于银行之间差距的设计。在拖动过程中不再绘制视外位,从而加快了调整长线的调整组。
2024-07-14-删除双重选择项目时修复了崩溃。删除和backSpace现在删除D多个拆卸器。现在,随着解码阈值的更改,解码现在已更新。
2024-06-23- YARA规则解决。稳定性改进。十字准线更新到选定线的角度。现在空间重复最后一行,无论是行还是列。可以选择多个项目,然后移动+D重复它们。选择Shift以添加更多行或CTRL(MACOS上的CMD)以删除行。右拖动移动多行,仅预览相关位。现在可以选择Crosshair和选择颜色。放大时,背景不再是铺有瓷砖的。
2024-05-19-急诊室违法行为被迫被强制清除。直方图导出用于绘制GNUPLOT中的颜色分布。支持Wayland。 CLI,GUI,求解器和基本解码器中的明确单词大小支持。求解器集,将所有潜在解决方案导出为二进制文件。不可靠的对准器已弃用。 GUI求解器。拆卸器呼吁Mame的Unidasm。
2024-01-28-撤消和重做。字符串对话。 backslash键,可见层。可靠的对齐算法。关闭主窗口关闭应用程序。
2024-01-01-解决奇数大小时,请在Z8解码器中修复总线误差。 Gatorom CLI中的详细模式。现在在GUI解码器中squeeze-lr模式。编辑菜单项以清除所有位修复。 E将选择下一个刚果民主共和国违规行为。完美的垂直图像不再破坏对齐算法。
2023-12-07-选择亮点。排在状态栏中的行/列计数。 ASCII求解器。从尴尬的rom尺寸中修复了求解器中的多次崩溃。 Gatorom在GUI中解码。去除冗余解码器。十六进制的观看器,并突出显示选定字节。 Gatorom CLI现在非常严格地退出非法访问。 Zilog Z8 ROM支持。
2023-09-13-禁用OpenGL的CLI选项。打印支持。工作窗口构建。
2023-08-06- OpenGL现在功能且默认。鳄鱼包括用于位解码的。
2023-07-20-辅助显示支持。高采样。删除线路后撞击V时修复崩溃。
2023-06-17-在X86_64和ARM64上添加了MacOS。
2023-05-30-第一个Windows版本。
该工具在Windows,Linux,FreeBSD和MACOS中使用QTCHARTS扩展名的QT6。
从CLI中构建该工具是最简单的。在Debian Bullseye(11.x)中,
% sudo apt install make gcc g++ cmake git qt6-base-dev libqt6charts6-dev
qt6-translations-l10n linguist-qt6 qt6-l10n-tools qt6-tools-* qt6-image-formats-plugins
% git clone https://github.com/travisgoodspeed/maskromtool/
...
% cd maskromtool
% mkdir build; cd build
% cmake ..
% make -j 8 && sudo make install
在Windows和MacOS中,将QT用于开源安装程序,确保包括图表和图像格式扩展名。然后打开CMakeLists.txt作为一个项目。然后, Ctrl+B将编译maskromtool 。如果您对导入有问题,例如选择错误的QT安装,请删除CMakeLists.txt.user并重新打开项目以重试。
为了方便Windows和Macos用户,我们还制作了一些预制版本。
首先使用文件/打开ROM作为照片打开ROM图像。尝试使用未压缩格式,但要注意MacOS不喜欢TIFF文件。
在滚动鼠标车轮时握住控制键(MACOS上的命令)将放大进出。您也可以在轨道垫上捏缩质。用中间按钮拖动将锅平移,或用两个手指滚动作为操作系统喜欢。
按任意惯例,这些位应在较短的行中长列。如果可见解码器线,则应该位于图像的顶部。随意拍照,然后将其旋转以进行标记。
保存项目时,图像的文件名将使用.json扩展。此分类和缩进的JSON文件应适用于版本控件,例如GIT存储库。
然后,这些键盘按钮可提供您的大部分输入。对于绘图线,请先单击一次作为开始位置,然后在鼠标在末端位置上方时按键。删除项目或设置其位置将适用于最近放置的线路,除非您将盒子拖动以选择一条线。
通过用左鼠标单击拖动它来选择一个项目,然后看着它变成绿色。最近放置的项目是自动选择的。一些命令在多个选定的项目上使用;其他人只有一个。
您可以使用D删除错误,也可以用S ,箭头键或右键单击阻力来调整其位置。在移动过程中,无关线的位可能被隐藏为性能, M键或释放正确的鼠标按钮将重新绘制它们。
在macOS上, ^表示命令,而不是ctrl。
Tab -- Show/Hide bits.
-- Show/Hide rows and columns.
^ -- Show/Hide background.
ALT -- Show/Hide crosshair.
R -- Draw a row from the last left-click position.
SHIFT R -- Repeat the last row.
C -- Draw a column from the last left-click position.
SHIFT C -- Repeat the last column.
SPACE -- Repeat the last row or column.
D -- Delete the selected objects.
SHIFT D -- Duplicate the selected lines.
S -- Set the selected object to the mouse position.
F -- Jump to the selected item.
ARROWS -- Move the selected items.
right-drag -- Move the selected items. (SHIFT or ^)
middle-drag -- Pan the view.
^ wheel -- Zoom.
Q -- Zoom to zero.
A -- Zoom in.
Z -- Zoom out.
H -- Jump to home position.
^H -- Set the home position.
SHIFT F -- Force a bit's value. (Again to flip.)
SHIFT A -- Force a bit's ambiguity. (Again to flip.)
M -- Remark all of the bits.
SHIFT M -- Update hex decoding and disassembly.
V -- Run the Design Rule Checks.
SHIFT V -- Clear the DRC violations.
E -- Jump to next violation.
^Z -- Undo
SHIFT ^Z -- Redo
^S -- Save changes.
当您首次开始标记位时,该软件尚不知道一个和零之间的阈值。您可以使用View / Choose Bit Threshold进行配置。
即使是最好的位也不会完美地标记,因此请使用SHIFT+F强制钻头值,您可以看到软件是错误的。 SHIFT+A是相似的,并且标记为模棱两可或损坏。 DRC菜单包含设计规则检查,这些规则检查将突出项目中的问题,例如弱位或损坏的对齐。
如果放置许多行变得乏味,请选择一个带有左鼠标按钮的组,然后用SHIFT+D重复整个集合。然后,您可以使用右鼠标按钮将其拖动到新位置,将另一个副本留在原始位置。如果帧速率下降,请使用TAB键暂时隐藏所有位,这大大加速了在密集区域中移动许多线路。
十字准线将使自己调整为您最近放置的行和列。这应该让他们倾斜一点以匹配您的照片的现实。
在标记了钻头并检查它们是否与DRC准确的位置之后,运行文件/导出将它们转移到ASCII中,以使用Gatorom,Bitviewer或Zorrom等其他工具来解析。
除GUI外,该工具还具有一个命令行接口,可用于脚本。使用--help Switch查看最新参数,如果您希望GUI不愿意进行交互式使用,则--exit开关。
forum% maskromtool --help
Usage: maskromtool [options] image json
Mask ROM Tool
Options:
-h, --help Displays help on commandline options.
--help-all Displays help, including generic Qt options.
-v, --version Displays version information.
-V, --verbose Print verbose debugging messages.
--stress Stress test bit marking.
-e, --exit Exit after processing arguments.
--disable-opengl Disable OpenGL.
--enable-opengl Enable OpenGL.
-d, --drc Run default Design Rule Checks.
-D, --DRC Run all Design Rule Checks.
--sampler <Default> Bit Sampling Algorithm.
--diff-ascii <file> Compares against ASCII art, for finding errors.
-a, --export-ascii <file> Export ASCII bits.
-o, --export <file> Export ROM bytes.
--export-histogram <file> Export histogram.
--export-csv <file> Export CSV bits for use in Matlab or Excel.
--export-json <file> Export JSON bit positions.
--export-python <file> Export Python arrays.
--export-photo <file> Export a photograph.
Arguments:
image ROM photograph to open.
json JSON lines to open.
要在没有GUI的情况下运行,请-platform offscreen 。如果该程序在Wayland下崩溃,请通过-platform xcb强制XORG使用。
在Windows上,在保留CLI的登录时拥有GUI的可执行文件很尴尬。我们通过产生两个可执行文件来解决此问题。请使用maskromtool.exe进行GUI和maskromtoolcli.exe进行CLI。
一个单独的可执行操作, gatorom包裹ROM位解码器,而无需图形。有关详细信息,请参见Gatorom。
forum% gatorom
Usage: gatorom [options] bitstream
Gato ROM: A Decoder for Mask ROM Bits
Options:
-h, --help Displays help on commandline options.
--help-all Displays help, including generic Qt
options.
-v, --version Displays version information.
-V, --verbose Talk too much.
-w, --wordsize <8> Word size.bits
-r, --rotate <degrees> Rotates the image in multiples of 90
degrees.
--flipx Flips the bits along the X axis.
--flipy Flips the bits along the Y axis.
-i, --invert Inverts the bits.
-o, --output <out.bin> Output file.
--random Randomize a ROM for testing.
--Random Randomize a crazy ROM.
--rawwidth, --seanriddle <width> Width of a raw binary input, in Sean
Riddle's style.
-I, --info Info about input.
-d, --dis <arch> Disassemble.
--print Print with a GUI dialog.
--printpdf <file.pdf> Print to a PDF file.
--decode-tlcs47font Decodes as a TMP47C434N Font.
--decode-z86x1 Decodes as a Zilog Z86x1.
--decode-cols-downl-swap Decodes as a uCOM4 ROM.
--decode-cols-downr Decodes first down then right like a
Gameboy.
--decode-cols-downl Decodes first down then left.
--decode-cols-left Decodes left-to-right.
--decode-cols-right Decodes right-to-left.
--decode-squeeze-lr Decodes even bits from the left, odd bits
from right like in the TMS32C15.
-z, --zorrom Zorrom compatibility mode, with flipx
before rotation.
--leftbank Only the left half of the bits.
--rightbank Only the right half of the bits.
-a, --print-bits Prints ASCII art of the transformed bits.
-A, --print-pretty-bits Prints ASCII art with spaces.
--solve Solves for an unknown format.
--solve-bytes <bytes> Bytes as a hint to the solver.
0:31,1:fe,2:ff
--solve-ascii Look for ASCII strings.
--solve-string <bytes> Byte string as a hint to the solver.
31,fe,ff
--solve-yara <rule> Yara rule file.
--solve-set <prefix> Exports all potential solutions.
Arguments:
bitstream ASCII art of ROM to decode.
我已经围绕QGraphicsScene设计了GUI。基础数据对象使用QT坐标系,带有浮子的精度优于像素的精度。
加载ROM照片后,用户将列和行放在照片上。列的每个交叉点都被认为是一点,并且可配置的颜色阈值决定了该位的值。在误读照片的地方,您也可以将钻头强加于已知的价值。
一旦所有位都被标记并选择了阈值,该软件将标记为蓝色(0)和每个深色位为红色(1)。然后将这些位调整为用于ASCII的链接行列表,以用于其他工具。
为了识别错误,一组设计规则检查(DRC)将批评开放项目。虽然主要接口是GUI,但也可以进行脚本和测试。
尽管可能没有错误的标记可能会标记几千位,但较大的项目将不可避免地需要管理他们的错误。
一个良好的开始是使用DRC检查并仔细对位阈值进行配置,直到没有明显的错误仍存在为止。然后浏览项目并点击tab键”以显示和隐藏注释,以确保正确识别每个位。
如果这是不够的,例如对于数十千座的ROM,它有助于多次注释相同的ROM,最好是从不同的照片中。当然,在注释每张照片时会出现位错误,但是它们会在不同的地方发生。然后,您可以使用--diff-ascii功能与--export-ascii的输出相比,比较图像,调解它们的差异,直到所有项目文件都同意为止。
只需在位中心读取单个像素的颜色,就可以阅读大多数ROM。对于这些, Default采样算法可以正常工作。

对于扩散的rom,其位有点太延迟了,钻头的中心没有独特的颜色,但被稍微暗的线所包围。在对宽度的大小进行采样之后, Wide算法将在每个通道中采用最黑色的颜色,而Tall尺寸相同但垂直。

最欢迎对Mask ROM工具的补丁和改进,但请不要使用功能请求垃圾邮件跟踪器。拉请请求应通过GITHUB页面提交,并且它们不应将项目与第三方库的依赖关系纠缠在一起。
该代码用C ++的保守方言编写,最少使用高级功能。我试图彻底评论代码和类定义。
Gatorom作为命令行解码器包括为求解位安排的命令行解码器。请参阅其自己的读数文件中的CLI文档文件,特别是对于GUI中尚未支持的求解器方法。
另外,Gatorom被用作在Maskromtool GUI中解码的库。使用编辑/解码来定义解码样式和视图/Hexpreview,以查看将钻头实时解码到十六进制。

从解码器中,您可以突出显示十六进制字节,并使用视图/突出显示六角选择来可视化所选字节。在这里,我们看到了Myk82 ROM的前三个单词,该单词将32位包装到每个位置。当MAME的unidasm在路径中时,也可以使用拆卸。

还支持脚本求解器,其中简单的掩码或Yara规则描述了预期的固件。所有匹配都列举了,通过在它们之间跳跃,您可以快速破译不使用交错,行反转或其他并发症的图像。

约翰·麦克马斯特(John McMaster)的佐罗姆(Zorrom)是一个出色的解码器,也是该工具中解码库的灵感。
亚当·劳里(Adam Laurie)的Rompar可能是开源的第一个标记工具。
克里斯·格林斯基(Chris Gerlinsky)的Bitract是用于位标记的另一个开源工具,BitViewer是他的匹配工具,用于将位解码为字节。
彼得·博世(Peter Bosch)的PLA解码是用于提取旧英特尔微型码的位标记工具。有关更多详细信息,请参阅2020年的Hardwear.io Talk。