跳转到主要内容

Renesas (NEC) 78K0仿真器

项目描述

概述

k0emu 是一个用于运行 Renesas (NEC) 78K0 二进制的指令集仿真器。它执行了文档中描述的所有 78K0 指令。它可以用来研究 78K0 代码的行为,但它并不仿真任何特定的微控制器或外围设备。

k0emu 是为了帮助逆向工程 Delco 制造的 Volkswagen Premium V 汽车收音机而开发的。这些收音机使用未经文档化的 NEC µPD78F0831Y 微控制器,该控制器与 µPD78F0833Y 类似。为此项目还开发了配套程序 k0dasm

由于在开发时找不到开源的 78K0 仿真器,因此构建了一个硬件测试平台。该平台包含在 k0emu 中,基于 µPD78F0831Y。首先按文档描述实现了指令。然后编写并运行了测试程序,在 k0emu 和真实硬件上运行。当 k0emu 的结果与硬件不同时,k0emu 被修复以像硬件一样运行。这个过程使人们对 k0emu 正确实现指令有了信心。

功能

  • 执行所有文档化的 78K0 指令

  • 所有指令都通过单元测试覆盖

  • 大多数操作至少有一个寻址模式已与硬件进行测试

安装

k0emu是用Python编写的,需要Python 3.4或更高版本。软件包在Python包索引(PyPI)[可获取]。您可以从那里下载它们,或者可以使用pip自动安装或升级k0emu

$ pip install -U k0emu

使用方法

k0emu接受一个纯二进制文件作为输入。假设该文件是一个内存底部的ROM镜像。例如,如果给出一个32K文件,k0emu将假设图像应位于0x0000-0x7FFF。加载镜像后,模拟器将从复位向量开始执行,直到终止

$ k0emu rom.bin

0d88: 7b 1e        di                     AX=0000 BC=0000 DE=0000 HL=0000 SP=0000 [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0d8a: 13 42 07     mov 0ff42h,#07h        AX=0000 BC=0000 DE=0000 HL=0000 SP=0000 [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0d8d: 13 f9 90     mov 0fff9h,#90h        AX=0000 BC=0000 DE=0000 HL=0000 SP=0000 [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0d90: 13 fb 00     mov 0fffbh,#00h        AX=0000 BC=0000 DE=0000 HL=0000 SP=0000 [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0d93: ee 1c 1f fe  movw sp,#0fe1fh        AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0d97: 4b cd        clr1 0fecdh.4          AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0d99: 71 4b 23     clr1 0ff23h.4          AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0d9c: f0 cd        mov a,0fecdh           AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0d9e: f2 03        mov 0ff03h,a           AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0da0: 6b ce        clr1 0feceh.6          AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0da2: 71 6b 24     clr1 0ff24h.6          AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0da5: f0 ce        mov a,0feceh           AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
0da7: f2 04        mov 0ff04h,a           AX=0000 BC=0000 DE=0000 HL=0000 SP=FE1F [IE:0 RB:0 ISP:0 Z:0 AC:0 CY:0] ffe4=00000000 ffe5=00000000 ffe6=00000000 ffe7=00000000
...

k0emu在运行时显示跟踪信息,但目前没有用户界面来控制模拟。直到存在为止,您可以修改文件run.py。单元测试也可以作为如何从您自己的Python程序中运行模拟器的参考。

作者

Mike Naberezny

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面