OpenCores
URL https://opencores.org/ocsvn/ion/ion/trunk

Subversion Repositories ion

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /ion/trunk
    from Rev 11 to Rev 12
    Reverse comparison

Rev 11 → Rev 12

/vhdl/mips_pkg.vhdl
35,4 → 35,17
inp1_eq_inp2 : std_logic;
end record t_alu_flags;
 
-- 32-cycle mul/div module control. Bits 4-3 & 1-0 of IR.
subtype t_mult_function is std_logic_vector(3 downto 0);
constant MULT_NOTHING : t_mult_function := "0000";
constant MULT_READ_LO : t_mult_function := "1010"; -- 18
constant MULT_READ_HI : t_mult_function := "1000"; -- 16
constant MULT_WRITE_LO : t_mult_function := "1011"; -- 19
constant MULT_WRITE_HI : t_mult_function := "1001"; -- 17
constant MULT_MULT : t_mult_function := "1101"; -- 25
constant MULT_SIGNED_MULT : t_mult_function := "1100"; -- 24
constant MULT_DIVIDE : t_mult_function := "1111"; -- 26
constant MULT_SIGNED_DIVIDE : t_mult_function := "1110"; -- 27
 
 
end package;
/vhdl/tb/mips_tb1.vhdl
1,5 → 1,5
--##############################################################################
-- This file was generated automatically from '/src/mips_tb1_template.vhdl'.
-- This file was generated automatically from '/src/mips_tb0_template.vhdl'.
--
-- Simulates the CPU core connected to two memory block, a read-only block
-- initialized with code and a read-write block initialized with all data,
7,10 → 7,8
-- to build simulation test benches using this template.
--
-- The memory setup is meant to test the 'bare' cpu, without cache.
--
-- Address decoding is harcoded to that of Plasma system, for the time being.
--
--
-- IMPORTANT: The code that echoes UART TX data to the simulation console does
-- line buffering; it will not print anything until it gets a CR (0x0d), and
-- will ifnore LFs (0x0a). Bear this in mind if you see no output when you
41,13 → 39,14
 
-- Master clock period
constant T : time := 20 ns;
-- Time the URAT is unavailable after writing to the TX register
-- Time the UART is unavailable after writing to the TX register
-- WARNING: slite does not simulate this. The logs may be different when > 0.0!
constant SIMULATED_UART_TX_TIME : time := 0.0 us;
 
-- Simulation length in clock cycles -- 2000 is enough for 'hello' sample
constant SIMULATION_LENGTH : integer := 2000;
 
--------------------------------------------------------------------------------
-- UUT & interface signals
 
86,6 → 85,7
signal rbank : t_rbank;
signal pc, cp0_epc : std_logic_vector(31 downto 2);
signal reg_hi, reg_lo : t_word;
signal negate_reg_lo : std_logic;
signal ld_upper_byte : std_logic;
signal ld_upper_hword : std_logic;
 
95,192 → 95,141
 
--------------------------------------------------------------------------------
 
-- Data RAM table and interface signals ----------------------------------------
constant DATA_RAM_SIZE : integer := 256;
constant DATA_ADDR_SIZE : integer := 8;
subtype t_data_address is std_logic_vector(DATA_ADDR_SIZE-1 downto 0);
-- (this table holds one byte-slice; the RAM will have 4 of these)
type t_data_ram is array(0 to DATA_RAM_SIZE-1) of std_logic_vector(7 downto 0);
constant MEM_SIZE : integer := 1024;
constant ADDR_SIZE : integer := 10;
 
signal data_addr_rd : t_data_address;
signal data_addr_wr : t_data_address;
subtype t_address is std_logic_vector(ADDR_SIZE-1 downto 0);
 
-- ram0 is LSB, ram3 is MSB
signal ram3 : t_data_ram := ( X"63",X"69",X"74",X"3A",X"6E",X"20",X"31",X"20",
X"32",X"38",X"67",X"76",X"69",X"20",X"34",X"00",
X"0A",X"6C",X"57",X"64",X"0A",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"
);
signal ram2 : t_data_ram := ( X"6F",X"6C",X"69",X"20",X"20",X"32",X"20",X"30",
X"38",X"0A",X"63",X"65",X"6F",X"20",X"2E",X"00",
X"0A",X"6C",X"6F",X"21",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"
);
signal ram1 : t_data_ram := ( X"6D",X"65",X"6D",X"4A",X"32",X"30",X"2D",X"39",
X"3A",X"00",X"63",X"72",X"6E",X"34",X"31",X"00",
X"48",X"6F",X"72",X"0A",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"
);
signal ram0 : t_data_ram := ( X"70",X"20",X"65",X"61",X"38",X"31",X"2D",X"3A",
X"33",X"00",X"20",X"73",X"3A",X"2E",X"0A",X"00",
X"65",X"20",X"6C",X"0A",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"
);
signal addr_rd, addr_wr : t_address;
signal addr_code : t_address;
 
type t_code_ram is array(0 to MEM_SIZE-1) of std_logic_vector(7 downto 0);
 
-- Code RAM table and interface signals ----------------------------------------
constant CODE_RAM_SIZE : integer := 1024;
constant CODE_ADDR_SIZE : integer := 10;
subtype t_code_address is std_logic_vector(CODE_ADDR_SIZE-1 downto 0);
-- (this table holds one byte-slice; the RAM will have 4 of these)
type t_code_ram is array(0 to CODE_RAM_SIZE-1) of std_logic_vector(7 downto 0);
subtype t_data_address is std_logic_vector(ADDR_SIZE-1 downto 0);
signal data_addr_rd : t_data_address;
signal data_addr_wr : t_data_address;
signal code_addr_rd : t_data_address;
 
signal code_addr_rd : t_data_address;
 
-- rom0 is LSB, rom3 is MSB
signal rom3 : t_code_ram := ( X"3C",X"27",X"3C",X"24",X"3C",X"24",X"3C",X"27",
X"AC",X"00",X"14",X"24",X"0C",X"00",X"08",X"23",
X"AF",X"AF",X"AF",X"AF",X"AF",X"AF",X"AF",X"AF",
X"AF",X"AF",X"AF",X"AF",X"AF",X"AF",X"AF",X"AF",
X"AF",X"AF",X"40",X"23",X"AF",X"00",X"AF",X"00",
X"AF",X"3C",X"8C",X"00",X"8C",X"00",X"00",X"0C",
X"23",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",
X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",
X"8F",X"8F",X"8F",X"8F",X"8F",X"00",X"03",X"8F",
X"00",X"03",X"23",X"34",X"03",X"40",X"40",X"03",
X"40",X"00",X"00",X"3C",X"24",X"8C",X"00",X"AC",
X"8C",X"00",X"AC",X"8C",X"00",X"AC",X"8C",X"00",
X"03",X"AC",X"3C",X"37",X"03",X"00",X"AC",X"AC",
X"AC",X"AC",X"AC",X"AC",X"AC",X"AC",X"AC",X"AC",
X"AC",X"AC",X"03",X"34",X"8C",X"8C",X"8C",X"8C",
X"8C",X"8C",X"8C",X"8C",X"8C",X"8C",X"8C",X"8C",
X"00",X"03",X"34",X"00",X"00",X"00",X"03",X"AC",
X"00",X"03",X"00",X"3C",X"27",X"AF",X"0C",X"24",
X"3C",X"0C",X"24",X"3C",X"8F",X"24",X"08",X"27",
X"3C",X"8C",X"00",X"30",X"10",X"3C",X"AC",X"03",
X"00",X"90",X"00",X"10",X"24",X"3C",X"3C",X"24",
X"10",X"00",X"24",X"8C",X"00",X"30",X"10",X"00",
X"AC",X"90",X"00",X"14",X"00",X"03",X"00",X"8C",
X"00",X"30",X"10",X"00",X"AC",X"08",X"24",X"24",
X"3C",X"3C",X"24",X"00",X"30",X"2C",X"10",X"00",
X"8C",X"00",X"30",X"10",X"00",X"24",X"24",X"AD",
X"14",X"00",X"03",X"00",X"8C",X"00",X"30",X"10",
X"00",X"24",X"24",X"AD",X"14",X"00",X"03",X"00",
X"3C",X"8C",X"00",X"30",X"10",X"3C",X"24",X"AC",
X"03",X"00",X"3C",X"8C",X"03",X"30",X"3C",X"8C",
X"00",X"30",X"10",X"3C",X"8C",X"03",X"00",X"00",
-- ram0 is LSB, ram3 is MSB
signal ram3 : t_code_ram := ( X"3C",X"27",X"3C",X"24",X"3C",X"24",X"00",X"00",
X"10",X"00",X"00",X"3C",X"37",X"03",X"00",X"40",
X"23",X"03",X"20",X"40",X"3C",X"34",X"34",X"34",
X"34",X"A2",X"A2",X"A2",X"A2",X"A2",X"A2",X"A2",
X"A2",X"3C",X"24",X"20",X"18",X"00",X"34",X"A2",
X"34",X"A2",X"34",X"A2",X"34",X"A2",X"34",X"A2",
X"A2",X"A2",X"34",X"A2",X"34",X"34",X"00",X"A2",
X"A2",X"A2",X"34",X"A2",X"34",X"20",X"A2",X"A2",
X"A2",X"34",X"A2",X"34",X"24",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"34",X"00",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"34",X"14",X"00",X"00",X"24",
X"14",X"3C",X"14",X"00",X"00",X"00",X"00",X"00",
X"A2",X"00",X"20",X"A2",X"24",X"34",X"14",X"00",
X"00",X"24",X"14",X"3C",X"14",X"00",X"00",X"00",
X"00",X"00",X"00",X"A2",X"34",X"24",X"14",X"00",
X"00",X"24",X"14",X"3C",X"14",X"00",X"00",X"00",
X"00",X"00",X"00",X"A2",X"24",X"24",X"14",X"00",
X"00",X"24",X"14",X"3C",X"14",X"00",X"00",X"00",
X"00",X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"34",
X"14",X"00",X"00",X"00",X"00",X"00",X"A2",X"A2",
X"A2",X"34",X"A2",X"34",X"34",X"00",X"00",X"00",
X"A2",X"24",X"34",X"00",X"00",X"00",X"00",X"00",
X"20",X"A2",X"34",X"24",X"00",X"00",X"00",X"00",
X"00",X"20",X"A2",X"24",X"24",X"00",X"00",X"00",
X"00",X"20",X"A2",X"3C",X"34",X"3C",X"34",X"00",
X"00",X"24",X"A2",X"A2",X"A2",X"34",X"A2",X"34",
X"34",X"00",X"00",X"00",X"A2",X"A2",X"A2",X"34",
X"A2",X"34",X"34",X"00",X"20",X"A2",X"00",X"20",
X"A2",X"24",X"00",X"20",X"A2",X"00",X"20",X"A2",
X"24",X"00",X"20",X"A2",X"00",X"20",X"A2",X"A2",
X"A2",X"34",X"A2",X"34",X"28",X"20",X"A2",X"28",
X"20",X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"2C",
X"20",X"A2",X"2C",X"20",X"A2",X"A2",X"A2",X"34",
X"A2",X"34",X"34",X"00",X"20",X"A2",X"00",X"20",
X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"34",X"00",
X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"34",X"00",
X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"A2",X"34",
X"A2",X"34",X"A2",X"34",X"A2",X"34",X"A2",X"A2",
X"A2",X"34",X"A2",X"34",X"34",X"10",X"A2",X"A2",
X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"34",X"34",
X"34",X"34",X"34",X"04",X"A2",X"A2",X"10",X"A2",
X"A2",X"A2",X"03",X"A2",X"A2",X"A2",X"A2",X"34",
X"A2",X"34",X"34",X"34",X"34",X"34",X"34",X"34",
X"10",X"A2",X"A2",X"10",X"A2",X"A2",X"A2",X"A2",
X"A2",X"34",X"A2",X"34",X"34",X"34",X"34",X"34",
X"34",X"3C",X"34",X"34",X"04",X"A2",X"A2",X"04",
X"A2",X"A2",X"04",X"00",X"A2",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"34",X"34",X"34",X"34",X"34",
X"3C",X"34",X"04",X"00",X"A2",X"04",X"00",X"A2",
X"10",X"A2",X"A2",X"A2",X"03",X"A2",X"A2",X"A2",
X"A2",X"34",X"A2",X"34",X"34",X"34",X"34",X"34",
X"3C",X"34",X"1C",X"A2",X"A2",X"1C",X"A2",X"A2",
X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"34",X"34",
X"34",X"34",X"3C",X"34",X"18",X"A2",X"A2",X"18",
X"A2",X"A2",X"18",X"00",X"A2",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"34",X"34",X"34",X"34",X"34",
X"3C",X"34",X"34",X"04",X"A2",X"A2",X"04",X"A2",
X"A2",X"04",X"00",X"A2",X"A2",X"A2",X"A2",X"34",
X"A2",X"34",X"34",X"34",X"34",X"34",X"34",X"3C",
X"34",X"04",X"00",X"A2",X"04",X"00",X"A2",X"10",
X"A2",X"A2",X"A2",X"03",X"A2",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"34",X"34",X"34",X"34",X"34",
X"34",X"14",X"A2",X"A2",X"14",X"A2",X"A2",X"A2",
X"A2",X"A2",X"34",X"A2",X"34",X"34",X"34",X"08",
X"A2",X"A2",X"A2",X"A2",X"A2",X"34",X"A2",X"34",
X"34",X"34",X"34",X"34",X"34",X"0C",X"A2",X"A2",
X"10",X"A2",X"A2",X"A2",X"03",X"A2",X"A2",X"A2",
X"A2",X"34",X"A2",X"34",X"34",X"34",X"34",X"34",
X"34",X"3C",X"24",X"00",X"A2",X"A2",X"10",X"A2",
X"A2",X"A2",X"03",X"A2",X"A2",X"A2",X"A2",X"34",
X"A2",X"34",X"34",X"34",X"3C",X"24",X"00",X"A2",
X"A2",X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"00",
X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"34",X"00",
X"20",X"A2",X"00",X"80",X"00",X"08",X"20",X"20",
X"00",X"08",X"00",X"20",X"A2",X"A2",X"34",X"A2",
X"34",X"00",X"20",X"A2",X"00",X"80",X"00",X"08",
X"20",X"20",X"00",X"08",X"00",X"20",X"A2",X"A2",
X"34",X"A2",X"34",X"A2",X"34",X"A2",X"34",X"A2",
X"A2",X"A2",X"34",X"A2",X"00",X"3C",X"34",X"AC",
X"80",X"A2",X"80",X"00",X"A2",X"80",X"00",X"A2",
X"80",X"00",X"00",X"20",X"A2",X"20",X"A2",X"A2",
X"A2",X"34",X"A2",X"00",X"3C",X"34",X"AC",X"80",
X"A2",X"80",X"A2",X"80",X"A2",X"80",X"A2",X"A2",
X"A2",X"34",X"A2",X"00",X"3C",X"34",X"AC",X"84",
X"A2",X"84",X"A2",X"A2",X"A2",X"34",X"A2",X"00",
X"3C",X"34",X"AC",X"84",X"A2",X"84",X"A2",X"A2",
X"A2",X"34",X"A2",X"00",X"24",X"AC",X"34",X"8C",
X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"A2",X"A2",
X"A2",X"34",X"A2",X"00",X"34",X"A4",X"80",X"A2",
X"80",X"A2",X"A2",X"A2",X"34",X"A2",X"00",X"3C",
X"34",X"AC",X"80",X"A2",X"80",X"A2",X"80",X"A2",
X"80",X"A2",X"A2",X"A2",X"34",X"A2",X"34",X"A2",
X"34",X"A2",X"34",X"A2",X"34",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"34",X"00",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"30",X"A2",X"A2",X"A2",X"34",
X"A2",X"3C",X"00",X"A2",X"A2",X"A2",X"34",X"A2",
X"3C",X"34",X"3C",X"34",X"00",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"34",X"00",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"34",X"A2",X"A2",X"A2",X"34",
X"A2",X"34",X"34",X"00",X"A2",X"A2",X"A2",X"34",
X"A2",X"34",X"38",X"A2",X"A2",X"A2",X"34",X"A2",
X"34",X"A2",X"34",X"A2",X"34",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"00",X"00",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"00",X"00",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"00",X"00",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"00",X"00",X"A2",X"A2",X"A2",
X"34",X"A2",X"34",X"A2",X"34",X"A2",X"34",X"A2",
X"34",X"A2",X"A2",X"A2",X"34",X"A2",X"3C",X"34",
X"00",X"00",X"A2",X"A2",X"A2",X"34",X"A2",X"3C",
X"34",X"34",X"00",X"00",X"A2",X"A2",X"A2",X"34",
X"A2",X"3C",X"34",X"00",X"A2",X"3C",X"00",X"20",
X"A2",X"A2",X"A2",X"34",X"A2",X"3C",X"34",X"34",
X"00",X"A2",X"34",X"3C",X"00",X"20",X"A2",X"A2",
X"A2",X"34",X"A2",X"3C",X"34",X"00",X"A2",X"3C",
X"00",X"A2",X"A2",X"A2",X"34",X"A2",X"3C",X"34",
X"34",X"00",X"A2",X"34",X"3C",X"00",X"A2",X"A2",
X"A2",X"34",X"A2",X"34",X"A2",X"34",X"A2",X"34",
X"A2",X"A2",X"A2",X"08",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
290,126 → 239,126
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"
);
signal rom2 : t_code_ram := ( X"1C",X"9C",X"05",X"A5",X"04",X"84",X"1D",X"BD",
X"A0",X"A4",X"60",X"A5",X"00",X"00",X"00",X"BD",
X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",X"A8",
X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",X"B8",
X"B9",X"BF",X"1A",X"5A",X"BA",X"00",X"BB",X"00",
X"BB",X"06",X"C4",X"00",X"C6",X"00",X"86",X"00",
X"A5",X"A1",X"A2",X"A3",X"A4",X"A5",X"A6",X"A7",
X"A8",X"A9",X"AA",X"AB",X"AC",X"AD",X"AE",X"AF",
X"B8",X"B9",X"BF",X"BA",X"BB",X"00",X"60",X"BB",
X"00",X"60",X"BD",X"1B",X"40",X"9B",X"02",X"E0",
X"84",X"00",X"00",X"05",X"A5",X"A6",X"00",X"06",
X"A6",X"00",X"06",X"A6",X"00",X"06",X"A6",X"00",
X"E0",X"06",X"1A",X"5A",X"40",X"00",X"90",X"91",
X"92",X"93",X"94",X"95",X"96",X"97",X"9E",X"9C",
X"9D",X"9F",X"E0",X"02",X"90",X"91",X"92",X"93",
X"94",X"95",X"96",X"97",X"9E",X"9C",X"9D",X"9F",
X"00",X"E0",X"A2",X"85",X"00",X"00",X"E0",X"C4",
X"00",X"E0",X"00",X"04",X"BD",X"BF",X"00",X"84",
X"04",X"00",X"84",X"04",X"BF",X"84",X"00",X"BD",
X"03",X"62",X"00",X"42",X"40",X"02",X"44",X"E0",
X"00",X"85",X"00",X"A0",X"07",X"03",X"06",X"08",
X"A7",X"00",X"84",X"62",X"00",X"42",X"40",X"00",
X"C5",X"85",X"00",X"A0",X"00",X"E0",X"00",X"62",
X"00",X"42",X"40",X"00",X"C8",X"00",X"84",X"05",
X"02",X"08",X"07",X"A4",X"C6",X"C3",X"60",X"00",
X"43",X"00",X"63",X"60",X"00",X"C6",X"A5",X"06",
X"A7",X"A4",X"E0",X"00",X"43",X"00",X"63",X"60",
X"00",X"C6",X"A5",X"06",X"A7",X"A4",X"E0",X"00",
X"03",X"62",X"00",X"42",X"40",X"02",X"03",X"43",
X"E0",X"00",X"02",X"42",X"E0",X"42",X"03",X"62",
X"00",X"42",X"40",X"02",X"42",X"E0",X"00",X"00",
signal ram2 : t_code_ram := ( X"1C",X"9C",X"04",X"84",X"05",X"A5",X"00",X"00",
X"00",X"00",X"00",X"1A",X"5A",X"40",X"00",X"1A",
X"5A",X"40",X"84",X"80",X"14",X"15",X"16",X"17",
X"18",X"97",X"95",X"97",X"95",X"97",X"95",X"97",
X"95",X"05",X"A5",X"A6",X"C0",X"00",X"02",X"82",
X"02",X"82",X"02",X"82",X"02",X"82",X"02",X"82",
X"97",X"95",X"02",X"82",X"03",X"04",X"64",X"82",
X"97",X"95",X"02",X"82",X"04",X"82",X"82",X"97",
X"95",X"02",X"82",X"04",X"85",X"85",X"97",X"95",
X"02",X"82",X"03",X"04",X"64",X"82",X"97",X"95",
X"02",X"82",X"02",X"03",X"60",X"43",X"07",X"01",
X"61",X"01",X"41",X"00",X"06",X"00",X"00",X"00",
X"84",X"00",X"84",X"84",X"02",X"03",X"60",X"43",
X"07",X"01",X"61",X"01",X"41",X"00",X"06",X"00",
X"00",X"00",X"04",X"84",X"02",X"03",X"60",X"43",
X"07",X"01",X"61",X"01",X"41",X"00",X"06",X"00",
X"00",X"00",X"04",X"84",X"02",X"03",X"60",X"43",
X"07",X"01",X"61",X"01",X"41",X"00",X"06",X"00",
X"00",X"84",X"97",X"95",X"02",X"82",X"02",X"03",
X"60",X"43",X"07",X"00",X"00",X"00",X"84",X"97",
X"95",X"02",X"82",X"02",X"03",X"43",X"00",X"00",
X"84",X"02",X"03",X"43",X"00",X"00",X"04",X"85",
X"84",X"84",X"02",X"03",X"43",X"00",X"00",X"04",
X"85",X"84",X"84",X"02",X"03",X"43",X"00",X"00",
X"85",X"84",X"84",X"04",X"84",X"05",X"A5",X"85",
X"00",X"C7",X"87",X"97",X"95",X"02",X"82",X"02",
X"03",X"43",X"00",X"00",X"84",X"97",X"95",X"02",
X"82",X"02",X"03",X"43",X"85",X"85",X"62",X"85",
X"85",X"02",X"43",X"85",X"85",X"62",X"85",X"85",
X"03",X"43",X"85",X"85",X"62",X"85",X"85",X"97",
X"95",X"02",X"82",X"02",X"44",X"85",X"85",X"44",
X"85",X"85",X"97",X"95",X"02",X"82",X"02",X"44",
X"85",X"85",X"44",X"85",X"85",X"97",X"95",X"02",
X"82",X"02",X"03",X"43",X"85",X"85",X"62",X"85",
X"85",X"97",X"95",X"02",X"82",X"03",X"04",X"64",
X"82",X"97",X"95",X"02",X"82",X"03",X"04",X"64",
X"82",X"97",X"95",X"02",X"82",X"02",X"82",X"02",
X"82",X"02",X"82",X"02",X"82",X"02",X"82",X"97",
X"95",X"02",X"82",X"0A",X"0B",X"00",X"8A",X"96",
X"8B",X"97",X"95",X"02",X"82",X"0A",X"0B",X"0C",
X"0D",X"0E",X"0F",X"11",X"8A",X"8D",X"00",X"8E",
X"8F",X"8B",X"E0",X"8C",X"96",X"97",X"95",X"02",
X"82",X"0A",X"0B",X"0C",X"0D",X"02",X"03",X"04",
X"43",X"8A",X"8B",X"64",X"8C",X"96",X"8D",X"97",
X"95",X"02",X"82",X"0A",X"0B",X"0C",X"0D",X"0F",
X"02",X"03",X"63",X"04",X"61",X"8A",X"8B",X"41",
X"8C",X"96",X"01",X"00",X"8F",X"8D",X"97",X"95",
X"02",X"82",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",
X"03",X"63",X"71",X"00",X"8A",X"11",X"00",X"8D",
X"00",X"8E",X"8F",X"8B",X"E0",X"8C",X"96",X"97",
X"95",X"02",X"82",X"0A",X"0B",X"0C",X"0D",X"02",
X"03",X"63",X"60",X"8A",X"8B",X"40",X"8C",X"96",
X"8D",X"97",X"95",X"02",X"82",X"0A",X"0B",X"0C",
X"0D",X"02",X"03",X"63",X"40",X"8A",X"8B",X"60",
X"8C",X"96",X"00",X"00",X"96",X"8D",X"97",X"95",
X"02",X"82",X"0A",X"0B",X"0C",X"0D",X"0E",X"02",
X"03",X"63",X"04",X"40",X"8A",X"8B",X"60",X"8C",
X"96",X"80",X"00",X"8D",X"8E",X"97",X"95",X"02",
X"82",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"03",
X"63",X"10",X"00",X"8A",X"70",X"00",X"8D",X"00",
X"8E",X"8F",X"8B",X"E0",X"8C",X"96",X"97",X"95",
X"02",X"82",X"0A",X"0B",X"0C",X"0D",X"02",X"03",
X"04",X"64",X"8A",X"8B",X"43",X"8C",X"96",X"8D",
X"97",X"95",X"02",X"82",X"0A",X"0B",X"0F",X"00",
X"8A",X"8F",X"8B",X"97",X"95",X"02",X"82",X"0A",
X"0B",X"0C",X"0D",X"0E",X"0F",X"00",X"8A",X"8D",
X"00",X"8E",X"8F",X"8B",X"E0",X"8C",X"96",X"97",
X"95",X"02",X"82",X"0A",X"0B",X"0C",X"0D",X"0E",
X"0F",X"03",X"63",X"60",X"8A",X"8D",X"00",X"8E",
X"8F",X"8B",X"E0",X"8C",X"96",X"97",X"95",X"02",
X"82",X"0A",X"0B",X"0F",X"03",X"63",X"60",X"8A",
X"8F",X"8B",X"97",X"95",X"02",X"82",X"02",X"00",
X"82",X"97",X"95",X"02",X"82",X"02",X"04",X"00",
X"84",X"84",X"00",X"42",X"00",X"00",X"84",X"84",
X"00",X"00",X"00",X"84",X"97",X"95",X"02",X"82",
X"04",X"00",X"84",X"84",X"00",X"42",X"00",X"00",
X"84",X"84",X"00",X"00",X"00",X"84",X"97",X"95",
X"02",X"82",X"02",X"82",X"02",X"82",X"02",X"82",
X"97",X"95",X"02",X"82",X"18",X"03",X"63",X"43",
X"44",X"84",X"44",X"00",X"84",X"44",X"00",X"84",
X"42",X"00",X"02",X"63",X"83",X"42",X"82",X"97",
X"95",X"02",X"82",X"18",X"03",X"63",X"43",X"44",
X"84",X"44",X"84",X"44",X"84",X"42",X"82",X"97",
X"95",X"02",X"82",X"18",X"03",X"63",X"43",X"44",
X"84",X"42",X"82",X"97",X"95",X"02",X"82",X"18",
X"03",X"63",X"43",X"44",X"84",X"42",X"82",X"97",
X"95",X"02",X"82",X"18",X"03",X"43",X"03",X"42",
X"82",X"97",X"95",X"02",X"82",X"02",X"82",X"97",
X"95",X"02",X"82",X"18",X"02",X"82",X"83",X"83",
X"82",X"82",X"97",X"95",X"02",X"82",X"18",X"03",
X"63",X"43",X"44",X"84",X"44",X"84",X"44",X"84",
X"42",X"82",X"97",X"95",X"02",X"82",X"02",X"82",
X"02",X"82",X"02",X"82",X"02",X"82",X"97",X"95",
X"02",X"82",X"02",X"03",X"43",X"84",X"97",X"95",
X"02",X"82",X"02",X"44",X"84",X"97",X"95",X"02",
X"82",X"02",X"02",X"83",X"97",X"95",X"02",X"82",
X"02",X"42",X"03",X"63",X"43",X"84",X"97",X"95",
X"02",X"82",X"02",X"03",X"43",X"84",X"97",X"95",
X"02",X"82",X"02",X"44",X"84",X"97",X"95",X"02",
X"82",X"02",X"03",X"43",X"84",X"97",X"95",X"02",
X"82",X"02",X"44",X"84",X"97",X"95",X"02",X"82",
X"02",X"82",X"02",X"82",X"02",X"82",X"97",X"95",
X"02",X"82",X"02",X"40",X"00",X"83",X"97",X"95",
X"02",X"82",X"02",X"40",X"00",X"83",X"97",X"95",
X"02",X"82",X"02",X"40",X"00",X"83",X"97",X"95",
X"02",X"82",X"02",X"40",X"00",X"83",X"97",X"95",
X"02",X"82",X"02",X"82",X"02",X"82",X"02",X"82",
X"02",X"82",X"97",X"95",X"02",X"82",X"02",X"42",
X"02",X"03",X"83",X"97",X"95",X"02",X"82",X"02",
X"42",X"03",X"62",X"03",X"83",X"97",X"95",X"02",
X"82",X"02",X"42",X"02",X"83",X"02",X"02",X"63",
X"83",X"97",X"95",X"02",X"82",X"02",X"42",X"03",
X"62",X"83",X"03",X"02",X"62",X"63",X"83",X"97",
X"95",X"02",X"82",X"02",X"42",X"02",X"83",X"02",
X"02",X"83",X"97",X"95",X"02",X"82",X"02",X"42",
X"03",X"62",X"84",X"03",X"02",X"62",X"83",X"97",
X"95",X"02",X"82",X"02",X"82",X"02",X"82",X"02",
X"82",X"97",X"95",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
419,159 → 368,126
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"
);
signal rom1 : t_code_ram := ( X"00",X"7F",X"00",X"00",X"00",X"02",X"00",X"02",
X"00",X"18",X"FF",X"00",X"00",X"00",X"00",X"FF",
signal ram1 : t_code_ram := ( X"00",X"8E",X"00",X"0E",X"00",X"0E",X"00",X"00",
X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"70",
X"00",X"00",X"00",X"60",X"20",X"00",X"00",X"00",
X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"70",X"FF",X"00",X"D8",X"00",X"D8",
X"00",X"20",X"00",X"00",X"00",X"00",X"20",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",
X"00",X"00",X"1D",X"00",X"00",X"00",X"00",X"FF",
X"00",X"80",X"00",X"00",X"00",X"10",X"00",X"20",
X"00",X"20",X"00",X"00",X"FB",X"00",X"00",X"00",
X"00",X"FF",X"00",X"80",X"00",X"00",X"00",X"10",
X"00",X"20",X"20",X"00",X"06",X"FF",X"00",X"00",
X"00",X"FF",X"00",X"80",X"00",X"00",X"00",X"10",
X"00",X"20",X"20",X"00",X"FC",X"FF",X"00",X"00",
X"00",X"FF",X"00",X"80",X"00",X"00",X"00",X"10",
X"20",X"00",X"00",X"00",X"00",X"00",X"03",X"00",
X"00",X"00",X"00",X"10",X"00",X"20",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",
X"00",X"FF",X"00",X"00",X"28",X"20",X"20",X"20",
X"00",X"00",X"00",X"FF",X"00",X"28",X"20",X"20",
X"20",X"00",X"00",X"FF",X"FF",X"00",X"28",X"20",
X"20",X"00",X"00",X"FE",X"62",X"00",X"8D",X"00",
X"30",X"09",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"20",X"00",X"00",X"20",X"00",
X"00",X"FF",X"20",X"00",X"00",X"20",X"00",X"00",
X"FF",X"20",X"00",X"00",X"20",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",
X"60",X"00",X"00",X"00",X"01",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"10",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"20",X"00",X"00",X"20",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"10",X"20",X"00",X"00",
X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"20",X"00",X"00",X"00",X"FF",X"20",X"00",X"00",
X"10",X"00",X"00",X"00",X"00",X"20",X"20",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",
X"00",X"00",X"00",X"FF",X"00",X"00",X"10",X"00",
X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",
X"20",X"20",X"FF",X"30",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"FF",X"00",X"00",X"FF",X"00",
X"FF",X"30",X"00",X"00",X"00",X"00",X"00",X"FF",
X"00",X"00",X"FF",X"00",X"FF",X"30",X"00",X"00",
X"20",X"00",X"00",X"00",X"FF",X"20",X"00",X"00",
X"00",X"00",X"20",X"00",X"00",X"00",X"20",X"00",
X"00",X"00",X"FF",X"20",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"FF",X"12",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"FF",X"12",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"FF",X"12",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"FF",X"12",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"FF",X"12",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",
X"12",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"08",X"F8",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",
X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"02",
X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"10",X"41",X"43",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"1A",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"10",X"41",X"43",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"20",X"41",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"41",
X"43",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"07",X"60",X"20",X"00",X"00",X"00",
X"00",X"00",X"07",X"60",X"00",X"00",X"00",X"00",
X"00",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",
X"F0",X"F0",X"0F",X"0F",X"20",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"F0",X"F0",X"20",X"00",X"00",X"00",X"00",
X"00",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"18",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"18",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"18",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"18",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"42",
X"1A",X"1E",X"00",X"00",X"00",X"00",X"00",X"40",
X"42",X"00",X"18",X"1E",X"00",X"00",X"00",X"00",
X"00",X"40",X"42",X"1C",X"00",X"84",X"1E",X"FF",
X"00",X"00",X"00",X"00",X"00",X"40",X"42",X"00",
X"18",X"00",X"00",X"84",X"18",X"FF",X"00",X"00",
X"00",X"00",X"00",X"40",X"42",X"1C",X"00",X"84",
X"1E",X"00",X"00",X"00",X"00",X"00",X"40",X"42",
X"00",X"20",X"00",X"00",X"84",X"18",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
581,93 → 497,126
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"
);
signal rom0 : t_code_ram := ( X"01",X"F0",X"01",X"58",X"01",X"60",X"01",X"48",
X"00",X"2A",X"FD",X"04",X"8B",X"00",X"0E",X"98",
X"10",X"14",X"18",X"1C",X"20",X"24",X"28",X"2C",
X"30",X"34",X"38",X"3C",X"40",X"44",X"48",X"4C",
X"50",X"54",X"00",X"FC",X"58",X"10",X"5C",X"12",
X"60",X"00",X"20",X"00",X"10",X"00",X"24",X"E0",
X"00",X"10",X"14",X"18",X"1C",X"20",X"24",X"28",
X"2C",X"30",X"34",X"38",X"3C",X"40",X"44",X"48",
X"4C",X"50",X"54",X"58",X"5C",X"00",X"11",X"60",
X"00",X"13",X"68",X"01",X"08",X"00",X"00",X"08",
X"00",X"00",X"00",X"00",X"88",X"00",X"00",X"3C",
X"04",X"00",X"40",X"08",X"00",X"44",X"0C",X"00",
X"08",X"48",X"00",X"3C",X"08",X"00",X"00",X"04",
X"08",X"0C",X"10",X"14",X"18",X"1C",X"20",X"24",
X"28",X"2C",X"08",X"00",X"00",X"04",X"08",X"0C",
X"10",X"14",X"18",X"1C",X"20",X"24",X"28",X"2C",
X"00",X"08",X"00",X"19",X"12",X"10",X"08",X"00",
X"0C",X"08",X"00",X"01",X"E8",X"14",X"A1",X"00",
X"01",X"A1",X"28",X"01",X"14",X"40",X"A1",X"18",
X"00",X"20",X"00",X"02",X"FC",X"00",X"00",X"08",
X"21",X"00",X"00",X"11",X"0A",X"00",X"00",X"0D",
X"0E",X"00",X"01",X"20",X"00",X"02",X"FC",X"00",
X"00",X"00",X"00",X"F4",X"00",X"08",X"21",X"20",
X"00",X"02",X"FC",X"00",X"00",X"AB",X"01",X"1C",
X"00",X"00",X"FC",X"06",X"0F",X"0A",X"0D",X"00",
X"20",X"00",X"02",X"FC",X"00",X"30",X"FC",X"00",
X"F3",X"06",X"08",X"00",X"20",X"00",X"02",X"FC",
X"00",X"57",X"FC",X"00",X"E7",X"06",X"08",X"00",
X"00",X"20",X"00",X"02",X"FC",X"00",X"49",X"00",
X"08",X"00",X"00",X"20",X"08",X"01",X"00",X"20",
X"00",X"01",X"FC",X"00",X"00",X"08",X"00",X"00",
signal ram0 : t_code_ram := ( X"01",X"B0",X"00",X"B4",X"00",X"B4",X"00",X"00",
X"0A",X"00",X"00",X"00",X"3C",X"08",X"00",X"00",
X"04",X"08",X"05",X"00",X"00",X"0A",X"58",X"0D",
X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"2C",X"00",X"01",X"00",X"41",X"00",
X"72",X"00",X"69",X"00",X"74",X"00",X"68",X"00",
X"00",X"00",X"61",X"00",X"05",X"3C",X"20",X"00",
X"00",X"00",X"62",X"00",X"3C",X"05",X"00",X"00",
X"00",X"63",X"00",X"32",X"0F",X"00",X"00",X"00",
X"64",X"00",X"05",X"3C",X"20",X"00",X"00",X"00",
X"65",X"00",X"DE",X"75",X"02",X"1A",X"0D",X"FF",
X"04",X"00",X"02",X"00",X"0D",X"12",X"00",X"12",
X"00",X"10",X"19",X"00",X"07",X"13",X"02",X"1A",
X"0D",X"FF",X"04",X"00",X"02",X"00",X"0D",X"12",
X"00",X"12",X"22",X"00",X"1C",X"E9",X"02",X"1A",
X"0D",X"FF",X"04",X"00",X"02",X"00",X"0D",X"12",
X"00",X"12",X"22",X"00",X"7F",X"F3",X"02",X"1A",
X"0D",X"FF",X"04",X"00",X"02",X"00",X"0D",X"12",
X"12",X"00",X"00",X"00",X"66",X"00",X"4D",X"0D",
X"02",X"1B",X"0D",X"12",X"00",X"12",X"00",X"00",
X"00",X"67",X"00",X"05",X"0D",X"18",X"00",X"12",
X"00",X"FB",X"0D",X"18",X"10",X"12",X"22",X"21",
X"02",X"00",X"05",X"F3",X"18",X"10",X"12",X"22",
X"21",X"03",X"00",X"FB",X"F3",X"18",X"10",X"12",
X"21",X"03",X"00",X"98",X"E5",X"06",X"B8",X"18",
X"10",X"7A",X"00",X"00",X"00",X"68",X"00",X"05",
X"0D",X"19",X"00",X"12",X"00",X"00",X"00",X"69",
X"00",X"0A",X"0C",X"2A",X"40",X"00",X"2A",X"42",
X"00",X"F0",X"2A",X"42",X"00",X"2A",X"44",X"00",
X"FF",X"2A",X"44",X"00",X"2A",X"46",X"00",X"00",
X"00",X"6A",X"00",X"0A",X"0C",X"40",X"00",X"08",
X"42",X"00",X"00",X"00",X"6B",X"00",X"0A",X"0C",
X"40",X"00",X"08",X"42",X"00",X"00",X"00",X"6C",
X"00",X"0A",X"0C",X"2A",X"40",X"00",X"2A",X"42",
X"00",X"00",X"00",X"6D",X"00",X"46",X"05",X"22",
X"00",X"00",X"00",X"6E",X"00",X"46",X"05",X"22",
X"00",X"00",X"00",X"42",X"00",X"72",X"00",X"61",
X"00",X"6E",X"00",X"63",X"00",X"68",X"00",X"00",
X"00",X"61",X"00",X"41",X"42",X"02",X"00",X"00",
X"00",X"00",X"00",X"62",X"00",X"41",X"42",X"43",
X"44",X"45",X"58",X"05",X"00",X"00",X"06",X"00",
X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"63",
X"00",X"41",X"42",X"43",X"44",X"64",X"7B",X"7B",
X"05",X"00",X"00",X"02",X"00",X"00",X"00",X"00",
X"00",X"64",X"00",X"41",X"42",X"43",X"44",X"58",
X"64",X"FF",X"34",X"7B",X"05",X"00",X"00",X"02",
X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",
X"65",X"00",X"41",X"42",X"43",X"44",X"45",X"58",
X"FF",X"34",X"08",X"00",X"00",X"05",X"00",X"00",
X"06",X"00",X"00",X"00",X"08",X"00",X"00",X"00",
X"00",X"66",X"00",X"41",X"42",X"43",X"44",X"64",
X"FF",X"34",X"05",X"00",X"00",X"02",X"00",X"00",
X"00",X"00",X"00",X"67",X"00",X"41",X"42",X"43",
X"44",X"64",X"FF",X"34",X"05",X"00",X"00",X"02",
X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",
X"68",X"00",X"41",X"42",X"43",X"44",X"45",X"64",
X"FF",X"34",X"00",X"05",X"00",X"00",X"02",X"00",
X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"69",
X"00",X"41",X"42",X"43",X"44",X"45",X"58",X"FF",
X"34",X"08",X"00",X"00",X"05",X"00",X"00",X"06",
X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",
X"6A",X"00",X"41",X"42",X"43",X"44",X"64",X"7B",
X"7B",X"05",X"00",X"00",X"02",X"00",X"00",X"00",
X"00",X"00",X"6B",X"00",X"41",X"42",X"58",X"02",
X"00",X"00",X"00",X"00",X"00",X"6C",X"00",X"41",
X"42",X"43",X"44",X"45",X"58",X"13",X"00",X"00",
X"06",X"00",X"00",X"00",X"08",X"00",X"00",X"00",
X"00",X"6D",X"00",X"41",X"42",X"43",X"44",X"45",
X"58",X"00",X"A4",X"09",X"00",X"00",X"06",X"00",
X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"6E",
X"00",X"41",X"42",X"58",X"00",X"E4",X"08",X"00",
X"00",X"00",X"00",X"00",X"6F",X"00",X"41",X"00",
X"00",X"00",X"00",X"70",X"00",X"7A",X"3B",X"0D",
X"01",X"00",X"0D",X"10",X"0D",X"4F",X"05",X"01",
X"00",X"54",X"00",X"01",X"00",X"00",X"71",X"00",
X"3D",X"0C",X"FF",X"00",X"0C",X"10",X"0C",X"61",
X"05",X"01",X"00",X"66",X"00",X"01",X"00",X"00",
X"4C",X"00",X"6F",X"00",X"61",X"00",X"64",X"00",
X"00",X"00",X"61",X"00",X"25",X"42",X"FC",X"10",
X"10",X"00",X"11",X"00",X"00",X"12",X"00",X"00",
X"13",X"00",X"03",X"45",X"00",X"49",X"00",X"00",
X"00",X"62",X"00",X"25",X"42",X"44",X"10",X"10",
X"00",X"11",X"00",X"12",X"00",X"13",X"00",X"00",
X"00",X"63",X"00",X"25",X"41",X"42",X"10",X"10",
X"00",X"12",X"00",X"00",X"00",X"64",X"00",X"25",
X"41",X"42",X"10",X"10",X"00",X"12",X"00",X"00",
X"00",X"65",X"00",X"25",X"41",X"10",X"00",X"10",
X"00",X"00",X"00",X"67",X"00",X"41",X"00",X"00",
X"00",X"68",X"00",X"25",X"42",X"10",X"10",X"00",
X"11",X"00",X"00",X"00",X"69",X"00",X"25",X"42",
X"44",X"10",X"10",X"00",X"11",X"00",X"12",X"00",
X"13",X"00",X"00",X"00",X"4C",X"00",X"6F",X"00",
X"67",X"00",X"69",X"00",X"63",X"00",X"00",X"00",
X"61",X"00",X"41",X"F3",X"24",X"00",X"00",X"00",
X"62",X"00",X"41",X"F3",X"00",X"00",X"00",X"63",
X"00",X"41",X"02",X"00",X"00",X"00",X"64",X"00",
X"FF",X"8E",X"0F",X"30",X"27",X"00",X"00",X"00",
X"65",X"00",X"40",X"01",X"25",X"00",X"00",X"00",
X"66",X"00",X"40",X"01",X"00",X"00",X"00",X"67",
X"00",X"43",X"02",X"26",X"00",X"00",X"00",X"68",
X"00",X"43",X"02",X"00",X"00",X"00",X"4D",X"00",
X"6F",X"00",X"76",X"00",X"65",X"00",X"00",X"00",
X"61",X"00",X"41",X"11",X"10",X"00",X"00",X"00",
X"62",X"00",X"41",X"13",X"12",X"00",X"00",X"00",
X"63",X"00",X"41",X"11",X"10",X"00",X"00",X"00",
X"64",X"00",X"41",X"13",X"12",X"00",X"00",X"00",
X"53",X"00",X"68",X"00",X"69",X"00",X"66",X"00",
X"74",X"00",X"00",X"00",X"61",X"00",X"41",X"43",
X"00",X"02",X"00",X"00",X"00",X"62",X"00",X"41",
X"43",X"08",X"04",X"02",X"00",X"00",X"00",X"63",
X"00",X"41",X"43",X"03",X"00",X"00",X"43",X"80",
X"00",X"00",X"00",X"64",X"00",X"41",X"43",X"10",
X"07",X"00",X"19",X"00",X"07",X"80",X"00",X"00",
X"00",X"65",X"00",X"41",X"43",X"02",X"00",X"00",
X"42",X"00",X"00",X"00",X"66",X"00",X"41",X"43",
X"10",X"06",X"00",X"19",X"00",X"06",X"00",X"00",
X"00",X"44",X"00",X"6F",X"00",X"6E",X"00",X"65",
X"00",X"00",X"00",X"AB",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
677,97 → 626,9
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"
);
 
 
begin
 
uut: entity work.mips_cpu
832,10 → 693,11
full_wr_addr <= wr_addr & "00";
full_code_addr <= code_addr & "00";
 
data_addr_rd <= full_rd_addr(DATA_ADDR_SIZE-1+2 downto 2);
data_addr_wr <= full_wr_addr(DATA_ADDR_SIZE-1+2 downto 2);
code_addr_rd <= full_code_addr(DATA_ADDR_SIZE-1+2 downto 2);
data_addr_rd <= full_rd_addr(ADDR_SIZE-1+2 downto 2);
addr_wr <= full_wr_addr(ADDR_SIZE-1+2 downto 2);
code_addr_rd <= full_code_addr(ADDR_SIZE-1+2 downto 2);
 
 
write_process:
process(clk)
variable i : integer;
856,10 → 718,10
ram0(conv_integer(unsigned(data_addr_rd)));
code_r <=
rom3(conv_integer(unsigned(code_addr_rd))) &
rom2(conv_integer(unsigned(code_addr_rd))) &
rom1(conv_integer(unsigned(code_addr_rd))) &
rom0(conv_integer(unsigned(code_addr_rd)));
ram3(conv_integer(unsigned(code_addr_rd))) &
ram2(conv_integer(unsigned(code_addr_rd))) &
ram1(conv_integer(unsigned(code_addr_rd))) &
ram0(conv_integer(unsigned(code_addr_rd)));
end if;
if byte_we/="0000" then
881,7 → 743,7
-- UART TX data goes to output after a bit of line-buffering
-- and editing
if uart_data = 13 then
if uart_data = 10 then
-- CR received: print output string and clear it
print(s);
si := 1;
888,7 → 750,7
for i in 1 to s'high loop
s(i) := ' ';
end loop;
elsif uart_data = 10 then
elsif uart_data = 13 then
-- ignore LF
else
-- append char to output string
900,16 → 762,16
else
-- Write to RAM
if byte_we(3)='1' then
ram3(conv_integer(unsigned(data_addr_wr))) <= data_w(31 downto 24);
ram3(conv_integer(unsigned(addr_wr))) <= data_w(31 downto 24);
end if;
if byte_we(2)='1' then
ram2(conv_integer(unsigned(data_addr_wr))) <= data_w(23 downto 16);
ram2(conv_integer(unsigned(addr_wr))) <= data_w(23 downto 16);
end if;
if byte_we(1)='1' then
ram1(conv_integer(unsigned(data_addr_wr))) <= data_w(15 downto 8);
ram1(conv_integer(unsigned(addr_wr))) <= data_w(15 downto 8);
end if;
if byte_we(0)='1' then
ram0(conv_integer(unsigned(data_addr_wr))) <= data_w( 7 downto 0);
ram0(conv_integer(unsigned(addr_wr))) <= data_w( 7 downto 0);
end if;
end if;
end if;
921,8 → 783,9
begin
init_signal_spy("/mips_tb1/uut/p1_rbank", "rbank", 0, -1);
init_signal_spy("/mips_tb1/uut/p0_pc_reg", "pc", 0, -1);
init_signal_spy("/mips_tb1/uut/mdiv_hi_reg", "reg_hi", 0, -1);
init_signal_spy("/mips_tb1/uut/mdiv_lo_reg", "reg_lo", 0, -1);
init_signal_spy("/mips_tb1/uut/mult_div/upper_reg", "reg_hi", 0, -1);
init_signal_spy("/mips_tb1/uut/mult_div/lower_reg", "reg_lo", 0, -1);
init_signal_spy("/mips_tb1/uut/mult_div/negate_reg", "negate_reg_lo", 0, -1);
init_signal_spy("/mips_tb1/uut/cp0_epc", "cp0_epc", 0, -1);
init_signal_spy("/mips_tb1/uut/p2_ld_upper_byte", "ld_upper_byte", 0, -1);
init_signal_spy("/mips_tb1/uut/p2_ld_upper_byte", "ld_upper_hword", 0, -1);
980,23 → 843,41
ri := ri + 1;
end loop;
 
-- log aux register changes
if prev_hi /= reg_hi and reg_hi(0)/='U' then
-- log aux register changes, only when pipeline is not stalled
if prev_lo /= reg_lo and reg_lo(0)/='U' and vma_code='1' then
-- we're observing the value of reg_lo, but the mult core
-- will output the negated value in some cases. We
-- have to mimic that behavior.
if negate_reg_lo='1' then
-- negate reg_lo before displaying
prev_lo := not reg_lo;
prev_lo := prev_lo + 1;
print(l_file, "("& hstr(full_pc)& ") [LO]="& hstr(prev_lo));
else
print(l_file, "("& hstr(full_pc)& ") [LO]="& hstr(reg_lo));
end if;
end if;
if prev_hi /= reg_hi and reg_hi(0)/='U' and vma_code='1' then
print(l_file, "("& hstr(full_pc)& ") [HI]="& hstr(reg_hi));
end if;
if prev_lo /= reg_lo and reg_lo(0)/='U' then
print(l_file, "("& hstr(full_pc)& ") [LO]="& hstr(reg_lo));
end if;
end if;
if prev_epc /= cp0_epc and cp0_epc(31)/='U' then
temp := cp0_epc & "00";
print(l_file, "("& hstr(full_pc)& ") [EP]="& hstr(temp));
end if;
 
-- 'remember' last value of hi and lo only when pipeline is not
-- stalled; that's because we don't want to be tracking the
-- changing values when mul/div is running (because the SW
-- simulator doesn't)
if vma_code='1' then
prev_hi := reg_hi;
prev_lo := reg_lo;
end if;
 
 
full_pc := pc & "00";
prev_pc := full_pc;
prev_rbank := rbank;
prev_hi := reg_hi;
prev_lo := reg_lo;
prev_epc := cp0_epc;
-- log memory writes
/vhdl/mips_mult.vhdl
0,0 → 1,256
--------------------------------------------------------------------------------
-- mips_mult.vhdl -- multiplier from Plasma project, slightly modified.
--
-- The original file from Plasma has been adapted to the Ion core. Changes are
-- tagged with '@ion'. There are a few notes at the end of the file with the
-- rationale for the changes -- useful only if any trouble shows up later.
-- The structure has not changed, only a few implementation details.
--------------------------------------------------------------------------------
---------------------------------------------------------------------
-- TITLE: Multiplication and Division Unit
-- AUTHORS: Steve Rhoads (rhoadss@yahoo.com)
-- DATE CREATED: 1/31/01
-- FILENAME: mult.vhd
-- PROJECT: Plasma CPU core
-- COPYRIGHT: Software placed into the public domain by the author.
-- Software 'as is' without warranty. Author liable for nothing.
-- DESCRIPTION:
-- Implements the multiplication and division unit in 32 clocks.
--
-- To reduce space, compile your code using the flag "-mno-mul" which
-- will use software base routines in math.c if USE_SW_MULT is defined.
-- Then remove references to the entity mult in mlite_cpu.vhd.
--
-- MULTIPLICATION
-- long64 answer = 0
-- for(i = 0; i < 32; ++i)
-- {
-- answer = (answer >> 1) + (((b&1)?a:0) << 31);
-- b = b >> 1;
-- }
--
-- DIVISION
-- long upper=a, lower=0;
-- a = b << 31;
-- for(i = 0; i < 32; ++i)
-- {
-- lower = lower << 1;
-- if(upper >= a && a && b < 2)
-- {
-- upper = upper - a;
-- lower |= 1;
-- }
-- a = ((b&2) << 30) | (a >> 1);
-- b = b >> 1;
-- }
---------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;
use work.mips_pkg.all;
 
entity mips_mult is
generic(mult_type : string := "DEFAULT");
port(clk : in std_logic;
reset_in : in std_logic;
a, b : in std_logic_vector(31 downto 0);
mult_func : in t_mult_function;
c_mult : out std_logic_vector(31 downto 0);
pause_out : out std_logic);
end; --entity mult
 
architecture logic of mips_mult is
 
constant MODE_MULT : std_logic := '1';
constant MODE_DIV : std_logic := '0';
 
signal mode_reg : std_logic;
signal negate_reg : std_logic;
signal sign_reg : std_logic;
signal sign2_reg : std_logic;
signal count_reg : std_logic_vector(5 downto 0);
signal aa_reg : std_logic_vector(31 downto 0);
signal bb_reg : std_logic_vector(31 downto 0);
signal upper_reg : std_logic_vector(31 downto 0);
signal lower_reg : std_logic_vector(31 downto 0);
 
signal a_neg : std_logic_vector(31 downto 0);
signal b_neg : std_logic_vector(31 downto 0);
signal sum : std_logic_vector(32 downto 0);
signal sum_a : std_logic_vector(32 downto 0);
signal sum_b : std_logic_vector(32 downto 0);
begin
-- @ion Output mux no longer uses function bv_negate. Removing one input that
-- is no longer needed, even if constant, may help in some FPGA architectures
-- too.
-- See @note2
-- Result
c_mult <= lower_reg when mult_func = MULT_READ_LO and
negate_reg = '0' else
not(lower_reg) + 1 when mult_func = MULT_READ_LO and
--bv_negate(lower_reg) when mult_func = MULT_READ_LO and
negate_reg = '1' else
upper_reg; -- when mult_func = MULT_READ_HI else
--ZERO;
-- @ion Stall pipeline while operation completes even if output is not needed
-- immediately.
-- See @note3
pause_out <= '1' when (count_reg(5 downto 0) /= "000000") else '0'; --and
--(mult_func = MULT_READ_LO or mult_func = MULT_READ_HI) else '0';
 
-- ABS and remainder signals
a_neg <= not(a) + 1; --bv_negate(a); -- @ion @note2
b_neg <= not(b) + 1; --bv_negate(b); -- @ion @note2
-- @ion Replaced function bv_adder with straight vector code
--sum <= bv_adder(upper_reg, aa_reg, mode_reg);
sum_a <= ('0' & upper_reg); -- No sign extension: MSB of sum is special
sum_b <= ('0' & aa_reg);
with mode_reg select sum <=
sum_a + sum_b when '1',
sum_a - sum_b when others;
--multiplication/division unit
mult_proc: process(clk, reset_in, a, b, mult_func,
a_neg, b_neg, sum, sign_reg, mode_reg, negate_reg,
count_reg, aa_reg, bb_reg, upper_reg, lower_reg)
variable count : std_logic_vector(2 downto 0);
begin
count := "001";
if reset_in = '1' then
mode_reg <= '0';
negate_reg <= '0';
sign_reg <= '0';
sign2_reg <= '0';
count_reg <= "000000";
aa_reg <= ZERO;
bb_reg <= ZERO;
upper_reg <= ZERO;
lower_reg <= ZERO;
elsif rising_edge(clk) then
case mult_func is
when MULT_WRITE_LO =>
lower_reg <= a;
negate_reg <= '0';
when MULT_WRITE_HI =>
upper_reg <= a;
negate_reg <= '0';
when MULT_MULT =>
mode_reg <= MODE_MULT;
aa_reg <= a;
bb_reg <= b;
upper_reg <= ZERO;
count_reg <= "100000";
negate_reg <= '0';
sign_reg <= '0';
sign2_reg <= '0';
when MULT_SIGNED_MULT =>
mode_reg <= MODE_MULT;
if b(31) = '0' then
aa_reg <= a;
bb_reg <= b;
sign_reg <= a(31);
else
aa_reg <= a_neg;
bb_reg <= b_neg;
sign_reg <= a_neg(31);
end if;
sign2_reg <= '0';
upper_reg <= ZERO;
count_reg <= "100000";
negate_reg <= '0';
when MULT_DIVIDE =>
mode_reg <= MODE_DIV;
aa_reg <= b(0) & ZERO(30 downto 0);
bb_reg <= b;
upper_reg <= a;
count_reg <= "100000";
negate_reg <= '0';
when MULT_SIGNED_DIVIDE =>
mode_reg <= MODE_DIV;
if b(31) = '0' then
aa_reg(31) <= b(0);
bb_reg <= b;
else
aa_reg(31) <= b_neg(0);
bb_reg <= b_neg;
end if;
if a(31) = '0' then
upper_reg <= a;
else
upper_reg <= a_neg;
end if;
aa_reg(30 downto 0) <= ZERO(30 downto 0);
count_reg <= "100000";
negate_reg <= a(31) xor b(31);
when others =>
 
if count_reg /= "000000" then
if mode_reg = MODE_MULT then
-- Multiplication
if bb_reg(0) = '1' then
upper_reg <= (sign_reg xor sum(32)) & sum(31 downto 1);
lower_reg <= sum(0) & lower_reg(31 downto 1);
sign2_reg <= sign2_reg or sign_reg;
sign_reg <= '0';
bb_reg <= '0' & bb_reg(31 downto 1);
-- The following six lines are optional for speedup
--elsif bb_reg(3 downto 0) = "0000" and sign2_reg = '0' and
-- count_reg(5 downto 2) /= "0000" then
-- upper_reg <= "0000" & upper_reg(31 downto 4);
-- lower_reg <= upper_reg(3 downto 0) & lower_reg(31 downto 4);
-- count := "100";
-- bb_reg <= "0000" & bb_reg(31 downto 4);
else
upper_reg <= sign2_reg & upper_reg(31 downto 1);
lower_reg <= upper_reg(0) & lower_reg(31 downto 1);
bb_reg <= '0' & bb_reg(31 downto 1);
end if;
else
-- Division
if sum(32) = '0' and aa_reg /= ZERO and
bb_reg(31 downto 1) = ZERO(31 downto 1) then
upper_reg <= sum(31 downto 0);
lower_reg(0) <= '1';
else
lower_reg(0) <= '0';
end if;
aa_reg <= bb_reg(1) & aa_reg(31 downto 1);
lower_reg(31 downto 1) <= lower_reg(30 downto 0);
bb_reg <= '0' & bb_reg(31 downto 1);
end if;
count_reg <= count_reg - count;
end if; --count
 
end case;
end if;
 
end process;
end; --architecture logic
 
--------------------------------------------------------------------------------
-- @note1 : bv_adder function removed
-- This function was a slightly modified adder/substractor coded in a bitwise
-- manner that made it hard for synth tools to recognize it as such. At least
-- that's what I think. Replacing it with straigth code results in smaller and
-- faster logic (about 23% faster).
--
-- @note2 : bv_negate function removed
-- This function computed a 2's complement bitwise. Removed on the same grounds
-- as @note1 but with no apparent improvement in synthesis results.
--
-- @note3 : pause_out active until operation complete
-- The original Plasma module allowed the pipeline and the multiplier to run
-- concurrently until the multiplier result was needed, and only then the
-- pipeline was stalled.
-- We want to make sure we can abort a mul/div so for the time being we stall
-- until the operation is complete.
-- note that if we later want to change this, the parent module will need
-- changes too (logic for p1_muldiv_running).
--------------------------------------------------------------------------------
/vhdl/mips_cpu.vhdl
122,7 → 122,6
signal p1_alu_flags : t_alu_flags;
-- immediate data, sign- or zero-extended as required by IR
signal p1_data_imm : t_word;
signal p1_muldiv_result : t_dword;
signal p1_branch_offset : t_pc;
signal p1_branch_offset_sex:std_logic_vector(31 downto 18);
signal p1_rbank_rs_hazard : std_logic;
159,9 → 158,17
signal p1_data_addr : t_addr;
signal p1_data_offset : t_addr;
 
signal p1_muldiv_result : t_word;
signal p1_muldiv_func : t_mult_function;
signal p1_muldiv_running : std_logic;
signal p1_muldiv_started : std_logic;
signal p1_muldiv_stall : std_logic;
 
 
--------------------------------------------------------------------------------
-- Pipeline stage 2
 
signal p2_muldiv_started : std_logic;
signal p2_exception : std_logic;
signal p2_rd_addr : std_logic_vector(1 downto 0);
signal p2_rd_mux_control : std_logic_vector(3 downto 0);
184,14 → 191,7
-- pipeline is stalled because of a load instruction interlock
signal pipeline_interlocked:std_logic;
 
 
--------------------------------------------------------------------------------
-- Multiplier interface registers
 
signal mdiv_hi_reg : t_word;
signal mdiv_lo_reg : t_word;
 
--------------------------------------------------------------------------------
-- CP0 registers and signals
 
-- CP0[12]: status register
326,10 → 326,10
p1_alu_inp1 <= p1_rs;
 
with p1_alu_op2_sel select p1_alu_inp2 <=
p1_data_imm when "11",
p1_muldiv_result(63 downto 32) when "01",
p1_muldiv_result(31 downto 0) when "10",
p1_rt when others;
p1_data_imm when "11",
p1_muldiv_result when "01", -- FIXME mux input wasted!
p1_muldiv_result when "10",
p1_rt when others;
 
alu_inst : entity work.mips_alu
port map (
347,25 → 347,58
--------------------------------------------------------------------------------
-- Mul/Div block interface
 
-- FIXME when MUL*/DIV* are implemented, these registers and the load enable
-- logic will change a little. It may be better to move them into the alu.
mult_registers:
process(clk)
begin
if clk'event and clk='1' then
-- MTHI, MTLO are never involved in stall cycles, no need to check
if p1_load_hi='1' then
mdiv_hi_reg <= p1_rs;
end if;
if p1_load_lo='1' then
mdiv_lo_reg <= p1_rs;
end if;
end if;
end process mult_registers;
-- Compute the mdiv block function word. If p1_muldiv_func has any value other
-- than MULT_NOTHING a new mdiv operation will start, truncating whatever other
-- operation that may have been in course.
-- So we encode here the function to be performed and make sure the value stays
-- there for only one cycle (the first ALU cycle of the mul/div instruction).
 
p1_muldiv_result <= mdiv_hi_reg & mdiv_lo_reg; -- FIXME stub, mdiv missing
-- This will be '1' for all mul/div operations other than NOP...
p1_muldiv_func(3) <= '1' when p1_op_special='1' and
p1_ir_fn(5 downto 4)="01" and
-- ...but only if the mdiv is not already running
p2_muldiv_started = '0' and
p1_muldiv_running ='0'
else '0';
 
-- When bit(3) is zero, the rest are zeroed too. Otherwise, they come from IR
p1_muldiv_func(2 downto 0) <=
p1_ir_fn(3) & p1_ir_fn(1 downto 0) when p1_muldiv_func(3)='1'
else "000";
 
mult_div: entity work.mips_mult
port map (
a => p1_rs,
b => p1_rt,
c_mult => p1_muldiv_result,
pause_out => p1_muldiv_running,
mult_func => p1_muldiv_func,
clk => clk,
reset_in => reset
);
 
-- Active only for the 1st ALU cycle of any mul/div instruction
p1_muldiv_started <= '1' when p1_op_special='1' and
p1_ir_fn(5 downto 3)="011" and
--
p1_muldiv_running='0'
else '0';
 
-- Stall the pipeline to enable mdiv operation completion.
-- We need p2_muldiv_started to distinguish the cycle before p1_muldiv_running
-- is asserted and the cycle after it deasserts.
-- Otherwise we would reexecute the same muldiv endlessly instruction after
-- deassertion of p1_muldiv_running, since the IR was stalled and still contains
-- the mul opcode...
p1_muldiv_stall <= '1' when
-- Active for the cycle immediately before p1_muldiv_running asserts
-- and NOT for the cycle after it deasserts
(p1_muldiv_started='1' and p2_muldiv_started='0') or
-- Active until operation is complete
p1_muldiv_running = '1'
else '0';
 
 
--##############################################################################
-- PC register and branch logic
 
636,7 → 669,19
end if;
end process pipeline_stage1_register;
 
pipeline_stage1_register2:
process(clk)
begin
if clk'event and clk='1' then
if reset='1' then
p2_muldiv_started <= '0';
else
p2_muldiv_started <= p1_muldiv_running;
end if;
end if;
end process pipeline_stage1_register2;
 
 
-- Stage 2 pipeline register. Split in two for convenience.
-- This register deals with two kinds of stalls:
-- * When the pipeline stalls because of a load interlock, this register is
721,7 → 766,7
end process pipeline_stall_registers;
 
-- FIXME make sure this combinational will not have bad glitches
stall_pipeline <= mem_wait or load_interlock;
stall_pipeline <= mem_wait or load_interlock or p1_muldiv_stall;
 
 
-- FIXME load interlock should happen only if the instruction following

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.