Subversion Repositories KoE_projects

Rev

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

  1. library ieee;
  2.   use ieee.std_logic_1164.all;
  3.   use ieee.std_logic_arith.all;
  4.   use ieee.std_logic_unsigned.all;
  5.  
  6. entity zx_main is
  7.   port (
  8.     pixel_clock         : in  std_logic;
  9.     ym_clk              : out std_logic;
  10.     main_state_counter  : out std_logic_vector(1 downto 0);
  11.     blk0_d              : in std_logic_vector(7 downto 0);
  12.     portfe              : in std_logic_vector(3 downto 0);
  13.     gfx_mode            : in std_logic_vector(5 downto 0); --atm (5..3), pent (2..0)
  14.     int_strobe          : out std_logic;
  15.     int_delay           : in std_logic_vector(9 downto 0);
  16.     ssii                : out std_logic;
  17.     ksii                : out std_logic;
  18.     vidr                : out std_logic_vector(4 downto 0);
  19.     vidg                : out std_logic_vector(4 downto 0);
  20.     vidb                : out std_logic_vector(4 downto 0);
  21.     pixelc              : out std_logic_vector(9 downto 0);
  22.     linec               : out std_logic_vector(9 downto 0);
  23.     flash               : in std_logic;
  24.     video_address       : out std_logic_vector(12 downto 0);
  25.     alco_address        : out std_logic_vector(14 downto 0);
  26.     pollitra_a          : out std_logic_vector(3 downto 0);
  27.     pollitra_awr        : out std_logic_vector(3 downto 0);
  28.     pollitra_d          : in std_logic_vector(15 downto 0);
  29.     border3             : in std_logic;
  30.     ega_address         : out std_logic_vector(12 downto 0);
  31.     otmtxt_address      : out std_logic_vector(16 downto 0)
  32. );
  33. end;
  34.  
  35. architecture koe_z of zx_main is
  36.  
  37. component ram
  38.   port (
  39.         clock           : IN  std_logic;
  40.         data            : IN  std_logic_vector(15 DOWNTO 0);
  41.         write_address   : IN  std_logic_vector(8 DOWNTO 0);
  42.         read_address    : IN  std_logic_vector(8 DOWNTO 0);
  43.         we              : IN  std_logic;
  44.         q               : OUT std_logic_vector(15 DOWNTO 0)
  45.  
  46. );
  47. end component;
  48.  
  49. component ram_border
  50.   port (
  51.         clock           : IN  std_logic;
  52.         data            : IN  std_logic_vector(3 DOWNTO 0);
  53.         write_address   : IN  std_logic_vector(8 DOWNTO 0);
  54.         read_address    : IN  std_logic_vector(8 DOWNTO 0);
  55.         we              : IN  std_logic;
  56.         q               : OUT std_logic_vector(3 DOWNTO 0)
  57.     );
  58. end component;
  59.  
  60. component otmfnt_rom
  61.     port
  62.     (
  63.         address     : IN STD_LOGIC_VECTOR (10 DOWNTO 0);
  64.         clock       : IN STD_LOGIC  := '1';
  65.         q           : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
  66.     );
  67. end component;
  68.  
  69. -- VGA screen constants
  70. constant horizontal_pixels                      : natural:=896;
  71. constant vertical_pixels                        : natural:=640;
  72. constant shadow_horizont                        : natural:=120;
  73. constant shadow_vertical                        : natural:=16;
  74. constant horizontal_size                        : natural:=768;
  75. constant vertical_size                          : natural:=608;
  76. constant screen_hor                             : natural:=512;
  77. constant screen_vert                            : natural:=384;
  78. constant ramka_ega_vert                         : natural:=192;
  79. constant ramka_ega_goriz                        : natural:=128;
  80. constant ssi_start                              : natural:=891;
  81. constant ssi_stop                               : natural:=38;
  82. constant hor_blank_start                        : natural:=849;
  83. constant hor_blank_stop                         : natural:=73;
  84.  
  85. signal  ym_counter                              : std_logic_vector (4 downto 0):=b"00000";  
  86. signal  main_state                              : std_logic_vector(3 downto 0):=b"0000";
  87. signal  zx_screen_counter                       : std_logic_vector(17 downto 0):=b"000000000000000000";
  88. signal  zx_screen_counter_low                   : std_logic_vector(16 downto 0):=b"00000000000000000";
  89. signal  alco_addr                               : std_logic_vector(2 downto 0);
  90. signal  adr_zx_video_attr                       : std_logic_vector(9 downto 0);
  91. signal  adr_zx_video_data                       : std_logic_vector(12 downto 0);
  92. signal  pixel_c                                 : std_logic_vector(9 downto 0):=b"0000000000";
  93. signal  line_c                                  : std_logic_vector(9 downto 0):=b"0000000000";
  94. signal  multic_buf0_clk                         : std_logic;
  95. signal  multic_buf0_data_in                     : std_logic_vector(15 downto 0);
  96. signal  multic_buf0_addr                        : std_logic_vector(8 downto 0);
  97. signal  multic_buf0_we                          : std_logic;
  98. signal  multic_buf0_data_out                    : std_logic_vector(15 downto 0);
  99. signal  int_str                                 : std_logic;
  100. signal  multic_buf1_clk                         : std_logic;
  101. signal  multic_buf1_data_in                     : std_logic_vector(15 downto 0);
  102. signal  multic_buf1_addr                        : std_logic_vector(8 downto 0);
  103. signal  multic_buf1_we                          : std_logic;
  104. signal  multic_buf1_data_out                    : std_logic_vector(15 downto 0);
  105. signal  goriz_border                            : std_logic;
  106. signal  zx_goriz_border                         : std_logic;
  107. signal  vert_border                             : std_logic;
  108. signal  border_buf0_clk                         : std_logic;
  109. signal  border_buf0_data_in                     : std_logic_vector(15 downto 0);
  110. signal  border_buf0_addr                        : std_logic_vector(8 downto 0);
  111. signal  border_buf0_we                          : std_logic;
  112. signal  border_buf0_data_out                    : std_logic_vector(15 downto 0);
  113. signal  border_buf_addr                         : std_logic_vector(8 downto 0);
  114. signal  border_buf1_clk                         : std_logic;
  115. signal  border_buf1_data_in                     : std_logic_vector(15 downto 0);
  116. signal  border_buf1_addr                        : std_logic_vector(8 downto 0);
  117. signal  border_buf1_we                          : std_logic;
  118. signal  border_buf1_data_out                    : std_logic_vector(15 downto 0);
  119. signal  pixel_data_buffer                       : std_logic_vector(7 downto 0);
  120. signal  pixel_data                              : std_logic_vector(7 downto 0);
  121. signal  attr_data_buffer                        : std_logic_vector(7 downto 0);
  122. signal  attr_data                               : std_logic_vector(7 downto 0);
  123. signal  mc_attr_data                            : std_logic_vector(7 downto 0);
  124. signal  mc_pixel_data                           : std_logic_vector(7 downto 0);
  125. signal  mc_future_data                          : std_logic_vector(7 downto 0);
  126. signal  border_data                             : std_logic_vector(3 downto 0);
  127. signal  border_delaybuffer                      : std_logic_vector(3 downto 0);
  128. signal  border_c                                : std_logic_vector(7 downto 0);
  129. signal  alco                                    : std_logic_vector(12 downto 0);
  130. signal  alco_buff                               : std_logic_vector(7 downto 0);
  131. signal  alco_r                                  : std_logic;
  132. signal  alco_g                                  : std_logic;
  133. signal  alco_b                                  : std_logic;
  134. signal  alco_i                                  : std_logic;
  135. signal  alco_hor_sdvig                          : std_logic_vector(3 downto 0);
  136. signal  alco_vert_sdvig                         : std_logic_vector(1 downto 0);
  137. signal  alco_sdvig                              : std_logic_vector(7 downto 0);
  138. signal  igrb                                    : std_logic_vector(3 downto 0);
  139. signal  vblank                                  : std_logic;
  140. signal  ena_x                                   : std_logic;
  141. signal  ena_y                                   : std_logic;
  142. signal  border                                  : std_logic;
  143. signal  line_ega                                : std_logic_vector(7 downto 0);
  144. signal  pixel_ega_vga                           : std_logic_vector(9 downto 0);
  145. signal  ega_adr_shift                           : std_logic_vector(12 downto 0);
  146. signal  ega_adr_x                               : std_logic_vector(5 downto 0);
  147. signal  otm_text_mojno                          : std_logic;
  148. signal  otm_fnt_out                             : std_logic_vector(7 downto 0);
  149. signal  otm_txt                                 : std_logic_vector(7 downto 0);
  150. signal  otmtxt_attr                             : std_logic_vector(7 downto 0);
  151. signal  otmtxt_addr_dobavka                     : std_logic_vector(10 downto 0);
  152. signal  otmtxt_addr                             : std_logic_vector(16 downto 0);
  153. signal  otm_fnt_clk                             : std_logic;
  154. signal  otm_fnt_addr                            : std_logic_vector(10 downto 0);
  155. signal  otmtxt_symbol_code                      : std_logic_vector(7 downto 0);
  156. signal  pixel_txt                               : std_logic_vector(6 downto 0);
  157. signal  pixel_data_strobe                       : std_logic:='0'; -- for modelsim only
  158. signal  attr_data_strobe                        : std_logic:='0'; -- for modelsim only
  159. signal  zx_s_c                                  : std_logic_vector(13 downto 0);
  160. signal  zx_pixel_c                              : std_logic_vector(8 downto 0);
  161.  
  162. begin
  163.  
  164. -- pixel_clock (114 MHz)
  165. --  _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _
  166. --   |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_|
  167. --
  168. -- main_state_counter0 (57 MHz)
  169. --  ___     ___     ___     ___     ___     ___     ___     ___     ___
  170. --     |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |
  171. --
  172. -- main_state_counter1 (28.5 MHz)
  173. --  ___  video  _______  video  _______  video  _______  video  _______
  174. --     |_______|  cpu  |_______|  cpu  |_______|  cpu  |_______|  cpu  |
  175. --
  176. -- main_state_counter:        _|10_|11_|00_|01_|10_|11_|00_|01_|10_|11_|00_|01_|10_ |11
  177. --__ video oe _________          ______________________________________  
  178. --                     \________/ fpga delay
  179. --   video data strobe          |-|____________________________________                    
  180. --________________________________/        
  181. --__ cpu oe ____________________         ______________________________
  182. --                              \_______/
  183. --__ cpu we ____________________         ______________________________
  184. --                              \_______/ fpga delay
  185. --   cpu data strobe                    |-|____________________________
  186. --________________________________________/
  187. --
  188. -- zx_screen_counter bits:
  189. -- 0 - x2 horizontal pixels, 512 VGA pixels => 256 ZX pixels
  190. -- 1...3 - 8 ZX pixels => 1 ZX symbol
  191. -- 4...8 - 32 symbols per line
  192. -- 9 - x2 vertical(384 VGA lines => 192 ZX lines)
  193. -- 10...17 - 192 lines
  194.  
  195. process (pixel_clock, border, gfx_mode)
  196. begin
  197.     if (pixel_clock'event and pixel_clock = '1') then
  198.         -- ym clk generation
  199.         ym_counter <= ym_counter + '1';
  200.         if (ym_counter > 29) then ym_counter <= (others =>'0'); ym_clk <= '1'; end if;
  201.         if (ym_counter = 15) then ym_clk <= '0'; end if;
  202.                         -- pixel data address generation
  203.         adr_zx_video_data(12 downto 11) <= zx_screen_counter_low(15 downto 14);
  204.         adr_zx_video_data(10 downto 8) <= zx_screen_counter_low(10 downto 8);
  205.         adr_zx_video_data(7 downto 5) <= zx_screen_counter_low(13 downto 11);
  206.         adr_zx_video_data(4 downto 0) <= zx_screen_counter_low(7 downto 3);
  207.         -- attributes address generation
  208.         adr_zx_video_attr(9 downto 8) <= zx_screen_counter_low(15 downto 14);
  209.         adr_zx_video_attr(7 downto 5) <= zx_screen_counter_low(13 downto 11);
  210.         adr_zx_video_attr(4 downto 0) <= zx_screen_counter_low(7 downto 3);
  211.                         -- moving right 16c Alco screen by 5.5 ZX pixels
  212.                         case (zx_screen_counter(3 downto 0)) is
  213.             when b"0000" => alco_addr(1 downto 0) <= b"10";
  214.             when b"0001" => alco_addr(1 downto 0) <= b"10";
  215.             when b"0010" => alco_addr(1 downto 0) <= b"10";
  216.             when b"0011" => alco_addr(1 downto 0) <= b"01";
  217.             when b"0100" => alco_addr(1 downto 0) <= b"01";
  218.             when b"0101" => alco_addr(1 downto 0) <= b"01";
  219.             when b"0110" => alco_addr(1 downto 0) <= b"01";
  220.             when b"0111" => alco_addr(1 downto 0) <= b"11";
  221.             when b"1000" => alco_addr(1 downto 0) <= b"11";
  222.             when b"1001" => alco_addr(1 downto 0) <= b"11";
  223.             when b"1010" => alco_addr(1 downto 0) <= b"11";
  224.             when b"1011" => alco_addr(1 downto 0) <= b"00";
  225.             when b"1100" => alco_addr(1 downto 0) <= b"00";
  226.             when b"1101" => alco_addr(1 downto 0) <= b"00";
  227.             when b"1110" => alco_addr(1 downto 0) <= b"00";
  228.             when b"1111" => alco_addr(1 downto 0) <= b"10";
  229.             when others => null;
  230.         end case;
  231.         -- final video address generation
  232.         if (zx_screen_counter(3 downto 0) = b"0000" and main_state(1 downto 0) = b"10")
  233.             then video_address(9 downto 0) <= adr_zx_video_attr(9 downto 0); video_address(12 downto 10) <= b"110";
  234.                 elsif (zx_screen_counter(3 downto 0) = b"0001" and main_state(1 downto 0) = b"10")
  235.                     then video_address(12 downto 0) <= adr_zx_video_data(12 downto 0);
  236.         end if;
  237.        
  238.         main_state(3 downto 0) <= main_state(3 downto 0) + '1';
  239.         if (main_state(1 downto 0) = b"11") then pixel_c <= pixel_c + '1';
  240.                          
  241.         if (pixel_c(3 downto 0) = b"1100") then
  242.             if((pixel_c < (((horizontal_pixels-screen_hor)/2)-65+0))) then ega_adr_x(5 downto 0) <= (others => '0');
  243.                 else ega_adr_x(5 downto 0) <= ega_adr_x(5 downto 0) + '1';
  244.             end if;
  245.         end if;
  246.    
  247.         if (pixel_c > (horizontal_pixels-2)) then pixel_c <= (others => '0'); line_c <= line_c+'1';
  248.             if (line_c > (vertical_pixels-2)) then line_c <= (others => '0'); end if;
  249.         end if;
  250.  
  251.         if(line_c < ((vertical_pixels-screen_vert)/2)-0) then ega_adr_shift(12 downto 0) <= (others => '0');
  252.             elsif ((pixel_c = (horizontal_pixels-(horizontal_pixels-screen_hor)/2+64+4)) and line_c(0)='1')
  253.                 then ega_adr_shift(12 downto 0) <= ega_adr_shift(12 downto 0) + b"000000101000";
  254.         end if;    
  255.  
  256.         if ((pixel_c >= hor_blank_start) or (pixel_c <= hor_blank_stop)) then ena_x <= '1';
  257.            else ena_x <= '0'; -- active 0
  258.         end if;
  259.  
  260.         if ((line_c >= (vertical_pixels-(shadow_vertical+16))) or (line_c <= shadow_vertical)) then ena_y <='1';
  261.                                 else ena_y <='0';
  262.         end if;
  263.  
  264.         if ((pixel_c >= ssi_start) or (pixel_c < (ssi_stop+1))) then ssii <='0'; -- 97
  265.                                 else ssii <= '1';
  266.         end if;
  267.  
  268.         if ((line_c >= 0) and (line_c < 3)) then ksii <='0';
  269.                                 else ksii <='1';
  270.         end if;
  271.        
  272.         if (line_c = (vertical_pixels-1-32) and (( (pixel_c >(int_delay(9 downto 0))) and (pixel_c < (int_delay(9 downto 0)+2)) ) )) --16 25
  273.                                 then    int_str<='0';
  274.             else int_str<='1';
  275.         end if;
  276.  
  277.                   case(line_c(0)) is
  278.                                 when '0' => zx_pixel_c(8 downto 0) <= '0' & pixel_c(9 downto 2);
  279.                                 when '1' => zx_pixel_c(8 downto 0) <= b"011100000" + pixel_c(9 downto 2);
  280.                                 when others => null;
  281.                   end case;
  282.                  
  283.                   if ((zx_pixel_c(8 downto 0) >= b"001011000") and (zx_pixel_c(8 downto 0) < b"101100000"))
  284.                                 then zx_screen_counter_low(8 downto 0) <= zx_pixel_c(8 downto 0) - b"001011000";
  285.                                                 zx_screen_counter_low(16 downto 8) <= line_c(9 downto 1) - b"001000000";
  286.                         end if;
  287.                  
  288.         zx_screen_counter(3 downto 0) <= zx_screen_counter(3 downto 0) + '1';
  289.                        
  290.         if ((line_c = (((vertical_pixels-screen_vert)/2)+0+0)) and (pixel_c = (((horizontal_pixels-screen_hor)/2)-16)) )
  291.                                 then zx_screen_counter <= (others => '0');
  292.                                         elsif (((pixel_c >= ((horizontal_pixels-screen_hor)/2))) and (pixel_c < (((horizontal_pixels+screen_hor)/2))) and (zx_screen_counter(3 downto 0)=15))
  293.                                         then zx_screen_counter(17 downto 4) <= zx_screen_counter(17 downto 4) + '1';
  294.         end if;  
  295.  
  296.         if (zx_screen_counter(10)='0')
  297.                                 then    multic_buf1_we <= '1';
  298.                     multic_buf0_addr(4 downto 0) <= zx_screen_counter(9 downto 5);
  299.                     multic_buf1_addr(4 downto 0) <= zx_screen_counter(8 downto 4);
  300.                     multic_buf0_we <= '0';
  301.             else    multic_buf0_we <= '1';
  302.                     multic_buf1_addr(4 downto 0) <= zx_screen_counter(9 downto 5);
  303.                     multic_buf0_addr(4 downto 0) <= zx_screen_counter(8 downto 4);
  304.                     multic_buf1_we <= '0';
  305.         end if;
  306.  
  307.                   case line_c(0) is
  308.                                 when '0' => border_buf_addr(8 downto 0) <= '0' & pixel_c(9 downto 2);           -- from 0 to 223
  309.                                 when '1' => border_buf_addr(8 downto 0) <= b"011100000"+pixel_c(9 downto 2);    -- from 224 to 447
  310.                                 when others => null;
  311.                   end case;
  312.  
  313.                   -- line_c(1) changes the value every 2 vga lines
  314.                 if (line_c(1)='0') then -- buf0 - write; buf1 - read
  315.                         border_buf0_addr(8 downto 0) <= border_buf_addr(8 downto 0);
  316.                         border_buf1_addr(8 downto 0) <= pixel_c(9 downto 1) - 6;                       
  317.                                
  318.                                 border_buf1_we <= '1';
  319.                                 border_buf0_we <= '0';
  320.                                 if (main_state(2) = '0') then border_delaybuffer(3 downto 0) <= border_buf1_data_out(3 downto 0); end if;
  321.        
  322.                                 multic_buf0_addr(8 downto 0) <= border_buf_addr(8 downto 0);
  323.                                 multic_buf1_addr(8 downto 0) <= pixel_c(9 downto 1);  
  324.             multic_buf1_we <= '1';
  325.             multic_buf0_we <= '0';
  326.            
  327.         else -- buf0 - read; buf1 - write
  328.                
  329.                                 border_buf1_addr(8 downto 0) <= border_buf_addr(8 downto 0);
  330.                                 border_buf0_addr(8 downto 0) <= pixel_c(9 downto 1) - 6;
  331.                        
  332.                                 border_buf0_we <= '1';
  333.             border_buf1_we <= '0';
  334.                                 if (main_state(2) = '0') then border_delaybuffer(3 downto 0) <= border_buf0_data_out(3 downto 0); end if;
  335.                                
  336.                                 multic_buf1_addr(8 downto 0) <= border_buf_addr(8 downto 0);
  337.                                 multic_buf0_addr(8 downto 0) <= pixel_c(9 downto 1);
  338.             multic_buf0_we <= '1';
  339.             multic_buf1_we <= '0';
  340.            
  341.         end if;
  342.                  
  343.           if (zx_screen_counter(3 downto 0) = b"1111") then
  344.             if (line_c(1)='0') then pixel_data(7 downto 0) <= multic_buf1_data_out(15 downto 8);--multic_buf1_data_out(15 downto 8);
  345.                 attr_data(7 downto 0) <= multic_buf1_data_out(7 downto 0); --multic_buf1_data_out(7 downto 0);
  346.                 else    pixel_data(7 downto 0) <= multic_buf0_data_out(15 downto 8);--multic_buf0_data_out(15 downto 8);
  347.                         attr_data(7 downto 0) <= multic_buf0_data_out(7 downto 0);--multic_buf0_data_out(7 downto 0);
  348.             end if;
  349.         elsif (zx_screen_counter(0) = '1') then pixel_data(7 downto 1) <= pixel_data(6 downto 0);
  350.         end if;
  351.         -- moving down 16c Alco screen by 1 line
  352.         if (zx_screen_counter(9 downto 0)) = b"1111111111" then
  353.             alco_sdvig(7 downto 0) <= (zx_screen_counter(17 downto 16) & zx_screen_counter(12 downto 10) &  zx_screen_counter(15 downto 13));
  354.         end if;
  355.         -- accounting the horizontal shift of the 16c Alco screen with a vertical shift (+ another delay of 6 pixels)
  356.         if (zx_screen_counter(3 downto 0) = b"1010") then
  357.             alco(12 downto 5) <= alco_sdvig(7 downto 0);
  358.             alco(4 downto 0) <= zx_screen_counter(8 downto 4);
  359.         end if;
  360.        
  361.         if (zx_screen_counter(2 downto 0) = b"001") then --111
  362.             mc_future_data(7 downto 0) <= alco_buff(7 downto 0);
  363.         end if;
  364.         if (zx_screen_counter(2 downto 0) = b"110") then   -- 011
  365.             mc_pixel_data(7 downto 0) <= alco_buff(7 downto 0);
  366.             mc_attr_data(7 downto 0) <= mc_future_data(7 downto 0);
  367.             else mc_pixel_data(7 downto 1) <= mc_pixel_data(6 downto 0);
  368.         end if;
  369.        
  370.         if ((zx_screen_counter(1 downto 0) = b"11") or (zx_screen_counter(1 downto 0) = b"00"))
  371.             then    alco_r <= alco_buff(1);
  372.                     alco_g <= alco_buff(2);
  373.                     alco_b <= alco_buff(0);
  374.                     alco_i <= alco_buff(6);
  375.             else
  376.                     alco_r <= alco_buff(4);
  377.                     alco_g <= alco_buff(5);
  378.                     alco_b <= alco_buff(3);
  379.                     alco_i <= alco_buff(7);
  380.         end if;
  381.         if (ena_x = '0' and ena_y ='0') then
  382.             if      (border='1') then
  383.                 if (gfx_mode(3) = '0') then igrb(3 downto 0) <= (border3 & portfe(2 downto 0));
  384.                     else igrb(3 downto 0) <= border_data(3 downto 0);
  385.                 end if;
  386.             else
  387.                 case (gfx_mode(5 downto 0)) is
  388.                     when b"011000" =>
  389.                             igrb(3) <= attr_data(6);
  390.                             if ((pixel_data(7) xor (attr_data(7) and flash)) ='0') then
  391.                                 igrb(2 downto 0) <= attr_data(5 downto 3);
  392.                                 else    
  393.                                 igrb(2 downto 0) <= attr_data(2 downto 0);
  394.                             end if;
  395.                     when b"011001" =>  
  396.                             igrb(3 downto 0) <= alco_i & alco_g & alco_r & alco_b;
  397.                     when b"000000" =>  --ega
  398.                             igrb(3 downto 0) <= alco_i & alco_g & alco_r & alco_b;
  399.                     when b"010000" =>  --mc 640x200
  400.                             if (mc_pixel_data(7) = '0') then
  401.                                 igrb(3 downto 0) <= mc_attr_data(7) & mc_attr_data(5 downto 3);
  402.                                 else    
  403.                                 igrb(3 downto 0) <= mc_attr_data(6) & mc_attr_data(2 downto 0);
  404.                             end if;
  405.                     when b"110000" => --otm textmode
  406.                             if (otm_text_mojno='0') then
  407.                                 case (otm_txt(7)) is
  408.                                     when '0' => igrb(3) <= otmtxt_attr(7); igrb(2 downto 0) <= otmtxt_attr(5 downto 3);
  409.                                     when '1' => igrb(3) <= otmtxt_attr(6); igrb(2 downto 0) <= otmtxt_attr(2 downto 0);
  410.                                     when others => null;
  411.                                 end case;
  412.                                 else igrb(3 downto 0) <= b"0000";
  413.                             end if;
  414.                     when others => null;
  415.                 end case;
  416.             end if;
  417.             vblank <= '1';
  418.         else
  419.             vblank <= '0';
  420.         end if;
  421.    
  422.     -----------------------------------------------------------------------------
  423.     -- ATM textmode
  424.     -----------------------------------------------------------------------------
  425.    
  426.         if (pixel_c > 127 and pixel_c < 769 and line_c > 61 and line_c < 576)
  427.             then otm_text_mojno <= '0';
  428.                 else otm_text_mojno <= '1';
  429.         end if;
  430.    
  431.         if (pixel_c(2 downto 0) = b"001") --001 --111
  432.             then otm_txt(7 downto 0) <= otm_fnt_out(7 downto 0);
  433.                 else otm_txt(7 downto 1) <= otm_txt(6 downto 0);
  434.         end if;
  435.    
  436.         if (line_c < 128 or line_c > 576)
  437.             then otmtxt_addr_dobavka <= (others => '0');
  438.                 else
  439.                     if ((line_c(3 downto 0) = b"1111") and (pixel_c = 768))
  440.                         then otmtxt_addr_dobavka(10 downto 0) <= otmtxt_addr_dobavka(10 downto 0) + b"1000000";
  441.                     end if;
  442.         end if;
  443.    
  444.     end if;
  445.            
  446.             case (main_state(1 downto 0)) is
  447.                 when b"00" =>   otm_fnt_clk <= '0';
  448.                 when b"10" =>
  449.                                     if(pixel_c(3)='1') -- zx_screen_counter(3)
  450.                                         then
  451.                                             case (zx_screen_counter(1 downto 0)) is
  452.                                                 when b"00" => otmtxt_addr(16 downto 0) <= b"001" & (pixel_txt(6 downto 1) - b"1000" + b"00000111000000" + otmtxt_addr_dobavka(10 downto 0)); -- odd column attributes
  453.                                                 when b"01" => otmtxt_addr(16 downto 0) <= b"101" & (pixel_txt(6 downto 1) - b"1000" + b"00000111000000" + otmtxt_addr_dobavka(10 downto 0)); -- even column data
  454.                                                 when others => null;
  455.                                             end case;
  456.                                         else
  457.                                             case (zx_screen_counter(1 downto 0)) is
  458.                                                 when b"00" => otmtxt_addr(16 downto 0) <= b"001" & (pixel_txt(6 downto 1) - b"1000" + b"10000111000000" + otmtxt_addr_dobavka(10 downto 0)); -- even column attributes
  459.                                                 when b"01" => otmtxt_addr(16 downto 0) <= b"101" & (pixel_txt(6 downto 1) - b"1000" + b"10000111000000" + otmtxt_addr_dobavka(10 downto 0)); -- odd column data
  460.                                                 when others => null;
  461.                                             end case;
  462.                                     end if;                    
  463.                        
  464.                                     if(zx_screen_counter(1 downto 0)=b"10") then otm_fnt_addr(10 downto 3) <= otmtxt_symbol_code(7 downto 0); otm_fnt_addr(2 downto 0) <= line_c(3 downto 1); end if; -- +1
  465.                 when b"11" => if(zx_screen_counter(1 downto 0)=b"10") then otm_fnt_clk <= '1'; end if;
  466.                 when others => null;
  467.             end case;
  468.    
  469.     -----------------------------------------------------------------------------
  470.     -- end ATM textmode
  471.     -----------------------------------------------------------------------------
  472.  
  473.         pollitra_a(3 downto 0) <= igrb(3 downto 0);
  474.         pollitra_awr(3 downto 0) <= border3 & portfe(2 downto 0);
  475.  
  476.         if (main_state(2 downto 0) = b"10")
  477.             then border_buf0_clk <= '1'; border_buf1_clk <= '1';
  478.                 else border_buf0_clk <= '0'; border_buf1_clk <= '0';
  479.         end if;
  480.        
  481.                   if (main_state(2 downto 0) = b"100") then border_data(3 downto 0) <= border_delaybuffer(3 downto 0); end if;
  482.                  
  483.         if (main_state(1 downto 0) = b"10") then
  484.             if zx_screen_counter(2 downto 0) = b"0110"
  485.                 then multic_buf0_clk <= '1'; multic_buf1_clk <= '1';
  486.                     else multic_buf0_clk <= '0'; multic_buf1_clk <= '0';
  487.             end if;
  488.            
  489.             case (gfx_mode(5 downto 0)) is
  490.                 when b"000000" => -- ega
  491.                     if (line_c < ((vertical_pixels-screen_vert)/2)) or (line_c > ((vertical_pixels-(vertical_pixels-screen_vert)/2)+4+4 +4+3))
  492.                         then vert_border <= '1';          
  493.                         else vert_border <='0';
  494.                     end if;
  495.  
  496.                     if ((pixel_c < (((horizontal_pixels-screen_hor)/2)-64+1)) or (pixel_c > (horizontal_pixels-(horizontal_pixels-screen_hor)/2+64+0)))
  497.                         then goriz_border <= '1';                        
  498.                         else goriz_border <= '0';
  499.                     end if;
  500.            
  501.                 when b"010000" => -- mc640x200
  502.                     if (line_c < ((vertical_pixels-screen_vert)/2)) or (line_c > ((vertical_pixels-(vertical_pixels-screen_vert)/2)+4+4 +4+3))
  503.                         then vert_border <= '1';          
  504.                         else vert_border <='0';
  505.                     end if;
  506.  
  507.                     if ((pixel_c < (((horizontal_pixels-screen_hor)/2)-64+1+7)) or (pixel_c > (horizontal_pixels-(horizontal_pixels-screen_hor)/2+64+0+7)))
  508.                         then goriz_border <= '1';                        
  509.                         else goriz_border <= '0';
  510.                     end if;
  511.                    
  512.                 when b"110000" => -- otm textmode      
  513.                     if (line_c < ((vertical_pixels-screen_vert)/2)) or (line_c > ((vertical_pixels-(vertical_pixels-screen_vert)/2)+4+4 +4+3))
  514.                         then vert_border <= '1';          
  515.                         else vert_border <='0';
  516.                     end if;
  517.  
  518.                     if ((pixel_c < (((horizontal_pixels-screen_hor)/2)-64+2)) or (pixel_c > (horizontal_pixels-(horizontal_pixels-screen_hor)/2+64+0)))
  519.                         then goriz_border <= '1';                        
  520.                         else goriz_border <= '0';
  521.                     end if;
  522.                
  523.                 when others => --zx ðàìêà
  524.                     if (line_c < ((vertical_pixels-screen_vert)/2)+0+2) or (line_c > ((vertical_pixels-(vertical_pixels-screen_vert)/2)+0+1))
  525.                         then vert_border <= '1';
  526.                         else vert_border <='0';
  527.                     end if;
  528.  
  529.                     if ((pixel_c < (((horizontal_pixels-screen_hor)/2)+1)) or (pixel_c > (horizontal_pixels-(horizontal_pixels-screen_hor)/2)))
  530.                         then goriz_border <= '1'; -- horizontal VGA border
  531.                         else goriz_border <= '0';
  532.                     end if;
  533.                     if ((border_buf_addr < 88) or (border_buf_addr > 351))
  534.                                                                 then zx_goriz_border <= '1'; -- horizontal ZX border
  535.                                                                 else zx_goriz_border <= '0';
  536.                                                   end if;
  537.             end case;
  538.            
  539.         end if;
  540.  
  541. ega_address(12 downto 0) <= (ega_adr_shift(12 downto 0)) + (b"0000000" & ega_adr_x(5 downto 0));
  542.  
  543. end if;
  544. end process;
  545.  
  546. pixel_txt(6 downto 0) <= pixel_c(9 downto 3)+'1';
  547.  
  548. zx_s_c(13 downto 0) <= zx_screen_counter(17 downto 4);
  549.  
  550. process (pixel_clock, vblank)
  551. begin
  552.     if (pixel_clock'event and pixel_clock = '1') then
  553.         if (vblank='1') then
  554.                 vidr(4 downto 0) <= not (pollitra_d(1) & pollitra_d(6) & pollitra_d(9) & pollitra_d(14) & '1');
  555.                 vidg(4 downto 0) <= not (pollitra_d(4) & pollitra_d(7) & pollitra_d(12) & pollitra_d(15) & '1');
  556.                 vidb(4 downto 0) <= not (pollitra_d(0) & pollitra_d(5) & pollitra_d(8) & pollitra_d(13) & '1');
  557.                
  558.         else
  559.                 vidb(4 downto 0) <= (others =>'0');
  560.                 vidr(4 downto 0) <= (others =>'0');
  561.                 vidg(4 downto 0) <= (others =>'0');
  562.         end if;
  563. end if;
  564. end process;
  565.  
  566. border <= vert_border or goriz_border;
  567.  
  568. process (pixel_clock, main_state, zx_screen_counter)
  569. begin
  570. if (pixel_clock'event and pixel_clock='1') then
  571.     if (main_state(1 downto 0)=b"01" and zx_screen_counter(3 downto 0) = b"0010")
  572.         then pixel_data_buffer(7 downto 0) <= blk0_d(7 downto 0); pixel_data_strobe <= '1'; attr_data_strobe <= '0';
  573.             elsif (main_state(1 downto 0)=b"01" and zx_screen_counter(3 downto 0) = b"0001")
  574.                 then attr_data_buffer(7 downto 0) <= blk0_d(7 downto 0); attr_data_strobe <= '1'; pixel_data_strobe <= '0';
  575.     end if;
  576.  
  577.     if (main_state(1 downto 0)=b"01" and zx_screen_counter(1 downto 0) = b"11")
  578.         then alco_buff(7 downto 0) <= blk0_d(7 downto 0);
  579.     end if;
  580.    
  581.     if (main_state(1 downto 0)=b"01") then
  582.         case (zx_screen_counter(1 downto 0)) is  
  583.             when b"01" => otmtxt_attr(7 downto 0) <= blk0_d(7 downto 0); --b"11010110";--
  584.             when b"10" => otmtxt_symbol_code(7 downto 0) <= blk0_d(7 downto 0);-- b"10001001";--
  585.             when others => null;
  586.         end case;
  587.     end if;        
  588.    
  589. end if;
  590. end process;
  591.  
  592. process (pixel_clock, main_state)
  593. begin
  594.     if (pixel_clock'event and pixel_clock='0') then
  595.     if (main_state(1 downto 0)=b"00") then border_c(3 downto 0) <= border3 & portfe(2 downto 0);
  596. end if;
  597. end if;
  598. end process;
  599.  
  600. otmfontbuffer: otmfnt_rom port map (otm_fnt_addr(10 downto 0), otm_fnt_clk, otm_fnt_out);
  601.  
  602. pixelc <= pixel_c;
  603. linec <= line_c;
  604.  
  605. border_c(7 downto 4) <= b"1010";
  606. main_state_counter(1 downto 0) <= main_state(1 downto 0);
  607. int_strobe <= int_str;
  608.  
  609. multicolor_buffer0: ram port map (multic_buf0_clk, multic_buf0_data_in(15 downto 0), multic_buf0_addr(8 downto 0), multic_buf0_addr(8 downto 0), multic_buf0_we, multic_buf0_data_out(15 downto 0));        
  610. multicolor_buffer1: ram port map (multic_buf1_clk, multic_buf1_data_in(15 downto 0), multic_buf1_addr(8 downto 0), multic_buf1_addr(8 downto 0), multic_buf1_we, multic_buf1_data_out(15 downto 0));        
  611.  
  612. border_buf0_data_in(3 downto 0) <= border3 & portfe(2 downto 0);
  613. border_buf1_data_in(3 downto 0) <= border3 & portfe(2 downto 0);
  614.    
  615. multic_buf0_data_in(15 downto 8) <= pixel_data_buffer(7 downto 0);
  616. multic_buf0_data_in(7 downto 0) <= attr_data_buffer(7 downto 0);
  617. multic_buf1_data_in(15 downto 8) <= pixel_data_buffer(7 downto 0);
  618. multic_buf1_data_in(7 downto 0) <= attr_data_buffer(7 downto 0);
  619.  
  620. border_buffer0: ram_border port map (border_buf0_clk, border_buf0_data_in(3 downto 0), border_buf0_addr(8 downto 0), border_buf0_addr(8 downto 0), border_buf0_we, border_buf0_data_out(3 downto 0));
  621. border_buffer1: ram_border port map (border_buf1_clk, border_buf1_data_in(3 downto 0), border_buf1_addr(8 downto 0), border_buf1_addr(8 downto 0), border_buf1_we, border_buf1_data_out(3 downto 0));
  622.  
  623. alco_address(14 downto 13) <= alco_addr(1 downto 0);
  624. alco_address(12 downto 0) <= alco(12 downto 0);
  625.  
  626. otmtxt_address(16 downto 0) <= otmtxt_addr(16 downto 0);
  627.    
  628. end koe_z;
  629.