Subversion Repositories KoE_projects

Rev

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

  1. -- betadisk interface & KR1818VG93
  2.  
  3. library ieee;
  4.   use ieee.std_logic_1164.all;
  5.   use ieee.std_logic_arith.all;
  6.   use ieee.std_logic_unsigned.all;
  7.  
  8. entity betadisk is
  9.   port (
  10.     vg93_cs             : in std_logic;
  11.     vg93_ram_addr       : out std_logic_vector(19 downto 0);
  12.     betadisk_transfer   : in std_logic := '1';
  13.     write_byte_n        : out std_logic_vector(7 downto 0);
  14.     write_sector_n      : out std_logic_vector(7 downto 0);
  15.     read_sector_n       : out std_logic_vector(7 downto 0);
  16.     read_byte_n         : out std_logic_vector(7 downto 0);
  17.     track_f             : out std_logic;
  18.     sector_f            : out std_logic;
  19.     restore_f           : out std_logic;
  20.     vg93_O_data         : out std_logic_vector(7 downto 0);
  21.     force_interrupt_f   : out std_logic;
  22.     track_pos           : out std_logic_vector(7 downto 0);
  23.     track_r             : out std_logic_vector(7 downto 0);
  24.     sector_r            : out std_logic_vector(7 downto 0);
  25.     status_r            : out std_logic_vector(7 downto 0);
  26.     betadisk_r          : in std_logic_vector(7 downto 0);
  27.     vg93intrq           : out std_logic;
  28.     seek_f              : out std_logic;
  29.     vg93drq             : out std_logic;
  30.     step_f              : out std_logic;
  31.     step_dir            : out std_logic;
  32.     read_addr_f         : out std_logic;
  33.     read_f              : out std_logic;
  34.     write_f             : out std_logic;
  35.     vg93_data_from_ram  : in std_logic_vector(7 downto 0);
  36.     vg_trm_f            : in std_logic;
  37.     read_t              : out std_logic;
  38.     write_t             : out std_logic;
  39.     cpu_rd              : in std_logic;
  40.     cpu_wr              : in std_logic;
  41.     cpu_a               : in std_logic_vector(15 downto 0);
  42.     cpu_d               : in std_logic_vector(7 downto 0);
  43.     pixel_clock         : in std_logic;
  44.     hardware_reset      : in std_logic;
  45.     vg93_data_for_cpu_o : out std_logic_vector(7 downto 0);
  46.     vg93_data_for_r     : out std_logic_vector(7 downto 0);
  47.     index               : out std_logic
  48.                
  49.    
  50. );
  51. end;
  52.  
  53. architecture bdi of betadisk is
  54.  
  55. constant bytes_in_sector: natural:=256;
  56. constant sectors_in_track: natural:=16;
  57.  
  58. -- vg93 signals
  59. signal vg93_data_from_cpu               : std_logic_vector(7 downto 0);
  60. signal betadisk_reg                     : std_logic_vector(7 downto 0);
  61. signal status_reg                       : std_logic_vector(7 downto 0);
  62. signal track_reg                        : std_logic_vector(7 downto 0);
  63. signal track_position                   : std_logic_vector(7 downto 0);
  64. signal sector_reg                       : std_logic_vector(7 downto 0);
  65. signal vg93_I_data                      : std_logic_vector(7 downto 0);
  66. signal vg93_data_for_cpu                : std_logic_vector(7 downto 0);
  67. signal command_reg                      : std_logic_vector(7 downto 0);
  68. signal vg93_reset                       : std_logic;
  69.  
  70. signal vg93_drq: std_logic;
  71. signal command_intrq: std_logic;
  72.  
  73.  
  74. signal accept_command_flag              : std_logic;
  75. signal vg93_busy_flag                   : std_logic;
  76. signal step_direction                   : std_logic;
  77. signal mojno_wait                       : std_logic_vector(4 downto 0);
  78. signal sync_rdwr_data                   : std_logic;
  79. signal vg93_start                       : std_logic;
  80. signal write_sector_flag                : std_logic;
  81. signal read_address_flag                : std_logic;
  82.  
  83. signal fi_flag                          : std_logic;
  84. signal io_sector                        : std_logic;
  85. signal io_track                         : std_logic;
  86. signal vg93_clk                         : std_logic;
  87. signal io_ready                         : std_logic;
  88. signal current_sector                   : std_logic_vector(7 downto 0);
  89. signal current_byte                     : std_logic_vector(7 downto 0);
  90.  
  91. signal busrq_flag                       : std_logic;
  92. signal vg_busrq                         : std_logic;
  93. signal busack_flag                      : std_logic;
  94. signal mwflag                           : std_logic;
  95. signal vg93_reset_flags                 : std_logic := '1';
  96.  
  97. signal vg93_data_from_ramdisk           : std_logic_vector(7 downto 0);
  98.  
  99. signal vg_state                         : std_logic_vector(1 downto 0);
  100. signal vg93_io                          : std_logic;
  101. signal vg93_nrd                         : std_logic;
  102. signal restore_flag                     : std_logic;
  103. signal seek_flag                        : std_logic;
  104. signal step_flag                        : std_logic;
  105. signal read_start                       : std_logic;
  106. signal write_start                      : std_logic;
  107. signal read_addr_flag                   : std_logic;
  108. signal read_flag                        : std_logic;
  109. signal write_flag                       : std_logic;
  110. signal sector_flag                      : std_logic;
  111. signal vg_delay                         : std_logic;
  112. signal vg_delay_res                     : std_logic;
  113. signal radr_intrq_flag                  : std_logic:='0';
  114.  
  115. signal mbit                             : std_logic;
  116. signal track_flag                       : std_logic;
  117. signal force_interrupt_flag             : std_logic;
  118. signal delay_vg                         : std_logic_vector(30 downto 0);
  119. signal radr_state                       : std_logic_vector(2 downto 0);
  120. signal radr_flag0                       : std_logic;
  121. signal radr_delay                       : std_logic_vector(6 downto 0);
  122. signal radr_nrd                         : std_logic;
  123. signal radr_out_data                    : std_logic_vector(7 downto 0);
  124. signal radr_drq                         : std_logic;
  125. signal read_state                       : std_logic_vector(1 downto 0);
  126. signal vg93_trm                         : std_logic;
  127. signal read_byte_number                 : std_logic_vector(8 downto 0);
  128. signal read_delay                       : std_logic_vector(6 downto 0);
  129. signal read_trz                         : std_logic;
  130. signal read_flg0                        : std_logic;
  131. signal read_flg1                        : std_logic;
  132. signal read_drq                         : std_logic;
  133. signal read_nrd                         : std_logic;
  134. signal read_intrq_flag                  : std_logic:='0';
  135. signal read_sector_num                  : std_logic_vector(7 downto 0);
  136. signal read_trm                         : std_logic;
  137. signal write_state                      : std_logic_vector(1 downto 0);
  138. signal write_byte_number                : std_logic_vector(8 downto 0);
  139. signal write_delay                      : std_logic_vector(6 downto 0);
  140. signal write_trz                        : std_logic;
  141. signal write_flg0                       : std_logic;
  142. signal write_drq                        : std_logic;
  143. signal write_flg1                       : std_logic;
  144. signal write_nrd                        : std_logic;
  145. signal write_intrq_flag                 : std_logic:='0';
  146. signal write_sector_num                 : std_logic_vector(7 downto 0);
  147. signal write_trm                        : std_logic;
  148. signal vg_tormoz                        : std_logic;
  149. signal tr00                             : std_logic;
  150. signal index_pulse                      : std_logic;
  151. signal index_pulse_period               : std_logic_vector(24 downto 0);
  152. signal motor_start                      : std_logic:='1';
  153. signal motor_stop                       : std_logic:='0';
  154. signal motor                            : std_logic;
  155. signal motor_reset                      : std_logic;
  156. signal motor_flag                       : std_logic:='0';
  157.  
  158. signal betadisk_transmit_counter        : std_logic_vector(4 downto 0);
  159. signal betadisk_transmit                : std_logic;
  160. signal vg_delay_flag0                   : std_logic;
  161. signal vg_delay_flag1                   : std_logic;
  162. signal force_interrupt_int              : std_logic;
  163. signal vg93_ram_addr0                   : std_logic_vector(19 downto 0);
  164. signal all_command_flags                : std_logic;
  165.  
  166. begin
  167.  
  168. vg93_reset <= betadisk_reg(2);
  169. motor_stop <= betadisk_reg(3);
  170. vg93_drq <= radr_drq or read_drq or write_drq;
  171. tr00 <= '1' when (track_position(7 downto 0) = b"00000000") else '0';
  172. status_reg(7) <= '0';
  173. status_reg(6) <= '0';
  174. status_reg(5) <= '0' when (read_addr_flag = '0' or read_flag = '0' or write_flag = '0' or all_command_flags = '1') else '1';
  175. status_reg(4) <= '0';
  176. status_reg(3) <= '0';
  177. status_reg(2) <= '0' when (read_addr_flag = '0' or read_flag = '0' or write_flag = '0' or all_command_flags = '1') else tr00;
  178. status_reg(1) <= vg93_drq when (read_addr_flag = '0' or read_flag = '0' or write_flag = '0') else index_pulse;
  179. status_reg(0) <= vg93_nrd;
  180.  
  181. all_command_flags <= read_addr_flag and read_flag and write_flag and track_flag and sector_flag and seek_flag and step_flag and restore_flag;
  182.  
  183. process (vg93_reset, hardware_reset,
  184.             vg_delay_res, radr_intrq_flag, read_intrq_flag, write_intrq_flag,
  185.             vg93_cs, vg93_clk, cpu_rd, cpu_wr,
  186.             cpu_a, cpu_d, force_interrupt_flag, force_interrupt_int)
  187. begin
  188. if (hardware_reset = '0' or vg93_reset = '0') then
  189.                             command_reg(7 downto 0) <= b"00000011";
  190.                             sector_reg <= b"00000001";
  191.                             track_reg <= b"00000000";
  192.                             track_position <= b"00000000";
  193.                             restore_flag <= '0';
  194.                             command_intrq <= '0';
  195.                             vg_delay <= '1';
  196.  
  197.                             step_direction <= '1'; -- head stepping: 0 - dec; 1 - inc
  198.                             vg93_nrd <= '1'; -- not ready flag
  199.  
  200.                             seek_flag <= '1';
  201.                             step_flag <= '1';
  202.                             read_addr_flag <= '1';
  203.  
  204.                             read_flag <= '1';
  205.                             write_flag <= '1';
  206.  
  207.                             sector_flag <= '1';
  208.                             track_flag <= '1';
  209.                             write_sector_flag <= '1';
  210.                             read_address_flag <= '1';
  211.                             force_interrupt_flag <= '1';
  212.                             force_interrupt_int <= '1';
  213.  
  214.  
  215.     elsif (vg_delay_res = '1' or radr_intrq_flag = '1' or read_intrq_flag = '1' or write_intrq_flag = '1' or force_interrupt_flag = '0')
  216.         then   vg_delay <= '0';
  217.                                         motor_start <= '1';
  218.                                         if (force_interrupt_flag = '0')
  219.                                                 then
  220.                                                         force_interrupt_flag <= '1';
  221.                                                         read_flag <= '1';
  222.                                                         sector_flag <='1';
  223.                                                         track_flag <='1';
  224.                                                         write_flag <= '1';
  225.                                                         read_addr_flag <= '1';
  226.                                                         restore_flag <= '1';
  227.                                                         seek_flag <= '1';
  228.                                                         step_flag <= '1';
  229.                                                         write_start <= '1';
  230.                                                         read_start <= '1';
  231.                                                 if (force_interrupt_int ='1') then command_intrq <= '1'; end if;
  232.                                                 else command_intrq <= '1';
  233.                                         end if;
  234.                
  235.                                         vg93_nrd <= '0';
  236.                read_addr_flag <= '1';
  237.                if (restore_flag = '0') then restore_flag <= '1'; track_reg <= b"00000000"; track_position <= b"00000000"; end if;
  238.                seek_flag <= '1';
  239.                step_flag <= '1';
  240.                write_start <= '1';
  241.                read_start <= '1';
  242.                
  243.                                                                                  
  244.         elsif (vg93_cs'event and vg93_cs='0') then
  245.          if (betadisk_reg(1 downto 0)="00") then -- drive A:
  246.  
  247.             if (cpu_rd='0') then
  248.            
  249.                 case cpu_a(6 downto 5) is
  250.                     when b"00" => vg93_O_data(7 downto 0) <= status_reg(7 downto 0); command_intrq <= '0';
  251.                     when b"01" => vg93_O_data(7 downto 0) <= track_reg(7 downto 0);
  252.                     when b"10" => vg93_O_data(7 downto 0) <= sector_reg(7 downto 0);
  253.                     when b"11" => vg93_O_data(7 downto 0) <= vg93_data_for_cpu(7 downto 0);
  254.                   when others =>null;
  255.                 end case;
  256.             end if;
  257.  
  258.             if (cpu_wr='0') then
  259.                 vg93_O_data(7 downto 0) <= (others => 'Z');
  260.                 case cpu_a(6 downto 5) is
  261.                     -- command code
  262.                     when b"00" =>   command_reg(7 downto 0) <= cpu_d(7 downto 0);
  263.                                     command_intrq <= '0';
  264.                         case cpu_d(7 downto 4) is
  265.                             -- restore command
  266.                             when "0000" => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; restore_flag <= '0'; vg_delay <= '1'; vg93_nrd <= '1';
  267.                             -- seek command
  268.                             when "0001" => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; seek_flag <= '0'; track_position(7 downto 0) <= vg93_data_from_cpu(7 downto 0); track_reg(7 downto 0) <= vg93_data_from_cpu(7 downto 0); vg_delay <= '1'; vg93_nrd <= '1'; motor_start <= '0';
  269.                             -- step command
  270.                             when ("0010") => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; step_flag <= '0'; vg_delay <= '1'; vg93_nrd <= '1'; motor_start <= '0';
  271.                                              if (step_direction = '1')
  272.                                                 then track_position(7 downto 0) <= track_position(7 downto 0) + '1';
  273.                                                 else if (track_position(7 downto 0) > b"00000000") then track_position(7 downto 0) <= track_position(7 downto 0) - '1'; end if;
  274.                                               end if;
  275.                             when ("0011") => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; step_flag <= '0'; vg_delay <= '1'; vg93_nrd <= '1'; motor_start <= '0';
  276.                                              if (step_direction = '1')
  277.                                                                 then track_position(7 downto 0) <= track_position(7 downto 0) + '1'; track_reg(7 downto 0) <= track_position(7 downto 0) + '1';
  278.                                                     else if (track_position(7 downto 0) > b"00000000") then track_position(7 downto 0) <= track_position(7 downto 0) - '1'; track_reg(7 downto 0) <= track_position(7 downto 0) - '1'; end if;
  279.                                              end if;
  280.                             -- step in command
  281.                             when ("0100") => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; step_flag <= '0'; step_direction <= '1'; vg_delay <= '1'; vg93_nrd <= '1'; motor_start <= '0';
  282.                                              track_position(7 downto 0) <= track_position(7 downto 0) + '1';
  283.                             when ("0101") => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; step_flag <= '0'; step_direction <= '1'; vg_delay <= '1'; vg93_nrd <= '1'; motor_start <= '0';
  284.                                              track_position(7 downto 0) <= track_position(7 downto 0) + '1'; track_reg(7 downto 0) <= (track_position(7 downto 0) + '1');
  285.                             -- step out command
  286.                             when ("0110") => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; step_flag <= '0'; step_direction <= '0'; vg_delay <= '1'; vg93_nrd <= '1'; motor_start <= '0';
  287.                                              if (track_position > 0) then track_position(7 downto 0) <= track_position(7 downto 0) - '1'; end if;
  288.                             when ("0111") => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; step_flag <= '0'; step_direction <= '0'; vg_delay <= '1'; vg93_nrd <= '1'; motor_start <= '0';
  289.                                              if (track_position > 0) then track_position(7 downto 0) <= track_position(7 downto 0) - '1'; track_reg(7 downto 0) <= (track_position(7 downto 0) - '1'); end if;
  290.                             -- read address command
  291.                             when "1100" => read_flag <= '1'; write_flag <= '1'; sector_flag <='1'; track_flag <='1'; read_addr_flag <= '0'; vg93_nrd <= '1';
  292.                             -- read sector command
  293.                             when ("1000") => write_flag <= '1'; track_flag <='1'; read_flag <= '0'; sector_flag <='0'; mbit <= '0'; vg93_nrd <= '1'; read_start <= '0';--mbit <= cpu_d(4);
  294.                             when ("1001") => write_flag <= '1'; track_flag <='1'; read_flag <= '0'; sector_flag <='0'; mbit <= '1'; vg93_nrd <= '1'; read_start <= '0';--mbit <= cpu_d(4);
  295.                             -- write sector command
  296.                             when ("1010") => read_flag <= '1'; track_flag <='1'; write_flag <= '0'; sector_flag <= '0'; mbit <= '0'; vg93_nrd <= '1'; write_start <= '0';
  297.                             when ("1011") => read_flag <= '1'; track_flag <='1'; write_flag <= '0'; sector_flag <= '0'; mbit <= '1'; vg93_nrd <= '1'; write_start <= '0';
  298.                             -- read track command
  299.                             when "1110" => write_flag <= '1'; sector_flag <='1'; read_flag <= '0'; track_flag <= '0'; vg93_nrd <= '1'; read_start <= '0';
  300.                             -- write track command
  301.                             when "1111" => read_flag <= '1'; sector_flag <='1'; write_flag <='0'; track_flag <= '0'; vg93_nrd <= '1'; write_start <= '0';
  302.                             -- force interrupt command
  303.                             when "1101" => force_interrupt_flag <= '0';
  304.                                                                                                                         vg93_nrd <= '0';
  305.                                                                                                                         vg_delay <= '1';
  306.                                            force_interrupt_int <= (cpu_d(0) or cpu_d(1) or cpu_d(2) or cpu_d(3));
  307.                             when others => null;
  308.                         end case;
  309.                     when b"01" => track_reg(7 downto 0) <= cpu_d(7 downto 0);
  310.                     when b"10" => sector_reg(7 downto 0) <= cpu_d(7 downto 0);
  311.                     when b"11" => vg93_data_from_cpu(7 downto 0) <= cpu_d(7 downto 0);
  312.                     when others => null;
  313.                 end case;
  314.             end if;
  315.  end if;
  316. end if;
  317. end process;
  318.  
  319. -- index pulse: index pulse frequency is 5 Hz, index pulse width is 4 ms (real appr. 3 ms for 3.5", appr. 4 ms for 5.25")
  320.  
  321. motor <= motor_start or motor_stop;
  322.  
  323. process (motor, motor_reset)
  324. begin
  325.         if (motor_reset = '1') then motor_flag <= '0';
  326.                 elsif (motor'event and motor = '0') then motor_flag <= '1';
  327.         end if;
  328. end process;
  329.  
  330. process (pixel_clock, motor_flag, motor)
  331. begin
  332.         if(pixel_clock'event and pixel_clock = '1') then
  333.                
  334.                 if (motor_flag = '1' and motor_reset = '0') then motor_reset <= '1'; index_pulse_period(24 downto 0) <= (others => '0');
  335.                         else motor_reset <= '0';
  336.                                 if (not(index_pulse_period(24 downto 0) = b"1010110111001010010100011")) then index_pulse_period(24 downto 0) <= index_pulse_period(24 downto 0) + '1';
  337.                                         else index_pulse_period(24 downto 0) <= (others => '0');
  338.                                 end if;
  339.                 end if;
  340.        
  341.                 if (index_pulse_period(24 downto 0) = b"1010101001010000100000110") then index_pulse <= '1';
  342.                         elsif (index_pulse_period(24 downto 0) = b"1010110111001010010100010") then index_pulse <= '0';
  343.                 end if;
  344.                
  345.         end if;
  346. end process;
  347.  
  348. -- delays
  349. process (vg_delay, vg_delay_flag1)
  350.     begin
  351.         if(vg_delay_flag1) = '1' then vg_delay_flag0 <='0';
  352.             elsif(vg_delay'event and vg_delay = '1') then vg_delay_flag0 <= '1';
  353.         end if;
  354. end process;
  355.  
  356. process (pixel_clock, vg_delay_flag0)
  357.     begin
  358.             if(pixel_clock'event and pixel_clock = '0') then
  359.                 if (vg_delay_flag0='1') then vg_delay_flag1 <= '1'; end if;
  360.                 if(vg_delay_flag1='1') then vg_delay_flag1 <='0'; end if;
  361.             end if;
  362. end process;
  363.  
  364. process (pixel_clock, vg_delay_flag1, vg93_reset, restore_flag)
  365. begin
  366. if (vg_delay_flag1 = '1' or vg93_reset = '0') then
  367.         if (restore_flag = '0' or read_address_flag='0') then delay_vg(28 downto 0) <= b"00011110101000000000000000000";
  368.                 else delay_vg(28 downto 7) <= (others => '0'); delay_vg(6 downto 0) <= b"1111111"; end if;
  369.                         elsif (pixel_clock'event and pixel_clock = '1') then
  370.                                 if (delay_vg > 0) then delay_vg(28 downto 0) <= delay_vg(28 downto 0) - '1'; end if;
  371.                                 if (delay_vg(28 downto 0) = b"00000000000000000000000000001") then vg_delay_res <= '1';
  372.                     else vg_delay_res <= '0';
  373.                         end if;
  374. end if;
  375. end process;
  376.  
  377. -- read addr process
  378. process (pixel_clock, hardware_reset, vg93_reset, read_addr_flag, vg93_cs, force_interrupt_flag, cpu_rd, cpu_a)
  379. begin
  380. if (hardware_reset = '0' or vg93_reset = '0' or force_interrupt_flag = '0') then radr_drq <= '0'; radr_nrd <= '1';
  381.     elsif (read_addr_flag = '1') then radr_state(2 downto 0) <= b"110"; radr_flag0 <= '0'; radr_delay(6 downto 0) <= (others =>'1');  radr_intrq_flag <= '0'; radr_out_data(7 downto 0) <= b"00000000";
  382.             elsif (vg93_cs = '0' and cpu_rd='0' and cpu_a(6 downto 5) = b"11") then radr_drq <= '0'; -- drq reset
  383.             elsif (pixel_clock'event and pixel_clock = '1') then
  384.                 if (radr_state(2 downto 0) = b"110") then radr_nrd <='0'; end if;
  385.                 if (radr_delay(6 downto 0) > 0) then radr_delay(6 downto 0) <= radr_delay(6 downto 0) - '1'; end if;
  386.                 if (radr_delay(6 downto 0) = b"0000010") then
  387.                     case radr_state(2 downto 0) is
  388.                             when b"110" => radr_out_data(7 downto 0) <= track_position(7 downto 0);--b"11100111"; -- track_addr
  389.                             when b"101" => radr_out_data(7 downto 0) <= b"0000000" & betadisk_reg(4);--b"11111110"; -- side
  390.                             when b"100" => radr_out_data(7 downto 0) <= sector_reg(7 downto 0);--b"11111100"; -- sector address
  391.                             when b"011" => radr_out_data(7 downto 0) <= b"11111111"; -- sector length
  392.                             when b"010" => radr_out_data(7 downto 0) <= b"11110000"; -- crc1
  393.                             when b"001" => radr_out_data(7 downto 0) <= b"11100000"; -- crc2
  394.                             when others => null;
  395.                     end case;
  396.                 end if;
  397.                 if (radr_delay(6 downto 0) = b"0000001" and radr_state > 0) then radr_drq <= '1'; end if;
  398.                 if ((radr_delay(6 downto 0) = b"0000000") and (radr_state > 0) and (radr_drq = '0') ) then
  399.                     radr_delay(6 downto 0) <= (others =>'1');
  400.                     radr_state(2 downto 0) <= radr_state(2 downto 0)-'1';
  401.                 end if;
  402.                 if (radr_state(2 downto 0)=b"000") then
  403.                     if (radr_delay = 126) then radr_intrq_flag <= '1'; radr_nrd <= '1'; end if;
  404.                 end if;
  405. end if;
  406. end process;
  407.  
  408. -- read track/sector process
  409. process (pixel_clock, hardware_reset, vg93_reset, read_start, sector_flag, track_flag, mbit, force_interrupt_flag, sector_reg, vg_tormoz, vg93_cs, cpu_rd, cpu_a)
  410. begin
  411. if (hardware_reset = '0' or vg93_reset = '0' or force_interrupt_flag = '0') then read_drq <= '0'; read_trz <= '0';
  412.     elsif (read_start='1') then read_state(1 downto 0) <= b"00"; read_byte_number(8 downto 0) <= (others =>'0'); read_delay(6 downto 0) <= (others =>'1'); read_trz <= '0'; read_flg0 <='0'; read_drq <='0'; read_flg1 <='0'; read_nrd <='0'; read_intrq_flag <='0';
  413.         elsif (vg93_cs = '0' and cpu_rd='0' and cpu_a(6 downto 5) = b"11") then read_drq <= '0'; -- DRQ reset
  414.             elsif (pixel_clock'event and pixel_clock = '1') then
  415.             if (read_state = b"00") then
  416.                read_nrd <= '1';
  417.                     if (read_nrd = '1') then  read_state <= b"01"; end if;
  418.                if (sector_flag = '0') then read_sector_num(7 downto 0) <= sector_reg(7 downto 0); end if;
  419.                if (track_flag = '0') then read_sector_num(7 downto 0) <= b"00000001"; end if;
  420.             end if;
  421.             if (read_delay > 0) then read_delay(6 downto 0) <= read_delay(6 downto 0) - '1'; end if;
  422.             if ((read_delay(6 downto 0) = b"0000001") and (read_byte_number < bytes_in_sector)) then read_trz <= '1'; end if;
  423.             if (vg_tormoz = '1' and read_trz='1') then read_trz <='0'; read_flg0 <='1'; end if;
  424.             if (vg_tormoz = '0' and read_flg0 ='1') then read_flg0 <='0'; read_drq <='1'; read_flg1 <='1'; end if;
  425.             if (read_flg1 ='1' and read_drq = '0') then
  426.                 read_flg1 <='0';
  427.                 if (read_byte_number < bytes_in_sector) then read_byte_number(8 downto 0) <= read_byte_number(8 downto 0) + '1'; read_delay(6 downto 0) <= (others =>'1'); end if;
  428.             end if;
  429.             if((read_byte_number = bytes_in_sector) and (read_delay(6 downto 0) = b"0000001")) then
  430.                if (mbit = '0' and track_flag='1') then read_intrq_flag <= '1';
  431.                   else    if(read_sector_num < sectors_in_track) then read_sector_num(7 downto 0) <= read_sector_num(7 downto 0) + '1'; read_byte_number(8 downto 0) <= (others =>'0'); read_delay(6 downto 0) <= (others =>'1');
  432.                              else read_intrq_flag <= '1';
  433.                           end if;
  434.                end if;
  435.             end if;
  436.  
  437.             if (read_intrq_flag='1') then read_intrq_flag<='0'; read_nrd <='0'; end if;
  438. end if;
  439. end process;
  440.  
  441. -- write track/sector process
  442. process (pixel_clock, hardware_reset, vg93_reset, write_start, vg93_cs, cpu_wr, cpu_a, mbit, force_interrupt_flag, sector_reg, sector_flag, track_flag, vg_tormoz)
  443. begin
  444. if (hardware_reset = '0' or vg93_reset = '0' or force_interrupt_flag = '0') then write_drq <= '0'; write_trz <= '0';
  445.     elsif (write_start='1') then write_state(1 downto 0) <= b"00"; write_byte_number(8 downto 0) <= (others =>'0'); write_delay(6 downto 0) <= (others =>'1'); write_trz <= '0'; write_flg0 <='0'; write_drq <='0'; write_flg1 <='0'; write_nrd <='0'; write_intrq_flag <='0';
  446.         elsif (vg93_cs = '0' and cpu_wr='0' and cpu_a(6 downto 5) = b"11") then write_drq <= '0'; -- DRQ reset
  447.             elsif (pixel_clock'event and pixel_clock = '1') then
  448.             if (write_state = b"00") then
  449.                 write_nrd <= '1';
  450.             if (write_nrd = '1') then write_state <= b"01"; end if;
  451.                 if (sector_flag = '0') then write_sector_num(7 downto 0) <= sector_reg(7 downto 0); end if;
  452.                 if (track_flag = '0') then write_sector_num(7 downto 0) <= b"00000001"; end if;
  453.             end if;
  454.             if (write_delay > 0) then write_delay(6 downto 0) <= write_delay(6 downto 0) - '1'; end if;
  455.             if ((write_delay(6 downto 0) = b"0000001") and (write_byte_number < bytes_in_sector)) then write_drq <= '1'; write_flg0 <='1'; end if;
  456.             if (write_flg0 = '1' and write_drq = '0') then write_flg0 <='0'; write_trz <='1'; end if;
  457.             if (vg_tormoz = '1') then write_trz <='0'; write_flg1 <= '1'; end if;
  458.             if (write_flg1 = '1' and vg_tormoz = '0') then write_flg1 <= '0';
  459.                if (write_byte_number < bytes_in_sector) then write_byte_number(8 downto 0) <= write_byte_number(8 downto 0) + '1'; write_delay(6 downto 0) <= (others =>'1');  end if;
  460.             end if;
  461.  
  462.             if ((write_byte_number = bytes_in_sector) and (write_delay(6 downto 0)=b"0000001")) then
  463.                if (mbit = '0') then write_intrq_flag <='1';
  464.                                else if (write_sector_num < sectors_in_track) then write_sector_num(7 downto 0) <= write_sector_num(7 downto 0) + '1'; write_byte_number(8 downto 0) <= (others =>'0'); write_delay(6 downto 0) <= (others =>'1');
  465.                                        else write_intrq_flag <='1';
  466.                                     end if;
  467.                end if;
  468.             end if;
  469.             if (write_intrq_flag ='1') then write_intrq_flag <='0'; write_nrd <= '0'; end if;
  470. end if;
  471. end process;
  472.  
  473. -- tracks numbering: 80 tracks with 2 sides, real numbering is 0..160, sectors from 1 to 16
  474. process (pixel_clock, track_position, betadisk_reg, read_flag, write_flag, read_sector_num, read_byte_number, write_sector_num, write_byte_number)
  475. begin
  476.         if (pixel_clock'event and pixel_clock = '0') then
  477.                 vg93_ram_addr(19 downto 14) <= b"110110" - track_position(6 downto 1);
  478.                 vg93_ram_addr(13 downto 12) <= track_position(0) & not(betadisk_reg(4));
  479.                 if (read_flag = '0') then
  480.                         vg93_ram_addr(11 downto 0)      <= (read_sector_num(3 downto 0)-'1') & read_byte_number(7 downto 0);
  481.                 end if;
  482.                 if (write_flag = '0') then
  483.                         vg93_ram_addr(11 downto 0)      <= (write_sector_num(3 downto 0)-'1') & write_byte_number(7 downto 0);
  484.                 end if;
  485.         end if;
  486. end process;
  487.        
  488. process (vg93_cs, read_addr_flag, read_flag)
  489. begin
  490.         if (vg93_cs'event and vg93_cs = '0') then
  491.                 if (read_addr_flag = '0') then vg93_data_for_cpu(7 downto 0) <= radr_out_data(7 downto 0); end if;
  492.                 if (read_flag = '0') then vg93_data_for_cpu(7 downto 0) <= vg93_data_from_ram(7 downto 0); end if;
  493.         end if;
  494. end process;
  495.        
  496. vg93_data_for_r <= vg93_data_from_cpu;
  497. vg93_data_for_cpu_o <= vg93_data_for_cpu;
  498. write_byte_n(7 downto 0) <= write_byte_number(7 downto 0);
  499. write_sector_n <= write_sector_num;
  500. read_sector_n <= read_sector_num;
  501. read_byte_n(7 downto 0) <= read_byte_number(7 downto 0);
  502. track_f <= track_flag;
  503. sector_f <= sector_flag;
  504. restore_f <= restore_flag;
  505. force_interrupt_f <= force_interrupt_flag;
  506. track_pos <= track_position;
  507. track_r <= track_reg;
  508. sector_r <= sector_reg;
  509. status_r <= status_reg;
  510. betadisk_reg <= betadisk_r;
  511. vg93intrq <= command_intrq;
  512. seek_f <= seek_flag;
  513. vg93drq <= vg93_drq;
  514. step_f <= step_flag;
  515. step_dir <= step_direction;
  516. read_addr_f <= read_addr_flag;
  517. read_f <= read_flag;
  518. write_f <= write_flag;
  519. vg_tormoz <= vg_trm_f;
  520. read_t <= read_trz;
  521. write_t <= write_trz;
  522. index <= index_pulse;
  523.  
  524. end bdi;
  525.