Subversion Repositories pentevo

Rev

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

  1. // ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014
  2. //
  3. // mix up border and pixels, add palette and blanks
  4.  
  5. /*
  6.     This file is part of ZX-Evo Base Configuration firmware.
  7.  
  8.     ZX-Evo Base Configuration firmware is free software:
  9.     you can redistribute it and/or modify it under the terms of
  10.     the GNU General Public License as published by
  11.     the Free Software Foundation, either version 3 of the License, or
  12.     (at your option) any later version.
  13.  
  14.     ZX-Evo Base Configuration firmware is distributed in the hope that
  15.     it will be useful, but WITHOUT ANY WARRANTY; without even
  16.     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17.     See the GNU General Public License for more details.
  18.  
  19.     You should have received a copy of the GNU General Public License
  20.     along with ZX-Evo Base Configuration firmware.
  21.     If not, see <http://www.gnu.org/licenses/>.
  22. */
  23.  
  24. `include "../include/tune.v"
  25.  
  26. module video_palframe(
  27.  
  28.         input  wire        clk, // 28MHz clock
  29.  
  30.  
  31.         input  wire        hpix,
  32.         input  wire        vpix,
  33.  
  34.         input  wire        hblank,
  35.         input  wire        vblank,
  36.  
  37.         input  wire        hsync_start,
  38.         input  wire        vsync,
  39.  
  40.         input  wire [ 3:0] pixels,
  41.         input  wire [ 3:0] border,
  42.  
  43.         input  wire        border_sync,
  44.         input  wire        border_sync_ena,
  45.  
  46.         // ulaplus related
  47.         input  wire [ 1:0] up_palsel,
  48.         input  wire [ 2:0] up_paper,
  49.         input  wire [ 2:0] up_ink,
  50.         input  wire        up_pixel,
  51.  
  52.         input  wire        up_ena,
  53.         input  wire        up_palwr,
  54.         input  wire [ 5:0] up_paladdr,
  55.         input  wire [ 7:0] up_paldata,
  56.  
  57.         input  wire        atm_palwr,
  58.         input  wire [ 5:0] atm_paldata,
  59.         input  wire [ 5:0] atm_paldatalow,
  60.  
  61.         input  wire        pal444_ena,
  62.  
  63.         input  wire [ 1:0] modes_raster, // 2'b00 - pentagon raster (71680 clocks)
  64.                                          // 2'b01 - 60Hz raster
  65.                                          // 2'b10 - 48k raster (69888 clocks)
  66.                                          // 2'b11 - 128k raster (70908 clocks)
  67.          
  68.  
  69.         output wire [ 5:0] palcolor, // just for palette readback
  70.  
  71.         output wire [ 5:0] color
  72. );
  73.  
  74.         reg [11/*7*/:0] palette_read;  
  75.  
  76.         wire [ 3:0] zxcolor;
  77.         wire [ 5:0] up_color;
  78.         wire [ /*8*/7:0] palette_color;
  79.  
  80.         reg [3:0] synced_border;
  81.  
  82.         reg vsync_r;
  83.         reg [2:0/*1:0*/] ctr_14;
  84.         reg ctr_h;
  85.         //reg ctr_v;
  86.         reg [1:0] phase; //frame number
  87.  
  88.  
  89.  
  90.         always @(posedge clk)
  91.         if( border_sync )
  92.                 synced_border <= border;
  93.  
  94.         assign zxcolor = (hpix&vpix) ? pixels : (border_sync_ena ? synced_border : border);
  95.  
  96.         assign up_color = (hpix&vpix) ? {up_palsel,~up_pixel,up_pixel?up_ink:up_paper} : {3'd0,border[2:0]};
  97.  
  98.         assign palette_color = (up_ena&(modes_raster == 2'b11/*128K raster*/)) ? {/*3'b100*/2'b10,up_color} : {/*5'd0*/4'd0,zxcolor};
  99.  
  100.  
  101.         // palette
  102.         reg [/*7*/11:0] palette [0:/*511*/255]; // let quartus instantiate it as RAM
  103.  
  104.         always @(posedge clk)
  105.         begin
  106.                 if( atm_palwr || up_palwr )
  107.                 begin : palette_write
  108.                         reg [8:0] pal_addr;
  109.                         pal_addr = atm_palwr ? { 4'd0, zxcolor } : { 2'b10, up_paladdr };
  110.  
  111.                         palette[pal_addr] <= atm_palwr ?
  112.  
  113.                                              {atm_paldata[3:2],pal444_ena?atm_paldatalow[3:2]:atm_paldata[3:2],
  114.  
  115.                                               atm_paldata[5:4],pal444_ena?atm_paldatalow[5:4]:atm_paldata[5:4],
  116.  
  117.                                               atm_paldata[1:0],pal444_ena?atm_paldatalow[1:0]:atm_paldata[1:0]
  118.  
  119.                                              }
  120.  
  121.                                            : {up_paldata[7:5],up_paldata[5],up_paldata[4:2],up_paldata[2],up_paldata[1:0],up_paldata[0],up_paldata[0]};
  122.                 end
  123.  
  124.                 palette_read <= palette[palette_color];
  125.         end
  126.  
  127.  
  128.         assign palcolor = pal444_ena?
  129.  
  130.                           {palette_read[5:4],palette_read[9:8], palette_read[1:0]}
  131.  
  132.                          :{palette_read[7:6/*4:3*/],palette_read[11:10/*7:6*/], palette_read[3:2/*1:0*/]};
  133.  
  134.  
  135.  
  136.  
  137.         // make 3bit palette
  138.         always @(posedge clk)
  139.                 vsync_r <= vsync;
  140.         //
  141.         wire vsync_start = vsync && !vsync_r;
  142.         //
  143.         initial ctr_14 = 3'b000;
  144.         always @(posedge clk)
  145.                 ctr_14 <= ctr_14+3'b001;
  146.         //
  147.         initial ctr_h = 1'b0;
  148.         always @(posedge clk) if( hsync_start )
  149.                 ctr_h <= ~ctr_h;
  150.         //
  151.         //initial ctr_v = 1'b0;
  152.         //always @(posedge clk) if( vsync_start )
  153.         //      ctr_v <= ~ctr_v;
  154.         //
  155.  
  156.         initial phase = 2'b00;
  157.  
  158.         always @(posedge clk) if( vsync_start )
  159.  
  160.                 if (modes_raster == 2'b10/*48K raster*/) phase <= phase+2'b01;
  161.  
  162.  
  163.         //wire plus1 = ctr_14[1] ^ ctr_h ^ ctr_v;
  164.  
  165.  
  166.  
  167.  
  168.         wire [1:0] red;
  169.         wire [1:0] grn;
  170.         wire [1:0] blu;
  171.  
  172.  
  173.         wire bigpal_ena = up_ena | pal444_ena;
  174.  
  175.  
  176.         video_palframe_mk3bit red_color
  177.         (
  178.                 //.plus1    (plus1            ),
  179.  
  180.                 .phase    (phase),
  181.  
  182.                 .x        (ctr_14[2:1]      ),
  183.  
  184.                 .y        (ctr_h            ),
  185.  
  186.                 .color_in (palette_read[11:8/*7:5*/]),
  187.                 .color_out(red              )
  188.         );
  189.         //
  190.         video_palframe_mk3bit grn_color
  191.         (
  192.                 //.plus1    (plus1            ),
  193.                 .phase    (phase),
  194.  
  195.                 .x        (ctr_14[2:1]      ),
  196.  
  197.                 .y        (ctr_h            ),
  198.  
  199.                 .color_in (palette_read[7:4/*4:2*/]),
  200.                 .color_out(grn              )
  201.         );
  202.         //
  203.         video_palframe_mk3bit blu_color
  204.  
  205.         (
  206.  
  207.                 //.plus1    (plus1            ),
  208.  
  209.                 .phase    (phase),
  210.  
  211.                 .x        (ctr_14[2:1]      ),
  212.  
  213.                 .y        (ctr_h            ),
  214.  
  215.                 .color_in (palette_read[3:0/*4:2*/]),
  216.  
  217.                 .color_out(blu              )
  218.  
  219.         );
  220.  
  221.         //
  222.  
  223.         //assign blu = palette_read[1:0];
  224.  
  225.         assign color = (hblank | vblank) ? 6'd0 : {grn,red,blu};
  226.  
  227.  
  228. endmodule
  229.  
  230.  
  231.  
  232. module video_palframe_mk3bit
  233. (
  234.         //input  wire       plus1,
  235.         input  wire [1:0] phase,
  236.  
  237.         input  wire [1:0] x,
  238.  
  239.         input  wire       y,
  240.  
  241.  
  242.         input  wire [3:0/*2:0*/] color_in,
  243.         output reg  [1:0] color_out
  244. );
  245.  
  246.         reg [3:0] colorlevel;
  247.         reg [1:0] gridlevel;
  248.  
  249.         reg       gridy;
  250.  
  251.         reg [1:0] gridindex;
  252.  
  253.  
  254.         always @*
  255.  
  256.         begin
  257.  
  258.  
  259. //colorlevel_table[3:0] = {0,1,2,2,3, 4,5,6,6,7, 8,9,10,10,11, 12};
  260.  
  261.           case( color_in )
  262. /*              3'b000:  color_out <= 2'b00;
  263.                 3'b001:  color_out <= plus1 ? 2'b01 : 2'b00;
  264.                 3'b010:  color_out <= 2'b01;
  265.                 3'b011:  color_out <= plus1 ? 2'b10 : 2'b01;
  266.                 3'b100:  color_out <= 2'b10;
  267.                 3'b101:  color_out <= plus1 ? 2'b11 : 2'b10;
  268.  
  269.                 default: color_out <= 2'b11;
  270.  
  271.                 */
  272.  
  273.                 4'b0000: colorlevel = 4'b0000;
  274.                 4'b0001: colorlevel = 4'b0001;
  275.  
  276.                 4'b0010,
  277.  
  278.                 4'b0011: colorlevel = 4'b0010;
  279.  
  280.                 4'b0100: colorlevel = 4'b0011;
  281.  
  282.  
  283.  
  284.                 4'b0101: colorlevel = 4'b0100;
  285.  
  286.                 4'b0110: colorlevel = 4'b0101;
  287.  
  288.                 4'b0111,
  289.  
  290.                 4'b1000: colorlevel = 4'b0110;
  291.  
  292.                 4'b1001: colorlevel = 4'b0111;
  293.  
  294.  
  295.  
  296.                 4'b1010: colorlevel = 4'b1000;
  297.  
  298.                 4'b1011: colorlevel = 4'b1001;
  299.  
  300.                 4'b1100,
  301.  
  302.                 4'b1101: colorlevel = 4'b1010;
  303.  
  304.                 4'b1110: colorlevel = 4'b1011;
  305.  
  306.  
  307.  
  308.                 default: colorlevel = 4'b1100;
  309.  
  310.           endcase
  311.  
  312.  
  313.  
  314. //яюёъюы№ъє ь√ эр тїюфх ёърэфрсыхЁр, Єю яюфєЁютэш 1/4 ш 3/4 ьхцфє уыртэ√ьш єЁютэ ьш сєфєЄ ёърърЄ№ цшЁэ√ьш ышэш ьш
  315.  
  316. //Їшъёшь ¤Єю ёфтшуюь Їрч√ y яю ъёюЁє ё x[1] шьхээю фы  ¤Єшї яюфєЁютэхщ (фы  1/2 Єръющ Їшъё ёыюьрхЄ ёхЄъє)
  317.  
  318. //colorlevel_grid = {{0,2},{3,1}};
  319.  
  320.           gridy = y ^ (x[1] & colorlevel[0]);
  321.  
  322.           gridindex = {gridy+phase[1], x[0]+phase[0]};
  323.  
  324.           case(gridindex[1:0])
  325.  
  326.             2'b00: gridlevel = 2'b00;
  327.  
  328.             2'b01: gridlevel = 2'b10;
  329.  
  330.             2'b10: gridlevel = 2'b11;
  331.  
  332.             2'b11: gridlevel = 2'b01;
  333.  
  334.           endcase
  335.  
  336.        
  337.  
  338.           color_out = colorlevel[3:2] + ((colorlevel[1:0] > gridlevel[1:0]) ? 2'b01 : 2'b00);
  339.  
  340.         end
  341.  
  342. endmodule
  343.  
  344.