Subversion Repositories pentevo

Rev

Rev 411 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. module main(
  2.  
  3.  // clocks
  4.  input fclk,
  5.  output clkz_out,
  6.  input clkz_in,
  7.  
  8.  // z80
  9.  input iorq_n,
  10.  input mreq_n,
  11.  input rd_n,
  12.  input wr_n,
  13.  input m1_n,
  14.  input rfsh_n,
  15.  input int_n,
  16.  input nmi_n,
  17.  input wait_n,
  18.  output res,
  19.  
  20.  inout [7:0] d,
  21.  output [15:0] a,
  22.  
  23.  // zxbus and related
  24.  output csrom,
  25.  output romoe_n,
  26.  output romwe_n,
  27.  
  28.  output rompg0_n,
  29.  output dos_n, // aka rompg1
  30.  output rompg2,
  31.  output rompg3,
  32.  output rompg4,
  33.  
  34.  input iorqge1,
  35.  input iorqge2,
  36.  output iorq1_n,
  37.  output iorq2_n,
  38.  
  39.  // DRAM
  40.  inout [15:0] rd,
  41.  output [9:0] ra,
  42.  output rwe_n,
  43.  output rucas_n,
  44.  output rlcas_n,
  45.  output rras0_n,
  46.  output rras1_n,
  47.  
  48.  // video
  49.  output [1:0] vred,
  50.  output [1:0] vgrn,
  51.  output [1:0] vblu,
  52.  
  53.  output vhsync,
  54.  output vvsync,
  55.  output vcsync,
  56.  
  57.  // AY control and audio/tape
  58.  input ay_clk,
  59.  output ay_bdir,
  60.  output ay_bc1,
  61.  
  62.  output reg beep,
  63.  
  64.  // IDE
  65.  input [2:0] ide_a,
  66.  input [15:0] ide_d,
  67.  
  68.  output ide_dir,
  69.  
  70.  input ide_rdy,
  71.  
  72.  output ide_cs0_n,
  73.  output ide_cs1_n,
  74.  output ide_rs_n,
  75.  output ide_rd_n,
  76.  output ide_wr_n,
  77.  
  78.  // VG93 and diskdrive
  79.  output reg vg_clk,
  80.  
  81.  output vg_cs_n,
  82.  output vg_res_n,
  83.  
  84.  input vg_hrdy,
  85.  input vg_rclk,
  86.  input vg_rawr,
  87.  input [1:0] vg_a, // disk drive selection
  88.  input vg_wrd,
  89.  input vg_side,
  90.  
  91.  input step,
  92.  input vg_sl,
  93.  input vg_sr,
  94.  input vg_tr43,
  95.  input rdat_b_n,
  96.  input vg_wf_de,
  97.  input vg_drq,
  98.  input vg_irq,
  99.  input vg_wd,
  100.  
  101.  // serial links (atmega-fpga, sdcard)
  102.  output sdcs_n,
  103.  output sddo,
  104.  output sdclk,
  105.  input sddi,
  106.  
  107.  input spics_n,
  108.  input spick,
  109.  input spido,
  110.  output spidi,
  111.  output reg spiint_n
  112.  
  113. );
  114.  
  115. //--Dummy----------------------------------------------------------------------
  116.  
  117.  assign iorq1_n   = 1'b1;
  118.  assign iorq2_n   = 1'b1;
  119.  
  120.  assign res       = 1'b1;
  121.  
  122.  assign ay_bdir   = 1'b0;
  123.  assign ay_bc1    = 1'b0;
  124.  
  125.  assign vg_cs_n   = 1'b1;
  126.  assign vg_res_n  = 1'b0;
  127.  
  128.  assign ide_dir   = 1'b1;
  129.  assign ide_rs_n  = 1'b0;
  130.  assign ide_cs0_n = 1'b1;
  131.  assign ide_cs1_n = 1'b1;
  132.  assign ide_rd_n  = 1'b1;
  133.  assign ide_wr_n  = 1'b1;
  134.  
  135.  assign a[15:14]  = 2'b00;
  136.  
  137. //--INT---------------------------------------------------------------------------
  138.  
  139.  reg enable_covox_int;  initial enable_covox_int = 1'b0;
  140.  reg enable_frame_int;  initial enable_frame_int = 1'b0;
  141.  
  142.  always @(posedge fclk)
  143.   begin
  144.    if ( enable_covox_int )
  145.     spiint_n <= cvx_ptr_diff[3]|main_osc[7];
  146.    else if ( enable_frame_int )
  147.     spiint_n <= vtxtscr;
  148.    else
  149.     spiint_n <= 1'b1;
  150.   end
  151.  
  152. //--clocks--Z80_clk--VG_clk--COVOX---------------------------------------------
  153.  
  154.  reg [9:0] main_osc;
  155.  reg [2:0] vgclk_div7;
  156.  reg [7:0] covox [15:0];        initial covox[0] = 8'h7f;
  157.  reg [8:0] qe;                  initial qe = 9'h0ff;
  158.  reg [3:0] cvx_ptr_out;         initial cvx_ptr_out = 4'd0;
  159.  reg [3:0] cvx_ptr_in;          initial cvx_ptr_in  = 4'd0;
  160.  wire [3:0] cvx_ptr_iinc;
  161.  wire [3:0] cvx_ptr_diff;
  162.  assign cvx_ptr_iinc = cvx_ptr_in + 4'd1;
  163.  assign cvx_ptr_diff = cvx_ptr_in - cvx_ptr_out;
  164.  
  165.  always @(posedge fclk)
  166.   begin
  167.    //
  168.    if ( { 1'b1, covox[cvx_ptr_out] } >= qe )
  169.     begin
  170.      beep <= 1'b1;
  171.      qe <= 9'h1ff - { 1'b1, covox[cvx_ptr_out] } + qe;
  172.     end
  173.    else
  174.     begin
  175.      beep <= 1'b0;
  176.      qe <= 9'h000 - { 1'b1, covox[cvx_ptr_out] } + qe;
  177.     end
  178.    //
  179.    if ( main_osc[7:0] == 8'hff )
  180.     begin
  181.      if ( cvx_ptr_in !== cvx_ptr_out )
  182.       cvx_ptr_out <= cvx_ptr_out + 4'd1;
  183.     end
  184.    //
  185.    if ( main_osc[1:0]==2'b00 )
  186.    begin
  187.     if ( vgclk_div7[2:1] == 2'b11 )
  188.      begin
  189.       vgclk_div7 <= 3'd0;
  190.       vg_clk <= ~vg_clk;
  191.      end
  192.     else
  193.      vgclk_div7 <= vgclk_div7 + 3'd1;
  194.    end
  195.    //
  196.    main_osc <= main_osc + 10'd1;
  197.    //
  198.   end
  199.  
  200.  assign clkz_out = main_osc[2]; // 3.5 MHz
  201.  
  202. //--Video----------------------------------------------------------------------
  203. // character image - 6x8
  204. // character size  - 6x10
  205. // col x row       - 53x25 (318x250)
  206. // fullscreen test - 360x288
  207.  
  208.  localparam HTXTS_END   = 9'd416;
  209.  localparam CSYNC_CUT   = 9'd415;
  210.  localparam CSYNC_CUT2  = 9'd394; // 9'd395;            // 9'd382;
  211.  localparam HSYNC_BEG   = 9'd0;
  212.  localparam HSYNC_BEG2  = 9'd447;
  213.  localparam HSYNC_END   = 9'd33;
  214.  localparam HSYNC_END2  = 9'd52; // 9'd53;
  215.  localparam HTXTS_BEG   = 9'd98;
  216.  localparam HMAX        = 9'd447;
  217.  
  218.  localparam VTXTS_END   = 9'd293;
  219.  localparam VSYNC_BEG   = 9'd0;
  220.  localparam VSYNC_END   = 9'd2;
  221.  localparam VTXTS_BEG   = 9'd43;
  222.  localparam VMAX        = 9'd319;
  223.  
  224.  localparam HBORD_BEG   = 9'd77;
  225.  localparam HBORD_END   = 9'd437;
  226.  localparam VBORD_BEG   = 9'd24;
  227.  localparam VBORD_END   = 9'd312;
  228.  
  229.  //                          GgRrBb
  230.  localparam BLACK       = 6'b000000;
  231.  localparam GRAY_1      = 6'b010101;
  232.  localparam GRAY_2      = 6'b101010;
  233.  localparam WHITE       = 6'b111111;
  234.  
  235.  localparam BLUE_3      = 6'b000011;
  236.  localparam RED_3       = 6'b001100;
  237.  localparam MAGENTA_3   = 6'b001111;
  238.  localparam GREEN_3     = 6'b110000;
  239.  localparam CYAN_3      = 6'b110011;
  240.  localparam YELLOW_3    = 6'b111100;
  241.  
  242.  localparam BLUE_2      = 6'b000010;
  243.  localparam RED_2       = 6'b001000;
  244.  localparam MAGENTA_2   = 6'b001010;
  245.  localparam GREEN_2     = 6'b100000;
  246.  localparam CYAN_2      = 6'b100010;
  247.  localparam YELLOW_2    = 6'b101000;
  248.  
  249.  localparam BLUE_H      = 6'b010110;
  250.  localparam RED_H       = 6'b011001;
  251.  localparam MAGENTA_H   = 6'b011010;
  252.  localparam GREEN_H     = 6'b100101;
  253.  localparam CYAN_H      = 6'b100110;
  254.  localparam YELLOW_H    = 6'b101001;
  255.  
  256.  reg [8:0] hcount;      initial hcount = 9'd0;
  257.  reg [2:0] pixptr;
  258.  reg [8:0] vcount;      initial vcount = 9'd0;
  259.  reg [5:0] hcharcount;
  260.  wire [2:0] vcharline;
  261.  reg [10:0] voffset;
  262.  reg [3:0] vcharlinecount;
  263.  reg hsync;             initial hsync = 1'b1;
  264.  reg htxtscr;           initial htxtscr = 1'b0;
  265.  reg vsync;             initial vsync = 1'b1;
  266.  reg vtxtscr;           initial vtxtscr = 1'b0;
  267.  reg csync;             initial csync = 1'b1;
  268.  wire [10:0] video_addr;
  269.  wire [7:0] charcode0, charcode1, charcode2;
  270.  wire [7:0] charcode;
  271.  wire [7:0] attrcode0, attrcode1, attrcode2;
  272.  wire [7:0] attrcode;
  273.  wire [5:0] charpix;
  274.  wire pixel;
  275.  wire [5:0] fcolor, bcolor, image_color;
  276.  reg [5:0] color;
  277.  wire fontenable;
  278.  reg [8:0] hmouse, vmouse;
  279.  wire mouse_here, mouse_i, mouse_image, mouse_m, mouse_mask;
  280.  reg vgaff, nextline;
  281.  reg hbord;             initial hbord = 1'b0;
  282.  reg vbord;             initial vbord = 1'b0;
  283.  reg circle;            initial circle = 1'b0;
  284.  reg uhole;             initial uhole = 1'b0;
  285.  reg hhole;             initial hhole = 1'b0;
  286.  reg vhole;             initial vhole = 1'b0;
  287.  reg [1:0] bcdir;       initial bcdir = 2'b00;
  288.  reg [1:0] scdir;       initial scdir = 2'b00;
  289.  reg [3:0] hsetka, vsetka;
  290.  reg [4:0] hchess, vchess;
  291.  reg [1:0] hchss3;
  292.  reg [2:0] cband;
  293.  reg [6:0] bccount;
  294.  reg [4:0] sccount;
  295.  reg [6:0] schcnt;
  296.  wire [6:0] cb_val;
  297.  wire [4:0] cs_val;
  298.  reg [2:0] clr3;
  299.  
  300.  
  301.  always @(posedge fclk)
  302.   begin
  303.    //
  304.    if ( {(main_osc[1]&scr_tv_mode),main_osc[0]}==2'h0 )
  305.     begin
  306.  
  307.      if ( scr_mode==2'h0 )
  308.       color <= (htxtscr & vtxtscr) ? ( (mouse_image) ? ~image_color : image_color ) : BLACK;
  309.      else if ( hbord & vbord )
  310.       case ( scr_mode )
  311.        3'h2:
  312.              color <= (hchess[0]^vchess[0]) ? WHITE : BLACK;
  313.        3'h3:
  314.              case (vchess)
  315.               5'd0, 5'd19:
  316.                 if (vsetka==5'd14)
  317.                  color <= GRAY_2;
  318.                 else if (hchess[0])
  319.                  color <= WHITE;
  320.                 else
  321.                  color <= BLACK;
  322.               5'd5, 5'd6:
  323.                 case (cband)
  324.                  3'd0: color <= GRAY_2;
  325.                  3'd1: color <= YELLOW_H;
  326.                  3'd2: color <= CYAN_H;
  327.                  3'd3: color <= GREEN_H;
  328.                  3'd4: color <= MAGENTA_H;
  329.                  3'd5: color <= RED_H;
  330.                  3'd6: color <= BLUE_H;
  331.                  3'd7: color <= GRAY_1;
  332.                 endcase
  333.               5'd13, 5'd14:
  334.                 case (cband)
  335.                  3'd0: color <= GRAY_2;
  336.                  3'd1: color <= YELLOW_2;
  337.                  3'd2: color <= CYAN_2;
  338.                  3'd3: color <= GREEN_2;
  339.                  3'd4: color <= MAGENTA_2;
  340.                  3'd5: color <= RED_2;
  341.                  3'd6: color <= BLUE_2;
  342.                  3'd7: color <= BLACK;
  343.                 endcase
  344.               default
  345.                begin
  346.                 if (uhole)
  347.                  begin
  348.                   if (pixel)
  349.                    color <= GRAY_2;
  350.                   else
  351.                    color <= GRAY_1;
  352.                  end
  353.                 else if ( (circle) && !(hhole&vhole) )
  354.                  case (vchess)
  355.                   5'd2, 5'd17:
  356.                     if ( (hchess==5'd2) || (hchess==5'd3) || (hchess==5'd20) || (hchess==5'd21) )
  357.                      begin
  358.                       if (hcount[0])
  359.                        color <= GRAY_2;
  360.                       else
  361.                        color <= GRAY_1;
  362.                      end
  363.                     else
  364.                      color <= GRAY_2;
  365.                   5'd3:
  366.                     if ( (hchess==5'd2)  || ((hchess==5'd3)  && (hsetka!=5'd14))
  367.                       || (hchess==5'd20) || ((hchess==5'd21) && (hsetka!=5'd14)) )
  368.                      begin
  369.                       if (hcount[0]^vcount[0])
  370.                        color <= GRAY_1;
  371.                       else
  372.                        color <= GRAY_2;
  373.                      end
  374.                     else
  375.                      color <= GRAY_2;
  376.                   5'd7:
  377.                     case (cband)
  378.                      //3'd0: color <= WHITE;
  379.                      3'd1: color <= WHITE;
  380.                      3'd2: color <= BLACK;
  381.                      3'd3: color <= GRAY_1;
  382.                      3'd4: color <= GRAY_2;
  383.                      3'd5: color <= WHITE;
  384.                      3'd6: color <= BLACK;
  385.                      //3'd7: color <= BLACK;
  386.                     endcase
  387.                   5'd8:
  388.                     if (hcount[3])
  389.                      color <= MAGENTA_H;
  390.                     else
  391.                      color <= GREEN_H;
  392.                   5'd9, 5'd10:
  393.                     if ( (hcount[8]) ^ (vchess[0]) ^ ( (hchess==5'd4) && (hsetka==4'd14) ) )
  394.                      color <= GRAY_2;
  395.                     else
  396.                      color <= BLACK;
  397.                   5'd11:
  398.                     if (hcount[3])
  399.                      color <= RED_H;
  400.                     else
  401.                      color <= CYAN_H;
  402.                   5'd12:
  403.                     if (hcount[0])
  404.                      color <= GRAY_2;
  405.                     else
  406.                      color <= GRAY_1;
  407.                   5'd15:
  408.                     if ( (hchess[0]) && (schcnt==6'd63) )
  409.                      color <= BLACK;
  410.                     else
  411.                      color <= GRAY_2;
  412.                   5'd16:
  413.                     if ( (hchess==5'd2)  || ((hchess==5'd3) &&(hsetka!=4'd14))
  414.                       || (hchess==5'd20) || ((hchess==5'd21)&&(hsetka!=4'd14)) )
  415.                      begin
  416.                       if (hcount[0]^vcount[0])
  417.                        color <= GRAY_2;
  418.                       else
  419.                        color <= GRAY_1;
  420.                      end
  421.                     else
  422.                      color <= GRAY_2;
  423.                   default:
  424.                    color <= GRAY_2;
  425.                  endcase
  426.                 else
  427.                  color <= ( (hsetka==4'd14) || (vsetka==4'd14) ) ? GRAY_2 : GRAY_1;
  428.                end
  429.              endcase
  430.        3'h4: case (cband)
  431.               3'd0: color <= GRAY_2;
  432.               3'd1: color <= YELLOW_2;
  433.               3'd2: color <= CYAN_2;
  434.               3'd3: color <= GREEN_2;
  435.               3'd4: color <= MAGENTA_2;
  436.               3'd5: color <= RED_2;
  437.               3'd6: color <= BLUE_2;
  438.               3'd7: color <= BLACK;
  439.              endcase
  440.        3'h5: if (vchess[4]==1'b0)
  441.               begin
  442.                if (vchess!=5'd15)
  443.                 case (cband)
  444.                  3'd0: color <= GRAY_2;
  445.                  3'd1: color <= YELLOW_2;
  446.                  3'd2: color <= CYAN_2;
  447.                  3'd3: color <= GREEN_2;
  448.                  3'd4: color <= MAGENTA_2;
  449.                  3'd5: color <= RED_2;
  450.                  3'd6: color <= BLUE_2;
  451.                  3'd7: color <= BLACK;
  452.                 endcase
  453.                else
  454.                 case (cband)
  455.                  3'd0: color <= BLUE_2;
  456.                  3'd1: color <= BLACK;
  457.                  3'd2: color <= MAGENTA_2;
  458.                  3'd3: color <= BLACK;
  459.                  3'd4: color <= CYAN_2;
  460.                  3'd5: color <= BLACK;
  461.                  3'd6: color <= GRAY_2;
  462.                  3'd7: color <= BLACK;
  463.                 endcase
  464.               end
  465.              else
  466.               case (cband)
  467.                3'd0: color <= WHITE;
  468.                3'd1: color <= YELLOW_2;
  469.                3'd2: color <= CYAN_2;
  470.                3'd3: color <= GREEN_2;
  471.                3'd4: color <= MAGENTA_2;
  472.                3'd5: color <= RED_2;
  473.                3'd6: color <= BLUE_2;
  474.                3'd7: color <= BLACK;
  475.               endcase
  476.        3'h6: begin
  477.               if ( (vcount[2:0]==3'd4) || (hcount[2:0]==3'd1) )
  478.                begin
  479.                 color[0] <= clr3[0];
  480.                 color[1] <= clr3[0];
  481.                 color[2] <= clr3[1];
  482.                 color[3] <= clr3[1];
  483.                 color[4] <= clr3[2];
  484.                 color[5] <= clr3[2];
  485.                end
  486.               else
  487.                color <= BLACK;
  488.              end
  489.        default: color <= (hcount[0]^vcount[0]) ? WHITE : BLACK;
  490.       endcase
  491.      else
  492.       color <= BLACK;
  493.  
  494.      hmouse <= hcount - scr_mouse_x;
  495.  
  496.      if ( ~htxtscr )
  497.       begin
  498.        hcharcount <= 6'h00;
  499.        pixptr <= 3'd0;
  500.       end
  501.      else
  502.       begin
  503.        if ( pixptr==3'd5 )
  504.         begin
  505.          pixptr <= 3'd0;
  506.          hcharcount <= hcharcount + 6'h01;
  507.         end
  508.        else
  509.         pixptr <= pixptr + 3'd1;
  510.       end
  511.  
  512.      if ( hcount==HMAX )
  513.       hcount <= 9'd0;
  514.      else
  515.       hcount <= hcount + 9'd1;
  516.  
  517.      if ( hcount==HTXTS_END )
  518.       htxtscr <= 1'b0;
  519.      else if ( hcount==HTXTS_BEG )
  520.       htxtscr <= 1'b1;
  521.  
  522.      if ( hcount==HSYNC_BEG )
  523.       begin
  524.        if ( scr_tv_mode ) hsync <= 1'b1;
  525.        vgaff <= scr_tv_mode | ~vgaff;
  526.        if ( vgaff )
  527.         begin
  528.          if ( scr_tv_mode ) csync <= 1'b1;
  529.          nextline <= 1'b1;
  530.         end
  531.       end
  532.  
  533.      if ( (~scr_tv_mode) && (hcount==HSYNC_BEG2) )
  534.       begin
  535.        hsync <= 1'b1;
  536.        if ( vgaff ) csync <= 1'b1;
  537.       end
  538.  
  539.      if ( (~scr_tv_mode) && (hcount==HSYNC_END2) )
  540.       begin
  541.        hsync <= 1'b0;
  542.        if ( !vsync )
  543.         csync <= 1'b0;
  544.       end
  545.  
  546.      if ( scr_tv_mode && (hcount==HSYNC_END) )
  547.       begin
  548.        hsync <= 1'b0;
  549.        if ( !vsync )
  550.         csync <= 1'b0;
  551.       end
  552.  
  553.      if (scr_tv_mode)
  554.       begin
  555.        if (hcount==CSYNC_CUT)
  556.         csync <= 1'b0;
  557.       end
  558.      else if ( (vgaff) && (hcount==CSYNC_CUT2) )
  559.       csync <= 1'b0;
  560.  
  561.      if ( ((hchess==5'd0) || (hchess==5'd18)) && (hsetka==4'd13) )
  562.       schcnt <= 6'd0;
  563.      else if (schcnt!=6'd63)
  564.       schcnt <= schcnt+6'd1;
  565.  
  566.      if ( hcount==HBORD_BEG )
  567.       begin
  568.        hbord <= 1'b1;
  569.        hsetka <= 4'd0;
  570.        hchess <= 5'd0;
  571.        hchss3 <= 2'd0;
  572.        cband <= 3'd0;
  573.       end
  574.      else
  575.       begin
  576.        if ( hsetka==4'd14 )
  577.         begin
  578.          hsetka <= 4'd0;
  579.          hchess <= hchess+5'd1;
  580.          if ( hchss3==2'd2 )
  581.           begin
  582.            hchss3 <= 2'd0;
  583.            cband <= cband+3'd1;
  584.           end
  585.          else
  586.           hchss3 <= hchss3+2'd1;
  587.         end
  588.        else
  589.         hsetka <= hsetka+4'd1;
  590.        if ( hcount==HBORD_END ) hbord <= 1'b0;
  591.       end
  592.  
  593.      if ( !((vcount[2:0]==3'd0)&&vgaff) && (hcount==9'd0) )
  594.       clr3 <= { clr3[1:0], clr3[2] };
  595.      else if (hcount[2:0]==3'd5)
  596.       clr3 <= { clr3[1:0], clr3[2] };
  597.  
  598.     end
  599.    //
  600.    if ( nextline )
  601.     begin
  602.  
  603.      nextline <= 1'b0;
  604.  
  605.      if ( ~vtxtscr )
  606.       begin
  607.        voffset <= 11'd0;
  608.        vcharlinecount <= 4'd15;
  609.       end
  610.      else
  611.       begin
  612.        if ( vcharlinecount==4'd8 )
  613.         begin
  614.          voffset <= voffset + 11'd53;
  615.          vcharlinecount <= 4'd15;
  616.         end
  617.        else
  618.         vcharlinecount <= vcharlinecount + 4'd1;
  619.       end
  620.  
  621.      if ( vcount==VMAX )
  622.       begin
  623.        vcount <= 9'd0;
  624.        clr3 <= 3'b001;
  625.       end
  626.      else
  627.       vcount <= vcount + 9'd1;
  628.  
  629.      if ( vcount==VTXTS_END )
  630.       vtxtscr <= 1'b0;
  631.      else if ( vcount==VTXTS_BEG )
  632.       vtxtscr <= 1'b1;
  633.  
  634.      if ( vcount==VSYNC_BEG )
  635.       vsync <= 1'b1;
  636.      else if ( vcount==VSYNC_END )
  637.       vsync <= 1'b0;
  638.  
  639.      if ( vcount==VBORD_BEG )
  640.       begin
  641.        vbord <= 1'b1;
  642.        vsetka <= 4'd5;
  643.        vchess <= 5'd0;
  644.        circle <= 1'b0;
  645.        bccount <= 7'd0;
  646.        sccount <= 5'd0;
  647.        bcdir <= 2'b00;
  648.        scdir <= 2'b00;
  649.       end
  650.      else
  651.       begin
  652.  
  653.        if (bcdir[0])
  654.         bccount <= bccount+7'd1;
  655.        else if (bcdir[1])
  656.         bccount <= bccount-7'd1;
  657.  
  658.        if (scdir[0])
  659.         sccount <= sccount+5'd1;
  660.        else if (scdir[1])
  661.         sccount <= sccount-5'd1;
  662.  
  663.        if ( vsetka==4'd14 )
  664.         begin
  665.          vsetka <= 4'd0;
  666.          vchess <= vchess+5'd1;
  667.         end
  668.        else
  669.         begin
  670.          vsetka <= vsetka+4'd1;
  671.          if ( vsetka==4'd13 )
  672.           begin
  673.            if (vchess==5'd1)
  674.             bcdir <= 2'b01;
  675.            else if (vchess==5'd9)
  676.             bcdir <= 2'b10;
  677.            else if (vchess==5'd17)
  678.             bcdir <= 2'b00;
  679.            if ( (vchess==5'd0) || (vchess==5'd14) )
  680.             scdir <= 2'b01;
  681.            else if ( (vchess==5'd2) || (vchess==5'd16) )
  682.             scdir <= 2'b10;
  683.            else if ( (vchess==5'd4) || (vchess==5'd18) )
  684.             scdir <= 2'b00;
  685.           end
  686.         end
  687.  
  688.        if ( vcount==VBORD_END ) vbord <= 1'b0;
  689.  
  690.       end
  691.  
  692.      vmouse <= vcount - scr_mouse_y;
  693.  
  694.     end
  695.    //
  696.    if ( (hchess==5'd2) || (hchess==5'd10) || (hchess==5'd20) )
  697.     hhole <= 1'b1;
  698.    else if ( (hchess==5'd4) || (hchess==5'd14) || (hchess==5'd22) )
  699.     hhole <= 1'b0;
  700.    //
  701.    if ( (vchess==5'd4) && (schcnt==6'd63) )
  702.     begin
  703.      if (hchess==5'd7)
  704.       uhole <= 1'b1;
  705.      else if (hchess==5'd17)
  706.       uhole <= 1'b0;
  707.     end
  708.    //
  709.    if (hcount==(9'd258+cb_val))
  710.     circle <= 1'b0;
  711.    else if ( (schcnt==(5'd31+cs_val)) && (sccount!=5'd0) )
  712.     circle <= 1'b0;
  713.    else if (hcount==(9'd257-cb_val))
  714.     circle <= 1'b1;
  715.    else if ( (schcnt==(5'd30-cs_val)) && (sccount!=5'd0) )
  716.     circle <= 1'b1;
  717.    //
  718.    if ( (((vchess==5'd2) || (vchess==5'd16)) && (vsetka==4'd7)) || (vchess==5'd9) )
  719.     vhole <= 1'b1;
  720.    else if ( (((vchess==5'd3) || (vchess==5'd17)) && (vsetka==4'd7)) || (vchess==5'd11) )
  721.     vhole <= 1'b0;
  722.    //
  723.   end
  724.  
  725.  circl_b ccb ( .in_addr(bccount), .out_word(cb_val) );
  726.  circl_s ccs ( .in_addr(sccount), .out_word(cs_val) );
  727.  
  728.  lpm_rom_7x2 mouse_cursor ( .address({ vmouse[3:0], hmouse[2:0] }), .q({ mouse_i, mouse_m }) );
  729.  assign mouse_here = (hmouse[8:3] == 6'd0) && (vmouse[8:4] == 5'd0);
  730.  assign mouse_mask = mouse_here & mouse_m;
  731.  assign mouse_image = mouse_here & mouse_i;
  732.  
  733.  assign video_addr = voffset + { 4'h0, hcharcount[5:0] };
  734.  lpm_ram_dp_9x8 scrmem0  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h0)),
  735.                            .rdaddress(video_addr[8:0]), .q(charcode0) );
  736.  lpm_ram_dp_9x8 scrmem1  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h1)),
  737.                            .rdaddress(video_addr[8:0]), .q(charcode1) );
  738.  lpm_ram_dp_9x8 scrmem2  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h2)),
  739.                            .rdaddress(video_addr[8:0]), .q(charcode2) );
  740.  assign charcode = (video_addr[10:9]==2'h0) ? charcode0 :
  741.                    (video_addr[10:9]==2'h1) ? charcode1 : charcode2 ;
  742.  lpm_ram_dp_9x8 attrmem0 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h0)),
  743.                            .rdaddress(video_addr[8:0]), .q(attrcode0) );
  744.  lpm_ram_dp_9x8 attrmem1 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h1)),
  745.                            .rdaddress(video_addr[8:0]), .q(attrcode1) );
  746.  lpm_ram_dp_9x8 attrmem2 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h2)),
  747.                            .rdaddress(video_addr[8:0]), .q(attrcode2) );
  748.  assign attrcode = (video_addr[10:9]==2'h0) ? attrcode0 :
  749.                    (video_addr[10:9]==2'h1) ? attrcode1 : attrcode2 ;
  750.  assign vcharline = (vcharlinecount[3]) ? ~vcharlinecount[2:0] : vcharlinecount[2:0];
  751.  lpm_rom_11x6 chargen ( .address({ charcode, vcharline }), .q(charpix) );
  752.  
  753.  assign fcolor = { attrcode[2], (attrcode[2]&attrcode[3]),
  754.                    attrcode[1], (attrcode[1]&attrcode[3]),
  755.                    attrcode[0], (attrcode[0]&attrcode[3]) };
  756.  assign bcolor = { (attrcode[6]&attrcode[7]), (attrcode[6]&(~attrcode[7])),
  757.                    (attrcode[5]&attrcode[7]), (attrcode[5]&(~attrcode[7])),
  758.                    (attrcode[4]&attrcode[7]), (attrcode[4]&(~attrcode[7])) };
  759.  assign fontenable = (charcode[7:4]==4'hb)||
  760.                      (charcode[7:4]==4'hc)||
  761.                      (charcode[7:4]==4'hd)||
  762.                      (~vcharlinecount[3]);
  763.  assign pixel = ( charcode==8'hb0 ) ? ( (vcount[0]^hcount[1])&~hcount[0] ) :
  764.                 ( charcode==8'hb1 ) ? (  vcount[0]^hcount[0]             ) :
  765.                 ( charcode==8'hb2 ) ? ( (vcount[0]^hcount[1])| hcount[0] ) :
  766.                 ( fontenable ) ? charpix[3'd5-pixptr] : 1'b0;
  767.  
  768.  assign image_color = (mouse_mask) ? BLACK : ( pixel ? fcolor : bcolor ) ;
  769.  
  770.  assign { vgrn[1:0], vred[1:0], vblu[1:0] } = color;
  771.  assign vhsync = hsync;
  772.  assign vvsync = vsync;
  773.  assign vcsync = ~csync;
  774.  
  775. //--AVRSPI--FlashROM-----------------------------------------------------------
  776.  
  777.  localparam TEMP_REG      = 8'ha0;
  778.  
  779.  localparam SD_CS0        = 8'ha1;
  780.  localparam SD_CS1        = 8'ha2;
  781.  localparam FLASH_LOADDR  = 8'ha3;
  782.  localparam FLASH_MIDADDR = 8'ha4;
  783.  localparam FLASH_HIADDR  = 8'ha5;
  784.  localparam FLASH_DATA    = 8'ha6;
  785.  localparam FLASH_CTRL    = 8'ha7;
  786.  localparam SCR_LOADDR    = 8'ha8;
  787.  localparam SCR_HIADDR    = 8'ha9;
  788.  localparam SCR_SET_ATTR  = 8'haa; // чряшё№ т ATTR
  789.  localparam SCR_FILL      = 8'hab; // яЁхфшэъЁхьхэЄ рфЁхёр ш чряшё№ т ATTR ш т ярь Є№
  790.                                    // (хёыш Єюы№ъю фхЁурЄ№ spics_n, Єю т ярь Є№ сєфхЄ яшёрЄ№ё  яЁхф√фє∙хх чэрўхэшх)
  791.  localparam SCR_CHAR      = 8'hac; // яЁхфшэъЁхьхэЄ рфЁхёр ш чряшё№ т ярь Є№ ёшьтюыют ш ATTR т ярь Є№ рЄЁшсєЄют
  792.                                    // (хёыш Єюы№ъю фхЁурЄ№ spics_n, Єю т ярь Є№ сєфхЄ яшёрЄ№ё  яЁхф√фє∙шх чэрўхэш )
  793.  localparam SCR_MOUSE_X   = 8'had;
  794.  localparam SCR_MOUSE_Y   = 8'hae;
  795.  localparam SCR_MODE      = 8'haf; // [7] - 0=VGAmode, 1=TVmode; [2:0] - 0=TXT, шэрўх ScrTESTs
  796.  
  797.  localparam MTST_CONTROL  = 8'h50; // [0] - ЄхёЄ ярь Єш (0=ёсЁюё, 1=ЁрсюЄр)
  798.  localparam MTST_PASS_CNT0= 8'h51;
  799.  localparam MTST_PASS_CNT1= TEMP_REG;
  800.  localparam MTST_FAIL_CNT0= 8'h52;
  801.  localparam MTST_FAIL_CNT1= TEMP_REG;
  802.  
  803.  localparam COVOX         = 8'h53;
  804.  
  805.  localparam INT_CONTROL   = 8'h54; // [0] - ЁрчЁх°хэшх яЁхЁ√трэшщ юЄ covox-р (27343.75 Hz)
  806.                                    // [1] - ЁрчЁх°хэшх ърфЁют√ї яЁхЁ√трэшщ (~49 Hz)
  807.  
  808.  reg [7:0] number;          initial number = 8'hff;
  809.  reg [7:0] indata;          initial indata = 8'hff;
  810.  reg [7:0] outdata;
  811.  reg [2:0] bitptr;
  812.  reg prev_spics_n;
  813.  reg [18:0] flash_addr;
  814.  reg flash_cs;              initial flash_cs = 1'b0;
  815.  reg flash_oe;              initial flash_oe = 1'b0;
  816.  reg flash_we;              initial flash_we = 1'b0;
  817.  reg flash_postinc;         initial flash_postinc = 1'b0;
  818.  reg [7:0] flash_data_out;
  819.  reg [10:0] scr_addr;       initial scr_addr = 11'h000;
  820.  reg [7:0] scr_attr;        initial scr_attr = 8'h0f;
  821.  reg scr_wren_c;            initial scr_wren_c = 1'b0;
  822.  reg scr_wren_a;            initial scr_wren_a = 1'b0;
  823.  reg [8:0] scr_mouse_x;     initial scr_mouse_x = 9'd0;
  824.  reg [8:0] scr_mouse_y;     initial scr_mouse_y = 9'd0;
  825.  reg scr_tv_mode;           initial scr_tv_mode = 1'b1;
  826.  reg [2:0] scr_mode;        initial scr_mode = 3'b0;
  827.  wire spicsn_rising;
  828.  wire spicsn_falling;
  829.  wire sd_selected;
  830.  reg cs_trg;
  831.  reg [7:0] temp_reg;
  832.  
  833.  always @(posedge spick)
  834.   begin
  835.    if ( spics_n )
  836.     number <= { number[6:0], spido };
  837.    else
  838.     indata <= { indata[6:0], spido };
  839.   end
  840.  
  841.  always @(negedge spick or posedge spics_n)
  842.   begin
  843.    if ( spics_n )
  844.     bitptr <= 3'b111;
  845.    else
  846.     bitptr <= bitptr - 3'b001;
  847.   end
  848.  
  849.  always @(posedge fclk)
  850.   begin
  851.    //
  852.    if ( spicsn_rising )
  853.     begin
  854.      //
  855.      cs_trg <= 1'b1;
  856.      //
  857.      case ( number )
  858.       FLASH_LOADDR:  flash_addr[7:0] <= indata;
  859.       FLASH_MIDADDR: flash_addr[15:8] <= indata;
  860.       FLASH_HIADDR:  flash_addr[18:16] <= indata[2:0];
  861.       FLASH_DATA:    begin
  862.                       flash_data_out <= indata;
  863.                       if (flash_postinc) flash_addr[13:0] <= flash_addr[13:0] + 14'd1;
  864.                      end
  865.       FLASH_CTRL:    begin
  866.                       flash_cs <= indata[0];
  867.                       flash_oe <= indata[1];
  868.                       flash_we <= indata[2];
  869.                       flash_postinc <= indata[3];
  870.                      end
  871.       SCR_LOADDR:    scr_addr[7:0] <= indata;
  872.       SCR_HIADDR:    scr_addr[10:8] <= indata[2:0];
  873.       SCR_SET_ATTR:  scr_attr <= indata;
  874.       SCR_FILL:      begin
  875.                       scr_attr <= indata;
  876.                       scr_wren_a <= 1'b1;
  877.                      end
  878.       SCR_CHAR:      begin
  879.                       scr_wren_c <= 1'b1;
  880.                       scr_wren_a <= 1'b1;
  881.                      end
  882.       TEMP_REG:      temp_reg <= indata;
  883.       SCR_MOUSE_X:   scr_mouse_x <= { temp_reg[0], indata };
  884.       SCR_MOUSE_Y:   scr_mouse_y <= { temp_reg[0], indata };
  885.       SCR_MODE:      begin
  886.                       scr_tv_mode <= indata[7];
  887.                       scr_mode <= indata[2:0];
  888.                      end
  889.       MTST_CONTROL:  mtst_run <= indata[0];
  890.       COVOX:         begin
  891.                       covox[cvx_ptr_iinc] <= indata;
  892.                       cvx_ptr_in <= cvx_ptr_iinc;
  893.                      end
  894.       INT_CONTROL:   begin
  895.                       enable_covox_int <= indata[0];
  896.                       enable_frame_int <= indata[1];
  897.                      end
  898.      endcase
  899.      //
  900.     end
  901.    else
  902.    begin
  903.     //
  904.     scr_wren_c <= 1'b0;
  905.     scr_wren_a <= 1'b0;
  906.     //
  907.     if ( spicsn_falling )
  908.      begin
  909.       //
  910.       cs_trg <= 1'b0;
  911.       //
  912.       case ( number )
  913.        SCR_SET_ATTR:  outdata <= ~scr_attr; // for SPI testing
  914.        SCR_FILL:      begin
  915.                        outdata <= 8'hff;
  916.                        scr_addr <= scr_addr + 11'd1;
  917.                       end
  918.        SCR_CHAR:      begin
  919.                        outdata <= 8'hff;
  920.                        scr_addr <= scr_addr + 11'd1;
  921.                       end
  922.        FLASH_DATA:    outdata <= d;
  923.        MTST_PASS_CNT0:begin
  924.                        outdata <= mtst_pass_counter[7:0];
  925.                        temp_reg <= mtst_pass_counter[15:8];
  926.                       end
  927.        MTST_FAIL_CNT0:begin
  928.                        outdata <= mtst_fail_counter[7:0];
  929.                        temp_reg <= mtst_fail_counter[15:8];
  930.                       end
  931.        COVOX:         outdata <= { 4'd0, cvx_ptr_diff };
  932.        TEMP_REG:      outdata <= temp_reg; // read after MTST_PASS_CNT0, MTST_FAIL_CNT0
  933.        default:       outdata <= 8'hff;
  934.       endcase
  935.       //
  936.      end
  937.     //
  938.    end
  939.    //
  940.    prev_spics_n <= spics_n;
  941.    //
  942.   end
  943.  
  944.  assign spicsn_rising  = ( { cs_trg, prev_spics_n, spics_n } == 3'b011 );
  945.  assign spicsn_falling = ( { cs_trg, prev_spics_n, spics_n } == 3'b100 );
  946.  
  947.  assign sd_selected = ( ( (number==SD_CS0) || (number==SD_CS1) ) && (~spics_n) );
  948.  assign spidi = sd_selected ? sddi : outdata[bitptr];
  949.  assign sddo  = sd_selected ? spido : 1'b1;
  950.  assign sdclk = sd_selected ? spick : 1'b0;
  951.  assign sdcs_n = !( (number==SD_CS0) && (~spics_n) );
  952.  
  953.  assign a[13:0]  =  flash_addr[13:0];
  954.  assign rompg0_n = ~flash_addr[14];
  955.  assign { rompg4, rompg3, rompg2, dos_n } = flash_addr[18:15];
  956.  assign csrom   =  flash_cs;
  957.  assign romoe_n = ~flash_oe;
  958.  assign romwe_n = ~flash_we;
  959.  assign d = flash_oe ? 8'bZZZZZZZZ : flash_data_out;
  960.  
  961. //-----------------------------------------------------------------------------
  962.  
  963.  reg mtst_run;      initial mtst_run = 1'b0;
  964.  wire [15:0] mtst_pass_counter;
  965.  wire [15:0] mtst_fail_counter;
  966.  
  967.  mem_tester mtst( .clk(fclk), .rst_n(mtst_run),
  968.                   .pass_counter(mtst_pass_counter),
  969.                   .fail_counter(mtst_fail_counter),
  970.                   .DRAM_DQ(rd), .DRAM_MA(ra), .DRAM_RAS0_N(rras0_n), .DRAM_RAS1_N(rras1_n),
  971.                   .DRAM_LCAS_N(rlcas_n), .DRAM_UCAS_N(rucas_n), .DRAM_WE_N(rwe_n) );
  972.  
  973. //-----------------------------------------------------------------------------
  974.  
  975. endmodule
  976.