From 456cb97fac39c581feb21223782feedd8f1d9b6e Mon Sep 17 00:00:00 2001 From: UzixLS Date: Mon, 31 Jan 2022 21:39:26 +0300 Subject: [PATCH] add support for ZC SD card controller; replace NO-OS divmmc mode with ZC --- fpga/rtl/common.sv | 1 - fpga/rtl/divmmc.sv | 33 ++++++++++++++++++++++-------- fpga/rtl/magic.sv | 11 +++++----- fpga/rtl/top.sv | 15 ++++++++------ rom/Makefile | 6 +++--- rom/{dvmen3e0.rom => zcen3e0.rom} | Bin rom/{dvmen3e1.rom => zcen3e1.rom} | Bin 16384 -> 16384 bytes rom/{dvmen3e2.rom => zcen3e2.rom} | Bin 16384 -> 16384 bytes rom/{dvmen3e3.rom => zcen3e3.rom} | Bin 16384 -> 16384 bytes rom_src/config.asm | 2 +- rom_src/main.asm | 13 ++++++------ rom_src/menu_structure.asm | 16 +++++++-------- rom_src/strings.asm | 7 +++++-- 13 files changed, 63 insertions(+), 41 deletions(-) rename rom/{dvmen3e0.rom => zcen3e0.rom} (100%) rename rom/{dvmen3e1.rom => zcen3e1.rom} (90%) rename rom/{dvmen3e2.rom => zcen3e2.rom} (96%) rename rom/{dvmen3e3.rom => zcen3e3.rom} (93%) diff --git a/fpga/rtl/common.sv b/fpga/rtl/common.sv index 91218f5..ec75b2c 100755 --- a/fpga/rtl/common.sv +++ b/fpga/rtl/common.sv @@ -2,7 +2,6 @@ package common; typedef enum { MACHINE_S48, MACHINE_S128, MACHINE_S3, MACHINE_PENT } machine_t; typedef enum { TURBO_NONE, TURBO_4, TURBO_5, TURBO_7, TURBO_14 } turbo_t; typedef enum { PANNING_MONO, PANNING_ABC, PANNING_ACB } panning_t; - typedef enum { DIVMMC_OFF, DIVMMC_ON, DIVMMC_NOOS } divmmc_t; endpackage diff --git a/fpga/rtl/divmmc.sv b/fpga/rtl/divmmc.sv index 71ae4b3..e360e0d 100755 --- a/fpga/rtl/divmmc.sv +++ b/fpga/rtl/divmmc.sv @@ -6,11 +6,13 @@ module divmmc( input ck7, input en, input en_hooks, + input en_zc, cpu_bus bus, output [7:0] d_out, output d_out_active, + input sd_cd, input sd_miso, output sd_mosi, output reg sd_sck, @@ -61,21 +63,20 @@ always @(posedge clk28 or negedge rst_n) begin end end -reg spi_rd; reg conmem, mapram; wire port_e3_cs = en && bus.ioreq && bus.a_reg[7:0] == 8'hE3; wire port_e7_cs = en && bus.ioreq && bus.a_reg[7:0] == 8'hE7; wire port_eb_cs = en && bus.ioreq && bus.a_reg[7:0] == 8'hEB; +wire port_57_cs = en_zc && bus.ioreq && bus.a_reg[7:0] == 8'h57; +wire port_77_cs = en_zc && bus.ioreq && bus.a_reg[7:0] == 8'h77; always @(posedge clk28 or negedge rst_n) begin if (!rst_n) begin - spi_rd <= 0; page <= 0; mapram <= 0; conmem <= 0; sd_cs <= 1'b1; end else begin - spi_rd <= port_eb_cs && bus.rd; if (port_e3_cs && bus.wr) begin page <= bus.d_reg[3:0]; mapram <= bus.d_reg[6] | mapram; @@ -84,6 +85,22 @@ always @(posedge clk28 or negedge rst_n) begin if (port_e7_cs && bus.wr) begin sd_cs <= bus.d_reg[0]; end + else if (port_77_cs && bus.wr) begin + sd_cs <= bus.d_reg[1] | ~bus.d_reg[0]; + end + end +end + +reg spi_rd, zc_rd; +wire [7:0] zc_data = {7'b0000000, sd_cd}; +always @(posedge clk28 or negedge rst_n) begin + if (!rst_n) begin + spi_rd <= 0; + zc_rd <= 0; + end + else begin + spi_rd <= (port_eb_cs || port_57_cs) && bus.rd; + zc_rd <= port_77_cs && bus.rd; end end @@ -93,7 +110,7 @@ assign cpuwait = ~spi_cnt[3]; always @(posedge clk28 or negedge rst_n) begin if (!rst_n) spi_cnt <= 0; - else if (port_eb_cs && (bus.rd || bus.wr)) + else if ((port_eb_cs || port_57_cs) && (bus.rd || bus.wr)) spi_cnt <= 4'b1110; else if (spi_cnt_en && ck7) spi_cnt <= spi_cnt + 1'b1; @@ -103,7 +120,7 @@ reg spi_mosi_en; always @(posedge clk28 or negedge rst_n) begin if (!rst_n) spi_mosi_en <= 0; - else if (port_eb_cs && bus.wr) + else if ((port_eb_cs || port_57_cs) && bus.wr) spi_mosi_en <= 1'b1; else if (!spi_cnt_en) spi_mosi_en <= 0; @@ -114,7 +131,7 @@ assign sd_mosi = spi_mosi_en? spi_reg[7] : 1'b1; always @(posedge clk28 or negedge rst_n) begin if (!rst_n) spi_reg <= 0; - else if (port_eb_cs && bus.wr) + else if ((port_eb_cs || port_57_cs) && bus.wr) spi_reg <= bus.d_reg; else if (spi_cnt[3] == 1'b0 && ck7) spi_reg[7:0] <= {spi_reg[6:0], sd_miso}; @@ -136,7 +153,7 @@ assign ramwr_mask = (!bus.a[13] || page == 4'b0011) && !conmem && automap && mapram; -assign d_out_active = spi_rd; -assign d_out = spi_reg; +assign d_out_active = zc_rd | spi_rd; +assign d_out = zc_rd? zc_data : spi_reg; endmodule diff --git a/fpga/rtl/magic.sv b/fpga/rtl/magic.sv index 0470d54..f280da4 100755 --- a/fpga/rtl/magic.sv +++ b/fpga/rtl/magic.sv @@ -13,7 +13,6 @@ module magic( input magic_button, input pause_button, - input sd_cd, input div_automap, output reg magic_mode, @@ -25,7 +24,8 @@ module magic( output turbo_t turbo, output panning_t panning, output reg joy_sinclair, - output divmmc_t divmmc_en, + output reg divmmc_en, + output reg zc_en, output reg ulaplus_en, output reg ay_en, output reg covox_en, @@ -80,7 +80,8 @@ always @(posedge clk28 or negedge rst_n) begin turbo <= TURBO_NONE; panning <= PANNING_ABC; joy_sinclair <= 0; - divmmc_en <= DIVMMC_NOOS; + divmmc_en <= 0; + zc_en <= 1'b1; ulaplus_en <= 1'b1; ay_en <= 1'b1; covox_en <= 1'b1; @@ -93,14 +94,14 @@ always @(posedge clk28 or negedge rst_n) begin 8'h04: panning <= panning_t'(bus.d_reg[1:0]); 8'h07: joy_sinclair <= bus.d_reg[0]; 8'h08: ay_en <= bus.d_reg[0]; - 8'h09: divmmc_en <= divmmc_t'(bus.d_reg[1:0]); + 8'h09: {zc_en, divmmc_en} <= bus.d_reg[1:0]; 8'h0a: ulaplus_en <= bus.d_reg[0]; 8'h0b: {soundrive_en, covox_en} <= bus.d_reg[1:0]; endcase end reg config_rd; -wire [7:0] config_data = {4'b0000, div_automap, sd_cd, pause_button, magic_button}; +wire [7:0] config_data = {4'b0000, div_automap, 1'b1, pause_button, magic_button}; always @(posedge clk28 or negedge rst_n) begin if (!rst_n) config_rd <= 0; diff --git a/fpga/rtl/top.sv b/fpga/rtl/top.sv index eec4756..0c2bc4a 100755 --- a/fpga/rtl/top.sv +++ b/fpga/rtl/top.sv @@ -234,7 +234,8 @@ wire magic_dout_active; wire magic_mode, magic_map; wire joy_sinclair, up_en, ay_en, covox_en, soundrive_en; panning_t panning; -divmmc_t divmmc_en; +wire divmmc_en, zc_en; + magic magic0( .rst_n(n_rstcpu), .clk28(clk28), @@ -249,7 +250,6 @@ magic magic0( .magic_button(ps2_key_magic), .pause_button(ps2_key_pause), - .sd_cd(sd_cd), .div_automap(div_automap), .magic_mode(magic_mode), @@ -262,6 +262,7 @@ magic magic0( .joy_sinclair(joy_sinclair), .panning(panning), .divmmc_en(divmmc_en), + .zc_en(zc_en), .ulaplus_en(up_en), .ay_en(ay_en), .covox_en(covox_en), @@ -387,13 +388,15 @@ divmmc divmmc0( .clk28(clk28), .ck14(ck14), .ck7(ck7), - .en(divmmc_en == DIVMMC_ON || divmmc_en == DIVMMC_NOOS), - .en_hooks(divmmc_en == DIVMMC_ON), + .en(divmmc_en), + .en_hooks(divmmc_en), + .en_zc(zc_en), .bus(bus), .d_out(div_dout), .d_out_active(div_dout_active), + .sd_cd(sd_cd), .sd_miso(sd_miso_tape_in), .sd_mosi(sd_mosi0), .sd_sck(sd_sck), @@ -410,7 +413,7 @@ divmmc divmmc0( .ramwr_mask(div_ramwr_mask), .cpuwait(div_wait) ); -assign sd_mosi_tape_out = (divmmc_en == DIVMMC_OFF)? tape_out : sd_mosi0; +assign sd_mosi_tape_out = (!divmmc_en && !zc_en)? tape_out : sd_mosi0; /* ULAPLUS */ @@ -498,7 +501,7 @@ memcontrol memcontrol0( .port_1ffd(port_1ffd), .port_dffd(port_dffd), .rampage_ext(rampage_ext), - .divmmc_en(divmmc_en != DIVMMC_OFF), + .divmmc_en(divmmc_en), .div_ram(div_ram), .div_map(div_map), .div_ramwr_mask(div_ramwr_mask), diff --git a/rom/Makefile b/rom/Makefile index 20dc345..b3e382d 100644 --- a/rom/Makefile +++ b/rom/Makefile @@ -3,9 +3,9 @@ bank00=128-0.rom # 0x00000 bank01=128-1.rom # 0x04000 bank02=../rom_src/main.bin # 0x08000 bank03=ESXMMC.BIN ESXMMC.BIN # 0x0C000 -bank04=dvmen3e0.rom # 0x10000 -bank05=dvmen3e1.rom # 0x14000 -bank06=dvmen3e2.rom # 0x18000 +bank04=zcen3e0.rom # 0x10000 +bank05=zcen3e1.rom # 0x14000 +bank06=zcen3e2.rom # 0x18000 bank07=zero8k.bin zero8k.bin # 0x1C000 sizif.rom: ${bank00} ${bank01} ${bank02} ${bank03} ${bank04} ${bank05} ${bank06} ${bank07} diff --git a/rom/dvmen3e0.rom b/rom/zcen3e0.rom similarity index 100% rename from rom/dvmen3e0.rom rename to rom/zcen3e0.rom diff --git a/rom/dvmen3e1.rom b/rom/zcen3e1.rom similarity index 90% rename from rom/dvmen3e1.rom rename to rom/zcen3e1.rom index d988f24e1a8113ea5254b3964a1efc64b1d505ec..2642148ea89e26aca95ad103c547f561a3e7846e 100644 GIT binary patch delta 401 zcmbV@ze@sP9LDc^r*B!2MIoXD_iis8WL%}DuV-Ot5giRWgp)%MNEB^S(JhTl@8nQZ z&=eL&L|YBv54yi08nSB;`U}2x^(XW!AD$1-V_9HXa9dF1kYTSY7gG?kKh?cSxUx$N z85tTvB)%YIpCl8YICmNGuxN&@4BoIX-gjQP)0!T}$Bs^Zo0v)!U{~y8RMpIJ zwt)&=<7@?e^q8{@`so>GaSYOP&SE%51!oLZTIY-+Qj@a?_Gyu`iS9Sf(o4>UaEV@X zrqFF+rSnh`&GeC-}=?sYzaF8^2*Yi%@a|FJ5z*=U&k<5%pn(a`@Vpg6@wL*t)<;w&2t#ee@4{cSX){{2@B zwb2lM_Tis_;(Qwou73`SD{M5F6{99MSi3PMO+Id2&8V>1$tIt1@VNit+F4$;%FE$3441=efw&5YtAV%zh$p+KsSAd` zU8L~Gyz1gX39qA!Mhv&ZC)cQ%`h+vQ-2_AjZ-+Agh0M>gt9?Dn#&tVf;LpL2C;7tP zR!CQER`@RQz%Jsff|`Mq-M`D>M;XHzp5A@>@a<-Xx0|2defZGs|7D@yeWygM4nu+iAh<2PM3YG8!@5em%KH&D7^L!`n?jbny0T2B47nS$4IrN7=Y;zZUp&@Z(9o z*KaGNt2Qfqmv~?oaaKXiz{>95<=00UUo$+t`}E=4%?xihKfU|#q22$>K;1xV{;K8j py-o+3lMlqt_``vARH$e0zFw3L5sC*2Z+@$uB*6H3bAZJLb^xK=eOv$l diff --git a/rom/dvmen3e3.rom b/rom/zcen3e3.rom similarity index 93% rename from rom/dvmen3e3.rom rename to rom/zcen3e3.rom index e83937de5961d412171e901d33091bda6bf72847..01b5b5ff61c3e306fac5d89a3b981540d232e904 100644 GIT binary patch delta 941 zcmZWn&r92282-NWSDe$DRj{&yNgSi37fnTL8pFKkNfZ@5L<9$;mw_;0F3!>5V1K~& zAMDbTR1gn?A+1Gc#sYSuhv9lClJN=q4n=wzrh6M~=hz2z!RZi|A zN{G;D1?e(N1XSRV?u}{n+V9jB3;Wl29iDV;-Ck3nm}RHgnHL{;IUdh~xcC~}eGRI! z>d(+O*I<(@TRB90Z`99LHc@5p{`&TAdTXEmUi_>S->7z3IkR_Ft8weRRSq*pN}~}$ z!{ZU09D{)$k1od(3D$DT#}x<6)-qtmklg0qO{7k;eZb!V!ql(_Qqf9W>?BeLSsD~O z+LE`%z{X0oP^wxQu)Bc^$ZXlBtmrZ(N;;#<451r7A}pl1QxhYG?iEkX;ZLUKm(x1F z9-xL6l2@RD)oMH7FMcgHc1G#o=nP#|x`~TpDVK@Ga45*3UICrh_wbc~dXtab{@8bv$<^`q4}v% zyiC!TKEk0By3j#Dw6{K>+)TlUYH8T+QNg=x+dLtzI_o#uUqK*>QmSps1zl2D;$|8# z24r}dzyx$E3<2G(I9ymch!veFA3Ha5oKhqL#IyatRS1(IJmPHvthO`;2ta^54u266 ze@^uXp$q)E7$MQK`ti*urHi;z*n=1NP%Qx`TBuoC576-3|0gWBa`S)re!}+$z5uX? delta 941 zcmZo@U~Fh$+>pe|eEXmL=2X@I<9ddH1p{rrFIBxi$!cFcqYYJ!B-OBi4p3^?|Np-* fgQ2A`qlG!CzGq;dhW(`5iqPSPU{b