Subversion Repositories pentevo

Rev

Rev 1319 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. // ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014,2015,2016,2019
  2. //
  3. // top-level
  4.  
  5. /*
  6.     This file is part of ZX-Evo Base Configuration firmware.
  7.  
  8.     ZX-Evo Base Configuration firmware is free software:
  9.     you can redistribute it and/or modify it under the terms of
  10.     the GNU General Public License as published by
  11.     the Free Software Foundation, either version 3 of the License, or
  12.     (at your option) any later version.
  13.  
  14.     ZX-Evo Base Configuration firmware is distributed in the hope that
  15.     it will be useful, but WITHOUT ANY WARRANTY; without even
  16.     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17.     See the GNU General Public License for more details.
  18.  
  19.     You should have received a copy of the GNU General Public License
  20.     along with ZX-Evo Base Configuration firmware.
  21.     If not, see <http://www.gnu.org/licenses/>.
  22. */
  23.  
  24. `include "../include/tune.v"
  25.  
  26. module top(
  27.  
  28.         // clocks
  29.         input fclk,
  30.         output clkz_out,
  31.         input clkz_in,
  32.  
  33.         // z80
  34.         input iorq_n,
  35.         input mreq_n,
  36.         input rd_n,
  37.         input wr_n,
  38.         input m1_n,
  39.         input rfsh_n,
  40.         output int_n,
  41.         output nmi_n,
  42.         output wait_n,
  43.         output res,
  44.  
  45.         inout [7:0] d,
  46.         input [15:0] a,
  47.  
  48.         // zxbus and related
  49.         output csrom,
  50.         output romoe_n,
  51.         output romwe_n,
  52.  
  53.         output rompg0_n,
  54.         output dos_n, // aka rompg1
  55.         output rompg2,
  56.         output rompg3,
  57.         output rompg4,
  58.  
  59.         input iorqge1,
  60.         input iorqge2,
  61.         output iorq1_n,
  62.         output iorq2_n,
  63.  
  64.         // DRAM
  65.         inout [15:0] rd,
  66.         output [9:0] ra,
  67.         output rwe_n,
  68.         output rucas_n,
  69.         output rlcas_n,
  70.         output rras0_n,
  71.         output rras1_n,
  72.  
  73.         // video
  74.         output [1:0] vred,
  75.         output [1:0] vgrn,
  76.         output [1:0] vblu,
  77.  
  78.         output vhsync,
  79.         output vvsync,
  80.         output vcsync,
  81.  
  82.         // AY control and audio/tape
  83.         output ay_clk,
  84.         output ay_bdir,
  85.         output ay_bc1,
  86.  
  87.         output beep,
  88.  
  89.         // IDE
  90.         output [2:0] ide_a,
  91.         inout [15:0] ide_d,
  92.  
  93.         output ide_dir,
  94.  
  95.         input ide_rdy,
  96.  
  97.         output ide_cs0_n,
  98.         output ide_cs1_n,
  99.         output ide_rs_n,
  100.         output ide_rd_n,
  101.         output ide_wr_n,
  102.  
  103.         // VG93 and diskdrive
  104.         output vg_clk,
  105.  
  106.         output vg_cs_n,
  107.         output vg_res_n,
  108.  
  109.         output vg_hrdy,
  110.         output vg_rclk,
  111.         output vg_rawr,
  112.         output [1:0] vg_a, // disk drive selection
  113.         output vg_wrd,
  114.         output vg_side,
  115.  
  116.         input step,
  117.         input vg_sl,
  118.         input vg_sr,
  119.         input vg_tr43,
  120.         input rdat_b_n,
  121.         input vg_wf_de,
  122.         input vg_drq,
  123.         input vg_irq,
  124.         input vg_wd,
  125.  
  126.         // serial links (atmega-fpga, sdcard)
  127.         output sdcs_n,
  128.         output sddo,
  129.         output sdclk,
  130.         input sddi,
  131.  
  132.         input spics_n,
  133.         input spick,
  134.         input spido,
  135.         output spidi,
  136.         output spiint_n
  137. );
  138.  
  139.         wire dos;
  140.  
  141.  
  142.         wire zclk; // z80 clock for short
  143.  
  144.         wire zpos,zneg;
  145.  
  146.         wire rst_n; // global reset
  147.  
  148.         wire rrdy;
  149.         wire [15:0] rddata;
  150.  
  151.         wire [4:0] rompg;
  152.  
  153.         wire [7:0] zports_dout;
  154.         wire zports_dataout;
  155.         wire porthit;
  156.  
  157.         wire csrom_int;
  158.  
  159.  
  160.         wire [39:0] kbd_data;
  161.         wire [ 7:0] mus_data;
  162.         wire kbd_stb,mus_xstb,mus_ystb,mus_btnstb,kj_stb;
  163.  
  164.         wire [ 4:0] kbd_port_data;
  165.         wire [ 7:0] kj_port_data;
  166.         wire [ 7:0] mus_port_data;
  167.  
  168.  
  169.  
  170.  
  171.         wire [7:0] wait_read,wait_write;
  172.         wire wait_rnw;
  173.         wire wait_start_gluclock;
  174.         wire wait_start_comport;
  175.         wire wait_end;
  176.         wire [7:0] gluclock_addr;
  177.         wire [2:0] comport_addr;
  178.         wire [6:0] waits;
  179.  
  180.  
  181.  
  182.  
  183.         // config signals
  184.         wire [7:0] not_used0;
  185.         wire [7:0] not_used1;
  186.         wire cfg_vga_on;
  187.         //
  188.         wire [1:0] modes_raster;
  189.         wire       mode_contend_type = 1'b0; // 48/128/+2 or +2a/+3 TODO: take these signals from somewhere
  190.         wire       mode_contend_ena  = 1'b1; // contention enable
  191.         wire       contend;
  192.         //
  193.         wire [3:0] fdd_mask;
  194.  
  195.         // nmi signals
  196.         wire gen_nmi;
  197.         wire clr_nmi;
  198.         wire in_nmi;
  199.         wire in_trdemu;
  200.         wire trdemu_wr_disable;
  201.         wire [1:0] set_nmi;
  202.         wire imm_nmi;
  203.         wire nmi_buf_clr;
  204.  
  205.         // breakpoint signals
  206.         wire brk_ena;
  207.         wire [15:0] brk_addr;
  208.  
  209.  
  210.         wire tape_in;
  211.  
  212.         wire [15:0] ideout;
  213.         wire [15:0] idein;
  214.         wire idedataout;
  215.  
  216.  
  217.         wire [7:0] zmem_dout;
  218.         wire zmem_dataout;
  219.  
  220.  
  221.  
  222.         reg [3:0] ayclk_gen;
  223.  
  224.  
  225.         wire [7:0] received;
  226.         wire [7:0] tobesent;
  227.  
  228.  
  229.         wire intrq,drq;
  230.         wire vg_wrFF_fclk;
  231.         wire vg_rdwr_fclk;
  232.         wire [1:0] vg_ddrv;
  233.  
  234.  
  235.         wire        up_ena;
  236.         wire [ 5:0] up_paladdr;
  237.         wire [ 7:0] up_paldata;
  238.         wire        up_palwr;
  239.  
  240.  
  241.  
  242.  
  243.         wire        irq_enh;
  244.         wire        irq_ena_int_vec;
  245.         wire        irq_ena_ext_vec;
  246.         wire        irq_int_autoclr;
  247.  
  248.         wire [ 6:0] irq_stat;
  249.  
  250.         wire        irq_stat_setnrst;
  251.         wire [ 6:0] irq_stat_wr_sel;
  252.         wire        irq_stat_wr_stb;
  253.  
  254.         wire [ 6:0] irq_ena;
  255.  
  256.         wire        irq_ena_setnrst;
  257.         wire [ 6:0] irq_ena_wr_sel;
  258.         wire        irq_ena_wr_stb;
  259.  
  260.  
  261.  
  262.  
  263.         assign zclk = clkz_in;
  264.  
  265.  
  266.         // RESETTER
  267.         wire genrst;
  268.  
  269.         resetter myrst( .clk(fclk),
  270.                         .rst_in_n(~genrst),
  271.                         .rst_out_n(rst_n) );
  272.         defparam myrst.RST_CNT_SIZE = 6;
  273.  
  274.  
  275.  
  276.         assign nmi_n=gen_nmi ? 1'b0 : 1'bZ;
  277.  
  278.         assign res= ~rst_n;
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.         assign ide_rs_n = rst_n;
  288.  
  289.         assign ide_d = idedataout ? ideout : 16'hZZZZ;
  290.         assign idein = ide_d;
  291.  
  292.         assign ide_dir = ~idedataout;
  293.  
  294.  
  295.  
  296.  
  297.  
  298.         wire [7:0] peff7;
  299.         wire [7:0] p7ffd;
  300.  
  301.  
  302.         wire romrw_en;
  303.         wire cpm_n;
  304.         wire fnt_wr;
  305.  
  306.  
  307.  
  308.         wire cpu_req,cpu_rnw,cpu_wrbsel,cpu_strobe;
  309.         wire [20:0] cpu_addr;
  310.         wire [15:0] cpu_rddata;
  311.         wire [7:0] cpu_wrdata;
  312.  
  313.         wire cbeg,post_cbeg,pre_cend,cend;
  314.  
  315.         wire go;
  316.  
  317.  
  318.         // AVR SDcard control
  319.         wire       avr_lock_claim,
  320.                    avr_lock_grant,
  321.                    avr_sdcs_n,
  322.                    avr_sd_start;
  323.         wire [7:0] avr_sd_datain;
  324.         wire [7:0] avr_sd_dataout;
  325.  
  326.         // ZX SDcard control
  327.         wire       zx_sdcs_n_val,
  328.                    zx_sdcs_n_stb,
  329.                    zx_sd_start;
  330.         wire [7:0] zx_sd_datain;
  331.         wire [7:0] zx_sd_dataout;
  332.  
  333.  
  334.         wire tape_read; // data for tapein
  335.  
  336.         wire beeper_mux; // what is mixed to FPGA beeper output - beeper (0) or tapeout (1)
  337.  
  338.         wire [2:0] atm_scr_mode;
  339.  
  340.         wire atm_turbo;
  341.  
  342.  
  343.         wire beeper_wr, covox_wr;
  344.  
  345.  
  346.  
  347.         wire [5:0] palcolor; // palette readback
  348.         wire atm_pen2; // ATM palette write enable
  349.  
  350.  
  351.  
  352.         wire [1:0] int_turbo;
  353.         wire cpu_next;
  354.         wire cpu_stall;
  355.  
  356.         wire external_port;
  357.  
  358.  
  359.  
  360. //AY control
  361.         always @(posedge fclk)
  362.         begin
  363.                 ayclk_gen <= ayclk_gen + 4'd1;
  364.         end
  365.  
  366.         assign ay_clk = ayclk_gen[3];
  367.  
  368.  
  369.  
  370.  
  371.  
  372.         // fix ATM2-style ROM addressing for PENT-like ROM layout.
  373.         // this causes compications when writing to the flashROM from Z80
  374.         // and need to split and re-build old ATM romfiles before burning in
  375.         // flash
  376. //      wire [1:0] adr_fix;
  377. //      assign adr_fix = ~{ rompg[0], rompg[1] };
  378. //      assign rompg0_n = ~adr_fix[0];
  379. //      assign dos_n    =  adr_fix[1];
  380. //      assign rompg2   =  1'b0;//rompg[2];
  381. //      assign rompg3   =  1'b0;//rompg[3];
  382. //      assign rompg4   =  1'b0;//rompg[4];
  383.  
  384.         assign rompg0_n = ~rompg[0];
  385.         assign dos_n    =  rompg[1];
  386.         assign rompg2   =  rompg[2];
  387.         assign rompg3   =  rompg[3];
  388.         assign rompg4   =  rompg[4];
  389.  
  390.         wire [3:0] zclk_stall;
  391.  
  392.         zclock zclock
  393.         (
  394.                 .fclk (fclk ),
  395.                 .zclk (zclk ),
  396.                 .rst_n(rst_n),
  397.  
  398.                 .a(a),
  399.  
  400.                 .mreq_n(mreq_n),
  401.                 .iorq_n(iorq_n),
  402.                 .m1_n  (m1_n  ),
  403.                 .rfsh_n(rfsh_n),
  404.  
  405.                 .modes_raster     (modes_raster     ),
  406.                 .mode_contend_type(mode_contend_type),
  407.                 .mode_contend_ena (mode_contend_ena ),
  408.                 .mode_7ffd_bits   (p7ffd[2:0]       ),
  409.                 .contend          (contend          ),
  410.  
  411.                 .zclk_out(clkz_out),
  412.  
  413.                 .zpos(zpos),
  414.                 .zneg(zneg),
  415.  
  416.  
  417.                 .pre_cend(pre_cend),
  418.                 .cbeg    (cbeg    ),
  419.  
  420.                 .zclk_stall( cpu_stall | (|zclk_stall) ),
  421.                 .turbo     ( {atm_turbo,~(peff7[4])}   ),
  422.                 .int_turbo (int_turbo                  ),
  423.                
  424.                 .external_port(external_port)
  425.         );
  426.  
  427.  
  428.  
  429.         wire [7:0] dout_ram;
  430.         wire ena_ram;
  431.         wire [7:0] dout_ports;
  432.         wire ena_ports;
  433.  
  434.  
  435.         wire [3:0] border;
  436.  
  437.         wire drive_ff;
  438.         wire drive_00;
  439.  
  440.  
  441.         wire       atm_palwr;
  442.         wire [5:0] atm_paldata;
  443.         wire [5:0] atm_paldatalow;
  444.         wire pal444_ena;
  445.  
  446.         wire [7:0] fontrom_readback;
  447.  
  448.  
  449.  
  450.  
  451.         wire vbl_start;
  452.  
  453.  
  454.  
  455.         // data bus out: either RAM data or internal ports data or 0xFF with unused ports
  456. //      assign d = ena_ram ? dout_ram : ( ena_ports ? dout_ports : ( (drive_ff|drive_00) ? {8{drive_ff}} : 8'bZZZZZZZZ ) );
  457.  
  458.         wire [7:0] d_pre_out;
  459.         wire d_ena;
  460.  
  461.         assign d_pre_out = ({8{ena_ram&(~drive_00)}} & dout_ram) | ({8{ena_ports}} & dout_ports) | {8{drive_ff}} ;
  462.         assign d_ena = (ena_ram|ena_ports|drive_ff|drive_00);
  463.         //
  464.         assign d = d_ena ? d_pre_out : 8'bZZZZ_ZZZZ;
  465.         //
  466.         assign csrom = csrom_int && !drive_00;
  467.  
  468.  
  469.         zbus zxbus( .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .m1_n(m1_n),
  470.                     .iorq1_n(iorq1_n), .iorq2_n(iorq2_n), .iorqge1(iorqge1), .iorqge2(iorqge2),
  471.                     .porthit(porthit), .drive_ff(drive_ff) );
  472.  
  473.  
  474.  
  475.  
  476.         /////////////////////////////////////
  477.         // ATM memory pagers instantiation //
  478.         /////////////////////////////////////
  479.  
  480.         wire pager_off;
  481.  
  482.         wire        pent1m_ROM;
  483.         wire [ 5:0] pent1m_page;
  484.         wire        pent1m_ram0_0;
  485.         wire        pent1m_1m_on;
  486.  
  487.         wire atmF7_wr_fclk;
  488.  
  489.         wire [3:0] dos_turn_off,
  490.                    dos_turn_on;
  491.  
  492.         wire [ 7:0] page [0:3];
  493.         wire [ 3:0] romnram;
  494.         wire [ 3:0] wrdisable;
  495.  
  496.         // for reading back data via xxBE port
  497.         wire [ 7:0] rd_pages [0:7];
  498.         wire [ 7:0] rd_ramnrom;
  499.         wire [ 7:0] rd_dos7ffd;
  500.         wire [ 7:0] rd_wrdisables;
  501.  
  502.         generate
  503.  
  504.                 genvar i;
  505.  
  506.                 for(i=0;i<4;i=i+1)
  507.                 begin : instantiate_atm_pagers
  508.                         atm_pager #( .ADDR(i) ) atm_pager
  509.                         (
  510.                                 .rst_n(rst_n),
  511.                                 .fclk (fclk),
  512.                                 .zpos (zpos),
  513.                                 .zneg (zneg),
  514.                                
  515.                                 .za(a),
  516.                                 .zd(d),
  517.                                 .mreq_n(mreq_n),
  518.                                 .rd_n  (rd_n),
  519.                                 .m1_n  (m1_n),
  520.                                
  521.                                 .pager_off(pager_off),
  522.                                
  523.                                 .pent1m_ROM   (pent1m_ROM),
  524.                                 .pent1m_page  (pent1m_page),
  525.                                 .pent1m_ram0_0(pent1m_ram0_0),
  526.                                 .pent1m_1m_on (pent1m_1m_on),
  527.                                
  528.                                
  529.                                 .in_nmi   (in_nmi   ),
  530.                                 .in_trdemu(in_trdemu),
  531.                                
  532.                                 .trdemu_wr_disable(trdemu_wr_disable),
  533.                                
  534.                                 .atmF7_wr(atmF7_wr_fclk),
  535.                                
  536.                                 .dos(dos),
  537.                                
  538.                                 .dos_turn_on (dos_turn_on[i]),
  539.                                 .dos_turn_off(dos_turn_off[i]),
  540.                                
  541.                                 .zclk_stall(zclk_stall[i]),
  542.                                
  543.                                 .page     (page[i]     ),
  544.                                 .romnram  (romnram[i]  ),
  545.                                 .wrdisable(wrdisable[i]),
  546.                                
  547.                                 .rd_page0  (rd_pages[i  ]),
  548.                                 .rd_page1  (rd_pages[i+4]),
  549.                                
  550.                                 .rd_ramnrom   ( {rd_ramnrom   [i+4], rd_ramnrom   [i]} ),
  551.                                 .rd_dos7ffd   ( {rd_dos7ffd   [i+4], rd_dos7ffd   [i]} ),
  552.                                 .rd_wrdisables( {rd_wrdisables[i+4], rd_wrdisables[i]} )
  553.                         );
  554.  
  555.                 end
  556.  
  557.         endgenerate
  558.  
  559.  
  560.         ///////////////////////////
  561.         // DOS signal controller //
  562.         ///////////////////////////
  563.  
  564.         zdos zdos( .rst_n(rst_n),
  565.  
  566.                    .fclk(fclk),
  567.  
  568.                    .dos_turn_on ( |dos_turn_on  ),
  569.                    .dos_turn_off( |dos_turn_off ),
  570.  
  571.                    .cpm_n(cpm_n),
  572.                    .atm_pen2(atm_pen2),
  573.  
  574.                    .dos(dos),
  575.  
  576.                    .zpos(zpos),
  577.                    .m1_n(m1_n),
  578.  
  579.  
  580.                    .trdemu_wr_disable(trdemu_wr_disable),
  581.  
  582.                    .in_trdemu   (in_trdemu   ),
  583.                    .in_nmi      (in_nmi      ),
  584.                    .clr_nmi     (clr_nmi     ),
  585.                    .vg_rdwr_fclk(vg_rdwr_fclk),
  586.                    .fdd_mask    (fdd_mask    ),
  587.                    .vg_a        (vg_ddrv     ),
  588.                    .romnram     (romnram[0]  )
  589.                  );
  590.  
  591.  
  592.  
  593.  
  594.         ///////////////////////////
  595.         // Z80 memory controller //
  596.         ///////////////////////////
  597.  
  598.         zmem z80mem
  599.         (
  600.                 .fclk (fclk ),
  601.                 .rst_n(rst_n),
  602.                
  603.                 .zpos(zpos),
  604.                 .zneg(zneg),
  605.  
  606.                 .cbeg     (cbeg     ),
  607.                 .post_cbeg(post_cbeg),
  608.                 .pre_cend (pre_cend ),
  609.                 .cend     (cend     ),
  610.                
  611.                 .za    (a       ),
  612.                 .zd_in (d       ),
  613.                 .zd_out(dout_ram),
  614.                 .zd_ena(ena_ram ),
  615.                 .m1_n  (m1_n    ),
  616.                 .rfsh_n(rfsh_n  ),
  617.                 .iorq_n(iorq_n  ),
  618.                 .mreq_n(mreq_n  ),
  619.                 .rd_n  (rd_n    ),
  620.                 .wr_n  (wr_n    ),
  621.  
  622.                 .win0_romnram(romnram[0]),
  623.                 .win1_romnram(romnram[1]),
  624.                 .win2_romnram(romnram[2]),
  625.                 .win3_romnram(romnram[3]),
  626.  
  627.                 .win0_page(page[0]),
  628.                 .win1_page(page[1]),
  629.                 .win2_page(page[2]),
  630.                 .win3_page(page[3]),
  631.  
  632.                 .win0_wrdisable(wrdisable[0]),
  633.                 .win1_wrdisable(wrdisable[1]),
  634.                 .win2_wrdisable(wrdisable[2]),
  635.                 .win3_wrdisable(wrdisable[3]),
  636.  
  637.                 .romrw_en(romrw_en),
  638.  
  639.                 .rompg  (rompg  ),
  640.                 .romoe_n(romoe_n),
  641.                 .romwe_n(romwe_n),
  642.                 .csrom  (csrom_int),
  643.  
  644.                 .cpu_req   (cpu_req   ),
  645.                 .cpu_rnw   (cpu_rnw   ),
  646.                 .cpu_wrbsel(cpu_wrbsel),
  647.                 .cpu_strobe(cpu_strobe),
  648.                 .cpu_addr  (cpu_addr  ),
  649.                 .cpu_wrdata(cpu_wrdata),
  650.                 .cpu_rddata(cpu_rddata),
  651.                 .cpu_stall (cpu_stall ),
  652.                 .cpu_next  (cpu_next  ),
  653.  
  654.                 .int_turbo(int_turbo),
  655.                 .nmi_buf_clr(nmi_buf_clr)
  656.         );
  657.  
  658.  
  659.  
  660.  
  661.         wire [20:0] daddr;
  662.         wire dreq;
  663.         wire drnw;
  664.         wire [15:0] drddata;
  665.         wire [15:0] dwrdata;
  666.         wire [1:0] dbsel;
  667.  
  668.  
  669.  
  670.  
  671.         dram dram( .clk(fclk),
  672.                    .rst_n(rst_n),
  673.  
  674.                    .addr(daddr),
  675.                    .req(dreq),
  676.                    .rnw(drnw),
  677.                    .cbeg(cbeg),
  678.                    .rrdy(drrdy),
  679.                    .rddata(drddata),
  680.                    .wrdata(dwrdata),
  681.                    .bsel(dbsel),
  682.  
  683.                    .ra(ra),
  684.                    .rd(rd),
  685.                    .rwe_n(rwe_n),
  686.                    .rucas_n(rucas_n),
  687.                    .rlcas_n(rlcas_n),
  688.                    .rras0_n(rras0_n),
  689.                    .rras1_n(rras1_n)
  690.                  );
  691.  
  692.  
  693.         wire [1:0] bw;
  694.  
  695.         wire [20:0] video_addr;
  696.         wire [15:0] video_data;
  697.         wire video_strobe;
  698.         wire video_next;
  699.  
  700.         arbiter dramarb( .clk(fclk),
  701.                          .rst_n(rst_n),
  702.  
  703.                          .dram_addr(daddr),
  704.                          .dram_req(dreq),
  705.                          .dram_rnw(drnw),
  706.                          .dram_cbeg(cbeg),
  707.                          .dram_rrdy(drrdy),
  708.                          .dram_bsel(dbsel),
  709.                          .dram_rddata(drddata),
  710.                          .dram_wrdata(dwrdata),
  711.  
  712.                          .post_cbeg(post_cbeg),
  713.                          .pre_cend (pre_cend ),
  714.                          .cend     (cend     ),
  715.  
  716.                          .go(go),
  717.                          .bw(bw),
  718.  
  719.                          .video_addr(video_addr),
  720.                          .video_data(video_data),
  721.                          .video_strobe(video_strobe),
  722.                          .video_next(video_next),
  723.  
  724.                          //.cpu_waitcyc(cpu_waitcyc),
  725.                          .cpu_next (cpu_next),
  726.                          .cpu_req(cpu_req),
  727.                          .cpu_rnw(cpu_rnw),
  728.                          .cpu_addr(cpu_addr),
  729.                          .cpu_wrbsel(cpu_wrbsel),
  730.                          .cpu_wrdata(cpu_wrdata),
  731.                          .cpu_rddata(cpu_rddata),
  732.                          .cpu_strobe(cpu_strobe) );
  733.  
  734.         video_top video_top
  735.         (
  736.                 .clk(fclk),
  737.  
  738.                 .vred(vred),
  739.                 .vgrn(vgrn),
  740.                 .vblu(vblu),
  741.                 .vhsync(vhsync),
  742.                 .vvsync(vvsync),
  743.                 .vcsync(vcsync),
  744.  
  745.                 .zxborder(border),
  746.  
  747.                 .pent_vmode( {peff7[0],peff7[5]} ),
  748.                 .atm_vmode (atm_scr_mode),
  749.  
  750.                 .scr_page(p7ffd[3]),
  751.  
  752.                 .vga_on(cfg_vga_on),
  753.  
  754.                 .modes_raster     (modes_raster     ),
  755.                 .mode_contend_type(mode_contend_type),
  756.                
  757.                 .contend(contend),
  758.  
  759.                 .cbeg     (cbeg     ),
  760.                 .post_cbeg(post_cbeg),
  761.                 .pre_cend (pre_cend ),
  762.                 .cend     (cend     ),
  763.  
  764.                 .video_go    (go          ),
  765.                 .video_bw    (bw          ),
  766.                 .video_addr  (video_addr  ),
  767.                 .video_data  (video_data  ),
  768.                 .video_strobe(video_strobe),
  769.                 .video_next  (video_next  ),
  770.  
  771.                 .atm_palwr  (atm_palwr  ),
  772.                 .atm_paldata(atm_paldata),
  773.                 .atm_paldatalow(atm_paldatalow),
  774.                 .pal444_ena(pal444_ena),
  775.                
  776.                 .up_ena    (up_ena    ),
  777.                 .up_paladdr(up_paladdr),
  778.                 .up_paldata(up_paldata),
  779.                 .up_palwr  (up_palwr  ),
  780.  
  781.                 .vbl_start(vbl_start),
  782.  
  783.                 .fnt_a (a[10:0]),
  784.                 .fnt_d (d      ),
  785.                 .fnt_wr(fnt_wr ),
  786.  
  787.                 .palcolor(palcolor),
  788.  
  789.                 .fontrom_readback(fontrom_readback)
  790.         );
  791.  
  792.  
  793.         slavespi slavespi(
  794.                 .fclk(fclk), .rst_n(rst_n),
  795.  
  796.                 .spics_n(spics_n), .spidi(spidi),
  797.                 .spido(spido), .spick(spick),
  798.                 .status_in({/* wait_rnw */ wr_n, waits[6:0]}), .genrst(genrst),
  799.                 .kbd_out(kbd_data),
  800.                 .kbd_stb(kbd_stb), .mus_out(mus_data),
  801.                 .mus_xstb(mus_xstb), .mus_ystb(mus_ystb),
  802.                 .mus_btnstb(mus_btnstb), .kj_stb(kj_stb),
  803.                 .gluclock_addr(gluclock_addr),
  804.                 .comport_addr (comport_addr),
  805.                 .wait_write(wait_write),
  806.                 .wait_read(wait_read),
  807.                 .wait_rnw(wait_rnw),
  808.                 .wait_end(wait_end),
  809.                 .config0( {not_used0[7:6], modes_raster, beeper_mux, tape_read, set_nmi[0], cfg_vga_on} ),
  810.  
  811.                 .sd_lock_out(avr_lock_claim),
  812.                 .sd_lock_in (avr_lock_grant),
  813.                 .sd_cs_n    (avr_sdcs_n    ),
  814.                 .sd_start   (avr_sd_start  ),
  815.                 .sd_datain  (avr_sd_datain ),
  816.                 .sd_dataout (avr_sd_dataout)
  817.         );
  818.  
  819.         zkbdmus zkbdmus( .fclk(fclk), .rst_n(rst_n),
  820.                          .kbd_in(kbd_data), .kbd_stb(kbd_stb),
  821.                          .mus_in(mus_data), .mus_xstb(mus_xstb),
  822.                          .mus_ystb(mus_ystb), .mus_btnstb(mus_btnstb),
  823.                          .kj_stb(kj_stb), .kj_data(kj_port_data),
  824.                          .zah(a[15:8]), .kbd_data(kbd_port_data),
  825.                          .mus_data(mus_port_data)
  826.                        );
  827.  
  828.  
  829.         zports zports( .zclk(zclk), .fclk(fclk), .rst_n(rst_n), .zpos(zpos), .zneg(zneg),
  830.                        .din(d), .dout(dout_ports), .dataout(ena_ports),
  831.                        .a(a), .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .porthit(porthit),
  832.                        .ay_bdir(ay_bdir), .ay_bc1(ay_bc1), .border(border),
  833.                        .p7ffd(p7ffd), .peff7(peff7), .mreq_n(mreq_n), .m1_n(m1_n), .dos(dos),
  834.  
  835.                        .vg_cs_n     (vg_cs_n     ),
  836.                        .vg_intrq    (intrq       ),
  837.                        .vg_drq      (drq         ),
  838.                        .vg_wrFF_fclk(vg_wrFF_fclk),
  839.                        .vg_rdwr_fclk(vg_rdwr_fclk),
  840.                        .vg_a        (vg_ddrv     ),
  841.                        .vg_res_n    (vg_res_n    ),
  842.                        .vg_hrdy     (vg_hrdy     ),
  843.                        .vg_side     (vg_side     ),
  844.  
  845.                        .idein(idein), .ideout(ideout), .idedataout(idedataout),
  846.                        .ide_a(ide_a), .ide_cs0_n(ide_cs0_n), .ide_cs1_n(ide_cs1_n),
  847.                        .ide_wr_n(ide_wr_n), .ide_rd_n(ide_rd_n),
  848.  
  849.                        .sd_cs_n_val(zx_sdcs_n_val),
  850.                        .sd_cs_n_stb(zx_sdcs_n_stb),
  851.                        .sd_start   (zx_sd_start  ),
  852.                        .sd_datain  (zx_sd_datain ),
  853.                        .sd_dataout (zx_sd_dataout),
  854.  
  855.                        .keys_in(kbd_port_data),
  856.                        .mus_in (mus_port_data),
  857.                        .kj_in  (kj_port_data ),
  858.  
  859.                        .tape_read(tape_read),
  860.  
  861.                        .gluclock_addr(gluclock_addr),
  862.                        .comport_addr (comport_addr ),
  863.                        .wait_start_gluclock(wait_start_gluclock),
  864.                        .wait_start_comport (wait_start_comport ),
  865.                        .wait_rnw  (wait_rnw  ),
  866.                        .wait_write(wait_write),
  867.                        .wait_read (wait_read ),
  868.                
  869.                 .atmF7_wr_fclk(atmF7_wr_fclk),
  870.  
  871.                 .atm_scr_mode(atm_scr_mode),
  872.                 .atm_turbo   (atm_turbo),
  873.                 .atm_pen     (pager_off),
  874.                 .atm_cpm_n   (cpm_n),
  875.                 .atm_pen2    (atm_pen2),
  876.  
  877.                 .romrw_en(romrw_en),
  878.  
  879.                 .pent1m_ram0_0(pent1m_ram0_0),
  880.                 .pent1m_1m_on (pent1m_1m_on),
  881.                 .pent1m_page  (pent1m_page),
  882.                 .pent1m_ROM   (pent1m_ROM),
  883.  
  884.                 .atm_palwr  (atm_palwr  ),
  885.                 .atm_paldata(atm_paldata),
  886.                 .atm_paldatalow(atm_paldatalow),
  887.                 .pal444_ena(pal444_ena),
  888.  
  889.                 .beeper_wr(beeper_wr),
  890.                 .covox_wr (covox_wr ),
  891.  
  892.                 .fnt_wr(fnt_wr),
  893.                 .clr_nmi(clr_nmi),
  894.  
  895.  
  896.                 .pages(~{ rd_pages[7], rd_pages[6],
  897.                           rd_pages[5], rd_pages[4],
  898.                           rd_pages[3], rd_pages[2],
  899.                           rd_pages[1], rd_pages[0] }),
  900.  
  901.                 .ramnroms  ( rd_ramnrom    ),
  902.                 .dos7ffds  ( rd_dos7ffd    ),
  903.                 .wrdisables( rd_wrdisables ),
  904.  
  905.                 .palcolor(palcolor),
  906.                 .fontrom_readback(fontrom_readback),
  907.        
  908.                 .up_ena    (up_ena    ),
  909.                 .up_paladdr(up_paladdr),
  910.                 .up_paldata(up_paldata),
  911.                 .up_palwr  (up_palwr  ),
  912.  
  913.                 .external_port(external_port),
  914.  
  915.                 .set_nmi(set_nmi[1]),
  916.  
  917.                 .brk_ena (brk_ena ),
  918.                 .brk_addr(brk_addr),
  919.  
  920.                 .fdd_mask(fdd_mask),
  921.  
  922.                 .irq_enh         (irq_enh        ),
  923.                 .irq_ena_int_vec (irq_ena_int_vec),
  924.                 .irq_ena_ext_vec (irq_ena_ext_vec),
  925.                 .irq_int_autoclr (irq_int_autoclr),
  926.                 .irq_stat_rd     (irq_stat),
  927.                 .irq_stat_setnrst(irq_stat_setnrst),
  928.                 .irq_stat_wr_sel (irq_stat_wr_sel ),
  929.                 .irq_stat_wr_stb (irq_stat_wr_stb ),
  930.                 .irq_ena_rd      (irq_ena),
  931.                 .irq_ena_setnrst (irq_ena_setnrst),
  932.                 .irq_ena_wr_sel  (irq_ena_wr_sel ),
  933.                 .irq_ena_wr_stb  (irq_ena_wr_stb )
  934.         );
  935.  
  936.  
  937.         zint zint(
  938.                 .fclk(fclk),
  939.                 .zpos(zpos),
  940.                 .zneg(zneg),
  941.  
  942.                 .vbl_start(vbl_start),
  943.  
  944.                 .iorq_n(iorq_n),
  945.                 .m1_n  (m1_n  ),
  946.  
  947.                 .wait_n(spiint_n), // spiint_n is 1-0 signal, wait_n is Z-0
  948.  
  949.                 .int_n(int_n)
  950.  
  951.                 .irq_enh         (irq_enh        ),
  952.                 .irq_ena_int_vec (irq_ena_int_vec),
  953.                 .irq_ena_ext_vec (irq_ena_ext_vec),
  954.                 .irq_int_autoclr (irq_int_autoclr),
  955.                 .irq_stat        (irq_stat),
  956.                 .irq_stat_setnrst(irq_stat_setnrst),
  957.                 .irq_stat_wr_sel (irq_stat_wr_sel ),
  958.                 .irq_stat_wr_stb (irq_stat_wr_stb ),
  959.                 .irq_ena         (irq_ena),
  960.                 .irq_ena_setnrst (irq_ena_setnrst),
  961.                 .irq_ena_wr_sel  (irq_ena_wr_sel ),
  962.                 .irq_ena_wr_stb  (irq_ena_wr_stb )
  963.         );
  964.  
  965.         znmi znmi
  966.         (
  967.                 .rst_n(rst_n),
  968.                 .fclk(fclk),
  969.                 .zpos(zpos),
  970.                 .zneg(zneg),
  971.  
  972.                 .rfsh_n(rfsh_n),
  973.                 .m1_n  (m1_n  ),
  974.                 .mreq_n(mreq_n),
  975.                 .csrom (csrom ),
  976.                 .a     (a     ),
  977.  
  978.                 .vbl_start(vbl_start),
  979.  
  980.                 .set_nmi(set_nmi),
  981.                 .imm_nmi(imm_nmi),
  982.                 .clr_nmi(clr_nmi),
  983.  
  984.                 .drive_00(drive_00),
  985.  
  986.                 .in_nmi (in_nmi ),
  987.                 .gen_nmi(gen_nmi),
  988.                 .nmi_buf_clr(nmi_buf_clr)
  989.         );
  990.  
  991.  
  992.         zbreak zbreak
  993.         (
  994.                 .rst_n(rst_n),
  995.                 .fclk(fclk),
  996.                 .zpos(zpos),
  997.                 .zneg(zneg),
  998.  
  999.                 .m1_n  (m1_n  ),
  1000.                 .mreq_n(mreq_n),
  1001.                 .a     (a     ),
  1002.  
  1003.                 .imm_nmi(imm_nmi),
  1004.  
  1005.                 .brk_ena (brk_ena ),
  1006.                 .brk_addr(brk_addr)
  1007.         );
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.         zwait zwait( .wait_start_gluclock(wait_start_gluclock),
  1015.                      .wait_start_comport (wait_start_comport),
  1016.                      .wait_end(wait_end),
  1017.                      .rst_n(rst_n),
  1018.                      .wait_n(wait_n),
  1019.                      .waits(waits),
  1020.                      .spiint_n(spiint_n) );
  1021.  
  1022.  
  1023.  
  1024.  
  1025.         assign vg_a[0] = vg_ddrv[0] ? 1'b1 : 1'b0; // possibly open drain?
  1026.         assign vg_a[1] = vg_ddrv[1] ? 1'b1 : 1'b0;
  1027.  
  1028.         vg93 vgshka( .zclk(zclk), .rst_n(rst_n), .fclk(fclk), .vg_clk(vg_clk),
  1029.                      .vg_res_n(vg_res_n), .din(d), .intrq(intrq), .drq(drq), .vg_wrFF_fclk(vg_wrFF_fclk),
  1030.                      .vg_hrdy(vg_hrdy), .vg_rclk(vg_rclk), .vg_rawr(vg_rawr), .vg_a(vg_ddrv),
  1031.                      .vg_wrd(vg_wrd), .vg_side(vg_side), .step(step), .vg_sl(vg_sl), .vg_sr(vg_sr),
  1032.                      .vg_tr43(vg_tr43), .rdat_n(rdat_b_n), .vg_wf_de(vg_wf_de), .vg_drq(vg_drq),
  1033.                      .vg_irq(vg_irq), .vg_wd(vg_wd) );
  1034.  
  1035.  
  1036.  
  1037.  
  1038. //      spi2 zspi( .clock(fclk), .sck(sdclk), .sdo(sddo), .sdi(sddi), .start(sd_start),
  1039. //                 .speed(2'b00), .din(sd_datain), .dout(sd_dataout) );
  1040.         spihub spihub(
  1041.  
  1042.                 .fclk (fclk ),
  1043.                 .rst_n(rst_n),
  1044.  
  1045.                 .sdcs_n(sdcs_n),
  1046.                 .sdclk (sdclk ),
  1047.                 .sddo  (sddo  ),
  1048.                 .sddi  (sddi  ),
  1049.  
  1050.                 .zx_sdcs_n_val(zx_sdcs_n_val),
  1051.                 .zx_sdcs_n_stb(zx_sdcs_n_stb),
  1052.                 .zx_sd_start  (zx_sd_start  ),
  1053.                 .zx_sd_datain (zx_sd_datain ),
  1054.                 .zx_sd_dataout(zx_sd_dataout),
  1055.  
  1056.                 .avr_lock_in   (avr_lock_claim),
  1057.                 .avr_lock_out  (avr_lock_grant),
  1058.                 .avr_sdcs_n    (avr_sdcs_n    ),
  1059.                 .avr_sd_start  (avr_sd_start  ),
  1060.                 .avr_sd_datain (avr_sd_datain ),
  1061.                 .avr_sd_dataout(avr_sd_dataout)
  1062.  
  1063.  
  1064.         );
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070.           //////////////////////////////////////
  1071.          // sound: beeper, tapeout and covox //
  1072.         //////////////////////////////////////
  1073.  
  1074.         sound sound(
  1075.  
  1076.                 .clk(fclk),
  1077.  
  1078.                 .din(d),
  1079.  
  1080.                 .beeper_wr(beeper_wr),
  1081.                 .covox_wr (covox_wr ),
  1082.  
  1083.                 .beeper_mux(beeper_mux),
  1084.  
  1085.                 .sound_bit(beep)
  1086.         );
  1087.  
  1088.  
  1089. endmodule
  1090.  
  1091.