diff --git a/2048_Mist/README.md b/2048_Mist/README.md
index aad9d400..d7424ad4 100644
--- a/2048_Mist/README.md
+++ b/2048_Mist/README.md
@@ -1,5 +1,5 @@
-# 2048-DE1
-VHDL implementation of 2048 Game on Altera DE1 FPGA Board developed in the "Digital Systems M" course of the University of Bologna
+# 2048-MIST
+VHDL implementation of 2048 Game on MiST FPGA Board developed in the "Digital Systems M" course of the University of Bologna
Controls
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/AS-2518-51_snd.qpf b/Soundboards_MiST/AS-2518-51_snd-master/AS-2518-51_snd.qpf
new file mode 100644
index 00000000..9fdfc13a
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/AS-2518-51_snd.qpf
@@ -0,0 +1,30 @@
+# -------------------------------------------------------------------------- #
+#
+# Copyright (C) 1991-2013 Altera Corporation
+# Your use of Altera Corporation's design tools, logic functions
+# and other software and tools, and its AMPP partner logic
+# functions, and any output files from any of the foregoing
+# (including device programming or simulation files), and any
+# associated documentation or information are expressly subject
+# to the terms and conditions of the Altera Program License
+# Subscription Agreement, Altera MegaCore Function License
+# Agreement, or other applicable license agreement, including,
+# without limitation, that your use is for the sole purpose of
+# programming logic devices manufactured by Altera and sold by
+# Altera or its authorized distributors. Please refer to the
+# applicable agreement for further details.
+#
+# -------------------------------------------------------------------------- #
+#
+# Quartus II 64-Bit
+# Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition
+# Date created = 21:32:18 December 01, 2015
+#
+# -------------------------------------------------------------------------- #
+
+QUARTUS_VERSION = "13.0"
+DATE = "21:32:18 December 01, 2015"
+
+# Revisions
+
+PROJECT_REVISION = "AS-2518-51_snd"
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/AS-2518-51_snd.qsf b/Soundboards_MiST/AS-2518-51_snd-master/AS-2518-51_snd.qsf
new file mode 100644
index 00000000..eb4d71a3
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/AS-2518-51_snd.qsf
@@ -0,0 +1,161 @@
+# -------------------------------------------------------------------------- #
+#
+# Copyright (C) 1991-2013 Altera Corporation
+# Your use of Altera Corporation's design tools, logic functions
+# and other software and tools, and its AMPP partner logic
+# functions, and any output files from any of the foregoing
+# (including device programming or simulation files), and any
+# associated documentation or information are expressly subject
+# to the terms and conditions of the Altera Program License
+# Subscription Agreement, Altera MegaCore Function License
+# Agreement, or other applicable license agreement, including,
+# without limitation, that your use is for the sole purpose of
+# programming logic devices manufactured by Altera and sold by
+# Altera or its authorized distributors. Please refer to the
+# applicable agreement for further details.
+#
+# -------------------------------------------------------------------------- #
+#
+# Quartus II 64-Bit
+# Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition
+# Date created = 21:32:18 December 01, 2015
+#
+# -------------------------------------------------------------------------- #
+#
+# Notes:
+#
+# 1) The default values for assignments are stored in the file:
+# AS-2518-51_snd_assignment_defaults.qdf
+# If this file doesn't exist, see file:
+# assignment_defaults.qdf
+#
+# 2) Altera recommends that you do not modify this file. This
+# file is updated automatically by the Quartus II software
+# and any changes you make may be lost or overwritten.
+#
+# -------------------------------------------------------------------------- #
+
+
+set_global_assignment -name FAMILY "Cyclone III"
+set_global_assignment -name DEVICE EP3C25E144C8
+set_global_assignment -name TOP_LEVEL_ENTITY minibd_top
+set_global_assignment -name ORIGINAL_QUARTUS_VERSION "13.0 SP1"
+set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:32:18 DECEMBER 01, 2015"
+set_global_assignment -name LAST_QUARTUS_VERSION 13.1
+set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
+set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1
+set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
+set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
+set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
+set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"
+set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -entity robotron_sound_top -section_id Top
+set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -entity robotron_sound_top -section_id Top
+set_global_assignment -name PARTITION_COLOR 16764057 -entity robotron_sound_top -section_id Top
+set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -entity robotron_sound_top -section_id Top
+set_global_assignment -name ENABLE_SIGNALTAP OFF
+set_global_assignment -name USE_SIGNALTAP_FILE output_files/stp1.stp
+set_global_assignment -name VHDL_FILE rtl/minibd_top.vhd
+set_global_assignment -name VHDL_FILE "rtl/AS-2518-51_core.vhd"
+set_global_assignment -name QIP_FILE rtl/williams_snd_pll.qip
+set_global_assignment -name QIP_FILE rtl/U4_ROM.qip
+set_global_assignment -name VHDL_FILE rtl/PS2Controller.vhd
+set_global_assignment -name VHDL_FILE rtl/pia6821.vhd
+set_global_assignment -name VHDL_FILE rtl/MPU_RAM.vhd
+set_global_assignment -name SYSTEMVERILOG_FILE rtl/mist_io.sv
+set_global_assignment -name VHDL_FILE rtl/m6810.vhd
+set_global_assignment -name VHDL_FILE rtl/KeyboardMapper.vhd
+set_global_assignment -name VHDL_FILE rtl/Keyboard.vhd
+set_global_assignment -name VHDL_FILE rtl/Debouncer.vhd
+set_global_assignment -name VHDL_FILE rtl/dac.vhd
+set_global_assignment -name VHDL_FILE rtl/cpu68.vhd
+set_global_assignment -name VHDL_FILE "rtl/ay-3-8910-core.Vhd"
+set_global_assignment -name VHDL_FILE "rtl/ay-3-8910_vectors.vhd"
+set_global_assignment -name VHDL_FILE "rtl/ay-3-8910.Vhd"
+set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144
+set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8
+set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL"
+set_global_assignment -name USE_CONFIGURATION_DEVICE OFF
+set_global_assignment -name GENERATE_RBF_FILE ON
+set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF
+set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON
+set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO"
+set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO"
+set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO"
+set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO"
+set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO"
+set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise
+set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall
+set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise
+set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall
+
+set_location_assignment PIN_7 -to LED
+set_location_assignment PIN_54 -to CLOCK_27
+set_location_assignment PIN_144 -to VGA_R[5]
+set_location_assignment PIN_143 -to VGA_R[4]
+set_location_assignment PIN_142 -to VGA_R[3]
+set_location_assignment PIN_141 -to VGA_R[2]
+set_location_assignment PIN_137 -to VGA_R[1]
+set_location_assignment PIN_135 -to VGA_R[0]
+set_location_assignment PIN_133 -to VGA_B[5]
+set_location_assignment PIN_132 -to VGA_B[4]
+set_location_assignment PIN_125 -to VGA_B[3]
+set_location_assignment PIN_121 -to VGA_B[2]
+set_location_assignment PIN_120 -to VGA_B[1]
+set_location_assignment PIN_115 -to VGA_B[0]
+set_location_assignment PIN_114 -to VGA_G[5]
+set_location_assignment PIN_113 -to VGA_G[4]
+set_location_assignment PIN_112 -to VGA_G[3]
+set_location_assignment PIN_111 -to VGA_G[2]
+set_location_assignment PIN_110 -to VGA_G[1]
+set_location_assignment PIN_106 -to VGA_G[0]
+set_location_assignment PIN_136 -to VGA_VS
+set_location_assignment PIN_119 -to VGA_HS
+set_location_assignment PIN_65 -to AUDIO_L
+set_location_assignment PIN_80 -to AUDIO_R
+set_location_assignment PIN_105 -to SPI_DO
+set_location_assignment PIN_88 -to SPI_DI
+set_location_assignment PIN_126 -to SPI_SCK
+set_location_assignment PIN_127 -to SPI_SS2
+set_location_assignment PIN_91 -to SPI_SS3
+set_location_assignment PIN_13 -to CONF_DATA0
+set_location_assignment PIN_49 -to SDRAM_A[0]
+set_location_assignment PIN_44 -to SDRAM_A[1]
+set_location_assignment PIN_42 -to SDRAM_A[2]
+set_location_assignment PIN_39 -to SDRAM_A[3]
+set_location_assignment PIN_4 -to SDRAM_A[4]
+set_location_assignment PIN_6 -to SDRAM_A[5]
+set_location_assignment PIN_8 -to SDRAM_A[6]
+set_location_assignment PIN_10 -to SDRAM_A[7]
+set_location_assignment PIN_11 -to SDRAM_A[8]
+set_location_assignment PIN_28 -to SDRAM_A[9]
+set_location_assignment PIN_50 -to SDRAM_A[10]
+set_location_assignment PIN_30 -to SDRAM_A[11]
+set_location_assignment PIN_32 -to SDRAM_A[12]
+set_location_assignment PIN_83 -to SDRAM_DQ[0]
+set_location_assignment PIN_79 -to SDRAM_DQ[1]
+set_location_assignment PIN_77 -to SDRAM_DQ[2]
+set_location_assignment PIN_76 -to SDRAM_DQ[3]
+set_location_assignment PIN_72 -to SDRAM_DQ[4]
+set_location_assignment PIN_71 -to SDRAM_DQ[5]
+set_location_assignment PIN_69 -to SDRAM_DQ[6]
+set_location_assignment PIN_68 -to SDRAM_DQ[7]
+set_location_assignment PIN_86 -to SDRAM_DQ[8]
+set_location_assignment PIN_87 -to SDRAM_DQ[9]
+set_location_assignment PIN_98 -to SDRAM_DQ[10]
+set_location_assignment PIN_99 -to SDRAM_DQ[11]
+set_location_assignment PIN_100 -to SDRAM_DQ[12]
+set_location_assignment PIN_101 -to SDRAM_DQ[13]
+set_location_assignment PIN_103 -to SDRAM_DQ[14]
+set_location_assignment PIN_104 -to SDRAM_DQ[15]
+set_location_assignment PIN_58 -to SDRAM_BA[0]
+set_location_assignment PIN_51 -to SDRAM_BA[1]
+set_location_assignment PIN_85 -to SDRAM_DQMH
+set_location_assignment PIN_67 -to SDRAM_DQML
+set_location_assignment PIN_60 -to SDRAM_nRAS
+set_location_assignment PIN_64 -to SDRAM_nCAS
+set_location_assignment PIN_66 -to SDRAM_nWE
+set_location_assignment PIN_59 -to SDRAM_nCS
+set_location_assignment PIN_33 -to SDRAM_CKE
+set_location_assignment PIN_43 -to SDRAM_CLK
+
+set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
\ No newline at end of file
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/README.txt b/Soundboards_MiST/AS-2518-51_snd-master/README.txt
new file mode 100644
index 00000000..c5cc0a35
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/README.txt
@@ -0,0 +1,6 @@
+Bally AS-2518-51 sound board, the predecessor of the Squawk & Talk used in late 70's Bally pinballs
+
+https://github.com/FPGA-Code/AS-2518-51_snd
+
+No Video Output!!!
+Keyboard Controls
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/Release/AS-2518-51_snd.rbf b/Soundboards_MiST/AS-2518-51_snd-master/Release/AS-2518-51_snd.rbf
new file mode 100644
index 00000000..7c5f278b
Binary files /dev/null and b/Soundboards_MiST/AS-2518-51_snd-master/Release/AS-2518-51_snd.rbf differ
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/clean.bat b/Soundboards_MiST/AS-2518-51_snd-master/clean.bat
new file mode 100644
index 00000000..b3b7c3b5
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/clean.bat
@@ -0,0 +1,37 @@
+@echo off
+del /s *.bak
+del /s *.orig
+del /s *.rej
+del /s *~
+rmdir /s /q db
+rmdir /s /q incremental_db
+rmdir /s /q output_files
+rmdir /s /q simulation
+rmdir /s /q greybox_tmp
+rmdir /s /q hc_output
+rmdir /s /q .qsys_edit
+rmdir /s /q hps_isw_handoff
+rmdir /s /q sys\.qsys_edit
+rmdir /s /q sys\vip
+cd sys
+for /d %%i in (*_sim) do rmdir /s /q "%%~nxi"
+cd ..
+for /d %%i in (*_sim) do rmdir /s /q "%%~nxi"
+del build_id.v
+del c5_pin_model_dump.txt
+del PLLJ_PLLSPE_INFO.txt
+del /s *.qws
+del /s *.ppf
+del /s *.ddb
+del /s *.csv
+del /s *.cmp
+del /s *.sip
+del /s *.spd
+del /s *.bsf
+del /s *.f
+del /s *.sopcinfo
+del /s *.xml
+del /s new_rtl_netlist
+del /s old_rtl_netlist
+
+pause
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/AS-2518-51_core.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/AS-2518-51_core.vhd
new file mode 100644
index 00000000..c654f526
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/AS-2518-51_core.vhd
@@ -0,0 +1,165 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+
+
+entity AS_2518_51 is
+ port(
+ cpu_clk : in std_logic;
+ reset_l : in std_logic;
+ test_sw_l : in std_logic;
+ addr_i : in std_logic_vector(5 downto 0);
+ snd_int_i : in std_logic;
+ audio : out std_logic_vector(10 downto 0)
+ );
+end;
+
+architecture rtl of AS_2518_51 is
+
+signal E : std_logic;
+
+signal reset_h : std_logic;
+
+signal cpu_addr : std_logic_vector(15 downto 0);
+signal cpu_din : std_logic_vector(7 downto 0) := x"FF";
+signal cpu_dout : std_logic_vector(7 downto 0);
+signal cpu_rw : std_logic;
+signal cpu_vma : std_logic;
+signal cpu_irq : std_logic;
+signal cpu_nmi : std_logic;
+
+signal pia_pa_i : std_logic_vector(7 downto 0) := x"FF";
+signal pia_pa_o : std_logic_vector(7 downto 0);
+signal pia_pb_i : std_logic_vector(7 downto 0) := x"FF";
+signal pia_pb_o : std_logic_vector(7 downto 0);
+signal pia_dout : std_logic_vector(7 downto 0);
+signal pia_irq_a : std_logic;
+signal pia_irq_b : std_logic;
+signal pia_cb1 : std_logic;
+signal pia_cs : std_logic;
+
+signal ay_pa_i : std_logic_vector(7 downto 0);
+
+signal rom_dout : std_logic_vector(7 downto 0);
+signal rom_cs : std_logic;
+
+signal ram_dout : std_logic_vector(7 downto 0);
+signal ram_cs : std_logic;
+
+signal snd_a : std_logic_vector(7 downto 0);
+signal snd_b : std_logic_vector(7 downto 0);
+signal snd_c : std_logic_vector(7 downto 0);
+
+signal clk_div : std_logic_vector(2 downto 0);
+
+begin
+reset_h <= (not reset_l);
+E <= clk_div(2);
+divider: process(cpu_clk)
+begin
+ if rising_edge(cpu_clk) then
+ clk_div <= clk_div + '1';
+ end if;
+end process;
+
+
+
+cpu_irq <= pia_irq_a or pia_irq_b;
+cpu_nmi <= not test_sw_l;
+
+rom_cs <= cpu_addr(12) and cpu_vma;
+pia_cs <= cpu_addr(7) and (not cpu_addr(12)) and cpu_vma;
+ram_cs <= (not cpu_addr(7)) and (not cpu_addr(12)) and cpu_vma;
+
+-- Bus control
+cpu_din <=
+ pia_dout when pia_cs = '1' else
+ rom_dout when rom_cs = '1' else
+ ram_dout when ram_cs = '1' else
+ x"FF";
+
+
+U3: entity work.cpu68
+port map(
+ clk => cpu_clk,
+ rst => reset_h,
+ rw => cpu_rw,
+ vma => cpu_vma,
+ address => cpu_addr,
+ data_in => cpu_din,
+ data_out => cpu_dout,
+ hold => '0',
+ halt => '0',
+ irq => cpu_irq,
+ nmi => cpu_nmi
+);
+
+U4: entity work.U4_ROM
+port map(
+ address => cpu_addr(10 downto 0),
+ clock => cpu_clk,
+ q => rom_dout
+ );
+
+U2: entity work.PIA6821
+port map(
+ clk => cpu_clk,
+ rst => reset_h,
+ cs => pia_cs,
+ rw => cpu_rw,
+ addr => cpu_addr(1 downto 0),
+ data_in => cpu_dout,
+ data_out => pia_dout,
+ irqa => pia_irq_a,
+ irqb => pia_irq_b,
+ pa_i => pia_pa_i,
+ pa_o => pia_pa_o,
+ ca1 => snd_int_i,
+ ca2_i => '1',
+ ca2_o => open,
+ pb_i => x"FF",
+ pb_o => pia_pb_o,
+ cb1 => pia_cb1,
+ cb2_i => '0',
+ cb2_o => open
+);
+
+U10: entity work.m6810
+port map(
+ clk => cpu_clk,
+ rst => reset_h,
+ address => cpu_addr(6 downto 0),
+ cs => ram_cs,
+ rw => cpu_rw,
+ data_in => cpu_dout,
+ data_out => ram_dout
+ );
+
+U1: entity work.AY_3_8910
+port map(
+ clk => cpu_clk,
+ reset => reset_h,
+ clk_en => e,
+ cpu_d_in => pia_pa_o,
+ cpu_d_out => pia_pa_i,
+ cpu_bdir => pia_pb_o(1),
+ cpu_bc1 => pia_pb_o(0),
+ cpu_bc2 => '1',
+ io_a_in => ay_pa_i,
+ io_b_in => x"FF",
+ io_a_out => open,
+ io_b_out => open,
+ snd_A => snd_a,
+ snd_B => snd_b,
+ snd_C => snd_c
+ );
+
+ay_pa_i(5 downto 0) <= not addr_i;
+ay_pa_i(7 downto 6) <= "00";
+
+audio <= snd_a & '0' + snd_b & '0'+ snd_c & '0';
+
+end rtl;
+
+
+
\ No newline at end of file
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/Debouncer.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/Debouncer.vhd
new file mode 100644
index 00000000..2d7e90bd
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/Debouncer.vhd
@@ -0,0 +1,43 @@
+-- (C) Rui T. Sousa from http://sweet.ua.pt/~a16360
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+entity Debouncer is
+ generic (Delay : positive);
+ port (
+ Clock : in STD_LOGIC;
+ Reset : in STD_LOGIC;
+ Input : in STD_LOGIC;
+ Output : out STD_LOGIC
+ );
+end Debouncer;
+
+architecture Behavioral of Debouncer is
+
+ signal DelayCounter : natural range 0 to Delay;
+ signal Internal : STD_LOGIC;
+
+begin
+
+ process(Clock, Reset)
+ begin
+ if Reset = '1' then
+ Output <= '0';
+ Internal <= '0';
+ DelayCounter <= 0;
+ elsif rising_edge(Clock) then
+ if Input /= Internal then
+ Internal <= Input;
+ DelayCounter <= 0;
+ elsif DelayCounter = Delay then
+ Output <= Internal;
+ else
+ DelayCounter <= DelayCounter + 1;
+ end if;
+ end if;
+ end process;
+
+end Behavioral;
\ No newline at end of file
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/Keyboard.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/Keyboard.vhd
new file mode 100644
index 00000000..49140020
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/Keyboard.vhd
@@ -0,0 +1,61 @@
+-- (C) Rui T. Sousa from http://sweet.ua.pt/~a16360
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+entity Keyboard is
+ GENERIC(
+ clk_freq : INTEGER := 32 );-- system clock frequency in MHz
+ port (
+ Reset : in std_logic;
+ Clock : in std_logic;
+ PS2Clock : inout std_logic;
+ PS2Data : inout std_logic;
+ CodeReady : out std_logic;
+ ScanCode : out std_logic_vector(9 downto 0)
+ );
+end Keyboard;
+
+architecture Behavioral of Keyboard is
+
+ signal Send : std_logic;
+ signal Command : std_logic_vector(7 downto 0);
+ signal PS2Busy : std_logic;
+ signal PS2Error : std_logic;
+ signal DataReady : std_logic;
+ signal DataByte : std_logic_vector(7 downto 0);
+
+begin
+
+ PS2_Controller: entity work.PS2Controller
+ generic map (clk_freq => clk_freq)
+ port map (
+ Reset => Reset,
+ Clock => Clock,
+ PS2Clock => PS2Clock,
+ PS2Data => PS2Data,
+ Send => Send,
+ Command => Command,
+ PS2Busy => PS2Busy,
+ PS2Error => PS2Error,
+ DataReady => DataReady,
+ DataByte => DataByte
+ );
+
+ Keyboard_Mapper: entity work.KeyboardMapper
+ port map (
+ Clock => Clock,
+ Reset => Reset,
+ PS2Busy => PS2Busy,
+ PS2Error => PS2Error,
+ DataReady => DataReady,
+ DataByte => DataByte,
+ Send => Send,
+ Command => Command,
+ CodeReady => CodeReady,
+ ScanCode => ScanCode
+ );
+
+end Behavioral;
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/KeyboardMapper.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/KeyboardMapper.vhd
new file mode 100644
index 00000000..72ef7b77
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/KeyboardMapper.vhd
@@ -0,0 +1,170 @@
+-- (C) Rui T. Sousa from http://sweet.ua.pt/~a16360
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+entity KeyboardMapper is
+ port (
+ Clock : in std_logic;
+ Reset : in std_logic;
+ PS2Busy : in std_logic;
+ PS2Error : in std_logic;
+ DataReady : in std_logic;
+ DataByte : in std_logic_vector(7 downto 0);
+ Send : out std_logic;
+ Command : out std_logic_vector(7 downto 0);
+ CodeReady : out std_logic;
+ ScanCode : out std_logic_vector(9 downto 0)
+ );
+end KeyboardMapper;
+
+-- ScanCode(9) = 1 -> Extended
+-- = 0 -> Regular (Not Extended)
+-- ScanCode(8) = 1 -> Break
+-- = 0 -> Make
+-- ScanCode(7 downto 0) -> Key Code
+
+architecture Behavioral of KeyboardMapper is
+
+ type StateType is (ResetKbd, ResetAck, WaitForBAT, Start, Extended, ExtendedBreak, Break, LEDs, CheckAck);
+ signal State : StateType;
+ signal CapsLock : STD_LOGIC;
+ signal NumLock : STD_LOGIC;
+ signal ScrollLock : STD_LOGIC;
+-- signal PauseON : STD_LOGIC;
+-- signal i : natural range 0 to 7;
+ signal KbdFound : std_logic := '0';
+begin
+
+ process(Reset, PS2Error, Clock)
+ begin
+ if Reset = '1' or PS2Error = '1' then
+ CapsLock <= '0';
+ NumLock <= '0';
+ ScrollLock <= '0';
+-- PauseON <= '0';
+-- i <= 0;
+ Send <= '0';
+ Command <= (others => '0');
+ CodeReady <= '0';
+ ScanCode <= (others => '0');
+ KbdFound <= '0';
+ State <= Start;
+ elsif rising_edge(Clock) then
+ case State is
+ when ResetKbd =>
+ if PS2Busy = '0' then
+ Send <= '1';
+ Command <= x"FF";
+ State <= ResetAck;
+ end if;
+ when ResetAck =>
+ Send <= '0';
+ if Dataready = '1' then
+ if DataByte = x"FA" then
+ State <= WaitForBAT;
+ else
+ State <= ResetKbd;
+ end if;
+ end if;
+ when WaitForBAT =>
+ if DataReady = '1' then
+ if DataByte = x"AA" then -- BAT(self test) completed successfully
+ State <= Start;
+ KbdFound <= '1';
+ else
+ State <= ResetKbd;
+ end if;
+ end if;
+ when Start =>
+ CodeReady <= '0';
+ if DataReady = '1' then
+ case DataByte is
+ when x"E0" =>
+ State <= Extended;
+ when x"F0" =>
+ State <= Break;
+ when x"FA" => --Acknowledge
+ null;
+ when x"AA" =>
+ State <= Start;
+ when x"FC" =>
+ State <= ResetKbd;
+ when x"58" =>
+ Send <= '1';
+ Command <= x"ED";
+ CapsLock <= not CapsLock;
+ ScanCode <= "00" & DataByte;
+ CodeReady <= '1';
+ State <= LEDs;
+ when x"77" =>
+ Send <= '1';
+ Command <= x"ED";
+ NumLock <= not NumLock;
+ ScanCode <= "00" & DataByte;
+ CodeReady <= '1';
+ State <= LEDs;
+ when x"7E" =>
+ Send <= '1';
+ Command <= x"ED";
+ ScrollLock <= not ScrollLock;
+ ScanCode <= "00" & DataByte;
+ CodeReady <= '1';
+ State <= LEDs;
+ when others =>
+ ScanCode <= "00" & DataByte;
+ CodeReady <= '1';
+ State <= Start;
+ end case;
+ end if;
+ when Extended =>
+ if DataReady = '1' then
+ if DataByte = x"F0" then
+ State <= ExtendedBreak;
+ else
+ ScanCode <= "10" & DataByte;
+ CodeReady <= '1';
+ State <= Start;
+ end if;
+ end if;
+ when ExtendedBreak =>
+ if DataReady = '1' then
+ ScanCode <= "11" & DataByte;
+ CodeReady <= '1';
+ State <= Start;
+ end if;
+ when Break =>
+ if DataReady = '1' then
+ ScanCode <= "01" & DataByte;
+ CodeReady <= '1';
+ State <= Start;
+ end if;
+ when LEDs =>
+ Send <= '0';
+ CodeReady <= '0';
+ if Dataready = '1' then
+ if DataByte = x"FA" then
+ Send <= '1';
+ Command <= "00000" & CapsLock & NumLock & ScrollLock;
+ State <= CheckAck;
+ elsif DataByte = x"FE" then
+ Send <= '1';
+ end if;
+ end if;
+ when CheckAck =>
+ Send <= '0';
+ if Dataready = '1' then
+ if DataByte = x"FA" then
+ State <= Start;
+ elsif DataByte = x"FE" then
+ Send <= '1';
+ end if;
+ end if;
+ when others => null;
+ end case;
+ end if;
+ end process;
+
+end Behavioral;
\ No newline at end of file
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/MPU_RAM.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/MPU_RAM.vhd
new file mode 100644
index 00000000..0d71661e
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/MPU_RAM.vhd
@@ -0,0 +1,181 @@
+-- megafunction wizard: %RAM: 1-PORT%
+-- GENERATION: STANDARD
+-- VERSION: WM1.0
+-- MODULE: altsyncram
+
+-- ============================================================
+-- File Name: MPU_RAM.vhd
+-- Megafunction Name(s):
+-- altsyncram
+--
+-- Simulation Library Files(s):
+-- altera_mf
+-- ============================================================
+-- ************************************************************
+-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
+--
+-- 13.0.1 Build 232 06/12/2013 SP 1 SJ Web Edition
+-- ************************************************************
+
+
+--Copyright (C) 1991-2013 Altera Corporation
+--Your use of Altera Corporation's design tools, logic functions
+--and other software and tools, and its AMPP partner logic
+--functions, and any output files from any of the foregoing
+--(including device programming or simulation files), and any
+--associated documentation or information are expressly subject
+--to the terms and conditions of the Altera Program License
+--Subscription Agreement, Altera MegaCore Function License
+--Agreement, or other applicable license agreement, including,
+--without limitation, that your use is for the sole purpose of
+--programming logic devices manufactured by Altera and sold by
+--Altera or its authorized distributors. Please refer to the
+--applicable agreement for further details.
+
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.all;
+
+LIBRARY altera_mf;
+USE altera_mf.all;
+
+ENTITY MPU_RAM IS
+ PORT
+ (
+ address : IN STD_LOGIC_VECTOR (6 DOWNTO 0);
+ clock : IN STD_LOGIC := '1';
+ data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
+ wren : IN STD_LOGIC ;
+ q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
+ );
+END MPU_RAM;
+
+
+ARCHITECTURE SYN OF mpu_ram IS
+
+ SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);
+
+
+
+ COMPONENT altsyncram
+ GENERIC (
+ clock_enable_input_a : STRING;
+ clock_enable_output_a : STRING;
+ intended_device_family : STRING;
+ lpm_hint : STRING;
+ lpm_type : STRING;
+ numwords_a : NATURAL;
+ operation_mode : STRING;
+ outdata_aclr_a : STRING;
+ outdata_reg_a : STRING;
+ power_up_uninitialized : STRING;
+ widthad_a : NATURAL;
+ width_a : NATURAL;
+ width_byteena_a : NATURAL
+ );
+ PORT (
+ address_a : IN STD_LOGIC_VECTOR (6 DOWNTO 0);
+ clock0 : IN STD_LOGIC ;
+ data_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
+ wren_a : IN STD_LOGIC ;
+ q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
+ );
+ END COMPONENT;
+
+BEGIN
+ q <= sub_wire0(7 DOWNTO 0);
+
+ altsyncram_component : altsyncram
+ GENERIC MAP (
+ clock_enable_input_a => "BYPASS",
+ clock_enable_output_a => "BYPASS",
+ intended_device_family => "Cyclone II",
+ lpm_hint => "ENABLE_RUNTIME_MOD=NO",
+ lpm_type => "altsyncram",
+ numwords_a => 128,
+ operation_mode => "SINGLE_PORT",
+ outdata_aclr_a => "NONE",
+ outdata_reg_a => "UNREGISTERED",
+ power_up_uninitialized => "FALSE",
+ widthad_a => 7,
+ width_a => 8,
+ width_byteena_a => 1
+ )
+ PORT MAP (
+ address_a => address,
+ clock0 => clock,
+ data_a => data,
+ wren_a => wren,
+ q_a => sub_wire0
+ );
+
+
+
+END SYN;
+
+-- ============================================================
+-- CNX file retrieval info
+-- ============================================================
+-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0"
+-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0"
+-- Retrieval info: PRIVATE: AclrByte NUMERIC "0"
+-- Retrieval info: PRIVATE: AclrData NUMERIC "0"
+-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0"
+-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0"
+-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8"
+-- Retrieval info: PRIVATE: BlankMemory NUMERIC "1"
+-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0"
+-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0"
+-- Retrieval info: PRIVATE: Clken NUMERIC "0"
+-- Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1"
+-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0"
+-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A"
+-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0"
+-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone II"
+-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
+-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
+-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
+-- Retrieval info: PRIVATE: MIFfilename STRING ""
+-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "128"
+-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
+-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3"
+-- Retrieval info: PRIVATE: RegAddr NUMERIC "1"
+-- Retrieval info: PRIVATE: RegData NUMERIC "1"
+-- Retrieval info: PRIVATE: RegOutput NUMERIC "0"
+-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
+-- Retrieval info: PRIVATE: SingleClock NUMERIC "1"
+-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "1"
+-- Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0"
+-- Retrieval info: PRIVATE: WidthAddr NUMERIC "7"
+-- Retrieval info: PRIVATE: WidthData NUMERIC "8"
+-- Retrieval info: PRIVATE: rden NUMERIC "0"
+-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
+-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS"
+-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS"
+-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone II"
+-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO"
+-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
+-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "128"
+-- Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT"
+-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE"
+-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED"
+-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE"
+-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "7"
+-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8"
+-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"
+-- Retrieval info: USED_PORT: address 0 0 7 0 INPUT NODEFVAL "address[6..0]"
+-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock"
+-- Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]"
+-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]"
+-- Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren"
+-- Retrieval info: CONNECT: @address_a 0 0 7 0 address 0 0 7 0
+-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0
+-- Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0
+-- Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0
+-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0
+-- Retrieval info: GEN_FILE: TYPE_NORMAL MPU_RAM.vhd TRUE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL MPU_RAM.inc FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL MPU_RAM.cmp TRUE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL MPU_RAM.bsf FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL MPU_RAM_inst.vhd FALSE
+-- Retrieval info: LIB_FILE: altera_mf
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/PS2Controller.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/PS2Controller.vhd
new file mode 100644
index 00000000..6e42eb6d
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/PS2Controller.vhd
@@ -0,0 +1,209 @@
+-- (C) Rui T. Sousa from http://sweet.ua.pt/~a16360
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+entity PS2Controller is
+GENERIC(
+ clk_freq : INTEGER := 50 );-- system clock frequency in MHz
+ port (
+ Reset : in std_logic;
+ Clock : in std_logic;
+ PS2Clock : in std_logic;
+ PS2Data : in std_logic;
+ Send : in std_logic;
+ Command : in std_logic_vector(7 downto 0);
+ PS2Busy : out std_logic;
+ PS2Error : buffer std_logic;
+ DataReady : out std_logic;
+ DataByte : out std_logic_vector(7 downto 0)
+ );
+end PS2Controller;
+
+architecture Behavioral of PS2Controller is
+
+ constant ClockFreq : natural := clk_freq; -- MHz
+ constant Time100us : natural := 100 * ClockFreq;
+ constant Time20us : natural := 20 * ClockFreq;
+ constant DebounceDelay : natural := 16;
+
+ type StateType is (Idle, ReceiveData, InhibitComunication, RequestToSend, SendData, CheckAck, WaitRiseClock);
+ signal State : StateType;
+ signal BitsRead : natural range 0 to 10;
+ signal BitsSent : natural range 0 to 10;
+ signal Byte : std_logic_vector(7 downto 0);
+ signal CountOnes : std_logic; -- One bit only to know if even or odd number of ones
+ signal DReady : std_logic;
+ signal PS2ClockPrevious : std_logic;
+ signal PS2ClockOut : std_logic;
+ signal PS2Clock_Z : std_logic;
+ signal PS2Clock_D : std_logic;
+ signal PS2DataOut : std_logic;
+ signal PS2Data_Z : std_logic;
+ signal PS2Data_D : std_logic;
+ signal TimeCounter : natural range 0 to Time100us;
+
+begin
+
+ DebounceClock: entity work.Debouncer
+ generic map (Delay => DebounceDelay)
+ port map (
+ Clock => Clock,
+ Reset => Reset,
+ Input => PS2Clock,
+ Output => PS2Clock_D
+ );
+
+ DebounceData: entity work.Debouncer
+ generic map (Delay => DebounceDelay)
+ port map (
+ Clock => Clock,
+ Reset => Reset,
+ Input => PS2Data,
+ Output => PS2Data_D
+ );
+
+ --PS2Clock <= PS2ClockOut when PS2Clock_Z <= '0' else 'Z';
+ --PS2Data <= PS2DataOut when PS2Data_Z <= '0' else 'Z';
+
+ process(Reset, Clock)
+ begin
+ if Reset = '1' then
+ PS2Clock_Z <= '1';
+ PS2ClockOut <= '1';
+ PS2Data_Z <= '1';
+ PS2DataOut <= '1';
+ DataReady <= '0';
+ DReady <= '0';
+ DataByte <= (others => '0');
+ PS2Busy <= '0';
+ PS2Error <= '0';
+ BitsRead <= 0;
+ BitsSent <= 0;
+ CountOnes <= '0';
+ TimeCounter <= 0;
+ PS2ClockPrevious <= '1';
+ Byte <= x"FF";
+ State <= InhibitComunication;
+ elsif rising_edge(Clock) then
+ PS2ClockPrevious <= PS2Clock_D;
+ case State is
+ when Idle =>
+ DataReady <= '0';
+ DReady <= '0';
+ BitsRead <= 0;
+ PS2Error <= '0';
+ CountOnes <= '0';
+ if PS2Data_D = '0' then -- Start bit
+ PS2Busy <= '1';
+ State <= ReceiveData;
+ elsif Send = '1' then
+ Byte <= Command;
+ PS2Busy <= '1';
+ TimeCounter <= 0;
+ State <= InhibitComunication;
+ else
+ State <= Idle;
+ end if;
+ when ReceiveData =>
+ if PS2ClockPrevious = '1' and PS2Clock_D = '0' then -- falling edge
+ case BitsRead is
+ when 1 to 8 => -- 8 Data bits
+ Byte(BitsRead - 1) <= PS2Data_D;
+ if PS2Data_D = '1' then
+ CountOnes <= not CountOnes;
+ end if;
+ when 9 => -- Parity bit
+ case CountOnes is
+ when '0' =>
+ if PS2Data_D = '0' then
+ PS2Error <= '1'; -- Error when CountOnes is even (0)
+ else -- and parity bit is unasserted
+ PS2Error <= '0';
+ end if;
+ when others =>
+ if PS2Data_D = '1' then
+ PS2Error <= '1'; -- Error when CountOnes is odd (1)
+ else -- and parity bit is asserted
+ PS2Error <= '0';
+ end if;
+ end case;
+ when 10 => -- Stop bit
+ if PS2Error = '0' then
+ DataByte <= Byte;
+ DReady <= '1';
+ else
+ DReady <= '0';
+ end if;
+ State <= WaitRiseClock;
+ when others => null;
+ end case;
+ BitsRead <= BitsRead + 1;
+ end if;
+ when InhibitComunication =>
+ PS2Clock_Z <= '0';
+ PS2ClockOut <= '0';
+ if TimeCounter = Time100us then
+ TimeCounter <= 0;
+ State <= RequestToSend;
+ else
+ TimeCounter <= TimeCounter + 1;
+ end if;
+ when RequestToSend =>
+ PS2Clock_Z <= '1';
+ PS2Data_Z <= '0';
+ PS2DataOut <= '0'; -- Sets the start bit, valid when PS2Clock is high
+ if TimeCounter = Time20us then
+ TimeCounter <= 0;
+ PS2ClockOut <= '1';
+ BitsSent <= 1;
+ State <= SendData;
+ else
+ TimeCounter <= TimeCounter + 1;
+ end if;
+ when SendData =>
+ PS2Clock_Z <= '1';
+ if PS2ClockPrevious = '1' and PS2Clock_D = '0' then -- falling edge
+ case BitsSent is
+ when 1 to 8 => -- 8 Data bits
+ if Byte(BitsSent - 1) = '0' then
+ PS2DataOut <= '0';
+ else
+ CountOnes <= not CountOnes;
+ PS2DataOut <= '1';
+ end if;
+ when 9 => -- Parity bit
+ if CountOnes = '0' then
+ PS2DataOut <= '1';
+ else
+ PS2DataOut <= '0';
+ end if;
+ when 10 => -- Stop bit
+ PS2DataOut <= '1';
+ State <= CheckAck;
+ when others => null;
+ end case;
+ BitsSent <= BitsSent + 1;
+ end if;
+ when CheckAck =>
+ PS2Data_Z <= '1';
+ if PS2ClockPrevious = '1' and PS2Clock_D = '0' then
+ if PS2Data_D = '1' then -- no Acknowledge received
+ PS2Error <= '1';
+ end if;
+ State <= WaitRiseClock;
+ end if;
+ when WaitRiseClock =>
+ if PS2ClockPrevious = '0' and PS2Clock_D = '1' then
+ PS2Busy <= '0';
+ DataReady <= DReady;
+ State <= Idle;
+ end if;
+ when others => null;
+ end case;
+ end if;
+ end process;
+
+end Behavioral;
\ No newline at end of file
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/ROM/NitroGroundshaker.hex b/Soundboards_MiST/AS-2518-51_snd-master/rtl/ROM/NitroGroundshaker.hex
new file mode 100644
index 00000000..991dd82c
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/ROM/NitroGroundshaker.hex
@@ -0,0 +1,129 @@
+:100000008E007F4F97834397828634978386079726
+:10001000817F003F8632CE3D2D0926FD4A26F79688
+:10002000800E3E8E007FCE0033DF31BD10C3860EC2
+:10003000BD10D3BD10EB810327010E3648CE1075DD
+:10004000BD10B532810422158607BD10D3863FBD91
+:1000500016448608BD10D3EE00AD002007EE00DF89
+:1000600021BD113B7D003F270BBD12B6CE1323DF10
+:10007000217E113B3E15A2157B17141713158E1404
+:10008000BD12AF14E4157A1507133E13511357131D
+:100090005D12A61429157A1559157A140E157A13BE
+:1000A00083157A157A14A7145313C8147E13A61354
+:1000B000FB13631429DF2C9B2D24037C002C972D2C
+:1000C000DE2C394F36BD10D34FBD1632324C811065
+:1000D00026F239BD112A97809726C603D7825FD7AB
+:1000E00082399626810E2603962E39BD111AC60135
+:1000F000D78296805FD782369626840FCE110A4D1E
+:100100002704084A26FC32A40039FF0FFF0FFF0F17
+:100110001FFF1F1F1FFFFF0F1FFFD681C4FBD781CB
+:10012000375FD78033CA04D78139D681C4FBD781E2
+:10013000375F53D78033CA04D78139DE21E601A661
+:1001400000840F36A60084F0CE12157F003D444493
+:1001500044BD10B532EE00AD0020E03932323937FF
+:10016000BD10D332BD163220164D2702D647D725F3
+:100170009625270B7A0025CE007D0926FD20F1DE8D
+:10018000210808DF2139DE2120F88DF3201C37BD3E
+:1001900010D3BD10E28DE8334D271E200D37BD1062
+:1001A000D3BD10E28DD9334D260F5D2B0DC47FDBFF
+:1001B00022D722C600D921D7213950C47F9622D711
+:1001C0002290229722D621C200D7213937DE21E69C
+:1001D0000237BD117FBD1186DE319621A700962220
+:1001E000A7010808DF3132972232972139DE310921
+:1001F00009A6009721A6019722DF3139BD10D38DC2
+:1002000006BD16327E11869627489B2748489B27B5
+:100210008B01972739115F123812351242123F11A4
+:100220008A119D118E116911FC129611ED12721234
+:1002300084115B115C73003DBD1186C601200673FD
+:10024000003DBD117F37BD10D3BD10E2337D003DB1
+:100250002B031B20011025037E1632BD1632962675
+:1002600085F9260481062605810B2701394CC60134
+:1002700020D37F002FD730BD10D3DE2FA600BD16B0
+:10028000327E117F7F002FD730BD10D3BD10E2DE4C
+:100290002FA7007E117F4D270ABD1186EE00AD000D
+:1002A0007E117F7E11CCA112AAF08606973F39A15C
+:1002B00012B27F003F3ECE0040DF1DC608963F8150
+:1002C000012605CE131B202781022605CE131320FD
+:1002D0001E81032605CE130B201581042605CE139F
+:1002E00003200C81052605CE12FB2003CE12F3BDA0
+:1002F00016FF39FF0B870C0D0A0403FF09000D0DD3
+:100300000A0403FF07BE0A0E0B0403FF0600080ED3
+:100310000C0303FF055E050E0D0303FF04AF020F80
+:100320000E030307FCC242C343C844C945CF46C1BC
+:1003300041C04081472070FB212F7FF550EF00C066
+:10034000023007FC080F090C80196901292878F888
+:10035000F00090022450EB0073021D50E500600293
+:100360001850DF07F708100C280D010F070E0716AD
+:1003700080042E7EFA0E102680042E7EFA2F7FED4A
+:100380000800F007F608100C280D0100100F070EEA
+:1003900007101680042E7EFA0E102680042E7EFA98
+:1003A0002F7FEC0800F007FE08100C080D0100205C
+:1003B000A013BB3020A013BB0800F00E20202E7E1F
+:1003C000FC0E20102E7EFCB007FC081009100C104B
+:1003D0000D01002802280F08A013EA3028A013EA14
+:1003E00040102F7FF308000900F00E082032102E75
+:1003F0007EFA0E081032102E7EFAB007F70C28088D
+:10040000100D090F0C96807D2F7FFA0800F007FE73
+:1004100008300C000B600D0E0E028001400201003E
+:1004200070F81C2E7EF40800F007FE0030080C0661
+:100430000C0F000E018008181F2E7EF9080A3003E9
+:100440001F8008181E2F7FF9080A30031E2676E544
+:100450000800F007FE008008000F000E0F8008184B
+:1004600040061F2E7EF7080000802F6F10800818AE
+:1004700040061E2F7FF7080000802E7EE0F0A114BA
+:100480009B07FE01000C2808300D090F100E4000DC
+:1004900070202E7EFC2F7FF507FFF0963F27078107
+:1004A0000127037A003F390F0307FE080F0E4000B3
+:1004B000308003102E7EFA07FF2F7FEDF007FE003D
+:1004C0008008000F000E0F8008181F2E7EF908000C
+:1004D00040032F6F0E8008181E2F7FF9080040037D
+:1004E0002E7EE4F009300C0E020107FD0D0D128086
+:1004F0000A72FB800008300C18070706010D011670
+:10050000800A76FB80FFF0030F07FC080F090A0E34
+:1005100004010600008000207002212E7EF70830C2
+:100520000C05004001000D0D0F140E0A8004102E62
+:100530007EFA0E0A8001202E7EFA102F7FEC090031
+:1005400008300C2807F706010D0116800A76FB809B
+:10055000FFA11555F07F003F3907F502300830093B
+:10056000300C2006010D0E8050162276FA0E2080E7
+:1005700050122E7EFA08000900F0F0CE0001DF1DB7
+:10058000C606CE174EBD16FFC60FD71C204ACE009A
+:1005900000DF1DC61CCE1754BD16FFC6AFD71C7E8C
+:1005A0001650860F971C973ECE0001DF1DCE1770A8
+:1005B000C606BD16FF8D21CE0001DF1DCE1770C609
+:1005C00006BD16FF8D12963E4A81082706971C9796
+:1005D0003E20D54FBD164439961CD605D707D60206
+:1005E000D70843840FD6018D5B5A26FDC6035A26D1
+:1005F000FD43840FD6018D4C5A26FD7A000827173B
+:100600007A000726DD43840FD6058D38D707D6013B
+:100610009B062B1D01201408090143840FD6028D6F
+:1006200023D708D601D003D1042706D701C005205F
+:10063000B839D626C10E2603972E39C10726028463
+:10064000BFBD112A379780C602D7827F0082333917
+:10065000CE16F1DF1F8680D6032A09D627545454BC
+:100660005C5A26FD7A0008274C7A0009274C7A004C
+:100670000A274C7A000B26DFD60327DBC47FD70B73
+:10068000D62758DB27CB0BD7277A001B260ED60F91
+:10069000D71BDE1F098C16EA274EDF1FD6272B0635
+:1006A000D407C47F2005D407C47F50361B1632DE22
+:1006B0001FAD0020A2CE00002008CE00012003CEF6
+:1006C00000026D1827126A18260EE60CE718E600DD
+:1006D000EB10E1142712E700E600E708AB04600422
+:1006E00016DE1FAD007E16573954545454545454DA
+:1006F000548D073617BD1644323954545454393684
+:10070000A600DF1FDE1DA7007C001EDE1F085A2684
+:10071000EF32390FC611D71586FE9701CE01C009F9
+:100720002722D700860FBD16440927187A00002615
+:10073000F8092710D7004FBD16440927077A000093
+:1007400026F820DBD001C11022D296800E39FE049B
+:100750000204FF00010A00003F3F0000010A000000
+:10076000050500000101000031FF00000505000043
+:100770004803010CFF000000000000000000000022
+:100780000000000000000000000000000000000069
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000000029
+:1007D0000000000000000000000000000000000019
+:1007E0000000000000000000000000000000000009
+:1007F0000000000000000000102310001000100096
+:00000001FF
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/U4_ROM.qip b/Soundboards_MiST/AS-2518-51_snd-master/rtl/U4_ROM.qip
new file mode 100644
index 00000000..230a8b5d
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/U4_ROM.qip
@@ -0,0 +1,3 @@
+set_global_assignment -name IP_TOOL_NAME "ROM: 1-PORT"
+set_global_assignment -name IP_TOOL_VERSION "13.1"
+set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "U4_ROM.vhd"]
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/U4_ROM.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/U4_ROM.vhd
new file mode 100644
index 00000000..5399db6b
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/U4_ROM.vhd
@@ -0,0 +1,143 @@
+-- megafunction wizard: %ROM: 1-PORT%
+-- GENERATION: STANDARD
+-- VERSION: WM1.0
+-- MODULE: altsyncram
+
+-- ============================================================
+-- File Name: U4_ROM.vhd
+-- Megafunction Name(s):
+-- altsyncram
+--
+-- Simulation Library Files(s):
+-- altera_mf
+-- ============================================================
+-- ************************************************************
+-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
+--
+-- 13.1.0 Build 162 10/23/2013 SJ Web Edition
+-- ************************************************************
+
+
+--Copyright (C) 1991-2013 Altera Corporation
+--Your use of Altera Corporation's design tools, logic functions
+--and other software and tools, and its AMPP partner logic
+--functions, and any output files from any of the foregoing
+--(including device programming or simulation files), and any
+--associated documentation or information are expressly subject
+--to the terms and conditions of the Altera Program License
+--Subscription Agreement, Altera MegaCore Function License
+--Agreement, or other applicable license agreement, including,
+--without limitation, that your use is for the sole purpose of
+--programming logic devices manufactured by Altera and sold by
+--Altera or its authorized distributors. Please refer to the
+--applicable agreement for further details.
+
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.all;
+
+LIBRARY altera_mf;
+USE altera_mf.altera_mf_components.all;
+
+ENTITY U4_ROM IS
+ PORT
+ (
+ address : IN STD_LOGIC_VECTOR (10 DOWNTO 0);
+ clock : IN STD_LOGIC := '1';
+ q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
+ );
+END U4_ROM;
+
+
+ARCHITECTURE SYN OF u4_rom IS
+
+ SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);
+
+BEGIN
+ q <= sub_wire0(7 DOWNTO 0);
+
+ altsyncram_component : altsyncram
+ GENERIC MAP (
+ address_aclr_a => "NONE",
+ clock_enable_input_a => "BYPASS",
+ clock_enable_output_a => "BYPASS",
+ init_file => "./ROM/NitroGroundshaker.hex",
+ intended_device_family => "Cyclone III",
+ lpm_hint => "ENABLE_RUNTIME_MOD=NO",
+ lpm_type => "altsyncram",
+ numwords_a => 2048,
+ operation_mode => "ROM",
+ outdata_aclr_a => "NONE",
+ outdata_reg_a => "UNREGISTERED",
+ widthad_a => 11,
+ width_a => 8,
+ width_byteena_a => 1
+ )
+ PORT MAP (
+ address_a => address,
+ clock0 => clock,
+ q_a => sub_wire0
+ );
+
+
+
+END SYN;
+
+-- ============================================================
+-- CNX file retrieval info
+-- ============================================================
+-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0"
+-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0"
+-- Retrieval info: PRIVATE: AclrByte NUMERIC "0"
+-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0"
+-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0"
+-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8"
+-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0"
+-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0"
+-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0"
+-- Retrieval info: PRIVATE: Clken NUMERIC "0"
+-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0"
+-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A"
+-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0"
+-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
+-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
+-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
+-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
+-- Retrieval info: PRIVATE: MIFfilename STRING "./ROM/NitroGroundshaker.hex"
+-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "2048"
+-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
+-- Retrieval info: PRIVATE: RegAddr NUMERIC "1"
+-- Retrieval info: PRIVATE: RegOutput NUMERIC "0"
+-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
+-- Retrieval info: PRIVATE: SingleClock NUMERIC "1"
+-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0"
+-- Retrieval info: PRIVATE: WidthAddr NUMERIC "11"
+-- Retrieval info: PRIVATE: WidthData NUMERIC "8"
+-- Retrieval info: PRIVATE: rden NUMERIC "0"
+-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
+-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE"
+-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS"
+-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS"
+-- Retrieval info: CONSTANT: INIT_FILE STRING "./ROM/NitroGroundshaker.hex"
+-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
+-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO"
+-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
+-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2048"
+-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM"
+-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE"
+-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED"
+-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11"
+-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8"
+-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"
+-- Retrieval info: USED_PORT: address 0 0 11 0 INPUT NODEFVAL "address[10..0]"
+-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock"
+-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]"
+-- Retrieval info: CONNECT: @address_a 0 0 11 0 address 0 0 11 0
+-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0
+-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0
+-- Retrieval info: GEN_FILE: TYPE_NORMAL U4_ROM.vhd TRUE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL U4_ROM.inc FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL U4_ROM.cmp FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL U4_ROM.bsf FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL U4_ROM_inst.vhd FALSE
+-- Retrieval info: LIB_FILE: altera_mf
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910-core.Vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910-core.Vhd
new file mode 100644
index 00000000..2ac88ad0
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910-core.Vhd
@@ -0,0 +1,375 @@
+library IEEE;
+use IEEE.std_logic_1164.all;
+Use IEEE.std_logic_arith.all;
+Use IEEE.std_logic_unsigned.all;
+
+-- (async) 5 to 8-bit linear to log value convolver
+entity lin5_to_log8 is
+port
+(
+ a : in std_logic_vector(4 downto 0);
+ o : out std_logic_vector(7 downto 0)
+);
+end lin5_to_log8;
+
+architecture rtl of lin5_to_log8 is
+begin
+ o <= X"00" when a = "00000" else
+ X"01" when a = "00001" else
+ X"01" when a = "00010" else
+ X"02" when a = "00011" else
+ X"02" when a = "00100" else
+ X"02" when a = "00101" else
+ X"03" when a = "00110" else
+ X"04" when a = "00111" else
+ X"04" when a = "01000" else
+ X"05" when a = "01001" else
+ X"06" when a = "01010" else
+ X"08" when a = "01011" else
+ X"09" when a = "01100" else
+ X"0B" when a = "01101" else
+ X"0D" when a = "01110" else
+ X"10" when a = "01111" else
+ X"13" when a = "10000" else
+ X"16" when a = "10001" else
+ X"1B" when a = "10010" else
+ X"20" when a = "10011" else
+ X"26" when a = "10100" else
+ X"2D" when a = "10101" else
+ X"36" when a = "10110" else
+ X"40" when a = "10111" else
+ X"4C" when a = "11000" else
+ X"5A" when a = "11001" else
+ X"6B" when a = "11010" else
+ X"80" when a = "11011" else
+ X"98" when a = "11100" else
+ X"B5" when a = "11101" else
+ X"D7" when a = "11110" else
+ X"FF" when a = "11111";
+end rtl;
+
+
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+Use IEEE.std_logic_arith.all;
+Use IEEE.std_logic_unsigned.all;
+
+-- AY-3-8910 sound generator
+-- Internals
+entity ay_3_8910_core is
+port
+(
+ clk : in std_logic;
+ reset : in std_logic;
+ clk_en : in std_logic; -- Clock enable pulse - this should occur between 1 and 2.5MHz
+
+ -- Registers
+ TPA : in std_logic_vector(11 downto 0); -- Tone generator period channel A
+ TPB : in std_logic_vector(11 downto 0); -- Tone generator period channel B
+ TPC : in std_logic_vector(11 downto 0); -- Tone generator period channel C
+ NGP : in std_logic_vector(4 downto 0); -- Noise generator period
+ MCIOEN : in std_logic_vector(7 downto 0); -- Mixer, control and I/O enable
+ ACA : in std_logic_vector(4 downto 0); -- Amplitude control channel A
+ ACB : in std_logic_vector(4 downto 0); -- Amplitude control channel B
+ ACC : in std_logic_vector(4 downto 0); -- Amplitude control channel C
+ EPC : in std_logic_vector(15 downto 0); -- Envelope period control
+ ESR : in std_logic_vector(3 downto 0); -- Envelope shape/cycle control
+ ESR_updated : in std_logic; -- ESR was written, reset envelope
+
+ -- Sound output
+ snd_A : out std_logic_vector(7 downto 0);
+ snd_B : out std_logic_vector(7 downto 0);
+ snd_C : out std_logic_vector(7 downto 0);
+
+ -- Test outputs
+ deb_clk16_en : out std_logic;
+ deb_clk1256_en : out std_logic;
+ deb_wave_A : out std_logic;
+ deb_wave_B : out std_logic;
+ deb_wave_C : out std_logic;
+ deb_noise_out : out std_logic;
+ deb_mixed_A : out std_logic;
+ deb_mixed_B : out std_logic;
+ deb_mixed_C : out std_logic;
+ deb_env_out : out std_logic_vector(3 downto 0);
+ deb_ampl_A : out std_logic_vector(3 downto 0);
+ deb_ampl_B : out std_logic_vector(3 downto 0);
+ deb_ampl_C : out std_logic_vector(3 downto 0);
+ deb_psnd_A : out std_logic_vector(4 downto 0);
+ deb_psnd_B : out std_logic_vector(4 downto 0);
+ deb_psnd_C : out std_logic_vector(4 downto 0);
+ deb_ef_cont : out std_logic;
+ deb_ef_attack : out std_logic;
+ deb_ef_alt : out std_logic;
+ deb_ef_hold : out std_logic;
+
+ deb_div_cnt : out std_logic_vector(7 downto 0);
+ deb_tcnt_A : out std_logic_vector(11 downto 0);
+ deb_tcnt_B : out std_logic_vector(11 downto 0);
+ deb_tcnt_C : out std_logic_vector(11 downto 0);
+ deb_nse : out std_logic_vector(4 downto 0);
+ deb_ecnt : out std_logic_vector(15 downto 0);
+ deb_ephase : out std_logic_vector(3 downto 0);
+ deb_nse_lfsr : out std_logic_vector(17 downto 0);
+ deb_noise_in : out std_logic;
+ deb_env_holding : out std_logic;
+ deb_env_inv : out std_logic
+
+) ;
+end ay_3_8910_core;
+
+architecture rtl of ay_3_8910_core is
+
+ signal clk16_en : std_logic; -- High 1/16 of input clock
+ signal clk256_en : std_logic; -- High 1/256 of input clock
+
+ signal wave_A : std_logic; -- Square wave A
+ signal wave_B : std_logic; -- Square wave B
+ signal wave_C : std_logic; -- Square wave C
+
+ signal noise_out : std_logic; -- Noise wave
+
+ signal mixed_A : std_logic; -- Mixed wave A
+ signal mixed_B : std_logic; -- Mixed wave B
+ signal mixed_C : std_logic; -- Mixed wave C
+
+ signal env_out : std_logic_vector(3 downto 0); -- Envelope wave
+
+ signal ampl_A : std_logic_vector(3 downto 0); -- Current amplitude, channel A
+ signal ampl_B : std_logic_vector(3 downto 0); -- Current amplitude, channel B
+ signal ampl_C : std_logic_vector(3 downto 0); -- Current amplitude, channel C
+
+ signal psnd_A : std_logic_vector(4 downto 0); -- Sound out, channel A, pre lin-log
+ signal psnd_B : std_logic_vector(4 downto 0); -- Sound out, channel A, pre lin-log
+ signal psnd_C : std_logic_vector(4 downto 0); -- Sound out, channel A, pre lin-log
+
+ signal ef_cont : std_logic; -- Envelope continue
+ signal ef_attack : std_logic; -- Envelope attack
+ signal ef_alt : std_logic; -- Envelope alternate
+ signal ef_hold : std_logic; -- Envelope hold
+
+ use work.all;
+
+begin
+
+ -- Magic helper signals
+ ef_cont <= ESR(3);
+ ef_attack <= ESR(2);
+ ef_alt <= ESR(1);
+ ef_hold <= ESR(0);
+
+ -- Debug signals
+ deb_clk16_en <= clk16_en;
+ deb_clk1256_en <= clk256_en;
+ deb_wave_A <= wave_A;
+ deb_wave_B <= wave_B;
+ deb_wave_C <= wave_C;
+ deb_noise_out <= noise_out;
+ deb_mixed_A <= mixed_A;
+ deb_mixed_B <= mixed_B;
+ deb_mixed_C <= mixed_C;
+ deb_env_out <= env_out;
+ deb_ampl_A <= ampl_A;
+ deb_ampl_B <= ampl_B;
+ deb_ampl_C <= ampl_C;
+ deb_psnd_A <= psnd_A;
+ deb_psnd_B <= psnd_B;
+ deb_psnd_C <= psnd_C;
+ deb_ef_cont <= ef_cont;
+ deb_ef_attack <= ef_attack;
+ deb_ef_alt <= ef_alt;
+ deb_ef_hold <= ef_hold;
+
+ -- Waveform mixer scale selection
+ ampl_A <= env_out when ACA(4) = '1' else ACA(3 downto 0);
+ ampl_B <= env_out when ACB(4) = '1' else ACB(3 downto 0);
+ ampl_C <= env_out when ACC(4) = '1' else ACC(3 downto 0);
+
+ -- Waveform output
+ psnd_A(4 downto 1) <= ampl_A when mixed_A = '1' else X"0"; psnd_A(0) <= '1';
+ psnd_B(4 downto 1) <= ampl_B when mixed_B = '1' else X"0"; psnd_B(0) <= '1';
+ psnd_C(4 downto 1) <= ampl_C when mixed_C = '1' else X"0"; psnd_C(0) <= '1';
+
+ -- Instantiate linear to logarithmic output convolvers
+ sA_log: entity lin5_to_log8 port map(a => psnd_A, o => snd_A);
+ sB_log: entity lin5_to_log8 port map(a => psnd_B, o => snd_B);
+ sC_log: entity lin5_to_log8 port map(a => psnd_C, o => snd_C);
+
+ -- Waveform mixers
+ mixed_A <= (wave_A or MCIOEN(0)) and (noise_out or MCIOEN(3));
+ mixed_B <= (wave_B or MCIOEN(1)) and (noise_out or MCIOEN(4));
+ mixed_C <= (wave_C or MCIOEN(2)) and (noise_out or MCIOEN(5));
+
+ -- Main process
+ process (clk, clk_en, reset)
+
+ variable div_cnt : std_logic_vector(7 downto 0); -- Clock divider counter
+
+ variable wave_A_v : std_logic; -- Square wave A
+ variable wave_B_v : std_logic; -- Square wave B
+ variable wave_C_v : std_logic; -- Square wave C
+
+ variable tcnt_A : std_logic_vector(11 downto 0); -- Square wave A period counter
+ variable tcnt_B : std_logic_vector(11 downto 0); -- Square wave B period counter
+ variable tcnt_C : std_logic_vector(11 downto 0); -- Square wave C period counter
+ variable nse : std_logic_vector(4 downto 0); -- Noise period counter
+
+ variable ecnt : std_logic_vector(15 downto 0); -- Envelope period counter
+ variable ephase : std_logic_vector(3 downto 0); -- Envelope waveform counter
+
+ variable nse_lfsr : std_logic_vector(17 downto 0); -- Noise generator LFSR
+ variable noise_in : std_logic;
+
+ variable env_holding: std_logic; -- Envelope in hold state
+ variable env_inv : std_logic; -- Envelope inverted
+
+ begin
+
+ -- Debug signals
+ deb_div_cnt <= div_cnt; -- 7 downto 0
+ deb_tcnt_A <= tcnt_A; -- 11 downto 0
+ deb_tcnt_B <= tcnt_B; -- 11 downto 0
+ deb_tcnt_C <= tcnt_C; -- 11 downto 0
+ deb_nse <= nse; -- 4 downto 0
+ deb_ecnt <= ecnt; -- 15 downto 0
+ deb_ephase <= ephase; -- 3 downto 0
+ deb_nse_lfsr <= nse_lfsr; -- 17 downto 0
+ deb_noise_in <= noise_in;
+ deb_env_holding <= env_holding;
+ deb_env_inv <= env_inv;
+
+ wave_A <= wave_A_v;
+ wave_B <= wave_B_v;
+ wave_C <= wave_C_v;
+
+ if div_cnt(3 downto 0) = "1111" then
+ clk16_en <= '1';
+ else
+ clk16_en <= '0';
+ end if;
+
+-- clk256_en <= (div_cnt = "11111111");
+
+ noise_out <= nse_lfsr(0);
+
+ if reset = '1' then
+ wave_A_v := '0';
+ wave_B_v := '0';
+ wave_C_v := '0';
+
+ div_cnt := X"00";
+ tcnt_A := X"000";
+ tcnt_B := X"000";
+ tcnt_C := X"000";
+ nse_lfsr := "000000000000000000";
+
+ ecnt := X"0000";
+ ephase := X"0";
+ env_holding := '0';
+ env_inv := '0';
+
+ elsif rising_edge(clk) then
+
+ if clk_en = '1' then
+ -- Clock divider
+ div_cnt := div_cnt + 1;
+
+ -- Envelope shape/cycle control updated, reset envelope state
+ if ESR_updated = '1' then
+ ecnt := X"0000";
+ ephase := X"0";
+ env_holding := '0';
+ env_inv := '0';
+ end if;
+
+ -- Envelope waveform generation
+ -- Envelope holding
+ if env_holding = '1' then
+ if ef_cont = '1' then
+ env_out(3) <= (ef_attack xor ef_alt);
+ env_out(2) <= (ef_attack xor ef_alt);
+ env_out(1) <= (ef_attack xor ef_alt);
+ env_out(0) <= (ef_attack xor ef_alt);
+ else
+ env_out <= X"0";
+ end if;
+ -- Otherwise envelope is a function of ephase
+ else
+ env_out(3) <= ((not ef_attack) xor env_inv) xor ephase(3);
+ env_out(2) <= ((not ef_attack) xor env_inv) xor ephase(2);
+ env_out(1) <= ((not ef_attack) xor env_inv) xor ephase(1);
+ env_out(0) <= ((not ef_attack) xor env_inv) xor ephase(0);
+ end if;
+
+ -- Events with period clk/16
+ if clk16_en = '1' then
+ -- Tone generator counters
+ -- Channel A
+ if unsigned(tcnt_A) >= unsigned(TPA) then
+ wave_A_v := not wave_A_v;
+ tcnt_A := X"000";
+ else
+ tcnt_A := tcnt_A + 1;
+ end if;
+
+ -- Channel B
+ if unsigned(tcnt_B) >= unsigned(TPB) then
+ wave_B_v := not wave_B_v;
+ tcnt_B := X"000";
+ else
+ tcnt_B := tcnt_B + 1;
+ end if;
+
+ -- Channel C
+ if unsigned(tcnt_C) >= unsigned(TPC) then
+ wave_C_v := not wave_C_v;
+ tcnt_C := X"000";
+ else
+ tcnt_C := tcnt_C + 1;
+ end if;
+
+ -- Noise period counter and LFSR
+ if nse >= NGP then
+ nse := "00000";
+ noise_in := nse_lfsr(0) xnor nse_lfsr(3); -- Input = bit 0 xor bit 3
+ nse_lfsr(16 downto 0) := nse_lfsr(17 downto 1); -- Shift right - bit 0 is output bit
+ nse_lfsr(17) := noise_in; -- Bit 16 is input bit
+ else
+ nse := nse + 1;
+ end if;
+
+ -- Envelope counters
+ if ecnt >= EPC then
+ if ephase = "1111" then
+ -- If hold flag is set, latch hold value after one envelope cycle
+ if ef_hold = '1' or ef_cont = '0' then
+ env_holding := '1';
+ end if;
+
+ -- If alternate flag is set, toggle inverted flag
+ if ef_alt = '1' then
+ env_inv := not env_inv;
+ end if;
+ ephase := X"0";
+ else
+ ephase := ephase + 1;
+ end if;
+ ecnt := X"0000";
+ else
+ ecnt := ecnt + 1;
+ end if;
+
+ end if;
+
+ -- Events with period clk/256
+-- if clk256_en = '1' then
+-- end if;
+
+ end if;
+ end if;
+ end process;
+end rtl;
+
+
+
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910.Vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910.Vhd
new file mode 100644
index 00000000..84ed6210
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910.Vhd
@@ -0,0 +1,262 @@
+library IEEE;
+use IEEE.std_logic_1164.all;
+Use IEEE.std_logic_unsigned.all;
+
+-- AY-3-8910 sound generator
+-- Chip-level module, registers and decoding
+entity ay_3_8910 is
+port
+(
+ -- AY-3-8910 sound controller
+ clk : in std_logic;
+ reset : in std_logic;
+ clk_en : in std_logic; -- Clock enable pulse - this should occur between 1 and 2.5MHz
+
+ -- CPU I/F
+ cpu_d_in : in std_logic_vector(7 downto 0);
+ cpu_d_out : out std_logic_vector(7 downto 0);
+ cpu_bdir : in std_logic;
+ cpu_bc1 : in std_logic;
+ cpu_bc2 : in std_logic;
+
+ -- I/O I/F
+ io_a_in : in std_logic_vector(7 downto 0);
+ io_b_in : in std_logic_vector(7 downto 0);
+ io_a_out : out std_logic_vector(7 downto 0);
+ io_b_out : out std_logic_vector(7 downto 0);
+
+ -- Sound output
+ snd_A : out std_logic_vector(7 downto 0);
+ snd_B : out std_logic_vector(7 downto 0);
+ snd_C : out std_logic_vector(7 downto 0)
+
+ -- Debug
+ --deb_addr : out std_logic_vector(3 downto 0);
+ --deb_TPA : out std_logic_vector(11 downto 0); -- Tone generator period channel A
+ --deb_TPB : out std_logic_vector(11 downto 0); -- Tone generator period channel B
+ --deb_TPC : out std_logic_vector(11 downto 0); -- Tone generator period channel C
+ --deb_NGP : out std_logic_vector(4 downto 0); -- Noise generator period
+ --deb_MCIOEN : out std_logic_vector(7 downto 0); -- Mixer, control and I/O enable
+ --deb_ACA : out std_logic_vector(4 downto 0); -- Amplitude control channel A
+ --deb_ACB : out std_logic_vector(4 downto 0); -- Amplitude control channel B
+ --deb_ACC : out std_logic_vector(4 downto 0); -- Amplitude control channel C
+ --deb_EPC : out std_logic_vector(15 downto 0); -- Envelope period control
+ --deb_ESR : out std_logic_vector(3 downto 0); -- Envelope shape/cycle control
+ --deb_ESR_updated : out std_logic; -- ESR was written, reset envelope
+
+ -- Test outputs
+ --deb_clk16_en : out std_logic;
+ --deb_clk1256_en : out std_logic;
+ --deb_wave_A : out std_logic;
+ --deb_wave_B : out std_logic;
+ --deb_wave_C : out std_logic;
+ --deb_noise_out : out std_logic;
+ --deb_mixed_A : out std_logic;
+ --deb_mixed_B : out std_logic;
+ --deb_mixed_C : out std_logic;
+ --deb_env_out : out std_logic_vector(3 downto 0);
+ --deb_ampl_A : out std_logic_vector(3 downto 0);
+ --deb_ampl_B : out std_logic_vector(3 downto 0);
+ --deb_ampl_C : out std_logic_vector(3 downto 0);
+ --deb_psnd_A : out std_logic_vector(4 downto 0);
+ --deb_psnd_B : out std_logic_vector(4 downto 0);
+ --deb_psnd_C : out std_logic_vector(4 downto 0);
+ --deb_ef_cont : out std_logic;
+ --deb_ef_attack : out std_logic;
+ --deb_ef_alt : out std_logic;
+ --deb_ef_hold : out std_logic;
+
+ --deb_div_cnt : out std_logic_vector(7 downto 0);
+ --deb_tcnt_A : out std_logic_vector(11 downto 0);
+ --deb_tcnt_B : out std_logic_vector(11 downto 0);
+ --deb_tcnt_C : out std_logic_vector(11 downto 0);
+ --deb_nse : out std_logic_vector(4 downto 0);
+ --deb_ecnt : out std_logic_vector(15 downto 0);
+ --deb_ephase : out std_logic_vector(3 downto 0);
+ --deb_nse_lfsr : out std_logic_vector(17 downto 0);
+ --deb_noise_in : out std_logic;
+ --deb_env_holding : out std_logic;
+ --deb_env_inv : out std_logic
+
+) ;
+end ay_3_8910;
+
+architecture rtl of ay_3_8910 is
+ signal TPA : std_logic_vector(11 downto 0); -- Tone generator period channel A
+ signal TPB : std_logic_vector(11 downto 0); -- Tone generator period channel B
+ signal TPC : std_logic_vector(11 downto 0); -- Tone generator period channel C
+ signal NGP : std_logic_vector(4 downto 0); -- Noise generator period
+ signal MCIOEN : std_logic_vector(7 downto 0); -- Mixer, control and I/O enable
+ signal ACA : std_logic_vector(4 downto 0); -- Amplitude control channel A
+ signal ACB : std_logic_vector(4 downto 0); -- Amplitude control channel B
+ signal ACC : std_logic_vector(4 downto 0); -- Amplitude control channel C
+ signal EPC : std_logic_vector(15 downto 0); -- Envelope period control
+ signal ESR : std_logic_vector(3 downto 0); -- Envelope shape/cycle control
+ signal PAO : std_logic_vector(7 downto 0); -- Port A out
+ signal PBO : std_logic_vector(7 downto 0); -- Port B out
+ signal ESR_updated : std_logic; -- ESR was written, reset envelope
+
+ use work.all;
+
+begin
+
+ -- Connect core sound processing module to input registers
+ ay_core: entity ay_3_8910_core port map(clk => clk, reset => reset, clk_en => clk_en,
+ TPA => TPA, TPB => TPB, TPC => TPC, NGP => NGP, MCIOEN => MCIOEN, ACA => ACA, ACB => ACB,
+ ACC => ACC, EPC => EPC, ESR => ESR, ESR_updated => ESR_updated,
+ snd_A => snd_A, snd_B => snd_B, snd_C => snd_C
+ --deb_clk16_en => deb_clk16_en,
+ --deb_clk1256_en => deb_clk1256_en,
+ --deb_wave_A => deb_wave_A,
+ --deb_wave_B => deb_wave_B,
+ --deb_wave_C => deb_wave_C,
+ --deb_noise_out => deb_noise_out,
+ --deb_mixed_A => deb_mixed_A,
+ --deb_mixed_B => deb_mixed_B,
+ --deb_mixed_C => deb_mixed_C,
+ --deb_env_out => deb_env_out,
+ --deb_ampl_A => deb_ampl_A,
+ --deb_ampl_B => deb_ampl_B,
+ --deb_ampl_C => deb_ampl_C,
+ --deb_psnd_A => deb_psnd_A,
+ --deb_psnd_B => deb_psnd_B,
+ --deb_psnd_C => deb_psnd_C,
+ --deb_ef_cont => deb_ef_cont,
+ --deb_ef_attack => deb_ef_attack,
+ --deb_ef_alt => deb_ef_alt,
+ --deb_ef_hold => deb_ef_hold,
+ --deb_div_cnt => deb_div_cnt,
+ --deb_tcnt_A => deb_tcnt_A,
+ --deb_tcnt_B => deb_tcnt_B,
+ --deb_tcnt_C => deb_tcnt_C,
+ --deb_nse => deb_nse,
+ --deb_ecnt => deb_ecnt,
+ --deb_ephase => deb_ephase,
+ --deb_nse_lfsr => deb_nse_lfsr,
+ --deb_noise_in => deb_noise_in,
+ --deb_env_holding => deb_env_holding,
+ --deb_env_inv => deb_env_inv
+
+ );
+
+ -- I/O outputs
+ io_a_out <= PAO when MCIOEN(6) = '0' else X"FF";
+ io_b_out <= PBO when MCIOEN(7) = '0' else X"FF";
+
+ -- Main process
+ process (clk, clk_en, reset)
+ variable addr : std_logic_vector(3 downto 0); -- Addressed register
+
+ variable rTPA : std_logic_vector(11 downto 0); -- Tone generator period channel A
+ variable rTPB : std_logic_vector(11 downto 0); -- Tone generator period channel B
+ variable rTPC : std_logic_vector(11 downto 0); -- Tone generator period channel C
+ variable rNGP : std_logic_vector(4 downto 0); -- Noise generator period
+ variable rMCIOEN : std_logic_vector(7 downto 0); -- Mixer, control and I/O enable
+ variable rACA : std_logic_vector(4 downto 0); -- Amplitude control channel A
+ variable rACB : std_logic_vector(4 downto 0); -- Amplitude control channel B
+ variable rACC : std_logic_vector(4 downto 0); -- Amplitude control channel C
+ variable rEPC : std_logic_vector(15 downto 0); -- Envelope period control
+ variable rESR : std_logic_vector(3 downto 0); -- Envelope shape/cycle control
+ variable rPAO : std_logic_vector(7 downto 0); -- Port A out
+ variable rPBO : std_logic_vector(7 downto 0); -- Port B out
+ variable rESR_updated : std_logic; -- ESR was written, reset envelope
+ begin
+ TPA <= rTPA; TPB <= rTPB;
+ TPC <= rTPC; NGP <= rNGP;
+ MCIOEN <= rMCIOEN; ACA <= rACA;
+ ACB <= rACB; ACC <= rACC;
+ EPC <= rEPC; ESR <= rESR;
+ PAO <= rPAO; PBO <= rPBO;
+ ESR_updated <= rESR_updated;
+
+ -- Debug
+ --deb_addr <= addr;
+ --deb_TPA <= TPA;
+ --deb_TPB <= TPB;
+ --deb_TPC <= TPC;
+ --deb_NGP <= NGP;
+ --deb_MCIOEN <= MCIOEN;
+ --deb_ACA <= ACA;
+ --deb_ACB <= ACB;
+ --deb_ACC <= ACC;
+ --deb_EPC <= EPC;
+ --deb_ESR <= ESR;
+ --deb_ESR_updated <= ESR_updated;
+
+ if reset = '1' then
+
+ rTPA := X"000";
+ rTPB := X"000";
+ rTPC := X"000";
+ rNGP := "00000";
+ rMCIOEN := X"00";
+ rACA := "00000";
+ rACB := "00000";
+ rACC := "00000";
+ rEPC := X"0000";
+ rESR := X"0";
+ rESR_updated := '0';
+
+ elsif rising_edge(clk) then
+
+-- if clk_en = '1' then
+ rESR_updated := '0';
+
+ -- Latch address
+ if (cpu_bdir = '0' and cpu_bc2 = '0' and cpu_bc1 = '1') or
+ (cpu_bdir = '1' and cpu_bc2 = '0' and cpu_bc1 = '0') or
+ (cpu_bdir = '1' and cpu_bc2 = '1' and cpu_bc1 = '1') then
+
+ addr(3 downto 0) := cpu_d_in(3 downto 0);
+
+ -- Data write
+ elsif (cpu_bdir = '1' and cpu_bc2 = '1' and cpu_bc1 = '0') then
+ case addr(3 downto 0) is
+ when X"0" => rTPA(7 downto 0) := cpu_d_in(7 downto 0);
+ when X"1" => rTPA(11 downto 8) := cpu_d_in(3 downto 0);
+ when X"2" => rTPB(7 downto 0) := cpu_d_in(7 downto 0);
+ when X"3" => rTPB(11 downto 8) := cpu_d_in(3 downto 0);
+ when X"4" => rTPC(7 downto 0) := cpu_d_in(7 downto 0);
+ when X"5" => rTPC(11 downto 8) := cpu_d_in(3 downto 0);
+ when X"6" => rNGP(4 downto 0) := cpu_d_in(4 downto 0);
+ when X"7" => rMCIOEN(7 downto 0) := cpu_d_in(7 downto 0);
+ when X"8" => rACA(4 downto 0) := cpu_d_in(4 downto 0);
+ when X"9" => rACB(4 downto 0) := cpu_d_in(4 downto 0);
+ when X"A" => rACC(4 downto 0) := cpu_d_in(4 downto 0);
+ when X"B" => rEPC(7 downto 0) := cpu_d_in(7 downto 0);
+ when X"C" => rEPC(15 downto 8) := cpu_d_in(7 downto 0);
+ when X"D" => rESR(3 downto 0) := cpu_d_in(3 downto 0); rESR_updated := '1';
+ when X"E" => rPAO(7 downto 0) := cpu_d_in(7 downto 0);
+ when X"F" => rPBO(7 downto 0) := cpu_d_in(7 downto 0);
+ when others =>
+ end case;
+
+ -- Data read
+ elsif (cpu_bdir = '0' and cpu_bc2 = '1' and cpu_bc1 = '1') then
+ cpu_d_out <= X"00";
+ case addr(3 downto 0) is
+ when X"0" => cpu_d_out <= rTPA(7 downto 0);
+ when X"1" => cpu_d_out(3 downto 0) <= rTPA(11 downto 8);
+ when X"2" => cpu_d_out <= rTPB(7 downto 0);
+ when X"3" => cpu_d_out(3 downto 0) <= rTPB(11 downto 8);
+ when X"4" => cpu_d_out <= rTPC(7 downto 0);
+ when X"5" => cpu_d_out(3 downto 0) <= rTPC(11 downto 8);
+ when X"6" => cpu_d_out(4 downto 0) <= rNGP(4 downto 0);
+ when X"7" => cpu_d_out <= rMCIOEN(7 downto 0);
+ when X"8" => cpu_d_out(4 downto 0) <= rACA(4 downto 0);
+ when X"9" => cpu_d_out(4 downto 0) <= rACB(4 downto 0);
+ when X"A" => cpu_d_out(4 downto 0) <= rACC(4 downto 0);
+ when X"B" => cpu_d_out <= rEPC(7 downto 0);
+ when X"C" => cpu_d_out <= rEPC(15 downto 8);
+ when X"D" => cpu_d_out(3 downto 0) <= rESR(3 downto 0);
+ when X"E" => cpu_d_out <= io_a_in(7 downto 0);
+ when X"F" => cpu_d_out <= io_b_in(7 downto 0);
+ when others =>
+ end case;
+ end if;
+-- end if;
+
+ end if;
+ end process;
+end rtl;
+
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910_vectors.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910_vectors.vhd
new file mode 100644
index 00000000..c8e4deb0
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/ay-3-8910_vectors.vhd
@@ -0,0 +1,1165 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+entity rominfr is
+ port (
+ clk : in std_logic;
+ en : in std_logic;
+ addr : in std_logic_vector(10 downto 0);
+ data : out std_logic_vector(47 downto 0)
+ );
+end rominfr;
+architecture syn of rominfr is
+ type rom_type is array (1136 downto 0) of std_logic_vector (47 downto 0);
+ constant ROM : rom_type :=
+(
+ X"000000000000", -- len= 0 r=$00 v=$00
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000000200", -- len= 0 r=$02 v=$00
+ X"000000000300", -- len= 0 r=$03 v=$00
+ X"000000000400", -- len= 0 r=$04 v=$00
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000000600", -- len= 0 r=$06 v=$00
+ X"000000000700", -- len= 0 r=$07 v=$00
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"000000000900", -- len= 0 r=$09 v=$00
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"000000000B00", -- len= 0 r=$0B v=$00
+ X"000000000C00", -- len= 0 r=$0C v=$00
+ X"000000000D00", -- len= 0 r=$0D v=$00
+ X"00000390073F", -- len= 912 r=$07 v=$3F
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"000000000900", -- len= 0 r=$09 v=$00
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"000000000900", -- len= 0 r=$09 v=$00
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00011704073F", -- len= 71428 r=$07 v=$3F
+ X"000002D8073F", -- len= 728 r=$07 v=$3F
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"000000000900", -- len= 0 r=$09 v=$00
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"000000000900", -- len= 0 r=$09 v=$00
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"000038D40020", -- len= 14548 r=$00 v=$20
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"00000004073E", -- len= 4 r=$07 v=$3E
+ X"000000030809", -- len= 3 r=$08 v=$09
+ X"000007D70808", -- len= 2007 r=$08 v=$08
+ X"000007E30807", -- len= 2019 r=$08 v=$07
+ X"000007E30806", -- len= 2019 r=$08 v=$06
+ X"000007E30805", -- len= 2019 r=$08 v=$05
+ X"000007E10804", -- len= 2017 r=$08 v=$04
+ X"000007E40803", -- len= 2020 r=$08 v=$03
+ X"000007E30802", -- len= 2019 r=$08 v=$02
+ X"000007E30801", -- len= 2019 r=$08 v=$01
+ X"000007E20800", -- len= 2018 r=$08 v=$00
+ X"0000002F0000", -- len= 47 r=$00 v=$00
+ X"000000010103", -- len= 1 r=$01 v=$03
+ X"000000020808", -- len= 2 r=$08 v=$08
+ X"000000CB00F8", -- len= 203 r=$00 v=$F8
+ X"000000010102", -- len= 1 r=$01 v=$02
+ X"000000AF00F0", -- len= 175 r=$00 v=$F0
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000CB00E8", -- len= 203 r=$00 v=$E8
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000B000E0", -- len= 176 r=$00 v=$E0
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000CA00D8", -- len= 202 r=$00 v=$D8
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000B100D0", -- len= 177 r=$00 v=$D0
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000CA00C8", -- len= 202 r=$00 v=$C8
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000AF00C0", -- len= 175 r=$00 v=$C0
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000CC00B8", -- len= 204 r=$00 v=$B8
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000B000B0", -- len= 176 r=$00 v=$B0
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000C900A8", -- len= 201 r=$00 v=$A8
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000B000A0", -- len= 176 r=$00 v=$A0
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000CC0098", -- len= 204 r=$00 v=$98
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000B00090", -- len= 176 r=$00 v=$90
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"000000C90088", -- len= 201 r=$00 v=$88
+ X"000000000102", -- len= 0 r=$01 v=$02
+ X"0000003D073F", -- len= 61 r=$07 v=$3F
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"0000003F0800", -- len= 63 r=$08 v=$00
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"000000000900", -- len= 0 r=$09 v=$00
+ X"00000000073F", -- len= 0 r=$07 v=$3F
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"000002AD073E", -- len= 685 r=$07 v=$3E
+ X"0000007300F0", -- len= 115 r=$00 v=$F0
+ X"000000010100", -- len= 1 r=$01 v=$00
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"00000263073C", -- len= 611 r=$07 v=$3C
+ X"00000040025D", -- len= 64 r=$02 v=$5D
+ X"000000010302", -- len= 1 r=$03 v=$02
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"0000024D0806", -- len= 589 r=$08 v=$06
+ X"0000005E0738", -- len= 94 r=$07 v=$38
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"000002210906", -- len= 545 r=$09 v=$06
+ X"000002FD0A06", -- len= 765 r=$0A v=$06
+ X"0000045E0805", -- len= 1118 r=$08 v=$05
+ X"0000027F0905", -- len= 639 r=$09 v=$05
+ X"000002FF0A05", -- len= 767 r=$0A v=$05
+ X"0000045E0804", -- len= 1118 r=$08 v=$04
+ X"0000027E0904", -- len= 638 r=$09 v=$04
+ X"000002FF0A04", -- len= 767 r=$0A v=$04
+ X"0000045E0803", -- len= 1118 r=$08 v=$03
+ X"0000027F0903", -- len= 639 r=$09 v=$03
+ X"00000277002E", -- len= 631 r=$00 v=$2E
+ X"000000010101", -- len= 1 r=$01 v=$01
+ X"000000040807", -- len= 4 r=$08 v=$07
+ X"000000810A03", -- len= 129 r=$0A v=$03
+ X"000001FA02E0", -- len= 506 r=$02 v=$E0
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002620806", -- len= 610 r=$08 v=$06
+ X"00000096045D", -- len= 150 r=$04 v=$5D
+ X"000000010502", -- len= 1 r=$05 v=$02
+ X"000000040A07", -- len= 4 r=$0A v=$07
+ X"000001E40906", -- len= 484 r=$09 v=$06
+ X"000002FD0A06", -- len= 765 r=$0A v=$06
+ X"0000045E0805", -- len= 1118 r=$08 v=$05
+ X"000002800905", -- len= 640 r=$09 v=$05
+ X"000002FD0A05", -- len= 765 r=$0A v=$05
+ X"0000045E0804", -- len= 1118 r=$08 v=$04
+ X"0000027F0904", -- len= 639 r=$09 v=$04
+ X"000002FF0A04", -- len= 767 r=$0A v=$04
+ X"0000045E0803", -- len= 1118 r=$08 v=$03
+ X"0000027E0903", -- len= 638 r=$09 v=$03
+ X"00000000002E", -- len= 0 r=$00 v=$2E
+ X"000000000101", -- len= 0 r=$01 v=$01
+ X"0000027D0807", -- len= 637 r=$08 v=$07
+ X"000000810A03", -- len= 129 r=$0A v=$03
+ X"000001FA0227", -- len= 506 r=$02 v=$27
+ X"000000010303", -- len= 1 r=$03 v=$03
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002610806", -- len= 609 r=$08 v=$06
+ X"000000930A00", -- len= 147 r=$0A v=$00
+ X"000001ED0906", -- len= 493 r=$09 v=$06
+ X"000002FD0A02", -- len= 765 r=$0A v=$02
+ X"0000045E0805", -- len= 1118 r=$08 v=$05
+ X"0000027E0905", -- len= 638 r=$09 v=$05
+ X"000002FF0A01", -- len= 767 r=$0A v=$01
+ X"0000045E0804", -- len= 1118 r=$08 v=$04
+ X"0000027E0904", -- len= 638 r=$09 v=$04
+ X"000002FE0A00", -- len= 766 r=$0A v=$00
+ X"0000045F0803", -- len= 1119 r=$08 v=$03
+ X"0000027F0903", -- len= 639 r=$09 v=$03
+ X"0000000D002E", -- len= 13 r=$00 v=$2E
+ X"000000000101", -- len= 0 r=$01 v=$01
+ X"000002700807", -- len= 624 r=$08 v=$07
+ X"0000027902E0", -- len= 633 r=$02 v=$E0
+ X"000000020301", -- len= 2 r=$03 v=$01
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002610806", -- len= 609 r=$08 v=$06
+ X"00000000045D", -- len= 0 r=$04 v=$5D
+ X"000000000502", -- len= 0 r=$05 v=$02
+ X"0000009D0A07", -- len= 157 r=$0A v=$07
+ X"000001E30906", -- len= 483 r=$09 v=$06
+ X"000002FC0A06", -- len= 764 r=$0A v=$06
+ X"000004600805", -- len= 1120 r=$08 v=$05
+ X"0000027F0905", -- len= 639 r=$09 v=$05
+ X"000002FC0A05", -- len= 764 r=$0A v=$05
+ X"0000045F0804", -- len= 1119 r=$08 v=$04
+ X"000002800904", -- len= 640 r=$09 v=$04
+ X"000002FD0A04", -- len= 765 r=$0A v=$04
+ X"0000045E0803", -- len= 1118 r=$08 v=$03
+ X"000002800903", -- len= 640 r=$09 v=$03
+ X"0000027700F0", -- len= 631 r=$00 v=$F0
+ X"000000010100", -- len= 1 r=$01 v=$00
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"000000820A03", -- len= 130 r=$0A v=$03
+ X"000001F9025D", -- len= 505 r=$02 v=$5D
+ X"000000010302", -- len= 1 r=$03 v=$02
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002610806", -- len= 609 r=$08 v=$06
+ X"000000950A00", -- len= 149 r=$0A v=$00
+ X"000001EB0906", -- len= 491 r=$09 v=$06
+ X"000002FD0A02", -- len= 765 r=$0A v=$02
+ X"0000045E0805", -- len= 1118 r=$08 v=$05
+ X"000002810905", -- len= 641 r=$09 v=$05
+ X"000002FC0A01", -- len= 764 r=$0A v=$01
+ X"0000045F0804", -- len= 1119 r=$08 v=$04
+ X"000002800904", -- len= 640 r=$09 v=$04
+ X"000002FD0A00", -- len= 765 r=$0A v=$00
+ X"0000045E0803", -- len= 1118 r=$08 v=$03
+ X"000002800903", -- len= 640 r=$09 v=$03
+ X"00000277002E", -- len= 631 r=$00 v=$2E
+ X"000000010101", -- len= 1 r=$01 v=$01
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"0000027C02E0", -- len= 636 r=$02 v=$E0
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"000002610806", -- len= 609 r=$08 v=$06
+ X"00000000045D", -- len= 0 r=$04 v=$5D
+ X"000000000502", -- len= 0 r=$05 v=$02
+ X"0000009A0A07", -- len= 154 r=$0A v=$07
+ X"000001E50906", -- len= 485 r=$09 v=$06
+ X"000002FD0A06", -- len= 765 r=$0A v=$06
+ X"0000045E0805", -- len= 1118 r=$08 v=$05
+ X"0000027E0905", -- len= 638 r=$09 v=$05
+ X"000002FF0A05", -- len= 767 r=$0A v=$05
+ X"0000045E0804", -- len= 1118 r=$08 v=$04
+ X"0000027F0904", -- len= 639 r=$09 v=$04
+ X"000002FC0A04", -- len= 764 r=$0A v=$04
+ X"000004610803", -- len= 1121 r=$08 v=$03
+ X"0000027E0903", -- len= 638 r=$09 v=$03
+ X"000001280738", -- len= 296 r=$07 v=$38
+ X"000000DE04BE", -- len= 222 r=$04 v=$BE
+ X"000000010500", -- len= 1 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"00000000002E", -- len= 0 r=$00 v=$2E
+ X"000000000101", -- len= 0 r=$01 v=$01
+ X"000000EE0807", -- len= 238 r=$08 v=$07
+ X"000000560A08", -- len= 86 r=$0A v=$08
+ X"000002250227", -- len= 549 r=$02 v=$27
+ X"000000010303", -- len= 1 r=$03 v=$03
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"0000004D0A07", -- len= 77 r=$0A v=$07
+ X"000001370497", -- len= 311 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000000D70806", -- len= 215 r=$08 v=$06
+ X"000000620A08", -- len= 98 r=$0A v=$08
+ X"0000021E0906", -- len= 542 r=$09 v=$06
+ X"0000005A0A07", -- len= 90 r=$0A v=$07
+ X"00000137047F", -- len= 311 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013C0A08", -- len= 316 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"00000136045F", -- len= 310 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000000D90805", -- len= 217 r=$08 v=$05
+ X"000000620A08", -- len= 98 r=$0A v=$08
+ X"0000021D0905", -- len= 541 r=$09 v=$05
+ X"0000005A0A07", -- len= 90 r=$0A v=$07
+ X"0000013A0471", -- len= 314 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001380A08", -- len= 312 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"000002150804", -- len= 533 r=$08 v=$04
+ X"000000630A06", -- len= 99 r=$0A v=$06
+ X"0000021C0904", -- len= 540 r=$09 v=$04
+ X"0000005A0A05", -- len= 90 r=$0A v=$05
+ X"000002770A04", -- len= 631 r=$0A v=$04
+ X"000002760A03", -- len= 630 r=$0A v=$03
+ X"000002140803", -- len= 532 r=$08 v=$03
+ X"000000630A02", -- len= 99 r=$0A v=$02
+ X"0000021D0903", -- len= 541 r=$09 v=$03
+ X"0000005A0A01", -- len= 90 r=$0A v=$01
+ X"000000AE002E", -- len= 174 r=$00 v=$2E
+ X"000000000101", -- len= 0 r=$01 v=$01
+ X"000001730807", -- len= 371 r=$08 v=$07
+ X"000000560A00", -- len= 86 r=$0A v=$00
+ X"0000022502E0", -- len= 549 r=$02 v=$E0
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"000002620806", -- len= 610 r=$08 v=$06
+ X"000002320738", -- len= 562 r=$07 v=$38
+ X"000000980906", -- len= 152 r=$09 v=$06
+ X"0000004604BE", -- len= 70 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013D0A08", -- len= 317 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"000001390497", -- len= 313 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001390A08", -- len= 313 r=$0A v=$08
+ X"000001180805", -- len= 280 r=$08 v=$05
+ X"0000015E0A07", -- len= 350 r=$0A v=$07
+ X"000001200905", -- len= 288 r=$09 v=$05
+ X"0000001D047F", -- len= 29 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001360A08", -- len= 310 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"00000138045F", -- len= 312 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001390A08", -- len= 313 r=$0A v=$08
+ X"000001180804", -- len= 280 r=$08 v=$04
+ X"0000015F0A07", -- len= 351 r=$0A v=$07
+ X"000001220904", -- len= 290 r=$09 v=$04
+ X"0000001E0471", -- len= 30 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000001310A08", -- len= 305 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"000002760A06", -- len= 630 r=$0A v=$06
+ X"000001170803", -- len= 279 r=$08 v=$03
+ X"0000015F0A05", -- len= 351 r=$0A v=$05
+ X"000001220903", -- len= 290 r=$09 v=$03
+ X"000001560A04", -- len= 342 r=$0A v=$04
+ X"0000012000E3", -- len= 288 r=$00 v=$E3
+ X"000000010100", -- len= 1 r=$01 v=$00
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"000001530A03", -- len= 339 r=$0A v=$03
+ X"00000128021B", -- len= 296 r=$02 v=$1B
+ X"000000020302", -- len= 2 r=$03 v=$02
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"0000014A0A02", -- len= 330 r=$0A v=$02
+ X"000001170806", -- len= 279 r=$08 v=$06
+ X"0000015E0A01", -- len= 350 r=$0A v=$01
+ X"000001200906", -- len= 288 r=$09 v=$06
+ X"000001580A00", -- len= 344 r=$0A v=$00
+ X"000006050805", -- len= 1541 r=$08 v=$05
+ X"000002800905", -- len= 640 r=$09 v=$05
+ X"0000075C0804", -- len= 1884 r=$08 v=$04
+ X"0000027E0904", -- len= 638 r=$09 v=$04
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000058073C", -- len= 88 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000000073C", -- len= 0 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"000007040803", -- len= 1796 r=$08 v=$03
+ X"000002810903", -- len= 641 r=$09 v=$03
+ X"0000014600E3", -- len= 326 r=$00 v=$E3
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000001350807", -- len= 309 r=$08 v=$07
+ X"0000027902C5", -- len= 633 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"000002620806", -- len= 610 r=$08 v=$06
+ X"0000027F0906", -- len= 639 r=$09 v=$06
+ X"000000210738", -- len= 33 r=$07 v=$38
+ X"0000006B04BE", -- len= 107 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001430A08", -- len= 323 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"000001360497", -- len= 310 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000000E50805", -- len= 229 r=$08 v=$05
+ X"000001910A07", -- len= 401 r=$0A v=$07
+ X"000000EE0905", -- len= 238 r=$09 v=$05
+ X"00000048047F", -- len= 72 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"00000136045F", -- len= 310 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000000E50804", -- len= 229 r=$08 v=$04
+ X"000001910A07", -- len= 401 r=$0A v=$07
+ X"000000F00904", -- len= 240 r=$09 v=$04
+ X"0000004B0471", -- len= 75 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001370A08", -- len= 311 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"000002760A06", -- len= 630 r=$0A v=$06
+ X"000000E50803", -- len= 229 r=$08 v=$03
+ X"000001910A05", -- len= 401 r=$0A v=$05
+ X"000000F00903", -- len= 240 r=$09 v=$03
+ X"000001880A04", -- len= 392 r=$0A v=$04
+ X"000000EE00F0", -- len= 238 r=$00 v=$F0
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000050807", -- len= 5 r=$08 v=$07
+ X"000001B60A03", -- len= 438 r=$0A v=$03
+ X"000000F70227", -- len= 247 r=$02 v=$27
+ X"000000010303", -- len= 1 r=$03 v=$03
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"0000017D0A02", -- len= 381 r=$0A v=$02
+ X"000000E50806", -- len= 229 r=$08 v=$06
+ X"000001910A01", -- len= 401 r=$0A v=$01
+ X"000000EE0906", -- len= 238 r=$09 v=$06
+ X"000001880A00", -- len= 392 r=$0A v=$00
+ X"000005D30805", -- len= 1491 r=$08 v=$05
+ X"000000FF0738", -- len= 255 r=$07 v=$38
+ X"000000C404BE", -- len= 196 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001040905", -- len= 260 r=$09 v=$05
+ X"000000410A08", -- len= 65 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"000001500497", -- len= 336 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000016E0A08", -- len= 366 r=$0A v=$08
+ X"000002140804", -- len= 532 r=$08 v=$04
+ X"000000620A07", -- len= 98 r=$0A v=$07
+ X"00000136047F", -- len= 310 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000000E10904", -- len= 225 r=$09 v=$04
+ X"0000005A0A08", -- len= 90 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"00000139045F", -- len= 313 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013A0A08", -- len= 314 r=$0A v=$08
+ X"000002150803", -- len= 533 r=$08 v=$03
+ X"000000620A07", -- len= 98 r=$0A v=$07
+ X"000001390471", -- len= 313 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000000DE0903", -- len= 222 r=$09 v=$03
+ X"0000005A0A08", -- len= 90 r=$0A v=$08
+ X"000000AE00F0", -- len= 174 r=$00 v=$F0
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000001740807", -- len= 372 r=$08 v=$07
+ X"000000550A07", -- len= 85 r=$0A v=$07
+ X"0000022602C5", -- len= 550 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"0000004B0A06", -- len= 75 r=$0A v=$06
+ X"000002160806", -- len= 534 r=$08 v=$06
+ X"000000630A05", -- len= 99 r=$0A v=$05
+ X"0000021C0906", -- len= 540 r=$09 v=$06
+ X"0000005A0A04", -- len= 90 r=$0A v=$04
+ X"000002300738", -- len= 560 r=$07 v=$38
+ X"000000AA04BE", -- len= 170 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001450A08", -- len= 325 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"000000B40805", -- len= 180 r=$08 v=$05
+ X"0000009C0497", -- len= 156 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000016D0A08", -- len= 365 r=$0A v=$08
+ X"000000A20905", -- len= 162 r=$09 v=$05
+ X"000001D40A07", -- len= 468 r=$0A v=$07
+ X"00000137047F", -- len= 311 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000002770A07", -- len= 631 r=$0A v=$07
+ X"000000990804", -- len= 153 r=$08 v=$04
+ X"0000009D045F", -- len= 157 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000000A30904", -- len= 163 r=$09 v=$04
+ X"000001D50A07", -- len= 469 r=$0A v=$07
+ X"000001390471", -- len= 313 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000001370A08", -- len= 311 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"0000009A0803", -- len= 154 r=$08 v=$03
+ X"000001DC0A06", -- len= 476 r=$0A v=$06
+ X"000000A20903", -- len= 162 r=$09 v=$03
+ X"000001D60A05", -- len= 470 r=$0A v=$05
+ X"000000A2000D", -- len= 162 r=$00 v=$0D
+ X"000000010101", -- len= 1 r=$01 v=$01
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"000001440738", -- len= 324 r=$07 v=$38
+ X"000000BC04BE", -- len= 188 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000000C2021B", -- len= 194 r=$02 v=$1B
+ X"000000010302", -- len= 1 r=$03 v=$02
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000000B10A08", -- len= 177 r=$0A v=$08
+ X"000001E10806", -- len= 481 r=$08 v=$06
+ X"000000970A07", -- len= 151 r=$0A v=$07
+ X"000001500497", -- len= 336 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000000E00906", -- len= 224 r=$09 v=$06
+ X"0000008C0A08", -- len= 140 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"00000136047F", -- len= 310 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013C0A08", -- len= 316 r=$0A v=$08
+ X"000001E20805", -- len= 482 r=$08 v=$05
+ X"000000940A07", -- len= 148 r=$0A v=$07
+ X"00000136045F", -- len= 310 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000000B00905", -- len= 176 r=$09 v=$05
+ X"0000008C0A08", -- len= 140 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"0000013B0471", -- len= 315 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001380A08", -- len= 312 r=$0A v=$08
+ X"000001E10804", -- len= 481 r=$08 v=$04
+ X"000000940A07", -- len= 148 r=$0A v=$07
+ X"000001EC0904", -- len= 492 r=$09 v=$04
+ X"0000008C0A06", -- len= 140 r=$0A v=$06
+ X"000002760A05", -- len= 630 r=$0A v=$05
+ X"000002780A04", -- len= 632 r=$0A v=$04
+ X"000001E10803", -- len= 481 r=$08 v=$03
+ X"000000240738", -- len= 36 r=$07 v=$38
+ X"000000A104BE", -- len= 161 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001460A08", -- len= 326 r=$0A v=$08
+ X"000000A20903", -- len= 162 r=$09 v=$03
+ X"000001D40A07", -- len= 468 r=$0A v=$07
+ X"000001390497", -- len= 313 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001390A08", -- len= 313 r=$0A v=$08
+ X"000000AB02C5", -- len= 171 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000001C80A07", -- len= 456 r=$0A v=$07
+ X"0000009A0802", -- len= 154 r=$08 v=$02
+ X"0000009C047F", -- len= 156 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000000A30906", -- len= 163 r=$09 v=$06
+ X"000001D30A07", -- len= 467 r=$0A v=$07
+ X"00000139045F", -- len= 313 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001390A08", -- len= 313 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"0000009A0801", -- len= 154 r=$08 v=$01
+ X"0000009F0471", -- len= 159 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001380A08", -- len= 312 r=$0A v=$08
+ X"000000A20905", -- len= 162 r=$09 v=$05
+ X"000001D60A07", -- len= 470 r=$0A v=$07
+ X"000002750A06", -- len= 629 r=$0A v=$06
+ X"000002790A05", -- len= 633 r=$0A v=$05
+ X"0000009A0800", -- len= 154 r=$08 v=$00
+ X"000001DC0A04", -- len= 476 r=$0A v=$04
+ X"000000A20904", -- len= 162 r=$09 v=$04
+ X"000001D30A03", -- len= 467 r=$0A v=$03
+ X"000002780A02", -- len= 632 r=$0A v=$02
+ X"000002760A01", -- len= 630 r=$0A v=$01
+ X"000002770A00", -- len= 631 r=$0A v=$00
+ X"000000A20903", -- len= 162 r=$09 v=$03
+ X"000000A90800", -- len= 169 r=$08 v=$00
+ X"0000044E0227", -- len= 1102 r=$02 v=$27
+ X"000000010303", -- len= 1 r=$03 v=$03
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000004E10906", -- len= 1249 r=$09 v=$06
+ X"000007DB0A00", -- len= 2011 r=$0A v=$00
+ X"00000060073C", -- len= 96 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000000073C", -- len= 0 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"000001A00905", -- len= 416 r=$09 v=$05
+ X"000003D90738", -- len= 985 r=$07 v=$38
+ X"000000A304BE", -- len= 163 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001460A08", -- len= 326 r=$0A v=$08
+ X"000002770A07", -- len= 631 r=$0A v=$07
+ X"000001360497", -- len= 310 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000000DF0904", -- len= 223 r=$09 v=$04
+ X"0000005A0A08", -- len= 90 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"00000136047F", -- len= 310 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013C0A08", -- len= 316 r=$0A v=$08
+ X"000002770A07", -- len= 631 r=$0A v=$07
+ X"00000136045F", -- len= 310 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000000DF0903", -- len= 223 r=$09 v=$03
+ X"0000005A0A08", -- len= 90 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"000001390471", -- len= 313 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000000E702C5", -- len= 231 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"0000004E0A08", -- len= 78 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"0000021C0906", -- len= 540 r=$09 v=$06
+ X"0000005A0A06", -- len= 90 r=$0A v=$06
+ X"000002780A05", -- len= 632 r=$0A v=$05
+ X"000002760A04", -- len= 630 r=$0A v=$04
+ X"000002770A03", -- len= 631 r=$0A v=$03
+ X"000000000738", -- len= 0 r=$07 v=$38
+ X"000000AF04BE", -- len= 175 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001450A08", -- len= 325 r=$0A v=$08
+ X"000000710905", -- len= 113 r=$09 v=$05
+ X"000002050A07", -- len= 517 r=$0A v=$07
+ X"000001360497", -- len= 310 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"00000138047F", -- len= 312 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013C0A08", -- len= 316 r=$0A v=$08
+ X"000000700904", -- len= 112 r=$09 v=$04
+ X"000002050A07", -- len= 517 r=$0A v=$07
+ X"00000137045F", -- len= 311 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013C0A08", -- len= 316 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"000001390471", -- len= 313 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000001390A08", -- len= 313 r=$0A v=$08
+ X"0000006E0903", -- len= 110 r=$09 v=$03
+ X"000002080A07", -- len= 520 r=$0A v=$07
+ X"0000007000E3", -- len= 112 r=$00 v=$E3
+ X"000000020100", -- len= 2 r=$01 v=$00
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"000002350A06", -- len= 565 r=$0A v=$06
+ X"00000079021B", -- len= 121 r=$02 v=$1B
+ X"000000010302", -- len= 1 r=$03 v=$02
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000001F90A05", -- len= 505 r=$0A v=$05
+ X"000000680806", -- len= 104 r=$08 v=$06
+ X"0000020E0A04", -- len= 526 r=$0A v=$04
+ X"000000700906", -- len= 112 r=$09 v=$06
+ X"000002080A03", -- len= 520 r=$0A v=$03
+ X"000002770A02", -- len= 631 r=$0A v=$02
+ X"000002770A01", -- len= 631 r=$0A v=$01
+ X"000000660805", -- len= 102 r=$08 v=$05
+ X"000002100A00", -- len= 528 r=$0A v=$00
+ X"000000700905", -- len= 112 r=$09 v=$05
+ X"0000075C0804", -- len= 1884 r=$08 v=$04
+ X"000002800904", -- len= 640 r=$09 v=$04
+ X"0000075A0803", -- len= 1882 r=$08 v=$03
+ X"000000700A00", -- len= 112 r=$0A v=$00
+ X"000000A3073C", -- len= 163 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000000073C", -- len= 0 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"0000016D0903", -- len= 365 r=$09 v=$03
+ X"000000C700E3", -- len= 199 r=$00 v=$E3
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000001B50807", -- len= 437 r=$08 v=$07
+ X"0000027C02C5", -- len= 636 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002600806", -- len= 608 r=$08 v=$06
+ X"0000027E0906", -- len= 638 r=$09 v=$06
+ X"0000075E0805", -- len= 1886 r=$08 v=$05
+ X"0000027F0905", -- len= 639 r=$09 v=$05
+ X"0000075B0804", -- len= 1883 r=$08 v=$04
+ X"0000027F0904", -- len= 639 r=$09 v=$04
+ X"0000075D0803", -- len= 1885 r=$08 v=$03
+ X"0000027F0903", -- len= 639 r=$09 v=$03
+ X"0000027700F0", -- len= 631 r=$00 v=$F0
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000050807", -- len= 5 r=$08 v=$07
+ X"0000027B0227", -- len= 635 r=$02 v=$27
+ X"000000010303", -- len= 1 r=$03 v=$03
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002600806", -- len= 608 r=$08 v=$06
+ X"0000027F0906", -- len= 639 r=$09 v=$06
+ X"000005C30738", -- len= 1475 r=$07 v=$38
+ X"0000006704BE", -- len= 103 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001450A08", -- len= 325 r=$0A v=$08
+ X"000000340805", -- len= 52 r=$08 v=$05
+ X"000002420A07", -- len= 578 r=$0A v=$07
+ X"0000003E0905", -- len= 62 r=$09 v=$05
+ X"000001120497", -- len= 274 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000016E0A08", -- len= 366 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"00000138047F", -- len= 312 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000001390A08", -- len= 313 r=$0A v=$08
+ X"0000001C0804", -- len= 28 r=$08 v=$04
+ X"0000025C0A07", -- len= 604 r=$0A v=$07
+ X"000000230904", -- len= 35 r=$09 v=$04
+ X"00000114045F", -- len= 276 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013A0A08", -- len= 314 r=$0A v=$08
+ X"000002770A07", -- len= 631 r=$0A v=$07
+ X"000001390471", -- len= 313 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013A0A08", -- len= 314 r=$0A v=$08
+ X"0000001A0803", -- len= 26 r=$08 v=$03
+ X"0000025C0A07", -- len= 604 r=$0A v=$07
+ X"000000250903", -- len= 37 r=$09 v=$03
+ X"000002510A06", -- len= 593 r=$0A v=$06
+ X"0000000000F0", -- len= 0 r=$00 v=$F0
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000290807", -- len= 41 r=$08 v=$07
+ X"0000024D0A05", -- len= 589 r=$0A v=$05
+ X"0000002E02C5", -- len= 46 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"000002450A04", -- len= 581 r=$0A v=$04
+ X"0000001C0806", -- len= 28 r=$08 v=$06
+ X"0000025C0A03", -- len= 604 r=$0A v=$03
+ X"000000230906", -- len= 35 r=$09 v=$06
+ X"000002520A02", -- len= 594 r=$0A v=$02
+ X"000002760A01", -- len= 630 r=$0A v=$01
+ X"000002790A00", -- len= 633 r=$0A v=$00
+ X"0000001C0805", -- len= 28 r=$08 v=$05
+ X"0000027D0905", -- len= 637 r=$09 v=$05
+ X"0000075C0804", -- len= 1884 r=$08 v=$04
+ X"000002800904", -- len= 640 r=$09 v=$04
+ X"000005900A00", -- len= 1424 r=$0A v=$00
+ X"000000B2073C", -- len= 178 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000000073C", -- len= 0 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"0000011A0803", -- len= 282 r=$08 v=$03
+ X"0000027F0903", -- len= 639 r=$09 v=$03
+ X"00000277000D", -- len= 631 r=$00 v=$0D
+ X"000000010101", -- len= 1 r=$01 v=$01
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"0000027C021B", -- len= 636 r=$02 v=$1B
+ X"000000010302", -- len= 1 r=$03 v=$02
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002620806", -- len= 610 r=$08 v=$06
+ X"0000027F0906", -- len= 639 r=$09 v=$06
+ X"0000075B0805", -- len= 1883 r=$08 v=$05
+ X"0000027F0905", -- len= 639 r=$09 v=$05
+ X"0000075E0804", -- len= 1886 r=$08 v=$04
+ X"0000027E0904", -- len= 638 r=$09 v=$04
+ X"0000075C0803", -- len= 1884 r=$08 v=$03
+ X"0000027E0903", -- len= 638 r=$09 v=$03
+ X"000001C4000D", -- len= 452 r=$00 v=$0D
+ X"000000000101", -- len= 0 r=$01 v=$01
+ X"000000B80807", -- len= 184 r=$08 v=$07
+ X"0000027B02C5", -- len= 635 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002620806", -- len= 610 r=$08 v=$06
+ X"000002800906", -- len= 640 r=$09 v=$06
+ X"0000075B0805", -- len= 1883 r=$08 v=$05
+ X"0000027F0905", -- len= 639 r=$09 v=$05
+ X"0000075D0804", -- len= 1885 r=$08 v=$04
+ X"0000027F0904", -- len= 639 r=$09 v=$04
+ X"0000075B0803", -- len= 1883 r=$08 v=$03
+ X"0000027F0903", -- len= 639 r=$09 v=$03
+ X"0000027900B4", -- len= 633 r=$00 v=$B4
+ X"000000010100", -- len= 1 r=$01 v=$00
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"0000027A0227", -- len= 634 r=$02 v=$27
+ X"000000010303", -- len= 1 r=$03 v=$03
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"000002610806", -- len= 609 r=$08 v=$06
+ X"0000027F0906", -- len= 639 r=$09 v=$06
+ X"0000075B0805", -- len= 1883 r=$08 v=$05
+ X"000002810905", -- len= 641 r=$09 v=$05
+ X"000005530738", -- len= 1363 r=$07 v=$38
+ X"000000A304BE", -- len= 163 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001450A08", -- len= 325 r=$0A v=$08
+ X"0000009A0804", -- len= 154 r=$08 v=$04
+ X"000001DC0A07", -- len= 476 r=$0A v=$07
+ X"000000A20904", -- len= 162 r=$09 v=$04
+ X"000000940497", -- len= 148 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"00000137047F", -- len= 311 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013C0A08", -- len= 316 r=$0A v=$08
+ X"000000990803", -- len= 153 r=$08 v=$03
+ X"000001DC0A07", -- len= 476 r=$0A v=$07
+ X"000000A30903", -- len= 163 r=$09 v=$03
+ X"00000096045F", -- len= 150 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013A0A08", -- len= 314 r=$0A v=$08
+ X"0000002D00B4", -- len= 45 r=$00 v=$B4
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000007A0807", -- len= 122 r=$08 v=$07
+ X"000001D00A07", -- len= 464 r=$0A v=$07
+ X"000000AB02C5", -- len= 171 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"0000008A0471", -- len= 138 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000001370A08", -- len= 311 r=$0A v=$08
+ X"0000009A0806", -- len= 154 r=$08 v=$06
+ X"000001DE0A07", -- len= 478 r=$0A v=$07
+ X"000000A20906", -- len= 162 r=$09 v=$06
+ X"000001D40A06", -- len= 468 r=$0A v=$06
+ X"000002780A05", -- len= 632 r=$0A v=$05
+ X"000002750A04", -- len= 629 r=$0A v=$04
+ X"0000009A0805", -- len= 154 r=$08 v=$05
+ X"000001DD0A03", -- len= 477 r=$0A v=$03
+ X"000000A20905", -- len= 162 r=$09 v=$05
+ X"000001D60A02", -- len= 470 r=$0A v=$02
+ X"000002750A01", -- len= 629 r=$0A v=$01
+ X"000002780A00", -- len= 632 r=$0A v=$00
+ X"0000009A0804", -- len= 154 r=$08 v=$04
+ X"000002800904", -- len= 640 r=$09 v=$04
+ X"0000075C0803", -- len= 1884 r=$08 v=$03
+ X"0000027D0903", -- len= 637 r=$09 v=$03
+ X"0000027700CA", -- len= 631 r=$00 v=$CA
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000050807", -- len= 5 r=$08 v=$07
+ X"0000027C021B", -- len= 636 r=$02 v=$1B
+ X"000000010302", -- len= 1 r=$03 v=$02
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"0000003D0A00", -- len= 61 r=$0A v=$00
+ X"0000008B073C", -- len= 139 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000000073C", -- len= 0 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"000001990806", -- len= 409 r=$08 v=$06
+ X"0000027F0906", -- len= 639 r=$09 v=$06
+ X"0000075D0805", -- len= 1885 r=$08 v=$05
+ X"0000027F0905", -- len= 639 r=$09 v=$05
+ X"0000075B0804", -- len= 1883 r=$08 v=$04
+ X"0000027F0904", -- len= 639 r=$09 v=$04
+ X"0000075D0803", -- len= 1885 r=$08 v=$03
+ X"000002800903", -- len= 640 r=$09 v=$03
+ X"0000027600E3", -- len= 630 r=$00 v=$E3
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000040807", -- len= 4 r=$08 v=$07
+ X"0000027C02C5", -- len= 636 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000030907", -- len= 3 r=$09 v=$07
+ X"000002610806", -- len= 609 r=$08 v=$06
+ X"0000027E0906", -- len= 638 r=$09 v=$06
+ X"0000075D0805", -- len= 1885 r=$08 v=$05
+ X"0000027F0905", -- len= 639 r=$09 v=$05
+ X"0000075B0804", -- len= 1883 r=$08 v=$04
+ X"000002800904", -- len= 640 r=$09 v=$04
+ X"0000075D0803", -- len= 1885 r=$08 v=$03
+ X"000000290738", -- len= 41 r=$07 v=$38
+ X"0000006904BE", -- len= 105 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001450A08", -- len= 325 r=$0A v=$08
+ X"000000EE0903", -- len= 238 r=$09 v=$03
+ X"0000018A0A07", -- len= 394 r=$0A v=$07
+ X"000000EE00F0", -- len= 238 r=$00 v=$F0
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000040807", -- len= 4 r=$08 v=$07
+ X"0000008F0497", -- len= 143 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000016F0A08", -- len= 367 r=$0A v=$08
+ X"000000F60227", -- len= 246 r=$02 v=$27
+ X"000000010303", -- len= 1 r=$03 v=$03
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"000001AE0A07", -- len= 430 r=$0A v=$07
+ X"000000E60806", -- len= 230 r=$08 v=$06
+ X"0000006B047F", -- len= 107 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000016B0A08", -- len= 363 r=$0A v=$08
+ X"000000EE0906", -- len= 238 r=$09 v=$06
+ X"0000018A0A07", -- len= 394 r=$0A v=$07
+ X"00000137045F", -- len= 311 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013A0A08", -- len= 314 r=$0A v=$08
+ X"000002780A07", -- len= 632 r=$0A v=$07
+ X"000000E50805", -- len= 229 r=$08 v=$05
+ X"000000530471", -- len= 83 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000001390A08", -- len= 313 r=$0A v=$08
+ X"000000ED0905", -- len= 237 r=$09 v=$05
+ X"000001890A07", -- len= 393 r=$0A v=$07
+ X"000002760A06", -- len= 630 r=$0A v=$06
+ X"000000DD0738", -- len= 221 r=$07 v=$38
+ X"000000D004BE", -- len= 208 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"000001430A08", -- len= 323 r=$0A v=$08
+ X"000000E70804", -- len= 231 r=$08 v=$04
+ X"000001910A07", -- len= 401 r=$0A v=$07
+ X"000000EE0904", -- len= 238 r=$09 v=$04
+ X"000000480497", -- len= 72 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000002750A07", -- len= 629 r=$0A v=$07
+ X"00000137047F", -- len= 311 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013C0A08", -- len= 316 r=$0A v=$08
+ X"000000E50803", -- len= 229 r=$08 v=$03
+ X"000001910A07", -- len= 401 r=$0A v=$07
+ X"000000EE0903", -- len= 238 r=$09 v=$03
+ X"00000048045F", -- len= 72 r=$04 v=$5F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"0000013B0A08", -- len= 315 r=$0A v=$08
+ X"000000EE000D", -- len= 238 r=$00 v=$0D
+ X"000000010101", -- len= 1 r=$01 v=$01
+ X"000000030807", -- len= 3 r=$08 v=$07
+ X"000001B70A07", -- len= 439 r=$0A v=$07
+ X"000000F702C5", -- len= 247 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000040907", -- len= 4 r=$09 v=$07
+ X"000000580471", -- len= 88 r=$04 v=$71
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000016A0A08", -- len= 362 r=$0A v=$08
+ X"000000E50806", -- len= 229 r=$08 v=$06
+ X"000001910A07", -- len= 401 r=$0A v=$07
+ X"000000EF0906", -- len= 239 r=$09 v=$06
+ X"000001890A06", -- len= 393 r=$0A v=$06
+ X"000002760A05", -- len= 630 r=$0A v=$05
+ X"000002780A04", -- len= 632 r=$0A v=$04
+ X"000000E50805", -- len= 229 r=$08 v=$05
+ X"000001900A03", -- len= 400 r=$0A v=$03
+ X"000000EE0905", -- len= 238 r=$09 v=$05
+ X"0000018B0A02", -- len= 395 r=$0A v=$02
+ X"000002760A01", -- len= 630 r=$0A v=$01
+ X"000002750A00", -- len= 629 r=$0A v=$00
+ X"000000E80804", -- len= 232 r=$08 v=$04
+ X"0000027D0904", -- len= 637 r=$09 v=$04
+ X"0000075C0803", -- len= 1884 r=$08 v=$03
+ X"000002800903", -- len= 640 r=$09 v=$03
+ X"00000278002E", -- len= 632 r=$00 v=$2E
+ X"000000000101", -- len= 0 r=$01 v=$01
+ X"000000040807", -- len= 4 r=$08 v=$07
+ X"000002AD02E0", -- len= 685 r=$02 v=$E0
+ X"000000000301", -- len= 0 r=$03 v=$01
+ X"000000050907", -- len= 5 r=$09 v=$07
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"0000007C073C", -- len= 124 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"00000000073C", -- len= 0 r=$07 v=$3C
+ X"000000000A00", -- len= 0 r=$0A v=$00
+ X"000001E60806", -- len= 486 r=$08 v=$06
+ X"0000027E0906", -- len= 638 r=$09 v=$06
+ X"0000075B0805", -- len= 1883 r=$08 v=$05
+ X"0000027F0905", -- len= 639 r=$09 v=$05
+ X"0000075D0804", -- len= 1885 r=$08 v=$04
+ X"000002800904", -- len= 640 r=$09 v=$04
+ X"0000075B0803", -- len= 1883 r=$08 v=$03
+ X"0000027F0903", -- len= 639 r=$09 v=$03
+ X"0000075D0802", -- len= 1885 r=$08 v=$02
+ X"0000027F0902", -- len= 639 r=$09 v=$02
+ X"0000075B0801", -- len= 1883 r=$08 v=$01
+ X"0000027F0901", -- len= 639 r=$09 v=$01
+ X"0000075D0800", -- len= 1885 r=$08 v=$00
+ X"0000027F0900", -- len= 639 r=$09 v=$00
+ X"00000BFB0800", -- len= 3067 r=$08 v=$00
+ X"000000000900", -- len= 0 r=$09 v=$00
+ X"00000B940738", -- len= 2964 r=$07 v=$38
+ X"000000A304BE", -- len= 163 r=$04 v=$BE
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000001430A08", -- len= 323 r=$0A v=$08
+ X"000002770A07", -- len= 631 r=$0A v=$07
+ X"000001390497", -- len= 313 r=$04 v=$97
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000050A09", -- len= 5 r=$0A v=$09
+ X"0000013A0A08", -- len= 314 r=$0A v=$08
+ X"000002760A07", -- len= 630 r=$0A v=$07
+ X"00000136047F", -- len= 310 r=$04 v=$7F
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000060A09", -- len= 6 r=$0A v=$09
+ X"000000B4073F", -- len= 180 r=$07 v=$3F
+ X"00000009073C", -- len= 9 r=$07 v=$3C
+ X"000000030A00", -- len= 3 r=$0A v=$00
+ X"00000014073D", -- len= 20 r=$07 v=$3D
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"00000013073F", -- len= 19 r=$07 v=$3F
+ X"000000000900", -- len= 0 r=$09 v=$00
+ X"000002B0080D", -- len= 688 r=$08 v=$0D
+ X"000000030050", -- len= 3 r=$00 v=$50
+ X"000000010100", -- len= 1 r=$01 v=$00
+ X"00000004073E", -- len= 4 r=$07 v=$3E
+ X"00000031005A", -- len= 49 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004A0050", -- len= 74 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"00000033005A", -- len= 51 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004D0050", -- len= 77 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"00000031005A", -- len= 49 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C0050", -- len= 76 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"00000031005A", -- len= 49 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004D0050", -- len= 77 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"00000033005A", -- len= 51 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000060800", -- len= 6 r=$08 v=$00
+ X"000000CD073C", -- len= 205 r=$07 v=$3C
+ X"000000A50287", -- len= 165 r=$02 v=$87
+ X"000000010300", -- len= 1 r=$03 v=$00
+ X"000000030906", -- len= 3 r=$09 v=$06
+ X"000002190738", -- len= 537 r=$07 v=$38
+ X"0000005804A0", -- len= 88 r=$04 v=$A0
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000040A06", -- len= 4 r=$0A v=$06
+ X"000001CE0905", -- len= 462 r=$09 v=$05
+ X"000002320A05", -- len= 562 r=$0A v=$05
+ X"000001B3080D", -- len= 435 r=$08 v=$0D
+ X"000000370050", -- len= 55 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004A005A", -- len= 74 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C005A", -- len= 76 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C005A", -- len= 76 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004B005A", -- len= 75 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000060800", -- len= 6 r=$08 v=$00
+ X"000001C70904", -- len= 455 r=$09 v=$04
+ X"000002320A04", -- len= 562 r=$0A v=$04
+ X"00000266080D", -- len= 614 r=$08 v=$0D
+ X"000000000050", -- len= 0 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000000738", -- len= 0 r=$07 v=$38
+ X"0000000E0800", -- len= 14 r=$08 v=$00
+ X"00000040005A", -- len= 64 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C005A", -- len= 76 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004A005A", -- len= 74 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000320050", -- len= 50 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C005A", -- len= 76 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C005A", -- len= 76 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"000001030903", -- len= 259 r=$09 v=$03
+ X"000002320A03", -- len= 562 r=$0A v=$03
+ X"000005A7080D", -- len= 1447 r=$08 v=$0D
+ X"0000000F0902", -- len= 15 r=$09 v=$02
+ X"000000260050", -- len= 38 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C005A", -- len= 76 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000320050", -- len= 50 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C005A", -- len= 76 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004C005A", -- len= 76 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000320050", -- len= 50 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"0000004A005A", -- len= 74 r=$00 v=$5A
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000330050", -- len= 51 r=$00 v=$50
+ X"000000000100", -- len= 0 r=$01 v=$00
+ X"000000060800", -- len= 6 r=$08 v=$00
+ X"000000170A02", -- len= 23 r=$0A v=$02
+ X"000001B50900", -- len= 437 r=$09 v=$00
+ X"000002350A00", -- len= 565 r=$0A v=$00
+ X"000001B80901", -- len= 440 r=$09 v=$01
+ X"0000002F0800", -- len= 47 r=$08 v=$00
+ X"0000007B0739", -- len= 123 r=$07 v=$39
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"000000000739", -- len= 0 r=$07 v=$39
+ X"000000000800", -- len= 0 r=$08 v=$00
+ X"000001840A01", -- len= 388 r=$0A v=$01
+ X"000005AF0900", -- len= 1455 r=$09 v=$00
+ X"000002340A00", -- len= 564 r=$0A v=$00
+ X"000001C60278", -- len= 454 r=$02 v=$78
+ X"000000000300", -- len= 0 r=$03 v=$00
+ X"000000040906", -- len= 4 r=$09 v=$06
+ X"0000023004AA", -- len= 560 r=$04 v=$AA
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000040A06", -- len= 4 r=$0A v=$06
+ X"000001B10905", -- len= 433 r=$09 v=$05
+ X"000002340A05", -- len= 564 r=$0A v=$05
+ X"000005AE0904", -- len= 1454 r=$09 v=$04
+ X"000002340A04", -- len= 564 r=$0A v=$04
+ X"000001C80287", -- len= 456 r=$02 v=$87
+ X"000000000300", -- len= 0 r=$03 v=$00
+ X"000000040906", -- len= 4 r=$09 v=$06
+ X"0000022F04A0", -- len= 559 r=$04 v=$A0
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000040A06", -- len= 4 r=$0A v=$06
+ X"000001B10905", -- len= 433 r=$09 v=$05
+ X"000002310A05", -- len= 561 r=$0A v=$05
+ X"000005B10904", -- len= 1457 r=$09 v=$04
+ X"000002330A04", -- len= 563 r=$0A v=$04
+ X"000005AF0903", -- len= 1455 r=$09 v=$03
+ X"000002340A03", -- len= 564 r=$0A v=$03
+ X"000005AF0902", -- len= 1455 r=$09 v=$02
+ X"000002330A02", -- len= 563 r=$0A v=$02
+ X"000005AF0901", -- len= 1455 r=$09 v=$01
+ X"000002340A01", -- len= 564 r=$0A v=$01
+ X"000005AE0900", -- len= 1454 r=$09 v=$00
+ X"000002340A00", -- len= 564 r=$0A v=$00
+ X"0000118C02C5", -- len= 4492 r=$02 v=$C5
+ X"000000010301", -- len= 1 r=$03 v=$01
+ X"000000030906", -- len= 3 r=$09 v=$06
+ X"0000022F04CA", -- len= 559 r=$04 v=$CA
+ X"000000000500", -- len= 0 r=$05 v=$00
+ X"000000040A06", -- len= 4 r=$0A v=$06
+ X"000001B10905", -- len= 433 r=$09 v=$05
+ X"000002340A05", -- len= 564 r=$0A v=$05
+ X"000005AE0904", -- len= 1454 r=$09 v=$04
+ X"000002340A04", -- len= 564 r=$0A v=$04
+ X"000005AE0903", -- len= 1454 r=$09 v=$03
+ X"000002340A03", -- len= 564 r=$0A v=$03
+ X"000005AF0902", -- len= 1455 r=$09 v=$02
+ X"000002330A02" -- len= 563 r=$0A v=$02
+);
+signal raddr : std_logic_vector(10 downto 0);
+begin
+ process (clk)
+ begin
+ if (clk'event and clk = '1') then
+ if (en = '1') then
+ raddr <= addr;
+ end if;
+ end if;
+ end process;
+ data <= ROM(conv_integer(raddr));
+end syn;
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/cpu68.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/cpu68.vhd
new file mode 100644
index 00000000..03bdfc63
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/cpu68.vhd
@@ -0,0 +1,3962 @@
+--===========================================================================--
+--
+-- S Y N T H E Z I A B L E CPU68 C O R E
+--
+-- www.OpenCores.Org - December 2002
+-- This core adheres to the GNU public license
+--
+-- File name : cpu68.vhd
+--
+-- Purpose : Implements a 6800 compatible CPU core with some
+-- additional instructions found in the 6801
+--
+-- Dependencies : ieee.Std_Logic_1164
+-- ieee.std_logic_unsigned
+--
+-- Author : John E. Kent
+--
+--===========================================================================----
+--
+-- Revision History:
+--
+-- Date: Revision Author
+-- 22 Sep 2002 0.1 John Kent
+--
+-- 30 Oct 2002 0.2 John Kent
+-- made NMI edge triggered
+--
+-- 30 Oct 2002 0.3 John Kent
+-- more corrections to NMI
+-- added wai_wait_state to prevent stack overflow on wai.
+--
+-- 1 Nov 2002 0.4 John Kent
+-- removed WAI states and integrated WAI with the interrupt service routine
+-- replace Data out (do) and Data in (di) register with a single Memory Data (md) reg.
+-- Added Multiply instruction states.
+-- run ALU and CC out of CPU module for timing measurements.
+--
+-- 3 Nov 2002 0.5 John Kent
+-- Memory Data Register was not loaded on Store instructions
+-- SEV and CLV were not defined in the ALU
+-- Overflow Flag on NEG was incorrect
+--
+-- 16th Feb 2003 0.6 John Kent
+-- Rearranged the execution cycle for dual operand instructions
+-- so that occurs during the following fetch cycle.
+-- This allows the reduction of one clock cycle from dual operand
+-- instruction. Note that this also necessitated re-arranging the
+-- program counter so that it is no longer incremented in the ALU.
+-- The effective address has also been re-arranged to include a
+-- separate added. The STD (store accd) now sets the condition codes.
+--
+-- 28th Jun 2003 0.7 John Kent
+-- Added Hold and Halt signals. Hold is used to steal cycles from the
+-- CPU or add wait states. Halt puts the CPU in the inactive state
+-- and is only honoured in the fetch cycle. Both signals are active high.
+--
+-- 9th Jan 2004 0.8 John Kent
+-- Clear instruction did an alu_ld8 rather than an alu_clr, so
+-- the carry bit was not cleared correctly.
+-- This error was picked up by Michael Hassenfratz.
+--
+
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+entity cpu68 is
+ port (
+ clk: in std_logic;
+ rst: in std_logic;
+ rw: out std_logic;
+ vma: out std_logic;
+ address: out std_logic_vector(15 downto 0);
+ data_in: in std_logic_vector(7 downto 0);
+ data_out: out std_logic_vector(7 downto 0);
+ hold: in std_logic;
+ halt: in std_logic;
+ irq: in std_logic;
+ nmi: in std_logic;
+ test_alu: out std_logic_vector(15 downto 0);
+ test_cc: out std_logic_vector(7 downto 0)
+ );
+end;
+
+architecture CPU_ARCH of cpu68 is
+
+ constant SBIT : integer := 7;
+ constant XBIT : integer := 6;
+ constant HBIT : integer := 5;
+ constant IBIT : integer := 4;
+ constant NBIT : integer := 3;
+ constant ZBIT : integer := 2;
+ constant VBIT : integer := 1;
+ constant CBIT : integer := 0;
+
+ type state_type is (reset_state, fetch_state, decode_state,
+ extended_state, indexed_state, read8_state, read16_state, immediate16_state,
+ write8_state, write16_state,
+ execute_state, halt_state, error_state,
+ mul_state, mulea_state, muld_state,
+ mul0_state, mul1_state, mul2_state, mul3_state,
+ mul4_state, mul5_state, mul6_state, mul7_state,
+ jmp_state, jsr_state, jsr1_state,
+ branch_state, bsr_state, bsr1_state,
+ rts_hi_state, rts_lo_state,
+ int_pcl_state, int_pch_state,
+ int_ixl_state, int_ixh_state,
+ int_cc_state, int_acca_state, int_accb_state,
+ int_wai_state, int_mask_state,
+ rti_state, rti_cc_state, rti_acca_state, rti_accb_state,
+ rti_ixl_state, rti_ixh_state,
+ rti_pcl_state, rti_pch_state,
+ pula_state, psha_state, pulb_state, pshb_state,
+ pulx_lo_state, pulx_hi_state, pshx_lo_state, pshx_hi_state,
+ vect_lo_state, vect_hi_state );
+ type addr_type is (idle_ad, fetch_ad, read_ad, write_ad, push_ad, pull_ad, int_hi_ad, int_lo_ad );
+ type dout_type is (md_lo_dout, md_hi_dout, acca_dout, accb_dout, ix_lo_dout, ix_hi_dout, cc_dout, pc_lo_dout, pc_hi_dout );
+ type op_type is (reset_op, fetch_op, latch_op );
+ type acca_type is (reset_acca, load_acca, load_hi_acca, pull_acca, latch_acca );
+ type accb_type is (reset_accb, load_accb, pull_accb, latch_accb );
+ type cc_type is (reset_cc, load_cc, pull_cc, latch_cc );
+ type ix_type is (reset_ix, load_ix, pull_lo_ix, pull_hi_ix, latch_ix );
+ type sp_type is (reset_sp, latch_sp, load_sp );
+ type pc_type is (reset_pc, latch_pc, load_ea_pc, add_ea_pc, pull_lo_pc, pull_hi_pc, inc_pc );
+ type md_type is (reset_md, latch_md, load_md, fetch_first_md, fetch_next_md, shiftl_md );
+ type ea_type is (reset_ea, latch_ea, add_ix_ea, load_accb_ea, inc_ea, fetch_first_ea, fetch_next_ea );
+ type iv_type is (reset_iv, latch_iv, swi_iv, nmi_iv, irq_iv );
+ type nmi_type is (reset_nmi, set_nmi, latch_nmi );
+ type left_type is (acca_left, accb_left, accd_left, md_left, ix_left, sp_left );
+ type right_type is (md_right, zero_right, plus_one_right, accb_right );
+ type alu_type is (alu_add8, alu_sub8, alu_add16, alu_sub16, alu_adc, alu_sbc,
+ alu_and, alu_ora, alu_eor,
+ alu_tst, alu_inc, alu_dec, alu_clr, alu_neg, alu_com,
+ alu_inx, alu_dex, alu_cpx,
+ alu_lsr16, alu_lsl16,
+ alu_ror8, alu_rol8,
+ alu_asr8, alu_asl8, alu_lsr8,
+ alu_sei, alu_cli, alu_sec, alu_clc, alu_sev, alu_clv, alu_tpa, alu_tap,
+ alu_ld8, alu_st8, alu_ld16, alu_st16, alu_nop, alu_daa );
+
+ signal op_code: std_logic_vector(7 downto 0);
+ signal acca: std_logic_vector(7 downto 0);
+ signal accb: std_logic_vector(7 downto 0);
+ signal cc: std_logic_vector(7 downto 0);
+ signal cc_out: std_logic_vector(7 downto 0);
+ signal xreg: std_logic_vector(15 downto 0);
+ signal sp: std_logic_vector(15 downto 0);
+ signal ea: std_logic_vector(15 downto 0);
+ signal pc: std_logic_vector(15 downto 0);
+ signal md: std_logic_vector(15 downto 0);
+ signal left: std_logic_vector(15 downto 0);
+ signal right: std_logic_vector(15 downto 0);
+ signal out_alu: std_logic_vector(15 downto 0);
+ signal iv: std_logic_vector(1 downto 0);
+ signal nmi_req: std_logic;
+ signal nmi_ack: std_logic;
+
+ signal state: state_type;
+ signal next_state: state_type;
+ signal pc_ctrl: pc_type;
+ signal ea_ctrl: ea_type;
+ signal op_ctrl: op_type;
+ signal md_ctrl: md_type;
+ signal acca_ctrl: acca_type;
+ signal accb_ctrl: accb_type;
+ signal ix_ctrl: ix_type;
+ signal cc_ctrl: cc_type;
+ signal sp_ctrl: sp_type;
+ signal iv_ctrl: iv_type;
+ signal left_ctrl: left_type;
+ signal right_ctrl: right_type;
+ signal alu_ctrl: alu_type;
+ signal addr_ctrl: addr_type;
+ signal dout_ctrl: dout_type;
+ signal nmi_ctrl: nmi_type;
+
+
+begin
+
+----------------------------------
+--
+-- Address bus multiplexer
+--
+----------------------------------
+
+addr_mux: process( clk, addr_ctrl, pc, ea, sp, iv )
+begin
+ case addr_ctrl is
+ when idle_ad =>
+ address <= "1111111111111111";
+ vma <= '0';
+ rw <= '1';
+ when fetch_ad =>
+ address <= pc;
+ vma <= '1';
+ rw <= '1';
+ when read_ad =>
+ address <= ea;
+ vma <= '1';
+ rw <= '1';
+ when write_ad =>
+ address <= ea;
+ vma <= '1';
+ rw <= '0';
+ when push_ad =>
+ address <= sp;
+ vma <= '1';
+ rw <= '0';
+ when pull_ad =>
+ address <= sp;
+ vma <= '1';
+ rw <= '1';
+ when int_hi_ad =>
+ address <= "1111111111111" & iv & "0";
+ vma <= '1';
+ rw <= '1';
+ when int_lo_ad =>
+ address <= "1111111111111" & iv & "1";
+ vma <= '1';
+ rw <= '1';
+ when others =>
+ address <= "1111111111111111";
+ vma <= '0';
+ rw <= '1';
+ end case;
+end process;
+
+--------------------------------
+--
+-- Data Bus output
+--
+--------------------------------
+dout_mux : process( clk, dout_ctrl, md, acca, accb, xreg, pc, cc )
+begin
+ case dout_ctrl is
+ when md_hi_dout => -- alu output
+ data_out <= md(15 downto 8);
+ when md_lo_dout =>
+ data_out <= md(7 downto 0);
+ when acca_dout => -- accumulator a
+ data_out <= acca;
+ when accb_dout => -- accumulator b
+ data_out <= accb;
+ when ix_lo_dout => -- index reg
+ data_out <= xreg(7 downto 0);
+ when ix_hi_dout => -- index reg
+ data_out <= xreg(15 downto 8);
+ when cc_dout => -- condition codes
+ data_out <= cc;
+ when pc_lo_dout => -- low order pc
+ data_out <= pc(7 downto 0);
+ when pc_hi_dout => -- high order pc
+ data_out <= pc(15 downto 8);
+ when others =>
+ data_out <= "00000000";
+ end case;
+end process;
+
+
+----------------------------------
+--
+-- Program Counter Control
+--
+----------------------------------
+
+pc_mux: process( clk, pc_ctrl, pc, out_alu, data_in, ea, hold )
+variable tempof : std_logic_vector(15 downto 0);
+variable temppc : std_logic_vector(15 downto 0);
+begin
+ case pc_ctrl is
+ when add_ea_pc =>
+ if ea(7) = '0' then
+ tempof := "00000000" & ea(7 downto 0);
+ else
+ tempof := "11111111" & ea(7 downto 0);
+ end if;
+ when inc_pc =>
+ tempof := "0000000000000001";
+ when others =>
+ tempof := "0000000000000000";
+ end case;
+
+ case pc_ctrl is
+ when reset_pc =>
+ temppc := "1111111111111110";
+ when load_ea_pc =>
+ temppc := ea;
+ when pull_lo_pc =>
+ temppc(7 downto 0) := data_in;
+ temppc(15 downto 8) := pc(15 downto 8);
+ when pull_hi_pc =>
+ temppc(7 downto 0) := pc(7 downto 0);
+ temppc(15 downto 8) := data_in;
+ when others =>
+ temppc := pc;
+ end case;
+
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ pc <= pc;
+ else
+ pc <= temppc + tempof;
+ end if;
+ end if;
+end process;
+
+----------------------------------
+--
+-- Effective Address Control
+--
+----------------------------------
+
+ea_mux: process( clk, ea_ctrl, ea, out_alu, data_in, accb, xreg, hold )
+variable tempind : std_logic_vector(15 downto 0);
+variable tempea : std_logic_vector(15 downto 0);
+begin
+ case ea_ctrl is
+ when add_ix_ea =>
+ tempind := "00000000" & ea(7 downto 0);
+ when inc_ea =>
+ tempind := "0000000000000001";
+ when others =>
+ tempind := "0000000000000000";
+ end case;
+
+ case ea_ctrl is
+ when reset_ea =>
+ tempea := "0000000000000000";
+ when load_accb_ea =>
+ tempea := "00000000" & accb(7 downto 0);
+ when add_ix_ea =>
+ tempea := xreg;
+ when fetch_first_ea =>
+ tempea(7 downto 0) := data_in;
+ tempea(15 downto 8) := "00000000";
+ when fetch_next_ea =>
+ tempea(7 downto 0) := data_in;
+ tempea(15 downto 8) := ea(7 downto 0);
+ when others =>
+ tempea := ea;
+ end case;
+
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ ea <= ea;
+ else
+ ea <= tempea + tempind;
+ end if;
+ end if;
+end process;
+
+--------------------------------
+--
+-- Accumulator A
+--
+--------------------------------
+acca_mux : process( clk, acca_ctrl, out_alu, acca, data_in, hold )
+begin
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ acca <= acca;
+ else
+ case acca_ctrl is
+ when reset_acca =>
+ acca <= "00000000";
+ when load_acca =>
+ acca <= out_alu(7 downto 0);
+ when load_hi_acca =>
+ acca <= out_alu(15 downto 8);
+ when pull_acca =>
+ acca <= data_in;
+ when others =>
+-- when latch_acca =>
+ acca <= acca;
+ end case;
+ end if;
+ end if;
+end process;
+
+--------------------------------
+--
+-- Accumulator B
+--
+--------------------------------
+accb_mux : process( clk, accb_ctrl, out_alu, accb, data_in, hold )
+begin
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ accb <= accb;
+ else
+ case accb_ctrl is
+ when reset_accb =>
+ accb <= "00000000";
+ when load_accb =>
+ accb <= out_alu(7 downto 0);
+ when pull_accb =>
+ accb <= data_in;
+ when others =>
+-- when latch_accb =>
+ accb <= accb;
+ end case;
+ end if;
+ end if;
+end process;
+
+--------------------------------
+--
+-- X Index register
+--
+--------------------------------
+ix_mux : process( clk, ix_ctrl, out_alu, xreg, data_in, hold )
+begin
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ xreg <= xreg;
+ else
+ case ix_ctrl is
+ when reset_ix =>
+ xreg <= "0000000000000000";
+ when load_ix =>
+ xreg <= out_alu(15 downto 0);
+ when pull_hi_ix =>
+ xreg(15 downto 8) <= data_in;
+ when pull_lo_ix =>
+ xreg(7 downto 0) <= data_in;
+ when others =>
+-- when latch_ix =>
+ xreg <= xreg;
+ end case;
+ end if;
+ end if;
+end process;
+
+--------------------------------
+--
+-- stack pointer
+--
+--------------------------------
+sp_mux : process( clk, sp_ctrl, out_alu, hold )
+begin
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ sp <= sp;
+ else
+ case sp_ctrl is
+ when reset_sp =>
+ sp <= "0000000000000000";
+ when load_sp =>
+ sp <= out_alu(15 downto 0);
+ when others =>
+-- when latch_sp =>
+ sp <= sp;
+ end case;
+ end if;
+ end if;
+end process;
+
+--------------------------------
+--
+-- Memory Data
+--
+--------------------------------
+md_mux : process( clk, md_ctrl, out_alu, data_in, md, hold )
+begin
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ md <= md;
+ else
+ case md_ctrl is
+ when reset_md =>
+ md <= "0000000000000000";
+ when load_md =>
+ md <= out_alu(15 downto 0);
+ when fetch_first_md =>
+ md(15 downto 8) <= "00000000";
+ md(7 downto 0) <= data_in;
+ when fetch_next_md =>
+ md(15 downto 8) <= md(7 downto 0);
+ md(7 downto 0) <= data_in;
+ when shiftl_md =>
+ md(15 downto 1) <= md(14 downto 0);
+ md(0) <= '0';
+ when others =>
+-- when latch_md =>
+ md <= md;
+ end case;
+ end if;
+ end if;
+end process;
+
+
+----------------------------------
+--
+-- Condition Codes
+--
+----------------------------------
+
+cc_mux: process( clk, cc_ctrl, cc_out, cc, data_in, hold )
+begin
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ cc <= cc;
+ else
+ case cc_ctrl is
+ when reset_cc =>
+ cc <= "11000000";
+ when load_cc =>
+ cc <= cc_out;
+ when pull_cc =>
+ cc <= data_in;
+ when others =>
+-- when latch_cc =>
+ cc <= cc;
+ end case;
+ end if;
+ end if;
+end process;
+
+----------------------------------
+--
+-- interrupt vector
+--
+----------------------------------
+
+iv_mux: process( clk, iv_ctrl, hold )
+begin
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ iv <= iv;
+ else
+ case iv_ctrl is
+ when reset_iv =>
+ iv <= "11";
+ when nmi_iv =>
+ iv <= "10";
+ when swi_iv =>
+ iv <= "01";
+ when irq_iv =>
+ iv <= "00";
+ when others =>
+ iv <= iv;
+ end case;
+ end if;
+ end if;
+end process;
+
+----------------------------------
+--
+-- op code fetch
+--
+----------------------------------
+
+op_fetch: process( clk, data_in, op_ctrl, op_code, hold )
+begin
+ if clk'event and clk = '0' then
+ if hold = '1' then
+ op_code <= op_code;
+ else
+ case op_ctrl is
+ when reset_op =>
+ op_code <= "00000001"; -- nop
+ when fetch_op =>
+ op_code <= data_in;
+ when others =>
+-- when latch_op =>
+ op_code <= op_code;
+ end case;
+ end if;
+ end if;
+end process;
+
+----------------------------------
+--
+-- Left Mux
+--
+----------------------------------
+
+left_mux: process( left_ctrl, acca, accb, xreg, sp, pc, ea, md )
+begin
+ case left_ctrl is
+ when acca_left =>
+ left(15 downto 8) <= "00000000";
+ left(7 downto 0) <= acca;
+ when accb_left =>
+ left(15 downto 8) <= "00000000";
+ left(7 downto 0) <= accb;
+ when accd_left =>
+ left(15 downto 8) <= acca;
+ left(7 downto 0) <= accb;
+ when ix_left =>
+ left <= xreg;
+ when sp_left =>
+ left <= sp;
+ when others =>
+-- when md_left =>
+ left <= md;
+ end case;
+end process;
+----------------------------------
+--
+-- Right Mux
+--
+----------------------------------
+
+right_mux: process( right_ctrl, data_in, md, accb, ea )
+begin
+ case right_ctrl is
+ when zero_right =>
+ right <= "0000000000000000";
+ when plus_one_right =>
+ right <= "0000000000000001";
+ when accb_right =>
+ right <= "00000000" & accb;
+ when others =>
+-- when md_right =>
+ right <= md;
+ end case;
+end process;
+
+----------------------------------
+--
+-- Arithmetic Logic Unit
+--
+----------------------------------
+
+mux_alu: process( alu_ctrl, cc, left, right, out_alu, cc_out )
+variable valid_lo, valid_hi : boolean;
+variable carry_in : std_logic;
+variable daa_reg : std_logic_vector(7 downto 0);
+begin
+
+ case alu_ctrl is
+ when alu_adc | alu_sbc |
+ alu_rol8 | alu_ror8 =>
+ carry_in := cc(CBIT);
+ when others =>
+ carry_in := '0';
+ end case;
+
+ valid_lo := left(3 downto 0) <= 9;
+ valid_hi := left(7 downto 4) <= 9;
+
+ if (cc(CBIT) = '0') then
+ if( cc(HBIT) = '1' ) then
+ if valid_hi then
+ daa_reg := "00000110";
+ else
+ daa_reg := "01100110";
+ end if;
+ else
+ if valid_lo then
+ if valid_hi then
+ daa_reg := "00000000";
+ else
+ daa_reg := "01100000";
+ end if;
+ else
+ if( left(7 downto 4) <= 8 ) then
+ daa_reg := "00000110";
+ else
+ daa_reg := "01100110";
+ end if;
+ end if;
+ end if;
+ else
+ if ( cc(HBIT) = '1' )then
+ daa_reg := "01100110";
+ else
+ if valid_lo then
+ daa_reg := "01100000";
+ else
+ daa_reg := "01100110";
+ end if;
+ end if;
+ end if;
+
+ case alu_ctrl is
+ when alu_add8 | alu_inc |
+ alu_add16 | alu_inx |
+ alu_adc =>
+ out_alu <= left + right + ("000000000000000" & carry_in);
+ when alu_sub8 | alu_dec |
+ alu_sub16 | alu_dex |
+ alu_sbc | alu_cpx =>
+ out_alu <= left - right - ("000000000000000" & carry_in);
+ when alu_and =>
+ out_alu <= left and right; -- and/bit
+ when alu_ora =>
+ out_alu <= left or right; -- or
+ when alu_eor =>
+ out_alu <= left xor right; -- eor/xor
+ when alu_lsl16 | alu_asl8 | alu_rol8 =>
+ out_alu <= left(14 downto 0) & carry_in; -- rol8/asl8/lsl16
+ when alu_lsr16 | alu_lsr8 =>
+ out_alu <= carry_in & left(15 downto 1); -- lsr
+ when alu_ror8 =>
+ out_alu <= "00000000" & carry_in & left(7 downto 1); -- ror
+ when alu_asr8 =>
+ out_alu <= "00000000" & left(7) & left(7 downto 1); -- asr
+ when alu_neg =>
+ out_alu <= right - left; -- neg (right=0)
+ when alu_com =>
+ out_alu <= not left;
+ when alu_clr | alu_ld8 | alu_ld16 =>
+ out_alu <= right; -- clr, ld
+ when alu_st8 | alu_st16 =>
+ out_alu <= left;
+ when alu_daa =>
+ out_alu <= left + ("00000000" & daa_reg);
+ when alu_tpa =>
+ out_alu <= "00000000" & cc;
+ when others =>
+ out_alu <= left; -- nop
+ end case;
+
+ --
+ -- carry bit
+ --
+ case alu_ctrl is
+ when alu_add8 | alu_adc =>
+ cc_out(CBIT) <= (left(7) and right(7)) or
+ (left(7) and not out_alu(7)) or
+ (right(7) and not out_alu(7));
+ when alu_sub8 | alu_sbc =>
+ cc_out(CBIT) <= ((not left(7)) and right(7)) or
+ ((not left(7)) and out_alu(7)) or
+ (right(7) and out_alu(7));
+ when alu_add16 =>
+ cc_out(CBIT) <= (left(15) and right(15)) or
+ (left(15) and not out_alu(15)) or
+ (right(15) and not out_alu(15));
+ when alu_sub16 =>
+ cc_out(CBIT) <= ((not left(15)) and right(15)) or
+ ((not left(15)) and out_alu(15)) or
+ (right(15) and out_alu(15));
+ when alu_ror8 | alu_lsr16 | alu_lsr8 | alu_asr8 =>
+ cc_out(CBIT) <= left(0);
+ when alu_rol8 | alu_asl8 =>
+ cc_out(CBIT) <= left(7);
+ when alu_lsl16 =>
+ cc_out(CBIT) <= left(15);
+ when alu_com =>
+ cc_out(CBIT) <= '1';
+ when alu_neg | alu_clr =>
+ cc_out(CBIT) <= out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or
+ out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0);
+ when alu_daa =>
+ if ( daa_reg(7 downto 4) = "0110" ) then
+ cc_out(CBIT) <= '1';
+ else
+ cc_out(CBIT) <= '0';
+ end if;
+ when alu_sec =>
+ cc_out(CBIT) <= '1';
+ when alu_clc =>
+ cc_out(CBIT) <= '0';
+ when alu_tap =>
+ cc_out(CBIT) <= left(CBIT);
+ when others => -- carry is not affected by cpx
+ cc_out(CBIT) <= cc(CBIT);
+ end case;
+ --
+ -- Zero flag
+ --
+ case alu_ctrl is
+ when alu_add8 | alu_sub8 |
+ alu_adc | alu_sbc |
+ alu_and | alu_ora | alu_eor |
+ alu_inc | alu_dec |
+ alu_neg | alu_com | alu_clr |
+ alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 |
+ alu_ld8 | alu_st8 =>
+ cc_out(ZBIT) <= not( out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or
+ out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) );
+ when alu_add16 | alu_sub16 |
+ alu_lsl16 | alu_lsr16 |
+ alu_inx | alu_dex |
+ alu_ld16 | alu_st16 | alu_cpx =>
+ cc_out(ZBIT) <= not( out_alu(15) or out_alu(14) or out_alu(13) or out_alu(12) or
+ out_alu(11) or out_alu(10) or out_alu(9) or out_alu(8) or
+ out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or
+ out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) );
+ when alu_tap =>
+ cc_out(ZBIT) <= left(ZBIT);
+ when others =>
+ cc_out(ZBIT) <= cc(ZBIT);
+ end case;
+
+ --
+ -- negative flag
+ --
+ case alu_ctrl is
+ when alu_add8 | alu_sub8 |
+ alu_adc | alu_sbc |
+ alu_and | alu_ora | alu_eor |
+ alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 |
+ alu_inc | alu_dec | alu_neg | alu_com | alu_clr |
+ alu_ld8 | alu_st8 =>
+ cc_out(NBIT) <= out_alu(7);
+ when alu_add16 | alu_sub16 |
+ alu_lsl16 | alu_lsr16 |
+ alu_ld16 | alu_st16 | alu_cpx =>
+ cc_out(NBIT) <= out_alu(15);
+ when alu_tap =>
+ cc_out(NBIT) <= left(NBIT);
+ when others =>
+ cc_out(NBIT) <= cc(NBIT);
+ end case;
+
+ --
+ -- Interrupt mask flag
+ --
+ case alu_ctrl is
+ when alu_sei =>
+ cc_out(IBIT) <= '1'; -- set interrupt mask
+ when alu_cli =>
+ cc_out(IBIT) <= '0'; -- clear interrupt mask
+ when alu_tap =>
+ cc_out(IBIT) <= left(IBIT);
+ when others =>
+ cc_out(IBIT) <= cc(IBIT); -- interrupt mask
+ end case;
+
+ --
+ -- Half Carry flag
+ --
+ case alu_ctrl is
+ when alu_add8 | alu_adc =>
+ cc_out(HBIT) <= (left(3) and right(3)) or
+ (right(3) and not out_alu(3)) or
+ (left(3) and not out_alu(3));
+ when alu_tap =>
+ cc_out(HBIT) <= left(HBIT);
+ when others =>
+ cc_out(HBIT) <= cc(HBIT);
+ end case;
+
+ --
+ -- Overflow flag
+ --
+ case alu_ctrl is
+ when alu_add8 | alu_adc =>
+ cc_out(VBIT) <= (left(7) and right(7) and (not out_alu(7))) or
+ ((not left(7)) and (not right(7)) and out_alu(7));
+ when alu_sub8 | alu_sbc =>
+ cc_out(VBIT) <= (left(7) and (not right(7)) and (not out_alu(7))) or
+ ((not left(7)) and right(7) and out_alu(7));
+ when alu_add16 =>
+ cc_out(VBIT) <= (left(15) and right(15) and (not out_alu(15))) or
+ ((not left(15)) and (not right(15)) and out_alu(15));
+ when alu_sub16 | alu_cpx =>
+ cc_out(VBIT) <= (left(15) and (not right(15)) and (not out_alu(15))) or
+ ((not left(15)) and right(15) and out_alu(15));
+ when alu_inc =>
+ cc_out(VBIT) <= ((not left(7)) and left(6) and left(5) and left(4) and
+ left(3) and left(2) and left(1) and left(0));
+ when alu_dec | alu_neg =>
+ cc_out(VBIT) <= (left(7) and (not left(6)) and (not left(5)) and (not left(4)) and
+ (not left(3)) and (not left(2)) and (not left(1)) and (not left(0)));
+ when alu_asr8 =>
+ cc_out(VBIT) <= left(0) xor left(7);
+ when alu_lsr8 | alu_lsr16 =>
+ cc_out(VBIT) <= left(0);
+ when alu_ror8 =>
+ cc_out(VBIT) <= left(0) xor cc(CBIT);
+ when alu_lsl16 =>
+ cc_out(VBIT) <= left(15) xor left(14);
+ when alu_rol8 | alu_asl8 =>
+ cc_out(VBIT) <= left(7) xor left(6);
+ when alu_tap =>
+ cc_out(VBIT) <= left(VBIT);
+ when alu_and | alu_ora | alu_eor | alu_com |
+ alu_st8 | alu_st16 | alu_ld8 | alu_ld16 |
+ alu_clv =>
+ cc_out(VBIT) <= '0';
+ when alu_sev =>
+ cc_out(VBIT) <= '1';
+ when others =>
+ cc_out(VBIT) <= cc(VBIT);
+ end case;
+
+ case alu_ctrl is
+ when alu_tap =>
+ cc_out(XBIT) <= cc(XBIT) and left(XBIT);
+ cc_out(SBIT) <= left(SBIT);
+ when others =>
+ cc_out(XBIT) <= cc(XBIT) and left(XBIT);
+ cc_out(SBIT) <= cc(SBIT);
+ end case;
+
+ test_alu <= out_alu;
+ test_cc <= cc_out;
+end process;
+
+------------------------------------
+--
+-- Detect Edge of NMI interrupt
+--
+------------------------------------
+
+nmi_handler : process( clk, rst, nmi, nmi_ack )
+begin
+ if clk'event and clk='0' then
+ if hold = '1' then
+ nmi_req <= nmi_req;
+ else
+ if rst='1' then
+ nmi_req <= '0';
+ else
+ if (nmi='1') and (nmi_ack='0') then
+ nmi_req <= '1';
+ else
+ if (nmi='0') and (nmi_ack='1') then
+ nmi_req <= '0';
+ else
+ nmi_req <= nmi_req;
+ end if;
+ end if;
+ end if;
+ end if;
+ end if;
+end process;
+
+------------------------------------
+--
+-- Nmi mux
+--
+------------------------------------
+
+nmi_mux: process( clk, nmi_ctrl, nmi_ack, hold )
+begin
+ if clk'event and clk='0' then
+ if hold = '1' then
+ nmi_ack <= nmi_ack;
+ else
+ case nmi_ctrl is
+ when set_nmi =>
+ nmi_ack <= '1';
+ when reset_nmi =>
+ nmi_ack <= '0';
+ when others =>
+-- when latch_nmi =>
+ nmi_ack <= nmi_ack;
+ end case;
+ end if;
+ end if;
+end process;
+
+------------------------------------
+--
+-- state sequencer
+--
+------------------------------------
+process( state, op_code, cc, ea, irq, nmi_req, nmi_ack, hold, halt )
+ begin
+ case state is
+ when reset_state => -- released from reset
+ -- reset the registers
+ op_ctrl <= reset_op;
+ acca_ctrl <= reset_acca;
+ accb_ctrl <= reset_accb;
+ ix_ctrl <= reset_ix;
+ sp_ctrl <= reset_sp;
+ pc_ctrl <= reset_pc;
+ ea_ctrl <= reset_ea;
+ md_ctrl <= reset_md;
+ iv_ctrl <= reset_iv;
+ nmi_ctrl <= reset_nmi;
+ -- idle the ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= reset_cc;
+ -- idle the bus
+ dout_ctrl <= md_lo_dout;
+ addr_ctrl <= idle_ad;
+ next_state <= vect_hi_state;
+
+ --
+ -- Jump via interrupt vector
+ -- iv holds interrupt type
+ -- fetch PC hi from vector location
+ --
+ when vect_hi_state =>
+ -- default the registers
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ md_ctrl <= latch_md;
+ ea_ctrl <= latch_ea;
+ iv_ctrl <= latch_iv;
+ -- idle the ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- fetch pc low interrupt vector
+ pc_ctrl <= pull_hi_pc;
+ addr_ctrl <= int_hi_ad;
+ dout_ctrl <= pc_hi_dout;
+ next_state <= vect_lo_state;
+ --
+ -- jump via interrupt vector
+ -- iv holds vector type
+ -- fetch PC lo from vector location
+ --
+ when vect_lo_state =>
+ -- default the registers
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ md_ctrl <= latch_md;
+ ea_ctrl <= latch_ea;
+ iv_ctrl <= latch_iv;
+ -- idle the ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- fetch the vector low byte
+ pc_ctrl <= pull_lo_pc;
+ addr_ctrl <= int_lo_ad;
+ dout_ctrl <= pc_lo_dout;
+ next_state <= fetch_state;
+
+ --
+ -- Here to fetch an instruction
+ -- PC points to opcode
+ -- Should service interrupt requests at this point
+ -- either from the timer
+ -- or from the external input.
+ --
+ when fetch_state =>
+ case op_code(7 downto 4) is
+ when "0000" |
+ "0001" |
+ "0010" | -- branch conditional
+ "0011" |
+ "0100" | -- acca single op
+ "0101" | -- accb single op
+ "0110" | -- indexed single op
+ "0111" => -- extended single op
+ -- idle ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+
+ when "1000" | -- acca immediate
+ "1001" | -- acca direct
+ "1010" | -- acca indexed
+ "1011" => -- acca extended
+ case op_code(3 downto 0) is
+ when "0000" => -- suba
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_sub8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0001" => -- cmpa
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_sub8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0010" => -- sbca
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_sbc;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0011" => -- subd
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0100" => -- anda
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_and;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0101" => -- bita
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_and;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0110" => -- ldaa
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_ld8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0111" => -- staa
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1000" => -- eora
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_eor;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1001" => -- adca
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_adc;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1010" => -- oraa
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_ora;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1011" => -- adda
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1100" => -- cpx
+ left_ctrl <= ix_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_cpx;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1101" => -- bsr / jsr
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1110" => -- lds
+ left_ctrl <= sp_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_ld16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ when "1111" => -- sts
+ left_ctrl <= sp_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ end case;
+ when "1100" | -- accb immediate
+ "1101" | -- accb direct
+ "1110" | -- accb indexed
+ "1111" => -- accb extended
+ case op_code(3 downto 0) is
+ when "0000" => -- subb
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_sub8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0001" => -- cmpb
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_sub8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0010" => -- sbcb
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_sbc;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0011" => -- addd
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0100" => -- andb
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_and;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0101" => -- bitb
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_and;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0110" => -- ldab
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_ld8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "0111" => -- stab
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1000" => -- eorb
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_eor;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1001" => -- adcb
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_adc;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1010" => -- orab
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_ora;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1011" => -- addb
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1100" => -- ldd
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_ld16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1101" => -- std
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when "1110" => -- ldx
+ left_ctrl <= ix_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_ld16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= load_ix;
+ sp_ctrl <= latch_sp;
+ when "1111" => -- stx
+ left_ctrl <= ix_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ when others =>
+ left_ctrl <= accb_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ end case;
+ when others =>
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ end case;
+ md_ctrl <= latch_md;
+ -- fetch the op code
+ op_ctrl <= fetch_op;
+ ea_ctrl <= reset_ea;
+ addr_ctrl <= fetch_ad;
+ dout_ctrl <= md_lo_dout;
+ iv_ctrl <= latch_iv;
+ if halt = '1' then
+ pc_ctrl <= latch_pc;
+ nmi_ctrl <= latch_nmi;
+ next_state <= halt_state;
+ -- service non maskable interrupts
+ elsif (nmi_req = '1') and (nmi_ack = '0') then
+ pc_ctrl <= latch_pc;
+ nmi_ctrl <= set_nmi;
+ next_state <= int_pcl_state;
+ -- service maskable interrupts
+ else
+ --
+ -- nmi request is not cleared until nmi input goes low
+ --
+ if(nmi_req = '0') and (nmi_ack='1') then
+ nmi_ctrl <= reset_nmi;
+ else
+ nmi_ctrl <= latch_nmi;
+ end if;
+ --
+ -- IRQ is level sensitive
+ --
+ if (irq = '1') and (cc(IBIT) = '0') then
+ pc_ctrl <= latch_pc;
+ next_state <= int_pcl_state;
+ else
+ -- Advance the PC to fetch next instruction byte
+ pc_ctrl <= inc_pc;
+ next_state <= decode_state;
+ end if;
+ end if;
+ --
+ -- Here to decode instruction
+ -- and fetch next byte of intruction
+ -- whether it be necessary or not
+ --
+ when decode_state =>
+ -- fetch first byte of address or immediate data
+ ea_ctrl <= fetch_first_ea;
+ addr_ctrl <= fetch_ad;
+ dout_ctrl <= md_lo_dout;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ iv_ctrl <= latch_iv;
+ case op_code(7 downto 4) is
+ when "0000" =>
+ md_ctrl <= fetch_first_md;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ case op_code(3 downto 0) is
+ when "0001" => -- nop
+ left_ctrl <= accd_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when "0100" => -- lsrd
+ left_ctrl <= accd_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_lsr16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ when "0101" => -- lsld
+ left_ctrl <= accd_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_lsl16;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ ix_ctrl <= latch_ix;
+ when "0110" => -- tap
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_tap;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when "0111" => -- tpa
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_tpa;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when "1000" => -- inx
+ left_ctrl <= ix_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_inx;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= load_ix;
+ when "1001" => -- dex
+ left_ctrl <= ix_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_dex;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= load_ix;
+ when "1010" => -- clv
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_clv;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when "1011" => -- sev
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_sev;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when "1100" => -- clc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_clc;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when "1101" => -- sec
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_sec;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when "1110" => -- cli
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_cli;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when "1111" => -- sei
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_sei;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ end case;
+ next_state <= fetch_state;
+ -- acca / accb inherent instructions
+ when "0001" =>
+ md_ctrl <= fetch_first_md;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ left_ctrl <= acca_left;
+ right_ctrl <= accb_right;
+ case op_code(3 downto 0) is
+ when "0000" => -- sba
+ alu_ctrl <= alu_sub8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ when "0001" => -- cba
+ alu_ctrl <= alu_sub8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ when "0110" => -- tab
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= load_accb;
+ when "0111" => -- tba
+ alu_ctrl <= alu_ld8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ when "1001" => -- daa
+ alu_ctrl <= alu_daa;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ when "1011" => -- aba
+ alu_ctrl <= alu_add8;
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_acca;
+ accb_ctrl <= latch_accb;
+ when others =>
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end case;
+ next_state <= fetch_state;
+ when "0010" => -- branch conditional
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- increment the pc
+ pc_ctrl <= inc_pc;
+ case op_code(3 downto 0) is
+ when "0000" => -- bra
+ next_state <= branch_state;
+ when "0001" => -- brn
+ next_state <= fetch_state;
+ when "0010" => -- bhi
+ if (cc(CBIT) or cc(ZBIT)) = '0' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "0011" => -- bls
+ if (cc(CBIT) or cc(ZBIT)) = '1' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "0100" => -- bcc/bhs
+ if cc(CBIT) = '0' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "0101" => -- bcs/blo
+ if cc(CBIT) = '1' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "0110" => -- bne
+ if cc(ZBIT) = '0' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "0111" => -- beq
+ if cc(ZBIT) = '1' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "1000" => -- bvc
+ if cc(VBIT) = '0' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "1001" => -- bvs
+ if cc(VBIT) = '1' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "1010" => -- bpl
+ if cc(NBIT) = '0' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "1011" => -- bmi
+ if cc(NBIT) = '1' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "1100" => -- bge
+ if (cc(NBIT) xor cc(VBIT)) = '0' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "1101" => -- blt
+ if (cc(NBIT) xor cc(VBIT)) = '1' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "1110" => -- bgt
+ if (cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '0' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when "1111" => -- ble
+ if (cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '1' then
+ next_state <= branch_state;
+ else
+ next_state <= fetch_state;
+ end if;
+ when others =>
+ next_state <= fetch_state;
+ end case;
+ --
+ -- Single byte stack operators
+ -- Do not advance PC
+ --
+ when "0011" =>
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ pc_ctrl <= latch_pc;
+ case op_code(3 downto 0) is
+ when "0000" => -- tsx
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= load_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= fetch_state;
+ when "0001" => -- ins
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ next_state <= fetch_state;
+ when "0010" => -- pula
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ next_state <= pula_state;
+ when "0011" => -- pulb
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ next_state <= pulb_state;
+ when "0100" => -- des
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ next_state <= fetch_state;
+ when "0101" => -- txs
+ left_ctrl <= ix_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ next_state <= fetch_state;
+ when "0110" => -- psha
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= psha_state;
+ when "0111" => -- pshb
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= pshb_state;
+ when "1000" => -- pulx
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ next_state <= pulx_hi_state;
+ when "1001" => -- rts
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ next_state <= rts_hi_state;
+ when "1010" => -- abx
+ left_ctrl <= ix_left;
+ right_ctrl <= accb_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= load_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= fetch_state;
+ when "1011" => -- rti
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= load_sp;
+ next_state <= rti_cc_state;
+ when "1100" => -- pshx
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= pshx_lo_state;
+ when "1101" => -- mul
+ left_ctrl <= acca_left;
+ right_ctrl <= accb_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= mul_state;
+ when "1110" => -- wai
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= int_pcl_state;
+ when "1111" => -- swi
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= int_pcl_state;
+ when others =>
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ next_state <= fetch_state;
+ end case;
+ --
+ -- Accumulator A Single operand
+ -- source = Acc A dest = Acc A
+ -- Do not advance PC
+ --
+ when "0100" => -- acca single op
+ md_ctrl <= fetch_first_md;
+ accb_ctrl <= latch_accb;
+ pc_ctrl <= latch_pc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ left_ctrl <= acca_left;
+ case op_code(3 downto 0) is
+ when "0000" => -- neg
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_neg;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "0011" => -- com
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_com;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "0100" => -- lsr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_lsr8;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "0110" => -- ror
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_ror8;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "0111" => -- asr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_asr8;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "1000" => -- asl
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_asl8;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "1001" => -- rol
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_rol8;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "1010" => -- dec
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_dec;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "1011" => -- undefined
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ acca_ctrl <= latch_acca;
+ cc_ctrl <= latch_cc;
+ when "1100" => -- inc
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_inc;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when "1101" => -- tst
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ acca_ctrl <= latch_acca;
+ cc_ctrl <= load_cc;
+ when "1110" => -- jmp
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ acca_ctrl <= latch_acca;
+ cc_ctrl <= latch_cc;
+ when "1111" => -- clr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_clr;
+ acca_ctrl <= load_acca;
+ cc_ctrl <= load_cc;
+ when others =>
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ acca_ctrl <= latch_acca;
+ cc_ctrl <= latch_cc;
+ end case;
+ next_state <= fetch_state;
+ --
+ -- single operand acc b
+ -- Do not advance PC
+ --
+ when "0101" =>
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ pc_ctrl <= latch_pc;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ left_ctrl <= accb_left;
+ case op_code(3 downto 0) is
+ when "0000" => -- neg
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_neg;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "0011" => -- com
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_com;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "0100" => -- lsr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_lsr8;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "0110" => -- ror
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_ror8;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "0111" => -- asr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_asr8;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "1000" => -- asl
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_asl8;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "1001" => -- rol
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_rol8;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "1010" => -- dec
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_dec;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "1011" => -- undefined
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ accb_ctrl <= latch_accb;
+ cc_ctrl <= latch_cc;
+ when "1100" => -- inc
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_inc;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when "1101" => -- tst
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ accb_ctrl <= latch_accb;
+ cc_ctrl <= load_cc;
+ when "1110" => -- jmp
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ accb_ctrl <= latch_accb;
+ cc_ctrl <= latch_cc;
+ when "1111" => -- clr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_clr;
+ accb_ctrl <= load_accb;
+ cc_ctrl <= load_cc;
+ when others =>
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ accb_ctrl <= latch_accb;
+ cc_ctrl <= latch_cc;
+ end case;
+ next_state <= fetch_state;
+ --
+ -- Single operand indexed
+ -- Two byte instruction so advance PC
+ -- EA should hold index offset
+ --
+ when "0110" => -- indexed single op
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ next_state <= indexed_state;
+ --
+ -- Single operand extended addressing
+ -- three byte instruction so advance the PC
+ -- Low order EA holds high order address
+ --
+ when "0111" => -- extended single op
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ next_state <= extended_state;
+
+ when "1000" => -- acca immediate
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ case op_code(3 downto 0) is
+ when "0011" | -- subdd #
+ "1100" | -- cpx #
+ "1110" => -- lds #
+ next_state <= immediate16_state;
+ when "1101" => -- bsr
+ next_state <= bsr_state;
+ when others =>
+ next_state <= fetch_state;
+ end case;
+
+ when "1001" => -- acca direct
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ pc_ctrl <= inc_pc;
+ case op_code(3 downto 0) is
+ when "0111" => -- staa direct
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1111" => -- sts direct
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when "1101" => -- jsr direct
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ next_state <= jsr_state;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ next_state <= read8_state;
+ end case;
+
+ when "1010" => -- acca indexed
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ next_state <= indexed_state;
+
+ when "1011" => -- acca extended
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ next_state <= extended_state;
+
+ when "1100" => -- accb immediate
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ case op_code(3 downto 0) is
+ when "0011" | -- addd #
+ "1100" | -- ldd #
+ "1110" => -- ldx #
+ next_state <= immediate16_state;
+ when others =>
+ next_state <= fetch_state;
+ end case;
+
+ when "1101" => -- accb direct
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ pc_ctrl <= inc_pc;
+ case op_code(3 downto 0) is
+ when "0111" => -- stab direct
+ left_ctrl <= accb_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1101" => -- std direct
+ left_ctrl <= accd_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when "1111" => -- stx direct
+ left_ctrl <= ix_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ next_state <= read8_state;
+ end case;
+
+ when "1110" => -- accb indexed
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ next_state <= indexed_state;
+
+ when "1111" => -- accb extended
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- increment the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ next_state <= extended_state;
+
+ when others =>
+ md_ctrl <= fetch_first_md;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ -- idle the pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= latch_pc;
+ next_state <= fetch_state;
+ end case;
+
+ when immediate16_state =>
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ op_ctrl <= latch_op;
+ iv_ctrl <= latch_iv;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment pc
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= inc_pc;
+ -- fetch next immediate byte
+ md_ctrl <= fetch_next_md;
+ addr_ctrl <= fetch_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= fetch_state;
+ --
+ -- ea holds 8 bit index offet
+ -- calculate the effective memory address
+ -- using the alu
+ --
+ when indexed_state =>
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ -- calculate effective address from index reg
+ -- index offest is not sign extended
+ ea_ctrl <= add_ix_ea;
+ -- idle the bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ -- work out next state
+ case op_code(7 downto 4) is
+ when "0110" => -- single op indexed
+ md_ctrl <= latch_md;
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ case op_code(3 downto 0) is
+ when "1011" => -- undefined
+ next_state <= fetch_state;
+ when "1110" => -- jmp
+ next_state <= jmp_state;
+ when others =>
+ next_state <= read8_state;
+ end case;
+ when "1010" => -- acca indexed
+ case op_code(3 downto 0) is
+ when "0111" => -- staa
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1101" => -- jsr
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= jsr_state;
+ when "1111" => -- sts
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= read8_state;
+ end case;
+ when "1110" => -- accb indexed
+ case op_code(3 downto 0) is
+ when "0111" => -- stab direct
+ left_ctrl <= accb_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1101" => -- std direct
+ left_ctrl <= accd_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when "1111" => -- stx direct
+ left_ctrl <= ix_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= read8_state;
+ end case;
+ when others =>
+ md_ctrl <= latch_md;
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ next_state <= fetch_state;
+ end case;
+ --
+ -- ea holds the low byte of the absolute address
+ -- Move ea low byte into ea high byte
+ -- load new ea low byte to for absolute 16 bit address
+ -- advance the program counter
+ --
+ when extended_state => -- fetch ea low byte
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ -- increment pc
+ pc_ctrl <= inc_pc;
+ -- fetch next effective address bytes
+ ea_ctrl <= fetch_next_ea;
+ addr_ctrl <= fetch_ad;
+ dout_ctrl <= md_lo_dout;
+ -- work out the next state
+ case op_code(7 downto 4) is
+ when "0111" => -- single op extended
+ md_ctrl <= latch_md;
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ case op_code(3 downto 0) is
+ when "1011" => -- undefined
+ next_state <= fetch_state;
+ when "1110" => -- jmp
+ next_state <= jmp_state;
+ when others =>
+ next_state <= read8_state;
+ end case;
+ when "1011" => -- acca extended
+ case op_code(3 downto 0) is
+ when "0111" => -- staa
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1101" => -- jsr
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= jsr_state;
+ when "1111" => -- sts
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= read8_state;
+ end case;
+ when "1111" => -- accb extended
+ case op_code(3 downto 0) is
+ when "0111" => -- stab
+ left_ctrl <= accb_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1101" => -- std
+ left_ctrl <= accd_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when "1111" => -- stx
+ left_ctrl <= ix_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ next_state <= write16_state;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= read8_state;
+ end case;
+ when others =>
+ md_ctrl <= latch_md;
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ next_state <= fetch_state;
+ end case;
+ --
+ -- here if ea holds low byte (direct page)
+ -- can enter here from extended addressing
+ -- read memory location
+ -- note that reads may be 8 or 16 bits
+ --
+ when read8_state => -- read data
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ --
+ addr_ctrl <= read_ad;
+ dout_ctrl <= md_lo_dout;
+ case op_code(7 downto 4) is
+ when "0110" | "0111" => -- single operand
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ ea_ctrl <= latch_ea;
+ next_state <= execute_state;
+
+ when "1001" | "1010" | "1011" => -- acca
+ case op_code(3 downto 0) is
+ when "0011" | -- subd
+ "1110" | -- lds
+ "1100" => -- cpx
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ -- increment the effective address in case of 16 bit load
+ ea_ctrl <= inc_ea;
+ next_state <= read16_state;
+-- when "0111" => -- staa
+-- left_ctrl <= acca_left;
+-- right_ctrl <= zero_right;
+-- alu_ctrl <= alu_st8;
+-- cc_ctrl <= latch_cc;
+-- md_ctrl <= load_md;
+-- ea_ctrl <= latch_ea;
+-- next_state <= write8_state;
+-- when "1101" => -- jsr
+-- left_ctrl <= acca_left;
+-- right_ctrl <= zero_right;
+-- alu_ctrl <= alu_nop;
+-- cc_ctrl <= latch_cc;
+-- md_ctrl <= latch_md;
+-- ea_ctrl <= latch_ea;
+-- next_state <= jsr_state;
+-- when "1111" => -- sts
+-- left_ctrl <= sp_left;
+-- right_ctrl <= zero_right;
+-- alu_ctrl <= alu_st16;
+-- cc_ctrl <= latch_cc;
+-- md_ctrl <= load_md;
+-- ea_ctrl <= latch_ea;
+-- next_state <= write16_state;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ ea_ctrl <= latch_ea;
+ next_state <= fetch_state;
+ end case;
+
+ when "1101" | "1110" | "1111" => -- accb
+ case op_code(3 downto 0) is
+ when "0011" | -- addd
+ "1100" | -- ldd
+ "1110" => -- ldx
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ -- increment the effective address in case of 16 bit load
+ ea_ctrl <= inc_ea;
+ next_state <= read16_state;
+-- when "0111" => -- stab
+-- left_ctrl <= accb_left;
+-- right_ctrl <= zero_right;
+-- alu_ctrl <= alu_st8;
+-- cc_ctrl <= latch_cc;
+-- md_ctrl <= load_md;
+-- ea_ctrl <= latch_ea;
+-- next_state <= write8_state;
+-- when "1101" => -- std
+-- left_ctrl <= accd_left;
+-- right_ctrl <= zero_right;
+-- alu_ctrl <= alu_st16;
+-- cc_ctrl <= latch_cc;
+-- md_ctrl <= load_md;
+-- ea_ctrl <= latch_ea;
+-- next_state <= write16_state;
+-- when "1111" => -- stx
+-- left_ctrl <= ix_left;
+-- right_ctrl <= zero_right;
+-- alu_ctrl <= alu_st16;
+-- cc_ctrl <= latch_cc;
+-- md_ctrl <= load_md;
+-- ea_ctrl <= latch_ea;
+-- next_state <= write16_state;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ ea_ctrl <= latch_ea;
+ next_state <= execute_state;
+ end case;
+ when others =>
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= fetch_first_md;
+ ea_ctrl <= latch_ea;
+ next_state <= fetch_state;
+ end case;
+
+ when read16_state => -- read second data byte from ea
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- idle the effective address
+ ea_ctrl <= latch_ea;
+ -- read the low byte of the 16 bit data
+ md_ctrl <= fetch_next_md;
+ addr_ctrl <= read_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= fetch_state;
+ --
+ -- 16 bit Write state
+ -- write high byte of ALU output.
+ -- EA hold address of memory to write to
+ -- Advance the effective address in ALU
+ --
+ when write16_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ -- increment the effective address
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ ea_ctrl <= inc_ea;
+ -- write the ALU hi byte to ea
+ addr_ctrl <= write_ad;
+ dout_ctrl <= md_hi_dout;
+ next_state <= write8_state;
+ --
+ -- 8 bit write
+ -- Write low 8 bits of ALU output
+ --
+ when write8_state =>
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- idle the ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- write ALU low byte output
+ addr_ctrl <= write_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= fetch_state;
+
+ when jmp_state =>
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- load PC with effective address
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= load_ea_pc;
+ -- idle the bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= fetch_state;
+
+ when jsr_state => -- JSR
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write pc low
+ addr_ctrl <= push_ad;
+ dout_ctrl <= pc_lo_dout;
+ next_state <= jsr1_state;
+
+ when jsr1_state => -- JSR
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write pc hi
+ addr_ctrl <= push_ad;
+ dout_ctrl <= pc_hi_dout;
+ next_state <= jmp_state;
+
+ when branch_state => -- Bcc
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- calculate signed branch
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ pc_ctrl <= add_ea_pc;
+ -- idle the bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= fetch_state;
+
+ when bsr_state => -- BSR
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write pc low
+ addr_ctrl <= push_ad;
+ dout_ctrl <= pc_lo_dout;
+ next_state <= bsr1_state;
+
+ when bsr1_state => -- BSR
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write pc hi
+ addr_ctrl <= push_ad;
+ dout_ctrl <= pc_hi_dout;
+ next_state <= branch_state;
+
+ when rts_hi_state => -- RTS
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment the sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- read pc hi
+ pc_ctrl <= pull_hi_pc;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= pc_hi_dout;
+ next_state <= rts_lo_state;
+
+ when rts_lo_state => -- RTS1
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- idle the ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- read pc low
+ pc_ctrl <= pull_lo_pc;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= pc_lo_dout;
+ next_state <= fetch_state;
+
+ when mul_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- move acca to md
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st16;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= load_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mulea_state;
+
+ when mulea_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ md_ctrl <= latch_md;
+ -- idle ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- move accb to ea
+ ea_ctrl <= load_accb_ea;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= muld_state;
+
+ when muld_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ md_ctrl <= latch_md;
+ -- clear accd
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_ld8;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mul0_state;
+
+ when mul0_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- if bit 0 of ea set, add accd to md
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ if ea(0) = '1' then
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ else
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end if;
+ md_ctrl <= shiftl_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mul1_state;
+
+ when mul1_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- if bit 1 of ea set, add accd to md
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ if ea(1) = '1' then
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ else
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end if;
+ md_ctrl <= shiftl_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mul2_state;
+
+ when mul2_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- if bit 2 of ea set, add accd to md
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ if ea(2) = '1' then
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ else
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end if;
+ md_ctrl <= shiftl_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mul3_state;
+
+ when mul3_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- if bit 3 of ea set, add accd to md
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ if ea(3) = '1' then
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ else
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end if;
+ md_ctrl <= shiftl_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mul4_state;
+
+ when mul4_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- if bit 4 of ea set, add accd to md
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ if ea(4) = '1' then
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ else
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end if;
+ md_ctrl <= shiftl_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mul5_state;
+
+ when mul5_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- if bit 5 of ea set, add accd to md
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ if ea(5) = '1' then
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ else
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end if;
+ md_ctrl <= shiftl_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mul6_state;
+
+ when mul6_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- if bit 6 of ea set, add accd to md
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ if ea(6) = '1' then
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ else
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end if;
+ md_ctrl <= shiftl_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= mul7_state;
+
+ when mul7_state =>
+ -- default
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- if bit 7 of ea set, add accd to md
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_add16;
+ if ea(7) = '1' then
+ cc_ctrl <= load_cc;
+ acca_ctrl <= load_hi_acca;
+ accb_ctrl <= load_accb;
+ else
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ end if;
+ md_ctrl <= shiftl_md;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= fetch_state;
+
+ when execute_state => -- execute single operand instruction
+ -- default
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ case op_code(7 downto 4) is
+ when "0110" | -- indexed single op
+ "0111" => -- extended single op
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ iv_ctrl <= latch_iv;
+ ea_ctrl <= latch_ea;
+ -- idle the bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ left_ctrl <= md_left;
+ case op_code(3 downto 0) is
+ when "0000" => -- neg
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_neg;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "0011" => -- com
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_com;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "0100" => -- lsr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_lsr8;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "0110" => -- ror
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_ror8;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "0111" => -- asr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_asr8;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1000" => -- asl
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_asl8;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1001" => -- rol
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_rol8;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1010" => -- dec
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_dec;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1011" => -- undefined
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= fetch_state;
+ when "1100" => -- inc
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_inc;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when "1101" => -- tst
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_st8;
+ cc_ctrl <= load_cc;
+ md_ctrl <= latch_md;
+ next_state <= fetch_state;
+ when "1110" => -- jmp
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= fetch_state;
+ when "1111" => -- clr
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_clr;
+ cc_ctrl <= load_cc;
+ md_ctrl <= load_md;
+ next_state <= write8_state;
+ when others =>
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ md_ctrl <= latch_md;
+ next_state <= fetch_state;
+ end case;
+
+ when others =>
+ left_ctrl <= accd_left;
+ right_ctrl <= md_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ ea_ctrl <= latch_ea;
+ -- idle the bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= fetch_state;
+ end case;
+
+ when psha_state =>
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write acca
+ addr_ctrl <= push_ad;
+ dout_ctrl <= acca_dout;
+ next_state <= fetch_state;
+
+ when pula_state =>
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- idle sp
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= latch_sp;
+ -- read acca
+ acca_ctrl <= pull_acca;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= acca_dout;
+ next_state <= fetch_state;
+
+ when pshb_state =>
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write accb
+ addr_ctrl <= push_ad;
+ dout_ctrl <= accb_dout;
+ next_state <= fetch_state;
+
+ when pulb_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- idle sp
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= latch_sp;
+ -- read accb
+ accb_ctrl <= pull_accb;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= accb_dout;
+ next_state <= fetch_state;
+
+ when pshx_lo_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write ix low
+ addr_ctrl <= push_ad;
+ dout_ctrl <= ix_lo_dout;
+ next_state <= pshx_hi_state;
+
+ when pshx_hi_state =>
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write ix hi
+ addr_ctrl <= push_ad;
+ dout_ctrl <= ix_hi_dout;
+ next_state <= fetch_state;
+
+ when pulx_hi_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- pull ix hi
+ ix_ctrl <= pull_hi_ix;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= ix_hi_dout;
+ next_state <= pulx_lo_state;
+
+ when pulx_lo_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- idle sp
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= latch_sp;
+ -- read ix low
+ ix_ctrl <= pull_lo_ix;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= ix_lo_dout;
+ next_state <= fetch_state;
+
+ --
+ -- return from interrupt
+ -- enter here from bogus interrupts
+ --
+ when rti_state =>
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ sp_ctrl <= load_sp;
+ -- idle address bus
+ cc_ctrl <= latch_cc;
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= cc_dout;
+ next_state <= rti_cc_state;
+
+ when rti_cc_state =>
+ -- default registers
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ sp_ctrl <= load_sp;
+ -- read cc
+ cc_ctrl <= pull_cc;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= cc_dout;
+ next_state <= rti_accb_state;
+
+ when rti_accb_state =>
+ -- default registers
+ acca_ctrl <= latch_acca;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- read accb
+ accb_ctrl <= pull_accb;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= accb_dout;
+ next_state <= rti_acca_state;
+
+ when rti_acca_state =>
+ -- default registers
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- read acca
+ acca_ctrl <= pull_acca;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= acca_dout;
+ next_state <= rti_ixh_state;
+
+ when rti_ixh_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- read ix hi
+ ix_ctrl <= pull_hi_ix;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= ix_hi_dout;
+ next_state <= rti_ixl_state;
+
+ when rti_ixl_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- read ix low
+ ix_ctrl <= pull_lo_ix;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= ix_lo_dout;
+ next_state <= rti_pch_state;
+
+ when rti_pch_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- increment sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_add16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- pull pc hi
+ pc_ctrl <= pull_hi_pc;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= pc_hi_dout;
+ next_state <= rti_pcl_state;
+
+ when rti_pcl_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- idle sp
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= latch_sp;
+ -- pull pc low
+ pc_ctrl <= pull_lo_pc;
+ addr_ctrl <= pull_ad;
+ dout_ctrl <= pc_lo_dout;
+ next_state <= fetch_state;
+
+ --
+ -- here on interrupt
+ -- iv register hold interrupt type
+ --
+ when int_pcl_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write pc low
+ addr_ctrl <= push_ad;
+ dout_ctrl <= pc_lo_dout;
+ next_state <= int_pch_state;
+
+ when int_pch_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write pc hi
+ addr_ctrl <= push_ad;
+ dout_ctrl <= pc_hi_dout;
+ next_state <= int_ixl_state;
+
+ when int_ixl_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write ix low
+ addr_ctrl <= push_ad;
+ dout_ctrl <= ix_lo_dout;
+ next_state <= int_ixh_state;
+
+ when int_ixh_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write ix hi
+ addr_ctrl <= push_ad;
+ dout_ctrl <= ix_hi_dout;
+ next_state <= int_acca_state;
+
+ when int_acca_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write acca
+ addr_ctrl <= push_ad;
+ dout_ctrl <= acca_dout;
+ next_state <= int_accb_state;
+
+
+ when int_accb_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write accb
+ addr_ctrl <= push_ad;
+ dout_ctrl <= accb_dout;
+ next_state <= int_cc_state;
+
+ when int_cc_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- decrement sp
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_sub16;
+ cc_ctrl <= latch_cc;
+ sp_ctrl <= load_sp;
+ -- write cc
+ addr_ctrl <= push_ad;
+ dout_ctrl <= cc_dout;
+ nmi_ctrl <= latch_nmi;
+ --
+ -- nmi is edge triggered
+ -- nmi_req is cleared when nmi goes low.
+ --
+ if nmi_req = '1' then
+ iv_ctrl <= nmi_iv;
+ next_state <= vect_hi_state;
+ else
+ --
+ -- IRQ is level sensitive
+ --
+ if (irq = '1') and (cc(IBIT) = '0') then
+ iv_ctrl <= irq_iv;
+ next_state <= int_mask_state;
+ else
+ case op_code is
+ when "00111110" => -- WAI (wait for interrupt)
+ iv_ctrl <= latch_iv;
+ next_state <= int_wai_state;
+ when "00111111" => -- SWI (Software interrupt)
+ iv_ctrl <= swi_iv;
+ next_state <= vect_hi_state;
+ when others => -- bogus interrupt (return)
+ iv_ctrl <= latch_iv;
+ next_state <= rti_state;
+ end case;
+ end if;
+ end if;
+
+ when int_wai_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ op_ctrl <= latch_op;
+ ea_ctrl <= latch_ea;
+ -- enable interrupts
+ left_ctrl <= sp_left;
+ right_ctrl <= plus_one_right;
+ alu_ctrl <= alu_cli;
+ cc_ctrl <= load_cc;
+ sp_ctrl <= latch_sp;
+ -- idle bus
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= cc_dout;
+ if (nmi_req = '1') and (nmi_ack='0') then
+ iv_ctrl <= nmi_iv;
+ nmi_ctrl <= set_nmi;
+ next_state <= vect_hi_state;
+ else
+ --
+ -- nmi request is not cleared until nmi input goes low
+ --
+ if (nmi_req = '0') and (nmi_ack='1') then
+ nmi_ctrl <= reset_nmi;
+ else
+ nmi_ctrl <= latch_nmi;
+ end if;
+ --
+ -- IRQ is level sensitive
+ --
+ if (irq = '1') and (cc(IBIT) = '0') then
+ iv_ctrl <= irq_iv;
+ next_state <= int_mask_state;
+ else
+ iv_ctrl <= latch_iv;
+ next_state <= int_wai_state;
+ end if;
+ end if;
+
+ when int_mask_state =>
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- Mask IRQ
+ left_ctrl <= sp_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_sei;
+ cc_ctrl <= load_cc;
+ sp_ctrl <= latch_sp;
+ -- idle bus cycle
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= vect_hi_state;
+
+ when halt_state => -- halt CPU.
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- do nothing in ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- idle bus cycle
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ if halt = '1' then
+ next_state <= halt_state;
+ else
+ next_state <= fetch_state;
+ end if;
+
+ when others => -- error state halt on undefine states
+ -- default
+ acca_ctrl <= latch_acca;
+ accb_ctrl <= latch_accb;
+ ix_ctrl <= latch_ix;
+ sp_ctrl <= latch_sp;
+ pc_ctrl <= latch_pc;
+ md_ctrl <= latch_md;
+ iv_ctrl <= latch_iv;
+ op_ctrl <= latch_op;
+ nmi_ctrl <= latch_nmi;
+ ea_ctrl <= latch_ea;
+ -- do nothing in ALU
+ left_ctrl <= acca_left;
+ right_ctrl <= zero_right;
+ alu_ctrl <= alu_nop;
+ cc_ctrl <= latch_cc;
+ -- idle bus cycle
+ addr_ctrl <= idle_ad;
+ dout_ctrl <= md_lo_dout;
+ next_state <= error_state;
+ end case;
+end process;
+
+--------------------------------
+--
+-- state machine
+--
+--------------------------------
+
+change_state: process( clk, rst, state, hold )
+begin
+ if clk'event and clk = '0' then
+ if rst = '1' then
+ state <= reset_state;
+ elsif hold = '1' then
+ state <= state;
+ else
+ state <= next_state;
+ end if;
+ end if;
+end process;
+ -- output
+
+end CPU_ARCH;
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/dac.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/dac.vhd
new file mode 100644
index 00000000..c133f074
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/dac.vhd
@@ -0,0 +1,71 @@
+-------------------------------------------------------------------------------
+--
+-- Delta-Sigma DAC
+--
+-- $Id: dac.vhd,v 1.1 2006/05/10 20:57:06 arnim Exp $
+--
+-- Refer to Xilinx Application Note XAPP154.
+--
+-- This DAC requires an external RC low-pass filter:
+--
+-- dac_o 0---XXXXX---+---0 analog audio
+-- 3k3 |
+-- === 4n7
+-- |
+-- GND
+--
+-------------------------------------------------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity dac is
+
+ generic (
+ msbi_g : integer := 7
+ );
+ port (
+ clk_i : in std_logic;
+ res_n_i : in std_logic;
+ dac_i : in std_logic_vector(msbi_g downto 0);
+ dac_o : out std_logic
+ );
+
+end dac;
+
+library ieee;
+use ieee.numeric_std.all;
+
+architecture rtl of dac is
+
+ signal DACout_q : std_logic;
+ signal DeltaAdder_s,
+ SigmaAdder_s,
+ SigmaLatch_q,
+ DeltaB_s : unsigned(msbi_g+2 downto 0);
+
+begin
+
+ DeltaB_s(msbi_g+2 downto msbi_g+1) <= SigmaLatch_q(msbi_g+2) &
+ SigmaLatch_q(msbi_g+2);
+ DeltaB_s(msbi_g downto 0) <= (others => '0');
+
+ DeltaAdder_s <= unsigned('0' & '0' & dac_i) + DeltaB_s;
+
+ SigmaAdder_s <= DeltaAdder_s + SigmaLatch_q;
+
+ seq: process (clk_i, res_n_i)
+ begin
+ if res_n_i = '0' then
+ SigmaLatch_q <= to_unsigned(2**(msbi_g+1), SigmaLatch_q'length);
+ DACout_q <= '0';
+
+ elsif clk_i'event and clk_i = '1' then
+ SigmaLatch_q <= SigmaAdder_s;
+ DACout_q <= SigmaLatch_q(msbi_g+2);
+ end if;
+ end process seq;
+
+ dac_o <= DACout_q;
+
+end rtl;
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/greybox_tmp/cbx_args.txt b/Soundboards_MiST/AS-2518-51_snd-master/rtl/greybox_tmp/cbx_args.txt
new file mode 100644
index 00000000..eaf4ac94
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/greybox_tmp/cbx_args.txt
@@ -0,0 +1,16 @@
+ADDRESS_ACLR_A=NONE
+CLOCK_ENABLE_INPUT_A=BYPASS
+CLOCK_ENABLE_OUTPUT_A=BYPASS
+INIT_FILE=./ROM/NitroGroundshaker.hex
+INTENDED_DEVICE_FAMILY="Cyclone III"
+NUMWORDS_A=2048
+OPERATION_MODE=ROM
+OUTDATA_ACLR_A=NONE
+OUTDATA_REG_A=UNREGISTERED
+WIDTHAD_A=11
+WIDTH_A=8
+WIDTH_BYTEENA_A=1
+DEVICE_FAMILY="Cyclone III"
+address_a
+clock0
+q_a
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/m6810.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/m6810.vhd
new file mode 100644
index 00000000..0c114032
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/m6810.vhd
@@ -0,0 +1,65 @@
+-----------------------------------------------------------------------
+--
+-- Copyright 2009-2011 ShareBrained Technology, Inc.
+--
+-- This file is part of robotron-fpga.
+--
+-- robotron-fpga is free software: you can redistribute
+-- it and/or modify it under the terms of the GNU General
+-- Public License as published by the Free Software
+-- Foundation, either version 3 of the License, or (at your
+-- option) any later version.
+--
+-- robotron-fpga is distributed in the hope that it will
+-- be useful, but WITHOUT ANY WARRANTY; without even the
+-- implied warranty of MERCHANTABILITY or FITNESS FOR A
+-- PARTICULAR PURPOSE. See the GNU General Public License
+-- for more details.
+--
+-- You should have received a copy of the GNU General
+-- Public License along with robotron-fpga. If not, see
+-- .
+--
+-----------------------------------------------------------------------
+
+library IEEE;
+ use IEEE.STD_LOGIC_1164.ALL;
+ use IEEE.NUMERIC_STD.ALL;
+
+entity m6810 is
+ Port ( clk : in std_logic;
+ rst : in std_logic;
+ address : in std_logic_vector (6 downto 0);
+ cs : in std_logic;
+ rw : in std_logic;
+ data_in : in std_logic_vector (7 downto 0);
+ data_out : out std_logic_vector (7 downto 0));
+end m6810;
+
+architecture rtl of m6810 is
+ subtype word_t is std_logic_vector(7 downto 0);
+ type memory_t is array(127 downto 0) of word_t;
+
+ signal ram : memory_t;
+ signal address_reg : std_logic_vector(6 downto 0);
+
+ signal we : std_logic;
+begin
+
+ process(clk)
+ begin
+ if( rising_edge(clk) ) then
+ if( we = '1' and cs = '1' ) then
+ ram(to_integer(unsigned(address))) <= data_in;
+ end if;
+
+ address_reg <= address;
+ end if;
+ end process;
+
+ we <= not rw;
+
+ data_out <= ram(to_integer(unsigned(address)));
+
+end architecture rtl;
+
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/minibd_top.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/minibd_top.vhd
new file mode 100644
index 00000000..71efaf81
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/minibd_top.vhd
@@ -0,0 +1,144 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+
+entity minibd_top is
+port(
+ CLOCK_27 : in std_logic;
+ SPI_SCK : in std_logic;
+ SPI_DO : out std_logic;
+ SPI_DI : in std_logic;
+ SPI_SS2 : in std_logic;
+ SPI_SS3 : in std_logic;
+ CONF_DATA0 : in std_logic;
+ LED : out std_logic;
+ AUDIO_L : out std_logic;
+ AUDIO_R : out std_logic
+ );
+end minibd_top;
+
+architecture rtl of minibd_top is
+-- Sound board signals
+signal reset_l : std_logic;
+signal ps2_clk : std_logic;
+signal ps2_dat : std_logic;
+signal cpu_clk : std_logic;
+signal snd_ctl : std_logic_vector(7 downto 0);
+signal audio : std_logic_vector(10 downto 0);
+
+-- PS/2 interface signals
+signal scanCode : std_logic_vector(9 downto 0);
+signal send : std_logic;
+signal Command : std_logic_vector(7 downto 0);
+signal PS2Busy : std_logic;
+signal PS2Error : std_logic;
+signal dataByte : std_logic_vector(7 downto 0);
+signal dataReady : std_logic;
+signal buttons : std_logic_vector(1 downto 0);
+
+component mist_io generic(STRLEN : integer := 0 ); port
+(
+ clk_sys : in std_logic;
+ SPI_SCK : in std_logic;
+ CONF_DATA0 : in std_logic;
+ SPI_SS2 : in std_logic;
+ SPI_DI : in std_logic;
+ SPI_DO : out std_logic;
+ buttons : out std_logic_vector(1 downto 0);
+ ps2_kbd_clk : out std_logic;
+ ps2_kbd_data : out std_logic
+ );
+end component mist_io;
+
+begin
+
+reset_l <= not buttons(1);
+LED <= '1';
+
+io: mist_io
+port map(
+ clk_sys => CLOCK_27,
+ SPI_SCK => SPI_SCK,
+ CONF_DATA0 => CONF_DATA0,
+ SPI_SS2 => SPI_SS2,
+ SPI_DO => SPI_DO,
+ SPI_DI => SPI_DI,
+ buttons => buttons,
+ ps2_kbd_clk => ps2_clk,
+ ps2_kbd_data => ps2_dat
+ );
+
+Core: entity work.AS_2518_51
+port map(
+ cpu_clk => cpu_clk,
+ reset_l => reset_l,
+ addr_i => snd_ctl(5 downto 0),
+ snd_int_i => not scancode(8),
+ test_sw_l => '1',
+ audio => audio
+ );
+
+PLL: entity work.williams_snd_pll
+port map(
+ areset => not reset_l,
+ inclk0 => CLOCK_27,
+ c0 => cpu_clk
+ );
+
+keyboard: entity work.PS2Controller
+port map(
+ Reset => not reset_l,
+ Clock => CLOCK_27,
+ PS2Clock => ps2_clk,
+ PS2Data => ps2_dat,
+ Send => send,
+ Command => command,
+ PS2Busy => ps2Busy,
+ PS2Error => ps2Error,
+ DataReady => dataReady,
+ DataByte => dataByte
+ );
+
+decoder: entity work.KeyboardMapper
+port map(
+ Clock => CLOCK_27,
+ Reset => not reset_l,
+ PS2Busy => ps2Busy,
+ PS2Error => ps2Error,
+ DataReady => dataReady,
+ DataByte => dataByte,
+ Send => send,
+ Command => command,
+ CodeReady => open,
+ ScanCode => scanCode
+ );
+
+inputreg: process
+begin
+ wait until rising_edge(CLOCK_27);
+ if scanCode(8) = '0' then
+ snd_ctl(5 downto 0) <= not scanCode(5 downto 0);
+ else
+ snd_ctl(5 downto 0) <= "111111";
+ end if;
+end process;
+
+snd_ctl(7 downto 6) <= "11";
+
+Audio_DACl: entity work.dac
+port map(
+ clk_i => CLOCK_27,
+ res_n_i => reset_l,
+ dac_i => audio(10 downto 3),
+ dac_o => AUDIO_L
+ );
+
+Audio_DACr: entity work.dac
+port map(
+ clk_i => CLOCK_27,
+ res_n_i => reset_l,
+ dac_i => audio(10 downto 3),
+ dac_o => AUDIO_R
+ );
+
+end rtl;
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/mist_io.sv b/Soundboards_MiST/AS-2518-51_snd-master/rtl/mist_io.sv
new file mode 100644
index 00000000..dcc7ecde
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/mist_io.sv
@@ -0,0 +1,491 @@
+//
+// mist_io.v
+//
+// mist_io for the MiST board
+// http://code.google.com/p/mist-board/
+//
+// Copyright (c) 2014 Till Harbaum
+//
+// This source file is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published
+// by the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This source file is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+///////////////////////////////////////////////////////////////////////
+
+//
+// Use buffer to access SD card. It's time-critical part.
+// Made module synchroneous with 2 clock domains: clk_sys and SPI_SCK
+// (Sorgelig)
+//
+// for synchronous projects default value for PS2DIV is fine for any frequency of system clock.
+// clk_ps2 = clk_sys/(PS2DIV*2)
+//
+
+module mist_io #(parameter STRLEN=0, parameter PS2DIV=100)
+(
+
+ // parameter STRLEN and the actual length of conf_str have to match
+ input [(8*STRLEN)-1:0] conf_str,
+
+ // Global clock. It should be around 100MHz (higher is better).
+ input clk_sys,
+
+ // Global SPI clock from ARM. 24MHz
+ input SPI_SCK,
+
+ input CONF_DATA0,
+ input SPI_SS2,
+ output SPI_DO,
+ input SPI_DI,
+
+ output reg [7:0] joystick_0,
+ output reg [7:0] joystick_1,
+ output reg [15:0] joystick_analog_0,
+ output reg [15:0] joystick_analog_1,
+ output [1:0] buttons,
+ output [1:0] switches,
+ output scandoubler_disable,
+ output ypbpr,
+
+ output reg [31:0] status,
+
+ // SD config
+ input sd_conf,
+ input sd_sdhc,
+ output img_mounted, // signaling that new image has been mounted
+ output reg [31:0] img_size, // size of image in bytes
+
+ // SD block level access
+ input [31:0] sd_lba,
+ input sd_rd,
+ input sd_wr,
+ output reg sd_ack,
+ output reg sd_ack_conf,
+
+ // SD byte level access. Signals for 2-PORT altsyncram.
+ output reg [8:0] sd_buff_addr,
+ output reg [7:0] sd_buff_dout,
+ input [7:0] sd_buff_din,
+ output reg sd_buff_wr,
+
+ // ps2 keyboard emulation
+ output ps2_kbd_clk,
+ output reg ps2_kbd_data,
+ output ps2_mouse_clk,
+ output reg ps2_mouse_data,
+ input ps2_caps_led,
+
+ // ARM -> FPGA download
+ output reg ioctl_download = 0, // signal indicating an active download
+ output reg [7:0] ioctl_index, // menu index used to upload the file
+ output ioctl_wr,
+ output reg [23:0] ioctl_addr,
+ output reg [7:0] ioctl_dout
+);
+
+reg [7:0] b_data;
+reg [6:0] sbuf;
+reg [7:0] cmd;
+reg [2:0] bit_cnt; // counts bits 0-7 0-7 ...
+reg [9:0] byte_cnt; // counts bytes
+reg [7:0] but_sw;
+reg [2:0] stick_idx;
+
+reg mount_strobe = 0;
+assign img_mounted = mount_strobe;
+
+assign buttons = but_sw[1:0];
+assign switches = but_sw[3:2];
+assign scandoubler_disable = but_sw[4];
+assign ypbpr = but_sw[5];
+
+wire [7:0] spi_dout = { sbuf, SPI_DI};
+
+// this variant of user_io is for 8 bit cores (type == a4) only
+wire [7:0] core_type = 8'ha4;
+
+// command byte read by the io controller
+wire [7:0] sd_cmd = { 4'h5, sd_conf, sd_sdhc, sd_wr, sd_rd };
+
+reg spi_do;
+assign SPI_DO = CONF_DATA0 ? 1'bZ : spi_do;
+
+wire [7:0] kbd_led = { 2'b01, 4'b0000, ps2_caps_led, 1'b1};
+
+// drive MISO only when transmitting core id
+always@(negedge SPI_SCK) begin
+ if(!CONF_DATA0) begin
+ // first byte returned is always core type, further bytes are
+ // command dependent
+ if(byte_cnt == 0) begin
+ spi_do <= core_type[~bit_cnt];
+
+ end else begin
+ case(cmd)
+ // reading config string
+ 8'h14: begin
+ // returning a byte from string
+ if(byte_cnt < STRLEN + 1) spi_do <= conf_str[{STRLEN - byte_cnt,~bit_cnt}];
+ else spi_do <= 0;
+ end
+
+ // reading sd card status
+ 8'h16: begin
+ if(byte_cnt == 1) spi_do <= sd_cmd[~bit_cnt];
+ else if((byte_cnt >= 2) && (byte_cnt < 6)) spi_do <= sd_lba[{5-byte_cnt, ~bit_cnt}];
+ else spi_do <= 0;
+ end
+
+ // reading sd card write data
+ 8'h18:
+ spi_do <= b_data[~bit_cnt];
+
+ // reading keyboard LED status
+ 8'h1f:
+ spi_do <= kbd_led[~bit_cnt];
+
+ default:
+ spi_do <= 0;
+ endcase
+ end
+ end
+end
+
+reg b_wr2,b_wr3;
+always @(negedge clk_sys) begin
+ b_wr3 <= b_wr2;
+ sd_buff_wr <= b_wr3;
+end
+
+// SPI receiver
+always@(posedge SPI_SCK or posedge CONF_DATA0) begin
+
+ if(CONF_DATA0) begin
+ b_wr2 <= 0;
+ bit_cnt <= 0;
+ byte_cnt <= 0;
+ sd_ack <= 0;
+ sd_ack_conf <= 0;
+ end else begin
+ b_wr2 <= 0;
+
+ sbuf <= spi_dout[6:0];
+ bit_cnt <= bit_cnt + 1'd1;
+ if(bit_cnt == 5) begin
+ if (byte_cnt == 0) sd_buff_addr <= 0;
+ if((byte_cnt != 0) & (sd_buff_addr != 511)) sd_buff_addr <= sd_buff_addr + 1'b1;
+ if((byte_cnt == 1) & ((cmd == 8'h17) | (cmd == 8'h19))) sd_buff_addr <= 0;
+ end
+
+ // finished reading command byte
+ if(bit_cnt == 7) begin
+ if(~&byte_cnt) byte_cnt <= byte_cnt + 8'd1;
+ if(byte_cnt == 0) begin
+ cmd <= spi_dout;
+
+ if(spi_dout == 8'h19) begin
+ sd_ack_conf <= 1;
+ sd_buff_addr <= 0;
+ end
+ if((spi_dout == 8'h17) || (spi_dout == 8'h18)) begin
+ sd_ack <= 1;
+ sd_buff_addr <= 0;
+ end
+ if(spi_dout == 8'h18) b_data <= sd_buff_din;
+
+ mount_strobe <= 0;
+
+ end else begin
+
+ case(cmd)
+ // buttons and switches
+ 8'h01: but_sw <= spi_dout;
+ 8'h02: joystick_0 <= spi_dout;
+ 8'h03: joystick_1 <= spi_dout;
+
+ // store incoming ps2 mouse bytes
+ 8'h04: begin
+ ps2_mouse_fifo[ps2_mouse_wptr] <= spi_dout;
+ ps2_mouse_wptr <= ps2_mouse_wptr + 1'd1;
+ end
+
+ // store incoming ps2 keyboard bytes
+ 8'h05: begin
+ ps2_kbd_fifo[ps2_kbd_wptr] <= spi_dout;
+ ps2_kbd_wptr <= ps2_kbd_wptr + 1'd1;
+ end
+
+ 8'h15: status[7:0] <= spi_dout;
+
+ // send SD config IO -> FPGA
+ // flag that download begins
+ // sd card knows data is config if sd_dout_strobe is asserted
+ // with sd_ack still being inactive (low)
+ 8'h19,
+ // send sector IO -> FPGA
+ // flag that download begins
+ 8'h17: begin
+ sd_buff_dout <= spi_dout;
+ b_wr2 <= 1;
+ end
+
+ 8'h18: b_data <= sd_buff_din;
+
+ // joystick analog
+ 8'h1a: begin
+ // first byte is joystick index
+ if(byte_cnt == 1) stick_idx <= spi_dout[2:0];
+ else if(byte_cnt == 2) begin
+ // second byte is x axis
+ if(stick_idx == 0) joystick_analog_0[15:8] <= spi_dout;
+ else if(stick_idx == 1) joystick_analog_1[15:8] <= spi_dout;
+ end else if(byte_cnt == 3) begin
+ // third byte is y axis
+ if(stick_idx == 0) joystick_analog_0[7:0] <= spi_dout;
+ else if(stick_idx == 1) joystick_analog_1[7:0] <= spi_dout;
+ end
+ end
+
+ // notify image selection
+ 8'h1c: mount_strobe <= 1;
+
+ // send image info
+ 8'h1d: if(byte_cnt<5) img_size[(byte_cnt-1)<<3 +:8] <= spi_dout;
+
+ // status, 32bit version
+ 8'h1e: if(byte_cnt<5) status[(byte_cnt-1)<<3 +:8] <= spi_dout;
+ default: ;
+ endcase
+ end
+ end
+ end
+end
+
+
+/////////////////////////////// PS2 ///////////////////////////////
+// 8 byte fifos to store ps2 bytes
+localparam PS2_FIFO_BITS = 3;
+
+reg clk_ps2;
+always @(negedge clk_sys) begin
+ integer cnt;
+ cnt <= cnt + 1'd1;
+ if(cnt == PS2DIV) begin
+ clk_ps2 <= ~clk_ps2;
+ cnt <= 0;
+ end
+end
+
+// keyboard
+reg [7:0] ps2_kbd_fifo[1<= 1)&&(ps2_kbd_tx_state < 9)) begin
+ ps2_kbd_data <= ps2_kbd_tx_byte[0]; // data bits
+ ps2_kbd_tx_byte[6:0] <= ps2_kbd_tx_byte[7:1]; // shift down
+ if(ps2_kbd_tx_byte[0])
+ ps2_kbd_parity <= !ps2_kbd_parity;
+ end
+
+ // transmission of parity
+ if(ps2_kbd_tx_state == 9) ps2_kbd_data <= ps2_kbd_parity;
+
+ // transmission of stop bit
+ if(ps2_kbd_tx_state == 10) ps2_kbd_data <= 1; // stop bit is 1
+
+ // advance state machine
+ if(ps2_kbd_tx_state < 11) ps2_kbd_tx_state <= ps2_kbd_tx_state + 1'd1;
+ else ps2_kbd_tx_state <= 0;
+ end
+ end
+end
+
+// mouse
+reg [7:0] ps2_mouse_fifo[1<= 1)&&(ps2_mouse_tx_state < 9)) begin
+ ps2_mouse_data <= ps2_mouse_tx_byte[0]; // data bits
+ ps2_mouse_tx_byte[6:0] <= ps2_mouse_tx_byte[7:1]; // shift down
+ if(ps2_mouse_tx_byte[0])
+ ps2_mouse_parity <= !ps2_mouse_parity;
+ end
+
+ // transmission of parity
+ if(ps2_mouse_tx_state == 9) ps2_mouse_data <= ps2_mouse_parity;
+
+ // transmission of stop bit
+ if(ps2_mouse_tx_state == 10) ps2_mouse_data <= 1; // stop bit is 1
+
+ // advance state machine
+ if(ps2_mouse_tx_state < 11) ps2_mouse_tx_state <= ps2_mouse_tx_state + 1'd1;
+ else ps2_mouse_tx_state <= 0;
+ end
+ end
+end
+
+
+/////////////////////////////// DOWNLOADING ///////////////////////////////
+
+reg [7:0] data_w;
+reg [23:0] addr_w;
+reg rclk = 0;
+
+localparam UIO_FILE_TX = 8'h53;
+localparam UIO_FILE_TX_DAT = 8'h54;
+localparam UIO_FILE_INDEX = 8'h55;
+
+// data_io has its own SPI interface to the io controller
+always@(posedge SPI_SCK, posedge SPI_SS2) begin
+ reg [6:0] sbuf;
+ reg [7:0] cmd;
+ reg [4:0] cnt;
+ reg [23:0] addr;
+
+ if(SPI_SS2) cnt <= 0;
+ else begin
+ rclk <= 0;
+
+ // don't shift in last bit. It is evaluated directly
+ // when writing to ram
+ if(cnt != 15) sbuf <= { sbuf[5:0], SPI_DI};
+
+ // increase target address after write
+ if(rclk) addr <= addr + 1'd1;
+
+ // count 0-7 8-15 8-15 ...
+ if(cnt < 15) cnt <= cnt + 1'd1;
+ else cnt <= 8;
+
+ // finished command byte
+ if(cnt == 7) cmd <= {sbuf, SPI_DI};
+
+ // prepare/end transmission
+ if((cmd == UIO_FILE_TX) && (cnt == 15)) begin
+ // prepare
+ if(SPI_DI) begin
+ addr <= 0;
+ ioctl_download <= 1;
+ end else begin
+ addr_w <= addr;
+ ioctl_download <= 0;
+ end
+ end
+
+ // command 0x54: UIO_FILE_TX
+ if((cmd == UIO_FILE_TX_DAT) && (cnt == 15)) begin
+ addr_w <= addr;
+ data_w <= {sbuf, SPI_DI};
+ rclk <= 1;
+ end
+
+ // expose file (menu) index
+ if((cmd == UIO_FILE_INDEX) && (cnt == 15)) ioctl_index <= {sbuf, SPI_DI};
+ end
+end
+
+assign ioctl_wr = |ioctl_wrd;
+reg [1:0] ioctl_wrd;
+
+always@(negedge clk_sys) begin
+ reg rclkD, rclkD2;
+
+ rclkD <= rclk;
+ rclkD2 <= rclkD;
+ ioctl_wrd<= {ioctl_wrd[0],1'b0};
+
+ if(rclkD & ~rclkD2) begin
+ ioctl_dout <= data_w;
+ ioctl_addr <= addr_w;
+ ioctl_wrd <= 2'b11;
+ end
+end
+
+endmodule
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/pia6821.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/pia6821.vhd
new file mode 100644
index 00000000..6a403356
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/pia6821.vhd
@@ -0,0 +1,534 @@
+--===========================================================================--
+--
+-- S Y N T H E Z I A B L E I/O Port C O R E
+--
+-- www.OpenCores.Org - May 2004
+-- This core adheres to the GNU public license
+--
+-- File name : pia6821.vhd
+--
+-- Purpose : Implements 2 x 8 bit parallel I/O ports
+-- with programmable data direction registers
+--
+-- Dependencies : ieee.Std_Logic_1164
+-- ieee.std_logic_unsigned
+--
+-- Author : John E. Kent
+--
+--===========================================================================----
+--
+-- Revision History:
+--
+-- Date: Revision Author
+-- 1 May 2004 0.0 John Kent
+-- Initial version developed from ioport.vhd
+--
+--===========================================================================----
+--
+-- Memory Map
+--
+-- IO + $00 - Port A Data & Direction register
+-- IO + $01 - Port A Control register
+-- IO + $02 - Port B Data & Direction Direction Register
+-- IO + $03 - Port B Control Register
+--
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+
+entity pia6821 is
+ port (
+ clk : in std_logic;
+ rst : in std_logic;
+ cs : in std_logic;
+ rw : in std_logic;
+ addr : in std_logic_vector(1 downto 0);
+ data_in : in std_logic_vector(7 downto 0);
+ data_out : out std_logic_vector(7 downto 0);
+ irqa : out std_logic;
+ irqb : out std_logic;
+ pa_i : in std_logic_vector(7 downto 0);
+ pa_o : out std_logic_vector(7 downto 0);
+ ca1 : in std_logic;
+ ca2_i : in std_logic;
+ ca2_o : out std_logic;
+ pb_i : in std_logic_vector(7 downto 0);
+ pb_o : out std_logic_vector(7 downto 0);
+ cb1 : in std_logic;
+ cb2_i : in std_logic;
+ cb2_o : out std_logic
+ );
+end;
+
+architecture pia_arch of pia6821 is
+
+signal porta_ddr : std_logic_vector(7 downto 0);
+signal porta_data : std_logic_vector(7 downto 0);
+signal porta_ctrl : std_logic_vector(5 downto 0);
+signal porta_read : std_logic;
+
+signal portb_ddr : std_logic_vector(7 downto 0);
+signal portb_data : std_logic_vector(7 downto 0);
+signal portb_ctrl : std_logic_vector(5 downto 0);
+signal portb_read : std_logic;
+signal portb_write : std_logic;
+
+signal ca1_del : std_logic;
+signal ca1_rise : std_logic;
+signal ca1_fall : std_logic;
+signal ca1_edge : std_logic;
+signal irqa1 : std_logic;
+
+signal ca2_del : std_logic;
+signal ca2_rise : std_logic;
+signal ca2_fall : std_logic;
+signal ca2_edge : std_logic;
+signal irqa2 : std_logic;
+signal ca2_out : std_logic;
+
+signal cb1_del : std_logic;
+signal cb1_rise : std_logic;
+signal cb1_fall : std_logic;
+signal cb1_edge : std_logic;
+signal irqb1 : std_logic;
+
+signal cb2_del : std_logic;
+signal cb2_rise : std_logic;
+signal cb2_fall : std_logic;
+signal cb2_edge : std_logic;
+signal irqb2 : std_logic;
+signal cb2_out : std_logic;
+
+begin
+
+--------------------------------
+--
+-- read I/O port
+--
+--------------------------------
+
+pia_read : process( addr, cs,
+ irqa1, irqa2, irqb1, irqb2,
+ porta_ddr, portb_ddr,
+ porta_data, portb_data,
+ porta_ctrl, portb_ctrl,
+ pa_i, pb_i )
+variable count : integer;
+begin
+ case addr is
+ when "00" =>
+ for count in 0 to 7 loop
+ if porta_ctrl(2) = '0' then
+ data_out(count) <= porta_ddr(count);
+ porta_read <= '0';
+ else
+ if porta_ddr(count) = '1' then
+ data_out(count) <= porta_data(count);
+ else
+ data_out(count) <= pa_i(count);
+ end if;
+ porta_read <= cs;
+ end if;
+ end loop;
+ portb_read <= '0';
+
+ when "01" =>
+ data_out <= irqa1 & irqa2 & porta_ctrl;
+ porta_read <= '0';
+ portb_read <= '0';
+
+ when "10" =>
+ for count in 0 to 7 loop
+ if portb_ctrl(2) = '0' then
+ data_out(count) <= portb_ddr(count);
+ portb_read <= '0';
+ else
+ if portb_ddr(count) = '1' then
+ data_out(count) <= portb_data(count);
+ else
+ data_out(count) <= pb_i(count);
+ end if;
+ portb_read <= cs;
+ end if;
+ end loop;
+ porta_read <= '0';
+
+ when "11" =>
+ data_out <= irqb1 & irqb2 & portb_ctrl;
+ porta_read <= '0';
+ portb_read <= '0';
+
+ when others =>
+ data_out <= "00000000";
+ porta_read <= '0';
+ portb_read <= '0';
+
+ end case;
+end process;
+
+---------------------------------
+--
+-- Write I/O ports
+--
+---------------------------------
+
+pia_write : process( clk, rst, addr, cs, rw, data_in,
+ porta_ctrl, portb_ctrl,
+ porta_data, portb_data,
+ porta_ctrl, portb_ctrl,
+ porta_ddr, portb_ddr )
+begin
+ if rst = '1' then
+ porta_ddr <= "00000000";
+ porta_data <= "00000000";
+ porta_ctrl <= "000000";
+ portb_ddr <= "00000000";
+ portb_data <= "00000000";
+ portb_ctrl <= "000000";
+ portb_write <= '0';
+ elsif clk'event and clk = '1' then
+ if cs = '1' and rw = '0' then
+ case addr is
+ when "00" =>
+ if porta_ctrl(2) = '0' then
+ porta_ddr <= data_in;
+ porta_data <= porta_data;
+ else
+ porta_ddr <= porta_ddr;
+ porta_data <= data_in;
+ end if;
+ porta_ctrl <= porta_ctrl;
+ portb_ddr <= portb_ddr;
+ portb_data <= portb_data;
+ portb_ctrl <= portb_ctrl;
+ portb_write <= '0';
+ when "01" =>
+ porta_ddr <= porta_ddr;
+ porta_data <= porta_data;
+ porta_ctrl <= data_in(5 downto 0);
+ portb_ddr <= portb_ddr;
+ portb_data <= portb_data;
+ portb_ctrl <= portb_ctrl;
+ portb_write <= '0';
+ when "10" =>
+ porta_ddr <= porta_ddr;
+ porta_data <= porta_data;
+ porta_ctrl <= porta_ctrl;
+ if portb_ctrl(2) = '0' then
+ portb_ddr <= data_in;
+ portb_data <= portb_data;
+ portb_write <= '0';
+ else
+ portb_ddr <= portb_ddr;
+ portb_data <= data_in;
+ portb_write <= '1';
+ end if;
+ portb_ctrl <= portb_ctrl;
+ when "11" =>
+ porta_ddr <= porta_ddr;
+ porta_data <= porta_data;
+ porta_ctrl <= porta_ctrl;
+ portb_ddr <= portb_ddr;
+ portb_data <= portb_data;
+ portb_ctrl <= data_in(5 downto 0);
+ portb_write <= '0';
+ when others =>
+ porta_ddr <= porta_ddr;
+ porta_data <= porta_data;
+ porta_ctrl <= porta_ctrl;
+ portb_ddr <= portb_ddr;
+ portb_data <= portb_data;
+ portb_ctrl <= portb_ctrl;
+ portb_write <= '0';
+ end case;
+ else
+ porta_ddr <= porta_ddr;
+ porta_data <= porta_data;
+ porta_ctrl <= porta_ctrl;
+ portb_data <= portb_data;
+ portb_ddr <= portb_ddr;
+ portb_ctrl <= portb_ctrl;
+ portb_write <= '0';
+ end if;
+ end if;
+end process;
+
+---------------------------------
+--
+-- direction control port a
+--
+---------------------------------
+porta_direction : process ( porta_data, porta_ddr )
+variable count : integer;
+begin
+ for count in 0 to 7 loop
+ if porta_ddr(count) = '1' then
+ pa_o(count) <= porta_data(count);
+ else
+ pa_o(count) <= 'Z';
+ end if;
+ end loop;
+end process;
+
+---------------------------------
+--
+-- CA1 Edge detect
+--
+---------------------------------
+ca1_input : process( clk, rst, ca1, ca1_del,
+ ca1_rise, ca1_fall, ca1_edge,
+ irqa1, porta_ctrl, porta_read )
+begin
+ if rst = '1' then
+ ca1_del <= '0';
+ ca1_rise <= '0';
+ ca1_fall <= '0';
+ ca1_edge <= '0';
+ irqa1 <= '0';
+ elsif clk'event and clk = '0' then
+ ca1_del <= ca1;
+ ca1_rise <= (not ca1_del) and ca1;
+ ca1_fall <= ca1_del and (not ca1);
+ if ca1_edge = '1' then
+ irqa1 <= '1';
+ elsif porta_read = '1' then
+ irqa1 <= '0';
+ else
+ irqa1 <= irqa1;
+ end if;
+ end if;
+
+ if porta_ctrl(1) = '0' then
+ ca1_edge <= ca1_fall;
+ else
+ ca1_edge <= ca1_rise;
+ end if;
+end process;
+
+---------------------------------
+--
+-- CA2 Edge detect
+--
+---------------------------------
+ca2_input : process( clk, rst, ca2_i, ca2_del,
+ ca2_rise, ca2_fall, ca2_edge,
+ irqa2, porta_ctrl, porta_read )
+begin
+ if rst = '1' then
+ ca2_del <= '0';
+ ca2_rise <= '0';
+ ca2_fall <= '0';
+ ca2_edge <= '0';
+ irqa2 <= '0';
+ elsif clk'event and clk = '0' then
+ ca2_del <= ca2_i;
+ ca2_rise <= (not ca2_del) and ca2_i;
+ ca2_fall <= ca2_del and (not ca2_i);
+ if porta_ctrl(5) = '0' and ca2_edge = '1' then
+ irqa2 <= '1';
+ elsif porta_read = '1' then
+ irqa2 <= '0';
+ else
+ irqa2 <= irqa2;
+ end if;
+ end if;
+
+ if porta_ctrl(4) = '0' then
+ ca2_edge <= ca2_fall;
+ else
+ ca2_edge <= ca2_rise;
+ end if;
+end process;
+
+---------------------------------
+--
+-- CA2 output control
+--
+---------------------------------
+ca2_output : process( clk, rst, porta_ctrl, porta_read, ca1_edge, ca2_out )
+begin
+ if rst='1' then
+ ca2_out <= '0';
+ elsif clk'event and clk='0' then
+ case porta_ctrl(5 downto 3) is
+ when "100" => -- read PA clears, CA1 edge sets
+ if porta_read = '1' then
+ ca2_out <= '0';
+ elsif ca1_edge = '1' then
+ ca2_out <= '1';
+ else
+ ca2_out <= ca2_out;
+ end if;
+ when "101" => -- read PA clears, E sets
+ ca2_out <= not porta_read;
+ when "110" => -- set low
+ ca2_out <= '0';
+ when "111" => -- set high
+ ca2_out <= '1';
+ when others => -- no change
+ ca2_out <= ca2_out;
+ end case;
+ end if;
+end process;
+
+---------------------------------
+--
+-- CA2 direction control
+--
+---------------------------------
+ca2_direction : process( porta_ctrl, ca2_out )
+begin
+ if porta_ctrl(5) = '0' then
+ ca2_o <= 'Z';
+ else
+ ca2_o <= ca2_out;
+ end if;
+end process;
+
+---------------------------------
+--
+-- direction control port b
+--
+---------------------------------
+portb_direction : process ( portb_data, portb_ddr )
+variable count : integer;
+begin
+ for count in 0 to 7 loop
+ if portb_ddr(count) = '1' then
+ pb_o(count) <= portb_data(count);
+ else
+ pb_o(count) <= 'Z';
+ end if;
+ end loop;
+end process;
+
+---------------------------------
+--
+-- CB1 Edge detect
+--
+---------------------------------
+cb1_input : process( clk, rst, cb1, cb1_del,
+ cb1_rise, cb1_fall, cb1_edge,
+ irqb1, portb_ctrl, portb_read )
+begin
+ if rst = '1' then
+ cb1_del <= '0';
+ cb1_rise <= '0';
+ cb1_fall <= '0';
+ cb1_edge <= '0';
+ irqb1 <= '0';
+ elsif clk'event and clk = '0' then
+ cb1_del <= cb1;
+ cb1_rise <= (not cb1_del) and cb1;
+ cb1_fall <= cb1_del and (not cb1);
+ if cb1_edge = '1' then
+ irqb1 <= '1';
+ elsif portb_read = '1' then
+ irqb1 <= '0';
+ else
+ irqb1 <= irqb1;
+ end if;
+ end if;
+
+ if portb_ctrl(1) = '0' then
+ cb1_edge <= cb1_fall;
+ else
+ cb1_edge <= cb1_rise;
+ end if;
+end process;
+
+---------------------------------
+--
+-- CB2 Edge detect
+--
+---------------------------------
+cb2_input : process( clk, rst, cb2_i, cb2_del,
+ cb2_rise, cb2_fall, cb2_edge,
+ irqb2, portb_ctrl, portb_read )
+begin
+ if rst = '1' then
+ cb2_del <= '0';
+ cb2_rise <= '0';
+ cb2_fall <= '0';
+ cb2_edge <= '0';
+ irqb2 <= '0';
+ elsif clk'event and clk = '0' then
+ cb2_del <= cb2_i;
+ cb2_rise <= (not cb2_del) and cb2_i;
+ cb2_fall <= cb2_del and (not cb2_i);
+ if portb_ctrl(5) = '0' and cb2_edge = '1' then
+ irqb2 <= '1';
+ elsif portb_read = '1' then
+ irqb2 <= '0';
+ else
+ irqb2 <= irqb2;
+ end if;
+ end if;
+
+ if portb_ctrl(4) = '0' then
+ cb2_edge <= cb2_fall;
+ else
+ cb2_edge <= cb2_rise;
+ end if;
+
+end process;
+
+---------------------------------
+--
+-- CB2 output control
+--
+---------------------------------
+cb2_output : process( clk, rst, portb_ctrl, portb_write, cb1_edge, cb2_out )
+begin
+ if rst='1' then
+ cb2_out <= '0';
+ elsif clk'event and clk='0' then
+ case portb_ctrl(5 downto 3) is
+ when "100" => -- write PB clears, CA1 edge sets
+ if portb_write = '1' then
+ cb2_out <= '0';
+ elsif cb1_edge = '1' then
+ cb2_out <= '1';
+ else
+ cb2_out <= cb2_out;
+ end if;
+ when "101" => -- write PB clears, E sets
+ cb2_out <= not portb_write;
+ when "110" => -- set low
+ cb2_out <= '0';
+ when "111" => -- set high
+ cb2_out <= '1';
+ when others => -- no change
+ cb2_out <= cb2_out;
+ end case;
+ end if;
+end process;
+
+---------------------------------
+--
+-- CB2 direction control
+--
+---------------------------------
+cb2_direction : process( portb_ctrl, cb2_out )
+begin
+ if portb_ctrl(5) = '0' then
+ cb2_o <= 'Z';
+ else
+ cb2_o <= cb2_out;
+ end if;
+end process;
+
+---------------------------------
+--
+-- IRQ control
+--
+---------------------------------
+pia_irq : process( irqa1, irqa2, irqb1, irqb2, porta_ctrl, portb_ctrl )
+begin
+ irqa <= (irqa1 and porta_ctrl(0)) or (irqa2 and porta_ctrl(3));
+ irqb <= (irqb1 and portb_ctrl(0)) or (irqb2 and portb_ctrl(3));
+end process;
+
+end pia_arch;
+
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/williams_snd_pll.qip b/Soundboards_MiST/AS-2518-51_snd-master/rtl/williams_snd_pll.qip
new file mode 100644
index 00000000..7c22c6f7
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/williams_snd_pll.qip
@@ -0,0 +1,4 @@
+set_global_assignment -name IP_TOOL_NAME "ALTPLL"
+set_global_assignment -name IP_TOOL_VERSION "13.1"
+set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "williams_snd_pll.vhd"]
+set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "williams_snd_pll.ppf"]
diff --git a/Soundboards_MiST/AS-2518-51_snd-master/rtl/williams_snd_pll.vhd b/Soundboards_MiST/AS-2518-51_snd-master/rtl/williams_snd_pll.vhd
new file mode 100644
index 00000000..3162a251
--- /dev/null
+++ b/Soundboards_MiST/AS-2518-51_snd-master/rtl/williams_snd_pll.vhd
@@ -0,0 +1,355 @@
+-- megafunction wizard: %ALTPLL%
+-- GENERATION: STANDARD
+-- VERSION: WM1.0
+-- MODULE: altpll
+
+-- ============================================================
+-- File Name: williams_snd_pll.vhd
+-- Megafunction Name(s):
+-- altpll
+--
+-- Simulation Library Files(s):
+-- altera_mf
+-- ============================================================
+-- ************************************************************
+-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
+--
+-- 13.1.0 Build 162 10/23/2013 SJ Web Edition
+-- ************************************************************
+
+
+--Copyright (C) 1991-2013 Altera Corporation
+--Your use of Altera Corporation's design tools, logic functions
+--and other software and tools, and its AMPP partner logic
+--functions, and any output files from any of the foregoing
+--(including device programming or simulation files), and any
+--associated documentation or information are expressly subject
+--to the terms and conditions of the Altera Program License
+--Subscription Agreement, Altera MegaCore Function License
+--Agreement, or other applicable license agreement, including,
+--without limitation, that your use is for the sole purpose of
+--programming logic devices manufactured by Altera and sold by
+--Altera or its authorized distributors. Please refer to the
+--applicable agreement for further details.
+
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.all;
+
+LIBRARY altera_mf;
+USE altera_mf.all;
+
+ENTITY williams_snd_pll IS
+ PORT
+ (
+ areset : IN STD_LOGIC := '0';
+ inclk0 : IN STD_LOGIC := '0';
+ c0 : OUT STD_LOGIC
+ );
+END williams_snd_pll;
+
+
+ARCHITECTURE SYN OF williams_snd_pll IS
+
+ SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0);
+ SIGNAL sub_wire1 : STD_LOGIC ;
+ SIGNAL sub_wire2 : STD_LOGIC ;
+ SIGNAL sub_wire3 : STD_LOGIC_VECTOR (1 DOWNTO 0);
+ SIGNAL sub_wire4_bv : BIT_VECTOR (0 DOWNTO 0);
+ SIGNAL sub_wire4 : STD_LOGIC_VECTOR (0 DOWNTO 0);
+
+
+
+ COMPONENT altpll
+ GENERIC (
+ bandwidth_type : STRING;
+ clk0_divide_by : NATURAL;
+ clk0_duty_cycle : NATURAL;
+ clk0_multiply_by : NATURAL;
+ clk0_phase_shift : STRING;
+ compensate_clock : STRING;
+ inclk0_input_frequency : NATURAL;
+ intended_device_family : STRING;
+ lpm_hint : STRING;
+ lpm_type : STRING;
+ operation_mode : STRING;
+ pll_type : STRING;
+ port_activeclock : STRING;
+ port_areset : STRING;
+ port_clkbad0 : STRING;
+ port_clkbad1 : STRING;
+ port_clkloss : STRING;
+ port_clkswitch : STRING;
+ port_configupdate : STRING;
+ port_fbin : STRING;
+ port_inclk0 : STRING;
+ port_inclk1 : STRING;
+ port_locked : STRING;
+ port_pfdena : STRING;
+ port_phasecounterselect : STRING;
+ port_phasedone : STRING;
+ port_phasestep : STRING;
+ port_phaseupdown : STRING;
+ port_pllena : STRING;
+ port_scanaclr : STRING;
+ port_scanclk : STRING;
+ port_scanclkena : STRING;
+ port_scandata : STRING;
+ port_scandataout : STRING;
+ port_scandone : STRING;
+ port_scanread : STRING;
+ port_scanwrite : STRING;
+ port_clk0 : STRING;
+ port_clk1 : STRING;
+ port_clk2 : STRING;
+ port_clk3 : STRING;
+ port_clk4 : STRING;
+ port_clk5 : STRING;
+ port_clkena0 : STRING;
+ port_clkena1 : STRING;
+ port_clkena2 : STRING;
+ port_clkena3 : STRING;
+ port_clkena4 : STRING;
+ port_clkena5 : STRING;
+ port_extclk0 : STRING;
+ port_extclk1 : STRING;
+ port_extclk2 : STRING;
+ port_extclk3 : STRING;
+ width_clock : NATURAL
+ );
+ PORT (
+ areset : IN STD_LOGIC ;
+ clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0);
+ inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0)
+ );
+ END COMPONENT;
+
+BEGIN
+ sub_wire4_bv(0 DOWNTO 0) <= "0";
+ sub_wire4 <= To_stdlogicvector(sub_wire4_bv);
+ sub_wire1 <= sub_wire0(0);
+ c0 <= sub_wire1;
+ sub_wire2 <= inclk0;
+ sub_wire3 <= sub_wire4(0 DOWNTO 0) & sub_wire2;
+
+ altpll_component : altpll
+ GENERIC MAP (
+ bandwidth_type => "AUTO",
+ clk0_divide_by => 1350,
+ clk0_duty_cycle => 50,
+ clk0_multiply_by => 179,
+ clk0_phase_shift => "0",
+ compensate_clock => "CLK0",
+ inclk0_input_frequency => 37037,
+ intended_device_family => "Cyclone III",
+ lpm_hint => "CBX_MODULE_PREFIX=williams_snd_pll",
+ lpm_type => "altpll",
+ operation_mode => "NORMAL",
+ pll_type => "AUTO",
+ port_activeclock => "PORT_UNUSED",
+ port_areset => "PORT_USED",
+ port_clkbad0 => "PORT_UNUSED",
+ port_clkbad1 => "PORT_UNUSED",
+ port_clkloss => "PORT_UNUSED",
+ port_clkswitch => "PORT_UNUSED",
+ port_configupdate => "PORT_UNUSED",
+ port_fbin => "PORT_UNUSED",
+ port_inclk0 => "PORT_USED",
+ port_inclk1 => "PORT_UNUSED",
+ port_locked => "PORT_UNUSED",
+ port_pfdena => "PORT_UNUSED",
+ port_phasecounterselect => "PORT_UNUSED",
+ port_phasedone => "PORT_UNUSED",
+ port_phasestep => "PORT_UNUSED",
+ port_phaseupdown => "PORT_UNUSED",
+ port_pllena => "PORT_UNUSED",
+ port_scanaclr => "PORT_UNUSED",
+ port_scanclk => "PORT_UNUSED",
+ port_scanclkena => "PORT_UNUSED",
+ port_scandata => "PORT_UNUSED",
+ port_scandataout => "PORT_UNUSED",
+ port_scandone => "PORT_UNUSED",
+ port_scanread => "PORT_UNUSED",
+ port_scanwrite => "PORT_UNUSED",
+ port_clk0 => "PORT_USED",
+ port_clk1 => "PORT_UNUSED",
+ port_clk2 => "PORT_UNUSED",
+ port_clk3 => "PORT_UNUSED",
+ port_clk4 => "PORT_UNUSED",
+ port_clk5 => "PORT_UNUSED",
+ port_clkena0 => "PORT_UNUSED",
+ port_clkena1 => "PORT_UNUSED",
+ port_clkena2 => "PORT_UNUSED",
+ port_clkena3 => "PORT_UNUSED",
+ port_clkena4 => "PORT_UNUSED",
+ port_clkena5 => "PORT_UNUSED",
+ port_extclk0 => "PORT_UNUSED",
+ port_extclk1 => "PORT_UNUSED",
+ port_extclk2 => "PORT_UNUSED",
+ port_extclk3 => "PORT_UNUSED",
+ width_clock => 5
+ )
+ PORT MAP (
+ areset => areset,
+ inclk => sub_wire3,
+ clk => sub_wire0
+ );
+
+
+
+END SYN;
+
+-- ============================================================
+-- CNX file retrieval info
+-- ============================================================
+-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0"
+-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000"
+-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1"
+-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz"
+-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low"
+-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1"
+-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0"
+-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0"
+-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0"
+-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "1"
+-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0"
+-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0"
+-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0"
+-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0"
+-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0"
+-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8"
+-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1350"
+-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000"
+-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "3.580000"
+-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0"
+-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0"
+-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1"
+-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0"
+-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0"
+-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575"
+-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1"
+-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000"
+-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz"
+-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000"
+-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1"
+-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1"
+-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz"
+-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
+-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1"
+-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0"
+-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1"
+-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available"
+-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0"
+-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg"
+-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any"
+-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0"
+-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "179"
+-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
+-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "3.58000000"
+-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0"
+-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
+-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1"
+-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000"
+-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg"
+-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1"
+-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1"
+-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0"
+-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0"
+-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0"
+-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0"
+-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0"
+-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "williams_snd_pll.mif"
+-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0"
+-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1"
+-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0"
+-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0"
+-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0"
+-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000"
+-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz"
+-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500"
+-- Retrieval info: PRIVATE: SPREAD_USE STRING "0"
+-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0"
+-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1"
+-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1"
+-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1"
+-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
+-- Retrieval info: PRIVATE: USE_CLK0 STRING "1"
+-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0"
+-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0"
+-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0"
+-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
+-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO"
+-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "1350"
+-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50"
+-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "179"
+-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0"
+-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0"
+-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037"
+-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
+-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll"
+-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL"
+-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO"
+-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_USED"
+-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED"
+-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED"
+-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5"
+-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]"
+-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]"
+-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset"
+-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0"
+-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0"
+-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0
+-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0
+-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0
+-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0
+-- Retrieval info: GEN_FILE: TYPE_NORMAL williams_snd_pll.vhd TRUE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL williams_snd_pll.ppf TRUE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL williams_snd_pll.inc FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL williams_snd_pll.cmp FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL williams_snd_pll.bsf FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL williams_snd_pll_inst.vhd FALSE
+-- Retrieval info: LIB_FILE: altera_mf
+-- Retrieval info: CBX_MODULE_PREFIX: ON