Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Multitap
- (
- input strobe_in,
- input clock1_in,
- input clock2_in,
- output reg [1:0] joy1_data_out,
- output reg [4:0] joy2_data_out,
- output [3:0] strobe_out,
- output reg [3:0] clock_out,
- input [3:0] data_in,
- input ext_clock,
- input control_strobe,
- input control_clock,
- input control_data
- );
- reg [11:0] control;
- reg control_parity;
- reg [11:0] control_receiver;
- reg [3:0] control_counter;
- reg [4:0] counter1;
- reg [4:0] counter2;
- assign strobe_out[0] = strobe_in;
- assign strobe_out[1] = strobe_in;
- assign strobe_out[2] = strobe_in;
- assign strobe_out[3] = strobe_in;
- wire [3:0] joy_data;
- reg allow_clock_1;
- reg allow_clock_2;
- gamepad gamepad1(strobe_in, clock_out[0], data_in[0], joy_data[0], !control[0] && control[7]);
- gamepad gamepad2(strobe_in, clock_out[1], data_in[1], joy_data[1], !control[0] && control[8]);
- gamepad gamepad3(strobe_in, clock_out[2], data_in[2], joy_data[2], !control[0] && control[9]);
- gamepad gamepad4(strobe_in, clock_out[3], data_in[3], joy_data[3], !control[0] && control[10]);
- always @ (*)
- begin
- if (strobe_in) // sleep mode
- begin
- joy1_data_out[1:0] <= 2'bZZ;
- joy2_data_out[4:0] <= 5'bZZZZZ;
- end else begin
- if (control[0] == 0 && control[1] == 0) // Multitap
- begin
- if (control[2]) // Multitap, NES mode
- begin
- clock_out[0] <= (counter1 <= 8) ? clock1_in : 1;
- clock_out[1] <= (counter2 <= 8) ? clock2_in : 1;
- clock_out[2] <= (counter1 > 8 && counter1 <= 16) ? clock1_in : 1;
- clock_out[3] <= (counter2 > 8 && counter2 <= 16) ? clock2_in : 1;
- if (counter1 <= 8)
- joy1_data_out[0] <= joy_data[0];
- else if (counter1 <= 16)
- joy1_data_out[0] <= joy_data[2];
- else if (counter1 == 20)
- joy1_data_out[0] <= 0;
- else
- joy1_data_out[0] <= 1;
- if (counter2 <= 8)
- joy2_data_out[0] <= joy_data[1];
- else if (counter2 <= 16)
- joy2_data_out[0] <= joy_data[3];
- else if (counter2 == 19)
- joy2_data_out[0] <= 0;
- else
- joy2_data_out[0] <= 1;
- joy1_data_out[1] <= 1'bZ;
- joy2_data_out[4:1] <= 4'bZZZZ;
- end else begin // Multitap, Famicom mode
- clock_out[0] <= clock1_in;
- clock_out[1] <= clock2_in;
- clock_out[2] <= clock1_in;
- clock_out[3] <= clock2_in;
- joy1_data_out[0] <= joy_data[0];
- joy2_data_out[0] <= joy_data[1];
- joy1_data_out[1] <= joy_data[2];
- joy2_data_out[1] <= joy_data[3];
- joy2_data_out[4:2] <= 3'bZZZ;
- end
- end
- else if (control[0] == 0 && control[1] == 1) // switch
- begin
- joy1_data_out[1] <= 1'bZ;
- joy2_data_out[4:1] <= 3'bZZZZ;
- if (control[2] == 0) // 1 player
- begin
- clock_out[0] <= clock1_in;
- clock_out[1] <= clock1_in;
- clock_out[2] <= clock1_in;
- clock_out[3] <= clock1_in;
- joy1_data_out[0] <= ((joy_data[0] || !control[3]) &&
- (joy_data[1] || !control[4]) &&
- (joy_data[2] || !control[5]) &&
- (joy_data[3] || !control[6]));
- joy2_data_out[0] <= 1'bZ;
- end else begin // 2 players
- clock_out[{control[4], control[3]}] <= clock1_in;
- clock_out[{control[6], control[5]}] <= clock2_in;
- joy1_data_out[0] <= joy_data[{control[4], control[3]}];
- joy2_data_out[0] <= joy_data[{control[6], control[5]}];
- end
- end
- else if (control[0] == 1) // Arkanoid controller
- begin
- // Connect regular controller on port 1 to port 1
- clock_out[0] <= clock1_in;
- clock_out[1] <= clock1_in;
- clock_out[2] <= clock1_in;
- clock_out[3] <= clock1_in;
- // All four controllers as first
- joy1_data_out[0] <= joy_data[0] && joy_data[1] && joy_data[2] && joy_data[3];
- if (control[2]) // Arkanoid controller, NES mode
- begin
- joy2_data_out[3] <= control[1];
- joy2_data_out[4] <= control[11-counter2];
- joy1_data_out[1] <= 1'bZ;
- joy2_data_out[2:1] <= 2'bZZ;
- end else begin // Arkanoid controller, Famicom mode
- joy1_data_out[1] <= control[1];
- joy2_data_out[1] <= control[11-counter2];
- joy2_data_out[4:2] <= 3'bZZZ;
- joy2_data_out[0] <= 1'bZ;
- end
- end
- end
- end
- always @ (posedge strobe_in, posedge clock1_in)
- begin
- if (strobe_in)
- counter1 <= 1;
- else if (counter1 < 31 /*&& allow_clock_1*/)
- counter1 <= counter1 + 1;
- end
- always @ (posedge strobe_in, posedge clock2_in)
- begin
- if (strobe_in)
- counter2 <= 1;
- else if (counter2 < 31 /*&& allow_clock_2*/)
- counter2 <= counter2 + 1;
- end
- always @ (posedge control_strobe, posedge control_clock)
- begin
- if (control_strobe)
- begin
- control_counter = 0;
- control_parity = 0;
- end else begin
- if (control_counter <= 11)
- begin
- control_receiver[control_counter] = control_data;
- control_parity = control_parity ^ control_data;
- end;
- if (control_counter < 12)
- control_counter = control_counter + 1;
- end
- end
- always @ (posedge strobe_in)
- begin
- if (control_counter == 12 && !control_parity)
- control = control_receiver;
- end
- endmodule
- module gamepad
- (input strobe,
- input clk_in,
- input data_in,
- output reg data_out,
- input invert_ab
- );
- reg a, b;
- reg [2:0] button_num_write;
- always @ (posedge strobe, posedge clk_in)
- begin
- if (strobe)
- button_num_write = 0;
- else
- if (button_num_write < 7)
- button_num_write = button_num_write + 1;
- end
- always @ (*)
- begin
- if (!invert_ab)
- data_out = data_in;
- else begin
- case (button_num_write)
- 0: begin
- if (!clk_in) a = data_in;
- data_out = b;
- end
- 1: begin
- if (!clk_in) b = data_in;
- data_out = a;
- end
- default: data_out = data_in;
- endcase
- end
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement