数码之家

 找回密码
 立即注册
搜索
查看: 1009|回复: 28

[Arduino] 古董世嘉黑卡游戏机的汇编程序及其硬件复原代码解析

[复制链接]
发表于 2024-5-24 08:32:18 | 显示全部楼层 |阅读模式
本帖最后由 orsonzou 于 2024-5-24 15:51 编辑

在之前的帖子《世嘉MD游戏机的汇编级维修https://www.mydigit.cn/thread-214167-1-1.html

领略了当年的电路原理和汇编代码,但是只是大致了解了68000初始化 z80cpu 这三行汇编代码的作用。但并没有深入了解其电路实现:

代码如下:

move.w #$100, $A11200    ; Hold the Z80 in a reset state, by writing 0x0100 into the RESET port   复位z80 的reset 引脚
move.w #$100, $A11100    ; Request access to the Z80 bus, by writing 0x0100 into the BUSREQ port   拉低z80的 BUSREQ 引脚
btst #0, $A11100        ; Test bit 0 of A11100 to see if the 68k has access to the Z80 bus yet        z80的busack是否为0


上面几句汇编代码中,为啥把常量0x100发到地址0xA11200和 $A111000,就能实现z80的 reset 和 busreq 两个引脚的拉低效果呢

带着疑问,最近总算有空来分析一下
首先,找到世嘉MD游戏机的fpga 实现
网上有好多个版本,但是靠芯片内部硬线走线级别反向工程出来的verilog 代码是这个:
https://github.com/nukeykt/Nuked-MD-FPGA
这个也是子著名的fpga 硬件复原游戏机的项目(misterfpga)的世嘉 md 游戏机这部分 fpga 的实现代码
复原30年前的硬件,是相当庞大工程。其 verilog 代码量也是非常庞大,一个芯片的逻辑变量多达几百个,并且几乎没有太多注释
所有找到上文这几行代码的硬件实现,也花了不少时间
接下来我们一起来剖析吧:
首先是这段68k代码:
move.w #$100, $A11200    ; Hold the Z80 in a reset state, by writing 0x0100 into the RESET port
找到https://github.com/nukeykt/Nuked-MD-FPGA/blob/main/ym6045.v(这个是其中的总线控制器)中的verilog 相关代码:

assign w122 = ~(M3 & VA_i[22:9] == 14'h2844);                //把地址线上的0x2844 >> 10 就是地址 0xA11000

assign w90 = VA_i[8:7] == 2'h2;        //地址线上的$A11200 中的2
assign w95 = ~(UDS_i | RW_i);//这是来自 68k cpu 的 uds 和 rw 两个信号
assign w96 = ~(w95 & w90 & ~w122);                //(UDS+RW)+ $A11200+ //$A11200 中的2,混合出 w96
ym_sdffr dff31(.MCLK(MCLK), .clk(w96), .val(vd8), .reset(w328), .q(dff31_q));                //D 触发器,w96做为上升沿,输入vd=0x100,0x100=100000000,也就是 vd8=1 输出dff31_q
assign w166 = M3 ? dff31_q : w328;//这里 M3信号始终是1,所以 w166就是dff31_q
assign ZRES = w166;                //最终 ZRES 这个信号输出就是w166,也就是条件 cpu_rw+cpu_uds+cpu地址线0xa11200+cpu数据线0x100合成出来的。


然后我们来分析move.w #$100, $A11100    ; Request access to the Z80 bus, by writing 0x0100 into the BUSREQ port
几乎一模一样了


assign w99 = VA_i[8:7] == 2'h1;        //$A11100中的1
assign w63 = ~(w99 & ~w122 & ~UDS_i);        
assign w36 = w63 | RW_i;        //$A11100中的1 + 0xA11000   +  UDS  +RW
ym_sdffr zbr(.MCLK(MCLK), .clk(w36), .val(vd8), .reset(sres_syncv_q), .nq(zbr_nq));        //D 触发器,输入 vd8=0x100
assign ZBR = zbr_nq;                //ZBR=w36 + vd8=0x100


可见 ZBR,也就是 BUSRQ 信号的合成,是 cpu_rw+cpu_uds+cpu地址线0xa11100+cpu数据线0x100合成出来的。

然后呢。。。。正在研究这句:
btst #0, $A11100        ; Test bit 0 of A11100 to see if the 68k has access to the Z80 bus yet        z80的busack是否为0
这句。。。。还在研究中

因为当年的硬件复杂。实际这台游戏机是多块芯片组成的复杂信号关系。。。
要说人家硬件级别复原成 verilog 真是不知道怎么做到的呢?这个真不知道了

本人对这些古董硬件挺感兴趣的,这里只是抛砖引玉,对这方面有兴趣的同学可以交流

谢谢!





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 4家元 +180 收起 理由
网络孤客 + 15 優秀文章
jf201006 + 15 謝謝分享
家睦 + 120
vip2128 + 30 優秀文章

查看全部打赏

发表于 2024-5-24 09:05:54 | 显示全部楼层
虽然不知道讲什么,但是感觉好厉害。
回复 支持 反对

使用道具 举报

发表于 2024-5-24 10:00:19 | 显示全部楼层
只能无脑点赞,完全看不懂
回复 支持 反对

使用道具 举报

发表于 2024-5-24 11:27:17 来自手机浏览器 | 显示全部楼层
楼主棒棒的,
小白路过
回复 支持 反对

使用道具 举报

发表于 2024-5-24 11:27:32 | 显示全部楼层
是把多块芯片的复杂信号给逆向成在一块FPGA芯片上实现所有的功能吗?FPGA好强大呀
回复 支持 反对

使用道具 举报

发表于 2024-5-24 11:30:54 来自手机浏览器 | 显示全部楼层
世嘉md游戏机吧
回复 支持 反对

使用道具 举报

发表于 2024-5-24 14:41:38 | 显示全部楼层
正在干着正向验证的活,这种逆向复原的确很厉害,各种总线分析很复杂的
回复 支持 反对

使用道具 举报

发表于 2024-5-24 15:06:49 | 显示全部楼层
是插软盘的那个游戏机吗?
回复 支持 反对

使用道具 举报

发表于 2024-5-24 16:16:19 | 显示全部楼层
verilog了,都是高手。
回复 支持 反对

使用道具 举报

发表于 2024-5-24 22:31:51 | 显示全部楼层
做模拟器吗
回复 支持 反对

使用道具 举报

发表于 2024-5-24 23:46:03 | 显示全部楼层
玩FPGA的前提  要懂大规模数字电路, 这大概就是门槛

回复 支持 反对

使用道具 举报

发表于 2024-5-25 00:48:47 来自手机浏览器 | 显示全部楼层
逆向工程还是汇编的比较厉害了…
回复 支持 反对

使用道具 举报

发表于 2024-5-25 08:18:57 | 显示全部楼层
插游戏卡的游戏机,玩过这个的都是70 80后了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-25 09:00:21 | 显示全部楼层
猪小呆 发表于 2024-5-24 11:27
是把多块芯片的复杂信号给逆向成在一块FPGA芯片上实现所有的功能吗?FPGA好强大呀 ...

是的,没错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-25 09:00:43 | 显示全部楼层
触景情伤 发表于 2024-5-25 00:48
逆向工程还是汇编的比较厉害了…

是verilog,不是汇编
回复 支持 反对

使用道具 举报

发表于 2024-5-26 22:49:04 来自手机浏览器 | 显示全部楼层
orsonzou 发表于 2024-5-25 09:00
是verilog,不是汇编

我就看开头几个mov没有往下看……见笑了…抱歉…
回复 支持 反对

使用道具 举报

发表于 2024-5-27 00:28:40 | 显示全部楼层
虽然不知道讲什么,但是感觉好厉害。
回复 支持 反对

使用道具 举报

发表于 2024-5-27 11:05:14 | 显示全部楼层
不研究主机。。。
立创搜md 我开源了编程器了烧录卡
比较奇葩的是 md 的 68k 读取数据高地位是交互的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-6-13 19:09 , Processed in 0.265201 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表