Subversion Repositories pentevo

Rev

Rev 380 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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'd395; // 9'd382;
  211.  localparam HSYNC_BEG   = 9'd0;
  212.  localparam HSYNC_END   = 9'd33;
  213.  localparam HSYNC_END2  = 9'd53;
  214.  localparam HTXTS_BEG   = 9'd98;
  215.  localparam HMAX        = 9'd447;
  216.  
  217.  localparam VTXTS_END   = 9'd293;
  218.  localparam VSYNC_BEG   = 9'd0;
  219.  localparam VSYNC_END   = 9'd2;
  220.  localparam VTXTS_BEG   = 9'd43;
  221.  localparam VMAX        = 9'd319;
  222.  
  223.  localparam HBORD_BEG   = 9'd77;
  224.  localparam HBORD_END   = 9'd437;
  225.  localparam VBORD_BEG   = 9'd24;
  226.  localparam VBORD_END   = 9'd312;
  227.  
  228.  //                          GgRrBb
  229.  localparam BLACK       = 6'b000000;
  230.  localparam GRAY_1      = 6'b010101;
  231.  localparam GRAY_2      = 6'b101010;
  232.  localparam WHITE       = 6'b111111;
  233.  
  234.  localparam BLUE_3      = 6'b000011;
  235.  localparam RED_3       = 6'b001100;
  236.  localparam MAGENTA_3   = 6'b001111;
  237.  localparam GREEN_3     = 6'b110000;
  238.  localparam CYAN_3      = 6'b110011;
  239.  localparam YELLOW_3    = 6'b111100;
  240.  
  241.  localparam BLUE_2      = 6'b000010;
  242.  localparam RED_2       = 6'b001000;
  243.  localparam MAGENTA_2   = 6'b001010;
  244.  localparam GREEN_2     = 6'b100000;
  245.  localparam CYAN_2      = 6'b100010;
  246.  localparam YELLOW_2    = 6'b101000;
  247.  
  248.  localparam BLUE_H      = 6'b010110;
  249.  localparam RED_H       = 6'b011001;
  250.  localparam MAGENTA_H   = 6'b011010;
  251.  localparam GREEN_H     = 6'b100101;
  252.  localparam CYAN_H      = 6'b100110;
  253.  localparam YELLOW_H    = 6'b101001;
  254.  
  255.  reg [8:0] hcount;      initial hcount = 9'd0;
  256.  reg [2:0] pixptr;
  257.  reg [8:0] vcount;      initial vcount = 9'd0;
  258.  reg [5:0] hcharcount;
  259.  wire [2:0] vcharline;
  260.  reg [10:0] voffset;
  261.  reg [3:0] vcharlinecount;
  262.  reg hsync;             initial hsync = 1'b1;
  263.  reg htxtscr;           initial htxtscr = 1'b0;
  264.  reg vsync;             initial vsync = 1'b1;
  265.  reg vtxtscr;           initial vtxtscr = 1'b0;
  266.  reg csync;             initial csync = 1'b1;
  267.  wire [10:0] video_addr;
  268.  wire [7:0] charcode0, charcode1, charcode2;
  269.  wire [7:0] charcode;
  270.  wire [7:0] attrcode0, attrcode1, attrcode2;
  271.  wire [7:0] attrcode;
  272.  wire [5:0] charpix;
  273.  wire pixel;
  274.  wire [5:0] fcolor, bcolor, image_color;
  275.  reg [5:0] color;
  276.  wire fontenable;
  277.  reg [8:0] hmouse, vmouse;
  278.  wire mouse_here, mouse_i, mouse_image, mouse_m, mouse_mask;
  279.  reg vgaff, nextline;
  280.  reg hbord;             initial hbord = 1'b0;
  281.  reg vbord;             initial vbord = 1'b0;
  282.  reg circle;            initial circle = 1'b0;
  283.  reg uhole;             initial uhole = 1'b0;
  284.  reg hhole;             initial hhole = 1'b0;
  285.  reg vhole;             initial vhole = 1'b0;
  286.  reg [1:0] bcdir;       initial bcdir = 2'b00;
  287.  reg [1:0] scdir;       initial scdir = 2'b00;
  288.  reg [3:0] hsetka, vsetka;
  289.  reg [4:0] hchess, vchess;
  290.  reg [1:0] hchss3;
  291.  reg [2:0] cband;
  292.  reg [6:0] bccount;
  293.  reg [4:0] sccount;
  294.  reg [6:0] schcnt;
  295.  wire [6:0] cb_val;
  296.  wire [4:0] cs_val;
  297.  reg [2:0] clr3;
  298.  
  299.  
  300.  always @(posedge fclk)
  301.   begin
  302.    //
  303.    if ( {(main_osc[1]&scr_tv_mode),main_osc[0]}==2'h0 )
  304.     begin
  305.  
  306.      if ( scr_mode==2'h0 )
  307.       color <= (htxtscr & vtxtscr) ? ( (mouse_image) ? ~image_color : image_color ) : BLACK;
  308.      else if ( hbord & vbord )
  309.       case ( scr_mode )
  310.        3'h2:
  311.              color <= (hchess[0]^vchess[0]) ? WHITE : BLACK;
  312.        3'h3:
  313.              case (vchess)
  314.               5'd0, 5'd19:
  315.                 if (vsetka==5'd14)
  316.                  color <= GRAY_2;
  317.                 else if (hchess[0])
  318.                  color <= WHITE;
  319.                 else
  320.                  color <= BLACK;
  321.               5'd5, 5'd6:
  322.                 case (cband)
  323.                  3'd0: color <= GRAY_2;
  324.                  3'd1: color <= YELLOW_H;
  325.                  3'd2: color <= CYAN_H;
  326.                  3'd3: color <= GREEN_H;
  327.                  3'd4: color <= MAGENTA_H;
  328.                  3'd5: color <= RED_H;
  329.                  3'd6: color <= BLUE_H;
  330.                  3'd7: color <= GRAY_1;
  331.                 endcase
  332.               5'd13, 5'd14:
  333.                 case (cband)
  334.                  3'd0: color <= GRAY_2;
  335.                  3'd1: color <= YELLOW_2;
  336.                  3'd2: color <= CYAN_2;
  337.                  3'd3: color <= GREEN_2;
  338.                  3'd4: color <= MAGENTA_2;
  339.                  3'd5: color <= RED_2;
  340.                  3'd6: color <= BLUE_2;
  341.                  3'd7: color <= BLACK;
  342.                 endcase
  343.               default
  344.                begin
  345.                 if (uhole)
  346.                  begin
  347.                   if (pixel)
  348.                    color <= GRAY_2;
  349.                   else
  350.                    color <= GRAY_1;
  351.                  end
  352.                 else if ( (circle) && !(hhole&vhole) )
  353.                  case (vchess)
  354.                   5'd2, 5'd17:
  355.                     if ( (hchess==5'd2) || (hchess==5'd3) || (hchess==5'd20) || (hchess==5'd21) )
  356.                      begin
  357.                       if (hcount[0])
  358.                        color <= GRAY_2;
  359.                       else
  360.                        color <= GRAY_1;
  361.                      end
  362.                     else
  363.                      color <= GRAY_2;
  364.                   5'd3:
  365.                     if ( (hchess==5'd2)  || ((hchess==5'd3)  && (hsetka!=5'd14))
  366.                       || (hchess==5'd20) || ((hchess==5'd21) && (hsetka!=5'd14)) )
  367.                      begin
  368.                       if (hcount[0]^vcount[0])
  369.                        color <= GRAY_1;
  370.                       else
  371.                        color <= GRAY_2;
  372.                      end
  373.                     else
  374.                      color <= GRAY_2;
  375.                   5'd7:
  376.                     case (cband)
  377.                      //3'd0: color <= WHITE;
  378.                      3'd1: color <= WHITE;
  379.                      3'd2: color <= BLACK;
  380.                      3'd3: color <= GRAY_1;
  381.                      3'd4: color <= GRAY_2;
  382.                      3'd5: color <= WHITE;
  383.                      3'd6: color <= BLACK;
  384.                      //3'd7: color <= BLACK;
  385.                     endcase
  386.                   5'd8:
  387.                     if (hcount[3])
  388.                      color <= MAGENTA_H;
  389.                     else
  390.                      color <= GREEN_H;
  391.                   5'd9, 5'd10:
  392.                     if ( (hcount[8]) ^ (vchess[0]) ^ ( (hchess==5'd4) && (hsetka==4'd14) ) )
  393.                      color <= GRAY_2;
  394.                     else
  395.                      color <= BLACK;
  396.                   5'd11:
  397.                     if (hcount[3])
  398.                      color <= RED_H;
  399.                     else
  400.                      color <= CYAN_H;
  401.                   5'd12:
  402.                     if (hcount[0])
  403.                      color <= GRAY_1;
  404.                     else
  405.                      color <= GRAY_2;
  406.                   5'd15:
  407.                     if ( (hchess[0]) && (schcnt==6'd63) )
  408.                      color <= BLACK;
  409.                     else
  410.                      color <= GRAY_2;
  411.                   5'd16:
  412.                     if ( (hchess==5'd2)  || ((hchess==5'd3) &&(hsetka!=4'd14))
  413.                       || (hchess==5'd20) || ((hchess==5'd21)&&(hsetka!=4'd14)) )
  414.                      begin
  415.                       if (hcount[0]^vcount[0])
  416.                        color <= GRAY_2;
  417.                       else
  418.                        color <= GRAY_1;
  419.                      end
  420.                     else
  421.                      color <= GRAY_2;
  422.                   default:
  423.                    color <= GRAY_2;
  424.                  endcase
  425.                 else
  426.                  color <= ( (hsetka==4'd14) || (vsetka==4'd14) ) ? GRAY_2 : GRAY_1;
  427.                end
  428.              endcase
  429.        3'h4: case (cband)
  430.               3'd0: color <= GRAY_2;
  431.               3'd1: color <= YELLOW_2;
  432.               3'd2: color <= CYAN_2;
  433.               3'd3: color <= GREEN_2;
  434.               3'd4: color <= MAGENTA_2;
  435.               3'd5: color <= RED_2;
  436.               3'd6: color <= BLUE_2;
  437.               3'd7: color <= BLACK;
  438.              endcase
  439.        3'h5: if (vchess[4]==1'b0)
  440.               begin
  441.                if (vchess!=5'd15)
  442.                 case (cband)
  443.                  3'd0: color <= GRAY_2;
  444.                  3'd1: color <= YELLOW_2;
  445.                  3'd2: color <= CYAN_2;
  446.                  3'd3: color <= GREEN_2;
  447.                  3'd4: color <= MAGENTA_2;
  448.                  3'd5: color <= RED_2;
  449.                  3'd6: color <= BLUE_2;
  450.                  3'd7: color <= BLACK;
  451.                 endcase
  452.                else
  453.                 case (cband)
  454.                  3'd0: color <= BLUE_2;
  455.                  3'd1: color <= BLACK;
  456.                  3'd2: color <= MAGENTA_2;
  457.                  3'd3: color <= BLACK;
  458.                  3'd4: color <= CYAN_2;
  459.                  3'd5: color <= BLACK;
  460.                  3'd6: color <= GRAY_2;
  461.                  3'd7: color <= BLACK;
  462.                 endcase
  463.               end
  464.              else
  465.               case (cband)
  466.                3'd0: color <= WHITE;
  467.                3'd1: color <= YELLOW_2;
  468.                3'd2: color <= CYAN_2;
  469.                3'd3: color <= GREEN_2;
  470.                3'd4: color <= MAGENTA_2;
  471.                3'd5: color <= RED_2;
  472.                3'd6: color <= BLUE_2;
  473.                3'd7: color <= BLACK;
  474.               endcase
  475.        3'h6: begin
  476.               if ( (vcount[2:0]==3'd4) || (hcount[2:0]==3'd1) )
  477.                begin
  478.                 color[0] <= clr3[0];
  479.                 color[1] <= clr3[0];
  480.                 color[2] <= clr3[1];
  481.                 color[3] <= clr3[1];
  482.                 color[4] <= clr3[2];
  483.                 color[5] <= clr3[2];
  484.                end
  485.               else
  486.                color <= BLACK;
  487.              end
  488.        default: color <= (hcount[0]^vcount[0]) ? WHITE : BLACK;
  489.       endcase
  490.      else
  491.       color <= BLACK;
  492.  
  493.      hmouse <= hcount - scr_mouse_x;
  494.  
  495.      if ( ~htxtscr )
  496.       begin
  497.        hcharcount <= 6'h00;
  498.        pixptr <= 3'd0;
  499.       end
  500.      else
  501.       begin
  502.        if ( pixptr==3'd5 )
  503.         begin
  504.          pixptr <= 3'd0;
  505.          hcharcount <= hcharcount + 6'h01;
  506.         end
  507.        else
  508.         pixptr <= pixptr + 3'd1;
  509.       end
  510.  
  511.      if ( hcount==HMAX )
  512.       hcount <= 9'd0;
  513.      else
  514.       hcount <= hcount + 9'd1;
  515.  
  516.      if ( hcount==HTXTS_END )
  517.       htxtscr <= 1'b0;
  518.      else if ( hcount==HTXTS_BEG )
  519.       htxtscr <= 1'b1;
  520.  
  521.      if ( hcount==HSYNC_BEG )
  522.       begin
  523.        hsync <= 1'b1;
  524.        vgaff <= scr_tv_mode | ~vgaff;
  525.        if ( vgaff )
  526.         begin
  527.          csync <= 1'b1;
  528.          nextline <= 1'b1;
  529.         end
  530.       end
  531.  
  532.      if ( (~scr_tv_mode) && (hcount==HSYNC_END2) )
  533.       begin
  534.        hsync <= 1'b0;
  535.        if ( !vsync )
  536.         csync <= 1'b0;
  537.       end
  538.  
  539.      if ( scr_tv_mode && (hcount==HSYNC_END) )
  540.       begin
  541.        hsync <= 1'b0;
  542.        if ( !vsync )
  543.         csync <= 1'b0;
  544.       end
  545.  
  546.      if (scr_tv_mode)
  547.       begin
  548.        if (hcount==CSYNC_CUT)
  549.         csync <= 1'b0;
  550.       end
  551.      else if ( (vgaff) && (hcount==CSYNC_CUT2) )
  552.       csync <= 1'b0;
  553.  
  554.      if ( ((hchess==5'd0) || (hchess==5'd18)) && (hsetka==4'd13) )
  555.       schcnt <= 6'd0;
  556.      else if (schcnt!=6'd63)
  557.       schcnt <= schcnt+6'd1;
  558.  
  559.      if ( hcount==HBORD_BEG )
  560.       begin
  561.        hbord <= 1'b1;
  562.        hsetka <= 4'd0;
  563.        hchess <= 5'd0;
  564.        hchss3 <= 2'd0;
  565.        cband <= 3'd0;
  566.       end
  567.      else
  568.       begin
  569.        if ( hsetka==4'd14 )
  570.         begin
  571.          hsetka <= 4'd0;
  572.          hchess <= hchess+5'd1;
  573.          if ( hchss3==2'd2 )
  574.           begin
  575.            hchss3 <= 2'd0;
  576.            cband <= cband+3'd1;
  577.           end
  578.          else
  579.           hchss3 <= hchss3+2'd1;
  580.         end
  581.        else
  582.         hsetka <= hsetka+4'd1;
  583.        if ( hcount==HBORD_END ) hbord <= 1'b0;
  584.       end
  585.  
  586.      if ( !((vcount[2:0]==3'd0)&&vgaff) && (hcount==9'd0) )
  587.       clr3 <= { clr3[1:0], clr3[2] };
  588.      else if (hcount[2:0]==3'd5)
  589.       clr3 <= { clr3[1:0], clr3[2] };
  590.  
  591.     end
  592.    //
  593.    if ( nextline )
  594.     begin
  595.  
  596.      nextline <= 1'b0;
  597.  
  598.      if ( ~vtxtscr )
  599.       begin
  600.        voffset <= 11'd0;
  601.        vcharlinecount <= 4'd15;
  602.       end
  603.      else
  604.       begin
  605.        if ( vcharlinecount==4'd8 )
  606.         begin
  607.          voffset <= voffset + 11'd53;
  608.          vcharlinecount <= 4'd15;
  609.         end
  610.        else
  611.         vcharlinecount <= vcharlinecount + 4'd1;
  612.       end
  613.  
  614.      if ( vcount==VMAX )
  615.       begin
  616.        vcount <= 9'd0;
  617.        clr3 <= 3'b001;
  618.       end
  619.      else
  620.       vcount <= vcount + 9'd1;
  621.  
  622.      if ( vcount==VTXTS_END )
  623.       vtxtscr <= 1'b0;
  624.      else if ( vcount==VTXTS_BEG )
  625.       vtxtscr <= 1'b1;
  626.  
  627.      if ( vcount==VSYNC_BEG )
  628.       vsync <= 1'b1;
  629.      else if ( vcount==VSYNC_END )
  630.       vsync <= 1'b0;
  631.  
  632.      if ( vcount==VBORD_BEG )
  633.       begin
  634.        vbord <= 1'b1;
  635.        vsetka <= 4'd5;
  636.        vchess <= 5'd0;
  637.        circle <= 1'b0;
  638.        bccount <= 7'd0;
  639.        sccount <= 5'd0;
  640.        bcdir <= 2'b00;
  641.        scdir <= 2'b00;
  642.       end
  643.      else
  644.       begin
  645.  
  646.        if (bcdir[0])
  647.         bccount <= bccount+7'd1;
  648.        else if (bcdir[1])
  649.         bccount <= bccount-7'd1;
  650.  
  651.        if (scdir[0])
  652.         sccount <= sccount+5'd1;
  653.        else if (scdir[1])
  654.         sccount <= sccount-5'd1;
  655.  
  656.        if ( vsetka==4'd14 )
  657.         begin
  658.          vsetka <= 4'd0;
  659.          vchess <= vchess+5'd1;
  660.         end
  661.        else
  662.         begin
  663.          vsetka <= vsetka+4'd1;
  664.          if ( vsetka==4'd13 )
  665.           begin
  666.            if (vchess==5'd1)
  667.             bcdir <= 2'b01;
  668.            else if (vchess==5'd9)
  669.             bcdir <= 2'b10;
  670.            else if (vchess==5'd17)
  671.             bcdir <= 2'b00;
  672.            if ( (vchess==5'd0) || (vchess==5'd14) )
  673.             scdir <= 2'b01;
  674.            else if ( (vchess==5'd2) || (vchess==5'd16) )
  675.             scdir <= 2'b10;
  676.            else if ( (vchess==5'd4) || (vchess==5'd18) )
  677.             scdir <= 2'b00;
  678.           end
  679.         end
  680.  
  681.        if ( vcount==VBORD_END ) vbord <= 1'b0;
  682.  
  683.       end
  684.  
  685.      vmouse <= vcount - scr_mouse_y;
  686.  
  687.     end
  688.    //
  689.    if ( (hchess==5'd2) || (hchess==5'd10) || (hchess==5'd20) )
  690.     hhole <= 1'b1;
  691.    else if ( (hchess==5'd4) || (hchess==5'd14) || (hchess==5'd22) )
  692.     hhole <= 1'b0;
  693.    //
  694.    if ( (vchess==5'd4) && (schcnt==6'd63) )
  695.     begin
  696.      if (hchess==5'd7)
  697.       uhole <= 1'b1;
  698.      else if (hchess==5'd17)
  699.       uhole <= 1'b0;
  700.     end
  701.    //
  702.    if (hcount==(9'd258+cb_val))
  703.     circle <= 1'b0;
  704.    else if ( (schcnt==(5'd31+cs_val)) && (sccount!=5'd0) )
  705.     circle <= 1'b0;
  706.    else if (hcount==(9'd257-cb_val))
  707.     circle <= 1'b1;
  708.    else if ( (schcnt==(5'd30-cs_val)) && (sccount!=5'd0) )
  709.     circle <= 1'b1;
  710.    //
  711.    if ( (((vchess==5'd2) || (vchess==5'd16)) && (vsetka==4'd7)) || (vchess==5'd9) )
  712.     vhole <= 1'b1;
  713.    else if ( (((vchess==5'd3) || (vchess==5'd17)) && (vsetka==4'd7)) || (vchess==5'd11) )
  714.     vhole <= 1'b0;
  715.    //
  716.   end
  717.  
  718.  circl_b ccb ( .in_addr(bccount), .out_word(cb_val) );
  719.  circl_s ccs ( .in_addr(sccount), .out_word(cs_val) );
  720.  
  721.  lpm_rom_7x2 mouse_cursor ( .address({ vmouse[3:0], hmouse[2:0] }), .q({ mouse_i, mouse_m }) );
  722.  assign mouse_here = (hmouse[8:3] == 6'd0) && (vmouse[8:4] == 5'd0);
  723.  assign mouse_mask = mouse_here & mouse_m;
  724.  assign mouse_image = mouse_here & mouse_i;
  725.  
  726.  assign video_addr = voffset + { 4'h0, hcharcount[5:0] };
  727.  lpm_ram_dp_9x8 scrmem0  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h0)),
  728.                            .rdaddress(video_addr[8:0]), .q(charcode0) );
  729.  lpm_ram_dp_9x8 scrmem1  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h1)),
  730.                            .rdaddress(video_addr[8:0]), .q(charcode1) );
  731.  lpm_ram_dp_9x8 scrmem2  ( .data(indata), .wraddress(scr_addr[8:0]), .wren((scr_wren_c)&&(scr_addr[10:9]==2'h2)),
  732.                            .rdaddress(video_addr[8:0]), .q(charcode2) );
  733.  assign charcode = (video_addr[10:9]==2'h0) ? charcode0 :
  734.                    (video_addr[10:9]==2'h1) ? charcode1 : charcode2 ;
  735.  lpm_ram_dp_9x8 attrmem0 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h0)),
  736.                            .rdaddress(video_addr[8:0]), .q(attrcode0) );
  737.  lpm_ram_dp_9x8 attrmem1 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h1)),
  738.                            .rdaddress(video_addr[8:0]), .q(attrcode1) );
  739.  lpm_ram_dp_9x8 attrmem2 ( .data(scr_attr), .wraddress(scr_addr[8:0]), .wren((scr_wren_a)&&(scr_addr[10:9]==2'h2)),
  740.                            .rdaddress(video_addr[8:0]), .q(attrcode2) );
  741.  assign attrcode = (video_addr[10:9]==2'h0) ? attrcode0 :
  742.                    (video_addr[10:9]==2'h1) ? attrcode1 : attrcode2 ;
  743.  assign vcharline = (vcharlinecount[3]) ? ~vcharlinecount[2:0] : vcharlinecount[2:0];
  744.  lpm_rom_11x6 chargen ( .address({ charcode, vcharline }), .q(charpix) );
  745.  
  746.  assign fcolor = { attrcode[2], (attrcode[2]&attrcode[3]),
  747.                    attrcode[1], (attrcode[1]&attrcode[3]),
  748.                    attrcode[0], (attrcode[0]&attrcode[3]) };
  749.  assign bcolor = { (attrcode[6]&attrcode[7]), (attrcode[6]&(~attrcode[7])),
  750.                    (attrcode[5]&attrcode[7]), (attrcode[5]&(~attrcode[7])),
  751.                    (attrcode[4]&attrcode[7]), (attrcode[4]&(~attrcode[7])) };
  752.  assign fontenable = (charcode[7:4]==4'hb)||
  753.                      (charcode[7:4]==4'hc)||
  754.                      (charcode[7:4]==4'hd)||
  755.                      (~vcharlinecount[3]);
  756.  assign pixel = ( charcode==8'hb0 ) ? ( (vcount[0]^hcount[1])&~hcount[0] ) :
  757.                 ( charcode==8'hb1 ) ? (  vcount[0]^hcount[0]             ) :
  758.                 ( charcode==8'hb2 ) ? ( (vcount[0]^hcount[1])| hcount[0] ) :
  759.                 ( fontenable ) ? charpix[3'd5-pixptr] : 1'b0;
  760.  
  761.  assign image_color = (mouse_mask) ? BLACK : ( pixel ? fcolor : bcolor ) ;
  762.  
  763.  assign { vgrn[1:0], vred[1:0], vblu[1:0] } = color;
  764.  assign vhsync = hsync;
  765.  assign vvsync = vsync;
  766.  assign vcsync = ~csync;
  767.  
  768. //--AVRSPI--FlashROM-----------------------------------------------------------
  769.  
  770.  localparam TEMP_REG      = 8'ha0;
  771.  
  772.  localparam SD_CS0        = 8'ha1;
  773.  localparam SD_CS1        = 8'ha2;
  774.  localparam FLASH_LOADDR  = 8'ha3;
  775.  localparam FLASH_MIDADDR = 8'ha4;
  776.  localparam FLASH_HIADDR  = 8'ha5;
  777.  localparam FLASH_DATA    = 8'ha6;
  778.  localparam FLASH_CTRL    = 8'ha7;
  779.  localparam SCR_LOADDR    = 8'ha8;
  780.  localparam SCR_HIADDR    = 8'ha9;
  781.  localparam SCR_SET_ATTR  = 8'haa; // чряшё№ т ATTR
  782.  localparam SCR_FILL      = 8'hab; // яЁхфшэъЁхьхэЄ рфЁхёр ш чряшё№ т ATTR ш т ярь Є№
  783.                                    // (хёыш Єюы№ъю фхЁурЄ№ spics_n, Єю т ярь Є№ сєфхЄ яшёрЄ№ё  яЁхф√фє∙хх чэрўхэшх)
  784.  localparam SCR_CHAR      = 8'hac; // яЁхфшэъЁхьхэЄ рфЁхёр ш чряшё№ т ярь Є№ ёшьтюыют ш ATTR т ярь Є№ рЄЁшсєЄют
  785.                                    // (хёыш Єюы№ъю фхЁурЄ№ spics_n, Єю т ярь Є№ сєфхЄ яшёрЄ№ё  яЁхф√фє∙шх чэрўхэш )
  786.  localparam SCR_MOUSE_X   = 8'had;
  787.  localparam SCR_MOUSE_Y   = 8'hae;
  788.  localparam SCR_MODE      = 8'haf; // [7] - 0=VGAmode, 1=TVmode; [2:0] - 0=TXT, шэрўх ScrTESTs
  789.  
  790.  localparam MTST_CONTROL  = 8'h50; // [0] - ЄхёЄ ярь Єш (0=ёсЁюё, 1=ЁрсюЄр)
  791.  localparam MTST_PASS_CNT0= 8'h51;
  792.  localparam MTST_PASS_CNT1= TEMP_REG;
  793.  localparam MTST_FAIL_CNT0= 8'h52;
  794.  localparam MTST_FAIL_CNT1= TEMP_REG;
  795.  
  796.  localparam COVOX         = 8'h53;
  797.  
  798.  localparam INT_CONTROL   = 8'h54; // [0] - ЁрчЁх°хэшх яЁхЁ√трэшщ юЄ covox-р (27343.75 Hz)
  799.                                    // [1] - ЁрчЁх°хэшх ърфЁют√ї яЁхЁ√трэшщ (~49 Hz)
  800.  
  801.  reg [7:0] number;          initial number = 8'hff;
  802.  reg [7:0] indata;          initial indata = 8'hff;
  803.  reg [7:0] outdata;
  804.  reg [2:0] bitptr;
  805.  reg prev_spics_n;
  806.  reg [18:0] flash_addr;
  807.  reg flash_cs;              initial flash_cs = 1'b0;
  808.  reg flash_oe;              initial flash_oe = 1'b0;
  809.  reg flash_we;              initial flash_we = 1'b0;
  810.  reg flash_postinc;         initial flash_postinc = 1'b0;
  811.  reg [7:0] flash_data_out;
  812.  reg [10:0] scr_addr;       initial scr_addr = 11'h000;
  813.  reg [7:0] scr_attr;        initial scr_attr = 8'h0f;
  814.  reg scr_wren_c;            initial scr_wren_c = 1'b0;
  815.  reg scr_wren_a;            initial scr_wren_a = 1'b0;
  816.  reg [8:0] scr_mouse_x;     initial scr_mouse_x = 9'd0;
  817.  reg [8:0] scr_mouse_y;     initial scr_mouse_y = 9'd0;
  818.  reg scr_tv_mode;           initial scr_tv_mode = 1'b1;
  819.  reg [2:0] scr_mode;        initial scr_mode = 3'b0;
  820.  wire spicsn_rising;
  821.  wire spicsn_falling;
  822.  wire sd_selected;
  823.  reg cs_trg;
  824.  reg [7:0] temp_reg;
  825.  
  826.  always @(posedge spick)
  827.   begin
  828.    if ( spics_n )
  829.     number <= { number[6:0], spido };
  830.    else
  831.     indata <= { indata[6:0], spido };
  832.   end
  833.  
  834.  always @(negedge spick or posedge spics_n)
  835.   begin
  836.    if ( spics_n )
  837.     bitptr <= 3'b111;
  838.    else
  839.     bitptr <= bitptr - 3'b001;
  840.   end
  841.  
  842.  always @(posedge fclk)
  843.   begin
  844.    //
  845.    if ( spicsn_rising )
  846.     begin
  847.      //
  848.      cs_trg <= 1'b1;
  849.      //
  850.      case ( number )
  851.       FLASH_LOADDR:  flash_addr[7:0] <= indata;
  852.       FLASH_MIDADDR: flash_addr[15:8] <= indata;
  853.       FLASH_HIADDR:  flash_addr[18:16] <= indata[2:0];
  854.       FLASH_DATA:    begin
  855.                       flash_data_out <= indata;
  856.                       if (flash_postinc) flash_addr[13:0] <= flash_addr[13:0] + 14'd1;
  857.                      end
  858.       FLASH_CTRL:    begin
  859.                       flash_cs <= indata[0];
  860.                       flash_oe <= indata[1];
  861.                       flash_we <= indata[2];
  862.                       flash_postinc <= indata[3];
  863.                      end
  864.       SCR_LOADDR:    scr_addr[7:0] <= indata;
  865.       SCR_HIADDR:    scr_addr[10:8] <= indata[2:0];
  866.       SCR_SET_ATTR:  scr_attr <= indata;
  867.       SCR_FILL:      begin
  868.                       scr_attr <= indata;
  869.                       scr_wren_a <= 1'b1;
  870.                      end
  871.       SCR_CHAR:      begin
  872.                       scr_wren_c <= 1'b1;
  873.                       scr_wren_a <= 1'b1;
  874.                      end
  875.       TEMP_REG:      temp_reg <= indata;
  876.       SCR_MOUSE_X:   scr_mouse_x <= { temp_reg[0], indata };
  877.       SCR_MOUSE_Y:   scr_mouse_y <= { temp_reg[0], indata };
  878.       SCR_MODE:      begin
  879.                       scr_tv_mode <= indata[7];
  880.                       scr_mode <= indata[2:0];
  881.                      end
  882.       MTST_CONTROL:  mtst_run <= indata[0];
  883.       COVOX:         begin
  884.                       covox[cvx_ptr_iinc] <= indata;
  885.                       cvx_ptr_in <= cvx_ptr_iinc;
  886.                      end
  887.       INT_CONTROL:   begin
  888.                       enable_covox_int <= indata[0];
  889.                       enable_frame_int <= indata[1];
  890.                      end
  891.      endcase
  892.      //
  893.     end
  894.    else
  895.    begin
  896.     //
  897.     scr_wren_c <= 1'b0;
  898.     scr_wren_a <= 1'b0;
  899.     //
  900.     if ( spicsn_falling )
  901.      begin
  902.       //
  903.       cs_trg <= 1'b0;
  904.       //
  905.       case ( number )
  906.        SCR_SET_ATTR:  outdata <= ~scr_attr; // for SPI testing
  907.        SCR_FILL:      begin
  908.                        outdata <= 8'hff;
  909.                        scr_addr <= scr_addr + 11'd1;
  910.                       end
  911.        SCR_CHAR:      begin
  912.                        outdata <= 8'hff;
  913.                        scr_addr <= scr_addr + 11'd1;
  914.                       end
  915.        FLASH_DATA:    outdata <= d;
  916.        MTST_PASS_CNT0:begin
  917.                        outdata <= mtst_pass_counter[7:0];
  918.                        temp_reg <= mtst_pass_counter[15:8];
  919.                       end
  920.        MTST_FAIL_CNT0:begin
  921.                        outdata <= mtst_fail_counter[7:0];
  922.                        temp_reg <= mtst_fail_counter[15:8];
  923.                       end
  924.        COVOX:         outdata <= { 4'd0, cvx_ptr_diff };
  925.        TEMP_REG:      outdata <= temp_reg; // read after MTST_PASS_CNT0, MTST_FAIL_CNT0
  926.        default:       outdata <= 8'hff;
  927.       endcase
  928.       //
  929.      end
  930.     //
  931.    end
  932.    //
  933.    prev_spics_n <= spics_n;
  934.    //
  935.   end
  936.  
  937.  assign spicsn_rising  = ( { cs_trg, prev_spics_n, spics_n } == 3'b011 );
  938.  assign spicsn_falling = ( { cs_trg, prev_spics_n, spics_n } == 3'b100 );
  939.  
  940.  assign sd_selected = ( ( (number==SD_CS0) || (number==SD_CS1) ) && (~spics_n) );
  941.  assign spidi = sd_selected ? sddi : outdata[bitptr];
  942.  assign sddo  = sd_selected ? spido : 1'b1;
  943.  assign sdclk = sd_selected ? spick : 1'b0;
  944.  assign sdcs_n = !( (number==SD_CS0) && (~spics_n) );
  945.  
  946.  assign a[13:0]  =  flash_addr[13:0];
  947.  assign rompg0_n = ~flash_addr[14];
  948.  assign { rompg4, rompg3, rompg2, dos_n } = flash_addr[18:15];
  949.  assign csrom   =  flash_cs;
  950.  assign romoe_n = ~flash_oe;
  951.  assign romwe_n = ~flash_we;
  952.  assign d = flash_oe ? 8'bZZZZZZZZ : flash_data_out;
  953.  
  954. //-----------------------------------------------------------------------------
  955.  
  956.  reg mtst_run;      initial mtst_run = 1'b0;
  957.  wire [15:0] mtst_pass_counter;
  958.  wire [15:0] mtst_fail_counter;
  959.  
  960.  mem_tester mtst( .clk(fclk), .rst_n(mtst_run),
  961.                   .pass_counter(mtst_pass_counter),
  962.                   .fail_counter(mtst_fail_counter),
  963.                   .DRAM_DQ(rd), .DRAM_MA(ra), .DRAM_RAS0_N(rras0_n), .DRAM_RAS1_N(rras1_n),
  964.                   .DRAM_LCAS_N(rlcas_n), .DRAM_UCAS_N(rucas_n), .DRAM_WE_N(rwe_n) );
  965.  
  966. //-----------------------------------------------------------------------------
  967.  
  968. endmodule
  969.