Top secrets sources NedoPC pentevo

Rev

Rev 668 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

// ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014
//
// mix up border and pixels, add palette and blanks

/*
    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 video_palframe(

        input  wire        clk, // 28MHz clock


        input  wire        hpix,
        input  wire        vpix,

        input  wire        hblank,
        input  wire        vblank,

        input  wire        hsync_start,
        input  wire        vsync,

        input  wire [ 3:0] pixels,
        input  wire [ 3:0] border,

        input  wire        border_sync,
        input  wire        border_sync_ena,

        // ulaplus related
        input  wire [ 1:0] up_palsel,
        input  wire [ 2:0] up_paper,
        input  wire [ 2:0] up_ink,
        input  wire        up_pixel,

        input  wire        up_ena,
        input  wire        up_palwr,
        input  wire [ 5:0] up_paladdr,
        input  wire [ 7:0] up_paldata,

        input  wire        atm_palwr,
        input  wire [ 5:0] atm_paldata,


        output wire [ 5:0] palcolor, // just for palette readback

        output wire [ 5:0] color
);
        reg [7:0] palette_read;

        wire [ 3:0] zxcolor;
        wire [ 5:0] up_color;
        wire [ 8:0] palette_color;

        reg [3:0] synced_border;

        reg vsync_r;
        reg [1:0] ctr_14;
        reg ctr_h;
        reg ctr_v;


        always @(posedge clk)
        if( border_sync )
                synced_border <= border;

        assign zxcolor = (hpix&vpix) ? pixels : (border_sync_ena ? synced_border : border);

        assign up_color = (hpix&vpix) ? {up_palsel,~up_pixel,up_pixel?up_ink:up_paper} : {3'd0,border[2:0]};

        assign palette_color = up_ena ? {3'b100,up_color} : {5'd0,zxcolor};


        // palette
        reg [7:0] palette [0:511]; // let quartus instantiate it as RAM

        always @(posedge clk)
        begin
                if( atm_palwr || up_palwr )
                begin : palette_write
                        reg [8:0] pal_addr;
                        pal_addr = atm_palwr ? { 5'd0, zxcolor } : { 3'b100, up_paladdr };

                        palette[pal_addr] <= atm_palwr ? {atm_paldata[3:2],1'b0,atm_paldata[5:4],1'b0,atm_paldata[1:0]} : up_paldata;
                end

                palette_read <= palette[palette_color];
        end


        assign palcolor = {palette_read[4:3],palette_read[7:6], palette_read[1:0]};




        // make 3bit palette
        always @(posedge clk)
                vsync_r <= vsync;
        //
        wire vsync_start = vsync && !vsync_r;
        //
        initial ctr_14 = 2'b00;
        always @(posedge clk)
                ctr_14 <= ctr_14+2'b01;
        //
        initial ctr_h = 1'b0;
        always @(posedge clk) if( hsync_start )
                ctr_h <= ~ctr_h;
        //
        initial ctr_v = 1'b0;
        always @(posedge clk) if( vsync_start )
                ctr_v <= ~ctr_v;


        wire plus1 = ctr_14[1] ^ ctr_h ^ ctr_v;



        wire [1:0] red;
        wire [1:0] grn;
        wire [1:0] blu;

        video_palframe_mk3bit red_color
        (
                .plus1    (plus1            ),
                .color_in (palette_read[7:5]),
                .color_out(red              )
        );
        //
        video_palframe_mk3bit grn_color
        (
                .plus1    (plus1            ),
                .color_in (palette_read[4:2]),
                .color_out(grn              )
        );
        //
        assign blu = palette_read[1:0];

        assign color = (hblank | vblank) ? 6'd0 : {grn,red,blu};


endmodule

module video_palframe_mk3bit
(
        input  wire       plus1,

        input  wire [2:0] color_in,
        output reg  [1:0] color_out
);

        always @*
        case( color_in )
                3'b000:  color_out <= 2'b00;
                3'b001:  color_out <= plus1 ? 2'b01 : 2'b00;
                3'b010:  color_out <= 2'b01;
                3'b011:  color_out <= plus1 ? 2'b10 : 2'b01;
                3'b100:  color_out <= 2'b10;
                3'b101:  color_out <= plus1 ? 2'b11 : 2'b10;
                default: color_out <= 2'b11;
        endcase

endmodule