Top secrets sources NedoPC pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

// ZX-Evo Base Configuration (c) NedoPC 2014
//
// CMOS emulator: cmos is needed for zxevo.rom to function correctly

/*
    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/>.
*/


module cmosemu
(
        input  wire       zclk,

        input  wire       cmos_req,
        input  wire [7:0] cmos_addr,
        input  wire       cmos_rnw,
        output reg  [7:0] cmos_read,
        input  wire [7:0] cmos_write
);

        reg [7:0] mem [0:239];

        reg req_r;

        function [7:0] cmos_rd
        (
                input [7:0] addr
        );

                if( addr<8'd240 )
                        cmos_rd = mem[addr];
                else
                        cmos_rd = 8'hFF;
        endfunction

        task cmos_wr
        (
                input [7:0] addr,
                input [7:0] data
        );
                if( addr<8'd240 )
                        mem[addr] <= data;
        endtask



        initial
        begin
                int i;
                for(i=0;i<256;i=i+1)
                        mem[i] <= 8'd0;
        end


        always @(posedge zclk)
                req_r <= cmos_req;

        always @(posedge zclk)
        begin
                cmos_read <= cmos_rd(cmos_addr);

                if( req_r && !cmos_rnw )
                        cmos_wr(cmos_addr,cmos_write);
        end



endmodule