// ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014
//
// MUXes mouse and kbd data in two single databusses for zports
/*
This file is part of ZX-Evo Base Configuration firmware.
ZX-Evo Base Configuration firmware is free software:
you can redistribute it and/or modify it under the terms of
the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZX-Evo Base Configuration firmware is distributed in the hope that
it will be useful, but WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZX-Evo Base Configuration firmware.
If not, see <http://www.gnu.org/licenses/>.
*/
`include "../include/tune.v"
module zkbdmus(
input wire fclk,
input wire rst_n,
input wire [39:0] kbd_in, // key bits
input wire kbd_stb, // and strobe
input wire [ 7:0] mus_in,
input wire mus_xstb,
input wire mus_ystb,
input wire mus_btnstb,
input wire kj_stb,
input wire [7:0] zah,
output wire [ 4:0] kbd_data,
output wire [ 7:0] mus_data,
output reg [ 4:0] kj_data
);
reg [39:0] kbd;
reg [ 7:0] musx,musy,musbtn;
wire [4:0] keys [0:7]; // key matrix
reg [4:0] kout; // wire AND
`ifdef SIMULATE
initial
begin
// force kbd_data = 5'b11111;
force mus_data = 8'hFF;
force kj_data = 5'b00000;
kbd = 40'd0;
end
`endif
// store data from slavespi
//
always @(posedge fclk)
begin
if( kbd_stb )
kbd <= kbd_in;
if( mus_xstb )
musx <= mus_in;
if( mus_ystb )
musy <= mus_in;
if( mus_btnstb )
musbtn <= mus_in;
if( kj_stb )
kj_data <= mus_in[4:0];
end
// make keys
//
assign keys[0]={kbd[00],kbd[08],kbd[16],kbd[24],kbd[32]};// v c x z CS
assign keys[1]={kbd[01],kbd[09],kbd[17],kbd[25],kbd[33]};// g f d s a
assign keys[2]={kbd[02],kbd[10],kbd[18],kbd[26],kbd[34]};// t r e w q
assign keys[3]={kbd[03],kbd[11],kbd[19],kbd[27],kbd[35]};// 5 4 3 2 1
assign keys[4]={kbd[04],kbd[12],kbd[20],kbd[28],kbd[36]};// 6 7 8 9 0
assign keys[5]={kbd[05],kbd[13],kbd[21],kbd[29],kbd[37]};// y u i o p
assign keys[6]={kbd[06],kbd[14],kbd[22],kbd[30],kbd[38]};// h j k l EN
assign keys[7]={kbd[07],kbd[15],kbd[23],kbd[31],kbd[39]};// b n m SS SP
//
always @*
begin
kout = 5'b11111;
kout = kout & ({5{zah[0]}} | (~keys[0]));
kout = kout & ({5{zah[1]}} | (~keys[1]));
kout = kout & ({5{zah[2]}} | (~keys[2]));
kout = kout & ({5{zah[3]}} | (~keys[3]));
kout = kout & ({5{zah[4]}} | (~keys[4]));
kout = kout & ({5{zah[5]}} | (~keys[5]));
kout = kout & ({5{zah[6]}} | (~keys[6]));
kout = kout & ({5{zah[7]}} | (~keys[7]));
end
//
assign kbd_data = kout;
// make mouse
// FADF - buttons, FBDF - x, FFDF - y
//
assign mus_data = zah[0] ? ( zah[2] ? musy : musx ) : musbtn;
endmodule