|
本帖最后由 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
打赏
-
查看全部打赏
|