Advertisement
Guest User

NES/Famicom multitap and, arkanoid controller and switch

a guest
Jun 21st, 2015
1,559
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Multitap
  2.     (
  3.     input   strobe_in,
  4.     input clock1_in,
  5.     input clock2_in,
  6.     output reg [1:0] joy1_data_out,
  7.     output reg [4:0] joy2_data_out,
  8.        
  9.     output [3:0] strobe_out,
  10.     output reg [3:0] clock_out,
  11.     input [3:0] data_in,
  12.    
  13.     input ext_clock,
  14.     input control_strobe,
  15.     input control_clock,
  16.     input control_data
  17. );
  18.     reg [11:0] control;
  19.     reg control_parity;
  20.     reg [11:0] control_receiver;
  21.     reg [3:0] control_counter;
  22.  
  23.     reg [4:0] counter1;
  24.     reg [4:0] counter2;
  25.  
  26.     assign strobe_out[0] = strobe_in;
  27.     assign strobe_out[1] = strobe_in;
  28.     assign strobe_out[2] = strobe_in;
  29.     assign strobe_out[3] = strobe_in;
  30.    
  31.     wire [3:0] joy_data;
  32.    
  33.     reg allow_clock_1;
  34.     reg allow_clock_2;
  35.  
  36.     gamepad gamepad1(strobe_in, clock_out[0], data_in[0], joy_data[0], !control[0] && control[7]);
  37.     gamepad gamepad2(strobe_in, clock_out[1], data_in[1], joy_data[1], !control[0] && control[8]);
  38.     gamepad gamepad3(strobe_in, clock_out[2], data_in[2], joy_data[2], !control[0] && control[9]);
  39.     gamepad gamepad4(strobe_in, clock_out[3], data_in[3], joy_data[3], !control[0] && control[10]);
  40.    
  41.     always @ (*)
  42.     begin
  43.         if (strobe_in) // sleep mode
  44.         begin
  45.             joy1_data_out[1:0] <= 2'bZZ;
  46.             joy2_data_out[4:0] <= 5'bZZZZZ;
  47.         end else begin
  48.             if (control[0] == 0 && control[1] == 0) // Multitap
  49.             begin
  50.                 if (control[2]) // Multitap, NES mode
  51.                 begin
  52.                     clock_out[0] <= (counter1 <= 8) ? clock1_in : 1;
  53.                     clock_out[1] <= (counter2 <= 8) ? clock2_in : 1;
  54.                     clock_out[2] <= (counter1 > 8 && counter1 <= 16) ? clock1_in : 1;
  55.                     clock_out[3] <= (counter2 > 8 && counter2 <= 16) ? clock2_in : 1;
  56.  
  57.                     if (counter1 <= 8)
  58.                         joy1_data_out[0] <= joy_data[0];
  59.                     else if (counter1 <= 16)
  60.                         joy1_data_out[0] <= joy_data[2];
  61.                     else if (counter1 == 20)
  62.                         joy1_data_out[0] <= 0;
  63.                     else
  64.                         joy1_data_out[0] <= 1;
  65.    
  66.                     if (counter2 <= 8)
  67.                         joy2_data_out[0] <= joy_data[1];
  68.                     else if (counter2 <= 16)
  69.                         joy2_data_out[0] <= joy_data[3];
  70.                     else if (counter2 == 19)
  71.                         joy2_data_out[0] <= 0;
  72.                     else
  73.                         joy2_data_out[0] <= 1;
  74.            
  75.                     joy1_data_out[1] <= 1'bZ;
  76.                     joy2_data_out[4:1] <= 4'bZZZZ;
  77.                 end else begin // Multitap, Famicom mode           
  78.                     clock_out[0] <= clock1_in;
  79.                     clock_out[1] <= clock2_in;
  80.                     clock_out[2] <= clock1_in;
  81.                     clock_out[3] <= clock2_in;
  82.  
  83.                     joy1_data_out[0] <= joy_data[0];
  84.                     joy2_data_out[0] <= joy_data[1];
  85.                     joy1_data_out[1] <= joy_data[2];
  86.                     joy2_data_out[1] <= joy_data[3];
  87.  
  88.                     joy2_data_out[4:2] <= 3'bZZZ;              
  89.                 end
  90.             end
  91.             else if (control[0] == 0 && control[1] == 1) // switch
  92.             begin
  93.                 joy1_data_out[1] <= 1'bZ;
  94.                 joy2_data_out[4:1] <= 3'bZZZZ;
  95.                 if (control[2] == 0) // 1 player
  96.                 begin
  97.                     clock_out[0] <= clock1_in;
  98.                     clock_out[1] <= clock1_in;
  99.                     clock_out[2] <= clock1_in;
  100.                     clock_out[3] <= clock1_in;
  101.                     joy1_data_out[0] <= ((joy_data[0] || !control[3]) &&
  102.                          (joy_data[1] || !control[4]) &&
  103.                         (joy_data[2] || !control[5]) &&
  104.                         (joy_data[3] || !control[6]));
  105.                     joy2_data_out[0] <= 1'bZ;
  106.                 end else begin // 2 players
  107.                     clock_out[{control[4], control[3]}] <= clock1_in;
  108.                     clock_out[{control[6], control[5]}] <= clock2_in;
  109.                     joy1_data_out[0] <= joy_data[{control[4], control[3]}];
  110.                     joy2_data_out[0] <= joy_data[{control[6], control[5]}];
  111.                 end
  112.             end
  113.             else if (control[0] == 1) // Arkanoid controller
  114.             begin
  115.                 // Connect regular controller on port 1 to port 1
  116.                 clock_out[0] <= clock1_in;
  117.                 clock_out[1] <= clock1_in;
  118.                 clock_out[2] <= clock1_in;
  119.                 clock_out[3] <= clock1_in;
  120.                 // All four controllers as first
  121.                 joy1_data_out[0] <= joy_data[0] && joy_data[1] && joy_data[2] && joy_data[3];
  122.                
  123.                 if (control[2]) // Arkanoid controller, NES mode
  124.                 begin
  125.                     joy2_data_out[3] <= control[1];
  126.                     joy2_data_out[4] <= control[11-counter2];
  127.                     joy1_data_out[1] <= 1'bZ;
  128.                     joy2_data_out[2:1] <= 2'bZZ;
  129.                 end else begin // Arkanoid controller, Famicom mode
  130.                     joy1_data_out[1] <= control[1];
  131.                     joy2_data_out[1] <= control[11-counter2];
  132.                     joy2_data_out[4:2] <= 3'bZZZ;
  133.                     joy2_data_out[0] <= 1'bZ;
  134.                 end
  135.             end
  136.         end
  137.     end
  138.    
  139.     always @ (posedge strobe_in, posedge clock1_in)
  140.     begin
  141.         if (strobe_in)
  142.             counter1 <= 1;
  143.         else if (counter1 < 31 /*&& allow_clock_1*/)
  144.             counter1 <= counter1 + 1;
  145.     end
  146.  
  147.     always @ (posedge strobe_in, posedge clock2_in)
  148.     begin
  149.         if (strobe_in)
  150.             counter2 <= 1;
  151.         else if (counter2 < 31 /*&& allow_clock_2*/)
  152.             counter2 <= counter2 + 1;
  153.     end
  154.  
  155.     always @ (posedge control_strobe, posedge control_clock)
  156.     begin
  157.         if (control_strobe)    
  158.         begin
  159.             control_counter = 0;
  160.             control_parity = 0;
  161.         end else begin
  162.             if (control_counter <= 11)
  163.             begin
  164.                 control_receiver[control_counter] = control_data;
  165.                 control_parity = control_parity ^ control_data;
  166.             end;
  167.             if (control_counter < 12)
  168.                 control_counter = control_counter + 1;
  169.         end
  170.     end
  171.    
  172.     always @ (posedge strobe_in)
  173.     begin
  174.         if (control_counter == 12 && !control_parity)
  175.             control = control_receiver;
  176.     end
  177. endmodule
  178.  
  179. module gamepad
  180.     (input strobe,
  181.         input clk_in,
  182.         input data_in,
  183.         output reg data_out,
  184.         input invert_ab
  185. );
  186.     reg a, b;
  187.     reg [2:0] button_num_write;
  188.    
  189.     always @ (posedge strobe, posedge clk_in)
  190.     begin
  191.         if (strobe)
  192.             button_num_write = 0;
  193.         else
  194.             if (button_num_write < 7)
  195.             button_num_write = button_num_write + 1;
  196.     end
  197.  
  198.     always @ (*)
  199.     begin
  200.         if (!invert_ab)
  201.             data_out = data_in;
  202.         else begin
  203.             case (button_num_write)
  204.                 0: begin
  205.                     if (!clk_in) a = data_in;
  206.                     data_out = b;
  207.                 end
  208.                 1: begin
  209.                     if (!clk_in) b = data_in;
  210.                     data_out = a;
  211.                 end
  212.                 default: data_out = data_in;
  213.             endcase
  214.         end
  215.     end
  216. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement