From 1d98e4b642e3cd1e72b451eb9fae10b1576d1c52 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sun, 1 Mar 2020 01:53:56 +0100 Subject: [PATCH 01/35] LodeRunner: clocking and video fix --- .../LodeRunner_MiST/rtl/Graphics.VHD | 1 - .../LodeRunner_MiST/rtl/LodeRunner_MiST.sv | 94 ++++++++++--------- .../LodeRunner_MiST/rtl/platform_pkg.vhd | 60 ++++++------ .../LodeRunner_MiST/rtl/pll_mist.vhd | 58 ++++++------ .../LodeRunner_MiST/rtl/target_top.vhd | 62 ++++++------ .../LodeRunner_MiST/rtl/video_controller.vhd | 10 ++ .../rtl/video_controller_pkg.vhd | 3 +- 7 files changed, 151 insertions(+), 137 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD index 8dc75400..dc3fb666 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD @@ -269,5 +269,4 @@ begin sprite_ctl_o <= sprite_ctl_o_s; - end SYN; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv index bbc4ef58..a244cfc1 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv @@ -40,7 +40,10 @@ localparam CONF_STR = { "V,v1.0.",`BUILD_DATE }; - +wire rotate = status[2]; +wire [1:0] scanlines = status[4:3]; +wire blend = status[5]; +wire service = status[6]; assign LED = ~ioctl_downl; assign SDRAM_CLK = clk_sd; @@ -65,21 +68,39 @@ wire [7:0] joystick_0; wire [7:0] joystick_1; wire scandoublerD; wire ypbpr; -wire [11:0] audio; -wire hs, vs; -wire blankn = 1'b1;//todo -wire [3:0] g,b,r; +wire no_csync; wire key_pressed; wire [7:0] key_code; wire key_strobe; +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .no_csync (no_csync ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + wire [14:0] rom_addr; wire [15:0] rom_do; wire [13:0] snd_addr; wire [15:0] snd_do; - wire [14:0] sp_addr; wire [31:0] sp_do; @@ -165,15 +186,20 @@ always @(posedge clk_sys) begin end +wire [11:0] audio; +wire hs, vs; +wire blankn = 1'b1;//todo +wire [3:0] g,b,r; + target_top target_top( - .clock_50(clk_sys),//40MHz - .clock_vid(clk_vid),//25.263158MHz + .clock_sys(clk_sys),//4xclk_vid + .clock_vid(clk_vid),//11MHz .clk_aud(clk_aud),//0.895MHz .reset_in(reset), .audio_out(audio), .usr_coin1(m_coin1), .usr_coin2(m_coin2), - .usr_service(status[6]), + .usr_service(service), .usr_start1(m_one_player), .usr_start2(m_two_players), .p1_up(m_up), @@ -188,18 +214,18 @@ target_top target_top( .p2_rt(m_right2), .p2_f1(m_fire2A), .p2_f2(m_fire2B), - .VGA_VS(hs), - .VGA_HS(vs), - .VGA_R(r), - .VGA_G(g), - .VGA_B(b), + .VGA_VS(vs), + .VGA_HS(hs), + .VGA_R(r), + .VGA_G(g), + .VGA_B(b), .cpu_rom_addr(rom_addr), .cpu_rom_do( rom_addr[0] ? rom_do[15:8] : rom_do[7:0] ), .snd_rom_addr(snd_addr), - .snd_rom_do(snd_addr[0] ? snd_do[15:8] : snd_do[7:0]) + .snd_rom_do(snd_addr[0] ? snd_do[15:8] : snd_do[7:0]) ); -mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(9)) mist_video( +mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video( .clk_sys ( clk_sys ), .SPI_SCK ( SPI_SCK ), .SPI_SS3 ( SPI_SS3 ), @@ -214,33 +240,13 @@ mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(9)) mist_video( .VGA_B ( VGA_B ), .VGA_VS ( VGA_VS ), .VGA_HS ( VGA_HS ), - .rotate ( { 1'b1, status[2] } ), - .ce_divider ( 1'b1 ), - .scandoubler_disable( 1),//scandoublerD ), - .scanlines ( status[4:3] ), - .blend ( status[5] ), - .ypbpr ( ypbpr ) - ); - -user_io #( - .STRLEN(($size(CONF_STR)>>3))) -user_io( - .clk_sys (clk_sys ), - .conf_str (CONF_STR ), - .SPI_CLK (SPI_SCK ), - .SPI_SS_IO (CONF_DATA0 ), - .SPI_MISO (SPI_DO ), - .SPI_MOSI (SPI_DI ), - .buttons (buttons ), - .switches (switches ), - .scandoubler_disable (scandoublerD ), - .ypbpr (ypbpr ), - .key_strobe (key_strobe ), - .key_pressed (key_pressed ), - .key_code (key_code ), - .joystick_0 (joystick_0 ), - .joystick_1 (joystick_1 ), - .status (status ) + .rotate ( { 1'b1, rotate } ), + .ce_divider ( 1'b0 ), + .scandoubler_disable( scandoublerD ), + .scanlines ( scanlines ), + .blend ( blend ), + .ypbpr ( ypbpr ), + .no_csync ( no_csync ) ); wire dac_o; @@ -267,7 +273,7 @@ arcade_inputs inputs ( .key_code ( key_code ), .joystick_0 ( joystick_0 ), .joystick_1 ( joystick_1 ), - .rotate ( status[2] ), + .rotate ( rotate ), .orientation ( 2'b10 ), .joyswap ( 1'b0 ), .oneplayer ( 1'b1 ), diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd index cc47e1a0..7a9667eb 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd @@ -8,42 +8,44 @@ use work.platform_variant_pkg.all; use work.video_controller_pkg.all; package platform_pkg is - constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_VGA_640x480_60Hz; - constant PACE_CLK0_DIVIDE_BY : natural := 3; - constant PACE_CLK0_MULTIPLY_BY : natural := 5; -- 24*5/3 = 40MHz - constant PACE_CLK1_DIVIDE_BY : natural := 19; - constant PACE_CLK1_MULTIPLY_BY : natural := 20; -- 24*20/19 = 25.263158MHz - constant PACE_VIDEO_H_SCALE : integer := 1; - constant PACE_VIDEO_V_SCALE : integer := 1; - constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; - constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; +-- constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_VGA_640x480_60Hz; +-- constant PACE_CLK0_DIVIDE_BY : natural := 3; +-- constant PACE_CLK0_MULTIPLY_BY : natural := 5; -- 24*5/3 = 40MHz +-- constant PACE_CLK1_DIVIDE_BY : natural := 19; +-- constant PACE_CLK1_MULTIPLY_BY : natural := 20; -- 24*20/19 = 25.263158MHz +-- constant PACE_VIDEO_H_SCALE : integer := 1; +-- constant PACE_VIDEO_V_SCALE : integer := 1; +-- constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; +-- constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; -- constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_ARCADE_STD_336x240_60Hz; --- constant PACE_CLK0_DIVIDE_BY : natural := 1; --- constant PACE_CLK0_MULTIPLY_BY : natural := 1; -- 24*1/1 = 24MHz --- constant PACE_CLK1_DIVIDE_BY : natural := 57; --- constant PACE_CLK1_MULTIPLY_BY : natural := 17; -- 24*17/57 = 7.157895MHz +-- constant PACE_CLK0_DIVIDE_BY : natural := 19; +-- constant PACE_CLK0_MULTIPLY_BY : natural := 20; -- 27*20/19 = 24MHz +-- constant PACE_CLK1_DIVIDE_BY : natural := 19; +-- constant PACE_CLK1_MULTIPLY_BY : natural := 5; -- 27*5/19 = 7.157895MHz -- constant PACE_VIDEO_H_SCALE : integer := 1; -- constant PACE_VIDEO_V_SCALE : integer := 1; -- constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; -- constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; - - --constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_CVBS_720x288p_50Hz; - --constant PACE_CLK0_DIVIDE_BY : natural := 8; - --constant PACE_CLK0_MULTIPLY_BY : natural := 9; -- 24*9/8 = 27MHz - --constant PACE_CLK1_DIVIDE_BY : natural := 16; - --constant PACE_CLK1_MULTIPLY_BY : natural := 9; -- 24*9/16 = 13.5MHz - --constant PACE_VIDEO_H_SCALE : integer := 2; - --constant PACE_VIDEO_V_SCALE : integer := 1; - --constant PACE_ENABLE_ADV724 : std_logic := '1'; - --constant USE_VIDEO_VBLANK_INTERRUPT : boolean := false; + + constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_PAL_576x288_50Hz; + constant PACE_CLK0_DIVIDE_BY : natural := 27; + constant PACE_CLK0_MULTIPLY_BY : natural := 44; -- 27*44/27 = 44MHz + constant PACE_CLK1_DIVIDE_BY : natural := 27; + constant PACE_CLK1_MULTIPLY_BY : natural := 11; -- 27*11/27 = 11MHz + constant PACE_VIDEO_H_SCALE : integer := 1; + constant PACE_VIDEO_V_SCALE : integer := 1; + constant PACE_ENABLE_ADV724 : std_logic := '1'; + constant USE_VIDEO_VBLANK_INTERRUPT : boolean := false; + constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '1'; + constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '1'; constant PACE_VIDEO_BORDER_RGB : RGB_t := RGB_BLACK; constant M62_VIDEO_H_SIZE : integer := 384; constant M62_VIDEO_H_OFFSET : integer := (512-M62_VIDEO_H_SIZE)/2; constant M62_VIDEO_V_SIZE : integer := 256; - + constant PACE_VIDEO_NUM_BITMAPS : natural := 0; constant PACE_VIDEO_NUM_TILEMAPS : natural := 1; constant PACE_VIDEO_NUM_SPRITES : natural := 32; @@ -52,18 +54,14 @@ package platform_pkg is constant PACE_VIDEO_L_CROP : integer := 0; constant PACE_VIDEO_R_CROP : integer := PACE_VIDEO_L_CROP; constant PACE_VIDEO_PIPELINE_DELAY : integer := 5; - + constant PACE_INPUTS_NUM_BYTES : integer := 6; - + constant CLK0_FREQ_MHz : natural := 27 * PACE_CLK0_MULTIPLY_BY / PACE_CLK0_DIVIDE_BY; constant CPU_FREQ_MHz : natural := 3; - - constant M62_CPU_CLK_ENA_DIVIDE_BY : natural := CLK0_FREQ_MHz / CPU_FREQ_MHz; - - - + constant M62_CPU_CLK_ENA_DIVIDE_BY : natural := CLK0_FREQ_MHz / CPU_FREQ_MHz; type from_PLATFORM_IO_t is record not_used : std_logic; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pll_mist.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pll_mist.vhd index 8e360627..ebe4c7e7 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pll_mist.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pll_mist.vhd @@ -14,11 +14,11 @@ -- ************************************************************ -- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! -- --- 13.1.0 Build 162 10/23/2013 SJ Web Edition +-- 13.1.4 Build 182 03/12/2014 Patches 4.26 SJ Web Edition -- ************************************************************ ---Copyright (C) 1991-2013 Altera Corporation +--Copyright (C) 1991-2014 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 @@ -166,19 +166,19 @@ BEGIN bandwidth_type => "AUTO", clk0_divide_by => 27, clk0_duty_cycle => 50, - clk0_multiply_by => 40, + clk0_multiply_by => 44, clk0_phase_shift => "0", - clk1_divide_by => 43, + clk1_divide_by => 27, clk1_duty_cycle => 50, - clk1_multiply_by => 40, + clk1_multiply_by => 11, clk1_phase_shift => "0", - clk2_divide_by => 3, + clk2_divide_by => 27, clk2_duty_cycle => 50, - clk2_multiply_by => 8, + clk2_multiply_by => 88, clk2_phase_shift => "0", - clk3_divide_by => 5400, + clk3_divide_by => 9000, clk3_duty_cycle => 50, - clk3_multiply_by => 179, + clk3_multiply_by => 299, clk3_phase_shift => "0", compensate_clock => "CLK0", inclk0_input_frequency => 37037, @@ -262,17 +262,17 @@ END SYN; -- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" -- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" -- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" --- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "43" --- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "3" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "27" -- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "27" -- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE3 STRING "50.00000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "40.000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "25.116280" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "72.000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "0.895000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "44.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "11.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "88.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "0.897000" -- 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" @@ -301,15 +301,15 @@ END SYN; -- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" -- Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0" -- Retrieval info: PRIVATE: MIRROR_CLK3 STRING "0" --- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "40" --- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "40" --- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "8" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "44" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "11" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "88" -- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" -- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" --- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "40.00000000" --- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "25.26315800" --- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "72.00000000" --- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "0.89500000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "44.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "11.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "88.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "0.89700000" -- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" -- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" -- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" @@ -371,19 +371,19 @@ END SYN; -- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" -- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" -- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "40" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "44" -- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" --- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "43" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" -- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "40" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "11" -- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" --- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "3" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "27" -- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "8" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "88" -- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" --- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "5400" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "9000" -- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "179" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "299" -- Retrieval info: CONSTANT: CLK3_PHASE_SHIFT STRING "0" -- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" -- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd index a4bbbccb..afc9e59f 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd @@ -9,40 +9,40 @@ use work.video_controller_pkg.all; use work.platform_pkg.all; entity target_top is port( - clock_50 : in std_logic; + clock_sys : in std_logic; clock_vid : in std_logic; clk_aud : in std_logic; - reset_in : in std_logic; - audio_out : out std_logic_vector(11 downto 0); + reset_in : in std_logic; + audio_out : out std_logic_vector(11 downto 0); usr_coin1 : in std_logic; - usr_coin2 : in std_logic; - usr_service : in std_logic; - usr_start1 : in std_logic; - usr_start2 : in std_logic; - p1_up : in std_logic; - p1_dw : in std_logic; - p1_lt : in std_logic; - p1_rt : in std_logic; - p1_f1 : in std_logic; - p1_f2 : in std_logic; + usr_coin2 : in std_logic; + usr_service : in std_logic; + usr_start1 : in std_logic; + usr_start2 : in std_logic; + p1_up : in std_logic; + p1_dw : in std_logic; + p1_lt : in std_logic; + p1_rt : in std_logic; + p1_f1 : in std_logic; + p1_f2 : in std_logic; - p2_up : in std_logic; - p2_dw : in std_logic; - p2_lt : in std_logic; - p2_rt : in std_logic; - p2_f1 : in std_logic; - p2_f2 : in std_logic; - - VGA_VS : out std_logic; - VGA_HS : out std_logic; - VGA_R : out std_logic_vector(3 downto 0); - VGA_G : out std_logic_vector(3 downto 0); - VGA_B : out std_logic_vector(3 downto 0); - cpu_rom_addr : out std_logic_vector(14 downto 0); - cpu_rom_do : in std_logic_vector(7 downto 0); - snd_rom_addr : out std_logic_vector(13 downto 0); - snd_rom_do : in std_logic_vector(7 downto 0) - ); + p2_up : in std_logic; + p2_dw : in std_logic; + p2_lt : in std_logic; + p2_rt : in std_logic; + p2_f1 : in std_logic; + p2_f2 : in std_logic; + + VGA_VS : out std_logic; + VGA_HS : out std_logic; + VGA_R : out std_logic_vector(3 downto 0); + VGA_G : out std_logic_vector(3 downto 0); + VGA_B : out std_logic_vector(3 downto 0); + cpu_rom_addr : out std_logic_vector(14 downto 0); + cpu_rom_do : in std_logic_vector(7 downto 0); + snd_rom_addr : out std_logic_vector(13 downto 0); + snd_rom_do : in std_logic_vector(7 downto 0) + ); end target_top; architecture SYN of target_top is @@ -59,7 +59,7 @@ architecture SYN of target_top is signal sound_data : std_logic_vector(7 downto 0); begin - clkrst_i.clk(0) <= clock_50; + clkrst_i.clk(0) <= clock_sys; clkrst_i.clk(1) <= clock_vid; clkrst_i.arst <= reset_in; clkrst_i.arst_n <= not clkrst_i.arst; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd index 14da0c20..9372578d 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd @@ -258,6 +258,16 @@ begin v_back_porch_r <= 13; v_border_r <= (240-VIDEO_V_SIZE)/2; + when PACE_VIDEO_PAL_576x288_50Hz => + -- pixclk=11 MHz + h_front_porch_r <= 2*6; + h_sync_r <= 2*28; + h_back_porch_r <= 2*30; + h_border_r <= (576-VIDEO_H_SIZE)/2; + v_front_porch_r <= 8; + v_sync_r <= 3; + v_back_porch_r <= 13; + v_border_r <= (288-VIDEO_V_SIZE)/2; when others => null; end case; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd index 183bfe23..526be3c8 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd @@ -21,7 +21,8 @@ package video_controller_pkg is PACE_VIDEO_ARCADE_STD_336x240_60Hz, -- arcade std resolution (7.16MHz) PACE_VIDEO_ARCADE_STD_336x240_60Hz_28M64, -- arcade std resolution (28.64MHz) PACE_VIDEO_CVBS_720x288p_50Hz, -- generic composite - PACE_VIDEO_LCM_320x240_60Hz -- DE2 LCD + PACE_VIDEO_LCM_320x240_60Hz, -- DE2 LCD + PACE_VIDEO_PAL_576x288_50Hz ); type PACEVideoDisplay_t is From 723e8ebbcd7d24b24ba3ceeb38d3b159615d686e Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sun, 1 Mar 2020 21:07:48 +0100 Subject: [PATCH 02/35] LodeRunner: sound works (not sure if it's fully correct) --- .../LodeRunner_MiST/LodeRunner_MiST.sdc | 140 ++++++++++++++++++ .../LodeRunner_MiST/rtl/LodeRunner_MiST.sv | 20 ++- .../LodeRunner_MiST/rtl/Sound_Board.vhd | 32 ++-- .../LodeRunner_MiST/rtl/pace.vhd | 6 +- .../LodeRunner_MiST/rtl/platform.vhd | 31 ++-- .../LodeRunner_MiST/rtl/target_top.vhd | 32 ++-- 6 files changed, 207 insertions(+), 54 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.sdc diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.sdc b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.sdc new file mode 100644 index 00000000..fe1199b3 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.sdc @@ -0,0 +1,140 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## 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. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +set sdram_clk "pll|altpll_component|auto_generated|pll1|clk[2]" +set vid_clk "pll|altpll_component|auto_generated|pll1|clk[0]" +set game_clk "pll|altpll_component|auto_generated|pll1|clk[0]" +set aud_clk "pll|altpll_component|auto_generated|pll1|clk[3]" + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +set_input_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -max 6.4 [get_ports SDRAM_DQ[*]] +set_input_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -min 3.2 [get_ports SDRAM_DQ[*]] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks $aud_clk] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks $aud_clk] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks $sdram_clk] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks $vid_clk] 1.000 [get_ports {VGA_*}] + +set_output_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -max 1.5 [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}] +set_output_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -min -0.8 [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] +set_clock_groups -asynchronous -group [get_clocks $sdram_clk] -group [get_clocks $aud_clk] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -from [get_clocks $game_clk] -to [get_clocks $sdram_clk] -setup 2 +set_multicycle_path -from [get_clocks $game_clk] -to [get_clocks $sdram_clk] -hold 1 +set_multicycle_path -to {VGA_*[*]} -setup 3 +set_multicycle_path -to {VGA_*[*]} -hold 2 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv index a244cfc1..b2ab57c5 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv @@ -98,8 +98,10 @@ user_io( wire [14:0] rom_addr; wire [15:0] rom_do; -wire [13:0] snd_addr; +wire [16:0] snd_addr; +wire [13:0] snd_rom_addr; wire [15:0] snd_do; +wire snd_vma; wire [14:0] sp_addr; wire [31:0] sp_do; @@ -111,7 +113,7 @@ wire [24:0] ioctl_addr; wire [7:0] ioctl_dout; data_io data_io( - .clk_sys ( clk_sd ), + .clk_sys ( clk_sys ), .SPI_SCK ( SPI_SCK ), .SPI_SS2 ( SPI_SS2 ), .SPI_DI ( SPI_DI ), @@ -141,7 +143,7 @@ sdram sdram( .cpu1_addr ( ioctl_downl ? 16'hffff : {2'b00, rom_addr[14:1]} ), .cpu1_q ( rom_do ), - .cpu2_addr ( ioctl_downl ? 16'hffff : (16'h4000 + snd_addr[13:1]) ), + .cpu2_addr ( ioctl_downl ? 16'hffff : snd_addr[16:1] ), .cpu2_q ( snd_do ), // port2 for sprite graphics @@ -158,8 +160,9 @@ sdram sdram( ); // ROM download controller -always @(posedge clk_sd) begin +always @(posedge clk_sys) begin reg ioctl_wr_last = 0; + reg snd_vma_r, snd_vma_r2; ioctl_wr_last <= ioctl_wr; if (ioctl_downl) begin @@ -168,6 +171,10 @@ always @(posedge clk_sd) begin port2_req <= ~port2_req; end end + + // clock domain crossing here (clk_snd -> clk_sys) + snd_vma_r <= snd_vma; snd_vma_r2 <= snd_vma_r; + if (snd_vma_r2) snd_addr <= snd_rom_addr + 16'h8000; end // reset signal generation @@ -221,8 +228,9 @@ target_top target_top( .VGA_B(b), .cpu_rom_addr(rom_addr), .cpu_rom_do( rom_addr[0] ? rom_do[15:8] : rom_do[7:0] ), - .snd_rom_addr(snd_addr), - .snd_rom_do(snd_addr[0] ? snd_do[15:8] : snd_do[7:0]) + .snd_rom_addr(snd_rom_addr), + .snd_rom_do(snd_rom_addr[0] ? snd_do[15:8] : snd_do[7:0]), + .snd_vma(snd_vma) ); mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video( diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd index 2ba93794..7a06341e 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd @@ -1,4 +1,5 @@ --------------------------------------------------------------------------------- +-- Irem M62 sound board, based on -- Moon patrol sound board by Dar (darfpga@aol.fr) -- http://darfpga.blogspot.fr --------------------------------------------------------------------------------- @@ -31,8 +32,9 @@ port( select_sound : in std_logic_vector(7 downto 0); audio_out : out std_logic_vector(11 downto 0); - snd_rom_addr : out std_logic_vector(13 downto 0); - snd_rom_do : in std_logic_vector(7 downto 0); + snd_rom_addr : out std_logic_vector(13 downto 0); + snd_rom_do : in std_logic_vector(7 downto 0); + snd_vma : out std_logic; dbg_cpu_addr : out std_logic_vector(15 downto 0) ); @@ -76,6 +78,7 @@ architecture struct of Sound_Board is signal cpu_rw : std_logic; signal cpu_irq : std_logic; signal cpu_nmi : std_logic; + signal cpu_vma : std_logic; signal irqraz_cs : std_logic; signal irqraz_we : std_logic; @@ -161,9 +164,9 @@ dbg_cpu_addr <= cpu_addr; -- cs wram_cs <= '1' when cpu_addr(15 downto 7) = X"00"&'1' else '0'; -- 0080-00FF ports_cs <= '1' when cpu_addr(15 downto 4) = X"000" else '0'; -- 0000-000F -adpcm_cs <= '1' when cpu_addr(14 downto 11) = "0001" else '0'; -- 0800-0FFF / 8800-8FFF -irqraz_cs <= '1' when cpu_addr(14 downto 12) = "001" else '0'; -- 1000-1FFF / 9000-9FFF -rom_cs <= '1' when cpu_addr(14 downto 12) = "111" else '0'; -- 7000-7FFF / F000-FFFF +adpcm_cs <= '1' when cpu_addr(14) = '0' and cpu_addr(11) = '1' and cpu_addr(1 downto 0) /= "00" else '0'; -- 0801-0802 +irqraz_cs <= '1' when cpu_addr(14) = '0' and cpu_addr(11) = '1' and cpu_addr(1 downto 0) = "00" else '0'; -- 0800 +rom_cs <= '1' when cpu_addr(14) = '1' else '0'; -- 4000-7FFF / C000-FFFF -- write enables wram_we <= '1' when cpu_rw = '0' and wram_cs = '1' else '0'; @@ -178,7 +181,7 @@ cpu_di <= port2_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"1" else port1_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"2" else port2_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"3" else - rom_do when rom_cs = '1' else X"55"; + snd_rom_do when rom_cs = '1' else X"55"; process (clock_E) begin @@ -334,7 +337,7 @@ port map( clk => clock_E, -- E clock input (falling edge) rst => reset, -- reset input (active high) rw => cpu_rw, -- read not write output - vma => open, -- valid memory address (active high) + vma => cpu_vma, -- valid memory address (active high) address => cpu_addr, -- address bus output data_in => cpu_di, -- data bus input data_out => cpu_do, -- data bus output @@ -346,14 +349,15 @@ port map( test_cc => open ); -rom_cpu : entity work.snd_prg -port map( - clk => clock_E, -- E clock input (falling edge) - addr => cpu_addr(13 downto 0), - data => rom_do -); +--rom_cpu : entity work.snd_prg +--port map( +-- clk => clock_E, -- E clock input (falling edge) +-- addr => cpu_addr(13 downto 0), +-- data => rom_do +--); --- snd_rom_addr <= cpu_addr(13 downto 0); +snd_vma <= rom_cs and cpu_vma; +snd_rom_addr <= cpu_addr(13 downto 0); -- cpu wram diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd index 112c724a..f103969a 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd @@ -26,15 +26,15 @@ entity PACE is -- video video_i : in from_VIDEO_t; video_o : out to_VIDEO_t; - sound_data_o : out std_logic_vector(7 downto 0); + sound_data_o : out std_logic_vector(7 downto 0); -- custom i/o -- project_i : in from_PROJECT_IO_t; -- project_o : out to_PROJECT_IO_t; platform_i : in from_PLATFORM_IO_t; platform_o : out to_PLATFORM_IO_t; - cpu_rom_addr : out std_logic_vector(14 downto 0); - cpu_rom_do : in std_logic_vector(7 downto 0) + cpu_rom_addr : out std_logic_vector(14 downto 0); + cpu_rom_do : in std_logic_vector(7 downto 0) ); end entity PACE; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd index 77105a2d..49c6b050 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd @@ -45,15 +45,15 @@ entity platform is -- various graphics information graphics_i : in from_GRAPHICS_t; graphics_o : out to_GRAPHICS_t; - sound_data_o : out std_logic_vector(7 downto 0); + sound_data_o : out std_logic_vector(7 downto 0); -- custom i/o -- project_i : in from_PROJECT_IO_t; -- project_o : out to_PROJECT_IO_t; platform_i : in from_PLATFORM_IO_t; platform_o : out to_PLATFORM_IO_t; - cpu_rom_addr : out std_logic_vector(14 downto 0); - cpu_rom_do : in std_logic_vector(7 downto 0) + cpu_rom_addr : out std_logic_vector(14 downto 0); + cpu_rom_do : in std_logic_vector(7 downto 0) ); end platform; @@ -164,25 +164,24 @@ begin -- RAM $E000-$EFFF wram_cs <= '1' when STD_MATCH(cpu_a, X"E"&"------------") else '0'; - -- OUTPUT $DXX0 - snd_cs <= '1' when STD_MATCH(cpu_a(7 downto 0), X"0"&"00--") else '0'; + -- OUTPUT $XX00 + snd_cs <= '1' when cpu_a(7 downto 0) = X"00" else '0'; -- INPUTS (I/O) $00-$04 in_cs <= '1' when STD_MATCH(cpu_a(7 downto 0), X"0"&"00--") else '1' when STD_MATCH(cpu_a(7 downto 0), X"04") else '0'; - -process (clk_sys, rst_sys) begin - if rst_sys = '1' then - sound_data_o <= X"00"; - elsif rising_edge(clk_sys) then - if cpu_clk_en = '1' and cpu_mem_wr = '1' and snd_cs = '1' then - sound_data_o <= cpu_d_o; - end if; - end if; - end process; - + process (clk_sys, rst_sys) begin + if rst_sys = '1' then + sound_data_o <= X"FF"; + elsif rising_edge(clk_sys) then + if cpu_clk_en = '1' and cpu_io_wr = '1' and snd_cs = '1' then + sound_data_o <= cpu_d_o; + end if; + end if; + end process; + -- memory read mux cpu_d_i <= in_d_o when (cpu_io_rd = '1' and in_cs = '1') else cpu_rom_do when rom_cs = '1' else diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd index afc9e59f..41ee2a1b 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd @@ -41,7 +41,8 @@ entity target_top is port( cpu_rom_addr : out std_logic_vector(14 downto 0); cpu_rom_do : in std_logic_vector(7 downto 0); snd_rom_addr : out std_logic_vector(13 downto 0); - snd_rom_do : in std_logic_vector(7 downto 0) + snd_rom_do : in std_logic_vector(7 downto 0); + snd_vma : out std_logic ); end target_top; @@ -86,17 +87,18 @@ end generate GEN_RESETS; VGA_HS <= video_o.hsync; VGA_VS <= video_o.vsync; ---Sound_Board : entity work.Sound_Board --- port map( --- clock_E => clk_aud, --- areset => clkrst_i.rst(1), --- select_sound => sound_data, --- audio_out => audio_out, --- snd_rom_addr => snd_rom_addr, --- snd_rom_do => snd_rom_do, --- dbg_cpu_addr => open --- ); - +Sound_Board : entity work.Sound_Board + port map( + clock_E => clk_aud, + areset => clkrst_i.rst(1), + select_sound => sound_data, + audio_out => audio_out, + snd_rom_addr => snd_rom_addr, + snd_rom_do => snd_rom_do, + snd_vma => snd_vma, + dbg_cpu_addr => open + ); + pace_inst : entity work.pace port map( clkrst_i => clkrst_i, @@ -106,10 +108,10 @@ pace_inst : entity work.pace video_i => video_i, video_o => video_o, sound_data_o => sound_data, - platform_i => platform_i, - platform_o => platform_o, + platform_i => platform_i, + platform_o => platform_o, cpu_rom_addr => cpu_rom_addr, - cpu_rom_do => cpu_rom_do + cpu_rom_do => cpu_rom_do ); inputs_i.jamma_n.coin(1) <= not usr_coin1; From 102d1ffa0e4aba87220df28ecc11bd4a3a2ac2ed Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sun, 1 Mar 2020 21:08:11 +0100 Subject: [PATCH 03/35] LodeRunner: vertical sprite position adjust --- Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd index dc91db61..24a69d43 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd @@ -80,7 +80,7 @@ begin if video_ctl.hblank = '1' then x := unsigned(reg_i.x) - M62_VIDEO_H_OFFSET + PACE_VIDEO_PIPELINE_DELAY - 3; - y := 256 + 128 - 15 - unsigned(reg_i.y); + y := 256 + 128 - 18 - unsigned(reg_i.y); -- hande sprite height, placement prom_i := to_integer(unsigned(reg_i.n(9 downto 5))); From 1b80f5b041952ec28e03435d58aa1d21b99b8c5b Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 2 Mar 2020 11:32:52 +0100 Subject: [PATCH 04/35] LodeRunner: formatting cleanup --- .../LodeRunner_MiST/rtl/Graphics.VHD | 192 +++++++-------- .../LodeRunner_MiST/rtl/Inputs.VHD | 33 ++- .../LodeRunner_MiST/rtl/LodeRunner_MiST.sv | 4 +- .../LodeRunner_MiST/rtl/Sound_Board.vhd | 92 +++---- .../LodeRunner_MiST/rtl/bitmapctl_e.vhd | 2 +- .../LodeRunner_MiST/rtl/clk_div.vhd | 42 ++-- .../LodeRunner_MiST/rtl/input_mapper.vhd | 44 ++-- .../LodeRunner_MiST/rtl/pace.vhd | 62 ++--- .../LodeRunner_MiST/rtl/pace_pkg.vhd | 174 +++++++------- .../LodeRunner_MiST/rtl/platform.vhd | 227 +++++++++--------- .../LodeRunner_MiST/rtl/platform_pkg.vhd | 72 +++--- .../rtl/platform_variant_pkg.vhd | 18 +- .../LodeRunner_MiST/rtl/sprite_array.vhd | 185 +++++++------- .../LodeRunner_MiST/rtl/sprite_pkg.vhd | 2 +- .../LodeRunner_MiST/rtl/spritectl.vhd | 64 ++--- .../LodeRunner_MiST/rtl/tilemapctl.vhd | 14 +- .../LodeRunner_MiST/rtl/tilemapctl_e.vhd | 2 +- .../LodeRunner_MiST/rtl/video_controller.vhd | 73 +++--- .../rtl/video_controller_pkg.vhd | 48 ++-- 19 files changed, 674 insertions(+), 676 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD index dc3fb666..772c00d1 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD @@ -21,20 +21,20 @@ entity Graphics is sprite_reg_i : in to_SPRITE_REG_t; sprite_ctl_i : in to_SPRITE_CTL_t; sprite_ctl_o : out from_SPRITE_CTL_t; - spr0_hit : out std_logic; + spr0_hit : out std_logic; graphics_i : in to_GRAPHICS_t; graphics_o : out from_GRAPHICS_t; - video_i : in from_VIDEO_t; - video_o : out to_VIDEO_t + video_i : in from_VIDEO_t; + video_o : out to_VIDEO_t ); end Graphics; architecture SYN of Graphics is - alias clk : std_logic is video_i.clk; + alias clk : std_logic is video_i.clk; signal from_video_ctl : from_VIDEO_CTL_t; signal bitmap_ctl_o_s : from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); @@ -43,21 +43,21 @@ architecture SYN of Graphics is signal sprite_pri : std_logic; - signal rgb_data : RGB_t; + signal rgb_data : RGB_t; -- before OSD is mixed in signal video_o_s : to_VIDEO_t; begin -- dodgy OSD transparency... - video_o.clk <= video_o_s.clk; + video_o.clk <= video_o_s.clk; video_o.rgb.r <= video_o_s.rgb.r; video_o.rgb.g <= video_o_s.rgb.g; video_o.rgb.b <= video_o_s.rgb.b; - video_o.hsync <= video_o_s.hsync; - video_o.vsync <= video_o_s.vsync; - video_o.hblank <= video_o_s.hblank; - video_o.vblank <= video_o_s.vblank; + video_o.hsync <= video_o_s.hsync; + video_o.vsync <= video_o_s.vsync; + video_o.hblank <= video_o_s.hblank; + video_o.vblank <= video_o_s.vblank; graphics_o.y <= from_video_ctl.y; -- should this be the 'real' vblank or the 'active' vblank? @@ -69,7 +69,7 @@ begin pace_video_controller_inst : entity work.pace_video_controller generic map ( - CONFIG => PACE_VIDEO_CONTROLLER_TYPE, + CONFIG => PACE_VIDEO_CONTROLLER_TYPE, DELAY => PACE_VIDEO_PIPELINE_DELAY, H_SIZE => PACE_VIDEO_H_SIZE, V_SIZE => PACE_VIDEO_V_SIZE, @@ -86,17 +86,17 @@ begin -- clocking etc video_i => video_i, - -- register interface - reg_i.h_scale => "000", - reg_i.v_scale => "000", + -- register interface + reg_i.h_scale => "000", + reg_i.v_scale => "000", -- video data signals (in) - rgb_i => rgb_data, + rgb_i => rgb_data, -- video control signals (out) video_ctl_o => from_video_ctl, -- VGA signals (out) - video_o => video_o_s + video_o => video_o_s ); pace_video_mixer_inst : entity work.pace_video_mixer @@ -113,140 +113,140 @@ begin rgb_o => rgb_data ); - GEN_NO_BITMAPS : if PACE_VIDEO_NUM_BITMAPS = 0 generate + GEN_NO_BITMAPS : if PACE_VIDEO_NUM_BITMAPS = 0 generate --bitmap_ctl_o_s <= ((others => '0'), (others => (others => '0')), '0'); - end generate GEN_NO_BITMAPS; - - GEN_BITMAP_1 : if PACE_VIDEO_NUM_BITMAPS > 0 generate - - forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_1) + end generate GEN_NO_BITMAPS; + + GEN_BITMAP_1 : if PACE_VIDEO_NUM_BITMAPS > 0 generate + + forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_1) generic map ( DELAY => PACE_VIDEO_PIPELINE_DELAY ) - port map - ( - reset => video_i.reset, - - video_ctl => from_video_ctl, + port map + ( + reset => video_i.reset, - ctl_i => bitmap_ctl_i(1), - ctl_o => bitmap_ctl_o_s(1), + video_ctl => from_video_ctl, + + ctl_i => bitmap_ctl_i(1), + ctl_o => bitmap_ctl_o_s(1), graphics_i => graphics_i - ); - end generate GEN_BITMAP_1; + ); + end generate GEN_BITMAP_1; - GEN_BITMAP_2 : if PACE_VIDEO_NUM_BITMAPS > 1 generate + GEN_BITMAP_2 : if PACE_VIDEO_NUM_BITMAPS > 1 generate - forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_2) + forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_2) generic map ( DELAY => PACE_VIDEO_PIPELINE_DELAY ) - port map - ( - reset => video_i.reset, - - video_ctl => from_video_ctl, + port map + ( + reset => video_i.reset, - ctl_i => bitmap_ctl_i(2), - ctl_o => bitmap_ctl_o_s(2), + video_ctl => from_video_ctl, + + ctl_i => bitmap_ctl_i(2), + ctl_o => bitmap_ctl_o_s(2), graphics_i => graphics_i - ); + ); end generate GEN_BITMAP_2; - GEN_BITMAP_3 : if PACE_VIDEO_NUM_BITMAPS > 2 generate + GEN_BITMAP_3 : if PACE_VIDEO_NUM_BITMAPS > 2 generate - forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_3) + forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_3) generic map ( DELAY => PACE_VIDEO_PIPELINE_DELAY ) - port map - ( - reset => video_i.reset, - - video_ctl => from_video_ctl, + port map + ( + reset => video_i.reset, - ctl_i => bitmap_ctl_i(3), - ctl_o => bitmap_ctl_o_s(3), + video_ctl => from_video_ctl, + + ctl_i => bitmap_ctl_i(3), + ctl_o => bitmap_ctl_o_s(3), graphics_i => graphics_i - ); + ); end generate GEN_BITMAP_3; bitmap_ctl_o <= bitmap_ctl_o_s; - GEN_NO_TILEMAPS : if PACE_VIDEO_NUM_TILEMAPS = 0 generate + GEN_NO_TILEMAPS : if PACE_VIDEO_NUM_TILEMAPS = 0 generate --tilemap_ctl_o_s(1) <= ((others => '0'), (others => '0'), (others => '0'), -- (others => (others => '0')), '0'); - end generate GEN_NO_TILEMAPS; - - GEN_TILEMAP_1 : if PACE_VIDEO_NUM_TILEMAPS > 0 generate - - foreground_mapctl_inst : entity work.tilemapCtl(TILEMAP_1) + end generate GEN_NO_TILEMAPS; + + GEN_TILEMAP_1 : if PACE_VIDEO_NUM_TILEMAPS > 0 generate + + foreground_mapctl_inst : entity work.tilemapCtl(TILEMAP_1) generic map ( DELAY => PACE_VIDEO_PIPELINE_DELAY ) - port map - ( - reset => video_i.reset, - - video_ctl => from_video_ctl, + port map + ( + reset => video_i.reset, - ctl_i => tilemap_ctl_i(1), - ctl_o => tilemap_ctl_o_s(1), + video_ctl => from_video_ctl, + + ctl_i => tilemap_ctl_i(1), + ctl_o => tilemap_ctl_o_s(1), graphics_i => graphics_i - ); + ); - end generate GEN_TILEMAP_1; + end generate GEN_TILEMAP_1; - GEN_TILEMAP_2 : if PACE_VIDEO_NUM_TILEMAPS > 1 generate - - background_mapctl_inst : entity work.tilemapCtl(TILEMAP_2) + GEN_TILEMAP_2 : if PACE_VIDEO_NUM_TILEMAPS > 1 generate + + background_mapctl_inst : entity work.tilemapCtl(TILEMAP_2) generic map ( DELAY => PACE_VIDEO_PIPELINE_DELAY ) - port map - ( - reset => video_i.reset, - - video_ctl => from_video_ctl, + port map + ( + reset => video_i.reset, - ctl_i => tilemap_ctl_i(2), - ctl_o => tilemap_ctl_o_s(2), + video_ctl => from_video_ctl, + + ctl_i => tilemap_ctl_i(2), + ctl_o => tilemap_ctl_o_s(2), graphics_i => graphics_i - ); + ); - end generate GEN_TILEMAP_2; + end generate GEN_TILEMAP_2; tilemap_ctl_o <= tilemap_ctl_o_s; - GEN_NO_SPRITES : if PACE_VIDEO_NUM_SPRITES = 0 generate + GEN_NO_SPRITES : if PACE_VIDEO_NUM_SPRITES = 0 generate sprite_ctl_o_s <= ((others => '0'), (others => (others => '0')), '0'); sprite_pri <= '0'; spr0_hit <= '0'; - end generate GEN_NO_SPRITES; - - GEN_SPRITES : if PACE_VIDEO_NUM_SPRITES > 0 generate - - sprites_inst : sprite_array + end generate GEN_NO_SPRITES; + + GEN_SPRITES : if PACE_VIDEO_NUM_SPRITES > 0 generate + + sprites_inst : sprite_array generic map ( N_SPRITES => PACE_VIDEO_NUM_SPRITES, DELAY => PACE_VIDEO_PIPELINE_DELAY ) - port map - ( - reset => video_i.reset, + port map + ( + reset => video_i.reset, -- register interface reg_i => sprite_reg_i, @@ -256,16 +256,16 @@ begin graphics_i => graphics_i, - row_a => sprite_ctl_o_s.a, - row_d => sprite_ctl_i.d, - - rgb => sprite_ctl_o_s.rgb, - set => sprite_ctl_o_s.set, - pri => sprite_pri, - spr0_set => spr0_hit - ); + row_a => sprite_ctl_o_s.a, + row_d => sprite_ctl_i.d, - end generate GEN_SPRITES; + rgb => sprite_ctl_o_s.rgb, + set => sprite_ctl_o_s.set, + pri => sprite_pri, + spr0_set => spr0_hit + ); + + end generate GEN_SPRITES; sprite_ctl_o <= sprite_ctl_o_s; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Inputs.VHD b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Inputs.VHD index 6551aeaf..25934e3d 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Inputs.VHD +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Inputs.VHD @@ -5,20 +5,20 @@ library work; use work.pace_pkg.all; entity inputs is - generic - ( + generic + ( NUM_DIPS : integer := 8; - NUM_INPUTS : integer := 2; - CLK_1US_DIV : natural := 30 - ); + NUM_INPUTS : integer := 2; + CLK_1US_DIV : natural := 30 + ); port ( clk : in std_logic; reset : in std_logic; - jamma : in from_JAMMA_t; - - dips : in std_logic_vector(NUM_DIPS-1 downto 0); - inputs : out from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1) + jamma : in from_JAMMA_t; + + dips : in std_logic_vector(NUM_DIPS-1 downto 0); + inputs : out from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1) ); end entity inputs; @@ -33,19 +33,18 @@ begin inputmapper_inst : entity work.inputmapper - generic map - ( + generic map + ( NUM_DIPS => NUM_DIPS, - NUM_INPUTS => NUM_INPUTS - ) + NUM_INPUTS => NUM_INPUTS + ) port map ( clk => clk, rst_n => reset_n, - jamma => jamma, - dips => dips, - inputs => inputs + jamma => jamma, + dips => dips, + inputs => inputs ); - end architecture SYN; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv index b2ab57c5..8ddc3feb 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv @@ -1,12 +1,12 @@ module LodeRunner_MiST( - output LED, + output LED, output [5:0] VGA_R, output [5:0] VGA_G, output [5:0] VGA_B, output VGA_HS, output VGA_VS, output AUDIO_L, - output AUDIO_R, + output AUDIO_R, input SPI_SCK, output SPI_DO, input SPI_DI, diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd index 7a06341e..ba56ae64 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd @@ -17,7 +17,7 @@ -- Use at your own risk --------------------------------------------------------------------------------- -- Version 0.0 -- 24/11/2017 -- --- initial version +-- initial version --------------------------------------------------------------------------------- library ieee; @@ -167,7 +167,7 @@ ports_cs <= '1' when cpu_addr(15 downto 4) = X"000" else '0'; -- 0000-000F adpcm_cs <= '1' when cpu_addr(14) = '0' and cpu_addr(11) = '1' and cpu_addr(1 downto 0) /= "00" else '0'; -- 0801-0802 irqraz_cs <= '1' when cpu_addr(14) = '0' and cpu_addr(11) = '1' and cpu_addr(1 downto 0) = "00" else '0'; -- 0800 rom_cs <= '1' when cpu_addr(14) = '1' else '0'; -- 4000-7FFF / C000-FFFF - + -- write enables wram_we <= '1' when cpu_rw = '0' and wram_cs = '1' else '0'; ports_we <= '1' when cpu_rw = '0' and ports_cs = '1' else '0'; @@ -176,42 +176,42 @@ irqraz_we <= '1' when cpu_rw = '0' and irqraz_cs = '1' else '0'; -- mux cpu in data between roms/io/wram cpu_di <= - wram_do when wram_cs = '1' else - port1_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"0" else - port2_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"1" else - port1_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"2" else - port2_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"3" else - snd_rom_do when rom_cs = '1' else X"55"; + wram_do when wram_cs = '1' else + port1_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"0" else + port2_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"1" else + port1_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"2" else + port2_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"3" else + snd_rom_do when rom_cs = '1' else X"55"; process (clock_E) begin - if rising_edge(clock_E) then - reset <= '0'; - if reset_cnt /= 0 then - reset_cnt <= reset_cnt - 1; - reset <= '1'; - end if; - if areset = '1' then - reset_cnt <= 1000000; - end if; - end if; + if rising_edge(clock_E) then + reset <= '0'; + if reset_cnt /= 0 then + reset_cnt <= reset_cnt - 1; + reset <= '1'; + end if; + if areset = '1' then + reset_cnt <= 1000000; + end if; + end if; end process; -- irq to cpu process (reset, clock_E) begin - if reset='1' then - cpu_irq <= '0'; - select_sound_r(7) <= '1'; - elsif rising_edge(clock_E) then - select_sound_r <= select_sound; - if select_sound_r(7) = '0' then - cpu_irq <= '1'; - end if; - if irqraz_we = '1' then - cpu_irq <= '0'; - end if; - end if; + if reset='1' then + cpu_irq <= '0'; + select_sound_r(7) <= '1'; + elsif rising_edge(clock_E) then + select_sound_r <= select_sound; + if select_sound_r(7) = '0' then + cpu_irq <= '1'; + end if; + if irqraz_we = '1' then + cpu_irq <= '0'; + end if; + end if; end process; -- cpu nmi @@ -272,7 +272,7 @@ begin if clock_div_a = 37 then -- 24kHz clock_div_a := 0; - case ay1_port_b_do(3 downto 2) is + case ay1_port_b_do(3 downto 2) is when "00" => if clock_div_b = 5 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 4kHz when "01" => if clock_div_b = 2 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 8kHz when "10" => if clock_div_b = 3 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 6kHz @@ -281,7 +281,7 @@ begin if clock_div_b = 0 then adpcm_vclk <= '1'; else adpcm_vclk <= '0'; end if; else - clock_div_a := clock_div_a + 1; + clock_div_a := clock_div_a + 1; end if; if ay1_port_b_do(0) = '1' then @@ -330,23 +330,23 @@ end process; -- audio mux audio <= ("000"&ay1_audio) + ("000"&ay2_audio) + ('0'&std_logic_vector(to_unsigned((adpcm_signal)+2048,12))); audio_out <= audio(12 downto 1); - + -- microprocessor 6800/01/03 main_cpu : entity work.cpu68 port map( - clk => clock_E, -- E clock input (falling edge) - rst => reset, -- reset input (active high) - rw => cpu_rw, -- read not write output - vma => cpu_vma, -- valid memory address (active high) - address => cpu_addr, -- address bus output - data_in => cpu_di, -- data bus input - data_out => cpu_do, -- data bus output - hold => '0', -- hold input (active high) extend bus cycle - halt => '0', -- halt input (active high) grants DMA - irq => cpu_irq, -- interrupt request input (active high) - nmi => cpu_nmi, -- non maskable interrupt request input (active high) - test_alu => open, - test_cc => open + clk => clock_E, -- E clock input (falling edge) + rst => reset, -- reset input (active high) + rw => cpu_rw, -- read not write output + vma => cpu_vma, -- valid memory address (active high) + address => cpu_addr, -- address bus output + data_in => cpu_di, -- data bus input + data_out => cpu_do, -- data bus output + hold => '0', -- hold input (active high) extend bus cycle + halt => '0', -- halt input (active high) grants DMA + irq => cpu_irq, -- interrupt request input (active high) + nmi => cpu_nmi, -- non maskable interrupt request input (active high) + test_alu => open, + test_cc => open ); --rom_cpu : entity work.snd_prg diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/bitmapctl_e.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/bitmapctl_e.vhd index be8471e3..f80c61ac 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/bitmapctl_e.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/bitmapctl_e.vhd @@ -16,7 +16,7 @@ entity bitmapCtl is ); port ( - reset : in std_logic; + reset : in std_logic; -- video control signals video_ctl : in from_VIDEO_CTL_t; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/clk_div.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/clk_div.vhd index 020d6ae6..a28f4e77 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/clk_div.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/clk_div.vhd @@ -2,16 +2,16 @@ library ieee; use ieee.std_logic_1164.all; entity clk_div is - generic - ( - DIVISOR : natural - ); + generic + ( + DIVISOR : natural + ); port ( clk : in std_logic; reset : in std_logic; - clk_en : out std_logic + clk_en : out std_logic ); end clk_div; @@ -19,21 +19,21 @@ architecture SYN of clk_div is begin - process (clk, reset) - variable count : integer range 0 to DIVISOR-1; - begin - if reset = '1' then - count := 0; - clk_en <= '0'; - elsif rising_edge(clk) then - clk_en <= '0'; - if count = DIVISOR-1 then - clk_en <= '1'; - count := 0; - else - count := count + 1; - end if; - end if; - end process; + process (clk, reset) + variable count : integer range 0 to DIVISOR-1; + begin + if reset = '1' then + count := 0; + clk_en <= '0'; + elsif rising_edge(clk) then + clk_en <= '0'; + if count = DIVISOR-1 then + clk_en <= '1'; + count := 0; + else + count := count + 1; + end if; + end if; + end process; end SYN; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/input_mapper.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/input_mapper.vhd index 8fc031ba..c4a27579 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/input_mapper.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/input_mapper.vhd @@ -6,21 +6,21 @@ library work; use work.pace_pkg.all; entity inputmapper is - generic - ( + generic + ( NUM_DIPS : integer := 8; - NUM_INPUTS : integer := 2 - ); - port - ( + NUM_INPUTS : integer := 2 + ); + port + ( clk : in std_logic; rst_n : in std_logic; - jamma : in from_JAMMA_t; + jamma : in from_JAMMA_t; -- user outputs - dips : in std_logic_vector(NUM_DIPS-1 downto 0); - inputs : out from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1) - ); + dips : in std_logic_vector(NUM_DIPS-1 downto 0); + inputs : out from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1) + ); end inputmapper; architecture SYN of inputmapper is @@ -28,7 +28,7 @@ architecture SYN of inputmapper is begin process (clk, rst_n) - variable jamma_v : from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1); + variable jamma_v : from_MAPPED_INPUTS_t(0 to NUM_INPUTS-1); begin -- note: all inputs are active LOW @@ -45,27 +45,27 @@ begin jamma_v(0).d(1) := jamma.p(2).start; jamma_v(0).d(2) := '1';--jamma.service; jamma_v(0).d(3) := jamma.coin(1); - --unused - --unused - --unused - --unused - + --unused + --unused + --unused + --unused + jamma_v(1).d(0) := jamma.p(1).right; jamma_v(1).d(1) := jamma.p(1).left; jamma_v(1).d(2) := jamma.p(1).down; jamma_v(1).d(3) := jamma.p(1).up; - --unused + --unused jamma_v(1).d(5) := jamma.p(1).button(2); - --unused + --unused jamma_v(1).d(7) := jamma.p(1).button(1); - - jamma_v(2).d(0) := jamma.p(2).right; + + jamma_v(2).d(0) := jamma.p(2).right; jamma_v(2).d(1) := jamma.p(2).left; jamma_v(2).d(2) := jamma.p(2).down; jamma_v(2).d(3) := jamma.p(2).up; - jamma_v(2).d(4) := jamma.coin(2); + jamma_v(2).d(4) := jamma.coin(2); jamma_v(2).d(5) := jamma.p(2).button(2); - --unused + --unused jamma_v(2).d(7) := jamma.p(2).button(1); end if; -- rising_edge (clk) diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd index f103969a..5fe723f1 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd @@ -12,7 +12,7 @@ use work.platform_pkg.all; entity PACE is port ( - -- clocks and resets + -- clocks and resets clkrst_i : in from_CLKRST_t; -- misc I/O @@ -29,8 +29,8 @@ entity PACE is sound_data_o : out std_logic_vector(7 downto 0); -- custom i/o - -- project_i : in from_PROJECT_IO_t; - -- project_o : out to_PROJECT_IO_t; + -- project_i : in from_PROJECT_IO_t; + -- project_o : out to_PROJECT_IO_t; platform_i : in from_PLATFORM_IO_t; platform_o : out to_PLATFORM_IO_t; cpu_rom_addr : out std_logic_vector(14 downto 0); @@ -40,10 +40,10 @@ end entity PACE; architecture SYN of PACE is - constant CLK_1US_COUNTS : integer := + constant CLK_1US_COUNTS : integer := integer(27 * PACE_CLK0_MULTIPLY_BY / PACE_CLK0_DIVIDE_BY); - signal mapped_inputs : from_MAPPED_INPUTS_t(0 to PACE_INPUTS_NUM_BYTES-1); + signal mapped_inputs : from_MAPPED_INPUTS_t(0 to PACE_INPUTS_NUM_BYTES-1); signal to_tilemap_ctl : to_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); signal from_tilemap_ctl : from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); @@ -54,29 +54,29 @@ architecture SYN of PACE is signal to_sprite_reg : to_SPRITE_REG_t; signal to_sprite_ctl : to_SPRITE_CTL_t; signal from_sprite_ctl : from_SPRITE_CTL_t; - signal spr0_hit : std_logic; + signal spr0_hit : std_logic; signal to_graphics : to_GRAPHICS_t; - signal from_graphics : from_GRAPHICS_t; + signal from_graphics : from_GRAPHICS_t; begin - inputs_inst : entity work.inputs - generic map - ( + inputs_inst : entity work.inputs + generic map + ( NUM_DIPS => PACE_NUM_SWITCHES, - NUM_INPUTS => PACE_INPUTS_NUM_BYTES, - CLK_1US_DIV => CLK_1US_COUNTS - ) - port map - ( - clk => clkrst_i.clk(0), - reset => clkrst_i.rst(0), - jamma => inputs_i.jamma_n, - - dips => switches_i, - inputs => mapped_inputs - ); + NUM_INPUTS => PACE_INPUTS_NUM_BYTES, + CLK_1US_DIV => CLK_1US_COUNTS + ) + port map + ( + clk => clkrst_i.clk(0), + reset => clkrst_i.rst(0), + jamma => inputs_i.jamma_n, + + dips => switches_i, + inputs => mapped_inputs + ); platform_inst : entity work.platform generic map @@ -106,7 +106,7 @@ begin sprite_reg_o => to_sprite_reg, sprite_i => from_sprite_ctl, sprite_o => to_sprite_ctl, - spr0_hit => spr0_hit, + spr0_hit => spr0_hit, graphics_i => from_graphics, graphics_o => to_graphics, @@ -116,9 +116,9 @@ begin -- project_o => project_o, platform_i => platform_i, platform_o => platform_o, - - cpu_rom_addr => cpu_rom_addr, - cpu_rom_do => cpu_rom_do + + cpu_rom_addr => cpu_rom_addr, + cpu_rom_do => cpu_rom_do ); graphics_inst : entity work.Graphics @@ -133,14 +133,14 @@ begin sprite_reg_i => to_sprite_reg, sprite_ctl_i => to_sprite_ctl, sprite_ctl_o => from_sprite_ctl, - spr0_hit => spr0_hit, + spr0_hit => spr0_hit, graphics_i => to_graphics, graphics_o => from_graphics, - -- video (incl. clk) - video_i => video_i, - video_o => video_o + -- video (incl. clk) + video_i => video_i, + video_o => video_o ); - + end SYN; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace_pkg.vhd index d2dd0c07..45f62fca 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace_pkg.vhd @@ -6,9 +6,9 @@ library work; package pace_pkg is - -- - -- PACE constants which *MUST* be defined - -- + -- + -- PACE constants which *MUST* be defined + -- type PACETargetType is ( @@ -51,26 +51,26 @@ package pace_pkg is PACE_TARGET_S6M_A0 ); - type PACEFpgaVendor_t is - ( - PACE_FPGA_VENDOR_ALTERA, - PACE_FPGA_VENDOR_XILINX, - PACE_FPGA_VENDOR_LATTICE - ); + type PACEFpgaVendor_t is + ( + PACE_FPGA_VENDOR_ALTERA, + PACE_FPGA_VENDOR_XILINX, + PACE_FPGA_VENDOR_LATTICE + ); - type PACEFpgaFamily_t is - ( - PACE_FPGA_FAMILY_CYCLONE1, - PACE_FPGA_FAMILY_CYCLONE2, - PACE_FPGA_FAMILY_CYCLONE3, - PACE_FPGA_FAMILY_CYCLONE4, - PACE_FPGA_FAMILY_CYCLONE5, - PACE_FPGA_FAMILY_CYCLONE6, - PACE_FPGA_FAMILY_STRATIX_III, - PACE_FPGA_FAMILY_SPARTAN3, - PACE_FPGA_FAMILY_SPARTAN3A, - PACE_FPGA_FAMILY_SPARTAN3E - ); + type PACEFpgaFamily_t is + ( + PACE_FPGA_FAMILY_CYCLONE1, + PACE_FPGA_FAMILY_CYCLONE2, + PACE_FPGA_FAMILY_CYCLONE3, + PACE_FPGA_FAMILY_CYCLONE4, + PACE_FPGA_FAMILY_CYCLONE5, + PACE_FPGA_FAMILY_CYCLONE6, + PACE_FPGA_FAMILY_STRATIX_III, + PACE_FPGA_FAMILY_SPARTAN3, + PACE_FPGA_FAMILY_SPARTAN3A, + PACE_FPGA_FAMILY_SPARTAN3E + ); type PACEJamma_t is ( @@ -82,7 +82,7 @@ package pace_pkg is -- Types - type ByteArrayType is array (natural range <>) of std_logic_vector(7 downto 0); + type ByteArrayType is array (natural range <>) of std_logic_vector(7 downto 0); type from_CLKRST_t is record arst : std_logic; @@ -103,30 +103,30 @@ package pace_pkg is constant PACE_NUM_LEDS : natural := 18; subtype to_LEDS_t is std_logic_vector(PACE_NUM_LEDS-1 downto 0); - -- - -- JAMMA interface data structures - -- - note: all signals are active LOW - -- + -- + -- JAMMA interface data structures + -- - note: all signals are active LOW + -- - type from_JAMMA_player_t is record - start : std_logic; - up : std_logic; - down : std_logic; - left : std_logic; - right : std_logic; - button : std_logic_vector(1 to 5); - end record; + type from_JAMMA_player_t is record + start : std_logic; + up : std_logic; + down : std_logic; + left : std_logic; + right : std_logic; + button : std_logic_vector(1 to 5); + end record; - type from_JAMMA_player_a is array (natural range <>) of from_JAMMA_player_t; - - type from_JAMMA_t is record - coin_cnt : std_logic_vector(1 to 2); - service : std_logic; - tilt : std_logic; - test : std_logic; - coin : std_logic_vector(1 to 2); - p : from_JAMMA_player_a(1 to 2); - end record; + type from_JAMMA_player_a is array (natural range <>) of from_JAMMA_player_t; + + type from_JAMMA_t is record + coin_cnt : std_logic_vector(1 to 2); + service : std_logic; + tilt : std_logic; + test : std_logic; + coin : std_logic_vector(1 to 2); + p : from_JAMMA_player_a(1 to 2); + end record; -- -- INPUTS @@ -134,7 +134,7 @@ package pace_pkg is subtype analogue_in_t is std_logic_vector(9 downto 0); type analogue_in_a is array (natural range <>) of analogue_in_t; - type from_INPUTS_t is record + type from_INPUTS_t is record ps2_kclk : std_logic; ps2_kdat : std_logic; ps2_mclk : std_logic; @@ -150,38 +150,38 @@ package pace_pkg is type from_MAPPED_INPUTS_t is array (natural range <>) of in8_t; - -- - -- SRAM interface data structure - -- - type from_SRAM_t is record - d : std_logic_vector(31 downto 0); - end record; - - type to_SRAM_t is record - a : std_logic_vector(23 downto 0); - d : std_logic_vector(31 downto 0); - be : std_logic_vector(3 downto 0); - cs : std_logic; - oe : std_logic; - we : std_logic; - end record; + -- + -- SRAM interface data structure + -- + type from_SRAM_t is record + d : std_logic_vector(31 downto 0); + end record; + + type to_SRAM_t is record + a : std_logic_vector(23 downto 0); + d : std_logic_vector(31 downto 0); + be : std_logic_vector(3 downto 0); + cs : std_logic; + oe : std_logic; + we : std_logic; + end record; function NULL_TO_SRAM return to_SRAM_t; - - -- - -- FLASH interface data structure - -- - type from_FLASH_t is record - d : std_logic_vector(15 downto 0); - end record; - - type to_FLASH_t is record - a : std_logic_vector(21 downto 0); - d : std_logic_vector(15 downto 0); - we : std_logic; - cs : std_logic; - oe : std_logic; - end record; + + -- + -- FLASH interface data structure + -- + type from_FLASH_t is record + d : std_logic_vector(15 downto 0); + end record; + + type to_FLASH_t is record + a : std_logic_vector(21 downto 0); + d : std_logic_vector(15 downto 0); + we : std_logic; + cs : std_logic; + oe : std_logic; + end record; function NULL_TO_FLASH return to_FLASH_t; @@ -250,7 +250,7 @@ package pace_pkg is function NULL_TO_SOUND return to_SOUND_t; - -- + -- -- OSD interface data structure -- type from_OSD_t is record @@ -268,13 +268,13 @@ package pace_pkg is function NULL_TO_OSD return to_OSD_t; - -- create a constant that automatically determines - -- whether this is simulation or synthesis - constant IN_SIMULATION : BOOLEAN := false - -- synthesis translate_off - or true - -- synthesis translate_on - ; - constant IN_SYNTHESIS : boolean := not IN_SIMULATION; - -end; + -- create a constant that automatically determines + -- whether this is simulation or synthesis + constant IN_SIMULATION : BOOLEAN := false + -- synthesis translate_off + or true + -- synthesis translate_on + ; + constant IN_SYNTHESIS : boolean := not IN_SIMULATION; + + end; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd index 49c6b050..f21c5a5d 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd @@ -40,7 +40,7 @@ entity platform is sprite_reg_o : out to_SPRITE_REG_t; sprite_i : in from_SPRITE_CTL_t; sprite_o : out to_SPRITE_CTL_t; - spr0_hit : in std_logic; + spr0_hit : in std_logic; -- various graphics information graphics_i : in from_GRAPHICS_t; @@ -60,12 +60,12 @@ end platform; architecture SYN of platform is - alias clk_sys : std_logic is clkrst_i.clk(0); - alias rst_sys : std_logic is clkrst_i.rst(0); - alias clk_video : std_logic is clkrst_i.clk(1); - + alias clk_sys : std_logic is clkrst_i.clk(0); + alias rst_sys : std_logic is clkrst_i.rst(0); + alias clk_video : std_logic is clkrst_i.clk(1); + -- cpu signals - signal clk_3M072_en : std_logic; + signal clk_3M072_en : std_logic; signal cpu_clk_en : std_logic; signal cpu_a : std_logic_vector(15 downto 0); signal cpu_d_i : std_logic_vector(7 downto 0); @@ -76,17 +76,17 @@ architecture SYN of platform is signal cpu_irq : std_logic; -- ROM signals - signal rom_cs : std_logic; + signal rom_cs : std_logic; -- signal rom_d_o : std_logic_vector(7 downto 0); -- keyboard signals - - -- VRAM signals - signal vram_cs : std_logic; - signal vram_wr : std_logic; - signal vram_d_o : std_logic_vector(7 downto 0); - signal snd_cs : std_logic; + -- VRAM signals + signal vram_cs : std_logic; + signal vram_wr : std_logic; + signal vram_d_o : std_logic_vector(7 downto 0); + + signal snd_cs : std_logic; -- RAM signals @@ -97,8 +97,8 @@ architecture SYN of platform is -- CRAM/SPRITE signals signal cram_cs : std_logic; signal cram_wr : std_logic; - signal cram_d_o : std_logic_vector(7 downto 0); - signal sprite_cs : std_logic; + signal cram_d_o : std_logic_vector(7 downto 0); + signal sprite_cs : std_logic; -- misc signals signal in_cs : std_logic; @@ -165,35 +165,35 @@ begin wram_cs <= '1' when STD_MATCH(cpu_a, X"E"&"------------") else '0'; -- OUTPUT $XX00 - snd_cs <= '1' when cpu_a(7 downto 0) = X"00" else '0'; + snd_cs <= '1' when cpu_a(7 downto 0) = X"00" else '0'; -- INPUTS (I/O) $00-$04 in_cs <= '1' when STD_MATCH(cpu_a(7 downto 0), X"0"&"00--") else '1' when STD_MATCH(cpu_a(7 downto 0), X"04") else '0'; - process (clk_sys, rst_sys) begin - if rst_sys = '1' then - sound_data_o <= X"FF"; - elsif rising_edge(clk_sys) then - if cpu_clk_en = '1' and cpu_io_wr = '1' and snd_cs = '1' then - sound_data_o <= cpu_d_o; - end if; - end if; - end process; + process (clk_sys, rst_sys) begin + if rst_sys = '1' then + sound_data_o <= X"FF"; + elsif rising_edge(clk_sys) then + if cpu_clk_en = '1' and cpu_io_wr = '1' and snd_cs = '1' then + sound_data_o <= cpu_d_o; + end if; + end if; + end process; - -- memory read mux - cpu_d_i <= in_d_o when (cpu_io_rd = '1' and in_cs = '1') else - cpu_rom_do when rom_cs = '1' else - vram_d_o when vram_cs = '1' else - cram_d_o when cram_cs = '1' else - wram_d_o when wram_cs = '1' else - (others => '1'); + -- memory read mux + cpu_d_i <= in_d_o when (cpu_io_rd = '1' and in_cs = '1') else + cpu_rom_do when rom_cs = '1' else + vram_d_o when vram_cs = '1' else + cram_d_o when cram_cs = '1' else + wram_d_o when wram_cs = '1' else + (others => '1'); -- memory block write signals - vram_wr <= vram_cs and cpu_mem_wr; - cram_wr <= cram_cs and cpu_mem_wr; - wram_wr <= wram_cs and cpu_mem_wr; + vram_wr <= vram_cs and cpu_mem_wr; + cram_wr <= cram_cs and cpu_mem_wr; + wram_wr <= wram_cs and cpu_mem_wr; -- sprite registers sprite_reg_o.clk <= clk_sys; @@ -229,25 +229,27 @@ begin cpu_inst : entity work.Z80 port map ( - clk => clk_sys, - clk_en => cpu_clk_en, - reset => cpu_rst, + clk => clk_sys, + clk_en => cpu_clk_en, + reset => cpu_rst, - addr => cpu_a, - datai => cpu_d_i, - datao => cpu_d_o, + addr => cpu_a, + datai => cpu_d_i, + datao => cpu_d_o, - mem_rd => open, - mem_wr => cpu_mem_wr, - io_rd => cpu_io_rd, - io_wr => cpu_io_wr, + mem_rd => open, + mem_wr => cpu_mem_wr, + io_rd => cpu_io_rd, + io_wr => cpu_io_wr, - intreq => cpu_irq, - intvec => cpu_d_i, - intack => open, - nmi => '0' + intreq => cpu_irq, + intvec => cpu_d_i, + intack => open, + nmi => '0' ); + cpu_rom_addr <= cpu_a(14 downto 0); + end block BLK_CPU; BLK_INTERRUPTS : block @@ -256,18 +258,18 @@ begin begin - process (clk_sys, rst_sys) - variable vblank_r : std_logic_vector(3 downto 0); - alias vblank_prev : std_logic is vblank_r(vblank_r'left); - alias vblank_um : std_logic is vblank_r(vblank_r'left-1); + process (clk_sys, rst_sys) + variable vblank_r : std_logic_vector(3 downto 0); + alias vblank_prev : std_logic is vblank_r(vblank_r'left); + alias vblank_um : std_logic is vblank_r(vblank_r'left-1); -- 1us duty for VBLANK_INT variable count : integer range 0 to CLK0_FREQ_MHz * 100; - begin - if rst_sys = '1' then - vblank_int <= '0'; - vblank_r := (others => '0'); + begin + if rst_sys = '1' then + vblank_int <= '0'; + vblank_r := (others => '0'); count := count'high; - elsif rising_edge(clk_sys) then + elsif rising_edge(clk_sys) then -- rising edge vblank only if vblank_prev = '0' and vblank_um = '1' then count := 0; @@ -279,8 +281,8 @@ begin vblank_int <= '0'; end if; vblank_r := vblank_r(vblank_r'left-1 downto 0) & graphics_i.vblank; - end if; -- rising_edge(clk_sys) - end process; + end if; -- rising_edge(clk_sys) + end process; -- generate INT cpu_irq <= vblank_int; @@ -323,7 +325,6 @@ begin graphics_o.bit16(0) <= m62_hscroll; end block BLK_SCROLL; -cpu_rom_addr <= cpu_a(14 downto 0); BLK_GFX_ROMS : block @@ -339,19 +340,19 @@ cpu_rom_addr <= cpu_a(14 downto 0); char_rom_inst : entity work.sprom generic map ( - init_file => "./roms/" & + init_file => "./roms/" & M62_CHAR_ROM(i) & ".hex", - widthad_a => 13 + widthad_a => 13 ) port map ( - clock => clk_video, - address => tilemap_i(1).tile_a(12 downto 0), - q => chr_rom_d(i) + clock => clk_video, + address => tilemap_i(1).tile_a(12 downto 0), + q => chr_rom_d(i) ); end generate GEN_CHAR_ROMS; - tilemap_o(1).tile_d(23 downto 0) <= chr_rom_d(0) & chr_rom_d(1) & chr_rom_d(2); + tilemap_o(1).tile_d(23 downto 0) <= chr_rom_d(0) & chr_rom_d(1) & chr_rom_d(2); -- chr_rom_addr <= tilemap_i(1).tile_a(12 downto 0); --tilemap_o(1).tile_d(23 downto 0) <= chr_rom_do; @@ -361,18 +362,18 @@ cpu_rom_addr <= cpu_a(14 downto 0); sprite_rom_inst : entity work.dprom_2r generic map ( - init_file => "./roms/" & + init_file => "./roms/" & M62_SPRITE_ROM(i) & ".hex", - widthad_a => 13, - widthad_b => 13 + widthad_a => 13, + widthad_b => 13 ) port map ( - clock => clk_video, + clock => clk_video, address_a(12 downto 5) => sprite_i.a(12 downto 5), address_a(4) => '0', address_a(3 downto 0) => sprite_i.a(3 downto 0), - q_a => spr_rom_left(i), + q_a => spr_rom_left(i), address_b(12 downto 5) => sprite_i.a(12 downto 5), address_b(4) => '1', address_b(3 downto 0) => sprite_i.a(3 downto 0), @@ -410,65 +411,63 @@ cpu_rom_addr <= cpu_a(14 downto 0); vram_inst : entity work.dpram generic map ( - init_file => "", - widthad_a => 11 + init_file => "", + widthad_a => 11 ) port map ( - clock_b => clk_sys, - address_b => vram_a, - wren_b => vram_wr, - data_b => cpu_d_o, - q_b => vram_d_o, + clock_b => clk_sys, + address_b => vram_a, + wren_b => vram_wr, + data_b => cpu_d_o, + q_b => vram_d_o, - clock_a => clk_video, - address_a => tilemap_i(1).map_a(10 downto 0), - wren_a => '0', - data_a => (others => 'X'), - q_a => tilemap_o(1).map_d(7 downto 0) + clock_a => clk_video, + address_a => tilemap_i(1).map_a(10 downto 0), + wren_a => '0', + data_a => (others => 'X'), + q_a => tilemap_o(1).map_d(7 downto 0) ); tilemap_o(1).map_d(15 downto 8) <= (others => '0'); cram_inst : entity work.dpram generic map ( - init_file => "", - widthad_a => 11 + init_file => "", + widthad_a => 11 ) port map ( - clock_b => clk_sys, - address_b => cram_a, - wren_b => cram_wr, - data_b => cpu_d_o, - q_b => cram_d_o, + clock_b => clk_sys, + address_b => cram_a, + wren_b => cram_wr, + data_b => cpu_d_o, + q_b => cram_d_o, - clock_a => clk_video, - address_a => tilemap_i(1).attr_a(10 downto 0), - wren_a => '0', - data_a => (others => 'X'), - q_a => tilemap_o(1).attr_d(7 downto 0) + clock_a => clk_video, + address_a => tilemap_i(1).attr_a(10 downto 0), + wren_a => '0', + data_a => (others => 'X'), + q_a => tilemap_o(1).attr_d(7 downto 0) ); tilemap_o(1).attr_d(15 downto 8) <= (others => '0'); - - end block BLK_VRAM; - - - wram_inst : entity work.spram - generic map - ( - widthad_a => 12 - ) - port map - ( - clock => clk_sys, - address => cpu_a(11 downto 0), - data => cpu_d_o, - wren => wram_wr, - q => wram_d_o - ); - + end block BLK_VRAM; + + wram_inst : entity work.spram + generic map + ( + widthad_a => 12 + ) + port map + ( + clock => clk_sys, + address => cpu_a(11 downto 0), + data => cpu_d_o, + wren => wram_wr, + q => wram_d_o + ); + -- unused outputs sprite_o.ld <= '0'; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd index 7a9667eb..b3116c6c 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd @@ -8,15 +8,15 @@ use work.platform_variant_pkg.all; use work.video_controller_pkg.all; package platform_pkg is --- constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_VGA_640x480_60Hz; --- constant PACE_CLK0_DIVIDE_BY : natural := 3; --- constant PACE_CLK0_MULTIPLY_BY : natural := 5; -- 24*5/3 = 40MHz --- constant PACE_CLK1_DIVIDE_BY : natural := 19; --- constant PACE_CLK1_MULTIPLY_BY : natural := 20; -- 24*20/19 = 25.263158MHz --- constant PACE_VIDEO_H_SCALE : integer := 1; --- constant PACE_VIDEO_V_SCALE : integer := 1; --- constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; --- constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; +-- constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_VGA_640x480_60Hz; +-- constant PACE_CLK0_DIVIDE_BY : natural := 3; +-- constant PACE_CLK0_MULTIPLY_BY : natural := 5; -- 24*5/3 = 40MHz +-- constant PACE_CLK1_DIVIDE_BY : natural := 19; +-- constant PACE_CLK1_MULTIPLY_BY : natural := 20; -- 24*20/19 = 25.263158MHz +-- constant PACE_VIDEO_H_SCALE : integer := 1; +-- constant PACE_VIDEO_V_SCALE : integer := 1; +-- constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; +-- constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; -- constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_ARCADE_STD_336x240_60Hz; -- constant PACE_CLK0_DIVIDE_BY : natural := 19; @@ -28,40 +28,40 @@ package platform_pkg is -- constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; -- constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; - constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_PAL_576x288_50Hz; - constant PACE_CLK0_DIVIDE_BY : natural := 27; - constant PACE_CLK0_MULTIPLY_BY : natural := 44; -- 27*44/27 = 44MHz - constant PACE_CLK1_DIVIDE_BY : natural := 27; - constant PACE_CLK1_MULTIPLY_BY : natural := 11; -- 27*11/27 = 11MHz - constant PACE_VIDEO_H_SCALE : integer := 1; - constant PACE_VIDEO_V_SCALE : integer := 1; - constant PACE_ENABLE_ADV724 : std_logic := '1'; - constant USE_VIDEO_VBLANK_INTERRUPT : boolean := false; - constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '1'; - constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '1'; + constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_PAL_576x288_50Hz; + constant PACE_CLK0_DIVIDE_BY : natural := 27; + constant PACE_CLK0_MULTIPLY_BY : natural := 44; -- 27*44/27 = 44MHz + constant PACE_CLK1_DIVIDE_BY : natural := 27; + constant PACE_CLK1_MULTIPLY_BY : natural := 11; -- 27*11/27 = 11MHz + constant PACE_VIDEO_H_SCALE : integer := 1; + constant PACE_VIDEO_V_SCALE : integer := 1; + constant PACE_ENABLE_ADV724 : std_logic := '1'; + constant USE_VIDEO_VBLANK_INTERRUPT : boolean := false; + constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '1'; + constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '1'; - constant PACE_VIDEO_BORDER_RGB : RGB_t := RGB_BLACK; + constant PACE_VIDEO_BORDER_RGB : RGB_t := RGB_BLACK; - constant M62_VIDEO_H_SIZE : integer := 384; - constant M62_VIDEO_H_OFFSET : integer := (512-M62_VIDEO_H_SIZE)/2; - constant M62_VIDEO_V_SIZE : integer := 256; + constant M62_VIDEO_H_SIZE : integer := 384; + constant M62_VIDEO_H_OFFSET : integer := (512-M62_VIDEO_H_SIZE)/2; + constant M62_VIDEO_V_SIZE : integer := 256; - constant PACE_VIDEO_NUM_BITMAPS : natural := 0; - constant PACE_VIDEO_NUM_TILEMAPS : natural := 1; - constant PACE_VIDEO_NUM_SPRITES : natural := 32; - constant PACE_VIDEO_H_SIZE : integer := M62_VIDEO_H_SIZE; - constant PACE_VIDEO_V_SIZE : integer := M62_VIDEO_V_SIZE; - constant PACE_VIDEO_L_CROP : integer := 0; - constant PACE_VIDEO_R_CROP : integer := PACE_VIDEO_L_CROP; - constant PACE_VIDEO_PIPELINE_DELAY : integer := 5; + constant PACE_VIDEO_NUM_BITMAPS : natural := 0; + constant PACE_VIDEO_NUM_TILEMAPS : natural := 1; + constant PACE_VIDEO_NUM_SPRITES : natural := 32; + constant PACE_VIDEO_H_SIZE : integer := M62_VIDEO_H_SIZE; + constant PACE_VIDEO_V_SIZE : integer := M62_VIDEO_V_SIZE; + constant PACE_VIDEO_L_CROP : integer := 0; + constant PACE_VIDEO_R_CROP : integer := PACE_VIDEO_L_CROP; + constant PACE_VIDEO_PIPELINE_DELAY : integer := 5; - constant PACE_INPUTS_NUM_BYTES : integer := 6; + constant PACE_INPUTS_NUM_BYTES : integer := 6; - constant CLK0_FREQ_MHz : natural := + constant CLK0_FREQ_MHz : natural := 27 * PACE_CLK0_MULTIPLY_BY / PACE_CLK0_DIVIDE_BY; - constant CPU_FREQ_MHz : natural := 3; + constant CPU_FREQ_MHz : natural := 3; - constant M62_CPU_CLK_ENA_DIVIDE_BY : natural := CLK0_FREQ_MHz / CPU_FREQ_MHz; + constant M62_CPU_CLK_ENA_DIVIDE_BY : natural := CLK0_FREQ_MHz / CPU_FREQ_MHz; type from_PLATFORM_IO_t is record not_used : std_logic; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd index 7f333b9f..7ecfb075 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd @@ -36,11 +36,11 @@ package platform_variant_pkg is 2 => "lr-b-4c" ); - type pal_rgb_t is array (0 to 2) of std_logic_vector(7 downto 0); - type pal_a is array (natural range <>) of pal_rgb_t; + type pal_rgb_t is array (0 to 2) of std_logic_vector(7 downto 0); + type pal_a is array (natural range <>) of pal_rgb_t; - constant tile_pal : pal_a(0 to 255) := - ( + constant tile_pal : pal_a(0 to 255) := + ( 17 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF 25 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 33 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF @@ -200,11 +200,11 @@ package platform_variant_pkg is 251 => (0=>"10110111", 1=>"01110000", 2=>"01100010"), -- B77062 252 => (0=>"11001100", 1=>"01110000", 2=>"10000100"), -- CC7084 253 => (0=>"11110000", 1=>"10100110", 2=>"10010100"), -- F0A694 - others => (others => "00000011") + others => (others => "00000011") ); - constant sprite_pal : pal_a(0 to 255) := - ( + constant sprite_pal : pal_a(0 to 255) := + ( 1 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 2 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 3 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 @@ -411,8 +411,8 @@ package platform_variant_pkg is 253 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF 254 => (0=>"00000011", 1=>"10010100", 2=>"00000011"), -- 039403 255 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - others => (others => "00000011") - ); + others => (others => "00000011") + ); -- table of sprite heights type prom_a is array (natural range <>) of integer range 0 to 3; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd index 880f09f2..1209e0f0 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd @@ -16,9 +16,9 @@ entity sprite_array is N_SPRITES : integer; DELAY : integer ); - port - ( - reset : in std_logic; + port + ( + reset : in std_logic; -- register interface reg_i : in to_SPRITE_REG_t; @@ -29,7 +29,7 @@ entity sprite_array is -- extra data graphics_i : in to_GRAPHICS_t; - -- sprite data + -- sprite data row_a : out SPRITE_ROW_A_t; row_d : in SPRITE_ROW_D_t; @@ -38,49 +38,49 @@ entity sprite_array is set : out std_logic; pri : out std_logic; spr0_set : out std_logic - ); +); end entity sprite_array; architecture SYN of sprite_array is - type reg_a_t is array (natural range <>) of from_SPRITE_REG_t; + type reg_a_t is array (natural range <>) of from_SPRITE_REG_t; type ctl_i_a_t is array (natural range <>) of to_SPRITE_CTL_t; type ctl_o_a_t is array (natural range <>) of from_SPRITE_CTL_t; - alias clk : std_logic is video_ctl.clk; - alias clk_ena : std_logic is video_ctl.clk_ena; - - signal reg_o : reg_a_t(0 to N_SPRITES-1); + alias clk : std_logic is video_ctl.clk; + alias clk_ena : std_logic is video_ctl.clk_ena; + + signal reg_o : reg_a_t(0 to N_SPRITES-1); signal ctl_i : ctl_i_a_t(0 to N_SPRITES-1); signal ctl_o : ctl_o_a_t(0 to N_SPRITES-1); - - signal ld_r : std_logic_vector(N_SPRITES-1 downto 0); - + + signal ld_r : std_logic_vector(N_SPRITES-1 downto 0); + begin - -- Sprite Data Load Arbiter - -- - enables each sprite controller during hblank - -- to allow loading of sprite row data into row buffer - process (clk, clk_ena, reset) - variable i : integer range 0 to N_SPRITES-1; - begin - if reset = '1' then - -- enable must be 1 clock behind address to latch data after fetch - --ld_r <= (N_SPRITES-1 => '1', others => '0'); + -- Sprite Data Load Arbiter + -- - enables each sprite controller during hblank + -- to allow loading of sprite row data into row buffer + process (clk, clk_ena, reset) + variable i : integer range 0 to N_SPRITES-1; + begin + if reset = '1' then + -- enable must be 1 clock behind address to latch data after fetch + --ld_r <= (N_SPRITES-1 => '1', others => '0'); -- make ISE 9.2.03i happy... - ld_r(ld_r'left) <= '1'; - ld_r(ld_r'left-1 downto 0) <= (others => '0'); - i := 0; - elsif rising_edge(clk) and clk_ena = '1' then - ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); - if i = N_SPRITES-1 then - i := 0; - else - i := i + 1; - end if; + ld_r(ld_r'left) <= '1'; + ld_r(ld_r'left-1 downto 0) <= (others => '0'); + i := 0; + elsif rising_edge(clk) and clk_ena = '1' then + ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); + if i = N_SPRITES-1 then + i := 0; + else + i := i + 1; + end if; row_a <= ctl_o(i).a; - end if; - end process; + end if; + end process; -- sprite row data fan-out GEN_ROW_D : for i in 0 to N_SPRITES-1 generate @@ -88,63 +88,63 @@ begin ctl_i(i).d <= row_d; end generate GEN_ROW_D; - -- Sprite Priority Encoder - -- - determines which sprite pixel (if any) is to be displayed - -- We can use a clocked process here because the tilemap - -- output is 1 clock behind at this point - process (clk, clk_ena) - variable spr_on_v : std_logic := '0'; - variable spr_pri_v : std_logic := '0'; - begin - if rising_edge(clk) and clk_ena = '1' then - spr_on_v := '0'; - spr_pri_v := '0'; - for i in 0 to N_SPRITES-1 loop - -- if highest priority = 0 and pixel on - if spr_pri_v = '0' and ctl_o(i).set = '1' then - -- if no sprite on or this priority = 1 - if spr_on_v = '0' or reg_o(i).pri = '1' then - rgb <= ctl_o(i).rgb; - spr_on_v := '1'; -- flag as sprite on - spr_pri_v := reg_o(i).pri; -- store priority - end if; - end if; - end loop; - end if; - set <= spr_on_v; - pri <= spr_pri_v; - end process; + -- Sprite Priority Encoder + -- - determines which sprite pixel (if any) is to be displayed + -- We can use a clocked process here because the tilemap + -- output is 1 clock behind at this point + process (clk, clk_ena) + variable spr_on_v : std_logic := '0'; + variable spr_pri_v : std_logic := '0'; + begin + if rising_edge(clk) and clk_ena = '1' then + spr_on_v := '0'; + spr_pri_v := '0'; + for i in 0 to N_SPRITES-1 loop + -- if highest priority = 0 and pixel on + if spr_pri_v = '0' and ctl_o(i).set = '1' then + -- if no sprite on or this priority = 1 + if spr_on_v = '0' or reg_o(i).pri = '1' then + rgb <= ctl_o(i).rgb; + spr_on_v := '1'; -- flag as sprite on + spr_pri_v := reg_o(i).pri; -- store priority + end if; + end if; + end loop; + end if; + set <= spr_on_v; + pri <= spr_pri_v; + end process; - -- for NES, and perhaps others - -- it's actually more complicated than this - -- but it'll do for now... - spr0_set <= ctl_o(0).set; - - -- - -- Component Instantiation - -- - - GEN_REGS : for i in 0 to N_SPRITES-1 generate - - sptReg_inst : entity work.sptReg - generic map - ( - INDEX => i - ) - port map - ( - reg_i => reg_i, - reg_o => reg_o(i) - ); + -- for NES, and perhaps others + -- it's actually more complicated than this + -- but it'll do for now... + spr0_set <= ctl_o(0).set; - sptCtl_inst : entity work.spritectl - generic map - ( - INDEX => i, - DELAY => DELAY - ) - port map - ( + -- + -- Component Instantiation + -- + + GEN_REGS : for i in 0 to N_SPRITES-1 generate + + sptReg_inst : entity work.sptReg + generic map + ( + INDEX => i + ) + port map + ( + reg_i => reg_i, + reg_o => reg_o(i) + ); + + sptCtl_inst : entity work.spritectl + generic map + ( + INDEX => i, + DELAY => DELAY + ) + port map + ( -- sprite registers reg_i => reg_o(i), @@ -157,8 +157,7 @@ begin graphics_i => graphics_i ); - - end generate GEN_REGS; - -end SYN; + end generate GEN_REGS; + +end SYN; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd index ee5cf179..6b8b7f9a 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd @@ -57,7 +57,7 @@ package sprite_pkg is ); port ( - reset : in std_logic; + reset : in std_logic; -- register interface reg_i : in to_SPRITE_REG_t; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd index 24a69d43..2a44677b 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd @@ -11,13 +11,13 @@ use work.platform_pkg.all; use work.platform_variant_pkg.all; entity spritectl is - generic - ( - INDEX : natural; - DELAY : integer - ); - port - ( + generic + ( + INDEX : natural; + DELAY : integer + ); + port + ( -- sprite registers reg_i : in from_SPRITE_REG_t; @@ -28,8 +28,8 @@ entity spritectl is ctl_i : in to_SPRITE_CTL_t; ctl_o : out from_SPRITE_CTL_t; - graphics_i : in to_GRAPHICS_t - ); + graphics_i : in to_GRAPHICS_t + ); end entity spritectl; architecture SYN of spritectl is @@ -47,22 +47,22 @@ begin flipData(31 downto 16) <= flip_1 (ctl_i.d(31 downto 16), reg_i.xflip); flipData(15 downto 0) <= flip_1 (ctl_i.d(15 downto 0), reg_i.xflip); - process (clk, clk_ena) + process (clk, clk_ena) - variable rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period - variable pel : std_logic_vector(2 downto 0); - variable x : unsigned(video_ctl.x'range); - variable y : unsigned(video_ctl.y'range); - variable yMat : boolean; -- raster is between first and last line of sprite - variable xMat : boolean; -- raster in between left edge and end of line + variable rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period + variable pel : std_logic_vector(2 downto 0); + variable x : unsigned(video_ctl.x'range); + variable y : unsigned(video_ctl.y'range); + variable yMat : boolean; -- raster is between first and last line of sprite + variable xMat : boolean; -- raster in between left edge and end of line - variable height : unsigned(6 downto 0); - -- the width of rowCount determines the scanline multipler - -- - eg. (4 downto 0) is 1:1 - -- (5 downto 0) is 2:1 (scan-doubling) --- variable rowCount : unsigned(3+PACE_VIDEO_V_SCALE downto 0); --- alias row : unsigned(4 downto 0) is --- rowCount(rowCount'left downto rowCount'left-4); + variable height : unsigned(6 downto 0); + -- the width of rowCount determines the scanline multipler + -- - eg. (4 downto 0) is 1:1 + -- (5 downto 0) is 2:1 (scan-doubling) + -- variable rowCount : unsigned(3+PACE_VIDEO_V_SCALE downto 0); + -- alias row : unsigned(4 downto 0) is + -- rowCount(rowCount'left downto rowCount'left-4); variable rowCount : unsigned(height'range); alias row : unsigned(rowCount'range) is rowCount; -- which part of the sprite is being drawn @@ -71,11 +71,11 @@ begin variable prom_i : integer range sprite_prom'range; variable code : std_logic_vector(9 downto 0); variable pal_i : std_logic_vector(7 downto 0); - variable pal_rgb : pal_rgb_t; + variable pal_rgb : pal_rgb_t; begin - if rising_edge(clk) then + if rising_edge(clk) then if clk_ena = '1' then if video_ctl.hblank = '1' then @@ -104,7 +104,7 @@ begin rowCount := (others => '0'); yMat := true; elsif row = height then - yMat := false; + yMat := false; end if; case sprite_prom(prom_i) is @@ -132,19 +132,19 @@ begin yMat := false; end if; - -- sprites not visible before row 16 + -- sprites not visible before row 16 if ctl_i.ld = '1' then if yMat then - rowStore := flipData; -- load sprite data + rowStore := flipData; -- load sprite data else rowStore := (others => '0'); end if; end if; - + end if; -- hblank='1' - + if video_ctl.stb = '1' then - + if x = unsigned(video_ctl.x) then -- count up at left edge of sprite rowCount := rowCount + 1; @@ -153,7 +153,7 @@ begin xMat := true; --end if; end if; - + if xMat then -- shift in next pixel pel := rowStore(rowStore'left-32) & rowStore(rowStore'left-16) & rowStore(rowStore'left); diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd index 9ccad9f8..423c3eee 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd @@ -10,9 +10,9 @@ use work.platform_variant_pkg.all; use work.video_controller_pkg.all; -- --- Irem M62 Tilemap Controller +-- Irem M62 Tilemap Controller -- --- Tile data is 2 BPP. +-- Tile data is 2 BPP. -- architecture TILEMAP_1 of tilemapCtl is @@ -32,7 +32,7 @@ architecture TILEMAP_1 of tilemapCtl is begin -- not used - ctl_o.map_a(ctl_o.map_a'left downto 11) <= (others => '0'); + ctl_o.map_a(ctl_o.map_a'left downto 11) <= (others => '0'); ctl_o.attr_a(ctl_o.attr_a'left downto 11) <= (others => '0'); ctl_o.tile_a(ctl_o.tile_a'left downto 13) <= (others => '0'); @@ -48,13 +48,13 @@ begin variable tile_d_r : std_logic_vector(23 downto 0); variable attr_d_r : std_logic_vector(7 downto 0); - variable pel : std_logic_vector(2 downto 0); + variable pel : std_logic_vector(2 downto 0); variable pal_i : std_logic_vector(7 downto 0); - variable pal_rgb : pal_rgb_t; + variable pal_rgb : pal_rgb_t; begin - if rising_edge(clk) then + if rising_edge(clk) then if clk_ena = '1' then -- 1st stage of pipeline @@ -99,7 +99,7 @@ begin -- end if; end if; -- clk_ena - end if; -- rising_edge_clk + end if; -- rising_edge_clk end process; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl_e.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl_e.vhd index 8d93334b..983e369d 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl_e.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl_e.vhd @@ -15,7 +15,7 @@ entity tilemapCtl is ); port ( - reset : in std_logic; + reset : in std_logic; -- video control signals video_ctl : in from_VIDEO_CTL_t; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd index 9372578d..921a8d2c 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd @@ -8,31 +8,31 @@ use work.video_controller_pkg.all; entity pace_video_controller is generic ( - CONFIG : PACEVideoController_t := PACE_VIDEO_NONE; - DELAY : integer := 1; - H_SIZE : integer; - V_SIZE : integer; + CONFIG : PACEVideoController_t := PACE_VIDEO_NONE; + DELAY : integer := 1; + H_SIZE : integer; + V_SIZE : integer; L_CROP : integer range 0 to 255; R_CROP : integer range 0 to 255; - H_SCALE : integer; - V_SCALE : integer; + H_SCALE : integer; + V_SCALE : integer; H_SYNC_POL : std_logic := '1'; V_SYNC_POL : std_logic := '1'; - BORDER_RGB : RGB_t := RGB_BLACK + BORDER_RGB : RGB_t := RGB_BLACK ); port ( -- clocking etc video_i : in from_VIDEO_t; - -- register interface - reg_i : in VIDEO_REG_t; + -- register interface + reg_i : in VIDEO_REG_t; -- video input data rgb_i : in RGB_t; - -- control signals (out) - video_ctl_o : out from_VIDEO_CTL_t; + -- control signals (out) + video_ctl_o : out from_VIDEO_CTL_t; -- video output control & data video_o : out to_VIDEO_t @@ -43,8 +43,8 @@ architecture SYN of pace_video_controller is constant SIM_DELAY : time := 2 ns; - constant VIDEO_H_SIZE : integer := H_SIZE * H_SCALE; - constant VIDEO_V_SIZE : integer := V_SIZE * V_SCALE; + constant VIDEO_H_SIZE : integer := H_SIZE * H_SCALE; + constant VIDEO_V_SIZE : integer := V_SIZE * V_SCALE; subtype reg_t is integer range 0 to 2047; @@ -100,13 +100,13 @@ architecture SYN of pace_video_controller is begin -- registers - reg_proc: process (reset, clk) + reg_proc: process (reset, clk) - begin - --if reset = '1' then - case CONFIG is + begin + --if reset = '1' then + case CONFIG is - when PACE_VIDEO_VGA_240x320_60Hz => + when PACE_VIDEO_VGA_240x320_60Hz => -- P3M, clk=11.136MHz, clk_ena=5.568MHz h_front_porch_r <= 272-240; h_sync_r <= 5; @@ -258,26 +258,27 @@ begin v_back_porch_r <= 13; v_border_r <= (240-VIDEO_V_SIZE)/2; - when PACE_VIDEO_PAL_576x288_50Hz => - -- pixclk=11 MHz - h_front_porch_r <= 2*6; - h_sync_r <= 2*28; - h_back_porch_r <= 2*30; - h_border_r <= (576-VIDEO_H_SIZE)/2; - v_front_porch_r <= 8; - v_sync_r <= 3; - v_back_porch_r <= 13; - v_border_r <= (288-VIDEO_V_SIZE)/2; - when others => - null; - end case; + when PACE_VIDEO_PAL_576x288_50Hz => + -- pixclk=11 MHz + h_front_porch_r <= 2*6; + h_sync_r <= 2*28; + h_back_porch_r <= 2*30; + h_border_r <= (576-VIDEO_H_SIZE)/2; + v_front_porch_r <= 8; + v_sync_r <= 3; + v_back_porch_r <= 13; + v_border_r <= (288-VIDEO_V_SIZE)/2; - h_video_r <= VIDEO_H_SIZE; - v_video_r <= VIDEO_V_SIZE; - border_rgb_r <= BORDER_RGB; + when others => + null; + end case; + + h_video_r <= VIDEO_H_SIZE; + v_video_r <= VIDEO_V_SIZE; + border_rgb_r <= BORDER_RGB; - --end if; - end process reg_proc; + --end if; + end process reg_proc; -- register some arithmetic init_proc: process (reset, clk, clk_ena) diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd index 526be3c8..718352ef 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd @@ -52,10 +52,10 @@ package video_controller_pkg is constant RGB_CYAN : RGB_t := ((others=>'0'),(others=>'1'),(others=>'1')); constant RGB_WHITE : RGB_t := ((others=>'1'),(others=>'1'),(others=>'1')); - type VIDEO_REG_t is record - h_scale : std_logic_vector(2 downto 0); - v_scale : std_logic_vector(2 downto 0); - end record; + type VIDEO_REG_t is record + h_scale : std_logic_vector(2 downto 0); + v_scale : std_logic_vector(2 downto 0); + end record; type from_VIDEO_t is record clk : std_logic; @@ -187,25 +187,25 @@ package video_controller_pkg is ); end component pace_video_controller; - component tilemapCtl is - generic - ( - DELAY : integer - ); - port - ( - reset : in std_logic; - - -- video control signals - video_ctl : in from_VIDEO_CTL_t; - - -- tilemap controller signals - ctl_i : in to_TILEMAP_CTL_t; - ctl_o : out from_TILEMAP_CTL_t; - - graphics_i : in to_GRAPHICS_t - ); - end component tilemapCtl; + component tilemapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- tilemap controller signals + ctl_i : in to_TILEMAP_CTL_t; + ctl_o : out from_TILEMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); + end component tilemapCtl; component bitmapCtl is generic @@ -214,7 +214,7 @@ package video_controller_pkg is ); port ( - reset : in std_logic; + reset : in std_logic; -- video control signals video_ctl : in from_VIDEO_CTL_t; From b0e2b401b7d0314516392eb13bc8fe188800330b Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 3 Mar 2020 12:50:15 +0100 Subject: [PATCH 05/35] LodeRunner: move sprites and background tiles to SDRAM --- .../LodeRunner_MiST/LodeRunner_MiST.qsf | 12 +- .../LodeRunner_MiST/meta/Lode Runner.mra | 110 +++++++++++++++ .../LodeRunner_MiST/rtl/Graphics.VHD | 2 +- .../LodeRunner_MiST/rtl/LodeRunner_MiST.sv | 49 +++++-- .../LodeRunner_MiST/rtl/pace.vhd | 22 ++- .../LodeRunner_MiST/rtl/platform.vhd | 127 +++++++++--------- .../LodeRunner_MiST/rtl/sdram.sv | 53 +++++--- .../LodeRunner_MiST/rtl/sprite_array.vhd | 21 ++- .../LodeRunner_MiST/rtl/spritectl.vhd | 44 +++--- .../LodeRunner_MiST/rtl/target_top.vhd | 12 +- 10 files changed, 318 insertions(+), 134 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Lode Runner.mra diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf index 317e418d..47576d27 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf @@ -41,7 +41,7 @@ # ======================== set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL -set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name LAST_QUARTUS_VERSION "13.1 SP4.26" set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" set_global_assignment -name SMART_RECOMPILE ON set_global_assignment -name SYSTEMVERILOG_FILE rtl/LodeRunner_MiST.sv @@ -77,7 +77,6 @@ set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd set_global_assignment -name VHDL_FILE rtl/cpu68.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv set_global_assignment -name VHDL_FILE rtl/Sound_Board.vhd -set_global_assignment -name VHDL_FILE rtl/roms/ldrun/snd_prg.vhd set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip set_global_assignment -name QIP_FILE ../../../common/CPU/T80/T80.qip set_global_assignment -name VHDL_FILE ../../../common/CPU/T80/Z80.vhd @@ -153,7 +152,6 @@ 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_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" # Classic Timing Assignments # ========================== @@ -204,7 +202,7 @@ set_global_assignment -name USE_CONFIGURATION_DEVICE OFF # SignalTap II Assignments # ======================== set_global_assignment -name ENABLE_SIGNALTAP OFF -set_global_assignment -name USE_SIGNALTAP_FILE output_files/mcr3.stp +set_global_assignment -name USE_SIGNALTAP_FILE output_files/sp.stp # Power Estimation Assignments # ============================ @@ -266,10 +264,12 @@ set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" - 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_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top # end DESIGN_PARTITION(Top) # ------------------------- # end ENTITY(LodeRunner_MiST) -# --------------------------- \ No newline at end of file +# --------------------------- +set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp +set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Lode Runner.mra b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Lode Runner.mra new file mode 100644 index 00000000..b961fac9 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Lode Runner.mra @@ -0,0 +1,110 @@ + + Lode Runner + 0216 + ldrun + Irem + iremm62 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD index 772c00d1..0f8ce71a 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD @@ -22,7 +22,7 @@ entity Graphics is sprite_ctl_i : in to_SPRITE_CTL_t; sprite_ctl_o : out from_SPRITE_CTL_t; spr0_hit : out std_logic; - + graphics_i : in to_GRAPHICS_t; graphics_o : out from_GRAPHICS_t; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv index 8ddc3feb..7e15985d 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv @@ -30,8 +30,10 @@ module LodeRunner_MiST( `include "rtl/build_id.v" +`define CORE_NAME "LDRUN" + localparam CONF_STR = { - "LDRUNNER;ROM;", + `CORE_NAME,";;", "O2,Rotate Controls,Off,On;", "O34,Scanlines,Off,25%,50%,75%;", "O5,Blending,Off,On;", @@ -98,14 +100,29 @@ user_io( wire [14:0] rom_addr; wire [15:0] rom_do; -wire [16:0] snd_addr; +wire [17:0] snd_addr; wire [13:0] snd_rom_addr; wire [15:0] snd_do; wire snd_vma; +wire [14:0] chr1_addr; +wire [31:0] chr1_do; wire [14:0] sp_addr; wire [31:0] sp_do; +/* ROM structure +00000-1FFFF CPU1 128k +20000-2FFFF CPU2 64k +30000-4FFFF GFX1 128k +50000-8FFFF GFX2 256k + +90000-9FFFF GFX3 64k +A0000-A02FF spr_color_proms 3*256b +A0300-A05FF chr_color_proms 3*256b +A0600-A08FF fg_color_proms 3*256b +A0900-A091F spr_height_prom 32b +*/ + wire ioctl_downl; wire [7:0] ioctl_index; wire ioctl_wr; @@ -124,7 +141,7 @@ data_io data_io( .ioctl_dout ( ioctl_dout ) ); -wire [24:0] sp_ioctl_addr = ioctl_addr - 17'h10000; //todo +wire [24:0] sp_ioctl_addr = ioctl_addr - 20'h30000; reg port1_req, port2_req; sdram sdram( @@ -141,22 +158,24 @@ sdram sdram( .port1_d ( {ioctl_dout, ioctl_dout} ), .port1_q ( ), - .cpu1_addr ( ioctl_downl ? 16'hffff : {2'b00, rom_addr[14:1]} ), + .cpu1_addr ( ioctl_downl ? 17'h1ffff : {3'b000, rom_addr[14:1]} ), .cpu1_q ( rom_do ), - .cpu2_addr ( ioctl_downl ? 16'hffff : snd_addr[16:1] ), + .cpu2_addr ( ioctl_downl ? 17'h1ffff : snd_addr[17:1] ), .cpu2_q ( snd_do ), // port2 for sprite graphics .port2_req ( port2_req ), .port2_ack ( ), - .port2_a ( {sp_ioctl_addr[23:16], sp_ioctl_addr[13:0], sp_ioctl_addr[15]} ), // merge sprite roms to 32-bit wide words - .port2_ds ( {sp_ioctl_addr[14], ~sp_ioctl_addr[14]} ), + .port2_a ( {sp_ioctl_addr[23:15], sp_ioctl_addr[12:0], sp_ioctl_addr[14]} ), // merge sprite roms to 32-bit wide words + .port2_ds ( {sp_ioctl_addr[13], ~sp_ioctl_addr[13]} ), .port2_we ( ioctl_downl ), .port2_d ( {ioctl_dout, ioctl_dout} ), .port2_q ( ), - .sp_addr ( ioctl_downl ? 15'h7fff : sp_addr ), - .sp_q ( sp_do ) + .chr1_addr ( chr1_addr ), + .chr1_q ( chr1_do ), + .sp_addr ( 16'h8000 + sp_addr ), + .sp_q ( sp_do ) ); // ROM download controller @@ -168,13 +187,13 @@ always @(posedge clk_sys) begin if (ioctl_downl) begin if (~ioctl_wr_last && ioctl_wr) begin port1_req <= ~port1_req; - port2_req <= ~port2_req; + if (ioctl_addr >= 20'h30000) port2_req <= ~port2_req; end end - // clock domain crossing here (clk_snd -> clk_sys) + // async clock domain crossing here (clk_snd -> clk_sys) snd_vma_r <= snd_vma; snd_vma_r2 <= snd_vma_r; - if (snd_vma_r2) snd_addr <= snd_rom_addr + 16'h8000; + if (snd_vma_r2) snd_addr <= snd_rom_addr + 18'h20000; end // reset signal generation @@ -230,7 +249,11 @@ target_top target_top( .cpu_rom_do( rom_addr[0] ? rom_do[15:8] : rom_do[7:0] ), .snd_rom_addr(snd_rom_addr), .snd_rom_do(snd_rom_addr[0] ? snd_do[15:8] : snd_do[7:0]), - .snd_vma(snd_vma) + .snd_vma(snd_vma), + .gfx1_addr(chr1_addr), + .gfx1_do(chr1_do), + .gfx2_addr(sp_addr), + .gfx2_do(sp_do) ); mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video( diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd index 5fe723f1..8d42326b 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd @@ -34,7 +34,11 @@ entity PACE is platform_i : in from_PLATFORM_IO_t; platform_o : out to_PLATFORM_IO_t; cpu_rom_addr : out std_logic_vector(14 downto 0); - cpu_rom_do : in std_logic_vector(7 downto 0) + cpu_rom_do : in std_logic_vector(7 downto 0); + gfx1_addr : out std_logic_vector(17 downto 2); + gfx1_do : in std_logic_vector(31 downto 0); + gfx2_addr : out std_logic_vector(17 downto 2); + gfx2_do : in std_logic_vector(31 downto 0) ); end entity PACE; @@ -53,6 +57,7 @@ architecture SYN of PACE is signal to_sprite_reg : to_SPRITE_REG_t; signal to_sprite_ctl : to_SPRITE_CTL_t; + signal to_sprite_ctl2 : to_SPRITE_CTL_t; signal from_sprite_ctl : from_SPRITE_CTL_t; signal spr0_hit : std_logic; @@ -117,8 +122,12 @@ begin platform_i => platform_i, platform_o => platform_o, - cpu_rom_addr => cpu_rom_addr, - cpu_rom_do => cpu_rom_do + cpu_rom_addr => cpu_rom_addr, + cpu_rom_do => cpu_rom_do, + gfx1_addr => gfx1_addr, + gfx1_do => gfx1_do, + gfx2_addr => gfx2_addr, + gfx2_do => gfx2_do ); graphics_inst : entity work.Graphics @@ -137,10 +146,9 @@ begin graphics_i => to_graphics, graphics_o => from_graphics, - - -- video (incl. clk) - video_i => video_i, - video_o => video_o + -- video (incl. clk) + video_i => video_i, + video_o => video_o ); end SYN; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd index f21c5a5d..fda568b2 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd @@ -53,7 +53,11 @@ entity platform is platform_i : in from_PLATFORM_IO_t; platform_o : out to_PLATFORM_IO_t; cpu_rom_addr : out std_logic_vector(14 downto 0); - cpu_rom_do : in std_logic_vector(7 downto 0) + cpu_rom_do : in std_logic_vector(7 downto 0); + gfx1_addr : out std_logic_vector(17 downto 2); + gfx1_do : in std_logic_vector(31 downto 0); + gfx2_addr : out std_logic_vector(17 downto 2); + gfx2_do : in std_logic_vector(31 downto 0) ); end platform; @@ -331,72 +335,71 @@ begin type gfx_rom_d_a is array(M62_CHAR_ROM'range) of std_logic_vector(7 downto 0); signal chr_rom_d : gfx_rom_d_a; type spr_rom_d_a is array(0 to 11) of std_logic_vector(7 downto 0); - signal spr_rom_left : spr_rom_d_a; - signal spr_rom_right : spr_rom_d_a; + signal spr_rom : spr_rom_d_a; begin - - GEN_CHAR_ROMS : for i in M62_CHAR_ROM'range generate - char_rom_inst : entity work.sprom - generic map - ( - init_file => "./roms/" & - M62_CHAR_ROM(i) & ".hex", - widthad_a => 13 - ) - port map - ( - clock => clk_video, - address => tilemap_i(1).tile_a(12 downto 0), - q => chr_rom_d(i) - ); - end generate GEN_CHAR_ROMS; - tilemap_o(1).tile_d(23 downto 0) <= chr_rom_d(0) & chr_rom_d(1) & chr_rom_d(2); + -- external background ROMs + gfx1_addr <= "000"&tilemap_i(1).tile_a(12 downto 0); + tilemap_o(1).tile_d(23 downto 0) <= gfx1_do(7 downto 0) & gfx1_do(15 downto 8) & gfx1_do(23 downto 16); --- chr_rom_addr <= tilemap_i(1).tile_a(12 downto 0); - --tilemap_o(1).tile_d(23 downto 0) <= chr_rom_do; - - - GEN_SPRITE_ROMS : for i in M62_SPRITE_ROM'range generate - sprite_rom_inst : entity work.dprom_2r - generic map - ( - init_file => "./roms/" & - M62_SPRITE_ROM(i) & ".hex", - widthad_a => 13, - widthad_b => 13 - ) - port map - ( - clock => clk_video, - address_a(12 downto 5) => sprite_i.a(12 downto 5), - address_a(4) => '0', - address_a(3 downto 0) => sprite_i.a(3 downto 0), - q_a => spr_rom_left(i), - address_b(12 downto 5) => sprite_i.a(12 downto 5), - address_b(4) => '1', - address_b(3 downto 0) => sprite_i.a(3 downto 0), - q_b => spr_rom_right(i) - ); - end generate GEN_SPRITE_ROMS; + -- internal background ROMs +-- GEN_CHAR_ROMS : for i in M62_CHAR_ROM'range generate +-- char_rom_inst : entity work.sprom +-- generic map +-- ( +-- init_file => "./roms/" & +-- M62_CHAR_ROM(i) & ".hex", +-- widthad_a => 13 +-- ) +-- port map +-- ( +-- clock => clk_video, +-- address => tilemap_i(1).tile_a(12 downto 0), +-- q => chr_rom_d(i) +-- ); +-- end generate GEN_CHAR_ROMS; +-- +-- tilemap_o(1).tile_d(23 downto 0) <= chr_rom_d(0) & chr_rom_d(1) & chr_rom_d(2); - sprite_o.d(sprite_o.d'left downto 48) <= (others => '0'); - sprite_o.d(47 downto 0) <= spr_rom_left(0) & spr_rom_right(0) & - spr_rom_left(1) & spr_rom_right(1) & - spr_rom_left(2) & spr_rom_right(2) - when sprite_i.a(14 downto 13) = "00" else - spr_rom_left(3) & spr_rom_right(3) & - spr_rom_left(4) & spr_rom_right(4) & - spr_rom_left(5) & spr_rom_right(5) - when sprite_i.a(14 downto 13) = "01" else - spr_rom_left(6) & spr_rom_right(6) & - spr_rom_left(7) & spr_rom_right(7) & - spr_rom_left(8) & spr_rom_right(8) - when sprite_i.a(14 downto 13) = "10" else - spr_rom_left(9) & spr_rom_right(9) & - spr_rom_left(10) & spr_rom_right(10) & - spr_rom_left(11) & spr_rom_right(11); + -- external sprite ROMs + gfx2_addr <= '0' & sprite_i.a(14 downto 0); + sprite_o.d(23 downto 0) <= gfx2_do(7 downto 0) & gfx2_do(15 downto 8) & gfx2_do(23 downto 16); + + -- internal sprite ROMs +-- GEN_SPRITE_ROMS : for i in M62_SPRITE_ROM'range generate +-- sprite_rom_inst : entity work.sprom +-- generic map +-- ( +-- init_file => "./roms/" & +-- M62_SPRITE_ROM(i) & ".hex", +-- widthad_a => 13 +-- ) +-- port map +-- ( +-- clock => clk_video, +-- address(12 downto 5) => sprite_i.a(12 downto 5), +-- address(4 downto 0) => sprite_i.a(4 downto 0), +-- q => spr_rom(i) +-- ); +-- end generate GEN_SPRITE_ROMS; +-- +-- sprite_o.d(sprite_o.d'left downto 24) <= (others => '0'); +-- sprite_o.d(23 downto 0) <= spr_rom(0) & +-- spr_rom(1) & +-- spr_rom(2) +-- when sprite_i.a(14 downto 13) = "00" else +-- spr_rom(3) & +-- spr_rom(4) & +-- spr_rom(5) +-- when sprite_i.a(14 downto 13) = "01" else +-- spr_rom(6) & +-- spr_rom(7) & +-- spr_rom(8) +-- when sprite_i.a(14 downto 13) = "10" else +-- spr_rom(9) & +-- spr_rom(10) & +-- spr_rom(11); end block BLK_GFX_ROMS; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sdram.sv b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sdram.sv index 41f5b7a8..267f2759 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sdram.sv +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sdram.sv @@ -46,9 +46,9 @@ module sdram ( input [15:0] port1_d, output reg [15:0] port1_q, - input [16:1] cpu1_addr, + input [17:1] cpu1_addr, output reg [15:0] cpu1_q, - input [16:1] cpu2_addr, + input [17:1] cpu2_addr, output reg [15:0] cpu2_q, input port2_req, @@ -59,7 +59,9 @@ module sdram ( input [15:0] port2_d, output reg [31:0] port2_q, - input [16:2] sp_addr, + input [19:2] chr1_addr, + output reg [31:0] chr1_q, + input [19:2] sp_addr, output reg [31:0] sp_q ); @@ -83,24 +85,25 @@ localparam RFRSH_CYCLES = 10'd842; SDRAM state machine for 2 bank interleaved access 1 word burst, CL2 cmd issued registered - 0 RAS0 cas1 - data0 read burst terminated - 1 ras0 + 0 RAS0 + 1 ras0 - data1 returned 2 data1 returned - 3 CAS0 data1 returned + 3 CAS0 4 RAS1 cas0 5 ras1 6 CAS1 data0 returned + 7 cas1 - data0 read burst terminated */ localparam STATE_RAS0 = 3'd0; // first state in cycle localparam STATE_RAS1 = 3'd4; // Second ACTIVE command after RAS0 + tRRD (15ns) localparam STATE_CAS0 = STATE_RAS0 + RASCAS_DELAY + 1'd1; // CAS phase - 3 localparam STATE_CAS1 = STATE_RAS1 + RASCAS_DELAY; // CAS phase - 6 -localparam STATE_READ0 = 3'd0;// STATE_CAS0 + CAS_LATENCY + 2'd2; // 7 -localparam STATE_READ1 = 3'd3; -localparam STATE_DS1b = 3'd0; -localparam STATE_READ1b = 3'd4; -localparam STATE_LAST = 3'd6; +localparam STATE_READ0 = STATE_CAS0 + CAS_LATENCY + 2'd2; // 7 +localparam STATE_READ1 = 3'd2; +localparam STATE_DS1b = 3'd7; +localparam STATE_READ1b = 3'd3; +localparam STATE_LAST = 3'd7; reg [2:0] t; @@ -152,8 +155,8 @@ assign SDRAM_nWE = sd_cmd[0]; reg [24:1] addr_latch[2]; reg [24:1] addr_latch_next[2]; -reg [16:1] addr_last[2]; -reg [16:2] addr_last2[2]; +reg [17:1] addr_last[2]; +reg [19:2] addr_last2[2]; reg [15:0] din_latch[2]; reg [1:0] oe_latch; reg [1:0] we_latch; @@ -166,6 +169,7 @@ localparam PORT_NONE = 2'd0; localparam PORT_CPU1 = 2'd1; localparam PORT_CPU2 = 2'd2; localparam PORT_SP = 2'd1; +localparam PORT_CHR1 = 2'd2; localparam PORT_REQ = 2'd3; reg [1:0] next_port[2]; @@ -185,10 +189,10 @@ always @(*) begin addr_latch_next[0] = { 1'b0, port1_a }; end else if (cpu1_addr != addr_last[PORT_CPU1]) begin next_port[0] = PORT_CPU1; - addr_latch_next[0] = { 8'd0, cpu1_addr }; + addr_latch_next[0] = { 7'd0, cpu1_addr }; end else if (cpu2_addr != addr_last[PORT_CPU2]) begin next_port[0] = PORT_CPU2; - addr_latch_next[0] = { 8'd0, cpu2_addr }; + addr_latch_next[0] = { 7'd0, cpu2_addr }; end else begin next_port[0] = PORT_NONE; addr_latch_next[0] = addr_latch[0]; @@ -202,7 +206,10 @@ always @(*) begin addr_latch_next[1] = { 1'b1, port2_a }; end else if (sp_addr != addr_last2[PORT_SP]) begin next_port[1] = PORT_SP; - addr_latch_next[1] = { 1'b1, 7'd0, sp_addr, 1'b0 }; + addr_latch_next[1] = { 1'b1, 4'd0, sp_addr, 1'b0 }; + end else if (chr1_addr != addr_last2[PORT_CHR1]) begin + next_port[1] = PORT_CHR1; + addr_latch_next[1] = { 1'b1, 4'd0, chr1_addr, 1'b0 }; end else begin next_port[1] = PORT_NONE; addr_latch_next[1] = addr_latch[1]; @@ -249,7 +256,7 @@ always @(posedge clk) begin sd_cmd <= CMD_ACTIVE; SDRAM_A <= addr_latch_next[0][22:10]; SDRAM_BA <= addr_latch_next[0][24:23]; - addr_last[next_port[0]] <= addr_latch_next[0][16:1]; + addr_last[next_port[0]] <= addr_latch_next[0][17:1]; if (next_port[0] == PORT_REQ) begin { oe_latch[0], we_latch[0] } <= { ~port1_we, port1_we }; ds[0] <= port1_ds; @@ -273,7 +280,7 @@ always @(posedge clk) begin sd_cmd <= CMD_ACTIVE; SDRAM_A <= addr_latch_next[1][22:10]; SDRAM_BA <= addr_latch_next[1][24:23]; - addr_last2[next_port[1]] <= addr_latch_next[1][16:2]; + addr_last2[next_port[1]] <= addr_latch_next[1][19:2]; if (next_port[1] == PORT_REQ) begin { oe_latch[1], we_latch[1] } <= { ~port1_we, port1_we }; ds[1] <= port2_ds; @@ -327,8 +334,9 @@ always @(posedge clk) begin if(t == STATE_READ1 && oe_latch[1]) begin case(port[1]) - PORT_REQ: port2_q[15:0] <= sd_din; - PORT_SP : sp_q[15:0] <= sd_din; + PORT_REQ : port2_q[15:0] <= sd_din; + PORT_SP : sp_q[15:0] <= sd_din; + PORT_CHR1: chr1_q[15:0] <= sd_din; default: ; endcase; end @@ -337,8 +345,9 @@ always @(posedge clk) begin if(t == STATE_READ1b && oe_latch[1]) begin case(port[1]) - PORT_REQ: begin port2_q[31:16] <= sd_din; port2_ack <= port2_req; end - PORT_SP : begin sp_q[31:16] <= sd_din; end + PORT_REQ : begin port2_q[31:16] <= sd_din; port2_ack <= port2_req; end + PORT_SP : begin sp_q[31:16] <= sd_din; end + PORT_CHR1 : begin chr1_q[31:16] <= sd_din; end default: ; endcase; end diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd index 1209e0f0..cafb9866 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd @@ -55,7 +55,7 @@ architecture SYN of sprite_array is signal ctl_o : ctl_o_a_t(0 to N_SPRITES-1); signal ld_r : std_logic_vector(N_SPRITES-1 downto 0); - + signal ld_ena : std_logic; begin -- Sprite Data Load Arbiter @@ -68,17 +68,28 @@ begin -- enable must be 1 clock behind address to latch data after fetch --ld_r <= (N_SPRITES-1 => '1', others => '0'); -- make ISE 9.2.03i happy... + ld_ena <= '1'; ld_r(ld_r'left) <= '1'; ld_r(ld_r'left-1 downto 0) <= (others => '0'); i := 0; elsif rising_edge(clk) and clk_ena = '1' then - ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); - if i = N_SPRITES-1 then + if video_ctl.hblank = '0' then + ld_ena <= '1'; i := 0; + ld_r(ld_r'left) <= '1'; + ld_r(ld_r'left-1 downto 0) <= (others => '0'); else - i := i + 1; + ld_ena <= not ld_ena; + if ld_ena = '1' then + ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); + if i = N_SPRITES-1 then + i := 0; + else + i := i + 1; + end if; + row_a <= ctl_o(i).a; + end if; end if; - row_a <= ctl_o(i).a; end if; end process; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd index 2a44677b..0e236a67 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd @@ -40,16 +40,15 @@ architecture SYN of spritectl is signal flipData : std_logic_vector(47 downto 0); -- flipped row data alias rgb : RGB_t is ctl_o.rgb; - + signal ld_r : std_logic; + signal left_d : std_logic; + signal rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period + begin - flipData(47 downto 32) <= flip_1 (ctl_i.d(47 downto 32), reg_i.xflip); - flipData(31 downto 16) <= flip_1 (ctl_i.d(31 downto 16), reg_i.xflip); - flipData(15 downto 0) <= flip_1 (ctl_i.d(15 downto 0), reg_i.xflip); - - process (clk, clk_ena) + process (clk, clk_ena, left_d, reg_i) - variable rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period +-- variable rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period variable pel : std_logic_vector(2 downto 0); variable x : unsigned(video_ctl.x'range); variable y : unsigned(video_ctl.y'range); @@ -77,6 +76,7 @@ begin if rising_edge(clk) then if clk_ena = '1' then + ld_r <= ctl_i.ld; if video_ctl.hblank = '1' then x := unsigned(reg_i.x) - M62_VIDEO_H_OFFSET + PACE_VIDEO_PIPELINE_DELAY - 3; @@ -131,16 +131,28 @@ begin if y = 0 then yMat := false; end if; - + -- sprites not visible before row 16 - if ctl_i.ld = '1' then + if ld_r = '0' and ctl_i.ld = '1' then + left_d <= not left_d; -- switch sprite half if yMat then - rowStore := flipData; -- load sprite data + if left_d = '0' then + -- store first half of the sprite line data + flipData(39 downto 32) <= ctl_i.d(23 downto 16); + flipData(23 downto 16) <= ctl_i.d(15 downto 8); + flipData(7 downto 0) <= ctl_i.d(7 downto 0); + else + -- load sprite data + rowStore(47 downto 32) <= flip_1(flipData(39 downto 32) & ctl_i.d(23 downto 16), reg_i.xflip); + rowStore(31 downto 16) <= flip_1(flipData(23 downto 16) & ctl_i.d(15 downto 8), reg_i.xflip); + rowStore(15 downto 0) <= flip_1(flipData( 7 downto 0) & ctl_i.d( 7 downto 0), reg_i.xflip); + end if; else - rowStore := (others => '0'); + rowStore <= (others => '0'); end if; end if; - + else + left_d <= '0'; end if; -- hblank='1' if video_ctl.stb = '1' then @@ -157,9 +169,9 @@ begin if xMat then -- shift in next pixel pel := rowStore(rowStore'left-32) & rowStore(rowStore'left-16) & rowStore(rowStore'left); - rowStore(47 downto 32) := rowStore(46 downto 32) & '0'; - rowStore(31 downto 16) := rowStore(30 downto 16) & '0'; - rowStore(15 downto 0) := rowStore(14 downto 0) & '0'; + rowStore(47 downto 32) <= rowStore(46 downto 32) & '0'; + rowStore(31 downto 16) <= rowStore(30 downto 16) & '0'; + rowStore(15 downto 0) <= rowStore(14 downto 0) & '0'; end if; end if; @@ -190,7 +202,7 @@ begin -- generate sprite data address ctl_o.a(15) <= '0'; -- unused ctl_o.a(14 downto 5) <= code; - ctl_o.a(4) <= '0'; -- dual-port RAM + ctl_o.a(4) <= left_d; if reg_i.yflip = '0' then ctl_o.a(3 downto 0) <= std_logic_vector(row(3 downto 0)); else diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd index 41ee2a1b..72be4eaf 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd @@ -42,7 +42,11 @@ entity target_top is port( cpu_rom_do : in std_logic_vector(7 downto 0); snd_rom_addr : out std_logic_vector(13 downto 0); snd_rom_do : in std_logic_vector(7 downto 0); - snd_vma : out std_logic + snd_vma : out std_logic; + gfx1_addr : out std_logic_vector(17 downto 2); + gfx1_do : in std_logic_vector(31 downto 0); + gfx2_addr : out std_logic_vector(17 downto 2); + gfx2_do : in std_logic_vector(31 downto 0) ); end target_top; @@ -111,7 +115,11 @@ pace_inst : entity work.pace platform_i => platform_i, platform_o => platform_o, cpu_rom_addr => cpu_rom_addr, - cpu_rom_do => cpu_rom_do + cpu_rom_do => cpu_rom_do, + gfx1_addr => gfx1_addr, + gfx1_do => gfx1_do, + gfx2_addr => gfx2_addr, + gfx2_do => gfx2_do ); inputs_i.jamma_n.coin(1) <= not usr_coin1; From 957534948c9ec6319c86d4a7940b1a089e503525 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 3 Mar 2020 20:01:15 +0100 Subject: [PATCH 06/35] LodeRunner: all ROMs are external, add Kung Fu Master MRA --- .../LodeRunner_MiST/LodeRunner_MiST.qsf | 5 +- .../LodeRunner_MiST/meta/Kung Fu Master.mra | 112 ++++++++++++ .../LodeRunner_MiST/rtl/Graphics.VHD | 16 +- .../LodeRunner_MiST/rtl/LodeRunner_MiST.sv | 8 + .../LodeRunner_MiST/rtl/pace.vhd | 30 ++++ .../LodeRunner_MiST/rtl/platform.vhd | 163 +++++++++++++++++- .../rtl/platform_variant_pkg.vhd | 68 +++++--- .../LodeRunner_MiST/rtl/sprite_array.vhd | 16 +- .../LodeRunner_MiST/rtl/sprite_pkg.vhd | 13 +- .../LodeRunner_MiST/rtl/sprite_pkg_body.vhd | 2 +- .../LodeRunner_MiST/rtl/spritectl.vhd | 31 ++-- .../LodeRunner_MiST/rtl/target_top.vhd | 12 ++ .../LodeRunner_MiST/rtl/tilemapctl.vhd | 29 +++- .../LodeRunner_MiST/rtl/tilemapctl_e.vhd | 29 ---- .../rtl/video_controller_pkg.vhd | 2 + .../rtl/video_controller_pkg_body.vhd | 2 +- 16 files changed, 436 insertions(+), 102 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Kung Fu Master.mra delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl_e.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf index 47576d27..c528b1d2 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf @@ -57,7 +57,6 @@ set_global_assignment -name VHDL_FILE rtl/video_mixer.vhd set_global_assignment -name VHDL_FILE rtl/video_controller_pkg_body.vhd set_global_assignment -name VHDL_FILE rtl/video_controller_pkg.vhd set_global_assignment -name VHDL_FILE rtl/video_controller.vhd -set_global_assignment -name VHDL_FILE rtl/tilemapctl_e.vhd set_global_assignment -name VHDL_FILE rtl/tilemapctl.vhd set_global_assignment -name VHDL_FILE rtl/bitmapctl_e.vhd set_global_assignment -name VHDL_FILE rtl/spritereg.vhd @@ -202,7 +201,7 @@ set_global_assignment -name USE_CONFIGURATION_DEVICE OFF # SignalTap II Assignments # ======================== set_global_assignment -name ENABLE_SIGNALTAP OFF -set_global_assignment -name USE_SIGNALTAP_FILE output_files/sp.stp +set_global_assignment -name USE_SIGNALTAP_FILE output_files/sprite.stp # Power Estimation Assignments # ============================ @@ -272,4 +271,6 @@ set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" - # --------------------------- set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 +set_global_assignment -name SIGNALTAP_FILE output_files/tilemap.stp +set_global_assignment -name SIGNALTAP_FILE output_files/sprite.stp set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Kung Fu Master.mra b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Kung Fu Master.mra new file mode 100644 index 00000000..d120c54b --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Kung Fu Master.mra @@ -0,0 +1,112 @@ + + Lode Runner + 0216 + kungfum + Irem + iremm62 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD index 0f8ce71a..4b8295c3 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD @@ -9,10 +9,14 @@ use work.video_controller_pkg.all; use work.sprite_pkg.all; --use work.project_pkg.all; use work.platform_pkg.all; +use work.platform_variant_pkg.all; entity Graphics is port ( + hwsel : in integer; + sprite_prom : in prom_a(0 to 31); + bitmap_ctl_i : in to_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); bitmap_ctl_o : out from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); tilemap_ctl_i : in to_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); @@ -46,7 +50,7 @@ architecture SYN of Graphics is signal rgb_data : RGB_t; -- before OSD is mixed in signal video_o_s : to_VIDEO_t; - + begin -- dodgy OSD transparency... @@ -104,7 +108,7 @@ begin ( bitmap_ctl_o => bitmap_ctl_o_s, tilemap_ctl_o => tilemap_ctl_o_s, - sprite_rgb => sprite_ctl_o_s.rgb, + sprite_rgb => sprite_ctl_i.rgb, sprite_set => sprite_ctl_o_s.set, sprite_pri => sprite_pri, @@ -231,7 +235,7 @@ begin tilemap_ctl_o <= tilemap_ctl_o_s; GEN_NO_SPRITES : if PACE_VIDEO_NUM_SPRITES = 0 generate - sprite_ctl_o_s <= ((others => '0'), (others => (others => '0')), '0'); + sprite_ctl_o_s <= ((others => '0'), '0', (others => '0')); sprite_pri <= '0'; spr0_hit <= '0'; end generate GEN_NO_SPRITES; @@ -247,7 +251,9 @@ begin port map ( reset => video_i.reset, - + sprite_prom => sprite_prom, + + hwsel => hwsel, -- register interface reg_i => sprite_reg_i, @@ -259,7 +265,7 @@ begin row_a => sprite_ctl_o_s.a, row_d => sprite_ctl_i.d, - rgb => sprite_ctl_o_s.rgb, + pal_a => sprite_ctl_o_s.pal_a, set => sprite_ctl_o_s.set, pri => sprite_pri, spr0_set => spr0_hit diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv index 7e15985d..74e252b2 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv @@ -31,6 +31,7 @@ module LodeRunner_MiST( `include "rtl/build_id.v" `define CORE_NAME "LDRUN" +wire [6:0] core_mod; localparam CONF_STR = { `CORE_NAME,";;", @@ -89,6 +90,7 @@ user_io( .scandoubler_disable (scandoublerD ), .ypbpr (ypbpr ), .no_csync (no_csync ), + .core_mod (core_mod ), .key_strobe (key_strobe ), .key_pressed (key_pressed ), .key_code (key_code ), @@ -222,6 +224,7 @@ target_top target_top( .clock_vid(clk_vid),//11MHz .clk_aud(clk_aud),//0.895MHz .reset_in(reset), + .hwsel(core_mod), .audio_out(audio), .usr_coin1(m_coin1), .usr_coin2(m_coin2), @@ -245,6 +248,11 @@ target_top target_top( .VGA_R(r), .VGA_G(g), .VGA_B(b), + + .dl_addr(ioctl_addr - 20'hA0000), + .dl_data(ioctl_dout), + .dl_wr(ioctl_wr), + .cpu_rom_addr(rom_addr), .cpu_rom_do( rom_addr[0] ? rom_do[15:8] : rom_do[7:0] ), .snd_rom_addr(snd_rom_addr), diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd index 8d42326b..53d2488c 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd @@ -1,5 +1,6 @@ library ieee; use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; library work; @@ -7,6 +8,7 @@ use work.pace_pkg.all; use work.video_controller_pkg.all; use work.sprite_pkg.all; use work.platform_pkg.all; +use work.platform_variant_pkg.all; --use work.project_pkg.all; entity PACE is @@ -14,6 +16,9 @@ entity PACE is ( -- clocks and resets clkrst_i : in from_CLKRST_t; + + -- hardware variant + hwsel : in integer; -- misc I/O buttons_i : in from_BUTTONS_t; @@ -33,6 +38,11 @@ entity PACE is -- project_o : out to_PROJECT_IO_t; platform_i : in from_PLATFORM_IO_t; platform_o : out to_PLATFORM_IO_t; + + dl_addr : in std_logic_vector(11 downto 0); + dl_data : in std_logic_vector(7 downto 0); + dl_wr : in std_logic; + cpu_rom_addr : out std_logic_vector(14 downto 0); cpu_rom_do : in std_logic_vector(7 downto 0); gfx1_addr : out std_logic_vector(17 downto 2); @@ -44,6 +54,8 @@ end entity PACE; architecture SYN of PACE is + alias clk_sys : std_logic is clkrst_i.clk(0); + constant CLK_1US_COUNTS : integer := integer(27 * PACE_CLK0_MULTIPLY_BY / PACE_CLK0_DIVIDE_BY); @@ -63,6 +75,7 @@ architecture SYN of PACE is signal to_graphics : to_GRAPHICS_t; signal from_graphics : from_GRAPHICS_t; + signal sprite_prom : prom_a(0 to 31); begin @@ -92,6 +105,8 @@ begin ( -- clocking and reset clkrst_i => clkrst_i, + + hwsel => hwsel, -- misc inputs and outputs buttons_i => buttons_i, @@ -122,6 +137,10 @@ begin platform_i => platform_i, platform_o => platform_o, + dl_addr => dl_addr, + dl_data => dl_data, + dl_wr => dl_wr, + cpu_rom_addr => cpu_rom_addr, cpu_rom_do => cpu_rom_do, gfx1_addr => gfx1_addr, @@ -133,6 +152,9 @@ begin graphics_inst : entity work.Graphics Port Map ( + hwsel => hwsel, + sprite_prom => sprite_prom, + bitmap_ctl_i => to_bitmap_ctl, bitmap_ctl_o => from_bitmap_ctl, @@ -151,4 +173,12 @@ begin video_o => video_o ); + process(clk_sys) begin + if rising_edge(clk_sys) then + -- 900-91F + if dl_wr = '1' and dl_addr(11 downto 5) = x"9"&"000" then + sprite_prom(to_integer(unsigned(dl_addr(4 downto 0)))) <= to_integer(unsigned(dl_data(1 downto 0))); + end if; + end if; + end process; end SYN; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd index fda568b2..110a0dce 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd @@ -21,6 +21,8 @@ entity platform is -- clocking and reset clkrst_i : in from_CLKRST_t; + hwsel : in integer; + -- misc I/O buttons_i : in from_BUTTONS_t; switches_i : in from_SWITCHES_t; @@ -52,6 +54,11 @@ entity platform is -- project_o : out to_PROJECT_IO_t; platform_i : in from_PLATFORM_IO_t; platform_o : out to_PLATFORM_IO_t; + + dl_addr : in std_logic_vector(11 downto 0); + dl_data : in std_logic_vector(7 downto 0); + dl_wr : in std_logic; + cpu_rom_addr : out std_logic_vector(14 downto 0); cpu_rom_do : in std_logic_vector(7 downto 0); gfx1_addr : out std_logic_vector(17 downto 2); @@ -107,7 +114,13 @@ architecture SYN of platform is -- misc signals signal in_cs : std_logic; signal in_d_o : std_logic_vector(7 downto 0); - + signal pal_r_wr : std_logic; + signal pal_g_wr : std_logic; + signal pal_b_wr : std_logic; + signal sp_pal_r_wr : std_logic; + signal sp_pal_g_wr : std_logic; + signal sp_pal_b_wr : std_logic; + -- other signals signal rst_platform : std_logic; signal pause : std_logic; @@ -155,14 +168,14 @@ begin -- SPRITE $C000-$C0FF sprite_cs <= '1' when STD_MATCH(cpu_a, X"C0"& "--------") else '0'; -- VRAM/CRAM $D000-$DFFF - vram_cs <= '1' when PLATFORM_VARIANT = "kungfum" and + vram_cs <= '1' when hwsel = HW_KUNGFUM and STD_MATCH(cpu_a, X"D"&"0-----------") else - '1' when PLATFORM_VARIANT /= "kungfum" and + '1' when hwsel /= HW_KUNGFUM and STD_MATCH(cpu_a, X"D"&"-----------0") else '0'; - cram_cs <= '1' when PLATFORM_VARIANT = "kungfum" and + cram_cs <= '1' when hwsel = HW_KUNGFUM and STD_MATCH(cpu_a, X"D"&"1-----------") else - '1' when PLATFORM_VARIANT /= "kungfum" and + '1' when hwsel /= HW_KUNGFUM and STD_MATCH(cpu_a, X"D"&"-----------1") else '0'; -- RAM $E000-$EFFF @@ -313,11 +326,11 @@ begin if cpu_clk_en = '1' and cpu_mem_wr = '1' then case cpu_a is when X"A000" => - if PLATFORM_VARIANT = "kungfum" then + if hwsel = HW_KUNGFUM then m62_hscroll(7 downto 0) <= cpu_d_o; end if; when X"B000" => - if PLATFORM_VARIANT = "kungfum" then + if hwsel = HW_KUNGFUM then m62_hscroll(15 downto 8) <= cpu_d_o; end if; when others => @@ -408,7 +421,7 @@ begin alias cram_a : std_logic_vector(10 downto 0) is vram_a; begin - vram_a <= cpu_a(10 downto 0) when PLATFORM_VARIANT = "kungfum" else + vram_a <= cpu_a(10 downto 0) when hwsel = HW_KUNGFUM else cpu_a(11 downto 1); vram_inst : entity work.dpram @@ -471,6 +484,140 @@ begin q => wram_d_o ); + -- tilemap 1 palettes + pal_r : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => pal_r_wr, + data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + q_b => open, + + clock_a => not clk_video, + address_a => tilemap_i(1).pal_a, + wren_a => '0', + data_a => (others => 'X'), + q_a => tilemap_o(1).rgb.r(9 downto 2) + ); + pal_r_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"3" else '0'; -- 300-3FF + + pal_g : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => pal_g_wr, + data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + q_b => open, + + clock_a => not clk_video, + address_a => tilemap_i(1).pal_a, + wren_a => '0', + data_a => (others => 'X'), + q_a => tilemap_o(1).rgb.g(9 downto 2) + ); + pal_g_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"4" else '0'; -- 400-4FF + + pal_b : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => pal_b_wr, + data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + q_b => open, + + clock_a => not clk_video, + address_a => tilemap_i(1).pal_a, + wren_a => '0', + data_a => (others => 'X'), + q_a => tilemap_o(1).rgb.b(9 downto 2) + ); + pal_b_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"5" else '0'; -- 500-5FF + + -- sprite palettes + sp_pal_r : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => sp_pal_r_wr, + data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + q_b => open, + + clock_a => not clk_video, + address_a => sprite_i.pal_a, + wren_a => '0', + data_a => (others => '0'), + q_a => sprite_o.rgb.r(9 downto 2) + ); + sp_pal_r_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"0" else '0'; -- 000-0FF + + sp_pal_g : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => sp_pal_g_wr, + data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + q_b => open, + + clock_a => not clk_video, + address_a => sprite_i.pal_a, + wren_a => '0', + data_a => (others => '0'), + q_a => sprite_o.rgb.g(9 downto 2) + ); + sp_pal_g_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"1" else '0'; -- 100-1FF + + sp_pal_b : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => sp_pal_b_wr, + data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + q_b => open, + + clock_a => not clk_video, + address_a => sprite_i.pal_a, + wren_a => '0', + data_a => (others => '0'), + q_a => sprite_o.rgb.b(9 downto 2) + ); + sp_pal_b_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"2" else '0'; -- 200-2FF + -- unused outputs sprite_o.ld <= '0'; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd index 7ecfb075..d96ab08a 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd @@ -9,8 +9,10 @@ use work.platform_pkg.all; package platform_variant_pkg is - constant PLATFORM_VARIANT : string := "ldrun"; - + constant HW_LDRUN : integer := 0; + constant HW_KUNGFUM : integer := 1; + constant HW_BATTROAD : integer := 2; + type rom_a is array (natural range <>) of string; constant M62_ROM : rom_a(0 to 3) := @@ -416,25 +418,45 @@ package platform_variant_pkg is -- table of sprite heights type prom_a is array (natural range <>) of integer range 0 to 3; - constant sprite_prom : prom_a(0 to 31) := - ( - 4 => 0, - 5 => 0, - 6 => 0, - 7 => 0, - 12 => 0, - 13 => 0, - 14 => 0, - 15 => 0, - 20 => 0, - 21 => 0, - 22 => 0, - 23 => 0, - 28 => 0, - 29 => 0, - 30 => 0, - 31 => 0, - others => 1 - ); - + +-- ldrun +-- constant sprite_prom : prom_a(0 to 31) := +-- ( +-- 4 => 0, +-- 5 => 0, +-- 6 => 0, +-- 7 => 0, +-- 12 => 0, +-- 13 => 0, +-- 14 => 0, +-- 15 => 0, +-- 20 => 0, +-- 21 => 0, +-- 22 => 0, +-- 23 => 0, +-- 28 => 0, +-- 29 => 0, +-- 30 => 0, +-- 31 => 0, +-- others => 1 +-- ); + +-- kungfum +-- constant sprite_prom : prom_a(0 to 31) := +-- ( +-- 0 => 0, +-- 1 => 0, +-- 8 => 0, +-- 9 => 0, +-- 12 => 2, +-- 13 => 2, +-- 14 => 2, +-- 15 => 2, +-- 16 => 0, +-- 21 => 0, +-- 23 => 0, +-- 24 => 0, +-- 27 => 0, +-- others => 1 +-- ); end package platform_variant_pkg; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd index cafb9866..78b75bee 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd @@ -8,6 +8,7 @@ library work; use work.pace_pkg.all; use work.video_controller_pkg.all; use work.sprite_pkg.all; +use work.platform_variant_pkg.all; use work.platform_pkg.all; entity sprite_array is @@ -20,6 +21,9 @@ entity sprite_array is ( reset : in std_logic; + hwsel : in integer; + sprite_prom : in prom_a(0 to 31); + -- register interface reg_i : in to_SPRITE_REG_t; @@ -34,7 +38,7 @@ entity sprite_array is row_d : in SPRITE_ROW_D_t; -- video data - rgb : out RGB_t; + pal_a : out std_logic_vector(7 downto 0); set : out std_logic; pri : out std_logic; spr0_set : out std_logic @@ -96,9 +100,11 @@ begin -- sprite row data fan-out GEN_ROW_D : for i in 0 to N_SPRITES-1 generate ctl_i(i).ld <= ld_r(i); + ctl_i(i).height <= sprite_prom(to_integer(unsigned(reg_o(i).n(9 downto 5)))); ctl_i(i).d <= row_d; + ctl_i(i).rgb <= (others => (others => '0')); end generate GEN_ROW_D; - + -- Sprite Priority Encoder -- - determines which sprite pixel (if any) is to be displayed -- We can use a clocked process here because the tilemap @@ -115,7 +121,7 @@ begin if spr_pri_v = '0' and ctl_o(i).set = '1' then -- if no sprite on or this priority = 1 if spr_on_v = '0' or reg_o(i).pri = '1' then - rgb <= ctl_o(i).rgb; + pal_a <= ctl_o(i).pal_a; spr_on_v := '1'; -- flag as sprite on spr_pri_v := reg_o(i).pri; -- store priority end if; @@ -156,9 +162,11 @@ begin ) port map ( + hwsel => hwsel, + -- sprite registers reg_i => reg_o(i), - + -- video control signals video_ctl => video_ctl, diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd index 6b8b7f9a..d3d3eeb8 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd @@ -6,6 +6,7 @@ use ieee.std_logic_unsigned.all; library work; use work.video_controller_pkg.all; +use work.platform_variant_pkg.all; package sprite_pkg is @@ -35,16 +36,18 @@ package sprite_pkg is subtype SPRITE_ROW_D_t is std_logic_vector(63 downto 0); subtype SPRITE_ROW_A_t is std_logic_vector(15 downto 0); - + type to_SPRITE_CTL_t is record ld : std_logic; d : SPRITE_ROW_D_t; + height : integer range 0 to 3; + rgb : RGB_t; end record; - + type from_SPRITE_CTL_t is record a : SPRITE_ROW_A_t; - rgb : RGB_t; set : std_logic; + pal_a : std_logic_vector(7 downto 0); end record; function NULL_TO_SPRITE_CTL return to_SPRITE_CTL_t; @@ -58,6 +61,8 @@ package sprite_pkg is port ( reset : in std_logic; + hwsel : integer; + sprite_prom : in prom_a(0 to 31); -- register interface reg_i : in to_SPRITE_REG_t; @@ -73,7 +78,7 @@ package sprite_pkg is row_d : in SPRITE_ROW_D_t; -- video data - rgb : out RGB_t; + pal_a : out std_logic_vector(7 downto 0); set : out std_logic; pri : out std_logic; spr0_set : out std_logic diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg_body.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg_body.vhd index 551261b2..beed41d5 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg_body.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg_body.vhd @@ -11,7 +11,7 @@ package body sprite_pkg is function NULL_TO_SPRITE_CTL return to_SPRITE_CTL_t is begin - return ('0', (others => '0')); + return ('0', (others => '0'), 0, (others => (others => '0'))); end function NULL_TO_SPRITE_CTL; function flip_row diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd index 0e236a67..89b07b1c 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd @@ -16,18 +16,20 @@ entity spritectl is INDEX : natural; DELAY : integer ); - port + port ( + hwsel : in integer; + -- sprite registers reg_i : in from_SPRITE_REG_t; - + -- video control signals video_ctl : in from_VIDEO_CTL_t; -- sprite control signals ctl_i : in to_SPRITE_CTL_t; ctl_o : out from_SPRITE_CTL_t; - + graphics_i : in to_GRAPHICS_t ); end entity spritectl; @@ -36,10 +38,9 @@ architecture SYN of spritectl is alias clk : std_logic is video_ctl.clk; alias clk_ena : std_logic is video_ctl.clk_ena; - + signal flipData : std_logic_vector(47 downto 0); -- flipped row data - - alias rgb : RGB_t is ctl_o.rgb; + signal ld_r : std_logic; signal left_d : std_logic; signal rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period @@ -67,10 +68,8 @@ begin -- which part of the sprite is being drawn alias segment : unsigned(1 downto 0) is rowCount(5 downto 4); - variable prom_i : integer range sprite_prom'range; variable code : std_logic_vector(9 downto 0); variable pal_i : std_logic_vector(7 downto 0); - variable pal_rgb : pal_rgb_t; begin @@ -83,9 +82,8 @@ begin y := 256 + 128 - 18 - unsigned(reg_i.y); -- hande sprite height, placement - prom_i := to_integer(unsigned(reg_i.n(9 downto 5))); code := reg_i.n(9 downto 0); -- default - case sprite_prom(prom_i) is + case ctl_i.height is when 1 => -- double height height := to_unsigned(2*16,height'length); @@ -97,7 +95,7 @@ begin when others => height := to_unsigned(16,height'length); end case; - + -- do this 1st because we don't have many clocks if y = unsigned(video_ctl.y) then -- start counting sprite row @@ -107,7 +105,7 @@ begin yMat := false; end if; - case sprite_prom(prom_i) is + case ctl_i.height is when 1 => -- double height if reg_i.yflip = '1' then @@ -176,17 +174,14 @@ begin end if; - if PLATFORM_VARIANT = "ldrun" or - PLATFORM_VARIANT = "battroad" then + if hwsel = HW_LDRUN or + hwsel = HW_BATTROAD then pal_i := '0' & reg_i.colour(3 downto 0) & pel; else pal_i := reg_i.colour(4 downto 0) & pel; end if; --pal_i := "000" & std_logic_vector(to_unsigned(INDEX,5)); - pal_rgb := sprite_pal(to_integer(unsigned(pal_i))); - rgb.r <= pal_rgb(0) & "00"; - rgb.g <= pal_rgb(1) & "00"; - rgb.b <= pal_rgb(2) & "00"; + ctl_o.pal_a <= pal_i; -- set pixel transparency based on match ctl_o.set <= '0'; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd index 72be4eaf..895ea8f0 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd @@ -13,6 +13,7 @@ entity target_top is port( clock_vid : in std_logic; clk_aud : in std_logic; reset_in : in std_logic; + hwsel : in integer; audio_out : out std_logic_vector(11 downto 0); usr_coin1 : in std_logic; usr_coin2 : in std_logic; @@ -38,6 +39,11 @@ entity target_top is port( VGA_R : out std_logic_vector(3 downto 0); VGA_G : out std_logic_vector(3 downto 0); VGA_B : out std_logic_vector(3 downto 0); + + dl_addr : in std_logic_vector(11 downto 0); + dl_data : in std_logic_vector(7 downto 0); + dl_wr : in std_logic; + cpu_rom_addr : out std_logic_vector(14 downto 0); cpu_rom_do : in std_logic_vector(7 downto 0); snd_rom_addr : out std_logic_vector(13 downto 0); @@ -106,6 +112,7 @@ Sound_Board : entity work.Sound_Board pace_inst : entity work.pace port map( clkrst_i => clkrst_i, + hwsel => hwsel, buttons_i => buttons_i, switches_i => switches_i, inputs_i => inputs_i, @@ -114,6 +121,11 @@ pace_inst : entity work.pace sound_data_o => sound_data, platform_i => platform_i, platform_o => platform_o, + + dl_addr => dl_addr, + dl_data => dl_data, + dl_wr => dl_wr, + cpu_rom_addr => cpu_rom_addr, cpu_rom_do => cpu_rom_do, gfx1_addr => gfx1_addr, diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd index 423c3eee..9ed4a25b 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd @@ -14,6 +14,25 @@ use work.video_controller_pkg.all; -- -- Tile data is 2 BPP. -- +entity tilemapCtl is + generic + ( + DELAY : integer + ); + port + ( + reset : in std_logic; + + -- video control signals + video_ctl : in from_VIDEO_CTL_t; + + -- tilemap controller signals + ctl_i : in to_TILEMAP_CTL_t; + ctl_o : out from_TILEMAP_CTL_t; + + graphics_i : in to_GRAPHICS_t + ); +end entity tilemapCtl; architecture TILEMAP_1 of tilemapCtl is @@ -31,6 +50,8 @@ architecture TILEMAP_1 of tilemapCtl is begin + ctl_o.rgb <= ctl_i.rgb; + -- not used ctl_o.map_a(ctl_o.map_a'left downto 11) <= (others => '0'); ctl_o.attr_a(ctl_o.attr_a'left downto 11) <= (others => '0'); @@ -49,8 +70,6 @@ begin variable tile_d_r : std_logic_vector(23 downto 0); variable attr_d_r : std_logic_vector(7 downto 0); variable pel : std_logic_vector(2 downto 0); - variable pal_i : std_logic_vector(7 downto 0); - variable pal_rgb : pal_rgb_t; begin @@ -83,11 +102,7 @@ begin -- extract R,G,B from colour palette pel := tile_d_r(tile_d_r'left-16) & tile_d_r(tile_d_r'left-8) & tile_d_r(tile_d_r'left); - pal_i := attr_d_r(4 downto 0) & pel; - pal_rgb := tile_pal(to_integer(unsigned(pal_i))); - ctl_o.rgb.r <= pal_rgb(0) & "00"; - ctl_o.rgb.g <= pal_rgb(1) & "00"; - ctl_o.rgb.b <= pal_rgb(2) & "00"; + ctl_o.pal_a <= attr_d_r(4 downto 0) & pel; ctl_o.set <= '0'; -- default -- if pel /= "000" then -- pal_rgb(0)(7 downto 5) /= "000" or diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl_e.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl_e.vhd deleted file mode 100644 index 983e369d..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl_e.vhd +++ /dev/null @@ -1,29 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - -library work; -use work.pace_pkg.all; ---use work.project_pkg.all; -use work.platform_pkg.all; -use work.video_controller_pkg.all; - -entity tilemapCtl is - generic - ( - DELAY : integer - ); - port - ( - reset : in std_logic; - - -- video control signals - video_ctl : in from_VIDEO_CTL_t; - - -- tilemap controller signals - ctl_i : in to_TILEMAP_CTL_t; - ctl_o : out from_TILEMAP_CTL_t; - - graphics_i : in to_GRAPHICS_t - ); -end entity tilemapCtl; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd index 718352ef..f712941c 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd @@ -113,6 +113,7 @@ package video_controller_pkg is map_d : TILEMAP_D_t; tile_d : TILE_D_t; attr_d : ATTR_D_t; + rgb : RGB_t; end record; type to_TILEMAP_CTL_a is array (natural range <>) of to_TILEMAP_CTL_t; @@ -125,6 +126,7 @@ package video_controller_pkg is attr_a : ATTR_A_t; rgb : RGB_t; set : std_logic; + pal_a : std_logic_vector(7 downto 0); end record; type from_TILEMAP_CTL_a is array (natural range <>) of from_TILEMAP_CTL_t; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg_body.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg_body.vhd index 996e5867..f2d9710d 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg_body.vhd +++ b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg_body.vhd @@ -15,7 +15,7 @@ package body video_controller_pkg is function NULL_TO_TILEMAP_CTL return to_TILEMAP_CTL_t is begin - return ((others => '0'), (others => '0'), (others => '0')); + return ((others => '0'), (others => '0'), (others => '0'), (others => (others => '0'))); end NULL_TO_TILEMAP_CTL; function NULL_TO_GRAPHICS return to_GRAPHICS_t is From 5e0b0ff5ddb59658e42e2fb2b9ba573bd02c6131 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 3 Mar 2020 20:13:01 +0100 Subject: [PATCH 07/35] LodeRunner: delete unused files --- .../LodeRunner_MiST/rtl/roms/Roms.txt | 37 - .../LodeRunner_MiST/rtl/roms/battroad.zip | Bin 68780 -> 0 bytes .../LodeRunner_MiST/rtl/roms/kungfum.zip | Bin 92575 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun.zip | Bin 47197 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-a-3f | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-a-3h | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-a-4a | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-a-4b | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-a-4d | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-a-4e | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-b-1l | Bin 256 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-b-1m | Bin 256 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-b-1n | Bin 256 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-b-3n | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-b-4c | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-b-4k | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-b-5p | Bin 32 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-b-6f | 1 - .../LodeRunner_MiST/rtl/roms/ldrun/lr-e-2d | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-e-2f | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-e-2j | Bin 8192 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-e-3l | Bin 256 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-e-3m | Bin 256 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/lr-e-3n | Bin 256 -> 0 bytes .../rtl/roms/ldrun/make_proms.bat | 11 - .../rtl/roms/ldrun/make_vhdl_prom.exe | Bin 119861 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/prog.bin | Bin 32768 -> 0 bytes .../LodeRunner_MiST/rtl/roms/ldrun/prog.vhd | 2070 ----------------- .../rtl/roms/ldrun/rom_sprite_high.vhd | 24 - .../rtl/roms/ldrun/rom_sprite_high_new.vhd | 24 - .../LodeRunner_MiST/rtl/roms/ldrun/snd.bin | Bin 16384 -> 0 bytes .../rtl/roms/ldrun/snd_prg.vhd | 1046 --------- .../LodeRunner_MiST/rtl/roms/lotlot.zip | Bin 38811 -> 0 bytes .../LodeRunner_MiST/rtl/roms/lr-b-3n.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/lr-b-4c.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/lr-b-4k.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/lr-e-2d.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/lr-e-2f.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/lr-e-2j.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/nu/lr-a-4a.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/nu/lr-a-4b.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/nu/lr-a-4d.hex | 513 ---- .../LodeRunner_MiST/rtl/roms/nu/lr-a-4e.hex | 513 ---- 43 files changed, 8343 deletions(-) delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/Roms.txt delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/battroad.zip delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/kungfum.zip delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun.zip delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-3f delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-3h delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-4a delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-4b delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-4d delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-4e delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-1l delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-1m delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-1n delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-3n delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-4c delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-4k delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-5p delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-6f delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-2d delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-2f delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-2j delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-3l delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-3m delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-3n delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/make_proms.bat delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/make_vhdl_prom.exe delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/prog.bin delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/prog.vhd delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/rom_sprite_high.vhd delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/rom_sprite_high_new.vhd delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/snd.bin delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/snd_prg.vhd delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lotlot.zip delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-3n.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-4c.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-4k.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2d.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2f.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2j.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4a.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4b.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4d.hex delete mode 100644 Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4e.hex diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/Roms.txt b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/Roms.txt deleted file mode 100644 index c6db1e07..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/Roms.txt +++ /dev/null @@ -1,37 +0,0 @@ -ROM_START( ldrun ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "lr-a-4e", 0x0000, 0x2000, CRC(5d7e2a4d) SHA1(fe8aeff360f6c3a8606d67a8b95148c3c2ef7267) ) - ROM_LOAD( "lr-a-4d", 0x2000, 0x2000, CRC(96f20473) SHA1(e400c43f3f32e12f68ca204c60bcebdb2b3da55d) ) - ROM_LOAD( "lr-a-4b", 0x4000, 0x2000, CRC(b041c4a9) SHA1(77768b03ea2497e25c3e47b68a0eb2fe3e9aea35) ) - ROM_LOAD( "lr-a-4a", 0x6000, 0x2000, CRC(645e42aa) SHA1(c806ffce7ece418bad86854c987f78c70c13e492) ) - - ROM_REGION( 0x10000, "irem_audio:iremsound", 0 ) /* 64k for the audio CPU (6803) */ - ROM_LOAD( "lr-a-3f", 0xc000, 0x2000, CRC(7a96accd) SHA1(e94815dbfaabbb562df8f3298060aa6bd7825904) ) - ROM_LOAD( "lr-a-3h", 0xe000, 0x2000, CRC(3f7f3939) SHA1(7ee25a21e74995bfb36ac11b45d384b33a6d8515) ) - - ROM_REGION( 0x6000, "gfx1", 0 ) - ROM_LOAD( "lr-e-2d", 0x0000, 0x2000, CRC(24f9b58d) SHA1(e33224b910d37aaa85713b954c8dd50996245a8c) ) /* characters */ - ROM_LOAD( "lr-e-2j", 0x2000, 0x2000, CRC(43175e08) SHA1(9dbafb27d46cf7df35f343a8753e8d91ea706993) ) - ROM_LOAD( "lr-e-2f", 0x4000, 0x2000, CRC(e0317124) SHA1(b766bd21e2da1673d2054148f62d61c33c95d38e) ) - - ROM_REGION( 0x6000, "gfx2", 0 ) - ROM_LOAD( "lr-b-4k", 0x0000, 0x2000, CRC(8141403e) SHA1(65fa6bc872fb07c71aacbbcc35cee766b2877896) ) /* sprites */ - ROM_LOAD( "lr-b-3n", 0x2000, 0x2000, CRC(55154154) SHA1(35304676e1ab55adccdabdc766a4e0e0901d3cd0) ) - ROM_LOAD( "lr-b-4c", 0x4000, 0x2000, CRC(924e34d0) SHA1(6a841419797a129235fc7d0405a5be55e8d703da) ) - - ROM_REGION( 0x20, "spr_height_prom", 0 ) - ROM_LOAD( "lr-b-5p", 0x00, 0x20, CRC(e01f69e2) SHA1(0d00ef348025ea4a9c274a7e3dbb006217d8449d) ) /* sprite height, one entry per 32 */ - - ROM_REGION( 0x300, "spr_color_proms", 0 ) - ROM_LOAD( "lr-b-1m", 0x0000, 0x0100, CRC(4bae1c25) SHA1(17a9e2567d9d648dca69510bb201f8af0738b068) ) /* sprite palette red component */ - ROM_LOAD( "lr-b-1n", 0x0100, 0x0100, CRC(9cd3db94) SHA1(bff95965f946df0e4af1f99db5b2468bf1d4403f) ) /* sprite palette green component */ - ROM_LOAD( "lr-b-1l", 0x0200, 0x0100, CRC(08d8cf9a) SHA1(a46213e0dc04e44b0544401eb341fd49eef331dd) ) /* sprite palette blue component */ - - ROM_REGION( 0x300, "chr_color_proms", 0 ) - ROM_LOAD( "lr-e-3m", 0x0000, 0x0100, CRC(53040416) SHA1(2c6915164d1c31afc60a21b557abdf023d5b3f46) ) /* character palette red component */ - ROM_LOAD( "lr-e-3l", 0x0100, 0x0100, CRC(67786037) SHA1(cd40dfd94295afe57139733752643cf48b8566b1) ) /* character palette green component */ - ROM_LOAD( "lr-e-3n", 0x0200, 0x0100, CRC(5b716837) SHA1(e3ea250891fec43a97e92ac1c3a4fbb5ee2d4a4d) ) /* character palette blue component */ - - ROM_REGION( 0x100, "timing", 0 ) - ROM_LOAD( "lr-b-6f", 0x000, 0x100, CRC(34d88d3c) SHA1(727f4c5cfff33538886fa0a29fd119aa085d7008) ) /* video timing - common to the other games */ -ROM_END \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/battroad.zip b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/battroad.zip deleted file mode 100644 index 297a78eacdb438df6fb45d2fedc191a6803aca5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68780 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 diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/kungfum.zip b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/kungfum.zip deleted file mode 100644 index 278f6ac12787cd03fe955bd37860151a7e4d0cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92575 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 diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun.zip b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun.zip deleted file mode 100644 index 3c8e675c6487de0467628f88a5f5abc02bf32ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47197 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 BUatTE diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-3f b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-3f deleted file mode 100644 index 8f5b8c12399699267a12e832990e9d941f833dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 i@GtIP_Yt^{z~me$=pa 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 W$J_A{_Xty_#WS2J>T=|IH}OA+!~A*x diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-4e b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-a-4e deleted file mode 100644 index 735ef31f3f86ff1c1de4dc63f9642732f1f23af5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmds6e{dVsoqwy}lJ(P(?6vd5yKw?*Cvg;=B+O2tixVq~!PpQS4Aau|egV^iBtSR? z2n#ozHgJ@dJ7zj_odJ5Z$F3Gz*7p$mTLeeGm z@D^N|7YzAdjLM|^0)8gGew+Maqayj$EB8=1j&KQ570KD@{WZ1WR!Nge7N}%d%{1h< z^vuJCDc-0jc%msjbKEBgn&LOV>QB3-`z=qp*;FDGDQqeME0}gg&zomzW}Eo1krR%h z2@YaYaPtT5j3%zvO>zHObS;d}g&(!aixRkctrQPBN4XwA|+V+n47O6~cnf}ySqs_d>W$tpnUf&>Hv&g(VY~C3# zxSdyFX;ATz>HgvRy%Og=6EyD$nY)_UMiDMvV)OO8B#2?yM;MHGi{ISt17OtL72`dW zVTt$8n{6Cq7Zl&rvpB~1u@^Zefk_z2S-I8NyLYeHYz|W^nN&=K+x^p&~wI_=p0D=7gBB8_2e`5b^tG+w$a0r)Ren=sjB#|ISc4U+OF= zjraEpO=IN(m-(Tgx-+#X5ub0!j~e3w7oPsq8AE)`P@cHFyh8cfAjQfE=Gxtd!s>EaF2}9Ph=vtFT1futquIy}VqLKhY~y@g+m{z=mA;^NRIQuPe_h zqQ`)$M-+>bd#6KRNwpoW3~a%uliTXi0qL zWa1;Ax+-1h0Jf-0eQh;AD4*9WhyKzlE_YU6c9QF**#6n+KkM|DJJ>FpV)MZE?8(G` z&SB$#4a@~?nMVxu5ubRwL0Q~8svgXU-+0|7<(sc_S&F>#nB8A?%3`Gi1NpLJ zi5(Pq_oK$rml}ohnF9^5$ZM#&xBI2W(no1S{IW5WRjfY)+XwDd-(6EVL~g#f;Xjg< zCZ;cwzd{KqB;lBVV^8D#15!r(lA)Z4Q%O@1b8(`crZh7@^oIBqLw*Dj@fH%4*B&+P z5c-1lo4A~3!(G7=e%U4pYWV%^g;hbyb>zoVc;)7!M>xsXnbjt?}iwL!v@5T(- zP#hc{6*l(`ZW2ZYt|hUwz{DxTs<&2SnL;uhK1r#@tT3+ z^*w~nUDMZJ6b43w(Sec8!&^r%IkKhi+G_`fN)w!w_JUW)SRtGNFo7m+b=|0JI zQvrS3>F;y;T@I%1DK-!Cp?PtpMUXEOU9auU^*CeX6)WTG0NQcU60Op3?E zM-UVbvDFs>P}7G>SE?{4CgZ*>MPbA6)}el3WLW4QDE5%k?$xD+JM&-0?v9Rz8;(_c zKM+(hKQ(GD&h5c$2cD8RW`I|tLSpyYhP&L!U@g~AepRkvAXeWdacj$+<(l|!MgovT zy)h{MyRqQ3tK<+Q>#q;&aF>ByX7Hw6;`ZRkq^r+ zG%7-%&}`>5?eK=pRv;Y~pEt7ORqB&@*NFfhQ5yTI;)_OBX~e2)#TSe(UY>Rp{;^yG zsXMCmTPIJGdZ~I2@^$n}j5`_B&lf-*OHU@cLR6>PPbD_fMuL#2NB*)Qe)g2QISoH? znyWu3MG-p#Ed*Y;m&@_477n93q+orcbrV1Gx~?w{7B`Lv z8@7&&3=dIGZ`|BBR4NKvDCdc*f1os2+%&RkRsZnlkN`21whWXuqrdf9K^QFFP#jzZ zdvdbCKc1Iu#cK1Xkx#-XJyg}Z`}GHIU%68K@t-TO04v(-?&RG_otAFZX-XyrsL;8b z=%a5wCx;Aeyh(_OO@`dBk4wICA*|k=mWTApZ@&{ev@tFY>HtjSs`-F;l@7svVkIZ@ z$(lT(Bd?427O79iVPhk@dPOrG=$kipJH)dX79D z9?R@CFiY|A!UA}ly@tF2XvRCfMcrDQjGvf`4Tz5+sI2F`lujiCpX$1KVu4LLf7! z*BDKbKTirRAZjeLMMtV%fAG+TSbfK#*Qky9)WPT!AE=K?9<>skqSK{ApNZ6m4~dak z3hbjd6`F0&JfPPcE((zpor_no-Bo(cW~Hy-ryT}eqfDN~!zhlX7UBVdfO=<-5VrZb zUSDTDcoglcsT9>8MH26x=ht1j7)Okz7T}p#9i3TiJ(PA;u-WYLB2p#`iZMDMMfg@e$apT{z)%#2Z+i`>*es(daN=j@t@sgtOoWPC?nC}q zuCNGlQJ=#R8Dp7tJ8B&TCYy(hqYkc()L`0ERKo30U4dto&`dE_gr;mkn88PN+g9uZ z<8{+4qvzFcUjU3|rb$VO8T5>cj#BNIM03Yscczsp&ALpBK`r(ZsLF#q)#>XO7%A|D z&`u$ay_1XZFy)k5SK?v%C;1ghCe6M8f_!gC7uR!369&_+jNg!Bh7~<_Q@neV{=nhD zjy)%Q>d#lb@elEdo8lJ{W3?W=keapsD>c+89cotLnU5N7mKv(7pvWO79h;%%uuomn z(|e`pr@n()E(gnnJg9R6;mKp}gcvvSzd)y>Bkjt6(48<6Rk)ReA;yes4Ovp$7{fL| zU4#DSsGd;eg+gDXwH3jS{Ri|bYT~zsf;TK7_3rw@nJ)xN<$0-Z0w!Rr=6#Meyga!R z0>oZnV_l}nP&M3w78uBQ$5%5ta8L6k={Y*_#6PU%zuwu2OI~?fCoY2J(e679+)1lT z@1(ME8RA>ILa+X~KAORG!pB*&Ow6*&yqm-2Hf7%BHt+J@4>QBv`9AjYnfV}xTjzde zvjQ)#hZ6VFIzjR%Q)t#+LN&{F{;-Qrtj`L9`uWw<+pIt7^%MfQibe1a;wlzG*eSTc z?wYl;Dt@Bp)K9ODl4QH(5nNG^7%}7kGG!x2M^}LOaQ&ahF)SrUlI-g{l^pTe}@uUuR%!#LQ~ro(2`9X zuKhXTgPM4UkteK{(T3s%Vsdjop~cF!w7&F}IdQIVN0@GFmRo zAl~Ri{lbq5korLn9oTFuopQ*m+i5a+TLNIrnFR~z*=qGn_k36sD4p6t=z)f z=>^szy};r;E|%W|xa)9AE4$JWE$em?2XvkK4sr*r>_zUNm3cIt(bYAo?KQqbz5^m^qk>`yk=vMsa;v%3;DW1CO@ZDj zrD9Ucw-Cq?Qir?K$lJmQL$+*Rpi^R%BVTA;cccs7n_Jc$`P!V$ zunQ!TFOG@p zIZP5-#=V83u3Ia6n0=vuO(n(lYpUQpl2<+0!@Jc3kd@;U*lhv@-xM+=ElWkP%oah) z?ep+B1{F@zMZ!rDADQTBrT%cW6A3LY=9$(S?4Dk?jz5( ztvm8|+dAnc=DlNc1mmuB#iUk`Z5QCJnHoQ{YD(J_tM8`ueAfwq`m^6-5B7rk&L14_ zsnjmQ@zjMl4m&uq^V!sVIA+ykmJV__PE`uwhnq**wqAjb19NoDs_`6-6Aq5t|A^xt z#bJjqpB=)W2hI5JfR>wYZf~PEMHm}c3xU2oNt=Xl9KM8HDA$({MHaHSFelf_k;p>v zBiuzs8*ahRM9L+#yJEJyr8E^dJT(=yd%8ch%|2?Ib`Q~Z%||oM2SLv2OL9Wnb77fF z+ch7{alDWnMbG0BMI%W7$7}f4@@~9KdmjQB+80AC31#!}y0Au;qeYK0KgQZAv>jt& z`PxpvMUW`mX8$>$l_SW@z^4c`keKBHc*yefx~;&}+(IY1Rkd6M%VQS7UV;zlR*3gt zPZspFYy@aP0&=h@&A|ePqiGLxfm;8LOKpGRN*ah6aLNWwQD8Uq>;QJ#j=~AV0REj^ z>Hp&Z&HvtJ`JXAiqiagMA}!Lkd$e1;OMi~8Kl6dEnu|+p!maI$*(u`NND+_EEw!a) zSBx4FDZ+`NL0y&h?Ru!O zm=;XgKN!w`4hW;{F9(!H3zs38LH+efqt-V#I8*r+XtDJAVjt?^Jp{KybKHCA;1Y9_ z$5i}cNgwa^3L}N{HC#Ae7Tg6=^XxWRsz{@P^cKq{q@N)dV;AXDCJX7u=x{)~gQXe) z>91IDmcENLORBJ$=lSa#gj~)0ha+6%AWY7KklElTI2XEw^vDOYCE`+S|k_-A#;cFH|B|qdy9N zuqMAtOH}=9|F5{-)w4AbKMMbH4OFY$0+>IU`Gsx{dDL~H_?|v~v VpR{#5UZ=UH8lFY<>-B#9e*-=327v$o diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-1m b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-1m deleted file mode 100644 index 413cad4dfe09660d3ab17a1b5909008d50386b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmchQQ4WA03`5_S;*|CNw}l2xkOPo?ymnbv#4^X?2_#W{H_=*=Z~9Ld-Xyzz#2J;i RZc_f&cf~zlZtC3I-v9@e2oV4P diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-1n b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-1n deleted file mode 100644 index 23910f5ada4e8f5614d155d52c90927089733079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmc)DQ3}8?2m{bSMcTBO``>n%bZ6K{ct$@2BoM-DC%>74z00fE9anMc6i^Dm!j`21 XukJ1PIwiy;(izI2d_Oz1?7#mX-(?5I diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-3n b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-3n deleted file mode 100644 index 7fecdcdb6c2678eca76b201d10ad3b904a0c5399..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeHMO^h5z6|R|{>E77m>D@R)V|hG1U=$$^Ft!Pq#Le~)q(nlIh;rdZI&2i@0+~$& zJ0Y9tHi;5sS&7BTks{(_jvNqz3){xXwn*eXAdm%Cww;ZLgpl1EN8VmO40&_XmxZ}DpjRg0WzBI{C2u+2Z8T*iJzygD0*|Z zp7lf#F`xa$wDX)+RWz-ss{-Zuk4LetNibsol{%M!rs>DGqV*+RujqQGZ?+f;<9gj7 zG~4}*QnobRXv;ROJ^$uS!?<`QncF}8^}QSuN9G8V9|U2))#oAwi{XST|5y_MD%U06 zz@5{bwd+o&-S4*8fx>mu|I#dPyXGdmy(;tRsilhwE zbLyiVeqieL-IM(Xl%`SV^zGl6t@(KM70iDW*t{?IElq%U2EhzS&pB4p4XQ$agcgkz1#jD^sfw02m+sK_Az>5W zUaQj|4YO{~rR{#fA~Nh&t%jy(`F`K?e66&2?^Q2PatG~dm1;0kVb_M{`Q+|^n-I>Q zkuv@*)}K*q(V}NJn}TO|yTenP$Z&r0_EY^Zh~ghK9$kF%7|}GP*Qa~_v!0LrBmPJ4 z7Y+}Thd(Dxv~vJ7pHTCGa^flCMidobvVfjS4tBW7d20angGcC3ziZZ(cLzi~j< z>eY-tilPwOcL#!BR1>vY!!VqMM8E^r^=vP=96A_ZH!us!Y&BHfg5~`>2*P;f>JLrO zx`KY&s-o$bn$c_!a&~#eRQ<&DP@ww&1v`*q{eSbbX&~Vx zWiG=&xE}6Wv!jK5-V7uCK0d#3ivpej@4Qc!E6B6xHhTF&Do22LJD2pM6LEXtjw)ADf(YKFsDLk~XjCDu&ob;?S+q&ze&;`_^3 zr{y>lBg)d^;>R}ve^G#(9sm|eFaU!Mz!lh*ph<{gp&74HwIz{H2-C=Pbc2n@kVyp9 zQ5l3V-Ln>PF$?B4l-E6viKY^gV)&A*flp}n2GfGRLTQ=aC^cggpCqCU+z4=YSeQd9 zOrk-E!x~f(xe{Lmp_A`GU_gCWAa*r}LNnFW#_tb(8$K=!pETh8;P({6Vx&>Dv9|Jx zG8;uq2Ss)PEuh|52|*EiDS@TCt{)~O%6c4K(YZUl$}|gQ9l$w5D6`1yHd(oG0gHvd zMIaT&IB%gxoiV)$OJOBf3L*{Kphd14N=gSb^b6-wKs3@ljyKjxye>nyi1j{5k}-{$Hy87f*G|5?Zx3C>=p^F#R%0F}7)PTx zu^>j@->B6lI9nKf8nU$v@?y+!yz#Q8!mo^?cxvhS`qCXcZ z5&V^6$n-*zEFs|3py8Qb%Zx82$vPekH)D7MXBs@NCm4BU!#m-RDsf*!?KquT-?u&Z zjyMcjjgG_c*B^zgC|_uAfiDQ-K>y{R^uC(w_k*FI1ItYW&4nervGo1snKIE%Ff*L& zb-29x*K_YeJ@Sb}w{9nPhGV%QNu|`VgnsEgB9To5qhc>)7wVM1OS+``-|)|_|LduH zAYstu;;5zb7XQw!|G9*>3wTgL0l7%xo6N5m#Z_z4a0P{7>BZRRu=pzQ0Q3POEeSUkEk#upIEsL# z<1Tlc)D5^aOMr{dEs|{ku_$0#PLIC%@bDS+x{?$z7~J)ES}qU^xPsHg-azQ%_fPhf z7muu^n6y?NaMso~R%eHOBmjr=Y5(VL)HK8y@WGlU;TkMy8A{)SP3;zYWRbcr95|_OQoV#NKM)g zY4w88@3G5A(CwKbwMMqSRxb>C-2t&2dY`dFxa(5QBh+=q?~}K~V6A%Ns<2`%qCv9| zqEvCdct%O~K!n1hR#=0gDF?>%AZJ+CD&4ml@L~e+0K1xh0ui48#t*B@D|U%L1?l*n zFVQekSbu7x1QFDFLL*OkEh2%&^B+(ujs-7yr-B)i{PPgoN3eky4;btXig-Rk0Nq&- zP<~|WXo8m*)(|P?34)X}Pw@Wx6ie{xx-zvNcA;4hF+2|TNAuCe(~-a<=Ym+K)5cVH z8Bcz#Ny4!5(%*hun?Q~{KfmG~1KYsNSW$Fq`X~%X)9)REJUYZW^yB+167M5?$#JX%d>R-wu`#Q&-_)#rokzE{DNz zRP=I;v-m;Ey?w84eCvp~M&VvY?>R|w>2>Xml(Kk?({9$lQ-*CVA@=Mc`}h#%3$yzb zrhE3Rdz`LH7Hpg=+i88f{M_yGe{KAl@!;MmMLGYWZIh?Xen;2ezW58zn|V}K$$f~o zs04%`_7M2TMueO@PRLs(vUAUTnazT_YS@$71pVPoIx*2mvq1uU-3uPN6(Dh0UjlZQ~8W7pYdw`-rN- zVem!T14_f@@RyaD8I_O8bRg#d0li*7?}#`()tSn-C)F7hhXEQ59He|{v>|}%PK>o3 zujE0dbwcVAM~@bjes}^-oPJco9`M9HiZu9m%3{vMDoyIinj3iL`HRj=zuW#6MXw8{2nF{6@3LPj8=x?ibfz zg-lIN;Px5w>o2S)fA>yX&ixM+@ndm40{_R$nBnIuNwNxel_b}f==ZG^`o-Oagcnj6 z3oVVo3;1r}VYJbz&^lq+jU_bRI*pGg7H%k=)1wC|FIq${DY2-vBI&`iJsTnW4F-GY zCGXH%lAlAm60m-nH{`@QSXdw=`-Kh(%%0eF_m>{d?Cs7H>_}LRDp5F<7=)1IRFFzG58dd!0RjsD+Lm5q)QzRj z@5P^{>8Lylf^f3!dA8BeO;d*fbrw{-bnfUF*Y!I==r#<)(B`LMn%Hoq93 zwoHa8x*<4SO9LqKz88$`md+%J=}7_wQMj~hy7VbGlxHkpj9Z{6^RtFkw|b!q3!=ae zmlngwwR(lT#BR|Pqn7uB;4g!8u>7g6>g@-d?nYUu$oOM%I(Qa5hh`4Tm8oNL&d!|h z=eBJdc8-vLpAM2MA4i5(V$9jQ{JzpQb!Zu3PVKu}KZ0*7HozsUk)`?=QaTF(Jcey`Rd&Dszt14RYWy2AQ z);g%L8|`k~gTDj(07~3$-7@6h-RBpcuGebtV6NeNFI#%OO4k(&_r~3 ziWaPG7>d@g?cvP&pf*{6*G&OD^hN6pL#_SvRkKzuR}mKdcay|z{V9FPahl_wF|H7t zUxIw8TviR^_KjP;$K{=!jX`r_!c3BLhyI*6^!~H)(@D#!bti=?gbsvu zJhjP$qBw)+g%n;3FFJmlInfRzq zjmpyU)p<=V6OY;J<>$wfre$`W%l$VpS;oEv=_}Xb`Ka3@oZfD8-4`_l0kPgI__9WG z^Y-oAwr$y1;C0%lp0R?CX8@Xwza$mto2{|ugZ_DBUmMx;n3g<*CTZ2s0&bW~Qct9mS`bfDlDvg)Y>g2P_ zze1A=ztWID^}7~8jQeh4{4921%#2?Gj$Y-I&bpG3Zn*qIIjnsdO)RXkjL2J0_e3Qys1 zf_2m#1>Ya-Wo_JVMz9?R+cyZC843e>$SjdO-~vTAD8<%}U0zyRT3%k}FC0|iK{4(Im_ zW%x-sdofIoC5ii~zdDK~xl|Cmw6~CA{b|KH!mT&FpurhA4d}X1&9_?X~+Nd zOmOD!SXZ2XU0j#0#)(chu9I&OQ!7r+*F-r4J*3vSIf)m#^Rz>sNu{)Ztbfd!8RTBW>?bgZO7`YMm9*@#HE6{U(Aky=)nxJ~;3+!b-_u6r7)kpIB{n_esA zcNK0Wbhy2te3jqvbPr+w+aB|_J%sDDB!{>le0F7d+tU1nrCpUUEa=vc(~DhP{fNE< z`X1alE25@A6M)&THOg!^#zAItCjB&Ib*swGq3^?6$YJVMoo&g!WsMhU;ApzYD$3al z(^7C3A>tL-XlSYrRn*7J_wj7GEv_#c9`~IxX~>6%JvACX8@__+tFQoaLvVQ0u&}%XYk{MTo0I3Mt+Bg~+7=feoZJv%gQ$PGwFwJ zt75#Bm3_{Ca-w~QtlTYPuo%|QN*ByoKDepxw) z^(Wx|!sb>fSn#&6XOY~}KVu!(j?N{&TUx%d@SJ|S=Qg<@J+OSijHIc{y}|2P6CGg5oL7B>4~4y(L&0EC(((b z8Hn$gB%*^7Ff1OHCX;WVMDqCbw5;_}Rzk^{7kFR4@L6we+@87S|G`PG%f^jk*X*v!=39AB&3h?vRuFD<_K!HUw&h!UvyX(Z=w>Xw_&4}0e5FgGTi-tg7(qZbd`DI9Xy1L7_h}At8=#hP!}$*hb)22l?ab9-fC(IF zp)W}Eq`lb`bH`=hJ2yq92nNXR+OoGWg^*!D$Cj8&+P>mvErp8U8f|Ra``|(V5c?mO zL#zN5^r)U!dT$Qt+Qm#g7y^addn-sK(@TR{kFU zHHNX{96Ks+uNprH^W!f+Du&13iW@sE=Z5rdvpZ(M7wU)*H364}cx$Kvm{BNkI^5I$ z{J}fQ_rGfIJ+f}Y*B-uF41e?qf}=%${db@E&9x2di~ef*frnpQx9+jc*QIZM_~2(p nj_kcIeeaPYFW!j0`7wg)>n{{%jZ&oqSnbk7E_FSQj;irbW_j|p diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-4k b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-b-4k deleted file mode 100644 index dc4d1e4ed847f5bba46ad728bd756e7b9c0f4d75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-2f b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-2f deleted file mode 100644 index e1a71a237a21fdf7d55471b88b492e5b9ec13352..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 I_{E)n0^9rYdH?_b diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-2j b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-2j deleted file mode 100644 index 1db58d196ab3fd479f347ef6a5bf19048c332025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-3l b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-3l deleted file mode 100644 index 00fe489fdf8f3de35c017a53cec6efc968f2d559..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmZ8bTMol84B}%Ve$My5?MS+HQXR!$96^9b&3AqvIh{c*N1GY`_V@ES#r84pziEl? zi#q*c;`g)_z?{kIL77#h6i-EtDQiNwqG6o{53cIwMnk_WK#LIeMkqV$eN5Fz^wt^+ Np;_M!9a;KX50WHwWxHIGUF{%9WlxD~2=0dvbPe^VIFk#&!k{ysT~ zp0ls>R_nO@~ diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-3n b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/lr-e-3n deleted file mode 100644 index 3abc5d5eb82998a0df6e1060215978584613ab2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 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 diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/prog.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/prog.vhd deleted file mode 100644 index fb5ff9f0..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/prog.vhd +++ /dev/null @@ -1,2070 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all,ieee.numeric_std.all; - -entity prog is -port ( - clk : in std_logic; - addr : in std_logic_vector(14 downto 0); - data : out std_logic_vector(7 downto 0) -); -end entity; - -architecture prom of prog is - type rom is array(0 to 32767) of std_logic_vector(7 downto 0); - signal rom_data: rom := ( - X"F3",X"31",X"00",X"E8",X"01",X"00",X"00",X"FD",X"21",X"00",X"00",X"10",X"FA",X"0D",X"20",X"F7", - X"ED",X"56",X"21",X"B3",X"E6",X"36",X"01",X"DB",X"04",X"CB",X"7F",X"CA",X"41",X"6F",X"35",X"CD", - X"7A",X"00",X"00",X"00",X"00",X"FB",X"C3",X"CF",X"25",X"CD",X"00",X"1D",X"CD",X"4C",X"04",X"CD", - X"2C",X"07",X"18",X"F5",X"C7",X"C7",X"C7",X"C7",X"08",X"D9",X"DD",X"E5",X"FD",X"E5",X"CD",X"28", - X"01",X"CD",X"A2",X"00",X"CD",X"68",X"31",X"3A",X"6A",X"E5",X"B7",X"C4",X"4B",X"2A",X"3A",X"9D", - X"E5",X"FE",X"02",X"CC",X"41",X"01",X"CD",X"90",X"01",X"FD",X"E1",X"DD",X"E1",X"D9",X"08",X"FB", - X"C9",X"C7",X"C7",X"C7",X"C7",X"C7",X"FB",X"ED",X"45",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"93",X"24",X"6C",X"DB",X"7A",X"FB",X"85",X"91",X"A3",X"80",X"AF",X"32",X"9D",X"E5",X"D3",X"01", - X"21",X"00",X"D0",X"36",X"00",X"54",X"5D",X"13",X"01",X"F0",X"17",X"ED",X"B0",X"CD",X"28",X"01", - X"CD",X"F4",X"08",X"CD",X"D6",X"08",X"CD",X"A6",X"6D",X"3E",X"00",X"D3",X"00",X"F6",X"80",X"D3", - X"00",X"C9",X"21",X"B5",X"E5",X"35",X"23",X"35",X"21",X"B5",X"E6",X"35",X"3A",X"B9",X"E5",X"B7", - X"20",X"04",X"DB",X"01",X"18",X"02",X"DB",X"02",X"2F",X"32",X"4D",X"E4",X"21",X"CF",X"E5",X"07", - X"CB",X"16",X"07",X"07",X"CB",X"16",X"3A",X"4D",X"E4",X"21",X"D0",X"E5",X"0F",X"CB",X"16",X"0F", - X"CB",X"16",X"DB",X"00",X"2F",X"21",X"AA",X"E5",X"1F",X"CB",X"16",X"1F",X"CB",X"16",X"DB",X"04", - X"CB",X"67",X"20",X"29",X"21",X"B4",X"E5",X"7E",X"B7",X"20",X"11",X"3A",X"AA",X"E5",X"E6",X"05", - X"FE",X"05",X"20",X"06",X"36",X"01",X"F1",X"C3",X"59",X"00",X"18",X"11",X"3A",X"AA",X"E5",X"E6", - X"0A",X"FE",X"0A",X"20",X"04",X"36",X"00",X"18",X"04",X"F1",X"C3",X"59",X"00",X"CD",X"23",X"09", - X"3A",X"AF",X"E5",X"B7",X"20",X"05",X"3E",X"02",X"32",X"B2",X"E5",X"3A",X"A7",X"E5",X"B7",X"C8", - X"3A",X"B2",X"E5",X"B7",X"C8",X"C3",X"A0",X"68",X"3A",X"B3",X"E6",X"B7",X"28",X"07",X"CD",X"39", - X"7C",X"F1",X"C3",X"59",X"00",X"01",X"00",X"01",X"11",X"00",X"C0",X"21",X"00",X"E3",X"ED",X"B0", - X"C9",X"CD",X"E6",X"03",X"CD",X"00",X"0B",X"CD",X"00",X"13",X"CD",X"00",X"24",X"C9",X"FD",X"E5", - X"3A",X"E9",X"E4",X"32",X"88",X"E5",X"FD",X"21",X"58",X"E4",X"11",X"18",X"00",X"DD",X"7E",X"06", - X"FD",X"BE",X"06",X"20",X"20",X"DD",X"7E",X"07",X"FD",X"96",X"07",X"30",X"02",X"ED",X"44",X"FE", - X"04",X"30",X"12",X"FD",X"7E",X"0D",X"B7",X"28",X"0C",X"FD",X"7E",X"08",X"FE",X"09",X"30",X"02", - X"0E",X"FF",X"FD",X"E1",X"C9",X"FD",X"19",X"21",X"88",X"E5",X"35",X"20",X"D0",X"FD",X"E1",X"C9", - X"3A",X"9D",X"E5",X"B7",X"C8",X"3A",X"6A",X"E5",X"B7",X"CC",X"03",X"32",X"DD",X"21",X"40",X"E4", - X"FD",X"21",X"B0",X"E3",X"3A",X"6A",X"E5",X"FE",X"02",X"20",X"04",X"FD",X"21",X"F0",X"E3",X"AF", - X"32",X"E8",X"E4",X"DD",X"4E",X"0A",X"3A",X"E8",X"E4",X"B7",X"28",X"17",X"DD",X"7E",X"0D",X"B7", - X"28",X"0E",X"DD",X"34",X"08",X"DD",X"7E",X"08",X"FE",X"18",X"38",X"04",X"DD",X"36",X"08",X"00", - X"CD",X"4E",X"01",X"79",X"FE",X"FF",X"20",X"0B",X"FD",X"36",X"04",X"00",X"FD",X"36",X"0C",X"00", - X"C3",X"11",X"03",X"06",X"00",X"2A",X"F6",X"E4",X"3A",X"E8",X"E4",X"B7",X"20",X"05",X"21",X"00", - X"00",X"18",X"19",X"57",X"3A",X"02",X"E5",X"B7",X"28",X"12",X"3A",X"E9",X"E4",X"BA",X"20",X"0C", - X"11",X"30",X"00",X"19",X"3A",X"CD",X"E5",X"FE",X"08",X"20",X"01",X"EB",X"09",X"22",X"F9",X"E4", - X"01",X"60",X"45",X"09",X"46",X"DD",X"6E",X"00",X"DD",X"7E",X"01",X"C6",X"04",X"67",X"29",X"29", - X"29",X"0E",X"00",X"CB",X"28",X"CB",X"19",X"DD",X"7E",X"0B",X"B7",X"20",X"04",X"ED",X"42",X"18", - X"01",X"09",X"29",X"FD",X"74",X"06",X"3E",X"00",X"17",X"FD",X"77",X"07",X"3A",X"F8",X"E4",X"4F", - X"DD",X"CB",X"17",X"66",X"28",X"01",X"0C",X"3A",X"E8",X"E4",X"B7",X"20",X"04",X"0E",X"03",X"18", - X"11",X"47",X"3A",X"02",X"E5",X"B7",X"28",X"0A",X"3A",X"E9",X"E4",X"B8",X"20",X"04",X"3A",X"6E", - X"E5",X"4F",X"CB",X"E1",X"FD",X"71",X"00",X"11",X"B0",X"43",X"2A",X"F9",X"E4",X"19",X"56",X"DD", - X"7E",X"0B",X"B7",X"20",X"04",X"3E",X"40",X"AA",X"57",X"7A",X"E6",X"C0",X"FD",X"77",X"05",X"2A", - X"F9",X"E4",X"7A",X"11",X"00",X"42",X"19",X"57",X"5E",X"D5",X"FD",X"73",X"04",X"11",X"C0",X"48", - X"2A",X"F9",X"E4",X"19",X"AF",X"57",X"5E",X"CB",X"7B",X"28",X"01",X"15",X"DD",X"6E",X"02",X"DD", - X"66",X"03",X"29",X"29",X"29",X"17",X"6C",X"67",X"19",X"EB",X"21",X"E9",X"00",X"B7",X"ED",X"52", - X"ED",X"5B",X"E3",X"E5",X"19",X"FD",X"75",X"02",X"FD",X"74",X"03",X"D1",X"CB",X"42",X"28",X"4D", - X"1C",X"FD",X"73",X"0C",X"FD",X"71",X"08",X"E5",X"01",X"70",X"4A",X"2A",X"F9",X"E4",X"09",X"7E", - X"06",X"00",X"ED",X"44",X"4F",X"CB",X"79",X"28",X"01",X"05",X"E1",X"09",X"FD",X"75",X"0A",X"FD", - X"74",X"0B",X"7A",X"E6",X"C0",X"FD",X"77",X"0D",X"01",X"10",X"47",X"2A",X"F9",X"E4",X"09",X"7E", - X"CB",X"72",X"28",X"02",X"ED",X"44",X"4F",X"06",X"00",X"CB",X"79",X"28",X"01",X"05",X"FD",X"66", - X"07",X"FD",X"6E",X"06",X"09",X"FD",X"75",X"0E",X"FD",X"74",X"0F",X"18",X"04",X"FD",X"36",X"0C", - X"00",X"11",X"F0",X"FF",X"FD",X"19",X"01",X"18",X"00",X"DD",X"09",X"21",X"E8",X"E4",X"34",X"3A", - X"E9",X"E4",X"BE",X"D2",X"B3",X"01",X"3A",X"6A",X"E5",X"FE",X"02",X"C8",X"FD",X"21",X"00",X"E3", - X"3A",X"17",X"E5",X"87",X"87",X"87",X"21",X"12",X"E5",X"86",X"ED",X"44",X"3C",X"4F",X"06",X"00", - X"2A",X"E3",X"E5",X"09",X"FD",X"75",X"02",X"FD",X"74",X"03",X"FD",X"36",X"00",X"12",X"3A",X"16", - X"E5",X"C6",X"04",X"87",X"87",X"87",X"6F",X"26",X"00",X"29",X"FD",X"75",X"06",X"FD",X"74",X"07", - X"3A",X"10",X"E5",X"FD",X"77",X"04",X"FD",X"21",X"08",X"E3",X"FD",X"36",X"04",X"00",X"FD",X"36", - X"0C",X"00",X"16",X"14",X"1E",X"02",X"DD",X"21",X"18",X"E5",X"DD",X"7E",X"01",X"FE",X"00",X"28", - X"3A",X"DD",X"7E",X"03",X"87",X"87",X"87",X"47",X"3E",X"F1",X"90",X"4F",X"06",X"00",X"2A",X"E3", - X"E5",X"09",X"FD",X"75",X"02",X"FD",X"74",X"03",X"DD",X"7E",X"02",X"C6",X"04",X"87",X"87",X"87", - X"6F",X"26",X"00",X"29",X"FD",X"75",X"06",X"FD",X"74",X"07",X"FD",X"36",X"00",X"12",X"DD",X"7E", - X"01",X"FD",X"77",X"04",X"01",X"08",X"00",X"FD",X"09",X"1D",X"C8",X"01",X"04",X"00",X"DD",X"09", - X"15",X"20",X"B7",X"21",X"9E",X"E5",X"06",X"00",X"7E",X"B7",X"28",X"12",X"35",X"20",X"0F",X"E5", - X"78",X"87",X"87",X"87",X"5F",X"16",X"00",X"21",X"C4",X"E3",X"19",X"36",X"00",X"E1",X"23",X"04", - X"78",X"FE",X"08",X"38",X"E3",X"C9",X"21",X"8A",X"E5",X"7E",X"23",X"B6",X"23",X"47",X"7E",X"E6", - X"F0",X"B0",X"20",X"0B",X"AF",X"77",X"3E",X"01",X"32",X"CE",X"E5",X"CD",X"03",X"32",X"C9",X"0E", - X"00",X"21",X"B1",X"E6",X"3A",X"8B",X"E5",X"BE",X"20",X"01",X"0C",X"ED",X"5B",X"E1",X"E5",X"21", - X"8D",X"E5",X"7E",X"93",X"27",X"77",X"2B",X"7E",X"9A",X"27",X"77",X"06",X"02",X"2B",X"7E",X"DE", - X"00",X"27",X"77",X"10",X"F8",X"CB",X"41",X"C8",X"3A",X"8B",X"E5",X"21",X"B1",X"E6",X"BE",X"C8", - X"7E",X"FE",X"15",X"20",X"04",X"3E",X"1C",X"18",X"0A",X"FE",X"10",X"20",X"04",X"3E",X"1D",X"18", - X"02",X"3E",X"1E",X"CD",X"42",X"31",X"7E",X"D6",X"05",X"27",X"77",X"C9",X"3A",X"FC",X"E4",X"B7", - X"C0",X"21",X"B6",X"E5",X"3A",X"04",X"E5",X"B7",X"20",X"02",X"36",X"FF",X"7E",X"FE",X"80",X"38", - X"02",X"36",X"18",X"7E",X"21",X"04",X"E5",X"FE",X"09",X"30",X"0D",X"7E",X"FE",X"01",X"28",X"06", - X"3E",X"01",X"77",X"CD",X"89",X"63",X"18",X"0B",X"7E",X"FE",X"02",X"28",X"06",X"3E",X"02",X"77", - X"CD",X"89",X"63",X"3A",X"41",X"E4",X"21",X"7B",X"E5",X"BE",X"20",X"0C",X"3A",X"43",X"E4",X"23", - X"BE",X"20",X"05",X"3E",X"01",X"32",X"AF",X"E6",X"3A",X"AF",X"E6",X"B7",X"C8",X"3A",X"46",X"E4", - X"FE",X"08",X"C0",X"AF",X"CD",X"89",X"63",X"F1",X"3E",X"00",X"32",X"9D",X"E5",X"3E",X"00",X"CD", - X"42",X"31",X"3E",X"23",X"CD",X"42",X"31",X"3E",X"54",X"CD",X"3E",X"30",X"CD",X"8D",X"32",X"3A", - X"00",X"E5",X"B7",X"20",X"47",X"21",X"21",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11",X"22",X"D7", - X"01",X"3E",X"00",X"ED",X"B0",X"21",X"A1",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11",X"A2",X"D7", - X"01",X"3E",X"00",X"ED",X"B0",X"21",X"21",X"D8",X"36",X"05",X"2B",X"36",X"00",X"11",X"22",X"D8", - X"01",X"3E",X"00",X"ED",X"B0",X"0E",X"47",X"21",X"A2",X"D7",X"11",X"F8",X"06",X"CD",X"2D",X"30", - X"3E",X"1F",X"CD",X"42",X"31",X"0E",X"02",X"CD",X"CF",X"2F",X"18",X"4C",X"3A",X"FF",X"E4",X"B7", - X"C2",X"64",X"05",X"21",X"25",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11",X"26",X"D7",X"01",X"38", - X"00",X"ED",X"B0",X"21",X"A5",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11",X"A6",X"D7",X"01",X"38", - X"00",X"ED",X"B0",X"21",X"25",X"D8",X"36",X"05",X"2B",X"36",X"00",X"11",X"26",X"D8",X"01",X"38", - X"00",X"ED",X"B0",X"0E",X"47",X"21",X"A6",X"D7",X"11",X"DC",X"06",X"CD",X"2D",X"30",X"3E",X"1F", - X"CD",X"42",X"31",X"0E",X"01",X"CD",X"CF",X"2F",X"CD",X"03",X"32",X"3A",X"00",X"E5",X"32",X"89", - X"E5",X"CD",X"89",X"06",X"21",X"6C",X"E5",X"3A",X"8B",X"E5",X"BE",X"38",X"57",X"CD",X"B9",X"32", - X"21",X"A3",X"D1",X"36",X"05",X"2B",X"36",X"00",X"11",X"A4",X"D1",X"01",X"34",X"00",X"ED",X"B0", - X"21",X"23",X"D2",X"36",X"05",X"2B",X"36",X"00",X"11",X"24",X"D2",X"01",X"34",X"00",X"ED",X"B0", - X"21",X"A3",X"D2",X"36",X"05",X"2B",X"36",X"00",X"11",X"A4",X"D2",X"01",X"34",X"00",X"ED",X"B0", - X"0E",X"47",X"21",X"24",X"D2",X"11",X"6F",X"06",X"CD",X"2D",X"30",X"2A",X"8B",X"E5",X"22",X"B6", - X"E6",X"3E",X"FF",X"32",X"B5",X"E6",X"3E",X"01",X"32",X"05",X"E5",X"CD",X"E4",X"05",X"2A",X"B6", - X"E6",X"22",X"8B",X"E5",X"CD",X"E4",X"05",X"21",X"8E",X"E5",X"4E",X"34",X"7E",X"FE",X"61",X"20", - X"02",X"36",X"49",X"79",X"CD",X"EC",X"31",X"B7",X"C2",X"00",X"5D",X"79",X"E6",X"07",X"CA",X"34", - X"28",X"C3",X"ED",X"26",X"3A",X"8F",X"E5",X"32",X"89",X"E5",X"3E",X"14",X"32",X"88",X"E5",X"2A", - X"8B",X"E5",X"7C",X"E6",X"F0",X"B5",X"28",X"32",X"21",X"8C",X"E5",X"7E",X"D6",X"10",X"27",X"77", - X"2B",X"7E",X"DE",X"00",X"27",X"77",X"01",X"10",X"00",X"CD",X"DB",X"2F",X"CD",X"03",X"32",X"21", - X"88",X"E5",X"35",X"20",X"DA",X"21",X"8F",X"E5",X"3A",X"89",X"E5",X"BE",X"20",X"05",X"3E",X"11", - X"CD",X"42",X"31",X"3E",X"04",X"CD",X"30",X"06",X"18",X"C0",X"3E",X"1C",X"CD",X"30",X"06",X"C9", - X"32",X"B5",X"E5",X"3A",X"05",X"E5",X"B7",X"28",X"2A",X"21",X"B5",X"E6",X"7E",X"FE",X"80",X"38", - X"02",X"36",X"28",X"7E",X"FE",X"14",X"30",X"12",X"21",X"2B",X"D1",X"36",X"05",X"2B",X"36",X"00", - X"11",X"2C",X"D1",X"01",X"02",X"00",X"ED",X"B0",X"18",X"09",X"21",X"2A",X"D1",X"11",X"6B",X"06", - X"CD",X"2D",X"30",X"3A",X"B5",X"E5",X"FE",X"00",X"20",X"C9",X"C9",X"06",X"58",X"32",X"00",X"42", - X"45",X"4C",X"4F",X"57",X"20",X"48",X"41",X"4C",X"46",X"20",X"54",X"49",X"4D",X"45",X"20",X"43", - X"4C",X"45",X"41",X"52",X"41",X"4E",X"43",X"45",X"00",X"3E",X"09",X"32",X"88",X"E5",X"21",X"B9", - X"D8",X"36",X"05",X"2B",X"36",X"00",X"11",X"BA",X"D8",X"01",X"0C",X"00",X"ED",X"B0",X"21",X"39", - X"D9",X"36",X"05",X"2B",X"36",X"00",X"11",X"3A",X"D9",X"01",X"0C",X"00",X"ED",X"B0",X"0E",X"47", - X"11",X"26",X"07",X"3A",X"88",X"E5",X"1F",X"30",X"0C",X"11",X"18",X"07",X"3A",X"89",X"E5",X"B7", - X"20",X"03",X"11",X"1F",X"07",X"21",X"BA",X"D8",X"CD",X"2D",X"30",X"3E",X"0E",X"CD",X"3E",X"30", - X"21",X"88",X"E5",X"35",X"20",X"D8",X"3E",X"70",X"CD",X"3E",X"30",X"C9",X"59",X"4F",X"55",X"20", - X"48",X"41",X"56",X"45",X"20",X"4B",X"49",X"4C",X"4C",X"45",X"44",X"20",X"4E",X"4F",X"20",X"45", - X"4E",X"45",X"4D",X"49",X"45",X"53",X"2E",X"00",X"59",X"4F",X"55",X"20",X"4D",X"41",X"44",X"45", - X"20",X"49",X"54",X"20",X"57",X"49",X"54",X"48",X"4F",X"55",X"54",X"20",X"45",X"4E",X"54",X"52", - X"41",X"50",X"50",X"49",X"4E",X"47",X"2E",X"00",X"04",X"31",X"30",X"30",X"30",X"30",X"00",X"04", - X"32",X"30",X"30",X"30",X"30",X"00",X"20",X"20",X"20",X"20",X"20",X"00",X"CD",X"CE",X"07",X"CD", - X"1D",X"08",X"CD",X"AA",X"09",X"3A",X"50",X"E4",X"B7",X"C0",X"3A",X"A7",X"E5",X"B7",X"28",X"0E", - X"3E",X"00",X"32",X"9D",X"E5",X"3E",X"38",X"CD",X"3E",X"30",X"F1",X"C3",X"85",X"68",X"DB",X"04", - X"CB",X"77",X"C8",X"3E",X"0C",X"32",X"4A",X"E4",X"3E",X"01",X"32",X"9D",X"E5",X"3E",X"00",X"CD", - X"42",X"31",X"3E",X"06",X"CD",X"42",X"31",X"3E",X"38",X"CD",X"3E",X"30",X"3E",X"00",X"32",X"9D", - X"E5",X"F1",X"21",X"8F",X"E5",X"35",X"7E",X"FE",X"FF",X"20",X"2A",X"21",X"34",X"D7",X"11",X"A8", - X"07",X"CD",X"2D",X"30",X"21",X"B4",X"D7",X"11",X"B5",X"07",X"CD",X"2D",X"30",X"21",X"34",X"D8", - X"11",X"A8",X"07",X"CD",X"2D",X"30",X"3E",X"21",X"CD",X"42",X"31",X"3E",X"8C",X"CD",X"3E",X"30", - X"3E",X"02",X"32",X"90",X"E5",X"C3",X"E3",X"6A",X"06",X"20",X"20",X"20",X"20",X"20",X"20",X"20", - X"20",X"20",X"20",X"20",X"00",X"06",X"20",X"47",X"41",X"4D",X"45",X"20",X"4F",X"56",X"45",X"52", - X"20",X"00",X"20",X"54",X"49",X"4D",X"45",X"20",X"4F",X"56",X"45",X"52",X"20",X"00",X"3A",X"CE", - X"E5",X"B7",X"C8",X"DB",X"04",X"CB",X"77",X"C8",X"F1",X"AF",X"32",X"CE",X"E5",X"32",X"9D",X"E5", - X"3E",X"00",X"CD",X"42",X"31",X"3E",X"25",X"CD",X"42",X"31",X"21",X"35",X"D7",X"36",X"05",X"2B", - X"36",X"00",X"11",X"36",X"D7",X"01",X"14",X"00",X"ED",X"B0",X"0E",X"47",X"21",X"B4",X"D7",X"11", - X"C2",X"07",X"CD",X"2D",X"30",X"21",X"35",X"D8",X"36",X"05",X"2B",X"36",X"00",X"11",X"36",X"D8", - X"01",X"14",X"00",X"ED",X"B0",X"3E",X"8C",X"CD",X"3E",X"30",X"C3",X"67",X"07",X"2A",X"55",X"E4", - X"01",X"C0",X"FE",X"09",X"D0",X"AF",X"32",X"50",X"E4",X"32",X"9D",X"E5",X"CD",X"8D",X"32",X"21", - X"29",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11",X"2A",X"D7",X"01",X"2A",X"00",X"ED",X"B0",X"21", - X"A9",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11",X"AA",X"D7",X"01",X"2A",X"00",X"ED",X"B0",X"21", - X"29",X"D8",X"36",X"05",X"2B",X"36",X"00",X"11",X"2A",X"D8",X"01",X"2A",X"00",X"ED",X"B0",X"3E", - X"02",X"32",X"89",X"E5",X"3E",X"10",X"CD",X"42",X"31",X"3E",X"04",X"32",X"88",X"E5",X"3A",X"88", - X"E5",X"1F",X"30",X"12",X"21",X"AB",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11",X"AC",X"D7",X"01", - X"28",X"00",X"ED",X"B0",X"18",X"0B",X"0E",X"47",X"21",X"AA",X"D7",X"11",X"C0",X"08",X"CD",X"2D", - X"30",X"3E",X"15",X"CD",X"3E",X"30",X"21",X"88",X"E5",X"35",X"20",X"D2",X"21",X"89",X"E5",X"35", - X"20",X"C2",X"3E",X"10",X"CD",X"42",X"31",X"0E",X"47",X"21",X"AA",X"D7",X"11",X"C0",X"08",X"CD", - X"2D",X"30",X"3E",X"54",X"CD",X"3E",X"30",X"3A",X"8F",X"E5",X"B7",X"C0",X"CD",X"B9",X"32",X"C9", - X"59",X"4F",X"55",X"20",X"41",X"52",X"45",X"20",X"42",X"4F",X"55",X"4E",X"44",X"20",X"54",X"4F", - X"20",X"44",X"49",X"45",X"2E",X"00",X"DB",X"03",X"2F",X"47",X"E6",X"03",X"32",X"DF",X"E5",X"78", - X"1F",X"1F",X"E6",X"03",X"4F",X"06",X"00",X"21",X"F0",X"08",X"09",X"7E",X"32",X"E0",X"E5",X"C9", - X"02",X"01",X"03",X"04",X"DB",X"03",X"2F",X"1F",X"1F",X"1F",X"1F",X"47",X"21",X"AF",X"E5",X"DB", - X"04",X"CB",X"57",X"20",X"11",X"78",X"3C",X"E6",X"03",X"77",X"23",X"78",X"1F",X"1F",X"E6",X"03", - X"FE",X"02",X"DE",X"F5",X"77",X"C9",X"78",X"3C",X"E6",X"0F",X"CB",X"5F",X"28",X"01",X"3C",X"77", - X"23",X"77",X"C9",X"21",X"AD",X"E5",X"11",X"AF",X"E5",X"DB",X"00",X"CD",X"58",X"09",X"21",X"AE", - X"E5",X"13",X"DB",X"02",X"1F",X"F6",X"04",X"CD",X"58",X"09",X"3A",X"B9",X"E5",X"47",X"21",X"AB", - X"E5",X"7E",X"B7",X"28",X"05",X"35",X"3E",X"02",X"B0",X"47",X"23",X"7E",X"B7",X"28",X"05",X"35", - X"3E",X"04",X"B0",X"47",X"78",X"D3",X"01",X"C9",X"1F",X"1F",X"1F",X"CB",X"16",X"1F",X"CB",X"16", - X"7E",X"E6",X"55",X"FE",X"50",X"20",X"2B",X"2B",X"2B",X"36",X"0C",X"3A",X"B2",X"E6",X"B7",X"20", - X"08",X"3E",X"12",X"D3",X"00",X"F6",X"80",X"D3",X"00",X"1A",X"FE",X"01",X"28",X"12",X"FE",X"08", - X"30",X"0C",X"21",X"B1",X"E5",X"34",X"BE",X"C0",X"AF",X"77",X"3E",X"01",X"18",X"02",X"D6",X"08", - X"18",X"0D",X"7E",X"E6",X"AA",X"C0",X"21",X"B3",X"E5",X"34",X"7E",X"E6",X"0F",X"C0",X"3C",X"21", - X"B2",X"E5",X"86",X"27",X"30",X"02",X"3E",X"99",X"77",X"C9",X"DB",X"04",X"CB",X"6F",X"C0",X"CB", - X"67",X"C8",X"DB",X"00",X"CB",X"47",X"C0",X"F1",X"F1",X"AF",X"32",X"9D",X"E5",X"3E",X"00",X"CD", - X"42",X"31",X"21",X"10",X"D0",X"36",X"00",X"54",X"5D",X"13",X"01",X"EF",X"13",X"ED",X"B0",X"21", - X"22",X"D7",X"11",X"29",X"0A",X"CD",X"2D",X"30",X"21",X"1A",X"D9",X"11",X"48",X"0A",X"CD",X"2D", - X"30",X"11",X"00",X"00",X"0E",X"04",X"3A",X"8E",X"E5",X"21",X"60",X"D9",X"CD",X"48",X"30",X"21", - X"8E",X"E5",X"DB",X"01",X"CB",X"7F",X"28",X"0E",X"CB",X"42",X"28",X"08",X"16",X"00",X"7E",X"FE", - X"02",X"38",X"01",X"35",X"18",X"02",X"16",X"01",X"DB",X"01",X"CB",X"6F",X"28",X"09",X"CB",X"43", - X"28",X"03",X"1E",X"00",X"34",X"18",X"02",X"1E",X"01",X"3E",X"01",X"CD",X"3E",X"30",X"DB",X"00", - X"CB",X"4F",X"20",X"C0",X"7E",X"3D",X"C3",X"D4",X"05",X"02",X"53",X"45",X"4C",X"45",X"43",X"54", - X"20",X"42",X"55",X"54",X"54",X"4F",X"4E",X"20",X"54",X"4F",X"20",X"43",X"48",X"41",X"4E",X"47", - X"45",X"20",X"52",X"4F",X"55",X"4E",X"44",X"00",X"02",X"44",X"49",X"47",X"4C",X"45",X"46",X"54", - X"2D",X"2D",X"44",X"4F",X"57",X"4E",X"20",X"20",X"44",X"49",X"47",X"52",X"49",X"47",X"48",X"54", - X"2D",X"2D",X"55",X"50",X"20",X"20",X"4C",X"45",X"56",X"45",X"4C",X"2D",X"30",X"30",X"00",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"3A",X"A7",X"E5",X"B7",X"28",X"0E",X"CD",X"12",X"5C",X"32",X"4D",X"E4",X"FE",X"FF",X"20",X"04", - X"AF",X"32",X"50",X"E4",X"2A",X"44",X"E4",X"7D",X"6C",X"2C",X"2C",X"CD",X"D5",X"62",X"7E",X"2A", - X"55",X"E4",X"FE",X"0E",X"38",X"03",X"23",X"18",X"03",X"21",X"00",X"00",X"22",X"55",X"E4",X"DD", - X"21",X"40",X"E4",X"21",X"08",X"E5",X"7E",X"B7",X"28",X"01",X"35",X"21",X"06",X"E5",X"7E",X"B7", - X"28",X"18",X"35",X"3A",X"0A",X"E5",X"DD",X"BE",X"0B",X"20",X"0F",X"21",X"0B",X"E5",X"3A",X"44", - X"E4",X"BE",X"28",X"06",X"77",X"3E",X"0C",X"CD",X"73",X"30",X"3A",X"4E",X"E4",X"B7",X"FA",X"B4", - X"0F",X"C2",X"43",X"10",X"21",X"4C",X"E4",X"7E",X"B7",X"28",X"11",X"35",X"C0",X"36",X"08",X"21", - X"4A",X"E4",X"34",X"7E",X"E6",X"FC",X"FE",X"14",X"C8",X"36",X"14",X"C9",X"3A",X"54",X"E4",X"FE", - X"02",X"20",X"0D",X"06",X"1C",X"CD",X"9F",X"10",X"D0",X"AF",X"32",X"54",X"E4",X"CD",X"37",X"12", - X"3A",X"54",X"E4",X"FE",X"01",X"20",X"0E",X"CD",X"0E",X"12",X"06",X"20",X"CD",X"9F",X"10",X"D0", - X"3E",X"03",X"32",X"54",X"E4",X"AF",X"32",X"51",X"E4",X"3A",X"44",X"E4",X"2A",X"45",X"E4",X"CD", - X"00",X"2D",X"06",X"F8",X"0E",X"10",X"CD",X"8D",X"2E",X"CA",X"9F",X"0C",X"AF",X"32",X"87",X"E5", - X"32",X"54",X"E4",X"7E",X"E6",X"FC",X"FE",X"18",X"20",X"13",X"3E",X"01",X"32",X"87",X"E5",X"3A", - X"42",X"E4",X"B7",X"20",X"08",X"3E",X"01",X"32",X"51",X"E4",X"CA",X"9F",X"0C",X"3A",X"45",X"E4", - X"FE",X"1D",X"30",X"0E",X"1A",X"E6",X"F8",X"FE",X"10",X"28",X"07",X"1A",X"E6",X"F8",X"FE",X"08", - X"20",X"0D",X"3E",X"01",X"32",X"87",X"E5",X"3A",X"42",X"E4",X"FE",X"80",X"DA",X"9F",X"0C",X"2A", - X"47",X"E4",X"3A",X"46",X"E4",X"CD",X"15",X"2D",X"DA",X"B1",X"0C",X"21",X"4F",X"E4",X"7E",X"B7", - X"20",X"06",X"34",X"3E",X"15",X"CD",X"42",X"31",X"3E",X"0C",X"32",X"4A",X"E4",X"21",X"09",X"E5", - X"7E",X"B7",X"28",X"04",X"35",X"C3",X"B1",X"0C",X"CD",X"0E",X"12",X"2A",X"42",X"E4",X"7C",X"11", - X"1E",X"00",X"19",X"22",X"42",X"E4",X"BC",X"28",X"0A",X"3A",X"87",X"E5",X"B7",X"28",X"04",X"AF", - X"32",X"42",X"E4",X"2A",X"42",X"E4",X"29",X"7C",X"3C",X"1F",X"32",X"45",X"E4",X"29",X"29",X"7C", - X"32",X"46",X"E4",X"CD",X"88",X"11",X"3A",X"42",X"E4",X"B7",X"C0",X"3A",X"44",X"E4",X"2A",X"45", - X"E4",X"CD",X"00",X"2D",X"3A",X"45",X"E4",X"FE",X"1D",X"30",X"06",X"1A",X"E6",X"F8",X"FE",X"08", - X"C0",X"15",X"0E",X"04",X"CD",X"A9",X"2E",X"C0",X"1D",X"1D",X"1D",X"1D",X"3A",X"44",X"E4",X"B7", - X"28",X"06",X"1A",X"E6",X"F8",X"FE",X"08",X"C0",X"3A",X"44",X"E4",X"FE",X"17",X"30",X"0A",X"7B", - X"C6",X"08",X"5F",X"1A",X"E6",X"F8",X"FE",X"08",X"C0",X"3E",X"08",X"32",X"4C",X"E4",X"C9",X"21", - X"4F",X"E4",X"7E",X"B7",X"28",X"07",X"36",X"00",X"3E",X"16",X"CD",X"42",X"31",X"AF",X"32",X"52", - X"E4",X"3A",X"4D",X"E4",X"CB",X"7F",X"C2",X"42",X"0F",X"CB",X"6F",X"C2",X"CF",X"0F",X"CB",X"5F", - X"28",X"06",X"CD",X"4C",X"0E",X"D8",X"18",X"08",X"CB",X"57",X"28",X"04",X"CD",X"B7",X"0E",X"D8", - X"3A",X"4D",X"E4",X"CB",X"47",X"C2",X"5E",X"0D",X"CB",X"4F",X"C2",X"21",X"0D",X"3A",X"44",X"E4", - X"2A",X"45",X"E4",X"CD",X"00",X"2D",X"1A",X"E6",X"F8",X"FE",X"08",X"20",X"0B",X"3E",X"12",X"32", - X"4A",X"E4",X"3E",X"01",X"32",X"49",X"E4",X"C9",X"06",X"F8",X"0E",X"10",X"CD",X"8D",X"2E",X"20", - X"0D",X"15",X"1A",X"E6",X"F8",X"FE",X"10",X"C0",X"3E",X"08",X"32",X"4A",X"E4",X"C9",X"7E",X"E6", - X"FC",X"FE",X"18",X"20",X"06",X"3E",X"07",X"32",X"4A",X"E4",X"C9",X"3E",X"12",X"32",X"4A",X"E4", - X"C9",X"AF",X"32",X"87",X"E5",X"3A",X"44",X"E4",X"2A",X"45",X"E4",X"CD",X"00",X"2D",X"3A",X"44", - X"E4",X"B7",X"28",X"0E",X"15",X"1B",X"1B",X"1B",X"1B",X"06",X"F8",X"0E",X"08",X"CD",X"71",X"2E", - X"20",X"0C",X"3E",X"01",X"32",X"87",X"E5",X"3A",X"40",X"E4",X"3D",X"FE",X"7F",X"D0",X"3E",X"01", - X"32",X"4B",X"E4",X"CD",X"37",X"12",X"CD",X"D4",X"0D",X"11",X"EC",X"FF",X"18",X"3D",X"AF",X"32", - X"87",X"E5",X"3A",X"44",X"E4",X"2A",X"45",X"E4",X"CD",X"00",X"2D",X"3A",X"44",X"E4",X"FE",X"17", - X"30",X"0E",X"15",X"13",X"13",X"13",X"13",X"06",X"F8",X"0E",X"08",X"CD",X"71",X"2E",X"20",X"0E", - X"3E",X"01",X"32",X"87",X"E5",X"3A",X"40",X"E4",X"FE",X"80",X"30",X"02",X"B7",X"C9",X"AF",X"32", - X"4B",X"E4",X"CD",X"37",X"12",X"CD",X"D4",X"0D",X"11",X"14",X"00",X"2A",X"40",X"E4",X"7C",X"19", - X"22",X"40",X"E4",X"BC",X"28",X"14",X"3A",X"87",X"E5",X"B7",X"28",X"0E",X"2A",X"40",X"E4",X"7D", - X"FE",X"80",X"38",X"01",X"24",X"2E",X"00",X"22",X"40",X"E4",X"2A",X"40",X"E4",X"29",X"7C",X"3C", - X"1F",X"32",X"44",X"E4",X"29",X"29",X"7C",X"32",X"47",X"E4",X"CD",X"88",X"11",X"06",X"00",X"CD", - X"F1",X"10",X"37",X"C9",X"3A",X"51",X"E4",X"B7",X"C8",X"F1",X"3A",X"4A",X"E4",X"E6",X"FC",X"21", - X"49",X"E4",X"FE",X"2C",X"28",X"02",X"36",X"01",X"35",X"C0",X"21",X"4A",X"E4",X"34",X"7E",X"E6", - X"FC",X"FE",X"2C",X"28",X"02",X"36",X"2C",X"7E",X"D6",X"18",X"4F",X"06",X"00",X"21",X"20",X"4C", - X"09",X"7E",X"32",X"49",X"E4",X"21",X"D0",X"4D",X"09",X"7E",X"87",X"87",X"87",X"87",X"5F",X"3A", - X"87",X"E5",X"57",X"2A",X"40",X"E4",X"3A",X"4B",X"E4",X"B7",X"7D",X"28",X"0D",X"93",X"30",X"08", - X"CB",X"42",X"28",X"03",X"AF",X"18",X"01",X"25",X"18",X"09",X"83",X"30",X"06",X"24",X"CB",X"42", - X"28",X"01",X"AF",X"6F",X"22",X"40",X"E4",X"2A",X"40",X"E4",X"29",X"7C",X"3C",X"1F",X"32",X"44", - X"E4",X"29",X"29",X"7C",X"32",X"47",X"E4",X"CD",X"88",X"11",X"37",X"C9",X"AF",X"32",X"87",X"E5", - X"3A",X"44",X"E4",X"2A",X"45",X"E4",X"CD",X"00",X"2D",X"06",X"F8",X"0E",X"10",X"CD",X"8D",X"2E", - X"20",X"14",X"3A",X"45",X"E4",X"FE",X"01",X"28",X"16",X"15",X"15",X"1A",X"E6",X"F8",X"FE",X"08", - X"28",X"0D",X"18",X"17",X"18",X"09",X"1A",X"E6",X"F8",X"FE",X"10",X"28",X"02",X"B7",X"C9",X"3A", - X"42",X"E4",X"3D",X"FE",X"7F",X"D0",X"3E",X"01",X"32",X"87",X"E5",X"CD",X"0E",X"12",X"3A",X"44", - X"E4",X"2A",X"45",X"E4",X"CD",X"00",X"2D",X"15",X"1A",X"E6",X"F8",X"11",X"E2",X"FF",X"FE",X"10", - X"CA",X"07",X"0F",X"21",X"54",X"E4",X"7E",X"FE",X"03",X"C2",X"07",X"0F",X"35",X"3E",X"1C",X"32", - X"4A",X"E4",X"CD",X"AB",X"10",X"37",X"C9",X"AF",X"32",X"87",X"E5",X"3A",X"45",X"E4",X"FE",X"1D", - X"30",X"07",X"1A",X"E6",X"F8",X"FE",X"08",X"20",X"0E",X"3A",X"42",X"E4",X"FE",X"80",X"30",X"02", - X"B7",X"C9",X"3E",X"01",X"32",X"87",X"E5",X"CD",X"0E",X"12",X"3A",X"44",X"E4",X"2A",X"43",X"E4", - X"CD",X"00",X"2D",X"1A",X"15",X"E6",X"F8",X"FE",X"10",X"1A",X"11",X"1E",X"00",X"20",X"18",X"E6", - X"F8",X"FE",X"10",X"28",X"12",X"21",X"54",X"E4",X"7E",X"B7",X"20",X"0B",X"34",X"3E",X"20",X"32", - X"4A",X"E4",X"CD",X"AB",X"10",X"37",X"C9",X"2A",X"42",X"E4",X"7C",X"19",X"22",X"42",X"E4",X"BC", - X"28",X"11",X"3A",X"87",X"E5",X"B7",X"28",X"0B",X"7D",X"FE",X"80",X"38",X"01",X"24",X"2E",X"00", - X"22",X"42",X"E4",X"2A",X"42",X"E4",X"29",X"7C",X"3C",X"1F",X"32",X"45",X"E4",X"29",X"29",X"7C", - X"32",X"46",X"E4",X"CD",X"88",X"11",X"06",X"08",X"CD",X"F1",X"10",X"3E",X"03",X"32",X"54",X"E4", - X"37",X"C9",X"AF",X"32",X"0F",X"E5",X"3A",X"45",X"E4",X"FE",X"1C",X"D0",X"3A",X"44",X"E4",X"B7", - X"C8",X"3A",X"45",X"E4",X"6F",X"C6",X"03",X"32",X"17",X"E5",X"3A",X"44",X"E4",X"3D",X"32",X"16", - X"E5",X"CD",X"00",X"2D",X"06",X"FC",X"0E",X"08",X"CD",X"7F",X"2E",X"C0",X"ED",X"53",X"13",X"E5", - X"15",X"06",X"F8",X"0E",X"00",X"CD",X"7F",X"2E",X"C0",X"3E",X"10",X"32",X"4A",X"E4",X"14",X"1C", - X"1C",X"1C",X"1C",X"1A",X"E6",X"F8",X"FE",X"08",X"28",X"17",X"2C",X"2C",X"2C",X"2C",X"7E",X"E6", - X"FC",X"FE",X"18",X"28",X"07",X"7E",X"E6",X"F8",X"FE",X"10",X"20",X"05",X"3E",X"11",X"32",X"4A", - X"E4",X"3E",X"FF",X"32",X"4E",X"E4",X"21",X"40",X"01",X"22",X"11",X"E5",X"3E",X"01",X"32",X"4B", - X"E4",X"32",X"07",X"E5",X"3A",X"0F",X"E5",X"FE",X"0E",X"D2",X"59",X"10",X"2A",X"46",X"E4",X"7D", - X"C6",X"08",X"6F",X"7C",X"D6",X"06",X"CD",X"EF",X"2D",X"DA",X"92",X"10",X"C3",X"59",X"10",X"AF", - X"32",X"0F",X"E5",X"3A",X"45",X"E4",X"FE",X"1C",X"D0",X"3A",X"44",X"E4",X"FE",X"17",X"D0",X"3A", - X"45",X"E4",X"6F",X"C6",X"03",X"32",X"17",X"E5",X"3A",X"44",X"E4",X"3C",X"32",X"16",X"E5",X"CD", - X"00",X"2D",X"06",X"FC",X"0E",X"08",X"CD",X"7F",X"2E",X"C0",X"ED",X"53",X"13",X"E5",X"15",X"06", - X"F8",X"0E",X"00",X"CD",X"7F",X"2E",X"C0",X"3E",X"10",X"32",X"4A",X"E4",X"14",X"1D",X"1D",X"1D", - X"1D",X"1A",X"E6",X"F8",X"FE",X"08",X"28",X"17",X"2D",X"2D",X"2D",X"2D",X"7E",X"E6",X"FC",X"FE", - X"18",X"28",X"07",X"7E",X"E6",X"F8",X"FE",X"10",X"20",X"05",X"3E",X"11",X"32",X"4A",X"E4",X"3E", - X"01",X"32",X"4E",X"E4",X"21",X"40",X"01",X"22",X"11",X"E5",X"AF",X"32",X"4B",X"E4",X"3E",X"01", - X"32",X"07",X"E5",X"3A",X"0F",X"E5",X"FE",X"0E",X"30",X"0F",X"2A",X"46",X"E4",X"7D",X"C6",X"08", - X"6F",X"7C",X"C6",X"06",X"CD",X"31",X"2E",X"38",X"39",X"21",X"07",X"E5",X"7E",X"B7",X"28",X"07", - X"36",X"00",X"3E",X"01",X"CD",X"42",X"31",X"CD",X"0E",X"12",X"CD",X"37",X"12",X"3A",X"0F",X"E5", - X"FE",X"14",X"D2",X"03",X"11",X"21",X"10",X"E5",X"36",X"F3",X"3A",X"0F",X"E5",X"1F",X"1F",X"30", - X"02",X"36",X"F2",X"2A",X"11",X"E5",X"11",X"C0",X"00",X"19",X"22",X"11",X"E5",X"21",X"0F",X"E5", - X"34",X"C9",X"3E",X"00",X"32",X"10",X"E5",X"AF",X"32",X"4E",X"E4",X"32",X"07",X"E5",X"C9",X"21", - X"49",X"E4",X"35",X"28",X"02",X"B7",X"C9",X"21",X"4A",X"E4",X"34",X"3A",X"4A",X"E4",X"D6",X"18", - X"4F",X"06",X"00",X"21",X"20",X"4C",X"09",X"7E",X"32",X"49",X"E4",X"B7",X"20",X"07",X"3E",X"01", - X"32",X"49",X"E4",X"37",X"C9",X"21",X"A8",X"4E",X"09",X"56",X"1E",X"00",X"CB",X"2A",X"CB",X"1B", - X"CB",X"2A",X"CB",X"1B",X"CB",X"2A",X"CB",X"1B",X"2A",X"42",X"E4",X"19",X"22",X"42",X"E4",X"2A", - X"42",X"E4",X"29",X"7C",X"3C",X"1F",X"32",X"45",X"E4",X"29",X"29",X"7C",X"32",X"46",X"E4",X"B7", - X"C9",X"21",X"49",X"E4",X"35",X"C0",X"36",X"06",X"21",X"4A",X"E4",X"34",X"7E",X"E6",X"FC",X"B8", - X"C8",X"70",X"C9",X"AF",X"32",X"4E",X"E4",X"32",X"0C",X"E5",X"3D",X"32",X"0B",X"E5",X"CD",X"DD", - X"0C",X"ED",X"5B",X"13",X"E5",X"3E",X"04",X"CD",X"BE",X"2F",X"3E",X"00",X"32",X"10",X"E5",X"21", - X"18",X"E5",X"06",X"14",X"7E",X"B7",X"28",X"07",X"23",X"23",X"23",X"23",X"10",X"F6",X"C9",X"36", - X"A0",X"23",X"23",X"3A",X"16",X"E5",X"77",X"5F",X"23",X"3A",X"17",X"E5",X"77",X"57",X"2A",X"71", - X"E5",X"B7",X"ED",X"52",X"C0",X"22",X"71",X"E5",X"3E",X"01",X"32",X"02",X"E5",X"21",X"E9",X"E4", - X"7E",X"FD",X"21",X"58",X"E4",X"01",X"18",X"00",X"FD",X"09",X"3D",X"20",X"FB",X"34",X"FD",X"77", - X"00",X"FD",X"77",X"02",X"FD",X"73",X"01",X"FD",X"73",X"04",X"15",X"FD",X"72",X"03",X"FD",X"72", - X"05",X"7B",X"87",X"87",X"87",X"FD",X"77",X"07",X"7A",X"87",X"87",X"87",X"FD",X"77",X"06",X"FD", - X"36",X"09",X"01",X"FD",X"36",X"0C",X"B0",X"C9",X"3A",X"51",X"E4",X"B7",X"20",X"18",X"3A",X"40", - X"E4",X"FE",X"80",X"38",X"02",X"ED",X"44",X"FE",X"14",X"D0",X"3A",X"42",X"E4",X"FE",X"80",X"38", - X"02",X"ED",X"44",X"FE",X"1E",X"D0",X"3A",X"44",X"E4",X"2A",X"45",X"E4",X"CD",X"00",X"2D",X"15", - X"1A",X"E6",X"FC",X"FE",X"60",X"20",X"20",X"CD",X"83",X"2F",X"ED",X"5F",X"FE",X"33",X"38",X"04", - X"3E",X"08",X"18",X"0A",X"FE",X"0D",X"38",X"04",X"3E",X"09",X"18",X"02",X"3E",X"0A",X"CD",X"73", - X"30",X"3E",X"02",X"CD",X"42",X"31",X"C9",X"FE",X"70",X"C0",X"21",X"FC",X"E4",X"35",X"CD",X"5C", - X"2F",X"0E",X"00",X"14",X"1A",X"FE",X"04",X"20",X"02",X"0E",X"04",X"21",X"0D",X"E5",X"3A",X"08", - X"E5",X"B7",X"20",X"04",X"36",X"00",X"18",X"06",X"7E",X"FE",X"03",X"30",X"01",X"34",X"7E",X"81", - X"CD",X"73",X"30",X"3E",X"13",X"32",X"08",X"E5",X"3E",X"02",X"CD",X"42",X"31",X"C9",X"2A",X"40", - X"E4",X"7D",X"FE",X"80",X"30",X"07",X"D6",X"14",X"30",X"01",X"AF",X"18",X"06",X"C6",X"14",X"30", - X"02",X"24",X"AF",X"6F",X"22",X"40",X"E4",X"29",X"7C",X"3C",X"1F",X"32",X"44",X"E4",X"29",X"29", - X"7C",X"32",X"47",X"E4",X"C3",X"88",X"11",X"3A",X"52",X"E4",X"B7",X"C0",X"2A",X"42",X"E4",X"7D", - X"FE",X"80",X"30",X"07",X"D6",X"1E",X"30",X"01",X"AF",X"18",X"06",X"C6",X"1E",X"30",X"02",X"24", - X"AF",X"6F",X"22",X"42",X"E4",X"29",X"7C",X"3C",X"1F",X"32",X"45",X"E4",X"29",X"29",X"7C",X"32", - X"46",X"E4",X"C3",X"88",X"11",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"3A",X"E9",X"E4",X"32",X"E8",X"E4",X"DD",X"21",X"58",X"E4",X"CD",X"19",X"13",X"11",X"18",X"00", - X"DD",X"19",X"21",X"E8",X"E4",X"35",X"20",X"F2",X"C9",X"21",X"6D",X"E5",X"36",X"00",X"3A",X"02", - X"E5",X"B7",X"28",X"19",X"3A",X"E8",X"E4",X"FE",X"01",X"20",X"12",X"34",X"3A",X"03",X"E5",X"B7", - X"28",X"0B",X"DD",X"7E",X"0C",X"FE",X"20",X"20",X"04",X"DD",X"36",X"0C",X"40",X"DD",X"7E",X"0E", - X"B7",X"C0",X"3A",X"F5",X"E4",X"B7",X"28",X"03",X"DD",X"34",X"17",X"DD",X"7E",X"0C",X"B7",X"28", - X"32",X"DD",X"35",X"0C",X"DD",X"7E",X"0C",X"FE",X"20",X"DA",X"23",X"15",X"DD",X"6E",X"07",X"DD", - X"7E",X"06",X"CD",X"F2",X"2E",X"DD",X"7E",X"0C",X"FE",X"B0",X"D0",X"DD",X"35",X"09",X"C0",X"DD", - X"36",X"09",X"08",X"DD",X"34",X"0A",X"DD",X"7E",X"0A",X"E6",X"FC",X"FE",X"14",X"C8",X"DD",X"36", - X"0A",X"14",X"C9",X"DD",X"7E",X"14",X"FE",X"14",X"20",X"0F",X"CD",X"F7",X"18",X"D8",X"06",X"1C", - X"CD",X"66",X"1A",X"D0",X"DD",X"36",X"14",X"00",X"C9",X"DD",X"7E",X"14",X"FE",X"01",X"20",X"12", - X"CD",X"C1",X"1B",X"CD",X"F7",X"18",X"D8",X"06",X"20",X"CD",X"66",X"1A",X"D0",X"DD",X"36",X"14", - X"15",X"C9",X"DD",X"7E",X"15",X"FE",X"02",X"20",X"19",X"CD",X"C1",X"1B",X"CD",X"F7",X"18",X"D8", - X"06",X"28",X"CD",X"66",X"1A",X"D0",X"DD",X"36",X"15",X"00",X"DD",X"34",X"09",X"DD",X"36",X"0F", - X"02",X"C9",X"DD",X"7E",X"15",X"FE",X"01",X"20",X"0F",X"CD",X"F7",X"18",X"D8",X"06",X"24",X"CD", - X"66",X"1A",X"D0",X"DD",X"36",X"15",X"03",X"C9",X"DD",X"7E",X"06",X"DD",X"6E",X"07",X"CD",X"9E", - X"2D",X"DA",X"75",X"15",X"DD",X"7E",X"04",X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"06",X"F8",X"0E", - X"10",X"CD",X"8D",X"2E",X"CA",X"75",X"15",X"AF",X"32",X"87",X"E5",X"DD",X"77",X"14",X"7E",X"E6", - X"FC",X"FE",X"18",X"20",X"0C",X"3E",X"01",X"32",X"87",X"E5",X"DD",X"7E",X"02",X"B7",X"CA",X"75", - X"15",X"DD",X"7E",X"05",X"FE",X"1D",X"30",X"29",X"1A",X"E6",X"F8",X"FE",X"10",X"28",X"22",X"1A", - X"E6",X"F8",X"FE",X"08",X"28",X"1B",X"DD",X"7E",X"16",X"B7",X"28",X"08",X"3C",X"DD",X"BE",X"05", - X"30",X"1C",X"18",X"0D",X"1A",X"FE",X"04",X"20",X"15",X"DD",X"7E",X"05",X"DD",X"77",X"16",X"18", - X"0D",X"3E",X"01",X"32",X"87",X"E5",X"DD",X"7E",X"02",X"FE",X"80",X"DA",X"75",X"15",X"DD",X"36", - X"10",X"00",X"CD",X"C1",X"1B",X"DD",X"7E",X"02",X"C6",X"15",X"DD",X"77",X"02",X"30",X"0D",X"DD", - X"34",X"03",X"3A",X"87",X"E5",X"B7",X"28",X"04",X"AF",X"DD",X"77",X"02",X"DD",X"6E",X"02",X"DD", - X"66",X"03",X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"05",X"29",X"29",X"7C",X"DD",X"77",X"06",X"DD", - X"7E",X"06",X"DD",X"6E",X"07",X"CD",X"D3",X"2E",X"CD",X"39",X"1B",X"06",X"0C",X"CD",X"2E",X"1A", - X"DD",X"7E",X"04",X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"24",X"7E",X"25",X"FE",X"04",X"20",X"3E", - X"DD",X"7E",X"0D",X"B7",X"28",X"19",X"DD",X"36",X"0D",X"00",X"EB",X"06",X"FC",X"0E",X"00",X"CD", - X"7F",X"2E",X"20",X"04",X"CD",X"0E",X"2F",X"C9",X"21",X"FC",X"E4",X"35",X"C9",X"18",X"1F",X"3A", - X"6D",X"E5",X"B7",X"28",X"19",X"3A",X"03",X"E5",X"B7",X"20",X"13",X"3E",X"01",X"32",X"03",X"E5", - X"EB",X"06",X"FC",X"0E",X"00",X"CD",X"7F",X"2E",X"20",X"03",X"CD",X"35",X"2F",X"C9",X"DD",X"7E", - X"02",X"B7",X"C0",X"15",X"1A",X"FE",X"04",X"C0",X"3A",X"87",X"E5",X"B7",X"C8",X"DD",X"36",X"16", - X"00",X"DD",X"36",X"0C",X"C0",X"DD",X"36",X"10",X"00",X"DD",X"36",X"0A",X"10",X"3E",X"05",X"CD", - X"42",X"31",X"3A",X"6D",X"E5",X"B7",X"C0",X"01",X"00",X"01",X"CD",X"DB",X"2F",X"3E",X"01",X"32", - X"00",X"E5",X"C9",X"B7",X"28",X"3C",X"FE",X"1F",X"20",X"0F",X"DD",X"36",X"10",X"01",X"DD",X"36", - X"0F",X"FE",X"DD",X"35",X"05",X"DD",X"35",X"05",X"C9",X"FE",X"18",X"38",X"06",X"DD",X"7E",X"0F", - X"FE",X"FE",X"C8",X"DD",X"36",X"10",X"00",X"DD",X"34",X"05",X"DD",X"34",X"05",X"DD",X"7E",X"0F", - X"DD",X"77",X"0B",X"FE",X"FE",X"38",X"04",X"DD",X"77",X"0C",X"C9",X"DD",X"36",X"0A",X"18",X"CD", - X"76",X"1A",X"DD",X"36",X"0C",X"01",X"CD",X"F7",X"18",X"D8",X"06",X"18",X"CD",X"66",X"1A",X"D0", - X"DD",X"36",X"0C",X"00",X"C9",X"DD",X"36",X"16",X"00",X"DD",X"36",X"10",X"01",X"DD",X"7E",X"0F", - X"B7",X"CA",X"85",X"17",X"3D",X"CA",X"29",X"17",X"3D",X"CA",X"5D",X"16",X"3D",X"CA",X"9A",X"15", - X"DD",X"6E",X"07",X"DD",X"7E",X"06",X"CD",X"F2",X"2E",X"C9",X"AF",X"32",X"87",X"E5",X"DD",X"7E", - X"05",X"FE",X"01",X"28",X"23",X"DD",X"7E",X"04",X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"06",X"F8", - X"0E",X"10",X"CD",X"8D",X"2E",X"20",X"0B",X"15",X"15",X"1A",X"E6",X"F8",X"FE",X"08",X"20",X"14", - X"18",X"06",X"1A",X"E6",X"F8",X"FE",X"10",X"C0",X"DD",X"7E",X"02",X"3D",X"FE",X"7F",X"D0",X"3E", - X"01",X"32",X"87",X"E5",X"CD",X"C1",X"1B",X"DD",X"7E",X"04",X"DD",X"6E",X"03",X"CD",X"00",X"2D", - X"24",X"24",X"7E",X"E6",X"F8",X"FE",X"10",X"20",X"30",X"1A",X"E6",X"F8",X"FE",X"10",X"20",X"29", - X"15",X"1A",X"E6",X"F8",X"FE",X"10",X"28",X"21",X"DD",X"7E",X"14",X"FE",X"15",X"20",X"1A",X"DD", - X"35",X"14",X"DD",X"46",X"0A",X"DD",X"4E",X"09",X"C5",X"DD",X"36",X"0A",X"1C",X"CD",X"76",X"1A", - X"C1",X"30",X"41",X"DD",X"70",X"0A",X"DD",X"71",X"09",X"DD",X"7E",X"02",X"D6",X"15",X"DD",X"77", - X"02",X"30",X"0F",X"3A",X"87",X"E5",X"B7",X"28",X"06",X"AF",X"DD",X"77",X"02",X"18",X"03",X"DD", - X"35",X"03",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"05",X"29", - X"29",X"7C",X"DD",X"77",X"06",X"CD",X"39",X"1B",X"CD",X"7A",X"1B",X"06",X"08",X"CD",X"2E",X"1A", - X"DD",X"36",X"14",X"15",X"DD",X"7E",X"06",X"DD",X"6E",X"07",X"C3",X"D3",X"2E",X"DD",X"7E",X"06", - X"DD",X"6E",X"07",X"CD",X"9E",X"2D",X"D8",X"AF",X"32",X"87",X"E5",X"DD",X"7E",X"05",X"FE",X"1D", - X"30",X"10",X"DD",X"7E",X"04",X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"1A",X"E6",X"F8",X"FE",X"08", - X"20",X"0B",X"DD",X"7E",X"02",X"FE",X"80",X"D8",X"3E",X"01",X"32",X"87",X"E5",X"7E",X"E6",X"FC", - X"FE",X"18",X"20",X"17",X"DD",X"7E",X"15",X"FE",X"03",X"20",X"10",X"DD",X"35",X"15",X"DD",X"36", - X"0A",X"28",X"CD",X"76",X"1A",X"D0",X"DD",X"36",X"0A",X"0C",X"C9",X"CD",X"C1",X"1B",X"DD",X"7E", - X"04",X"DD",X"6E",X"03",X"CD",X"00",X"2D",X"1A",X"E6",X"F8",X"FE",X"10",X"20",X"29",X"15",X"1A", - X"E6",X"F8",X"FE",X"10",X"28",X"21",X"DD",X"7E",X"14",X"FE",X"15",X"28",X"1A",X"DD",X"34",X"14", - X"DD",X"46",X"0A",X"DD",X"4E",X"09",X"C5",X"DD",X"36",X"0A",X"20",X"CD",X"76",X"1A",X"C1",X"30", - X"3F",X"DD",X"70",X"0A",X"DD",X"71",X"09",X"DD",X"7E",X"02",X"C6",X"15",X"DD",X"77",X"02",X"30", - X"0D",X"DD",X"34",X"03",X"3A",X"87",X"E5",X"B7",X"28",X"04",X"AF",X"DD",X"77",X"02",X"DD",X"6E", - X"02",X"DD",X"66",X"03",X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"05",X"29",X"29",X"7C",X"DD",X"77", - X"06",X"CD",X"39",X"1B",X"CD",X"7A",X"1B",X"06",X"08",X"CD",X"2E",X"1A",X"DD",X"36",X"14",X"15", - X"DD",X"7E",X"06",X"DD",X"6E",X"07",X"C3",X"D3",X"2E",X"DD",X"6E",X"06",X"DD",X"7E",X"07",X"CD", - X"EF",X"2D",X"D8",X"AF",X"32",X"87",X"E5",X"DD",X"7E",X"04",X"B7",X"28",X"16",X"DD",X"7E",X"04", - X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"2B",X"2B",X"2B",X"2B",X"06",X"F8",X"0E",X"08",X"CD",X"8D", - X"2E",X"20",X"0C",X"DD",X"7E",X"00",X"3D",X"FE",X"7F",X"D0",X"3E",X"01",X"32",X"87",X"E5",X"3E", - X"01",X"DD",X"77",X"0B",X"CD",X"EE",X"1B",X"CD",X"4C",X"18",X"DD",X"7E",X"00",X"D6",X"0E",X"DD", - X"77",X"00",X"30",X"0F",X"3A",X"87",X"E5",X"B7",X"28",X"06",X"AF",X"DD",X"77",X"00",X"18",X"03", - X"DD",X"35",X"01",X"18",X"57",X"DD",X"6E",X"06",X"DD",X"7E",X"07",X"CD",X"31",X"2E",X"D8",X"AF", - X"32",X"87",X"E5",X"DD",X"7E",X"04",X"FE",X"17",X"30",X"16",X"DD",X"7E",X"04",X"DD",X"6E",X"05", - X"CD",X"00",X"2D",X"23",X"23",X"23",X"23",X"06",X"F8",X"0E",X"08",X"CD",X"8D",X"2E",X"20",X"0B", - X"DD",X"7E",X"00",X"FE",X"80",X"D8",X"3E",X"01",X"32",X"87",X"E5",X"AF",X"DD",X"77",X"0B",X"CD", - X"EE",X"1B",X"CD",X"4C",X"18",X"DD",X"7E",X"00",X"C6",X"0E",X"DD",X"77",X"00",X"30",X"0D",X"DD", - X"34",X"01",X"3A",X"87",X"E5",X"B7",X"28",X"AB",X"AF",X"DD",X"77",X"00",X"DD",X"6E",X"00",X"DD", - X"66",X"01",X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"04",X"29",X"29",X"7C",X"DD",X"77",X"07",X"CD", - X"39",X"1B",X"CD",X"7A",X"1B",X"DD",X"6E",X"06",X"DD",X"7E",X"0B",X"B7",X"DD",X"7E",X"07",X"28", - X"05",X"CD",X"B9",X"2E",X"18",X"03",X"CD",X"B5",X"2E",X"DD",X"7E",X"04",X"DD",X"6E",X"05",X"CD", - X"00",X"2D",X"E6",X"FC",X"FE",X"18",X"20",X"19",X"DD",X"7E",X"15",X"B7",X"20",X"0B",X"DD",X"34", - X"15",X"DD",X"36",X"0A",X"24",X"CD",X"76",X"1A",X"D0",X"DD",X"36",X"15",X"03",X"06",X"04",X"18", - X"18",X"DD",X"7E",X"15",X"FE",X"03",X"20",X"0B",X"DD",X"35",X"15",X"DD",X"36",X"0A",X"28",X"CD", - X"76",X"1A",X"D0",X"DD",X"36",X"15",X"00",X"06",X"00",X"C3",X"2E",X"1A",X"3A",X"6D",X"E5",X"B7", - X"20",X"07",X"3A",X"FB",X"E4",X"B7",X"C8",X"18",X"05",X"3A",X"6F",X"E5",X"B7",X"C8",X"DD",X"7E", - X"04",X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"E6",X"FC",X"FE",X"18",X"C0",X"F1",X"DD",X"6E",X"06", - X"DD",X"7E",X"0B",X"B7",X"DD",X"7E",X"07",X"28",X"05",X"CD",X"B9",X"2E",X"18",X"03",X"CD",X"B5", - X"2E",X"DD",X"7E",X"0A",X"E6",X"FC",X"FE",X"2C",X"28",X"04",X"DD",X"36",X"09",X"01",X"DD",X"35", - X"09",X"C0",X"DD",X"34",X"0A",X"DD",X"7E",X"0A",X"E6",X"FC",X"FE",X"2C",X"28",X"04",X"DD",X"36", - X"0A",X"2C",X"CD",X"19",X"1B",X"21",X"20",X"4C",X"09",X"7E",X"DD",X"77",X"09",X"21",X"D0",X"4D", - X"09",X"7E",X"B7",X"C8",X"87",X"87",X"87",X"87",X"5F",X"3A",X"87",X"E5",X"57",X"DD",X"7E",X"00", - X"DD",X"CB",X"0B",X"46",X"28",X"0F",X"93",X"30",X"0A",X"CB",X"42",X"28",X"03",X"AF",X"18",X"03", - X"DD",X"35",X"01",X"18",X"0B",X"83",X"30",X"08",X"DD",X"34",X"01",X"CB",X"42",X"28",X"01",X"AF", - X"DD",X"77",X"00",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"04", - X"29",X"29",X"7C",X"DD",X"77",X"07",X"C9",X"DD",X"7E",X"0F",X"FE",X"FF",X"C8",X"E6",X"03",X"CA", - X"A6",X"19",X"3D",X"CA",X"EA",X"19",X"3D",X"28",X"59",X"DD",X"7E",X"0C",X"B7",X"28",X"0F",X"DD", - X"7E",X"04",X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"E6",X"F8",X"FE",X"08",X"37",X"C8",X"DD",X"CB", - X"0F",X"6E",X"20",X"0A",X"DD",X"7E",X"06",X"DD",X"6E",X"07",X"CD",X"A2",X"2D",X"D8",X"DD",X"46", - X"0F",X"CB",X"78",X"20",X"20",X"DD",X"7E",X"02",X"D6",X"20",X"DD",X"77",X"02",X"30",X"03",X"DD", - X"35",X"03",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"05",X"29", - X"29",X"7C",X"DD",X"77",X"06",X"DD",X"7E",X"06",X"DD",X"6E",X"07",X"CB",X"70",X"CC",X"D3",X"2E", - X"B7",X"C9",X"DD",X"CB",X"0F",X"6E",X"20",X"0A",X"DD",X"7E",X"06",X"DD",X"6E",X"07",X"CD",X"9E", - X"2D",X"D8",X"DD",X"46",X"0F",X"CB",X"78",X"20",X"20",X"DD",X"7E",X"02",X"C6",X"20",X"DD",X"77", - X"02",X"30",X"03",X"DD",X"34",X"03",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"29",X"7C",X"3C",X"1F", - X"DD",X"77",X"05",X"29",X"29",X"7C",X"DD",X"77",X"06",X"DD",X"7E",X"06",X"DD",X"6E",X"07",X"CB", - X"70",X"CC",X"D3",X"2E",X"B7",X"C9",X"DD",X"CB",X"0F",X"6E",X"20",X"0A",X"DD",X"6E",X"06",X"DD", - X"7E",X"07",X"CD",X"31",X"2E",X"D8",X"DD",X"46",X"0F",X"CB",X"78",X"20",X"20",X"DD",X"7E",X"00", - X"C6",X"10",X"DD",X"77",X"00",X"30",X"03",X"DD",X"34",X"01",X"DD",X"6E",X"00",X"DD",X"66",X"01", - X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"04",X"29",X"29",X"7C",X"DD",X"77",X"07",X"DD",X"6E",X"06", - X"DD",X"7E",X"07",X"CB",X"70",X"CC",X"B5",X"2E",X"B7",X"C9",X"DD",X"CB",X"0F",X"6E",X"20",X"0A", - X"DD",X"6E",X"06",X"DD",X"7E",X"07",X"CD",X"EF",X"2D",X"D8",X"DD",X"46",X"0F",X"CB",X"78",X"20", - X"20",X"DD",X"7E",X"00",X"D6",X"10",X"DD",X"77",X"00",X"30",X"03",X"DD",X"35",X"01",X"DD",X"6E", - X"00",X"DD",X"66",X"01",X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"04",X"29",X"29",X"7C",X"DD",X"77", - X"07",X"DD",X"6E",X"06",X"DD",X"7E",X"07",X"CB",X"70",X"CC",X"B9",X"2E",X"B7",X"C9",X"DD",X"35", - X"09",X"C0",X"DD",X"36",X"09",X"06",X"DD",X"34",X"0A",X"DD",X"7E",X"0A",X"FE",X"03",X"20",X"12", - X"3A",X"CD",X"E5",X"5F",X"16",X"00",X"21",X"5D",X"1A",X"19",X"7E",X"B7",X"28",X"04",X"DD",X"70", - X"0A",X"C9",X"DD",X"7E",X"0A",X"E6",X"FC",X"B8",X"C8",X"DD",X"70",X"0A",X"C9",X"00",X"00",X"01", - X"01",X"00",X"00",X"01",X"00",X"00",X"DD",X"35",X"09",X"C0",X"DD",X"34",X"0A",X"DD",X"7E",X"0A", - X"E6",X"FC",X"B8",X"C2",X"0D",X"1B",X"DD",X"36",X"10",X"00",X"CD",X"19",X"1B",X"21",X"20",X"4C", - X"09",X"7E",X"DD",X"77",X"09",X"B7",X"CA",X"0D",X"1B",X"21",X"F8",X"4C",X"09",X"7E",X"57",X"E6", - X"03",X"20",X"07",X"DD",X"CB",X"0B",X"46",X"28",X"01",X"14",X"DD",X"72",X"0F",X"21",X"D0",X"4D", - X"09",X"7E",X"B7",X"28",X"30",X"87",X"87",X"87",X"87",X"16",X"00",X"DD",X"CB",X"0B",X"46",X"28", - X"03",X"ED",X"44",X"15",X"5F",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"19",X"DD",X"75",X"00",X"DD", - X"74",X"01",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"29",X"7C",X"3C",X"1F",X"DD",X"77",X"04",X"29", - X"29",X"7C",X"DD",X"77",X"07",X"21",X"A8",X"4E",X"09",X"7E",X"B7",X"28",X"2F",X"56",X"1E",X"00", - X"CB",X"2A",X"CB",X"1B",X"CB",X"2A",X"CB",X"1B",X"CB",X"2A",X"CB",X"1B",X"DD",X"6E",X"02",X"DD", - X"66",X"03",X"19",X"DD",X"75",X"02",X"DD",X"74",X"03",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"29", - X"7C",X"3C",X"1F",X"DD",X"77",X"05",X"29",X"29",X"7C",X"DD",X"77",X"06",X"C9",X"DD",X"35",X"0A", - X"DD",X"34",X"09",X"DD",X"36",X"0F",X"FF",X"37",X"C9",X"3A",X"6D",X"E5",X"B7",X"28",X"08",X"3A", - X"CD",X"E5",X"E6",X"07",X"3C",X"18",X"03",X"3A",X"CD",X"E5",X"47",X"87",X"80",X"87",X"87",X"87", - X"DD",X"86",X"0A",X"D6",X"18",X"4F",X"06",X"00",X"C9",X"3A",X"6D",X"E5",X"B7",X"C0",X"DD",X"7E", - X"00",X"FE",X"80",X"38",X"02",X"ED",X"44",X"FE",X"0E",X"D0",X"DD",X"7E",X"02",X"FE",X"80",X"38", - X"02",X"ED",X"44",X"FE",X"15",X"D0",X"DD",X"7E",X"04",X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"15", - X"1A",X"E6",X"FC",X"FE",X"70",X"C0",X"DD",X"7E",X"0D",X"B7",X"C0",X"3A",X"68",X"E5",X"C6",X"04", - X"87",X"87",X"87",X"DD",X"77",X"0D",X"CD",X"5C",X"2F",X"C9",X"DD",X"7E",X"0D",X"B7",X"C8",X"DD", - X"7E",X"0F",X"FE",X"02",X"D0",X"DD",X"7E",X"0A",X"FE",X"04",X"38",X"03",X"FE",X"08",X"D8",X"DD", - X"7E",X"04",X"DD",X"6E",X"05",X"CD",X"00",X"2D",X"15",X"06",X"FC",X"0E",X"00",X"CD",X"7F",X"2E", - X"C0",X"DD",X"35",X"0D",X"C0",X"DD",X"7E",X"0F",X"FE",X"00",X"DD",X"7E",X"00",X"20",X"06",X"FE", - X"80",X"30",X"0A",X"18",X"04",X"FE",X"80",X"38",X"04",X"CD",X"0E",X"2F",X"C9",X"DD",X"34",X"0D", - X"C9",X"DD",X"7E",X"00",X"FE",X"80",X"30",X"07",X"D6",X"0E",X"30",X"01",X"AF",X"18",X"08",X"C6", - X"0E",X"30",X"04",X"DD",X"34",X"01",X"AF",X"DD",X"77",X"00",X"6F",X"DD",X"66",X"01",X"29",X"7C", - X"3C",X"1F",X"DD",X"77",X"04",X"29",X"29",X"7C",X"DD",X"77",X"07",X"C3",X"39",X"1B",X"DD",X"7E", - X"02",X"FE",X"80",X"30",X"07",X"D6",X"15",X"30",X"01",X"AF",X"18",X"08",X"C6",X"15",X"30",X"04", - X"DD",X"34",X"03",X"AF",X"DD",X"77",X"02",X"6F",X"DD",X"66",X"03",X"29",X"7C",X"3C",X"1F",X"DD", - X"77",X"05",X"29",X"29",X"7C",X"DD",X"77",X"06",X"C3",X"39",X"1B",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"3A",X"E9",X"E4",X"32",X"EA",X"E4",X"DD",X"21",X"58",X"E4",X"FD",X"21",X"EB",X"E4",X"DD",X"7E", - X"10",X"B7",X"28",X"1C",X"DD",X"6E",X"04",X"DD",X"66",X"05",X"22",X"EF",X"E4",X"DD",X"7E",X"07", - X"32",X"F2",X"E4",X"CD",X"FD",X"1D",X"47",X"DD",X"7E",X"10",X"B7",X"28",X"03",X"DD",X"70",X"0F", - X"11",X"18",X"00",X"DD",X"19",X"21",X"EA",X"E4",X"35",X"20",X"D3",X"3A",X"E9",X"E4",X"32",X"EA", - X"E4",X"DD",X"21",X"58",X"E4",X"DD",X"7E",X"04",X"DD",X"6E",X"05",X"2C",X"2C",X"CD",X"D5",X"62", - X"7E",X"E6",X"0D",X"FE",X"0D",X"28",X"0A",X"21",X"01",X"E5",X"7E",X"FE",X"39",X"D0",X"36",X"00", - X"C9",X"11",X"18",X"00",X"DD",X"19",X"21",X"EA",X"E4",X"35",X"20",X"D9",X"21",X"01",X"E5",X"7E", - X"FE",X"38",X"30",X"02",X"34",X"C9",X"C0",X"34",X"3E",X"00",X"32",X"9D",X"E5",X"21",X"B5",X"E5", - X"7E",X"BE",X"28",X"FD",X"CD",X"8D",X"32",X"21",X"29",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11", - X"2A",X"D7",X"01",X"2E",X"00",X"ED",X"B0",X"21",X"A9",X"D7",X"36",X"05",X"2B",X"36",X"00",X"11", - X"AA",X"D7",X"01",X"2E",X"00",X"ED",X"B0",X"21",X"29",X"D8",X"36",X"05",X"2B",X"36",X"00",X"11", - X"2A",X"D8",X"01",X"2E",X"00",X"ED",X"B0",X"0E",X"47",X"21",X"AA",X"D7",X"11",X"E5",X"1D",X"CD", - X"2D",X"30",X"3E",X"1F",X"CD",X"42",X"31",X"0E",X"01",X"CD",X"CF",X"2F",X"CD",X"03",X"32",X"3E", - X"01",X"32",X"89",X"E5",X"CD",X"89",X"06",X"CD",X"B9",X"32",X"3E",X"26",X"CD",X"42",X"31",X"3E", - X"02",X"32",X"9D",X"E5",X"C9",X"41",X"4C",X"4C",X"20",X"45",X"4E",X"45",X"4D",X"49",X"45",X"53", - X"20",X"41",X"52",X"45",X"20",X"53",X"45",X"41",X"4C",X"45",X"44",X"2E",X"00",X"3A",X"45",X"E4", - X"FD",X"BE",X"05",X"C2",X"B9",X"1E",X"FD",X"46",X"04",X"FD",X"7E",X"07",X"21",X"47",X"E4",X"BE", - X"38",X"05",X"20",X"54",X"3E",X"FF",X"C9",X"3A",X"44",X"E4",X"B8",X"20",X"03",X"3E",X"00",X"C9", - X"04",X"78",X"FD",X"6E",X"05",X"CD",X"00",X"2D",X"E6",X"FC",X"FE",X"18",X"28",X"E9",X"7E",X"E6", - X"F8",X"FE",X"10",X"28",X"E2",X"24",X"7E",X"25",X"E6",X"F8",X"FE",X"10",X"28",X"D9",X"FD",X"7E", - X"05",X"FE",X"1D",X"30",X"D2",X"7E",X"E6",X"F8",X"FE",X"08",X"28",X"6D",X"24",X"7E",X"E6",X"F8", - X"FE",X"08",X"28",X"65",X"1A",X"E6",X"F8",X"FE",X"10",X"28",X"BC",X"1A",X"FE",X"04",X"28",X"B7", - X"E6",X"F8",X"FE",X"08",X"28",X"B1",X"18",X"51",X"3A",X"44",X"E4",X"B8",X"20",X"03",X"3E",X"01", - X"C9",X"05",X"78",X"FD",X"6E",X"05",X"CD",X"00",X"2D",X"E6",X"FC",X"FE",X"18",X"28",X"E9",X"7E", - X"E6",X"F8",X"FE",X"10",X"28",X"E2",X"24",X"7E",X"25",X"E6",X"F8",X"FE",X"10",X"28",X"D9",X"FD", - X"7E",X"05",X"FE",X"1D",X"30",X"D2",X"7E",X"E6",X"F8",X"FE",X"08",X"28",X"1C",X"24",X"7E",X"E6", - X"F8",X"FE",X"08",X"28",X"14",X"1A",X"E6",X"F8",X"FE",X"10",X"28",X"BC",X"1A",X"FE",X"04",X"28", - X"B7",X"E6",X"F8",X"FE",X"08",X"28",X"B1",X"18",X"00",X"3E",X"FF",X"32",X"ED",X"E4",X"32",X"EE", - X"E4",X"FD",X"7E",X"04",X"32",X"EB",X"E4",X"32",X"EC",X"E4",X"CD",X"E0",X"1E",X"CD",X"2B",X"1F", - X"CD",X"77",X"1F",X"CD",X"96",X"1F",X"CD",X"B9",X"1F",X"CD",X"F1",X"1F",X"3A",X"ED",X"E4",X"C9", - X"3A",X"EB",X"E4",X"B7",X"28",X"44",X"3D",X"FD",X"6E",X"05",X"CD",X"00",X"2D",X"06",X"F8",X"0E", - X"08",X"CD",X"8D",X"2E",X"C8",X"06",X"F8",X"0E",X"10",X"CD",X"8D",X"2E",X"28",X"25",X"7E",X"E6", - X"FC",X"FE",X"18",X"28",X"1E",X"FD",X"7E",X"05",X"FE",X"1D",X"30",X"17",X"1A",X"E6",X"F8",X"FE", - X"10",X"28",X"10",X"1A",X"FE",X"04",X"28",X"0B",X"E6",X"F8",X"FE",X"08",X"28",X"05",X"21",X"EB", - X"E4",X"35",X"C9",X"21",X"EB",X"E4",X"35",X"7E",X"18",X"B9",X"C9",X"3A",X"EC",X"E4",X"FE",X"17", - X"30",X"44",X"3C",X"FD",X"6E",X"05",X"CD",X"00",X"2D",X"06",X"F8",X"0E",X"08",X"CD",X"8D",X"2E", - X"C8",X"06",X"F8",X"0E",X"10",X"CD",X"8D",X"2E",X"28",X"25",X"7E",X"E6",X"FC",X"FE",X"18",X"28", - X"1E",X"FD",X"7E",X"05",X"FE",X"1D",X"30",X"17",X"1A",X"E6",X"F8",X"FE",X"10",X"28",X"10",X"1A", - X"FE",X"04",X"28",X"0B",X"E6",X"F8",X"FE",X"08",X"28",X"05",X"21",X"EC",X"E4",X"34",X"C9",X"21", - X"EC",X"E4",X"34",X"7E",X"18",X"B8",X"C9",X"FD",X"7E",X"04",X"CD",X"2A",X"20",X"FD",X"BE",X"05", - X"C8",X"32",X"F3",X"E4",X"FD",X"4E",X"04",X"CD",X"3D",X"21",X"21",X"EE",X"E4",X"BE",X"D0",X"77", - X"3E",X"02",X"32",X"ED",X"E4",X"C9",X"FD",X"7E",X"04",X"CD",X"B6",X"20",X"FD",X"BE",X"05",X"C8", - X"FD",X"4E",X"04",X"32",X"F4",X"E4",X"CD",X"3D",X"21",X"21",X"EE",X"E4",X"47",X"78",X"18",X"00", - X"BE",X"D0",X"77",X"3E",X"03",X"32",X"ED",X"E4",X"C9",X"21",X"EB",X"E4",X"7E",X"FD",X"BE",X"04", - X"30",X"15",X"CD",X"2A",X"20",X"CD",X"D8",X"1F",X"3A",X"EB",X"E4",X"CD",X"B6",X"20",X"CD",X"D8", - X"1F",X"21",X"EB",X"E4",X"34",X"18",X"E5",X"C9",X"FD",X"BE",X"05",X"C8",X"21",X"EB",X"E4",X"4E", - X"CD",X"3D",X"21",X"21",X"EE",X"E4",X"BE",X"D0",X"32",X"EE",X"E4",X"3E",X"01",X"32",X"ED",X"E4", - X"C9",X"21",X"EC",X"E4",X"FD",X"7E",X"04",X"BE",X"30",X"16",X"7E",X"CD",X"2A",X"20",X"CD",X"11", - X"20",X"3A",X"EC",X"E4",X"CD",X"B6",X"20",X"CD",X"11",X"20",X"21",X"EC",X"E4",X"35",X"18",X"E4", - X"C9",X"FD",X"BE",X"05",X"C8",X"21",X"EC",X"E4",X"4E",X"CD",X"3D",X"21",X"21",X"EE",X"E4",X"BE", - X"D0",X"32",X"EE",X"E4",X"3E",X"00",X"32",X"ED",X"E4",X"C9",X"47",X"FD",X"4E",X"05",X"79",X"FE", - X"1D",X"30",X"52",X"61",X"78",X"07",X"07",X"07",X"CB",X"3C",X"1F",X"6F",X"11",X"10",X"D0",X"19", - X"E5",X"11",X"80",X"01",X"19",X"D1",X"EB",X"1A",X"FE",X"04",X"28",X"3A",X"E6",X"F8",X"FE",X"08", - X"28",X"34",X"0C",X"1A",X"24",X"24",X"15",X"EB",X"E6",X"FC",X"FE",X"00",X"28",X"25",X"3A",X"44", - X"E4",X"B8",X"30",X"0D",X"2D",X"2D",X"2D",X"2D",X"1D",X"1D",X"1D",X"1D",X"CD",X"88",X"20",X"18", - X"12",X"20",X"05",X"CD",X"AD",X"20",X"18",X"0B",X"2C",X"2C",X"2C",X"2C",X"1C",X"1C",X"1C",X"1C", - X"CD",X"88",X"20",X"18",X"A9",X"C9",X"79",X"C9",X"7E",X"E6",X"FC",X"FE",X"18",X"28",X"1E",X"7E", - X"E6",X"F8",X"FE",X"08",X"C8",X"24",X"7E",X"E6",X"F8",X"FE",X"08",X"C8",X"1A",X"E6",X"F8",X"FE", - X"10",X"28",X"0A",X"1A",X"FE",X"04",X"28",X"05",X"E6",X"F8",X"FE",X"08",X"C0",X"21",X"45",X"E4", - X"79",X"BE",X"D8",X"F1",X"79",X"C9",X"47",X"FD",X"4E",X"05",X"79",X"FE",X"01",X"28",X"50",X"61", - X"78",X"07",X"07",X"07",X"CB",X"3C",X"1F",X"6F",X"11",X"10",X"D0",X"19",X"E5",X"11",X"80",X"01", - X"19",X"D1",X"EB",X"7E",X"E6",X"F8",X"FE",X"10",X"28",X"09",X"24",X"7E",X"25",X"E6",X"F8",X"FE", - X"10",X"79",X"C0",X"0D",X"15",X"15",X"24",X"EB",X"3A",X"44",X"E4",X"B8",X"30",X"0D",X"2D",X"2D", - X"2D",X"2D",X"1D",X"1D",X"1D",X"1D",X"CD",X"10",X"21",X"18",X"12",X"20",X"05",X"CD",X"35",X"21", - X"18",X"0B",X"2C",X"2C",X"2C",X"2C",X"1C",X"1C",X"1C",X"1C",X"CD",X"10",X"21",X"18",X"AB",X"C9", - X"7E",X"E6",X"FC",X"FE",X"18",X"28",X"1E",X"7E",X"E6",X"F8",X"FE",X"08",X"C8",X"24",X"7E",X"E6", - X"F8",X"FE",X"08",X"C8",X"1A",X"E6",X"F8",X"FE",X"10",X"28",X"0A",X"1A",X"FE",X"04",X"28",X"05", - X"E6",X"F8",X"FE",X"08",X"C0",X"3A",X"45",X"E4",X"B9",X"D8",X"F1",X"79",X"C9",X"47",X"78",X"18", - X"14",X"2A",X"44",X"E4",X"94",X"30",X"02",X"ED",X"44",X"87",X"87",X"87",X"47",X"79",X"95",X"30", - X"02",X"ED",X"44",X"80",X"C9",X"21",X"45",X"E4",X"BE",X"20",X"08",X"79",X"FD",X"96",X"04",X"D0", - X"ED",X"44",X"C9",X"78",X"96",X"30",X"05",X"ED",X"44",X"C6",X"64",X"C9",X"C6",X"C8",X"C9",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"21",X"0E",X"E5",X"7E",X"B7",X"28",X"02",X"35",X"C9",X"34",X"CD",X"BE",X"24",X"21",X"68",X"E5", - X"35",X"20",X"02",X"36",X"17",X"DD",X"21",X"18",X"E5",X"3E",X"14",X"32",X"88",X"E5",X"DD",X"7E", - X"00",X"B7",X"28",X"39",X"DD",X"35",X"00",X"20",X"06",X"DD",X"36",X"01",X"00",X"18",X"2E",X"DD", - X"7E",X"00",X"FE",X"10",X"20",X"04",X"DD",X"36",X"01",X"F4",X"30",X"21",X"FE",X"0F",X"20",X"12", - X"DD",X"7E",X"02",X"DD",X"6E",X"03",X"CD",X"00",X"2D",X"EB",X"CD",X"19",X"30",X"CD",X"69",X"24", - X"18",X"0B",X"CB",X"3F",X"CB",X"3F",X"47",X"3E",X"F7",X"90",X"DD",X"77",X"01",X"01",X"04",X"00", - X"DD",X"09",X"21",X"88",X"E5",X"35",X"20",X"B6",X"C9",X"3A",X"44",X"E4",X"DD",X"BE",X"02",X"20", - X"17",X"DD",X"7E",X"03",X"21",X"45",X"E4",X"96",X"38",X"0E",X"FE",X"03",X"30",X"0A",X"3E",X"00", - X"32",X"48",X"E4",X"AF",X"32",X"50",X"E4",X"C9",X"FD",X"21",X"58",X"E4",X"3A",X"E9",X"E4",X"32", - X"89",X"E5",X"FD",X"7E",X"04",X"DD",X"BE",X"02",X"20",X"18",X"DD",X"7E",X"03",X"FD",X"96",X"05", - X"38",X"10",X"FE",X"03",X"30",X"0C",X"FD",X"36",X"0C",X"FF",X"FD",X"36",X"09",X"2A",X"FD",X"36", - X"0E",X"3C",X"11",X"18",X"00",X"FD",X"19",X"21",X"89",X"E5",X"35",X"20",X"D5",X"C9",X"3A",X"E9", - X"E4",X"32",X"E8",X"E4",X"DD",X"21",X"58",X"E4",X"21",X"6D",X"E5",X"36",X"00",X"3A",X"02",X"E5", - X"B7",X"28",X"08",X"3A",X"E8",X"E4",X"FE",X"01",X"20",X"01",X"34",X"DD",X"7E",X"0E",X"B7",X"28", - X"5B",X"DD",X"35",X"09",X"20",X"25",X"3A",X"6D",X"E5",X"B7",X"28",X"0A",X"AF",X"32",X"02",X"E5", - X"21",X"E9",X"E4",X"35",X"18",X"15",X"DD",X"36",X"09",X"03",X"DD",X"7E",X"0A",X"FE",X"FF",X"20", - X"06",X"DD",X"36",X"0A",X"0C",X"18",X"04",X"DD",X"36",X"0A",X"FF",X"DD",X"35",X"0E",X"20",X"24", - X"FD",X"21",X"40",X"E4",X"FD",X"7E",X"04",X"DD",X"BE",X"04",X"20",X"10",X"FD",X"7E",X"05",X"FE", - X"01",X"38",X"09",X"FE",X"04",X"30",X"05",X"DD",X"34",X"0E",X"18",X"10",X"DD",X"36",X"0C",X"00", - X"DD",X"36",X"0A",X"0C",X"DD",X"7E",X"0E",X"FE",X"30",X"CC",X"48",X"25",X"11",X"18",X"00",X"DD", - X"19",X"21",X"E8",X"E4",X"35",X"20",X"81",X"C9",X"3A",X"6D",X"E5",X"B7",X"20",X"0D",X"3E",X"01", - X"32",X"FF",X"E4",X"01",X"00",X"01",X"CD",X"DB",X"2F",X"18",X"13",X"DD",X"7E",X"04",X"DD",X"6E", - X"05",X"CD",X"00",X"2D",X"15",X"15",X"1A",X"E6",X"FC",X"FE",X"60",X"CC",X"83",X"2F",X"3E",X"04", - X"CD",X"42",X"31",X"DD",X"7E",X"0D",X"B7",X"28",X"04",X"21",X"FC",X"E4",X"35",X"DD",X"36",X"0A", - X"FF",X"11",X"10",X"D1",X"3A",X"68",X"E5",X"87",X"87",X"6F",X"26",X"00",X"19",X"EB",X"06",X"F8", - X"0E",X"08",X"CD",X"71",X"2E",X"EB",X"20",X"0A",X"21",X"68",X"E5",X"35",X"20",X"02",X"36",X"17", - X"18",X"E2",X"3A",X"68",X"E5",X"DD",X"77",X"01",X"DD",X"77",X"04",X"87",X"87",X"87",X"DD",X"77", - X"07",X"AF",X"DD",X"77",X"00",X"DD",X"77",X"02",X"DD",X"77",X"0D",X"3C",X"DD",X"77",X"03",X"DD", - X"77",X"05",X"DD",X"36",X"06",X"08",X"21",X"68",X"E5",X"35",X"20",X"02",X"36",X"17",X"C9",X"3E", - X"01",X"32",X"A7",X"E5",X"21",X"22",X"D2",X"CD",X"A1",X"29",X"3E",X"0E",X"CD",X"3E",X"30",X"21", - X"DE",X"D3",X"11",X"E9",X"26",X"CD",X"2D",X"30",X"21",X"23",X"D2",X"16",X"CB",X"CD",X"DF",X"29", - X"3E",X"1C",X"CD",X"3E",X"30",X"21",X"23",X"D2",X"16",X"CC",X"CD",X"DF",X"29",X"3E",X"1C",X"CD", - X"3E",X"30",X"21",X"23",X"D2",X"16",X"CD",X"CD",X"DF",X"29",X"3E",X"1C",X"CD",X"3E",X"30",X"7A", - X"32",X"6B",X"E5",X"21",X"40",X"E4",X"11",X"41",X"E4",X"01",X"28",X"01",X"36",X"00",X"ED",X"B0", - X"3E",X"01",X"32",X"CD",X"E5",X"32",X"4B",X"E4",X"32",X"49",X"E4",X"3E",X"16",X"32",X"41",X"E4", - X"3E",X"0C",X"32",X"43",X"E4",X"3E",X"00",X"32",X"4A",X"E4",X"32",X"46",X"E4",X"3E",X"1E",X"32", - X"53",X"E4",X"16",X"18",X"1E",X"0C",X"3E",X"01",X"DD",X"21",X"58",X"E4",X"06",X"05",X"DD",X"77", - X"0B",X"DD",X"77",X"09",X"DD",X"72",X"01",X"DD",X"73",X"03",X"DD",X"36",X"0A",X"00",X"DD",X"36", - X"06",X"00",X"C5",X"01",X"18",X"00",X"DD",X"09",X"C1",X"14",X"10",X"E2",X"21",X"80",X"00",X"DB", - X"04",X"CB",X"47",X"20",X"02",X"2D",X"2D",X"22",X"E3",X"E5",X"CD",X"D7",X"63",X"3E",X"05",X"32", - X"E9",X"E4",X"3E",X"03",X"32",X"6A",X"E5",X"3E",X"01",X"32",X"9D",X"E5",X"3E",X"30",X"32",X"89", - X"E5",X"21",X"6B",X"E5",X"34",X"7E",X"FE",X"D0",X"38",X"02",X"36",X"CD",X"56",X"21",X"23",X"D2", - X"CD",X"DF",X"29",X"3E",X"08",X"CD",X"3E",X"30",X"21",X"89",X"E5",X"35",X"20",X"E3",X"3E",X"00", - X"32",X"9D",X"E5",X"3E",X"00",X"32",X"6A",X"E5",X"CD",X"00",X"65",X"3A",X"DE",X"E5",X"CD",X"00", - X"5C",X"06",X"03",X"21",X"DE",X"E5",X"7E",X"B7",X"28",X"05",X"36",X"00",X"04",X"18",X"01",X"34", - X"78",X"32",X"8E",X"E5",X"AF",X"32",X"B8",X"E5",X"32",X"8F",X"E5",X"67",X"6F",X"22",X"91",X"E5", - X"22",X"92",X"E5",X"CD",X"5E",X"5F",X"C3",X"97",X"5D",X"06",X"54",X"4D",X"00",X"3E",X"13",X"CD", - X"42",X"31",X"3E",X"01",X"32",X"A9",X"E5",X"CD",X"5E",X"5F",X"21",X"00",X"52",X"CD",X"51",X"64", - X"21",X"C0",X"D0",X"DD",X"21",X"BE",X"D0",X"0E",X"1F",X"06",X"18",X"7E",X"DD",X"77",X"00",X"2C", - X"7E",X"EE",X"20",X"DD",X"77",X"01",X"2C",X"DD",X"2B",X"DD",X"2B",X"10",X"EE",X"11",X"50",X"00", - X"19",X"11",X"B0",X"00",X"DD",X"19",X"0D",X"20",X"E0",X"21",X"24",X"E0",X"11",X"23",X"E0",X"0E", - X"1F",X"06",X"0C",X"7E",X"07",X"07",X"07",X"07",X"12",X"23",X"1B",X"10",X"F6",X"C5",X"01",X"0C", - X"00",X"09",X"EB",X"01",X"24",X"00",X"09",X"EB",X"C1",X"0D",X"20",X"E5",X"FD",X"21",X"39",X"54", - X"CD",X"F0",X"29",X"3E",X"14",X"CD",X"42",X"31",X"3E",X"01",X"32",X"A6",X"E5",X"CD",X"43",X"5F", - X"3E",X"24",X"CD",X"42",X"31",X"21",X"40",X"E4",X"11",X"41",X"E4",X"01",X"28",X"01",X"36",X"00", - X"ED",X"B0",X"21",X"CD",X"E5",X"34",X"3E",X"01",X"32",X"4B",X"E4",X"32",X"49",X"E4",X"3E",X"06", - X"32",X"44",X"E4",X"3E",X"10",X"32",X"41",X"E4",X"3E",X"1D",X"32",X"43",X"E4",X"3E",X"00",X"32", - X"4A",X"E4",X"32",X"46",X"E4",X"16",X"12",X"1E",X"1F",X"3E",X"01",X"0E",X"05",X"DD",X"21",X"58", - X"E4",X"06",X"04",X"DD",X"77",X"0B",X"DD",X"77",X"09",X"DD",X"71",X"04",X"DD",X"72",X"01",X"DD", - X"73",X"03",X"DD",X"36",X"0A",X"00",X"DD",X"36",X"06",X"00",X"C5",X"01",X"18",X"00",X"DD",X"09", - X"C1",X"14",X"1C",X"10",X"DE",X"CD",X"D7",X"63",X"3E",X"04",X"32",X"E9",X"E4",X"3E",X"02",X"32", - X"6A",X"E5",X"3E",X"01",X"32",X"9D",X"E5",X"3E",X"A8",X"CD",X"3E",X"30",X"3E",X"03",X"CD",X"42", - X"31",X"0E",X"30",X"DD",X"21",X"00",X"E3",X"06",X"0B",X"DD",X"34",X"06",X"DD",X"35",X"0E",X"11", - X"10",X"00",X"DD",X"19",X"10",X"F3",X"3E",X"01",X"CD",X"3E",X"30",X"0D",X"20",X"E5",X"21",X"B6", - X"D5",X"CD",X"9A",X"31",X"21",X"B8",X"D6",X"CD",X"85",X"31",X"21",X"3C",X"D8",X"11",X"2D",X"28", - X"CD",X"2D",X"30",X"3E",X"70",X"CD",X"3E",X"30",X"3E",X"00",X"32",X"9D",X"E5",X"3E",X"00",X"32", - X"6A",X"E5",X"3E",X"13",X"CD",X"42",X"31",X"CD",X"5E",X"5F",X"C3",X"97",X"5D",X"06",X"52",X"45", - X"41",X"44",X"59",X"00",X"3E",X"13",X"CD",X"42",X"31",X"3E",X"01",X"32",X"A9",X"E5",X"CD",X"5E", - X"5F",X"21",X"00",X"E3",X"11",X"01",X"E3",X"01",X"68",X"02",X"36",X"00",X"ED",X"B0",X"21",X"00", - X"E0",X"11",X"01",X"E0",X"01",X"9F",X"02",X"36",X"00",X"ED",X"B0",X"23",X"13",X"01",X"5F",X"00", - X"36",X"01",X"ED",X"B0",X"3E",X"0A",X"32",X"D8",X"E5",X"3E",X"00",X"32",X"A6",X"E5",X"3E",X"14", - X"CD",X"42",X"31",X"CD",X"43",X"5F",X"3E",X"27",X"CD",X"42",X"31",X"06",X"00",X"0E",X"47",X"11", - X"EF",X"28",X"3E",X"01",X"CD",X"3E",X"30",X"3E",X"2E",X"80",X"47",X"30",X"F5",X"1A",X"FE",X"01", - X"20",X"07",X"13",X"1A",X"6F",X"13",X"1A",X"67",X"13",X"1A",X"77",X"FE",X"20",X"28",X"2E",X"3E", - X"17",X"CD",X"42",X"31",X"1A",X"FE",X"32",X"20",X"24",X"AF",X"32",X"CD",X"E5",X"32",X"57",X"E4", - X"3E",X"0B",X"32",X"41",X"E4",X"3E",X"0C",X"32",X"53",X"E4",X"32",X"4A",X"E4",X"3E",X"01",X"32", - X"4B",X"E4",X"32",X"49",X"E4",X"32",X"6A",X"E5",X"3E",X"01",X"32",X"9D",X"E5",X"13",X"23",X"71", - X"23",X"1A",X"B7",X"20",X"AD",X"3E",X"FF",X"CD",X"3E",X"30",X"3E",X"00",X"32",X"9D",X"E5",X"3E", - X"00",X"32",X"6A",X"E5",X"3E",X"13",X"CD",X"42",X"31",X"CD",X"5E",X"5F",X"C3",X"FA",X"26",X"01", - X"30",X"D3",X"43",X"4F",X"4E",X"47",X"52",X"41",X"54",X"55",X"4C",X"41",X"54",X"49",X"4F",X"4E", - X"53",X"21",X"20",X"20",X"20",X"20",X"01",X"1E",X"D5",X"59",X"4F",X"55",X"20",X"20",X"48",X"41", - X"56",X"45",X"20",X"20",X"44",X"4F",X"4E",X"45",X"20",X"20",X"49",X"54",X"20",X"20",X"56",X"45", - X"52",X"59",X"20",X"20",X"57",X"45",X"4C",X"4C",X"2C",X"20",X"20",X"01",X"A8",X"D6",X"48",X"41", - X"56",X"49",X"4E",X"47",X"20",X"20",X"50",X"41",X"53",X"53",X"45",X"44",X"20",X"20",X"54",X"48", - X"52",X"4F",X"55",X"47",X"48",X"20",X"20",X"01",X"2A",X"D8",X"32",X"34",X"20",X"20",X"44",X"41", - X"4E",X"47",X"45",X"52",X"4F",X"55",X"53",X"20",X"20",X"50",X"4C",X"41",X"43",X"45",X"53",X"2E", - X"20",X"20",X"20",X"20",X"01",X"A0",X"D9",X"42",X"55",X"54",X"20",X"20",X"54",X"48",X"45",X"52", - X"45",X"20",X"20",X"41",X"52",X"45",X"20",X"20",X"53",X"54",X"49",X"4C",X"4C",X"20",X"20",X"4F", - X"54",X"48",X"45",X"52",X"20",X"20",X"01",X"28",X"DB",X"45",X"4E",X"45",X"4D",X"49",X"45",X"53", - X"20",X"20",X"4F",X"4E",X"20",X"20",X"59",X"4F",X"55",X"52",X"20",X"20",X"57",X"41",X"59",X"2E", - X"00",X"16",X"88",X"1E",X"04",X"06",X"1E",X"72",X"2C",X"2C",X"14",X"14",X"14",X"14",X"10",X"F7", - X"7A",X"C6",X"89",X"57",X"01",X"44",X"00",X"09",X"1D",X"20",X"EA",X"C9",X"1E",X"04",X"7E",X"E6", - X"F0",X"47",X"7A",X"E6",X"0F",X"B0",X"77",X"23",X"06",X"0E",X"72",X"23",X"10",X"FC",X"7E",X"E6", - X"0F",X"47",X"7A",X"E6",X"F0",X"B0",X"77",X"01",X"09",X"00",X"09",X"1D",X"20",X"E0",X"C9",X"1E", - X"04",X"06",X"1E",X"72",X"2C",X"2C",X"10",X"FB",X"01",X"44",X"00",X"09",X"1D",X"20",X"F2",X"C9", - X"DD",X"21",X"00",X"E3",X"FD",X"7E",X"00",X"B7",X"C8",X"DD",X"77",X"04",X"DD",X"77",X"0C",X"FD", - X"7E",X"01",X"47",X"E6",X"1F",X"DD",X"77",X"00",X"DD",X"77",X"08",X"78",X"E6",X"C0",X"DD",X"77", - X"05",X"EE",X"40",X"DD",X"77",X"0D",X"FD",X"5E",X"02",X"16",X"00",X"2A",X"E3",X"E5",X"19",X"DD", - X"75",X"02",X"DD",X"75",X"0A",X"DD",X"74",X"03",X"DD",X"74",X"0B",X"FD",X"5E",X"03",X"DD",X"73", - X"06",X"DD",X"36",X"07",X"01",X"3E",X"F0",X"93",X"DD",X"77",X"0E",X"DD",X"36",X"0F",X"00",X"11", - X"04",X"00",X"FD",X"19",X"11",X"10",X"00",X"DD",X"19",X"18",X"A9",X"3A",X"6A",X"E5",X"FE",X"01", - X"20",X"05",X"CD",X"5B",X"2A",X"18",X"03",X"CD",X"D4",X"2A",X"C9",X"3A",X"53",X"E4",X"FE",X"0C", - X"20",X"2E",X"11",X"15",X"00",X"2A",X"42",X"E4",X"19",X"22",X"42",X"E4",X"7C",X"2A",X"57",X"E4", - X"26",X"00",X"01",X"9B",X"2B",X"09",X"BE",X"20",X"15",X"23",X"7E",X"32",X"4B",X"E4",X"3E",X"00", - X"32",X"53",X"E4",X"32",X"4A",X"E4",X"3A",X"57",X"E4",X"C6",X"02",X"32",X"57",X"E4",X"18",X"43", - X"3A",X"4B",X"E4",X"FE",X"01",X"20",X"05",X"11",X"F2",X"FF",X"18",X"03",X"11",X"0E",X"00",X"2A", - X"40",X"E4",X"19",X"22",X"40",X"E4",X"7C",X"2A",X"57",X"E4",X"26",X"00",X"01",X"9B",X"2B",X"09", - X"BE",X"20",X"15",X"23",X"7E",X"32",X"4B",X"E4",X"3E",X"0C",X"32",X"53",X"E4",X"32",X"4A",X"E4", - X"3A",X"57",X"E4",X"C6",X"02",X"32",X"57",X"E4",X"3A",X"53",X"E4",X"FE",X"0C",X"28",X"04",X"47", - X"CD",X"F1",X"10",X"C9",X"3A",X"6A",X"E5",X"FE",X"02",X"20",X"65",X"DD",X"21",X"40",X"E4",X"0E", - X"05",X"DD",X"7E",X"0B",X"FE",X"01",X"20",X"1C",X"11",X"F4",X"FF",X"DD",X"6E",X"00",X"DD",X"66", - X"01",X"19",X"DD",X"75",X"00",X"DD",X"74",X"01",X"7C",X"DD",X"BE",X"04",X"20",X"04",X"DD",X"36", - X"0B",X"00",X"18",X"10",X"11",X"0C",X"00",X"DD",X"6E",X"00",X"DD",X"66",X"01",X"19",X"DD",X"75", - X"00",X"DD",X"74",X"01",X"11",X"F9",X"FF",X"DD",X"6E",X"02",X"DD",X"66",X"03",X"19",X"DD",X"75", - X"02",X"DD",X"74",X"03",X"C5",X"DD",X"46",X"06",X"79",X"FE",X"05",X"20",X"05",X"CD",X"F1",X"10", - X"18",X"03",X"CD",X"2E",X"1A",X"C1",X"11",X"18",X"00",X"DD",X"19",X"0D",X"20",X"A3",X"18",X"5A", - X"3A",X"6A",X"E5",X"FE",X"03",X"20",X"53",X"DD",X"21",X"40",X"E4",X"0E",X"06",X"11",X"EC",X"FF", - X"DD",X"6E",X"00",X"DD",X"66",X"01",X"19",X"DD",X"75",X"00",X"DD",X"74",X"01",X"7C",X"FE",X"FE", - X"20",X"04",X"DD",X"36",X"0A",X"FF",X"C5",X"DD",X"46",X"06",X"79",X"FE",X"06",X"20",X"05",X"CD", - X"F1",X"10",X"18",X"03",X"CD",X"2E",X"1A",X"C1",X"11",X"18",X"00",X"DD",X"19",X"0D",X"20",X"CD", - X"3A",X"53",X"E4",X"3C",X"32",X"53",X"E4",X"FE",X"24",X"20",X"0F",X"3E",X"00",X"32",X"53",X"E4", - X"3A",X"57",X"E4",X"3C",X"32",X"57",X"E4",X"CD",X"9D",X"65",X"C9",X"03",X"01",X"06",X"00",X"07", - X"00",X"08",X"00",X"0A",X"00",X"09",X"00",X"0D",X"00",X"0D",X"00",X"10",X"00",X"0F",X"00",X"13", - X"00",X"11",X"00",X"19",X"00",X"32",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"65",X"07",X"07",X"07",X"CB",X"3C",X"1F",X"6F",X"11",X"10",X"D0",X"19",X"E5",X"11",X"80",X"01", - X"19",X"D1",X"EB",X"7E",X"C9",X"67",X"FD",X"21",X"58",X"E4",X"11",X"18",X"00",X"3A",X"E9",X"E4", - X"47",X"FD",X"7E",X"06",X"94",X"FE",X"12",X"30",X"6D",X"FE",X"08",X"38",X"69",X"FD",X"7E",X"07", - X"95",X"30",X"02",X"ED",X"44",X"FE",X"06",X"30",X"5D",X"FD",X"7E",X"0C",X"B7",X"20",X"28",X"FD", - X"7E",X"16",X"B7",X"20",X"22",X"3A",X"4F",X"E4",X"B7",X"28",X"15",X"FD",X"7E",X"0F",X"FE",X"FF", - X"28",X"0E",X"21",X"52",X"E4",X"7E",X"B7",X"20",X"07",X"36",X"01",X"3E",X"0B",X"CD",X"73",X"30", - X"3E",X"06",X"32",X"09",X"E5",X"18",X"2D",X"21",X"0B",X"E5",X"3A",X"44",X"E4",X"BE",X"28",X"24", - X"7F",X"77",X"21",X"0A",X"E5",X"3A",X"4B",X"E4",X"BE",X"20",X"10",X"21",X"0C",X"E5",X"34",X"7E", - X"FE",X"03",X"38",X"05",X"3E",X"13",X"32",X"06",X"E5",X"18",X"09",X"3A",X"4B",X"E4",X"77",X"3E", - X"01",X"32",X"0C",X"E5",X"37",X"C9",X"11",X"18",X"00",X"FD",X"19",X"10",X"84",X"C9",X"C6",X"13", - X"18",X"00",X"67",X"DD",X"E5",X"C1",X"FD",X"21",X"58",X"E4",X"3A",X"E9",X"E4",X"47",X"FD",X"E5", - X"D1",X"7B",X"B9",X"28",X"32",X"FD",X"7E",X"0E",X"B7",X"20",X"2C",X"FD",X"7E",X"06",X"BC",X"30", - X"26",X"C6",X"12",X"BC",X"38",X"21",X"FD",X"7E",X"07",X"95",X"30",X"02",X"ED",X"44",X"FE",X"06", - X"30",X"15",X"DD",X"7E",X"0F",X"FD",X"BE",X"0F",X"20",X"04",X"37",X"C9",X"18",X"09",X"AF",X"FD", - X"96",X"0C",X"D8",X"DD",X"96",X"0C",X"D8",X"11",X"18",X"00",X"FD",X"19",X"10",X"C0",X"C9",X"67", - X"DD",X"E5",X"C1",X"FD",X"21",X"58",X"E4",X"3A",X"E9",X"E4",X"47",X"FD",X"E5",X"D1",X"7B",X"91", - X"5F",X"28",X"26",X"FD",X"7E",X"0E",X"B7",X"20",X"20",X"FD",X"7E",X"07",X"C6",X"07",X"BC",X"38", - X"18",X"D6",X"08",X"BC",X"30",X"13",X"3C",X"BC",X"20",X"04",X"CB",X"7B",X"20",X"0B",X"FD",X"7E", - X"06",X"95",X"30",X"02",X"ED",X"44",X"FE",X"0F",X"D8",X"11",X"18",X"00",X"FD",X"19",X"10",X"CB", - X"C9",X"C6",X"08",X"67",X"DD",X"E5",X"C1",X"FD",X"21",X"58",X"E4",X"3A",X"E9",X"E4",X"47",X"FD", - X"E5",X"D1",X"7B",X"91",X"5F",X"28",X"22",X"FD",X"7E",X"0E",X"B7",X"20",X"1C",X"FD",X"7E",X"07", - X"BC",X"30",X"16",X"C6",X"08",X"BC",X"38",X"11",X"20",X"04",X"CB",X"7B",X"20",X"0B",X"FD",X"7E", - X"06",X"95",X"30",X"02",X"ED",X"44",X"FE",X"0F",X"D8",X"11",X"18",X"00",X"FD",X"19",X"10",X"CF", - X"C9",X"1A",X"A0",X"B9",X"C8",X"E5",X"21",X"80",X"00",X"19",X"7E",X"E1",X"A0",X"B9",X"C9",X"1A", - X"A0",X"B9",X"C0",X"E5",X"21",X"80",X"00",X"19",X"7E",X"E1",X"A0",X"B9",X"C9",X"7E",X"A0",X"B9", - X"C8",X"24",X"7E",X"25",X"A0",X"B9",X"C9",X"7E",X"A0",X"B9",X"C0",X"24",X"7E",X"25",X"A0",X"B9", - X"C9",X"7E",X"B9",X"C8",X"24",X"7E",X"25",X"B9",X"C9",X"1A",X"B9",X"C0",X"E5",X"21",X"80",X"00", - X"19",X"7E",X"E1",X"B9",X"C9",X"C6",X"05",X"18",X"00",X"4F",X"3A",X"47",X"E4",X"B9",X"D0",X"C6", - X"04",X"B9",X"D8",X"3A",X"46",X"E4",X"95",X"30",X"02",X"ED",X"44",X"FE",X"0A",X"D0",X"AF",X"32", - X"50",X"E4",X"C9",X"4F",X"3A",X"46",X"E4",X"C6",X"0E",X"B9",X"D8",X"D6",X"1D",X"30",X"01",X"AF", - X"B9",X"D0",X"3A",X"47",X"E4",X"95",X"30",X"02",X"ED",X"44",X"FE",X"03",X"D0",X"AF",X"32",X"50", - X"E4",X"C9",X"4F",X"3A",X"46",X"E4",X"91",X"30",X"02",X"ED",X"44",X"FE",X"0E",X"D0",X"3A",X"47", - X"E4",X"95",X"30",X"02",X"ED",X"44",X"FE",X"03",X"D0",X"AF",X"32",X"50",X"E4",X"C9",X"EB",X"7E", - X"C6",X"70",X"77",X"2C",X"36",X"0A",X"2C",X"7E",X"C6",X"74",X"77",X"2C",X"36",X"0A",X"01",X"80", - X"00",X"09",X"36",X"0A",X"2D",X"7E",X"C6",X"7C",X"77",X"2D",X"36",X"0A",X"2D",X"7E",X"C6",X"78", - X"77",X"ED",X"42",X"EB",X"C9",X"EB",X"7E",X"C6",X"60",X"77",X"2C",X"36",X"0A",X"2C",X"7E",X"C6", - X"64",X"77",X"2C",X"36",X"0A",X"01",X"80",X"00",X"09",X"36",X"0A",X"2D",X"7E",X"C6",X"6C",X"77", - X"2D",X"36",X"0A",X"2D",X"7E",X"C6",X"68",X"77",X"ED",X"42",X"EB",X"C9",X"EB",X"7E",X"D6",X"70", - X"77",X"2C",X"36",X"05",X"2C",X"7E",X"D6",X"74",X"77",X"2C",X"36",X"05",X"01",X"80",X"00",X"09", - X"36",X"05",X"2D",X"7E",X"D6",X"7C",X"77",X"2D",X"36",X"05",X"2D",X"7E",X"D6",X"78",X"77",X"ED", - X"42",X"EB",X"C9",X"EB",X"7E",X"D6",X"60",X"77",X"2C",X"36",X"05",X"2C",X"7E",X"D6",X"64",X"77", - X"2C",X"36",X"05",X"01",X"80",X"00",X"09",X"36",X"05",X"2D",X"7E",X"D6",X"6C",X"77",X"2D",X"36", - X"05",X"2D",X"7E",X"D6",X"68",X"77",X"ED",X"42",X"EB",X"C9",X"D5",X"07",X"07",X"07",X"CB",X"3C", - X"1F",X"6F",X"11",X"10",X"D0",X"19",X"EB",X"C5",X"CD",X"0E",X"2F",X"C1",X"D1",X"C9",X"EB",X"77", - X"23",X"23",X"77",X"01",X"80",X"00",X"09",X"77",X"2B",X"2B",X"77",X"ED",X"42",X"EB",X"C9",X"21", - X"91",X"E5",X"7E",X"47",X"81",X"27",X"77",X"38",X"36",X"18",X"17",X"21",X"93",X"E5",X"7E",X"81", - X"27",X"77",X"2B",X"7E",X"88",X"27",X"77",X"2B",X"7E",X"47",X"CE",X"00",X"27",X"77",X"38",X"1F", - X"B8",X"C8",X"4F",X"78",X"C6",X"01",X"27",X"47",X"C5",X"FE",X"05",X"20",X"0C",X"21",X"8F",X"E5", - X"34",X"3E",X"12",X"CD",X"42",X"31",X"CD",X"F7",X"31",X"C1",X"78",X"B9",X"38",X"E5",X"C9",X"21", - X"99",X"99",X"22",X"91",X"E5",X"22",X"92",X"E5",X"C9",X"D5",X"EB",X"3A",X"D8",X"E5",X"77",X"2C", - X"2C",X"77",X"01",X"80",X"00",X"09",X"77",X"2D",X"2D",X"77",X"EB",X"D1",X"C9",X"1A",X"B7",X"C8", - X"FE",X"20",X"30",X"03",X"4F",X"18",X"04",X"77",X"2C",X"71",X"2C",X"13",X"18",X"EF",X"32",X"B5", - X"E5",X"3A",X"B5",X"E5",X"A7",X"20",X"FA",X"C9",X"06",X"00",X"D6",X"0A",X"04",X"30",X"FB",X"C6", - X"0A",X"05",X"F5",X"78",X"CD",X"58",X"30",X"F1",X"C6",X"30",X"77",X"23",X"71",X"23",X"C9",X"1A", - X"F5",X"0F",X"0F",X"0F",X"0F",X"CD",X"6A",X"30",X"F1",X"13",X"E6",X"0F",X"C6",X"30",X"77",X"23", - X"71",X"23",X"C9",X"4F",X"06",X"00",X"21",X"28",X"31",X"09",X"56",X"21",X"FE",X"E4",X"5E",X"34", - X"7A",X"32",X"88",X"E5",X"B7",X"28",X"09",X"34",X"7B",X"FE",X"07",X"20",X"03",X"1E",X"00",X"34", - X"CB",X"9E",X"7B",X"32",X"89",X"E5",X"87",X"87",X"87",X"FD",X"21",X"C0",X"E3",X"5F",X"16",X"00", - X"FD",X"19",X"FD",X"36",X"00",X"11",X"FD",X"36",X"08",X"11",X"16",X"15",X"79",X"FE",X"0B",X"38", - X"02",X"16",X"03",X"3A",X"46",X"E4",X"82",X"ED",X"44",X"5F",X"16",X"00",X"2A",X"E3",X"E5",X"19", - X"FD",X"75",X"02",X"FD",X"74",X"03",X"1E",X"00",X"3A",X"88",X"E5",X"B7",X"28",X"0A",X"1C",X"FD", - X"77",X"0C",X"FD",X"75",X"0A",X"FD",X"74",X"0B",X"21",X"1B",X"31",X"09",X"7E",X"FD",X"77",X"04", - X"21",X"35",X"31",X"09",X"46",X"0E",X"00",X"CD",X"DB",X"2F",X"3A",X"47",X"E4",X"C6",X"20",X"6F", - X"26",X"00",X"29",X"FD",X"75",X"06",X"FD",X"74",X"07",X"CB",X"43",X"28",X"0A",X"01",X"F0",X"FF", - X"09",X"FD",X"75",X"0E",X"FD",X"74",X"0F",X"3A",X"89",X"E5",X"4F",X"06",X"00",X"21",X"9E",X"E5", - X"09",X"36",X"70",X"CB",X"43",X"28",X"03",X"23",X"36",X"70",X"C9",X"F8",X"F9",X"FB",X"FC",X"FA", - X"FD",X"FA",X"FD",X"E1",X"E1",X"E1",X"E1",X"E1",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"FF", - X"F0",X"AA",X"AB",X"F1",X"F0",X"02",X"04",X"06",X"08",X"05",X"10",X"15",X"20",X"30",X"50",X"80", - X"10",X"30",X"D5",X"57",X"FE",X"12",X"28",X"08",X"3A",X"A7",X"E5",X"B7",X"28",X"02",X"D1",X"C9", - X"7A",X"E5",X"21",X"BB",X"E5",X"5E",X"16",X"00",X"21",X"BC",X"E5",X"19",X"57",X"1C",X"7B",X"E6", - X"0F",X"32",X"BB",X"E5",X"72",X"E1",X"D1",X"C9",X"3A",X"BA",X"E5",X"21",X"BB",X"E5",X"BE",X"C8", - X"5F",X"16",X"00",X"21",X"BC",X"E5",X"19",X"3C",X"E6",X"0F",X"32",X"BA",X"E5",X"7E",X"D3",X"00", - X"F6",X"80",X"D3",X"00",X"C9",X"11",X"92",X"31",X"CD",X"2D",X"30",X"3A",X"8E",X"E5",X"CD",X"48", - X"30",X"C9",X"06",X"52",X"4F",X"55",X"4E",X"44",X"2D",X"00",X"3A",X"8E",X"E5",X"3D",X"CD",X"EC", - X"31",X"79",X"3C",X"32",X"CC",X"E5",X"0E",X"06",X"FE",X"0A",X"38",X"05",X"CD",X"48",X"30",X"18", - X"05",X"2C",X"2C",X"CD",X"6A",X"30",X"3A",X"CC",X"E5",X"FE",X"04",X"38",X"01",X"AF",X"87",X"87", - X"5F",X"16",X"00",X"E5",X"21",X"D4",X"31",X"19",X"EB",X"E1",X"CD",X"2D",X"30",X"11",X"E4",X"31", - X"CD",X"2D",X"30",X"C9",X"06",X"54",X"48",X"00",X"06",X"53",X"54",X"00",X"06",X"4E",X"44",X"00", - X"06",X"52",X"44",X"00",X"06",X"20",X"42",X"4C",X"4F",X"43",X"4B",X"00",X"0E",X"00",X"0C",X"D6", - X"03",X"30",X"FB",X"0D",X"C6",X"03",X"C9",X"0E",X"1E",X"21",X"56",X"D0",X"3A",X"8F",X"E5",X"CD", - X"6A",X"30",X"C9",X"21",X"26",X"D0",X"11",X"8A",X"E5",X"0E",X"1E",X"1A",X"E6",X"0F",X"CD",X"6A", - X"30",X"13",X"CD",X"5F",X"30",X"1A",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"CD",X"6A",X"30",X"0E", - X"04",X"21",X"18",X"D0",X"3A",X"B8",X"E5",X"B7",X"28",X"03",X"21",X"60",X"D0",X"3A",X"AD",X"E6", - X"B7",X"28",X"26",X"E5",X"21",X"B6",X"E5",X"7E",X"B7",X"20",X"06",X"36",X"16",X"21",X"AD",X"E6", - X"35",X"3A",X"AD",X"E6",X"E1",X"1F",X"30",X"0C",X"36",X"00",X"54",X"5D",X"13",X"01",X"0B",X"00", - X"ED",X"B0",X"18",X"03",X"CD",X"82",X"32",X"18",X"03",X"CD",X"82",X"32",X"11",X"9A",X"E5",X"21", - X"91",X"E5",X"06",X"03",X"1A",X"BE",X"13",X"23",X"20",X"02",X"10",X"F8",X"D0",X"3A",X"A7",X"E5", - X"B7",X"C0",X"01",X"03",X"00",X"11",X"9A",X"E5",X"21",X"91",X"E5",X"ED",X"B0",X"0E",X"06",X"21", - X"38",X"D0",X"11",X"91",X"E5",X"06",X"03",X"CD",X"5F",X"30",X"10",X"FB",X"C9",X"11",X"B8",X"E6", - X"21",X"20",X"D7",X"01",X"40",X"00",X"ED",X"B0",X"21",X"A0",X"D7",X"01",X"40",X"00",X"ED",X"B0", - X"21",X"20",X"D8",X"01",X"40",X"00",X"ED",X"B0",X"21",X"B8",X"D8",X"01",X"0E",X"00",X"ED",X"B0", - X"21",X"38",X"D9",X"01",X"0E",X"00",X"ED",X"B0",X"C9",X"21",X"B8",X"E6",X"11",X"20",X"D7",X"01", - X"40",X"00",X"ED",X"B0",X"11",X"A0",X"D7",X"01",X"40",X"00",X"ED",X"B0",X"11",X"20",X"D8",X"01", - X"40",X"00",X"ED",X"B0",X"11",X"B8",X"D8",X"01",X"0E",X"00",X"ED",X"B0",X"11",X"38",X"D9",X"01", - X"0E",X"00",X"ED",X"B0",X"C9",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"00",X"00",X"32",X"34",X"01",X"35",X"72",X"35",X"4B",X"3C",X"62",X"36",X"CE",X"36",X"45",X"37", - X"89",X"34",X"CA",X"3C",X"A8",X"3B",X"04",X"3E",X"E2",X"35",X"59",X"3D",X"8C",X"3F",X"9B",X"39", - X"A9",X"3E",X"F9",X"38",X"CC",X"3A",X"1E",X"3F",X"2F",X"3A",X"C5",X"37",X"71",X"38",X"7D",X"40", - X"F7",X"3F",X"00",X"01",X"AE",X"E5",X"A4",X"EB",X"A9",X"CF",X"F7",X"A9",X"8D",X"CA",X"AE",X"CA", - X"F7",X"B3",X"F1",X"B9",X"C5",X"E8",X"D2",X"F7",X"BE",X"F7",X"03",X"84",X"8D",X"C5",X"8E",X"92", - X"C2",X"89",X"8D",X"D5",X"CB",X"8E",X"98",X"D2",X"99",X"9D",X"C4",X"D7",X"93",X"98",X"C7",X"04", - X"A6",X"C6",X"EE",X"04",X"B6",X"C8",X"F1",X"04",X"06",X"81",X"88",X"CF",X"07",X"A2",X"C3",X"A7", - X"D3",X"AC",X"D1",X"B7",X"C6",X"D5",X"BC",X"CF",X"0A",X"A4",X"CB",X"A9",X"CA",X"BE",X"C0",X"09", - X"BB",X"CC",X"08",X"AB",X"C3",X"D3",X"B0",X"CC",X"1F",X"00",X"01",X"A4",X"C2",X"A9",X"C1",X"E3", - X"A5",X"CA",X"F1",X"A7",X"D3",X"F6",X"AC",X"CF",X"F6",X"B0",X"95",X"C1",X"E3",X"B4",X"D3",X"F7", - X"B0",X"C6",X"E7",X"CA",X"ED",X"B9",X"EC",X"D4",X"F7",X"BE",X"F7",X"02",X"A4",X"C1",X"C3",X"90", - X"98",X"C0",X"C4",X"B0",X"C5",X"C8",X"04",X"A9",X"C5",X"ED",X"B6",X"CD",X"F1",X"03",X"84",X"8F", - X"C0",X"C4",X"85",X"8B",X"D2",X"8C",X"91",X"CE",X"87",X"93",X"D7",X"85",X"98",X"C9",X"94",X"98", - X"D5",X"94",X"9D",X"D2",X"99",X"9D",X"C7",X"06",X"A1",X"86",X"D7",X"07",X"A2",X"C2",X"A3",X"CF", - X"A5",X"D4",X"A7",X"C1",X"AB",X"C2",X"AE",X"C6",X"CB",X"B7",X"C1",X"C5",X"D7",X"BC",X"C0",X"D7", - X"09",X"BB",X"CA",X"08",X"A6",X"C3",X"A9",X"D1",X"AD",X"C3",X"0A",X"B9",X"D4",X"BE",X"C0",X"D7", - X"1F",X"00",X"01",X"A5",X"CA",X"F2",X"A6",X"E3",X"A8",X"D4",X"F7",X"AB",X"C5",X"F3",X"AF",X"E4", - X"B0",X"CA",X"F1",X"B3",X"D7",X"B5",X"CC",X"F3",X"B7",X"CC",X"D3",X"B9",X"EC",X"D3",X"F7",X"BA", - X"9D",X"CF",X"F0",X"BE",X"F7",X"04",X"AE",X"D4",X"AF",X"D5",X"B0",X"D6",X"B2",X"C4",X"E8",X"03", - X"99",X"9D",X"C2",X"D6",X"9A",X"9D",X"CE",X"D1",X"95",X"98",X"CB",X"D4",X"90",X"94",X"C9",X"CF", - X"8F",X"98",X"C3",X"8B",X"8F",X"CC",X"D1",X"86",X"8E",X"C4",X"85",X"8A",X"C9",X"D3",X"06",X"A1", - X"87",X"D7",X"07",X"A3",X"CE",X"A4",X"C2",X"A9",X"CF",X"AD",X"C1",X"B1",X"D7",X"B8",X"D0",X"BC", - X"D4",X"08",X"A8",X"C6",X"AD",X"CE",X"B2",X"D2",X"09",X"B6",X"C9",X"0A",X"B3",X"D7",X"BE",X"C0", - X"D7",X"1F",X"00",X"01",X"A4",X"C0",X"D0",X"F7",X"A6",X"E1",X"CF",X"F0",X"A8",X"C1",X"C2",X"CE", - X"CF",X"A9",X"D2",X"F6",X"AA",X"C2",X"C3",X"CD",X"CE",X"AC",X"C3",X"C4",X"CC",X"CD",X"AE",X"C3", - X"E5",X"CB",X"ED",X"AF",X"E5",X"CB",X"F7",X"B0",X"C6",X"CA",X"B2",X"C6",X"EA",X"B4",X"C1",X"E3", - X"CD",X"F3",X"B9",X"C5",X"F7",X"BE",X"F7",X"03",X"A4",X"8E",X"D3",X"AF",X"93",X"C2",X"AF",X"95", - X"CE",X"B2",X"95",X"C8",X"B4",X"9A",X"C4",X"D1",X"B4",X"9D",X"C0",X"B9",X"9D",X"CB",X"D5",X"06", - X"A1",X"91",X"C8",X"07",X"A2",X"D1",X"A7",X"D6",X"AC",X"CB",X"AD",X"C0",X"B2",X"C3",X"D3",X"B7", - X"C8",X"08",X"AC",X"C1",X"B1",X"C4",X"B6",X"CE",X"09",X"BB",X"CE",X"0A",X"A9",X"D2",X"D6",X"BE", - X"D7",X"1F",X"01",X"01",X"A6",X"98",X"C9",X"CE",X"A8",X"9A",X"C1",X"C4",X"D3",X"D6",X"A8",X"C2", - X"C3",X"D4",X"D5",X"AF",X"C2",X"C3",X"D4",X"D5",X"B2",X"CB",X"CC",X"B9",X"C1",X"E5",X"C9",X"CA", - X"CD",X"CE",X"D2",X"F6",X"BB",X"9D",X"C6",X"D1",X"BE",X"F7",X"02",X"B9",X"CB",X"CC",X"04",X"A8", - X"C6",X"C7",X"D0",X"D1",X"B3",X"C6",X"E8",X"CF",X"F1",X"03",X"A6",X"8A",X"C8",X"CF",X"A8",X"94", - X"C5",X"D2",X"B2",X"98",X"CA",X"CD",X"B6",X"9D",X"C8",X"CF",X"A8",X"9D",X"C0",X"D7",X"06",X"A1", - X"91",X"CA",X"CD",X"07",X"A6",X"C2",X"D5",X"AD",X"C3",X"D4",X"B7",X"C2",X"CB",X"D5",X"08",X"A5", - X"C4",X"D3",X"B6",X"CC",X"BB",X"C7",X"09",X"BB",X"CC",X"0A",X"A6",X"CE",X"BE",X"C5",X"BE",X"D2", - X"0D",X"8E",X"C2",X"C3",X"D4",X"D5",X"98",X"C2",X"C3",X"D4",X"D5",X"98",X"CB",X"CC",X"91",X"CA", - X"ED",X"1F",X"00",X"01",X"A4",X"C0",X"C2",X"C4",X"C6",X"C8",X"CA",X"CC",X"CE",X"D0",X"D2",X"D4", - X"A9",X"8B",X"C0",X"C2",X"C4",X"C6",X"C8",X"CA",X"CC",X"CE",X"D0",X"D2",X"D4",X"AF",X"C0",X"C2", - X"C4",X"C6",X"C8",X"CA",X"CC",X"CE",X"D0",X"D2",X"D4",X"A4",X"93",X"D6",X"B4",X"C1",X"F6",X"BE", - X"F7",X"02",X"B9",X"C1",X"F6",X"03",X"A4",X"93",X"C1",X"C3",X"C5",X"C7",X"C9",X"CB",X"CD",X"CF", - X"D1",X"D3",X"D5",X"B4",X"9D",X"C0",X"06",X"A1",X"9D",X"D7",X"07",X"A7",X"C0",X"C8",X"D0",X"AD", - X"C4",X"CC",X"D4",X"B2",X"C0",X"B7",X"C6",X"CA",X"CE",X"BC",X"C1",X"D6",X"08",X"A1",X"CA",X"D3", - X"B6",X"C8",X"D0",X"09",X"BB",X"C8",X"0A",X"A4",X"C0",X"A9",X"C0",X"AF",X"C0",X"1F",X"00",X"01", - X"A5",X"C0",X"E2",X"C6",X"EB",X"CE",X"F0",X"AD",X"91",X"D3",X"D6",X"AD",X"D7",X"AF",X"C1",X"EA", - X"B0",X"D4",X"B0",X"94",X"D5",X"B4",X"C0",X"E3",X"CA",X"EC",X"B5",X"D3",X"F6",X"B9",X"C0",X"E6", - X"BE",X"F7",X"04",X"A2",X"C4",X"C5",X"A5",X"D2",X"F7",X"A9",X"C4",X"E8",X"B6",X"CE",X"F0",X"03", - X"A5",X"8A",X"C3",X"A5",X"9D",X"D1",X"A7",X"95",X"C9",X"AF",X"93",X"C0",X"B2",X"9D",X"D7",X"B4", - X"98",X"C4",X"CD",X"B9",X"9D",X"C7",X"06",X"A1",X"86",X"CC",X"07",X"A3",X"C0",X"C6",X"D0",X"AD", - X"C6",X"CA",X"AE",X"D4",X"B1",X"CF",X"B3",X"D3",X"D6",X"B7",X"C1",X"BC",X"C1",X"CD",X"D6",X"08", - X"A2",X"C1",X"C9",X"CF",X"AC",X"C3",X"09",X"BB",X"CB",X"0A",X"A5",X"CA",X"B5",X"D4",X"BE",X"C0", - X"0D",X"8F",X"D4",X"D5",X"1F",X"00",X"01",X"A4",X"C1",X"E8",X"A6",X"CA",X"EE",X"D2",X"F7",X"A8", - X"8A",X"CE",X"A9",X"C2",X"E7",X"AB",X"CE",X"F7",X"AD",X"92",X"D6",X"B1",X"D2",X"F4",X"B0",X"95", - X"C2",X"E4",X"C7",X"B2",X"C6",X"B4",X"C5",X"C6",X"B7",X"CE",X"F2",X"B6",X"D6",X"D7",X"B9",X"C5", - X"BE",X"F7",X"02",X"AB",X"9A",X"CB",X"AB",X"CC",X"B1",X"9A",X"CC",X"B9",X"C1",X"E4",X"C6",X"EA", - X"04",X"AE",X"CC",X"F1",X"03",X"A4",X"9D",X"C0",X"A4",X"98",X"C9",X"A6",X"8A",X"CF",X"D4",X"B0", - X"95",X"D7",X"B1",X"9D",X"D5",X"06",X"A1",X"85",X"D2",X"07",X"A4",X"CF",X"D3",X"D7",X"A6",X"D1", - X"A7",X"C2",X"C7",X"A9",X"CB",X"CC",X"D7",X"AE",X"D7",X"AF",X"CC",X"D3",X"B2",X"C5",X"B5",X"D0", - X"08",X"A1",X"C4",X"A3",X"CC",X"A8",X"D2",X"09",X"BB",X"CC",X"0A",X"A9",X"C6",X"B1",X"D3",X"BE", - X"D7",X"0E",X"93",X"C5",X"1F",X"01",X"01",X"A5",X"C0",X"E2",X"C4",X"A8",X"D3",X"F6",X"AA",X"C6", - X"F1",X"AA",X"8C",X"D5",X"AB",X"C1",X"E3",X"AA",X"9D",X"C6",X"AA",X"9A",X"D1",X"AD",X"D3",X"F7", - X"AF",X"C7",X"E9",X"CD",X"EF",X"AF",X"94",X"D3",X"B0",X"92",X"C3",X"B2",X"C0",X"E2",X"B3",X"D3", - X"F7",X"B4",X"96",X"C5",X"C9",X"CD",X"B6",X"98",X"C4",X"B7",X"C7",X"F0",X"B8",X"9A",X"C3",X"B9", - X"D2",X"B8",X"D5",X"F7",X"BC",X"C2",X"D3",X"BE",X"C0",X"F7",X"04",X"A7",X"C4",X"C5",X"A5",X"D1", - X"F3",X"AC",X"C8",X"EF",X"B1",X"C7",X"EF",X"AA",X"D2",X"03",X"A1",X"84",X"C0",X"A8",X"8C",X"D7", - X"A9",X"C3",X"AA",X"8D",X"CB",X"AB",X"91",X"C0",X"AC",X"96",X"D0",X"AD",X"92",X"D6",X"B1",X"96", - X"CB",X"B2",X"9D",X"C1",X"B3",X"97",X"D5",X"B4",X"96",X"C7",X"CE",X"B8",X"9D",X"D4",X"06",X"A5", - X"89",X"C3",X"07",X"AB",X"D4",X"AD",X"C7",X"CF",X"B1",X"D4",X"B5",X"C8",X"CA",X"CC",X"CF",X"B6", - X"C3",X"D7",X"B7",X"D2",X"BC",X"C0",X"C4",X"CA",X"CC",X"D7",X"08",X"A5",X"D4",X"A7",X"C8",X"BB", - X"C5",X"09",X"A8",X"C2",X"0A",X"A5",X"C2",X"BE",X"C0",X"D7",X"0F",X"9D",X"C3",X"E5",X"C7",X"F2", - X"1F",X"00",X"01",X"A4",X"C1",X"C2",X"A9",X"C1",X"E6",X"CA",X"F6",X"A9",X"9B",X"CA",X"AE",X"C0", - X"E7",X"CD",X"F5",X"B0",X"92",X"CD",X"D5",X"B3",X"C4",X"E6",X"CB",X"ED",X"D0",X"F5",X"B5",X"97", - X"C6",X"D5",X"B8",X"C2",X"E6",X"CB",X"F5",X"BA",X"C0",X"E2",X"BD",X"C4",X"C8",X"C9",X"CF",X"F7", - X"02",X"9F",X"C0",X"F7",X"04",X"A3",X"C7",X"F6",X"BA",X"C4",X"E7",X"03",X"A4",X"8D",X"C0",X"A6", - X"88",X"C6",X"A9",X"97",X"C3",X"A9",X"9C",X"D7",X"AE",X"9C",X"C8",X"B3",X"97",X"CF",X"D4",X"BA", - X"9E",X"C3",X"BD",X"CE",X"06",X"A1",X"85",X"C3",X"07",X"A2",X"C1",X"A7",X"D3",X"AC",X"C1",X"C4", - X"CE",X"B1",X"C6",X"CB",X"D1",X"B6",X"C5",X"D0",X"D3",X"B8",X"C0",X"C1",X"BD",X"C0",X"C5",X"CA", - X"08",X"A6",X"CD",X"B0",X"C4",X"BC",X"C6",X"09",X"A1",X"C2",X"0A",X"B3",X"D1",X"AE",X"CD",X"D5", - X"0D",X"99",X"C0",X"C1",X"0F",X"9E",X"C5",X"E7",X"1F",X"00",X"01",X"AA",X"C2",X"CE",X"AC",X"C0", - X"E2",X"AE",X"90",X"C2",X"B1",X"C0",X"E3",X"D3",X"F6",X"B3",X"9D",X"C0",X"B6",X"C1",X"E4",X"CD", - X"B7",X"D0",X"F6",X"B8",X"C7",X"ED",X"B9",X"CD",X"D0",X"D4",X"9B",X"C5",X"D4",X"BC",X"C4",X"C5", - X"D1",X"F7",X"BE",X"C0",X"F7",X"02",X"A5",X"C0",X"E2",X"C4",X"ED",X"AA",X"95",X"CD",X"AC",X"90", - X"CE",X"AF",X"CF",X"D0",X"04",X"A4",X"CE",X"F4",X"A7",X"CA",X"EC",X"AB",X"D0",X"F5",X"AE",X"C4", - X"EC",X"B1",X"CE",X"F1",X"B8",X"C2",X"E4",X"03",X"A1",X"84",X"D5",X"A7",X"90",X"C3",X"A7",X"C9", - X"AA",X"8E",X"CF",X"AB",X"90",X"D6",X"AC",X"97",X"C9",X"B1",X"97",X"CC",X"B4",X"9D",X"CE",X"AE", - X"9B",X"D7",X"B8",X"9D",X"C1",X"C6",X"BA",X"9D",X"CC",X"06",X"A5",X"C3",X"07",X"AA",X"C1",X"CC", - X"AD",X"D0",X"AF",X"C5",X"C8",X"CB",X"C0",X"B4",X"C1",X"B5",X"D2",X"BA",X"D1",X"D3",X"D6",X"BC", - X"C3",X"C7",X"CB",X"08",X"A7",X"CE",X"B3",X"C3",X"B4",X"D1",X"BB",X"C9",X"09",X"B5",X"C7",X"0A", - X"AA",X"CE",X"BC",X"D3",X"BC",X"D5",X"0D",X"8B",X"C0",X"C1",X"1F",X"00",X"01",X"A4",X"CC",X"F7", - X"A5",X"C7",X"E9",X"A9",X"CD",X"F6",X"AA",X"C1",X"E4",X"AF",X"C5",X"C7",X"E9",X"B4",X"C4",X"B9", - X"C2",X"C3",X"C7",X"E9",X"CD",X"F7",X"BE",X"C0",X"F7",X"02",X"AA",X"C8",X"EA",X"8B",X"CD",X"F6", - X"AC",X"98",X"CD",X"AC",X"95",X"D6",X"AF",X"CF",X"F4",X"B1",X"93",X"CF",X"B4",X"C8",X"EA",X"CF", - X"F6",X"04",X"A2",X"C1",X"E5",X"03",X"A4",X"88",X"D1",X"A5",X"89",X"CA",X"A5",X"9D",X"C0",X"A9", - X"9D",X"CC",X"A9",X"98",X"D7",X"AA",X"8E",X"C5",X"C7",X"AF",X"93",X"C4",X"CA",X"D5",X"AF",X"98", - X"CE",X"B4",X"98",X"C3",X"C7",X"B9",X"9D",X"C1",X"B9",X"CA",X"06",X"A1",X"86",X"C6",X"BB",X"9D", - X"CA",X"07",X"A2",X"CC",X"D6",X"A3",X"C9",X"A8",X"C2",X"C4",X"C9",X"AD",X"C9",X"D0",X"D3",X"B2", - X"C9",X"D1",X"D3",X"B7",X"C4",X"C9",X"D1",X"BC",X"C2",X"CE",X"D6",X"08",X"A1",X"D4",X"A7",X"C3", - X"A6",X"D4",X"AC",X"CB",X"09",X"A6",X"CB",X"0A",X"A5",X"C9",X"AF",X"C9",X"BE",X"D7",X"1F",X"00", - X"01",X"A7",X"C1",X"C5",X"EA",X"CD",X"F3",X"D5",X"F7",X"A9",X"D6",X"AF",X"C5",X"E8",X"D2",X"F7", - X"B6",X"C0",X"E6",X"B8",X"C6",X"EA",X"CF",X"F1",X"D3",X"D5",X"F7",X"BA",X"D3",X"F7",X"BC",X"D4", - X"F7",X"BD",X"C0",X"EA",X"CF",X"F7",X"02",X"A5",X"D5",X"AF",X"CA",X"F1",X"B8",X"CC",X"ED",X"9F", - X"C0",X"F7",X"04",X"A2",X"C3",X"CB",X"CC",X"D4",X"F7",X"A9",X"C6",X"F3",X"AB",X"D6",X"B0",X"C1", - X"C2",X"B1",X"D2",X"F4",X"B5",X"D2",X"03",X"A1",X"92",X"C0",X"A2",X"86",X"D3",X"A5",X"89",X"C4", - X"A5",X"CA",X"A7",X"8A",X"D4",X"A9",X"8B",X"D5",X"A9",X"8E",X"C5",X"D7",X"AF",X"97",X"C9",X"B4", - X"97",X"D1",X"B6",X"C7",X"B8",X"9E",X"CB",X"CE",X"06",X"A1",X"84",X"CA",X"07",X"A5",X"C1",X"C5", - X"C9",X"CE",X"D1",X"D7",X"AA",X"C7",X"CB",X"D0",X"B4",X"C0",X"C3",X"B6",X"D7",X"B8",X"D4",X"BB", - X"C0",X"C2",X"BD",X"CC",X"08",X"A4",X"C7",X"D0",X"AC",X"D4",X"09",X"B5",X"CC",X"0A",X"A7",X"C1", - X"B8",X"D7",X"BD",X"C0",X"0D",X"86",X"D6",X"D7",X"0E",X"99",X"D4",X"1F",X"01",X"01",X"A2",X"C8", - X"CF",X"D5",X"A3",X"C8",X"D0",X"D4",X"A4",X"C7",X"D4",X"A5",X"C1",X"E6",X"CD",X"D1",X"F3",X"85", - X"CD",X"F0",X"A7",X"C6",X"CD",X"D1",X"A9",X"C6",X"F6",X"AA",X"C0",X"E4",X"AE",X"C6",X"F7",X"AF", - X"C1",X"E4",X"B0",X"93",X"C4",X"C6",X"D1",X"D3",X"B3",X"D4",X"B3",X"95",X"C7",X"D5",X"94",X"C4", - X"B4",X"96",X"C3",X"D1",X"B5",X"97",X"C8",X"B6",X"98",X"C2",X"B6",X"D0",X"D1",X"D5",X"F7",X"B7", - X"9A",X"C9",X"B8",X"9A",X"C1",X"B8",X"CE",X"F1",X"B9",X"C6",X"BA",X"C4",X"CA",X"EE",X"BC",X"C3", - X"C4",X"C7",X"BB",X"9D",X"D5",X"D7",X"BD",X"CF",X"F1",X"BE",X"C0",X"E8",X"CF",X"F7",X"02",X"A5", - X"C0",X"C2",X"C3",X"9F",X"C9",X"EE",X"04",X"A6",X"C7",X"F0",X"B0",X"C7",X"F0",X"B1",X"C1",X"E3", - X"03",X"A5",X"9D",X"C5",X"D2",X"A9",X"8D",X"D7",X"AA",X"8E",X"C3",X"AF",X"9D",X"C0",X"B8",X"CD", - X"BA",X"9E",X"CC",X"BB",X"9D",X"C8",X"BB",X"9E",X"C9",X"06",X"A1",X"88",X"CB",X"BB",X"9D",X"D6", - X"07",X"A3",X"C0",X"C6",X"D3",X"A7",X"C8",X"CE",X"D0",X"D4",X"A8",X"C0",X"B1",X"C8",X"B3",X"CA", - X"CE",X"B2",X"C3",X"B4",X"D6",X"B9",X"D7",X"BA",X"C3",X"BB",X"D1",X"BC",X"C1",X"C6",X"D3",X"BD", - X"CA",X"CE",X"08",X"A2",X"C3",X"BB",X"C2",X"D4",X"09",X"AB",X"CA",X"0A",X"B3",X"D4",X"B8",X"CE", - X"BC",X"C3",X"0D",X"88",X"C7",X"EC",X"CE",X"F0",X"92",X"D4",X"D5",X"95",X"D6",X"D7",X"97",X"CD", - X"EF",X"99",X"CA",X"EC",X"0E",X"9D",X"D6",X"1F",X"00",X"01",X"A4",X"C9",X"F6",X"A6",X"C7",X"E9", - X"A6",X"9B",X"D6",X"A6",X"99",X"C7",X"A9",X"CB",X"F4",X"A9",X"9B",X"D4",X"AB",X"C9",X"EB",X"D4", - X"AD",X"9B",X"C9",X"AC",X"C2",X"C3",X"AE",X"C3",X"E5",X"AE",X"CD",X"F2",X"B0",X"CB",X"ED",X"B0", - X"9B",X"CB",X"D2",X"B1",X"C2",X"C3",X"B3",X"C5",X"CF",X"D0",X"B5",X"CD",X"F0",X"B7",X"99",X"CD", - X"D0",X"B8",X"C2",X"C4",X"C5",X"BA",X"CD",X"F0",X"BD",X"C0",X"E7",X"02",X"9F",X"C0",X"F7",X"04", - X"A1",X"C7",X"E9",X"A4",X"C4",X"C5",X"A7",X"C1",X"C2",X"03",X"A1",X"85",X"C6",X"A4",X"88",X"C3", - X"A7",X"9C",X"C0",X"A4",X"9E",X"D7",X"A9",X"9E",X"D5",X"AE",X"9E",X"D3",X"B3",X"9E",X"D1",X"06", - X"A1",X"86",X"C0",X"07",X"A2",X"CC",X"D2",X"A7",X"CC",X"D1",X"A9",X"C9",X"AA",X"C2",X"AC",X"C5", - X"AC",X"D0",X"AE",X"CC",X"AF",X"C2",X"B1",X"C5",X"CF",X"B3",X"CD",X"B6",X"C2",X"C5",X"B8",X"CE", - X"BB",X"C2",X"C5",X"08",X"A3",X"C8",X"A8",X"CA",X"AD",X"CB",X"B2",X"CE",X"09",X"BA",X"C3",X"0A", - X"A6",X"C7",X"AB",X"C9",X"B0",X"CB",X"0D",X"99",X"CE",X"CF",X"1F",X"00",X"01",X"A5",X"CB",X"ED", - X"D4",X"D5",X"A7",X"C0",X"C1",X"C6",X"E8",X"D5",X"AA",X"D1",X"F5",X"AC",X"C8",X"EE",X"AE",X"90", - X"C8",X"AF",X"CE",X"B1",X"C3",X"EE",X"B9",X"C3",X"E6",X"BE",X"C0",X"F7",X"02",X"A5",X"D1",X"F3", - X"A7",X"89",X"D1",X"B3",X"98",X"C3",X"C6",X"BE",X"C2",X"E5",X"C9",X"ED",X"D0",X"F3",X"D6",X"D7", - X"04",X"A2",X"C0",X"E4",X"C9",X"F1",X"A9",X"CF",X"D0",X"AC",X"CF",X"D0",X"03",X"A5",X"C0",X"A5", - X"9D",X"D6",X"A7",X"92",X"C2",X"B1",X"9D",X"C7",X"06",X"A1",X"84",X"D6",X"07",X"A3",X"D4",X"A5", - X"C1",X"C6",X"C8",X"A8",X"D2",X"D4",X"AF",X"C9",X"CB",X"CD",X"B7",X"C4",X"C5",X"BC",X"C0",X"C5", - X"CE",X"D4",X"08",X"A2",X"CC",X"D2",X"A9",X"CB",X"09",X"BB",X"CB",X"0A",X"A5",X"CB",X"AC",X"C8", - X"BE",X"C0",X"0D",X"89",X"D2",X"F4",X"98",X"C4",X"C5",X"1F",X"00",X"01",X"A5",X"C3",X"F0",X"A7", - X"C9",X"CD",X"AA",X"C0",X"F7",X"AC",X"C9",X"CF",X"AF",X"C6",X"F7",X"B1",X"C9",X"CD",X"C6",X"B2", - X"C0",X"E5",X"B4",X"CA",X"F6",X"B6",X"CD",X"B7",X"C1",X"E6",X"B9",X"C6",X"F7",X"BB",X"CD",X"BE", - X"C0",X"F7",X"02",X"89",X"C9",X"CD",X"8E",X"C9",X"CF",X"93",X"CD",X"B3",X"96",X"C6",X"B3",X"95", - X"C9",X"B8",X"CD",X"BD",X"CD",X"04",X"A2",X"C1",X"C2",X"D2",X"F7",X"03",X"A2",X"89",X"C0",X"A5", - X"89",X"D1",X"AA",X"91",X"C1",X"AA",X"8E",X"D4",X"AF",X"93",X"D1",X"B2",X"96",X"C3",X"B4",X"98", - X"D7",X"B7",X"9D",X"C0",X"B9",X"9D",X"D2",X"06",X"A1",X"84",X"C3",X"07",X"A3",X"C5",X"C9",X"A8", - X"C4",X"CB",X"CF",X"D7",X"AD",X"CB",X"D2",X"D7",X"B0",X"C2",X"B2",X"CB",X"CF",X"B5",X"C1",X"B7", - X"C8",X"CB",X"D5",X"BC",X"C2",X"CB",X"CF",X"08",X"A2",X"CB",X"A7",X"D2",X"B1",X"D3",X"BB",X"C7", - X"09",X"BB",X"C3",X"0A",X"BE",X"CC",X"CE",X"D7",X"1F",X"00",X"01",X"A4",X"C5",X"F2",X"A6",X"88", - X"C5",X"CB",X"D2",X"D3",X"A9",X"C3",X"E7",X"CB",X"CF",X"F3",X"A6",X"D4",X"F6",X"AB",X"8F",X"C3", - X"C7",X"CF",X"A6",X"94",X"D7",X"AB",X"C7",X"EF",X"D3",X"F7",X"AE",X"C1",X"E7",X"B0",X"97",X"C1", - X"C7",X"B0",X"CD",X"F4",X"B2",X"94",X"CD",X"B3",X"9A",X"C4",X"B3",X"C5",X"C6",X"B5",X"CA",X"EE", - X"D1",X"D5",X"F7",X"B6",X"C2",X"C3",X"B7",X"C7",X"EA",X"CE",X"D1",X"F5",X"B9",X"C4",X"E7",X"CA", - X"CE",X"F1",X"BE",X"C0",X"F7",X"02",X"BE",X"C1",X"C3",X"C5",X"C7",X"C9",X"CB",X"CD",X"CF",X"D1", - X"D3",X"D5",X"D7",X"04",X"AD",X"D5",X"03",X"A4",X"88",X"D1",X"A9",X"8F",X"D0",X"B0",X"94",X"CC", - X"D6",X"B5",X"9D",X"CB",X"B5",X"98",X"D0",X"B5",X"D2",X"D4",X"06",X"A1",X"9D",X"C0",X"07",X"A7", - X"C7",X"A9",X"C9",X"CD",X"D5",X"AC",X"C5",X"AE",X"CD",X"D4",X"B3",X"CE",X"B4",X"C2",X"B5",X"C8", - X"D3",X"B7",X"C5",X"CF",X"BC",X"C2",X"D3",X"D7",X"08",X"A1",X"CA",X"A3",X"D4",X"AD",X"D2",X"09", - X"BB",X"C9",X"0A",X"A4",X"C5",X"A4",X"CB",X"AE",X"C1",X"0D",X"85",X"D3",X"F7",X"8A",X"CC",X"EE", - X"96",X"C8",X"C9",X"1F",X"00",X"01",X"A7",X"99",X"D6",X"A7",X"8E",X"D4",X"A7",X"D0",X"F3",X"A9", - X"91",X"D0",X"AA",X"CC",X"EF",X"AC",X"94",X"CC",X"AD",X"C8",X"EB",X"D1",X"F3",X"AF",X"97",X"C8", - X"B0",X"C4",X"E7",X"CD",X"EF",X"B2",X"9B",X"C4",X"B3",X"C0",X"E3",X"C9",X"EB",X"B5",X"9B",X"C0", - X"B6",X"C5",X"E7",X"BA",X"C1",X"E3",X"B2",X"99",X"D3",X"B2",X"D4",X"D5",X"B8",X"D4",X"D5",X"B5", - X"CF",X"F2",X"B7",X"CF",X"B9",X"CC",X"EF",X"BB",X"CC",X"F2",X"BD",X"C7",X"F7",X"02",X"9F",X"C0", - X"F7",X"03",X"A7",X"9C",X"D7",X"A7",X"91",X"D5",X"A7",X"89",X"CF",X"AA",X"8C",X"CB",X"AD",X"8F", - X"C7",X"B0",X"92",X"C3",X"B2",X"94",X"D2",X"B5",X"98",X"CE",X"B9",X"9C",X"CB",X"06",X"A1",X"86", - X"D7",X"BD",X"C6",X"07",X"AB",X"D1",X"D3",X"AE",X"CD",X"CF",X"B1",X"C9",X"CB",X"B0",X"D4",X"B3", - X"D0",X"B4",X"C5",X"C7",X"B7",X"CC",X"B8",X"C1",X"C3",X"B9",X"D0",X"D2",X"BB",X"D3",X"D5",X"C8", - X"CA",X"08",X"A4",X"D2",X"A7",X"CD",X"AA",X"C9",X"BC",X"C0",X"09",X"B5",X"D4",X"0A",X"B3",X"C0", - X"BD",X"D3",X"BA",X"C1",X"0D",X"8C",X"D1",X"F3",X"1F",X"00",X"02",X"9F",X"C0",X"F7",X"04",X"A4", - X"C4",X"CA",X"D2",X"D6",X"A7",X"C1",X"C2",X"C5",X"C8",X"CB",X"D0",X"D3",X"D5",X"AA",X"C6",X"CC", - X"D4",X"AD",X"C2",X"C7",X"CD",X"D0",X"D5",X"B0",X"C1",X"C6",X"C8",X"CB",X"CE",X"D4",X"D6",X"B3", - X"C5",X"C8",X"CA",X"CD",X"CF",X"D3",X"D5",X"B6",X"C1",X"C4",X"C9",X"CC",X"D0",X"D2",X"B9",X"C2", - X"C5",X"CB",X"D4",X"D6",X"03",X"A4",X"87",X"C3",X"D1",X"A4",X"90",X"C9",X"D7",X"A7",X"90",X"C0", - X"A7",X"8D",X"CF",X"AD",X"99",X"C3",X"AD",X"9E",X"D1",X"B6",X"9E",X"C0",X"06",X"A1",X"86",X"C0", - X"07",X"A5",X"CA",X"CF",X"A9",X"C2",X"D2",X"D6",X"AD",X"C6",X"B1",X"D4",X"B4",X"CF",X"BA",X"C5", - X"D4",X"AC",X"CB",X"08",X"AA",X"CC",X"B6",X"C9",X"CC",X"D2",X"09",X"BC",X"CB",X"1F",X"00",X"01", - X"A5",X"87",X"C2",X"C6",X"D1",X"A8",X"98",X"C2",X"F7",X"00",X"A8",X"8D",X"C8",X"AB",X"8D",X"C6", - X"C7",X"AB",X"98",X"C5",X"AE",X"90",X"CB",X"F0",X"AE",X"D3",X"AC",X"D6",X"B5",X"97",X"CD",X"EF", - X"B7",X"CC",X"01",X"AE",X"CD",X"EE",X"B9",X"CD",X"EE",X"BA",X"CC",X"ED",X"BC",X"9E",X"CB",X"ED", - X"02",X"9F",X"C0",X"F7",X"04",X"A2",X"C1",X"F7",X"B9",X"D0",X"F5",X"03",X"A5",X"9E",X"C0",X"AE", - X"9A",X"D6",X"B8",X"9A",X"CF",X"06",X"A1",X"84",X"C0",X"07",X"AF",X"CB",X"D0",X"AE",X"D3",X"08", - X"A5",X"C9",X"CC",X"AB",X"C7",X"BC",X"D2",X"09",X"B5",X"CE",X"0A",X"A8",X"D0",X"AE",X"C6",X"BC", - X"CB",X"0E",X"90",X"CB",X"CC",X"CF",X"D0",X"8F",X"D3",X"99",X"CC",X"1F",X"00",X"01",X"A8",X"95", - X"C0",X"EA",X"A8",X"CC",X"EF",X"AD",X"CB",X"F6",X"B4",X"D1",X"F6",X"B9",X"C0",X"ED",X"BB",X"C5", - X"BC",X"CE",X"BE",X"C0",X"F7",X"00",X"B0",X"93",X"C2",X"E4",X"B3",X"95",X"C9",X"AF",X"95",X"CA", - X"04",X"A3",X"C1",X"EE",X"A5",X"D0",X"F6",X"B1",X"CA",X"F0",X"03",X"A2",X"87",X"C0",X"CF",X"A8", - X"8A",X"CB",X"AA",X"8E",X"CA",X"AE",X"92",X"C9",X"B2",X"95",X"C8",X"B9",X"9D",X"C6",X"CC",X"A5", - X"9D",X"D7",X"06",X"A1",X"84",X"D7",X"07",X"A8",X"D0",X"D2",X"D4",X"B2",X"C2",X"C4",X"B7",X"C2", - X"08",X"AA",X"CE",X"D3",X"B1",X"D3",X"BB",X"D3",X"09",X"BB",X"C9",X"0A",X"B9",X"C0",X"BE",X"C4", - X"BE",X"CD",X"0F",X"9D",X"C0",X"E4",X"1F",X"00",X"01",X"A8",X"C9",X"EC",X"D1",X"F4",X"AC",X"C1", - X"E7",X"AD",X"CE",X"F6",X"B6",X"C1",X"E7",X"B9",X"C9",X"F4",X"A5",X"8A",X"C1",X"AE",X"92",X"C1", - X"B8",X"9D",X"C1",X"B8",X"C7",X"A5",X"87",X"C9",X"CC",X"B1",X"98",X"C9",X"AF",X"9C",X"D6",X"02", - X"B1",X"C2",X"E8",X"BE",X"C0",X"F7",X"BA",X"9D",X"C7",X"04",X"A2",X"C1",X"E8",X"CF",X"F6",X"A5", - X"C2",X"E8",X"AA",X"C9",X"ED",X"B2",X"CB",X"F5",X"03",X"A5",X"9D",X"C0",X"AC",X"90",X"C2",X"A9", - X"8D",X"C8",X"B1",X"98",X"CA",X"B9",X"9D",X"D5",X"A5",X"9A",X"D7",X"06",X"A1",X"84",X"D7",X"07", - X"A4",X"D0",X"D5",X"A6",X"CA",X"D2",X"A8",X"C3",X"C5",X"B5",X"CD",X"D2",X"B8",X"C6",X"BC",X"CD", - X"08",X"A5",X"D4",X"AA",X"D3",X"AE",X"C5",X"BB",X"D0",X"09",X"B3",X"C5",X"0A",X"A8",X"D1",X"B6", - X"C4",X"B6",X"C7",X"0D",X"87",X"CA",X"CB",X"0F",X"9D",X"C2",X"E6",X"D7",X"1F",X"01",X"01",X"A8", - X"95",X"C0",X"E5",X"D1",X"F7",X"AA",X"95",X"C8",X"EE",X"A5",X"C8",X"EE",X"B9",X"C1",X"E5",X"C8", - X"EE",X"D1",X"F6",X"BE",X"C0",X"F7",X"A2",X"84",X"CB",X"00",X"AE",X"91",X"C1",X"C2",X"D6",X"D7", - X"B4",X"C4",X"D2",X"D3",X"CB",X"04",X"A2",X"C0",X"E5",X"D1",X"F7",X"A7",X"C8",X"EE",X"03",X"A5", - X"9A",X"C6",X"D0",X"B9",X"9D",X"C0",X"D7",X"06",X"A1",X"84",X"C6",X"D0",X"07",X"A3",X"C0",X"D7", - X"B0",X"C2",X"D6",X"B4",X"C4",X"CB",X"D2",X"D3",X"BC",X"C4",X"D3",X"08",X"A7",X"CB",X"B6",X"CA", - X"CC",X"09",X"BB",X"CB",X"0A",X"B9",X"C9",X"CB",X"CD",X"0E",X"91",X"C1",X"C2",X"D6",X"D7",X"1F", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"02",X"C0",X"02",X"C1",X"C4",X"06",X"C2",X"04",X"08",X"08",X"08",X"08",X"0C",X"00",X"00",X"00", - X"C8",X"C6",X"10",X"00",X"0C",X"0E",X"0C",X"0E",X"00",X"00",X"00",X"00",X"0A",X"CA",X"CA",X"02", - X"CA",X"0A",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C4",X"06",X"C2",X"04", - X"20",X"AC",X"20",X"AE",X"00",X"00",X"00",X"00",X"16",X"16",X"16",X"16",X"1C",X"1E",X"1C",X"1E", - X"B4",X"00",X"00",X"00",X"B4",X"B5",X"B4",X"B5",X"16",X"18",X"1A",X"20",X"18",X"1A",X"20",X"20", - X"1A",X"18",X"16",X"16",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"14",X"12",X"B0",X"B2", - X"A0",X"9C",X"9E",X"A0",X"00",X"00",X"00",X"00",X"A6",X"A6",X"A6",X"A6",X"A1",X"A0",X"A1",X"A0", - X"A0",X"00",X"00",X"00",X"A0",X"A1",X"A0",X"A1",X"A6",X"A6",X"A0",X"A0",X"A6",X"A6",X"A6",X"A0", - X"A6",X"A6",X"A6",X"A6",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"A2",X"38",X"A4",X"36", - X"92",X"90",X"8E",X"00",X"00",X"00",X"00",X"00",X"3A",X"3A",X"3A",X"3A",X"98",X"99",X"98",X"99", - X"99",X"00",X"00",X"00",X"98",X"99",X"98",X"99",X"98",X"99",X"92",X"92",X"3C",X"3C",X"3C",X"3C", - X"3C",X"3C",X"3C",X"3A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"94",X"96",X"94",X"96", - X"B6",X"BA",X"B6",X"BA",X"E6",X"E8",X"EA",X"EC",X"22",X"22",X"22",X"22",X"24",X"24",X"24",X"24", - X"EE",X"00",X"00",X"00",X"EE",X"EF",X"EE",X"EF",X"E4",X"E2",X"B6",X"B6",X"E2",X"E4",X"B6",X"B6", - X"E4",X"E2",X"22",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"DD",X"DE",X"DF",X"DE",X"00",X"00",X"00",X"00",X"DE",X"A7",X"DE",X"A7",X"40",X"40",X"40",X"40", - X"BF",X"00",X"00",X"00",X"DD",X"BF",X"DD",X"BF",X"DD",X"3E",X"BC",X"DF",X"A7",X"DE",X"A7",X"DE", - X"DE",X"A7",X"DE",X"A7",X"DD",X"34",X"DD",X"00",X"DD",X"34",X"DD",X"DD",X"DE",X"DF",X"DE",X"DD", - X"80",X"84",X"82",X"00",X"00",X"00",X"00",X"00",X"8A",X"8A",X"8A",X"8A",X"2A",X"2A",X"2A",X"2A", - X"8C",X"00",X"00",X"00",X"8C",X"8D",X"8C",X"8D",X"8C",X"84",X"82",X"80",X"8A",X"8A",X"8A",X"8A", - X"8A",X"8A",X"8A",X"8A",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"86",X"28",X"88",X"26", - X"CE",X"CC",X"CE",X"CC",X"30",X"32",X"30",X"32",X"CE",X"CF",X"CE",X"CF",X"CE",X"CF",X"CE",X"CF", - X"CF",X"00",X"00",X"00",X"CE",X"CF",X"CE",X"CF",X"CE",X"CF",X"CE",X"CF",X"CE",X"CF",X"CE",X"CF", - X"CE",X"CF",X"CE",X"CF",X"2C",X"2E",X"30",X"00",X"2E",X"2C",X"CE",X"00",X"00",X"00",X"00",X"00", - X"D0",X"D1",X"D0",X"D1",X"00",X"00",X"00",X"00",X"D4",X"D4",X"D4",X"D4",X"D4",X"D4",X"D4",X"D4", - X"D8",X"00",X"00",X"00",X"D4",X"D4",X"D4",X"D4",X"D8",X"D0",X"D1",X"00",X"D4",X"D4",X"D4",X"D4", - X"D4",X"D4",X"D4",X"D4",X"D1",X"DB",X"D9",X"D5",X"D5",X"D9",X"DB",X"D1",X"D5",X"D7",X"D5",X"D7", - X"00",X"00",X"00",X"00",X"41",X"40",X"41",X"40",X"00",X"40",X"00",X"40",X"00",X"00",X"00",X"00", - X"01",X"01",X"00",X"00",X"00",X"00",X"40",X"40",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00", - X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"40",X"41",X"40", - X"00",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40",X"41",X"41", - X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"00",X"40",X"40", - X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40",X"40",X"40",X"00",X"00",X"00",X"40",X"00",X"00", - X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"40",X"41",X"40", - X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"40",X"00",X"00", - X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"41",X"41",X"41", - X"01",X"01",X"01",X"01",X"41",X"41",X"41",X"41",X"00",X"40",X"00",X"40",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", - X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"40",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"40",X"00",X"00",X"40",X"00",X"40", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"01",X"01",X"00",X"00",X"40",X"40", - X"00",X"00",X"40",X"40",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"81",X"80",X"80", - X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"01",X"41",X"01",X"41",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"41",X"01",X"01", - X"01",X"41",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"40",X"41",X"40", - X"40",X"41",X"40",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"01",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"00",X"40",X"40", - X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"00",X"01",X"00",X"00",X"40",X"00",X"40", - X"00",X"40",X"00",X"40",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"01",X"00", - X"FE",X"00",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"00", - X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"F5",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"FA",X"FC",X"F5",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"F8",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"FC", - X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"01",X"01",X"FF",X"FF", - X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"FE",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"FD",X"FD",X"FD",X"00",X"00",X"00",X"00",X"00",X"F8",X"08",X"F8",X"08",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"FD",X"FD",X"F8",X"08",X"F8",X"F8", - X"F8",X"08",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"03",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"FC",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"FC",X"F8",X"F8",X"FC",X"FC",X"F8",X"F8",X"FC",X"FC",X"00",X"FC",X"00", - X"00",X"00",X"00",X"00",X"FD",X"00",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"F0",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00", - X"10",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"FD",X"00",X"FD",X"00", - X"00",X"FF",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE", - X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"00",X"01",X"00", - X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"04",X"04", - X"02",X"02",X"02",X"02",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"00", - X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"10",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00", - X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10", - X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"04",X"00", - X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10",X"10", - X"00",X"FF",X"00",X"FF",X"F8",X"00",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00", - X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"F8",X"00", - X"00",X"FC",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"08",X"09",X"00",X"00", - X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"F8", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"F8",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"04",X"04",X"07",X"07", - X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"F8", - X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F9",X"FD",X"FC",X"FC",X"FD",X"FD",X"FC",X"00", - X"FD",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"F8",X"00",X"00",X"00",X"F9",X"F9",X"F9",X"F9", - X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"FF",X"00",X"00",X"00",X"03",X"03", - X"00",X"00",X"FD",X"FD",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"08",X"F8",X"08", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"F8",X"F8",X"FC",X"00",X"00",X"F8",X"F9",X"F8",X"F9", - X"00",X"00",X"00",X"00",X"08",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"08",X"00", - X"00",X"04",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"08",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"05", - X"04",X"04",X"04",X"04",X"FC",X"FC",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"07",X"04",X"04",X"07",X"07",X"04",X"00", - X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"10",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"04",X"0C",X"07",X"01",X"08",X"07",X"01",X"00",X"08",X"07",X"01",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"06",X"06",X"06",X"06",X"08",X"08",X"08",X"01",X"0A",X"06",X"00",X"00", - X"0A",X"06",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"08",X"09",X"07", - X"08",X"08",X"01",X"00",X"06",X"06",X"06",X"01",X"06",X"06",X"06",X"01",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"05",X"04",X"03",X"03",X"08",X"08",X"01",X"00",X"06",X"06",X"06",X"00", - X"06",X"06",X"06",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"03",X"04", - X"08",X"08",X"01",X"00",X"0A",X"06",X"00",X"00",X"0A",X"06",X"01",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"06",X"06",X"04",X"05",X"05",X"05",X"05", - X"05",X"05",X"05",X"05",X"06",X"08",X"04",X"00",X"06",X"08",X"04",X"00",X"04",X"03",X"04",X"04", - X"08",X"08",X"04",X"00",X"06",X"06",X"06",X"00",X"06",X"06",X"06",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"05",X"08",X"08",X"08",X"02",X"05",X"05",X"05",X"00", - X"05",X"05",X"05",X"00",X"04",X"04",X"04",X"00",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"00", - X"08",X"0C",X"08",X"00",X"05",X"05",X"05",X"00",X"05",X"05",X"05",X"00",X"04",X"04",X"04",X"04", - X"04",X"04",X"04",X"04",X"05",X"05",X"05",X"05",X"43",X"03",X"20",X"FF",X"A3",X"FF",X"A3",X"FF", - X"A2",X"FF",X"A2",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"83",X"83",X"A3",X"FF",X"A3",X"A3",X"FF",X"FF",X"A2",X"A2",X"FF",X"FF",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"43",X"A0",X"FF",X"FF",X"A3",X"A3",X"A3",X"FF", - X"A2",X"A2",X"A2",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"43",X"A0",X"FF",X"FF",X"A3",X"A3",X"A3",X"FF",X"A2",X"A2",X"A2",X"FF",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"43",X"A0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", - X"A2",X"A2",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"FF",X"83",X"20",X"20",X"A3",X"A3",X"A3",X"A3",X"A2",X"A2",X"A2",X"A2",X"FF",X"FF",X"FF",X"00", - X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"43",X"A0",X"A0",X"FF",X"A3",X"A3",X"A3",X"FF", - X"A2",X"A2",X"A2",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"03",X"23",X"20",X"20",X"23",X"23",X"23",X"FF",X"22",X"22",X"22",X"FF",X"FF",X"FF",X"FF",X"00", - X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"FF",X"03",X"20",X"FF",X"23",X"23",X"23",X"FF", - X"22",X"22",X"22",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"07",X"06",X"07",X"06",X"00",X"04",X"04",X"02",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"06",X"07",X"08", - X"00",X"05",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"01",X"05",X"04",X"02",X"00",X"05",X"05",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"03",X"03", - X"00",X"08",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"02",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"00",X"04",X"00",X"00",X"04",X"04",X"00",X"04", - X"00",X"05",X"05",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"00",X"04", - X"00",X"04",X"00",X"04",X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"FC",X"FA",X"00",X"00", - X"02",X"06",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"F8",X"F8",X"00",X"FA",X"F7",X"00",X"00",X"01",X"07",X"07",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"00",X"FC",X"FC",X"FC",X"FC", - X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"F8",X"00",X"00",X"FC",X"FC",X"F9",X"00",X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"00",X"F8",X"F9",X"00",X"00", - X"00",X"08",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"00",X"00",X"FC",X"FC",X"F9",X"00", - X"04",X"04",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"00", - X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"02",X"51",X"01",X"01",X"00",X"03",X"92",X"D4",X"01",X"01",X"18",X"03",X"0F",X"D0",X"D5",X"CF", - X"D2",X"01",X"02",X"18",X"03",X"0E",X"D0",X"D1",X"D5",X"D3",X"01",X"03",X"18",X"03",X"0C",X"D0", - X"D1",X"D2",X"D4",X"D5",X"D3",X"01",X"04",X"18",X"03",X"0A",X"D0",X"D1",X"D2",X"D4",X"D4",X"D4", - X"D5",X"D3",X"01",X"05",X"27",X"D5",X"D3",X"01",X"06",X"27",X"D5",X"D3",X"01",X"07",X"28",X"D3", - X"01",X"08",X"28",X"D3",X"01",X"09",X"27",X"D5",X"D3",X"01",X"0A",X"27",X"D5",X"D3",X"01",X"0B", - X"27",X"D5",X"D3",X"01",X"0C",X"27",X"D5",X"D3",X"01",X"0D",X"27",X"D5",X"D3",X"01",X"0E",X"27", - X"D5",X"D3",X"01",X"0F",X"27",X"D5",X"D3",X"01",X"10",X"27",X"D5",X"D3",X"01",X"11",X"27",X"D5", - X"D3",X"01",X"12",X"27",X"D5",X"D3",X"02",X"53",X"01",X"07",X"26",X"CA",X"01",X"08",X"25",X"CB", - X"CC",X"02",X"54",X"01",X"07",X"27",X"CD",X"01",X"08",X"27",X"CE",X"02",X"52",X"01",X"05",X"18", - X"03",X"0A",X"EB",X"01",X"06",X"18",X"03",X"0A",X"EB",X"01",X"07",X"18",X"03",X"08",X"EC",X"ED", - X"EB",X"01",X"08",X"18",X"03",X"08",X"5C",X"EE",X"EB",X"01",X"09",X"1E",X"5C",X"5C",X"EE",X"EB", - X"01",X"0A",X"1E",X"5C",X"5C",X"EE",X"EB",X"01",X"0B",X"1E",X"5C",X"5C",X"EE",X"EB",X"01",X"0C", - X"1E",X"5C",X"5C",X"EE",X"EB",X"01",X"0D",X"1E",X"5C",X"5C",X"EE",X"EB",X"01",X"0E",X"1E",X"5C", - X"5C",X"EE",X"EB",X"01",X"0F",X"1E",X"5C",X"5C",X"EE",X"EB",X"01",X"10",X"1E",X"5C",X"5C",X"EE", - X"EB",X"01",X"11",X"1E",X"5C",X"5C",X"EE",X"EB",X"01",X"12",X"1E",X"5C",X"5C",X"EE",X"EB",X"01", - X"13",X"1C",X"FD",X"EF",X"F0",X"F1",X"F2",X"F3",X"01",X"14",X"18",X"03",X"04",X"F8",X"F7",X"F6", - X"F4",X"F5",X"01",X"15",X"18",X"03",X"05",X"F8",X"F7",X"F6",X"F6",X"EF",X"FC",X"01",X"16",X"18", - X"03",X"06",X"F8",X"F7",X"F6",X"F6",X"F4",X"F5",X"01",X"17",X"18",X"03",X"07",X"F8",X"F7",X"F6", - X"F6",X"F6",X"EF",X"FC",X"01",X"18",X"18",X"03",X"08",X"F8",X"F7",X"F6",X"F6",X"F6",X"F4",X"F5", - X"01",X"19",X"18",X"03",X"09",X"F8",X"F7",X"03",X"04",X"F6",X"EF",X"F9",X"01",X"1A",X"18",X"03", - X"0A",X"F8",X"F7",X"03",X"04",X"F6",X"F4",X"F5",X"01",X"1B",X"18",X"03",X"0B",X"F8",X"F7",X"03", - X"05",X"F6",X"EF",X"FC",X"01",X"1C",X"18",X"03",X"0C",X"F8",X"F7",X"03",X"05",X"F6",X"F4",X"F5", - X"01",X"1D",X"18",X"03",X"0D",X"F8",X"F7",X"03",X"06",X"F6",X"EF",X"FC",X"01",X"1E",X"18",X"03", - X"0E",X"F8",X"F7",X"03",X"06",X"F6",X"F4",X"F5",X"01",X"1F",X"18",X"03",X"0F",X"F8",X"F7",X"03", - X"07",X"F6",X"EF",X"02",X"10",X"01",X"09",X"18",X"03",X"06",X"04",X"01",X"0A",X"18",X"03",X"06", - X"04",X"01",X"0B",X"18",X"03",X"06",X"04",X"01",X"0C",X"18",X"03",X"06",X"04",X"01",X"0D",X"18", - X"03",X"06",X"04",X"01",X"0E",X"18",X"03",X"06",X"04",X"01",X"0F",X"18",X"03",X"06",X"04",X"01", - X"10",X"18",X"03",X"06",X"04",X"01",X"11",X"18",X"03",X"06",X"04",X"01",X"12",X"18",X"03",X"06", - X"04",X"01",X"13",X"18",X"03",X"04",X"04",X"02",X"55",X"01",X"13",X"22",X"03",X"05",X"94",X"D5", - X"FA",X"03",X"07",X"94",X"01",X"14",X"20",X"03",X"07",X"94",X"D5",X"FA",X"03",X"07",X"94",X"01", - X"15",X"22",X"03",X"05",X"94",X"D5",X"FA",X"03",X"07",X"94",X"01",X"16",X"23",X"03",X"04",X"94", - X"D5",X"FA",X"03",X"07",X"94",X"01",X"17",X"25",X"94",X"D6",X"D7",X"D8",X"D9",X"03",X"06",X"94", - X"01",X"18",X"26",X"DA",X"DB",X"DC",X"DD",X"DE",X"03",X"05",X"94",X"01",X"19",X"28",X"E0",X"E1", - X"E2",X"E3",X"E4",X"94",X"94",X"94",X"01",X"1A",X"29",X"94",X"94",X"E5",X"E6",X"E3",X"E4",X"94", - X"01",X"1B",X"2B",X"94",X"94",X"E5",X"E6",X"E3",X"01",X"1C",X"2C",X"94",X"94",X"94",X"E5",X"01", - X"1D",X"2E",X"94",X"94",X"01",X"1E",X"2F",X"94",X"00",X"4C",X"0C",X"99",X"00",X"4E",X"0C",X"99", - X"10",X"50",X"0C",X"99",X"20",X"52",X"0C",X"79",X"00",X"54",X"0C",X"79",X"10",X"A8",X"0C",X"79", - X"20",X"A8",X"0C",X"89",X"20",X"70",X"0C",X"59",X"00",X"72",X"0C",X"59",X"10",X"74",X"0C",X"59", - X"20",X"76",X"4C",X"7D",X"00",X"00",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"21",X"2A",X"5C",X"A7",X"28",X"03",X"21",X"5C",X"5C",X"7E",X"32",X"DB",X"E5",X"23",X"22",X"DC", - X"E5",X"C9",X"21",X"DB",X"E5",X"35",X"2A",X"DC",X"E5",X"20",X"0D",X"7E",X"3C",X"28",X"09",X"23", - X"7E",X"32",X"DB",X"E5",X"23",X"22",X"DC",X"E5",X"7E",X"C9",X"0C",X"02",X"78",X"80",X"14",X"02", - X"32",X"80",X"24",X"08",X"32",X"02",X"23",X"20",X"32",X"01",X"5A",X"02",X"1E",X"20",X"0C",X"02", - X"1E",X"20",X"0C",X"02",X"5A",X"20",X"73",X"01",X"24",X"08",X"5A",X"01",X"24",X"08",X"64",X"01", - X"32",X"04",X"5F",X"02",X"23",X"20",X"14",X"80",X"1E",X"08",X"FF",X"FF",X"8C",X"01",X"DC",X"08", - X"19",X"02",X"19",X"01",X"14",X"80",X"14",X"04",X"14",X"80",X"4A",X"02",X"C8",X"01",X"EB",X"02", - X"6E",X"80",X"37",X"02",X"50",X"01",X"14",X"80",X"0A",X"01",X"0A",X"02",X"0F",X"01",X"0A",X"02", - X"05",X"01",X"0A",X"02",X"28",X"08",X"FF",X"FF",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"3E",X"13",X"CD",X"42",X"31",X"CD",X"5E",X"5F",X"3E",X"01",X"32",X"AE",X"E6",X"18",X"04",X"AF", - X"32",X"AE",X"E6",X"3A",X"90",X"E5",X"FE",X"00",X"20",X"05",X"3E",X"20",X"CD",X"42",X"31",X"CD", - X"C9",X"5E",X"3A",X"B7",X"E5",X"B7",X"28",X"35",X"3A",X"AE",X"E6",X"B7",X"20",X"2F",X"CD",X"D6", - X"5E",X"3E",X"02",X"32",X"88",X"E5",X"3E",X"0E",X"CD",X"3E",X"30",X"21",X"2E",X"D6",X"36",X"00", - X"54",X"5D",X"13",X"01",X"27",X"00",X"ED",X"B0",X"3E",X"0E",X"CD",X"3E",X"30",X"CD",X"D6",X"5E", - X"21",X"88",X"E5",X"35",X"20",X"E0",X"3E",X"70",X"CD",X"3E",X"30",X"18",X"35",X"3A",X"90",X"E5", - X"FE",X"00",X"21",X"36",X"D6",X"CC",X"9A",X"31",X"3E",X"02",X"32",X"88",X"E5",X"3E",X"0E",X"CD", - X"3E",X"30",X"21",X"32",X"D7",X"36",X"00",X"54",X"5D",X"13",X"01",X"1B",X"00",X"ED",X"B0",X"3E", - X"0E",X"CD",X"3E",X"30",X"CD",X"C9",X"5E",X"21",X"88",X"E5",X"35",X"20",X"E0",X"3E",X"38",X"CD", - X"3E",X"30",X"3E",X"01",X"32",X"90",X"E5",X"3A",X"8E",X"E5",X"3D",X"CD",X"EC",X"31",X"79",X"3C", - X"32",X"CC",X"E5",X"79",X"E6",X"07",X"3C",X"32",X"CD",X"E5",X"21",X"00",X"00",X"22",X"8A",X"E5", - X"22",X"8B",X"E5",X"21",X"6C",X"E5",X"FE",X"01",X"20",X"09",X"36",X"30",X"3E",X"60",X"32",X"8B", - X"E5",X"18",X"14",X"FE",X"02",X"20",X"09",X"36",X"40",X"3E",X"80",X"32",X"8B",X"E5",X"18",X"07", - X"36",X"50",X"3E",X"01",X"32",X"8A",X"E5",X"79",X"CB",X"3F",X"CB",X"3F",X"CB",X"3F",X"21",X"DF", - X"E5",X"86",X"87",X"5F",X"16",X"00",X"21",X"35",X"5F",X"19",X"5E",X"23",X"56",X"ED",X"53",X"E1", - X"E5",X"3E",X"14",X"CD",X"42",X"31",X"CD",X"80",X"61",X"CD",X"D7",X"63",X"AF",X"32",X"A6",X"E5", - X"CD",X"43",X"5F",X"CD",X"E7",X"62",X"21",X"10",X"D0",X"11",X"ED",X"5E",X"CD",X"2D",X"30",X"CD", - X"03",X"32",X"0E",X"1E",X"21",X"4A",X"D0",X"3A",X"8E",X"E5",X"CD",X"48",X"30",X"CD",X"F7",X"31", - X"0E",X"04",X"11",X"97",X"E5",X"21",X"60",X"D0",X"3A",X"B8",X"E5",X"B7",X"28",X"03",X"21",X"18", - X"D0",X"06",X"03",X"CD",X"5F",X"30",X"10",X"FB",X"0E",X"06",X"11",X"9A",X"E5",X"21",X"38",X"D0", - X"06",X"03",X"CD",X"5F",X"30",X"10",X"FB",X"3A",X"B4",X"E6",X"FE",X"0C",X"20",X"14",X"21",X"BA", - X"E1",X"06",X"07",X"36",X"0D",X"23",X"23",X"23",X"36",X"0D",X"11",X"15",X"00",X"19",X"10",X"F3", - X"18",X"0C",X"FE",X"10",X"20",X"08",X"3E",X"01",X"32",X"FF",X"E4",X"32",X"00",X"E5",X"3A",X"A7", - X"E5",X"B7",X"20",X"43",X"3A",X"AE",X"E6",X"B7",X"20",X"10",X"3A",X"B7",X"E5",X"B7",X"28",X"0A", - X"3E",X"16",X"32",X"B6",X"E5",X"3E",X"18",X"32",X"AD",X"E6",X"3E",X"01",X"32",X"9D",X"E5",X"21", - X"4A",X"E4",X"06",X"0A",X"78",X"C6",X"02",X"E6",X"03",X"20",X"05",X"3E",X"17",X"CD",X"42",X"31", - X"7E",X"FE",X"FF",X"20",X"04",X"36",X"12",X"18",X"02",X"36",X"FF",X"3E",X"09",X"CD",X"3E",X"30", - X"10",X"E2",X"3E",X"26",X"CD",X"42",X"31",X"3E",X"02",X"32",X"9D",X"E5",X"3E",X"15",X"32",X"B1", - X"E6",X"3E",X"01",X"32",X"68",X"E5",X"C3",X"29",X"00",X"21",X"32",X"D7",X"CD",X"85",X"31",X"11", - X"23",X"5F",X"CD",X"2D",X"30",X"C9",X"0E",X"06",X"3A",X"B8",X"E5",X"C6",X"31",X"21",X"2E",X"D6", - X"CD",X"6A",X"30",X"11",X"2B",X"5F",X"CD",X"2D",X"30",X"CD",X"9A",X"31",X"C9",X"06",X"20",X"31", - X"50",X"2D",X"20",X"20",X"20",X"20",X"20",X"20",X"1E",X"3C",X"31",X"30",X"30",X"30",X"30",X"3E", - X"06",X"48",X"49",X"2D",X"20",X"20",X"20",X"20",X"20",X"20",X"1E",X"3C",X"52",X"2D",X"20",X"20", - X"20",X"5E",X"5F",X"2D",X"20",X"3E",X"06",X"32",X"50",X"2D",X"20",X"20",X"20",X"20",X"20",X"20", - X"20",X"20",X"00",X"06",X"20",X"52",X"45",X"41",X"44",X"59",X"00",X"06",X"2D",X"50",X"4C",X"41", - X"59",X"45",X"52",X"20",X"00",X"98",X"00",X"04",X"01",X"10",X"01",X"14",X"01",X"17",X"01",X"21", - X"01",X"26",X"01",X"3E",X"01",X"32",X"74",X"E5",X"AF",X"32",X"73",X"E5",X"CD",X"91",X"5F",X"3E", - X"02",X"CD",X"3E",X"30",X"21",X"73",X"E5",X"34",X"7E",X"FE",X"1E",X"38",X"EF",X"C9",X"DD",X"21", - X"00",X"E3",X"06",X"10",X"DD",X"36",X"04",X"00",X"DD",X"36",X"0C",X"00",X"11",X"10",X"00",X"DD", - X"19",X"10",X"F1",X"AF",X"32",X"74",X"E5",X"32",X"A6",X"E5",X"3E",X"1C",X"32",X"73",X"E5",X"CD", - X"91",X"5F",X"3E",X"02",X"CD",X"3E",X"30",X"21",X"73",X"E5",X"35",X"7E",X"FE",X"FF",X"20",X"EF", - X"C9",X"87",X"4F",X"AF",X"47",X"91",X"57",X"CB",X"21",X"78",X"E6",X"03",X"CC",X"AD",X"5F",X"7A", - X"CB",X"7F",X"20",X"02",X"0D",X"91",X"04",X"80",X"57",X"79",X"B8",X"30",X"EC",X"C5",X"D5",X"CB", - X"38",X"CB",X"38",X"30",X"01",X"04",X"CB",X"39",X"CB",X"39",X"30",X"01",X"0C",X"2E",X"10",X"CD", - X"D2",X"5F",X"3A",X"74",X"E5",X"B7",X"28",X"03",X"0D",X"18",X"01",X"0C",X"CD",X"D2",X"5F",X"D1", - X"C1",X"C9",X"51",X"3E",X"18",X"80",X"FE",X"30",X"DC",X"F1",X"5F",X"3E",X"18",X"90",X"D4",X"F1", - X"5F",X"50",X"3E",X"18",X"81",X"FE",X"30",X"DC",X"F1",X"5F",X"3E",X"18",X"91",X"D4",X"F1",X"5F", - X"C9",X"67",X"7D",X"82",X"FE",X"20",X"DC",X"00",X"60",X"7D",X"92",X"D8",X"CD",X"00",X"60",X"C9", - X"C5",X"D5",X"E5",X"6F",X"3A",X"A6",X"E5",X"B7",X"C2",X"3C",X"61",X"7C",X"CB",X"3F",X"CB",X"12", - X"67",X"22",X"D6",X"E5",X"CD",X"D5",X"62",X"7E",X"FE",X"01",X"20",X"08",X"3A",X"D8",X"E5",X"47", - X"0E",X"1F",X"18",X"11",X"FE",X"02",X"20",X"08",X"3A",X"D9",X"E5",X"47",X"0E",X"1D",X"18",X"05", - X"CD",X"55",X"60",X"0E",X"05",X"2A",X"D6",X"E5",X"7C",X"D5",X"CD",X"00",X"2D",X"D1",X"CB",X"42", - X"28",X"02",X"2C",X"2C",X"3A",X"74",X"E5",X"B7",X"20",X"04",X"06",X"04",X"0E",X"00",X"70",X"2C", - X"71",X"E1",X"D1",X"C1",X"C9",X"FE",X"07",X"38",X"01",X"AF",X"FE",X"03",X"38",X"02",X"3D",X"3D", - X"47",X"3A",X"D6",X"E5",X"B7",X"C8",X"3A",X"D7",X"E5",X"B7",X"28",X"0C",X"2B",X"7E",X"FE",X"07", - X"38",X"01",X"AF",X"FE",X"02",X"38",X"01",X"3D",X"4F",X"2A",X"D6",X"E5",X"2D",X"7C",X"C5",X"CD", - X"D5",X"62",X"C1",X"7E",X"FE",X"04",X"38",X"01",X"AF",X"FE",X"02",X"38",X"01",X"3D",X"5F",X"3A", - X"D7",X"E5",X"B7",X"28",X"0C",X"2B",X"7E",X"FE",X"04",X"38",X"01",X"AF",X"FE",X"02",X"38",X"01", - X"3D",X"6F",X"CB",X"42",X"28",X"0D",X"78",X"87",X"80",X"83",X"4F",X"06",X"00",X"21",X"C7",X"60", - X"09",X"46",X"C9",X"78",X"87",X"80",X"83",X"5F",X"87",X"83",X"85",X"87",X"87",X"81",X"4F",X"06", - X"00",X"21",X"D0",X"60",X"09",X"46",X"C9",X"00",X"03",X"00",X"14",X"15",X"14",X"18",X"1B",X"18", - X"00",X"02",X"00",X"00",X"03",X"03",X"03",X"03",X"00",X"02",X"00",X"00",X"01",X"03",X"01",X"01", - X"03",X"03",X"03",X"03",X"01",X"03",X"01",X"01",X"00",X"02",X"00",X"00",X"03",X"03",X"03",X"03", - X"00",X"02",X"00",X"00",X"10",X"12",X"10",X"10",X"13",X"13",X"13",X"13",X"10",X"12",X"10",X"10", - X"11",X"13",X"11",X"11",X"13",X"13",X"13",X"13",X"11",X"13",X"11",X"11",X"10",X"12",X"10",X"10", - X"13",X"13",X"13",X"13",X"10",X"12",X"10",X"10",X"18",X"1A",X"18",X"18",X"1B",X"1B",X"1B",X"1B", - X"18",X"1A",X"18",X"18",X"19",X"1B",X"19",X"19",X"1B",X"1B",X"1B",X"1B",X"19",X"1B",X"19",X"19", - X"18",X"1A",X"18",X"18",X"1B",X"1B",X"1B",X"1B",X"18",X"1A",X"18",X"18",X"7C",X"CB",X"3F",X"CB", - X"12",X"67",X"E5",X"CD",X"D5",X"62",X"7E",X"E1",X"CB",X"42",X"20",X"04",X"0F",X"0F",X"0F",X"0F", - X"E6",X"0F",X"4F",X"42",X"7C",X"CD",X"00",X"2D",X"2C",X"CB",X"40",X"28",X"02",X"2C",X"2C",X"7E", - X"B1",X"77",X"E6",X"C0",X"20",X"0A",X"2D",X"7E",X"FE",X"04",X"20",X"02",X"36",X"00",X"18",X"0C", - X"FE",X"40",X"20",X"08",X"2D",X"7E",X"FE",X"FD",X"20",X"02",X"36",X"FB",X"E1",X"D1",X"C1",X"C9", - X"21",X"00",X"E0",X"54",X"5D",X"13",X"36",X"00",X"01",X"68",X"05",X"ED",X"B0",X"ED",X"5F",X"CD", - X"EC",X"31",X"32",X"70",X"E5",X"FD",X"21",X"58",X"E4",X"3A",X"8E",X"E5",X"FE",X"19",X"38",X"04", - X"D6",X"18",X"18",X"F8",X"32",X"B4",X"E6",X"6F",X"26",X"00",X"29",X"EB",X"21",X"00",X"34",X"19", - X"5E",X"23",X"56",X"1A",X"32",X"AF",X"E6",X"13",X"AF",X"32",X"7A",X"E5",X"1A",X"CB",X"7F",X"20", - X"07",X"FE",X"1F",X"C8",X"32",X"7A",X"E5",X"13",X"1A",X"CB",X"7F",X"28",X"EF",X"CB",X"77",X"28", - X"03",X"13",X"18",X"F4",X"3E",X"01",X"32",X"79",X"E5",X"1A",X"E6",X"1F",X"32",X"78",X"E5",X"32", - X"77",X"E5",X"1A",X"CB",X"6F",X"28",X"09",X"3E",X"02",X"32",X"79",X"E5",X"21",X"77",X"E5",X"34", - X"AF",X"32",X"75",X"E5",X"13",X"1A",X"E6",X"C0",X"FE",X"80",X"20",X"10",X"1A",X"E6",X"1F",X"32", - X"77",X"E5",X"21",X"78",X"E5",X"96",X"3C",X"32",X"79",X"E5",X"18",X"E8",X"1A",X"E6",X"C0",X"FE", - X"C0",X"20",X"B5",X"1A",X"CB",X"6F",X"20",X"06",X"E6",X"1F",X"32",X"75",X"E5",X"13",X"1A",X"E6", - X"E0",X"FE",X"E0",X"20",X"15",X"1A",X"E6",X"1F",X"32",X"76",X"E5",X"13",X"3A",X"76",X"E5",X"21", - X"75",X"E5",X"BE",X"38",X"D7",X"CD",X"3F",X"62",X"18",X"F2",X"CD",X"3F",X"62",X"18",X"CD",X"3A", - X"7A",X"E5",X"FE",X"04",X"28",X"7F",X"FE",X"0B",X"30",X"04",X"FE",X"07",X"30",X"42",X"FE",X"06", - X"28",X"1D",X"3A",X"79",X"E5",X"B7",X"28",X"78",X"21",X"77",X"E5",X"4E",X"47",X"C5",X"3A",X"75", - X"E5",X"69",X"CD",X"D5",X"62",X"C1",X"3A",X"7A",X"E5",X"77",X"0D",X"10",X"F0",X"18",X"61",X"21", - X"FD",X"E4",X"7E",X"FE",X"04",X"30",X"59",X"34",X"47",X"87",X"80",X"4F",X"06",X"00",X"21",X"7B", - X"E5",X"09",X"3A",X"75",X"E5",X"77",X"23",X"ED",X"4B",X"77",X"E5",X"70",X"23",X"71",X"18",X"40", - X"FE",X"08",X"20",X"0E",X"CD",X"0B",X"63",X"01",X"18",X"00",X"FD",X"09",X"21",X"E9",X"E4",X"34", - X"18",X"21",X"FE",X"09",X"20",X"0D",X"FD",X"E5",X"FD",X"21",X"40",X"E4",X"CD",X"0B",X"63",X"FD", - X"E1",X"18",X"10",X"FE",X"07",X"20",X"05",X"CD",X"5A",X"63",X"18",X"07",X"FE",X"0A",X"20",X"03", - X"CD",X"74",X"63",X"18",X"0B",X"3A",X"75",X"E5",X"2A",X"78",X"E5",X"CD",X"D5",X"62",X"36",X"04", - X"21",X"75",X"E5",X"34",X"C9",X"26",X"00",X"29",X"29",X"29",X"44",X"4D",X"29",X"09",X"4F",X"06", - X"00",X"09",X"01",X"00",X"E0",X"09",X"C9",X"11",X"00",X"E4",X"3A",X"FC",X"E4",X"B7",X"28",X"0D", - X"47",X"1A",X"6F",X"13",X"1A",X"67",X"13",X"7D",X"CD",X"AA",X"2F",X"10",X"F4",X"C9",X"00",X"08", - X"0D",X"10",X"18",X"00",X"08",X"08",X"09",X"0B",X"0B",X"0A",X"08",X"FD",X"36",X"0A",X"00",X"FE", - X"09",X"20",X"08",X"AF",X"32",X"0C",X"E5",X"3D",X"32",X"0B",X"E5",X"3E",X"01",X"FD",X"77",X"0F", - X"FD",X"77",X"10",X"3A",X"75",X"E5",X"FD",X"77",X"01",X"FD",X"77",X"04",X"87",X"87",X"87",X"FD", - X"77",X"07",X"3A",X"78",X"E5",X"FD",X"77",X"03",X"FD",X"77",X"05",X"87",X"87",X"87",X"FD",X"77", - X"06",X"3E",X"06",X"FD",X"77",X"09",X"AF",X"FD",X"77",X"00",X"FD",X"77",X"02",X"FD",X"77",X"0A", - X"FD",X"77",X"0C",X"FD",X"77",X"0D",X"FD",X"77",X"0E",X"C9",X"21",X"FC",X"E4",X"7E",X"FE",X"20", - X"D0",X"34",X"87",X"4F",X"06",X"00",X"21",X"00",X"E4",X"09",X"3A",X"75",X"E5",X"77",X"23",X"3A", - X"78",X"E5",X"77",X"C9",X"21",X"70",X"E5",X"7E",X"B7",X"20",X"0C",X"3A",X"78",X"E5",X"32",X"72", - X"E5",X"3A",X"75",X"E5",X"32",X"71",X"E5",X"35",X"C9",X"1F",X"CB",X"11",X"3A",X"FD",X"E4",X"32", - X"69",X"E5",X"DD",X"21",X"7B",X"E5",X"21",X"69",X"E5",X"7E",X"B7",X"C8",X"35",X"DD",X"7E",X"00", - X"DD",X"66",X"01",X"87",X"87",X"87",X"CB",X"3C",X"1F",X"6F",X"11",X"10",X"D0",X"19",X"DD",X"7E", - X"02",X"DD",X"96",X"01",X"3C",X"47",X"CB",X"41",X"28",X"08",X"36",X"17",X"2C",X"2C",X"36",X"17", - X"18",X"06",X"36",X"10",X"2C",X"2C",X"36",X"14",X"2D",X"2D",X"11",X"80",X"00",X"19",X"10",X"E6", - X"11",X"03",X"00",X"DD",X"19",X"18",X"BF",X"3A",X"CD",X"E5",X"4F",X"87",X"81",X"6F",X"26",X"00", - X"29",X"29",X"29",X"29",X"22",X"F6",X"E4",X"21",X"30",X"64",X"06",X"00",X"09",X"7E",X"32",X"F8", - X"E4",X"21",X"39",X"64",X"09",X"7E",X"32",X"F5",X"E4",X"21",X"42",X"64",X"09",X"7E",X"32",X"FB", - X"E4",X"79",X"E6",X"07",X"3C",X"4F",X"21",X"30",X"64",X"09",X"7E",X"32",X"6E",X"E5",X"21",X"42", - X"64",X"09",X"7E",X"32",X"6F",X"E5",X"3A",X"8E",X"E5",X"CD",X"EC",X"31",X"4F",X"06",X"00",X"21", - X"4B",X"64",X"09",X"7E",X"32",X"D8",X"E5",X"21",X"4E",X"64",X"09",X"7E",X"32",X"D9",X"E5",X"C9", - X"00",X"04",X"08",X"0E",X"0A",X"07",X"0F",X"05",X"00",X"00",X"00",X"01",X"00",X"01",X"00",X"00", - X"01",X"00",X"00",X"01",X"01",X"01",X"00",X"01",X"01",X"00",X"01",X"09",X"0A",X"08",X"0D",X"0E", - X"0C",X"AF",X"32",X"89",X"E5",X"7E",X"B7",X"C8",X"3D",X"20",X"24",X"23",X"EB",X"1A",X"6F",X"13", - X"1A",X"13",X"D5",X"CB",X"3F",X"CB",X"10",X"5D",X"57",X"D5",X"CD",X"00",X"2D",X"D1",X"CB",X"40", - X"28",X"02",X"2C",X"2C",X"EB",X"7C",X"CD",X"D5",X"62",X"E5",X"DD",X"E1",X"E1",X"18",X"D6",X"3D", - X"20",X"08",X"23",X"7E",X"32",X"88",X"E5",X"23",X"18",X"CB",X"06",X"01",X"3D",X"20",X"14",X"23", - X"46",X"23",X"CB",X"78",X"28",X"0D",X"78",X"06",X"30",X"E6",X"7F",X"FE",X"02",X"38",X"04",X"3D", - X"32",X"89",X"E5",X"3A",X"88",X"E5",X"E6",X"0F",X"CB",X"4B",X"28",X"0E",X"4F",X"DD",X"7E",X"00", - X"E6",X"F0",X"B1",X"DD",X"77",X"00",X"DD",X"23",X"18",X"0E",X"0F",X"0F",X"0F",X"0F",X"4F",X"DD", - X"7E",X"00",X"E6",X"0F",X"B1",X"DD",X"77",X"00",X"7E",X"12",X"13",X"3A",X"88",X"E5",X"E6",X"F0", - X"12",X"13",X"7B",X"FE",X"70",X"20",X"02",X"1E",X"90",X"FE",X"F0",X"20",X"03",X"1E",X"10",X"14", - X"10",X"C1",X"3A",X"89",X"E5",X"B7",X"28",X"08",X"3D",X"32",X"89",X"E5",X"06",X"30",X"18",X"B3", - X"23",X"C3",X"55",X"64",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"21",X"36",X"D5",X"11",X"1F",X"68",X"CD",X"2D",X"30",X"3E",X"24",X"CD",X"3E",X"30",X"DB",X"04", - X"CB",X"57",X"28",X"2D",X"DB",X"03",X"0F",X"0F",X"E6",X"3C",X"C6",X"10",X"21",X"FA",X"65",X"5F", - X"16",X"00",X"19",X"5E",X"23",X"56",X"23",X"D5",X"7E",X"23",X"66",X"6F",X"11",X"B0",X"D6",X"EB", - X"CD",X"2D",X"30",X"3E",X"24",X"CD",X"3E",X"30",X"D1",X"21",X"B0",X"D7",X"CD",X"2D",X"30",X"18", - X"39",X"DB",X"03",X"07",X"07",X"07",X"F5",X"E6",X"06",X"5F",X"16",X"00",X"21",X"FA",X"65",X"19", - X"5E",X"23",X"56",X"23",X"F1",X"D5",X"07",X"07",X"E6",X"06",X"C6",X"08",X"5F",X"16",X"00",X"21", - X"FA",X"65",X"19",X"7E",X"23",X"66",X"6F",X"11",X"AC",X"D6",X"EB",X"CD",X"2D",X"30",X"3E",X"24", - X"CD",X"3E",X"30",X"D1",X"21",X"AC",X"D7",X"CD",X"2D",X"30",X"06",X"06",X"C5",X"21",X"36",X"D5", - X"11",X"2D",X"68",X"CD",X"2D",X"30",X"3E",X"0C",X"CD",X"3E",X"30",X"21",X"36",X"D5",X"11",X"1F", - X"68",X"CD",X"2D",X"30",X"3E",X"18",X"CD",X"3E",X"30",X"C1",X"10",X"E0",X"C9",X"3A",X"57",X"E4", - X"FE",X"01",X"20",X"0B",X"21",X"28",X"DA",X"11",X"3B",X"68",X"CD",X"2D",X"30",X"18",X"4A",X"3A", - X"57",X"E4",X"FE",X"02",X"20",X"16",X"0E",X"C6",X"21",X"3C",X"DB",X"11",X"55",X"68",X"CD",X"2D", - X"30",X"21",X"BC",X"DB",X"11",X"5A",X"68",X"CD",X"2D",X"30",X"18",X"2D",X"3A",X"57",X"E4",X"FE", - X"03",X"20",X"0B",X"21",X"B2",X"DC",X"11",X"5F",X"68",X"CD",X"2D",X"30",X"18",X"1B",X"3A",X"57", - X"E4",X"FE",X"04",X"20",X"14",X"0E",X"C6",X"21",X"B6",X"DD",X"11",X"6F",X"68",X"CD",X"2D",X"30", - X"21",X"36",X"DE",X"11",X"7A",X"68",X"CD",X"2D",X"30",X"C9",X"C6",X"67",X"DC",X"67",X"F2",X"67", - X"08",X"68",X"1E",X"68",X"87",X"67",X"9C",X"67",X"B1",X"67",X"1E",X"68",X"1E",X"68",X"1E",X"68", - X"1E",X"68",X"1E",X"68",X"1E",X"68",X"1E",X"68",X"28",X"67",X"1E",X"68",X"3B",X"67",X"1E",X"68", - X"4E",X"67",X"1E",X"68",X"61",X"67",X"1E",X"68",X"74",X"67",X"1E",X"68",X"1E",X"68",X"1E",X"68", - X"1E",X"68",X"5C",X"66",X"4A",X"66",X"81",X"66",X"6F",X"66",X"A6",X"66",X"94",X"66",X"CB",X"66", - X"B9",X"66",X"F0",X"66",X"DE",X"66",X"15",X"67",X"03",X"67",X"20",X"36",X"20",X"43",X"4F",X"49", - X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"00",X"31",X"32",X"20",X"43", - X"4F",X"49",X"4E",X"53",X"20",X"32",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"20", - X"35",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"45",X"52", - X"00",X"31",X"30",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"32",X"20",X"50",X"4C",X"41",X"59", - X"45",X"52",X"53",X"00",X"20",X"34",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"31",X"20",X"50", - X"4C",X"41",X"59",X"45",X"52",X"00",X"20",X"38",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"32", - X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"20",X"33",X"20",X"43",X"4F",X"49",X"4E", - X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"00",X"20",X"36",X"20",X"43",X"4F", - X"49",X"4E",X"53",X"20",X"32",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"20",X"32", - X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"00", - X"20",X"34",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"32",X"20",X"50",X"4C",X"41",X"59",X"45", - X"52",X"53",X"00",X"20",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"20",X"31",X"20",X"50",X"4C", - X"41",X"59",X"45",X"52",X"00",X"20",X"32",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"32",X"20", - X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"20",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20", - X"20",X"36",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"20",X"31",X"20",X"43",X"4F", - X"49",X"4E",X"20",X"20",X"35",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"20",X"31", - X"20",X"43",X"4F",X"49",X"4E",X"20",X"20",X"34",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53", - X"00",X"20",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"20",X"33",X"20",X"50",X"4C",X"41",X"59", - X"45",X"52",X"53",X"00",X"20",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"20",X"32",X"20",X"50", - X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"41",X"20",X"2D",X"20",X"33",X"20",X"43",X"4F",X"49", - X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"00",X"41",X"20",X"2D",X"20", - X"32",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"45",X"52", - X"00",X"41",X"20",X"2D",X"20",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"20",X"31",X"20",X"50", - X"4C",X"41",X"59",X"45",X"52",X"00",X"42",X"20",X"2D",X"20",X"31",X"20",X"43",X"4F",X"49",X"4E", - X"20",X"20",X"36",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"42",X"20",X"2D",X"20", - X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"20",X"35",X"20",X"50",X"4C",X"41",X"59",X"45",X"52", - X"53",X"00",X"42",X"20",X"2D",X"20",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"20",X"33",X"20", - X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"42",X"20",X"2D",X"20",X"31",X"20",X"43",X"4F", - X"49",X"4E",X"20",X"20",X"32",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"00",X"02", - X"49",X"4E",X"53",X"45",X"52",X"54",X"20",X"20",X"43",X"4F",X"49",X"4E",X"00",X"02",X"20",X"20", - X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"06",X"40",X"31",X"39",X"38", - X"34",X"20",X"20",X"20",X"49",X"52",X"45",X"4D",X"20",X"43",X"4F",X"52",X"50",X"4F",X"52",X"41", - X"54",X"49",X"4F",X"4E",X"00",X"80",X"82",X"84",X"86",X"00",X"81",X"83",X"85",X"87",X"00",X"02", - X"4C",X"49",X"43",X"45",X"4E",X"53",X"45",X"44",X"20",X"20",X"46",X"52",X"4F",X"4D",X"00",X"68", - X"6A",X"6C",X"6E",X"70",X"72",X"74",X"76",X"78",X"7A",X"00",X"69",X"6B",X"6D",X"6F",X"71",X"73", - X"75",X"77",X"79",X"7B",X"00",X"CD",X"5E",X"5F",X"3E",X"FF",X"32",X"D1",X"E5",X"CD",X"28",X"6D", - X"3E",X"A8",X"CD",X"3E",X"30",X"3E",X"01",X"32",X"A9",X"E5",X"CD",X"5E",X"5F",X"C3",X"CF",X"25", - X"31",X"00",X"E8",X"21",X"10",X"D0",X"36",X"00",X"54",X"5D",X"13",X"01",X"57",X"15",X"ED",X"B0", - X"AF",X"32",X"A7",X"E5",X"32",X"9D",X"E5",X"32",X"6A",X"E5",X"FB",X"3E",X"50",X"32",X"B5",X"E5", - X"21",X"B5",X"E5",X"7E",X"FE",X"14",X"38",X"0B",X"21",X"36",X"D5",X"11",X"91",X"69",X"CD",X"2D", - X"30",X"18",X"12",X"B7",X"20",X"02",X"36",X"28",X"21",X"26",X"D5",X"36",X"00",X"54",X"5D",X"13", - X"01",X"35",X"00",X"ED",X"B0",X"11",X"A0",X"69",X"3A",X"B2",X"E5",X"FE",X"02",X"38",X"03",X"11", - X"B2",X"69",X"21",X"34",X"D7",X"CD",X"2D",X"30",X"CD",X"7F",X"69",X"21",X"AA",X"E5",X"7E",X"E6", - X"0A",X"FE",X"0A",X"20",X"0E",X"3A",X"B2",X"E5",X"3D",X"27",X"32",X"B2",X"E5",X"AF",X"32",X"B7", - X"E5",X"18",X"1B",X"7E",X"E6",X"05",X"FE",X"05",X"C2",X"C0",X"68",X"3A",X"B2",X"E5",X"FE",X"02", - X"DA",X"C0",X"68",X"D6",X"02",X"27",X"32",X"B2",X"E5",X"3E",X"01",X"32",X"B7",X"E5",X"AF",X"32", - X"B9",X"E5",X"32",X"B8",X"E5",X"32",X"90",X"E5",X"32",X"96",X"E5",X"3C",X"32",X"B2",X"E6",X"CB", - X"41",X"20",X"06",X"32",X"8E",X"E5",X"32",X"94",X"E5",X"3A",X"E0",X"E5",X"32",X"8F",X"E5",X"32", - X"95",X"E5",X"21",X"00",X"00",X"22",X"91",X"E5",X"22",X"92",X"E5",X"22",X"97",X"E5",X"22",X"98", - X"E5",X"21",X"80",X"00",X"DB",X"04",X"CB",X"47",X"20",X"02",X"2D",X"2D",X"22",X"E3",X"E5",X"21", - X"10",X"D3",X"36",X"00",X"54",X"5D",X"13",X"01",X"7F",X"09",X"ED",X"B0",X"C3",X"0F",X"5D",X"21", - X"42",X"DC",X"11",X"C6",X"69",X"CD",X"2D",X"30",X"0E",X"02",X"11",X"B2",X"E5",X"CD",X"5F",X"30", - X"C9",X"04",X"50",X"55",X"53",X"48",X"20",X"20",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E",X"00", - X"04",X"4F",X"4E",X"4C",X"59",X"20",X"20",X"02",X"31",X"20",X"04",X"50",X"4C",X"41",X"59",X"45", - X"52",X"00",X"02",X"31",X"20",X"04",X"4F",X"52",X"20",X"02",X"32",X"20",X"20",X"04",X"50",X"4C", - X"41",X"59",X"45",X"52",X"53",X"00",X"04",X"43",X"52",X"45",X"44",X"49",X"54",X"20",X"00",X"06", - X"31",X"53",X"54",X"20",X"20",X"42",X"4C",X"4F",X"43",X"4B",X"00",X"21",X"30",X"D3",X"11",X"8F", - X"6A",X"CD",X"2D",X"30",X"3E",X"22",X"CD",X"42",X"31",X"3E",X"0A",X"32",X"88",X"E5",X"3E",X"38", - X"32",X"B6",X"E5",X"3E",X"50",X"32",X"B5",X"E5",X"21",X"B6",X"E5",X"7E",X"B7",X"20",X"09",X"36", - X"38",X"21",X"88",X"E5",X"35",X"CA",X"89",X"6A",X"21",X"B5",X"E5",X"7E",X"FE",X"14",X"38",X"1C", - X"3A",X"B2",X"E5",X"B7",X"20",X"0B",X"21",X"24",X"D5",X"11",X"A1",X"6A",X"CD",X"2D",X"30",X"18", - X"09",X"21",X"24",X"D5",X"11",X"C6",X"6A",X"CD",X"2D",X"30",X"18",X"12",X"B7",X"20",X"02",X"36", - X"27",X"21",X"24",X"D5",X"36",X"00",X"54",X"5D",X"13",X"01",X"35",X"00",X"ED",X"B0",X"CD",X"7F", - X"69",X"21",X"3A",X"D9",X"11",X"BE",X"6A",X"CD",X"2D",X"30",X"0E",X"06",X"3A",X"88",X"E5",X"3D", - X"CD",X"6A",X"30",X"21",X"AA",X"E5",X"7E",X"E6",X"0A",X"FE",X"0A",X"28",X"07",X"7E",X"E6",X"05", - X"FE",X"05",X"20",X"22",X"3A",X"B2",X"E5",X"B7",X"CA",X"F8",X"69",X"D6",X"01",X"27",X"32",X"B2", - X"E5",X"AF",X"32",X"90",X"E5",X"3A",X"E0",X"E5",X"32",X"8F",X"E5",X"21",X"00",X"00",X"22",X"91", - X"E5",X"22",X"92",X"E5",X"18",X"03",X"C3",X"F8",X"69",X"3E",X"00",X"CD",X"42",X"31",X"C9",X"03", - X"54",X"4F",X"20",X"43",X"4F",X"4E",X"54",X"49",X"4E",X"55",X"45",X"20",X"47",X"41",X"4D",X"45", - X"00",X"04",X"49",X"4E",X"53",X"45",X"52",X"54",X"20",X"43",X"4F",X"49",X"4E",X"20",X"41",X"4E", - X"44",X"20",X"50",X"55",X"53",X"48",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E",X"00",X"03",X"54", - X"49",X"4D",X"45",X"20",X"20",X"00",X"04",X"20",X"20",X"20",X"20",X"20",X"50",X"55",X"53",X"48", - X"20",X"53",X"54",X"41",X"52",X"54",X"20",X"42",X"55",X"54",X"54",X"4F",X"4E",X"20",X"20",X"20", - X"20",X"20",X"00",X"3E",X"13",X"CD",X"42",X"31",X"CD",X"5E",X"5F",X"3A",X"90",X"E5",X"FE",X"02", - X"20",X"26",X"AF",X"32",X"B2",X"E6",X"CD",X"A8",X"6B",X"CD",X"DB",X"69",X"3E",X"01",X"32",X"B2", - X"E6",X"3A",X"90",X"E5",X"FE",X"00",X"20",X"10",X"21",X"10",X"D3",X"36",X"00",X"54",X"5D",X"13", - X"01",X"7F",X"09",X"ED",X"B0",X"C3",X"0F",X"5D",X"3A",X"B7",X"E5",X"FE",X"00",X"28",X"07",X"3A", - X"96",X"E5",X"FE",X"02",X"20",X"2E",X"3A",X"90",X"E5",X"FE",X"02",X"28",X"10",X"21",X"10",X"D3", - X"36",X"00",X"54",X"5D",X"13",X"01",X"7F",X"09",X"ED",X"B0",X"C3",X"0F",X"5D",X"CD",X"5E",X"5F", - X"AF",X"32",X"B2",X"E6",X"32",X"B9",X"E5",X"3E",X"01",X"CD",X"3E",X"30",X"3E",X"01",X"32",X"A7", - X"E5",X"C3",X"CF",X"25",X"21",X"10",X"D3",X"36",X"00",X"54",X"5D",X"13",X"01",X"7F",X"09",X"ED", - X"B0",X"21",X"B8",X"E5",X"7E",X"B7",X"20",X"03",X"34",X"18",X"02",X"36",X"00",X"CD",X"96",X"6B", - X"DB",X"04",X"CB",X"4F",X"28",X"1D",X"21",X"B9",X"E5",X"CB",X"46",X"20",X"03",X"34",X"18",X"01", - X"35",X"E6",X"01",X"AE",X"21",X"80",X"00",X"20",X"02",X"2D",X"2D",X"22",X"E3",X"E5",X"3E",X"01", - X"CD",X"3E",X"30",X"C3",X"0F",X"5D",X"21",X"8E",X"E5",X"11",X"94",X"E5",X"06",X"06",X"1A",X"4E", - X"77",X"79",X"12",X"23",X"13",X"10",X"F7",X"C9",X"0E",X"00",X"16",X"15",X"21",X"E5",X"E5",X"06", - X"00",X"09",X"DD",X"21",X"91",X"E5",X"06",X"03",X"DD",X"7E",X"00",X"BE",X"38",X"12",X"28",X"0B", - X"15",X"3E",X"0A",X"81",X"4F",X"FE",X"C8",X"28",X"07",X"18",X"E1",X"DD",X"23",X"23",X"10",X"E8", - X"7A",X"32",X"D1",X"E5",X"79",X"B7",X"C8",X"D6",X"0A",X"11",X"E5",X"E5",X"28",X"08",X"4F",X"06", - X"00",X"21",X"EF",X"E5",X"ED",X"B0",X"21",X"91",X"E5",X"01",X"03",X"00",X"ED",X"B0",X"62",X"6B", - X"36",X"00",X"13",X"01",X"05",X"00",X"ED",X"B0",X"3A",X"8E",X"E5",X"12",X"CD",X"28",X"6D",X"21", - X"B8",X"D2",X"11",X"22",X"6D",X"CD",X"2D",X"30",X"DD",X"2A",X"D2",X"E5",X"11",X"16",X"00",X"DD", - X"19",X"FD",X"2A",X"D4",X"E5",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"0E",X"41",X"1E",X"03",X"3E", - X"14",X"32",X"88",X"E5",X"21",X"C2",X"D2",X"C5",X"0E",X"06",X"3A",X"88",X"E5",X"CD",X"48",X"30", - X"C1",X"06",X"04",X"3E",X"0E",X"32",X"B6",X"E5",X"AF",X"32",X"89",X"E5",X"3A",X"D0",X"E5",X"B7", - X"20",X"03",X"57",X"18",X"44",X"7A",X"B7",X"20",X"13",X"3A",X"D0",X"E5",X"FE",X"0A",X"20",X"04", - X"14",X"0C",X"18",X"06",X"FE",X"05",X"20",X"02",X"15",X"0D",X"18",X"1F",X"3A",X"D0",X"E5",X"FE", - X"AA",X"20",X"0B",X"14",X"7A",X"FE",X"18",X"20",X"03",X"0C",X"16",X"0C",X"18",X"0D",X"FE",X"55", - X"20",X"09",X"15",X"7A",X"FE",X"E8",X"20",X"03",X"0D",X"16",X"F4",X"79",X"FE",X"5D",X"38",X"02", - X"0E",X"41",X"79",X"FE",X"41",X"30",X"02",X"0E",X"5C",X"3A",X"CF",X"E5",X"FE",X"05",X"28",X"04", - X"FE",X"0A",X"20",X"21",X"21",X"89",X"E5",X"3A",X"B6",X"E5",X"BE",X"38",X"18",X"3C",X"77",X"79", - X"FE",X"5C",X"28",X"3D",X"FD",X"71",X"00",X"FD",X"23",X"DD",X"71",X"00",X"0E",X"41",X"DD",X"23", - X"DD",X"23",X"1D",X"28",X"2C",X"CB",X"40",X"28",X"05",X"DD",X"71",X"00",X"18",X"03",X"DD",X"71", - X"00",X"3A",X"AA",X"E5",X"B7",X"20",X"1A",X"3E",X"01",X"CD",X"3E",X"30",X"3A",X"B6",X"E5",X"B7", - X"C2",X"3C",X"6C",X"05",X"C2",X"33",X"6C",X"21",X"88",X"E5",X"35",X"7E",X"FE",X"FF",X"C2",X"24", - X"6C",X"DD",X"36",X"00",X"00",X"3E",X"38",X"CD",X"3E",X"30",X"3E",X"13",X"CD",X"42",X"31",X"CD", - X"5E",X"5F",X"C9",X"03",X"42",X"45",X"53",X"54",X"20",X"20",X"06",X"32",X"30",X"20",X"20",X"03", - X"50",X"4C",X"41",X"59",X"45",X"52",X"53",X"00",X"02",X"20",X"4E",X"4F",X"2E",X"53",X"43",X"4F", - X"52",X"45",X"53",X"20",X"20",X"4E",X"41",X"4D",X"45",X"20",X"52",X"4F",X"55",X"4E",X"44",X"20", - X"20",X"00",X"02",X"54",X"49",X"4D",X"45",X"00",X"21",X"B0",X"D1",X"11",X"F3",X"6C",X"CD",X"2D", - X"30",X"21",X"90",X"D3",X"11",X"08",X"6D",X"CD",X"2D",X"30",X"11",X"08",X"6D",X"CD",X"2D",X"30", - X"11",X"E5",X"E5",X"21",X"C2",X"DD",X"3A",X"D1",X"E5",X"4F",X"06",X"14",X"78",X"FE",X"0A",X"20", - X"03",X"21",X"92",X"DD",X"B9",X"20",X"07",X"22",X"D2",X"E5",X"ED",X"53",X"D4",X"E5",X"C5",X"E5", - X"41",X"0E",X"02",X"B8",X"20",X"02",X"0E",X"06",X"FE",X"0A",X"30",X"07",X"2C",X"2C",X"CD",X"6A", - X"30",X"18",X"03",X"CD",X"48",X"30",X"2C",X"2C",X"79",X"FE",X"02",X"20",X"02",X"0E",X"04",X"06", - X"03",X"CD",X"5F",X"30",X"10",X"FB",X"2C",X"2C",X"2C",X"2C",X"06",X"03",X"1A",X"77",X"2C",X"71", - X"2C",X"13",X"10",X"F8",X"7D",X"C6",X"06",X"6F",X"13",X"13",X"13",X"1A",X"CD",X"48",X"30",X"13", - X"E1",X"C1",X"25",X"10",X"A7",X"C9",X"01",X"03",X"00",X"11",X"9A",X"E5",X"21",X"7B",X"6E",X"ED", - X"B0",X"01",X"C8",X"00",X"11",X"E5",X"E5",X"21",X"BD",X"6D",X"ED",X"B0",X"C9",X"01",X"01",X"00", - X"53",X"54",X"45",X"20",X"20",X"20",X"01",X"01",X"03",X"50",X"4F",X"49",X"4E",X"20",X"20",X"20", - X"01",X"01",X"08",X"80",X"45",X"48",X"45",X"20",X"20",X"20",X"02",X"01",X"10",X"30",X"4D",X"49", - X"54",X"20",X"20",X"20",X"01",X"01",X"21",X"50",X"41",X"41",X"54",X"20",X"20",X"20",X"01",X"01", - X"23",X"50",X"47",X"4E",X"41",X"20",X"20",X"20",X"02",X"01",X"28",X"00",X"4F",X"41",X"59",X"20", - X"20",X"20",X"02",X"01",X"38",X"70",X"4E",X"52",X"41",X"20",X"20",X"20",X"02",X"01",X"60",X"10", - X"4F",X"49",X"57",X"20",X"20",X"20",X"02",X"01",X"89",X"90",X"4B",X"48",X"4F",X"20",X"20",X"20", - X"02",X"02",X"66",X"00",X"48",X"4E",X"49",X"20",X"20",X"20",X"02",X"02",X"77",X"50",X"53",X"41", - X"4F",X"20",X"20",X"20",X"02",X"03",X"12",X"50",X"55",X"48",X"59",X"20",X"20",X"20",X"02",X"03", - X"33",X"00",X"42",X"53",X"41",X"20",X"20",X"20",X"03",X"03",X"65",X"00",X"41",X"49",X"57",X"20", - X"20",X"20",X"03",X"03",X"70",X"50",X"4B",X"41",X"45",X"20",X"20",X"20",X"04",X"03",X"88",X"00", - X"4D",X"4B",X"4D",X"20",X"20",X"20",X"03",X"04",X"01",X"50",X"45",X"49",X"41",X"20",X"20",X"20", - X"03",X"04",X"32",X"00",X"52",X"4B",X"47",X"20",X"20",X"20",X"03",X"04",X"85",X"40",X"49",X"49", - X"4F",X"20",X"20",X"20",X"04",X"F9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", - X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", - X"FF",X"FF",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"31",X"00",X"E8",X"11",X"00",X"20",X"CD",X"2D",X"6F",X"22",X"74",X"00",X"CD",X"2D",X"6F",X"22", - X"76",X"00",X"CD",X"2D",X"6F",X"22",X"78",X"00",X"11",X"00",X"00",X"CD",X"2D",X"6F",X"22",X"72", - X"00",X"11",X"FF",X"FF",X"EB",X"A7",X"ED",X"52",X"22",X"70",X"00",X"18",X"FE",X"01",X"00",X"20", - X"21",X"00",X"00",X"1A",X"85",X"6F",X"3E",X"00",X"8C",X"67",X"13",X"0B",X"78",X"B1",X"20",X"F3", - X"C9",X"F3",X"ED",X"46",X"31",X"00",X"E8",X"DD",X"21",X"4E",X"6F",X"C3",X"90",X"72",X"0E",X"05", - X"3E",X"FF",X"ED",X"79",X"0C",X"ED",X"79",X"0C",X"ED",X"79",X"21",X"00",X"E1",X"36",X"00",X"54", - X"5D",X"13",X"01",X"FF",X"01",X"ED",X"B0",X"FB",X"01",X"00",X"80",X"0B",X"79",X"B0",X"20",X"FB", - X"F3",X"AF",X"5F",X"16",X"20",X"21",X"00",X"E0",X"0E",X"10",X"06",X"00",X"77",X"23",X"3C",X"15", - X"28",X"07",X"10",X"F8",X"0D",X"20",X"F3",X"18",X"05",X"16",X"20",X"3C",X"18",X"F4",X"7B",X"16", - X"20",X"21",X"00",X"E0",X"0E",X"10",X"06",X"00",X"BE",X"C2",X"95",X"71",X"23",X"3C",X"15",X"28", - X"07",X"10",X"F5",X"0D",X"20",X"F0",X"18",X"05",X"3C",X"16",X"20",X"18",X"F4",X"7B",X"3C",X"FE", - X"0F",X"20",X"BF",X"31",X"00",X"E8",X"CD",X"F2",X"77",X"AF",X"32",X"01",X"E0",X"16",X"20",X"0E", - X"10",X"21",X"00",X"D0",X"06",X"00",X"77",X"23",X"3C",X"15",X"28",X"07",X"10",X"F8",X"0D",X"20", - X"F3",X"18",X"05",X"3C",X"16",X"20",X"18",X"F4",X"3A",X"01",X"E0",X"16",X"20",X"21",X"00",X"D0", - X"0E",X"10",X"06",X"00",X"CD",X"35",X"72",X"23",X"3C",X"15",X"28",X"07",X"10",X"F6",X"0D",X"20", - X"F1",X"18",X"05",X"3C",X"16",X"20",X"18",X"F4",X"3A",X"01",X"E0",X"3C",X"FE",X"0F",X"20",X"BA", - X"DD",X"21",X"BF",X"70",X"CD",X"90",X"72",X"21",X"0F",X"7A",X"DD",X"21",X"BF",X"70",X"CD",X"28", - X"71",X"CD",X"AF",X"70",X"CD",X"F2",X"77",X"3E",X"03",X"32",X"01",X"E7",X"CD",X"9E",X"79",X"3E", - X"01",X"32",X"00",X"E3",X"32",X"02",X"E3",X"DB",X"00",X"2F",X"0F",X"0F",X"30",X"F9",X"3E",X"03", - X"32",X"01",X"E7",X"CD",X"B6",X"77",X"21",X"AA",X"7B",X"CD",X"D5",X"77",X"3A",X"01",X"E7",X"06", - X"06",X"CD",X"4A",X"7D",X"CD",X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"2F",X"0F",X"30",X"14", - X"3A",X"01",X"E7",X"07",X"4F",X"06",X"00",X"DD",X"21",X"98",X"7B",X"DD",X"09",X"DD",X"66",X"01", - X"DD",X"6E",X"00",X"E9",X"CD",X"9E",X"79",X"CD",X"9E",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79", - X"DB",X"01",X"2F",X"0F",X"38",X"05",X"0F",X"38",X"1C",X"18",X"C9",X"3A",X"01",X"E7",X"FE",X"08", - X"CA",X"44",X"70",X"06",X"04",X"CD",X"4A",X"7D",X"C6",X"01",X"32",X"01",X"E7",X"06",X"06",X"CD", - X"4A",X"7D",X"C3",X"44",X"70",X"3A",X"01",X"E7",X"FE",X"03",X"CA",X"44",X"70",X"06",X"04",X"CD", - X"4A",X"7D",X"C6",X"FF",X"32",X"01",X"E7",X"06",X"06",X"CD",X"4A",X"7D",X"C3",X"44",X"70",X"11", - X"00",X"00",X"AF",X"32",X"00",X"E7",X"06",X"04",X"C5",X"CD",X"C0",X"70",X"C1",X"10",X"F9",X"C9", - X"21",X"00",X"00",X"06",X"20",X"1A",X"85",X"30",X"01",X"24",X"6F",X"1C",X"20",X"F7",X"14",X"10", - X"F4",X"D5",X"E5",X"3A",X"00",X"E7",X"21",X"72",X"00",X"87",X"85",X"6F",X"5E",X"23",X"56",X"E1", - X"7A",X"BC",X"20",X"09",X"7B",X"BD",X"20",X"05",X"21",X"2F",X"7A",X"18",X"03",X"21",X"38",X"7A", - X"11",X"83",X"E7",X"01",X"09",X"00",X"ED",X"B0",X"11",X"00",X"01",X"21",X"A0",X"D1",X"3A",X"00", - X"E7",X"A7",X"28",X"04",X"47",X"19",X"10",X"FD",X"22",X"81",X"E7",X"3E",X"08",X"32",X"80",X"E7", - X"3A",X"00",X"E7",X"C6",X"30",X"32",X"86",X"E7",X"21",X"00",X"E7",X"34",X"21",X"80",X"E7",X"DD", - X"21",X"BF",X"70",X"CD",X"28",X"71",X"D1",X"C9",X"7E",X"23",X"FE",X"00",X"28",X"12",X"5E",X"23", - X"56",X"23",X"4F",X"7E",X"12",X"13",X"3E",X"04",X"12",X"23",X"13",X"0D",X"20",X"F5",X"18",X"E8", - X"DD",X"E9",X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"C6",X"30",X"FE",X"3A",X"38",X"02",X"C6",X"07", - X"FD",X"77",X"00",X"FD",X"36",X"01",X"04",X"DD",X"E9",X"E6",X"0F",X"C6",X"30",X"FE",X"3A",X"38", - X"02",X"C6",X"07",X"FD",X"77",X"00",X"FD",X"36",X"01",X"04",X"DD",X"E9",X"F5",X"0F",X"0F",X"0F", - X"0F",X"E6",X"0F",X"C6",X"30",X"FE",X"3A",X"38",X"02",X"C6",X"07",X"FD",X"77",X"00",X"FD",X"36", - X"01",X"04",X"F1",X"E6",X"0F",X"C6",X"30",X"FE",X"3A",X"38",X"02",X"C6",X"07",X"FD",X"77",X"02", - X"FD",X"36",X"03",X"04",X"C9",X"08",X"D9",X"DD",X"21",X"9E",X"71",X"C3",X"15",X"72",X"21",X"1B", - X"7A",X"DD",X"21",X"A8",X"71",X"C3",X"28",X"71",X"D9",X"FD",X"21",X"B8",X"D0",X"DD",X"21",X"B5", - X"71",X"7C",X"C3",X"42",X"71",X"FD",X"23",X"FD",X"23",X"DD",X"21",X"C1",X"71",X"7C",X"C3",X"59", - X"71",X"DD",X"21",X"CD",X"71",X"7D",X"FD",X"23",X"FD",X"23",X"C3",X"42",X"71",X"DD",X"21",X"D9", - X"71",X"7D",X"FD",X"23",X"FD",X"23",X"C3",X"59",X"71",X"08",X"D9",X"FD",X"23",X"FD",X"23",X"FD", - X"23",X"FD",X"23",X"DD",X"21",X"EB",X"71",X"5F",X"C3",X"42",X"71",X"FD",X"23",X"FD",X"23",X"DD", - X"21",X"F7",X"71",X"7B",X"C3",X"59",X"71",X"08",X"D9",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"FD", - X"23",X"DD",X"21",X"09",X"72",X"7E",X"C3",X"42",X"71",X"FD",X"23",X"FD",X"23",X"7E",X"DD",X"21", - X"23",X"72",X"C3",X"59",X"71",X"21",X"01",X"D0",X"01",X"FF",X"0F",X"36",X"00",X"54",X"5D",X"ED", - X"B0",X"DD",X"E9",X"CD",X"9E",X"79",X"DB",X"00",X"0F",X"38",X"06",X"0F",X"DA",X"B3",X"6F",X"18", - X"F2",X"08",X"C3",X"9C",X"6F",X"BE",X"C8",X"F5",X"E5",X"DD",X"21",X"40",X"72",X"C3",X"90",X"72", - X"21",X"1B",X"7A",X"DD",X"21",X"4A",X"72",X"C3",X"28",X"71",X"E1",X"FD",X"21",X"B8",X"D0",X"7C", - X"CD",X"6C",X"71",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"7D",X"CD",X"6C",X"71",X"F1", - X"F5",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"FD",X"23",X"CD",X"6C",X"71",X"FD",X"23",X"FD",X"23", - X"FD",X"23",X"FD",X"23",X"7E",X"CD",X"6C",X"71",X"CD",X"9E",X"79",X"CD",X"9E",X"79",X"DB",X"00", - X"0F",X"DA",X"89",X"72",X"0F",X"38",X"04",X"18",X"EF",X"F1",X"C9",X"F1",X"C1",X"C3",X"00",X"70", - X"21",X"01",X"D0",X"01",X"FF",X"07",X"36",X"00",X"54",X"5D",X"13",X"13",X"CD",X"A7",X"79",X"21", - X"00",X"D0",X"01",X"FF",X"07",X"36",X"00",X"54",X"5D",X"13",X"13",X"CD",X"A7",X"79",X"DD",X"E9", - X"3E",X"FF",X"D3",X"05",X"CD",X"B6",X"77",X"21",X"41",X"7A",X"CD",X"D5",X"77",X"DB",X"03",X"21", - X"AE",X"D1",X"CD",X"33",X"76",X"DB",X"04",X"21",X"AE",X"D2",X"CD",X"33",X"76",X"CD",X"E4",X"72", - X"CD",X"72",X"73",X"CD",X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"EE",X"FF",X"0F",X"0F",X"DA", - X"33",X"70",X"18",X"D9",X"21",X"87",X"74",X"CD",X"D5",X"77",X"CD",X"B0",X"73",X"DB",X"04",X"EE", - X"FF",X"CB",X"57",X"28",X"4B",X"21",X"FC",X"73",X"CD",X"D5",X"77",X"DB",X"03",X"EE",X"FF",X"0F", - X"0F",X"0F",X"0F",X"11",X"00",X"00",X"21",X"90",X"73",X"01",X"00",X"05",X"E6",X"0F",X"20",X"0A", - X"19",X"5E",X"23",X"66",X"6B",X"CD",X"D5",X"77",X"18",X"25",X"0C",X"1C",X"1C",X"B9",X"20",X"02", - X"18",X"EE",X"10",X"F6",X"01",X"08",X"05",X"1C",X"1C",X"B9",X"20",X"02",X"18",X"09",X"0C",X"10", - X"F6",X"FE",X"0F",X"20",X"0A",X"1C",X"1C",X"19",X"5E",X"23",X"66",X"6B",X"CD",X"D5",X"77",X"C9", - X"21",X"2A",X"74",X"CD",X"D5",X"77",X"DB",X"03",X"EE",X"FF",X"21",X"A8",X"73",X"11",X"00",X"00", - X"0F",X"0F",X"0F",X"0F",X"E6",X"0F",X"28",X"11",X"1C",X"1C",X"FE",X"08",X"28",X"0B",X"1C",X"1C", - X"FE",X"0A",X"28",X"05",X"1C",X"1C",X"FE",X"0F",X"C0",X"19",X"5E",X"23",X"66",X"6B",X"CD",X"D5", - X"77",X"C9",X"DB",X"04",X"2F",X"0F",X"0F",X"38",X"13",X"AF",X"87",X"21",X"AE",X"74",X"85",X"6F", - X"3E",X"00",X"8C",X"67",X"5E",X"23",X"66",X"6B",X"CD",X"D5",X"77",X"C9",X"3E",X"01",X"18",X"EA", - X"D2",X"74",X"E3",X"74",X"F5",X"74",X"07",X"75",X"19",X"75",X"2B",X"75",X"3D",X"75",X"4F",X"75", - X"61",X"75",X"73",X"75",X"85",X"75",X"97",X"75",X"A8",X"75",X"CB",X"75",X"EE",X"75",X"11",X"76", - X"DB",X"03",X"EE",X"FF",X"47",X"E6",X"03",X"28",X"25",X"FE",X"01",X"28",X"26",X"FE",X"02",X"28", - X"27",X"21",X"47",X"74",X"CD",X"D5",X"77",X"78",X"0F",X"0F",X"47",X"E6",X"03",X"28",X"1E",X"FE", - X"01",X"28",X"1F",X"FE",X"02",X"28",X"20",X"21",X"52",X"74",X"CD",X"D5",X"77",X"C9",X"21",X"57", - X"74",X"18",X"E1",X"21",X"67",X"74",X"18",X"DC",X"21",X"77",X"74",X"18",X"D7",X"21",X"62",X"74", - X"18",X"E8",X"21",X"72",X"74",X"18",X"E3",X"21",X"82",X"74",X"18",X"DE",X"0B",X"92",X"D3",X"43", - X"4F",X"49",X"4E",X"20",X"4D",X"4F",X"44",X"45",X"20",X"20",X"0B",X"12",X"D4",X"20",X"20",X"20", - X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"0E",X"30",X"D4",X"20",X"20",X"20",X"20",X"20", - X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"0B",X"92",X"D3",X"43",X"4F",X"49", - X"4E",X"20",X"4D",X"4F",X"44",X"45",X"20",X"41",X"0B",X"12",X"D4",X"43",X"4F",X"49",X"4E",X"20", - X"4D",X"4F",X"44",X"45",X"20",X"42",X"00",X"07",X"30",X"D6",X"31",X"35",X"35",X"20",X"53",X"45", - X"43",X"00",X"01",X"B0",X"D6",X"35",X"00",X"07",X"30",X"D6",X"31",X"38",X"30",X"20",X"53",X"45", - X"43",X"00",X"01",X"B0",X"D6",X"33",X"00",X"07",X"30",X"D6",X"31",X"37",X"30",X"20",X"53",X"45", - X"43",X"00",X"01",X"B0",X"D6",X"32",X"00",X"07",X"30",X"D6",X"31",X"36",X"30",X"20",X"53",X"45", - X"43",X"00",X"01",X"B0",X"D6",X"34",X"00",X"09",X"12",X"D5",X"42",X"4F",X"44",X"59",X"20",X"54", - X"59",X"50",X"45",X"09",X"12",X"D6",X"50",X"4C",X"41",X"59",X"20",X"54",X"49",X"4D",X"45",X"0B", - X"92",X"D6",X"43",X"4F",X"4D",X"4D",X"41",X"4E",X"44",X"4F",X"4D",X"45",X"4E",X"00",X"B2",X"74", - X"C2",X"74",X"0C",X"30",X"D5",X"54",X"41",X"42",X"4C",X"45",X"20",X"54",X"59",X"50",X"45",X"20", - X"20",X"00",X"0C",X"30",X"D5",X"55",X"50",X"52",X"49",X"47",X"48",X"54",X"20",X"54",X"59",X"50", - X"45",X"00",X"0D",X"B0",X"D3",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"31",X"20",X"50",X"4C", - X"41",X"59",X"00",X"0E",X"B0",X"D3",X"32",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"31",X"20", - X"50",X"4C",X"41",X"59",X"00",X"0E",X"B0",X"D3",X"33",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20", - X"31",X"20",X"50",X"4C",X"41",X"59",X"00",X"0E",X"B0",X"D3",X"34",X"20",X"43",X"4F",X"49",X"4E", - X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"00",X"0E",X"B0",X"D3",X"35",X"20",X"43",X"4F", - X"49",X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"00",X"0E",X"B0",X"D3",X"36",X"20", - X"43",X"4F",X"49",X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"00",X"0E",X"B0",X"D3", - X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"32",X"20",X"50",X"4C",X"41",X"59",X"53",X"00",X"0E", - X"B0",X"D3",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"33",X"20",X"50",X"4C",X"41",X"59",X"53", - X"00",X"0E",X"B0",X"D3",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"34",X"20",X"50",X"4C",X"41", - X"59",X"53",X"00",X"0E",X"B0",X"D3",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"35",X"20",X"50", - X"4C",X"41",X"59",X"53",X"00",X"0E",X"B0",X"D3",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"36", - X"20",X"50",X"4C",X"41",X"59",X"53",X"00",X"0E",X"B0",X"D3",X"20",X"20",X"20",X"20",X"46",X"52", - X"45",X"45",X"20",X"20",X"20",X"20",X"20",X"00",X"0E",X"B0",X"D3",X"31",X"20",X"43",X"4F",X"49", - X"4E",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"20",X"0E",X"30",X"D4",X"31",X"20",X"43",X"4F", - X"49",X"4E",X"20",X"32",X"20",X"50",X"4C",X"41",X"59",X"53",X"00",X"0E",X"B0",X"D3",X"32",X"20", - X"43",X"4F",X"49",X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"0E",X"30",X"D4",X"31", - X"20",X"43",X"4F",X"49",X"4E",X"20",X"33",X"20",X"50",X"4C",X"41",X"59",X"53",X"00",X"0E",X"B0", - X"D3",X"33",X"20",X"43",X"4F",X"49",X"4E",X"53",X"20",X"31",X"20",X"50",X"4C",X"41",X"59",X"0E", - X"30",X"D4",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"35",X"20",X"50",X"4C",X"41",X"59",X"53", - X"00",X"0E",X"B0",X"D3",X"20",X"20",X"20",X"20",X"46",X"52",X"45",X"45",X"20",X"20",X"20",X"20", - X"20",X"0E",X"30",X"D4",X"31",X"20",X"43",X"4F",X"49",X"4E",X"20",X"36",X"20",X"50",X"4C",X"41", - X"59",X"53",X"00",X"EE",X"FF",X"06",X"08",X"23",X"36",X"04",X"2B",X"0F",X"38",X"04",X"36",X"30", - X"18",X"02",X"36",X"31",X"23",X"23",X"23",X"23",X"10",X"ED",X"C9",X"CD",X"B6",X"77",X"21",X"00", - X"D0",X"11",X"05",X"08",X"01",X"00",X"08",X"72",X"23",X"73",X"23",X"0B",X"78",X"B1",X"20",X"F7", - X"21",X"00",X"E1",X"11",X"01",X"E1",X"36",X"00",X"01",X"00",X"01",X"ED",X"B0",X"FB",X"21",X"A3", - X"76",X"11",X"00",X"E1",X"01",X"20",X"00",X"ED",X"B0",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD", - X"95",X"79",X"DB",X"00",X"2F",X"0F",X"0F",X"30",X"F0",X"21",X"00",X"E1",X"11",X"01",X"E1",X"36", - X"00",X"01",X"00",X"01",X"ED",X"B0",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"F3", - X"C3",X"33",X"70",X"13",X"00",X"C0",X"00",X"10",X"80",X"A0",X"00",X"13",X"00",X"40",X"01",X"10", - X"00",X"A0",X"00",X"13",X"00",X"C0",X"00",X"10",X"C0",X"60",X"01",X"13",X"00",X"40",X"01",X"10", - X"40",X"60",X"01",X"00",X"03",X"00",X"80",X"00",X"10",X"00",X"80",X"00",X"03",X"00",X"80",X"00", - X"10",X"01",X"80",X"00",X"03",X"01",X"80",X"00",X"10",X"00",X"80",X"00",X"03",X"01",X"80",X"00", - X"10",X"01",X"80",X"11",X"00",X"C0",X"01",X"00",X"01",X"ED",X"B0",X"C9",X"21",X"00",X"E1",X"11", - X"01",X"E1",X"36",X"00",X"01",X"00",X"01",X"ED",X"B0",X"AF",X"32",X"06",X"E3",X"67",X"6F",X"22", - X"0D",X"E7",X"CD",X"B6",X"77",X"21",X"DF",X"7A",X"CD",X"D5",X"77",X"FB",X"06",X"08",X"DB",X"00", - X"2F",X"21",X"C0",X"D2",X"CD",X"38",X"77",X"06",X"08",X"DB",X"01",X"2F",X"21",X"C0",X"D4",X"CD", - X"38",X"77",X"06",X"08",X"DB",X"02",X"2F",X"21",X"C0",X"D6",X"CD",X"38",X"77",X"06",X"08",X"21", - X"40",X"D1",X"7B",X"CD",X"38",X"77",X"18",X"14",X"23",X"36",X"04",X"2B",X"0F",X"38",X"04",X"36", - X"30",X"18",X"02",X"36",X"31",X"23",X"23",X"23",X"23",X"10",X"ED",X"C9",X"CD",X"95",X"77",X"3A", - X"0D",X"E7",X"21",X"C0",X"D7",X"CD",X"78",X"77",X"3A",X"0E",X"E7",X"CD",X"78",X"77",X"CD",X"9E", - X"79",X"CD",X"9E",X"79",X"DB",X"01",X"2F",X"0F",X"0F",X"38",X"02",X"18",X"9E",X"DB",X"00",X"2F", - X"0F",X"0F",X"30",X"97",X"F3",X"C3",X"33",X"70",X"23",X"36",X"04",X"2B",X"F5",X"0F",X"0F",X"0F", - X"0F",X"E6",X"0F",X"C6",X"30",X"77",X"23",X"23",X"23",X"36",X"04",X"2B",X"F1",X"E6",X"0F",X"C6", - X"30",X"77",X"23",X"23",X"C9",X"21",X"0F",X"E7",X"3A",X"09",X"E0",X"E6",X"C0",X"BE",X"C8",X"32", - X"0F",X"E7",X"3A",X"0E",X"E7",X"C6",X"01",X"27",X"32",X"0E",X"E7",X"D0",X"3A",X"0D",X"E7",X"C6", - X"01",X"27",X"32",X"0D",X"E7",X"C9",X"21",X"00",X"D0",X"01",X"FF",X"07",X"36",X"00",X"54",X"5D", - X"13",X"13",X"CD",X"A7",X"79",X"21",X"01",X"D0",X"01",X"FF",X"07",X"36",X"00",X"54",X"5D",X"13", - X"13",X"CD",X"A7",X"79",X"C9",X"7E",X"FE",X"00",X"C8",X"CD",X"DE",X"77",X"18",X"F7",X"4E",X"06", - X"00",X"23",X"5E",X"23",X"56",X"23",X"7E",X"12",X"3E",X"04",X"13",X"12",X"13",X"23",X"0D",X"20", - X"F5",X"C9",X"21",X"00",X"E0",X"0E",X"06",X"AF",X"06",X"00",X"77",X"10",X"FD",X"0D",X"20",X"F8", - X"C9",X"0E",X"00",X"06",X"00",X"10",X"FE",X"0D",X"20",X"F9",X"3D",X"20",X"F4",X"C9",X"C5",X"E5", - X"77",X"23",X"10",X"FC",X"E1",X"0E",X"20",X"09",X"C1",X"0D",X"20",X"F2",X"C9",X"CD",X"B6",X"77", - X"CD",X"36",X"78",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"2F",X"0F", - X"0F",X"DA",X"33",X"70",X"18",X"ED",X"21",X"00",X"D0",X"01",X"FF",X"0F",X"3E",X"86",X"77",X"23", - X"0B",X"78",X"B1",X"20",X"F7",X"21",X"0C",X"D0",X"06",X"10",X"E5",X"C5",X"CD",X"71",X"78",X"C1", - X"E1",X"11",X"00",X"01",X"19",X"10",X"F3",X"06",X"40",X"21",X"BF",X"D7",X"7E",X"B0",X"77",X"23", - X"23",X"7E",X"B0",X"77",X"11",X"80",X"00",X"19",X"7E",X"B0",X"77",X"2B",X"2B",X"7E",X"B0",X"77", - X"C9",X"06",X"19",X"CD",X"7D",X"78",X"23",X"23",X"23",X"23",X"10",X"F7",X"C9",X"E5",X"3E",X"03", - X"77",X"23",X"23",X"3E",X"02",X"77",X"E1",X"E5",X"11",X"80",X"00",X"19",X"3E",X"01",X"77",X"23", - X"23",X"3E",X"00",X"77",X"E1",X"C9",X"F3",X"CD",X"B6",X"77",X"21",X"B3",X"79",X"CD",X"D5",X"77", - X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"2F",X"0F",X"38",X"02",X"18", - X"EC",X"11",X"01",X"46",X"CD",X"85",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79", - X"DB",X"00",X"2F",X"0F",X"38",X"02",X"18",X"E9",X"13",X"CD",X"85",X"79",X"CD",X"95",X"79",X"CD", - X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"2F",X"0F",X"38",X"02",X"18",X"EF",X"13",X"CD",X"85", - X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"2F",X"0F",X"38",X"02", - X"18",X"EC",X"3E",X"10",X"21",X"10",X"D0",X"0E",X"03",X"11",X"01",X"46",X"06",X"10",X"73",X"23", - X"72",X"23",X"10",X"FA",X"13",X"0D",X"20",X"F4",X"11",X"20",X"00",X"19",X"3D",X"20",X"E8",X"3E", - X"03",X"11",X"01",X"52",X"0E",X"04",X"06",X"30",X"73",X"23",X"72",X"23",X"10",X"FA",X"D5",X"11", - X"20",X"00",X"19",X"D1",X"0D",X"20",X"EF",X"13",X"3D",X"20",X"E9",X"11",X"01",X"49",X"0E",X"04", - X"06",X"30",X"73",X"23",X"72",X"23",X"10",X"FA",X"D5",X"11",X"20",X"00",X"19",X"D1",X"0D",X"20", - X"EF",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"2F",X"0F",X"38",X"02", - X"18",X"A0",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"3E",X"01",X"D3",X"01",X"CD", - X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"2F",X"0F",X"30",X"F1",X"AF",X"D3", - X"01",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"DB",X"00",X"2F",X"0F",X"0F",X"DA", - X"33",X"70",X"C3",X"71",X"79",X"21",X"00",X"D0",X"01",X"00",X"08",X"73",X"23",X"72",X"23",X"0B", - X"78",X"B1",X"20",X"F7",X"C9",X"01",X"00",X"40",X"0B",X"78",X"B1",X"20",X"FB",X"C9",X"01",X"00", - X"90",X"0B",X"78",X"B1",X"20",X"FB",X"C9",X"7E",X"12",X"23",X"23",X"13",X"13",X"0B",X"78",X"B1", - X"20",X"F5",X"C9",X"0E",X"A0",X"D1",X"41",X"20",X"42",X"20",X"43",X"20",X"44",X"20",X"45",X"20", - X"46",X"20",X"47",X"20",X"0E",X"20",X"D2",X"48",X"20",X"49",X"20",X"4A",X"20",X"4B",X"20",X"4C", - X"20",X"4D",X"20",X"4E",X"20",X"0E",X"A0",X"D2",X"4F",X"20",X"50",X"20",X"51",X"20",X"52",X"20", - X"53",X"20",X"54",X"20",X"55",X"20",X"0E",X"20",X"D3",X"56",X"20",X"57",X"20",X"58",X"20",X"59", - X"20",X"5A",X"20",X"20",X"20",X"20",X"20",X"14",X"A0",X"D3",X"31",X"20",X"32",X"20",X"33",X"20", - X"34",X"20",X"35",X"20",X"36",X"20",X"37",X"20",X"38",X"20",X"39",X"20",X"30",X"20",X"00",X"08", - X"A0",X"D0",X"52",X"41",X"4D",X"20",X"20",X"20",X"4F",X"4B",X"00",X"10",X"A0",X"D0",X"52",X"41", - X"4D",X"20",X"20",X"20",X"4E",X"47",X"20",X"20",X"28",X"20",X"20",X"20",X"20",X"29",X"00",X"52", - X"4F",X"4D",X"20",X"20",X"20",X"4F",X"4B",X"00",X"52",X"4F",X"4D",X"20",X"20",X"20",X"4E",X"47", - X"00",X"16",X"A0",X"D0",X"44",X"49",X"50",X"20",X"53",X"57",X"20",X"31",X"20",X"32",X"20",X"33", - X"20",X"34",X"20",X"35",X"20",X"36",X"20",X"37",X"20",X"38",X"03",X"A0",X"D1",X"53",X"57",X"31", - X"03",X"A0",X"D2",X"53",X"57",X"32",X"00",X"01",X"98",X"D2",X"20",X"1B",X"C4",X"D2",X"20",X"20", - X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", - X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"00",X"0C",X"A0",X"D0",X"49",X"4E",X"54", - X"45",X"52",X"46",X"41",X"43",X"45",X"20",X"4F",X"4B",X"00",X"A0",X"7A",X"B5",X"7A",X"CA",X"7A", - X"11",X"A0",X"D0",X"43",X"48",X"45",X"43",X"4B",X"20",X"49",X"4E",X"54",X"45",X"52",X"46",X"41", - X"43",X"45",X"20",X"31",X"00",X"11",X"A0",X"D0",X"43",X"48",X"45",X"43",X"4B",X"20",X"49",X"4E", - X"54",X"45",X"52",X"46",X"41",X"43",X"45",X"20",X"32",X"00",X"11",X"A0",X"D0",X"43",X"48",X"45", - X"43",X"4B",X"20",X"49",X"4E",X"54",X"45",X"52",X"46",X"41",X"43",X"45",X"20",X"33",X"00",X"0A", - X"20",X"D1",X"57",X"52",X"49",X"54",X"45",X"20",X"44",X"41",X"54",X"41",X"0C",X"20",X"D2",X"49", - X"4E",X"54",X"45",X"52",X"46",X"41",X"43",X"45",X"20",X"31",X"20",X"0C",X"A0",X"D2",X"20",X"20", - X"20",X"52",X"45",X"41",X"44",X"20",X"44",X"41",X"54",X"41",X"0C",X"20",X"D4",X"49",X"4E",X"54", - X"45",X"52",X"46",X"41",X"43",X"45",X"20",X"32",X"20",X"0C",X"A0",X"D4",X"20",X"20",X"20",X"52", - X"45",X"41",X"44",X"20",X"44",X"41",X"54",X"41",X"0C",X"20",X"D6",X"49",X"4E",X"54",X"45",X"52", - X"46",X"41",X"43",X"45",X"20",X"33",X"20",X"0C",X"A0",X"D6",X"20",X"20",X"20",X"52",X"45",X"41", - X"44",X"20",X"44",X"41",X"54",X"41",X"0F",X"40",X"D2",X"30",X"20",X"31",X"20",X"32",X"20",X"33", - X"20",X"34",X"20",X"35",X"20",X"36",X"20",X"37",X"0F",X"40",X"D4",X"30",X"20",X"31",X"20",X"32", - X"20",X"33",X"20",X"34",X"20",X"35",X"20",X"36",X"20",X"37",X"0F",X"40",X"D6",X"30",X"20",X"31", - X"20",X"32",X"20",X"33",X"20",X"34",X"20",X"35",X"20",X"36",X"20",X"37",X"0F",X"40",X"D1",X"30", - X"20",X"31",X"20",X"32",X"20",X"33",X"20",X"34",X"20",X"35",X"20",X"36",X"20",X"37",X"06",X"A0", - X"D7",X"54",X"49",X"4D",X"49",X"4E",X"47",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B0",X"72", - X"EC",X"76",X"5E",X"7C",X"4B",X"76",X"96",X"78",X"1D",X"78",X"0D",X"20",X"D1",X"30",X"31",X"20", - X"44",X"49",X"50",X"20",X"53",X"57",X"49",X"54",X"43",X"48",X"0B",X"A0",X"D1",X"30",X"32",X"20", - X"49",X"2F",X"4F",X"20",X"50",X"4F",X"52",X"54",X"08",X"20",X"D2",X"30",X"33",X"20",X"53",X"4F", - X"55",X"4E",X"44",X"0C",X"A0",X"D2",X"30",X"34",X"20",X"43",X"48",X"41",X"52",X"41",X"43",X"54", - X"45",X"52",X"08",X"20",X"D3",X"30",X"35",X"20",X"43",X"4F",X"4C",X"4F",X"52",X"16",X"A0",X"D3", - X"30",X"36",X"20",X"43",X"52",X"4F",X"53",X"53",X"20",X"48",X"41",X"54",X"43",X"48",X"20",X"50", - X"41",X"54",X"54",X"45",X"52",X"4E",X"00",X"7C",X"B8",X"C0",X"7D",X"B9",X"C9",X"21",X"00",X"80", - X"01",X"00",X"08",X"AF",X"77",X"23",X"0B",X"78",X"B1",X"20",X"F8",X"C9",X"72",X"23",X"0B",X"78", - X"B1",X"20",X"F9",X"C9",X"72",X"23",X"23",X"0B",X"78",X"B1",X"20",X"F8",X"C9",X"08",X"D9",X"C3", - X"39",X"7C",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"21",X"09",X"E0",X"34",X"CD",X"52",X"7C", - X"3A",X"02",X"E3",X"0F",X"38",X"07",X"21",X"06",X"E3",X"3E",X"80",X"86",X"77",X"C9",X"D9",X"08", - X"FB",X"C9",X"21",X"00",X"E1",X"11",X"00",X"C0",X"01",X"00",X"01",X"ED",X"B0",X"C9",X"CD",X"B6", - X"77",X"21",X"B9",X"7D",X"CD",X"D5",X"77",X"2A",X"9C",X"7D",X"22",X"06",X"E7",X"DD",X"21",X"08", - X"E7",X"FD",X"21",X"A0",X"7D",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"8B", - X"7C",X"DB",X"00",X"2F",X"0F",X"0F",X"DA",X"33",X"70",X"18",X"D3",X"FD",X"22",X"0B",X"E7",X"3E", - X"01",X"32",X"05",X"E7",X"06",X"06",X"CD",X"50",X"7D",X"CD",X"E5",X"7C",X"CD",X"CF",X"7C",X"01", - X"00",X"00",X"ED",X"43",X"13",X"E3",X"DB",X"00",X"2F",X"0F",X"0F",X"30",X"04",X"C1",X"C3",X"33", - X"70",X"DB",X"00",X"2F",X"0F",X"DC",X"CF",X"7C",X"DB",X"01",X"2F",X"0F",X"38",X"34",X"0F",X"38", - X"5D",X"ED",X"4B",X"13",X"E3",X"0B",X"78",X"B1",X"20",X"D8",X"CD",X"E5",X"7C",X"18",X"4F",X"3A", - X"05",X"E7",X"4F",X"06",X"00",X"FD",X"2A",X"0B",X"E7",X"FD",X"09",X"FD",X"7E",X"00",X"D3",X"00", - X"F6",X"80",X"D3",X"00",X"C9",X"3E",X"00",X"D3",X"00",X"3E",X"80",X"D3",X"00",X"06",X"00",X"10", - X"FE",X"C9",X"CD",X"E5",X"7C",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"3A",X"07", - X"E7",X"5F",X"3A",X"05",X"E7",X"BB",X"C8",X"06",X"04",X"CD",X"50",X"7D",X"3D",X"32",X"05",X"E7", - X"06",X"06",X"CD",X"50",X"7D",X"CD",X"CF",X"7C",X"01",X"00",X"00",X"C3",X"A2",X"7C",X"CD",X"E5", - X"7C",X"CD",X"95",X"79",X"CD",X"95",X"79",X"CD",X"95",X"79",X"3A",X"06",X"E7",X"5F",X"3A",X"05", - X"E7",X"BB",X"C8",X"06",X"04",X"CD",X"50",X"7D",X"3C",X"32",X"05",X"E7",X"06",X"06",X"CD",X"50", - X"7D",X"CD",X"CF",X"7C",X"01",X"00",X"00",X"C3",X"A2",X"7C",X"4F",X"D6",X"03",X"3C",X"18",X"17", - X"4F",X"C5",X"21",X"20",X"D1",X"11",X"80",X"00",X"47",X"05",X"28",X"03",X"19",X"18",X"FA",X"C1", - X"23",X"70",X"23",X"23",X"70",X"79",X"C9",X"C5",X"21",X"20",X"D1",X"11",X"80",X"00",X"47",X"FE", - X"01",X"28",X"04",X"05",X"19",X"10",X"FD",X"C1",X"23",X"70",X"23",X"23",X"70",X"79",X"C9",X"C5", - X"0E",X"00",X"06",X"00",X"10",X"FE",X"F5",X"3A",X"00",X"D0",X"CB",X"4F",X"28",X"09",X"F1",X"0D", - X"20",X"F0",X"3D",X"20",X"EB",X"C1",X"C9",X"F1",X"C1",X"06",X"01",X"C9",X"15",X"01",X"00",X"00", - X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"1C",X"11",X"12",X"13",X"14",X"15",X"20",X"21",X"22", - X"23",X"24",X"25",X"26",X"27",X"00",X"00",X"00",X"00",X"0B",X"A0",X"D0",X"53",X"20",X"4F",X"20", - X"55",X"20",X"4E",X"20",X"44",X"20",X"53",X"0F",X"20",X"D1",X"30",X"31",X"20",X"48",X"4F",X"4C", - X"45",X"20",X"44",X"49",X"47",X"47",X"49",X"4E",X"47",X"15",X"A0",X"D1",X"30",X"32",X"20",X"50", - X"49",X"43",X"4B",X"49",X"4E",X"47",X"20",X"55",X"50",X"20",X"46",X"4F",X"52",X"54",X"49",X"4E", - X"45",X"0F",X"20",X"D2",X"30",X"33",X"20",X"44",X"4F",X"4F",X"52",X"20",X"4F",X"50",X"45",X"4E", - X"49",X"4E",X"47",X"13",X"A0",X"D2",X"30",X"34",X"20",X"42",X"55",X"52",X"49",X"45",X"44",X"20", - X"49",X"4E",X"54",X"4F",X"20",X"48",X"4F",X"4C",X"45",X"14",X"20",X"D3",X"30",X"35",X"20",X"46", - X"41",X"4C",X"4C",X"49",X"4E",X"47",X"20",X"49",X"4E",X"54",X"4F",X"20",X"48",X"4F",X"4C",X"45", - X"10",X"A0",X"D3",X"30",X"36",X"20",X"50",X"4C",X"41",X"59",X"45",X"52",X"20",X"4B",X"49",X"4C", - X"4C",X"45",X"44",X"12",X"20",X"D4",X"30",X"37",X"20",X"54",X"49",X"4D",X"45",X"20",X"55",X"50", - X"20",X"57",X"41",X"52",X"4E",X"49",X"4E",X"47",X"16",X"A0",X"D4",X"30",X"38",X"20",X"54",X"49", - X"4D",X"45",X"20",X"53",X"43",X"4F",X"52",X"45",X"20",X"43",X"4F",X"55",X"4E",X"54",X"49",X"4E", - X"47",X"11",X"20",X"D5",X"30",X"39",X"20",X"43",X"4F",X"49",X"4E",X"20",X"49",X"4E",X"53",X"45", - X"52",X"54",X"49",X"4E",X"47",X"0F",X"A0",X"D5",X"31",X"30",X"20",X"5A",X"4F",X"4F",X"4D",X"20", - X"49",X"4E",X"20",X"20",X"20",X"20",X"20",X"0F",X"20",X"D6",X"31",X"31",X"20",X"5A",X"4F",X"4F", - X"4D",X"20",X"4F",X"55",X"54",X"20",X"20",X"20",X"20",X"16",X"A0",X"D6",X"31",X"32",X"20",X"50", - X"4C",X"41",X"59",X"45",X"52",X"20",X"46",X"41",X"4C",X"4C",X"49",X"4E",X"47",X"20",X"20",X"20", - X"20",X"20",X"0D",X"20",X"D7",X"31",X"33",X"20",X"47",X"41",X"4D",X"45",X"20",X"53",X"54",X"41", - X"52",X"54",X"0C",X"A0",X"D7",X"31",X"34",X"20",X"47",X"41",X"4D",X"45",X"20",X"4F",X"56",X"45", - X"52",X"1B",X"20",X"D8",X"31",X"35",X"20",X"42",X"47",X"4D",X"20",X"28",X"43",X"4F",X"4E",X"54", - X"49",X"4E",X"55",X"49",X"54",X"59",X"20",X"44",X"49",X"53",X"50",X"4C",X"41",X"59",X"29",X"0E", - X"A0",X"D8",X"31",X"36",X"20",X"52",X"4F",X"55",X"4E",X"44",X"20",X"43",X"4C",X"45",X"41",X"52", - X"0E",X"20",X"D9",X"31",X"37",X"20",X"42",X"4C",X"4F",X"43",X"4B",X"20",X"43",X"4C",X"45",X"41", - X"52",X"0D",X"A0",X"D9",X"31",X"38",X"20",X"54",X"49",X"4D",X"45",X"20",X"55",X"50",X"20",X"20", - X"20",X"12",X"20",X"DA",X"31",X"39",X"20",X"42",X"47",X"4D",X"20",X"28",X"47",X"41",X"4D",X"45", - X"20",X"50",X"4C",X"41",X"59",X"29",X"12",X"A0",X"DA",X"32",X"30",X"20",X"47",X"41",X"4D",X"45", - X"20",X"43",X"4F",X"4D",X"50",X"4C",X"45",X"54",X"49",X"4E",X"47",X"0C",X"20",X"DB",X"20",X"20", - X"4D",X"55",X"53",X"49",X"43",X"20",X"45",X"4E",X"44",X"20",X"00",X"00",X"00",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7", - X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7"); -begin -process(clk) -begin - if rising_edge(clk) then - data <= rom_data(to_integer(unsigned(addr))); - end if; -end process; -end architecture; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/rom_sprite_high.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/rom_sprite_high.vhd deleted file mode 100644 index 8c30be36..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/rom_sprite_high.vhd +++ /dev/null @@ -1,24 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all,ieee.numeric_std.all; - -entity rom_sprite_high is -port ( - clk : in std_logic; - addr : in std_logic_vector(4 downto 0); - data : out std_logic_vector(3 downto 0) -); -end entity; - -architecture prom of rom_sprite_high is - type rom is array(0 to 31) of std_logic_vector(3 downto 0); - signal rom_data: rom := ( - "0001","0001","0001","0001","0000","0000","0000","0000","0001","0001","0001","0001","0000","0000","0000","0000", - "0001","0001","0001","0001","0000","0000","0000","0000","0001","0001","0001","0001","0000","0000","0000","0000"); -begin -process(clk) -begin - if rising_edge(clk) then - data <= rom_data(to_integer(unsigned(addr))); - end if; -end process; -end architecture; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/rom_sprite_high_new.vhd b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/rom_sprite_high_new.vhd deleted file mode 100644 index bf9564e1..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/rom_sprite_high_new.vhd +++ /dev/null @@ -1,24 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all,ieee.numeric_std.all; - -entity rom_sprite_high_new is -port ( - clk : in std_logic; - addr : in std_logic_vector(4 downto 0); - data : out std_logic_vector(7 downto 0) -); -end entity; - -architecture prom of rom_sprite_high_new is - type rom is array(0 to 31) of std_logic_vector(7 downto 0); - signal rom_data: rom := ( - X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", - X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00"); -begin -process(clk) -begin - if rising_edge(clk) then - data <= rom_data(to_integer(unsigned(addr))); - end if; -end process; -end architecture; diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/snd.bin b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/ldrun/snd.bin deleted file mode 100644 index e483d90d58718fbd8906218ad44752532abd0822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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

>z;@#TPHF^;j1yc3VR9m8QN}QbVS#O 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 diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-3n.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-3n.hex deleted file mode 100644 index b7ef7de1..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-3n.hex +++ /dev/null @@ -1,513 +0,0 @@ -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000003AD -:10005000000000000000000000000000000000F0B0 -:100060000300070503000001010203020100000074 -:10007000FC3E1EB63E1C60F0F0E0E02000E0000018 -:100080000000000000000000000001030F0E0B0F35 -:1000900000000000000000000000FCFC003C683490 -:1000A0003E7F6F07020307070E0F060000000000E7 -:1000B0000000C0E050FCFE0F07060000000000003A -:1000C00000000000000000000000000307070677A2 -:1000D000000000000000000000003C3CE0FEFAFCD4 -:1000E000FBDF0F0F010F0F1E383C1800000000004F -:1000F000F0E0E0C020F0F83C1C38000000000000F8 -:10010000000000000000000000000000070F1F1C9E -:10011000000000000000000000000000C0E0F6F653 -:100120001F1FC8DCFF771B3E2F13000000000000DC -:10013000FEFC3C78F0F0E040F0F838183818000089 -:10014000000000000000000000001F7FF8F1DBF954 -:1001500000000000000000000000808000C040801F -:10016000770F7FF9EF7F1E1C38381C180000000045 -:1001700018F8F0F8D880000000000000000000002F -:10018000000000000000000000000000001F1F0031 -:1001900000000000000000000000000000C0E07847 -:1001A0001E0B1620700F07010F1F1C1E0F060000EC -:1001B0003868783CFEF6E070F8A00000000000000F -:1001C000000000000000000000000000000F0F0011 -:1001D00000000000000000000000000000E0F03C13 -:1001E0000F050B103837030E1F050000000000003C -:1001F0001CB43C187CFEF783F0F83878F0600000FF -:100200000000000000000000000000000000001FCF -:10021000000000000000000000000000000000C01E -:100220001F001E0B1600307F67040F1F3C180000D4 -:10023000E07838687830F8FCEE90F0E0F078000074 -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:100260000000030103010000000000000000000086 -:1002700000000090F0F8FC78300000000000000062 -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A0000000010301030604040000000000000038 -:1002B0000000A0F0F0E0C0400000000000000000DE -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E0000000040603070F070600000000000000DE -:1002F00000002070E0E0F0E0C0000000000000001E -:1003000000000000000000000000133F1E3878705D -:1003100000000000000000000000C080000000009D -:10032000381C000000000000000000000000000079 -:1003300000000000000000000000000000000000BD -:100340000000000000000000000000000C07030790 -:10035000000000000000000000000000E0C0C0E05D -:100360000703010000000000000000000000000082 -:10037000C084C00000000000000000000000000079 -:10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D -:1003A0000000020203010301010000000000000040 -:1003B00000002060F0E0F0C08000000000000000BD -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E0000000020203010301000000000000000001 -:1003F00000002060F0E0F0E0C0000000000000001D -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000020100000100000000C8 -:100430000000000000C0602020709000000000005C -:10044000000000000000000000000000070F1F1F58 -:10045000000000000000000000000002E2F0FCFECE -:100460005E0C47CF8F67000707033038300000006D -:100470007A30E0F0F0E000E0E4CC1800000000008A -:100480000000000000000000000000007FFF7F7FF0 -:10049000000000000000000000000000F0F8FCFC7C -:1004A0003F1F0001030311DC09C10C0E0600000010 -:1004B000FC980038F0E0F105F7E2F0003038180061 -:1004C0001E3F7F7E3C3063773F1F1F07030F1F1FB8 -:1004D0003C4600231E0CC6EEFCF8F8E0C0F0F8FC29 -:1004E0003F3F1F070D06020204000000000000004D -:1004F000FEFAFCF0F0604040200000000000000028 -:100500001E2300463C0C1B1F0F1F1F07030F1F1F3E -:100510003C7E7F3F1E06C3F7FEFCF8E0C0F0F8FC0F -:100520001F1D0F070502020204000000000000006A -:10053000FCFCFCF8F0C080804000000000000000DF -:10054000000000000000000804040C1F1F7FBFFF14 -:1005500000000000000000408080C060C0F0D8F8BB -:100560007F3F1F070F1F3F3F1F3F3C180C060F3FE9 -:10057000F0E0C0B0F0F0F8FEF1E1623C0000008075 -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A00001070F0F1F1F1F0E0C0000C1E363214046 -:1005B000C0F0F8F8FCFCFC7830000083870602816C -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000008000000000009B -:1005E00001070F0F1F1F1F0E0C0000C1E363214006 -:1005F000C0F0F8F8FCFCFC7830000083870602812C -:1006000000000000000000000300020000000000E5 -:1006100000000000000000000080800000000000DA -:1006200001070F0F1F1F1F1301000030381C0408A3 -:10063000C0F0F8F8FCFCFCCC840000181830201046 -:1006400000000000000000000300020000000000A5 -:10065000000000000000000000808000000000009A -:1006600001070F0F1F1F1F0E0C0000C1E363214085 -:10067000C0F0F8F8FCFCFC783000008387060281AB -:10068000000000000000000000000000000000006A -:1006900000000000000000000000183C3C7C7E7E52 -:1006A000000000010103030307070707030301001C -:1006B0007EFCFCFCB8F8F0F0E0E0E0E0C0C08000B8 -:1006C0000000000000000000000000000003070719 -:1006D00000000000000000000000000000E0F0F05A -:1006E0000F1F1F1F0F03000000000000000000008C -:1006F000F8FCFCFCF82000000000000000000000F6 -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:10072000061F3F3F3F3F0F0707000000000000008B -:1007300040F0F8F8F8F8F0E0C00000000000000019 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:1007600008102060000000000000000000000000F1 -:100770000000000600000000000000000000000073 -:100780000000000000000000000000000000006009 -:100790000000000000000000000000001008040637 -:1007A0000000000000000000000000000000000049 -:1007B0000100000000000000000000000000000038 -:1007C000000000000000000000030F1F1F0F0701C2 -:1007D00000000000000000000080E0F0F8F8FCFCE1 -:1007E0000000000000000000000000000000000009 -:1007F000FCFE767E7E7E7E7E7E7E7E7E3C3C18008B -:1008000000000000000000000000000000000003E5 -:1008100000000000000000000000000000000000D8 -:1008200007070F0F0F0F070607030303030100005D -:1008300080C0C0C0C0E0E0E0F0F0F0F0E0E0C00058 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000FFFFFFFFFFFFFF000000000000006E -:100990000000FFFFFFFFFFFFFF000000000000005E -:1009A000000000000080C0E0F0783C1E0F0703014B -:1009B0000000000000000000000000000080C0E017 -:1009C0000000FFFFFFFFFFFFFF7F3F1F0F07030137 -:1009D00000FF7FBFDFEFF7FBFDFEFFFFFFFFFFFF25 -:1009E0000000000000000000000000000000000007 -:1009F000FF7F3F1F0F070301000000000000000001 -:100A000000FFFFFFFFFFFFFFFFFF7FBFDFEFF7FBF1 -:100A100000FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF4 -:100A2000FDFEFFFFFFFFFFFFFF7F3F1F0F070301DB -:100A3000FEFE7EBEDEEEF6FAFCFCFCFCFCFCFCFCE2 -:100A400000000000000000000000000000000000A6 -:100A5000F0783C1E0F0703010000000000000000BA -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A8000000000000080C0E0E0E0E0E0E0E0E0E046 -:100A90000000000000000000000000000000000056 -:100AA000E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E046 -:100AB0000000000000000000000000000000000036 -:100AC000000000000000FFFFFFFFFFFFFFFFFFFF30 -:100AD00000000000000000F0FFFFFFFFFDFFE3EF5C -:100AE000FFFFFFFFFEFEFFFFFFFFFFFCF000000027 -:100AF000DFDFBF7F7F79E7FFFFFF1F0703010100F3 -:100B00000000000000000000C0FFFFFFFFFFFEF834 -:100B100000000000000000007FFFFFFFF0800000E9 -:100B20000080C0F0FEFFFFFFFFFFF00000000000AC -:100B3000000000000080E3FFF9000000000000005A -:100B400000000000000018F8FCFDFFE000000000BD -:100B500000000000003E7FFFFCF0E00000071F3FA8 -:100B60000001010F3F7FFFFFBF07000000000000F2 -:100B7000FFFFFFFFFFFFFFFFFFFC0C000000030F64 -:100B8000000000000000C0FF1F030000FFFFFFFF88 -:100B900000000000000000F8FFFFCF00FFFFFFFF94 -:100BA000FFFFFFFFFFFEF8E0000103071F7FFFFFCD -:100BB000FFFFFFF8C00000017BFFFFFFFFFFFFFF0B -:100BC000000000000000000FFFFFFF00FFFFFFFF1D -:100BD000000000000000C0FFFFFFFF3F00E0E0E377 -:100BE000FFFF1F3F7F7FFFFFFFFFFFFFFFFFFFFFB5 -:100BF000FFDFCFCFE7F3F0E0CFFFFFFFFFFFFFFF07 -:100C0000000000000000FFFFFFFEFFFF001F7FFF4E -:100C100000000000001FFFFFFF01C0E000FFFFFF1A -:100C2000FFFFFFFFFF00033FFFFFFFFEF9E7FFFFAE -:100C3000FFFFFCE00000FEFFFFFFFF3EFCF3FFFFB5 -:100C4000000000033FFFFFFFFFFCF80000FEFFFF76 -:100C5000000000F0FFFFFFFFFFFF0000000080FF2B -:100C6000FF3F03030100000387C0C0000000000035 -:100C7000FFFFFFFFFFF0C080000000000000000049 -:100C8000000000FFF9FEFFFFF0000000000000F38D -:100C90000000FFFFFF0FF1000000000F3F7FFFFF8C -:100CA000FFFFFFF000000000000000000000000057 -:100CB000FFFC000000000103030F1F1F3F7F7F7F29 -:100CC0000001FFFFFFFFFF1F00007FFFFFFFFFFF8F -:100CD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE15 -:100CE000E1030F1F7FFFFFFFFFFFFFFFFFFFFFFF7E -:100CF000FEFCF8F8F0F0F0F0F0F0FEFFFFFFFFFF71 -:100D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7FF3 -:100D1000FFFFFFFFFFFFFFFDB93141E0F0F0F8F802 -:100D20005F1F0F0F07010000031F3FFFFFFFFFFFC3 -:100D3000FCFCFDF9F1830371FCFCFEFFFFFFFFFFEC -:100D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 -:100D5000FFFFFFFFBFFFFFFFFDF1F8FCFEFFFEC03E -:100D6000FFFFFFFFFFFFFFFFFF3F0F8080E0F8FF67 -:100D700000FCFFFFFFFFFFFFFFFFFF3F7F0F030FA1 -:100D8000C0C0C0C0E0E0E1E7FFFFFFFFFFFF3F1D85 -:100D9000FF7F3F3F1F1FCFEFFFFFFFFFFFF1F3C7B5 -:100DA000000000C0C0E0F0FCFEFEFEFCFCFCF8C051 -:100DB0000F0F0F07070703030301000000000000E7 -:100DC00000000000000000000000000103070F1FEA -:100DD00000000000000000000F1F7FFFFFFFFFFF6B -:100DE0001F3F7FFFFFFFFFFFFFFFFFFF1F0FC7C377 -:100DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:100E000000FFFFFFFFFFFFFFFFFEFDFBF7EFDF30FF -:100E100000FEFDFBF7EFDFBF7FFFFFFFFFFFFF00DF -:100E2000FFFFFFFFFFFFFF000000000000000000C9 -:100E3000FFFFFFFFFFFFFF000000000000000000B9 -:100E4000E0FFFFFFFFFFFFFFFFFFFFFFFFFFFF00D0 -:100E5000000080E0F8FEFFFFFFFFFFFFFFFFFF0045 -:100E6000FFFFFFFFFFFFFF00000000000000000089 -:100E7000FFFFFFFFFFFFFF00000000000000000079 -:100E800001010101010181E1F9FDFBF7EFDFBF7F06 -:100E9000FCFCFCFCFCFCFCFCFCFCFCFCFCFCFC008E -:100EA000FEFCF8F0E0C08000000000000000000040 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED00000000000000000000103070C18337777C2 -:100EE0000000000000000000000000000000000002 -:100EF000773B3F1F1F0F0F0F1F1F3C3C387878F0C8 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000307C7 -:100F200000000000000000000000000000000000C1 -:100F300004040E1F3F3F7F7F3F0F07070707071F70 -:100F400000000000000000000000000000000000A1 -:100F5000000000000000000000000001070E1C3926 -:100F60000000000000000000000000000000000081 -:100F7000333331180F070F1E3C3E0F0301010000F1 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000030747 -:100FA0000000000000000000000000000000000041 -:100FB00007060E1C38716363676773323038183F59 -:100FC0000000000000000000000000000000000021 -:100FD00000000000000000000F3E7C78F8F1E3E61E -:100FE0000000000000000000000000000000000001 -:100FF000FCFC7E3F3F1F0F3F7FF0F0F0F8FC3CFC15 -:1010000038050F1F0F1D0F07030001010000010726 -:1010100007EEFCFCEEFCFFFFFFFFFF9FC160E1F766 -:10102000E0100000000080C0E0E0C08080C0E0F080 -:1010300000000000000000000000000000000000B0 -:1010400038053F1F0F1F0F07070D3C6643231E0087 -:1010500007EEFCFCEEFCFFFFFFFFFF6743231E00D3 -:10106000E0100000000080C0E0E0C0800000000050 -:101070000000000000000000000000000000000070 -:10108000700B183F1F3F1F0F0700000000000000FB -:101090000FDC78F8DCF8FFFFFFFF7F6F3F3F3F1E5C -:1010A000C020000000000080C0C080DEFFFF7E3C4A -:1010B0000000000000000000000000000000000030 -:1010C00000000000003C46868C7D190D07030001DE -:1010D000788C00463C180C7CFEFFFFFEFC78FEFF7F -:1010E0003F7F6F3F0F1B0C0404080000000000004E -:1010F000F8FCF4F8E0E0C080804000000000000050 -:101100000000000000003C7EFEFD7D07060001039C -:1011100078FCFE7E3C06027BFFFEFEFCFC78FEFFB8 -:101120003F3F3B1F0F0B05050508000000000000B6 -:10113000F8F8F8F8F0E080000080000000000000FF -:10114000000103000000000000000000000000009B -:1011500073FFFFDF1F0F03070F3F7F6330183CFE55 -:10116000CEFFFFFBF8F0C0F6FEFCFEFF7F3E000066 -:101170000080C0000000000000000000000000002F -:10118000601F7FFF7FFF7F3F1F0F1F190C061E7F11 -:101190001E71E0E060C0F8FCFEFEF8F0180C1E7F47 -:1011A000601F7FFF7FEF4703010103151C061E7FB1 -:1011B0001E71E0E060C0F8FCFEFEF8F0180C1E7F27 -:1011C000000000000000000000000000000000001F -:1011D000000000387D75302A00000000000000008B -:1011E000000000E0F070E0000000000000000000DF -:1011F00000000000000000000000000000000000EF -:1012000000000307070300000000000000000000CA -:1012100000008EDF570EA00000000000000000005C -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000010100000100010000000000009A -:101250000000E3F7D5C3A800800080400000000034 -:10126000000080C0C08000000000000000000000FE -:10127000000000000000000000000000000000006E -:10128000000000000000000201000000000000005B -:10129000000000000304387D7538020000000000E3 -:1012A000000000000000000000000000000000003E -:1012B000000E0F07060800000000000000000000FC -:1012C000000000000000000201000000000000001B -:1012D000200020000204387D753802000000000064 -:1012E00000000000000000000000000000000000FE -:1012F000000E0F07060800000000000000000000BC -:101300000071FBEA611400000040200000000000B2 -:1013100000C0E0E0C000000000000000000000008D -:101320000071FBCA611400000040200000000000B2 -:1013300000C0E060C00000000000000000000000ED -:101340000000000001010001010000000000000099 -:10135000000036FFFFFFFFFFF1E00000000000008B -:1013600000000080C0C080C0C080000000000000FD -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:101390000000000103010307070200000000000035 -:1013A000000000FEFFFFFFFF1F0F0E000000000007 -:1013B00000000000008080800000000000000000AD -:1013C0000000000101000101000000000000000019 -:1013D0000036FFFFFFFFFFF1E0000000000000000B -:1013E000000080C0C080C0C080000000000000007D -:1013F00000000000000000000000000000000000ED -:101400000000061F3F3F1F3F3C1800000000000087 -:101410000000C0F0F8F8F0F8F870000000000000DC -:10142000061F3F3F1F1F1F3F3C0C00000000000035 -:10143000C0F0F8F8F0F0F0F8F83800000000000014 -:1014400000000000000000030F07070F1F1F0F031D -:1014500000000000000000E0F0FCFCFCFCFCE0C030 -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:1014800000000000000000070F7F7F7F7F7F0F07B5 -:101490000000000000000080E0F0F0E0C0C0E0804C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000001F3F7F7F7F3E3C0C00000000000000BB -:1014D00000E0F0E0F0F878302000000000000000AC -:1014E00000071F3F3F7F7F7E3E3C1800000000004A -:1014F00000C0F0F8DCFCFEFE7E7E7E7E7E3C1800A6 -:1015000001010101010101010101010101010101CB -:10151000FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC0B -:1015200000000000000000000000000000000000BB -:101530000003377FF9F9FDF7717038381838707C7F -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:101580000000000000000000000004070701000147 -:1015900000000000000000000060C0E0C080C0C08B -:1015A000000000000000000000000000010000003A -:1015B000000000000000000000000000C00000006B -:1015C0000000000000000000000006030F070706EF -:1015D0000000000000000000000040C080C060204B -:1015E00000000000000000000000000001000000FA -:1015F00000000000000000000000000000000000EB -:101600000000000000000000000507030F130103A5 -:1016100000000000101020008080C0E0C08080002A -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:101640000000000000000004060F1F1F0F1F1E0CEB -:1016500000000000000000008080000080C040000A -:101660000000000000000000010000000000000079 -:1016700000000000000000008000000000000000EA -:10168000000000000000000000000106010004034B -:1016900000000000000000001830F0F8E0301000FA -:1016A000000000000000000000000D1100040C0606 -:1016B0000000000000000000001830F8F03020406A -:1016C000003F7F3F3F1F0F00000101000ACE04C012 -:1016D00000F8FCFEFEFECC009CF8F0F902F3E1708D -:1016E0000000000000000000000000000C0E0C00D4 -:1016F0000000000000000000020200000C0E0600C6 -:101700000000000000000000000000000103FFFFD7 -:10171000000000000101010307031D7EFFFFFFFF22 -:101720000000000000000000000000000000003F7A -:10173000000000000000000000000000000007FFA3 -:1017400000003F7F3F3F1F0F000101000A0EC40051 -:101750000000F8FCFEFEFECC9CF8F0F802E3F1601D -:101760000000000000000000000000000000000079 -:10177000000000000000000002020000C0E0600065 -:10178000000000000000071F3F7F7F7F3E3C1800E5 -:10179000000000000000F8FEFFFBFF1F0F0F07070F -:1017A0000000000000000000070707070303010016 -:1017B0000080C0C0C0E0E0E0E0E0E0E0C0C0800049 -:1017C0000000000000000000010307000703010003 -:1017D000000000000000000080C0E000E0C08000C9 -:1017E00000000103070F1F1F1F1F1F0F070301002A -:1017F000000080C0C0E0C0808080C0E0C0C0800029 -:101800001F1F001E0B1600001F3F700F1F1C08003B -:10181000C0E07838687830F8FCEC90F0E0F07800C0 -:101820000F0F03111B130103073F3A0F1F1C080082 -:10183000E0F0FCE47CFCC898FCEC90F0E0F0780070 -:101840000003071E3C3E1E1C0F07070A1F5F2E0EDB -:1018500000F8F8017BD66E0408F0E040C0C08000BC -:10186000000000000000000007030000000000006E -:1018700000000000000000008000000000000000E8 -:1018800000030F3F3E3B1F1E0C070F143F5FFE7807 -:1018900000F0F80C3C7C3838F0E0E0C0800000003C -:1018A000000000000000000007030000000000002E -:1018B00000000000000000008000000000000000A8 -:1018C00000000000030300030102000000010707FD -:1018D00000000000F8FC0FC76DCF0670FCFCA8F0FC -:1018E0000000000000000000030C000000000000E9 -:1018F0000000000000000000FCDC387078300000C0 -:101900001F1F001E0B1660F0DF070303020E00000E -:10191000C0E07838687830E0F0E0D8F8F0707838D7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000F0F001C160F1F3D330307070300000095 -:10195000C0F0F878CB7FFFFFCE87078E0000000035 -:101960000000000000C0C0000000000000000000F7 -:101970000000000000000000000000000000000067 -:101980000001030307070703030000607131608152 -:1019900070FCFEFEFFFFFF9E0C0000C1C1808102B3 -:1019A000000000000000000000000080C0C08000B7 -:1019B0000000000000000000000000000000000027 -:1019C00001070F0F1F1F1F1301000030381C0408F0 -:1019D000C0F0F8F8FCFCFCCC840000181830201093 -:1019E00001070F0F1F1F1F0E0C0000C1E3632140F2 -:1019F000C0F0F8F8FCFCFC78300000838706028118 -:101A00001C78F0F03913110303C6E2606000643CF7 -:101A1000381E0F0F9CC888C0C06347060600263CCE -:101A2000000001070F0F03010160706060004C7837 -:101A30000000C3810000993C183C3C662400000073 -:101A4000000080E0F0F0C08080060E060600321E26 -:101A50000000000000000000000000000000000086 -:101A60001C78F0F03913110303C7E3616301643C90 -:101A7000381E0F0F9CC888C0C0E3C786C680263CAE -:101A80001C78F0F03913110303C6E2606000643C77 -:101A9000381E0F0F9CCB8FC6C660663C000000004E -:101AA00000784C006061774F0F03010100000000D7 -:101AB0000000000000C3810000993C183C3C6624F3 -:101AC000001E32000686EEF2F0C0808000000000AA -:101AD0000000000000000000000000000000000006 -:101AE0003C64006060FCF8F0F03913110303060257 -:101AF0003C260006063F1F0F0F9CC888C0C06040F0 -:101B0000000000001C78F0F039D3F1636306663CF6 -:101B100000000000381E0F0F9CCB8FC6C660663CCD -:101B2000003C64003030381000000000000000006D -:101B3000000000001C78F0F03913110303060200C6 -:101B400000000000381E0F0F9CC888C0C060400015 -:101B5000003C26000C0C1C080000000000000000E7 -:101B600000000000000C1C3810004C780000000041 -:101B70001C78F0F039131103030602000000000086 -:101B8000381E0F0F9CC888C0C060400000000000D5 -:101B9000000000000030381C0800321E0000000069 -:101BA00000010307070707070607070707030100E8 -:101BB0000080C0E0E0E0E0E0E0E0E0E0E0C08000E5 -:101BC00000000000030F1F3B3F7F7E7E7E3C18001D -:101BD000000000E0F8FCFCF8F0000000000000004D -:101BE0000000000000030F1F3F7F7F7E3E3C180077 -:101BF0000000000000FCFFBFFFFF0F07070301000C -:101C00000000000000000080C0E0E0E0C0C08000F4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C400000007FFF7F7F3F3F280018301900010907 -:101C50000000F0F8FCFCFC9800F87CFCFA03F9F8B2 -:101C60000000000000000000003318000000000029 -:101C7000000000000002020000C00C1C0C0000006C -:101C800000007FFF7F7F3F1F000000000BCE05C0DC -:101C90000000F0F8FCFCFC9800C87CFCF800F8F9A7 -:101CA000000000000000000000013038300000009B -:101CB000000000000000000000CC18000000000040 -:101CC0000080800000000000000000003038180094 -:101CD0000000000000000000000000003070300034 -:101CE000A0A00F1FBFFF7F190C1F3F1F001F0F0772 -:101CF0005050FEFFFEFEFCF880C0C08000808000D7 -:101D0000008080000000000000000000181D04009A -:101D100000000000000000000000000040C0400083 -:101D2000A0A0071FBFFF7F190C1F3F1F001F070345 -:101D30005050FEFFFEFEFCF880C0C0800080800096 -:101D40000080800000000000000000000307020087 -:101D50000000000000000000000000000080000003 -:101D6000A0A00F1FBFFF7F190C1F3F1F001F1900EE -:101D70005050FEFFFEFEFCF880C0C0800080800056 -:101D8000008080000000000000000000101C08001F -:101D900000000000000000000000000060E0800083 -:101DA000A0A00F1FBFFF7F190C1F3F1F001F1F0E9A -:101DB0005050FEFFFEFEFCF880C0C0800080000096 -:101DC0003F7F3A351F0F000001010001001111088B -:101DD000F8FCFE7EFECC009CF8F0F805FFDAC09817 -:101DE0003F7F353A1F0F000001010001001111086B -:101DF000F8FC7EFEFECC009CF8F0F805FFC2D8800F -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E4000FFFFF7FFFFFFFFFFEFDFFFFFFFFF99F14E -:101E5000FFFFFFFFFFFBFFFFFFBFEFFFFFBF180705 -:101E6000FFFFFFFFFFBFFFFFFFFDFFFFDFFD1801CB -:101E7000FFFDFFFFFFEFFFFFFFFFDFFFFFFF999871 -:101E8000FFFFFFFFFFFFFFFFFFFF3F1F1F0F0F07BA -:101E9000FFFFFFFFFFFFFFFFFEF8E0E0E0E0E0F004 -:101EA000FFFFFFFFFFFFFF3F0F07070303030101D2 -:101EB000FFFFFFFFFFFDF8F8F0C0808080C0C0C0CA -:101EC000FF9F0F0F07070200000000000000000046 -:101ED000FFFFFFF4E0C0C080000000000000000031 -:101EE000FF7F230000000000000000000000000051 -:101EF000FFFFFEE000000000000000000000000006 -:101F0000000000000000000000718A0A122242F95D -:101F10000000000000000000008C52525252528C0F -:101F200000000000000000000011325292FA12116D -:101F30000000000000000000008C52525252528CEF -:101F40000000000000000000007942720A0A4A31D5 -:101F50000000000000000000008C52525252528CCF -:101F6000000000000000000000314282F28A8A7105 -:101F70000000000000000000008C52525252528CAF -:101F8000000000000000000000718A8A728A8A71D5 -:101F90000000000000000000008C52525252528C8F -:101FA000000000000000000000314A4A4A4A4A315D -:101FB0000000000000000000008C52525252528C6F -:101FC0000000000000000000000000000000000011 -:101FD00000000000000000000002060202020207EA -:101FE00000000000000000000000000000000000F1 -:101FF0000000000000000000000E11010204081F94 -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-4c.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-4c.hex deleted file mode 100644 index 1c61bb52..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-4c.hex +++ /dev/null @@ -1,513 +0,0 @@ -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:100050000000000000000000000000000000007030 -:10006000000007070F070301010303030100010359 -:100070007C3E1EFEFEFCA010900020E0C0E0E0E010 -:100080000000000000000000000001030F0E0F0F31 -:10009000000000000000000000C08080003CFCFC6C -:1000A00007030177630307070E0F0703070000002C -:1000B000FCF8C0E0F0FCFE0F070E9C8E060000006E -:1000C0000000000000000000000001030707070710 -:1000D000000000000000000000C0E0C0808ECECF15 -:1000E0000307EFCF070F0F1E383C1E0E1C00000049 -:1000F0008E1CA0C0E0F0F83C1C387078380000007E -:10010000000000000000000000000000070F1F1F9B -:10011000000000000000000000000000CCFCF8F02F -:100120003F7F2F0F07071F3F2F131E3E00000000C9 -:10013000F0F0E0C0E0F0E0E0F0F83818387870381F -:10014000000000000000000000001C7CF8F1FFFF30 -:1001500000000000000000000000000000C0C0E03F -:100160007E3E7F7F3F1F1E1C38381C1E0E1C180051 -:10017000C0067FFFDE8C00000000000000000000D1 -:10018000000000000000000000000000000000006F -:1001900000000000000000000000000000C0E07847 -:1001A0001E1F1F1F0FE7C7070F1F1C1E0F07030788 -:1001B00038F8F8E0C080E7F3F8BC3C3800808000F5 -:1001C000000000000000000000000000000000002F -:1001D0000000000000000000000000000060703C13 -:1001E0000F0F0F0F0703736F1F3D3C1C0001010031 -:1001F0001CFCFCF8E0C0F0E0F7FB3878F0E0C0E071 -:1002000000000000000000000000000000000000EE -:10021000000000000000000000000000000000C01E -:1002200000001E1F1F1F0F0707E7CF1F3C183C7C55 -:10023000E07838F8F8F0C080E0F7F3E0F0783C7C44 -:100240000000000000000000000100050F071F0C67 -:100250000000000000000000C0C0D4FEFFFEFBF163 -:100260001C0E1C3E346070210307060303070600C2 -:10027000F8FFFE6A00000086CE8703068E8F03001B -:10028000000000000000000060E06B3F3F3F1F3FA8 -:10029000000000000000000003AFFFFEFCF6E2F0EB -:1002A0001F0F0200006071FBCB073E381C0C0000E2 -:1002B000FEFC5400000000808000000000000000F0 -:1002C00000000000000000000000051F3F7F3F7F8E -:1002D0000000000000000000000040FCFEFEFEECFC -:1002E0003F7FDBF960183038180C1E3E000000001C -:1002F000FCF8D0800000001038383C1C3870781CA6 -:1003000000050F3F7F3F79397C1F0C0061C7870FC5 -:100310000040F0F8F0F0E0F0F8FC3870FBDF8E0CF5 -:1003200046603838180C0E070F0C00000000000063 -:1003300000000000000000000000000000000000BD -:1003400000000000000A3F7F3F3F1E3E70F87C70B7 -:10035000000000000080C0F0F8F07870183C1F0327 -:10036000C0C46EEE5C180C0C07070E0C00000000F9 -:10037000367A3C1C1830787C000000000000000039 -:100380000000000000000000000A1F3F1F37230785 -:1003900000000000000000000080E8FCF8FECCCE69 -:1003A0003F3F7D6DC0E04C1EDEF870300000000065 -:1003B000DCEEDF9B070E0638783C1C38F0E070302E -:1003C0000000000000000000000A1F3F1F37230745 -:1003D00000000000000000000080E8FCF8FECCCE29 -:1003E0003F3F7D6DC0E0441E3F381C0E3E3800008C -:1003F000DCEEDF9B070E06183C3E0E1C383E0E005E -:10040000000000000000000000000000020F1F0FAD -:10041000000000000000000000000000A0F0FCFE52 -:100420000F070F1F3F1F0B01000B1F0C01000003E4 -:10043000FC9E9C3EF81080C0C08060C080C0E0E0A0 -:10044000000000000000000000000000070F1F1F58 -:10045000000000000000000000000000E0F0F8F8DC -:100460001F0F1F3F1F0703070F1F0C000000000096 -:10047000F8F8FCF8F0E0C0F8F8F000000000000028 -:100480000000000000000000000000007FFF60602E -:10049000000000000000000000000000F0F8FCFC7C -:1004A0003F1F0001070F07000307030000000000C3 -:1004B000FCF8F0F8FCFEFCF0C0E0C41E0C000000EC -:1004C0000000000000000307030301030103010013 -:1004D000000000000000C0E0F0F0F0E0C0F0F0F834 -:1004E0000000001834383C1C080000000000000028 -:1004F000F87020083C5C3C38100000000000000050 -:1005000000000000000003070000000000000000E1 -:10051000000000000000C0F06000000040F0383C27 -:10052000000000183D3C3C1C0800000000000000DA -:100530001C1C080000E060400000000000000000FB -:1005400000000000000000103878747820081C3E7D -:1005500000000000000000207078385830000000D3 -:100560003E1F1F070F1E3F3F1F0F0000000000002F -:100570000000800000202000C0800000000000007B -:10058000000000000000000000000000000000006B -:1005900000000000000000000000000000800000DB -:1005A00001000000111F1F0E0C657D380C040408AB -:1005B000C0808080C4FCFC7830B3FF746060201081 -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000080808000009B -:1005E00001000000111F1F0E0C657D380C0404086B -:1005F000C0808080C4FCFC7830B3FF746060201041 -:1006000000000000000000000000000000000000EA -:10061000000000000000000000000080808000005A -:10062000010204040E1F1F1321397F4F0361402173 -:10063000C020101038FCFCCC86B6FC600486820119 -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000080808000001A -:1006600001000000111F1F0E0C657D380C040408EA -:10067000C0808080C4FCFC7830B3FF7460602010C0 -:10068000000000000000000000000000000000006A -:10069000000000000000000000FF7E3C3C0C707E6B -:1006A0000000000000000303070707000303070F13 -:1006B0007EFC1C00000000C0E0E0E000C0C0E0F0F4 -:1006C000000000000000000090900060F043070769 -:1006D0000000000000000000090900060FE4F0F02F -:1006E0000F1F1F1F0F030000010300000404000080 -:1006F000F8FCFCFCF820000080C080008080000036 -:1007000000000000000000000202000307030000D8 -:1007100000000000000000004040000080000000D9 -:10072000061F3F3F3F3F0F070760F040004848006B -:1007300040F0F8F8F8F8F0E0C0020F0600242400BA -:100740000000000000000000000000000000001C8D -:100750000000000000000000000000381C3C0C0EEF -:10076000302F1F1F67F0E0400000183E000000001F -:1007700006F7FBF9E70F0E0400000000387C7C3818 -:100780000000000000000054383C387060EFDF9F2C -:100790000000000000000000002A1C3C0CF6FAF8E3 -:1007A000E7F07020000000001C3E3E1C000000002E -:1007B000E60F07020000187C0000000000000000A7 -:1007C000000000000000000020313D3D3B3B332194 -:1007D00000000000000000000080E0F0F8F8FCF0ED -:1007E0000000000000000000000000000000000009 -:1007F000C000000000007E7E7E7E7E003C3C7EFFCE -:1008000000000000000000000000000000001F0FBA -:100810000000000000000000000000000000E0C038 -:100820000706010F0F0E000000030303000103077A -:100830008000C0C0C000000070F0F08060E0F0F800 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:1009800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:1009900000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:1009A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 -:1009B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 -:1009C00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 -:1009D000000080C0E0F0F8FCFEFFFFFFFFFFFFFF1C -:1009E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:1009F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 -:100A00000000000000000000000080C0E0F0F8FCE2 -:100A100000000000000000000000000000000000D6 -:100A2000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:100A3000000080C0E0F0F8FCFEFEFEFEFEFEFEFEC2 -:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:100A5000FFFFFFFFFFFFFFFFFFFDFFFFFFFFFDFFAA -:100A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:100A7000FFFDFFFFFFFFFDFFFFFDFFFFFFFFFDFF8E -:100A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 -:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:100AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 -:100AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:100AC000000000000000FFFFFFFFFFFFFFFFFFF03F -:100AD00000000000000000F0FFFFFFFFFDFFE30F3C -:100AE0000000000000000100000000000000000005 -:100AF0001F1F3F7F7F78E000000000000000000023 -:100B00000000000000000000C0FEF8F0C1C70F7F29 -:100B100000000000000000007E78077FFFFFFFFF5D -:100B20000F8FCFFFFF7F3F1F00000FFFFFFFFFFF73 -:100B3000FFFFFFFFFFFFFF0301F0F0E1C3C7CFCFCF -:100B400000000000000018E00001FFFFEFEFEFEFF2 -:100B500000000000003E7FFFFFFFE0FFFFFFFFFF00 -:100B6000F7FEFCF0C080F0FFFFFFFFFFFFFFFFFF7D -:100B7000FF7F1F00000000FFFFFFFFFFFFFFFCF0F3 -:100B8000000000000000C0FFFFFF3FFFFFFFFCFF71 -:100B900000000000000000F8FFFCF0F0DF3FFFFF66 -:100BA000FFFFFFFF1F1D7FFFFFFEFCF8E08000003E -:100BB000FFFFFFFCFCF0F0E0800000000000000000 -:100BC000000000000000000FC0000000FFFFFFFC5D -:100BD000000000000000C0FF0000000000800003D3 -:100BE00010E7080000000000000000000000000006 -:100BF0003FDF0F0F070300010000000000000000AE -:100C0000000000000000FFFE00000000001F7FFF4A -:100C100000000000001FFC000000000003FFFFFFB9 -:100C2000FFFFFFFFFFFFFCC00000000106180000EF -:100C3000FFFFFCE000000000000000C1030C00000A -:100C4000000000033CC00000000307FFFFFFFFFFA0 -:100C5000000000F0000000000000FFFFFFFFFFFFAA -:100C6000FF3F00000000000000070F1F7FFFFFFF95 -:100C7000FC800000000F3F7FFFFFFFFFFFFFFFFF33 -:100C8000000000FF010000000FFFFFFFFFFFFFFF5C -:100C90000000FFFFFF0F01FEFFFFFFFFFFFFFFFF51 -:100CA0000F0F1F3FFFFFFFFFFFFFFFFFFFFFFFFFD4 -:100CB000FFFFFFFFFFFFFEFCFCF0E0E0C080808054 -:100CC0000000F0E18FFFFF008080FFFFFFFFFFFECD -:100CD0006F3F7FFFFFFEE00000FFFFFFFFFE800190 -:100CE000FEFCF0E0800000000000000000000000BA -:100CF0000103070707070F0F0F0F01000000000097 -:100D0000FFFFFFFCE000000000FFFFFFFF7FFFFF91 -:100D1000F081070F0F1F1F3D393141E0F0F0F8F867 -:100D2000FFFFFFFFFFFFFFFFFCE0C0000103070024 -:100D3000FDFDFEFEFEFCF0801C3C7EFFFFFEC000C1 -:100D4000FFFFFFFFFFFFFDF9FFFFFF78000000003E -:100D5000DFEEECE0A0E0E0E0E0E0C000000000003A -:100D60000000000000000000000000808000000083 -:100D70000000000000000000000000000000000073 -:100D800007030100000000000000000000004060B8 -:100D90000080C0C0E0200000000000000001030748 -:100DA0007F7F3F3F3F1F0F03010101030303073F05 -:100DB0000F8FEFF7F7F7FBFBFBFFFFFFFFFFFFFFD7 -:100DC00000000000000000000000000103070F1FEA -:100DD00000000000000000000F1F7FFFFEFEFCFC73 -:100DE0001F3F7FFFFFF9FFFFE0C000006070888CAD -:100DF000F8F0E0C0C08080000000000000000000AB -:100E0000FF00000000000000000103070E1C38FF77 -:100E1000FF0103070E1C3870E0C08000000000FFD7 -:100E2000FFFFFFFFFFFFFFFF0000000000000000CA -:100E3000FFFFFFFFFFFFFFFF0000000000000000BA -:100E4000FFC080000000000000000000000000FF64 -:100E5000FFFF7F1F0701000000000000000000FFEF -:100E6000FFFFFFFFFFFFFFFF00000000000000008A -:100E7000FFFFFFFFFFFFFFFF00000000000000007A -:100E8000FFFBFFFFFFFF7B1F0703070F1F3F7FFFD6 -:100E9000FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE72 -:100EA000FFFEFCF8F0E0C080000000000000000041 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:101000000018302000000707030000000000000067 -:10101000000103030100048FFE3C3C1C00000000A3 -:1010200000E0F0C0800000000000408000000000F0 -:1010300000000000000000000000000000000000B0 -:101040000018002000020707030000000000000055 -:10105000000103030100048EF87203010000000088 -:1010600000E0F0C0800000000000008000000000F0 -:101070000000000000000000000000000000000070 -:101080000030674000040E0F070000000000000061 -:10109000000387070300081EFC7C3E0000000000E0 -:1010A00000C0E08000000000000000000000000020 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000078FC7E3E1E3C387E3E92 -:1010E000010100003070707838100000000000002E -:1010F000F0F0E0401078B8787020000000000000A8 -:1011000000000000000000000000000000000000DF -:101110000000000000000078F808000000081E072A -:1011200000000000307A79783810000000000000DC -:10113000783838100000C0C08000000000000000B7 -:10114000000000000000000000000000000000009F -:101150000000000000000000000004030000000088 -:101160000000000000000000000870C00000000047 -:10117000000000000000000000000000000000006F -:10118000007080000010383C1F07030100000000C1 -:10119000000E1E1C1C302070E0C0C0C0000000000B -:1011A0000070800000000004070103151800000013 -:1011B000000E1E1C1C302070E0C0C0C000000000EB -:1011C000000000000000000101010100000000001B -:1011D00000000E3F7FFFFFD5BFC0BFDD0000070F3F -:1011E000000070FCFEFCF9F8FC1CF8F000009EBE4C -:1011F0000000000030F8FCDC0C1E0E1C000000009B -:1012000000000307070301030003070703010000B1 -:1012100000E7FFFFFFFF5FFF01FFDF8FDF8F3C7EF7 -:101220000000C0E0E0CCDEEEEEC7870E8E0C3C7E08 -:1012300000000000000000000000000000000000AE -:101240000000000101000102030001010100000093 -:101250000039FFFFFFFF57FF00FF778080C0070FB7 -:1012600000C0F0F8F0E3E7F371E0C00100019EBEBA -:10127000000000000000C0E0E0C0C0E0E0C00000EE -:101280000E1C1E0C1C38391D1E1E0C010100000016 -:101290000E000C060473FFFFFFFFFDFFC0FF7D780B -:1012A00000000000000000000000000F060007071B -:1012B000080E0F0F0E040E000E0C0000000080C080 -:1012C000010303070E1C191D1E0E0C010100000076 -:1012D000D080D81C0C73FFFFFFFFFDFFC0FF63072A -:1012E0000000000000000000000000000000787C0A -:1012F000080E0F0F0E040E000E0C08F06000000028 -:101300001C7FFFFF7F2B7F007F3B41F0E0700103DC -:10131000E0F8FCFCF2F6FB3BF7E7E3F76306E0E0FE -:101320001C7FFFFF7F2B7F007F3C5EFFE67000008D -:10133000E0F8FCFCF2F7FB3BF767030703061E3EF1 -:1013400000000000010100010100000C1E04006605 -:10135000000000FDFFFFBFFFF1E000183C0800CCDB -:1013600000000080C0C080C0C08000183C1800335E -:10137000000000000000000000000000000000006D -:10138000000000000000000000000100000C000050 -:10139000000000010301030707C2E3C701C01900F1 -:1013A000000000F8FD7FFFFF1F0F0E80000080008F -:1013B00000000000008080800000003078300033A2 -:1013C0000000000101000101000000060F04000CF4 -:1013D0000000FDFFFFBFFFF1E000000C1E0C00CC81 -:1013E000000080C0C080C0C080060F06000600C09C -:1013F000000000000000000000000000006000008D -:101400000000001F3F3F173F3C180060F34100CB36 -:10141000000000B0F8F8F0F8F8700082C7830033DD -:10142000001F3F3F1F171F3F3C0C0060F34100CBE4 -:1014300000B0F8F8F0F0F0F8F8380082C783003315 -:1014400000000000000000030F0787CF9F1F2F231D -:10145000121200060F0200E0F0FCFCFCFCFCE0FCB9 -:10146000000040C0400040400000000000000000BC -:10147000000000000000000000060F060024240009 -:1014800024240060F06000070F7F7F7F7F7F0F07BD -:101490000000000000000989E0F3F7E3C0C0E0802D -:1014A0000000000000000000003078300012120040 -:1014B000000001000000000000000000000000002B -:1014C00000072F7F7F7F3E3C0C00003078230066B2 -:1014D00000E0F0E0F0F87E3F2660F62000300000EB -:1014E00000041C3E3E7F7F0E303C7EFF000000006B -:1014F0000000000000000E3E7E7E7E7E003C7EFFEF -:10150000FFFBFFFFFFFFFBFFFFFBFFFFFFFFFBFFFB -:10151000FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:101580000A1F3F1F3723073F5FFFDB7830061FBE70 -:1015900080E8FCF8FECCCEDCE89C3E1603071A1C63 -:1015A000000000000000000000000080F870300023 -:1015B0000000000000000000000000003F73000079 -:1015C000000A1F3F1F1F3D797BFFF9BCF06008191F -:1015D00000A0F0FCF8FCF8FCF8F8BC2E030782CC65 -:1015E000000000000000808000000000DEF8703085 -:1015F000000000000000000000000000EE7F33004B -:101600006AFF7F3F7F3F7F3F1F0A0000008CDEFCA8 -:10161000A3F7FBF6EE6C1CBC7C7820000000008079 -:1016200000000000004040C0CE010F0E0703000084 -:101630000000000000000000E0C08000000000008A -:1016400003070F1F7F3F7F3BF9F0A00080000133AD -:101650000000A0F0F8F0F0F87C7C7C28000080C04E -:10166000004040C0C04000000E1C180C0E1E1800A8 -:10167000000000000000000070381830707818007A -:1016800002070F070D08010FDFFF76B1CEFFFBC089 -:10169000A0FAFFFEFFF3F3F7E6CE0E0703C7E6DE80 -:1016A00002070F070D0881CFF7FDD00EDFFB733166 -:1016B000A0FAFFFEFFF3F3F7FAE6CF0703C7CE9ECB -:1016C000003F7F30301F0F0000070F0700000101AF -:1016D00000F8FC7E7EFEFC78FCFEFFFE78C0E0C3D6 -:1016E00000000000000000000000000003000000F7 -:1016F00000000000000000000000000010000000DA -:1017000000000000000000000000000001030F3F87 -:10171000000000000101010307031C7EFFFFFFDF43 -:101720000000000000000000000000000000003F7A -:10173000000000000000000000000000000006FCA7 -:1017400000003F7F30301F0F00030703000001013E -:101750000000F8FC7E7EFEFCFCFEFFFE78E0C0E2AE -:101760000000000000000000000000000300000076 -:101770000000000000000000000000003000000039 -:10178000000000000000071F3F7F7F0F303C7EFFFE -:10179000000000000000C0C0808080000003070738 -:1017A0000000000000000000070707000303070F08 -:1017B00000000000C0E0E0E0E0E0E000C0C0E0F0D9 -:1017C000000000000000000F070300000003070FE7 -:1017D00000000000000000F0E0C0000000C0E0F0E9 -:1017E000000F0703000F1F0300031F0F0003070F65 -:1017F00000F0E0C0C000C0800080C000C0C0E0F0C9 -:101800000000001E1F1F1F4FC7C7030FDFFC7830EB -:10181000C0E07838F8F8F0C083E3F2F0ECFE7F0324 -:10182000070703111F1F1F4FE1C1030FDFFC7830B3 -:10183000E0F0FCFCFCFCF8F0F3E3F2F0ECFE7F03DC -:101840000063E76E0C070703010307CFDFDF2E0EEF -:101850000307030078F8F8F8F0E0E0C0C0C08000AB -:1018600000000000206060001F1F0E060000000046 -:1018700000000000000000008000000000000000E8 -:101880000063EF7F1E1F1F0F07070F1FBFDFFE78CC -:101890000687860030E0E0C080C0E0C08000000025 -:1018A000000000002060E0C01F1F0E0600000000C6 -:1018B00000000000000000008000000000000000A8 -:1018C000000000000000000303030301001038784B -:1018D00000000000181C0FC7FFFFFEB81C3C78F08A -:1018E00000000000000000005F8C0F1F00000000DF -:1018F0000000000000000000FCDC3870783C1C3860 -:101900000000001E1F1F1F0F07879C7C9E0E0F1FCD -:10191000C0E07838F8F8F0C080003878FC7E7F3B73 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000303000001000000A0 -:101940000101001C1F38010343E3270703010303C0 -:10195000C0F0F878FCFEFFFFCE87078EDEDF800048 -:1019600000000000000020704000000000000000A7 -:101970000000000000000000000000000000000067 -:10198000000000000407070303393E180C04040894 -:101990007020202071FFFF9E0C6C7E3C0C181008FC -:1019A000000000000000000000E0E0400000000037 -:1019B0000000000000000000000000000000000027 -:1019C000010204040E1F1F1321397F4F03614021C0 -:1019D000C020101038FCFCCC86B6FC600486820166 -:1019E00001000000111F1F0E0C657D380C04040857 -:1019F000C0808080C4FCFC7830B3FF74606020102D -:101A00000006030346ECEEEE66060200103818C22C -:101A10000060C0C06237777766604000081C1843DA -:101A2000000000000000041E3C1800001038308642 -:101A3000000000663C3C66C3E7E7666624000000E1 -:101A400000000000000020783C180000081C0C6119 -:101A50000000000000000000000000000000000086 -:101A60000006030347EFEFEF67060200103818C2C5 -:101A70000060C0C0E2F7F7F7E6604000081C1843BA -:101A80000006030346ECEEEE66060200103818C2AC -:101A90000060C0C062347070687C58430000000071 -:101AA0000086303810000030303810000000000090 -:101AB000000000000000663C3C66C3E7E766662461 -:101AC00000610C1C0800000C0C1C08000000000049 -:101AD0000000000000000000000000000000000006 -:101AE000C21838100000060303060C0E0E0606028C -:101AF00043181C08000060C0C06030707060604017 -:101B00000000000000060303462C0E0E163E1AC20B -:101B1000000000000060C0C062347070687C5843F0 -:101B200000C218380800060F07010000000000007E -:101B30000000000000060303860C0E0E06060200DD -:101B4000000000000060C0C0613070706060400044 -:101B50000043181C100060F0E0800000000000004E -:101B6000000000000703000020383086000000005D -:101B700000060303C6CC8E0E06060200000000001D -:101B80000060C0C0633371706060400000000000FE -:101B900000000000E0C00000041C0C610000000018 -:101BA0000F07030007070700000007070003070FE0 -:101BB000F0E0C000E0E0E0000000E0E000C0E0F0A5 -:101BC000000000000301010020787E7E003C7EFFC3 -:101BD000000002C6DEDEEEEEE602000000000000BD -:101BE0000000000000000C1E3E7F7F0E303C7EFF98 -:101BF0000000000000000307070F0F070003070F96 -:101C00000000000000000080C0E0E000C0C0E0F084 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C400000007FFF60603F170003070301000707E4 -:101C50000000F0F8FCFCFCF8F0FEFFFEF8F0F8FCE9 -:101C60000000000000000000000F00000000000065 -:101C7000000000000000000000F83000000000003C -:101C800000007FFF60603F1F0003070301000103A6 -:101C90000000F0F8FCFCFCF8F0F8FCFCF8F0FEFEAC -:101CA0000000000000000000001F0C000000000009 -:101CB000000000000000000000F000000000000034 -:101CC0000000000000000000000000000C00000008 -:101CD000000000000000000000000000C000000044 -:101CE00000000F1F3F3F3F7FFF7F3F1F0F1F3F7FC2 -:101CF0000000FEFF0606FCF8F0E0C0800080C0C0D7 -:101D000000000000000000000000000007000000CC -:101D10000000000000000000000000008000000043 -:101D20000000071F3F3F3F7FFF7F3F1F0F1F1F3FE9 -:101D30000000FEFF0606FCF8F0E0C0800080808016 -:101D4000000000000000000000000000040000008F -:101D50000000000000000000000000008000000003 -:101D600000000F1F3F3F3F7FFF7F3F1F0F1F1F0FD1 -:101D70000000FEFF0606FCF8F0E0C0800080800056 -:101D80000000000000000000000000000E00000045 -:101D900000000000000000000000000090000000B3 -:101DA00000000F1F3F3F3F7FFF7F3F1F0F1F3F3F41 -:101DB0000000FEFF0606FCF8F0E0C0800080C0E0F6 -:101DC0003F7F30301F0F00000307070000000000B6 -:101DD000F8FC7E7EFEFC78FCFEFFFD78F86030604B -:101DE0003F7F30301F0F0000030707000000000096 -:101DF000F8FC7E7EFEFC78FCFEFFFD78F87020701B -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000080000000000100000040000003046 -:101E50000000000000000000000010000000000072 -:101E6000000000000000000000020004000000006C -:101E700000028000001000000000000000000000D0 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F0000000000000000000000718A0A122242F95D -:101F10000000000000000000008C52525252528C0F -:101F200000000000000000000011325292FA12116D -:101F30000000000000000000008C52525252528CEF -:101F40000000000000000000007942720A0A4A31D5 -:101F50000000000000000000008C52525252528CCF -:101F6000000000000000000000314282F28A8A7105 -:101F70000000000000000000008C52525252528CAF -:101F8000000000000000000000718A8A728A8A71D5 -:101F90000000000000000000008C52525252528C8F -:101FA000000000000000000000314A4A4A4A4A315D -:101FB0000000000000000000008C52525252528C6F -:101FC0000000000000000000000000000000000011 -:101FD00000000000000000000002060202020207EA -:101FE00000000000000000000000000000000000F1 -:101FF0000000000000000000000E11010204081F94 -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-4k.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-4k.hex deleted file mode 100644 index 02cf2779..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-b-4k.hex +++ /dev/null @@ -1,513 +0,0 @@ -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000003AD -:10005000000000000000000000000000000000F0B0 -:10006000030F00000C07030101020303010000005D -:10007000F8C6FE76FEFCA010900020E0C0E0000074 -:10008000000000000000000000000103080F0B0F3B -:10009000000000000000000000C0FCFCFFC280C89F -:1000A00007030177620307070E0F06000000000038 -:1000B000FCF8C0E050FCFE0F070600000000000046 -:1000C0000000000000000000000001010607060615 -:1000D000000000000000000000C0FCDC1F80C043E6 -:1000E0000107EFCF010F0F1E383C18000000000081 -:1000F0008E1CA0C020F0F83C1C380000000000005E -:1001000000000000000000000000000007000F1CBD -:10011000000000000000000000000000CC3CD8F00F -:100120003F78270F07071B3E2F1300000000000039 -:10013000F070E0C0E0F0E040F0F838183818000047 -:10014000000000000000000000001F3FC7FEDCFEB2 -:10015000000000000000000000008080E00000605F -:100160007E3E7F792F1F1E1C38381C1800000000AF -:10017000C0067CF8D88000000000000000000000ED -:10018000000000000000000000000000001F1F7FB2 -:1001900000000000000000000000000000C0E08837 -:1001A0002100091F0FE7C7010F1F1C1E0F060000CB -:1001B000F8E8F8E0C080E773F8A000000000000055 -:1001C000000000000000000000000000000F0F3FD2 -:1001D00000000000000000000000000000E0F0C48B -:1001E0001000040F0703736E1F05000000000000DD -:1001F000FC74FCF8E0C0F080F7FB3878F060000099 -:100200000000000000000000000000000000001FCF -:10021000000000000000000000000000000000C01E -:100220001F7F2100091F0F0707E4CF1F3C180000A4 -:100230006088F8E8F8F0C080E097F3E0F07800001C -:1002400000000000000000000001000000000003AA -:100250000000000000000000C0C08000003E6D7F74 -:1002600003011C3E346070210307060303070600E8 -:100270003600804000000086CE8703068E8F030084 -:10028000000000000000000060E0603038180C0E34 -:100290000000000000000000030703007CDAFE6C91 -:1002A0000F070200006071FBCF073E381C0C0000F6 -:1002B000000000000000008080000000000000003E -:1002C000000000000000000000000000000000002E -:1002D00000000000000000000000000C1E0E060CD4 -:1002E0000060D0F960183038180C1E3E0000000085 -:1002F0000C1850800000001038383C1C3870781CF6 -:10030000000000000000060603060C0061C7870F0E -:100310000000000070D8FC6C000040F0FBDF8E0C89 -:1003200046603838180C0E070F0C00000000000063 -:1003300000000000000000000000000000000000BD -:100340000000000000000000386CFDD903183C706C -:10035000000000000000000000008080183C1F0327 -:10036000C0C46EEE5C180C0C07070E0C00000000F9 -:10037000367E3C1C1830787C000000000000000035 -:100380000000000000000000000000001F2D3F1BC7 -:100390000000000000000000000000000080B030FD -:1003A0000020686DC0E04C1EDEF8703000000000D8 -:1003B000204EDF9B070E0638783C1C38F0E070308A -:1003C0000000000000000000000000001F2D3F1B87 -:1003D0000000000000000000000000000080B030BD -:1003E0000020686DC0E0441E3F381C0E3E380000FF -:1003F000204EDF9B070E06183C3E0E1C383E0E00BA -:100400000000000000000000000000000000000EDE -:1004100000000000000000000000000000000000DC -:100420001B3F360000010301000B1F0D01000003FC -:10043000006060C0800080C0C0C0E0C080C0E0E05C -:10044000000000000000000000000000070F1F1F58 -:10045000000000000000000000000002E7F7FEFEC0 -:100460005CE8E7CFEF670007070330383C1E3C30FD -:100470003E14E0F0F0E000E0E4CC7C7E0000000000 -:100480000000000000000000000000007F010000EC -:10049000000000000000000000000000F0F8FCD4A4 -:1004A0003F000001030319FC79E10C0E1F3F00001F -:1004B0005C880038F0E0F307FFFEF80030387CFC81 -:1004C0001E2763662C000307030301030103011CBD -:1004D0003C7E003F1E00C0E0F0F0F0E0C0F0F0F81D -:1004E0003E361C000000000000000000000000007C -:1004F000FA76240000000000000000000000000068 -:100500001E3F007E3C0003070000000000000007C3 -:100510003C7263331A00C0F06000000040F0383CC9 -:100520000F0F0700000000000000000000000000A6 -:100530009C9C08000000000000000000000000007B -:100540000000000000000000000000000048DCBEC9 -:100550000000000000000000000000000070F8F83B -:100560003E1F1F070F1E3F3F1F0F00000000003FF0 -:10057000700080000000001EFFFF7E3C0000008035 -:10058000000000000000000000000000000000006B -:1005900000000000000000000000000000808080DB -:1005A00001000000111F1F3F7F7B71F1E3632140B9 -:1005B000C0808080C4FCFCFEFFCFC7C787060281D5 -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000008080808080801B -:1005E00001000000111F1F3F7F7B71F1E363214079 -:1005F000C0808080C4FCFCFEFFCFC7C78706028195 -:1006000000000000000000000300020000000000E5 -:10061000000000000000000000808080808080805A -:10062000010204040E1F1F1F1F1E1C3C381C04085F -:10063000C020101038FCFCFCFC78707818302010BA -:1006400000000000000000000300020000000000A5 -:10065000000000000000000000808080808080801A -:1006600001000000111F1F3F7F7B71F1E3632140F8 -:10067000C0808080C4FCFCFEFFCFC7C78706028114 -:10068000000000000000000000000000000000006A -:1006900000000000000000000000000000707E7EEE -:1006A0000000000101030303070707070000000023 -:1006B0007EFCFCFCF8F8F0F0E0E0E0E00000000078 -:1006C00000000000000000000060F00000337F7FA9 -:1006D000000000000000000000060F0000E3FFFF24 -:1006E0003F1F1F1F0F03010000000307030000004E -:1006F000FEFCFCFCF8E0E0E04000008000000000B0 -:1007000000000000000000000001030000000303DF -:1007100000000000000000000080C0800080C0C019 -:10072000071F3F3F3F3F3F7F7F1000307830000082 -:10073000C0F0F8F8F8F8FCFEDE0C00183C180000D9 -:100740000000000000000000000000000000001C8D -:100750000000000000000000000000381C3C0C0EEF -:10076000383F3F7F7FFFFF7F3F3F070000000000D3 -:1007700006F7FBFFFFFFFEFCFCFCFCF8400000005E -:100780000000000000000054383C387060EFDFFFCC -:100790000000000000000000002A1C3C1CFEFEFEC1 -:1007A000FFFF7F3F3F3F3F1F0200000000000000AF -:1007B000FFFFFFFEFCFCE000000000000000000066 -:1007C000000000000000000000030303070707010A -:1007D00000000000000000000080E0F0F8F8FCFCE1 -:1007E0000000000000000000000000000000000009 -:1007F000FCFE7E7E7E7E7E7E7E7E7E7E0000000013 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000010F0F0F0F070707030303030000006A -:1008300000C0C0C0C0E0E0E0F0F0F0F080000000D8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:10098000FF00000000000000FFFFFFFFFFFFFFFF70 -:10099000FF00000000000000FFFFFFFFFFFFFFFF60 -:1009A000FFFFFFFFFF7F3F1F8FC7E3F1F8FCFEFF54 -:1009B000FFFFFFFFFFFFFFFFFFFFFFFFFF7F3F1F67 -:1009C000FF0000000000000080C0E0F0F8FCFEFF27 -:1009D000FF00000000000000000000000000000018 -:1009E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 -:1009F00080C0E0F0F8FCFEFFFFFFFFFFFFFFFFFFFE -:100A0000FF000000000000000000000000000000E7 -:100A1000FF010101010101010101010101010101C8 -:100A2000000000000000000080C0E0F0F8FCFEFFC5 -:100A300001010101010101010101010101010101A6 -:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 -:100A50008FC7E3F1F8FCFEFFFFFFFFFFFFFFFFFF83 -:100A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 -:100A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 -:100A8000FFFFFFFFFF7F3F1F9F9F9F9F9F9F9F9F96 -:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 -:100AA0009F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F56 -:100AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 -:100AC0000000000000000000000000000000000F17 -:100AD00000000000000000000000000002011FFFF5 -:100AE000FFFFFFFFFFFF3F07030000030FFFFFFFB4 -:100AF000FFFEFCFCFEFEF8C08000E0F8FFFFFFFFF9 -:100B000000000000000000000001070F3EF8F18720 -:100B100000000000000000000080F8800F7FFFFF51 -:100B2000FF7F3F0F010000003F7FFFFFFFFFFFFF40 -:100B3000FFFFFFFFFF7F1CFCFEFFFFFFFFFFFFFF2C -:100B400000000000000000000001001FFFFFFFFF89 -:100B500000000000003E7FFFFFFF1FFFFFF8E0C026 -:100B6000FFFEFEFFFFFF0F0040F8FFFFFFFFFFFF4C -:100B700000000080FFFFFF000003F3FFFFFFFCF019 -:100B8000000000000000C080E0FCFFFF000000004B -:100B90000000000000000000000030FF0000000026 -:100BA000000000000001871FFFFFFFFFE080000042 -:100BB000000000073FFFFFFEFCF8FFFF00030000FE -:100BC000000000000000000F000000FF0000000314 -:100BD000000000000000C0F0000000C0FF7FFFFF29 -:100BE0000F18F0C0808000000000FFFFFFFE000033 -:100BF000FF3F3F3F1F0F0F1E3FFFF8F8F0000000C0 -:100C0000000000000000000000010000FFFFFFFFE7 -:100C1000000000000000000000FE3F1FFFFFFFFF7C -:100C2000FFFFFFFFFF00033FFFFF3F01061800002B -:100C3000FFFFFFFFFFFFFFFFFCF8C0C1030C000038 -:100C40000000000000000000000307FFFF0100009B -:100C500000000000000000000000FFFFFFFF7F0019 -:100C600000C0FCFCFEFFFFFC783F3FFFFFFFFFFFE3 -:100C700000000000000F3F7FFFFFFFFFFFFFFFFFAF -:100C800000000000060100000FFFFFFFFFFFFF0C48 -:100C90000000000000F00EFFFFFFFFF0C08000002A -:100CA0000000000FFFFFFFFFFFFFFFFFFFFFFFFF41 -:100CB0000003FFFFFFFFFEFCFCF0E0E0C08080804F -:100CC00000010F1E700000E0FFFF80000000000028 -:100CD00010C08000000000000000000000000001C3 -:100CE0001EFCF0E080000001070F1F1F3F7FFFFF89 -:100CF000010307071F3F7FFFFFFFFFFFFFFFFFFF0E -:100D000000000000000000000001070F3F7FFFFF10 -:100D10000001070F0F1F1F3F7FFFFFFFFFFFFFFFB8 -:100D2000FFFFFFFFFFFFFFFFFFFFFFFFFEFCF8FFDE -:100D3000FEFEFFFFFFFFFFFFE3C3810000013FFF57 -:100D4000FFFFFFFFFFFFFFFFFFFFFF780000000036 -:100D5000DFEEECE0E0E0E0E0E2EEC7030100013F9F -:100D6000001FFFFFFFFFFFFFFFFFFF7F7FFFFFFF72 -:100D7000FFE3C0F8FCFFFFFFFFFFFFFFFFFFFCF0FA -:100D80003F3F3F3F1F1F1F1F1F1F3F3F7F7FFFFF33 -:100D90000080C0C0E0E0F0F0FCFEFEFEFEFFFFFFC2 -:100DA000FFFFFF3F3F1F0FE3FDF9F9FBF383073F11 -:100DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 -:100DC00000000000000000000000000103070F1FEA -:100DD00000000000000000000F1F7FFFFEFEFCFC73 -:100DE0001F3F7FFFFFF9FFFFE0C00000A090B8BCED -:100DF000F8F0E0C0C08080000000000000000000AB -:100E0000FFFFFFFFFFFFFFFFFFFEFCF8F1E3C7005E -:100E1000FFFEFCF8F1E3C78F1F3F7FFFFFFFFF00DE -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E40009F3F7FFFFFFFFFFFFFFFFFFFFFFFFF0051 -:100E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A1 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E8000FFFFFFFFFFFFFFFFFFFCF8F0E0C0800067 -:100E90000101010101010101010101010101010142 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000C181810070703000000000000077C -:101010000000387C7C38048FFE3C3C1C000000F74C -:10102000000000000000000000004080000000F010 -:1010300000000000000000000000000000000000B0 -:1010400000000C181812070703003C7E7F3F1E00AB -:101050000000387C7C38048EF8723F7F7F3F1E0092 -:101060000000000000000000000000800000000000 -:101070000000000000000000000000000000000070 -:101080000000183030240E0F0700000000000000A0 -:10109000000070F8F870081EFC7C3E0E0331331E11 -:1010A00000000000000000000000001E87E3663C16 -:1010B0000000000000000000000000000000000030 -:1010C00000000000003C7EFEFC78000000000000F4 -:1010D00078FC007E3C000078FC7E3E1E3C387E3E64 -:1010E000397D7C3800000000000000000000000096 -:1010F000F0F4EC48000000000000000000000000D8 -:101100000000000000003C66C6E470000000000023 -:1011100078E4C66238000078F808000000081E076E -:101120000E1F1F0E00000000000000000000000065 -:1011300078383810000000000000000000000000B7 -:10114000000000000000000000000000000000009F -:10115000000000000000000000000403000000FE8A -:101160000000000000000000000066C3673E0000B1 -:10117000000000000000000000000000000000006F -:10118000000061C3C391383C1F0703010000007FCA -:101190000000C0E0E0C02070E0C0C0C00000007FE0 -:1011A000000061C3C391383C1F1F3F3D1800007F02 -:1011B0000000C0E0E0C02070E0C0C0C00000007FC0 -:1011C000000000000000000101010100000000001B -:1011D00000000E3F7FF7FFF5BFDFBFDF0F0F0000FE -:1011E000000070FCFE7FFFFFFFFFFFFFFF3C0000E1 -:1011F0000000000030F8FCDC8C1E8E9C000000001B -:1012000000000307070301030103000000000000C2 -:1012100000E7FFFF77FF5FFFFFFFF170380C3C7EB8 -:101220000000C0E0F8FCFEFEFEFFFFFE4E0C3C7E20 -:1012300000000000000000000000000000000000AE -:101240000000000101000103030101010100000091 -:101250000039FFFFDDFFD7FFFFFFFFDF9FCF00005B -:1012600000C0F0F8FEFFFFFFF9F8FCFDF83D0000BC -:10127000000000000000C0E0E0C0C0E0E0C00000EE -:101280000E1C1E0C1C38391F1F1F0F0F070F0F07D6 -:101290000E000C060777FFFFF7FFFDFFFFFFC58677 -:1012A000000000000000000000000010010300002A -:1012B000080E0F070E040E0C0E0C00E0C08000009C -:1012C000010303070E1C191F1F0F0F0F07070F0F36 -:1012D000F080F81C0E77FFFFF7FFFDFFFFFFFCF823 -:1012E00000000000000000000000007D78F0000019 -:1012F000080E0F070E040E0C0E0400000000000084 -:101300001C7FFFEE7F2B7F3F7F7A66F7E371000043 -:10131000E0F8FCFCFEFEFFFFFF3F1F0F83C600004E -:101320001C7FFFCE7F2B7F3F7F6361F0E07000006A -:10133000E0F8FC7CFEFFFFFFFFFFFFBF1F0E000079 -:1013400000000000010100010307070300183C181A -:10135000000000FDFF3F003FFFFF9F060030783098 -:1013600000000080C0C000C0E0F0706000041E0CEF -:10137000000000000000000000000000000000006D -:101380000000000000000000000000030703000050 -:1013900000000001030002073F3F1C00860F06000B -:1013A000000000F83D0F61FCFFFFFF63010000003B -:1013B00000000000008080800080C0C0800C1E0CF7 -:1013C00000000001010001010307070000030703FB -:1013D0000000FDFF3F003FFFFFDF9E00000387038B -:1013E000000080C0C000C0F0F87830010301800028 -:1013F000000000000000000000000080C08000002D -:101400000000001F3F2700277FFFF783003079305F -:10141000000000B0F8F800F8FCFC9E0C004CEECC8C -:10142000001F3F27000000277FFFF783003079303F -:1014300000B0F8F8000000F8FCFE9E0C004CEECC6A -:1014400000000000000000030FFF7F3F5FFFCF039D -:10145000000C1E08000C1EFEFCFCFCFCFCFCF8C092 -:10146000000000000040000000000000000000003C -:1014700000000000000000000F0000183C180000F1 -:1014800000183C180010787F3F7F7F7F7F7F3F7F71 -:101490000000000000000086EFF4F0FCFEFCE0809D -:1014A0000000000000000000F040000C1E0C0000D6 -:1014B000000000000000000000000000000000002C -:1014C00000072F7C614F3F3F1F3D3C0801183C182F -:1014D00000E0F000F6FFF8F0F89C08C0E0C0000063 -:1014E00000071F3F3F7F7F7E0E00000000000000CE -:1014F00000C0F0F8FCFCFEFE7E7E7E7E7E000000DA -:10150000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB -:1015100001010101010101010101010101010101BB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:101550000000000000000000000F080E0101090655 -:10156000000000000000000000000000000000007B -:101570000000000000000000000E11110E11110EFD -:101580000000001F2D3F1B0040EADB7830061FBE25 -:101590000000000080B03020409C3E1603071A1C5B -:1015A000000000000000000000000080F870300023 -:1015B0000000000000000000000000003F73000079 -:1015C000000000001078FAB60683D9BCF060081954 -:1015D00000000000000000000028BC2E030782CCA1 -:1015E000000000000000808000000000DEF8703085 -:1015F000000000000000000000000000EE7F33004B -:1016000060E0000000000000090A0000008CDEFC21 -:10161000030703163EBEFAF8787020000000008031 -:1016200000000000004040C0CE010F0E0703000084 -:101630000000000000000000E0C08000000000008A -:10164000030703010001030381C0A00080000133F0 -:1016500000008080C0D0BCBE1A000000000080C026 -:10166000004040C0C04000000E1C180C0E1E1800A8 -:10167000000000000000000070381830707818007A -:10168000000000070B0F0600D8FA76B7CFFFFFC2A5 -:10169000000000C060ECCC08048E0E0703C7E6DE35 -:1016A000000000070B0F86C0F0F8DC1EDFFB7B3567 -:1016B000000000C060ECCC0810A6CF0703C7CE9E88 -:1016C000003F0000001F0000000101080EFE7CF03A -:1016D00000F8FC7E6AAE44009CF8F0F903FFFF7C42 -:1016E0000000000000000000000000000C0E1F3F82 -:1016F0000000000000000000020200000C0E1F3F6E -:1017000000000000000000000000000001030F3F87 -:10171000000000000101010307071E7FFFFFFFDF3C -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:1017400000003F0000001F00000101040E7EFC703D -:101750000000F8FC7E6AAE449CF8F0F903FFFF7CC1 -:101760000000000000000000000000000000010375 -:10177000000000000000000002020000C0E0F0F0E5 -:10178000000000000000071F3F7F7F7F0E00000069 -:10179000000000000000F8FEFFFFFF1F0F0F07070B -:1017A000000000000000000007070707000000001D -:1017B0000080C0C0C0E0E0E0E0E0E0E00000000049 -:1017C00000000000000000000000070F07000000FC -:1017D00000000000000000000000E0F0E000000059 -:1017E00000000000070F1F1F1F1F1F0F0700000032 -:1017F0000000000000E0C0808080C0E00000000029 -:101800001F1F7F2100091F4FC7C7000F1F1C0800A3 -:10181000C0E088F8E8F8F0C083E392F0E0F07800E8 -:101820000F0F3C0F070F1F4FE1C1020F1F1C0800D5 -:10183000E0807CE47CFCF8F0F3E392F0E0F07800E8 -:101840000063E7610F0707030103070A1F5F2E0EFE -:1018500003FFFBFE840090F8F0E0E040C0C0800091 -:10186000000000000000000007030000000000006E -:1018700000000000000000008000000000000000E8 -:101880000063E7581F1B1F0F07070F143F5FFE7809 -:1018900006F7F6F0C080C0C080C0E0C08000000045 -:1018A000000000000000000007030000000000002E -:1018B00000000000000000008000000000000000A8 -:1018C0000000000003030F040001030100000838BA -:1018D00000000000F8FCF13F1D3FFEB81C3C28F062 -:1018E00000000000000000000F0C000000000000DD -:1018F0000000000000000000FCDC387078300000C0 -:101900001F1F7F2100091F0F0787841C0E0E000078 -:10191000C0E088F8E8F8F0C080001878F0707838F7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000303000000000000A1 -:101940000F0F3F030130010343E3270703000000AB -:10195000C0E018F8C87EFFFFCE87078E00000000A9 -:1019600000000000000020704000000000000000A7 -:101970000000000000000000000000000000000067 -:10198000000000000407070F1F3E387071316081AE -:101990007020202071FFFFFFFFF370F1C1808102F2 -:1019A0000000000000000080C0E0E0C0C0C0800077 -:1019B0000000000000000000000000000000000027 -:1019C000010204040E1F1F1F1F1E1C3C381C0408AC -:1019D000C020101038FCFCFCFC7870781830201007 -:1019E00001000000111F1F3F7F7B71F1E363214065 -:1019F000C0808080C4FCFCFEFFCFC7C78706028181 -:101A00001C7EFFFF3F1F1F0F0706020000000000A3 -:101A1000387EFFFFFCF8F8F0E060400000000000B6 -:101A2000000001070F0F030101000000000000008B -:101A30000000C3E7FFFFFFFFFFFF7E6624000000FA -:101A4000000080E0F0F0C080800000000000000096 -:101A50000000000000000000000000000000000086 -:101A60001C7EFFFF3E1C1E0E060703010301000043 -:101A7000387EFFFF7C38787060E0C080C080000056 -:101A80001C7EFFFF3F1F1F0F070602000000000023 -:101A9000387EFFFFFCF8F8F0E06040000000000036 -:101AA000000000000001070F0F030101000000000B -:101AB0000000000000C3E7FFFFFFFFFFFF7E66247A -:101AC000000000000080E0F0F0C080800000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000001C7EFFFF3F1F1F0F070602C3 -:101AF0000000000000387EFFFFFCF8F8F0E06040D6 -:101B0000000000001C7EFFFF3F1F1F0F07060200A2 -:101B100000000000387EFFFFFCF8F8F0E0604000B5 -:101B200000000000000000000000000000000000B5 -:101B3000000000001C7EFFFF3F1F1F0F0706020072 -:101B400000000000387EFFFFFCF8F8F0E060400085 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70001C7EFFFF3F1F1F0F070602000000000032 -:101B8000387EFFFFFCF8F8F0E06040000000000045 -:101B90000000000000000000000000000000000045 -:101BA00000000007070707070707070707000000EF -:101BB000000000E0E0E0E0E0E0E0E0E0E000000065 -:101BC00000000000030F1F3F3F7F7E7E7E0000006D -:101BD000000000E0E0E0F0F0F00000000000000095 -:101BE0000000000000030F1F3F7F7F7E0E000000FB -:101BF0000000000000FCFFFFFFFF0F0707000000D0 -:101C00000000000000000080C0E0E0E000000000F4 -:101C100000000000000000000000000000000000C4 -:101C2000000000000000000000314A4A4A4A4A31E0 -:101C30000000000000000000008C52525252528CF2 -:101C400000007F0100003F283838383C19000109A6 -:101C50000000F0F8FCD45C8800F87CFDFF0FFFF872 -:101C6000000000000000000000333E7E0000000085 -:101C7000000000000002020000C00C1C3C783C0C7C -:101C800000007F0100003F00000000040FFE7DF017 -:101C90000000F0F8FCD45C8800C87CFCF800F8F97F -:101CA0000000000000000000000130383C1E3C3005 -:101CB000000000000000000000CC7C7E000000005E -:101CC00000808000000000000000000030387CFC34 -:101CD0000000000000000000000000003070F8FC70 -:101CE000A0E0EFFFFFEBFA910C1F3F1F001F0F0753 -:101CF0005070FE800000FC0080C0C080008080002A -:101D0000008080000000000000000000181D1F3F40 -:101D100000000000000000000000000040C0E0F0F3 -:101D2000A0E0F7FFFFEBFA910C1F3F1F001F070316 -:101D30005070FE800000FC0080C0C08000808000E9 -:101D40000080800000000000000000000307070F73 -:101D5000000000000000000000000000008080C0C3 -:101D6000A0E0EFFFFFEBFA910C1F3F1F001F1900CF -:101D70005070FE800000FC0080C0C08000808000A9 -:101D8000008080000000000000000000101C1F3FC9 -:101D900000000000000000000000000060E0E0F033 -:101DA000A0E0EFFFFFEBFA910C1F3F1F001F1F0E7B -:101DB0005070FE800000FC0080C0C08000800000E9 -:101DC0003F00050A1F000000010100EFEFFFFF7F49 -:101DD000F8FC7EEAAE44009CF8F0FA07FFDECE9CE9 -:101DE0003F000A051F000000010100EFEFFFFF7F29 -:101DF000F8FCFE6AAE44009CF8F0FA07FFCEDE8CD9 -:101E000000000000000000000000000000000000D2 -:101E10000000000000000000001F02040201110E7B -:101E200000000000000000000000000000000000B2 -:101E3000000000000000000000020602020202078B -:101E4000000000000000000000200004100060FD01 -:101E50000000000000040000004000000440E7FF14 -:101E60000000000400400000001000042002E71FF2 -:101E700000008000000008000000200400006699B7 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2d.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2d.hex deleted file mode 100644 index 4814deca..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2d.hex +++ /dev/null @@ -1,513 +0,0 @@ -:100000000000000000000000FF7F3F1F0F070301FA -:100010000080C0E0F0F8FCFEFFFFFFFFFFFFFFFFE6 -:10002000FFFFFFFFFFFFFFFF0000000000000000D8 -:1000300000000000000000000000000000000000C0 -:10004000010101FF101010FF010101FF101010FF4E -:10005000010101FF101010FF010101FF101010FF3E -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:10008000C0FFFFC0C0FFFFC0FFFFFFDFCFFFFFC10A -:10009000C0FFFFE0F0FFFFFEFFFFFFFFFFFFFFFFDE -:1000A00003FFFF0303FFFF03FFFFFFFFFFFFFFFF50 -:1000B0000000000000000000000000000000000040 -:1000C00000FFFF0000000000FFFFFF1F0F070301FC -:1000D00000FFFFE0F0F8FCFEFFFFFFFFFFFFFFFF68 -:1000E000000000000001003F00000000008000FC54 -:1000F000103F243F3F223F1F08FC24FCFC44FCF837 -:10010000000000000000000010101010000010009F -:10011000282828000000000028287C287C282800A7 -:10012000103C50381478100060640810204C0C000B -:1001300030485020544834003010200000000000A7 -:1001400008102020201008002010080808102000A7 -:1001500000105438541000000010107C10100000E3 -:1001600000000000301020000000007C00000000B3 -:1001700000000000003030000004081020400000A3 -:10018000384CC6C6C6643800307030303030FC00A1 -:100190007CC60E3C78E0FE007E0C183C06C67C0057 -:1001A0001C3C6CCCFE0C0C00F8C0F80C0CCC78009D -:1001B0003C60C0FCC6C67C00FEC60C183030300067 -:1001C00078C4E4789E867C007CC6C67E060C7800E7 -:1001D000003030003030000000303000301020009F -:1001E000FCF8F0F0F0F0F8FC00007E007E0000006B -:1001F0003F1F0F0F0F0F1F3F38440408100010005F -:100200003C4299A1A199423C386CC6C6FEC6C600C4 -:10021000FCC6C6FCC6C6FC003C66C0C0C0663C004E -:10022000F8CCC6C6C6CCF800FCC0C0F8C0C0FE0002 -:10023000FEC0C0FCC0C0C0003E60C0CEC6663E006E -:10024000C6C6C6FEC6C6C600FC3030303030FC0024 -:100250000606060606C67800C6CCD8F0F8DCCE0046 -:10026000C0C0C0C0C0C0FE00C6EEFEFED6C6C600FE -:10027000C6E6F6FEDECEC6007CC6C6C6C6C67C0096 -:10028000FCC6C6C6FCC0C0007CC6C6C6DECC7A00B2 -:10029000FCC6C6CEF8DCCE0078CCC07C06C67C009E -:1002A000FC30303030303000C6C6C6C6C6C67C0012 -:1002B000C6C6C6EE7C381000C6C6D6FEFEEEC60028 -:1002C000C6EE7C387CEEC600CCCCCC78303030002A -:1002D000FCFC183060FCFC00000000000030300026 -:1002E000C080D895D50305073808080808083800E5 -:1002F0003F3F000029133F1E80C0F070D0F0E000A7 -:100300000000000101010303FF7F3F1F0F070303EC -:100310000080C0E1F1F9FFE3FFFFFFFFFFFFFFE314 -:100320000000000000000080FF7F3F1F0F070381D7 -:100330000080C0E070783C82FFFFFFFF7F7F3F833B -:100340000700000F1F1F3F7FC700001F1F1F3F7FB9 -:10035000078000EFFFFFFFFFC78000FFFFFFFFFFE9 -:10036000800000C0C0E0E0F0810100CFC7E3E3F10E -:10037000800000C0C0E0E0F0810100CFC7E3E3F1FE -:100380000000000103070107FF7F3F1F0F07010760 -:100390000080C0E1F3FFF9FFFFFFFFFFFFFFF9FF60 -:1003A000000000E0F0F888F8000000E0F0F888F8BD -:1003B000000000E0F0F888F8FFFFFFFFFFFF8FFF6D -:1003C0000E0E0D0D1F1F1F1F0E0E0D0D1F1F1F1FC9 -:1003D0000E0E0D0D1F1F1F1FFEFEFDFDFFFFFFFF79 -:1003E000F8F8F8FCFCFCFCFCF8F8F8FCFCFCFCFC65 -:1003F000F8F8F8FCFCFCFCFCF8F8F8FCFCFCFCFC55 -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000030F010003071F7FFFFFB3 -:100490000000030F3FFFFFFFFFFFFFFFFFFFFFFF16 -:1004A000000000000001071F3F7FFFFFFFFFFFFF6D -:1004B000FFFFFFFFFFFFFFFF00000000FFFFFFFF48 -:1004C000FFFFFFFFFFFFFFFF00000007FFFEFCF83C -:1004D000F8F8F8F8F1F0E3E79FFFFFFFFFFFFFFFF9 -:1004E000000000000001070F1E188107070F0F1FF3 -:1004F0003F3F3FFFFFFFFFFF0000000F3FFFFFFFF9 -:1005000000030F3FFFFFFFFF000000000001071F77 -:100510003F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:10052000FFFFFFFFFFFFFFFF0000000000FFFFFFD6 -:1005300000000000000000000000001FFFFFFFFFA0 -:100540000000030F3FFFFFFF000000000001071F36 -:100550003F7FFFFFFFFFFFFF0000030F1FFEFEFEB8 -:10056000F0F8FCF8F8F0F181079801071F1F3F7FB2 -:100570001F0F3FFFFFFFFFFF000000000000030F01 -:100580007FFFFFFFFFFFFFFF0000030F3FFFFFFFA5 -:1005900000017FFFFFFFFFFF7FFFFFFFFFFFFFFF68 -:1005A000FFFFFFFFFFFFFFFF00000000000000FF54 -:1005B000F8FFFFFFFFFFFFFF60F0FCFEFFFFFFFF04 -:1005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B -:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:1005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:1005F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:10060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:10061000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:10062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:10063000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:10064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:10065000F7F7EFEFCFDF9F9FFFFFFEFCFCF8F0E026 -:100660003F3F3F3F1F1F1F1FFFFFFFFEFCFCFCFC27 -:10067000C0800000000101017FFFFFFFFFFFFFFFBF -:10068000F8F2E6DFFFFFFFFF030307070F1F3F7FBF -:10069000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:1006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:1006B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:1006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A -:1006D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A -:1006E000FFFFFFFFFFFFFFFFFEFCFCFCFEFFFFFF25 -:1006F0003F9FCFE0E3C70107070F0F0F0783C1F844 -:10070000FFF38F3F7F7F3F1FFFFFFFFFFFFEFCF8E0 -:10071000FFFFFFFFFFFFFFFFFFFFFFFFFF7F3F1F09 -:10072000070F1F1F3F1F0F0F070F8F9FCFFFF3F9FB -:10073000FCFCFEFEFFFFFFFFFFFFFFFFFFFFFFFFD1 -:10074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 -:10075000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 -:10076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 -:10077000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 -:10078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 -:100790000000000000000000FFFFFFFFFFFFFFFF61 -:1007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 -:1007B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:1007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 -:1007D000FFFFFFFFFF600000FFFFFFFFFFFF7F073E -:1007E000FFFFFFFFFFFEFEFCFFFBF7CF1F3F7F7FFA -:1007F000F0F0F0F0F0F0F0FC7FFFFFFFFF60000092 -:100800000000000000000000FFFFFFFFFFFFFFFFF0 -:1008100000000000000000000000000000000000D8 -:10082000009CFCFEFEFFFFFF00000000000080F8BF -:10083000FF7F1F0F03010000FFFFFFFFFFFFFF7F90 -:10084000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:10085000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:1008600000FCFFFFFFFFFFFF1F0FC7E7F3FBFBFCD1 -:10087000FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF48 -:10088000FFFFFFFFFFFF7F07FFFFFFFFFFFFFFFFF0 -:10089000FFFFFFFFFFFFFFFF009CFCFEFEFFFFFFCF -:1008A00000000000000080F8FF7F1F0F0301000020 -:1008B000FFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFC8 -:1008C000FFFFFFFFFFFFFFFF071FFFFFFFFFFFFF10 -:1008D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:1008E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:1008F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:1009000000000000000000000C0E1E1C086070308B -:100910001F0FC7E7F3FBFBFFFFFFFFFFFFFFFFFF1B -:10092000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 -:10093000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 -:10094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 -:10095000FFFFFFFFFFFFFFFFFFFFFFFFFFFEFCF8B2 -:1009600000000030381838108F1F1F1F1F1F0F8FF7 -:100970000000000000303818FFFFFFFFFFFFFFFFFF -:10098000FFFFFFFFFFFBFBF7F7EFEFEFE7F3F9F8F0 -:100990007CFE6F3F7EFCFE7FFFFFFFFFFFFFFFFF40 -:1009A0001C3E7EFEFE7F0E06FFFFFFFFFFFFFFFFE8 -:1009B000FFFFFFFFFFFFFFFF00000000000000003F -:1009C000000000000000009F00000000010FFFFF7A -:1009D0000001073FFFFFFFFFF8FFFFFFFFFFFFFFE3 -:1009E0000000E0FFFFFFFFFF0000001FFFFFFFFF11 -:1009F000000000FFFFFFFFFF0000FFFFFFFFFFFF02 -:100A00000000000000000000387CF6E7FFFFE7630D -:100A1000FCFEE7FFFEE7FF7E3C7EF3E0E0663F1E64 -:100A2000F8FCE6E7E7EFFE7CFCFEE0F8FCE0FE7F8A -:100A3000FEFFE0FCFEE0E0603E7FF0EEE7673F1F78 -:100A4000C6E7E7FFFFE7E763FC7E38383838FC7E0F -:100A50000607070707C77F3EC6EFFEFCF8ECE66314 -:100A6000C0E0E0E0E0E0FE7FC6EFFFFFFFEFE763FE -:100A7000C6E7F7FFFFEFE7637CFEE7E7E7E77F3EC8 -:100A8000FCFEE7E7FFFEE0607CFEE7E7FFEF7E3D70 -:100A9000FCFEE7EFFFFCEE6778FCE67C3EC77F3E9E -:100AA000FC7E383838383818C6E7E7E7E7E77F3E96 -:100AB000C6E7E7EF7F3E1C08C6E7F7FFFFFFF763D7 -:100AC000C6EF7F3E7CFEF663CCEEEE7E3C383818F7 -:100AD000FE7F1F3E7CF8FE7F00000000000000004B -:100AE000FFFFFFFFFFFFFFFF00000000000000000E -:100AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 -:100B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 -:100B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:100B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 -:100B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 -:100B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 -:100B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:100B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:100B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 -:100B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 -:100B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 -:100BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 -:100BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 -:100BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 -:100BD000FFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFF29 -:100BE000FFFFFFFFFFFFFFFFF8FCFEFFFFFFFFFF20 -:100BF000FF630301F1FCFFFFFFFFFFFFFFFFFFFFAC -:100C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 -:100C1000FFFFFFFFFFFFFFFFF7F7E7E7C3C3E3E1D6 -:100C2000E1F1F9FDFDFFFFFFFFFFFFFFFFFC783063 -:100C3000FFFFFFFFFF3F1F1FFFFFFFFFFFFFFFFE45 -:100C4000FCFBF7EFDFBF7FFFFFEFE7FFFFFFFFFFDB -:100C5000F0F0F8FCFEFEFFFF30000000010103038E -:100C60003F3F7FFFFFFFFFFFFFFFFFFFFFFFFFFF94 -:100C7000FFFFFFFFFFFFFFFFFDFBFBFBFBFBFBF7A6 -:100C80000303030303030303FFBF9FFFFFFFFFFFF4 -:100C9000FFBF9FFFFFFFFFFFF7F7EFDFDFBFBFBF24 -:100CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 -:100CB000FFFF00000000FFFF03030000000003032C -:100CC000FFFF0F0F0F0FFFFFFEFCFDFEFEFEFEFEFF -:100CD000FFDF9FFFFFFFFFFF7F7F7F7F7F7F7F7FA4 -:100CE000FFFFFFFFFFFFFFFF7F6F677F7F7F00003A -:100CF000FFEFE7FFFFFF0000FFEFE7FFFCF0000062 -:100D00000303030300000000FFBF9FFFFF3F00003D -:100D1000FFBF9FFFFFFF0000FFDF9FFFFFFFFFFF01 -:100D20007F3F9FFFFFFFFEFCFFFFF9E0C080000058 -:100D3000FFFFFF0000000000FCE08000000000005A -:100D400000000000000000007F7F000000007F7FA7 -:100D5000FF7F7F1F01030100FFFFFFFFFFFFFF7FFA -:100D60001F03010001030100FFFFFFFFFFFFFFFF63 -:100D70001F033108051301040000000000000000FB -:100D8000FFFFFFFFFFFFF8E0FFFFFFFFFFFF030391 -:100D9000C08000000080E0FC0100000000000000B6 -:100DA000FF7F3F1F07010100C0C0FFFFFFFFFFFFE4 -:100DB0001FFFFFFFFFFFFFFF00000000000000001B -:100DC0000F030100000F3FFFFFFFFF1F07C3E3F109 -:100DD00003070F0F0F0360F8F3C387FFFEF800004F -:100DE000F0E0C0000001077FFFFF7F61FEFFFFFF13 -:100DF000FFFFFFFF3F87FBFDFFFFFFFFFFFFFFFF41 -:100E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 -:100E1000FFFFFFFFFFFFFFFFFEFFBFDFEFF3FCFF62 -:100E2000FF7FBFDFEFF7FB01FAFEFFFFFFFFFFFFD2 -:100E3000FF7FFFFFFFFFFFFFFFFFFFFFFFFFFC0143 -:100E4000FFFFFFFFFCC000E000000000000000000A -:100E5000010101FF0F0F1F07020000FF171311FF11 -:100E6000030000C0E0F8FDFD000000000080C0C0ED -:100E700080C0E0F07038383800003F3F3E3C383FDB -:100E80000000FFFFFFFFFFFF0000FFFFFEFCF8FF79 -:100E90000719E1FF080808FF0101013F0808083FA2 -:100EA000010101FF080808FF000000000000000029 -:100EB000FFFFFFCFE3F8F8F80000C0F3FF7F00FF6B -:100EC0003F3FFFFEF8823EFEFFFFFF7F7F7F7F7F79 -:100ED000F8F8F8F8F8F8FCFFFFFFFFFFFFFFFF004E -:100EE000FFFFFFFFFFFCF0000F0300000000000009 -:100EF000FFFFFF1F0701030F0000000000000000BC -:100F00000000E0FFFFFFFFFF000000FFFFFFFFFF0B -:100F100003010000C0F8FEFFFFFF7F1F07010080F4 -:100F2000FFFFFFFFFFFF7F1FC0F0FCFFFFFFFFFF82 -:100F300007010000C0F0FCFF070307393EFFFFFF79 -:100F4000FFFFFFFF1FE0FFFFFFFFFFFFFFFFFFFFB0 -:100F5000FFFFFFFFFFFFFFFF000000000000000099 -:100F60000000FFFFFFFFFFFF0000FCFCFCFCFCFC9F -:100F7000FCFCFCFCFCFCFCFC0080E0F0FCFFFFFF48 -:100F8000FF000000000080C0FF0000000000000023 -:100F9000FC00000000000000000000000000000055 -:100FA000F0F8FEFFFFFFFFFF00000080C0E0F8FC4C -:100FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 -:100FC000FFFFFFFFFFFFFFFF0F010000000080C0D9 -:100FD0003F3F3F3F3F3F3F3F000103070F1F3F7F22 -:100FE000000000000000C0E0FFFFFFFFFFFFFFFF69 -:100FF00000000000000000000000000000000000F1 -:10100000FF80808080808080FF010101010101015B -:1010100080808080808080FF01010101010101FF4B -:1010200000000000000000000000000000000103BC -:1010300000000F1F7FFFFFFF0000F8FFFFFFFFFF13 -:1010400000000000C0F8FFFF00000000000000C02A -:101050000000000000000000000000000000000090 -:1010600000000000000000000000000000073F003A -:101070000F0F3F7FFFFFC300FFFFFFFFFFFFFFFFDB -:10108000FFFFFFFFFFFFFFFFF0FCFFFFFFFFFFFF82 -:10109000000000C0F0FEFFFF000000000000FDFFA8 -:1010A00000000E3F3FFFFFFF00000080F8FFFFFF42 -:1010B0000000000000FFFFFF000000000000F0FF44 -:1010C000000000000000030F000100000000FFFF0F -:1010D00000FF00003F0300FFFFFFFF07FFFF1FC3EC -:1010E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:1010F000000000000003073F0000001FFFFFFFFF8C -:1011000000000000F8FFFFFF0000000000E0FFFF0C -:1011100000000000000000FC000000010F1FFFFFA6 -:10112000011F7FFFFFFFFFFFFFFFFFFFFFFFFFFF2D -:10113000FFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFCE -:101140000000FFFFFFFFFFFE00000000000001079E -:101150000103070F1F3FFFFF000000000301000015 -:101160000000000080FE7F3F000000000000C08003 -:1011700000000000000000000F1F3F7F7FFF6F1F77 -:10118000FFFFFFFFFFFFFFFF04070000000000005C -:1011900080808080000000000000F8F0E0C0C00304 -:1011A000000000000038FFFF3F07000000008FFF35 -:1011B000FFFF1F0003FFFFFFFFFFFF3FFFFFFFFFDA -:1011C0000000000000000000F8FEFFFFFFFFFFFF2F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000070000E8 -:101200000000000003C07C0F0000000000FC000094 -:1012100000000000000000000000000000000000CE -:101220000000000000000000000000000000013F7E -:1012300000000000073FFFFF00031FFFFFFFFFFF4D -:101240000000000000071F3F000000000000000039 -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:1012900000000000000000000000000000083860AE -:1012A0002367031F38000000F8F8F000000000007A -:1012B00000000107070E00193F7FF0C31F7FFEFCEF -:1012C000F870F0E0C08000000000000000000000A6 -:1012D0000100000000000000C0000008081010001D -:1012E00000000000000000000000000103000000FA -:1012F00000000000000000000001010301010303E1 -:1013000000808080C0C0C08000000000000000009D -:1013100000000000000000000000000001070E3C7B -:10132000070F4F9FBF0F02028000800000000000E7 -:101330000000000000000000000000030F0000009B -:101340000023C08000000000E80000000000000052 -:101350000000000000000000FF7F0F0300000000FD -:10136000FFFFFFFFFF1F0707FFFFFFFFFFFFFFFF5D -:10137000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D -:10138000FFFFFFFFFFFFFFFFFFFFFFFEF0E0C000DA -:10139000F8E08000000000000000000000000000F5 -:1013A000000000000000000000000000000000003D -:1013B0000000000000000000030100000000000029 -:1013C000FFFFFF0000000000FFFFFFFE0000000025 -:1013D000FCE080000100000000084CE6EF74320CD5 -:1013E000000000C00000000000000000000000003D -:1013F00000000000000000000400000000000000E9 -:10140000000000000100000000204080C4EE6633B0 -:10141000000000000000C0E000000000000000002C -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:101450000000000000000000C020000000000000AC -:10146000000000000000000000000000000000007C -:10147000000000000000000100000000001060C03B -:101480000000000000000000000000003000030029 -:10149000000000000000000000000000000830E034 -:1014A0000000000001010207000109880C1C07016F -:1014B000000080E0701F06C3000000000000004034 -:1014C0000000000000007F80000000030001F00029 -:1014D000000000807080000000000000E0000000BC -:1014E00000000000000000000000000000000000FC -:1014F000000600000000000003071E0000000000BE -:101500008000000038E00000000000000000000043 -:101510000000000000000000070F1F3F3F0F0703FF -:10152000C060483C391F0100300C01070E07C100A4 -:10153000F0380018300880000000077E0F00010717 -:101540000E70800000F0FFFF00000000000000F0BF -:10155000000000000000031F00000000013FFFFF2B -:10156000071F3FFFFFFFFFFF00000000000000001B -:1015700080F8FFFFFFFFFFFF000000E0F8FEF8E04B -:101580000003070300000000FFFFFFFFFF1F07012C -:10159000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B -:1015A000FFFFFFF0E0FFFFFFFFFE000000E0F0F8AC -:1015B000F800000000000000FF7F1F0F0700000080 -:1015C000FFFFFFFFFFFF3F0FFCFFFFFFFFFFFFFFDE -:1015D0000000E0F8FFFFFFFF0000000000C0F0FF88 -:1015E0000000007F3F0F070300000000F0FFFFFF37 -:1015F00000000000030FFFFF00000000FFFFFFFFDF -:101600000000000000FFFFFF0000000000C0FCFF22 -:1016100000000000000000000000000000000000CA -:101620000000000000000000FF7F3F1F07010000D6 -:10163000FFFFFFFFFFFFFF3FC0F0FCFCFFFFFFFFCE -:101640000000000000C0E0FC1F0F0F0701000000B9 -:10165000FFFFFFFFFFFF7F00FFFFFFFFFFFFFCF02B -:10166000FFFFFFFFF8800000FEF8E0000000000030 -:101670000000000000000000000000000000030166 -:10168000FFFF0F1E700000E090C08000000000000F -:10169000FFFF8000000000000000000000000001CB -:1016A0001EFCF0E080000001010307071F3F7FFFE1 -:1016B000070F1F1F3F7FFFFFFFFFFFFFFFFFFFFF22 -:1016C0003F7F000000F00EFF00000000000000005F -:1016D00000000000000000000001070F0F1F1F3F67 -:1016E0000001070F3F7FFFFF7FFFFFFFFFFFFFFFAF -:1016F000FFFFFFFFFFFFFFFFFEFEFFFFFFFFFFFFFC -:10170000FFFFFFFFFEFCF8FFE3C3810000013FFF86 -:101710000000000001030F3F07071E3FFFFFFFDF30 -:10172000FFFFFFFFFFFFFFFFDFEEECE0E0E0E0E0A8 -:10173000FFFFFF7800000000E2EEC7030100013F59 -:10174000001FFFFFFFFFFFFFFFE3C0F8FCFFFFFFED -:10175000FFFFFF7F7FFFFFFFFFFFFFFFFFFFFCF0AB -:1017600000000000010101030000000103070F1F3A -:101770000F1FFFFFFEFEFCFC1F3F7FFFFFF9FFFF77 -:10178000F8F0E0C0C0808000E0C00000A090B8BCCD -:1017900000000000000000003F3F3F3F1F1F1F1FD1 -:1017A0000080C0C0E0E0F0F01F1F3F3F7F7FFFFFE1 -:1017B000FCFEFEFEFEFFFFFFFFFFFF3F3F1F0FE3AC -:1017C000FFFFFFFFFFFFFFFFFDF9F9FBF383073F7B -:1017D000FFFFFFFFFFFFFFFF000000000000000011 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:10180000FF80808080808081FF01010101010181D2 -:1018100081808080808080FF81010101010101FFC2 -:101820000000387FFFFFFFFF000006F8C0B8BFBF11 -:10183000000000000003FFC007071F3FFFFFF80084 -:10184000FF87FFFFFFFF0F3FFFFFFEFFFFFFFFDFF1 -:101850000000000000000000000000000000000088 -:101860001F1F3F3F3F7F7FFFFFFFFFFFFFFFFFFF88 -:10187000FFFFFFFFFFFFFFFFFFBFFFFFFFF9FFFFBE -:1018800000000000000000000001010303070F0F2B -:10189000FFFFFFFFFFFFFFFFFFFFFFFFFEF8FCFF63 -:1018A000E0C0800103070F1F0F1FFFFFFEFEFCFCBF -:1018B0000003070F0F1E3C78FFFFFF9F1F3F7FFFB6 -:1018C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:1018D000E0E0C0C0E0E0F0F00000000103071F3FBF -:1018E0001F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:1018F000E0E0E0C080E0F0F0000000000101030340 -:101900007FFFFFFFFFFFFFFFFFFFFFFFFBF9F0F08F -:1019100001070F1F3F3F3B7FFFFFFFFFFFFFFFFF61 -:1019200001070F1F3F3F3F7F000000000103070F2B -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000F88 -:1019500000000000000000000000000002011FFF66 -:10196000FFFFFFFFFFFF3F07030000030FFFFFFF25 -:10197000FFFEFCFCFEFEF8C08000E0F8FFFFFFFF6A -:1019800000000000000000000001070F3EF8F18792 -:1019900000000000000000000080F8800F7FFFFFC3 -:1019A000FF7F3F0F010000003F7FFFFFFFFFFFFFB2 -:1019B000FFFFFFFFFF7F1CFCFEFFFFFFFFFFFFFF9E -:1019C00000000000000000000001001FFFFFFFFFFB -:1019D00000000000003E7FFFFFFF1FFFFFF8E0C098 -:1019E000FFFEFEFFFFFF0F0040F8FFFFFFFFFFFFBE -:1019F00000000080FFFFFF000003F3FFFFFFFCF08B -:101A0000000000000000C080E0FCFFFF00000000BC -:101A10000000000000000000000030FF0000000097 -:101A2000000000000001871FFFFFFFFFE0800000B3 -:101A3000000000073FFFFFFEFCF8FFFF000300006F -:101A4000000000000000000F000000FF0000000385 -:101A5000000000000000C0F0000000C0FF7FFFFF9A -:101A60000F18F0C0808000000000FFFFFFFE0000A4 -:101A7000FF3F3F3F1F0F0F1E3FFFF8F8F000000031 -:101A8000000000000000000000010000FFFFFFFF59 -:101A9000000000000000000000FE3F1FFFFFFFFFEE -:101AA000FFFFFFFFFF00033FFFFF3F01061800009D -:101AB000FFFFFFFFFFFFFFFFFCF8C0C1030C0000AA -:101AC0000000000000000000000307FFFF0100000D -:101AD00000000000000000000000FFFFFFFF7F008B -:101AE00000C0FCFCFEFFFFFC783F3FFFFFFFFFFF55 -:101AF00000000000000F3F7FFFFFFFFFFFFFFFFF21 -:101B000000000000060100000FFFFFFFFFFFFF0CB9 -:101B10000000000000F00EFFFFFFFFF0C08000009B -:101B20000000000FFFFFFFFFFFFFFFFFFFFFFFFFB2 -:101B30000003FFFFFFFFFEFCFCF0E0E0C0808080C0 -:101B4000003C7EE7C3C7FEFCC6C7C3C3C3C7FEFCD9 -:101B500000000000001C3D736363636363626061A7 -:101B60000000000000F0E18B1B1B1B1B1B3BF1E086 -:101B70000018181818F8F9BB1B1B1B1B1BBBF1E046 -:101B80000000000000E0F1BB1B3BF3E303BBF3E309 -:101B90000018181818FFFF9D18181818181D0F079F -:101BA00000000000001898D8D8D8D8D8D8DD8F0702 -:101BB0000000000000C7CFDDD8D8D8D8D8D89818F2 -:101BC0000000000000078FDDD8D8D8D8D8DDCFC7F7 -:101BD00000C0C0C0C0C0C0C0C0C0C0C0C0C08000C5 -:101BE000000041E3E3E3777F000082C7C7C7DEFE62 -:101BF0007F3F3F3F1F1F1F19FEFCFCFCFCF8F898BD -:101C0000000103394721201010080F0000000000D8 -:101C100000008038C40809131907E1201010080FCC -:101C2000000103394721209030C00F08101020E038 -:101C300000008038C40808101020E00000000000F8 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000307010101030303030358 -:101C700007070707070F0F0F0F1F1F1F3F3F00002A -:101C8000000000000000FFFFFFFFFFFFFFFFFFFF5E -:101C9000FFFFFFFEFEFEFCFFFFFFFFFFFFFF000058 -:101CA00000000000000080C0C0C0C0C080808080F4 -:101CB00000000000000005FDFDF9F9F9F1E0000069 -:101CC00000000000000000000000000F1F3F7F7FA9 -:101CD0007FFFFFFFFFFFFFFFFFFFFFFFFF7F000012 -:101CE0000000000000000000000000FFFFFFFFCF29 -:101CF000CF8F9F9F9F3F3F3FFFFFFFFFFEF80000FA -:101D00000000000000000000000000F0F8F9F9F306 -:101D1000F3F3F7F7E7E7EFEFCFCFCF8F070300003D -:101D200000000000000000000000003FFFFFFFFE79 -:101D3000FEFEFCFCFCF8F8F9FFFFFFFBF1C0000021 -:101D40000000000000007F1F1F3F7FFFFFFFFF7F9D -:101D50007F7F7FFFFFFFFFFFFFFFFFFFFFFF000011 -:101D6000000000000000E0F0F0F0F0F0E1E3E7CF69 -:101D7000CFDFDFDF9F9FBFBF3F3F3F3F9FC70000D9 -:101D800000000000000000000000007FFFFFFFF9DE -:101D9000F9F3FFFFFFFFF0E0FFFFFFFFFFFF000091 -:101DA0000000000000000000000000FCFEFFFFFF3C -:101DB000FFFEFEFCFCE0000EFCFCF8F8F0800000EA -:101DC0000000000000000000000000000000000013 -:101DD00000000101010101030303030707030000E1 -:101DE0000000000000007FFF1F1F1F7F7F7FFFFF9D -:101DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F1 -:101E0000000000000000FFFFFFFFFFFFF3E1E3E73A -:101E1000EFFFFFFFFFFFBFBF9F9F8F0F87C7000030 -:101E2000000000000000F0FCFFFFFFFFFFFFFFFFCE -:101E3000FFFEFCF0C0E0F0F8FEFEFCFCF8F0000055 -:101E400000000000000000000000809FBF9F9F3F37 -:101E50003F3F3F7F7F7F7F7FFFFFFFFFFF7F0000D0 -:101E60000000000000000000000000E3F7F3F3F3BF -:101E7000E3E7E7E7E7CFCFCFFFFFFFFFDF0F00008C -:101E80000000000000000000000000FCFEFFFFFF5B -:101E9000FEFEFEFCFCFCFCF8F9F9F9F9FEFC000082 -:101EA00000000000000000000000003F7F3F3F3FB7 -:101EB0007F7F7F7FFFFFFFFFFFFFFFFFFF7F0000B0 -:101EC0000000000000000000000000E1F7EFFFFF4D -:101ED000E7C7C7CFCFCF8F9F9F1F1F3FBFDF000038 -:101EE0000000000000000000000000FCFFFEFEFCFF -:101EF000FDFDFDF9FBFBFBF3F7F7F7E7E3F9000066 -:101F00000000000000000000000000FFFFFFFFFFD6 -:101F1000FFFFFFFFFFFFFEFEFEFCFCFCFEFF0000DC -:101F2000000000000000000000000087DFBFFFFF8E -:101F30009F1F1F3F3F3F3F7F7F7F7FFFFF7F00004F -:101F40000000000000000000000000F0F8F8F9F3C5 -:101F5000F3F7F7E7E7E7EFCFCFCFCF8F87E10000C9 -:101F600000000000000000000000000F7FFFFFFEE7 -:101F7000FEFCFFFFFFFFFCF8FFFFFFFFFFFF00007D -:101F80000000000000000000000000FFFFFFFF7FD6 -:101F90007FFFFFFFFFF80003FFFFFEFEFCC0000015 -:101FA00000000000000000000000000F9FC7C7C72E -:101FB000CF8F8F1F1F1F1F9F3F3F3F3F7F7F00001F -:101FC0000000000000000000000000F8FDFDFFFF21 -:101FD000FFFEFCF8F8F8F0F0F0F0E0E0F8F00000B8 -:101FE00000000000000000000000007CFCF8F8F891 -:101FF000F0000000000000000000000000000000F1 -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2f.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2f.hex deleted file mode 100644 index 105c8ccc..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2f.hex +++ /dev/null @@ -1,513 +0,0 @@ -:100000000000000000000000FF7F3F1F0F070301FA -:100010000080C0E0F0F8FCFEFFFFFFFFFFFFFFFFE6 -:10002000FFFFFFFFFFFFFFFF0000000000000000D8 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:100060000000000000000000000000000000000090 -:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:1000800000000000000000003F00001F0F00000102 -:10009000000000203000003E3F00003F3F00003FD6 -:1000A0000000000000000000FC0000FCFC0000FC60 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000FF00001F0F070301F8 -:1000D000000000E0F0F8FCFEFF0000FFFFFFFFFF64 -:1000E0000000000000000000000000000000000010 -:1000F0000F001B00001D0000F000D80000B8000039 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F0000101003C173F3F1E80C0F070F0F0E000AD -:10030000000000000000001CFF7F3F1E0E06001CC6 -:100310000080C0E0F0F8FCFCFFFFFFFEFEFEFCFCEE -:10032000000000000000003CFF7F3F1F0F07033D5F -:100330000080C0E070783C3EFFFFFFFF7F7F3F3FC3 -:10034000387FFF0000000000F87FFF100000000071 -:1003500038FFFFE0E0E0C080F8FFFFF0E0E0C080A1 -:100360007EFEFF00000000007FFFFF0F0703030178 -:100370007EFEFF00000000007FFFFF0F0703030168 -:100380000000000000000000FF7F3F1E0C00000086 -:100390000080C0E0F0F8F8F8FFFFFFFEFCF8F8F886 -:1003A000000000000000000000000000000000004D -:1003B0000000000000000000FFFFFF1F0F070707FD -:1003C000000000001018181C000000001018181C75 -:1003D000000000001018181CF0F0F0F0F0F8F8FC25 -:1003E000000000040C0C1C3C000000040C0C1C3C25 -:1003F000000000040C0C1C3C000000040C0C1C3C15 -:10040000FFFFFFFFFFFFFFFFFFFFFF0000000000F7 -:10041000FEF80000000000007F1F01000000000047 -:10042000FFFFF80000000000FFF8000000000000DF -:10043000FFFF7F3F0F030000FFFFFFFFFFFEF8C03D -:10044000FFFFFFFFFFFFE000FFFFFFFCC000000019 -:10045000FCF0800000000000FFFFFFFFFFFFFFC077 -:10046000FFFFFEFCF8E0000080000000000000003C -:10047000FFFF7F0F00000000FFFFFFFFFF0F0100E5 -:10048000FFFFFFFFFFFFFCF0FEFFFCF8E080000035 -:10049000FFFFFCFCF8F0F8FC7F0700000000000004 -:1004A000FFFFFFFFFFFEF8E0C0800000000000003B -:1004B0000080E00000000000FFFFFFFF00000000E0 -:1004C0000000000000000000FFFFFFF8000103072C -:1004D000070707070E0F1C1860000000000000004F -:1004E000FFFFFFFFFFFEF8F0E1E77EF8F8F0F0E035 -:1004F000C0C0C00000000000FFFFFFF0C00000000F -:10050000FFFCF0C000000000FFFFFFFFFFFEF8E06F -:10051000C08000000000000000000000000000009B -:100520000000000000000000FFFFFFFFFF000000D0 -:100530000000000000000000FFFFFFE000000000DE -:10054000FFFFFCF0C0000000FFFFFFFFFFFEF8E030 -:10055000C080000000000000FFFFFCF0E00101018E -:100560000F070307070F0E7EF867FEF8E0E0C08074 -:10057000E0F0C00000000000FFFFFFFFFFFFFCF005 -:100580008000000000000000FFFFFCF0C000000041 -:10059000FFFE80000000000080000000000000005E -:1005A0000000000000000000FFFFFFFFFFFFFF0052 -:1005B00007000000000000009F0F03010000000082 -:1005C00000808080808080C0C0C0C0406060E0E06B -:1005D0000000000000010101E0E0F0F0F8FCFFFF86 -:1005E00000000000000000C080406060303030300B -:1005F0007F3F3F1F01000000C0E0F8C08000000006 -:10060000000000000001020C0000010103030F1FA5 -:10061000F0F0F0F0E0E0E0C00000000000000101B8 -:100620001818397FFFFFFFE03FFFFFFEFCF080005E -:10063000C080000000000000030200000000000075 -:1006400000000000000000000000000000000000AA -:1006500008081010302060600000010303070F1F1E -:10066000C0C0C0C0E0E0E0E00000000103030303FD -:100670003F7FFFFFFFFEFEFE800000000000000045 -:10068000070D192000000000FCFCF8F8F0E0C08025 -:1006900080808080808080C0C0C0C0406060E0E01A -:1006A0000000000001030303FCFEFFFFFFFFFFFF4C -:1006B0000000008080C0E0F8FF7F3F0300000000E2 -:1006C000FCFEFFFF3F0301000000000000000000EF -:1006D000000000000000000000000000000000001A -:1006E00000000000000000000103030301000000FF -:1006F000C060301F1C38FEF8F8F0F0F0F87C3E07C0 -:10070000000C70C08080C0E0000000000001030702 -:100710000000000000000000000000000080C0E0B9 -:10072000F8F0E0E0C0E0F0F0F8F0706030000C06A7 -:100730000303010100000000080810103020606071 -:10074000C0C0C0C0E0E0E0E0000000010103070F0E -:100750003F7FFFFFFFFEFEFE800000000000000064 -:1007600000000000000101001F3F7FFFFFFFFFFFAF -:10077000FCFCFCFCF8F8F8F0FF7F7F7F3F1F1F1F99 -:10078000F0E0E0E0E0C0C0C00000000000000000B9 -:10079000000000000000000018189CFFFFFFFF078A -:1007A000000000C0F8FFFFFF0000000000C0FE8056 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D00000000000009FFFFF00000000000080F804 -:1007E000000000000001010300040830E0C0808028 -:1007F0000F0F0F0F0F0F0F0380000000009FFFFF70 -:1008000000000000000000000000000000000000E8 -:100810000000000000000000FFFFFFFFFFFFFFFFE0 -:10082000FF63030101000000FFFFFFFFFFFF7F07E1 -:10083000F8FFFFFFFFFFFFFF01E1FFFEFCFCF8F800 -:10084000C0400000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:10086000FF03000000000000F8FC3E1E0F07070316 -:1008700000000000000000C00000000000000000B8 -:1008800000000000000080F80000000000000000F0 -:100890000000000000000003FF6303010100FEFFF1 -:1008A000FFFFFFFFFFFF7F070080E0F0FCFEFFFF80 -:1008B00000000000000000800000000000000000B8 -:1008C0000000000000000000F8E000000000000050 -:1008D000000007FFFFFFFFFF0001FFFFFFFFFFFF1B -:1008E00003FFFFFFFFFFFFFF7F7F7F7F7F7F3F3F94 -:1008F000F0FEFFFFFFFFFFFF000387FFFFFFFFFF8B -:1009000000000000000000000002060C080010308B -:10091000E0F038F8FCFCFCFF000000000000F0F8FC -:10092000000080F0FFFFFFFF00000000F8FFFFFF66 -:10093000000000000000C0FE0000000000000000F9 -:10094000000000000000000000000000000000C0E7 -:1009500000000000000000007F3F3F1F010103076F -:10096000000000000808181070E0E0F0F8F8F87CCB -:100970000000000000000818C0E0E0C0C0C0C08057 -:10098000000000000004040808101010180C0607EE -:1009900000386103061C007F01030F1F1F3F3F7FCC -:1009A00000021232007302067FFFFF7F3F3F1F0FDE -:1009B000C0E0F0F8F8FEFFFF0000000000000000BB -:1009C0000000000000000000000000000000000324 -:1009D0000001073F3F7EFCF8F8FFFFFF1F3F7FFF4E -:1009E0000000E0FFFFFFFFFF0000001FFFFFFFFF11 -:1009F000000000FFFFFFFFFF0000FFFFFFFFFFFF02 -:100A000000000000000000000010302101392163C7 -:100A1000003821033821037E001833202000031EF4 -:100A2000003020212123067C003E20003C20007F56 -:100A3000003F20003E202060001F30202101011FC8 -:100A40000021210139212163004E08080808007E99 -:100A5000000101010101033E0023260C2020206338 -:100A6000002020202020007F00010101292921638E -:100A70000001010121212163003821212121033EB0 -:100A800000382121033E2060003821212123043D2C -:100A90000038212107202067003026003801033E5E -:100AA000004E080808080818002121212121033ED2 -:100AB0000021210103060C080021210101113163ED -:100AC0000001030600103063002222060C080818FB -:100AD000007103060C18007F0000000000000000F9 -:100AE0000000000000000000000000000000000006 -:100AF000010103070F0F0703000000307CFCF8F82A -:100B0000030303030101010700808080C0E0F1F1CD -:100B1000FF3F7F7FFFFFFFFFF8F0F3FFFFFFFFFFC7 -:100B20007FFFFFFFFFFFFFFFF9FBFFFFFFFFFFFF5F -:100B3000FFFFFFFFFFFEFCF8FCF0E080000000007C -:100B4000E0C08080800C1C38FFFFFFFFFFFFFFFF2D -:100B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 -:100B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 -:100B7000FFFFFFFEFEFEFEFC000000000000000084 -:100B8000FCFCFCFCFEFEFEFC00000000000000007F -:100B9000FFFFFFFFFFFFFFFFFFFFFFFFFEFCFCFC6F -:100BA0000301000000000000FFFFFF7F7F3F1F07E1 -:100BB0000080C0FCFFFFFFFF03010000C0FCFEFF40 -:100BC000FFFFFFFFFFFEFEFCFFFBF7CF1F3F7F7F16 -:100BD000F0F0F0F0F0F0F0F87FFFFFFFFF600000B2 -:100BE000FFFFFFFFFFFF7F0FF8FCFEFFFFFFFFFF90 -:100BF00000000000F0FCFFFF00030F1F3F7FFFFF1E -:100C0000C0FEFFFFFFFFFFFF0007FFFFFFFFFFFF2B -:100C1000FFFFFFFFFFFFFFFF080818183C3C1C1EEA -:100C20001E0E06020200000000000000F0FEFC782C -:100C30000000000001033F3FC0E0E0C0C0C0C08032 -:100C40000003070F1F3F7FFFFFE7E7FFFFFFFFFFE7 -:100C5000F8F8FCFEFFFFFFFF7830000103038787F1 -:100C60007F7FFFFFFFFFFFFFF0FFFFFFFFFFFFFFA3 -:100C70008FFFFFFFFFFFFFFF0103030303030307D2 -:100C80008787878787878787FF9F9FFFFFFFFFFFF4 -:100C9000FF9F9FFFFFFFFFFF07070F1F1F3F3F3F04 -:100CA000FFFFFFFFFFFFFFFFFEFCFCFCFCFCFCFE68 -:100CB000FFFFFF000000FFFF878787000000878796 -:100CC000FEFCFC0C0C0CFEFE00000100000000000D -:100CD000FE9F9FFFFFFFFFFB7F7F7F7F7F7F7F7FE9 -:100CE000F8FCFEFFFFFFFCF87F67677F7F7FFF0058 -:100CF000FFE7E7FFFFFFFF00FFE7E7FFFFFCF00074 -:100D00008787878703000000FF9F9FFFFFFF3F004B -:100D1000FF9F9FFFFFFFFF00F09080E0C08000007A -:100D200080C0E0F0FFFFFEFC03030100C080000074 -:100D3000E0F0FC00000000000000000000000000E7 -:100D400000000000000000007F7FFF0000007F7FA8 -:100D50000000601F01030100000000FFFFFFFF7F94 -:100D60001F03010001030100FFFFFFFFFFFFFFFF63 -:100D70001F033108051301040000000000000000FB -:100D8000FFFFFFFFFFFFF8E0FFFFFFFFFFFF030391 -:100D9000E0F0F8FEFFFFFFFF01000000E0FCFCFFB9 -:100DA000FF7F3F1F07010130FFFFFFFFFFFFFFFF36 -:100DB000FFFFFFFFFFFFFFFF000000010303000034 -:100DC000FFFFFFF8C0000000FFFFFF1F0703030144 -:100DD00000000000000060F80000000000000003B8 -:100DE0000103070F1F3EF880FFFFFFBF1F07010031 -:100DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 -:100E0000F8FCFEFFFFFFFFFF00000080F0FFFFFF88 -:100E1000000000017FFFFFFF7F7F7FFFFFFFFFFFDD -:100E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 -:100E3000FFFFFFFFFFFFFFFF0000000000000000BA -:100E400000000000010110F00000000000000000A0 -:100E5000FEFEFE00F0F0C0E0FDFFFF07EFEFEF0049 -:100E6000F8FCFCF8F0F8FDFCFDFDFDFDFD7D3D3DD1 -:100E70007D7DFDFDFDFDFDFD000000003D332700F3 -:100E800000000000FFFFFFFF00000000FDF3E7800F -:100E900000061E00F7F7F7003E3E3E0037373700EA -:100EA000FEFEFE00F7F7F700FDFDFDFDFDFDFDFD7B -:100EB000FFF0C0F0DCC7C0C0FDFD3D0C0080FFFFAF -:100EC0000F010001077DC1C1FFFF7FFFFFFFFFFF93 -:100ED000808080C0E0F0FCFFFFFFFFFFFFFFFF000E -:100EE000C0C0C0C0C0C0C000CFC3C08000000000F0 -:100EF000FFFFFF1F0701030F0000000000000000BC -:100F00000000E0FFFFFFFFFF000000FFFFFFFFFF0B -:100F100003010000C0F8FEFFFFFF7F1F07010080F4 -:100F2000FFFFFFFFFFFF7F1FC0F0FCFFFFFFFFFF82 -:100F300007010000C0F0FCFF0700180601C0C080D8 -:100F4000FF000000E01F3F3F80808080C0E0F8FF8E -:100F50003F3F3F3F3F3F3FBFFFFFFFFFFFFFFFFF21 -:100F6000FF00000000000000FF0000000000000083 -:100F70000000000000000000FF7F1F0F03000000C2 -:100F800000FFFFFFFFFF7F3F00FFFFFFFFFFFFFFAF -:100F900000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 -:100FA0000F07010000000000FFFFFF7F3F1F070346 -:100FB00000000000000000000080C0E0F0F8FCFE2F -:100FC000FFFFFFFFFFFFFFFFF0FEFFFFFFFF7F3F81 -:100FD0003F3F3F3F3F3F3F3F000000000000000019 -:100FE000FFFFFFFFFFFF3F1FFFFEFCF8F0E0C080A8 -:100FF00000000000000000000000000000000000F1 -:10100000FF80808080808080FF010101010101015B -:1010100080808080808080FF01010101010101FF4B -:10102000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 -:10103000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 -:10104000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:10105000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 -:10106000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 -:10107000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 -:10108000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 -:10109000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF867 -:1010A000FFFFFFFFFFFFF103FFFFFFFFFFFFFFFF5A -:1010B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 -:1010C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 -:1010D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 -:1010E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 -:1010F000FFFFFFFFFFFFFFFEFFFFFFF8FCE08000A8 -:10110000FFFFFFFF07000000FFFFFFFFFF1F0000C2 -:10111000FFFFFFFFFFFFFF03FFFFFFFFFFFFFFFFDB -:10112000FFFFFFFFFFFFFFFFF8E106F8803060C020 -:1011300000000000000000000F00000000000000A0 -:10114000FFFF000000000000FFFFFFFFFEFCF1C7F3 -:10115000FFF3C78F1F3FFFFF7F1F0F070300000034 -:10116000FFFFFFFFFF01003FFFFFFFFFFFFF3FFF0C -:10117000FFFFFCF8F0C080008F1F3F7F7FFF6F1FD5 -:10118000FFFF3939FFFFFFFF1F07010000000000CC -:10119000FFFFFFFF7F3F1F0FFCF800000000000370 -:1011A000000000000038FFFF3F07000000008FFF35 -:1011B000FFFF1F0003FFFFFFFFFFFF3FFFFFFFFFDA -:1011C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:1011D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F -:1011E000FFFFFFFFFFFFFFFEFFFFFFF8C0FFFF0055 -:1011F000C08000003CFF000000000000000700006D -:101200000000000003C07C0F0000000000FC000094 -:10121000FF3F0F0100000000FFFFFFFF0000000084 -:10122000FFFFFFFFFF000000FFFFFFFFFFFF013F89 -:10123000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:10124000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE -:10125000FFFFFFFFFEFCF0F0F0E080000000000068 -:101260000700000000000000FFFF3F070000000033 -:10127000FFFFFFFFFF3F0F03000000000000000022 -:1012800000000000000000000000000000E0FF3F40 -:10129000000000000000FFFF0000000000E0F0F090 -:1012A0002060001F2000000000000000000000007F -:1012B0000000000000000018000000000000000016 -:1012C00000000000000000001F03030100000000F8 -:1012D0008FC3F3870F1F0307F8F0E0C08000C0E062 -:1012E00000000000000000001E14000103000000C8 -:1012F000C000000000000000000101030101030321 -:1013000000808080C0C0C08000000000000000009D -:1013100000000000000000000000000001070E3C7B -:10132000070F4F9FBF0F02028000800000000000E7 -:1013300000000000000000000000000000000000AD -:101340000003000000000000E800000000000000B2 -:101350000000000000000000FE7F0F0300000000FE -:10136000000080C0E010000000000000000000004D -:10137000000000000000000000000000000000006D -:101380000000000000000000000000010F1F3CF002 -:10139000001870E0C0000000000000000000000025 -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C0000000000000000000000000010700000015 -:1013D000031F70E0E000000080000000000000003B -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:101410000000000007070F0F000010E1DFFFFFFFD3 -:10142000000000C38CF1FFFF000001011FFFFFFF60 -:10143000073EC0B8FCFFFFFFC0000000C0800020D6 -:1014400000000000000007380000001E70C000000F -:101450000000000000000000070F03000000000073 -:10146000FFFF070000000000FFFFFF3F0F03000029 -:10147000FFFFFFFFFFFF7FFFFFFFFEFFFFFFFFFFFD -:10148000C00030E0C1C3CFFF0000000030C71FFF25 -:10149000000000008000861C00000000000830E012 -:1014A00000000000010103010C3F7FFFFFFFFFFF71 -:1014B00070F8FEFFFFFFFFFF000000C0E0F0F0F853 -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F0000106000000000000C3071F0707030000EB -:10150000FFFFFFFFFFFEF000FFFCFCF8E000000023 -:10151000F8C0000000000000000000000000000013 -:10152000FFFFFFFFFFFFFFE0FFFFFEF8F1F8FE0007 -:10153000F8F8FCE4CCFC7E00000000000000000095 -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000001020C0000000000E07806000000DE -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E000FFFFFF0000000000FFFFFFFF0F000000F3 -:1015F000FFFFFFFFFCF00000FFFFFFFF0000000007 -:10160000FFFFC0FCFF00000000F80000E03C00000D -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:1016700080C0E0F0FCFFFFFF0000000000C0E3FFBF -:10168000FFFEF0E18FFFFF00EF3F7FFFFFFEE00076 -:101690008080FFFFFFFFFFFE00FFFFFFFFFE8001D6 -:1016A000FEFCF0E0800000000103070707070F0FB2 -:1016B00000000000000000000F0F0100000000000B -:1016C0003F7FFFFFFF0F01FE00000000000006FC4F -:1016D000FFFFFFFCE0000000F081070F0F1F1F3D20 -:1016E00000FFFFFFFF7FFFFF393141E0F0F0F8F826 -:1016F000FFFFFFFFFFFFFFFFFDFDFEFEFEFCF08092 -:10170000FCE0C000010307001C3C7EFFFFFEC000A0 -:101710000000000001030F3F07031C3EFFFFFFDF37 -:10172000FFFFFFFFFFFFFDF9DFEEECE0A0E0E0E0F0 -:10173000FFFFFF7800000000E0E0C00000000000B4 -:101740000000000000000000000000000000000099 -:101750000000008080000000000000000000000089 -:1017600000000000010101030000000103070F1F3A -:101770000F1FFFFFFEFEFCFC1F3F7FFFFFF9FFFF77 -:10178000F8F0E0C0C0808000E0C000006070888C8D -:10179000000000000000000007030100000000003E -:1017A0000080C0C0E0200000000000000000406099 -:1017B00000000000000103077F7F3F3F3F1F0F0332 -:1017C0000F8FEFF7F7F7FBFB010101030303073F5F -:1017D000FBFFFFFFFFFFFFFF1F0100000000FFFFF7 -:1017E000FFFF3F070100FFFFFFFFFFFFFF7F1FF726 -:1017F00000000000000000000000000000000000E9 -:10180000FF80808080808081FF01010101010181D2 -:1018100081808080808080FF81010101010101FFC2 -:10182000030F3F7FFFFFFFFFFFFFF987FFC7C0C028 -:10183000FFFFFFFFFFFC003FF8FFFFFF3F7FFEFCC5 -:1018400000F8F8FCFFFF0F3F07031C3EFFFFFFDF20 -:101850000000000000000000000000000000000088 -:101860001F1F3F3F3C784000FFFFE080000000006A -:10187000F0000000010101031F3F7FFFFFF9FFFFA0 -:1018800000000000000000000001010303070F0F2B -:10189000F1FFFFFFFFFFFFFFF8F0F0F0F0F8FCFFB3 -:1018A0000000000103070F1F0F1FFFFFFEFEFCFCDF -:1018B0000003070F0F1E3C78FCF8F080000000E0EA -:1018C00001020E0C1C1C3878000000010103070EF9 -:1018D00060E0C0C0E0E0E0000000000103071F3F3F -:1018E0001F3EF8F0E0800000000000000000000053 -:1018F0000000000000203070000000000101030320 -:101900007FFFFFFFFFF8E0C0FFFFFFFF9B09000024 -:1019100001070F1F3F3F3F7F0000E0F9F9FFFFFF86 -:101920000000000000000000000000000103070F9D -:1019300000000000000000000000000000000000A7 -:10194000000000000000FFFFFFFFFFFFFFFFFFF0B0 -:1019500000000000000000F0FFFFFFFFFDFFE30FAD -:101960000000000000000100000000000000000076 -:101970001F1F3F7F7F78E000000000000000000094 -:101980000000000000000000C0FEF8F0C1C70F7F9B -:1019900000000000000000007E78077FFFFFFFFFCF -:1019A0000F8FCFFFFF7F3F1F00000FFFFFFFFFFFE5 -:1019B000FFFFFFFFFFFFFF0301F0F0E1C3C7CFCF41 -:1019C00000000000000018E00001FFFFEFEFEFEF64 -:1019D00000000000003E7FFFFFFFE0FFFFFFFFFF72 -:1019E000F7FEFCF0C080F0FFFFFFFFFFFFFFFFFFEF -:1019F000FF7F1F00000000FFFFFFFFFFFFFFFCF065 -:101A0000000000000000C0FFFFFF3FFFFFFFFCFFE2 -:101A100000000000000000F8FFFCF0F0DF3FFFFFD7 -:101A2000FFFFFFFF1F1D7FFFFFFEFCF8E0800000AF -:101A3000FFFFFFFCFCF0F0E0800000000000000071 -:101A4000000000000000000FC0000000FFFFFFFCCE -:101A5000000000000000C0FF000000000080000344 -:101A600010E7080000000000000000000000000077 -:101A70003FDF0F0F0703000100000000000000001F -:101A8000000000000000FFFE00000000001F7FFFBC -:101A900000000000001FFC000000000003FFFFFF2B -:101AA000FFFFFFFFFFFFFCC0000000010618000061 -:101AB000FFFFFCE000000000000000C1030C00007C -:101AC000000000033CC00000000307FFFFFFFFFF12 -:101AD000000000F0000000000000FFFFFFFFFFFF1C -:101AE000FF3F00000000000000070F1F7FFFFFFF07 -:101AF000FC800000000F3F7FFFFFFFFFFFFFFFFFA5 -:101B0000000000FF010000000FFFFFFFFFFFFFFFCD -:101B10000000FFFFFF0F01FEFFFFFFFFFFFFFFFFC2 -:101B20000F0F1F3FFFFFFFFFFFFFFFFFFFFFFFFF45 -:101B3000FFFFFFFFFFFFFEFCFCF0E0E0C0808080C5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE000000000081C1C080000000010383820000D -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000F1F0707070F0F0F0F0F1F1F1F1F1F3F2C -:101C50003F3F3F7F7F7FFFFF00000000000000004C -:101C6000FEFFFFFFFFFFFEFEFEFEFCFCFCF8F8F8A7 -:101C7000F0FFFFFFFFFFFFFF00000000000000007B -:101C80000000000000000000010101030303030342 -:101C900017F7F7E7E7E7C781000000000000000042 -:101CA00000000000003F7FFFFFFFFFFEFEFEFEFC86 -:101CB000FCFCFFFFFFFFFFFF000000000000000032 -:101CC0000000000000FFFFFFFF3F3F3F7F7F7FFFDF -:101CD000FFFFFFFFFFFEF8E0000000000000000033 -:101CE0000000000000C0E3E7E7CFCFCFDFDF9F9F1A -:101CF000BFBF3F3F3F3F1F0F00000000000000003C -:101D00000100000001FFFFFFFFF9F9F9F1F3F3E330 -:101D1000E3E7FFFFFFEFC703000000000000000043 -:101D2000FF7F7FFFFFFFFFFFFFFFFFFFFFFFFEFEC5 -:101D3000FEFEFCFCFCFCFEFF0000000000000000BA -:101D400080C0C0C0C0C1878F9F3F3F7F7F7F7F7FA4 -:101D5000FFFFFFFFFFFF7F1F0000000000000000EB -:101D60000000000000FFFFFFFFE7E7CFFFFFFFFFDE -:101D7000C080FFFFFFFFFFFE00000000000000002A -:101D80000000000000F0F8FCFCFCFCF8F8F0F0802B -:101D90000038F0F0E0E0C0000000000000000000AB -:101DA0000103000000010101030303030707070704 -:101DB000070F0F0F0F1F1F0F000000000000000093 -:101DC000FFFF7F7F7FFFFFFFFFFFFFFFFFFFFFFFA3 -:101DD000FEFEFEFEFEFCFEFF000000000000000014 -:101DE000FFFFFFFFFFFFCF878F9FBFFFFFFFFFFFBB -:101DF000FFFF7F7F3F3F1F1F00000000000000002B -:101E0000C0F0FCFCFEFEFEFEFEFCFCF8F0C1018111 -:101E1000C1E1FBFBF3F3E3C10000000000000000A0 -:101E200000000000007FFF7F7FFFFFFFFFFFFFFF3D -:101E3000FFFFFFFFFFFFFFFC0000000000000000AD -:101E400000000000008FDFCFCFCF8F9F9F9F9F3F6D -:101E50003F3FFFFFFFFF7F3F00000000000000004A -:101E60000000000000F0F9FCFCFCF9F9F9F1F3F3D3 -:101E7000F3E3E7E7E7E7FBF1000000000000000004 -:101E80000000000000FFFFFFFFFFFFFFFFFFFFFF5D -:101E9000FEFEFEFCFCFCFEFF000000000000000057 -:101EA000000000000087DFBFFFFF9F1F1F3F3F3F75 -:101EB0003F7F7F7F7FFFFF7F00000000000000006A -:101EC0000000000000F3FFFBFBF3F7F7F7E7EFEF8D -:101ED000EFCFDFDFDF9F8FE7000000000000000092 -:101EE0000000000000FEFFFEFFFFFEFCFCFCFCFC0F -:101EF000F8F9F9F1F1F3FBFD00000000000000002B -:101F000000000000001F7FFFFFFF7F7F7FFFFFFFBC -:101F1000FFFFFFFFFFFEFEFF0000000000000000CB -:101F20000000000000C0E1E3E7CFCFDFDF9F9F9F0D -:101F3000BF3F3F3F3F3F1F87000000000000000001 -:101F400000000000003FFFFFFFF9F9F3FFFFFFFF74 -:101F5000F0E0FFFFFFFFFFFF0000000000000000B7 -:101F60000000000000FCFEFFFFFFFFFEFEFCFCE0A7 -:101F7000000EFCFCF8F8F101000000000000000079 -:101F800000000000003F7F1F1F1F3F3F3F7F7F7FFC -:101F90007F7FFFFFFFFFFFFF000000000000000049 -:101FA0000000000000E1F7F7FFFFFFF8F0E0E0E0DD -:101FB000C0C0C0C08080E0C0000000000000000081 -:101FC0000000000000F0F0E0E0E0C00000000000D1 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2j.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2j.hex deleted file mode 100644 index a06e2825..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/lr-e-2j.hex +++ /dev/null @@ -1,513 +0,0 @@ -:100000000000000000000000FF7F3F1F0F070301FA -:100010000080C0E0F0F8FCFEFFFFFFFFFFFFFFFFE6 -:10002000FFFFFFFFFFFFFFFF0000000000000000D8 -:1000300000000000000000000000000000000000C0 -:100040000000000000000000FFFFFFFFFFFFFFFFB8 -:100050000000000000000000FFFFFFFFFFFFFFFFA8 -:100060000000000000000000FFFFFFFFFFFFFFFF98 -:100070000000000000000000FFFFFFFFFFFFFFFF88 -:1000800080FF808080FF8080BFFF809F8FFF808106 -:1000900080FF80A0B0FF80BEBFFF80BFBFFF80BFDA -:1000A00002FE020202FE0202FEFE02FEFEFE02FE50 -:1000B0000000000000000000000000000000000040 -:1000C00000FF000000000000FFFF001F0F070301FA -:1000D00000FF00E0F0F8FCFEFFFF00FFFFFFFFFF66 -:1000E0000000000000000F3F000000000000F0FCD6 -:1000F0001F3F3F223F3F241FF8FCFC44FCFC24F838 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F0003F3FFF430000000080C0F0F0D0F06000FE -:10030000000000010101031FFF7F3F1F0F07031FB4 -:100310000080C0E1F1F9FFFFFFFFFFFFFFFFFFFFDC -:10032000000000008080C0F8FF7F3F1F8F87C3F967 -:100330000080C0E0F0F8FCFAFFFFFFFFFFFFFFFBCB -:100340003F7FFF0F1F1F3F7FFF7FFF1F1F1F3F7F4D -:100350003FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFF7D -:10036000F0E0C0F0F8FCFCFEF1E1C0FFFFFFFFFF92 -:10037000F0E0C0F0F8FCFCFEF1E1C0FFFFFFFFFF82 -:100380000000000103070707FF7F3F1F0F07070754 -:100390000080C0E1F3FFFFFFFFFFFFFFFFFFFFFF54 -:1003A00000000080C0C0F0C000000080C0C0F0C0ED -:1003B00000000080C0C0F0C0FFFFFF9FCFC7F7C79D -:1003C0000F0F0F0F0F0707030F0F0F0F0F07070375 -:1003D0000F0F0F0F0F070703FFFFFFFFEFE7E7E325 -:1003E000E0E0E0C0C0808000E0E0E0C0C0808000CD -:1003F000E0E0E0C0C0808000E0E0E0C0C0808000BD -:10040000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC -:10041000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC -:10042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC -:10043000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC -:10044000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC -:10045000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:10046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C -:10047000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C -:10048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C -:10049000FFFFFFF3C70F070380F8FFFFFFFFFFFF1A -:1004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C -:1004B000FF7F1FFFFFFFFFFFFFFFFFFFFFFFFFFFAC -:1004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFEFCF847 -:1004D000F8F8F8F8F1F0E3E79FFFFFFFFFFFFFFFF9 -:1004E000FFFFFFFFFFFFFFFFFED88107070F0F1F72 -:1004F0003F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFF4C -:10050000FFFFFFFFFEF8FCFEFFFFFFFFFFFFFFFB0B -:10051000F1E3C3870703010300808080C0E0F0F1AE -:10052000F9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 -:100530000000000000000000FFFFFFFFFFFFFFFFC3 -:10054000FFFFFFFFFEF8FCFEFFFFFFFFFFFFFFFDC9 -:10055000F8F1E1C303010003FFFFFFFFFFFEFEFE12 -:10056000F0F8FCF8F8F0F181879801071F1F3F7F32 -:100570001F0F3FFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:10058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B -:10059000FFFFFFFFFFFFFFFF879801071F1F3F7F40 -:1005A0001F8F3FFFFFFFFFFFFFFFFFFFFFFFFFFF6B -:1005B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B -:1005C000FF7F7F7F7F7F7F3F3F3F3FBF9F9F1F1FFB -:1005D000FFFFFFFFFFFEFEFE1F1F0F0F07030000C0 -:1005E000FFFFFFFFFFFFFF3F7FBF9F9FCFCFCFCF1B -:1005F00080C0C0E0FEFFFFFF3F1F073F7FFFFFFF00 -:10060000FFFFFFFFFFFEFDF3FFFFFEFEFCFCF0E03F -:100610000F0F0F0F1F1F1F3FFFFFFFFFFFFFFEFE0C -:10062000E7E7C68000000003C0000001030F7FFF62 -:100630003F7FFFFFFFFFFFFFFCFCF8FFFFFFFFFF17 -:100640000F3F1F1F0FCFE7F7FBFFFFFFFFFFFFFF6E -:10065000F7F7EFEFCFDF9F9FFFFFFEFCFCF8F0E026 -:100660003F3F3F3F1F1F1F1FFFFFFFFEFCFCFCFC27 -:10067000C0800000000101017FFFFFFFFFFFFFFFBF -:10068000F8F2E6DFFFFFFFFF030307070F1F3F7FBF -:100690007F7F7F7F7F7F7F3F3F3F3FBF9F9F1F1FAA -:1006A000FFFFFFFFFEFCFCFC030100000000000058 -:1006B000FFFFFF7F7F3F1F070080C0FCFFFFFFFFA2 -:1006C00003010000C0FCFEFFFF7F7F7F7F7F7F3F35 -:1006D0003F3F3FBF9F9F1F1FFFFFFFFFFFFEFEFF2C -:1006E0001F1F0F0F07030000FEFCFCFCFEFFFF3F77 -:1006F0003F9FCFE0E3C70107070F0F0F0783C1F844 -:10070000FFF38F3F7F7F3F1F80C0C0E0FEFEFCF8FD -:100710001F1F3F3F3F3F3F7F7FFFFFFFFF7F3F1F89 -:10072000070F1F1F3F1F0F0F070F8F9FCFFFF3F9FB -:10073000FCFCFEFEFFFFFFFFF7F7EFEFCFDF9F9F11 -:100740003F3F3F3F1F1F1F1FFFFFFFFEFEFCF8F054 -:10075000C0800000000101017FFFFFFFFFFFFFFFDE -:10076000FFFFFFFFFFFEFEFFE0C080000000000073 -:10077000030303030707070F00808080C0E0E0E069 -:100780000F1F1F1F1F3F3F3FFFFFFFFBFBF3E383D5 -:100790000000000000000000E7E76300000000C068 -:1007A000FFFFFF3F07000000FFFFFFFFFF3F0100CB -:1007B000F0FFFFFFFFFFFFFF0080F0FFFFFFFFFFE5 -:1007C00000000000F8FFFFFF3F1F3F1F0FFFFFFF6C -:1007D000FFFFFFFFFF600000FFFFFFFFFFFF7F073E -:1007E000FFFFFFFFFFFEFEFCFFFBF7CF1F3F7F7FFA -:1007F000F0F0F0F0F0F0F0F87FFFFFFFFF60000096 -:1008000000000000000000000000000000000000E8 -:10081000FFFFFFFFFFFFFFFF0000000000000000E0 -:10082000000000000000FE7F00000000000000004B -:100830000700000000000000FE1E00000000000095 -:100840003F3F00000000000007070707070F7F7FFA -:10085000FFFF7F01FFFFFFFFFFFFFFF3E7F7FFFF52 -:100860000000FCFFFFFFFFFE000000E0F0F8F87C56 -:1008700000000000000000003F1F0F0707010000FC -:10088000FFFFFFFFFFFF7F07FFFDF3E7EFCFCF8FF6 -:10089000F8FCFEFFFFFFFFFF000000000080FEFFEE -:1008A00000000000000000000F0000000000000039 -:1008B000FF1F000103030707FFFFFFFFFFFFFFFF0D -:1008C000FEFCF0E0E0C0C080071FFFFFFFFFFFFF5E -:1008D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:1008E0003FFFFFFFFFFFFFFF0000000000000000D0 -:1008F000F0FEFFFFFFFFFFFF7F3F9FFFFFFFFFFFB8 -:1009000000000000000000000002060C080010308B -:10091000070301E1F0F8F8FF80000080C0E0F0F884 -:100920007F3F9FFFFFFFFFFFFFFFFFFFFFFFFFFF77 -:10093000FFFFFFFFFFFFFFFFFFFEF8F0E0C0010732 -:100940000707070F1F7FFFFFFEFCFCFCFEFFFF3FBA -:10095000070F0F0F0783C1F880C0C0E0FEFEFCF850 -:1009600000000000080818108F1F1F0F07070783DB -:1009700000000000000008183F1F1F3F3F3F3F7F5F -:10098000FFFFFFFFFFFBFBF7F7EFEFEFE7F3F1E010 -:1009900000386103061C007FFEFCF0E0E0C0C08070 -:1009A000000212320073020680000080C0C0E0F036 -:1009B0003F1F0F0707010000FFFFFFFFFFFFFFFFC3 -:1009C000FFFFFFFFFFFFFF60FFFFFFFFFEF00000E4 -:1009D000FFFEF8C00000000007000000000000005B -:1009E000FFFF1F0000000000FFFFFFE0000000000D -:1009F000FFFFFF0000000000FFFF000000000000FC -:100A000000000000000000000010302101392163C7 -:100A1000003821033821037E001833202000031EF4 -:100A2000003020212123067C003E20003C20007F56 -:100A3000003F20003E202060001F30202101011FC8 -:100A40000021210139212163004E08080808007E99 -:100A5000000101010101033E0023260C2020206338 -:100A6000002020202020007F00010101292921638E -:100A70000001010121212163003821212121033EB0 -:100A800000382121033E2060003821212123043D2C -:100A90000038212107202067003026003801033E5E -:100AA000004E080808080818002121212121033ED2 -:100AB0000021210103060C080021210101113163ED -:100AC0000001030600103063002222060C080818FB -:100AD000007103060C18007F0000000000000000F9 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000FFFFFFA8 -:100B5000000000000000FFFF00000000000000FF98 -:100B600000000000000000000000000000031FFF64 -:100B700000000000000000FC1F3F3F3F7F18030FF4 -:100B8000FCFCFCFCFEFEFEFC7FFF3F3F3F1F0F0016 -:100B9000FFFFFFFFFFFFFFFF00000000000000005D -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C0000C0FEFFFFFFFFFFFF3F1FFFFFFFFFFFFFD4 -:100C1000F0FEFFFFFFFFFFFFF7F7E7E7C3C3E3E1E6 -:100C2000E1F1F9FDFDFFFFFF1F7F1F01F0FD7BB725 -:100C3000FFFFFFFF3EFCD8DE3F1F1F3F3F3F3F7ED1 -:100C4000FCFBF7EFDFBF7FFFFFE7E7FFFFFFFFFFE3 -:100C5000F7F7FBFDFEFEFFFFB7CFFFFEFDFD7B7B41 -:100C6000BFBF7FFFFFFFFFFF0F80F0FEFFFFFFFF13 -:100C700070000000000080C0FDFBFBFBFBFBFBF7EE -:100C80007B7B7B7B7B7B7B7BFF9F9FFFFFFFFFFF54 -:100C9000E09098F8FCFCFCFEF7F7EFDFDFBFBFBF8A -:100CA000FFFFFFFFFFFFFFFFFFFFFFFFFBFBF3F176 -:100CB000FFFFFFFFFFFFFFFF7B7BFFFFFFFF7B7B54 -:100CC000F9FBF3F3F3F3F1F1FEFCFDFEFEFEFEFE95 -:100CD000F19090F0F0F0F0F87F7F7F7F7F7F7F7F53 -:100CE000F8FCFEFFFFFFFCF87F67677F7F7FFFFF59 -:100CF000FFE7E7FFFFFFFFFFFFE7E7FFFCF30FFF63 -:100D00007B7B7B7BFCFFFFFFFF9F9FFFFF3FFFFF86 -:100D1000FF9F9FFFFFFFFFFFF19080E0C183070768 -:100D2000FFFFFFFEFFFFFEFCC0800000C08040F020 -:100D30001F0F030000000000FCE080000000000026 -:100D400018060000000000007F7FFFFFFFFF7F7F8D -:100D50000F0F7F1F01030100FFFFFFFFFFFFFF7F5A -:100D60001F03010001030100FFFFFFFFFFFFFFFF63 -:100D70001F0331080513010400000080A04080001B -:100D8000FFFFFFFFFFFFF8E0FFFFFFFFFFFF030391 -:100D9000C08000000080E0FC0100000000000000B6 -:100DA000FF7F3F1F07010100C0C0FFFFFFFFFFFFE4 -:100DB0001FFFFFFFFFFFFFFFFFFFFFFEFCFCFCF834 -:100DC00000000000000F3FFF0000000000C0E0F046 -:100DD000F3E7CFCFCFC38000F3C387FFFEF8000057 -:100DE000F0E0C0000000000080C07E1F0100000095 -:100DF000000000C0FC7E070300000000000000802F -:100E000000000000000000000000000000000000E2 -:100E10000000000000000000016070381E0F030099 -:100E2000C0E070381C8EFFFF0501000000000000CC -:100E30008080000000000000FFFFFFFFFFFFFC01BB -:100E4000FEF8E0FCFEC20FEF000000000000000012 -:100E5000010101FD080000E0030307F9111010FF74 -:100E6000F8FCFFFFFFFF3203FDFDFDFDFD7D3D3D75 -:100E70007D3DDDEDEDF5F5F53F3F0001020C383F1E -:100E8000FFFF00000000FFFFFFFF0001020CF8FF62 -:100E9000FFF961FF080808FF0101013F0808083F4A -:100EA000010101FF080808FFFDFDFDFDFDFDFDFD41 -:100EB000FFFFFFCFE3F8FFFFFDFDFDFFFF7F000019 -:100EC0003F3FFFFEF8800000FFFFFF7F7F7F7F7FB7 -:100ED000FFFFFFFFFFFFFFFF00000000000000001A -:100EE00000000000000000000F03000000000000F0 -:100EF000FFFFFF1F0701030F0000000000000000BC -:100F00000000E0FFFFFFFFFF000000FFFFFFFFFF0B -:100F100003010000C0F8FEFFFFFF7F1F07010080F4 -:100F2000FFFFFFFFFFFF7F1FC0F0FCFFFFFFFFFF82 -:100F300007010000C0F0FCFF070307393EFFFFFF79 -:100F4000FFFFFFFF1FE0C0C0FFFFFFFFFFFFFFFF2E -:100F5000C0C0C0C0C0C0C0C0000000000000000091 -:100F6000FFFF000000000000FFFF03030303030373 -:100F70000303030303030303FFFFFFFFFFFFFFFF61 -:100F800000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF6F -:100F900003FFFFFFFFFFFFFF0000FFFFFFFFFFFF5B -:100FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 -:100FB000FFFFFFFFFFFFFFFFFF7F3F1F0F07030143 -:100FC0000000000000000000FFFFFFFFFFFFFFFF29 -:100FD0003F3F3F3F3F3F3F3F000103070F1F3F7F22 -:100FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 -:100FF00000000000000000000000000000000000F1 -:10100000FF80808080808080FF010101010101015B -:1010100080808080808080FF01010101010101FF4B -:10102000FFFFFFFFFFFFFFFCFFFFFFFFF8E0810373 -:10103000FFFFCF1F7FFFFFFFFFFFFFFFFFFFFFFF50 -:10104000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 -:10105000FFFFFFFFFFFFFFF8FFFFFFFFFFE0800044 -:10106000FFFFFCE0C0000000F080000000073F0030 -:101070000F0F3F7FFFFFC300FFFFFFFFFFFFFFF8E2 -:10108000FFFFFFFFFFFFFC3FFFFFFFFFFFFFFF032F -:10109000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 -:1010A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 -:1010B000FFFC000000FFFFFFC00000000000F0FF89 -:1010C000000000000000030F000100000000FFFF0F -:1010D00000FF00003F0300FFFFFFFF07FFFF1FC3EC -:1010E000FFFFFFFFFFFFFFFF83F1FFFFFFFFFFFF9A -:1010F000FFFFFFFFFFFCF8C1FFFFFFE7031F7FFFBC -:10110000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF -:10111000FFFFFFFFFFFFFFFFFFFFFFFEF0E0E0F834 -:10112000FEE0800000000000071EF9077FCF9F3F10 -:10113000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF -:10114000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF -:10115000FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFA0 -:10116000FFFFFFFFFF0180C0FFFFFFFFFFFF3F7F8B -:10117000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F -:10118000FFFFFFDE9CFFFFFFE0F8FEFFFFFFFFFF1A -:101190007F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF5F -:1011A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F -:1011B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F -:1011C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F -:1011D000FFFFFFFFFFF8C000FFFFFFE080000000FF -:1011E000FCE0C00000000001000000073F0000FF1D -:1011F0003F7FFFFFC300FFFFFFFFFFFFFFF8FFFF81 -:10120000FFFFFFFFFC3F83F0FFFFFFFFFF03FFFF38 -:10121000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE -:10122000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE -:10123000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE -:10124000FFFFFFFFFFFFFFFFFFFFFFFFFFFCF0803F -:10125000FFFFF8E081030F0FCF1F7FFFFFFFFFFFAE -:10126000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E -:10127000FFFFFFFFFFFFFFFF000000000000000076 -:10128000000000000000000000000000000000005E -:101290000000000000000000000103070F17070F07 -:1012A000DC99FFE0C7E0C08078F8F00000000000A3 -:1012B00000000107070F3F663F7FFFFCE1871E3CF0 -:1012C000F8F0F0E0C0800000000000000000000026 -:1012D000703C0C7880000000060E1E3474E828185C -:1012E0000000061820C0C080000101020403071E90 -:1012F00030F0E0C0C080800701060E0C1E7EFCFCB2 -:101300008000000000000000000001030E1060805B -:101310001C70E0071F7FFFFF0F1FFFFFFEF8F1C3E8 -:10132000F8F0B06040F0FCFC00000000000000009D -:10133000030C100000000000030F1F7C00000000E1 -:10134000FFDC3F7F4F03000017FCF8F0F8F07E1E33 -:101350000300000000000000010000000000000089 -:10136000FFFF7F3F1F0F0700FFFFFFFFFFFFFFF89B -:10137000FFFFFFFFFCF00000FFFFC73FFF3F07013B -:10138000FFFFFFFFFFFFF880FFFFFFFEF0E0C30F4E -:10139000FFE78F1F3FFEFEFEF8F0C0800000000058 -:1013A000000000000000000300000000030CF0C07B -:1013B000000F30C00000000000000000000000002E -:1013C0000000000000000000000000000007010015 -:1013D00000000F1F1FFF871F7FFFFFFFFFFFFFFFA3 -:1013E000FCF8F8F0E0C1C73F0000071F7FFFFFFFD8 -:1013F0001FFFFEFFFEFFFEFFFF1F000000000000BA -:10140000FFFFFFEF4F070000FFFFFFFFFFFF7F3FE2 -:10141000FFFEFCFCF8F8F0F0000000000000000007 -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:101450000F03010000000000F8F0FC3F0300000350 -:10146000000000F8FC7EFFFF00000000000000808C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A00000000000000001000C3E7677F3E3F8FE38 -:1014B00070F87E1F8FE0F93C000000C0E0F0F0B84B -:1014C0000000000000007F80000000030001F00029 -:1014D00000007F8C70800000001FFF1CE0000000F7 -:1014E0003FFEC00000000000F0000000000000000F -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:101520003F9FB7C3C6E0FEE0CFF3FEF8F1F83E0000 -:1015300008C0FCE4CCF47E000000077E0F00010729 -:101540000E70800000F0FFFF00000000000000F0BF -:10155000000000000000031F00000000013FFFFF2B -:10156000071F3FFFFFFFFFFFFFFFFFFFFFFFFFFF23 -:1015700080F8FFFFFFFFFFFF000000E0F8FEF8E04B -:101580000003070300000000FFFFFFFFFF1F07012C -:10159000FFFFFEFDF3FFFFFFFFFF1F87F9FFFFFFC8 -:1015A000FFFFFFF0E0FFFFFFFFFE000000E0F0F8AC -:1015B000F800000000000000FF7F1F0F0700000080 -:1015C000FFFFFFFFFFFF3F0FFCFFFFFFFFFFFFFFDE -:1015D0000000E0F8FFFFFFFF0000000000C0F0FF88 -:1015E0000000007F3F0F070300000000F0FFFFFF37 -:1015F00000000000030FFFFF00000000FFFFFFFFDF -:1016000000003F0300FFFFFFFF07FFFF1FC3FFFFB7 -:10161000FFFFFFFFFFFEE000FFFFFEF08000000085 -:10162000FCC0000000000000FF7F3F1F070100001A -:10163000FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF7A -:10164000FFFFFFFFFFFFFFFF1F0F0F07010000005D -:10165000FFFFFFFFFFFF7F00FFFFFFFFFFFFFCF02B -:10166000FFFFFFFFF8800000FEF8E0000000000030 -:10167000000000000000001F00000000000003FF49 -:101680000001FFFFFFFFFF1F0FFFFFFFFFFFFFFF37 -:1016900000007FFFFFFFFFFFFFFFFFFFFFFFFFFED9 -:1016A000E1030F1F7FFFFFFFFEFCF8F8F0F0F0F002 -:1016B000FFFFFFFFFFFFFFFFF0F0FEFFFFFFFFFF59 -:1016C0000000FFFFFF0FF10000000000000007FF17 -:1016D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1C -:1016E000FFFFFFFFFFFF7F7FB93141E0F0F0F8F827 -:1016F0005F1F0F0F07010000FCFCFDF9F183037170 -:10170000031F3FFFFFFFFFFFFCFCFEFFFFFFFFFF8C -:10171000000000000103FFFF07031D3EFFFFFFFF66 -:10172000FFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFF09 -:10173000FFFFFFFFFFFFFFFFFDF1F8FCFEFFFEC014 -:10174000FFFFFFFFFFFFFFFF00FCFFFFFFFFFFFFAB -:10175000FF3F0F8080E0F8FFFFFFFF3F7F0F030F89 -:1017600000000000010101030000000103070F1F3A -:101770000F1FFFFFFFFFFFFF1F3F7FFFFFFFFFFF69 -:10178000FFFFFFFFFFFFFFFFFFFFFFFF1F0FC7C3AD -:10179000FFFFFFFFFFFFFFFFC0C0C0C0E0E0E1E7C9 -:1017A000FF7F3F3F1F1FCFEFFFFFFFFFFFFF3F1DEB -:1017B000FFFFFFFFFFF1F3C7000000C0C0E0F0FC37 -:1017C0000F0F0F0707070303FEFEFEFCFCFCF8C02B -:1017D0000301000000000000000000000000FFFF07 -:1017E000000000000000FFFF00000000000000F00B -:1017F00000000000000000000000000000000000E9 -:10180000FF80808080808081FF01010101010181D2 -:1018100081808080808080FF81010101010101FFC2 -:10182000030F070000000000FFFFF9070707000093 -:10183000FFFFFFFFFFFC003F80F8E0C0000007FF54 -:10184000070707030103FFFFFFFBFDFEFFFFFFFF8D -:1018500000000000010103037FFFFFFFFFFFFFFF08 -:10186000E0E0C0C0C0808000000000000000000177 -:10187000000001070F7F7FFF1F7FFFFFFFFFFFFFBC -:101880000003070F1F3F3F3FFFFEFEFCFCF8F0F098 -:101890000E0000000000000000000000010703002F -:1018A0001F3F7FFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:1018B0000003070F0F1F3F7FFBF7EFFFFFFFFF1F27 -:1018C000FEFCF0F0E0E0C08000000000000000003E -:1018D0001F1F3F3F1F1F0F0F0000000103071F3C8A -:1018E0001F3FFFFFFFFFFFFFF0F0E0E0C0808080C0 -:1018F0001F1F1F3F7F1F0F0F000000000101030388 -:101900007FFEFCF8F0E7DC380000000004860F0FD3 -:1019100001070F1F3F3F3B7FFC80E0F8F8E0E080CD -:1019200001070F1F3F3F3F7F000000000000000045 -:1019300000000000000000000000000000000000A7 -:10194000000000000000FFFFFFFFFFFFFFFFFFFFA1 -:1019500000000000000000F0FFFFFFFFFDFFE3EFCD -:10196000FFFFFFFFFEFEFFFFFFFFFFFCF000000098 -:10197000DFDFBF7F7F79E7FFFFFF1F070301010064 -:101980000000000000000000C0FFFFFFFFFFFEF8A6 -:1019900000000000000000007FFFFFFFF08000005B -:1019A0000080C0F0FEFFFFFFFFFFF000000000001E -:1019B000000000000080E3FFF900000000000000CC -:1019C00000000000000018F8FCFDFFE0000000002F -:1019D00000000000003E7FFFFCF0E00000071F3F1A -:1019E0000001010F3F7FFFFFBF0700000000000064 -:1019F000FFFFFFFFFFFFFFFFFFFC0C000000030FD6 -:101A0000000000000000C0FF1F030000FFFFFFFFF9 -:101A100000000000000000F8FFFFCF00FFFFFFFF05 -:101A2000FFFFFFFFFFFEF8E0000103071F7FFFFF3E -:101A3000FFFFFFF8C00000017BFFFFFFFFFFFFFF7C -:101A4000000000000000000FFFFFFF00FFFFFFFF8E -:101A5000000000000000C0FFFFFFFF3F00E0E0E3E8 -:101A6000FFFF1F3F7F7FFFFFFFFFFFFFFFFFFFFF26 -:101A7000FFDFCFCFE7F3F0E0CFFFFFFFFFFFFFFF78 -:101A8000000000000000FFFFFFFEFFFF001F7FFFC0 -:101A900000000000001FFFFFFF01C0E000FFFFFF8C -:101AA000FFFFFFFFFF00033FFFFFFFFEF9E7FFFF20 -:101AB000FFFFFCE00000FEFFFFFFFF3EFCF3FFFF27 -:101AC000000000033FFFFFFFFFFCF80000FEFFFFE8 -:101AD000000000F0FFFFFFFFFFFF0000000080FF9D -:101AE000FF3F03030100000387C0C00000000000A7 -:101AF000FFFFFFFFFFF0C0800000000000000000BB -:101B0000000000FFF9FEFFFFF0000000000000F3FE -:101B10000000FFFFFF0FF1000000000F3F7FFFFFFD -:101B2000FFFFFFF0000000000000000000000000C8 -:101B3000FFFC000000000103030F1F1F3F7F7F7F9A -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE000000041EBFFFF4836000082D7FFFF26DAF6 -:101BF0005A1A222E16161F19DAECB4B4B4C8F89883 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000010101010303030707000000000069 -:101C60000000007FFF3F3F3F7F7F7F7F7FFFFFFFC1 -:101C7000FFFFFFFFFFFFFFFFFFFFFF00000000006F -:101C8000000000F0F8F8F8F8F8F0F0F0F0E0E0E02C -:101C9000C0C0C080FFFFFFFFFFFEFC00000000008F -:101CA00000000000000000000103070F0F0F1F1FBE -:101CB0001F1F1FBFBFBF3F3F3F3F0F00000000007F -:101CC0000000000000000000FFFFFFFFF9F9F1F342 -:101CD000F3F3E7E7E7FFFFFFFFFFFF00000000006F -:101CE0000000000000000000FEFFFFFFFEFEFEFE01 -:101CF000FEFCFCFDFDF9F9F9F1C000000000000058 -:101D00000000000000000000071F3F3F7F7F7FFFB3 -:101D1000FFFFFFFFFFFFFFFFFFFE78000000000056 -:101D20000000000F0303070FFFFFFFFFCFCFCF8F90 -:101D30009F9F1F1F3FFFFFFF7F3F1F00000000000E -:101D4000000000FCFEFEFEFEFEFCFCFCF9F9FBFBC5 -:101D5000FBF3F3F7F7E7E7E7E7F3F800000000002D -:101D600000000000000000000F3F7FFFFFFFFEFFAC -:101D7000FFFFFFFEFCFFFFFFFFFFFF000000000072 -:101D80000000000000000000FFFFFFFF3F3F7FFF5B -:101D9000FFFFFC0001FFFFFFFFFEF000000000005E -:101DA000000000000000000080C0E0E0E0E0C0C0F3 -:101DB00080800000C0808000000000000000000063 -:101DC0000000000F1F0303030F0F0F1F1F1F1F3FF4 -:101DD0003F3F3F3F7F7F7F7FFFFF7F00000000008E -:101DE000000000FFFFFFFFFFFFFEFCFCFCFDFFFF0C -:101DF000FFFFFFF7F7F3F3F1E1F0F8000000000058 -:101E0000000000FEFFFFFFFFFF7F3F7FFFFFFFFFA0 -:101E1000FEF8FCFEFFFFFFFFFFFFFE0000000000DA -:101E20000000000080E0E0F0F3F7F3F3E7E7C78796 -:101E30000F0F0F0F0FDFDF9F9F1F0F00000000002D -:101E40000000000000000000FCFEFEFEFEFCFCFCAA -:101E5000FCFCF9F9F9FFFFFFFFFBE10000000000C7 -:101E600000000000000000007FFF7F7F7F7FFFFFFA -:101E7000FFFFFFFFFFFFFFFFFFFFFF00000000006D -:101E8000000000000000000087CFE7E7E7CFCFCFDA -:101E90008F9F9F9F1F3F3F3F3FDF8F00000000004D -:101EA0000000000000000000FCFEFDFFFFFCF8F851 -:101EB000F9F9F9F1F3F3E3E3E7F7FB0000000000C1 -:101EC00000000000000000003FFFFFFFFFFFFFFFDA -:101ED000FFFFFFFFFEFEFEFEFCFCFF000000000017 -:101EE00000000000000000009FFFDFDF9FBFBFBFBA -:101EF0003F7F7F7F7FFFFFFFFF7F3F0000000000ED -:101F00000000000000000000F0FBF7FFFFF3E3E338 -:101F1000E7E7E7C7CFCF8F8F9FDFEF00000000001C -:101F20000000000000000000FEFFFFFFFEFEFEFEBE -:101F3000FCFCFCFDF9F9F9F9F1F0FC0000000000EF -:101F40000000000000000000010F1F3F7F7FFFFF27 -:101F5000FFFFFFFFFFFFFFFFFFFF3F00000000004C -:101F60000000000000000000FFFFFFFFCFCF9FFF39 -:101F7000FFFFFF8000FFFFFFFFFFF80000000000F1 -:101F80000000000000000000E1F3F8F8F8F9F1F1BA -:101F9000E3E3030373E7E7C7C78F0F000000000008 -:101FA0000000000000000000FFFFFFFFFFFFFFFF39 -:101FB000FFFFFFFEFEFEFEFCFCFFFE000000000037 -:101FC00000000000000000000FBFBFFFFFFEC08048 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000008080000000000000F1 -:101FF00000000000000000000000000000000000E1 -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4a.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4a.hex deleted file mode 100644 index 0e16cf8b..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4a.hex +++ /dev/null @@ -1,513 +0,0 @@ -:10000000C5D5E56F3AA6E5B7C23C617CCB3FCB12C4 -:100010006722D6E5CDD5627EFE0120083AD8E547B5 -:100020000E1F1811FE0220083AD9E5470E1D1805CB -:10003000CD55600E052AD6E57CD5CD002DD1CB421D -:1000400028022C2C3A74E5B7200406040E00702C0C -:1000500071E1D1C1C9FE073801AFFE0338023D3D51 -:10006000473AD6E5B7C83AD7E5B7280C2B7EFE0746 -:100070003801AFFE0238013D4F2AD6E52D7CC5CDB3 -:10008000D562C17EFE043801AFFE0238013D5F3A01 -:10009000D7E5B7280C2B7EFE043801AFFE023801ED -:1000A0003D6FCB42280D788780834F060021C760C3 -:1000B0000946C9788780835F8783858787814F0654 -:1000C0000021D0600946C9000300141514181B183C -:1000D000000200000303030300020000010301010A -:1000E00003030303010301010002000003030303F0 -:1000F000000200001012101013131313101210102E -:1001000011131111131313131113111110121010D5 -:100110001313131310121010181A18181B1B1B1B83 -:10012000181A1818191B19191B1B1B1B191B191935 -:10013000181A18181B1B1B1B181A18187CCB3FCB3E -:100140001267E5CDD5627EE1CB4220040F0F0F0F81 -:10015000E60F4F427CCD002D2CCB4028022C2C7E6C -:10016000B177E6C0200A2D7EFE0420023600180C6E -:10017000FE4020082D7EFEFD200236FBE1D1C1C9E4 -:100180002100E0545D133600016805EDB0ED5FCD50 -:10019000EC313270E5FD2158E43A8EE5FE19380461 -:1001A000D61818F832B4E66F260029EB210034196E -:1001B0005E23561A32AFE613AF327AE51ACB7F20B0 -:1001C00007FE1FC8327AE5131ACB7F28EFCB7728BA -:1001D000031318F43E013279E51AE61F3278E5324E -:1001E00077E51ACB6F28093E023279E52177E534AD -:1001F000AF3275E5131AE6C0FE8020101AE61F32F2 -:1002000077E52178E5963C3279E518E81AE6C0FEF4 -:10021000C020B51ACB6F2006E61F3275E5131AE62B -:10022000E0FEE020151AE61F3276E5133A76E52166 -:1002300075E5BE38D7CD3F6218F2CD3F6218CD3A92 -:100240007AE5FE04287FFE0B3004FE073042FE06EE -:10025000281D3A79E5B728782177E54E47C53A75E4 -:10026000E569CDD562C13A7AE5770D10F0186121C4 -:10027000FDE47EFE043059344787804F0600217B21 -:10028000E5093A75E57723ED4B77E5702371184062 -:10029000FE08200ECD0B63011800FD0921E9E434AE -:1002A0001821FE09200DFDE5FD2140E4CD0B63FD85 -:1002B000E11810FE072005CD5A631807FE0A200337 -:1002C000CD7463180B3A75E52A78E5CDD56236040E -:1002D0002175E534C92600292929444D29094F06ED -:1002E00000090100E009C91100E43AFCE4B7280D57 -:1002F000471A6F131A67137DCDAA2F10F4C900088F -:100300000D1018000808090B0B0A08FD360A00FE3C -:10031000092008AF320CE53D320BE53E01FD770FB9 -:10032000FD77103A75E5FD7701FD7704878787FD36 -:1003300077073A78E5FD7703FD7705878787FD77AF -:10034000063E06FD7709AFFD7700FD7702FD770ACF -:10035000FD770CFD770DFD770EC921FCE47EFE20B4 -:10036000D034874F06002100E4093A75E577233A37 -:1003700078E577C92170E57EB7200C3A78E53272CE -:10038000E53A75E53271E535C91FCB113AFDE43226 -:1003900069E5DD217BE52169E57EB7C835DD7E00B5 -:1003A000DD6601878787CB3C1F6F1110D019DD7E7A -:1003B00002DD96013C47CB41280836172C2C361716 -:1003C000180636102C2C36142D2D1180001910E62D -:1003D000110300DD1918BF3ACDE54F87816F260064 -:1003E0002929292922F6E42130640600097E32F801 -:1003F000E4213964097E32F5E4214264097E32FB4E -:10040000E479E6073C4F213064097E326EE52142F3 -:1004100064097E326FE53A8EE5CDEC314F0600215E -:100420004B64097E32D8E5214E64097E32D9E5C994 -:100430000004080E0A070F0500000001000100007B -:100440000100000101010001010001090A080D0E6F -:100450000CAF3289E57EB7C83D202423EB1A6F1319 -:100460001A13D5CB3FCB105D57D5CD002DD1CB4046 -:1004700028022C2CEB7CCDD562E5DDE1E118D63DE0 -:100480002008237E3288E52318CB06013D20142363 -:100490004623CB78280D780630E67FFE0238043DEF -:1004A0003289E53A88E5E60FCB4B280E4FDD7E001A -:1004B000E6F0B1DD7700DD23180E0F0F0F0F4FDDD3 -:1004C0007E00E60FB1DD77007E12133A88E5E6F094 -:1004D00012137BFE7020021E90FEF020031E1014EB -:1004E00010C13A89E5B728083D3289E5063018B3CE -:1004F00023C35564C7C7C7C7C7C7C7C7C7C7C7C709 -:100500002136D5111F68CD2D303E24CD3E30DB0481 -:10051000CB57282DDB030F0FE63CC61021FA655F91 -:100520001600195E235623D57E23666F11B0D6EBD5 -:10053000CD2D303E24CD3E30D121B0D7CD2D301839 -:1005400039DB03070707F5E6065F160021FA651990 -:100550005E235623F1D50707E606C6085F1600217D -:10056000FA65197E23666F11ACD6EBCD2D303E2493 -:10057000CD3E30D121ACD7CD2D300606C52136D5A4 -:10058000112D68CD2D303E0CCD3E302136D5111FBA -:1005900068CD2D303E18CD3E30C110E0C93A57E449 -:1005A000FE01200B2128DA113B68CD2D30184A3A84 -:1005B00057E4FE0220160EC6213CDB115568CD2DF6 -:1005C0003021BCDB115A68CD2D30182D3A57E4FE8E -:1005D00003200B21B2DC115F68CD2D30181B3A5778 -:1005E000E4FE0420140EC621B6DD116F68CD2D3057 -:1005F0002136DE117A68CD2D30C9C667DC67F26717 -:1006000008681E6887679C67B1671E681E681E6859 -:100610001E681E681E681E6828671E683B671E6885 -:100620004E671E6861671E6874671E681E681E68D4 -:100630001E685C664A6681666F66A6669466CB66CF -:10064000B966F066DE6615670367203620434F49BA -:100650004E53203120504C415945520031322043F5 -:100660004F494E53203220504C415945525300209F -:100670003520434F494E53203120504C415945526B -:1006800000313020434F494E53203220504C4159C5 -:1006900045525300203420434F494E5320312050BF -:1006A0004C4159455200203820434F494E53203287 -:1006B00020504C415945525300203320434F494E5E -:1006C00053203120504C4159455200203620434F91 -:1006D000494E53203220504C41594552530020324C -:1006E00020434F494E53203120504C415945520030 -:1006F000203420434F494E53203220504C4159451D -:10070000525300203120434F494E20203120504C7D -:100710004159455200203220434F494E5320322048 -:10072000504C415945525300203120434F494E20EF -:10073000203620504C415945525300203120434F20 -:10074000494E20203520504C41594552530020310C -:1007500020434F494E20203420504C41594552539C -:1007600000203120434F494E20203320504C415926 -:1007700045525300203120434F494E202032205013 -:100780004C41594552530041202D203320434F49BD -:100790004E53203120504C415945520041202D20CC -:1007A0003220434F494E53203120504C415945523D -:1007B0000041202D203120434F494E202031205030 -:1007C0004C415945520042202D203120434F494E83 -:1007D00020203620504C41594552530042202D20B4 -:1007E0003120434F494E20203520504C415945522D -:1007F000530042202D203120434F494E20203320EA -:10080000504C41594552530042202D203120434F36 -:10081000494E20203220504C41594552530000028D -:10082000494E534552542020434F494E0002202048 -:100830002020202020202020202000064031393890 -:10084000342020204952454D20434F52504F5241B1 -:1008500054494F4E00808284860081838587000240 -:100860004C4943454E534544202046524F4D006865 -:100870006A6C6E70727476787A00696B6D6F7173E2 -:100880007577797B00CD5E5F3EFF32D1E5CD286D77 -:100890003EA8CD3E303E0132A9E5CD5E5FC3CF25F7 -:1008A0003100E82110D03600545D13015715EDB02A -:1008B000AF32A7E5329DE5326AE5FB3E5032B5E541 -:1008C00021B5E57EFE14380B2136D5119169CD2D69 -:1008D000301812B7200236282126D53600545D1371 -:1008E000013500EDB011A0693AB2E5FE02380311FE -:1008F000B2692134D7CD2D30CD7F6921AAE57EE6BE -:100900000AFE0A200E3AB2E53D2732B2E5AF32B711 -:10091000E5181B7EE605FE05C2C0683AB2E5FE0298 -:10092000DAC068D6022732B2E53E0132B7E5AF320F -:10093000B9E532B8E53290E53296E53C32B2E6CB25 -:10094000412006328EE53294E53AE0E5328FE53219 -:1009500095E52100002291E52292E52297E5229873 -:10096000E5218000DB04CB4720022D2D22E3E52189 -:1009700010D33600545D13017F09EDB0C30F5D2124 -:1009800042DC11C669CD2D300E0211B2E5CD5F30CB -:10099000C90450555348202020425554544F4E000E -:1009A000044F4E4C59202002312004504C415945EF -:1009B0005200023120044F52200232202004504CB9 -:1009C00041594552530004435245444954200006BE -:1009D0003153542020424C4F434B002130D3118FD0 -:1009E0006ACD2D303E22CD42313E0A3288E53E3876 -:1009F00032B6E53E5032B5E521B6E57EB720093680 -:100A0000382188E535CA896A21B5E57EFE14381C8F -:100A10003AB2E5B7200B2124D511A16ACD2D3018AB -:100A2000092124D511C66ACD2D301812B7200236FF -:100A3000272124D53600545D13013500EDB0CD7F5C -:100A400069213AD911BE6ACD2D300E063A88E53DAE -:100A5000CD6A3021AAE57EE60AFE0A28077EE60571 -:100A6000FE0520223AB2E5B7CAF869D6012732B2AC -:100A7000E5AF3290E53AE0E5328FE52100002291C2 -:100A8000E52292E51803C3F8693E00CD4231C9035F -:100A9000544F20434F4E54494E55452047414D45F4 -:100AA0000004494E5345525420434F494E20414E75 -:100AB00044205055534820425554544F4E0003543F -:100AC000494D452020000420202020205055534827 -:100AD00020535441525420425554544F4E2020200C -:100AE0002020003E13CD4231CD5E5F3A90E5FE02FC -:100AF0002026AF32B2E6CDA86BCDDB693E0132B223 -:100B0000E63A90E5FE0020102110D33600545D1324 -:100B1000017F09EDB0C30F5D3AB7E5FE0028073A43 -:100B200096E5FE02202E3A90E5FE0228102110D311 -:100B30003600545D13017F09EDB0C30F5DCD5E5FDC -:100B4000AF32B2E632B9E53E01CD3E303E0132A7CA -:100B5000E5C3CF252110D33600545D13017F09ED85 -:100B6000B021B8E57EB720033418023600CD966B6D -:100B7000DB04CB4F281D21B9E5CB462003341801F7 -:100B800035E601AE21800020022D2D22E3E53E0155 -:100B9000CD3E30C30F5D218EE51194E506061A4E59 -:100BA000777912231310F7C90E00161521E5E50613 -:100BB0000009DD2191E50603DD7E00BE3812280B19 -:100BC000153E0A814FFEC8280718E1DD232310E8EF -:100BD0007A32D1E579B7C8D60A11E5E528084F067B -:100BE0000021EFE5EDB02191E5010300EDB0626B6E -:100BF000360013010500EDB03A8EE512CD286D21C7 -:100C0000B8D211226DCD2D30DD2AD2E5111600DDCE -:100C100019FD2AD4E5FD23FD23FD230E411E033ECD -:100C2000143288E521C2D2C50E063A88E5CD483097 -:100C3000C106043E0E32B6E5AF3289E53AD0E5B7DB -:100C400020035718447AB720133AD0E5FE0A20044F -:100C5000140C1806FE052002150D181F3AD0E5FEEB -:100C6000AA200B147AFE1820030C160C180DFE5542 -:100C70002009157AFEE820030D16F479FE5D38028E -:100C80000E4179FE4130020E5C3ACFE5FE052804A4 -:100C9000FE0A20212189E53AB6E5BE38183C77796D -:100CA000FE5C283DFD7100FD23DD71000E41DD235A -:100CB000DD231D282CCB402805DD71001803DD71D4 -:100CC000003AAAE5B7201A3E01CD3E303AB6E5B764 -:100CD000C23C6C05C2336C2188E5357EFEFFC22420 -:100CE0006CDD3600003E38CD3E303E13CD4231CD76 -:100CF0005E5FC90342455354202006323020200352 -:100D0000504C41594552530002204E4F2E53434FF1 -:100D100052455320204E414D4520524F554E4420C0 -:100D200020000254494D450021B0D111F36CCD2D66 -:100D3000302190D311086DCD2D3011086DCD2D309F -:100D400011E5E521C2DD3AD1E54F061478FE0A200F -:100D5000032192DDB9200722D2E5ED53D4E5C5E5A4 -:100D6000410E02B820020E06FE0A30072C2CCD6A76 -:100D7000301803CD48302C2C79FE0220020E0406D8 -:100D800003CD5F3010FB2C2C2C2C06031A772C7112 -:100D90002C1310F87DC6066F1313131ACD483013A9 -:100DA000E1C12510A7C9010300119AE5217B6EED71 -:100DB000B001C80011E5E521BD6DEDB0C90101002C -:100DC000535445202020010103504F494E2020203C -:100DD00001010880454845202020020110304D497E -:100DE00054202020010121504141542020200101A4 -:100DF0002350474E41202020020128004F41592016 -:100E00002020020138704E52412020200201601043 -:100E10004F4957202020020189904B484F20202025 -:100E200002026600484E49202020020277505341BA -:100E30004F20202002031250554859202020020341 -:100E400033004253412020200303650041495720CD -:100E50002020030370504B414520202004038800CC -:100E60004D4B4D20202003040150454941202020B6 -:100E700003043200524B4720202003048540494997 -:100E80004F20202004F9FFFFFFFFFFFFFFFFFFFFC0 -:100E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 -:100EA000FFFFC7C7C7C7C7C7C7C7C7C7C7C7C7C762 -:100EB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C2 -:100EC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B2 -:100ED000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A2 -:100EE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C792 -:100EF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C782 -:100F00003100E8110020CD2D6F227400CD2D6F220D -:100F10007600CD2D6F227800110000CD2D6F22724A -:100F20000011FFFFEBA7ED5222700018FE01002018 -:100F30002100001A856F3E008C67130B78B120F3F7 -:100F4000C9F3ED463100E8DD214E6FC390720E0506 -:100F50003EFFED790CED790CED792100E13600547E -:100F60005D1301FF01EDB0FB0100800B79B020FBA8 -:100F7000F3AF5F16202100E00E10060077233C152A -:100F8000280710F80D20F3180516203C18F47B16DE -:100F9000202100E00E100600BEC29571233C1528EA -:100FA0000710F50D20F018053C162018F47B3CFEC8 -:100FB0000F20BF3100E8CDF277AF3201E016200EEE -:100FC000102100D0060077233C15280710F80D20CB -:100FD000F318053C162018F43A01E016202100D041 -:100FE0000E100600CD3572233C15280710F60D2093 -:100FF000F118053C162018F43A01E03CFE0F20BA27 -:10100000DD21BF70CD9072210F7ADD21BF70CD2818 -:1010100071CDAF70CDF2773E033201E7CD9E793EC0 -:10102000013200E33202E3DB002F0F0F30F93E0301 -:101030003201E7CDB67721AA7BCDD5773A01E70615 -:1010400006CD4A7DCD9579CD9579DB002F0F3014F3 -:101050003A01E7074F0600DD21987BDD09DD6601D7 -:10106000DD6E00E9CD9E79CD9E79CD9579CD9579CE -:10107000DB012F0F38050F381C18C93A01E7FE08AD -:10108000CA44700604CD4A7DC6013201E70606CD8A -:101090004A7DC344703A01E7FE03CA44700604CD9A -:1010A0004A7DC6FF3201E70606CD4A7DC344701172 -:1010B0000000AF3200E70604C5CDC070C110F9C909 -:1010C00021000006201A853001246F1C20F714101F -:1010D000F4D5E53A00E721720087856F5E2356E17B -:1010E0007ABC20097BBD2005212F7A180321387A8C -:1010F0001183E7010900EDB011000121A0D13A00F0 -:10110000E7A72804471910FD2281E73E083280E74F -:101110003A00E7C6303286E72100E7342180E7DD78 -:1011200021BF70CD2871D1C97E23FE0028125E2315 -:1011300056234F7E12133E041223130D20F518E898 -:10114000DDE90F0F0F0FE60FC630FE3A3802C60773 -:10115000FD7700FD360104DDE9E60FC630FE3A38C2 -:1011600002C607FD7700FD360104DDE9F50F0F0F1C -:101170000FE60FC630FE3A3802C607FD7700FD368F -:101180000104F1E60FC630FE3A3802C607FD7702C9 -:10119000FD360304C908D9DD219E71C31572211BD8 -:1011A0007ADD21A871C32871D9FD21B8D0DD21B520 -:1011B000717CC34271FD23FD23DD21C1717CC359C4 -:1011C00071DD21CD717DFD23FD23C34271DD21D968 -:1011D000717DFD23FD23C3597108D9FD23FD23FD36 -:1011E00023FD23DD21EB715FC34271FD23FD23DD70 -:1011F00021F7717BC3597108D9FD23FD23FD23FD20 -:1012000023DD2109727EC34271FD23FD237EDD2192 -:101210002372C359712101D001FF0F3600545DEDD7 -:10122000B0DDE9CD9E79DB000F38060FDAB36F1819 -:10123000F208C39C6FBEC8F5E5DD214072C3907211 -:10124000211B7ADD214A72C32871E1FD21B8D07CCF -:10125000CD6C71FD23FD23FD23FD237DCD6C71F14C -:10126000F5FD23FD23FD23FD23CD6C71FD23FD231F -:10127000FD23FD237ECD6C71CD9E79CD9E79DB0063 -:101280000FDA89720F380418EFF1C9F1C1C3007089 -:101290002101D001FF073600545D1313CDA779213A -:1012A00000D001FF073600545D1313CDA779DDE9A7 -:1012B0003EFFD305CDB67721417ACDD577DB03212B -:1012C000AED1CD3376DB0421AED2CD3376CDE47210 -:1012D000CD7273CD9579CD9579DB00EEFF0F0FDAE6 -:1012E000337018D9218774CDD577CDB073DB04EE78 -:1012F000FFCB57284B21FC73CDD577DB03EEFF0FD7 -:101300000F0F0F110000219073010005E60F200A56 -:10131000195E23666BCDD57718250C1C1CB92002ED -:1013200018EE10F60108051C1CB9200218090C1053 -:10133000F6FE0F200A1C1C195E23666BCDD577C9FB -:10134000212A74CDD577DB03EEFF21A873110000AD -:101350000F0F0F0FE60F28111C1CFE08280B1C1C7A -:10136000FE0A28051C1CFE0FC0195E23666BCDD536 -:1013700077C9DB042F0F0F3813AF8721AE74856F49 -:101380003E008C675E23666BCDD577C93E0118EAB7 -:10139000D274E374F574077519752B753D754F7527 -:1013A0006175737585759775A875CB75EE75117632 -:1013B000DB03EEFF47E6032825FE012826FE022870 -:1013C00027214774CDD577780F0F47E603281EFEF7 -:1013D00001281FFE022820215274CDD577C921573C -:1013E0007418E121677418DC21777418D7216274AE -:1013F00018E821727418E321827418DE0B92D3432B -:101400004F494E204D4F444520200B12D420202020 -:1014100020202020202020200E30D420202020201A -:10142000202020202020202020000B92D3434F4951 -:101430004E204D4F444520410B12D4434F494E207E -:101440004D4F44452042000730D6313535205345B5 -:10145000430001B0D635000730D63138302053452F -:10146000430001B0D633000730D631373020534522 -:10147000430001B0D632000730D631363020534514 -:10148000430001B0D634000912D5424F44592054CC -:101490005950450912D6504C41592054494D450BDD -:1014A00092D6434F4D4D414E444F4D454E00B27480 -:1014B000C2740C30D55441424C45205459504520FB -:1014C00020000C30D55550524947485420545950AB -:1014D00045000DB0D33120434F494E203120504CB0 -:1014E0004159000EB0D33220434F494E5320312092 -:1014F000504C4159000EB0D33320434F494E532036 -:101500003120504C4159000EB0D33420434F494E46 -:1015100053203120504C4159000EB0D33520434F59 -:10152000494E53203120504C4159000EB0D3362043 -:10153000434F494E53203120504C4159000EB0D3F7 -:101540003120434F494E203220504C415953000E18 -:10155000B0D33120434F494E203320504C41595392 -:10156000000EB0D33120434F494E203420504C411F -:101570005953000EB0D33120434F494E20352050EF -:101580004C415953000EB0D33120434F494E2036C1 -:1015900020504C415953000EB0D3202020204652F9 -:1015A00045452020202020000EB0D33120434F4954 -:1015B0004E203120504C4159200E30D43120434F21 -:1015C000494E203220504C415953000EB0D33220A6 -:1015D000434F494E53203120504C41590E30D431A5 -:1015E00020434F494E203320504C415953000EB0F8 -:1015F000D33320434F494E53203120504C41590E94 -:1016000030D43120434F494E203520504C4159535E -:10161000000EB0D320202020465245452020202017 -:10162000200E30D43120434F494E203620504C41BB -:10163000595300EEFF06082336042B0F38043630CA -:10164000180236312323232310EDC9CDB6772100AC -:10165000D0110508010008722373230B78B120F71D -:101660002100E11101E13600010001EDB0FB21A3F1 -:10167000761100E1012000EDB0CD9579CD9579CDC1 -:101680009579DB002F0F0F30F02100E11101E136D9 -:1016900000010001EDB0CD9579CD9579CD9579F327 -:1016A000C333701300C0001080A00013004001106D -:1016B00000A0001300C00010C06001130040011022 -:1016C00040600100030080001000800003008000E3 -:1016D00010018000030180001000800003018000E1 -:1016E0001001801100C0010001EDB0C92100E1111D -:1016F00001E13600010001EDB0AF3206E3676F2271 -:101700000DE7CDB67721DF7ACDD577FB0608DB0074 -:101710002F21C0D2CD38770608DB012F21C0D4CDD0 -:1017200038770608DB022F21C0D6CD38770608218E -:1017300040D17BCD387718142336042B0F3804366C -:1017400030180236312323232310EDC9CD95773A83 -:101750000DE721C0D7CD78773A0EE7CD7877CD9ECB -:1017600079CD9E79DB012F0F0F3802189EDB002FF9 -:101770000F0F3097F3C333702336042BF50F0F0F81 -:101780000FE60FC6307723232336042BF1E60FC66E -:1017900030772323C9210FE73A09E0E6C0BEC832FB -:1017A0000FE73A0EE7C60127320EE7D03A0DE7C63B -:1017B0000127320DE7C92100D001FF073600545D33 -:1017C0001313CDA7792101D001FF073600545D1313 -:1017D00013CDA779C97EFE00C8CDDE7718F74E0677 -:1017E00000235E2356237E123E04131213230D2082 -:1017F000F5C92100E00E06AF06007710FD0D20F8B8 -:10180000C90E00060010FE0D20F93D20F4C9C5E503 -:10181000772310FCE10E2009C10D20F2C9CDB67767 -:10182000CD3678CD9579CD9579CD9579DB002F0F93 -:101830000FDA337018ED2100D001FF0F3E867723B9 -:101840000B78B120F7210CD00610E5C5CD7178C119 -:10185000E11100011910F3064021BFD77EB07723B4 -:10186000237EB077118000197EB0772B2B7EB07766 -:10187000C90619CD7D782323232310F7C9E53E033C -:101880007723233E0277E1E5118000193E0177239B -:10189000233E0077E1C9F3CDB67721B379CDD57773 -:1018A000CD9579CD9579CD9579DB002F0F3802183C -:1018B000EC110146CD8579CD9579CD9579CD957988 -:1018C000DB002F0F380218E913CD8579CD9579CD3E -:1018D0009579CD9579DB002F0F380218EF13CD8560 -:1018E00079CD9579CD9579CD9579DB002F0F38029B -:1018F00018EC3E102110D00E031101460610732380 -:10190000722310FA130D20F4112000193D20E83E37 -:10191000031101520E0406307323722310FAD511FD -:10192000200019D10D20EF133D20E91101490E04CB -:1019300006307323722310FAD511200019D10D201F -:10194000EFCD9579CD9579CD9579DB002F0F3802C4 -:1019500018A0CD9579CD9579CD95793E01D301CD5E -:101960009579CD9579CD9579DB002F0F30F1AFD3F7 -:1019700001CD9579CD9579CD9579DB002F0F0FDAD3 -:101980003370C371792100D0010008732372230BD7 -:1019900078B120F7C90100400B78B120FBC90100E4 -:1019A000900B78B120FBC97E12232313130B78B15F -:1019B00020F5C90EA0D141204220432044204520DB -:1019C000462047200E20D2482049204A204B204C58 -:1019D000204D204E200EA0D24F20502051205220CA -:1019E0005320542055200E20D356205720582059DC -:1019F000205A202020202014A0D331203220332050 -:101A00003420352036203720382039203020000877 -:101A1000A0D052414D2020204F4B0010A0D0524169 -:101A20004D2020204E472020282020202029005211 -:101A30004F4D2020204F4B00524F4D2020204E472D -:101A40000016A0D044495020535720312032203373 -:101A50002034203520362037203803A0D153573189 -:101A600003A0D2535732000198D2201BC4D22020A9 -:101A70002020202020202020202020202020202066 -:101A8000202020202020202020000CA0D0494E54CF -:101A9000455246414345204F4B00A07AB57ACA7A59 -:101AA00011A0D0434845434B20494E54455246412E -:101AB000434520310011A0D0434845434B20494EB7 -:101AC0005445524641434520320011A0D043484579 -:101AD000434B20494E544552464143452033000A6A -:101AE00020D1575249544520444154410C20D249F9 -:101AF0004E544552464143452031200CA0D220206F -:101B0000205245414420444154410C20D4494E5474 -:101B10004552464143452032200CA0D4202020527B -:101B200045414420444154410C20D6494E5445522D -:101B3000464143452033200CA0D620202052454169 -:101B40004420444154410F40D230203120322033D0 -:101B500020342035203620370F40D4302031203239 -:101B6000203320342035203620370F40D630203126 -:101B70002032203320342035203620370F40D1301A -:101B8000203120322033203420352036203706A063 -:101B9000D754494D494E4700000000000000B07284 -:101BA000EC765E7C4B7696781D780D20D130312016 -:101BB000444950205357495443480BA0D130322058 -:101BC000492F4F20504F52540820D2303320534FCA -:101BD000554E440CA0D23034204348415241435426 -:101BE00045520820D3303520434F4C4F5216A0D3D6 -:101BF00030362043524F53532048415443482050DD -:101C000041545445524E007CB8C07DB9C921008072 -:101C1000010008AF77230B78B120F8C972230B7845 -:101C2000B120F9C97223230B78B120F8C908D9C3B0 -:101C3000397CC7C7C7C7C7C7C72109E034CD527CA5 -:101C40003A02E30F38072106E33E808677C9D908B8 -:101C5000FBC92100E11100C0010001EDB0C9CDB602 -:101C60007721B97DCDD5772A9C7D2206E7DD210835 -:101C7000E7FD21A07DCD9579CD9579CD9579CD8B59 -:101C80007CDB002F0F0FDA337018D3FD220BE73EF9 -:101C9000013205E70606CD507DCDE57CCDCF7C0138 -:101CA0000000ED4313E3DB002F0F0F3004C1C333FB -:101CB00070DB002F0FDCCF7CDB012F0F38340F38A7 -:101CC0005DED4B13E30B78B120D8CDE57C184F3A8E -:101CD00005E74F0600FD2A0BE7FD09FD7E00D30056 -:101CE000F680D300C93E00D3003E80D3000600102A -:101CF000FEC9CDE57CCD9579CD9579CD95793A071D -:101D0000E75F3A05E7BBC80604CD507D3D3205E7E5 -:101D10000606CD507DCDCF7C010000C3A27CCDE571 -:101D20007CCD9579CD9579CD95793A06E75F3A05E1 -:101D3000E7BBC80604CD507D3C3205E70606CD5012 -:101D40007DCDCF7C010000C3A27C4FD6033C181789 -:101D50004FC52120D1118000470528031918FAC169 -:101D6000237023237079C9C52120D111800047FE3B -:101D7000012804051910FDC1237023237079C9C5FA -:101D80000E00060010FEF53A00D0CB4F2809F10DE9 -:101D900020F03D20EBC1C9F1C10601C915010000C9 -:101DA000000102030405061C111213141520212240 -:101DB0002324252627000000000BA0D053204F200D -:101DC00055204E204420530F20D1303120484F4C15 -:101DD000452044494747494E4715A0D1303220504D -:101DE00049434B494E4720555020464F5254494E87 -:101DF000450F20D2303320444F4F52204F50454E94 -:101E0000494E4713A0D23034204255524945442010 -:101E1000494E544F20484F4C451420D3303520466E -:101E2000414C4C494E4720494E544F20484F4C4559 -:101E300010A0D3303620504C41594552204B494CCC -:101E40004C45441220D430372054494D452055503C -:101E5000205741524E494E4716A0D430382054499D -:101E60004D452053434F524520434F554E54494E04 -:101E7000471120D5303920434F494E20494E534514 -:101E80005254494E470FA0D53130205A4F4F4D2064 -:101E9000494E20202020200F20D63131205A4F4F8C -:101EA0004D204F55542020202016A0D631322050EE -:101EB0004C415945522046414C4C494E4720202028 -:101EC00020200D20D731332047414D452053544128 -:101ED00052540CA0D731342047414D45204F564530 -:101EE000521B20D831352042474D2028434F4E54B5 -:101EF000494E5549545920444953504C4159290E93 -:101F0000A0D8313620524F554E4420434C454152C3 -:101F10000E20D9313720424C4F434B20434C454192 -:101F2000520DA0D931382054494D4520555020201C -:101F3000201220DA31392042474D202847414D45B3 -:101F400020504C41592912A0DA32302047414D45EA -:101F500020434F4D504C4554494E470C20DB202028 -:101F60004D5553494320454E4420000000C7C7C784 -:101F7000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F1 -:101F8000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E1 -:101F9000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D1 -:101FA000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C1 -:101FB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B1 -:101FC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A1 -:101FD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C791 -:101FE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C781 -:101FF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C771 -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4b.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4b.hex deleted file mode 100644 index 534377e2..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4b.hex +++ /dev/null @@ -1,513 +0,0 @@ -:10000000E7ADCEF6B6C1E7B9C9F4A58AC1AE92C1D3 -:10001000B89DC1B8C7A587C9CCB198C9AF9CD60255 -:10002000B1C2E8BEC0F7BA9DC704A2C1E8CFF6A529 -:10003000C2E8AAC9EDB2CBF503A59DC0AC90C2A998 -:100040008DC8B198CAB99DD5A59AD706A184D707FE -:10005000A4D0D5A6CAD2A8C3C5B5CDD2B8C6BCCD8A -:1000600008A5D4AAD3AEC5BBD009B3C50AA8D1B6DA -:10007000C4B6C70D87CACB0F9DC2E6D71F0101A822 -:1000800095C0E5D1F7AA95C8EEA5C8EEB9C1E5C8F7 -:10009000EED1F6BEC0F7A284CB00AE91C1C2D6D7D6 -:1000A000B4C4D2D3CB04A2C0E5D1F7A7C8EE03A550 -:1000B0009AC6D0B99DC0D706A184C6D007A3C0D721 -:1000C000B0C2D6B4C4CBD2D3BCC4D308A7CBB6CAB3 -:1000D000CC09BBCB0AB9C9CBCD0E91C1C2D6D71FB3 -:1000E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A0 -:1000F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C790 -:10010000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77F -:10011000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C76F -:10012000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C75F -:10013000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C74F -:10014000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C73F -:10015000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C72F -:10016000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C71F -:10017000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C70F -:10018000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FF -:10019000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7EF -:1001A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DF -:1001B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CF -:1001C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BF -:1001D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AF -:1001E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79F -:1001F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78F -:1002000002C002C1C406C204080808080C000000AD -:10021000C8C610000C0E0C0E000000000ACACA026C -:10022000CA0A08080000000000000000C406C2045A -:1002300020AC20AE00000000161616161C1E1C1E58 -:10024000B4000000B4B5B4B516181A20181A20204E -:100250001A18161600000000000000001412B0B2B8 -:10026000A09C9EA000000000A6A6A6A6A1A0A1A0FA -:10027000A0000000A0A1A0A1A6A6A0A0A6A6A6A03E -:10028000A6A6A6A60000000000000000A238A43622 -:1002900092908E00000000003A3A3A3A9899989964 -:1002A0009900000098999899989992923C3C3C3C0E -:1002B0003C3C3C3A000000000000000094969496FC -:1002C000B6BAB6BAE6E8EAEC222222222424242492 -:1002D000EE000000EEEFEEEFE4E2B6B6E2E4B6B612 -:1002E000E4E2222200000000000000000000000004 -:1002F000DDDEDFDE00000000DEA7DEA7404040407C -:10030000BF000000DDBFDDBFDD3EBCDFA7DEA7DE36 -:10031000DEA7DEA7DD34DD00DD34DDDDDEDFDEDDA2 -:1003200080848200000000008A8A8A8A2A2A2A2A77 -:100330008C0000008C8D8C8D8C8482808A8A8A8AC5 -:100340008A8A8A8A00000000000000008628882629 -:10035000CECCCECC30323032CECFCECFCECFCECF31 -:10036000CF000000CECFCECFCECFCECFCECFCECF10 -:10037000CECFCECF2C2E30002E2CCE000000000091 -:10038000D0D1D0D100000000D4D4D4D4D4D4D4D48B -:10039000D8000000D4D4D4D4D8D0D100D4D4D4D46C -:1003A000D4D4D4D4D1DBD9D5D5D9DBD1D5D7D5D7F1 -:1003B00000000000414041400040004000000000BB -:1003C00001010000000040400000000000010100A9 -:1003D000010000000000000000000000414041401A -:1003E000000100010000000000400040000000008B -:1003F00000000000000000000040000000000000BD -:1004000000000000000000000000000040404141EA -:1004100000010100000000000040004000004040DA -:10042000000000000000404040400000004000008C -:10043000004000000000000000000000414041407A -:100440000101010000000000004000400000000029 -:10045000000000000000000000000101004000005A -:100460000040000000000000000000004141414148 -:1004700001010101414141410040004000000000F4 -:100480000000000000000000010101010101010164 -:10049000010100000000000000000000000000005A -:1004A000004001000000000000404000004000400B -:1004B000000000000000004000000101000040407A -:1004C000000040400040000000000000C08180802B -:1004D0000101010000000000014101410000000095 -:1004E00000000000000000000001010101410101C5 -:1004F00001410101000000000000000041404140B6 -:1005000040414041000000000000000000000000E9 -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000010001000000000040004000004040B9 -:1005400000000000004000400000010000400040AA -:100550000040004001010101010101010100010011 -:10056000FE00FE000000000000000000000000008F -:1005700000000000000000000000000000FEFE007F -:10058000FE0000000000000000000000000000006D -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C00000F5FC000000000000000000000000003A -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F000FAFCF50000000000000000000000000010 -:1006000000000000000000000000F8F800000000FA -:10061000000000000000000000000000FCFCFCFCEA -:10062000FFFFFFFF000000000000000000000000CE -:1006300000000000000000000000FFFF0101FFFFBC -:1006400001010000000000000000000000000000A8 -:100650000000FE000000000000000000000000009C -:10066000000000000000000000FC00FE0000000090 -:10067000000000000000000000000000000000007A -:10068000FDFDFD0000000000F808F8080000000073 -:10069000000000000000000000FDFDFDF808F8F873 -:1006A000F808F8F800000000000000000300030054 -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E00000FC00FC00000000000000000000000012 -:1006F00000000000000000000000FC0000000000FE -:1007000000000000FCF8F8FCFCF8F8FCFC00FC0021 -:1007100000000000FD00FD000000000000000000DF -:10072000F0FF0000000000000000000000101000BA -:10073000100000001010101010101010FD00FD002F -:1007400000FF00FF000000000000000000000000AB -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000FEFE8D -:100770000010100000000000000000000000000059 -:100780000000000000000000000000000000000069 -:10079000000000000000000000000000FE0001005A -:1007A0001010100000000000000000000000000019 -:1007B0000000000000000000000010100000000019 -:1007C0000000000000000000000000000404040419 -:1007D000020202020101010100000000000000000D -:1007E00000000000000000000202020202020200FB -:1007F00002020000000000000000000000000000F5 -:1008000010101010000000000000000000000000A8 -:1008100000000000000000000000081000000000C0 -:1008200000000000000000000000000000100000B8 -:100830001010100000000000101010100000000048 -:100840000000000000000000001010101010101038 -:100850001010101000000000000000000400040050 -:100860001010101000000000000000000000000048 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890001010101000000000000000000000000018 -:1008A0000000000000000000101010100000000008 -:1008B0000000000010101010101010101010101078 -:1008C00000FF00FFF800F80000000000000000003A -:1008D00000F800000000000000000000040000001C -:1008E000000400000000000000000000F800F80014 -:1008F00000FC00FC00000000000000000000000000 -:1009000000000000000000000008080008090000C6 -:100910000808000000000000000000000000F8F8D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000004000000000000B3 -:10094000000000000000000000000000F800F800B7 -:100950000000000000000000000000000000000097 -:10096000000000000000000000040000040407076D -:10097000040404000000000000000000F8F8F8F88B -:10098000FCFCFCFCFCFCFCFC000000000000000087 -:100990000000000000000000F9FDFCFCFDFDFC0073 -:1009A000FDFD00000000000000000000000000004D -:1009B0000000000000000000000000000000000037 -:1009C00000000000000000000000F800000000002F -:1009D000000000000000F800F8000000F9F9F9F943 -:1009E00000FFFF0000000000000000000000000009 -:1009F00000000000000000000004FF0000000303EE -:100A00000000FDFD0000000000000000F808F808EC -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A6000000000000000FCF8F8FC0000F8F9F8F9BC -:100A70000000000008000800000000000000000066 -:100A8000000800000000000000000000000000005E -:100A90000000000000000000000000000800080046 -:100AA000000400040000000000000000000000003E -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000080816 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000008000800E6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000005050505B1 -:100B300004040404FCFCFCFC0000000000000000B5 -:100B4000000000000000000007070404070704007D -:100B50000707000000000000000000000000000087 -:100B60000000000000000000000000000000000085 -:100B7000000000000000000000000800000000006D -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000001000100015 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C2000040C07010807010008070100000000008C -:100C30000000000006060606080808010A06000073 -:100C40000A06010000000000000000000708090774 -:100C5000080801000606060106060601000000005D -:100C60000000000005040303080801000606060052 -:100C70000606060100000000000000000304030453 -:100C8000080801000A0600000A0601000000000032 -:100C90000000000000000000080606040505050528 -:100CA00005050505060804000608040004030404FD -:100CB00008080400060606000606060000000000FC -:100CC00000000000050505050808080205050500E7 -:100CD00005050500040404000404040000000000ED -:100CE000080C0800050505000505050004040404BA -:100CF0000404040405050505430320FFA3FFA3FF27 -:100D0000A2FFA2FF000000000000000000000000A1 -:100D10008383A3FFA3A3FFFFA2A2FFFF00000000A5 -:100D2000000000000000000043A0FFFFA3A3A3FFFA -:100D3000A2A2A2FF000000000000000000000000CE -:100D400043A0FFFFA3A3A3FFA2A2A2FF00000000F5 -:100D5000000000000000000043A0FFFFFFFFFFFFB6 -:100D6000A2A2FFFF00000000000000000000000041 -:100D7000FF832020A3A3A3A3A2A2A2A2FFFFFF00A0 -:100D8000FFFFFFFF0000000043A0A0FFA3A3A3FFFD -:100D9000A2A2A2FF0000000000000000000000006E -:100DA00003232020232323FF222222FFFFFFFF0013 -:100DB000FFFFFF0000000000FF0320FF232323FFAD -:100DC000222222FFFFFFFFFFFFFFFFFF00000000C6 -:100DD0000000000000000000000000000000000013 -:100DE00000000000070607060004040200000000DF -:100DF00000000000000000000000000005060708D9 -:100E000000050500000000000000000000000000D8 -:100E100000000000010504020005050000000000BC -:100E200000000000000000000000000003030303B6 -:100E300000080200000000000000000000000000A8 -:100E40000000000000000000000008020000000098 -:100E5000000000000000040000040000040400047E -:100E60000005050000000000000000000000000078 -:100E70000000000004040404000000000000000062 -:100E80000000000000030300000303000000000056 -:100E90000000020000000000000000000004000448 -:100EA000000400040404040400000000FCFA000034 -:100EB0000206040000000000000000000000000026 -:100EC00000F8F800FAF70000010707000000000032 -:100ED000000000000000000000F80000FCFCFCFC2A -:100EE00004040404000000000000000000000000F2 -:100EF00000F80000FCFCF9000404040400000000F9 -:100F0000000000000000000000F80000F8F90000F8 -:100F100000080700000000000000000000000000C2 -:100F20000000F8F8FCFCFCFC0404040400000000D1 -:100F3000000000000000000000F80000FCFCF900C8 -:100F40000404070000000000000000000000000092 -:100F500000FC000000000000000000000000000095 -:100F600000000000000000000000FC000000000085 -:100F70000000000000000000000000000000000071 -:100F8000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F1 -:100F9000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E1 -:100FA000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D1 -:100FB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C1 -:100FC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B1 -:100FD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A1 -:100FE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C791 -:100FF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C781 -:10100000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C770 -:10101000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C760 -:10102000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C750 -:10103000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C740 -:10104000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C730 -:10105000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C720 -:10106000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C710 -:10107000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C700 -:10108000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F0 -:10109000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E0 -:1010A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D0 -:1010B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C0 -:1010C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B0 -:1010D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A0 -:1010E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C790 -:1010F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C780 -:10110000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C76F -:10111000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C75F -:10112000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C74F -:10113000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C73F -:10114000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C72F -:10115000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C71F -:10116000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C70F -:10117000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FF -:10118000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7EF -:10119000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DF -:1011A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CF -:1011B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BF -:1011C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AF -:1011D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79F -:1011E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78F -:1011F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77F -:1012000002510101000392D4010118030FD0D5CF80 -:10121000D2010218030ED0D1D5D3010318030CD08C -:10122000D1D2D4D5D3010418030AD0D1D2D4D4D486 -:10123000D5D3010527D5D3010627D5D3010728D358 -:10124000010828D3010927D5D3010A27D5D3010BDB -:1012500027D5D3010C27D5D3010D27D5D3010E27D0 -:10126000D5D3010F27D5D3011027D5D3011127D509 -:10127000D3011227D5D30253010726CA010825CB73 -:10128000CC0254010727CD010827CE0252010518D0 -:10129000030AEB010618030AEB0107180308ECED3B -:1012A000EB01081803085CEEEB01091E5C5CEEEB39 -:1012B000010A1E5C5CEEEB010B1E5C5CEEEB010CAC -:1012C0001E5C5CEEEB010D1E5C5CEEEB010E1E5C29 -:1012D0005CEEEB010F1E5C5CEEEB01101E5C5CEE45 -:1012E000EB01111E5C5CEEEB01121E5C5CEEEB018F -:1012F000131CFDEFF0F1F2F30114180304F8F7F6F4 -:10130000F4F50115180305F8F7F6F6EFFC011618C9 -:101310000306F8F7F6F6F4F50117180307F8F7F6E1 -:10132000F6F6EFFC0118180308F8F7F6F6F6F4F5F0 -:101330000119180309F8F70304F6EFF9011A180365 -:101340000AF8F70304F6F4F5011B18030BF8F7038A -:1013500005F6EFFC011C18030CF8F70305F6F4F58D -:10136000011D18030DF8F70306F6EFFC011E180324 -:101370000EF8F70306F6F4F5011F18030FF8F7034C -:1013800007F6EF0210010918030604010A18030604 -:1013900004010B18030604010C18030604010D18C0 -:1013A000030604010E18030604010F1803060401C6 -:1013B000101803060401111803060401121803068D -:1013C000040113180304040255011322030594D5E4 -:1013D000FA030794011420030794D5FA0307940134 -:1013E0001522030594D5FA030794011623030494E8 -:1013F000D5FA03079401172594D6D7D8D9030694B4 -:10140000011826DADBDCDDDE030594011928E0E1B2 -:10141000E2E3E4949494011A299494E5E6E3E494D5 -:10142000011B2B9494E5E6E3011C2C949494E501B4 -:101430001D2E9494011E2F94004C0C99004E0C9973 -:1014400010500C9920520C7900540C7910A80C798A -:1014500020A80C8920700C5900720C5910740C597A -:1014600020764C7D0000C7C7C7C7C7C7C7C7C7C757 -:10147000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FC -:10148000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7EC -:10149000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DC -:1014A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CC -:1014B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BC -:1014C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AC -:1014D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79C -:1014E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78C -:1014F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77C -:10150000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C76B -:10151000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C75B -:10152000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C74B -:10153000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C73B -:10154000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C72B -:10155000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C71B -:10156000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C70B -:10157000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FB -:10158000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7EB -:10159000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DB -:1015A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CB -:1015B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BB -:1015C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AB -:1015D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79B -:1015E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78B -:1015F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77B -:10160000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C76A -:10161000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C75A -:10162000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C74A -:10163000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C73A -:10164000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C72A -:10165000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C71A -:10166000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C70A -:10167000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FA -:10168000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7EA -:10169000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DA -:1016A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CA -:1016B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BA -:1016C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AA -:1016D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79A -:1016E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78A -:1016F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77A -:10170000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C769 -:10171000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C759 -:10172000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C749 -:10173000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C739 -:10174000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C729 -:10175000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C719 -:10176000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C709 -:10177000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F9 -:10178000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E9 -:10179000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D9 -:1017A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C9 -:1017B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B9 -:1017C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A9 -:1017D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C799 -:1017E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C789 -:1017F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C779 -:10180000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C768 -:10181000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C758 -:10182000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C748 -:10183000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C738 -:10184000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C728 -:10185000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C718 -:10186000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C708 -:10187000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F8 -:10188000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E8 -:10189000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D8 -:1018A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C8 -:1018B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B8 -:1018C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A8 -:1018D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C798 -:1018E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C788 -:1018F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C778 -:10190000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C767 -:10191000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C757 -:10192000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C747 -:10193000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C737 -:10194000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C727 -:10195000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C717 -:10196000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C707 -:10197000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F7 -:10198000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E7 -:10199000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D7 -:1019A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 -:1019B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B7 -:1019C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A7 -:1019D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C797 -:1019E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C787 -:1019F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C777 -:101A0000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C766 -:101A1000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C756 -:101A2000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C746 -:101A3000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C736 -:101A4000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C726 -:101A5000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C716 -:101A6000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C706 -:101A7000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F6 -:101A8000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E6 -:101A9000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D6 -:101AA000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C6 -:101AB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B6 -:101AC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A6 -:101AD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C796 -:101AE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C786 -:101AF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C776 -:101B0000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C765 -:101B1000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C755 -:101B2000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C745 -:101B3000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C735 -:101B4000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C725 -:101B5000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C715 -:101B6000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C705 -:101B7000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F5 -:101B8000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E5 -:101B9000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D5 -:101BA000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C5 -:101BB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B5 -:101BC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A5 -:101BD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C795 -:101BE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C785 -:101BF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C775 -:101C0000212A5CA72803215C5C7E32DBE52322DCF1 -:101C1000E5C921DBE5352ADCE5200D7E3C280923DA -:101C20007E32DBE52322DCE57EC90C0278801402DB -:101C3000328024083202232032015A021E200C0274 -:101C40001E200C025A20730124085A012408640142 -:101C500032045F02232014801E08FFFF8C01DC0881 -:101C6000190219011480140414804A02C801EB02FD -:101C70006E803702500114800A010A020F010A0225 -:101C800005010A022808FFFFC7C7C7C7C7C7C7C7DC -:101C9000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D4 -:101CA000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C4 -:101CB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B4 -:101CC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A4 -:101CD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C794 -:101CE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C784 -:101CF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C774 -:101D00003E13CD4231CD5E5F3E0132AEE61804AFE8 -:101D100032AEE63A90E5FE0020053E20CD4231CDC0 -:101D2000C95E3AB7E5B728353AAEE6B7202FCDD62B -:101D30005E3E023288E53E0ECD3E30212ED6360084 -:101D4000545D13012700EDB03E0ECD3E30CDD65E82 -:101D50002188E53520E03E70CD3E3018353A90E5DB -:101D6000FE002136D6CC9A313E023288E53E0ECDB9 -:101D70003E302132D73600545D13011B00EDB03EDA -:101D80000ECD3E30CDC95E2188E53520E03E38CD10 -:101D90003E303E013290E53A8EE53DCDEC31793C66 -:101DA00032CCE579E6073C32CDE5210000228AE518 -:101DB000228BE5216CE5FE01200936303E60328B36 -:101DC000E51814FE02200936403E80328BE51807E4 -:101DD00036503E01328AE579CB3FCB3FCB3F21DF06 -:101DE000E586875F160021355F195E2356ED53E1C6 -:101DF000E53E14CD4231CD8061CDD763AF32A6E54B -:101E0000CD435FCDE7622110D011ED5ECD2D30CDF9 -:101E100003320E1E214AD03A8EE5CD4830CDF7313F -:101E20000E041197E52160D03AB8E5B728032118D0 -:101E3000D00603CD5F3010FB0E06119AE52138D095 -:101E40000603CD5F3010FB3AB4E6FE0C201421BA35 -:101E5000E10607360D232323360D1115001910F363 -:101E6000180CFE1020083E0132FFE43200E53AA7CC -:101E7000E5B720433AAEE6B720103AB7E5B7280AEF -:101E80003E1632B6E53E1832ADE63E01329DE52102 -:101E90004AE4060A78C602E60320053E17CD423121 -:101EA0007EFEFF20043612180236FF3E09CD3E307A -:101EB00010E23E26CD42313E02329DE53E1532B162 -:101EC000E63E013268E5C329002132D7CD853111C4 -:101ED000235FCD2D30C90E063AB8E5C631212ED686 -:101EE000CD6A30112B5FCD2D30CD9A31C90620310E -:101EF000502D2020202020201E3C31303030303E1C -:101F00000648492D2020202020201E3C522D202034 -:101F1000205E5F2D203E0632502D202020202020E4 -:101F20002020000620524541445900062D504C41C6 -:101F30005945522000980004011001140117012195 -:101F40000126013E013274E5AF3273E5CD915F3E6B -:101F500002CD3E302173E5347EFE1E38EFC9DD210F -:101F600000E30610DD360400DD360C00111000DD44 -:101F70001910F1AF3274E532A6E53E1C3273E5CD9F -:101F8000915F3E02CD3E302173E5357EFEFF20EFAE -:101F9000C9874FAF479157CB2178E603CCAD5F7A25 -:101FA000CB7F20020D9104805779B830ECC5D5CB9A -:101FB00038CB38300104CB39CB3930010C2E10CD61 -:101FC000D25F3A74E5B728030D18010CCDD25FD16A -:101FD000C1C9513E1880FE30DCF15F3E1890D4F14B -:101FE0005F503E1881FE30DCF15F3E1891D4F15F06 -:101FF000C9677D82FE20DC00607D92D8CD0060C97B -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4d.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4d.hex deleted file mode 100644 index 89abed9d..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4d.hex +++ /dev/null @@ -1,513 +0,0 @@ -:10000000203AECE4CDB620CD112021ECE43518E403 -:10001000C9FDBE05C821ECE44ECD3D2121EEE4BE74 -:10002000D032EEE43E0032EDE4C947FD4E0579FEE4 -:100030001D30526178070707CB3C1F6F1110D01994 -:10004000E511800119D1EB1AFE04283AE6F8FE0802 -:1000500028340C1A242415EBE6FCFE0028253A442B -:10006000E4B8300D2D2D2D2D1D1D1D1DCD88201802 -:10007000122005CDAD20180B2C2C2C2C1C1C1C1C6C -:10008000CD882018A9C979C97EE6FCFE18281E7EF5 -:10009000E6F8FE08C8247EE6F8FE08C81AE6F8FE70 -:1000A00010280A1AFE042805E6F8FE08C02145E4D7 -:1000B00079BED8F179C947FD4E0579FE0128506116 -:1000C00078070707CB3C1F6F1110D019E51180018D -:1000D00019D1EB7EE6F8FE102809247E25E6F8FE0D -:1000E0001079C00D151524EB3A44E4B8300D2D2DD0 -:1000F0002D2D1D1D1D1DCD102118122005CD3521C2 -:10010000180B2C2C2C2C1C1C1C1CCD102118ABC922 -:100110007EE6FCFE18281E7EE6F8FE08C8247EE671 -:10012000F8FE08C81AE6F8FE10280A1AFE04280588 -:10013000E6F8FE08C03A45E4B9D8F179C94778181D -:10014000142A44E4943002ED448787874779953038 -:1001500002ED4480C92145E4BE200879FD9604D013 -:10016000ED44C978963005ED44C664C9C6C8C9C710 -:10017000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C70F -:10018000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FF -:10019000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7EF -:1001A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DF -:1001B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CF -:1001C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BF -:1001D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AF -:1001E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79F -:1001F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78F -:10020000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77E -:10021000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C76E -:10022000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C75E -:10023000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C74E -:10024000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C73E -:10025000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C72E -:10026000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C71E -:10027000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C70E -:10028000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FE -:10029000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7EE -:1002A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DE -:1002B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CE -:1002C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BE -:1002D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AE -:1002E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79E -:1002F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78E -:10030000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77D -:10031000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C76D -:10032000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C75D -:10033000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C74D -:10034000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C73D -:10035000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C72D -:10036000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C71D -:10037000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C70D -:10038000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FD -:10039000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7ED -:1003A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DD -:1003B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CD -:1003C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BD -:1003D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AD -:1003E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79D -:1003F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78D -:10040000210EE57EB7280235C934CDBE242168E52A -:100410003520023617DD2118E53E143288E5DD7EF1 -:1004200000B72839DD35002006DD360100182EDD45 -:100430007E00FE102004DD3601F43021FE0F201274 -:10044000DD7E02DD6E03CD002DEBCD1930CD6924AC -:10045000180BCB3FCB3F473EF790DD7701010400FF -:10046000DD092188E53520B6C93A44E4DDBE022025 -:1004700017DD7E032145E496380EFE03300A3E0068 -:100480003248E4AF3250E4C9FD2158E43AE9E4329D -:1004900089E5FD7E04DDBE022018DD7E03FD9605A4 -:1004A0003810FE03300CFD360CFFFD36092AFD36F0 -:1004B0000E3C111800FD192189E53520D5C93AE90E -:1004C000E432E8E4DD2158E4216DE536003A02E546 -:1004D000B728083AE8E4FE01200134DD7E0EB72893 -:1004E0005BDD350920253A6DE5B7280AAF3202E514 -:1004F00021E9E4351815DD360903DD7E0AFEFF200B -:1005000006DD360A0C1804DD360AFFDD350E202420 -:10051000FD2140E4FD7E04DDBE042010FD7E05FECD -:10052000013809FE043005DD340E1810DD360C00EC -:10053000DD360A0CDD7E0EFE30CC4825111800DDBC -:100540001921E8E4352081C93A6DE5B7200D3E0157 -:1005500032FFE4010001CDDB2F1813DD7E04DD6ED8 -:1005600005CD002D15151AE6FCFE60CC832F3E0448 -:10057000CD4231DD7E0DB7280421FCE435DD360A9D -:10058000FF1110D13A68E587876F260019EB06F84E -:100590000E08CD712EEB200A2168E53520023617B2 -:1005A00018E23A68E5DD7701DD7704878787DD7734 -:1005B00007AFDD7700DD7702DD770D3CDD7703DD0A -:1005C0007705DD3606082168E53520023617C93E75 -:1005D0000132A7E52122D2CDA1293E0ECD3E302108 -:1005E000DED311E926CD2D302123D216CBCDDF2944 -:1005F0003E1CCD3E302123D216CCCDDF293E1CCD72 -:100600003E302123D216CDCDDF293E1CCD3E307A9F -:10061000326BE52140E41141E40128013600EDB0E0 -:100620003E0132CDE5324BE43249E43E163241E43C -:100630003E0C3243E43E00324AE43246E43E1E328F -:1006400053E416181E0C3E01DD2158E40605DD7743 -:100650000BDD7709DD7201DD7303DD360A00DD365F -:100660000600C5011800DD09C11410E2218000DB7D -:1006700004CB4720022D2D22E3E5CDD7633E053282 -:10068000E9E43E03326AE53E01329DE53E303289BF -:10069000E5216BE5347EFED0380236CD562123D2DB -:1006A000CDDF293E08CD3E302189E53520E33E00EF -:1006B000329DE53E00326AE5CD00653ADEE5CD00CB -:1006C0005C060321DEE57EB72805360004180134F8 -:1006D00078328EE5AF32B8E5328FE5676F2291E56B -:1006E0002292E5CD5E5FC3975D06544D003E13CD6B -:1006F00042313E0132A9E5CD5E5F210052CD516409 -:1007000021C0D0DD21BED00E1F06187EDD77002C63 -:100710007EEE20DD77012CDD2BDD2B10EE1150005D -:100720001911B000DD190D20E02124E01123E00EA5 -:100730001F060C7E0707070712231B10F6C5010CC6 -:100740000009EB01240009EBC10D20E5FD2139541E -:10075000CDF0293E14CD42313E0132A6E5CD435FB6 -:100760003E24CD42312140E41141E401280136000C -:10077000EDB021CDE5343E01324BE43249E43E0692 -:100780003244E43E103241E43E1D3243E43E003246 -:100790004AE43246E416121E1F3E010E05DD2158C2 -:1007A000E40604DD770BDD7709DD7104DD7201DD20 -:1007B0007303DD360A00DD360600C5011800DD09C9 -:1007C000C1141C10DECDD7633E0432E9E43E023290 -:1007D0006AE53E01329DE53EA8CD3E303E03CD4266 -:1007E000310E30DD2100E3060BDD3406DD350E1160 -:1007F0001000DD1910F33E01CD3E300D20E521B68D -:10080000D5CD9A3121B8D6CD8531213CD8112D28AE -:10081000CD2D303E70CD3E303E00329DE53E003263 -:100820006AE53E13CD4231CD5E5FC3975D0652450A -:10083000414459003E13CD42313E0132A9E5CD5E1F -:100840005F2100E31101E30168023600EDB02100F1 -:10085000E01101E0019F023600EDB02313015F00BB -:100860003601EDB03E0A32D8E53E0032A6E53E1430 -:10087000CD4231CD435F3E27CD423106000E4711B8 -:10088000EF283E01CD3E303E2E804730F51AFE0166 -:100890002007131A6F131A67131A77FE20282E3EAB -:1008A00017CD42311AFE322024AF32CDE53257E463 -:1008B0003E0B3241E43E0C3253E4324AE43E013214 -:1008C0004BE43249E4326AE53E01329DE51323717F -:1008D000231AB720AD3EFFCD3E303E00329DE53EAF -:1008E00000326AE53E13CD4231CD5E5FC3FA260188 -:1008F00030D3434F4E47524154554C4154494F4ECB -:10090000532120202020011ED5594F552020484139 -:1009100056452020444F4E4520204954202056451E -:100920005259202057454C4C2C202001A8D6484134 -:1009300056494E47202050415353454420205448A7 -:10094000524F5547482020012AD8323420204441B4 -:100950004E4745524F55532020504C414345532E4E -:100960002020202001A0D94255542020544845522F -:1009700045202041524520205354494C4C20204FC3 -:100980005448455220200128DB454E454D494553EA -:1009900020204F4E2020594F555220205741592E8C -:1009A0000016881E04061E722C2C1414141410F742 -:1009B0007AC68957014400091D20EAC91E047EE653 -:1009C000F0477AE60FB07723060E722310FC7EE61E -:1009D0000F477AE6F0B077010900091D20E0C91E33 -:1009E00004061E722C2C10FB014400091D20F2C9C4 -:1009F000DD2100E3FD7E00B7C8DD7704DD770CFD67 -:100A00007E0147E61FDD7700DD770878E6C0DD77F9 -:100A100005EE40DD770DFD5E0216002AE3E519DDE7 -:100A20007502DD750ADD7403DD740BFD5E03DD7395 -:100A300006DD3607013EF093DD770EDD360F00113F -:100A40000400FD19111000DD1918A93A6AE5FE012C -:100A50002005CD5B2A1803CDD42AC93A53E4FE0CF5 -:100A6000202E1115002A42E4192242E47C2A57E480 -:100A70002600019B2B09BE2015237E324BE43E004D -:100A80003253E4324AE43A57E4C6023257E4184398 -:100A90003A4BE4FE01200511F2FF1803110E002A63 -:100AA00040E4192240E47C2A57E42600019B2B09EC -:100AB000BE2015237E324BE43E0C3253E4324AE42E -:100AC0003A57E4C6023257E43A53E4FE0C2804478E -:100AD000CDF110C93A6AE5FE022065DD2140E40E41 -:100AE00005DD7E0BFE01201C11F4FFDD6E00DD66CE -:100AF0000119DD7500DD74017CDDBE042004DD36E6 -:100B00000B001810110C00DD6E00DD660119DD759B -:100B100000DD740111F9FFDD6E02DD660319DD757C -:100B200002DD7403C5DD460679FE052005CDF11012 -:100B30001803CD2E1AC1111800DD190D20A3185A63 -:100B40003A6AE5FE032053DD2140E40E0611ECFF76 -:100B5000DD6E00DD660119DD7500DD74017CFEFED1 -:100B60002004DD360AFFC5DD460679FE062005CDE8 -:100B7000F1101803CD2E1AC1111800DD190D20CD6A -:100B80003A53E43C3253E4FE24200F3E003253E457 -:100B90003A57E43C3257E4CD9D65C903010600078E -:100BA0000008000A0009000D000D0010000F0013DE -:100BB000001100190032C7C7C7C7C7C7C7C7C7C713 -:100BC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B5 -:100BD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A5 -:100BE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C795 -:100BF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C785 -:100C0000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C774 -:100C1000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C764 -:100C2000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C754 -:100C3000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C744 -:100C4000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C734 -:100C5000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C724 -:100C6000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C714 -:100C7000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C704 -:100C8000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F4 -:100C9000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E4 -:100CA000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D4 -:100CB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C4 -:100CC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B4 -:100CD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A4 -:100CE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C794 -:100CF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C784 -:100D000065070707CB3C1F6F1110D019E511800153 -:100D100019D1EB7EC967FD2158E41118003AE9E4C6 -:100D200047FD7E0694FE12306DFE083869FD7E0791 -:100D3000953002ED44FE06305DFD7E0CB72028FDA7 -:100D40007E16B720223A4FE4B72815FD7E0FFEFF2E -:100D5000280E2152E47EB7200736013E0BCD7330BA -:100D60003E063209E5182D210BE53A44E4BE28245D -:100D70007F77210AE53A4BE4BE2010210CE5347E52 -:100D8000FE0338053E133206E518093A4BE4773E78 -:100D900001320CE537C9111800FD191084C9C613BA -:100DA000180067DDE5C1FD2158E43AE9E447FDE5B7 -:100DB000D17BB92832FD7E0EB7202CFD7E06BC30DB -:100DC00026C612BC3821FD7E07953002ED44FE0692 -:100DD0003015DD7E0FFDBE0F200437C91809AFFDA9 -:100DE000960CD8DD960CD8111800FD1910C0C967F3 -:100DF000DDE5C1FD2158E43AE9E447FDE5D17B9109 -:100E00005F2826FD7E0EB72020FD7E07C607BC3872 -:100E100018D608BC30133CBC2004CB7B200BFD7ED5 -:100E200006953002ED44FE0FD8111800FD1910CBC5 -:100E3000C9C60867DDE5C1FD2158E43AE9E447FD8C -:100E4000E5D17B915F2822FD7E0EB7201CFD7E0739 -:100E5000BC3016C608BC38112004CB7B200BFD7EAD -:100E600006953002ED44FE0FD8111800FD1910CF81 -:100E7000C91AA0B9C8E5218000197EE1A0B9C91A34 -:100E8000A0B9C0E5218000197EE1A0B9C97EA0B952 -:100E9000C8247E25A0B9C97EA0B9C0247E25A0B9EA -:100EA000C97EB9C8247E25B9C91AB9C0E521800018 -:100EB000197EE1B9C9C60518004F3A47E4B9D0C652 -:100EC00004B9D83A46E4953002ED44FE0AD0AF3278 -:100ED00050E4C94F3A46E4C60EB9D8D61D3001AF2A -:100EE000B9D03A47E4953002ED44FE03D0AF32501A -:100EF000E4C94F3A46E4913002ED44FE0ED03A4741 -:100F0000E4953002ED44FE03D0AF3250E4C9EB7EED -:100F1000C670772C360A2C7EC674772C360A018070 -:100F20000009360A2D7EC67C772D360A2D7EC678BE -:100F300077ED42EBC9EB7EC660772C360A2C7EC675 -:100F400064772C360A01800009360A2D7EC66C773C -:100F50002D360A2D7EC66877ED42EBC9EB7ED67042 -:100F6000772C36052C7ED674772C36050180000947 -:100F700036052D7ED67C772D36052D7ED67877EDFD -:100F800042EBC9EB7ED660772C36052C7ED6647793 -:100F90002C36050180000936052D7ED66C772D365E -:100FA000052D7ED66877ED42EBC9D5070707CB3C08 -:100FB0001F6F1110D019EBC5CD0E2FC1D1C9EB7722 -:100FC00023237701800009772B2B77ED42EBC92192 -:100FD00091E57E47812777383618172193E57E8182 -:100FE00027772B7E8827772B7E47CE002777381FE1 -:100FF000B8C84F78C6012747C5FE05200C218FE5EC -:10100000343E12CD4231CDF731C178B938E5C9212E -:1010100099992291E52292E5C9D5EB3AD8E5772C4A -:101020002C7701800009772D2D77EBD1C91AB7C82D -:10103000FE2030034F1804772C712C1318EF32B5B3 -:10104000E53AB5E5A720FAC90600D60A0430FBC682 -:101050000A05F578CD5830F1C63077237123C91AC7 -:10106000F50F0F0F0FCD6A30F113E60FC63077235F -:101070007123C94F0600212831095621FEE45E3450 -:101080007A3288E5B72809347BFE0720031E003436 -:10109000CB9E7B3289E5878787FD21C0E35F160001 -:1010A000FD19FD360011FD360811161579FE0B38B5 -:1010B0000216033A46E482ED445F16002AE3E5197E -:1010C000FD7502FD74031E003A88E5B7280A1CFD71 -:1010D000770CFD750AFD740B211B31097EFD770429 -:1010E00021353109460E00CDDB2F3A47E4C6206F8B -:1010F000260029FD7506FD7407CB43280A01F0FF81 -:1011000009FD750EFD740F3A89E54F0600219EE535 -:10111000093670CB432803233670C9F8F9FBFCFA73 -:10112000FDFAFDE1E1E1E1E10000000000FEFEFF6B -:10113000F0AAABF1F002040608051015203050802B -:101140001030D557FE1228083AA7E5B72802D1C9B2 -:101150007AE521BBE55E160021BCE519571C7BE64C -:101160000F32BBE572E1D1C93ABAE521BBE5BEC891 -:101170005F160021BCE5193CE60F32BAE57ED300CC -:10118000F680D300C9119231CD2D303A8EE5CD488D -:1011900030C906524F554E442D003A8EE53DCDECF8 -:1011A00031793C32CCE50E06FE0A3805CD483018C0 -:1011B000052C2CCD6A303ACCE5FE043801AF878788 -:1011C0005F1600E521D43119EBE1CD2D3011E4316A -:1011D000CD2D30C90654480006535400064E440035 -:1011E000065244000620424C4F434B000E000CD6E2 -:1011F0000330FB0DC603C90E1E2156D03A8FE5CD34 -:101200006A30C92126D0118AE50E1E1AE60FCD6A72 -:101210003013CD5F301A0F0F0F0FE60FCD6A300E6F -:10122000042118D03AB8E5B728032160D03AADE6DA -:10123000B72826E521B6E57EB72006361621ADE6AD -:10124000353AADE6E11F300C3600545D13010B005A -:10125000EDB01803CD82321803CD8232119AE52108 -:1012600091E506031ABE1323200210F8D03AA7E531 -:10127000B7C0010300119AE52191E5EDB00E0621FA -:1012800038D01191E50603CD5F3010FBC911B8E6E7 -:101290002120D7014000EDB021A0D7014000EDB0E2 -:1012A0002120D8014000EDB021B8D8010E00EDB0EA -:1012B0002138D9010E00EDB0C921B8E61120D701BF -:1012C0004000EDB011A0D7014000EDB01120D801D1 -:1012D0004000EDB011B8D8010E00EDB01138D901C1 -:1012E0000E00EDB0C9C7C7C7C7C7C7C7C7C7C7C7FD -:1012F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77E -:10130000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C76D -:10131000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C75D -:10132000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C74D -:10133000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C73D -:10134000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C72D -:10135000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C71D -:10136000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C70D -:10137000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FD -:10138000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7ED -:10139000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DD -:1013A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CD -:1013B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BD -:1013C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AD -:1013D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79D -:1013E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78D -:1013F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77D -:1014000000003234013572354B3C6236CE364537FA -:101410008934CA3CA83B043EE235593D8C3F9B3998 -:10142000A93EF938CC3A1E3F2F3AC53771387D4076 -:10143000F73F0001AEE5A4EBA9CFF7A98DCAAECA6C -:10144000F7B3F1B9C5E8D2F7BEF703848DC58E9224 -:10145000C2898DD5CB8E98D2999DC4D79398C70455 -:10146000A6C6EE04B6C8F104068188CF07A2C3A7BA -:10147000D3ACD1B7C6D5BCCF0AA4CBA9CABEC009CC -:10148000BBCC08ABC3D3B0CC1F0001A4C2A9C1E33D -:10149000A5CAF1A7D3F6ACCFF6B095C1E3B4D3F7A4 -:1014A000B0C6E7CAEDB9ECD4F7BEF702A4C1C39049 -:1014B00098C0C4B0C5C804A9C5EDB6CDF103848FEA -:1014C000C0C4858BD28C91CE8793D78598C99498C8 -:1014D000D5949DD2999DC706A186D707A2C2A3CF56 -:1014E000A5D4A7C1ABC2AEC6CBB7C1C5D7BCC0D708 -:1014F00009BBCA08A6C3A9D1ADC30AB9D4BEC0D717 -:101500001F0001A5CAF2A6E3A8D4F7ABC5F3AFE468 -:10151000B0CAF1B3D7B5CCF3B7CCD3B9ECD3F7BAE3 -:101520009DCFF0BEF704AED4AFD5B0D6B2C4E803B9 -:10153000999DC2D69A9DCED19598CBD49094C9CF7F -:101540008F98C38B8FCCD1868EC4858AC9D306A1D0 -:1015500087D707A3CEA4C2A9CFADC1B1D7B8D0BC9D -:10156000D408A8C6ADCEB2D209B6C90AB3D7BEC098 -:10157000D71F0001A4C0D0F7A6E1CFF0A8C1C2CE0A -:10158000CFA9D2F6AAC2C3CDCEACC3C4CCCDAEC314 -:10159000E5CBEDAFE5CBF7B0C6CAB2C6EAB4C1E35E -:1015A000CDF3B9C5F7BEF703A48ED3AF93C2AF9501 -:1015B000CEB295C8B49AC4D1B49DC0B99DCBD5065E -:1015C000A191C807A2D1A7D6ACCBADC0B2C3D3B747 -:1015D000C808ACC1B1C4B6CE09BBCE0AA9D2D6BE2A -:1015E000D71F0101A698C9CEA89AC1C4D3D6A8C254 -:1015F000C3D4D5AFC2C3D4D5B2CBCCB9C1E5C9CA67 -:10160000CDCED2F6BB9DC6D1BEF702B9CBCC04A8D5 -:10161000C6C7D0D1B3C6E8CFF103A68AC8CFA89475 -:10162000C5D2B298CACDB69DC8CFA89DC0D706A1D5 -:1016300091CACD07A6C2D5ADC3D4B7C2CBD508A534 -:10164000C4D3B6CCBBC709BBCC0AA6CEBEC5BED2DE -:101650000D8EC2C3D4D598C2C3D4D598CBCC91CA71 -:10166000ED1F0001A4C0C2C4C6C8CACCCED0D2D41B -:10167000A98BC0C2C4C6C8CACCCED0D2D4AFC0C257 -:10168000C4C6C8CACCCED0D2D4A493D6B4C1F6BEF8 -:10169000F702B9C1F603A493C1C3C5C7C9CBCDCF67 -:1016A000D1D3D5B49DC006A19DD707A7C0C8D0ADE2 -:1016B000C4CCD4B2C0B7C6CACEBCC1D608A1CAD3A6 -:1016C000B6C8D009BBC80AA4C0A9C0AFC01F0001DA -:1016D000A5C0E2C6EBCEF0AD91D3D6ADD7AFC1EA8F -:1016E000B0D4B094D5B4C0E3CAECB5D3F6B9C0E673 -:1016F000BEF704A2C4C5A5D2F7A9C4E8B6CEF003CC -:10170000A58AC3A59DD1A795C9AF93C0B29DD7B4F3 -:1017100098C4CDB99DC706A186CC07A3C0C6D0ADDD -:10172000C6CAAED4B1CFB3D3D6B7C1BCC1CDD6082B -:10173000A2C1C9CFACC309BBCB0AA5CAB5D4BEC030 -:101740000D8FD4D51F0001A4C1E8A6CAEED2F7A818 -:101750008ACEA9C2E7ABCEF7AD92D6B1D2F4B0959E -:10176000C2E4C7B2C6B4C5C6B7CEF2B6D6D7B9C5FD -:10177000BEF702AB9ACBABCCB19ACCB9C1E4C6EA06 -:1017800004AECCF103A49DC0A498C9A68ACFD4B05E -:1017900095D7B19DD506A185D207A4CFD3D7A6D121 -:1017A000A7C2C7A9CBCCD7AED7AFCCD3B2C5B5D023 -:1017B00008A1C4A3CCA8D209BBCC0AA9C6B1D3BE88 -:1017C000D70E93C51F0101A5C0E2C4A8D3F6AAC6CF -:1017D000F1AA8CD5ABC1E3AA9DC6AA9AD1ADD3F725 -:1017E000AFC7E9CDEFAF94D3B092C3B2C0E2B3D3E9 -:1017F000F7B496C5C9CDB698C4B7C7F0B89AC3B9FF -:10180000D2B8D5F7BCC2D3BEC0F704A7C4C5A5D112 -:10181000F3ACC8EFB1C7EFAAD203A184C0A88CD79C -:10182000A9C3AA8DCBAB91C0AC96D0AD92D6B196E0 -:10183000CBB29DC1B397D5B496C7CEB89DD406A5FB -:1018400089C307ABD4ADC7CFB1D4B5C8CACCCFB666 -:10185000C3D7B7D2BCC0C4CACCD708A5D4A7C8BB0D -:10186000C509A8C20AA5C2BEC0D70F9DC3E5C7F26D -:101870001F0001A4C1C2A9C1E6CAF6A99BCAAEC095 -:10188000E7CDF5B092CDD5B3C4E6CBEDD0F5B597A5 -:10189000C6D5B8C2E6CBF5BAC0E2BDC4C8C9CFF759 -:1018A000029FC0F704A3C7F6BAC4E703A48DC0A67D -:1018B00088C6A997C3A99CD7AE9CC8B397CFD4BA02 -:1018C0009EC3BDCE06A185C307A2C1A7D3ACC1C428 -:1018D000CEB1C6CBD1B6C5D0D3B8C0C1BDC0C5CAC4 -:1018E00008A6CDB0C4BCC609A1C20AB3D1AECDD53D -:1018F0000D99C0C10F9EC5E71F0001AAC2CEACC0A2 -:10190000E2AE90C2B1C0E3D3F6B39DC0B6C1E4CDA0 -:10191000B7D0F6B8C7EDB9CDD0D49BC5D4BCC4C53B -:10192000D1F7BEC0F702A5C0E2C4EDAA95CDAC9038 -:10193000CEAFCFD004A4CEF4A7CAECABD0F5AEC4E2 -:10194000ECB1CEF1B8C2E403A184D5A790C3A7C976 -:10195000AA8ECFAB90D6AC97C9B197CCB49DCEAE82 -:101960009BD7B89DC1C6BA9DCC06A5C307AAC1CC5A -:10197000ADD0AFC5C8CBC0B4C1B5D2BAD1D3D6BC37 -:10198000C3C7CB08A7CEB3C3B4D1BBC909B5C70A77 -:10199000AACEBCD3BCD50D8BC0C11F0001A4CCF70F -:1019A000A5C7E9A9CDF6AAC1E4AFC5C7E9B4C4B9D2 -:1019B000C2C3C7E9CDF7BEC0F702AAC8EA8BCDF60D -:1019C000AC98CDAC95D6AFCFF4B193CFB4C8EACF35 -:1019D000F604A2C1E503A488D1A589CAA59DC0A922 -:1019E0009DCCA998D7AA8EC5C7AF93C4CAD5AF98C6 -:1019F000CEB498C3C7B99DC1B9CA06A186C6BB9D5E -:101A0000CA07A2CCD6A3C9A8C2C4C9ADC9D0D3B293 -:101A1000C9D1D3B7C4C9D1BCC2CED608A1D4A7C33B -:101A2000A6D4ACCB09A6CB0AA5C9AFC9BED71F00A7 -:101A300001A7C1C5EACDF3D5F7A9D6AFC5E8D2F75E -:101A4000B6C0E6B8C6EACFF1D3D5F7BAD3F7BCD45F -:101A5000F7BDC0EACFF702A5D5AFCAF1B8CCED9F6C -:101A6000C0F704A2C3CBCCD4F7A9C6F3ABD6B0C1A0 -:101A7000C2B1D2F4B5D203A192C0A286D3A589C4C3 -:101A8000A5CAA78AD4A98BD5A98EC5D7AF97C9B443 -:101A900097D1B6C7B89ECBCE06A184CA07A5C1C54B -:101AA000C9CED1D7AAC7CBD0B4C0C3B6D7B8D4BBE0 -:101AB000C0C2BDCC08A4C7D0ACD409B5CC0AA7C15C -:101AC000B8D7BDC00D86D6D70E99D41F0101A2C8C4 -:101AD000CFD5A3C8D0D4A4C7D4A5C1E6CDD1F385B2 -:101AE000CDF0A7C6CDD1A9C6F6AAC0E4AEC6F7AF61 -:101AF000C1E4B093C4C6D1D3B3D4B395C7D594C40D -:101B0000B496C3D1B597C8B698C2B6D0D1D5F7B7F9 -:101B10009AC9B89AC1B8CEF1B9C6BAC4CAEEBCC3A4 -:101B2000C4C7BB9DD5D7BDCFF1BEC0E8CFF702A5D6 -:101B3000C0C2C39FC9EE04A6C7F0B0C7F0B1C1E3ED -:101B400003A59DC5D2A98DD7AA8EC3AF9DC0B8CD20 -:101B5000BA9ECCBB9DC8BB9EC906A188CBBB9DD6F7 -:101B600007A3C0C6D3A7C8CED0D4A8C0B1C8B3CA33 -:101B7000CEB2C3B4D6B9D7BAC3BBD1BCC1C6D3BD2C -:101B8000CACE08A2C3BBC2D409ABCA0AB3D4B8CE6A -:101B9000BCC30D88C7ECCEF092D4D595D6D797CDDF -:101BA000EF99CAEC0E9DD61F0001A4C9F6A6C7E99D -:101BB000A69BD6A699C7A9CBF4A99BD4ABC9EBD455 -:101BC000AD9BC9ACC2C3AEC3E5AECDF2B0CBEDB0F8 -:101BD0009BCBD2B1C2C3B3C5CFD0B5CDF0B799CDF1 -:101BE000D0B8C2C4C5BACDF0BDC0E7029FC0F704EB -:101BF000A1C7E9A4C4C5A7C1C203A185C6A488C35F -:101C0000A79CC0A49ED7A99ED5AE9ED3B39ED10655 -:101C1000A186C007A2CCD2A7CCD1A9C9AAC2ACC503 -:101C2000ACD0AECCAFC2B1C5CFB3CDB6C2C5B8CEC5 -:101C3000BBC2C508A3C8A8CAADCBB2CE09BAC30AF5 -:101C4000A6C7ABC9B0CB0D99CECF1F0001A5CBED78 -:101C5000D4D5A7C0C1C6E8D5AAD1F5ACC8EEAE9020 -:101C6000C8AFCEB1C3EEB9C3E6BEC0F702A5D1F38B -:101C7000A789D1B398C3C6BEC2E5C9EDD0F3D6D704 -:101C800004A2C0E4C9F1A9CFD0ACCFD003A5C0A5B0 -:101C90009DD6A792C2B19DC706A184D607A3D4A59D -:101CA000C1C6C8A8D2D4AFC9CBCDB7C4C5BCC0C506 -:101CB000CED408A2CCD2A9CB09BBCB0AA5CBACC849 -:101CC000BEC00D89D2F498C4C51F0001A5C3F0A7FA -:101CD000C9CDAAC0F7ACC9CFAFC6F7B1C9CDC6B29E -:101CE000C0E5B4CAF6B6CDB7C1E6B9C6F7BBCDBE3E -:101CF000C0F70289C9CD8EC9CF93CDB396C6B3952F -:101D0000C9B8CDBDCD04A2C1C2D2F703A289C0A576 -:101D100089D1AA91C1AA8ED4AF93D1B296C3B498F7 -:101D2000D7B79DC0B99DD206A184C307A3C5C9A8D2 -:101D3000C4CBCFD7ADCBD2D7B0C2B2CBCFB5C1B762 -:101D4000C8CBD5BCC2CBCF08A2CBA7D2B1D3BBC71F -:101D500009BBC30ABECCCED71F0001A4C5F2A6881A -:101D6000C5CBD2D3A9C3E7CBCFF3A6D4F6AB8FC3F1 -:101D7000C7CFA694D7ABC7EFD3F7AEC1E7B097C133 -:101D8000C7B0CDF4B294CDB39AC4B3C5C6B5CAEE4C -:101D9000D1D5F7B6C2C3B7C7EACED1F5B9C4E7CA41 -:101DA000CEF1BEC0F702BEC1C3C5C7C9CBCDCFD12E -:101DB000D3D5D704ADD503A488D1A98FD0B094CC06 -:101DC000D6B59DCBB598D0B5D2D406A19DC007A7F6 -:101DD000C7A9C9CDD5ACC5AECDD4B3CEB4C2B5C8F4 -:101DE000D3B7C5CFBCC2D3D708A1CAA3D4ADD2093B -:101DF000BBC90AA4C5A4CBAEC10D85D3F78ACCEE6E -:101E000096C8C91F0001A799D6A78ED4A7D0F3A959 -:101E100091D0AACCEFAC94CCADC8EBD1F3AF97C8BE -:101E2000B0C4E7CDEFB29BC4B3C0E3C9EBB59BC070 -:101E3000B6C5E7BAC1E3B299D3B2D4D5B8D4D5B553 -:101E4000CFF2B7CFB9CCEFBBCCF2BDC7F7029FC082 -:101E5000F703A79CD7A791D5A789CFAA8CCBAD8F25 -:101E6000C7B092C3B294D2B598CEB99CCB06A18626 -:101E7000D7BDC607ABD1D3AECDCFB1C9CBB0D4B3EC -:101E8000D0B4C5C7B7CCB8C1C3B9D0D2BBD3D5C8FD -:101E9000CA08A4D2A7CDAAC9BCC009B5D40AB3C088 -:101EA000BDD3BAC10D8CD1F31F00029FC0F704A4AB -:101EB000C4CAD2D6A7C1C2C5C8CBD0D3D5AAC6CCB6 -:101EC000D4ADC2C7CDD0D5B0C1C6C8CBCED4D6B3A1 -:101ED000C5C8CACDCFD3D5B6C1C4C9CCD0D2B9C27A -:101EE000C5CBD4D603A487C3D1A490C9D7A790C02B -:101EF000A78DCFAD99C3AD9ED1B69EC006A186C0B9 -:101F000007A5CACFA9C2D2D6ADC6B1D4B4CFBAC57F -:101F1000D4ACCB08AACCB6C9CCD209BCCB1F00012B -:101F2000A587C2C6D1A898C2F700A88DC8AB8DC638 -:101F3000C7AB98C5AE90CBF0AED3ACD6B597CDEFCE -:101F4000B7CC01AECDEEB9CDEEBACCEDBC9ECBEDAB -:101F5000029FC0F704A2C1F7B9D0F503A59EC0AE99 -:101F60009AD6B89ACF06A184C007AFCBD0AED3081B -:101F7000A5C9CCABC7BCD209B5CE0AA8D0AEC6BCE9 -:101F8000CB0E90CBCCCFD08FD399CC1F0001A8958E -:101F9000C0EAA8CCEFADCBF6B4D1F6B9C0EDBBC565 -:101FA000BCCEBEC0F700B093C2E4B395C9AF95CA2A -:101FB00004A3C1EEA5D0F6B1CAF003A287C0CFA892 -:101FC0008ACBAA8ECAAE92C9B295C8B99DC6CCA515 -:101FD0009DD706A184D707A8D0D2D4B2C2C4B7C2B5 -:101FE00008AACED3B1D3BBD309BBC90AB9C0BEC4FA -:101FF000BECD0F9DC0E41F0001A8C9ECD1F4ACC157 -:00000001FF diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4e.hex b/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4e.hex deleted file mode 100644 index d12ef3bf..00000000 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/roms/nu/lr-a-4e.hex +++ /dev/null @@ -1,513 +0,0 @@ -:10000000F33100E8010000FD21000010FA0D20F797 -:10001000ED5621B3E63601DB04CB7FCA416F35CD07 -:100020007A00000000FBC3CF25CD001DCD4C04CDD0 -:100030002C0718F5C7C7C7C708D9DDE5FDE5CD28EA -:1000400001CDA200CD68313A6AE5B7C44B2A3A9D8A -:10005000E5FE02CC4101CD9001FDE1DDE1D908FBD7 -:10006000C9C7C7C7C7C7FBED45C7C7C7C7C7C7C746 -:1000700093246CDB7AFB8591A380AF329DE5D3019D -:100080002100D03600545D1301F017EDB0CD2801EA -:10009000CDF408CDD608CDA66D3E00D300F680D3B2 -:1000A00000C921B5E535233521B5E6353AB9E5B7BF -:1000B0002004DB011802DB022F324DE421CFE507DB -:1000C000CB160707CB163A4DE421D0E50FCB160F20 -:1000D000CB16DB002F21AAE51FCB161FCB16DB04A6 -:1000E000CB67202921B4E57EB720113AAAE5E605C1 -:1000F000FE0520063601F1C3590018113AAAE5E6BB -:100100000AFE0A200436001804F1C35900CD230961 -:100110003AAFE5B720053E0232B2E53AA7E5B7C8E7 -:100120003AB2E5B7C8C3A0683AB3E6B72807CD39F5 -:100130007CF1C359000100011100C02100E3EDB0C2 -:10014000C9CDE603CD000BCD0013CD0024C9FDE5DC -:100150003AE9E43288E5FD2158E4111800DD7E0615 -:10016000FDBE062020DD7E07FD96073002ED44FE31 -:10017000043012FD7E0DB7280CFD7E08FE0930020A -:100180000EFFFDE1C9FD192188E53520D0FDE1C94B -:100190003A9DE5B7C83A6AE5B7CC0332DD2140E4C1 -:1001A000FD21B0E33A6AE5FE022004FD21F0E3AF51 -:1001B00032E8E4DD4E0A3AE8E4B72817DD7E0DB7F1 -:1001C000280EDD3408DD7E08FE183804DD36080010 -:1001D000CD4E0179FEFF200BFD360400FD360C00EC -:1001E000C3110306002AF6E43AE8E4B7200521002B -:1001F000001819573A02E5B728123AE9E4BA200C78 -:10020000113000193ACDE5FE082001EB0922F9E48E -:100210000160450946DD6E00DD7E01C604672929BF -:10022000290E00CB28CB19DD7E0BB72004ED421838 -:10023000010929FD74063E0017FD77073AF8E44FDF -:10024000DDCB176628010C3AE8E4B720040E03184A -:1002500011473A02E5B7280A3AE9E4B820043A6EB1 -:10026000E54FCBE1FD710011B0432AF9E41956DDE9 -:100270007E0BB720043E40AA577AE6C0FD77052AD8 -:10028000F9E47A11004219575ED5FD730411C04894 -:100290002AF9E419AF575ECB7B280115DD6E02DD2C -:1002A0006603292929176C6719EB21E900B7ED527C -:1002B000ED5BE3E519FD7502FD7403D1CB42284DDA -:1002C0001CFD730CFD7108E501704A2AF9E4097EF2 -:1002D0000600ED444FCB79280105E109FD750AFDC3 -:1002E000740B7AE6C0FD770D0110472AF9E4097E08 -:1002F000CB722802ED444F0600CB79280105FD663C -:1003000007FD6E0609FD750EFD740F1804FD360C11 -:100310000011F0FFFD19011800DD0921E8E4343A6D -:10032000E9E4BED2B3013A6AE5FE02C8FD2100E36A -:100330003A17E58787872112E586ED443C4F060092 -:100340002AE3E509FD7502FD7403FD3600123A1635 -:10035000E5C6048787876F260029FD7506FD7407AB -:100360003A10E5FD7704FD2108E3FD360400FD3673 -:100370000C0016141E02DD2118E5DD7E01FE0028AA -:100380003ADD7E03878787473EF1904F06002AE3D8 -:10039000E509FD7502FD7403DD7E02C604878787CB -:1003A0006F260029FD7506FD7407FD360012DD7EFF -:1003B00001FD7704010800FD091DC8010400DD09E5 -:1003C0001520B7219EE506007EB7281235200FE5DF -:1003D000788787875F160021C4E3193600E123047C -:1003E00078FE0838E3C9218AE57E23B623477EE6F6 -:1003F000F0B0200BAF773E0132CEE5CD0332C90E0F -:100400000021B1E63A8BE5BE20010CED5BE1E52170 -:100410008DE57E9327772B7E9A277706022B7EDE4B -:1004200000277710F8CB41C83A8BE521B1E6BEC86A -:100430007EFE1520043E1C180AFE1020043E1D18E6 -:10044000023E1ECD42317ED6052777C93AFCE4B77D -:10045000C021B6E53A04E5B7200236FF7EFE8038BB -:100460000236187E2104E5FE09300D7EFE012806C5 -:100470003E0177CD8963180B7EFE0228063E027787 -:10048000CD89633A41E4217BE5BE200C3A43E42365 -:10049000BE20053E0132AFE63AAFE6B7C83A46E4C1 -:1004A000FE08C0AFCD8963F13E00329DE53E00CD30 -:1004B00042313E23CD42313E54CD3E30CD8D323A95 -:1004C00000E5B720472121D736052B36001122D76A -:1004D000013E00EDB021A1D736052B360011A2D781 -:1004E000013E00EDB02121D836052B36001122D86F -:1004F000013E00EDB00E4721A2D711F806CD2D30F8 -:100500003E1FCD42310E02CDCF2F184C3AFFE4B73B -:10051000C264052125D736052B36001126D70138B0 -:1005200000EDB021A5D736052B360011A6D701382E -:1005300000EDB02125D836052B36001126D801381C -:1005400000EDB00E4721A6D711DC06CD2D303E1FA1 -:10055000CD42310E01CDCF2FCD03323A00E53289A5 -:10056000E5CD8906216CE53A8BE5BE3857CDB93229 -:1005700021A3D136052B360011A4D1013400EDB0F2 -:100580002123D236052B36001124D2013400EDB0E0 -:1005900021A3D236052B360011A4D2013400EDB0D0 -:1005A0000E472124D2116F06CD2D302A8BE522B6BD -:1005B000E63EFF32B5E63E013205E5CDE4052AB65A -:1005C000E6228BE5CDE405218EE54E347EFE6120EA -:1005D00002364979CDEC31B7C2005D79E607CA34FD -:1005E00028C3ED263A8FE53289E53E143288E52AA4 -:1005F0008BE57CE6F0B52832218CE57ED610277796 -:100600002B7EDE002777011000CDDB2FCD033221BA -:1006100088E53520DA218FE53A89E5BE20053E11CF -:10062000CD42313E04CD300618C03E1CCD3006C947 -:1006300032B5E53A05E5B7282A21B5E67EFE8038D1 -:100640000236287EFE143012212BD136052B3600BF -:10065000112CD1010200EDB01809212AD1116B062D -:10066000CD2D303AB5E5FE0020C9C906583200420A -:10067000454C4F572048414C462054494D45204356 -:100680004C454152414E4345003E093288E521B96F -:10069000D836052B360011BAD8010C00EDB021393F -:1006A000D936052B3600113AD9010C00EDB00E47B2 -:1006B0001126073A88E51F300C1118073A89E5B76B -:1006C0002003111F0721BAD8CD2D303E0ECD3E306C -:1006D0002188E53520D83E70CD3E30C9594F552090 -:1006E00048415645204B494C4C4544204E4F2045EF -:1006F0004E454D4945532E00594F55204D414445D7 -:1007000020495420574954484F555420454E54527F -:10071000415050494E472E000431303030300004F3 -:10072000323030303000202020202000CDCE07CDC8 -:100730001D08CDAA093A50E4B7C03AA7E5B7280E7C -:100740003E00329DE53E38CD3E30F1C38568DB0486 -:10075000CB77C83E0C324AE43E01329DE53E00CDE7 -:1007600042313E06CD42313E38CD3E303E00329DD4 -:10077000E5F1218FE5357EFEFF202A2134D711A82F -:1007800007CD2D3021B4D711B507CD2D302134D868 -:1007900011A807CD2D303E21CD42313E8CCD3E30CB -:1007A0003E023290E5C3E36A06202020202020206C -:1007B0002020202000062047414D45204F5645521D -:1007C00020002054494D45204F56455220003ACE36 -:1007D000E5B7C8DB04CB77C8F1AF32CEE5329DE593 -:1007E0003E00CD42313E25CD42312135D736052B55 -:1007F00036001136D7011400EDB00E4721B4D711E1 -:10080000C207CD2D302135D836052B36001136D80C -:10081000011400EDB03E8CCD3E30C367072A55E48D -:1008200001C0FE09D0AF3250E4329DE5CD8D3221BA -:1008300029D736052B3600112AD7012A00EDB02121 -:10084000A9D736052B360011AAD7012A00EDB02111 -:1008500029D836052B3600112AD8012A00EDB03EE2 -:10086000023289E53E10CD42313E043288E53A88B5 -:10087000E51F301221ABD736052B360011ACD7015E -:100880002800EDB0180B0E4721AAD711C008CD2DB6 -:10089000303E15CD3E302188E53520D22189E53521 -:1008A00020C23E10CD42310E4721AAD711C008CD3B -:1008B0002D303E54CD3E303A8FE5B7C0CDB932C968 -:1008C000594F552041524520424F554E4420544FD8 -:1008D000204449452E00DB032F47E60332DFE5784D -:1008E0001F1FE6034F060021F008097E32E0E5C92C -:1008F00002010304DB032F1F1F1F1F4721AFE5DB8E -:1009000004CB572011783CE6037723781F1FE603BA -:10091000FE02DEF577C9783CE60FCB5F28013C7715 -:100920002377C921ADE511AFE5DB00CD580921AE34 -:10093000E513DB021FF604CD58093AB9E54721ABB0 -:10094000E57EB72805353E02B047237EB72805353A -:100950003E04B04778D301C91F1F1FCB161FCB160B -:100960007EE655FE50202B2B2B360C3AB2E6B720F4 -:10097000083E12D300F680D3001AFE012812FE08AA -:10098000300C21B1E534BEC0AF773E011802D60865 -:10099000180D7EE6AAC021B3E5347EE60FC03C21E7 -:1009A000B2E5862730023E9977C9DB04CB6FC0CB16 -:1009B00067C8DB00CB47C0F1F1AF329DE53E00CD0B -:1009C00042312110D03600545D1301EF13EDB021F8 -:1009D00022D711290ACD2D30211AD911480ACD2D3F -:1009E000301100000E043A8EE52160D9CD48302147 -:1009F0008EE5DB01CB7F280ECB42280816007EFE59 -:100A00000238013518021601DB01CB6F2809CB43F0 -:100A100028031E003418021E013E01CD3E30DB00CB -:100A2000CB4F20C07E3DC3D4050253454C454354B3 -:100A300020425554544F4E20544F204348414E4776 -:100A40004520524F554E4400024449474C454654B8 -:100A50002D2D444F574E2020444947524947485472 -:100A60002D2D555020204C4556454C2D303000C77B -:100A7000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C706 -:100A8000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F6 -:100A9000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E6 -:100AA000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D6 -:100AB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C6 -:100AC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B6 -:100AD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A6 -:100AE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C796 -:100AF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C786 -:100B00003AA7E5B7280ECD125C324DE4FEFF200473 -:100B1000AF3250E42A44E47D6C2C2CCDD5627E2A81 -:100B200055E4FE0E38032318032100002255E4DDAE -:100B30002140E42108E57EB72801352106E57EB78E -:100B40002818353A0AE5DDBE0B200F210BE53A44A3 -:100B5000E4BE2806773E0CCD73303A4EE4B7FAB4C3 -:100B60000FC24310214CE47EB7281135C03608214E -:100B70004AE4347EE6FCFE14C83614C93A54E4FE56 -:100B800002200D061CCD9F10D0AF3254E4CD371299 -:100B90003A54E4FE01200ECD0E120620CD9F10D057 -:100BA0003E033254E4AF3251E43A44E42A45E4CD02 -:100BB000002D06F80E10CD8D2ECA9F0CAF3287E5A2 -:100BC0003254E47EE6FCFE1820133E013287E53AFB -:100BD00042E4B720083E013251E4CA9F0C3A45E492 -:100BE000FE1D300E1AE6F8FE1028071AE6F8FE0879 -:100BF000200D3E013287E53A42E4FE80DA9F0C2A5E -:100C000047E43A46E4CD152DDAB10C214FE47EB726 -:100C10002006343E15CD42313E0C324AE42109E52E -:100C20007EB7280435C3B10CCD0E122A42E47C11E4 -:100C30001E00192242E4BC280A3A87E5B72804AF0F -:100C40003242E42A42E4297C3C1F3245E429297CD3 -:100C50003246E4CD88113A42E4B7C03A44E42A452A -:100C6000E4CD002D3A45E4FE1D30061AE6F8FE08F4 -:100C7000C0150E04CDA92EC01D1D1D1D3A44E4B79C -:100C800028061AE6F8FE08C03A44E4FE17300A7B4C -:100C9000C6085F1AE6F8FE08C03E08324CE4C921D7 -:100CA0004FE47EB7280736003E16CD4231AF3252B0 -:100CB000E43A4DE4CB7FC2420FCB6FC2CF0FCB5F84 -:100CC0002806CD4C0ED81808CB572804CDB70ED81F -:100CD0003A4DE4CB47C25E0DCB4FC2210D3A44E4FE -:100CE0002A45E4CD002D1AE6F8FE08200B3E12320C -:100CF0004AE43E013249E4C906F80E10CD8D2E209B -:100D00000D151AE6F8FE10C03E08324AE4C97EE628 -:100D1000FCFE1820063E07324AE4C93E12324AE47D -:100D2000C9AF3287E53A44E42A45E4CD002D3A4480 -:100D3000E4B7280E151B1B1B1B06F80E08CD712EE1 -:100D4000200C3E013287E53A40E43DFE7FD03E0173 -:100D5000324BE4CD3712CDD40D11ECFF183DAF323C -:100D600087E53A44E42A45E4CD002D3A44E4FE17F1 -:100D7000300E151313131306F80E08CD712E200E26 -:100D80003E013287E53A40E4FE803002B7C9AF3217 -:100D90004BE4CD3712CDD40D1114002A40E47C1958 -:100DA0002240E4BC28143A87E5B7280E2A40E47DA7 -:100DB000FE803801242E002240E42A40E4297C3CB5 -:100DC0001F3244E429297C3247E4CD88110600CD46 -:100DD000F11037C93A51E4B7C8F13A4AE4E6FC21C8 -:100DE00049E4FE2C2802360135C0214AE4347EE66F -:100DF000FCFE2C2802362C7ED6184F060021204CF3 -:100E0000097E3249E421D04D097E878787875F3A82 -:100E100087E5572A40E43A4BE4B77D280D93300824 -:100E2000CB422803AF180125180983300624CB4292 -:100E30002801AF6F2240E42A40E4297C3C1F324461 -:100E4000E429297C3247E4CD881137C9AF3287E5E0 -:100E50003A44E42A45E4CD002D06F80E10CD8D2E3F -:100E600020143A45E4FE01281615151AE6F8FE0886 -:100E7000280D181718091AE6F8FE102802B7C93A03 -:100E800042E43DFE7FD03E013287E5CD0E123A446A -:100E9000E42A45E4CD002D151AE6F811E2FFFE1014 -:100EA000CA070F2154E47EFE03C2070F353E1C32F1 -:100EB0004AE4CDAB1037C9AF3287E53A45E4FE1DB1 -:100EC00030071AE6F8FE08200E3A42E4FE803002AF -:100ED000B7C93E013287E5CD0E123A44E42A43E415 -:100EE000CD002D1A15E6F8FE101A111E002018E686 -:100EF000F8FE1028122154E47EB7200B343E203235 -:100F00004AE4CDAB1037C92A42E47C192242E4BC42 -:100F100028113A87E5B7280B7DFE803801242E0082 -:100F20002242E42A42E4297C3C1F3245E429297C00 -:100F30003246E4CD88110608CDF1103E033254E468 -:100F400037C9AF320FE53A45E4FE1CD03A44E4B766 -:100F5000C83A45E46FC6033217E53A44E43D321619 -:100F6000E5CD002D06FC0E08CD7F2EC0ED5313E518 -:100F70001506F80E00CD7F2EC03E10324AE4141C38 -:100F80001C1C1C1AE6F8FE0828172C2C2C2C7EE6BC -:100F9000FCFE1828077EE6F8FE1020053E11324AB6 -:100FA000E43EFF324EE42140012211E53E01324B86 -:100FB000E43207E53A0FE5FE0ED259102A46E47DE9 -:100FC000C6086F7CD606CDEF2DDA9210C35910AF4C -:100FD000320FE53A45E4FE1CD03A44E4FE17D03A1D -:100FE00045E46FC6033217E53A44E43C3216E5CDDA -:100FF000002D06FC0E08CD7F2EC0ED5313E515061F -:10100000F80E00CD7F2EC03E10324AE4141D1D1D87 -:101010001D1AE6F8FE0828172D2D2D2D7EE6FCFE64 -:101020001828077EE6F8FE1020053E11324AE43EFD -:1010300001324EE42140012211E5AF324BE43E0182 -:101040003207E53A0FE5FE0E300F2A46E47DC6086A -:101050006F7CC606CD312E38392107E57EB72807CB -:1010600036003E01CD4231CD0E12CD37123A0FE59A -:10107000FE14D203112110E536F33A0FE51F1F309D -:101080000236F22A11E511C000192211E5210FE5FF -:1010900034C93E003210E5AF324EE43207E5C921D3 -:1010A00049E4352802B7C9214AE4343A4AE4D6185B -:1010B0004F060021204C097E3249E4B720073E014B -:1010C0003249E437C921A84E09561E00CB2ACB1B52 -:1010D000CB2ACB1BCB2ACB1B2A42E4192242E42A7F -:1010E00042E4297C3C1F3245E429297C3246E4B79E -:1010F000C92149E435C03606214AE4347EE6FCB80D -:10110000C870C9AF324EE4320CE53D320BE5CDDD9F -:101110000CED5B13E53E04CDBE2F3E003210E52101 -:1011200018E506147EB728072323232310F6C936B3 -:10113000A023233A16E5775F233A17E577572A71FC -:10114000E5B7ED52C02271E53E013202E521E9E446 -:101150007EFD2158E4011800FD093D20FB34FD7798 -:1011600000FD7702FD7301FD730415FD7203FD722E -:10117000057B878787FD77077A878787FD7706FD59 -:10118000360901FD360CB0C93A51E4B720183A408F -:10119000E4FE803802ED44FE14D03A42E4FE80388A -:1011A00002ED44FE1ED03A44E42A45E4CD002D155C -:1011B0001AE6FCFE602020CD832FED5FFE3338045D -:1011C0003E08180AFE0D38043E0918023E0ACD7387 -:1011D000303E02CD4231C9FE70C021FCE435CD5C09 -:1011E0002F0E00141AFE0420020E04210DE53A0809 -:1011F000E5B72004360018067EFE033001347E81F8 -:10120000CD73303E133208E53E02CD4231C92A404B -:10121000E47DFE803007D6143001AF1806C61430C6 -:101220000224AF6F2240E4297C3C1F3244E4292988 -:101230007C3247E4C388113A52E4B7C02A42E47DC5 -:10124000FE803007D61E3001AF1806C61E300224BD -:10125000AF6F2242E4297C3C1F3245E429297C32CD -:1012600046E4C38811C7C7C7C7C7C7C7C7C7C7C76B -:10127000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7FE -:10128000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7EE -:10129000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7DE -:1012A000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CE -:1012B000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7BE -:1012C000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7AE -:1012D000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C79E -:1012E000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C78E -:1012F000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C77E -:101300003AE9E432E8E4DD2158E4CD19131118007C -:10131000DD1921E8E43520F2C9216DE536003A02F5 -:10132000E5B728193AE8E4FE012012343A03E5B79C -:10133000280BDD7E0CFE202004DD360C40DD7E0E09 -:10134000B7C03AF5E4B72803DD3417DD7E0CB728C3 -:1013500032DD350CDD7E0CFE20DA2315DD6E07DD77 -:101360007E06CDF22EDD7E0CFEB0D0DD3509C0DD6F -:10137000360908DD340ADD7E0AE6FCFE14C8DD36D7 -:101380000A14C9DD7E14FE14200FCDF718D8061CF0 -:10139000CD661AD0DD361400C9DD7E14FE012012A0 -:1013A000CDC11BCDF718D80620CD661AD0DD361476 -:1013B00015C9DD7E15FE022019CDC11BCDF718D849 -:1013C0000628CD661AD0DD361500DD3409DD360F6E -:1013D00002C9DD7E15FE01200FCDF718D80624CDF9 -:1013E000661AD0DD361503C9DD7E06DD6E07CD9E9B -:1013F0002DDA7515DD7E04DD6E05CD002D06F80EA7 -:1014000010CD8D2ECA7515AF3287E5DD77147EE6D7 -:10141000FCFE18200C3E013287E5DD7E02B7CA755E -:1014200015DD7E05FE1D30291AE6F8FE1028221A69 -:10143000E6F8FE08281BDD7E16B728083CDDBE0551 -:10144000301C180D1AFE042015DD7E05DD771618F8 -:101450000D3E013287E5DD7E02FE80DA7515DD3650 -:101460001000CDC11BDD7E02C615DD7702300DDD1B -:1014700034033A87E5B72804AFDD7702DD6E02DD7D -:101480006603297C3C1FDD770529297CDD7706DD95 -:101490007E06DD6E07CDD32ECD391B060CCD2E1A60 -:1014A000DD7E04DD6E05CD002D247E25FE04203E6C -:1014B000DD7E0DB72819DD360D00EB06FC0E00CDE4 -:1014C0007F2E2004CD0E2FC921FCE435C9181F3A08 -:1014D0006DE5B728193A03E5B720133E013203E55D -:1014E000EB06FC0E00CD7F2E2003CD352FC9DD7E0F -:1014F00002B7C0151AFE04C03A87E5B7C8DD361634 -:1015000000DD360CC0DD361000DD360A103E05CD9C -:1015100042313A6DE5B7C0010001CDDB2F3E01320B -:1015200000E5C9B7283CFE1F200FDD361001DD366F -:101530000FFEDD3505DD3505C9FE183806DD7E0FE9 -:10154000FEFEC8DD361000DD3405DD3405DD7E0F1E -:10155000DD770BFEFE3804DD770CC9DD360A18CDC9 -:10156000761ADD360C01CDF718D80618CD661AD0DC -:10157000DD360C00C9DD361600DD361001DD7E0FCC -:10158000B7CA85173DCA29173DCA5D163DCA9A15C7 -:10159000DD6E07DD7E06CDF22EC9AF3287E5DD7E3A -:1015A00005FE012823DD7E04DD6E05CD002D06F845 -:1015B0000E10CD8D2E200B15151AE6F8FE082014FE -:1015C00018061AE6F8FE10C0DD7E023DFE7FD03E12 -:1015D000013287E5CDC11BDD7E04DD6E03CD002D1C -:1015E00024247EE6F8FE1020301AE6F8FE102029AA -:1015F000151AE6F8FE102821DD7E14FE15201ADDEE -:101600003514DD460ADD4E09C5DD360A1CCD761AD5 -:10161000C13041DD700ADD7109DD7E02D615DD774E -:1016200002300F3A87E5B72806AFDD77021803DDF1 -:101630003503DD6E02DD6603297C3C1FDD7705295D -:10164000297CDD7706CD391BCD7A1B0608CD2E1AF5 -:10165000DD361415DD7E06DD6E07C3D32EDD7E0676 -:10166000DD6E07CD9E2DD8AF3287E5DD7E05FE1DF0 -:101670003010DD7E04DD6E05CD002D1AE6F8FE0883 -:10168000200BDD7E02FE80D83E013287E57EE6FC3F -:10169000FE182017DD7E15FE032010DD3515DD3622 -:1016A0000A28CD761AD0DD360A0CC9CDC11BDD7EE5 -:1016B00004DD6E03CD002D1AE6F8FE102029151A60 -:1016C000E6F8FE102821DD7E14FE15281ADD3414FC -:1016D000DD460ADD4E09C5DD360A20CD761AC13059 -:1016E0003FDD700ADD7109DD7E02C615DD7702304F -:1016F0000DDD34033A87E5B72804AFDD7702DD6EF0 -:1017000002DD6603297C3C1FDD770529297CDD7716 -:1017100006CD391BCD7A1B0608CD2E1ADD361415E1 -:10172000DD7E06DD6E07C3D32EDD6E06DD7E07CDC2 -:10173000EF2DD8AF3287E5DD7E04B72816DD7E04B5 -:10174000DD6E05CD002D2B2B2B2B06F80E08CD8D35 -:101750002E200CDD7E003DFE7FD03E013287E53E2F -:1017600001DD770BCDEE1BCD4C18DD7E00D60EDDF6 -:101770007700300F3A87E5B72806AFDD770018030A -:10178000DD35011857DD6E06DD7E07CD312ED8AF71 -:101790003287E5DD7E04FE173016DD7E04DD6E0542 -:1017A000CD002D2323232306F80E08CD8D2E200BEC -:1017B000DD7E00FE80D83E013287E5AFDD770BCDC0 -:1017C000EE1BCD4C18DD7E00C60EDD7700300DDD42 -:1017D00034013A87E5B728ABAFDD7700DD6E00DD79 -:1017E0006601297C3C1FDD770429297CDD7707CD44 -:1017F000391BCD7A1BDD6E06DD7E0BB7DD7E07283B -:1018000005CDB92E1803CDB52EDD7E04DD6E05CDD8 -:10181000002DE6FCFE182019DD7E15B7200BDD3407 -:1018200015DD360A24CD761AD0DD361503060418E8 -:1018300018DD7E15FE03200BDD3515DD360A28CDBB -:10184000761AD0DD3615000600C32E1A3A6DE5B7BC -:1018500020073AFBE4B7C818053A6FE5B7C8DD7E44 -:1018600004DD6E05CD002DE6FCFE18C0F1DD6E0630 -:10187000DD7E0BB7DD7E072805CDB92E1803CDB56B -:101880002EDD7E0AE6FCFE2C2804DD360901DD355E -:1018900009C0DD340ADD7E0AE6FCFE2C2804DD36B4 -:1018A0000A2CCD191B21204C097EDD770921D04D52 -:1018B000097EB7C8878787875F3A87E557DD7E004F -:1018C000DDCB0B46280F93300ACB422803AF180319 -:1018D000DD3501180B833008DD3401CB422801AF20 -:1018E000DD7700DD6E00DD6601297C3C1FDD7704BD -:1018F00029297CDD7707C9DD7E0FFEFFC8E603CA14 -:10190000A6193DCAEA193D2859DD7E0CB7280FDD1E -:101910007E04DD6E05CD002DE6F8FE0837C8DDCB70 -:101920000F6E200ADD7E06DD6E07CDA22DD8DD46C6 -:101930000FCB782020DD7E02D620DD77023003DD5C -:101940003503DD6E02DD6603297C3C1FDD7705294A -:10195000297CDD7706DD7E06DD6E07CB70CCD32ECD -:10196000B7C9DDCB0F6E200ADD7E06DD6E07CD9E8A -:101970002DD8DD460FCB782020DD7E02C620DD7716 -:10198000023003DD3403DD6E02DD6603297C3C1F7B -:10199000DD770529297CDD7706DD7E06DD6E07CB48 -:1019A00070CCD32EB7C9DDCB0F6E200ADD6E06DDFD -:1019B0007E07CD312ED8DD460FCB782020DD7E008E -:1019C000C610DD77003003DD3401DD6E00DD660119 -:1019D000297C3C1FDD770429297CDD7707DD6E0635 -:1019E000DD7E07CB70CCB52EB7C9DDCB0F6E200ADC -:1019F000DD6E06DD7E07CDEF2DD8DD460FCB7820DE -:101A000020DD7E00D610DD77003003DD3501DD6E90 -:101A100000DD6601297C3C1FDD770429297CDD7708 -:101A200007DD6E06DD7E07CB70CCB92EB7C9DD357C -:101A300009C0DD360906DD340ADD7E0AFE03201208 -:101A40003ACDE55F1600215D1A197EB72804DD70D6 -:101A50000AC9DD7E0AE6FCB8C8DD700AC9000001CB -:101A6000010000010000DD3509C0DD340ADD7E0A19 -:101A7000E6FCB8C20D1BDD361000CD191B21204C31 -:101A8000097EDD7709B7CA0D1B21F84C097E57E6A0 -:101A9000032007DDCB0B46280114DD720F21D04D4A -:101AA000097EB72830878787871600DDCB0B46284D -:101AB00003ED44155FDD6E00DD660119DD7500DDA7 -:101AC0007401DD6E00DD6601297C3C1FDD77042991 -:101AD000297CDD770721A84E097EB7282F561E00E6 -:101AE000CB2ACB1BCB2ACB1BCB2ACB1BDD6E02DD3B -:101AF000660319DD7502DD7403DD6E02DD66032900 -:101B00007C3C1FDD770529297CDD7706C9DD350A98 -:101B1000DD3409DD360FFF37C93A6DE5B728083ADD -:101B2000CDE5E6073C18033ACDE5478780878787F0 -:101B3000DD860AD6184F0600C93A6DE5B7C0DD7ECE -:101B400000FE803802ED44FE0ED0DD7E02FE8038BD -:101B500002ED44FE15D0DD7E04DD6E05CD002D15B1 -:101B60001AE6FCFE70C0DD7E0DB7C03A68E5C6041B -:101B7000878787DD770DCD5C2FC9DD7E0DB7C8DD8A -:101B80007E0FFE02D0DD7E0AFE043803FE08D8DD9B -:101B90007E04DD6E05CD002D1506FC0E00CD7F2EDA -:101BA000C0DD350DC0DD7E0FFE00DD7E002006FEAF -:101BB00080300A1804FE803804CD0E2FC9DD340DA4 -:101BC000C9DD7E00FE803007D60E3001AF1808C692 -:101BD0000E3004DD3401AFDD77006FDD6601297C56 -:101BE0003C1FDD770429297CDD7707C3391BDD7EA7 -:101BF00002FE803007D6153001AF1808C615300434 -:101C0000DD3403AFDD77026FDD6603297C3C1FDD29 -:101C1000770529297CDD7706C3391BC7C7C7C7C726 -:101C2000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C744 -:101C3000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C734 -:101C4000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C724 -:101C5000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C714 -:101C6000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C704 -:101C7000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7F4 -:101C8000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7E4 -:101C9000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7D4 -:101CA000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C4 -:101CB000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7B4 -:101CC000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7A4 -:101CD000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C794 -:101CE000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C784 -:101CF000C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C774 -:101D00003AE9E432EAE4DD2158E4FD21EBE4DD7E4A -:101D100010B7281CDD6E04DD660522EFE4DD7E07CA -:101D200032F2E4CDFD1D47DD7E10B72803DD700FD4 -:101D3000111800DD1921EAE43520D33AE9E432EA4A -:101D4000E4DD2158E4DD7E04DD6E052C2CCDD5626A -:101D50007EE60DFE0D280A2101E57EFE39D0360013 -:101D6000C9111800DD1921EAE43520D92101E57EE9 -:101D7000FE38300234C9C0343E00329DE521B5E55D -:101D80007EBE28FDCD8D322129D736052B36001198 -:101D90002AD7012E00EDB021A9D736052B36001128 -:101DA000AAD7012E00EDB02129D836052B36001117 -:101DB0002AD8012E00EDB00E4721AAD711E51DCD7E -:101DC0002D303E1FCD42310E01CDCF2FCD03323EFF -:101DD000013289E5CD8906CDB9323E26CD42313E6C -:101DE00002329DE5C9414C4C20454E454D49455375 -:101DF00020415245205345414C45442E003A45E48C -:101E0000FDBE05C2B91EFD4604FD7E072147E4BEA6 -:101E1000380520543EFFC93A44E4B820033E00C9C7 -:101E20000478FD6E05CD002DE6FCFE1828E97EE65F -:101E3000F8FE1028E2247E25E6F8FE1028D9FD7E63 -:101E400005FE1D30D27EE6F8FE08286D247EE6F8F9 -:101E5000FE0828651AE6F8FE1028BC1AFE0428B70A -:101E6000E6F8FE0828B118513A44E4B820033E01D0 -:101E7000C90578FD6E05CD002DE6FCFE1828E97E2B -:101E8000E6F8FE1028E2247E25E6F8FE1028D9FDAB -:101E90007E05FE1D30D27EE6F8FE08281C247EE674 -:101EA000F8FE0828141AE6F8FE1028BC1AFE0428CA -:101EB000B7E6F8FE0828B118003EFF32EDE432EE36 -:101EC000E4FD7E0432EBE432ECE4CDE01ECD2B1FCA -:101ED000CD771FCD961FCDB91FCDF11F3AEDE4C9C7 -:101EE0003AEBE4B728443DFD6E05CD002D06F80E13 -:101EF00008CD8D2EC806F80E10CD8D2E28257EE635 -:101F0000FCFE18281EFD7E05FE1D30171AE6F8FEA1 -:101F10001028101AFE04280BE6F8FE08280521EB0D -:101F2000E435C921EBE4357E18B9C93AECE4FE1773 -:101F300030443CFD6E05CD002D06F80E08CD8D2EEB -:101F4000C806F80E10CD8D2E28257EE6FCFE18283A -:101F50001EFD7E05FE1D30171AE6F8FE1028101A29 -:101F6000FE04280BE6F8FE08280521ECE434C9211C -:101F7000ECE4347E18B8C9FD7E04CD2A20FDBE05F0 -:101F8000C832F3E4FD4E04CD3D2121EEE4BED0770E -:101F90003E0232EDE4C9FD7E04CDB620FDBE05C88B -:101FA000FD4E0432F4E4CD3D2121EEE447781800E3 -:101FB000BED0773E0332EDE4C921EBE47EFDBE04E2 -:101FC0003015CD2A20CDD81F3AEBE4CDB620CDD8A0 -:101FD0001F21EBE43418E5C9FDBE05C821EBE44E32 -:101FE000CD3D2121EEE4BED032EEE43E0132EDE4FF -:101FF000C921ECE4FD7E04BE30167ECD2A20CD1131 -:00000001FF From a6b61b8b60e7b74e5d6f12e4aa29d16948a07dde Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 3 Mar 2020 20:33:00 +0100 Subject: [PATCH 08/35] LodeRunner: rename to IremM62 --- .../LodeRunner_MiST.qpf => IremM62.qpf} | 2 +- .../LodeRunner_MiST.qsf => IremM62.qsf} | 84 +++++++++---------- .../LodeRunner_MiST.sdc => IremM62.sdc} | 0 .../{LodeRunner_MiST => }/clean.bat | 0 .../meta/Kung Fu Master.mra | 0 .../meta/Lode Runner.mra | 0 .../{LodeRunner_MiST => }/rtl/Graphics.VHD | 0 .../{LodeRunner_MiST => }/rtl/Inputs.VHD | 0 .../IremM62_MiST.sv} | 4 +- .../{LodeRunner_MiST => }/rtl/Sound_Board.vhd | 0 .../{LodeRunner_MiST => }/rtl/YM2149.sv | 0 .../{LodeRunner_MiST => }/rtl/bitmapctl_e.vhd | 0 .../{LodeRunner_MiST => }/rtl/build_id.tcl | 0 .../{LodeRunner_MiST => }/rtl/clk_div.vhd | 0 .../{LodeRunner_MiST => }/rtl/cpu68.vhd | 0 .../{LodeRunner_MiST => }/rtl/dpram.vhd | 0 .../{LodeRunner_MiST => }/rtl/dprom_2r.vhd | 0 .../rtl/input_mapper.vhd | 0 .../{LodeRunner_MiST => }/rtl/pace.vhd | 0 .../{LodeRunner_MiST => }/rtl/pace_pkg.vhd | 0 .../rtl/pace_pkg_body.vhd | 0 .../{LodeRunner_MiST => }/rtl/platform.vhd | 0 .../rtl/platform_pkg.vhd | 0 .../rtl/platform_variant_pkg.vhd | 0 .../{LodeRunner_MiST => }/rtl/pll_mist.qip | 0 .../{LodeRunner_MiST => }/rtl/pll_mist.vhd | 0 .../{LodeRunner_MiST => }/rtl/sdram.sv | 0 .../{LodeRunner_MiST => }/rtl/spram.vhd | 0 .../rtl/sprite_array.vhd | 0 .../{LodeRunner_MiST => }/rtl/sprite_pkg.vhd | 0 .../rtl/sprite_pkg_body.vhd | 0 .../{LodeRunner_MiST => }/rtl/spritectl.vhd | 0 .../{LodeRunner_MiST => }/rtl/spritereg.vhd | 0 .../{LodeRunner_MiST => }/rtl/sprom.vhd | 0 .../{LodeRunner_MiST => }/rtl/target_top.vhd | 0 .../{LodeRunner_MiST => }/rtl/tilemapctl.vhd | 0 .../rtl/video_controller.vhd | 0 .../rtl/video_controller_pkg.vhd | 0 .../rtl/video_controller_pkg_body.vhd | 0 .../{LodeRunner_MiST => }/rtl/video_mixer.vhd | 0 40 files changed, 45 insertions(+), 45 deletions(-) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST/LodeRunner_MiST.qpf => IremM62.qpf} (97%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST/LodeRunner_MiST.qsf => IremM62.qsf} (77%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST/LodeRunner_MiST.sdc => IremM62.sdc} (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/clean.bat (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/meta/Kung Fu Master.mra (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/meta/Lode Runner.mra (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/Graphics.VHD (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/Inputs.VHD (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST/rtl/LodeRunner_MiST.sv => rtl/IremM62_MiST.sv} (99%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/Sound_Board.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/YM2149.sv (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/bitmapctl_e.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/build_id.tcl (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/clk_div.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/cpu68.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/dpram.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/dprom_2r.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/input_mapper.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/pace.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/pace_pkg.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/pace_pkg_body.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/platform.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/platform_pkg.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/platform_variant_pkg.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/pll_mist.qip (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/pll_mist.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/sdram.sv (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/spram.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/sprite_array.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/sprite_pkg.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/sprite_pkg_body.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/spritectl.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/spritereg.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/sprom.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/target_top.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/tilemapctl.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/video_controller.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/video_controller_pkg.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/video_controller_pkg_body.vhd (100%) rename Arcade_MiST/IremM62 Hardware/{LodeRunner_MiST => }/rtl/video_mixer.vhd (100%) diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qpf b/Arcade_MiST/IremM62 Hardware/IremM62.qpf similarity index 97% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qpf rename to Arcade_MiST/IremM62 Hardware/IremM62.qpf index dbbbab92..6de01b99 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qpf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qpf @@ -27,4 +27,4 @@ DATE = "23:49:02 July 13, 2012" # Revisions -PROJECT_REVISION = "LodeRunner_MiST" +PROJECT_REVISION = "IremM62" diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf similarity index 77% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf rename to Arcade_MiST/IremM62 Hardware/IremM62.qsf index c528b1d2..eb267fb3 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -25,7 +25,7 @@ # Notes: # # 1) The default values for assignments are stored in the file: -# LodeRunner_MiST_assignment_defaults.qdf +# IremM62_MiST_assignment_defaults.qdf # If this file doesn't exist, see file: # assignment_defaults.qdf # @@ -44,7 +44,7 @@ set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL set_global_assignment -name LAST_QUARTUS_VERSION "13.1 SP4.26" set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" set_global_assignment -name SMART_RECOMPILE ON -set_global_assignment -name SYSTEMVERILOG_FILE rtl/LodeRunner_MiST.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/IremM62_MiST.sv set_global_assignment -name VHDL_FILE rtl/target_top.vhd set_global_assignment -name VHDL_FILE rtl/platform_variant_pkg.vhd set_global_assignment -name VHDL_FILE rtl/platform_pkg.vhd @@ -76,9 +76,9 @@ set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd set_global_assignment -name VHDL_FILE rtl/cpu68.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv set_global_assignment -name VHDL_FILE rtl/Sound_Board.vhd -set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip -set_global_assignment -name QIP_FILE ../../../common/CPU/T80/T80.qip -set_global_assignment -name VHDL_FILE ../../../common/CPU/T80/Z80.vhd +set_global_assignment -name QIP_FILE ../../common/mist/mist.qip +set_global_assignment -name QIP_FILE ../../common/CPU/T80/T80.qip +set_global_assignment -name VHDL_FILE ../../common/CPU/T80/Z80.vhd # Pin & Location Assignments # ========================== @@ -161,7 +161,7 @@ set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS ON # Analysis & Synthesis Assignments # ================================ set_global_assignment -name FAMILY "Cyclone III" -set_global_assignment -name TOP_LEVEL_ENTITY LodeRunner_MiST +set_global_assignment -name TOP_LEVEL_ENTITY IremM62_MiST set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP @@ -216,58 +216,58 @@ set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" - set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall # ----------------------------- -# start ENTITY(LodeRunner_MiST) +# start ENTITY(IremM62_MiST) # Pin & Location Assignments # ========================== - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[*] - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[*] - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[0] - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[1] - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQMH - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQML - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nRAS - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCAS - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nWE - set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCS - set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[*] - set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[*] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[*] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[*] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[0] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[1] +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQMH +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQML +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nRAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCAS +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nWE +set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCS +set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[*] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[*] # Fitter Assignments # ================== - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[*] - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[*] - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_BA[*] - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQML - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQMH - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nRAS - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCAS - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nWE - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCS - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CKE - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CLK - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[*] - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[*] - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[*] - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_HS - set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_VS - set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_L - set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_R - set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SPI_DO +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_BA[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQML +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQMH +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nRAS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCAS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nWE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CKE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CLK +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[*] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_HS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_VS +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_L +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_R +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SPI_DO # start DESIGN_PARTITION(Top) # --------------------------- # Incremental Compilation Assignments # =================================== - 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 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 # end DESIGN_PARTITION(Top) # ------------------------- -# end ENTITY(LodeRunner_MiST) +# end ENTITY(IremM62_MiST) # --------------------------- set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.sdc b/Arcade_MiST/IremM62 Hardware/IremM62.sdc similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/LodeRunner_MiST.sdc rename to Arcade_MiST/IremM62 Hardware/IremM62.sdc diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/clean.bat b/Arcade_MiST/IremM62 Hardware/clean.bat similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/clean.bat rename to Arcade_MiST/IremM62 Hardware/clean.bat diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Kung Fu Master.mra b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Kung Fu Master.mra rename to Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Lode Runner.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/meta/Lode Runner.mra rename to Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Graphics.VHD rename to Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Inputs.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Inputs.VHD similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Inputs.VHD rename to Arcade_MiST/IremM62 Hardware/rtl/Inputs.VHD diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv similarity index 99% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv rename to Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 74e252b2..e10d31fe 100644 --- a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/LodeRunner_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -1,4 +1,4 @@ -module LodeRunner_MiST( +module IremM62_MiST( output LED, output [5:0] VGA_R, output [5:0] VGA_G, @@ -33,7 +33,7 @@ module LodeRunner_MiST( `define CORE_NAME "LDRUN" wire [6:0] core_mod; -localparam CONF_STR = { +localparam CONF_STR = { `CORE_NAME,";;", "O2,Rotate Controls,Off,On;", "O34,Scanlines,Off,25%,50%,75%;", diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd b/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/Sound_Board.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/YM2149.sv b/Arcade_MiST/IremM62 Hardware/rtl/YM2149.sv similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/YM2149.sv rename to Arcade_MiST/IremM62 Hardware/rtl/YM2149.sv diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/bitmapctl_e.vhd b/Arcade_MiST/IremM62 Hardware/rtl/bitmapctl_e.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/bitmapctl_e.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/bitmapctl_e.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/build_id.tcl b/Arcade_MiST/IremM62 Hardware/rtl/build_id.tcl similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/build_id.tcl rename to Arcade_MiST/IremM62 Hardware/rtl/build_id.tcl diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/clk_div.vhd b/Arcade_MiST/IremM62 Hardware/rtl/clk_div.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/clk_div.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/clk_div.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/cpu68.vhd b/Arcade_MiST/IremM62 Hardware/rtl/cpu68.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/cpu68.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/cpu68.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/dpram.vhd b/Arcade_MiST/IremM62 Hardware/rtl/dpram.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/dpram.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/dpram.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/dprom_2r.vhd b/Arcade_MiST/IremM62 Hardware/rtl/dprom_2r.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/dprom_2r.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/dprom_2r.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/input_mapper.vhd b/Arcade_MiST/IremM62 Hardware/rtl/input_mapper.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/input_mapper.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/input_mapper.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/pace.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace_pkg.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace_pkg.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/pace_pkg.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace_pkg_body.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace_pkg_body.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pace_pkg_body.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/pace_pkg_body.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/platform.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_pkg.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/platform_variant_pkg.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pll_mist.qip b/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.qip similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pll_mist.qip rename to Arcade_MiST/IremM62 Hardware/rtl/pll_mist.qip diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pll_mist.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/pll_mist.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sdram.sv b/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sdram.sv rename to Arcade_MiST/IremM62 Hardware/rtl/sdram.sv diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spram.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spram.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spram.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/spram.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_array.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg_body.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg_body.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprite_pkg_body.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg_body.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritectl.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritereg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritereg.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/spritereg.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/spritereg.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprom.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprom.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/sprom.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/sprom.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/target_top.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/tilemapctl.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg_body.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg_body.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_controller_pkg_body.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg_body.vhd diff --git a/Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_mixer.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd similarity index 100% rename from Arcade_MiST/IremM62 Hardware/LodeRunner_MiST/rtl/video_mixer.vhd rename to Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd From 0819e6964def7e78a0dd9d2fabfecc951bdfa65d Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 3 Mar 2020 21:01:52 +0100 Subject: [PATCH 09/35] IremM62: dedicated clock routing to SDRAM, sync SDRAM to vid_clk --- Arcade_MiST/IremM62 Hardware/IremM62.qsf | 2 +- Arcade_MiST/IremM62 Hardware/IremM62.sdc | 19 ++++----- .../IremM62 Hardware/rtl/IremM62_MiST.sv | 11 +++-- Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd | 42 +++++++++---------- Arcade_MiST/IremM62 Hardware/rtl/sdram.sv | 5 +++ 5 files changed, 43 insertions(+), 36 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf index eb267fb3..1ede7f11 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -191,7 +191,7 @@ set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULA set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON -set_global_assignment -name FITTER_EFFORT "STANDARD FIT" +set_global_assignment -name FITTER_EFFORT "AUTO FIT" # Assembler Assignments # ===================== diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.sdc b/Arcade_MiST/IremM62 Hardware/IremM62.sdc index fe1199b3..7d9dfa3c 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.sdc +++ b/Arcade_MiST/IremM62 Hardware/IremM62.sdc @@ -53,9 +53,9 @@ set_time_format -unit ns -decimal_places 3 create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] -set sdram_clk "pll|altpll_component|auto_generated|pll1|clk[2]" -set vid_clk "pll|altpll_component|auto_generated|pll1|clk[0]" -set game_clk "pll|altpll_component|auto_generated|pll1|clk[0]" +set sdram_clk "pll|altpll_component|auto_generated|pll1|clk[0]" +set vid_clk "pll|altpll_component|auto_generated|pll1|clk[1]" +set game_clk "pll|altpll_component|auto_generated|pll1|clk[1]" set aud_clk "pll|altpll_component|auto_generated|pll1|clk[3]" #************************************************************** @@ -91,11 +91,11 @@ set_input_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_ # Set Output Delay #************************************************************** -set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] -set_output_delay -add_delay -clock_fall -clock [get_clocks $aud_clk] 1.000 [get_ports {AUDIO_L}] -set_output_delay -add_delay -clock_fall -clock [get_clocks $aud_clk] 1.000 [get_ports {AUDIO_R}] -set_output_delay -add_delay -clock_fall -clock [get_clocks $sdram_clk] 1.000 [get_ports {LED}] -set_output_delay -add_delay -clock_fall -clock [get_clocks $vid_clk] 1.000 [get_ports {VGA_*}] +set_output_delay -add_delay -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock [get_clocks $aud_clk] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock [get_clocks $aud_clk] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock [get_clocks $game_clk] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock [get_clocks $vid_clk] 1.000 [get_ports {VGA_*}] set_output_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -max 1.5 [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}] set_output_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -min -0.8 [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}] @@ -106,6 +106,7 @@ set_output_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] set_clock_groups -asynchronous -group [get_clocks $sdram_clk] -group [get_clocks $aud_clk] +set_clock_groups -asynchronous -group [get_clocks $game_clk] -group [get_clocks $aud_clk] #************************************************************** # Set False Path @@ -117,8 +118,6 @@ set_clock_groups -asynchronous -group [get_clocks $sdram_clk] -group [get_clocks # Set Multicycle Path #************************************************************** -set_multicycle_path -from [get_clocks $game_clk] -to [get_clocks $sdram_clk] -setup 2 -set_multicycle_path -from [get_clocks $game_clk] -to [get_clocks $sdram_clk] -hold 1 set_multicycle_path -to {VGA_*[*]} -setup 3 set_multicycle_path -to {VGA_*[*]} -hold 2 diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index e10d31fe..3ae562d9 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -57,9 +57,9 @@ wire pll_locked; pll_mist pll( .inclk0(CLOCK_27), .areset(0), - .c0(clk_sys), - .c1(clk_vid), - .c2(clk_sd), + .c0(clk_sd), + .c1(clk_sys), + .c2(clk_vid), .c3(clk_aud), .locked(pll_locked) ); @@ -144,12 +144,15 @@ data_io data_io( ); wire [24:0] sp_ioctl_addr = ioctl_addr - 20'h30000; +reg clkref; +always @(posedge clk_vid) clkref <= ~clkref; reg port1_req, port2_req; sdram sdram( .*, .init_n ( pll_locked ), - .clk ( clk_sd ), + .clk ( clk_sd ), + .clkref ( clkref ), // port1 used for main + sound CPU .port1_req ( port1_req ), diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd index ebe4c7e7..044c0700 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd @@ -166,19 +166,19 @@ BEGIN bandwidth_type => "AUTO", clk0_divide_by => 27, clk0_duty_cycle => 50, - clk0_multiply_by => 44, + clk0_multiply_by => 88, clk0_phase_shift => "0", clk1_divide_by => 27, clk1_duty_cycle => 50, - clk1_multiply_by => 11, + clk1_multiply_by => 44, clk1_phase_shift => "0", clk2_divide_by => 27, clk2_duty_cycle => 50, - clk2_multiply_by => 88, + clk2_multiply_by => 11, clk2_phase_shift => "0", - clk3_divide_by => 9000, + clk3_divide_by => 5400, clk3_duty_cycle => 50, - clk3_multiply_by => 299, + clk3_multiply_by => 179, clk3_phase_shift => "0", compensate_clock => "CLK0", inclk0_input_frequency => 37037, @@ -269,10 +269,10 @@ END SYN; -- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE3 STRING "50.00000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "44.000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "11.000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "88.000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "0.897000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "88.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "44.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "11.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "0.895000" -- 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" @@ -306,13 +306,13 @@ END SYN; -- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "88" -- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" -- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" --- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "44.00000000" --- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "11.00000000" --- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "88.00000000" --- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "0.89700000" --- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" --- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" --- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "88.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "44.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "11.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "0.89500000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "1" -- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 STRING "1" -- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" -- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" @@ -371,19 +371,19 @@ END SYN; -- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" -- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "27" -- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "44" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "88" -- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" -- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" -- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "11" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "44" -- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" -- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "27" -- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "88" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "11" -- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" --- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "9000" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "5400" -- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "299" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "179" -- Retrieval info: CONSTANT: CLK3_PHASE_SHIFT STRING "0" -- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" -- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv b/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv index 267f2759..edaa784b 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv @@ -37,6 +37,7 @@ module sdram ( // cpu/chipset interface input init_n, // init signal after FPGA config to initialize RAM input clk, // sdram clock + input clkref, // sync the state machine to clkref rising edge input port1_req, output reg port1_ack, @@ -108,8 +109,12 @@ localparam STATE_LAST = 3'd7; reg [2:0] t; always @(posedge clk) begin + reg clkref_d; + clkref_d <= clkref; + t <= t + 1'd1; if (t == STATE_LAST) t <= STATE_RAS0; + if (~clkref_d & clkref) t <= STATE_RAS0; end // --------------------------------------------------------------------- From 8493abb8a290a37f1413f14df1afc804e32011dc Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Wed, 4 Mar 2020 18:14:40 +0100 Subject: [PATCH 10/35] ItemM52: fix Kung Fu Master sprites --- .../IremM62 Hardware/meta/Kung Fu Master.mra | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra index d120c54b..083dc27a 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra @@ -50,42 +50,42 @@ + + + + + + + + - + + + - - - - - - - - - - + + + + + + + + - + + + - - - - - - - - - - From e3c642c295a2888e75259004d2a77210b1dbec58 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Wed, 4 Mar 2020 19:15:03 +0100 Subject: [PATCH 11/35] IremM62: 256/384 pixel wide switch --- Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 8 ++++++-- Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd | 6 +++--- Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd | 2 +- Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd | 4 ++-- Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd | 9 ++++++--- .../IremM62 Hardware/rtl/video_controller_pkg.vhd | 1 + 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index 4b8295c3..773a3b42 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -50,6 +50,7 @@ architecture SYN of Graphics is signal rgb_data : RGB_t; -- before OSD is mixed in signal video_o_s : to_VIDEO_t; + signal irem62_hsize : integer range 0 to 384; begin @@ -69,13 +70,15 @@ begin graphics_o.hblank <= video_o_s.hblank; graphics_o.vblank <= video_o_s.vblank; --graphics_o.vblank <= from_video_ctl.vblank; - + + irem62_hsize <= 384 when hwsel = HW_LDRUN else 256; + pace_video_controller_inst : entity work.pace_video_controller generic map ( CONFIG => PACE_VIDEO_CONTROLLER_TYPE, DELAY => PACE_VIDEO_PIPELINE_DELAY, - H_SIZE => PACE_VIDEO_H_SIZE, + --H_SIZE => PACE_VIDEO_H_SIZE, V_SIZE => PACE_VIDEO_V_SIZE, L_CROP => PACE_VIDEO_L_CROP, R_CROP => PACE_VIDEO_R_CROP, @@ -89,6 +92,7 @@ begin ( -- clocking etc video_i => video_i, + H_SIZE => irem62_hsize, -- register interface reg_i.h_scale => "000", diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd index b3116c6c..0c243f3e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd @@ -42,14 +42,14 @@ package platform_pkg is constant PACE_VIDEO_BORDER_RGB : RGB_t := RGB_BLACK; - constant M62_VIDEO_H_SIZE : integer := 384; - constant M62_VIDEO_H_OFFSET : integer := (512-M62_VIDEO_H_SIZE)/2; +-- constant M62_VIDEO_H_SIZE : integer := 384; +-- constant M62_VIDEO_H_OFFSET : integer := (512-M62_VIDEO_H_SIZE)/2; constant M62_VIDEO_V_SIZE : integer := 256; constant PACE_VIDEO_NUM_BITMAPS : natural := 0; constant PACE_VIDEO_NUM_TILEMAPS : natural := 1; constant PACE_VIDEO_NUM_SPRITES : natural := 32; - constant PACE_VIDEO_H_SIZE : integer := M62_VIDEO_H_SIZE; +-- constant PACE_VIDEO_H_SIZE : integer := M62_VIDEO_H_SIZE; constant PACE_VIDEO_V_SIZE : integer := M62_VIDEO_V_SIZE; constant PACE_VIDEO_L_CROP : integer := 0; constant PACE_VIDEO_R_CROP : integer := PACE_VIDEO_L_CROP; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index 89b07b1c..a8c86619 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -78,7 +78,7 @@ begin ld_r <= ctl_i.ld; if video_ctl.hblank = '1' then - x := unsigned(reg_i.x) - M62_VIDEO_H_OFFSET + PACE_VIDEO_PIPELINE_DELAY - 3; + x := unsigned(reg_i.x) - video_ctl.video_h_offset + PACE_VIDEO_PIPELINE_DELAY - 3; y := 256 + 128 - 18 - unsigned(reg_i.y); -- hande sprite height, placement diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index 9ed4a25b..7c558e6e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -58,8 +58,8 @@ begin ctl_o.tile_a(ctl_o.tile_a'left downto 13) <= (others => '0'); -- screen rotation - x <= std_logic_vector(M62_VIDEO_H_OFFSET + unsigned(video_ctl.x)) when unsigned(y) < 6*8 else - std_logic_vector(M62_VIDEO_H_OFFSET + unsigned(video_ctl.x) + unsigned(hscroll(8 downto 0))); + x <= std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x)) when unsigned(y) < 6*8 else + std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x) + unsigned(hscroll(8 downto 0))); -- when rot_en = '0' else not video_ctl.y; --y <= not video_ctl.y when rot_en = '0' else 32 + video_ctl.x; y <= video_ctl.y; -- when rot_en = '0' else video_ctl.x; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd index 921a8d2c..213bb6b2 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd @@ -4,13 +4,13 @@ use ieee.numeric_std.all; library work; use work.video_controller_pkg.all; +use ieee.numeric_std.all; entity pace_video_controller is generic ( CONFIG : PACEVideoController_t := PACE_VIDEO_NONE; DELAY : integer := 1; - H_SIZE : integer; V_SIZE : integer; L_CROP : integer range 0 to 255; R_CROP : integer range 0 to 255; @@ -24,6 +24,7 @@ entity pace_video_controller is ( -- clocking etc video_i : in from_VIDEO_t; + H_SIZE : integer; -- register interface reg_i : in VIDEO_REG_t; @@ -43,7 +44,7 @@ architecture SYN of pace_video_controller is constant SIM_DELAY : time := 2 ns; - constant VIDEO_H_SIZE : integer := H_SIZE * H_SCALE; + signal VIDEO_H_SIZE : integer := H_SIZE * H_SCALE; constant VIDEO_V_SIZE : integer := V_SIZE * V_SCALE; subtype reg_t is integer range 0 to 2047; @@ -99,8 +100,10 @@ architecture SYN of pace_video_controller is begin + video_ctl_o.video_h_offset <= to_integer(shift_right(to_unsigned(512-VIDEO_H_SIZE, 9), 1)); + -- registers - reg_proc: process (reset, clk) + reg_proc: process (reset, clk, VIDEO_H_SIZE) begin --if reset = '1' then diff --git a/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd index f712941c..42f80de6 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd @@ -81,6 +81,7 @@ package video_controller_pkg is vblank : std_logic; x : std_logic_vector(10 downto 0); y : std_logic_vector(10 downto 0); + video_h_offset : integer range 0 to 511; end record; subtype BITMAP_D_t is std_logic_vector(23 downto 0); From e9b38ee90bce8ac0d90f59f348f85886485ba6b0 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Wed, 4 Mar 2020 20:09:31 +0100 Subject: [PATCH 12/35] IremM62: crop hscroll garbage --- Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 4 ++-- Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index 773a3b42..680d3b5a 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -50,7 +50,7 @@ architecture SYN of Graphics is signal rgb_data : RGB_t; -- before OSD is mixed in signal video_o_s : to_VIDEO_t; - signal irem62_hsize : integer range 0 to 384; + signal irem62_hsize : integer range 0 to 511; begin @@ -71,7 +71,7 @@ begin graphics_o.vblank <= video_o_s.vblank; --graphics_o.vblank <= from_video_ctl.vblank; - irem62_hsize <= 384 when hwsel = HW_LDRUN else 256; + irem62_hsize <= 384+16 when hwsel = HW_LDRUN else 256+16; pace_video_controller_inst : entity work.pace_video_controller generic map diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd index 0c243f3e..76fe8cd7 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd @@ -51,8 +51,8 @@ package platform_pkg is constant PACE_VIDEO_NUM_SPRITES : natural := 32; -- constant PACE_VIDEO_H_SIZE : integer := M62_VIDEO_H_SIZE; constant PACE_VIDEO_V_SIZE : integer := M62_VIDEO_V_SIZE; - constant PACE_VIDEO_L_CROP : integer := 0; - constant PACE_VIDEO_R_CROP : integer := PACE_VIDEO_L_CROP; + constant PACE_VIDEO_L_CROP : integer := 8; + constant PACE_VIDEO_R_CROP : integer := 8; constant PACE_VIDEO_PIPELINE_DELAY : integer := 5; constant PACE_INPUTS_NUM_BYTES : integer := 6; From fb2ac942dab7e7ad7b07813cb87f14c362b87411 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 5 Mar 2020 22:03:51 +0100 Subject: [PATCH 13/35] IremM62: add Lode Runners --- Arcade_MiST/IremM62 Hardware/IremM62.qsf | 4 +- .../IremM62 Hardware/meta/Kung Fu Master.mra | 134 +++++++++-------- .../IremM62 Hardware/meta/Lode Runner 2.mra | 135 ++++++++++++++++++ .../IremM62 Hardware/meta/Lode Runner 3.mra | 87 +++++++++++ .../IremM62 Hardware/meta/Lode Runner 4.mra | 85 +++++++++++ .../IremM62 Hardware/meta/Lode Runner.mra | 121 +++++++++------- Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 8 +- .../IremM62 Hardware/rtl/IremM62_MiST.sv | 8 +- Arcade_MiST/IremM62 Hardware/rtl/dprom_2r.vhd | 135 ------------------ Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 2 +- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 91 +++++++++++- .../rtl/platform_variant_pkg.vhd | 7 +- .../IremM62 Hardware/rtl/spritectl.vhd | 3 + .../IremM62 Hardware/rtl/target_top.vhd | 2 +- .../IremM62 Hardware/rtl/tilemapctl.vhd | 13 +- .../IremM62 Hardware/rtl/video_controller.vhd | 3 +- 16 files changed, 574 insertions(+), 264 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra delete mode 100644 Arcade_MiST/IremM62 Hardware/rtl/dprom_2r.vhd diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf index 1ede7f11..03a60ee6 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -66,7 +66,6 @@ set_global_assignment -name VHDL_FILE rtl/sprite_pkg.vhd set_global_assignment -name VHDL_FILE rtl/sprite_array.vhd set_global_assignment -name VHDL_FILE rtl/Inputs.VHD set_global_assignment -name VHDL_FILE rtl/input_mapper.vhd -set_global_assignment -name VHDL_FILE rtl/dprom_2r.vhd set_global_assignment -name VHDL_FILE rtl/dpram.vhd set_global_assignment -name VHDL_FILE rtl/sprom.vhd set_global_assignment -name VHDL_FILE rtl/spram.vhd @@ -201,7 +200,7 @@ set_global_assignment -name USE_CONFIGURATION_DEVICE OFF # SignalTap II Assignments # ======================== set_global_assignment -name ENABLE_SIGNALTAP OFF -set_global_assignment -name USE_SIGNALTAP_FILE output_files/sprite.stp +set_global_assignment -name USE_SIGNALTAP_FILE output_files/cpu.stp # Power Estimation Assignments # ============================ @@ -273,4 +272,5 @@ set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 set_global_assignment -name SIGNALTAP_FILE output_files/tilemap.stp set_global_assignment -name SIGNALTAP_FILE output_files/sprite.stp +set_global_assignment -name SIGNALTAP_FILE output_files/cpu.stp set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra index 083dc27a..5c4d8613 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra @@ -1,10 +1,10 @@ - Lode Runner + Kung Fu Master 0216 kungfum Irem iremm62 - 1 + 4 @@ -28,66 +28,80 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra new file mode 100644 index 00000000..990fe20e --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra @@ -0,0 +1,135 @@ + + Lode Runner 2 + 0216 + ldrun2 + Irem + iremm62 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra new file mode 100644 index 00000000..a150fff4 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra @@ -0,0 +1,87 @@ + + Lode Runner 3 + 0216 + ldrun3 + Irem + iremm62 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra new file mode 100644 index 00000000..36294983 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra @@ -0,0 +1,85 @@ + + Lode Runner 4 + 0216 + ldrun4 + Irem + iremm62 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra index b961fac9..f4ead13a 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra @@ -35,57 +35,80 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index 680d3b5a..73b87f97 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -71,7 +71,11 @@ begin graphics_o.vblank <= video_o_s.vblank; --graphics_o.vblank <= from_video_ctl.vblank; - irem62_hsize <= 384+16 when hwsel = HW_LDRUN else 256+16; + irem62_hsize <= 384+16 when hwsel = HW_LDRUN or + hwsel = HW_LDRUN2 or + hwsel = HW_LDRUN3 or + hwsel = HW_LDRUN4 else + 256+16; pace_video_controller_inst : entity work.pace_video_controller generic map @@ -204,6 +208,7 @@ begin port map ( reset => video_i.reset, + hwsel => hwsel, video_ctl => from_video_ctl, @@ -225,6 +230,7 @@ begin port map ( reset => video_i.reset, + hwsel => hwsel, video_ctl => from_video_ctl, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 3ae562d9..8b0a0b52 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -99,7 +99,7 @@ user_io( .status (status ) ); -wire [14:0] rom_addr; +wire [16:0] rom_addr; wire [15:0] rom_do; wire [17:0] snd_addr; @@ -163,7 +163,7 @@ sdram sdram( .port1_d ( {ioctl_dout, ioctl_dout} ), .port1_q ( ), - .cpu1_addr ( ioctl_downl ? 17'h1ffff : {3'b000, rom_addr[14:1]} ), + .cpu1_addr ( ioctl_downl ? 17'h1ffff : {1'b0, rom_addr[16:1]} ), .cpu1_q ( rom_do ), .cpu2_addr ( ioctl_downl ? 17'h1ffff : snd_addr[17:1] ), .cpu2_q ( snd_do ), @@ -171,8 +171,8 @@ sdram sdram( // port2 for sprite graphics .port2_req ( port2_req ), .port2_ack ( ), - .port2_a ( {sp_ioctl_addr[23:15], sp_ioctl_addr[12:0], sp_ioctl_addr[14]} ), // merge sprite roms to 32-bit wide words - .port2_ds ( {sp_ioctl_addr[13], ~sp_ioctl_addr[13]} ), + .port2_a ( sp_ioctl_addr[23:1] ), + .port2_ds ( {sp_ioctl_addr[0], ~sp_ioctl_addr[0]} ), .port2_we ( ioctl_downl ), .port2_d ( {ioctl_dout, ioctl_dout} ), .port2_q ( ), diff --git a/Arcade_MiST/IremM62 Hardware/rtl/dprom_2r.vhd b/Arcade_MiST/IremM62 Hardware/rtl/dprom_2r.vhd deleted file mode 100644 index a17e0e58..00000000 --- a/Arcade_MiST/IremM62 Hardware/rtl/dprom_2r.vhd +++ /dev/null @@ -1,135 +0,0 @@ -LIBRARY ieee; -USE ieee.std_logic_1164.all; - -LIBRARY altera_mf; -USE altera_mf.all; - -ENTITY dprom_2r IS - GENERIC - ( - INIT_FILE : string := ""; - --NUMWORDS_A : natural; - WIDTHAD_A : natural; - WIDTH_A : natural := 8; - --NUMWORDS_B : natural; - WIDTHAD_B : natural; - WIDTH_B : natural := 8; - outdata_reg_a : string := "UNREGISTERED"; - outdata_reg_b : string := "UNREGISTERED" - ); - PORT - ( - address_a : in std_logic_vector (WIDTHAD_A-1 downto 0); - address_b : in std_logic_vector (WIDTHAD_B-1 downto 0); - clock : in std_logic ; - q_a : out std_logic_vector (WIDTH_A-1 downto 0); - q_b : out std_logic_vector (WIDTH_B-1 downto 0) - ); -END dprom_2r; - - -ARCHITECTURE SYN OF dprom_2r IS - - SIGNAL sub_wire0 : STD_LOGIC_VECTOR (WIDTH_A-1 DOWNTO 0); - SIGNAL sub_wire1 : STD_LOGIC_VECTOR (WIDTH_B-1 DOWNTO 0); - SIGNAL sub_wire2 : STD_LOGIC ; - SIGNAL sub_wire3_bv : BIT_VECTOR (WIDTH_A-1 DOWNTO 0); - SIGNAL sub_wire3 : STD_LOGIC_VECTOR (WIDTH_A-1 DOWNTO 0); - SIGNAL sub_wire4_bv : BIT_VECTOR (WIDTH_B-1 DOWNTO 0); - SIGNAL sub_wire4 : STD_LOGIC_VECTOR (WIDTH_B-1 DOWNTO 0); - - - - COMPONENT altsyncram - GENERIC ( - address_reg_b : STRING; - clock_enable_input_a : STRING; - clock_enable_input_b : STRING; - clock_enable_output_a : STRING; - clock_enable_output_b : STRING; - indata_reg_b : STRING; - init_file : STRING; - init_file_layout : STRING; - intended_device_family : STRING; - lpm_type : STRING; - numwords_a : NATURAL; - numwords_b : NATURAL; - operation_mode : STRING; - outdata_aclr_a : STRING; - outdata_aclr_b : STRING; - outdata_reg_a : STRING; - outdata_reg_b : STRING; - power_up_uninitialized : STRING; - ram_block_type : STRING; - widthad_a : NATURAL; - widthad_b : NATURAL; - width_a : NATURAL; - width_b : NATURAL; - width_byteena_a : NATURAL; - width_byteena_b : NATURAL; - wrcontrol_wraddress_reg_b : STRING - ); - PORT ( - wren_a : IN STD_LOGIC ; - wren_b : IN STD_LOGIC ; - clock0 : IN STD_LOGIC ; - address_a : IN STD_LOGIC_VECTOR (WIDTHAD_A-1 DOWNTO 0); - address_b : IN STD_LOGIC_VECTOR (WIDTHAD_B-1 DOWNTO 0); - q_a : OUT STD_LOGIC_VECTOR (WIDTH_A-1 DOWNTO 0); - q_b : OUT STD_LOGIC_VECTOR (WIDTH_B-1 DOWNTO 0); - data_a : IN STD_LOGIC_VECTOR (WIDTH_A-1 DOWNTO 0); - data_b : IN STD_LOGIC_VECTOR (WIDTH_B-1 DOWNTO 0) - ); - END COMPONENT; - -BEGIN - sub_wire2 <= '0'; - sub_wire3_bv(WIDTH_A-1 DOWNTO 0) <= (others => '0'); - sub_wire3 <= To_stdlogicvector(sub_wire3_bv); - sub_wire4_bv(WIDTH_B-1 DOWNTO 0) <= (others => '0'); - sub_wire4 <= To_stdlogicvector(sub_wire4_bv); - q_a <= sub_wire0(WIDTH_A-1 DOWNTO 0); - q_b <= sub_wire1(WIDTH_B-1 DOWNTO 0); - - altsyncram_component : altsyncram - GENERIC MAP ( - address_reg_b => "CLOCK0", - clock_enable_input_a => "BYPASS", - clock_enable_input_b => "BYPASS", - clock_enable_output_a => "BYPASS", - clock_enable_output_b => "BYPASS", - indata_reg_b => "CLOCK0", - init_file => INIT_FILE, - init_file_layout => "PORT_A", - intended_device_family => "Cyclone III", - lpm_type => "altsyncram", - numwords_a => 2**WIDTHAD_A, - numwords_b => 2**WIDTHAD_B, - operation_mode => "BIDIR_DUAL_PORT", - outdata_aclr_a => "NONE", - outdata_aclr_b => "NONE", - outdata_reg_a => outdata_reg_a, - outdata_reg_b => outdata_reg_b, - power_up_uninitialized => "FALSE", - ram_block_type => "M9K", - widthad_a => WIDTHAD_A, - widthad_b => WIDTHAD_B, - width_a => WIDTH_A, - width_b => WIDTH_B, - width_byteena_a => 1, - width_byteena_b => 1, - wrcontrol_wraddress_reg_b => "CLOCK0" - ) - PORT MAP ( - wren_a => sub_wire2, - wren_b => sub_wire2, - clock0 => clock, - address_a => address_a, - address_b => address_b, - data_a => sub_wire3, - data_b => sub_wire4, - q_a => sub_wire0, - q_b => sub_wire1 - ); - -END SYN; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index 53d2488c..f7f7815c 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -43,7 +43,7 @@ entity PACE is dl_data : in std_logic_vector(7 downto 0); dl_wr : in std_logic; - cpu_rom_addr : out std_logic_vector(14 downto 0); + cpu_rom_addr : out std_logic_vector(16 downto 0); cpu_rom_do : in std_logic_vector(7 downto 0); gfx1_addr : out std_logic_vector(17 downto 2); gfx1_do : in std_logic_vector(31 downto 0); diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 110a0dce..3849ccea 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -59,7 +59,7 @@ entity platform is dl_data : in std_logic_vector(7 downto 0); dl_wr : in std_logic; - cpu_rom_addr : out std_logic_vector(14 downto 0); + cpu_rom_addr : out std_logic_vector(16 downto 0); cpu_rom_do : in std_logic_vector(7 downto 0); gfx1_addr : out std_logic_vector(17 downto 2); gfx1_do : in std_logic_vector(31 downto 0); @@ -126,6 +126,15 @@ architecture SYN of platform is signal pause : std_logic; signal rot_en : std_logic; + -- Lode Runner 2,4 + signal ld2_bankr1 : std_logic_vector(5 downto 0); + signal ld2_bankr2 : std_logic_vector(7 downto 0); + signal ld24_bank : std_logic; + + -- Lode Runner 3 + signal ld3_prot5_cs : std_logic; + signal ld3_prot7_cs : std_logic; + begin -- handle special keys @@ -164,7 +173,12 @@ begin -- chip select logic -- ROM $0000-$7FFF - rom_cs <= '1' when STD_MATCH(cpu_a, "0---------------") else '0'; + -- $0000-$9FFF - LDRUN2 + -- $0000-$BFFF - LDRUN3,4 + rom_cs <= '1' when STD_MATCH(cpu_a, "0---------------") else + '1' when hwsel = HW_LDRUN2 and cpu_a(15 downto 13) = "100" else + '1' when (hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4) and cpu_a(15 downto 14) = "10" else + '0'; -- SPRITE $C000-$C0FF sprite_cs <= '1' when STD_MATCH(cpu_a, X"C0"& "--------") else '0'; -- VRAM/CRAM $D000-$DFFF @@ -189,6 +203,10 @@ begin '1' when STD_MATCH(cpu_a(7 downto 0), X"04") else '0'; + -- Lode Runner 3 protection + ld3_prot5_cs <= '1' when hwsel = HW_LDRUN3 and cpu_a = x"c800" else '0'; + ld3_prot7_cs <= '1' when hwsel = HW_LDRUN3 and (cpu_a = x"cc00" or cpu_a = x"cfff") else '0'; + process (clk_sys, rst_sys) begin if rst_sys = '1' then sound_data_o <= X"FF"; @@ -201,6 +219,8 @@ begin -- memory read mux cpu_d_i <= in_d_o when (cpu_io_rd = '1' and in_cs = '1') else + x"05" when ld3_prot5_cs = '1' else + x"07" when ld3_prot7_cs = '1' else cpu_rom_do when rom_cs = '1' else vram_d_o when vram_cs = '1' else cram_d_o when cram_cs = '1' else @@ -265,10 +285,50 @@ begin nmi => '0' ); - cpu_rom_addr <= cpu_a(14 downto 0); + cpu_rom_addr <= + '0' & "10" & ld24_bank & cpu_a(12 downto 0) when hwsel = HW_LDRUN2 and cpu_a(15) = '1' else + '0' & '1' & ld24_bank & cpu_a(13 downto 0) when hwsel = HW_LDRUN4 and cpu_a(15) = '1' else + '0' & cpu_a(15 downto 0); + -- Lode Runner 2 bank switching - some kind of protection, only the level number is used to select bank 0 or 1 at $8000 + -- writes to $80 (level number) + -- writes to $81 (unknown, from a table) + -- reads from $80 (number of times from a table) + process (clk_sys, rst_sys) + begin + if rst_sys = '1' then + ld2_bankr1 <= (others => '0'); + ld2_bankr2 <= (others => '0'); + ld24_bank <= '0'; + elsif rising_edge(clk_sys) then + if cpu_clk_en = '1' and cpu_io_wr = '1' then + case cpu_a(7 downto 0) is + when X"80" => ld2_bankr1 <= cpu_d_o(5 downto 0); + when X"81" => ld2_bankr2 <= cpu_d_o; + when others => null; + end case; + end if; + + if cpu_clk_en = '1' and cpu_io_rd = '1' and cpu_a(7 downto 0) = x"80" then + if ld2_bankr1 = 6 or ld2_bankr1 = 8 or ld2_bankr1 = 12 or ld2_bankr1 = 13 or ld2_bankr1 = 14 or ld2_bankr1 = 15 or ld2_bankr1 = 16 or + ld2_bankr1 = 21 or ld2_bankr1 >= 23 + then + ld24_bank <= '1'; + else + ld24_bank <= '0'; + end if; + end if; + + if cpu_clk_en = '1' and cpu_mem_wr = '1' then + if cpu_a = x"c800" and hwsel = HW_LDRUN4 then + ld24_bank <= cpu_d_o(0); + end if; + end if; + + end if; + end process; end block BLK_CPU; - + BLK_INTERRUPTS : block signal vblank_int : std_logic; @@ -317,11 +377,15 @@ begin BLK_SCROLL : block signal m62_hscroll : std_logic_vector(15 downto 0); + signal m62_vscroll : std_logic_vector(15 downto 0); + signal m62_topbottom_mask: std_logic; begin process (clk_sys, rst_sys) begin if rst_sys = '1' then m62_hscroll <= (others => '0'); + m62_vscroll <= (others => '0'); + m62_topbottom_mask <= '0'; elsif rising_edge(clk_sys) then if cpu_clk_en = '1' and cpu_mem_wr = '1' then case cpu_a is @@ -337,9 +401,26 @@ begin null; end case; end if; -- cpu_wr + + if cpu_clk_en = '1' and cpu_io_wr = '1' then + if hwsel = HW_LDRUN3 and cpu_a(7 downto 0) = x"80" then + m62_vscroll(7 downto 0) <= cpu_d_o; + end if; + if hwsel = HW_LDRUN3 and cpu_a(7 downto 0) = x"81" then + m62_topbottom_mask <= cpu_d_o(0); + end if; + if hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"82" then + m62_hscroll(15 downto 8) <= cpu_d_o; + end if; + if hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"83" then + m62_hscroll(7 downto 0) <= cpu_d_o; + end if; + + end if; end if; -- rising_edge(clk_sys) end process; graphics_o.bit16(0) <= m62_hscroll; + graphics_o.bit16(1) <= m62_vscroll; end block BLK_SCROLL; @@ -353,7 +434,7 @@ begin begin -- external background ROMs - gfx1_addr <= "000"&tilemap_i(1).tile_a(12 downto 0); + gfx1_addr <= "00"&tilemap_i(1).tile_a(13 downto 0); tilemap_o(1).tile_d(23 downto 0) <= gfx1_do(7 downto 0) & gfx1_do(15 downto 8) & gfx1_do(23 downto 16); -- internal background ROMs diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd index d96ab08a..ff6edd0a 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd @@ -10,8 +10,11 @@ package platform_variant_pkg is constant HW_LDRUN : integer := 0; - constant HW_KUNGFUM : integer := 1; - constant HW_BATTROAD : integer := 2; + constant HW_LDRUN2 : integer := 1; + constant HW_LDRUN3 : integer := 2; + constant HW_LDRUN4 : integer := 3; + constant HW_KUNGFUM : integer := 4; + constant HW_BATTROAD : integer := 5; type rom_a is array (natural range <>) of string; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index a8c86619..832f9258 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -175,6 +175,9 @@ begin end if; if hwsel = HW_LDRUN or + hwsel = HW_LDRUN2 or + hwsel = HW_LDRUN3 or + hwsel = HW_LDRUN4 or hwsel = HW_BATTROAD then pal_i := '0' & reg_i.colour(3 downto 0) & pel; else diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index 895ea8f0..dc48d375 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -44,7 +44,7 @@ entity target_top is port( dl_data : in std_logic_vector(7 downto 0); dl_wr : in std_logic; - cpu_rom_addr : out std_logic_vector(14 downto 0); + cpu_rom_addr : out std_logic_vector(16 downto 0); cpu_rom_do : in std_logic_vector(7 downto 0); snd_rom_addr : out std_logic_vector(13 downto 0); snd_rom_do : in std_logic_vector(7 downto 0); diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index 7c558e6e..ce0c5623 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -22,6 +22,7 @@ entity tilemapCtl is port ( reset : in std_logic; + hwsel : in integer; -- video control signals video_ctl : in from_VIDEO_CTL_t; @@ -47,6 +48,7 @@ architecture TILEMAP_1 of tilemapCtl is alias rot_en : std_logic is graphics_i.bit8(0)(0); alias hscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(0); + alias vscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(1); begin @@ -55,14 +57,14 @@ begin -- not used ctl_o.map_a(ctl_o.map_a'left downto 11) <= (others => '0'); ctl_o.attr_a(ctl_o.attr_a'left downto 11) <= (others => '0'); - ctl_o.tile_a(ctl_o.tile_a'left downto 13) <= (others => '0'); + ctl_o.tile_a(ctl_o.tile_a'left downto 14) <= (others => '0'); -- screen rotation - x <= std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x)) when unsigned(y) < 6*8 else + x <= std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x)) when unsigned(y) < 6*8 and HWSEL = HW_KUNGFUM else std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x) + unsigned(hscroll(8 downto 0))); -- when rot_en = '0' else not video_ctl.y; --y <= not video_ctl.y when rot_en = '0' else 32 + video_ctl.x; - y <= video_ctl.y; -- when rot_en = '0' else video_ctl.x; + y <= std_logic_vector(unsigned(video_ctl.y) + unsigned(vscroll(8 downto 0))); -- when rot_en = '0' else video_ctl.x; -- generate pixel process (clk, clk_ena) @@ -86,6 +88,11 @@ begin -- 2nd stage of pipeline -- - set tile address if x(2 downto 0) = "010" then + if hwsel = HW_LDRUN4 then + ctl_o.tile_a(13) <= ctl_i.attr_d(5); + else + ctl_o.tile_a(13) <= '0'; + end if; ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(7 downto 6); ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); ctl_o.tile_a(2 downto 0) <= y(2 downto 0); diff --git a/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd index 213bb6b2..85b8d504 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd @@ -44,7 +44,7 @@ architecture SYN of pace_video_controller is constant SIM_DELAY : time := 2 ns; - signal VIDEO_H_SIZE : integer := H_SIZE * H_SCALE; + signal VIDEO_H_SIZE : integer; constant VIDEO_V_SIZE : integer := V_SIZE * V_SCALE; subtype reg_t is integer range 0 to 2047; @@ -100,6 +100,7 @@ architecture SYN of pace_video_controller is begin + VIDEO_H_SIZE <= H_SIZE * H_SCALE; video_ctl_o.video_h_offset <= to_integer(shift_right(to_unsigned(512-VIDEO_H_SIZE, 9), 1)); -- registers From 1de5362bd0ec8eeee32b98b576e213e9ebeca9f3 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Fri, 6 Mar 2020 12:23:36 +0100 Subject: [PATCH 14/35] IremM62: add Horizon --- Arcade_MiST/IremM62 Hardware/IremM62.qsf | 2 +- Arcade_MiST/IremM62 Hardware/meta/Horizon.mra | 99 +++++++++++++++++++ Arcade_MiST/IremM62 Hardware/rtl/dpram.vhd | 36 +++---- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 2 +- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 74 ++++++++++---- .../IremM62 Hardware/rtl/platform_pkg.vhd | 2 +- .../rtl/platform_variant_pkg.vhd | 3 +- .../IremM62 Hardware/rtl/sprite_array.vhd | 18 ++-- .../IremM62 Hardware/rtl/sprite_pkg.vhd | 4 +- .../IremM62 Hardware/rtl/spritectl.vhd | 50 +++++----- .../IremM62 Hardware/rtl/spritereg.vhd | 2 +- .../IremM62 Hardware/rtl/tilemapctl.vhd | 2 +- 12 files changed, 213 insertions(+), 81 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Horizon.mra diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf index 03a60ee6..1d428d6b 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -164,7 +164,7 @@ set_global_assignment -name TOP_LEVEL_ENTITY IremM62_MiST set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP -set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED +set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE BALANCED set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON set_global_assignment -name ALLOW_SYNCH_CTRL_USAGE ON set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra b/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra new file mode 100644 index 00000000..2b123b3b --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra @@ -0,0 +1,99 @@ + + Horizon + 0216 + horizon + Irem + iremm62 + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/dpram.vhd b/Arcade_MiST/IremM62 Hardware/rtl/dpram.vhd index 672d33d3..291cb9dd 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/dpram.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/dpram.vhd @@ -7,25 +7,27 @@ USE altera_mf.all; ENTITY dpram IS GENERIC ( - init_file : string := ""; + init_file : string := ""; --numwords_a : natural; - widthad_a : natural; - width_a : natural := 8; - outdata_reg_a : string := "UNREGISTERED"; - outdata_reg_b : string := "UNREGISTERED" + widthad_a : natural; + width_a : natural := 8; + widthad_b : natural; + width_b : natural := 8; + outdata_reg_a : string := "UNREGISTERED"; + outdata_reg_b : string := "UNREGISTERED" ); PORT ( address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); - address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_b-1 DOWNTO 0); clock_a : IN STD_LOGIC ; clock_b : IN STD_LOGIC ; data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); - data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + data_b : IN STD_LOGIC_VECTOR (width_b-1 DOWNTO 0); wren_a : IN STD_LOGIC := '1'; wren_b : IN STD_LOGIC := '1'; q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); - q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + q_b : OUT STD_LOGIC_VECTOR (width_b-1 DOWNTO 0) ); END dpram; @@ -33,7 +35,7 @@ END dpram; ARCHITECTURE SYN OF dpram IS SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); - SIGNAL sub_wire1 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC_VECTOR (width_b-1 DOWNTO 0); @@ -72,17 +74,17 @@ ARCHITECTURE SYN OF dpram IS wren_b : IN STD_LOGIC ; clock1 : IN STD_LOGIC ; address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); - address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0); + address_b : IN STD_LOGIC_VECTOR (widthad_b-1 DOWNTO 0); q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); - q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); + q_b : OUT STD_LOGIC_VECTOR (width_b-1 DOWNTO 0); data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0); - data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0) + data_b : IN STD_LOGIC_VECTOR (width_b-1 DOWNTO 0) ); END COMPONENT; BEGIN q_a <= sub_wire0(width_a-1 DOWNTO 0); - q_b <= sub_wire1(width_a-1 DOWNTO 0); + q_b <= sub_wire1(width_b-1 DOWNTO 0); altsyncram_component : altsyncram GENERIC MAP ( @@ -96,19 +98,19 @@ BEGIN intended_device_family => "Cyclone III", lpm_type => "altsyncram", numwords_a => 2**widthad_a, - numwords_b => 2**widthad_a, + numwords_b => 2**widthad_b, operation_mode => "BIDIR_DUAL_PORT", outdata_aclr_a => "NONE", outdata_aclr_b => "NONE", outdata_reg_a => outdata_reg_a, - outdata_reg_b => outdata_reg_a, + outdata_reg_b => outdata_reg_b, power_up_uninitialized => "FALSE", read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", read_during_write_mode_port_b => "NEW_DATA_NO_NBE_READ", widthad_a => widthad_a, - widthad_b => widthad_a, + widthad_b => widthad_b, width_a => width_a, - width_b => width_a, + width_b => width_b, width_byteena_a => 1, width_byteena_b => 1, wrcontrol_wraddress_reg_b => "CLOCK1" diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index f7f7815c..39a25dd4 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -76,6 +76,7 @@ architecture SYN of PACE is signal to_graphics : to_GRAPHICS_t; signal from_graphics : from_GRAPHICS_t; signal sprite_prom : prom_a(0 to 31); + signal sprite_no : integer range 0 to PACE_VIDEO_NUM_SPRITES-1; begin @@ -127,7 +128,6 @@ begin sprite_i => from_sprite_ctl, sprite_o => to_sprite_ctl, spr0_hit => spr0_hit, - graphics_i => from_graphics, graphics_o => to_graphics, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 3849ccea..223dcec3 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -56,8 +56,8 @@ entity platform is platform_o : out to_PLATFORM_IO_t; dl_addr : in std_logic_vector(11 downto 0); - dl_data : in std_logic_vector(7 downto 0); - dl_wr : in std_logic; + dl_data : in std_logic_vector(7 downto 0); + dl_wr : in std_logic; cpu_rom_addr : out std_logic_vector(16 downto 0); cpu_rom_do : in std_logic_vector(7 downto 0); @@ -99,7 +99,6 @@ architecture SYN of platform is signal snd_cs : std_logic; - -- RAM signals signal wram_cs : std_logic; signal wram_wr : std_logic; @@ -174,13 +173,16 @@ begin -- chip select logic -- ROM $0000-$7FFF -- $0000-$9FFF - LDRUN2 - -- $0000-$BFFF - LDRUN3,4 + -- $0000-$BFFF - LDRUN3,4, HORIZON rom_cs <= '1' when STD_MATCH(cpu_a, "0---------------") else '1' when hwsel = HW_LDRUN2 and cpu_a(15 downto 13) = "100" else - '1' when (hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4) and cpu_a(15 downto 14) = "10" else + '1' when (hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_HORIZON) and cpu_a(15 downto 14) = "10" else '0'; -- SPRITE $C000-$C0FF - sprite_cs <= '1' when STD_MATCH(cpu_a, X"C0"& "--------") else '0'; + -- $C000-$C1FF - HORIZON + sprite_cs <= '1' when cpu_a(15 downto 8) = x"C0" else + '1' when cpu_a(15 downto 9) = x"C"&"000" and hwsel = HW_HORIZON else + '0'; -- VRAM/CRAM $D000-$DFFF vram_cs <= '1' when hwsel = HW_KUNGFUM and STD_MATCH(cpu_a, X"D"&"0-----------") else @@ -235,7 +237,7 @@ begin -- sprite registers sprite_reg_o.clk <= clk_sys; sprite_reg_o.clk_ena <= clk_3M072_en; - sprite_reg_o.a <= cpu_a(7 downto 0); + sprite_reg_o.a <= cpu_a(8 downto 0) when hwsel = HW_HORIZON else '0' & cpu_a(7 downto 0); sprite_reg_o.d <= cpu_d_o; sprite_reg_o.wr <= sprite_cs and cpu_mem_wr; @@ -379,7 +381,35 @@ begin signal m62_hscroll : std_logic_vector(15 downto 0); signal m62_vscroll : std_logic_vector(15 downto 0); signal m62_topbottom_mask: std_logic; + signal scrollram_d_o : std_logic_vector(15 downto 0); + signal scrollram_wr : std_logic; begin + horizon_scrollram_inst : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 5, + width_a => 16, + widthad_b => 6, + width_b => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => cpu_a(5 downto 0), + wren_b => scrollram_wr, + data_b => cpu_d_o, + q_b => open, + + clock_a => clk_video, + address_a => tilemap_i(1).map_a(10 downto 6), + wren_a => '0', + data_a => (others => 'X'), + q_a => scrollram_d_o + ); + + scrollram_wr <= '1' when cpu_mem_wr = '1' and cpu_a(15 downto 6) = X"C8"&"00" else '0'; + process (clk_sys, rst_sys) begin if rst_sys = '1' then @@ -419,11 +449,11 @@ begin end if; end if; -- rising_edge(clk_sys) end process; - graphics_o.bit16(0) <= m62_hscroll; + graphics_o.bit16(0) <= scrollram_d_o when hwsel = HW_HORIZON else m62_hscroll; graphics_o.bit16(1) <= m62_vscroll; end block BLK_SCROLL; - - + + BLK_GFX_ROMS : block type gfx_rom_d_a is array(M62_CHAR_ROM'range) of std_logic_vector(7 downto 0); @@ -509,7 +539,8 @@ begin generic map ( init_file => "", - widthad_a => 11 + widthad_a => 11, + widthad_b => 11 ) port map ( @@ -531,7 +562,8 @@ begin generic map ( init_file => "", - widthad_a => 11 + widthad_a => 11, + widthad_b => 11 ) port map ( @@ -570,7 +602,8 @@ begin generic map ( init_file => "", - widthad_a => 8 + widthad_a => 8, + widthad_b => 8 ) port map ( @@ -592,7 +625,8 @@ begin generic map ( init_file => "", - widthad_a => 8 + widthad_a => 8, + widthad_b => 8 ) port map ( @@ -614,7 +648,8 @@ begin generic map ( init_file => "", - widthad_a => 8 + widthad_a => 8, + widthad_b => 8 ) port map ( @@ -637,7 +672,8 @@ begin generic map ( init_file => "", - widthad_a => 8 + widthad_a => 8, + widthad_b => 8 ) port map ( @@ -659,7 +695,8 @@ begin generic map ( init_file => "", - widthad_a => 8 + widthad_a => 8, + widthad_b => 8 ) port map ( @@ -681,7 +718,8 @@ begin generic map ( init_file => "", - widthad_a => 8 + widthad_a => 8, + widthad_b => 8 ) port map ( diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd index 76fe8cd7..4cca03d9 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd @@ -48,7 +48,7 @@ package platform_pkg is constant PACE_VIDEO_NUM_BITMAPS : natural := 0; constant PACE_VIDEO_NUM_TILEMAPS : natural := 1; - constant PACE_VIDEO_NUM_SPRITES : natural := 32; + constant PACE_VIDEO_NUM_SPRITES : natural := 64; -- constant PACE_VIDEO_H_SIZE : integer := M62_VIDEO_H_SIZE; constant PACE_VIDEO_V_SIZE : integer := M62_VIDEO_V_SIZE; constant PACE_VIDEO_L_CROP : integer := 8; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd index ff6edd0a..a24e752c 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd @@ -14,7 +14,8 @@ package platform_variant_pkg is constant HW_LDRUN3 : integer := 2; constant HW_LDRUN4 : integer := 3; constant HW_KUNGFUM : integer := 4; - constant HW_BATTROAD : integer := 5; + constant HW_HORIZON : integer := 5; + constant HW_BATTROAD : integer := 6; type rom_a is array (natural range <>) of string; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd index 78b75bee..86c13077 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd @@ -59,7 +59,6 @@ architecture SYN of sprite_array is signal ctl_o : ctl_o_a_t(0 to N_SPRITES-1); signal ld_r : std_logic_vector(N_SPRITES-1 downto 0); - signal ld_ena : std_logic; begin -- Sprite Data Load Arbiter @@ -72,27 +71,22 @@ begin -- enable must be 1 clock behind address to latch data after fetch --ld_r <= (N_SPRITES-1 => '1', others => '0'); -- make ISE 9.2.03i happy... - ld_ena <= '1'; ld_r(ld_r'left) <= '1'; ld_r(ld_r'left-1 downto 0) <= (others => '0'); i := 0; elsif rising_edge(clk) and clk_ena = '1' then if video_ctl.hblank = '0' then - ld_ena <= '1'; i := 0; ld_r(ld_r'left) <= '1'; ld_r(ld_r'left-1 downto 0) <= (others => '0'); else - ld_ena <= not ld_ena; - if ld_ena = '1' then - ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); - if i = N_SPRITES-1 then - i := 0; - else - i := i + 1; - end if; - row_a <= ctl_o(i).a; + ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); + if (i = 31 and hwsel /= HW_HORIZON) or i = N_SPRITES-1 then + i := 0; + else + i := i + 1; end if; + row_a <= ctl_o(i).a; end if; end if; end process; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd index d3d3eeb8..349dff16 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd @@ -11,7 +11,7 @@ use work.platform_variant_pkg.all; package sprite_pkg is subtype SPRITE_N_t is std_logic_vector(11 downto 0); - subtype SPRITE_A_t is std_logic_vector(7 downto 0); + subtype SPRITE_A_t is std_logic_vector(8 downto 0); subtype SPRITE_D_t is std_logic_vector(7 downto 0); type from_SPRITE_REG_t is record @@ -33,7 +33,7 @@ package sprite_pkg is end record; function NULL_TO_SPRITE_REG return to_SPRITE_REG_t; - + subtype SPRITE_ROW_D_t is std_logic_vector(63 downto 0); subtype SPRITE_ROW_A_t is std_logic_vector(15 downto 0); diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index 832f9258..5f3304f4 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -18,7 +18,7 @@ entity spritectl is ); port ( - hwsel : in integer; + hwsel : in integer range 0 to 15; -- sprite registers reg_i : in from_SPRITE_REG_t; @@ -39,8 +39,6 @@ architecture SYN of spritectl is alias clk : std_logic is video_ctl.clk; alias clk_ena : std_logic is video_ctl.clk_ena; - signal flipData : std_logic_vector(47 downto 0); -- flipped row data - signal ld_r : std_logic; signal left_d : std_logic; signal rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period @@ -49,7 +47,6 @@ begin process (clk, clk_ena, left_d, reg_i) --- variable rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period variable pel : std_logic_vector(2 downto 0); variable x : unsigned(video_ctl.x'range); variable y : unsigned(video_ctl.y'range); @@ -57,20 +54,14 @@ begin variable xMat : boolean; -- raster in between left edge and end of line variable height : unsigned(6 downto 0); - -- the width of rowCount determines the scanline multipler - -- - eg. (4 downto 0) is 1:1 - -- (5 downto 0) is 2:1 (scan-doubling) - -- variable rowCount : unsigned(3+PACE_VIDEO_V_SCALE downto 0); - -- alias row : unsigned(4 downto 0) is - -- rowCount(rowCount'left downto rowCount'left-4); + variable rowCount : unsigned(height'range); - alias row : unsigned(rowCount'range) is rowCount; -- which part of the sprite is being drawn alias segment : unsigned(1 downto 0) is rowCount(5 downto 4); variable code : std_logic_vector(9 downto 0); variable pal_i : std_logic_vector(7 downto 0); - + begin if rising_edge(clk) then @@ -101,7 +92,7 @@ begin -- start counting sprite row rowCount := (others => '0'); yMat := true; - elsif row = height then + elsif rowCount = height then yMat := false; end if; @@ -134,16 +125,16 @@ begin if ld_r = '0' and ctl_i.ld = '1' then left_d <= not left_d; -- switch sprite half if yMat then - if left_d = '0' then + if left_d = '1' then -- store first half of the sprite line data - flipData(39 downto 32) <= ctl_i.d(23 downto 16); - flipData(23 downto 16) <= ctl_i.d(15 downto 8); - flipData(7 downto 0) <= ctl_i.d(7 downto 0); + rowStore(39 downto 32) <= ctl_i.d(23 downto 16); + rowStore(23 downto 16) <= ctl_i.d(15 downto 8); + rowStore( 7 downto 0) <= ctl_i.d( 7 downto 0); else -- load sprite data - rowStore(47 downto 32) <= flip_1(flipData(39 downto 32) & ctl_i.d(23 downto 16), reg_i.xflip); - rowStore(31 downto 16) <= flip_1(flipData(23 downto 16) & ctl_i.d(15 downto 8), reg_i.xflip); - rowStore(15 downto 0) <= flip_1(flipData( 7 downto 0) & ctl_i.d( 7 downto 0), reg_i.xflip); + rowStore(47 downto 40) <= ctl_i.d(23 downto 16); + rowStore(31 downto 24) <= ctl_i.d(15 downto 8); + rowStore(15 downto 8) <= ctl_i.d( 7 downto 0); end if; else rowStore <= (others => '0'); @@ -166,10 +157,17 @@ begin if xMat then -- shift in next pixel - pel := rowStore(rowStore'left-32) & rowStore(rowStore'left-16) & rowStore(rowStore'left); - rowStore(47 downto 32) <= rowStore(46 downto 32) & '0'; - rowStore(31 downto 16) <= rowStore(30 downto 16) & '0'; - rowStore(15 downto 0) <= rowStore(14 downto 0) & '0'; + if reg_i.xflip = '1' then + pel := rowStore(rowStore'right) & rowStore(rowStore'right+16) & rowStore(rowStore'right+32); + rowStore(47 downto 32) <= '0' & rowStore(47 downto 33); + rowStore(31 downto 16) <= '0' & rowStore(31 downto 17); + rowStore(15 downto 0) <= '0' & rowStore(15 downto 1); + else + pel := rowStore(rowStore'left-32) & rowStore(rowStore'left-16) & rowStore(rowStore'left); + rowStore(47 downto 32) <= rowStore(46 downto 32) & '0'; + rowStore(31 downto 16) <= rowStore(30 downto 16) & '0'; + rowStore(15 downto 0) <= rowStore(14 downto 0) & '0'; + end if; end if; end if; @@ -202,9 +200,9 @@ begin ctl_o.a(14 downto 5) <= code; ctl_o.a(4) <= left_d; if reg_i.yflip = '0' then - ctl_o.a(3 downto 0) <= std_logic_vector(row(3 downto 0)); + ctl_o.a(3 downto 0) <= std_logic_vector(rowCount(3 downto 0)); else - ctl_o.a(3 downto 0) <= not std_logic_vector(row(3 downto 0)); + ctl_o.a(3 downto 0) <= not std_logic_vector(rowCount(3 downto 0)); end if; end process; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritereg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritereg.vhd index 107edb1c..4072bc5b 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritereg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritereg.vhd @@ -30,7 +30,7 @@ begin begin if rising_edge(clk) then if clk_ena = '1' then - if reg_i.a(7 downto 3) = std_logic_vector(to_unsigned(INDEX, 5)) then + if reg_i.a(8 downto 3) = std_logic_vector(to_unsigned(INDEX, 6)) then if reg_i.wr = '1' then case reg_i.a(2 downto 0) is when "000" => diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index ce0c5623..a9a6ad25 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -88,7 +88,7 @@ begin -- 2nd stage of pipeline -- - set tile address if x(2 downto 0) = "010" then - if hwsel = HW_LDRUN4 then + if hwsel = HW_LDRUN4 or hwsel = HW_HORIZON then ctl_o.tile_a(13) <= ctl_i.attr_d(5); else ctl_o.tile_a(13) <= '0'; From b129cc313f9d24f71f4b3c0d40705028694b18cf Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Fri, 6 Mar 2020 13:39:38 +0100 Subject: [PATCH 15/35] IremM62: sound board ROM address decode fix --- Arcade_MiST/IremM62 Hardware/meta/Horizon.mra | 2 +- .../IremM62 Hardware/meta/Kung Fu Master.mra | 9 ++------- .../IremM62 Hardware/meta/Lode Runner 2.mra | 8 ++------ .../IremM62 Hardware/meta/Lode Runner 3.mra | 2 +- .../IremM62 Hardware/meta/Lode Runner 4.mra | 2 +- .../IremM62 Hardware/meta/Lode Runner.mra | 2 +- .../IremM62 Hardware/rtl/IremM62_MiST.sv | 2 +- .../IremM62 Hardware/rtl/Sound_Board.vhd | 18 +++++------------- .../IremM62 Hardware/rtl/history/history.db | Bin 0 -> 12288 bytes .../IremM62 Hardware/rtl/target_top.vhd | 2 +- 10 files changed, 15 insertions(+), 32 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/history/history.db diff --git a/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra b/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra index 2b123b3b..c3e1b9d2 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra @@ -5,7 +5,7 @@ Irem iremm62 5 - + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra index 5c4d8613..269b8cb2 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra @@ -5,7 +5,7 @@ Irem iremm62 4 - + @@ -17,15 +17,10 @@ + FF - - - - - - diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra index 990fe20e..d10cc3b6 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra @@ -5,7 +5,7 @@ Irem iremm62 1 - + @@ -26,15 +26,11 @@ - - - - + FF - diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra index a150fff4..062f118b 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra @@ -5,7 +5,7 @@ Irem iremm62 2 - + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra index 36294983..b0ddec8c 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra @@ -5,7 +5,7 @@ Irem iremm62 3 - + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra index f4ead13a..8a84b361 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra @@ -5,7 +5,7 @@ Irem iremm62 0 - + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 8b0a0b52..2faefb9d 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -103,7 +103,7 @@ wire [16:0] rom_addr; wire [15:0] rom_do; wire [17:0] snd_addr; -wire [13:0] snd_rom_addr; +wire [15:0] snd_rom_addr; wire [15:0] snd_do; wire snd_vma; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd b/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd index ba56ae64..6f8eaee9 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd @@ -32,7 +32,7 @@ port( select_sound : in std_logic_vector(7 downto 0); audio_out : out std_logic_vector(11 downto 0); - snd_rom_addr : out std_logic_vector(13 downto 0); + snd_rom_addr : out std_logic_vector(15 downto 0); snd_rom_do : in std_logic_vector(7 downto 0); snd_vma : out std_logic; @@ -164,9 +164,9 @@ dbg_cpu_addr <= cpu_addr; -- cs wram_cs <= '1' when cpu_addr(15 downto 7) = X"00"&'1' else '0'; -- 0080-00FF ports_cs <= '1' when cpu_addr(15 downto 4) = X"000" else '0'; -- 0000-000F -adpcm_cs <= '1' when cpu_addr(14) = '0' and cpu_addr(11) = '1' and cpu_addr(1 downto 0) /= "00" else '0'; -- 0801-0802 -irqraz_cs <= '1' when cpu_addr(14) = '0' and cpu_addr(11) = '1' and cpu_addr(1 downto 0) = "00" else '0'; -- 0800 -rom_cs <= '1' when cpu_addr(14) = '1' else '0'; -- 4000-7FFF / C000-FFFF +adpcm_cs <= '1' when cpu_addr(15 downto 14) = "00" and cpu_addr(11) = '1' and cpu_addr(1 downto 0) /= "00" else '0'; -- 0801-0802 +irqraz_cs <= '1' when cpu_addr(15 downto 14) = "00" and cpu_addr(11) = '1' and cpu_addr(1 downto 0) = "00" else '0'; -- 0800 +rom_cs <= '1' when cpu_addr(15 downto 14) /= "00" else '0'; -- 4000-FFFF -- write enables wram_we <= '1' when cpu_rw = '0' and wram_cs = '1' else '0'; @@ -349,17 +349,9 @@ port map( test_cc => open ); ---rom_cpu : entity work.snd_prg ---port map( --- clk => clock_E, -- E clock input (falling edge) --- addr => cpu_addr(13 downto 0), --- data => rom_do ---); - snd_vma <= rom_cs and cpu_vma; -snd_rom_addr <= cpu_addr(13 downto 0); +snd_rom_addr <= cpu_addr(15 downto 0); - -- cpu wram cpu_ram : entity work.spram generic map( widthad_a => 7) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/history/history.db b/Arcade_MiST/IremM62 Hardware/rtl/history/history.db new file mode 100644 index 0000000000000000000000000000000000000000..d942bb0710005fb9508c6f2ea8e4cbff52e6b916 GIT binary patch literal 12288 zcmeI#Jxjwt7{KwnD83X*x^>8Mqk;y$gwJ zXUqSAdwKFC2lvbLr1PjYm0Gszm(r*!F%eRVTcv~$(vCelhH&}*kl5Ab+d_(q>+iAu zBRoG9e(Ha1`+zzE2q1s}0tg_000IagfB*vjM8L?yX%NWI8&f_v)qAzx)a|NYyjc?J zEL54ki$c{uR41cj8$@o`-)got}FKQyoZA zuNKwE=C!e1eNn!dw#$qD?BcTDxW4|#d5+yQaT9?60tg_000IagfB*srAb Date: Fri, 6 Mar 2020 17:33:07 +0100 Subject: [PATCH 16/35] IremM62: add Battle Road (second bg layer is missing) --- .../IremM62 Hardware/meta/Battle Road.mra | 138 ++++++++++++++++++ Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 54 ++++++- .../IremM62 Hardware/rtl/tilemapctl.vhd | 14 +- 3 files changed, 199 insertions(+), 7 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra diff --git a/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra b/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra new file mode 100644 index 00000000..75655e29 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra @@ -0,0 +1,138 @@ + + Battle Road + 0216 + battroad + Irem + iremm62 + 5 + + + + + + + FF + + + + + + + + + FF + + + FF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 223dcec3..c49106d0 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -109,6 +109,11 @@ architecture SYN of platform is signal cram_wr : std_logic; signal cram_d_o : std_logic_vector(7 downto 0); signal sprite_cs : std_logic; + + -- text RAM + signal textram_cs : std_logic; + signal textram_wr : std_logic; + signal textram_d_o : std_logic_vector(7 downto 0); -- misc signals signal in_cs : std_logic; @@ -134,6 +139,9 @@ architecture SYN of platform is signal ld3_prot5_cs : std_logic; signal ld3_prot7_cs : std_logic; + -- Kidniki, Battle Road + signal kidniki_bank : std_logic_vector(3 downto 0); + begin -- handle special keys @@ -174,15 +182,19 @@ begin -- ROM $0000-$7FFF -- $0000-$9FFF - LDRUN2 -- $0000-$BFFF - LDRUN3,4, HORIZON + -- $A000-$BFFF - BATTROAD rom_cs <= '1' when STD_MATCH(cpu_a, "0---------------") else '1' when hwsel = HW_LDRUN2 and cpu_a(15 downto 13) = "100" else '1' when (hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_HORIZON) and cpu_a(15 downto 14) = "10" else + '1' when hwsel = HW_BATTROAD and cpu_a(15 downto 13) = "101" else '0'; + -- SPRITE $C000-$C0FF -- $C000-$C1FF - HORIZON sprite_cs <= '1' when cpu_a(15 downto 8) = x"C0" else '1' when cpu_a(15 downto 9) = x"C"&"000" and hwsel = HW_HORIZON else '0'; + -- VRAM/CRAM $D000-$DFFF vram_cs <= '1' when hwsel = HW_KUNGFUM and STD_MATCH(cpu_a, X"D"&"0-----------") else @@ -194,6 +206,12 @@ begin '1' when hwsel /= HW_KUNGFUM and STD_MATCH(cpu_a, X"D"&"-----------1") else '0'; + + -- Text RAM $C800-$CFFF + textram_cs <= '1' when hwsel = HW_BATTROAD and + cpu_a(15 downto 11) = x"C"&'1' else + '0'; + -- RAM $E000-$EFFF wram_cs <= '1' when STD_MATCH(cpu_a, X"E"&"------------") else '0'; @@ -227,12 +245,14 @@ begin vram_d_o when vram_cs = '1' else cram_d_o when cram_cs = '1' else wram_d_o when wram_cs = '1' else + textram_d_o when textram_cs = '1' else (others => '1'); - + -- memory block write signals vram_wr <= vram_cs and cpu_mem_wr; cram_wr <= cram_cs and cpu_mem_wr; wram_wr <= wram_cs and cpu_mem_wr; + textram_wr <= textram_cs and cpu_mem_wr; -- sprite registers sprite_reg_o.clk <= clk_sys; @@ -290,6 +310,7 @@ begin cpu_rom_addr <= '0' & "10" & ld24_bank & cpu_a(12 downto 0) when hwsel = HW_LDRUN2 and cpu_a(15) = '1' else '0' & '1' & ld24_bank & cpu_a(13 downto 0) when hwsel = HW_LDRUN4 and cpu_a(15) = '1' else + '1' & kidniki_bank(2 downto 0) & cpu_a(12 downto 0) when hwsel = HW_BATTROAD and cpu_a(15 downto 13) = "101" else '0' & cpu_a(15 downto 0); -- Lode Runner 2 bank switching - some kind of protection, only the level number is used to select bank 0 or 1 at $8000 @@ -302,11 +323,13 @@ begin ld2_bankr1 <= (others => '0'); ld2_bankr2 <= (others => '0'); ld24_bank <= '0'; + kidniki_bank <= (others => '0'); elsif rising_edge(clk_sys) then if cpu_clk_en = '1' and cpu_io_wr = '1' then case cpu_a(7 downto 0) is when X"80" => ld2_bankr1 <= cpu_d_o(5 downto 0); when X"81" => ld2_bankr2 <= cpu_d_o; + when X"83" => if hwsel = HW_BATTROAD then kidniki_bank <= cpu_d_o(3 downto 0); end if; when others => null; end case; end if; @@ -433,16 +456,18 @@ begin end if; -- cpu_wr if cpu_clk_en = '1' and cpu_io_wr = '1' then - if hwsel = HW_LDRUN3 and cpu_a(7 downto 0) = x"80" then + if (hwsel = HW_LDRUN3 or hwsel = HW_BATTROAD) and cpu_a(7 downto 0) = x"80" then m62_vscroll(7 downto 0) <= cpu_d_o; end if; if hwsel = HW_LDRUN3 and cpu_a(7 downto 0) = x"81" then m62_topbottom_mask <= cpu_d_o(0); end if; - if hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"82" then + if (hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"82") or + (hwsel = HW_BATTROAD and cpu_a(7 downto 0) = x"81") then m62_hscroll(15 downto 8) <= cpu_d_o; end if; - if hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"83" then + if (hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"83") or + (hwsel = HW_BATTROAD and cpu_a(7 downto 0) = x"82") then m62_hscroll(7 downto 0) <= cpu_d_o; end if; @@ -581,6 +606,27 @@ begin ); tilemap_o(1).attr_d(15 downto 8) <= (others => '0'); + textram_inst : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 11, + widthad_b => 11 + ) + port map + ( + clock_b => clk_sys, + address_b => cpu_a(10 downto 0), + wren_b => textram_wr, + data_b => cpu_d_o, + q_b => textram_d_o, + + clock_a => clk_video, + address_a => (others => '0'), + wren_a => '0', + data_a => (others => 'X'), + q_a => open + ); end block BLK_VRAM; wram_inst : entity work.spram diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index a9a6ad25..f372a959 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -93,11 +93,15 @@ begin else ctl_o.tile_a(13) <= '0'; end if; - ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(7 downto 6); + if hwsel = HW_BATTROAD then + ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6) & ctl_i.attr_d(4); + else + ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(7 downto 6); + end if; ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); ctl_o.tile_a(2 downto 0) <= y(2 downto 0); end if; - + -- 3rd stage of pipeline -- - read tile, attribute data from ROM if x(2 downto 0) = "100" then @@ -109,7 +113,11 @@ begin -- extract R,G,B from colour palette pel := tile_d_r(tile_d_r'left-16) & tile_d_r(tile_d_r'left-8) & tile_d_r(tile_d_r'left); - ctl_o.pal_a <= attr_d_r(4 downto 0) & pel; + if hwsel = HW_BATTROAD then + ctl_o.pal_a <= '0' & attr_d_r(3 downto 0) & pel; + else + ctl_o.pal_a <= attr_d_r(4 downto 0) & pel; + end if; ctl_o.set <= '0'; -- default -- if pel /= "000" then -- pal_rgb(0)(7 downto 5) /= "000" or From c1fdb9b431a7a5d4b32f74788a55ab6f082d372c Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Fri, 6 Mar 2020 21:21:46 +0100 Subject: [PATCH 17/35] IremM62: add Kid Niki (very broken) --- .../IremM62 Hardware/meta/Kid Niki.mra | 80 +++++++++++++++++++ Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 3 +- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 58 ++++++++++---- .../rtl/platform_variant_pkg.vhd | 1 + .../IremM62 Hardware/rtl/tilemapctl.vhd | 4 + 5 files changed, 128 insertions(+), 18 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra diff --git a/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra b/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra new file mode 100644 index 00000000..477e8156 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra @@ -0,0 +1,80 @@ + + Kid Niki - Radical Ninja + 0216 + kidniki + Irem + iremm62 + 6 + + + + + + + + + FF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index 73b87f97..02a4146e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -74,7 +74,8 @@ begin irem62_hsize <= 384+16 when hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or hwsel = HW_LDRUN3 or - hwsel = HW_LDRUN4 else + hwsel = HW_LDRUN4 or + hwsel = HW_KIDNIKI else 256+16; pace_video_controller_inst : entity work.pace_video_controller diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index c49106d0..9b44a6ea 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -141,6 +141,7 @@ architecture SYN of platform is -- Kidniki, Battle Road signal kidniki_bank : std_logic_vector(3 downto 0); + signal kidniki_gfxbank: std_logic; begin @@ -180,11 +181,11 @@ begin -- chip select logic -- ROM $0000-$7FFF - -- $0000-$9FFF - LDRUN2 + -- $0000-$9FFF - LDRUN2, KIDNIKI -- $0000-$BFFF - LDRUN3,4, HORIZON -- $A000-$BFFF - BATTROAD rom_cs <= '1' when STD_MATCH(cpu_a, "0---------------") else - '1' when hwsel = HW_LDRUN2 and cpu_a(15 downto 13) = "100" else + '1' when (hwsel = HW_LDRUN2 or hwsel = HW_KIDNIKI) and cpu_a(15 downto 13) = "100" else '1' when (hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_HORIZON) and cpu_a(15 downto 14) = "10" else '1' when hwsel = HW_BATTROAD and cpu_a(15 downto 13) = "101" else '0'; @@ -195,21 +196,27 @@ begin '1' when cpu_a(15 downto 9) = x"C"&"000" and hwsel = HW_HORIZON else '0'; - -- VRAM/CRAM $D000-$DFFF + -- VRAM/CRAM $D000-$DFFF, ($A000-$AFFF - KIDNIKI) vram_cs <= '1' when hwsel = HW_KUNGFUM and - STD_MATCH(cpu_a, X"D"&"0-----------") else - '1' when hwsel /= HW_KUNGFUM and - STD_MATCH(cpu_a, X"D"&"-----------0") else + STD_MATCH(cpu_a, X"D"&"0-----------") else + '1' when hwsel = HW_KIDNIKI and + STD_MATCH(cpu_a, X"A"&"-----------0") else + '1' when hwsel /= HW_KUNGFUM and hwsel /= HW_KIDNIKI and + STD_MATCH(cpu_a, X"D"&"-----------0") else '0'; cram_cs <= '1' when hwsel = HW_KUNGFUM and - STD_MATCH(cpu_a, X"D"&"1-----------") else - '1' when hwsel /= HW_KUNGFUM and - STD_MATCH(cpu_a, X"D"&"-----------1") else + STD_MATCH(cpu_a, X"D"&"1-----------") else + '1' when hwsel = HW_KIDNIKI and + STD_MATCH(cpu_a, X"A"&"-----------1") else + '1' when hwsel /= HW_KUNGFUM and hwsel /= HW_KIDNIKI and + STD_MATCH(cpu_a, X"D"&"-----------1") else '0'; - -- Text RAM $C800-$CFFF + -- Text RAM $C800-$CFFF, ($D000-$DFFF - KIDNIKI) textram_cs <= '1' when hwsel = HW_BATTROAD and cpu_a(15 downto 11) = x"C"&'1' else + '1' when hwsel = HW_KIDNIKI and + cpu_a(15 downto 12) = x"D" else '0'; -- RAM $E000-$EFFF @@ -311,6 +318,7 @@ begin '0' & "10" & ld24_bank & cpu_a(12 downto 0) when hwsel = HW_LDRUN2 and cpu_a(15) = '1' else '0' & '1' & ld24_bank & cpu_a(13 downto 0) when hwsel = HW_LDRUN4 and cpu_a(15) = '1' else '1' & kidniki_bank(2 downto 0) & cpu_a(12 downto 0) when hwsel = HW_BATTROAD and cpu_a(15 downto 13) = "101" else + (kidniki_bank(3 downto 0) + "100") & cpu_a(12 downto 0) when hwsel = HW_KIDNIKI and cpu_a(15 downto 13) = "100" and kidniki_bank(3 downto 2) /= "11" else '0' & cpu_a(15 downto 0); -- Lode Runner 2 bank switching - some kind of protection, only the level number is used to select bank 0 or 1 at $8000 @@ -324,12 +332,16 @@ begin ld2_bankr2 <= (others => '0'); ld24_bank <= '0'; kidniki_bank <= (others => '0'); + kidniki_gfxbank <= '0'; elsif rising_edge(clk_sys) then if cpu_clk_en = '1' and cpu_io_wr = '1' then case cpu_a(7 downto 0) is when X"80" => ld2_bankr1 <= cpu_d_o(5 downto 0); when X"81" => ld2_bankr2 <= cpu_d_o; when X"83" => if hwsel = HW_BATTROAD then kidniki_bank <= cpu_d_o(3 downto 0); end if; + when X"84" => if hwsel = HW_KIDNIKI then kidniki_gfxbank <= cpu_d_o(0); end if; + -- Kidniki banks: 0-7, C-F, 8-B not used + when X"85" => if hwsel = HW_KIDNIKI then kidniki_bank <= cpu_d_o(3) & (not cpu_d_o(3) and cpu_d_o(2)) & cpu_d_o(1 downto 0); end if; when others => null; end case; end if; @@ -403,6 +415,7 @@ begin BLK_SCROLL : block signal m62_hscroll : std_logic_vector(15 downto 0); signal m62_vscroll : std_logic_vector(15 downto 0); + signal m62_vscroll2 : std_logic_vector(15 downto 0); signal m62_topbottom_mask: std_logic; signal scrollram_d_o : std_logic_vector(15 downto 0); signal scrollram_wr : std_logic; @@ -438,6 +451,7 @@ begin if rst_sys = '1' then m62_hscroll <= (others => '0'); m62_vscroll <= (others => '0'); + m62_vscroll2 <= (others => '0'); m62_topbottom_mask <= '0'; elsif rising_edge(clk_sys) then if cpu_clk_en = '1' and cpu_mem_wr = '1' then @@ -456,19 +470,29 @@ begin end if; -- cpu_wr if cpu_clk_en = '1' and cpu_io_wr = '1' then + -- background 1 vscroll if (hwsel = HW_LDRUN3 or hwsel = HW_BATTROAD) and cpu_a(7 downto 0) = x"80" then m62_vscroll(7 downto 0) <= cpu_d_o; end if; + -- background 1 hscroll + if (hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"82") or + ((hwsel = HW_BATTROAD or hwsel = HW_KIDNIKI) and cpu_a(7 downto 0) = x"81") then + m62_hscroll(15 downto 8) <= cpu_d_o; + end if; + if (hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"83") or + (hwsel = HW_BATTROAD and cpu_a(7 downto 0) = x"82") or + (hwsel = HW_KIDNIKI and cpu_a(7 downto 0) = x"80") then + m62_hscroll(7 downto 0) <= cpu_d_o; + end if; if hwsel = HW_LDRUN3 and cpu_a(7 downto 0) = x"81" then m62_topbottom_mask <= cpu_d_o(0); end if; - if (hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"82") or - (hwsel = HW_BATTROAD and cpu_a(7 downto 0) = x"81") then - m62_hscroll(15 downto 8) <= cpu_d_o; + -- backrground 2 vscroll + if hwsel = HW_KIDNIKI and cpu_a(7 downto 0) = x"82" then + m62_vscroll2(7 downto 0) <= cpu_d_o; end if; - if (hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"83") or - (hwsel = HW_BATTROAD and cpu_a(7 downto 0) = x"82") then - m62_hscroll(7 downto 0) <= cpu_d_o; + if hwsel = HW_KIDNIKI and cpu_a(7 downto 0) = x"83" then + m62_vscroll2(15 downto 8) <= cpu_d_o; end if; end if; @@ -489,7 +513,7 @@ begin begin -- external background ROMs - gfx1_addr <= "00"&tilemap_i(1).tile_a(13 downto 0); + gfx1_addr <= '0' & kidniki_gfxbank & tilemap_i(1).tile_a(13 downto 0); tilemap_o(1).tile_d(23 downto 0) <= gfx1_do(7 downto 0) & gfx1_do(15 downto 8) & gfx1_do(23 downto 16); -- internal background ROMs diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd index a24e752c..4b71257f 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd @@ -16,6 +16,7 @@ package platform_variant_pkg is constant HW_KUNGFUM : integer := 4; constant HW_HORIZON : integer := 5; constant HW_BATTROAD : integer := 6; + constant HW_KIDNIKI : integer := 7; type rom_a is array (natural range <>) of string; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index f372a959..0f7a5b4f 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -90,11 +90,15 @@ begin if x(2 downto 0) = "010" then if hwsel = HW_LDRUN4 or hwsel = HW_HORIZON then ctl_o.tile_a(13) <= ctl_i.attr_d(5); + elsif hwsel = HW_KIDNIKI then + ctl_o.tile_a(13) <= ctl_i.attr_d(7); else ctl_o.tile_a(13) <= '0'; end if; if hwsel = HW_BATTROAD then ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6) & ctl_i.attr_d(4); + elsif hwsel = HW_KIDNIKI then + ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6 downto 5); else ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(7 downto 6); end if; From 920ab77b6fa121d42bb2198c4a38475c3a6724b9 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 7 Mar 2020 19:20:18 +0100 Subject: [PATCH 18/35] IremM62: close to original video timings --- Arcade_MiST/IremM62 Hardware/IremM62.sdc | 2 +- Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 8 +--- .../IremM62 Hardware/rtl/IremM62_MiST.sv | 17 ++++---- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 2 + .../IremM62 Hardware/rtl/platform_pkg.vhd | 8 ++-- Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd | 40 +++++++++---------- Arcade_MiST/IremM62 Hardware/rtl/sdram.sv | 32 ++++++++------- .../IremM62 Hardware/rtl/target_top.vhd | 29 ++++++++++++-- .../IremM62 Hardware/rtl/video_controller.vhd | 40 ++++++++++++------- .../rtl/video_controller_pkg.vhd | 2 +- 10 files changed, 108 insertions(+), 72 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.sdc b/Arcade_MiST/IremM62 Hardware/IremM62.sdc index 7d9dfa3c..bb060eb8 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.sdc +++ b/Arcade_MiST/IremM62 Hardware/IremM62.sdc @@ -54,7 +54,7 @@ set_time_format -unit ns -decimal_places 3 create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] set sdram_clk "pll|altpll_component|auto_generated|pll1|clk[0]" -set vid_clk "pll|altpll_component|auto_generated|pll1|clk[1]" +set vid_clk "pll|altpll_component|auto_generated|pll1|clk[2]" set game_clk "pll|altpll_component|auto_generated|pll1|clk[1]" set aud_clk "pll|altpll_component|auto_generated|pll1|clk[3]" diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index 02a4146e..ba392e2e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -15,6 +15,7 @@ entity Graphics is port ( hwsel : in integer; + hires : in std_logic; sprite_prom : in prom_a(0 to 31); bitmap_ctl_i : in to_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); @@ -71,12 +72,7 @@ begin graphics_o.vblank <= video_o_s.vblank; --graphics_o.vblank <= from_video_ctl.vblank; - irem62_hsize <= 384+16 when hwsel = HW_LDRUN or - hwsel = HW_LDRUN2 or - hwsel = HW_LDRUN3 or - hwsel = HW_LDRUN4 or - hwsel = HW_KIDNIKI else - 256+16; + irem62_hsize <= 384+16 when hires = '1' else 256+16; pace_video_controller_inst : entity work.pace_video_controller generic map diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 2faefb9d..2a5463d2 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -52,7 +52,7 @@ assign LED = ~ioctl_downl; assign SDRAM_CLK = clk_sd; assign SDRAM_CKE = 1; -wire clk_sys, clk_aud, clk_sd, clk_vid; +wire clk_sys, clk_vid, clk_aud, clk_sd; wire pll_locked; pll_mist pll( .inclk0(CLOCK_27), @@ -144,8 +144,7 @@ data_io data_io( ); wire [24:0] sp_ioctl_addr = ioctl_addr - 20'h30000; -reg clkref; -always @(posedge clk_vid) clkref <= ~clkref; +wire clkref; reg port1_req, port2_req; sdram sdram( @@ -223,8 +222,8 @@ wire blankn = 1'b1;//todo wire [3:0] g,b,r; target_top target_top( - .clock_sys(clk_sys),//4xclk_vid - .clock_vid(clk_vid),//11MHz + .clock_sys(clk_sys),//24 MHz + .vid_clk_en(clkref), .clk_aud(clk_aud),//0.895MHz .reset_in(reset), .hwsel(core_mod), @@ -265,10 +264,10 @@ target_top target_top( .gfx1_do(chr1_do), .gfx2_addr(sp_addr), .gfx2_do(sp_do) - ); + ); -mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video( - .clk_sys ( clk_sys ), +mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(11)) mist_video( + .clk_sys ( clk_vid ), .SPI_SCK ( SPI_SCK ), .SPI_SS3 ( SPI_SS3 ), .SPI_DI ( SPI_DI ), @@ -283,7 +282,7 @@ mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video( .VGA_VS ( VGA_VS ), .VGA_HS ( VGA_HS ), .rotate ( { 1'b1, rotate } ), - .ce_divider ( 1'b0 ), + .ce_divider ( 1'b1 ), .scandoubler_disable( scandoublerD ), .scanlines ( scanlines ), .blend ( blend ), diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index 39a25dd4..76a3cef4 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -19,6 +19,7 @@ entity PACE is -- hardware variant hwsel : in integer; + hires : in std_logic; -- misc I/O buttons_i : in from_BUTTONS_t; @@ -153,6 +154,7 @@ begin Port Map ( hwsel => hwsel, + hires => hires, sprite_prom => sprite_prom, bitmap_ctl_i => to_bitmap_ctl, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd index 4cca03d9..e6dea694 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd @@ -28,11 +28,11 @@ package platform_pkg is -- constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; -- constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; - constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_PAL_576x288_50Hz; - constant PACE_CLK0_DIVIDE_BY : natural := 27; - constant PACE_CLK0_MULTIPLY_BY : natural := 44; -- 27*44/27 = 44MHz + constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_IREMM62; + constant PACE_CLK0_DIVIDE_BY : natural := 9; + constant PACE_CLK0_MULTIPLY_BY : natural := 8; -- 27*8/9 = 24MHz constant PACE_CLK1_DIVIDE_BY : natural := 27; - constant PACE_CLK1_MULTIPLY_BY : natural := 11; -- 27*11/27 = 11MHz + constant PACE_CLK1_MULTIPLY_BY : natural := 8; -- 27*8/9 = 24MHz constant PACE_VIDEO_H_SCALE : integer := 1; constant PACE_VIDEO_V_SCALE : integer := 1; constant PACE_ENABLE_ADV724 : std_logic := '1'; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd index 044c0700..dd7023e9 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pll_mist.vhd @@ -164,17 +164,17 @@ BEGIN altpll_component : altpll GENERIC MAP ( bandwidth_type => "AUTO", - clk0_divide_by => 27, + clk0_divide_by => 3, clk0_duty_cycle => 50, - clk0_multiply_by => 88, + clk0_multiply_by => 8, clk0_phase_shift => "0", - clk1_divide_by => 27, + clk1_divide_by => 9, clk1_duty_cycle => 50, - clk1_multiply_by => 44, + clk1_multiply_by => 8, clk1_phase_shift => "0", - clk2_divide_by => 27, + clk2_divide_by => 9, clk2_duty_cycle => 50, - clk2_multiply_by => 11, + clk2_multiply_by => 16, clk2_phase_shift => "0", clk3_divide_by => 5400, clk3_duty_cycle => 50, @@ -263,15 +263,15 @@ END SYN; -- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" -- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27" -- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" --- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "1" -- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "27" -- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE3 STRING "50.00000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "88.000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "44.000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "11.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "72.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "24.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "48.000000" -- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "0.895000" -- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" -- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" @@ -303,12 +303,12 @@ END SYN; -- Retrieval info: PRIVATE: MIRROR_CLK3 STRING "0" -- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "44" -- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "11" --- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "88" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "1" -- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "1" -- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" --- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "88.00000000" --- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "44.00000000" --- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "11.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "72.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "24.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "48.00000000" -- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "0.89500000" -- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" -- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" @@ -369,17 +369,17 @@ END SYN; -- 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 "27" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "3" -- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "88" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" -- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" --- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" -- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "44" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "8" -- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" --- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "9" -- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "11" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "16" -- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" -- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "5400" -- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv b/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv index edaa784b..3c68bc50 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv @@ -66,6 +66,8 @@ module sdram ( output reg [31:0] sp_q ); +parameter MHZ = 16'd80; // 80 MHz default clock, set it to proper value to calculate refresh rate + localparam RASCAS_DELAY = 3'd2; // tRCD=20ns -> 2 cycles@<100MHz localparam BURST_LENGTH = 3'b001; // 000=1, 001=2, 010=4, 011=8 localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved @@ -75,8 +77,8 @@ localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single acc localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; -// 64ms/8192 rows = 7.8us -> 842 cycles@108MHz -localparam RFRSH_CYCLES = 10'd842; +// 64ms/8192 rows = 7.8us +localparam RFRSH_CYCLES = 16'd78*MHZ/4'd10; // --------------------------------------------------------------------- // ------------------------ cycle state machine ------------------------ @@ -86,35 +88,37 @@ localparam RFRSH_CYCLES = 10'd842; SDRAM state machine for 2 bank interleaved access 1 word burst, CL2 cmd issued registered - 0 RAS0 + 0 RAS0 data1 returned 1 ras0 - data1 returned - 2 data1 returned - 3 CAS0 + 2 + 3 CAS0 4 RAS1 cas0 5 ras1 6 CAS1 data0 returned 7 cas1 - data0 read burst terminated + 8 */ -localparam STATE_RAS0 = 3'd0; // first state in cycle -localparam STATE_RAS1 = 3'd4; // Second ACTIVE command after RAS0 + tRRD (15ns) +localparam STATE_RAS0 = 4'd0; // first state in cycle +localparam STATE_RAS1 = 4'd4; // Second ACTIVE command after RAS0 + tRRD (15ns) localparam STATE_CAS0 = STATE_RAS0 + RASCAS_DELAY + 1'd1; // CAS phase - 3 localparam STATE_CAS1 = STATE_RAS1 + RASCAS_DELAY; // CAS phase - 6 localparam STATE_READ0 = STATE_CAS0 + CAS_LATENCY + 2'd2; // 7 -localparam STATE_READ1 = 3'd2; -localparam STATE_DS1b = 3'd7; -localparam STATE_READ1b = 3'd3; -localparam STATE_LAST = 3'd7; +localparam STATE_READ1 = 4'd1; +localparam STATE_DS1b = 4'd7; +localparam STATE_READ1b = 4'd2; +localparam STATE_LAST = 4'd8; -reg [2:0] t; +reg [3:0] t; always @(posedge clk) begin reg clkref_d; clkref_d <= clkref; - t <= t + 1'd1; +// t <= t + 1'd1; + if ((~clkref_d && clkref && t == 4'd2) || (t != 4'd2)) t <= t + 1'd1; if (t == STATE_LAST) t <= STATE_RAS0; - if (~clkref_d & clkref) t <= STATE_RAS0; +// if (~clkref_d & clkref) t <= STATE_RAS0; end // --------------------------------------------------------------------- diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index 95e93444..839da6fa 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -7,10 +7,11 @@ library work; use work.pace_pkg.all; use work.video_controller_pkg.all; use work.platform_pkg.all; +use work.platform_variant_pkg.all; entity target_top is port( clock_sys : in std_logic; - clock_vid : in std_logic; + vid_clk_en : out std_logic; clk_aud : in std_logic; reset_in : in std_logic; hwsel : in integer; @@ -69,9 +70,27 @@ architecture SYN of target_top is signal platform_o : to_PLATFORM_IO_t; signal sound_data : std_logic_vector(7 downto 0); + signal hires : std_logic; + signal count : std_logic_vector(1 downto 0); + begin + + hires <= '1' when hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_KIDNIKI else '0'; + + process(clock_sys) begin + if rising_edge(clock_sys) then + -- video clock enable: 24MHz/3 when hires, else 24MHz/4 + if hires = '1' and count = 2 then + count <= "00"; + else + count <= count + 1; + end if; + end if; + end process; + clkrst_i.clk(0) <= clock_sys; - clkrst_i.clk(1) <= clock_vid; +-- clkrst_i.clk(1) <= clock_vid; + clkrst_i.clk(1) <= clock_sys; clkrst_i.arst <= reset_in; clkrst_i.arst_n <= not clkrst_i.arst; @@ -88,8 +107,11 @@ GEN_RESETS : for i in 0 to 3 generate end process; end generate GEN_RESETS; + vid_clk_en <= video_i.clk_ena; + video_i.clk <= clkrst_i.clk(1); - video_i.clk_ena <= '1'; +-- video_i.clk_ena <= '1'; + video_i.clk_ena <= '1' when count = "00" else '0'; video_i.reset <= clkrst_i.rst(1); VGA_R <= video_o.rgb.r(9 downto 6); VGA_G <= video_o.rgb.g(9 downto 6); @@ -113,6 +135,7 @@ pace_inst : entity work.pace port map( clkrst_i => clkrst_i, hwsel => hwsel, + hires => hires, buttons_i => buttons_i, switches_i => switches_i, inputs_i => inputs_i, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd index 85b8d504..99087b74 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd @@ -262,16 +262,18 @@ begin v_back_porch_r <= 13; v_border_r <= (240-VIDEO_V_SIZE)/2; - when PACE_VIDEO_PAL_576x288_50Hz => - -- pixclk=11 MHz - h_front_porch_r <= 2*6; - h_sync_r <= 2*28; - h_back_porch_r <= 2*30; - h_border_r <= (576-VIDEO_H_SIZE)/2; - v_front_porch_r <= 8; + when PACE_VIDEO_IREMM62 => + -- Irem M62 original timings + -- 512x282@8MHz or 384x282@6Mhz, (384x256 or 256x256 active display), 55 Hz + -- use 312 lines here, for 50 Hz PAL compatiblity. + h_front_porch_r <= 12; + h_sync_r <= 38; + h_back_porch_r <= 62; + h_border_r <= 0;--(576-VIDEO_H_SIZE)/2; + v_front_porch_r <= 10+15; v_sync_r <= 3; - v_back_porch_r <= 13; - v_border_r <= (288-VIDEO_V_SIZE)/2; + v_back_porch_r <= 13+15; + v_border_r <= 0;--(288-VIDEO_V_SIZE)/2; when others => null; @@ -280,7 +282,7 @@ begin h_video_r <= VIDEO_H_SIZE; v_video_r <= VIDEO_V_SIZE; border_rgb_r <= BORDER_RGB; - + --end if; end process reg_proc; @@ -420,9 +422,10 @@ begin vblank_v_r := (others => '0'); stb_cnt_v := (others => '1'); elsif rising_edge(clk) and clk_ena = '1' then - + + -- hblank -- register control signals and handle scaling - video_ctl_o.hblank <= not hactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers +-- video_ctl_o.hblank <= not hactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers video_ctl_o.vblank <= not vactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers -- handle scaling video_ctl_o.stb <= stb_cnt_v(H_SCALE-1) after SIM_DELAY; @@ -433,11 +436,20 @@ begin end if; video_ctl_o.x <= std_logic_vector(resize(x_s(x_s'left downto H_SCALE-1), video_ctl_o.x'length)) after SIM_DELAY; video_ctl_o.y <= std_logic_vector(resize(y_s(y_s'left downto V_SCALE-1), video_ctl_o.y'length)) after SIM_DELAY; - + -- register video outputs if hactive_v = '1' and vactive_v = '1' then + -- set hblank used only by the bitmap/tilemap/sprite controllers early + if x_s(x_s'left downto H_SCALE-1) < (L_CROP + PIPELINE_DELAY-7) or + x_s(x_s'left downto H_SCALE-1) >= (H_SIZE - R_CROP + PIPELINE_DELAY-7) then + video_ctl_o.hblank <= '1'; + else + video_o.rgb <= rgb_i after SIM_DELAY; + video_ctl_o.hblank <= '0'; -- used only by the bitmap/tilemap/sprite controllers + end if; + -- active video - if x_s(x_s'left downto H_SCALE-1) < (L_CROP + PIPELINE_DELAY) or + if x_s(x_s'left downto H_SCALE-1) < (L_CROP + PIPELINE_DELAY) or x_s(x_s'left downto H_SCALE-1) >= (H_SIZE - R_CROP + PIPELINE_DELAY) then video_o.rgb <= RGB_BLACK after SIM_DELAY; else diff --git a/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd index 42f80de6..46f9e286 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/video_controller_pkg.vhd @@ -22,7 +22,7 @@ package video_controller_pkg is PACE_VIDEO_ARCADE_STD_336x240_60Hz_28M64, -- arcade std resolution (28.64MHz) PACE_VIDEO_CVBS_720x288p_50Hz, -- generic composite PACE_VIDEO_LCM_320x240_60Hz, -- DE2 LCD - PACE_VIDEO_PAL_576x288_50Hz + PACE_VIDEO_IREMM62 ); type PACEVideoDisplay_t is From 12e7c7bea180d507c2a62b29f24744bfb4658d61 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 7 Mar 2020 19:20:37 +0100 Subject: [PATCH 19/35] IremM62: flipx for background --- .../IremM62 Hardware/rtl/tilemapctl.vhd | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index 0f7a5b4f..bfdc2262 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -49,7 +49,7 @@ architecture TILEMAP_1 of tilemapCtl is alias rot_en : std_logic is graphics_i.bit8(0)(0); alias hscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(0); alias vscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(1); - + begin ctl_o.rgb <= ctl_i.rgb; @@ -71,6 +71,7 @@ begin variable tile_d_r : std_logic_vector(23 downto 0); variable attr_d_r : std_logic_vector(7 downto 0); + variable flipx : std_logic; variable pel : std_logic_vector(2 downto 0); begin @@ -109,14 +110,32 @@ begin -- 3rd stage of pipeline -- - read tile, attribute data from ROM if x(2 downto 0) = "100" then - tile_d_r := ctl_i.tile_d(tile_d_r'range); attr_d_r := ctl_i.attr_d(7 downto 0); + if hwsel = HW_KUNGFUM or + --hwsel = LOTLOT or + hwsel = HW_LDRUN or + hwsel = HW_LDRUN2 or + hwsel = HW_BATTROAD + then + flipx := attr_d_r(5); + else + flipx := '0'; + end if; + tile_d_r := ctl_i.tile_d(tile_d_r'range); elsif stb = '1' then - tile_d_r := tile_d_r(tile_d_r'left-1 downto 0) & '0'; + if flipx = '0' then + tile_d_r := tile_d_r(tile_d_r'left-1 downto 0) & '0'; + else + tile_d_r := '0' & tile_d_r(tile_d_r'left downto 1); + end if; end if; -- extract R,G,B from colour palette - pel := tile_d_r(tile_d_r'left-16) & tile_d_r(tile_d_r'left-8) & tile_d_r(tile_d_r'left); + if flipx = '0' then + pel := tile_d_r(tile_d_r'left-16) & tile_d_r(tile_d_r'left-8) & tile_d_r(tile_d_r'left); + else + pel := tile_d_r(tile_d_r'right) & tile_d_r(tile_d_r'right+8) & tile_d_r(tile_d_r'right+16); + end if; if hwsel = HW_BATTROAD then ctl_o.pal_a <= '0' & attr_d_r(3 downto 0) & pel; else From 52b1f3e594a091998f03c11e76e58248c3b7f891 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 7 Mar 2020 20:44:39 +0100 Subject: [PATCH 20/35] IremM62: some sprite array optimizations (but still consume huge area) --- Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 3 +- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 3 + Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 22 +++-- .../IremM62 Hardware/rtl/sprite_array.vhd | 1 - .../IremM62 Hardware/rtl/sprite_pkg.vhd | 3 +- .../IremM62 Hardware/rtl/sprite_pkg_body.vhd | 2 +- .../IremM62 Hardware/rtl/spritectl.vhd | 83 ++++++++----------- 7 files changed, 59 insertions(+), 58 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index ba392e2e..fee8080e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -27,6 +27,7 @@ entity Graphics is sprite_ctl_i : in to_SPRITE_CTL_t; sprite_ctl_o : out from_SPRITE_CTL_t; spr0_hit : out std_logic; + sprite_rgb : in RGB_t; graphics_i : in to_GRAPHICS_t; graphics_o : out from_GRAPHICS_t; @@ -113,7 +114,7 @@ begin ( bitmap_ctl_o => bitmap_ctl_o_s, tilemap_ctl_o => tilemap_ctl_o_s, - sprite_rgb => sprite_ctl_i.rgb, + sprite_rgb => sprite_rgb, sprite_set => sprite_ctl_o_s.set, sprite_pri => sprite_pri, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index 76a3cef4..8e333564 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -78,6 +78,7 @@ architecture SYN of PACE is signal from_graphics : from_GRAPHICS_t; signal sprite_prom : prom_a(0 to 31); signal sprite_no : integer range 0 to PACE_VIDEO_NUM_SPRITES-1; + signal sprite_rgb : RGB_t; begin @@ -129,6 +130,7 @@ begin sprite_i => from_sprite_ctl, sprite_o => to_sprite_ctl, spr0_hit => spr0_hit, + sprite_rgb => sprite_rgb, graphics_i => from_graphics, graphics_o => to_graphics, @@ -167,6 +169,7 @@ begin sprite_ctl_i => to_sprite_ctl, sprite_ctl_o => from_sprite_ctl, spr0_hit => spr0_hit, + sprite_rgb => sprite_rgb, graphics_i => to_graphics, graphics_o => from_graphics, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 9b44a6ea..6419b504 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -43,6 +43,7 @@ entity platform is sprite_i : in from_SPRITE_CTL_t; sprite_o : out to_SPRITE_CTL_t; spr0_hit : in std_logic; + sprite_rgb : out RGB_t; -- various graphics information graphics_i : in from_GRAPHICS_t; @@ -124,6 +125,7 @@ architecture SYN of platform is signal sp_pal_r_wr : std_logic; signal sp_pal_g_wr : std_logic; signal sp_pal_b_wr : std_logic; + signal sprite_pal_a : std_logic_vector(7 downto 0); -- other signals signal rst_platform : std_logic; @@ -737,6 +739,14 @@ begin ); pal_b_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"5" else '0'; -- 500-5FF + sprite_pal_a <= '0' & sprite_i.pal_a(6 downto 0) when + hwsel = HW_LDRUN or + hwsel = HW_LDRUN2 or + hwsel = HW_LDRUN3 or + hwsel = HW_LDRUN4 or + hwsel = HW_BATTROAD + else sprite_i.pal_a; + -- sprite palettes sp_pal_r : entity work.dpram generic map @@ -754,10 +764,10 @@ begin q_b => open, clock_a => not clk_video, - address_a => sprite_i.pal_a, + address_a => sprite_pal_a, wren_a => '0', data_a => (others => '0'), - q_a => sprite_o.rgb.r(9 downto 2) + q_a => sprite_rgb.r(9 downto 2) ); sp_pal_r_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"0" else '0'; -- 000-0FF @@ -777,10 +787,10 @@ begin q_b => open, clock_a => not clk_video, - address_a => sprite_i.pal_a, + address_a => sprite_pal_a, wren_a => '0', data_a => (others => '0'), - q_a => sprite_o.rgb.g(9 downto 2) + q_a => sprite_rgb.g(9 downto 2) ); sp_pal_g_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"1" else '0'; -- 100-1FF @@ -800,10 +810,10 @@ begin q_b => open, clock_a => not clk_video, - address_a => sprite_i.pal_a, + address_a => sprite_pal_a, wren_a => '0', data_a => (others => '0'), - q_a => sprite_o.rgb.b(9 downto 2) + q_a => sprite_rgb.b(9 downto 2) ); sp_pal_b_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"2" else '0'; -- 200-2FF diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd index 86c13077..99b1129c 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd @@ -96,7 +96,6 @@ begin ctl_i(i).ld <= ld_r(i); ctl_i(i).height <= sprite_prom(to_integer(unsigned(reg_o(i).n(9 downto 5)))); ctl_i(i).d <= row_d; - ctl_i(i).rgb <= (others => (others => '0')); end generate GEN_ROW_D; -- Sprite Priority Encoder diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd index 349dff16..960322b7 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd @@ -34,14 +34,13 @@ package sprite_pkg is function NULL_TO_SPRITE_REG return to_SPRITE_REG_t; - subtype SPRITE_ROW_D_t is std_logic_vector(63 downto 0); + subtype SPRITE_ROW_D_t is std_logic_vector(23 downto 0); subtype SPRITE_ROW_A_t is std_logic_vector(15 downto 0); type to_SPRITE_CTL_t is record ld : std_logic; d : SPRITE_ROW_D_t; height : integer range 0 to 3; - rgb : RGB_t; end record; type from_SPRITE_CTL_t is record diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg_body.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg_body.vhd index beed41d5..5105ef5c 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg_body.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg_body.vhd @@ -11,7 +11,7 @@ package body sprite_pkg is function NULL_TO_SPRITE_CTL return to_SPRITE_CTL_t is begin - return ('0', (others => '0'), 0, (others => (others => '0'))); + return ('0', (others => '0'), 0); end function NULL_TO_SPRITE_CTL; function flip_row diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index 5f3304f4..16f0833c 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -41,35 +41,35 @@ architecture SYN of spritectl is signal ld_r : std_logic; signal left_d : std_logic; + signal hblank_r : std_logic; signal rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period + signal rowCount : unsigned(5 downto 0); + -- which part of the sprite is being drawn + alias segment : unsigned(1 downto 0) is rowCount(5 downto 4); begin - process (clk, clk_ena, left_d, reg_i) + process (clk, clk_ena, left_d, rowCount, reg_i) - variable pel : std_logic_vector(2 downto 0); - variable x : unsigned(video_ctl.x'range); - variable y : unsigned(video_ctl.y'range); - variable yMat : boolean; -- raster is between first and last line of sprite - variable xMat : boolean; -- raster in between left edge and end of line + variable pel : std_logic_vector(2 downto 0); + variable x : unsigned(video_ctl.x'range); + variable y : unsigned(video_ctl.y'range); + variable xMat : boolean; -- raster in between left edge and end of line + variable yMat : boolean; -- raster is between first and last line of sprite - variable height : unsigned(6 downto 0); + variable height : unsigned(1 downto 0); - variable rowCount : unsigned(height'range); - -- which part of the sprite is being drawn - alias segment : unsigned(1 downto 0) is rowCount(5 downto 4); - - variable code : std_logic_vector(9 downto 0); - variable pal_i : std_logic_vector(7 downto 0); + variable code : std_logic_vector(9 downto 0); begin if rising_edge(clk) then if clk_ena = '1' then ld_r <= ctl_i.ld; + hblank_r <= video_ctl.hblank; if video_ctl.hblank = '1' then - x := unsigned(reg_i.x) - video_ctl.video_h_offset + PACE_VIDEO_PIPELINE_DELAY - 3; + x := unsigned(reg_i.x) - video_ctl.video_h_offset + PACE_VIDEO_PIPELINE_DELAY - 2; y := 256 + 128 - 18 - unsigned(reg_i.y); -- hande sprite height, placement @@ -77,23 +77,33 @@ begin case ctl_i.height is when 1 => -- double height - height := to_unsigned(2*16,height'length); y := y - 16; when 2 => -- quadruple height - height := to_unsigned(4*16,height'length); y := y - 3*16; when others => - height := to_unsigned(16,height'length); + null; end case; - -- do this 1st because we don't have many clocks - if y = unsigned(video_ctl.y) then - -- start counting sprite row - rowCount := (others => '0'); - yMat := true; - elsif rowCount = height then - yMat := false; + height := to_unsigned(ctl_i.height,2); + height(0) := height (0) or height(1); + + -- count row at start of hblank + if hblank_r = '0' then + if y = unsigned(video_ctl.y) then + -- start counting sprite row + rowCount <= (others => '0'); + yMat := true; + elsif rowCount = height & "1111" then + yMat := false; + else + rowCount <= rowCount + 1; + end if; + + -- stop sprites wrapping from bottom of screen + if y = 0 then + yMat := false; + end if; end if; case ctl_i.height is @@ -115,14 +125,8 @@ begin null; end case; - xMat := false; - -- stop sprites wrapping from bottom of screen - if y = 0 then - yMat := false; - end if; - - -- sprites not visible before row 16 if ld_r = '0' and ctl_i.ld = '1' then + xMat := false; left_d <= not left_d; -- switch sprite half if yMat then if left_d = '1' then @@ -147,12 +151,7 @@ begin if video_ctl.stb = '1' then if x = unsigned(video_ctl.x) then - -- count up at left edge of sprite - rowCount := rowCount + 1; - -- start of sprite - --if unsigned(x) /= 0 and unsigned(x) < 240 then xMat := true; - --end if; end if; if xMat then @@ -172,17 +171,7 @@ begin end if; - if hwsel = HW_LDRUN or - hwsel = HW_LDRUN2 or - hwsel = HW_LDRUN3 or - hwsel = HW_LDRUN4 or - hwsel = HW_BATTROAD then - pal_i := '0' & reg_i.colour(3 downto 0) & pel; - else - pal_i := reg_i.colour(4 downto 0) & pel; - end if; - --pal_i := "000" & std_logic_vector(to_unsigned(INDEX,5)); - ctl_o.pal_a <= pal_i; + ctl_o.pal_a <= reg_i.colour(4 downto 0) & pel; -- set pixel transparency based on match ctl_o.set <= '0'; From c51a739fdb377958047b92f2ddd22e7858312799 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 7 Mar 2020 20:45:59 +0100 Subject: [PATCH 21/35] IremM62: fix some mod numbers --- Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra | 2 +- Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra b/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra index 75655e29..e1a1e3f2 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra @@ -4,7 +4,7 @@ battroad Irem iremm62 - 5 + 6 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra b/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra index 477e8156..7d415c04 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra @@ -4,7 +4,7 @@ kidniki Irem iremm62 - 6 + 7 From 598500d7bd2b2002b9b05714a2b2012edcdd71df Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 7 Mar 2020 21:41:10 +0100 Subject: [PATCH 22/35] IremM62: add Lot Lot (but wrong, 12x10 tiles?) --- Arcade_MiST/IremM62 Hardware/meta/Lot Lot.mra | 131 ++++++++++++++++++ Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 8 +- .../rtl/platform_variant_pkg.vhd | 1 + .../IremM62 Hardware/rtl/target_top.vhd | 2 +- .../IremM62 Hardware/rtl/tilemapctl.vhd | 2 +- 5 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Lot Lot.mra diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lot Lot.mra b/Arcade_MiST/IremM62 Hardware/meta/Lot Lot.mra new file mode 100644 index 00000000..04ba8456 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Lot Lot.mra @@ -0,0 +1,131 @@ + + Lot Lot + 0216 + lotlot + Irem + iremm62 + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 6419b504..d5a059f6 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -214,11 +214,13 @@ begin STD_MATCH(cpu_a, X"D"&"-----------1") else '0'; - -- Text RAM $C800-$CFFF, ($D000-$DFFF - KIDNIKI) + -- Text RAM $C800-$CFFF - BATTROAD, $D000-$DFFF - KIDNIKI, $A000-$AFFF - LOTLOT textram_cs <= '1' when hwsel = HW_BATTROAD and cpu_a(15 downto 11) = x"C"&'1' else '1' when hwsel = HW_KIDNIKI and cpu_a(15 downto 12) = x"D" else + '1' when hwsel = HW_LOTLOT and + cpu_a(15 downto 12) = x"A" else '0'; -- RAM $E000-$EFFF @@ -456,6 +458,10 @@ begin m62_vscroll2 <= (others => '0'); m62_topbottom_mask <= '0'; elsif rising_edge(clk_sys) then + if hwsel = HW_LOTLOT then + m62_hscroll <= std_logic_vector(to_signed(-64, m62_hscroll'length)); + m62_vscroll <= std_logic_vector(to_unsigned(32, m62_vscroll'length)); + end if; if cpu_clk_en = '1' and cpu_mem_wr = '1' then case cpu_a is when X"A000" => diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd index 4b71257f..6c684d9a 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd @@ -17,6 +17,7 @@ package platform_variant_pkg is constant HW_HORIZON : integer := 5; constant HW_BATTROAD : integer := 6; constant HW_KIDNIKI : integer := 7; + constant HW_LOTLOT : integer := 8; type rom_a is array (natural range <>) of string; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index 839da6fa..1bb65124 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -75,7 +75,7 @@ architecture SYN of target_top is begin - hires <= '1' when hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_KIDNIKI else '0'; + hires <= '1' when hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_KIDNIKI or hwsel= HW_LOTLOT else '0'; process(clock_sys) begin if rising_edge(clock_sys) then diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index bfdc2262..eb6d0b27 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -112,7 +112,7 @@ begin if x(2 downto 0) = "100" then attr_d_r := ctl_i.attr_d(7 downto 0); if hwsel = HW_KUNGFUM or - --hwsel = LOTLOT or + hwsel = HW_LOTLOT or hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or hwsel = HW_BATTROAD From 3d8c538e98aad46de57beb562b54225426c43a85 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 7 Mar 2020 22:07:51 +0100 Subject: [PATCH 23/35] IremM62: CPU clock is pixel clock/2 --- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 2 ++ Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 19 +++---------------- .../IremM62 Hardware/rtl/target_top.vhd | 10 ++++++++++ 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index 8e333564..db242cdf 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -16,6 +16,7 @@ entity PACE is ( -- clocks and resets clkrst_i : in from_CLKRST_t; + cpu_clk_en_i : in std_logic; -- hardware variant hwsel : in integer; @@ -108,6 +109,7 @@ begin ( -- clocking and reset clkrst_i => clkrst_i, + cpu_clk_en_i => cpu_clk_en_i, hwsel => hwsel, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index d5a059f6..d2bf9828 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -20,6 +20,7 @@ entity platform is ( -- clocking and reset clkrst_i : in from_CLKRST_t; + cpu_clk_en_i : in std_logic; hwsel : in integer; @@ -77,7 +78,6 @@ architecture SYN of platform is alias clk_video : std_logic is clkrst_i.clk(1); -- cpu signals - signal clk_3M072_en : std_logic; signal cpu_clk_en : std_logic; signal cpu_a : std_logic_vector(15 downto 0); signal cpu_d_i : std_logic_vector(7 downto 0); @@ -267,7 +267,7 @@ begin -- sprite registers sprite_reg_o.clk <= clk_sys; - sprite_reg_o.clk_ena <= clk_3M072_en; + sprite_reg_o.clk_ena <= cpu_clk_en_i; sprite_reg_o.a <= cpu_a(8 downto 0) when hwsel = HW_HORIZON else '0' & cpu_a(7 downto 0); sprite_reg_o.d <= cpu_d_o; sprite_reg_o.wr <= sprite_cs and cpu_mem_wr; @@ -279,21 +279,8 @@ begin BLK_CPU : block signal cpu_rst : std_logic; begin - -- generate CPU enable clock (3MHz from 27/30MHz) - clk_en_inst : entity work.clk_div - generic map - ( - DIVISOR => M62_CPU_CLK_ENA_DIVIDE_BY - ) - port map - ( - clk => clk_sys, - reset => rst_sys, - clk_en => clk_3M072_en - ); - -- gated CPU signals - cpu_clk_en <= clk_3M072_en and not pause; + cpu_clk_en <= cpu_clk_en_i and not pause; cpu_rst <= rst_sys or rst_platform; cpu_inst : entity work.Z80 diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index 1bb65124..d464c56e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -72,6 +72,8 @@ architecture SYN of target_top is signal hires : std_logic; signal count : std_logic_vector(1 downto 0); + signal cpu_clk : std_logic; + signal cpu_clk_en : std_logic; begin @@ -85,9 +87,16 @@ begin else count <= count + 1; end if; + + -- CPU clock = vidclk / 2 + if count = "00" then + cpu_clk <= not cpu_clk; + end if; end if; end process; + cpu_clk_en <= '1' when count = "00" and cpu_clk = '1' else '0'; + clkrst_i.clk(0) <= clock_sys; -- clkrst_i.clk(1) <= clock_vid; clkrst_i.clk(1) <= clock_sys; @@ -134,6 +143,7 @@ Sound_Board : entity work.Sound_Board pace_inst : entity work.pace port map( clkrst_i => clkrst_i, + cpu_clk_en_i => cpu_clk_en, hwsel => hwsel, hires => hires, buttons_i => buttons_i, From 033877c832f0391793b04c2d9ac4bdc8f0fb18a2 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 7 Mar 2020 22:44:06 +0100 Subject: [PATCH 24/35] IremM62: fix CPU interrupt --- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 50 +++++++------------ 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index d2bf9828..2e531306 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -86,6 +86,7 @@ architecture SYN of platform is signal cpu_io_rd : std_logic; signal cpu_io_wr : std_logic; signal cpu_irq : std_logic; + signal cpu_intack : std_logic; -- ROM signals signal rom_cs : std_logic; @@ -301,7 +302,7 @@ begin intreq => cpu_irq, intvec => cpu_d_i, - intack => open, + intack => cpu_intack, nmi => '0' ); @@ -359,41 +360,28 @@ begin BLK_INTERRUPTS : block - signal vblank_int : std_logic; + signal vblank_r : std_logic; begin - - process (clk_sys, rst_sys) - variable vblank_r : std_logic_vector(3 downto 0); - alias vblank_prev : std_logic is vblank_r(vblank_r'left); - alias vblank_um : std_logic is vblank_r(vblank_r'left-1); - -- 1us duty for VBLANK_INT - variable count : integer range 0 to CLK0_FREQ_MHz * 100; - begin - if rst_sys = '1' then - vblank_int <= '0'; - vblank_r := (others => '0'); - count := count'high; - elsif rising_edge(clk_sys) then - -- rising edge vblank only - if vblank_prev = '0' and vblank_um = '1' then - count := 0; - end if; - if count /= count'high then - vblank_int <= '1'; - count := count + 1; - else - vblank_int <= '0'; - end if; - vblank_r := vblank_r(vblank_r'left-1 downto 0) & graphics_i.vblank; - end if; -- rising_edge(clk_sys) - end process; -- generate INT - cpu_irq <= vblank_int; - + process (clk_sys, rst_sys) + begin + if rst_sys = '1' then + cpu_irq <= '0'; + elsif rising_edge(clk_sys) then + vblank_r <= graphics_i.vblank; + if vblank_r = '0' and graphics_i.vblank = '1' then + cpu_irq <= '1'; + end if; + if cpu_intack = '1' then + cpu_irq <= '0'; + end if; + end if; + end process; + end block BLK_INTERRUPTS; - + BLK_INPUTS : block begin in_d_o <= inputs_i(0).d when cpu_a(2 downto 0) = "000" else From 8cc7636a5c1062448942684227f6736869f657df Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sun, 8 Mar 2020 01:07:59 +0100 Subject: [PATCH 25/35] IremM62: add Spelunker (usual glitches and no 2nd tilemap) --- .../IremM62 Hardware/meta/Spelunker 2.mra | 83 ++++++++++++++++++ .../IremM62 Hardware/meta/Spelunker.mra | 87 +++++++++++++++++++ Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 78 +++++++++++++---- .../rtl/platform_variant_pkg.vhd | 2 + .../IremM62 Hardware/rtl/target_top.vhd | 2 +- .../IremM62 Hardware/rtl/tilemapctl.vhd | 38 ++++---- 6 files changed, 255 insertions(+), 35 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra diff --git a/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra b/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra new file mode 100644 index 00000000..fbd36ea1 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra @@ -0,0 +1,83 @@ + + Spelunker 2 + 0216 + spelunk2 + Irem + iremm62 + 0A + + + + + + + FF + + + + + + FF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra b/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra new file mode 100644 index 00000000..6c3b11d4 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra @@ -0,0 +1,87 @@ + + Spelunker + 0216 + spelunkr + Irem + iremm62 + 9 + + + + + FF + + + FF + + + FF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 2e531306..b9920401 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -127,6 +127,7 @@ architecture SYN of platform is signal sp_pal_g_wr : std_logic; signal sp_pal_b_wr : std_logic; signal sprite_pal_a : std_logic_vector(7 downto 0); + signal tilemap1_pal_a : std_logic_vector(7 downto 0); -- other signals signal rst_platform : std_logic; @@ -146,6 +147,8 @@ architecture SYN of platform is signal kidniki_bank : std_logic_vector(3 downto 0); signal kidniki_gfxbank: std_logic; + signal spelunkr_palbank : std_logic; + begin -- handle special keys @@ -184,11 +187,11 @@ begin -- chip select logic -- ROM $0000-$7FFF - -- $0000-$9FFF - LDRUN2, KIDNIKI + -- $0000-$9FFF - LDRUN2, KIDNIKI, SPELUNKR -- $0000-$BFFF - LDRUN3,4, HORIZON -- $A000-$BFFF - BATTROAD rom_cs <= '1' when STD_MATCH(cpu_a, "0---------------") else - '1' when (hwsel = HW_LDRUN2 or hwsel = HW_KIDNIKI) and cpu_a(15 downto 13) = "100" else + '1' when (hwsel = HW_LDRUN2 or hwsel = HW_KIDNIKI or hwsel = HW_SPELUNKR) and cpu_a(15 downto 13) = "100" else '1' when (hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_HORIZON) and cpu_a(15 downto 14) = "10" else '1' when hwsel = HW_BATTROAD and cpu_a(15 downto 13) = "101" else '0'; @@ -199,11 +202,13 @@ begin '1' when cpu_a(15 downto 9) = x"C"&"000" and hwsel = HW_HORIZON else '0'; - -- VRAM/CRAM $D000-$DFFF, ($A000-$AFFF - KIDNIKI) + -- VRAM/CRAM $D000-$DFFF, $A000-$AFFF - KIDNIKI, $A000-$BFFF - SPELUNKR, SPELUNK2 vram_cs <= '1' when hwsel = HW_KUNGFUM and STD_MATCH(cpu_a, X"D"&"0-----------") else '1' when hwsel = HW_KIDNIKI and STD_MATCH(cpu_a, X"A"&"-----------0") else + '1' when (hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2) and + STD_MATCH(cpu_a, "101------------0") else '1' when hwsel /= HW_KUNGFUM and hwsel /= HW_KIDNIKI and STD_MATCH(cpu_a, X"D"&"-----------0") else '0'; @@ -211,12 +216,14 @@ begin STD_MATCH(cpu_a, X"D"&"1-----------") else '1' when hwsel = HW_KIDNIKI and STD_MATCH(cpu_a, X"A"&"-----------1") else + '1' when (hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2) and + STD_MATCH(cpu_a, "101------------1") else '1' when hwsel /= HW_KUNGFUM and hwsel /= HW_KIDNIKI and STD_MATCH(cpu_a, X"D"&"-----------1") else '0'; - -- Text RAM $C800-$CFFF - BATTROAD, $D000-$DFFF - KIDNIKI, $A000-$AFFF - LOTLOT - textram_cs <= '1' when hwsel = HW_BATTROAD and + -- Text RAM $C800-$CFFF - BATTROAD, SPELUNKR, SPELUNK2, $D000-$DFFF - KIDNIKI, $A000-$AFFF - LOTLOT + textram_cs <= '1' when (hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2) and cpu_a(15 downto 11) = x"C"&'1' else '1' when hwsel = HW_KIDNIKI and cpu_a(15 downto 12) = x"D" else @@ -311,6 +318,7 @@ begin '0' & '1' & ld24_bank & cpu_a(13 downto 0) when hwsel = HW_LDRUN4 and cpu_a(15) = '1' else '1' & kidniki_bank(2 downto 0) & cpu_a(12 downto 0) when hwsel = HW_BATTROAD and cpu_a(15 downto 13) = "101" else (kidniki_bank(3 downto 0) + "100") & cpu_a(12 downto 0) when hwsel = HW_KIDNIKI and cpu_a(15 downto 13) = "100" and kidniki_bank(3 downto 2) /= "11" else + "10" & kidniki_bank(1 downto 0) & cpu_a(12 downto 0) when hwsel = HW_SPELUNKR and cpu_a(15 downto 13) = "100" else '0' & cpu_a(15 downto 0); -- Lode Runner 2 bank switching - some kind of protection, only the level number is used to select bank 0 or 1 at $8000 @@ -325,6 +333,7 @@ begin ld24_bank <= '0'; kidniki_bank <= (others => '0'); kidniki_gfxbank <= '0'; + spelunkr_palbank <= '0'; elsif rising_edge(clk_sys) then if cpu_clk_en = '1' and cpu_io_wr = '1' then case cpu_a(7 downto 0) is @@ -352,6 +361,12 @@ begin if cpu_a = x"c800" and hwsel = HW_LDRUN4 then ld24_bank <= cpu_d_o(0); end if; + if cpu_a = x"d004" and hwsel = HW_SPELUNKR then + kidniki_bank(1 downto 0) <= cpu_d_o(1 downto 0); + end if; + if cpu_a = x"d005" and hwsel = HW_SPELUNKR then + spelunkr_palbank <= cpu_d_o(0); + end if; end if; end if; @@ -447,6 +462,23 @@ begin if hwsel = HW_KUNGFUM then m62_hscroll(15 downto 8) <= cpu_d_o; end if; + when x"D000" => + if hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then + m62_vscroll(7 downto 0) <= cpu_d_o; + end if; + when x"D001" => + if hwsel = HW_SPELUNKR then + m62_vscroll(15 downto 8) <= cpu_d_o; + end if; + when x"D002" => + if hwsel = HW_SPELUNKR then + m62_hscroll(7 downto 0) <= cpu_d_o; + end if; + when x"D003" => + if hwsel = HW_SPELUNKR then + m62_hscroll(15 downto 8) <= cpu_d_o; + end if; + when others => null; end case; @@ -496,7 +528,9 @@ begin begin -- external background ROMs - gfx1_addr <= '0' & kidniki_gfxbank & tilemap_i(1).tile_a(13 downto 0); + gfx1_addr <= + '0' & tilemap_i(1).tile_a(14 downto 0) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else + '0' & kidniki_gfxbank & tilemap_i(1).tile_a(13 downto 0); tilemap_o(1).tile_d(23 downto 0) <= gfx1_do(7 downto 0) & gfx1_do(15 downto 8) & gfx1_do(23 downto 16); -- internal background ROMs @@ -560,19 +594,20 @@ begin end block BLK_GFX_ROMS; BLK_VRAM : block - signal vram_a : std_logic_vector(10 downto 0); - alias cram_a : std_logic_vector(10 downto 0) is vram_a; + signal vram_a : std_logic_vector(11 downto 0); + alias cram_a : std_logic_vector(11 downto 0) is vram_a; begin - vram_a <= cpu_a(10 downto 0) when hwsel = HW_KUNGFUM else - cpu_a(11 downto 1); + vram_a <= '0' & cpu_a(10 downto 0) when hwsel = HW_KUNGFUM else + cpu_a(12 downto 1) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else + '0' & cpu_a(11 downto 1); vram_inst : entity work.dpram generic map ( init_file => "", - widthad_a => 11, - widthad_b => 11 + widthad_a => 12, + widthad_b => 12 ) port map ( @@ -583,7 +618,7 @@ begin q_b => vram_d_o, clock_a => clk_video, - address_a => tilemap_i(1).map_a(10 downto 0), + address_a => tilemap_i(1).map_a(11 downto 0), wren_a => '0', data_a => (others => 'X'), q_a => tilemap_o(1).map_d(7 downto 0) @@ -594,8 +629,8 @@ begin generic map ( init_file => "", - widthad_a => 11, - widthad_b => 11 + widthad_a => 12, + widthad_b => 12 ) port map ( @@ -606,7 +641,7 @@ begin q_b => cram_d_o, clock_a => clk_video, - address_a => tilemap_i(1).attr_a(10 downto 0), + address_a => tilemap_i(1).attr_a(11 downto 0), wren_a => '0', data_a => (others => 'X'), q_a => tilemap_o(1).attr_d(7 downto 0) @@ -650,6 +685,11 @@ begin q => wram_d_o ); + -- tilemap 1 palette address + tilemap1_pal_a <= spelunkr_palbank & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNKR else + '0' & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_BATTROAD else + tilemap_i(1).pal_a(7 downto 0); + -- tilemap 1 palettes pal_r : entity work.dpram generic map @@ -667,7 +707,7 @@ begin q_b => open, clock_a => not clk_video, - address_a => tilemap_i(1).pal_a, + address_a => tilemap1_pal_a, wren_a => '0', data_a => (others => 'X'), q_a => tilemap_o(1).rgb.r(9 downto 2) @@ -690,7 +730,7 @@ begin q_b => open, clock_a => not clk_video, - address_a => tilemap_i(1).pal_a, + address_a => tilemap1_pal_a, wren_a => '0', data_a => (others => 'X'), q_a => tilemap_o(1).rgb.g(9 downto 2) @@ -713,7 +753,7 @@ begin q_b => open, clock_a => not clk_video, - address_a => tilemap_i(1).pal_a, + address_a => tilemap1_pal_a, wren_a => '0', data_a => (others => 'X'), q_a => tilemap_o(1).rgb.b(9 downto 2) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd index 6c684d9a..728a190e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd @@ -18,6 +18,8 @@ package platform_variant_pkg is constant HW_BATTROAD : integer := 6; constant HW_KIDNIKI : integer := 7; constant HW_LOTLOT : integer := 8; + constant HW_SPELUNKR : integer := 9; + constant HW_SPELUNK2 : integer := 10; type rom_a is array (natural range <>) of string; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index d464c56e..72e0792d 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -77,7 +77,7 @@ architecture SYN of target_top is begin - hires <= '1' when hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_KIDNIKI or hwsel= HW_LOTLOT else '0'; + hires <= '0' when hwsel = HW_KUNGFUM or hwsel = HW_HORIZON or hwsel = HW_BATTROAD else '1'; process(clock_sys) begin if rising_edge(clock_sys) then diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index eb6d0b27..cd3bc6d5 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -55,17 +55,15 @@ begin ctl_o.rgb <= ctl_i.rgb; -- not used - ctl_o.map_a(ctl_o.map_a'left downto 11) <= (others => '0'); - ctl_o.attr_a(ctl_o.attr_a'left downto 11) <= (others => '0'); - ctl_o.tile_a(ctl_o.tile_a'left downto 14) <= (others => '0'); + ctl_o.map_a(ctl_o.map_a'left downto 12) <= (others => '0'); + ctl_o.attr_a(ctl_o.attr_a'left downto 12) <= (others => '0'); + ctl_o.tile_a(ctl_o.tile_a'left downto 15) <= (others => '0'); - -- screen rotation + -- tilemap scroll x <= std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x)) when unsigned(y) < 6*8 and HWSEL = HW_KUNGFUM else std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x) + unsigned(hscroll(8 downto 0))); - -- when rot_en = '0' else not video_ctl.y; - --y <= not video_ctl.y when rot_en = '0' else 32 + video_ctl.x; - y <= std_logic_vector(unsigned(video_ctl.y) + unsigned(vscroll(8 downto 0))); -- when rot_en = '0' else video_ctl.x; - + y <= std_logic_vector(unsigned(video_ctl.y) + unsigned(vscroll(8 downto 0)) + 128) when hwsel = HW_SPELUNKR else + std_logic_vector(unsigned(video_ctl.y) + unsigned(vscroll(8 downto 0))); -- when rot_en = '0' else video_ctl.x; -- generate pixel process (clk, clk_ena) @@ -81,6 +79,14 @@ begin -- 1st stage of pipeline -- - set tilemap, attribute address + if hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then + -- 64x64 tilemap + ctl_o.map_a(11) <= y(8); + ctl_o.attr_a(11) <= y(8); + else + ctl_o.map_a(11) <= '0'; + ctl_o.attr_a(11) <= '0'; + end if; ctl_o.map_a(10 downto 6) <= y(7 downto 3); ctl_o.map_a(5 downto 0) <= x(8 downto 3); ctl_o.attr_a(10 downto 6) <= y(7 downto 3); @@ -89,14 +95,19 @@ begin -- 2nd stage of pipeline -- - set tile address if x(2 downto 0) = "010" then + if hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then + ctl_o.tile_a(14) <= ctl_i.attr_d(5); + else + ctl_o.tile_a(14) <= '0'; + end if; if hwsel = HW_LDRUN4 or hwsel = HW_HORIZON then ctl_o.tile_a(13) <= ctl_i.attr_d(5); - elsif hwsel = HW_KIDNIKI then + elsif hwsel = HW_KIDNIKI or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then ctl_o.tile_a(13) <= ctl_i.attr_d(7); else ctl_o.tile_a(13) <= '0'; end if; - if hwsel = HW_BATTROAD then + if hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6) & ctl_i.attr_d(4); elsif hwsel = HW_KIDNIKI then ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6 downto 5); @@ -136,11 +147,8 @@ begin else pel := tile_d_r(tile_d_r'right) & tile_d_r(tile_d_r'right+8) & tile_d_r(tile_d_r'right+16); end if; - if hwsel = HW_BATTROAD then - ctl_o.pal_a <= '0' & attr_d_r(3 downto 0) & pel; - else - ctl_o.pal_a <= attr_d_r(4 downto 0) & pel; - end if; + + ctl_o.pal_a <= attr_d_r(4 downto 0) & pel; ctl_o.set <= '0'; -- default -- if pel /= "000" then -- pal_rgb(0)(7 downto 5) /= "000" or From 28336b943fdb9d0bc52cb18ca88a1aa0e166c233 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sun, 8 Mar 2020 22:45:57 +0100 Subject: [PATCH 26/35] IremM62: rewritten video controller specifically for Irem HW --- Arcade_MiST/IremM62 Hardware/IremM62.qsf | 72 +++++----- Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 29 +--- .../IremM62 Hardware/rtl/IremM62_MiST.sv | 2 +- .../rtl/iremm62_video_controller.vhd | 129 ++++++++++++++++++ Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 2 +- .../IremM62 Hardware/rtl/sprite_array.vhd | 4 +- .../IremM62 Hardware/rtl/sprite_pkg.vhd | 1 + .../IremM62 Hardware/rtl/spritectl.vhd | 128 ++++++++--------- .../IremM62 Hardware/rtl/tilemapctl.vhd | 10 +- 9 files changed, 242 insertions(+), 135 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf index 1d428d6b..d9ae2307 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -44,40 +44,6 @@ set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL set_global_assignment -name LAST_QUARTUS_VERSION "13.1 SP4.26" set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" set_global_assignment -name SMART_RECOMPILE ON -set_global_assignment -name SYSTEMVERILOG_FILE rtl/IremM62_MiST.sv -set_global_assignment -name VHDL_FILE rtl/target_top.vhd -set_global_assignment -name VHDL_FILE rtl/platform_variant_pkg.vhd -set_global_assignment -name VHDL_FILE rtl/platform_pkg.vhd -set_global_assignment -name VHDL_FILE rtl/platform.vhd -set_global_assignment -name VHDL_FILE rtl/pace_pkg_body.vhd -set_global_assignment -name VHDL_FILE rtl/pace_pkg.vhd -set_global_assignment -name VHDL_FILE rtl/pace.vhd -set_global_assignment -name VHDL_FILE rtl/Graphics.VHD -set_global_assignment -name VHDL_FILE rtl/video_mixer.vhd -set_global_assignment -name VHDL_FILE rtl/video_controller_pkg_body.vhd -set_global_assignment -name VHDL_FILE rtl/video_controller_pkg.vhd -set_global_assignment -name VHDL_FILE rtl/video_controller.vhd -set_global_assignment -name VHDL_FILE rtl/tilemapctl.vhd -set_global_assignment -name VHDL_FILE rtl/bitmapctl_e.vhd -set_global_assignment -name VHDL_FILE rtl/spritereg.vhd -set_global_assignment -name VHDL_FILE rtl/spritectl.vhd -set_global_assignment -name VHDL_FILE rtl/sprite_pkg_body.vhd -set_global_assignment -name VHDL_FILE rtl/sprite_pkg.vhd -set_global_assignment -name VHDL_FILE rtl/sprite_array.vhd -set_global_assignment -name VHDL_FILE rtl/Inputs.VHD -set_global_assignment -name VHDL_FILE rtl/input_mapper.vhd -set_global_assignment -name VHDL_FILE rtl/dpram.vhd -set_global_assignment -name VHDL_FILE rtl/sprom.vhd -set_global_assignment -name VHDL_FILE rtl/spram.vhd -set_global_assignment -name VHDL_FILE rtl/clk_div.vhd -set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv -set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd -set_global_assignment -name VHDL_FILE rtl/cpu68.vhd -set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv -set_global_assignment -name VHDL_FILE rtl/Sound_Board.vhd -set_global_assignment -name QIP_FILE ../../common/mist/mist.qip -set_global_assignment -name QIP_FILE ../../common/CPU/T80/T80.qip -set_global_assignment -name VHDL_FILE ../../common/CPU/T80/Z80.vhd # Pin & Location Assignments # ========================== @@ -200,7 +166,7 @@ set_global_assignment -name USE_CONFIGURATION_DEVICE OFF # SignalTap II Assignments # ======================== set_global_assignment -name ENABLE_SIGNALTAP OFF -set_global_assignment -name USE_SIGNALTAP_FILE output_files/cpu.stp +set_global_assignment -name USE_SIGNALTAP_FILE output_files/sprite.stp # Power Estimation Assignments # ============================ @@ -268,8 +234,42 @@ set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top # end ENTITY(IremM62_MiST) # --------------------------- -set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 +set_global_assignment -name SYSTEMVERILOG_FILE rtl/IremM62_MiST.sv +set_global_assignment -name VHDL_FILE rtl/target_top.vhd +set_global_assignment -name VHDL_FILE rtl/platform_variant_pkg.vhd +set_global_assignment -name VHDL_FILE rtl/platform_pkg.vhd +set_global_assignment -name VHDL_FILE rtl/platform.vhd +set_global_assignment -name VHDL_FILE rtl/pace_pkg_body.vhd +set_global_assignment -name VHDL_FILE rtl/pace_pkg.vhd +set_global_assignment -name VHDL_FILE rtl/pace.vhd +set_global_assignment -name VHDL_FILE rtl/Graphics.VHD +set_global_assignment -name VHDL_FILE rtl/video_mixer.vhd +set_global_assignment -name VHDL_FILE rtl/iremm62_video_controller.vhd +set_global_assignment -name VHDL_FILE rtl/video_controller_pkg_body.vhd +set_global_assignment -name VHDL_FILE rtl/video_controller_pkg.vhd +set_global_assignment -name VHDL_FILE rtl/tilemapctl.vhd +set_global_assignment -name VHDL_FILE rtl/bitmapctl_e.vhd +set_global_assignment -name VHDL_FILE rtl/spritereg.vhd +set_global_assignment -name VHDL_FILE rtl/spritectl.vhd +set_global_assignment -name VHDL_FILE rtl/sprite_pkg_body.vhd +set_global_assignment -name VHDL_FILE rtl/sprite_pkg.vhd +set_global_assignment -name VHDL_FILE rtl/sprite_array.vhd +set_global_assignment -name VHDL_FILE rtl/Inputs.VHD +set_global_assignment -name VHDL_FILE rtl/input_mapper.vhd +set_global_assignment -name VHDL_FILE rtl/dpram.vhd +set_global_assignment -name VHDL_FILE rtl/sprom.vhd +set_global_assignment -name VHDL_FILE rtl/spram.vhd +set_global_assignment -name VHDL_FILE rtl/clk_div.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv +set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd +set_global_assignment -name VHDL_FILE rtl/cpu68.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv +set_global_assignment -name VHDL_FILE rtl/Sound_Board.vhd +set_global_assignment -name QIP_FILE ../../common/mist/mist.qip +set_global_assignment -name QIP_FILE ../../common/CPU/T80/T80.qip +set_global_assignment -name VHDL_FILE ../../common/CPU/T80/Z80.vhd +set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp set_global_assignment -name SIGNALTAP_FILE output_files/tilemap.stp set_global_assignment -name SIGNALTAP_FILE output_files/sprite.stp set_global_assignment -name SIGNALTAP_FILE output_files/cpu.stp diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index fee8080e..9414ce4a 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -52,7 +52,6 @@ architecture SYN of Graphics is signal rgb_data : RGB_t; -- before OSD is mixed in signal video_o_s : to_VIDEO_t; - signal irem62_hsize : integer range 0 to 511; begin @@ -73,32 +72,13 @@ begin graphics_o.vblank <= video_o_s.vblank; --graphics_o.vblank <= from_video_ctl.vblank; - irem62_hsize <= 384+16 when hires = '1' else 256+16; - - pace_video_controller_inst : entity work.pace_video_controller - generic map - ( - CONFIG => PACE_VIDEO_CONTROLLER_TYPE, - DELAY => PACE_VIDEO_PIPELINE_DELAY, - --H_SIZE => PACE_VIDEO_H_SIZE, - V_SIZE => PACE_VIDEO_V_SIZE, - L_CROP => PACE_VIDEO_L_CROP, - R_CROP => PACE_VIDEO_R_CROP, - H_SCALE => PACE_VIDEO_H_SCALE, - V_SCALE => PACE_VIDEO_V_SCALE, - H_SYNC_POL => PACE_VIDEO_H_SYNC_POLARITY, - V_SYNC_POL => PACE_VIDEO_V_SYNC_POLARITY, - BORDER_RGB => PACE_VIDEO_BORDER_RGB - ) + iremm62_video_controller_inst : entity work.iremm62_video_controller port map ( -- clocking etc video_i => video_i, - H_SIZE => irem62_hsize, - - -- register interface - reg_i.h_scale => "000", - reg_i.v_scale => "000", + hires => hires, + -- video data signals (in) rgb_i => rgb_data, @@ -207,6 +187,7 @@ begin ( reset => video_i.reset, hwsel => hwsel, + hires => hires, video_ctl => from_video_ctl, @@ -229,6 +210,7 @@ begin ( reset => video_i.reset, hwsel => hwsel, + hires => hires, video_ctl => from_video_ctl, @@ -262,6 +244,7 @@ begin sprite_prom => sprite_prom, hwsel => hwsel, + hires => hires, -- register interface reg_i => sprite_reg_i, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 2a5463d2..cfa1efcf 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -109,7 +109,7 @@ wire snd_vma; wire [14:0] chr1_addr; wire [31:0] chr1_do; -wire [14:0] sp_addr; +wire [15:0] sp_addr; wire [31:0] sp_do; /* ROM structure diff --git a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd new file mode 100644 index 00000000..7acb218f --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd @@ -0,0 +1,129 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.video_controller_pkg.all; + +entity iremm62_video_controller is + port + ( + -- clocking etc + video_i : in from_VIDEO_t; + hires : in std_logic; + + -- video input data + rgb_i : in RGB_t; + + -- control signals (out) + video_ctl_o : out from_VIDEO_CTL_t; + + -- video output control & data + video_o : out to_VIDEO_t + ); +end iremm62_video_controller; + +architecture SYN of iremm62_video_controller is + + alias clk : std_logic is video_i.clk; + alias clk_ena : std_logic is video_i.clk_ena; + alias reset : std_logic is video_i.reset; + + signal hcnt : unsigned(9 downto 0); + signal vcnt : unsigned(8 downto 0); + signal hsync : std_logic; + signal vsync : std_logic; + signal hblank : std_logic; + signal vblank : std_logic; +begin + + ------------------- + -- Video scanner -- + ------------------- + -- hcnt [x080..x0FF-x100..x1FF] => 128+256 = 384 pixels, 384/6.144Mhz => 1 line is 62.5us (16.000KHz) (lores) + -- hcnt [x080..x0FF-x100..x27F] => 128+384 = 512 pixels, 512/8.192Mhz => 1 line is 62.5us (16.000KHz) (hires) + -- vcnt [x0E6..x0FF-x100..x1FF] => 26+256 = 282 lines, 1 frame is 260 x 62.5us = 17.625ms (56.74Hz) + + process (reset, clk, clk_ena) + begin + if reset='1' then + hcnt <= (others=>'0'); + vcnt <= '0'&X"FC"; + elsif rising_edge(clk) and clk_ena = '1'then + hcnt <= hcnt + 1; + if (hires = '0' and hcnt = "01"&x"FF") or hcnt = "10"&x"7F" then + hcnt <= "00"&x"80"; + vcnt <= vcnt + 1; + if vcnt = '1'&x"FF" then +-- vcnt <= '0'&x"E6"; -- from M52 schematics + vcnt <= '0'&x"C8"; -- 312 lines/PAL 50 Hz + end if; + end if; + end if; + end process; + + process (reset, clk, clk_ena) + begin + if reset = '1' then + hsync <= '0'; + vsync <= '0'; + hblank <= '1'; + vblank <= '1'; + elsif rising_edge(clk) and clk_ena = '1' then + -- display blank + if hcnt = "00"&x"FF" then + hblank <= '0'; + if vcnt = '1'&x"00" then + vblank <= '0'; + end if; + end if; + if (hires = '0' and hcnt = "01"&x"FF") or hcnt = "10"&x"7F" then + hblank <= '1'; + if vcnt = '1'&x"FF" then + vblank <= '1'; + end if; + end if; + + -- display sync + if hcnt = "00"&x"8B" then + hsync <= '1'; + if vcnt = '0'&x"F2" then + vsync <= '1'; + end if; + end if; + if hcnt = "00"&x"B1" then + hsync <= '0'; + if vcnt = '0'&x"F4" then + vsync <= '0'; + end if; + end if; + + -- registered rgb output + if hblank = '1' or vblank = '1' then + video_o.rgb <= RGB_BLACK; + else + video_o.rgb <= rgb_i; + end if; + + end if; + end process; + + video_o.hsync <= hsync; + video_o.vsync <= vsync; + video_o.hblank <= hblank; + video_o.vblank <= vblank; + video_ctl_o.stb <= '1'; + video_ctl_o.x <= '0'&std_logic_vector(hcnt); + video_ctl_o.y <= "00"&std_logic_vector(vcnt); + -- blank signal goes to tilemap/spritectl + video_ctl_o.hblank <= hblank; + video_ctl_o.vblank <= vblank; + + -- pass-through for tile/bitmap & sprite controllers + video_ctl_o.clk <= clk; + video_ctl_o.clk_ena <= clk_ena; + + -- for video DACs and TFT output + video_o.clk <= clk; + +end SYN; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index b9920401..daa93265 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -553,7 +553,7 @@ begin -- tilemap_o(1).tile_d(23 downto 0) <= chr_rom_d(0) & chr_rom_d(1) & chr_rom_d(2); -- external sprite ROMs - gfx2_addr <= '0' & sprite_i.a(14 downto 0); + gfx2_addr <= sprite_i.a(15 downto 0); sprite_o.d(23 downto 0) <= gfx2_do(7 downto 0) & gfx2_do(15 downto 8) & gfx2_do(23 downto 16); -- internal sprite ROMs diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd index 99b1129c..db2e40d8 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd @@ -22,6 +22,7 @@ entity sprite_array is reset : in std_logic; hwsel : in integer; + hires : in std_logic; sprite_prom : in prom_a(0 to 31); -- register interface @@ -86,8 +87,8 @@ begin else i := i + 1; end if; - row_a <= ctl_o(i).a; end if; + row_a <= ctl_o(i).a; end if; end process; @@ -156,6 +157,7 @@ begin port map ( hwsel => hwsel, + hires => hires, -- sprite registers reg_i => reg_o(i), diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd index 960322b7..8c1fcbd0 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd @@ -61,6 +61,7 @@ package sprite_pkg is ( reset : in std_logic; hwsel : integer; + hires : in std_logic; sprite_prom : in prom_a(0 to 31); -- register interface diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index 16f0833c..4e1218f9 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -19,6 +19,7 @@ entity spritectl is port ( hwsel : in integer range 0 to 15; + hires : in std_logic; -- sprite registers reg_i : in from_SPRITE_REG_t; @@ -39,73 +40,63 @@ architecture SYN of spritectl is alias clk : std_logic is video_ctl.clk; alias clk_ena : std_logic is video_ctl.clk_ena; - signal ld_r : std_logic; - signal left_d : std_logic; - signal hblank_r : std_logic; signal rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period - signal rowCount : unsigned(5 downto 0); - -- which part of the sprite is being drawn - alias segment : unsigned(1 downto 0) is rowCount(5 downto 4); begin - process (clk, clk_ena, left_d, rowCount, reg_i) + process (clk, clk_ena, reg_i) variable pel : std_logic_vector(2 downto 0); variable x : unsigned(video_ctl.x'range); variable y : unsigned(video_ctl.y'range); variable xMat : boolean; -- raster in between left edge and end of line variable yMat : boolean; -- raster is between first and last line of sprite + variable yMatNext : boolean; variable height : unsigned(1 downto 0); + variable rowCount : unsigned(5 downto 0); + -- which part of the sprite is being drawn + alias segment : unsigned(1 downto 0) is rowCount(5 downto 4); - variable code : std_logic_vector(9 downto 0); + variable code : std_logic_vector(10 downto 0); begin if rising_edge(clk) then if clk_ena = '1' then - ld_r <= ctl_i.ld; - hblank_r <= video_ctl.hblank; if video_ctl.hblank = '1' then - - x := unsigned(reg_i.x) - video_ctl.video_h_offset + PACE_VIDEO_PIPELINE_DELAY - 2; - y := 256 + 128 - 18 - unsigned(reg_i.y); + yMat := yMatNext; + else + -- determine if the sprite is visible on the next line during active display + y := 640 - unsigned(reg_i.y) - unsigned(video_ctl.y) - 3; -- hande sprite height, placement - code := reg_i.n(9 downto 0); -- default + code := reg_i.n(10 downto 0); -- default + rowCount := (others => '0'); + yMatNext := false; case ctl_i.height is + when 0 => + -- normal height + if y(video_ctl.y'left downto 4) = 0 then + yMatNext := true; + rowCount := "00" & not y(3 downto 0); + end if; when 1 => -- double height - y := y - 16; + if y(video_ctl.y'left downto 5) = 0 then + yMatNext := true; + rowCount := '0' & not y(4 downto 0); + end if; when 2 => -- quadruple height - y := y - 3*16; + if y(video_ctl.y'left downto 6) = 0 then + yMatNext := true; + rowCount := not y(5 downto 0); + end if; when others => null; end case; - height := to_unsigned(ctl_i.height,2); - height(0) := height (0) or height(1); - - -- count row at start of hblank - if hblank_r = '0' then - if y = unsigned(video_ctl.y) then - -- start counting sprite row - rowCount <= (others => '0'); - yMat := true; - elsif rowCount = height & "1111" then - yMat := false; - else - rowCount <= rowCount + 1; - end if; - - -- stop sprites wrapping from bottom of screen - if y = 0 then - yMat := false; - end if; - end if; - case ctl_i.height is when 1 => -- double height @@ -125,30 +116,39 @@ begin null; end case; - if ld_r = '0' and ctl_i.ld = '1' then - xMat := false; - left_d <= not left_d; -- switch sprite half - if yMat then - if left_d = '1' then - -- store first half of the sprite line data - rowStore(39 downto 32) <= ctl_i.d(23 downto 16); - rowStore(23 downto 16) <= ctl_i.d(15 downto 8); - rowStore( 7 downto 0) <= ctl_i.d( 7 downto 0); - else - -- load sprite data - rowStore(47 downto 40) <= ctl_i.d(23 downto 16); - rowStore(31 downto 24) <= ctl_i.d(15 downto 8); - rowStore(15 downto 8) <= ctl_i.d( 7 downto 0); - end if; - else - rowStore <= (others => '0'); - end if; + -- generate sprite data address + ctl_o.a(15 downto 5) <= code; + ctl_o.a(4) <= '0'; + if reg_i.yflip = '0' then + ctl_o.a(3 downto 0) <= std_logic_vector(rowCount(3 downto 0)); + else + ctl_o.a(3 downto 0) <= not std_logic_vector(rowCount(3 downto 0)); end if; - else - left_d <= '0'; - end if; -- hblank='1' + end if; -- hblank='0' + + if ctl_i.ld = '1' then + xMat := false; + ctl_o.a(4) <= not ctl_o.a(4); -- switch sprite half + if yMat then + if ctl_o.a(4) = '1' then + -- store first half of the sprite line data + rowStore(39 downto 32) <= ctl_i.d(23 downto 16); + rowStore(23 downto 16) <= ctl_i.d(15 downto 8); + rowStore( 7 downto 0) <= ctl_i.d( 7 downto 0); + else + -- load sprite data + rowStore(47 downto 40) <= ctl_i.d(23 downto 16); + rowStore(31 downto 24) <= ctl_i.d(15 downto 8); + rowStore(15 downto 8) <= ctl_i.d( 7 downto 0); + end if; + else + rowStore <= (others => '0'); + end if; + end if; if video_ctl.stb = '1' then + x := unsigned(reg_i.x) + 256 - 64 + PACE_VIDEO_PIPELINE_DELAY - 2; + if hires = '0' then x := x - 64; end if; if x = unsigned(video_ctl.x) then xMat := true; @@ -183,17 +183,7 @@ begin end if; -- clk_ena='1' end if; -- rising_edge(clk) - - -- generate sprite data address - ctl_o.a(15) <= '0'; -- unused - ctl_o.a(14 downto 5) <= code; - ctl_o.a(4) <= left_d; - if reg_i.yflip = '0' then - ctl_o.a(3 downto 0) <= std_logic_vector(rowCount(3 downto 0)); - else - ctl_o.a(3 downto 0) <= not std_logic_vector(rowCount(3 downto 0)); - end if; end process; -end architecture SYN; +end architecture SYN; \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index cd3bc6d5..8a02dec6 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -23,6 +23,7 @@ entity tilemapCtl is ( reset : in std_logic; hwsel : in integer; + hires : in std_logic; -- video control signals video_ctl : in from_VIDEO_CTL_t; @@ -60,10 +61,11 @@ begin ctl_o.tile_a(ctl_o.tile_a'left downto 15) <= (others => '0'); -- tilemap scroll - x <= std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x)) when unsigned(y) < 6*8 and HWSEL = HW_KUNGFUM else - std_logic_vector(video_ctl.video_h_offset + unsigned(video_ctl.x) + unsigned(hscroll(8 downto 0))); - y <= std_logic_vector(unsigned(video_ctl.y) + unsigned(vscroll(8 downto 0)) + 128) when hwsel = HW_SPELUNKR else - std_logic_vector(unsigned(video_ctl.y) + unsigned(vscroll(8 downto 0))); -- when rot_en = '0' else video_ctl.x; + x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 128) when unsigned(y) < 6*8 and HWSEL = HW_KUNGFUM else + std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 64) when hires = '1' else + std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 128); + y <= std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0)) + 128) when hwsel = HW_SPELUNKR else + std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0))); -- when rot_en = '0' else video_ctl.x; -- generate pixel process (clk, clk_ena) From 736121d294887c1c9027d41819fba3030fb7d6cc Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 10 Mar 2020 22:27:13 +0100 Subject: [PATCH 27/35] IremM62: fix sound board --- Arcade_MiST/IremM62 Hardware/IremM62.qsf | 6 +- .../IremM62 Hardware/rtl/Sound_Board.vhd | 184 +- Arcade_MiST/IremM62 Hardware/rtl/YM2149.sv | 5 +- Arcade_MiST/IremM62 Hardware/rtl/cpu68.vhd | 3963 ----------------- .../IremM62 Hardware/rtl/jt5205/LICENSE | 674 +++ .../IremM62 Hardware/rtl/jt5205/README.md | 29 + .../IremM62 Hardware/rtl/jt5205/jt5205.qip | 6 + .../IremM62 Hardware/rtl/jt5205/jt5205.v | 67 + .../rtl/jt5205/jt5205_adpcm.v | 108 + .../rtl/jt5205/jt5205_interpol2x.v | 43 + .../rtl/jt5205/jt5205_timing.v | 69 + Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 2 +- 12 files changed, 1078 insertions(+), 4078 deletions(-) delete mode 100644 Arcade_MiST/IremM62 Hardware/rtl/cpu68.vhd create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/jt5205/LICENSE create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/jt5205/README.md create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.qip create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.v create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_adpcm.v create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_interpol2x.v create mode 100644 Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_timing.v diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf index d9ae2307..5b049ef3 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -166,7 +166,7 @@ set_global_assignment -name USE_CONFIGURATION_DEVICE OFF # SignalTap II Assignments # ======================== set_global_assignment -name ENABLE_SIGNALTAP OFF -set_global_assignment -name USE_SIGNALTAP_FILE output_files/sprite.stp +set_global_assignment -name USE_SIGNALTAP_FILE output_files/snd.stp # Power Estimation Assignments # ============================ @@ -263,14 +263,16 @@ set_global_assignment -name VHDL_FILE rtl/spram.vhd set_global_assignment -name VHDL_FILE rtl/clk_div.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd -set_global_assignment -name VHDL_FILE rtl/cpu68.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv +set_global_assignment -name QIP_FILE rtl/jt5205/jt5205.qip set_global_assignment -name VHDL_FILE rtl/Sound_Board.vhd set_global_assignment -name QIP_FILE ../../common/mist/mist.qip set_global_assignment -name QIP_FILE ../../common/CPU/T80/T80.qip set_global_assignment -name VHDL_FILE ../../common/CPU/T80/Z80.vhd +set_global_assignment -name VHDL_FILE ../../common/CPU/6800/cpu68.vhd set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp set_global_assignment -name SIGNALTAP_FILE output_files/tilemap.stp set_global_assignment -name SIGNALTAP_FILE output_files/sprite.stp set_global_assignment -name SIGNALTAP_FILE output_files/cpu.stp +set_global_assignment -name SIGNALTAP_FILE output_files/snd.stp set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd b/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd index 6f8eaee9..47855099 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/Sound_Board.vhd @@ -11,6 +11,8 @@ -- 6800/01 compatible CPU core -- GNU public license - December 2002 : John E. Kent --------------------------------------------------------------------------------- +-- jt5205 hardware by Jose Tejada (@topapate) +--------------------------------------------------------------------------------- -- Educational use only -- Do not redistribute synthetized file with roms -- Do not redistribute roms whatever the form @@ -69,6 +71,19 @@ architecture struct of Sound_Board is ); end component; + component jt5205 + port ( + rst : in std_logic; + clk : in std_logic; + cen : in std_logic; + sel : in std_logic_vector(1 downto 0); -- s pin + din : in std_logic_vector(3 downto 0); + sound : out signed(11 downto 0); + irq : out std_logic; + vclk_o : out std_logic + ); + end component; + signal reset : std_logic := '1'; signal reset_cnt : integer range 0 to 1000000 := 1000000; @@ -115,48 +130,22 @@ architecture struct of Sound_Board is signal port2_data : std_logic_vector(7 downto 0); signal port2_ddr : std_logic_vector(7 downto 0); signal port2_in : std_logic_vector(7 downto 0); - + + signal adpcm_ce : std_logic; signal adpcm_cs : std_logic; - signal adpcm_we : std_logic; + signal adpcm_0_we : std_logic; + signal adpcm_1_we : std_logic; signal adpcm_0_di : std_logic_vector(3 downto 0); + signal adpcm_1_di : std_logic_vector(3 downto 0); signal select_sound_r : std_logic_vector(7 downto 0); - signal audio : std_logic_vector(12 downto 0); + signal adpcm_0_out : signed(11 downto 0); + signal adpcm_1_out : signed(11 downto 0); + signal adpcm_vclk : std_logic; - type t_step_size is array(0 to 48) of integer range 0 to 1552; - constant step_size : t_step_size := ( - 16, 17, 19, 21, 23, 25, 28, 31, - 34, 37, 41, 45, 50, 55, 60, 66, - 73, 80, 88, 97, 107, 118, 130, 143, - 157, 173, 190, 209, 230, 253, 279, 307, - 337, 371, 408, 449, 494, 544, 598, 658, - 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552); - - type t_delta_step is array(0 to 7) of integer range -1 to 8; - constant delta_step : t_delta_step := (-1,-1,-1,-1,2,4,6,8); + signal audio : std_logic_vector(12 downto 0); - signal adpcm_vclk : std_logic := '0'; - signal adpcm_signal : integer range -16384 to 16383 := 0; - --- adpcm algorithm (4bits) [no pcm here] --- --- val : input value 3bits (0 - 7 : b2b1b0) --- sign : input value sign (4th bit : 0=>sign=1 ,1=>sign=-1) --- --- step : internal data, init = 0 --- signal : output value, init = 0; --- --- for each new val (and sign) : --- | --- | step_size = 16*1.1^(step) --- | delta = sign * (step_size/8 + step_size/4*b0 + step_size/2*b1 + step_size*b2) --- | signal = signal + delta --- | step = step + delta_step(val) --- | --- | signal is then limited between -2048..2047 --- | step is then limited between 0..48 - begin dbg_cpu_addr <= cpu_addr; @@ -169,10 +158,11 @@ irqraz_cs <= '1' when cpu_addr(15 downto 14) = "00" and cpu_addr(11) = '1' and c rom_cs <= '1' when cpu_addr(15 downto 14) /= "00" else '0'; -- 4000-FFFF -- write enables -wram_we <= '1' when cpu_rw = '0' and wram_cs = '1' else '0'; -ports_we <= '1' when cpu_rw = '0' and ports_cs = '1' else '0'; -adpcm_we <= '1' when cpu_rw = '0' and adpcm_cs = '1' else '0'; -irqraz_we <= '1' when cpu_rw = '0' and irqraz_cs = '1' else '0'; +wram_we <= '1' when cpu_rw = '0' and wram_cs = '1' else '0'; +ports_we <= '1' when cpu_rw = '0' and ports_cs = '1' else '0'; +adpcm_0_we <= '1' when cpu_rw = '0' and adpcm_cs = '1' and cpu_addr(0) = '1' else '0'; +adpcm_1_we <= '1' when cpu_rw = '0' and adpcm_cs = '1' and cpu_addr(1) = '1' else '0'; +irqraz_we <= '1' when cpu_rw = '0' and irqraz_cs = '1' else '0'; -- mux cpu in data between roms/io/wram cpu_di <= @@ -202,7 +192,7 @@ process (reset, clock_E) begin if reset='1' then cpu_irq <= '0'; - select_sound_r(7) <= '1'; + select_sound_r(7) <= '0'; elsif rising_edge(clock_E) then select_sound_r <= select_sound; if select_sound_r(7) = '0' then @@ -252,83 +242,59 @@ begin if reset='1' then adpcm_0_di <= (others=>'0'); elsif rising_edge(clock_E) then - if adpcm_cs = '1' and adpcm_we = '1' then - if cpu_addr(1) = '0' then adpcm_0_di <= cpu_do(3 downto 0); end if; + if adpcm_cs = '1' and adpcm_0_we = '1' then + adpcm_0_di <= cpu_do(3 downto 0); + end if; + if adpcm_cs = '1' and adpcm_1_we = '1' then + adpcm_1_di <= cpu_do(3 downto 0); end if; end if; end process; --- adcpm clocks and computation -- make 24kHz and vclk 8/6/4kHz -adpcm_clocks : process(clock_E, ay1_port_b_do) - variable clock_div_a : integer range 0 to 148 := 0; - variable clock_div_b : integer range 0 to 5 := 0; - variable step : integer range 0 to 48; - variable step_n : integer range -1 to 48+8; - variable sz : integer range 0 to 1552; - variable dn : integer range -32768 to 32767; - variable adpcm_signal_n : integer range -32768 to 32767; +-- 384 kHz clock enable +process( reset, clock_E ) + variable CLK_SUM : integer; begin - if rising_edge(clock_E) then - if clock_div_a = 37 then -- 24kHz - clock_div_a := 0; - - case ay1_port_b_do(3 downto 2) is - when "00" => if clock_div_b = 5 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 4kHz - when "01" => if clock_div_b = 2 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 8kHz - when "10" => if clock_div_b = 3 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 6kHz - when others => null; - end case; - - if clock_div_b = 0 then adpcm_vclk <= '1'; else adpcm_vclk <= '0'; end if; - else - clock_div_a := clock_div_a + 1; - end if; - - if ay1_port_b_do(0) = '1' then - step := 0; - adpcm_signal <= 0; - else - - if clock_div_b = 0 then - case clock_div_a is - - when 0 => -- it's time to get new nibble (adpcm_0_di) - - sz := step_size(step); - dn := sz/8; - if adpcm_0_di(0) = '1' then dn := dn + sz/4; end if; - if adpcm_0_di(1) = '1' then dn := dn + sz/2; end if; - if adpcm_0_di(2) = '1' then dn := dn + sz ; end if; - - if adpcm_0_di(3) = '1' then - dn := -dn; - end if; - - step_n := step + delta_step(to_integer(unsigned(adpcm_0_di(2 downto 0)))); - - when 4 => - - adpcm_signal_n := adpcm_signal + dn; - - if step_n > 48 then step := 48; else step := step_n; end if; - if step_n < 0 then step := 0; else step := step_n; end if; - - when 8 => - - if adpcm_signal_n > 2040 then adpcm_signal <= 2040; else adpcm_signal <= adpcm_signal_n; end if; - if adpcm_signal_n < -2040 then adpcm_signal <= -2040; else adpcm_signal <= adpcm_signal_n; end if; - - when others => null; - - end case; - end if; - - end if; - end if; + if reset = '1' then + CLK_SUM := 0; + adpcm_ce <= '0'; + elsif rising_edge(clock_E) then + adpcm_ce <= '0'; + CLK_SUM := CLK_SUM + 384; + if CLK_SUM >= 895 then + CLK_SUM := CLK_SUM - 895; + adpcm_ce <= '1'; + end if; + end if; end process; +-- MSM5205 ADPCM decoder chips +adpcm_0 : jt5205 +port map ( + rst => ay1_port_b_do(0), + clk => clock_E, + cen => adpcm_ce, + sel => ay1_port_b_do(3 downto 2), + din => adpcm_0_di, + sound => adpcm_0_out, + irq => open, + vclk_o=> adpcm_vclk + ); + +adpcm_1 : jt5205 +port map ( + rst => ay1_port_b_do(1), + clk => clock_E, + cen => adpcm_ce, + sel => ay1_port_b_do(3 downto 2), + din => adpcm_1_di, + sound => adpcm_1_out, + irq => open, + vclk_o=> open + ); + -- audio mux -audio <= ("000"&ay1_audio) + ("000"&ay2_audio) + ('0'&std_logic_vector(to_unsigned((adpcm_signal)+2048,12))); +audio <= ("00"&ay1_audio&'0') + ("00"&ay2_audio&'0') + std_logic_vector(not adpcm_0_out(11)&adpcm_0_out(10 downto 0)) + std_logic_vector(not adpcm_1_out(11)&adpcm_1_out(10 downto 0)); audio_out <= audio(12 downto 1); -- microprocessor 6800/01/03 diff --git a/Arcade_MiST/IremM62 Hardware/rtl/YM2149.sv b/Arcade_MiST/IremM62 Hardware/rtl/YM2149.sv index eae73bb3..90be20de 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/YM2149.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/YM2149.sv @@ -79,7 +79,6 @@ reg env_reset; always @(posedge CLK) begin if(RESET) begin ymreg <= '{default:0}; - ymreg[7] <= '1; addr <= '0; env_reset <= 0; end else begin @@ -115,8 +114,8 @@ always_comb begin 11: dout = ymreg[11]; 12: dout = ymreg[12]; 13: dout = ymreg[13][3:0]; - 14: dout = ymreg[7][6] ? ymreg[14] : IOA_in; - 15: dout = ymreg[7][7] ? ymreg[15] : IOB_in; + 14: dout = ymreg[7][6] ? ymreg[14] | IOA_in : IOA_in; + 15: dout = ymreg[7][7] ? ymreg[15] | IOA_in : IOB_in; endcase end end diff --git a/Arcade_MiST/IremM62 Hardware/rtl/cpu68.vhd b/Arcade_MiST/IremM62 Hardware/rtl/cpu68.vhd deleted file mode 100644 index 016bd9a9..00000000 --- a/Arcade_MiST/IremM62 Hardware/rtl/cpu68.vhd +++ /dev/null @@ -1,3963 +0,0 @@ ---===========================================================================-- --- --- 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/Arcade_MiST/IremM62 Hardware/rtl/jt5205/LICENSE b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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 program 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/README.md b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/README.md new file mode 100644 index 00000000..900e74ba --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/README.md @@ -0,0 +1,29 @@ +# jt5205 hardware by Jose Tejada (@topapate) + +You can show your appreciation through +* [Patreon](https://patreon.com/topapate), by supporting releases +* [Paypal](https://paypal.me/topapate), with a donation + +JT5205 is an ADPCM sound source written in Verilog, fully compatible with OKI MSM5205. + +## Port Description + +Name | Direction | Width | Purpose +---------|-----------|-------|-------------------------------------- +rst | input | | active-high asynchronous reset signal +clk | input | | clock +cen | input | | clock enable. +sel | input | 2 | selects the data rate +din | input | 4 | input data +sound | output | 12 | signed sound output + +## Usage + +This is a pin-to-pin compatible module with OKI MSM5205. If you are just going to use it on a retro core you don't need to know the internals of it just hook it up and be sure that the effective clock rate, i.e. clk&cen signal, is the intended 384kHz (or whatever your system needs). + +If you hear a periodic noise when there should be no output, check whether your target system was leaving the MSM5205 halted at reset when no output was needed. If The part is not reset it will keep processing the output and a constant 0 input will produce a repetitive noise. + +## FPGA arcade cores using this module: + +* [Double Dragon](https://github.com/jotego/jtdd), by the same author +* [Tora e no michi](https://github.com/jotego/jt_gng), by the same author \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.qip b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.qip new file mode 100644 index 00000000..0c59df29 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.qip @@ -0,0 +1,6 @@ +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) jt5205.v ] +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) jt5205_adpcm.v ] +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) jt5205_timing.v ] +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) jt5205_interpol2x.v ] + + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.v b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.v new file mode 100644 index 00000000..2d1c219d --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.v @@ -0,0 +1,67 @@ +/* This file is part of JT5205. + JT5205 program 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. + + JT5205 program 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 JT5205. If not, see . + + Author: Jose Tejada Gomez. Twitter: @topapate + Version: 1.0 + Date: 30-10-2019 */ + +module jt5205( + input rst, + input clk, + input cen /* direct_enable */, + input [ 1:0] sel, // s pin + input [ 3:0] din, + output signed [11:0] sound, + // This output pin is not part of MSM5205 I/O + // It helps integrating the system as it produces + // a strobe + // at the internal clock divider pace + output irq, + output vclk_o +); + +wire cen_lo, cen_mid; +wire signed [11:0] raw; + +assign irq=cen_lo; // Notice that irq is active even if rst is high. This is + // important for games such as Tora e no michi. + +jt5205_timing u_timing( + .clk ( clk ), + .cen ( cen ), + .sel ( sel ), + .cen_lo ( cen_lo ), + .cen_mid( cen_mid ), + .cenb_lo( ), + .vclk_o (vclk_o ) +); + +jt5205_adpcm u_adpcm( + .rst ( rst ), + .clk ( clk ), + .cen_lo ( cen_lo ), + .cen_hf ( cen ), + .din ( din ), + .sound ( raw ) +); + +jt5205_interpol2x u_interpol( + .rst ( rst ), + .clk ( clk ), + .cen_mid( cen_mid ), + .din ( raw ), + .dout ( sound ) +); + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_adpcm.v b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_adpcm.v new file mode 100644 index 00000000..eadd6b25 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_adpcm.v @@ -0,0 +1,108 @@ +/* This file is part of JT5205. + JT5205 program 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. + + JT5205 program 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 JT5205. If not, see . + + Author: Jose Tejada Gomez. Twitter: @topapate + Version: 1.0 + Date: 30-10-2019 */ + +module jt5205_adpcm( + input rst, + input clk, + (* direct_enable *) input cen_hf, + (* direct_enable *) input cen_lo, + input [ 3:0] din, + output reg signed [11:0] sound +); + +reg [ 5:0] delta_idx, idx_inc; +reg [10:0] delta[0:48]; + +reg [11:0] dn, qn; +reg up; +reg [ 2:0] factor; +reg [ 3:0] din_copy; +reg [ 5:0] next_idx; +reg signed [12:0] unlim; + +always @(posedge clk, posedge rst) begin + if( rst ) begin + factor <= 3'd0; + up <= 1'b0; + next_idx <= 6'd0; + dn <= 12'd0; + qn <= 12'd0; + end else if(cen_hf) begin + up <= cen_lo; + if( up ) begin + factor <= din_copy[2:0]; + dn <= { 1'b0, delta[delta_idx] }; + qn <= { 1'd0, delta[delta_idx]>>3}; + next_idx <= din_copy[2] ? (delta_idx+idx_inc) : (delta_idx-6'd1); + end else begin + if(factor[2]) begin + qn <= qn + dn; + end + dn <= dn>>1; + factor <= factor<<1; + if( next_idx>6'd48) + next_idx <= din_copy[2] ? 6'd48 : 6'd0; + end + end +end + +function signed [12:0] extend; + input signed [11:0] a; + extend = { a[11], a }; +endfunction + +always @(*) begin + unlim = din_copy[3] ? extend(sound) - {1'b0,qn} : + extend(sound) + {1'b0,qn}; +end + +wire signed [12:0] lim_pos = 13'd2047; +wire signed [12:0] lim_neg = -13'd2048; + +wire ovp = unlim>lim_pos; +wire ovn = unlim. + + Author: Jose Tejada Gomez. Twitter: @topapate + Version: 1.0 + Date: 30-12-2019 */ + +// Simple 2x interpolator +// Reduces HF content without altering too much the +// original sound + +module jt5205_interpol2x( + input rst, + input clk, + (* direct_enable *) input cen_mid, + input signed [11:0] din, + output reg signed [11:0] dout +); + +reg signed [11:0] last; + +always @(posedge clk, posedge rst) begin + if(rst) begin + last <= 12'd0; + dout <= 12'd0; + end else if(cen_mid) begin + last <= din; + dout <= (last>>>1)+(din>>>1); + end +end + +endmodule diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_timing.v b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_timing.v new file mode 100644 index 00000000..2906f1ed --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_timing.v @@ -0,0 +1,69 @@ +/* This file is part of JT5205. + JT5205 program 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. + + JT5205 program 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 JT5205. If not, see . + + Author: Jose Tejada Gomez. Twitter: @topapate + Version: 1.0 + Date: 30-10-2019 */ + +module jt5205_timing( + input clk, + (* direct_enable *) input cen, + input [ 1:0] sel, // s pin + output cen_lo, + output cenb_lo, + output cen_mid, + output reg vclk_o +); + +reg [6:0] cnt=7'd0; +reg pre=1'b0, preb=1'b0; +reg [6:0] lim; + +always @(posedge clk) begin + case(sel) + 2'd0: lim <= 7'd95; + 2'd1: lim <= 7'd63; + 2'd2: lim <= 7'd47; + 2'd3: lim <= 7'd1; + endcase +end + +always @(posedge clk) begin + + if (lim == 1) begin + cnt <= 1'b0; + vclk_o <= 1'b0; + end + if(cen) begin + if (lim != 1) cnt <= cnt + 7'd1; + + pre <= 1'b0; + preb <= 1'b0; + if(cnt==lim) begin + vclk_o <= 1'b1; + cnt <= 7'd0; + pre <= 1'b1; + end + if(cnt==(lim>>1)) begin + preb <=1'b1; + vclk_o <= 1'b0; + end + end +end + +assign cen_lo = pre &cen; +assign cenb_lo = preb&cen; +assign cen_mid = (pre|preb)&cen; + +endmodule \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index daa93265..7e4bb47e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -248,7 +248,7 @@ begin process (clk_sys, rst_sys) begin if rst_sys = '1' then - sound_data_o <= X"FF"; + sound_data_o <= X"00"; elsif rising_edge(clk_sys) then if cpu_clk_en = '1' and cpu_io_wr = '1' and snd_cs = '1' then sound_data_o <= cpu_d_o; From 6203669ee00d04e2c5a85f0c5ffb379958355df3 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 12 Mar 2020 13:51:27 +0100 Subject: [PATCH 28/35] IremM62: add Spelunker 2 and Youjyudn --- .../IremM62 Hardware/meta/Spelunker 2.mra | 5 +- .../IremM62 Hardware/meta/Youjyudn.mra | 81 +++++++++++++ Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 3 +- .../rtl/iremm62_video_controller.vhd | 21 +++- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 6 +- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 107 +++++++++++++++--- .../rtl/platform_variant_pkg.vhd | 3 + .../IremM62 Hardware/rtl/sprite_array.vhd | 2 +- .../IremM62 Hardware/rtl/sprite_pkg.vhd | 2 +- .../IremM62 Hardware/rtl/spritectl.vhd | 4 +- .../IremM62 Hardware/rtl/target_top.vhd | 20 ++-- .../IremM62 Hardware/rtl/tilemapctl.vhd | 93 +++++++++------ 12 files changed, 271 insertions(+), 76 deletions(-) create mode 100644 Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra diff --git a/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra b/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra index fbd36ea1..e5bac53a 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra @@ -5,7 +5,7 @@ Irem iremm62 0A - + @@ -74,7 +74,8 @@ - FF + + FF diff --git a/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra b/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra new file mode 100644 index 00000000..43dbbed0 --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra @@ -0,0 +1,81 @@ + + Youjyudn + 0216 + youjyudn + Irem + iremm62 + 0B + + + + + FF + + + + FF + + + FF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FF + + + + + + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index 9414ce4a..0beb114e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -14,7 +14,7 @@ use work.platform_variant_pkg.all; entity Graphics is port ( - hwsel : in integer; + hwsel : in HWSEL_t; hires : in std_logic; sprite_prom : in prom_a(0 to 31); @@ -77,6 +77,7 @@ begin ( -- clocking etc video_i => video_i, + hwsel => hwsel, hires => hires, -- video data signals (in) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd index 7acb218f..99b2e4c7 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd @@ -4,12 +4,14 @@ use ieee.numeric_std.all; library work; use work.video_controller_pkg.all; +use work.platform_variant_pkg.all; entity iremm62_video_controller is port ( -- clocking etc video_i : in from_VIDEO_t; + hwsel : in HWSEL_t; hires : in std_logic; -- video input data @@ -33,7 +35,9 @@ architecture SYN of iremm62_video_controller is signal vcnt : unsigned(8 downto 0); signal hsync : std_logic; signal vsync : std_logic; - signal hblank : std_logic; + signal hblank : std_logic; -- hblank mux + signal hblank1 : std_logic; -- normal hblank + signal hblank2 : std_logic; -- shifted hblank for some games signal vblank : std_logic; begin @@ -67,18 +71,26 @@ begin if reset = '1' then hsync <= '0'; vsync <= '0'; - hblank <= '1'; + hblank1 <= '1'; + hblank2 <= '1'; vblank <= '1'; elsif rising_edge(clk) and clk_ena = '1' then -- display blank if hcnt = "00"&x"FF" then - hblank <= '0'; + hblank1 <= '0'; if vcnt = '1'&x"00" then vblank <= '0'; end if; end if; if (hires = '0' and hcnt = "01"&x"FF") or hcnt = "10"&x"7F" then - hblank <= '1'; + hblank1 <= '1'; + end if; + -- alternate blanking to hide hscroll garbage + if hcnt = "01"&x"07" then + hblank2 <= '0'; + end if; + if hcnt = "00"&x"87" then + hblank2 <= '1'; if vcnt = '1'&x"FF" then vblank <= '1'; end if; @@ -110,6 +122,7 @@ begin video_o.hsync <= hsync; video_o.vsync <= vsync; + hblank <= hblank2 when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 or hwsel = HW_KIDNIKI or hwsel = HW_HORIZON or hwsel = HW_YOUJYUDN else hblank1; video_o.hblank <= hblank; video_o.vblank <= vblank; video_ctl_o.stb <= '1'; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index db242cdf..24da3b44 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -17,9 +17,9 @@ entity PACE is -- clocks and resets clkrst_i : in from_CLKRST_t; cpu_clk_en_i : in std_logic; - + -- hardware variant - hwsel : in integer; + hwsel : in HWSEL_t; hires : in std_logic; -- misc I/O @@ -112,7 +112,7 @@ begin cpu_clk_en_i => cpu_clk_en_i, hwsel => hwsel, - + -- misc inputs and outputs buttons_i => buttons_i, switches_i => switches_i, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 7e4bb47e..03e32216 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -22,7 +22,7 @@ entity platform is clkrst_i : in from_CLKRST_t; cpu_clk_en_i : in std_logic; - hwsel : in integer; + hwsel : in HWSEL_t; -- misc I/O buttons_i : in from_BUTTONS_t; @@ -128,6 +128,13 @@ architecture SYN of platform is signal sp_pal_b_wr : std_logic; signal sprite_pal_a : std_logic_vector(7 downto 0); signal tilemap1_pal_a : std_logic_vector(7 downto 0); + signal pal_r_q : std_logic_vector(7 downto 0); + signal pal_g_q : std_logic_vector(7 downto 0); + signal pal_b_q : std_logic_vector(7 downto 0); + + signal pal2_r_wr : std_logic; + signal pal2_r_q : std_logic_vector(7 downto 0); + signal tilemap2_pal_a : std_logic_vector(7 downto 0); -- other signals signal rst_platform : std_logic; @@ -147,7 +154,9 @@ architecture SYN of platform is signal kidniki_bank : std_logic_vector(3 downto 0); signal kidniki_gfxbank: std_logic; + signal spelunk2_palbank : std_logic_vector(1 downto 0); signal spelunkr_palbank : std_logic; + signal spelunk2_bank1 : std_logic_vector(1 downto 0); begin @@ -187,12 +196,12 @@ begin -- chip select logic -- ROM $0000-$7FFF - -- $0000-$9FFF - LDRUN2, KIDNIKI, SPELUNKR - -- $0000-$BFFF - LDRUN3,4, HORIZON + -- $0000-$9FFF - LDRUN2, KIDNIKI, SPELUNKR, SPELUNK2 + -- $0000-$BFFF - LDRUN3,4, HORIZON, YOUJYUDN -- $A000-$BFFF - BATTROAD rom_cs <= '1' when STD_MATCH(cpu_a, "0---------------") else - '1' when (hwsel = HW_LDRUN2 or hwsel = HW_KIDNIKI or hwsel = HW_SPELUNKR) and cpu_a(15 downto 13) = "100" else - '1' when (hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_HORIZON) and cpu_a(15 downto 14) = "10" else + '1' when (hwsel = HW_LDRUN2 or hwsel = HW_KIDNIKI or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2) and cpu_a(15 downto 13) = "100" else + '1' when (hwsel = HW_LDRUN3 or hwsel = HW_LDRUN4 or hwsel = HW_HORIZON or hwsel = HW_YOUJYUDN) and cpu_a(15 downto 14) = "10" else '1' when hwsel = HW_BATTROAD and cpu_a(15 downto 13) = "101" else '0'; @@ -222,8 +231,8 @@ begin STD_MATCH(cpu_a, X"D"&"-----------1") else '0'; - -- Text RAM $C800-$CFFF - BATTROAD, SPELUNKR, SPELUNK2, $D000-$DFFF - KIDNIKI, $A000-$AFFF - LOTLOT - textram_cs <= '1' when (hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2) and + -- Text RAM $C800-$CFFF - BATTROAD, SPELUNKR, SPELUNK2, YOUJYUDN $D000-$DFFF - KIDNIKI, $A000-$AFFF - LOTLOT + textram_cs <= '1' when (hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 or hwsel = HW_YOUJYUDN) and cpu_a(15 downto 11) = x"C"&'1' else '1' when hwsel = HW_KIDNIKI and cpu_a(15 downto 12) = x"D" else @@ -319,6 +328,9 @@ begin '1' & kidniki_bank(2 downto 0) & cpu_a(12 downto 0) when hwsel = HW_BATTROAD and cpu_a(15 downto 13) = "101" else (kidniki_bank(3 downto 0) + "100") & cpu_a(12 downto 0) when hwsel = HW_KIDNIKI and cpu_a(15 downto 13) = "100" and kidniki_bank(3 downto 2) /= "11" else "10" & kidniki_bank(1 downto 0) & cpu_a(12 downto 0) when hwsel = HW_SPELUNKR and cpu_a(15 downto 13) = "100" else + "010" & spelunk2_bank1 & cpu_a(11 downto 0) when hwsel = HW_SPELUNK2 and cpu_a(15 downto 12) = x"8" else + '1' & kidniki_bank & cpu_a(11 downto 0) when hwsel = HW_SPELUNK2 and cpu_a(15 downto 12) = x"9" else + "10" & kidniki_bank(0) & cpu_a(13 downto 0) when hwsel = HW_YOUJYUDN and cpu_a(15 downto 14) = "10" else '0' & cpu_a(15 downto 0); -- Lode Runner 2 bank switching - some kind of protection, only the level number is used to select bank 0 or 1 at $8000 @@ -334,12 +346,13 @@ begin kidniki_bank <= (others => '0'); kidniki_gfxbank <= '0'; spelunkr_palbank <= '0'; + spelunk2_bank1 <= (others => '0'); elsif rising_edge(clk_sys) then if cpu_clk_en = '1' and cpu_io_wr = '1' then case cpu_a(7 downto 0) is when X"80" => ld2_bankr1 <= cpu_d_o(5 downto 0); when X"81" => ld2_bankr2 <= cpu_d_o; - when X"83" => if hwsel = HW_BATTROAD then kidniki_bank <= cpu_d_o(3 downto 0); end if; + when X"83" => if hwsel = HW_BATTROAD or hwsel = HW_YOUJYUDN then kidniki_bank <= cpu_d_o(3 downto 0); end if; when X"84" => if hwsel = HW_KIDNIKI then kidniki_gfxbank <= cpu_d_o(0); end if; -- Kidniki banks: 0-7, C-F, 8-B not used when X"85" => if hwsel = HW_KIDNIKI then kidniki_bank <= cpu_d_o(3) & (not cpu_d_o(3) and cpu_d_o(2)) & cpu_d_o(1 downto 0); end if; @@ -361,6 +374,10 @@ begin if cpu_a = x"c800" and hwsel = HW_LDRUN4 then ld24_bank <= cpu_d_o(0); end if; + if cpu_a = x"d003" and hwsel = HW_SPELUNK2 then + kidniki_bank <= cpu_d_o(5 downto 2); + spelunk2_bank1 <= cpu_d_o(7 downto 6); + end if; if cpu_a = x"d004" and hwsel = HW_SPELUNKR then kidniki_bank(1 downto 0) <= cpu_d_o(1 downto 0); end if; @@ -447,6 +464,7 @@ begin m62_vscroll <= (others => '0'); m62_vscroll2 <= (others => '0'); m62_topbottom_mask <= '0'; + spelunk2_palbank <= "00"; elsif rising_edge(clk_sys) then if hwsel = HW_LOTLOT then m62_hscroll <= std_logic_vector(to_signed(-64, m62_hscroll'length)); @@ -470,15 +488,22 @@ begin if hwsel = HW_SPELUNKR then m62_vscroll(15 downto 8) <= cpu_d_o; end if; + if hwsel = HW_SPELUNK2 then + m62_hscroll(7 downto 0) <= cpu_d_o; + end if; when x"D002" => if hwsel = HW_SPELUNKR then m62_hscroll(7 downto 0) <= cpu_d_o; end if; + if hwsel = HW_SPELUNK2 then + m62_vscroll(8) <= cpu_d_o(0); + m62_hscroll(8) <= cpu_d_o(1); + spelunk2_palbank <= cpu_d_o(3 downto 2); + end if; when x"D003" => if hwsel = HW_SPELUNKR then m62_hscroll(15 downto 8) <= cpu_d_o; end if; - when others => null; end case; @@ -491,12 +516,14 @@ begin end if; -- background 1 hscroll if (hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"82") or - ((hwsel = HW_BATTROAD or hwsel = HW_KIDNIKI) and cpu_a(7 downto 0) = x"81") then + ((hwsel = HW_BATTROAD or hwsel = HW_KIDNIKI) and cpu_a(7 downto 0) = x"81") or + (hwsel = HW_YOUJYUDN and cpu_a(7 downto 0) = x"80") then m62_hscroll(15 downto 8) <= cpu_d_o; end if; if (hwsel = HW_LDRUN4 and cpu_a(7 downto 0) = x"83") or (hwsel = HW_BATTROAD and cpu_a(7 downto 0) = x"82") or - (hwsel = HW_KIDNIKI and cpu_a(7 downto 0) = x"80") then + (hwsel = HW_KIDNIKI and cpu_a(7 downto 0) = x"80") or + (hwsel = HW_YOUJYUDN and cpu_a(7 downto 0) = x"81") then m62_hscroll(7 downto 0) <= cpu_d_o; end if; if hwsel = HW_LDRUN3 and cpu_a(7 downto 0) = x"81" then @@ -529,8 +556,9 @@ begin -- external background ROMs gfx1_addr <= - '0' & tilemap_i(1).tile_a(14 downto 0) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else + '0' & tilemap_i(1).tile_a(14 downto 0) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 or hwsel = HW_YOUJYUDN else '0' & kidniki_gfxbank & tilemap_i(1).tile_a(13 downto 0); + tilemap_o(1).tile_d(23 downto 0) <= gfx1_do(7 downto 0) & gfx1_do(15 downto 8) & gfx1_do(23 downto 16); -- internal background ROMs @@ -687,9 +715,22 @@ begin -- tilemap 1 palette address tilemap1_pal_a <= spelunkr_palbank & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNKR else + spelunk2_palbank(0) & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNK2 else '0' & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_BATTROAD else tilemap_i(1).pal_a(7 downto 0); + -- Spelunk2 uses 512 entries/palette in an odd way: + -- - red and green are stored in the first two ROMs, using the first and second half bytes + -- - blue is stored in the third and fourth ROMs, using the second half byte + + tilemap_o(1).rgb.r(9 downto 2) <= pal_g_q(3 downto 0) & pal_g_q(3 downto 0) when hwsel = HW_SPELUNK2 and spelunk2_palbank(1) = '1' else + pal_r_q(3 downto 0) & pal_r_q(3 downto 0); + tilemap_o(1).rgb.g(9 downto 2) <= pal_r_q(7 downto 4) & pal_r_q(7 downto 4) when hwsel = HW_SPELUNK2 and spelunk2_palbank(1) = '0' else + pal_g_q(7 downto 4) & pal_g_q(7 downto 4) when hwsel = HW_SPELUNK2 and spelunk2_palbank(1) = '1' else + pal_g_q(3 downto 0) & pal_g_q(3 downto 0); + tilemap_o(1).rgb.b(9 downto 2) <= pal2_r_q(3 downto 0) & pal2_r_q(3 downto 0) when hwsel = HW_SPELUNK2 and spelunk2_palbank(1) = '1' else + pal_b_q(3 downto 0) & pal_b_q(3 downto 0); + -- tilemap 1 palettes pal_r : entity work.dpram generic map @@ -703,14 +744,14 @@ begin clock_b => clk_sys, address_b => dl_addr(7 downto 0), wren_b => pal_r_wr, - data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + data_b => dl_data, q_b => open, clock_a => not clk_video, address_a => tilemap1_pal_a, wren_a => '0', data_a => (others => 'X'), - q_a => tilemap_o(1).rgb.r(9 downto 2) + q_a => pal_r_q ); pal_r_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"3" else '0'; -- 300-3FF @@ -726,14 +767,14 @@ begin clock_b => clk_sys, address_b => dl_addr(7 downto 0), wren_b => pal_g_wr, - data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + data_b => dl_data, q_b => open, clock_a => not clk_video, address_a => tilemap1_pal_a, wren_a => '0', data_a => (others => 'X'), - q_a => tilemap_o(1).rgb.g(9 downto 2) + q_a => pal_g_q ); pal_g_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"4" else '0'; -- 400-4FF @@ -749,17 +790,47 @@ begin clock_b => clk_sys, address_b => dl_addr(7 downto 0), wren_b => pal_b_wr, - data_b => dl_data(3 downto 0) & dl_data(3 downto 0), + data_b => dl_data, q_b => open, clock_a => not clk_video, address_a => tilemap1_pal_a, wren_a => '0', data_a => (others => 'X'), - q_a => tilemap_o(1).rgb.b(9 downto 2) + q_a => pal_b_q ); pal_b_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"5" else '0'; -- 500-5FF + -- tilemap 2 palette address + -- Use this for Spelunk2's second blue ROM, too + tilemap2_pal_a <= spelunk2_palbank(0) & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNK2 else + (others => '0'); + + -- tilemap 2 palettes + pal2_r : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8, + widthad_b => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => pal2_r_wr, + data_b => dl_data, + q_b => open, + + clock_a => not clk_video, + address_a => tilemap2_pal_a, + wren_a => '0', + data_a => (others => 'X'), + q_a => pal2_r_q + ); + pal2_r_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"6" else '0'; -- 600-6FF + + -- sprite palette address sprite_pal_a <= '0' & sprite_i.pal_a(6 downto 0) when hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd index 728a190e..0fa48fe8 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd @@ -20,6 +20,9 @@ package platform_variant_pkg is constant HW_LOTLOT : integer := 8; constant HW_SPELUNKR : integer := 9; constant HW_SPELUNK2 : integer := 10; + constant HW_YOUJYUDN : integer := 11; + + subtype HWSEL_t is integer range 0 to 11; type rom_a is array (natural range <>) of string; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd index db2e40d8..807353ce 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd @@ -21,7 +21,7 @@ entity sprite_array is ( reset : in std_logic; - hwsel : in integer; + hwsel : in HWSEL_t; hires : in std_logic; sprite_prom : in prom_a(0 to 31); diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd index 8c1fcbd0..f81083cc 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd @@ -60,7 +60,7 @@ package sprite_pkg is port ( reset : in std_logic; - hwsel : integer; + hwsel : HWSEL_t; hires : in std_logic; sprite_prom : in prom_a(0 to 31); diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index 4e1218f9..fd04f715 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -18,9 +18,9 @@ entity spritectl is ); port ( - hwsel : in integer range 0 to 15; + hwsel : in HWSEL_t; hires : in std_logic; - + -- sprite registers reg_i : in from_SPRITE_REG_t; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index 72e0792d..4539e3d3 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -11,12 +11,12 @@ use work.platform_variant_pkg.all; entity target_top is port( clock_sys : in std_logic; - vid_clk_en : out std_logic; - clk_aud : in std_logic; + vid_clk_en : out std_logic; + clk_aud : in std_logic; reset_in : in std_logic; - hwsel : in integer; + hwsel : in HWSEL_t; audio_out : out std_logic_vector(11 downto 0); - usr_coin1 : in std_logic; + usr_coin1 : in std_logic; usr_coin2 : in std_logic; usr_service : in std_logic; usr_start1 : in std_logic; @@ -77,7 +77,7 @@ architecture SYN of target_top is begin - hires <= '0' when hwsel = HW_KUNGFUM or hwsel = HW_HORIZON or hwsel = HW_BATTROAD else '1'; + hires <= '0' when hwsel = HW_KUNGFUM or hwsel = HW_HORIZON or hwsel = HW_BATTROAD or hwsel = HW_YOUJYUDN else '1'; process(clock_sys) begin if rising_edge(clock_sys) then @@ -140,18 +140,18 @@ Sound_Board : entity work.Sound_Board dbg_cpu_addr => open ); -pace_inst : entity work.pace +pace_inst : entity work.pace port map( - clkrst_i => clkrst_i, - cpu_clk_en_i => cpu_clk_en, + clkrst_i => clkrst_i, + cpu_clk_en_i => cpu_clk_en, hwsel => hwsel, - hires => hires, + hires => hires, buttons_i => buttons_i, switches_i => switches_i, inputs_i => inputs_i, video_i => video_i, video_o => video_o, - sound_data_o => sound_data, + sound_data_o => sound_data, platform_i => platform_i, platform_o => platform_o, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index 8a02dec6..d1173ed3 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -14,18 +14,18 @@ use work.video_controller_pkg.all; -- -- Tile data is 2 BPP. -- -entity tilemapCtl is +entity tilemapCtl is generic ( DELAY : integer ); - port + port ( reset : in std_logic; - hwsel : in integer; + hwsel : in HWSEL_t; hires : in std_logic; - -- video control signals + -- video control signals video_ctl : in from_VIDEO_CTL_t; -- tilemap controller signals @@ -64,8 +64,9 @@ begin x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 128) when unsigned(y) < 6*8 and HWSEL = HW_KUNGFUM else std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 64) when hires = '1' else std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 128); - y <= std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0)) + 128) when hwsel = HW_SPELUNKR else - std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0))); -- when rot_en = '0' else video_ctl.x; + y <= std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0)) + 128) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else + std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0))); + -- generate pixel process (clk, clk_ena) @@ -81,48 +82,72 @@ begin -- 1st stage of pipeline -- - set tilemap, attribute address - if hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then - -- 64x64 tilemap - ctl_o.map_a(11) <= y(8); - ctl_o.attr_a(11) <= y(8); - else - ctl_o.map_a(11) <= '0'; - ctl_o.attr_a(11) <= '0'; + if x(2 downto 0) = "000" then + if hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then + -- 64x64 tilemap + ctl_o.map_a(11) <= y(8); + ctl_o.attr_a(11) <= y(8); + else + ctl_o.map_a(11) <= '0'; + ctl_o.attr_a(11) <= '0'; + end if; + if hwsel = HW_YOUJYUDN then + -- 8x16 tiles, 64x16 tilemap + ctl_o.map_a(10 downto 6) <= '0' & y(7 downto 4); + ctl_o.attr_a(10 downto 6) <= '0' & y(7 downto 4); + else + -- 8x8 tiles, 64x32(64) tilemap + ctl_o.map_a(10 downto 6) <= y(7 downto 3); + ctl_o.attr_a(10 downto 6) <= y(7 downto 3); + end if; + ctl_o.map_a(5 downto 0) <= x(8 downto 3); + ctl_o.attr_a(5 downto 0) <= x(8 downto 3); end if; - ctl_o.map_a(10 downto 6) <= y(7 downto 3); - ctl_o.map_a(5 downto 0) <= x(8 downto 3); - ctl_o.attr_a(10 downto 6) <= y(7 downto 3); - ctl_o.attr_a(5 downto 0) <= x(8 downto 3); -- 2nd stage of pipeline -- - set tile address - if x(2 downto 0) = "010" then - if hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then + if x(2 downto 0) = "001" then + if hwsel = HW_SPELUNKR then ctl_o.tile_a(14) <= ctl_i.attr_d(5); + elsif hwsel = HW_SPELUNK2 then + ctl_o.tile_a(14) <= ctl_i.attr_d(7); + elsif hwsel = HW_YOUJYUDN then + ctl_o.tile_a(14) <= '1'; -- first half of the ROMs are empty else ctl_o.tile_a(14) <= '0'; end if; - if hwsel = HW_LDRUN4 or hwsel = HW_HORIZON then - ctl_o.tile_a(13) <= ctl_i.attr_d(5); - elsif hwsel = HW_KIDNIKI or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then - ctl_o.tile_a(13) <= ctl_i.attr_d(7); + + if hwsel = HW_YOUJYUDN then + ctl_o.tile_a(13 downto 12) <= ctl_i.attr_d(6 downto 5); + ctl_o.tile_a(11 downto 4) <= ctl_i.map_d(7 downto 0); + ctl_o.tile_a(3 downto 0) <= y(3 downto 0); else - ctl_o.tile_a(13) <= '0'; + if hwsel = HW_LDRUN4 or hwsel = HW_HORIZON then + ctl_o.tile_a(13) <= ctl_i.attr_d(5); + elsif hwsel = HW_KIDNIKI or hwsel = HW_SPELUNKR then + ctl_o.tile_a(13) <= ctl_i.attr_d(7); + elsif hwsel = HW_SPELUNK2 then + ctl_o.tile_a(13) <= ctl_i.attr_d(6); + else + ctl_o.tile_a(13) <= '0'; + end if; + if hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR then + ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6) & ctl_i.attr_d(4); + elsif hwsel = HW_KIDNIKI then + ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6 downto 5); + elsif hwsel = HW_SPELUNK2 then + ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(5 downto 4); + else + ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(7 downto 6); + end if; + ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); + ctl_o.tile_a(2 downto 0) <= y(2 downto 0); end if; - if hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 then - ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6) & ctl_i.attr_d(4); - elsif hwsel = HW_KIDNIKI then - ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6 downto 5); - else - ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(7 downto 6); - end if; - ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); - ctl_o.tile_a(2 downto 0) <= y(2 downto 0); end if; -- 3rd stage of pipeline -- - read tile, attribute data from ROM - if x(2 downto 0) = "100" then + if x(2 downto 0) = "111" then attr_d_r := ctl_i.attr_d(7 downto 0); if hwsel = HW_KUNGFUM or hwsel = HW_LOTLOT or From 4645083652b0659b44bcc13feebf7b8bcea1705c Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 12 Mar 2020 18:53:04 +0100 Subject: [PATCH 29/35] IremM62: add 2nd tilemap backround, Battle Road is fully working now --- .../IremM62 Hardware/meta/Battle Road.mra | 9 +- .../rtl/iremm62_video_controller.vhd | 3 +- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 8 +- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 38 +++++-- .../IremM62 Hardware/rtl/platform_pkg.vhd | 2 +- Arcade_MiST/IremM62 Hardware/rtl/sdram.sv | 26 +++-- .../IremM62 Hardware/rtl/target_top.vhd | 8 +- .../IremM62 Hardware/rtl/tilemapctl.vhd | 100 +++++++++++++++++- .../IremM62 Hardware/rtl/video_mixer.vhd | 2 +- 9 files changed, 165 insertions(+), 31 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra b/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra index e1a1e3f2..4f87b99c 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra @@ -5,7 +5,7 @@ Irem iremm62 6 - + @@ -106,16 +106,16 @@ - + - + @@ -129,7 +129,8 @@ - FF + + FF diff --git a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd index 99b2e4c7..4e39b3a7 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd @@ -122,7 +122,8 @@ begin video_o.hsync <= hsync; video_o.vsync <= vsync; - hblank <= hblank2 when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 or hwsel = HW_KIDNIKI or hwsel = HW_HORIZON or hwsel = HW_YOUJYUDN else hblank1; + hblank <= hblank2 when hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 or hwsel = HW_KIDNIKI or hwsel = HW_HORIZON or hwsel = HW_YOUJYUDN + else hblank1; video_o.hblank <= hblank; video_o.vblank <= vblank; video_ctl_o.stb <= '1'; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index 24da3b44..799a2951 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -50,7 +50,9 @@ entity PACE is gfx1_addr : out std_logic_vector(17 downto 2); gfx1_do : in std_logic_vector(31 downto 0); gfx2_addr : out std_logic_vector(17 downto 2); - gfx2_do : in std_logic_vector(31 downto 0) + gfx2_do : in std_logic_vector(31 downto 0); + gfx3_addr : out std_logic_vector(17 downto 2); + gfx3_do : in std_logic_vector(31 downto 0) ); end entity PACE; @@ -151,7 +153,9 @@ begin gfx1_addr => gfx1_addr, gfx1_do => gfx1_do, gfx2_addr => gfx2_addr, - gfx2_do => gfx2_do + gfx2_do => gfx2_do, + gfx3_addr => gfx3_addr, + gfx3_do => gfx3_do ); graphics_inst : entity work.Graphics diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 03e32216..24826006 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -66,7 +66,9 @@ entity platform is gfx1_addr : out std_logic_vector(17 downto 2); gfx1_do : in std_logic_vector(31 downto 0); gfx2_addr : out std_logic_vector(17 downto 2); - gfx2_do : in std_logic_vector(31 downto 0) + gfx2_do : in std_logic_vector(31 downto 0); + gfx3_addr : out std_logic_vector(17 downto 2); + gfx3_do : in std_logic_vector(31 downto 0) ); end platform; @@ -113,10 +115,12 @@ architecture SYN of platform is signal sprite_cs : std_logic; -- text RAM + signal textram_a : std_logic_vector(11 downto 0); signal textram_cs : std_logic; signal textram_wr : std_logic; signal textram_d_o : std_logic_vector(7 downto 0); - + signal textram_q : std_logic_vector(15 downto 0); + -- misc signals signal in_cs : std_logic; signal in_d_o : std_logic_vector(7 downto 0); @@ -561,6 +565,10 @@ begin tilemap_o(1).tile_d(23 downto 0) <= gfx1_do(7 downto 0) & gfx1_do(15 downto 8) & gfx1_do(23 downto 16); + gfx3_addr <= '0' & tilemap_i(2).tile_a(14 downto 0); + + tilemap_o(2).tile_d(23 downto 0) <= gfx3_do(7 downto 0) & gfx3_do(15 downto 8) & gfx3_do(23 downto 16); + -- internal background ROMs -- GEN_CHAR_ROMS : for i in M62_CHAR_ROM'range generate -- char_rom_inst : entity work.sprom @@ -625,11 +633,13 @@ begin signal vram_a : std_logic_vector(11 downto 0); alias cram_a : std_logic_vector(11 downto 0) is vram_a; begin - + + textram_a <= '0' & cpu_a(10 downto 0) when hwsel = HW_BATTROAD else cpu_a(11 downto 0); + vram_a <= '0' & cpu_a(10 downto 0) when hwsel = HW_KUNGFUM else cpu_a(12 downto 1) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else '0' & cpu_a(11 downto 1); - + vram_inst : entity work.dpram generic map ( @@ -681,22 +691,28 @@ begin ( init_file => "", widthad_a => 11, - widthad_b => 11 + width_a => 16, + widthad_b => 12, + width_b => 8 ) port map ( clock_b => clk_sys, - address_b => cpu_a(10 downto 0), + address_b => textram_a, wren_b => textram_wr, data_b => cpu_d_o, q_b => textram_d_o, clock_a => clk_video, - address_a => (others => '0'), + address_a => tilemap_i(2).map_a(10 downto 0), wren_a => '0', data_a => (others => 'X'), - q_a => open + q_a => textram_q ); + + tilemap_o(2).attr_d(7 downto 0) <= textram_q(15 downto 8); + tilemap_o(2).map_d(7 downto 0) <= textram_q(7 downto 0); + end block BLK_VRAM; wram_inst : entity work.spram @@ -804,7 +820,11 @@ begin -- tilemap 2 palette address -- Use this for Spelunk2's second blue ROM, too tilemap2_pal_a <= spelunk2_palbank(0) & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNK2 else - (others => '0'); + tilemap_i(2).pal_a(7 downto 0); + + tilemap_o(2).rgb.r(9 downto 2) <= pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6); + tilemap_o(2).rgb.g(9 downto 2) <= pal2_r_q(5 downto 3) & pal2_r_q(5 downto 3) & pal2_r_q(5 downto 4); + tilemap_o(2).rgb.b(9 downto 2) <= pal2_r_q(2 downto 0) & pal2_r_q(2 downto 0) & pal2_r_q(2 downto 1); -- tilemap 2 palettes pal2_r : entity work.dpram diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd index e6dea694..2d480471 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd @@ -47,7 +47,7 @@ package platform_pkg is constant M62_VIDEO_V_SIZE : integer := 256; constant PACE_VIDEO_NUM_BITMAPS : natural := 0; - constant PACE_VIDEO_NUM_TILEMAPS : natural := 1; + constant PACE_VIDEO_NUM_TILEMAPS : natural := 2; constant PACE_VIDEO_NUM_SPRITES : natural := 64; -- constant PACE_VIDEO_H_SIZE : integer := M62_VIDEO_H_SIZE; constant PACE_VIDEO_V_SIZE : integer := M62_VIDEO_V_SIZE; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv b/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv index 3c68bc50..71eab1ea 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/sdram.sv @@ -62,6 +62,8 @@ module sdram ( input [19:2] chr1_addr, output reg [31:0] chr1_q, + input [19:2] chr2_addr, + output reg [31:0] chr2_q, input [19:2] sp_addr, output reg [31:0] sp_q ); @@ -165,7 +167,7 @@ assign SDRAM_nWE = sd_cmd[0]; reg [24:1] addr_latch[2]; reg [24:1] addr_latch_next[2]; reg [17:1] addr_last[2]; -reg [19:2] addr_last2[2]; +reg [19:2] addr_last2[4]; reg [15:0] din_latch[2]; reg [1:0] oe_latch; reg [1:0] we_latch; @@ -174,15 +176,16 @@ reg [1:0] ds[2]; reg port1_state; reg port2_state; -localparam PORT_NONE = 2'd0; -localparam PORT_CPU1 = 2'd1; -localparam PORT_CPU2 = 2'd2; -localparam PORT_SP = 2'd1; -localparam PORT_CHR1 = 2'd2; -localparam PORT_REQ = 2'd3; +localparam PORT_NONE = 3'd0; +localparam PORT_CPU1 = 3'd1; +localparam PORT_CPU2 = 3'd2; +localparam PORT_SP = 3'd1; +localparam PORT_CHR1 = 3'd2; +localparam PORT_CHR2 = 3'd3; +localparam PORT_REQ = 3'd4; -reg [1:0] next_port[2]; -reg [1:0] port[2]; +reg [2:0] next_port[2]; +reg [2:0] port[2]; reg refresh; reg [10:0] refresh_cnt; @@ -219,6 +222,9 @@ always @(*) begin end else if (chr1_addr != addr_last2[PORT_CHR1]) begin next_port[1] = PORT_CHR1; addr_latch_next[1] = { 1'b1, 4'd0, chr1_addr, 1'b0 }; + end else if (chr2_addr != addr_last2[PORT_CHR2]) begin + next_port[1] = PORT_CHR2; + addr_latch_next[1] = { 1'b1, 4'd0, chr2_addr, 1'b0 }; end else begin next_port[1] = PORT_NONE; addr_latch_next[1] = addr_latch[1]; @@ -346,6 +352,7 @@ always @(posedge clk) begin PORT_REQ : port2_q[15:0] <= sd_din; PORT_SP : sp_q[15:0] <= sd_din; PORT_CHR1: chr1_q[15:0] <= sd_din; + PORT_CHR2: chr2_q[15:0] <= sd_din; default: ; endcase; end @@ -357,6 +364,7 @@ always @(posedge clk) begin PORT_REQ : begin port2_q[31:16] <= sd_din; port2_ack <= port2_req; end PORT_SP : begin sp_q[31:16] <= sd_din; end PORT_CHR1 : begin chr1_q[31:16] <= sd_din; end + PORT_CHR2 : begin chr2_q[31:16] <= sd_din; end default: ; endcase; end diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index 4539e3d3..d0989d42 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -53,7 +53,9 @@ entity target_top is port( gfx1_addr : out std_logic_vector(17 downto 2); gfx1_do : in std_logic_vector(31 downto 0); gfx2_addr : out std_logic_vector(17 downto 2); - gfx2_do : in std_logic_vector(31 downto 0) + gfx2_do : in std_logic_vector(31 downto 0); + gfx3_addr : out std_logic_vector(17 downto 2); + gfx3_do : in std_logic_vector(31 downto 0) ); end target_top; @@ -164,7 +166,9 @@ pace_inst : entity work.pace gfx1_addr => gfx1_addr, gfx1_do => gfx1_do, gfx2_addr => gfx2_addr, - gfx2_do => gfx2_do + gfx2_do => gfx2_do, + gfx3_addr => gfx3_addr, + gfx3_do => gfx3_do ); inputs_i.jamma_n.coin(1) <= not usr_coin1; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index d1173ed3..ddc2535b 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -181,9 +181,9 @@ begin -- pal_rgb(0)(7 downto 5) /= "000" or -- pal_rgb(1)(7 downto 5) /= "000" or -- pal_rgb(2)(7 downto 5) /= "000" then - if graphics_i.bit8(0)(3) = '1' then +-- if graphics_i.bit8(0)(3) = '1' then ctl_o.set <= '1'; - end if; +-- end if; -- end if; end if; -- clk_ena @@ -192,3 +192,99 @@ begin end process; end architecture TILEMAP_1; + +-- Irem M62 second tilemap background + +architecture TILEMAP_2 of tilemapCtl is + + alias clk : std_logic is video_ctl.clk; + alias clk_ena : std_logic is video_ctl.clk_ena; + alias stb : std_logic is video_ctl.stb; + alias hblank : std_logic is video_ctl.hblank; + alias vblank : std_logic is video_ctl.vblank; + + signal x : std_logic_vector(video_ctl.x'range); + signal y : std_logic_vector(video_ctl.y'range); + + alias rot_en : std_logic is graphics_i.bit8(0)(0); + alias hscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(0); + alias vscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(1); + +begin + + ctl_o.rgb <= ctl_i.rgb; + --ctl_o.rgb.r <= x"aa"&"10"; + + -- not used + ctl_o.map_a(ctl_o.map_a'left downto 10) <= (others => '0'); + ctl_o.attr_a(ctl_o.attr_a'left downto 10) <= (others => '0'); + ctl_o.tile_a(ctl_o.tile_a'left downto 15) <= (others => '0'); + + -- tilemap scroll + x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 64) when hires = '1' else + std_logic_vector(unsigned(video_ctl.x) - 256); + y <= std_logic_vector(unsigned(video_ctl.y) - 256 + 128) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else + std_logic_vector(unsigned(video_ctl.y) - 256); + + -- generate pixel + process (clk, clk_ena) + + variable tile_d_r : std_logic_vector(23 downto 0); + variable attr_d_r : std_logic_vector(7 downto 0); + variable flipx : std_logic; + variable pel : std_logic_vector(2 downto 0); + + begin + + if rising_edge(clk) then + if clk_ena = '1' then + + -- 1st stage of pipeline + -- - set tilemap, attribute address + if x(2 downto 0) = "000" then + -- 8x8 tiles, 32x32 tilemap + ctl_o.map_a(9 downto 5) <= y(7 downto 3); + ctl_o.attr_a(9 downto 5) <= y(7 downto 3); + ctl_o.map_a(4 downto 0) <= x(7 downto 3); + ctl_o.attr_a(4 downto 0) <= x(7 downto 3); + end if; + + -- 2nd stage of pipeline + -- - set tile address + if x(2 downto 0) = "001" then + ctl_o.tile_a(14) <= '0'; + ctl_o.tile_a(13) <= '0'; + ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6) & ctl_i.attr_d(4); + ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); + ctl_o.tile_a(2 downto 0) <= y(2 downto 0); + end if; + + -- 3rd stage of pipeline + -- - read tile, attribute data from ROM + if x(2 downto 0) = "111" then + attr_d_r := ctl_i.attr_d(7 downto 0); + tile_d_r := ctl_i.tile_d(tile_d_r'range); + elsif stb = '1' then + tile_d_r := tile_d_r(tile_d_r'left-1 downto 0) & '0'; + end if; + + -- extract R,G,B from colour palette + pel := tile_d_r(tile_d_r'left-16) & tile_d_r(tile_d_r'left-8) & tile_d_r(tile_d_r'left); + + ctl_o.pal_a <= "00" & attr_d_r(3 downto 0) & pel(1 downto 0); + ctl_o.set <= '0'; -- default + if hwsel = HW_BATTROAD and pel /= "000" then +-- pal_rgb(0)(7 downto 5) /= "000" or +-- pal_rgb(1)(7 downto 5) /= "000" or +-- pal_rgb(2)(7 downto 5) /= "000" then +-- if graphics_i.bit8(0)(3) = '1' then + ctl_o.set <= '1'; + end if; +-- end if; + + end if; -- clk_ena + end if; -- rising_edge_clk + + end process; + +end architecture TILEMAP_2; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd index fb4b4aa4..123a3410 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd @@ -53,8 +53,8 @@ begin bg_rgb; elsif PACE_VIDEO_NUM_TILEMAPS = 2 generate rgb_o <= sprite_rgb when sprite_set = '1' and sprite_pri = '1' else - tilemap_ctl_o(1).rgb when tilemap_ctl_o(1).set = '1' else tilemap_ctl_o(2).rgb when tilemap_ctl_o(2).set = '1' else + tilemap_ctl_o(1).rgb when tilemap_ctl_o(1).set = '1' else sprite_rgb when sprite_set = '1' else bg_rgb; else generate From d91917d43b40ee82e499aa7b956022abd34a6294 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 12 Mar 2020 22:07:14 +0100 Subject: [PATCH 30/35] IremM62: try to fix sprite-background layer alignment --- .../IremM62 Hardware/rtl/iremm62_video_controller.vhd | 3 +-- Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd | 3 ++- Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd index 4e39b3a7..07c87cba 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd @@ -122,8 +122,7 @@ begin video_o.hsync <= hsync; video_o.vsync <= vsync; - hblank <= hblank2 when hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 or hwsel = HW_KIDNIKI or hwsel = HW_HORIZON or hwsel = HW_YOUJYUDN - else hblank1; + hblank <= hblank2 when hwsel = HW_KIDNIKI else hblank1; video_o.hblank <= hblank; video_o.vblank <= vblank; video_ctl_o.stb <= '1'; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index fd04f715..91a63729 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -147,7 +147,8 @@ begin end if; if video_ctl.stb = '1' then - x := unsigned(reg_i.x) + 256 - 64 + PACE_VIDEO_PIPELINE_DELAY - 2; + x := unsigned(reg_i.x) + 256 - 64 + PACE_VIDEO_PIPELINE_DELAY; + if hwsel /= HW_KIDNIKI then x:=x-8; end if; if hires = '0' then x := x - 64; end if; if x = unsigned(video_ctl.x) then diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index ddc2535b..19191fc3 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -61,9 +61,9 @@ begin ctl_o.tile_a(ctl_o.tile_a'left downto 15) <= (others => '0'); -- tilemap scroll - x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 128) when unsigned(y) < 6*8 and HWSEL = HW_KUNGFUM else - std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 64) when hires = '1' else - std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 128); + x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 128 + 8) when unsigned(y) < 6*8 and HWSEL = HW_KUNGFUM else + std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 64 + 8) when hires = '1' else + std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 128 + 8); y <= std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0)) + 128) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0))); @@ -221,8 +221,8 @@ begin ctl_o.tile_a(ctl_o.tile_a'left downto 15) <= (others => '0'); -- tilemap scroll - x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 64) when hires = '1' else - std_logic_vector(unsigned(video_ctl.x) - 256); + x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 64 + 8) when hires = '1' else + std_logic_vector(unsigned(video_ctl.x) - 256 + 8); y <= std_logic_vector(unsigned(video_ctl.y) - 256 + 128) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else std_logic_vector(unsigned(video_ctl.y) - 256); From 6984dcc5a01ae0b88845b3c3508cacaa7baa753c Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 12 Mar 2020 23:55:36 +0100 Subject: [PATCH 31/35] IremM62: slow down sprite fetching to reserve SDRAM slots to bg fetch --- .../IremM62 Hardware/rtl/sprite_array.vhd | 32 +++++++++++++++---- .../IremM62 Hardware/rtl/spritectl.vhd | 4 ++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd index 807353ce..953b995c 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd @@ -60,6 +60,7 @@ architecture SYN of sprite_array is signal ctl_o : ctl_o_a_t(0 to N_SPRITES-1); signal ld_r : std_logic_vector(N_SPRITES-1 downto 0); + signal ld_en : std_logic; begin -- Sprite Data Load Arbiter @@ -78,14 +79,31 @@ begin elsif rising_edge(clk) and clk_ena = '1' then if video_ctl.hblank = '0' then i := 0; - ld_r(ld_r'left) <= '1'; - ld_r(ld_r'left-1 downto 0) <= (others => '0'); - else - ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); - if (i = 31 and hwsel /= HW_HORIZON) or i = N_SPRITES-1 then - i := 0; + ld_r(ld_r'left downto 0) <= (others => '0'); + if hwsel = HW_HORIZON then + ld_r(ld_r'left) <= '1'; else - i := i + 1; + ld_r(31) <= '1'; + end if; + ld_en <= '1'; + else + if hwsel /= HW_HORIZON then + -- there are 128 pixels in HBLANK + -- fetch one word in every pixel clock when 64 sprites/line used (HORIZON) + -- fetch one word in every two pixels when 32 sprites/line in use (every other games) + ld_en <= not ld_en; + end if; + if ld_en = '1' then + if hwsel = HW_HORIZON then + ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left); + else + ld_r(31 downto 0) <= ld_r(30 downto 0) & ld_r(31); + end if; + if (i = 31 and hwsel /= HW_HORIZON) or i = N_SPRITES-1 then + i := 0; + else + i := i + 1; + end if; end if; end if; row_a <= ctl_o(i).a; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index 91a63729..d6b3d8d1 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -41,6 +41,7 @@ architecture SYN of spritectl is alias clk_ena : std_logic is video_ctl.clk_ena; signal rowStore : std_logic_vector(47 downto 0); -- saved row of spt to show during visibile period + signal ld_r : std_logic; begin @@ -64,6 +65,7 @@ begin if rising_edge(clk) then if clk_ena = '1' then + ld_r <= ctl_i.ld; if video_ctl.hblank = '1' then yMat := yMatNext; else @@ -126,7 +128,7 @@ begin end if; end if; -- hblank='0' - if ctl_i.ld = '1' then + if ctl_i.ld = '1' and ld_r = '0' then xMat := false; ctl_o.a(4) <= not ctl_o.a(4); -- switch sprite half if yMat then From 33078f6ce8bcd6dd97710848fd2c03c7bc3e7a9a Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Fri, 13 Mar 2020 16:26:49 +0100 Subject: [PATCH 32/35] IremM62: add second tilemap for all, except Lot Lot --- .../IremM62 Hardware/meta/Kid Niki.mra | 14 +- .../IremM62 Hardware/meta/Spelunker 2.mra | 9 +- .../IremM62 Hardware/meta/Spelunker.mra | 12 +- .../IremM62 Hardware/meta/Youjyudn.mra | 12 +- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 69 +++++++- .../IremM62 Hardware/rtl/tilemapctl.vhd | 160 +++++++++++++----- 6 files changed, 208 insertions(+), 68 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra b/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra index 7d415c04..5ad3dd77 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra @@ -5,7 +5,7 @@ Irem iremm62 7 - + @@ -54,10 +54,10 @@ - + - - + + @@ -70,8 +70,10 @@ - - FF + + + + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra b/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra index e5bac53a..2cc69d13 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra @@ -5,7 +5,7 @@ Irem iremm62 0A - + @@ -57,10 +57,10 @@ - + - - + + @@ -71,7 +71,6 @@ - diff --git a/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra b/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra index 6c3b11d4..9e796c7e 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra @@ -5,7 +5,7 @@ Irem iremm62 9 - + @@ -61,10 +61,10 @@ - + - - + + @@ -78,7 +78,9 @@ - FF + + + diff --git a/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra b/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra index 43dbbed0..230ebd45 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra @@ -5,7 +5,7 @@ Irem iremm62 0B - + @@ -55,10 +55,10 @@ - + - - + + @@ -72,7 +72,9 @@ - FF + + + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 24826006..5963d17e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -137,7 +137,11 @@ architecture SYN of platform is signal pal_b_q : std_logic_vector(7 downto 0); signal pal2_r_wr : std_logic; + signal pal2_g_wr : std_logic; + signal pal2_b_wr : std_logic; signal pal2_r_q : std_logic_vector(7 downto 0); + signal pal2_g_q : std_logic_vector(7 downto 0); + signal pal2_b_q : std_logic_vector(7 downto 0); signal tilemap2_pal_a : std_logic_vector(7 downto 0); -- other signals @@ -546,6 +550,7 @@ begin end process; graphics_o.bit16(0) <= scrollram_d_o when hwsel = HW_HORIZON else m62_hscroll; graphics_o.bit16(1) <= m62_vscroll; + graphics_o.bit16(2) <= m62_vscroll2; end block BLK_SCROLL; @@ -634,7 +639,7 @@ begin alias cram_a : std_logic_vector(11 downto 0) is vram_a; begin - textram_a <= '0' & cpu_a(10 downto 0) when hwsel = HW_BATTROAD else cpu_a(11 downto 0); + textram_a <= '0' & cpu_a(10 downto 0) when hwsel = HW_BATTROAD or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 or hwsel = HW_YOUJYUDN else cpu_a(11 downto 0); vram_a <= '0' & cpu_a(10 downto 0) when hwsel = HW_KUNGFUM else cpu_a(12 downto 1) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else @@ -731,7 +736,8 @@ begin -- tilemap 1 palette address tilemap1_pal_a <= spelunkr_palbank & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNKR else - spelunk2_palbank(0) & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNK2 else + spelunk2_palbank(0) & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNK2 and tilemap_i(2).set = '0' else + spelunk2_palbank(0) & tilemap_i(2).pal_a(6 downto 0) when hwsel = HW_SPELUNK2 and tilemap_i(2).set = '1' else '0' & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_BATTROAD else tilemap_i(1).pal_a(7 downto 0); @@ -820,11 +826,18 @@ begin -- tilemap 2 palette address -- Use this for Spelunk2's second blue ROM, too tilemap2_pal_a <= spelunk2_palbank(0) & tilemap_i(1).pal_a(6 downto 0) when hwsel = HW_SPELUNK2 else + '1' & tilemap_i(2).pal_a(6 downto 0) when hwsel = HW_YOUJYUDN else tilemap_i(2).pal_a(7 downto 0); - tilemap_o(2).rgb.r(9 downto 2) <= pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6); - tilemap_o(2).rgb.g(9 downto 2) <= pal2_r_q(5 downto 3) & pal2_r_q(5 downto 3) & pal2_r_q(5 downto 4); - tilemap_o(2).rgb.b(9 downto 2) <= pal2_r_q(2 downto 0) & pal2_r_q(2 downto 0) & pal2_r_q(2 downto 1); + tilemap_o(2).rgb.r(9 downto 2) <= pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6) & pal2_r_q(7 downto 6) when hwsel = HW_BATTROAD else + tilemap_o(1).rgb.r(9 downto 2) when hwsel = HW_SPELUNK2 else + pal2_r_q(3 downto 0) & pal2_r_q(3 downto 0); + tilemap_o(2).rgb.g(9 downto 2) <= pal2_r_q(5 downto 3) & pal2_r_q(5 downto 3) & pal2_r_q(5 downto 4) when hwsel = HW_BATTROAD else + tilemap_o(1).rgb.g(9 downto 2) when hwsel = HW_SPELUNK2 else + pal2_g_q(3 downto 0) & pal2_g_q(3 downto 0); + tilemap_o(2).rgb.b(9 downto 2) <= pal2_r_q(2 downto 0) & pal2_r_q(2 downto 0) & pal2_r_q(2 downto 1) when hwsel = HW_BATTROAD else + tilemap_o(1).rgb.b(9 downto 2) when hwsel = HW_SPELUNK2 else + pal2_b_q(3 downto 0) & pal2_b_q(3 downto 0); -- tilemap 2 palettes pal2_r : entity work.dpram @@ -850,6 +863,52 @@ begin ); pal2_r_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"6" else '0'; -- 600-6FF + pal2_g : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8, + widthad_b => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => pal2_g_wr, + data_b => dl_data, + q_b => open, + + clock_a => not clk_video, + address_a => tilemap2_pal_a, + wren_a => '0', + data_a => (others => 'X'), + q_a => pal2_g_q + ); + pal2_g_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"7" else '0'; -- 700-7FF + + pal2_b : entity work.dpram + generic map + ( + init_file => "", + widthad_a => 8, + widthad_b => 8 + ) + port map + ( + clock_b => clk_sys, + address_b => dl_addr(7 downto 0), + wren_b => pal2_b_wr, + data_b => dl_data, + q_b => open, + + clock_a => not clk_video, + address_a => tilemap2_pal_a, + wren_a => '0', + data_a => (others => 'X'), + q_a => pal2_b_q + ); + pal2_b_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"8" else '0'; -- 800-8FF + -- sprite palette address sprite_pal_a <= '0' & sprite_i.pal_a(6 downto 0) when hwsel = HW_LDRUN or diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index 19191fc3..a1454861 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -205,10 +205,12 @@ architecture TILEMAP_2 of tilemapCtl is signal x : std_logic_vector(video_ctl.x'range); signal y : std_logic_vector(video_ctl.y'range); - + + signal x12 : unsigned(3 downto 0); + signal xtile : unsigned(4 downto 0); + alias rot_en : std_logic is graphics_i.bit8(0)(0); - alias hscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(0); - alias vscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(1); + alias vscroll : std_logic_vector(15 downto 0) is graphics_i.bit16(2); begin @@ -216,14 +218,15 @@ begin --ctl_o.rgb.r <= x"aa"&"10"; -- not used - ctl_o.map_a(ctl_o.map_a'left downto 10) <= (others => '0'); - ctl_o.attr_a(ctl_o.attr_a'left downto 10) <= (others => '0'); + ctl_o.map_a(ctl_o.map_a'left downto 11) <= (others => '0'); + ctl_o.attr_a(ctl_o.attr_a'left downto 11) <= (others => '0'); ctl_o.tile_a(ctl_o.tile_a'left downto 15) <= (others => '0'); -- tilemap scroll x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 64 + 8) when hires = '1' else std_logic_vector(unsigned(video_ctl.x) - 256 + 8); - y <= std_logic_vector(unsigned(video_ctl.y) - 256 + 128) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else + y <= std_logic_vector(unsigned(video_ctl.y) - 256) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else + std_logic_vector(unsigned(video_ctl.y) - 256 + 128 + unsigned(vscroll(8 downto 0))) when hwsel = HW_KIDNIKI else std_logic_vector(unsigned(video_ctl.y) - 256); -- generate pixel @@ -235,52 +238,125 @@ begin variable pel : std_logic_vector(2 downto 0); begin - + if rising_edge(clk) then if clk_ena = '1' then - -- 1st stage of pipeline - -- - set tilemap, attribute address - if x(2 downto 0) = "000" then + ctl_o.tile_a(14) <= '0'; + + if hwsel = HW_BATTROAD then -- 8x8 tiles, 32x32 tilemap - ctl_o.map_a(9 downto 5) <= y(7 downto 3); - ctl_o.attr_a(9 downto 5) <= y(7 downto 3); - ctl_o.map_a(4 downto 0) <= x(7 downto 3); - ctl_o.attr_a(4 downto 0) <= x(7 downto 3); - end if; - -- 2nd stage of pipeline - -- - set tile address - if x(2 downto 0) = "001" then - ctl_o.tile_a(14) <= '0'; - ctl_o.tile_a(13) <= '0'; - ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(6) & ctl_i.attr_d(4); - ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); - ctl_o.tile_a(2 downto 0) <= y(2 downto 0); - end if; + -- 1st stage of pipeline + -- - set tilemap, attribute address + if x(2 downto 0) = "000" then + ctl_o.map_a(10 downto 5) <= '0' & y(7 downto 3); + ctl_o.attr_a(10 downto 5) <= '0' & y(7 downto 3); + ctl_o.map_a(4 downto 0) <= x(7 downto 3); + ctl_o.attr_a(4 downto 0) <= x(7 downto 3); + end if; - -- 3rd stage of pipeline - -- - read tile, attribute data from ROM - if x(2 downto 0) = "111" then - attr_d_r := ctl_i.attr_d(7 downto 0); - tile_d_r := ctl_i.tile_d(tile_d_r'range); - elsif stb = '1' then - tile_d_r := tile_d_r(tile_d_r'left-1 downto 0) & '0'; - end if; + -- 2nd stage of pipeline + -- - set tile address + if x(2 downto 0) = "001" then + ctl_o.tile_a(13 downto 11) <= '0' & ctl_i.attr_d(6) & ctl_i.attr_d(4); + ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); + ctl_o.tile_a(2 downto 0) <= y(2 downto 0); + end if; - -- extract R,G,B from colour palette - pel := tile_d_r(tile_d_r'left-16) & tile_d_r(tile_d_r'left-8) & tile_d_r(tile_d_r'left); + -- 3rd stage of pipeline + -- - read tile, attribute data from ROM + if x(2 downto 0) = "111" then + attr_d_r := ctl_i.attr_d(7 downto 0); + tile_d_r := ctl_i.tile_d(tile_d_r'range); + elsif stb = '1' then + tile_d_r := tile_d_r(tile_d_r'left-1 downto 0) & '0'; + end if; - ctl_o.pal_a <= "00" & attr_d_r(3 downto 0) & pel(1 downto 0); - ctl_o.set <= '0'; -- default - if hwsel = HW_BATTROAD and pel /= "000" then --- pal_rgb(0)(7 downto 5) /= "000" or --- pal_rgb(1)(7 downto 5) /= "000" or --- pal_rgb(2)(7 downto 5) /= "000" then --- if graphics_i.bit8(0)(3) = '1' then + -- extract R,G,B from colour palette + pel := tile_d_r(tile_d_r'left-16) & tile_d_r(tile_d_r'left-8) & tile_d_r(tile_d_r'left); + + ctl_o.pal_a <= "00" & attr_d_r(3 downto 0) & pel(1 downto 0); + ctl_o.set <= '0'; -- default + if pel /= "000" then ctl_o.set <= '1'; + end if; + + elsif hwsel = HW_KIDNIKI or hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 or hwsel = HW_YOUJYUDN then + -- 12x8 tiles, 32x32(64) tilemap + + -- 1st stage of pipeline + -- - set tilemap, attribute address + if x12 = "0000" then + if hwsel = HW_KIDNIKI then + ctl_o.map_a(10 downto 5) <= y(8 downto 3); + ctl_o.attr_a(10 downto 5) <= y(8 downto 3); + else + ctl_o.map_a(10 downto 5) <= '0' & y(7 downto 3); + ctl_o.attr_a(10 downto 5) <= '0' & y(7 downto 3); + end if; + ctl_o.map_a(4 downto 0) <= std_logic_vector(xtile); + ctl_o.attr_a(4 downto 0) <= std_logic_vector(xtile); + end if; + + -- 2nd stage of pipeline + -- - set tile address + if x12 = "0001" then + if hwsel = HW_KIDNIKI or hwsel = HW_YOUJYUDN then + ctl_o.tile_a(13 downto 12) <= ctl_i.attr_d(7 downto 6); + ctl_o.tile_a(11 downto 4) <= ctl_i.map_d(7 downto 0); + ctl_o.tile_a(3) <= '0'; + else + ctl_o.tile_a(13) <= '0'; + ctl_o.tile_a(12) <= ctl_i.attr_d(4); + ctl_o.tile_a(11) <= '0'; + ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0); + end if; + ctl_o.tile_a(2 downto 0) <= y(2 downto 0); + end if; + + if x12 = "0100" then + -- switch to second 8 pixels of the tile + if hwsel = HW_KIDNIKI or hwsel = HW_YOUJYUDN then + ctl_o.tile_a(3) <= '1'; + else + ctl_o.tile_a(11) <= '1'; + end if; + end if; + + -- 3rd stage of pipeline + -- - read tile, attribute data from ROM + if x12 = "0100" or x12 = "1000" then + attr_d_r := ctl_i.attr_d(7 downto 0); + tile_d_r := ctl_i.tile_d(tile_d_r'range); + elsif stb = '1' then + tile_d_r := tile_d_r(tile_d_r'left-1 downto 0) & '0'; + end if; + + -- extract R,G,B from colour palette + pel := tile_d_r(tile_d_r'left-16) & tile_d_r(tile_d_r'left-8) & tile_d_r(tile_d_r'left); + + ctl_o.pal_a <= attr_d_r(4 downto 0) & pel(2 downto 0); + ctl_o.set <= '0'; -- default + if pel /= "000" then + ctl_o.set <= '1'; + end if; + + -- advance pixel/tile counters + if (hwsel = HW_KIDNIKI and video_ctl.x = "000"&x"FF") or + (hwsel = HW_YOUJYUDN and video_ctl.x = "000"&x"BB") or + (hwsel /= HW_KIDNIKI and hwsel /= HW_YOUJYUDN and video_ctl.x = "000"&x"F7") + then + xtile <= (others => '0'); + x12 <= (others => '0'); + elsif x12 = x"B" then + xtile <= xtile + 1; + x12 <= "0000"; + else + x12 <= x12 + 1; + end if; + end if; --- end if; end if; -- clk_ena end if; -- rising_edge_clk From 82869e13324165feb533162d4528b8bda727157d Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Fri, 13 Mar 2020 16:27:39 +0100 Subject: [PATCH 33/35] IremM62: add missing signal, skeleton code for DIPs --- .../IremM62 Hardware/rtl/IremM62_MiST.sv | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index cfa1efcf..01565c3e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -48,6 +48,33 @@ wire [1:0] scanlines = status[4:3]; wire blend = status[5]; wire service = status[6]; +reg [1:0] orientation = 2'b10; + +always @(*) begin + orientation = 2'b10; + case (core_mod) + 7'h0: ;// LDRUN + 7'h1: ;// LDRUN2 + 7'h2: ;// LDRUN3 + 7'h3: ;// LDRUN4 + 7'h4: ;// KUNGFUM + 7'h5: ;// HORIZON + 7'h6: // BATTROAD + begin + orientation = 2'b11; + end + 7'h7: ;// KIDNIKI + 7'h8: ;// LOTLOT + 7'h9: ;// SPELUNKR + 7'hA: ;// SPELUNK2 + 7'hB: // YOUJYUDN + begin + orientation = 2'b01; + end + default: ; + endcase +end + assign LED = ~ioctl_downl; assign SDRAM_CLK = clk_sd; assign SDRAM_CKE = 1; @@ -111,6 +138,8 @@ wire [14:0] chr1_addr; wire [31:0] chr1_do; wire [15:0] sp_addr; wire [31:0] sp_do; +wire [14:0] chr2_addr; +wire [31:0] chr2_do; /* ROM structure 00000-1FFFF CPU1 128k @@ -178,6 +207,8 @@ sdram sdram( .chr1_addr ( chr1_addr ), .chr1_q ( chr1_do ), + .chr2_addr ( 17'h18000 + chr2_addr ), + .chr2_q ( chr2_do ), .sp_addr ( 16'h8000 + sp_addr ), .sp_q ( sp_do ) ); @@ -262,6 +293,8 @@ target_top target_top( .snd_vma(snd_vma), .gfx1_addr(chr1_addr), .gfx1_do(chr1_do), + .gfx3_addr(chr2_addr), + .gfx3_do(chr2_do), .gfx2_addr(sp_addr), .gfx2_do(sp_do) ); @@ -315,7 +348,7 @@ arcade_inputs inputs ( .joystick_0 ( joystick_0 ), .joystick_1 ( joystick_1 ), .rotate ( rotate ), - .orientation ( 2'b10 ), + .orientation ( orientation ), .joyswap ( 1'b0 ), .oneplayer ( 1'b1 ), .controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ), From b7b98ab13ad1f68bf987178e9d63480f3bc7ef54 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Fri, 13 Mar 2020 16:42:59 +0100 Subject: [PATCH 34/35] IremM62: add a PAL mode switch --- Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 2 ++ Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv | 3 +++ .../IremM62 Hardware/rtl/iremm62_video_controller.vhd | 8 ++++++-- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 2 ++ Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd | 2 ++ 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index 0beb114e..98d367e6 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -16,6 +16,7 @@ entity Graphics is ( hwsel : in HWSEL_t; hires : in std_logic; + palmode : in std_logic; sprite_prom : in prom_a(0 to 31); bitmap_ctl_i : in to_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); @@ -78,6 +79,7 @@ begin -- clocking etc video_i => video_i, hwsel => hwsel, + palmode => palmode, hires => hires, -- video data signals (in) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 01565c3e..9e4d628f 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -36,6 +36,7 @@ wire [6:0] core_mod; localparam CONF_STR = { `CORE_NAME,";;", "O2,Rotate Controls,Off,On;", + "O1,Video Timings,Original,PAL 50Hz;", "O34,Scanlines,Off,25%,50%,75%;", "O5,Blending,Off,On;", "O6,Service,Off,On;", @@ -43,6 +44,7 @@ localparam CONF_STR = { "V,v1.0.",`BUILD_DATE }; +wire palmode = status[1]; wire rotate = status[2]; wire [1:0] scanlines = status[4:3]; wire blend = status[5]; @@ -258,6 +260,7 @@ target_top target_top( .clk_aud(clk_aud),//0.895MHz .reset_in(reset), .hwsel(core_mod), + .palmode(palmode), .audio_out(audio), .usr_coin1(m_coin1), .usr_coin2(m_coin2), diff --git a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd index 07c87cba..0279faa7 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/iremm62_video_controller.vhd @@ -12,6 +12,7 @@ entity iremm62_video_controller is -- clocking etc video_i : in from_VIDEO_t; hwsel : in HWSEL_t; + palmode : in std_logic; hires : in std_logic; -- video input data @@ -59,8 +60,11 @@ begin hcnt <= "00"&x"80"; vcnt <= vcnt + 1; if vcnt = '1'&x"FF" then --- vcnt <= '0'&x"E6"; -- from M52 schematics - vcnt <= '0'&x"C8"; -- 312 lines/PAL 50 Hz + if palmode = '1' then + vcnt <= '0'&x"C8"; -- 312 lines/PAL 50 Hz + else + vcnt <= '0'&x"E6"; -- from M52 schematics + end if; end if; end if; end if; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index 799a2951..9de02abc 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -20,6 +20,7 @@ entity PACE is -- hardware variant hwsel : in HWSEL_t; + palmode : in std_logic; hires : in std_logic; -- misc I/O @@ -163,6 +164,7 @@ begin ( hwsel => hwsel, hires => hires, + palmode => palmode, sprite_prom => sprite_prom, bitmap_ctl_i => to_bitmap_ctl, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index d0989d42..07a167b8 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -15,6 +15,7 @@ entity target_top is port( clk_aud : in std_logic; reset_in : in std_logic; hwsel : in HWSEL_t; + palmode : in std_logic; audio_out : out std_logic_vector(11 downto 0); usr_coin1 : in std_logic; usr_coin2 : in std_logic; @@ -147,6 +148,7 @@ pace_inst : entity work.pace clkrst_i => clkrst_i, cpu_clk_en_i => cpu_clk_en, hwsel => hwsel, + palmode => palmode, hires => hires, buttons_i => buttons_i, switches_i => switches_i, From 1320b05a40837b63d28fc5ba07fd7f881a62ffc6 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Fri, 13 Mar 2020 16:50:04 +0100 Subject: [PATCH 35/35] IremM62: Add a README --- Arcade_MiST/IremM62 Hardware/README.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Arcade_MiST/IremM62 Hardware/README.txt diff --git a/Arcade_MiST/IremM62 Hardware/README.txt b/Arcade_MiST/IremM62 Hardware/README.txt new file mode 100644 index 00000000..797e18ee --- /dev/null +++ b/Arcade_MiST/IremM62 Hardware/README.txt @@ -0,0 +1,13 @@ +Irem M62 Hardware +================= + +Based on old PACE code by Mark McDougall(tcdev), enhanced by Gyorgy Szombathelyi in March 2020. + +Games supported: +- Lode Runner 1-4 +- Kung Fu Master +- Horizon +- Battle Road +- Spelunker 1-2 +- Kid Niki +- Youjyudn