From 3503cd0d119b5f5901842dae53cf8dfd2b7c8a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Mart=C3=ADnez?= Date: Sun, 23 May 2021 19:39:10 +0200 Subject: [PATCH] test noise out of band --- Odyssey2.sv | 93 ++-- rtl/sp0256/74ls74.vhd | 34 -- rtl/sp0256/compressor.sv | 66 --- rtl/sp0256/compressor.v | 66 --- rtl/sp0256/fifo.vhd | 167 +++++++ rtl/sp0256/pll_thevoice.vhd | 383 ++++++++++++++++ rtl/sp0256/sp0256.vhd | 211 ++++----- rtl/sp0256/sp0256_003_decoded.vhd | 728 ------------------------------ rtl/sp0256/sp256_003.vhd | 18 +- rtl/vp_console.vhd | 160 ++++++- 10 files changed, 852 insertions(+), 1074 deletions(-) delete mode 100644 rtl/sp0256/74ls74.vhd delete mode 100644 rtl/sp0256/compressor.sv delete mode 100644 rtl/sp0256/compressor.v create mode 100644 rtl/sp0256/fifo.vhd create mode 100644 rtl/sp0256/pll_thevoice.vhd delete mode 100644 rtl/sp0256/sp0256_003_decoded.vhd diff --git a/Odyssey2.sv b/Odyssey2.sv index 2f4b886..7095a0f 100644 --- a/Odyssey2.sv +++ b/Odyssey2.sv @@ -202,9 +202,9 @@ assign {DDRAM_CLK, DDRAM_BURSTCNT, DDRAM_ADDR, DDRAM_DIN, DDRAM_BE, DDRAM_RD, DD assign VGA_F1 = 0; assign VGA_SCALER = 0; -assign LED_DISK = 0; +assign LED_DISK = ioctl_download; assign LED_POWER = 0; -assign LED_USER = ioctl_download; +assign LED_USER = 0; assign BUTTONS = 0; assign VIDEO_ARX = (!status[19:18]) ? (status[14] ? 12'd5 : 12'd4) : (status[19:18] - 1'd1); @@ -303,16 +303,21 @@ wire clock_locked; wire clk_2m5; wire clk_sys; -// pll pll -// ( -// .refclk(CLK_50M), -// .rst(0), -// //.outclk_0(clk_sys_o2), -// .outclk_0(clk_sys), -// .outclk_1(clk_sys_vp), -// .outclk_2(clk_2m5), -// .locked(clock_locked) -// ); + +////////////The Voice ///////////////////////////////////////////////// + + +wire clk_250k; + + +pll_thevoice pll_thevoice +( + .inclk0(CLK_50M), + .c0 (clk_250k), + .c1 (clk_2m5) +); + +//////////////////////////////////////////////////////////////////////// wire [63:0] reconfig_to_pll; wire [63:0] reconfig_from_pll; @@ -321,7 +326,7 @@ pll pll ( .refclk(CLK_50M), .rst(0), - .outclk_0(clk_2m5), + .outclk_0(), .outclk_1(clk_sys), .reconfig_to_pll(reconfig_to_pll), .reconfig_from_pll(reconfig_from_pll), @@ -459,6 +464,8 @@ vp_console vp .clk_i (clk_sys), .clk_cpu_en_i (clk_cpu_en), .clk_vdc_en_i (clk_vdc_en), + .clk_250k (clk_250k), + .clk_2m5 (clk_2m5), .res_n_i (~reset & joy_reset), // low to reset @@ -472,7 +479,7 @@ vp_console vp .cart_bs0_o (cart_bank_0), // Bank switch 0 .cart_bs1_o (cart_bank_1), // Bank Switch 1 .cart_psen_n_o (cart_rd_n), // Program Store Enable (read) - .cart_t0_i (kb_read_ack || !ldq), // KB/Voice ack + .cart_t0_i (), .cart_t0_o (), .cart_t0_dir_o (), // Char Rom data @@ -503,8 +510,13 @@ vp_console vp // Sound .snd_o (), - .snd_vec_o (snd) -); + .snd_vec_o (snd), + + //The voice + .voice_enable (VOICE), + .noise_voice_o (noise_voice), + .snd_voice_o (voice_out) +); //////////////////////////////////////////////////////////////////////// rom rom @@ -572,18 +584,18 @@ always @(*) //////////////////////////// SOUND //////////////////////////////////// wire [3:0] snd; +wire signed [15:0] voice_out; +wire signed [15:0] noise_voice; wire cart_wr_n; wire [7:0] cart_di; -// The Voice info: -// $80 to $FF voice writes -// Voice bank select: -// $E4 internal voice rom bank -// $E8, $E9, and $EA external rom banks -// T0_i high if SP0256 command buffer full +wire signed [14:0] sound_s = {1'b0,snd,snd,snd,2'b0}; +//wire signed [14:0] voice_s = VOICE ? {voice_out[9],voice_out[9:1],4'b0} : 14'b0; +wire signed [15:0] voice_s = VOICE ? {1'b0,voice_out[11:0],voice_out[15:10]} : 16'b0; -assign AUDIO_L = VOICE ? {4'b0,snd,snd,4'b0} + voice_out * 2 :{2'b0, snd, snd,6'b0};//{audio, 6'd0}; -assign AUDIO_R = AUDIO_L; +//assign AUDIO_L = sound_s + voice_s; +assign AUDIO_L = {voice_out[11:0],noise_voice[15:12]}; +assign AUDIO_R = snd; assign AUDIO_S = 1; assign AUDIO_MIX = 0; @@ -810,39 +822,6 @@ wire [1:0] joy_action = {~joya[4], ~joyb[4]}; wire joy_reset = ~joya[5] & ~joyb[5]; - -////////////The Voice ///////////////////////////////////////////////// - - -reg signed [9:0] voice_out; -wire ldq; - - -sp0256 sp0256 ( - .clk_2m5 (clk_2m5), - .reset (rst_a_n), - .lrq (ldq), - .data_in (rom_addr[6:0]), - .ald (ald), - .audio_out (voice_out) -); - - - -wire ald = !rom_addr[7] | cart_wr_n | cart_cs; -wire rst_a_n; - - - -ls74 ls74 -( - .d (cart_di[5]), - .clr (VOICE? 1'b1: 1'b0), - .q (rst_a_n), - .pre (1'b1), - .clk (ald) -); - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // LUT using calibrated palette diff --git a/rtl/sp0256/74ls74.vhd b/rtl/sp0256/74ls74.vhd deleted file mode 100644 index 14d83c4..0000000 --- a/rtl/sp0256/74ls74.vhd +++ /dev/null @@ -1,34 +0,0 @@ --- --- 74LS74 --- - - -library ieee; -use ieee.std_logic_1164.all; - - -ENTITY ls74 IS -PORT(d, - clr, - pre, - clk : IN std_logic; - q : OUT std_logic); -END ls74; - -ARCHITECTURE behav OF ls74 IS -BEGIN - PROCESS(clk, clr, pre) - BEGIN - IF clr = '0' THEN - q <= '0' AFTER 25 ns; - ELSIF pre = '0' THEN - q <= '1' AFTER 13 ns; - ELSIF clk'EVENT AND clk = '1' THEN - IF d = '1' THEN - q <= '1' AFTER 13 ns; - ELSE - q <= '0' AFTER 25 ns; - END IF; - END IF; - END PROCESS; -END behav; diff --git a/rtl/sp0256/compressor.sv b/rtl/sp0256/compressor.sv deleted file mode 100644 index 3289b45..0000000 --- a/rtl/sp0256/compressor.sv +++ /dev/null @@ -1,66 +0,0 @@ -//============================================================================ -// Audio compressor (signed samples) -// -// Copyright (C) 2018 Sorgelig -// -// 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 2 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, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -//============================================================================ - -module compressor -( - input clk, - input [9:0] din, - output [8:0] dout -); - -always @(posedge clk) dout <= {din[9], din[9] ? ~tbl[~din[8:0]] : tbl[din[8:0]]}; - -wire [7:0] tbl[0:511] = -'{ - 8'h00, 8'h01, 8'h02, 8'h03, 8'h04, 8'h06, 8'h07, 8'h08, 8'h09, 8'h0B, 8'h0C, 8'h0D, 8'h0E, 8'h0F, 8'h11, 8'h12, - 8'h13, 8'h14, 8'h16, 8'h17, 8'h18, 8'h19, 8'h1B, 8'h1C, 8'h1D, 8'h1E, 8'h1F, 8'h21, 8'h22, 8'h23, 8'h24, 8'h25, - 8'h27, 8'h28, 8'h29, 8'h2A, 8'h2C, 8'h2D, 8'h2E, 8'h2F, 8'h30, 8'h32, 8'h33, 8'h34, 8'h35, 8'h36, 8'h37, 8'h39, - 8'h3A, 8'h3B, 8'h3C, 8'h3D, 8'h3F, 8'h40, 8'h41, 8'h42, 8'h43, 8'h44, 8'h46, 8'h47, 8'h48, 8'h49, 8'h4A, 8'h4B, - 8'h4D, 8'h4E, 8'h4F, 8'h50, 8'h51, 8'h52, 8'h53, 8'h55, 8'h56, 8'h57, 8'h58, 8'h59, 8'h5A, 8'h5B, 8'h5C, 8'h5E, - 8'h5F, 8'h60, 8'h61, 8'h62, 8'h63, 8'h64, 8'h65, 8'h66, 8'h67, 8'h69, 8'h6A, 8'h6B, 8'h6C, 8'h6D, 8'h6E, 8'h6F, - 8'h70, 8'h71, 8'h72, 8'h73, 8'h74, 8'h75, 8'h76, 8'h77, 8'h78, 8'h79, 8'h7A, 8'h7B, 8'h7C, 8'h7D, 8'h7E, 8'h7F, - 8'h80, 8'h81, 8'h82, 8'h83, 8'h84, 8'h85, 8'h86, 8'h87, 8'h88, 8'h89, 8'h8A, 8'h8B, 8'h8C, 8'h8D, 8'h8E, 8'h8F, - 8'h90, 8'h91, 8'h92, 8'h93, 8'h94, 8'h95, 8'h96, 8'h96, 8'h97, 8'h98, 8'h99, 8'h9A, 8'h9B, 8'h9C, 8'h9D, 8'h9E, - 8'h9E, 8'h9F, 8'hA0, 8'hA1, 8'hA2, 8'hA3, 8'hA4, 8'hA4, 8'hA5, 8'hA6, 8'hA7, 8'hA8, 8'hA9, 8'hA9, 8'hAA, 8'hAB, - 8'hAC, 8'hAD, 8'hAD, 8'hAE, 8'hAF, 8'hB0, 8'hB1, 8'hB1, 8'hB2, 8'hB3, 8'hB4, 8'hB4, 8'hB5, 8'hB6, 8'hB7, 8'hB7, - 8'hB8, 8'hB9, 8'hB9, 8'hBA, 8'hBB, 8'hBC, 8'hBC, 8'hBD, 8'hBE, 8'hBE, 8'hBF, 8'hC0, 8'hC0, 8'hC1, 8'hC2, 8'hC2, - 8'hC3, 8'hC4, 8'hC4, 8'hC5, 8'hC6, 8'hC6, 8'hC7, 8'hC8, 8'hC8, 8'hC9, 8'hC9, 8'hCA, 8'hCB, 8'hCB, 8'hCC, 8'hCC, - 8'hCD, 8'hCE, 8'hCE, 8'hCF, 8'hCF, 8'hD0, 8'hD0, 8'hD1, 8'hD2, 8'hD2, 8'hD3, 8'hD3, 8'hD4, 8'hD4, 8'hD5, 8'hD5, - 8'hD6, 8'hD6, 8'hD7, 8'hD7, 8'hD8, 8'hD8, 8'hD9, 8'hD9, 8'hDA, 8'hDA, 8'hDB, 8'hDB, 8'hDC, 8'hDC, 8'hDD, 8'hDD, - 8'hDE, 8'hDE, 8'hDE, 8'hDF, 8'hDF, 8'hE0, 8'hE0, 8'hE1, 8'hE1, 8'hE1, 8'hE2, 8'hE2, 8'hE3, 8'hE3, 8'hE3, 8'hE4, - 8'hE4, 8'hE5, 8'hE5, 8'hE5, 8'hE6, 8'hE6, 8'hE6, 8'hE7, 8'hE7, 8'hE7, 8'hE8, 8'hE8, 8'hE9, 8'hE9, 8'hE9, 8'hEA, - 8'hEA, 8'hEA, 8'hEA, 8'hEB, 8'hEB, 8'hEB, 8'hEC, 8'hEC, 8'hEC, 8'hED, 8'hED, 8'hED, 8'hEE, 8'hEE, 8'hEE, 8'hEE, - 8'hEF, 8'hEF, 8'hEF, 8'hEF, 8'hF0, 8'hF0, 8'hF0, 8'hF0, 8'hF1, 8'hF1, 8'hF1, 8'hF1, 8'hF2, 8'hF2, 8'hF2, 8'hF2, - 8'hF3, 8'hF3, 8'hF3, 8'hF3, 8'hF3, 8'hF4, 8'hF4, 8'hF4, 8'hF4, 8'hF4, 8'hF5, 8'hF5, 8'hF5, 8'hF5, 8'hF5, 8'hF6, - 8'hF6, 8'hF6, 8'hF6, 8'hF6, 8'hF6, 8'hF7, 8'hF7, 8'hF7, 8'hF7, 8'hF7, 8'hF7, 8'hF8, 8'hF8, 8'hF8, 8'hF8, 8'hF8, - 8'hF8, 8'hF8, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hFA, 8'hFA, 8'hFA, 8'hFA, 8'hFA, 8'hFA, - 8'hFA, 8'hFA, 8'hFA, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFC, 8'hFC, - 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFD, 8'hFD, 8'hFD, - 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, - 8'hFD, 8'hFD, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFF -}; - -endmodule diff --git a/rtl/sp0256/compressor.v b/rtl/sp0256/compressor.v deleted file mode 100644 index 20e8934..0000000 --- a/rtl/sp0256/compressor.v +++ /dev/null @@ -1,66 +0,0 @@ -//============================================================================ -// Audio compressor (signed samples) -// -// Copyright (C) 2018 Sorgelig -// -// 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 2 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, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -//============================================================================ - -module compressor -( - input wire clk, - input wire [9:0] din, - output reg [8:0] dout -); - -always @(posedge clk) dout <= {din[9], din[9] ? ~tbl[~din[8:0]] : tbl[din[8:0]]}; - -wire [7:0] tbl[0:511] = -{ - 8'h00, 8'h01, 8'h02, 8'h03, 8'h04, 8'h06, 8'h07, 8'h08, 8'h09, 8'h0B, 8'h0C, 8'h0D, 8'h0E, 8'h0F, 8'h11, 8'h12, - 8'h13, 8'h14, 8'h16, 8'h17, 8'h18, 8'h19, 8'h1B, 8'h1C, 8'h1D, 8'h1E, 8'h1F, 8'h21, 8'h22, 8'h23, 8'h24, 8'h25, - 8'h27, 8'h28, 8'h29, 8'h2A, 8'h2C, 8'h2D, 8'h2E, 8'h2F, 8'h30, 8'h32, 8'h33, 8'h34, 8'h35, 8'h36, 8'h37, 8'h39, - 8'h3A, 8'h3B, 8'h3C, 8'h3D, 8'h3F, 8'h40, 8'h41, 8'h42, 8'h43, 8'h44, 8'h46, 8'h47, 8'h48, 8'h49, 8'h4A, 8'h4B, - 8'h4D, 8'h4E, 8'h4F, 8'h50, 8'h51, 8'h52, 8'h53, 8'h55, 8'h56, 8'h57, 8'h58, 8'h59, 8'h5A, 8'h5B, 8'h5C, 8'h5E, - 8'h5F, 8'h60, 8'h61, 8'h62, 8'h63, 8'h64, 8'h65, 8'h66, 8'h67, 8'h69, 8'h6A, 8'h6B, 8'h6C, 8'h6D, 8'h6E, 8'h6F, - 8'h70, 8'h71, 8'h72, 8'h73, 8'h74, 8'h75, 8'h76, 8'h77, 8'h78, 8'h79, 8'h7A, 8'h7B, 8'h7C, 8'h7D, 8'h7E, 8'h7F, - 8'h80, 8'h81, 8'h82, 8'h83, 8'h84, 8'h85, 8'h86, 8'h87, 8'h88, 8'h89, 8'h8A, 8'h8B, 8'h8C, 8'h8D, 8'h8E, 8'h8F, - 8'h90, 8'h91, 8'h92, 8'h93, 8'h94, 8'h95, 8'h96, 8'h96, 8'h97, 8'h98, 8'h99, 8'h9A, 8'h9B, 8'h9C, 8'h9D, 8'h9E, - 8'h9E, 8'h9F, 8'hA0, 8'hA1, 8'hA2, 8'hA3, 8'hA4, 8'hA4, 8'hA5, 8'hA6, 8'hA7, 8'hA8, 8'hA9, 8'hA9, 8'hAA, 8'hAB, - 8'hAC, 8'hAD, 8'hAD, 8'hAE, 8'hAF, 8'hB0, 8'hB1, 8'hB1, 8'hB2, 8'hB3, 8'hB4, 8'hB4, 8'hB5, 8'hB6, 8'hB7, 8'hB7, - 8'hB8, 8'hB9, 8'hB9, 8'hBA, 8'hBB, 8'hBC, 8'hBC, 8'hBD, 8'hBE, 8'hBE, 8'hBF, 8'hC0, 8'hC0, 8'hC1, 8'hC2, 8'hC2, - 8'hC3, 8'hC4, 8'hC4, 8'hC5, 8'hC6, 8'hC6, 8'hC7, 8'hC8, 8'hC8, 8'hC9, 8'hC9, 8'hCA, 8'hCB, 8'hCB, 8'hCC, 8'hCC, - 8'hCD, 8'hCE, 8'hCE, 8'hCF, 8'hCF, 8'hD0, 8'hD0, 8'hD1, 8'hD2, 8'hD2, 8'hD3, 8'hD3, 8'hD4, 8'hD4, 8'hD5, 8'hD5, - 8'hD6, 8'hD6, 8'hD7, 8'hD7, 8'hD8, 8'hD8, 8'hD9, 8'hD9, 8'hDA, 8'hDA, 8'hDB, 8'hDB, 8'hDC, 8'hDC, 8'hDD, 8'hDD, - 8'hDE, 8'hDE, 8'hDE, 8'hDF, 8'hDF, 8'hE0, 8'hE0, 8'hE1, 8'hE1, 8'hE1, 8'hE2, 8'hE2, 8'hE3, 8'hE3, 8'hE3, 8'hE4, - 8'hE4, 8'hE5, 8'hE5, 8'hE5, 8'hE6, 8'hE6, 8'hE6, 8'hE7, 8'hE7, 8'hE7, 8'hE8, 8'hE8, 8'hE9, 8'hE9, 8'hE9, 8'hEA, - 8'hEA, 8'hEA, 8'hEA, 8'hEB, 8'hEB, 8'hEB, 8'hEC, 8'hEC, 8'hEC, 8'hED, 8'hED, 8'hED, 8'hEE, 8'hEE, 8'hEE, 8'hEE, - 8'hEF, 8'hEF, 8'hEF, 8'hEF, 8'hF0, 8'hF0, 8'hF0, 8'hF0, 8'hF1, 8'hF1, 8'hF1, 8'hF1, 8'hF2, 8'hF2, 8'hF2, 8'hF2, - 8'hF3, 8'hF3, 8'hF3, 8'hF3, 8'hF3, 8'hF4, 8'hF4, 8'hF4, 8'hF4, 8'hF4, 8'hF5, 8'hF5, 8'hF5, 8'hF5, 8'hF5, 8'hF6, - 8'hF6, 8'hF6, 8'hF6, 8'hF6, 8'hF6, 8'hF7, 8'hF7, 8'hF7, 8'hF7, 8'hF7, 8'hF7, 8'hF8, 8'hF8, 8'hF8, 8'hF8, 8'hF8, - 8'hF8, 8'hF8, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hF9, 8'hFA, 8'hFA, 8'hFA, 8'hFA, 8'hFA, 8'hFA, - 8'hFA, 8'hFA, 8'hFA, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFB, 8'hFC, 8'hFC, - 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFC, 8'hFD, 8'hFD, 8'hFD, - 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, 8'hFD, - 8'hFD, 8'hFD, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, - 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFE, 8'hFF -}; - -endmodule diff --git a/rtl/sp0256/fifo.vhd b/rtl/sp0256/fifo.vhd new file mode 100644 index 0000000..1032726 --- /dev/null +++ b/rtl/sp0256/fifo.vhd @@ -0,0 +1,167 @@ +-- +-- TBBlue / ZX Spectrum Next project +-- +-- FIFO - Victor Trucco +-- +-- All rights reserved +-- +-- Rev 01 by Oduvaldo Pavan Junior +-- When HEAD hit top of memory, this is not buffer full +-- Buffer Full is when HEAD meet TAIL after a byte is pushed +-- This was causing false Buffer Full reporting when head hit top of memory +-- but TAIL was not in the bottom of memory +-- Changed signal name from loop_s to full_s in order to identify it better +-- +-- Now it works more like a real FIFO, you don't need to read data up to the +-- top so it is free again. If there is one byte free, you can push again even +-- if not all bytes have been pushed. +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS CODE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- + +library IEEE; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; + +entity FIFO is + Generic + ( + constant DATA_WIDTH : positive := 8; + constant FIFO_DEPTH : positive := 512 + ); + Port + ( + clock_i : in STD_LOGIC; + reset_i : in STD_LOGIC; + + -- input + fifo_we_i : in STD_LOGIC; + fifo_data_i : in STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0); + + -- output + fifo_read_i : in STD_LOGIC; + fifo_data_o : out STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0) := (others=>'0'); + + -- flags + fifo_empty_o : out STD_LOGIC; + fifo_full_o : out STD_LOGIC + ); +end FIFO; + +architecture Behavioral of FIFO is + type fifo_mem_t is array (0 to FIFO_DEPTH - 1) of STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0); + signal memory : fifo_mem_t; + + signal head_s : natural range 0 to FIFO_DEPTH - 1; + signal tail_s : natural range 0 to FIFO_DEPTH - 1; + + signal full_s : boolean := false; + signal read_edge : std_logic_vector(1 downto 0) :="00"; + signal write_edge : std_logic_vector(1 downto 0) :="00"; +begin + + -- Memory Pointer Process + fifo_proc : process (clock_i) + begin + + if rising_edge(clock_i) then + + if reset_i = '1' then + + head_s <= 0; + tail_s <= 0; + + full_s <= false; + + fifo_full_o <= '0'; + fifo_empty_o <= '1'; + + memory(0) <= (others=>'0'); + + else + + read_edge <= read_edge(0) & fifo_read_i; + if (read_edge = "01") then + --if (fifo_read_i = '1') then + + if ((full_s = true) or (head_s /= tail_s)) then + -- Update data output + fifo_data_o <= memory(tail_s); + + -- Update tail_s pointer as needed + if (tail_s = FIFO_DEPTH - 1) then + tail_s <= 0; + else + tail_s <= tail_s + 1; + end if; + full_s <= false; + end if; + + end if; + + write_edge <= write_edge(0) & fifo_we_i; + if (write_edge = "01") then + --if (fifo_we_i = '1') then + if (full_s = false) then + -- Write Data to memory + memory(head_s) <= fifo_data_i; + -- Increment head pointer as needed + if (head_s = FIFO_DEPTH - 1) then + head_s <= 0; + else + head_s <= head_s + 1; + end if; + -- Full? + if ( ((tail_s /= 0) and (head_s = tail_s -1)) or + ((tail_s = 0) and (head_s = FIFO_DEPTH - 1)) )then + full_s <= true; + end if; + end if; + end if; + + -- Update empty and full flags + if (full_s = true) then + fifo_full_o <= '1'; + else + fifo_full_o <= '0'; + end if; + + if ( (head_s = tail_s) and (full_s = false) ) then + fifo_empty_o <= '1'; + else + fifo_empty_o <= '0'; + end if; + + end if; + end if; + end process; + + + +end Behavioral; \ No newline at end of file diff --git a/rtl/sp0256/pll_thevoice.vhd b/rtl/sp0256/pll_thevoice.vhd new file mode 100644 index 0000000..e1de924 --- /dev/null +++ b/rtl/sp0256/pll_thevoice.vhd @@ -0,0 +1,383 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll_thevoice.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 17.0.2 Build 602 07/19/2017 SJ Lite Edition +-- ************************************************************ + + +--Copyright (C) 2017 Intel Corporation. All rights reserved. +--Your use of Intel 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 Intel Program License +--Subscription Agreement, the Intel Quartus Prime License Agreement, +--the Intel 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 Intel and sold by Intel or its +--authorized distributors. Please refer to the applicable +--agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY pll_thevoice IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC + ); +END pll_thevoice; + + +ARCHITECTURE SYN OF pll_thevoice IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire5_bv(0 DOWNTO 0) <= "0"; + sub_wire5 <= To_stdlogicvector(sub_wire5_bv); + sub_wire2 <= sub_wire0(1); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + c1 <= sub_wire2; + sub_wire3 <= inclk0; + sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 200, + clk0_duty_cycle => 50, + clk0_multiply_by => 1, + clk0_phase_shift => "0", + clk1_divide_by => 20, + clk1_duty_cycle => 50, + clk1_multiply_by => 1, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 20000, + intended_device_family => "Cyclone IV E", + lpm_hint => "CBX_MODULE_PREFIX=pll_thevoice", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire4, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "1" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "0.250000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "2.500000" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "50.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "1" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "0.25000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "2.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll_thevoice.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "200" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "20" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "20000" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone IV E" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_thevoice.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_thevoice.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_thevoice.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_thevoice.cmp TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_thevoice.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_thevoice_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/rtl/sp0256/sp0256.vhd b/rtl/sp0256/sp0256.vhd index 81bc260..181e8ba 100644 --- a/rtl/sp0256/sp0256.vhd +++ b/rtl/sp0256/sp0256.vhd @@ -9,15 +9,14 @@ --------------------------------------------------------------------------------- -- sp0256 (player) releases -- --- --- rev 1.1-rw - 28/01/2021 --- changed signals to be the same that the real thing and clock to 2.5Mhz +-- rev 0.0 - 14/04/2018 +-- play only sp0256-al2 (cmd 00-3F, 12 bits rom address) -- -- rev 1.0 - 23/07/2018 -- extend to play sp0256b_019 + spr128_003 (cmd 00-7F, 14 bits rom address) -- --- rev 0.0 - 14/04/2018 --- play only sp0256-al2 (cmd 00-3F, 12 bits rom address) +-- rev 2.0 - 26/07/2019 - by Victor Trucco +-- sound banks handling -- --------------------------------------------------------------------------------- -- @@ -119,28 +118,31 @@ use ieee.numeric_std.all; entity sp0256 is port ( - clk_2m5 : in std_logic; - reset : in std_logic; + clock_250k : in std_logic; + clock_2m5 : in std_logic; + reset : in std_logic; - lrq : out std_logic; - data_in : in std_logic_vector(6 downto 0); - ald : in std_logic; + input_rdy : out std_logic; + + allophone : in std_logic_vector(6 downto 0); + trig_allophone : in std_logic; - audio_out : out signed(9 downto 0) + noise_out : out signed(15 downto 0); + audio_out : out signed(15 downto 0) + + ); end sp0256; architecture syn of sp0256 is - signal clk_2m5_n : std_logic; - signal rom_addr : std_logic_vector(13 downto 0); - signal rom_do : std_logic_vector( 7 downto 0); - signal bank : std_logic_vector( 1 downto 0); + signal clock_250k_n : std_logic; + signal rom_addr : std_logic_vector(13 downto 0); + signal rom_do : std_logic_vector( 7 downto 0); + signal bank : std_logic_vector( 1 downto 0); + + signal stage : integer range 0 to 249; -- stage counter 0-24; - signal stage : integer range 0 to 24; -- stage counter 0-24; - signal stage_t : integer; - signal stage_r : integer; - signal allophone : std_logic_vector(6 downto 0); signal allo_entry : std_logic_vector(8 downto 0); signal allo_addr_lsb, allo_addr_msb : std_logic_vector(7 downto 0); signal allo_nb_line : std_logic_vector(7 downto 0); @@ -152,11 +154,10 @@ architecture syn of sp0256 is signal sum_in1,sum_out_ul : signed(15 downto 0); signal sum_out : signed(15 downto 0); signal divider : std_logic; - signal audio : signed(9 downto 0); - signal audio_int : signed(8 downto 0); - + signal audio : signed(15 downto 0); + signal is_noise : std_logic; - signal noise_rng : std_logic_vector(15 downto 0) := X"0001"; + signal noise_rng : std_logic_vector(16 downto 0) := "00000000000000001"; signal f0_z1,f0_z2 : signed(15 downto 0); signal f1_z1,f1_z2 : signed(15 downto 0); @@ -165,9 +166,9 @@ architecture syn of sp0256 is signal f4_z1,f4_z2 : signed(15 downto 0); signal f5_z1,f5_z2 : signed(15 downto 0); - signal lrq_in : std_logic; + signal input_rdy_in : std_logic; signal sound_on : std_logic := '0'; - signal ald_r : std_logic; + signal trig_allophone_r : std_logic; signal line_cnt, rpt_cnt, per_cnt : std_logic_vector(7 downto 0); signal coeff_idx : std_logic_vector(6 downto 0); @@ -191,73 +192,62 @@ architecture syn of sp0256 is 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511); - -component compressor is port - ( - clk : in std_logic; - din : in signed(9 downto 0); - dout : out signed(8 downto 0) - ); - - -end component; - begin -lrq <= lrq_in; -clk_2m5_n <= not clk_2m5; -stage <= stage_t / 10; +input_rdy <= input_rdy_in; +clock_250k_n <= not clock_250k; -- stage counter : Fs=250k/25 = 10kHz -process (clk_2m5, reset) +process (clock_250k, reset) begin - if reset='0' then - stage_t <= 0; + if reset='1' then + stage <= 0; else - if rising_edge(clk_2m5) then - if stage_t >= 249 then - stage_t <= 0; + if rising_edge(clock_250k) then + if stage >= 61 then + stage <= 0; else - stage_t <= stage_t + 1; + stage <= stage + 1; end if; end if; end if; end process; -process (clk_2m5, reset) +process (clock_250k, reset) begin - if reset='0' then - lrq_in <= '1'; + if reset='1' then + input_rdy_in <= '1'; sound_on <= '0'; - noise_rng <= X"0001"; + noise_rng <= "00000000000000001"; bank <= "00"; else - if rising_edge(clk_2m5) then + if rising_edge(clock_250k) then - ald_r <= ald; - if (ald_r = '1' and ald = '0') then - lrq_in <= '0'; - allophone <= data_in; + trig_allophone_r <= trig_allophone; + if trig_allophone_r = '0' and trig_allophone = '1' then -- detect rising edge (trig_allophone) + input_rdy_in <= '0'; end if; - stage_r <= stage; - if stage /= stage_r then if sound_on = '0' then - if stage = 0 and lrq_in = '0' then - if allophone = "1100100" then bank <= "00"; + if stage = 0 and input_rdy_in = '0' then + + -- filter the bankswitch commands + if allophone = "1100100" then bank <= "00"; elsif allophone = "1101000" then bank <= "01"; elsif allophone = "1101001" then bank <= "10"; elsif allophone = "1101010" then bank <= "11"; elsif allophone <= "1011111" or allophone >= "1110000" then --filter the playable sounds - allo_entry <= allophone*"11"; - rom_addr <= "00000"&(allophone*"11"); - line_cnt <= (others => '0'); - rpt_cnt <= (others => '0'); - per_cnt <= (others => '0'); - sound_on <= '1'; + allo_entry <= allophone*"11"; -- alophone times 3 + rom_addr <= "00000"&(allophone*"11"); + line_cnt <= (others => '0'); + rpt_cnt <= (others => '0'); + per_cnt <= (others => '0'); + sound_on <= '1'; end if; - lrq_in <= '1'; + + input_rdy_in <= '1'; + end if; else -- sound is on @@ -265,13 +255,13 @@ process (clk_2m5, reset) case stage is when 0 => rom_addr <= "00000"&allo_entry; - when 1 => + when 3 => allo_addr_msb <= rom_do; rom_addr <= rom_addr + '1'; - when 2 => + when 6 => allo_addr_lsb <= rom_do; rom_addr <= rom_addr + '1'; - when 3 => + when 9 => if rom_do = X"00" then line_cnt <= (others => '0'); sound_on <= '0'; @@ -279,20 +269,21 @@ process (clk_2m5, reset) allo_nb_line <= rom_do - '1'; rom_addr <= ((allo_addr_msb(1 downto 0) & allo_addr_lsb )+line_cnt) & X"0"; end if; - when 4 => + when 12 => line_rpt <= rom_do - '1'; rom_addr <= rom_addr + '1'; - when 5 => + when 15 => line_amp_msb <= rom_do; rom_addr <= rom_addr + '1'; - when 6 => + when 18 => if per_cnt = X"00" then amp <= signed(line_amp_msb & rom_do); else if is_noise = '1' then if noise_rng(0) = '1' then - amp <= -amp; + --amp <= '1' & (not amp(14 downto 0)) ; + noise_out <= signed('1' & noise_rng (15 downto 1)); end if; else amp <= (others => '0'); @@ -310,7 +301,7 @@ process (clk_2m5, reset) rom_addr <= rom_addr + '1'; - when 7 => + when 21 => if rom_do = X"00" then line_per <= X"40"; is_noise <= '1'; @@ -322,90 +313,94 @@ process (clk_2m5, reset) filter <= f0_z1; divider <= '0'; rom_addr <= rom_addr + '1'; - when 8 => + when 24 => sum_in1 <= sum_out; filter <= f0_z2; divider <= '1'; rom_addr <= rom_addr + '1'; - when 9 => + when 27 => f0_z1 <= sum_out; f0_z2 <= f0_z1; sum_in1 <= sum_out; filter <= f1_z1; divider <= '0'; rom_addr <= rom_addr + '1'; - when 10 => + when 30 => sum_in1 <= sum_out; filter <= f1_z2; divider <= '1'; rom_addr <= rom_addr + '1'; - when 11 => + when 33 => f1_z1 <= sum_out; f1_z2 <= f1_z1; sum_in1 <= sum_out; filter <= f2_z1; divider <= '0'; rom_addr <= rom_addr + '1'; - when 12 => + + when 36 => sum_in1 <= sum_out; filter <= f2_z2; divider <= '1'; rom_addr <= rom_addr + '1'; - when 13 => + when 39 => f2_z1 <= sum_out; f2_z2 <= f2_z1; sum_in1 <= sum_out; filter <= f3_z1; divider <= '0'; rom_addr <= rom_addr + '1'; - when 14 => + + when 42 => sum_in1 <= sum_out; filter <= f3_z2; divider <= '1'; rom_addr <= rom_addr + '1'; - when 15 => + when 45 => f3_z1 <= sum_out; f3_z2 <= f3_z1; sum_in1 <= sum_out; filter <= f4_z1; divider <= '0'; rom_addr <= rom_addr + '1'; - when 16 => + + when 48 => sum_in1 <= sum_out; filter <= f4_z2; divider <= '1'; rom_addr <= rom_addr + '1'; - when 17 => + when 51 => f4_z1 <= sum_out; f4_z2 <= f4_z1; sum_in1 <= sum_out; filter <= f5_z1; divider <= '0'; rom_addr <= rom_addr + '1'; - when 18 => + + when 54 => sum_in1 <= sum_out; filter <= f5_z2; divider <= '1'; rom_addr <= rom_addr + '1'; - when 19 => + when 57 => f5_z1 <= sum_out; f5_z2 <= f5_z1; - if sum_out > 510*16 then - audio <= to_signed(511,10); - elsif sum_out < -510*16 then - audio <= to_signed(-512,10); - else - audio <= sum_out(13 downto 4); - end if; - - when 20 => +-- if sum_out > 510*16 then +-- audio <= to_signed(1023,16); +-- elsif sum_out < -510*16 then +-- audio <= to_signed(0,16); +-- else +-- audio <= (sum_out/16)+X"0200"; +-- end if; + audio <= sum_out; + when 60 => if per_cnt >= line_per then per_cnt <= (others => '0'); if rpt_cnt >= line_rpt then @@ -424,32 +419,21 @@ process (clk_2m5, reset) per_cnt <= per_cnt + '1'; end if; - if noise_rng(0) = '1' then - noise_rng <= ('0' & noise_rng(15 downto 1) ) xor X"4001"; - else - noise_rng <= '0' & noise_rng(15 downto 1); - end if; - + noise_rng <= noise_rng(15 downto 0) & (noise_rng(16) xor noise_rng(2)); + when others => null; end case; end if; - end if; + end if; end if; end process; -compr: compressor -port map -( - clk => clk_2m5, - din => audio, - dout => audio_int -); +--audio_out <= std_logic_vector(unsigned(audio(9 downto 0))); -audio_out <= audio_int(8) & audio_int; - +audio_out <= audio; -- filter computation coeff_idx <= rom_do(6 downto 0) when rom_do(7)='0' else @@ -466,12 +450,15 @@ sum_out_ul <= sum_in1 + sum_in2(15 downto 0); sum_out <= to_signed( 32767,16) when sum_out_ul > 32767 else to_signed(-32768,16) when sum_out_ul < -32768 else sum_out_ul; + sp256_003 : ENTITY work.sp256_003 port map( - clock => clk_2m5_n, + clock => clock_2m5, + clken => clock_250k_n, address => bank & rom_addr, q => rom_do ); + end syn; diff --git a/rtl/sp0256/sp0256_003_decoded.vhd b/rtl/sp0256/sp0256_003_decoded.vhd deleted file mode 100644 index dadea60..0000000 --- a/rtl/sp0256/sp0256_003_decoded.vhd +++ /dev/null @@ -1,728 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all,ieee.numeric_std.all; - -entity sp0256_003_decoded is -port ( - clk : in std_logic; - addr : in std_logic_vector(13 downto 0); - data : out std_logic_vector(7 downto 0) -); -end entity; - -architecture prom of sp0256_003_decoded is - type rom is array(0 to 11295) of std_logic_vector(7 downto 0); - signal rom_data: rom := ( - X"00",X"18",X"01",X"00",X"19",X"01",X"00",X"1A",X"01",X"00",X"1B",X"01",X"00",X"1C",X"01",X"00", - X"1D",X"0A",X"00",X"27",X"0A",X"00",X"31",X"01",X"00",X"32",X"03",X"00",X"35",X"03",X"00",X"38", - X"03",X"00",X"3B",X"03",X"00",X"3E",X"01",X"00",X"3F",X"04",X"00",X"43",X"06",X"00",X"49",X"01", - X"00",X"4A",X"04",X"00",X"4E",X"03",X"00",X"51",X"02",X"00",X"53",X"06",X"00",X"59",X"08",X"00", - X"61",X"02",X"00",X"63",X"03",X"00",X"66",X"01",X"00",X"67",X"03",X"00",X"6A",X"06",X"00",X"70", - X"01",X"00",X"71",X"03",X"00",X"74",X"02",X"00",X"76",X"01",X"00",X"77",X"01",X"00",X"78",X"03", - X"00",X"7B",X"05",X"00",X"80",X"03",X"00",X"83",X"02",X"00",X"85",X"03",X"00",X"88",X"03",X"00", - X"8B",X"03",X"00",X"8E",X"02",X"00",X"90",X"03",X"00",X"93",X"01",X"00",X"94",X"03",X"00",X"97", - X"04",X"00",X"9B",X"03",X"00",X"9E",X"04",X"00",X"A2",X"03",X"00",X"A5",X"04",X"00",X"A9",X"0D", - X"00",X"B6",X"04",X"00",X"BA",X"04",X"00",X"BE",X"03",X"00",X"C1",X"09",X"00",X"CA",X"0A",X"00", - X"D4",X"07",X"00",X"DB",X"02",X"00",X"DD",X"01",X"00",X"DE",X"06",X"00",X"E4",X"03",X"00",X"E7", - X"09",X"00",X"F0",X"09",X"00",X"F9",X"08",X"01",X"01",X"02",X"01",X"03",X"03",X"01",X"06",X"03", - X"01",X"09",X"13",X"01",X"1C",X"16",X"01",X"32",X"12",X"01",X"44",X"1B",X"01",X"5F",X"19",X"01", - X"78",X"1A",X"01",X"92",X"13",X"01",X"A5",X"0E",X"01",X"B3",X"16",X"01",X"C9",X"18",X"01",X"E1", - X"1D",X"01",X"FE",X"01",X"01",X"FF",X"01",X"02",X"00",X"01",X"02",X"01",X"01",X"02",X"02",X"01", - X"02",X"03",X"01",X"02",X"04",X"01",X"02",X"05",X"01",X"02",X"06",X"01",X"02",X"07",X"01",X"02", - X"08",X"01",X"02",X"09",X"01",X"02",X"0A",X"01",X"02",X"0B",X"01",X"02",X"0C",X"01",X"02",X"0D", - X"01",X"02",X"0E",X"01",X"02",X"0F",X"01",X"02",X"10",X"01",X"02",X"11",X"01",X"02",X"12",X"01", - X"02",X"13",X"01",X"02",X"14",X"01",X"02",X"15",X"01",X"02",X"16",X"01",X"02",X"17",X"00",X"02", - X"17",X"00",X"02",X"17",X"00",X"02",X"17",X"00",X"02",X"17",X"00",X"02",X"17",X"00",X"02",X"17", - X"00",X"02",X"17",X"00",X"02",X"17",X"00",X"02",X"17",X"00",X"02",X"17",X"00",X"02",X"17",X"00", - X"02",X"17",X"00",X"02",X"17",X"00",X"02",X"17",X"00",X"02",X"17",X"0A",X"02",X"21",X"0C",X"02", - X"2D",X"11",X"02",X"3E",X"10",X"02",X"4E",X"12",X"02",X"60",X"18",X"02",X"78",X"0F",X"02",X"87", - X"1F",X"02",X"A6",X"18",X"02",X"BE",X"01",X"02",X"BF",X"01",X"02",X"C0",X"01",X"02",X"C1",X"01", - X"01",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"04",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"07",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"0F",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"1F",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"04",X"01",X"40",X"5B",X"A0",X"60",X"B8",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"03",X"00",X"C0",X"5B",X"A0",X"60",X"B0",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"02",X"00",X"50",X"5B",X"A0",X"60",X"A8",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"02",X"00",X"80",X"5B",X"A0",X"60",X"B0",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"03",X"00",X"70",X"5B",X"A0",X"60",X"B0",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"03",X"00",X"A0",X"5B",X"A0",X"60",X"B8",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"04",X"01",X"C0",X"5B",X"A8",X"60",X"C0",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"03",X"02",X"80",X"5B",X"A8",X"60",X"D0",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"04",X"02",X"80",X"5B",X"A8",X"60",X"E0",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"09",X"01",X"00",X"5B",X"A0",X"60",X"E8",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"01",X"03",X"00",X"5B",X"B0",X"70",X"C8",X"70",X"F8",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"01",X"02",X"80",X"5B",X"C8",X"70",X"B0",X"70",X"F8",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"02",X"03",X"00",X"5B",X"C8",X"70",X"B0",X"70",X"F8",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"02",X"02",X"80",X"5B",X"B0",X"70",X"C8",X"70",X"F8",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"02",X"02",X"00",X"5B",X"C8",X"70",X"F8",X"70",X"B8",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"03",X"02",X"80",X"5B",X"B0",X"70",X"D0",X"70",X"F8",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"03",X"03",X"80",X"5B",X"B0",X"70",X"F8",X"70",X"E0",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"02",X"03",X"00",X"5B",X"A8",X"70",X"E0",X"70",X"F8",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"03",X"02",X"80",X"5B",X"A0",X"70",X"E8",X"70",X"00",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"03",X"01",X"00",X"5B",X"A0",X"70",X"F0",X"70",X"00",X"60",X"18",X"50",X"3C",X"44",X"00",X"00", - X"07",X"06",X"00",X"5B",X"00",X"50",X"28",X"50",X"40",X"50",X"F8",X"10",X"E8",X"58",X"AA",X"64", - X"05",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"03",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"40",X"FC",X"04",X"CB",X"68", - X"07",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"18",X"20",X"40",X"C5",X"62", - X"0F",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"04",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"40",X"F4",X"2C",X"BF",X"3B", - X"07",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"50",X"F8",X"44",X"CF",X"3A", - X"05",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"20",X"18",X"42",X"FA",X"30", - X"04",X"01",X"C0",X"5B",X"18",X"60",X"30",X"50",X"38",X"20",X"00",X"10",X"00",X"60",X"E6",X"38", - X"05",X"01",X"40",X"5B",X"18",X"50",X"28",X"40",X"40",X"30",X"FC",X"68",X"E8",X"52",X"DD",X"16", - X"04",X"00",X"E0",X"5B",X"00",X"30",X"18",X"20",X"38",X"40",X"FC",X"60",X"E0",X"2A",X"A1",X"54", - X"03",X"01",X"40",X"5B",X"08",X"30",X"20",X"30",X"20",X"10",X"FC",X"68",X"E8",X"1C",X"A2",X"50", - X"05",X"01",X"80",X"5B",X"08",X"30",X"20",X"40",X"20",X"10",X"FC",X"68",X"E0",X"24",X"9B",X"5B", - X"06",X"06",X"00",X"5B",X"00",X"50",X"10",X"20",X"30",X"50",X"E8",X"60",X"34",X"1E",X"A0",X"6E", - X"06",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"04",X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"28",X"1C",X"4E",X"F4",X"21", - X"04",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"20",X"1C",X"44",X"EA",X"53", - X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"18",X"1C",X"46",X"E7",X"5A", - X"06",X"00",X"1C",X"5B",X"98",X"60",X"C0",X"60",X"E0",X"50",X"0C",X"40",X"20",X"3C",X"32",X"2B", - X"03",X"00",X"50",X"5B",X"98",X"60",X"C0",X"60",X"E8",X"50",X"0C",X"40",X"20",X"3C",X"32",X"2B", - X"01",X"00",X"C0",X"5B",X"98",X"60",X"C0",X"60",X"E8",X"50",X"0C",X"40",X"20",X"3C",X"32",X"2B", - X"02",X"02",X"80",X"5B",X"A0",X"60",X"C0",X"60",X"F0",X"50",X"0C",X"40",X"20",X"3C",X"32",X"2B", - X"02",X"01",X"C0",X"5B",X"A0",X"60",X"B8",X"60",X"F0",X"50",X"0C",X"40",X"20",X"3C",X"32",X"2B", - X"02",X"02",X"00",X"5B",X"A0",X"60",X"B8",X"60",X"F0",X"50",X"0C",X"40",X"20",X"3C",X"32",X"2B", - X"07",X"06",X"00",X"5B",X"F0",X"50",X"18",X"20",X"28",X"60",X"D0",X"60",X"28",X"18",X"A8",X"61", - X"05",X"00",X"A0",X"5B",X"F0",X"50",X"C0",X"30",X"E0",X"20",X"00",X"10",X"20",X"44",X"00",X"00", - X"04",X"00",X"C0",X"5B",X"F0",X"50",X"C0",X"30",X"E0",X"20",X"00",X"10",X"20",X"44",X"00",X"00", - X"04",X"00",X"E0",X"5B",X"F0",X"50",X"E0",X"30",X"C8",X"20",X"00",X"10",X"20",X"44",X"00",X"00", - X"03",X"01",X"40",X"5B",X"F0",X"50",X"E0",X"30",X"C8",X"20",X"00",X"10",X"20",X"44",X"00",X"00", - X"06",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"02",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"48",X"10",X"40",X"DF",X"3F", - X"04",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"18",X"28",X"40",X"E8",X"3F", - X"0E",X"00",X"A0",X"5B",X"08",X"30",X"18",X"30",X"38",X"40",X"EC",X"30",X"D4",X"2E",X"CB",X"20", - X"04",X"02",X"80",X"5B",X"00",X"60",X"18",X"50",X"38",X"50",X"F4",X"08",X"DC",X"5E",X"A1",X"5C", - X"04",X"06",X"00",X"5B",X"08",X"00",X"28",X"40",X"38",X"40",X"04",X"60",X"F0",X"66",X"A1",X"5A", - X"03",X"06",X"00",X"5B",X"28",X"40",X"38",X"40",X"08",X"00",X"04",X"50",X"F4",X"62",X"A4",X"57", - X"03",X"06",X"00",X"5B",X"08",X"10",X"28",X"50",X"38",X"40",X"04",X"48",X"F4",X"64",X"9A",X"62", - X"03",X"06",X"00",X"5B",X"08",X"20",X"28",X"50",X"38",X"40",X"04",X"38",X"F8",X"60",X"96",X"66", - X"05",X"04",X"00",X"5B",X"08",X"30",X"28",X"50",X"38",X"50",X"FC",X"20",X"F8",X"62",X"92",X"6E", - X"04",X"01",X"40",X"5B",X"08",X"40",X"28",X"40",X"38",X"40",X"F8",X"60",X"F4",X"0C",X"90",X"71", - X"03",X"03",X"00",X"5B",X"A0",X"70",X"E8",X"60",X"00",X"20",X"04",X"30",X"28",X"52",X"00",X"00", - X"01",X"03",X"00",X"5B",X"A0",X"70",X"F0",X"60",X"00",X"20",X"04",X"30",X"28",X"52",X"00",X"00", - X"03",X"02",X"80",X"5B",X"A0",X"70",X"F0",X"60",X"00",X"20",X"04",X"30",X"28",X"52",X"00",X"00", - X"01",X"01",X"C0",X"5B",X"98",X"70",X"F8",X"60",X"F8",X"20",X"04",X"30",X"28",X"52",X"00",X"00", - X"06",X"01",X"C0",X"5B",X"98",X"70",X"F8",X"60",X"00",X"20",X"04",X"30",X"28",X"52",X"00",X"00", - X"01",X"01",X"C0",X"5B",X"98",X"70",X"F8",X"60",X"00",X"20",X"04",X"30",X"28",X"52",X"00",X"00", - X"07",X"00",X"A0",X"5B",X"90",X"70",X"F8",X"60",X"00",X"20",X"04",X"30",X"28",X"52",X"00",X"00", - X"02",X"00",X"70",X"5B",X"90",X"70",X"F8",X"60",X"F8",X"20",X"04",X"30",X"28",X"52",X"00",X"00", - X"04",X"02",X"80",X"5B",X"90",X"70",X"E0",X"70",X"00",X"60",X"10",X"10",X"1C",X"56",X"3A",X"49", - X"02",X"02",X"00",X"5B",X"98",X"70",X"E0",X"70",X"00",X"60",X"10",X"10",X"1C",X"56",X"3A",X"49", - X"04",X"05",X"00",X"5B",X"98",X"60",X"F0",X"60",X"D8",X"60",X"1C",X"58",X"24",X"4E",X"39",X"2C", - X"02",X"05",X"00",X"5B",X"D0",X"60",X"F0",X"60",X"A0",X"60",X"1C",X"58",X"24",X"4E",X"39",X"2C", - X"03",X"04",X"00",X"5B",X"F0",X"60",X"C8",X"60",X"A0",X"60",X"1C",X"58",X"24",X"4E",X"39",X"2C", - X"09",X"04",X"00",X"5B",X"20",X"50",X"18",X"20",X"40",X"30",X"F8",X"60",X"C0",X"60",X"B2",X"5A", - X"04",X"05",X"00",X"5B",X"C8",X"60",X"B8",X"60",X"F8",X"60",X"14",X"28",X"1C",X"36",X"44",X"41", - X"02",X"05",X"00",X"5B",X"C8",X"60",X"B8",X"60",X"F8",X"60",X"14",X"28",X"1C",X"36",X"44",X"41", - X"03",X"05",X"00",X"5B",X"B8",X"60",X"C8",X"60",X"F8",X"60",X"14",X"28",X"1C",X"36",X"44",X"41", - X"03",X"01",X"C0",X"5B",X"10",X"50",X"28",X"40",X"30",X"30",X"08",X"30",X"F0",X"64",X"8E",X"70", - X"03",X"01",X"80",X"5B",X"10",X"50",X"28",X"50",X"38",X"30",X"04",X"28",X"F4",X"5E",X"8C",X"76", - X"04",X"02",X"80",X"5B",X"08",X"30",X"28",X"40",X"30",X"20",X"08",X"40",X"F4",X"5C",X"90",X"70", - X"02",X"04",X"00",X"5B",X"10",X"30",X"20",X"50",X"38",X"40",X"00",X"38",X"F0",X"5A",X"95",X"69", - X"02",X"07",X"00",X"5B",X"20",X"40",X"28",X"40",X"18",X"10",X"00",X"48",X"F0",X"60",X"98",X"69", - X"02",X"06",X"00",X"5B",X"18",X"30",X"28",X"40",X"20",X"10",X"00",X"48",X"F0",X"5E",X"9C",X"68", - X"0A",X"03",X"00",X"5B",X"F8",X"40",X"20",X"50",X"30",X"50",X"F0",X"20",X"DC",X"4C",X"AE",X"66", - X"07",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"28",X"08",X"4E",X"EB",X"0C", - X"07",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"38",X"0C",X"3E",X"F1",X"1A", - X"02",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"30",X"E8",X"F2",X"03",X"3F", - X"03",X"00",X"04",X"5B",X"F8",X"30",X"18",X"40",X"40",X"30",X"E4",X"20",X"18",X"04",X"88",X"76", - X"01",X"03",X"00",X"5B",X"20",X"50",X"18",X"10",X"30",X"40",X"F8",X"78",X"E0",X"74",X"98",X"6C", - X"16",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"10",X"24",X"E5",X"3B", - X"09",X"02",X"80",X"5B",X"F8",X"70",X"20",X"50",X"28",X"50",X"C0",X"68",X"18",X"06",X"A4",X"5E", - X"09",X"02",X"80",X"5B",X"F0",X"60",X"18",X"60",X"20",X"40",X"D8",X"60",X"20",X"0C",X"9D",X"61", - X"05",X"03",X"00",X"5B",X"18",X"50",X"20",X"50",X"38",X"30",X"F0",X"60",X"D0",X"66",X"A6",X"53", - X"08",X"02",X"00",X"5B",X"18",X"60",X"28",X"50",X"40",X"40",X"F0",X"60",X"C8",X"62",X"9D",X"61", - X"09",X"01",X"C0",X"5B",X"B8",X"60",X"D0",X"60",X"F8",X"50",X"0C",X"20",X"20",X"44",X"00",X"00", - X"06",X"01",X"00",X"5B",X"B0",X"60",X"C8",X"60",X"F8",X"50",X"0C",X"20",X"20",X"44",X"00",X"00", - X"04",X"00",X"A0",X"5B",X"B0",X"60",X"C0",X"60",X"F8",X"50",X"0C",X"20",X"20",X"44",X"00",X"00", - X"05",X"00",X"80",X"5B",X"A8",X"60",X"C0",X"60",X"00",X"50",X"0C",X"20",X"20",X"44",X"00",X"00", - X"08",X"00",X"28",X"5B",X"A0",X"60",X"B8",X"60",X"00",X"50",X"0C",X"20",X"20",X"44",X"00",X"00", - X"09",X"00",X"18",X"5B",X"00",X"40",X"20",X"30",X"38",X"30",X"E4",X"28",X"08",X"F8",X"91",X"65", - X"01",X"00",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"20",X"14",X"30",X"E6",X"27", - X"05",X"08",X"00",X"5B",X"20",X"60",X"28",X"30",X"40",X"30",X"FC",X"58",X"E4",X"70",X"A7",X"4B", - X"07",X"00",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"40",X"F4",X"4C",X"E7",X"23", - X"05",X"01",X"80",X"5B",X"F8",X"70",X"30",X"60",X"30",X"30",X"E8",X"60",X"08",X"FC",X"AC",X"48", - X"07",X"00",X"20",X"5B",X"08",X"30",X"28",X"50",X"50",X"40",X"F0",X"48",X"C8",X"68",X"A8",X"47", - X"07",X"00",X"E0",X"5B",X"10",X"40",X"28",X"40",X"50",X"50",X"F0",X"40",X"D0",X"1A",X"DE",X"3A", - X"02",X"01",X"40",X"5B",X"F0",X"60",X"18",X"40",X"20",X"40",X"D0",X"68",X"2C",X"18",X"C7",X"25", - X"03",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"03",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"14",X"30",X"FC",X"F0",X"FB",X"41", - X"03",X"07",X"00",X"5B",X"10",X"40",X"20",X"60",X"38",X"30",X"F8",X"30",X"F4",X"5E",X"A1",X"5C", - X"04",X"00",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"10",X"20",X"4E",X"FA",X"53", - X"0A",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"20",X"18",X"44",X"FC",X"5A", - X"06",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"20",X"14",X"40",X"FB",X"5D", - X"08",X"01",X"40",X"5B",X"C0",X"30",X"E0",X"40",X"F8",X"60",X"14",X"58",X"24",X"48",X"00",X"00", - X"0C",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"42",X"FE",X"3F", - X"02",X"00",X"38",X"5B",X"08",X"40",X"20",X"30",X"38",X"30",X"DC",X"48",X"BC",X"58",X"A4",X"54", - X"04",X"00",X"60",X"5B",X"D0",X"60",X"10",X"70",X"20",X"30",X"BC",X"60",X"1C",X"08",X"A1",X"5D", - X"04",X"00",X"A0",X"5B",X"D0",X"50",X"10",X"60",X"18",X"50",X"BC",X"60",X"20",X"0E",X"A3",X"5C", - X"13",X"00",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"38",X"04",X"28",X"E3",X"27", - X"14",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"02",X"00",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"30",X"04",X"12",X"DE",X"56", - X"01",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"28",X"F4",X"1E",X"DC",X"49", - X"08",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"01",X"00",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"38",X"0C",X"62",X"E2",X"37", - X"01",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"20",X"10",X"36",X"F9",X"44", - X"0A",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"28",X"0C",X"44",X"E7",X"1B", - X"07",X"04",X"00",X"5B",X"20",X"50",X"40",X"60",X"58",X"50",X"00",X"58",X"DC",X"54",X"A7",X"4D", - X"0A",X"00",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"44",X"58",X"EC",X"00",X"21",X"30", - X"05",X"05",X"00",X"5B",X"20",X"50",X"40",X"50",X"48",X"40",X"00",X"40",X"DC",X"60",X"B9",X"37", - X"04",X"03",X"80",X"5B",X"D8",X"40",X"B8",X"40",X"F8",X"40",X"04",X"58",X"2C",X"3C",X"55",X"5A", - X"03",X"02",X"00",X"5B",X"F0",X"40",X"B0",X"40",X"D8",X"40",X"04",X"58",X"2C",X"3C",X"55",X"5A", - X"05",X"01",X"C0",X"5B",X"B0",X"40",X"F0",X"40",X"D8",X"40",X"04",X"58",X"2C",X"3C",X"55",X"5A", - X"07",X"01",X"40",X"5B",X"F0",X"40",X"B0",X"40",X"D0",X"40",X"04",X"58",X"2C",X"3C",X"55",X"5A", - X"04",X"00",X"C0",X"5B",X"98",X"60",X"C8",X"60",X"08",X"40",X"18",X"30",X"28",X"44",X"2E",X"25", - X"04",X"02",X"80",X"5B",X"A0",X"60",X"C8",X"60",X"08",X"40",X"18",X"30",X"28",X"44",X"2E",X"25", - X"04",X"02",X"00",X"5B",X"A0",X"60",X"C0",X"60",X"00",X"40",X"18",X"30",X"28",X"44",X"2E",X"25", - X"04",X"00",X"10",X"5B",X"A0",X"60",X"B0",X"50",X"20",X"40",X"F8",X"18",X"1C",X"52",X"00",X"00", - X"03",X"00",X"14",X"5B",X"A0",X"60",X"B0",X"50",X"18",X"40",X"F8",X"18",X"1C",X"52",X"00",X"00", - X"05",X"00",X"1C",X"5B",X"A0",X"60",X"B0",X"50",X"20",X"40",X"F8",X"18",X"1C",X"52",X"00",X"00", - X"04",X"00",X"28",X"5B",X"A0",X"60",X"B0",X"50",X"18",X"40",X"F8",X"18",X"1C",X"52",X"00",X"00", - X"04",X"02",X"80",X"5B",X"A0",X"60",X"E8",X"60",X"F8",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"02",X"80",X"5B",X"A0",X"60",X"E8",X"60",X"F8",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"03",X"01",X"C0",X"5B",X"A0",X"60",X"E8",X"60",X"F0",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"02",X"80",X"5B",X"A0",X"60",X"E0",X"60",X"F0",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"03",X"00",X"5B",X"A8",X"60",X"E0",X"60",X"F0",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"03",X"02",X"80",X"5B",X"A8",X"60",X"D8",X"60",X"E8",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"03",X"02",X"00",X"5B",X"A8",X"60",X"D8",X"60",X"E8",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"01",X"C0",X"5B",X"A8",X"60",X"D8",X"60",X"E8",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"00",X"E0",X"5B",X"A8",X"60",X"D0",X"60",X"E0",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"00",X"80",X"5B",X"A0",X"60",X"D0",X"60",X"E0",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"00",X"C0",X"5B",X"A8",X"60",X"D0",X"60",X"E8",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"00",X"70",X"5B",X"A8",X"60",X"D0",X"60",X"E8",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"02",X"00",X"50",X"5B",X"A8",X"60",X"D8",X"60",X"E8",X"60",X"00",X"10",X"1C",X"52",X"42",X"59", - X"07",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"FC",X"1C",X"D2",X"28", - X"0C",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"38",X"04",X"18",X"B4",X"55", - X"02",X"00",X"C0",X"5B",X"F8",X"40",X"30",X"70",X"20",X"20",X"C4",X"38",X"10",X"FC",X"A3",X"5D", - X"02",X"01",X"40",X"5B",X"F8",X"60",X"28",X"50",X"28",X"50",X"B0",X"68",X"1C",X"06",X"A3",X"58", - X"03",X"01",X"C0",X"5B",X"10",X"50",X"28",X"40",X"30",X"30",X"08",X"30",X"F0",X"64",X"8E",X"70", - X"03",X"01",X"80",X"5B",X"10",X"50",X"28",X"50",X"38",X"30",X"04",X"28",X"F4",X"5E",X"8C",X"76", - X"04",X"02",X"80",X"5B",X"08",X"30",X"28",X"40",X"30",X"20",X"08",X"40",X"F4",X"5C",X"90",X"70", - X"02",X"04",X"00",X"5B",X"10",X"30",X"20",X"50",X"38",X"40",X"00",X"38",X"F0",X"5A",X"95",X"69", - X"06",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"04",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"40",X"08",X"4E",X"E4",X"19", - X"0E",X"00",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"50",X"10",X"66",X"F6",X"49", - X"01",X"02",X"80",X"5B",X"18",X"40",X"20",X"40",X"30",X"20",X"E4",X"60",X"CC",X"68",X"A5",X"5F", - X"02",X"02",X"80",X"5B",X"18",X"40",X"20",X"40",X"28",X"10",X"E4",X"58",X"D0",X"60",X"A5",X"5F", - X"01",X"02",X"80",X"5B",X"E0",X"60",X"18",X"40",X"20",X"40",X"D0",X"60",X"24",X"12",X"A8",X"5B", - X"01",X"02",X"00",X"5B",X"E0",X"60",X"18",X"50",X"28",X"40",X"D0",X"60",X"20",X"0A",X"A3",X"63", - X"01",X"01",X"C0",X"5B",X"E0",X"60",X"18",X"60",X"28",X"40",X"D0",X"68",X"20",X"0A",X"A5",X"61", - X"02",X"01",X"C0",X"5B",X"E0",X"60",X"18",X"50",X"28",X"40",X"D0",X"60",X"24",X"12",X"A2",X"69", - X"01",X"01",X"40",X"5B",X"E0",X"60",X"18",X"60",X"28",X"40",X"D4",X"68",X"1C",X"0A",X"A0",X"6E", - X"02",X"00",X"E0",X"5B",X"18",X"60",X"20",X"20",X"20",X"10",X"E0",X"60",X"D4",X"68",X"A0",X"6E", - X"01",X"00",X"E0",X"5B",X"18",X"60",X"18",X"20",X"30",X"20",X"E4",X"60",X"D4",X"6A",X"A3",X"63", - X"02",X"02",X"80",X"5B",X"18",X"40",X"20",X"40",X"30",X"20",X"E4",X"60",X"CC",X"68",X"A5",X"5F", - X"03",X"02",X"80",X"5B",X"18",X"40",X"20",X"40",X"28",X"10",X"E4",X"58",X"D0",X"60",X"A5",X"5F", - X"01",X"02",X"00",X"5B",X"E0",X"60",X"18",X"40",X"28",X"40",X"D0",X"60",X"24",X"10",X"A9",X"59", - X"03",X"02",X"00",X"5B",X"E0",X"60",X"18",X"40",X"20",X"40",X"D0",X"60",X"24",X"12",X"A8",X"5B", - X"01",X"01",X"C0",X"5B",X"E0",X"60",X"18",X"50",X"28",X"40",X"D0",X"60",X"20",X"0A",X"A3",X"63", - X"03",X"01",X"C0",X"5B",X"E0",X"60",X"18",X"60",X"28",X"40",X"D0",X"68",X"20",X"0A",X"A5",X"61", - X"02",X"01",X"C0",X"5B",X"E0",X"60",X"18",X"50",X"28",X"40",X"D0",X"60",X"24",X"12",X"A2",X"69", - X"04",X"01",X"40",X"5B",X"E0",X"60",X"18",X"60",X"28",X"40",X"D4",X"68",X"1C",X"0A",X"A0",X"6E", - X"03",X"00",X"C0",X"5B",X"18",X"60",X"20",X"20",X"20",X"10",X"E0",X"60",X"D4",X"68",X"A0",X"6E", - X"04",X"00",X"E0",X"5B",X"18",X"60",X"18",X"20",X"30",X"20",X"E4",X"60",X"D4",X"6A",X"A3",X"63", - X"03",X"02",X"80",X"5B",X"A8",X"60",X"C0",X"60",X"F8",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"01",X"02",X"80",X"5B",X"A8",X"60",X"C0",X"60",X"00",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"03",X"02",X"00",X"5B",X"A8",X"60",X"C0",X"60",X"00",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"02",X"01",X"C0",X"5B",X"A8",X"60",X"C0",X"60",X"00",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"05",X"00",X"C0",X"5B",X"A0",X"60",X"B8",X"60",X"00",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"02",X"00",X"C0",X"5B",X"A0",X"60",X"B8",X"60",X"00",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"06",X"00",X"70",X"5B",X"A0",X"60",X"B8",X"60",X"00",X"60",X"40",X"60",X"24",X"60",X"00",X"00", - X"13",X"00",X"A0",X"5B",X"08",X"30",X"18",X"30",X"38",X"40",X"EC",X"30",X"D4",X"2E",X"CB",X"20", - X"04",X"02",X"80",X"5B",X"00",X"60",X"18",X"50",X"38",X"50",X"F4",X"08",X"DC",X"5E",X"A1",X"5C", - X"0B",X"00",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"48",X"40",X"20",X"38",X"E3",X"29", - X"04",X"00",X"A0",X"5B",X"00",X"30",X"18",X"20",X"38",X"40",X"FC",X"60",X"E0",X"2A",X"A1",X"54", - X"03",X"00",X"C0",X"5B",X"08",X"30",X"20",X"30",X"20",X"10",X"FC",X"68",X"E8",X"1C",X"A2",X"50", - X"02",X"00",X"C0",X"5B",X"08",X"30",X"20",X"40",X"20",X"10",X"FC",X"68",X"E0",X"24",X"9B",X"5B", - X"04",X"06",X"00",X"5B",X"10",X"40",X"18",X"40",X"30",X"30",X"F8",X"68",X"DC",X"62",X"A8",X"50", - X"01",X"06",X"00",X"5B",X"10",X"20",X"18",X"40",X"30",X"40",X"F8",X"68",X"D4",X"6E",X"AC",X"55", - X"03",X"06",X"00",X"5B",X"20",X"50",X"18",X"10",X"30",X"40",X"F8",X"70",X"D0",X"6A",X"AC",X"58", - X"12",X"00",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"30",X"00",X"1E",X"C1",X"48", - X"02",X"00",X"C0",X"5B",X"F8",X"50",X"20",X"60",X"40",X"60",X"C4",X"48",X"EC",X"FE",X"BA",X"43", - X"02",X"00",X"A0",X"5B",X"F8",X"40",X"18",X"60",X"40",X"60",X"C0",X"68",X"E8",X"00",X"A9",X"5E", - X"02",X"00",X"60",X"5B",X"A0",X"60",X"A8",X"60",X"F8",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"02",X"00",X"40",X"5B",X"A0",X"60",X"A8",X"60",X"F0",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"02",X"00",X"50",X"5B",X"A0",X"60",X"A8",X"60",X"F0",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"05",X"00",X"E0",X"5B",X"A0",X"60",X"B0",X"60",X"F0",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"04",X"01",X"40",X"5B",X"A0",X"60",X"C0",X"60",X"E8",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"06",X"01",X"C0",X"5B",X"A8",X"60",X"C8",X"60",X"E0",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"03",X"01",X"C0",X"5B",X"A8",X"60",X"D0",X"60",X"E0",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"03",X"00",X"E0",X"5B",X"A0",X"60",X"D0",X"60",X"E0",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"02",X"00",X"60",X"5B",X"A0",X"60",X"D0",X"60",X"E0",X"60",X"10",X"20",X"20",X"60",X"37",X"57", - X"02",X"01",X"00",X"5B",X"18",X"60",X"28",X"40",X"10",X"00",X"F0",X"48",X"BC",X"64",X"AC",X"59", - X"02",X"01",X"40",X"5B",X"10",X"60",X"20",X"40",X"18",X"10",X"F0",X"48",X"BC",X"62",X"AF",X"56", - X"02",X"01",X"80",X"5B",X"10",X"50",X"20",X"30",X"20",X"10",X"EC",X"48",X"C0",X"5E",X"B0",X"56", - X"03",X"01",X"40",X"5B",X"F0",X"50",X"10",X"60",X"20",X"50",X"C0",X"60",X"10",X"02",X"B6",X"51", - X"02",X"01",X"40",X"5B",X"E8",X"60",X"18",X"60",X"28",X"50",X"C4",X"60",X"04",X"00",X"B8",X"4A", - X"04",X"01",X"40",X"5B",X"18",X"60",X"10",X"00",X"20",X"30",X"E8",X"58",X"C8",X"62",X"B5",X"54", - X"03",X"00",X"E0",X"5B",X"00",X"00",X"18",X"60",X"30",X"50",X"E4",X"60",X"CC",X"58",X"B5",X"56", - X"04",X"00",X"C0",X"5B",X"00",X"00",X"18",X"60",X"28",X"40",X"E4",X"60",X"D0",X"5C",X"B2",X"59", - X"03",X"00",X"80",X"5B",X"E8",X"60",X"10",X"60",X"20",X"20",X"CC",X"60",X"04",X"FC",X"B2",X"55", - X"03",X"03",X"80",X"5B",X"90",X"70",X"F0",X"50",X"00",X"30",X"04",X"18",X"28",X"4E",X"39",X"41", - X"03",X"04",X"00",X"5B",X"90",X"70",X"F8",X"50",X"00",X"30",X"04",X"18",X"28",X"4E",X"39",X"41", - X"03",X"05",X"00",X"5B",X"90",X"70",X"F8",X"50",X"00",X"30",X"04",X"18",X"28",X"4E",X"39",X"41", - X"03",X"02",X"80",X"5B",X"90",X"70",X"F0",X"50",X"00",X"30",X"04",X"18",X"28",X"4E",X"39",X"41", - X"03",X"02",X"80",X"5B",X"98",X"70",X"E8",X"50",X"F8",X"30",X"04",X"18",X"28",X"4E",X"39",X"41", - X"05",X"01",X"80",X"5B",X"A0",X"70",X"E0",X"50",X"F0",X"30",X"04",X"18",X"28",X"4E",X"39",X"41", - X"05",X"01",X"80",X"5B",X"A0",X"70",X"D8",X"50",X"F0",X"30",X"04",X"18",X"28",X"4E",X"39",X"41", - X"06",X"01",X"40",X"5B",X"A0",X"70",X"D8",X"50",X"F0",X"30",X"04",X"18",X"28",X"4E",X"39",X"41", - X"03",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"02",X"01",X"C0",X"5B",X"08",X"40",X"20",X"40",X"38",X"50",X"E4",X"48",X"DC",X"44",X"BD",X"3D", - X"06",X"03",X"00",X"5B",X"18",X"40",X"28",X"50",X"20",X"20",X"FC",X"68",X"C4",X"60",X"A3",X"64", - X"03",X"01",X"80",X"5B",X"10",X"10",X"28",X"60",X"38",X"40",X"FC",X"60",X"C0",X"62",X"A3",X"60", - X"08",X"01",X"00",X"5B",X"28",X"60",X"18",X"10",X"30",X"30",X"00",X"60",X"C0",X"60",X"A0",X"68", - X"05",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"01",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"20",X"FC",X"20",X"DE",X"48", - X"02",X"04",X"00",X"5B",X"20",X"50",X"30",X"40",X"18",X"10",X"F8",X"68",X"E0",X"6C",X"98",X"6C", - X"04",X"07",X"00",X"3D",X"08",X"30",X"10",X"20",X"38",X"50",X"F0",X"48",X"E4",X"1C",X"A9",X"63", - X"03",X"06",X"00",X"38",X"10",X"40",X"18",X"20",X"38",X"50",X"F0",X"50",X"D8",X"22",X"A9",X"5D", - X"04",X"06",X"00",X"2F",X"10",X"20",X"18",X"30",X"40",X"60",X"F0",X"48",X"DC",X"1A",X"AC",X"5F", - X"04",X"06",X"00",X"2C",X"00",X"10",X"18",X"50",X"40",X"60",X"EC",X"50",X"B0",X"56",X"E5",X"0D", - X"04",X"07",X"00",X"2A",X"10",X"20",X"18",X"60",X"38",X"50",X"E8",X"58",X"DC",X"1A",X"B9",X"44", - X"05",X"02",X"00",X"2C",X"08",X"40",X"20",X"40",X"38",X"50",X"E0",X"60",X"E4",X"0C",X"AF",X"42", - X"04",X"04",X"00",X"2A",X"08",X"40",X"10",X"30",X"30",X"40",X"E0",X"68",X"E4",X"02",X"B1",X"54", - X"06",X"06",X"00",X"2B",X"08",X"50",X"18",X"40",X"38",X"40",X"E0",X"60",X"E0",X"08",X"B3",X"54", - X"05",X"06",X"00",X"2D",X"08",X"50",X"20",X"50",X"38",X"40",X"DC",X"60",X"DC",X"10",X"B1",X"53", - X"04",X"03",X"80",X"34",X"00",X"20",X"18",X"30",X"30",X"50",X"DC",X"48",X"E4",X"0A",X"B4",X"43", - X"06",X"01",X"C0",X"41",X"F8",X"60",X"20",X"60",X"38",X"60",X"F8",X"08",X"D8",X"5C",X"A3",X"50", - X"04",X"01",X"00",X"62",X"18",X"60",X"10",X"10",X"38",X"70",X"F4",X"70",X"D4",X"5A",X"9C",X"5A", - X"03",X"03",X"80",X"6E",X"00",X"60",X"18",X"60",X"38",X"50",X"E4",X"60",X"F0",X"04",X"AA",X"50", - X"02",X"02",X"80",X"6F",X"00",X"50",X"20",X"50",X"30",X"40",X"EC",X"60",X"EC",X"00",X"AC",X"4E", - X"03",X"01",X"C0",X"67",X"08",X"50",X"20",X"50",X"40",X"50",X"F0",X"58",X"E8",X"06",X"A7",X"57", - X"02",X"01",X"40",X"81",X"08",X"50",X"20",X"40",X"40",X"60",X"F4",X"68",X"EC",X"0A",X"9F",X"60", - X"03",X"00",X"E0",X"83",X"08",X"60",X"28",X"50",X"40",X"60",X"F8",X"70",X"E8",X"0A",X"9D",X"60", - X"02",X"00",X"E0",X"88",X"08",X"40",X"20",X"40",X"40",X"60",X"F8",X"58",X"F0",X"0C",X"92",X"73", - X"01",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"03",X"03",X"00",X"47",X"00",X"00",X"20",X"60",X"38",X"70",X"04",X"60",X"BC",X"6E",X"A5",X"76", - X"04",X"04",X"00",X"45",X"00",X"60",X"20",X"60",X"40",X"70",X"FC",X"08",X"BC",X"68",X"AA",X"65", - X"04",X"03",X"80",X"3F",X"00",X"00",X"20",X"60",X"40",X"70",X"00",X"60",X"BC",X"68",X"A6",X"75", - X"06",X"05",X"00",X"39",X"00",X"00",X"20",X"60",X"40",X"70",X"00",X"60",X"C0",X"5A",X"AB",X"67", - X"05",X"03",X"80",X"38",X"00",X"50",X"20",X"60",X"40",X"60",X"FC",X"00",X"BC",X"62",X"AD",X"60", - X"05",X"02",X"00",X"35",X"F8",X"60",X"20",X"60",X"40",X"60",X"F4",X"00",X"BC",X"62",X"AC",X"60", - X"06",X"01",X"C0",X"31",X"00",X"60",X"20",X"60",X"48",X"60",X"F8",X"00",X"BC",X"5E",X"A8",X"66", - X"05",X"01",X"80",X"31",X"00",X"60",X"20",X"60",X"40",X"50",X"F4",X"00",X"BC",X"58",X"AB",X"5A", - X"05",X"01",X"40",X"33",X"08",X"60",X"20",X"50",X"40",X"40",X"C0",X"58",X"F0",X"06",X"A9",X"57", - X"0C",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"05",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"40",X"14",X"3C",X"BE",X"6C", - X"06",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"50",X"0C",X"28",X"CB",X"44", - X"04",X"02",X"00",X"4B",X"10",X"30",X"28",X"60",X"38",X"60",X"F4",X"48",X"C4",X"56",X"A3",X"59", - X"04",X"05",X"00",X"57",X"08",X"10",X"20",X"50",X"30",X"50",X"F4",X"50",X"E0",X"66",X"9B",X"70", - X"04",X"05",X"00",X"5D",X"10",X"20",X"18",X"50",X"30",X"50",X"F0",X"48",X"E4",X"58",X"97",X"74", - X"04",X"05",X"00",X"61",X"18",X"50",X"18",X"20",X"30",X"60",X"F0",X"50",X"E8",X"5C",X"95",X"75", - X"03",X"05",X"00",X"63",X"18",X"50",X"18",X"20",X"30",X"50",X"F0",X"60",X"E4",X"5E",X"97",X"72", - X"04",X"05",X"00",X"65",X"18",X"40",X"20",X"40",X"38",X"50",X"EC",X"60",X"E0",X"6A",X"9B",X"6D", - X"03",X"03",X"80",X"67",X"20",X"60",X"30",X"50",X"18",X"10",X"E8",X"58",X"DC",X"60",X"9F",X"6E", - X"03",X"03",X"80",X"64",X"20",X"50",X"10",X"10",X"30",X"50",X"E8",X"58",X"DC",X"64",X"A0",X"6C", - X"03",X"02",X"00",X"61",X"08",X"10",X"20",X"50",X"40",X"60",X"E8",X"50",X"DC",X"58",X"A3",X"62", - X"01",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"03",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"40",X"08",X"4A",X"C9",X"48", - X"05",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"50",X"E0",X"10",X"01",X"19", - X"04",X"01",X"00",X"35",X"08",X"50",X"28",X"70",X"40",X"70",X"F0",X"08",X"C0",X"70",X"9B",X"68", - X"03",X"02",X"00",X"31",X"10",X"70",X"20",X"50",X"38",X"70",X"04",X"10",X"C0",X"74",X"99",X"6B", - X"04",X"05",X"00",X"31",X"10",X"60",X"28",X"60",X"38",X"70",X"E0",X"48",X"E0",X"28",X"9F",X"67", - X"04",X"06",X"00",X"32",X"08",X"60",X"28",X"40",X"38",X"50",X"E0",X"70",X"E4",X"18",X"A0",X"64", - X"06",X"06",X"00",X"38",X"00",X"60",X"28",X"40",X"38",X"60",X"F0",X"58",X"E8",X"18",X"9A",X"67", - X"02",X"05",X"00",X"47",X"00",X"50",X"20",X"30",X"38",X"60",X"F8",X"58",X"F0",X"0A",X"96",X"69", - X"04",X"03",X"80",X"60",X"00",X"50",X"20",X"50",X"38",X"60",X"F8",X"58",X"F4",X"0A",X"94",X"6B", - X"02",X"01",X"C0",X"7A",X"08",X"50",X"20",X"50",X"38",X"60",X"F8",X"58",X"EC",X"04",X"91",X"70", - X"03",X"01",X"C0",X"8E",X"00",X"50",X"20",X"60",X"40",X"60",X"F8",X"60",X"F4",X"0C",X"91",X"6D", - X"02",X"01",X"40",X"93",X"00",X"50",X"20",X"50",X"40",X"60",X"F4",X"58",X"F4",X"08",X"8E",X"77", - X"02",X"00",X"C0",X"94",X"00",X"60",X"20",X"30",X"40",X"60",X"EC",X"58",X"F0",X"06",X"90",X"73", - X"03",X"00",X"C0",X"9D",X"00",X"60",X"38",X"60",X"30",X"40",X"E4",X"68",X"F8",X"FA",X"96",X"69", - X"06",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"60",X"10",X"FC",X"E7",X"24", - X"04",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"38",X"24",X"3A",X"E2",X"30", - X"07",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"48",X"1C",X"16",X"DF",X"2F", - X"01",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"03",X"01",X"C0",X"5B",X"08",X"50",X"20",X"60",X"38",X"60",X"F4",X"58",X"F4",X"18",X"8C",X"7F", - X"03",X"07",X"00",X"4A",X"00",X"40",X"20",X"50",X"38",X"50",X"F8",X"18",X"F0",X"58",X"95",X"78", - X"05",X"06",X"00",X"4C",X"00",X"40",X"20",X"40",X"38",X"50",X"F8",X"10",X"EC",X"52",X"A1",X"68", - X"04",X"06",X"00",X"42",X"00",X"50",X"18",X"40",X"38",X"50",X"E8",X"50",X"F0",X"10",X"A4",X"74", - X"05",X"06",X"00",X"3B",X"00",X"50",X"18",X"30",X"40",X"60",X"F4",X"10",X"E8",X"58",X"A8",X"73", - X"04",X"06",X"00",X"3A",X"00",X"50",X"18",X"20",X"40",X"60",X"E8",X"58",X"F4",X"0C",X"A9",X"6D", - X"04",X"07",X"00",X"39",X"00",X"50",X"20",X"20",X"40",X"60",X"E8",X"50",X"E8",X"16",X"A8",X"60", - X"03",X"03",X"80",X"3D",X"00",X"50",X"20",X"20",X"40",X"60",X"E4",X"60",X"E8",X"0C",X"B5",X"44", - X"06",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"03",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"40",X"F0",X"24",X"DB",X"23", - X"2A",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"05",X"01",X"80",X"5C",X"00",X"00",X"10",X"50",X"30",X"70",X"04",X"68",X"BC",X"6A",X"A5",X"6E", - X"04",X"02",X"80",X"58",X"10",X"60",X"08",X"00",X"28",X"70",X"04",X"70",X"B8",X"72",X"A5",X"6D", - X"04",X"03",X"00",X"55",X"08",X"70",X"10",X"50",X"28",X"60",X"B8",X"70",X"0C",X"02",X"A5",X"6F", - X"03",X"03",X"00",X"55",X"10",X"60",X"08",X"00",X"28",X"60",X"04",X"68",X"B8",X"6C",X"A7",X"6E", - X"04",X"03",X"80",X"5A",X"10",X"50",X"28",X"60",X"08",X"00",X"04",X"68",X"BC",X"66",X"A7",X"70", - X"04",X"04",X"00",X"5D",X"08",X"70",X"10",X"50",X"28",X"60",X"BC",X"70",X"0C",X"02",X"A7",X"6E", - X"03",X"03",X"00",X"63",X"10",X"50",X"28",X"60",X"08",X"00",X"04",X"70",X"C0",X"5C",X"A7",X"74", - X"04",X"03",X"00",X"68",X"00",X"60",X"10",X"50",X"28",X"60",X"BC",X"70",X"0C",X"02",X"AC",X"65", - X"03",X"02",X"80",X"72",X"08",X"40",X"08",X"00",X"28",X"40",X"04",X"58",X"C0",X"6E",X"AD",X"68", - X"02",X"01",X"00",X"7A",X"00",X"60",X"18",X"30",X"30",X"40",X"C0",X"78",X"F0",X"04",X"AD",X"6F", - X"03",X"00",X"C0",X"7F",X"00",X"60",X"18",X"20",X"38",X"70",X"C0",X"70",X"F4",X"FC",X"AF",X"66", - X"02",X"00",X"C0",X"88",X"00",X"50",X"28",X"50",X"30",X"50",X"F0",X"08",X"C4",X"62",X"AC",X"6D", - X"04",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"58",X"E4",X"1C",X"C4",X"4F", - X"06",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"40",X"F8",X"24",X"C9",X"25", - X"08",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"38",X"04",X"1E",X"DC",X"3D", - X"01",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"04",X"03",X"80",X"4B",X"18",X"60",X"18",X"10",X"30",X"50",X"08",X"60",X"B4",X"60",X"A0",X"6C", - X"05",X"02",X"80",X"44",X"20",X"70",X"30",X"60",X"10",X"00",X"08",X"60",X"B0",X"62",X"99",X"71", - X"04",X"01",X"80",X"41",X"08",X"60",X"20",X"70",X"38",X"50",X"A8",X"68",X"04",X"00",X"A1",X"5B", - X"0C",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"04",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"48",X"F0",X"2A",X"CC",X"2D", - X"04",X"03",X"80",X"33",X"00",X"50",X"20",X"60",X"38",X"70",X"F0",X"10",X"DC",X"6C",X"96",X"75", - X"04",X"03",X"80",X"33",X"00",X"60",X"28",X"60",X"38",X"70",X"F4",X"08",X"DC",X"72",X"98",X"6F", - X"04",X"02",X"00",X"33",X"00",X"60",X"28",X"60",X"38",X"60",X"DC",X"68",X"9C",X"60",X"F5",X"02", - X"11",X"00",X"E0",X"35",X"00",X"50",X"20",X"30",X"40",X"70",X"F4",X"28",X"D0",X"58",X"9F",X"58", - X"07",X"01",X"80",X"34",X"00",X"50",X"28",X"50",X"38",X"60",X"F4",X"38",X"D0",X"42",X"A1",X"56", - X"09",X"01",X"40",X"34",X"08",X"60",X"30",X"50",X"40",X"60",X"F0",X"38",X"D4",X"30",X"A3",X"52", - X"16",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"03",X"00",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"38",X"F8",X"20",X"C9",X"36", - X"03",X"07",X"00",X"46",X"08",X"10",X"20",X"60",X"28",X"50",X"00",X"60",X"BC",X"6E",X"A5",X"6D", - X"05",X"06",X"00",X"45",X"00",X"60",X"20",X"60",X"28",X"60",X"00",X"08",X"C4",X"60",X"AC",X"68", - X"03",X"06",X"00",X"4A",X"00",X"60",X"20",X"50",X"28",X"60",X"F4",X"10",X"C8",X"5C",X"B3",X"67", - X"04",X"06",X"00",X"4C",X"00",X"60",X"20",X"50",X"28",X"60",X"F0",X"10",X"CC",X"62",X"B6",X"61", - X"03",X"07",X"00",X"55",X"F8",X"50",X"20",X"50",X"30",X"50",X"F4",X"10",X"D8",X"60",X"B0",X"6C", - X"04",X"05",X"00",X"67",X"00",X"00",X"18",X"50",X"28",X"40",X"F8",X"50",X"E4",X"58",X"A7",X"67", - X"03",X"05",X"00",X"75",X"10",X"50",X"20",X"40",X"30",X"40",X"F4",X"48",X"E4",X"60",X"9E",X"6F", - X"03",X"02",X"80",X"79",X"08",X"20",X"18",X"50",X"38",X"50",X"EC",X"50",X"E4",X"5E",X"9E",X"6A", - X"03",X"01",X"C0",X"7C",X"08",X"10",X"10",X"50",X"38",X"50",X"E8",X"60",X"DC",X"68",X"A0",X"6D", - X"04",X"01",X"C0",X"81",X"10",X"50",X"10",X"10",X"40",X"60",X"E4",X"68",X"D4",X"68",X"A2",X"70", - X"03",X"01",X"C0",X"86",X"10",X"20",X"10",X"40",X"38",X"60",X"E4",X"60",X"D4",X"66",X"A2",X"71", - X"01",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"04",X"00",X"A0",X"56",X"08",X"60",X"20",X"70",X"28",X"40",X"AC",X"78",X"0C",X"FC",X"9A",X"6C", - X"03",X"03",X"80",X"47",X"08",X"10",X"20",X"60",X"38",X"60",X"04",X"58",X"BC",X"6E",X"A4",X"75", - X"04",X"07",X"00",X"3E",X"08",X"00",X"20",X"60",X"40",X"70",X"FC",X"60",X"C8",X"74",X"A8",X"73", - X"03",X"06",X"00",X"38",X"F8",X"50",X"20",X"50",X"40",X"60",X"D8",X"60",X"F8",X"00",X"AC",X"64", - X"03",X"06",X"00",X"35",X"00",X"50",X"20",X"40",X"40",X"50",X"F0",X"10",X"E0",X"5E",X"A8",X"5E", - X"02",X"02",X"00",X"5A",X"F8",X"30",X"20",X"50",X"38",X"50",X"E0",X"58",X"08",X"FC",X"A9",X"4C", - X"05",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"03",X"00",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"40",X"14",X"40",X"E9",X"24", - X"05",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"50",X"14",X"42",X"EE",X"19", - X"03",X"02",X"80",X"4C",X"08",X"50",X"20",X"50",X"40",X"40",X"EC",X"50",X"EC",X"0E",X"A3",X"5C", - X"02",X"05",X"00",X"2F",X"00",X"50",X"18",X"60",X"40",X"50",X"EC",X"58",X"EC",X"0E",X"A5",X"5F", - X"05",X"05",X"00",X"2E",X"00",X"50",X"20",X"50",X"40",X"50",X"E8",X"48",X"E4",X"16",X"AB",X"5A", - X"05",X"04",X"00",X"2D",X"00",X"40",X"20",X"50",X"40",X"50",X"E4",X"48",X"E8",X"1C",X"AF",X"62", - X"06",X"03",X"80",X"2D",X"F8",X"50",X"20",X"40",X"40",X"50",X"DC",X"50",X"F0",X"0A",X"BA",X"5D", - X"05",X"03",X"00",X"30",X"F8",X"40",X"20",X"40",X"40",X"50",X"DC",X"50",X"F0",X"04",X"BB",X"67", - X"05",X"02",X"80",X"30",X"F8",X"50",X"20",X"50",X"40",X"50",X"F4",X"08",X"D0",X"5E",X"B7",X"65", - X"05",X"03",X"80",X"38",X"F8",X"50",X"20",X"50",X"40",X"60",X"F8",X"08",X"CC",X"5C",X"B3",X"64", - X"03",X"02",X"80",X"55",X"F8",X"60",X"20",X"60",X"40",X"60",X"C8",X"60",X"B0",X"60",X"F8",X"01", - X"03",X"00",X"E0",X"69",X"00",X"50",X"20",X"60",X"40",X"50",X"C4",X"60",X"F0",X"02",X"AA",X"64", - X"02",X"00",X"70",X"77",X"00",X"40",X"20",X"50",X"38",X"40",X"C0",X"68",X"F8",X"FE",X"A7",X"5F", - X"02",X"00",X"80",X"85",X"F8",X"60",X"18",X"60",X"38",X"50",X"C4",X"68",X"0C",X"FE",X"A3",X"62", - X"0E",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"01",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"10",X"14",X"14",X"BC",X"41", - X"01",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"30",X"F8",X"1C",X"DF",X"13", - X"02",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"38",X"F4",X"28",X"E7",X"11", - X"01",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"07",X"00",X"C0",X"3C",X"F0",X"60",X"18",X"60",X"30",X"50",X"D4",X"50",X"0C",X"F8",X"9B",X"5C", - X"07",X"00",X"A0",X"3B",X"E8",X"60",X"18",X"70",X"38",X"50",X"D0",X"48",X"04",X"FA",X"A0",X"56", - X"05",X"01",X"80",X"3C",X"F8",X"10",X"18",X"50",X"38",X"50",X"EC",X"50",X"C8",X"42",X"AB",X"4C", - X"05",X"01",X"00",X"38",X"E8",X"60",X"18",X"60",X"40",X"60",X"C8",X"58",X"E8",X"04",X"AA",X"55", - X"06",X"01",X"C0",X"37",X"E8",X"50",X"18",X"60",X"40",X"60",X"D0",X"50",X"EC",X"02",X"A9",X"5A", - X"06",X"04",X"00",X"37",X"E8",X"50",X"18",X"60",X"40",X"60",X"F4",X"08",X"D4",X"56",X"A7",X"5C", - X"07",X"05",X"00",X"37",X"E8",X"40",X"20",X"70",X"40",X"60",X"D8",X"58",X"F4",X"00",X"A8",X"59", - X"05",X"03",X"80",X"39",X"E8",X"50",X"18",X"60",X"40",X"60",X"DC",X"50",X"F0",X"FE",X"AD",X"48", - X"05",X"02",X"00",X"3B",X"F0",X"40",X"10",X"50",X"40",X"60",X"DC",X"58",X"EC",X"02",X"B1",X"3F", - X"03",X"02",X"80",X"3E",X"00",X"10",X"18",X"50",X"38",X"60",X"FC",X"40",X"DC",X"56",X"A8",X"45", - X"08",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"58",X"1C",X"32",X"EA",X"1F", - X"06",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"2C",X"32",X"E7",X"20", - X"08",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"48",X"EC",X"00",X"12",X"17", - X"04",X"02",X"00",X"60",X"00",X"60",X"20",X"60",X"38",X"50",X"E0",X"68",X"F8",X"04",X"95",X"74", - X"04",X"03",X"80",X"79",X"00",X"50",X"18",X"60",X"38",X"50",X"FC",X"08",X"E4",X"60",X"9F",X"69", - X"03",X"03",X"00",X"81",X"00",X"40",X"18",X"60",X"30",X"40",X"F8",X"10",X"E8",X"5C",X"9F",X"67", - X"04",X"02",X"80",X"85",X"00",X"50",X"20",X"60",X"38",X"50",X"EC",X"60",X"F4",X"08",X"9A",X"6E", - X"03",X"01",X"40",X"81",X"00",X"40",X"20",X"60",X"38",X"60",X"F0",X"60",X"F4",X"04",X"A2",X"58", - X"01",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"06",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"38",X"E4",X"08",X"FB",X"44", - X"07",X"00",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"38",X"E0",X"08",X"FD",X"49", - X"05",X"08",X"00",X"30",X"08",X"50",X"20",X"40",X"40",X"60",X"EC",X"58",X"DC",X"1E",X"A7",X"5D", - X"04",X"08",X"00",X"2C",X"08",X"50",X"20",X"40",X"40",X"50",X"F0",X"48",X"E0",X"1C",X"A8",X"5D", - X"05",X"08",X"00",X"2B",X"00",X"50",X"28",X"50",X"40",X"60",X"EC",X"48",X"E8",X"18",X"A7",X"5E", - X"06",X"06",X"00",X"2B",X"00",X"50",X"20",X"40",X"38",X"50",X"F0",X"18",X"E8",X"56",X"A8",X"5D", - X"03",X"06",X"00",X"2D",X"00",X"50",X"20",X"40",X"38",X"60",X"F0",X"18",X"E4",X"4C",X"A3",X"5F", - X"03",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"30",X"F8",X"42",X"DD",X"6C", - X"05",X"06",X"00",X"41",X"00",X"50",X"18",X"40",X"30",X"60",X"F8",X"10",X"E8",X"62",X"9F",X"6F", - X"05",X"04",X"00",X"75",X"00",X"50",X"20",X"50",X"30",X"40",X"FC",X"08",X"E8",X"62",X"9F",X"6F", - X"07",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"01",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"30",X"F8",X"1C",X"DF",X"13", - X"02",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"38",X"F4",X"28",X"E7",X"11", - X"01",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"03",X"00",X"A0",X"7C",X"08",X"70",X"20",X"60",X"38",X"60",X"FC",X"18",X"EC",X"6A",X"8E",X"71", - X"02",X"01",X"C0",X"73",X"08",X"40",X"18",X"40",X"38",X"50",X"F4",X"48",X"DC",X"58",X"97",X"6D", - X"02",X"01",X"C0",X"72",X"10",X"30",X"18",X"20",X"28",X"30",X"F4",X"38",X"D8",X"5C",X"99",X"6D", - X"03",X"00",X"E0",X"79",X"18",X"40",X"28",X"30",X"10",X"10",X"F4",X"50",X"CC",X"54",X"9F",X"5E", - X"0E",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"04",X"00",X"E0",X"53",X"10",X"50",X"08",X"00",X"38",X"60",X"00",X"58",X"C0",X"76",X"91",X"74", - X"02",X"01",X"00",X"4D",X"08",X"60",X"18",X"60",X"38",X"60",X"FC",X"00",X"C0",X"72",X"9A",X"64", - X"03",X"03",X"80",X"45",X"08",X"10",X"20",X"50",X"30",X"60",X"04",X"60",X"C4",X"76",X"9A",X"71", - X"04",X"03",X"80",X"3D",X"08",X"00",X"20",X"60",X"30",X"60",X"04",X"68",X"C8",X"72",X"9E",X"71", - X"04",X"03",X"00",X"39",X"00",X"00",X"18",X"60",X"30",X"60",X"00",X"60",X"C8",X"5E",X"A0",X"65", - X"03",X"03",X"00",X"36",X"08",X"00",X"18",X"60",X"30",X"60",X"00",X"60",X"C4",X"64",X"9F",X"64", - X"06",X"01",X"C0",X"35",X"18",X"60",X"28",X"50",X"08",X"00",X"00",X"58",X"B8",X"72",X"9C",X"68", - X"04",X"01",X"C0",X"39",X"00",X"60",X"20",X"60",X"30",X"60",X"00",X"00",X"B8",X"70",X"9C",X"65", - X"05",X"03",X"80",X"47",X"00",X"60",X"20",X"60",X"30",X"60",X"00",X"08",X"C4",X"60",X"9C",X"6C", - X"03",X"06",X"00",X"50",X"F8",X"60",X"20",X"60",X"38",X"60",X"FC",X"08",X"D8",X"64",X"9D",X"75", - X"04",X"07",X"00",X"53",X"F8",X"60",X"20",X"60",X"38",X"60",X"F8",X"08",X"DC",X"6A",X"9E",X"74", - X"02",X"07",X"00",X"4F",X"F8",X"60",X"20",X"60",X"38",X"60",X"FC",X"08",X"E0",X"6A",X"9F",X"71", - X"04",X"01",X"C0",X"43",X"F8",X"60",X"28",X"50",X"38",X"60",X"E0",X"60",X"F8",X"F6",X"9E",X"69", - X"0E",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"02",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"40",X"F8",X"18",X"E0",X"29", - X"03",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"48",X"F8",X"36",X"E7",X"0B", - X"01",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"03",X"01",X"80",X"4E",X"00",X"50",X"28",X"50",X"38",X"60",X"E4",X"60",X"F0",X"0A",X"91",X"77", - X"03",X"04",X"00",X"51",X"F8",X"50",X"20",X"40",X"38",X"60",X"FC",X"18",X"E0",X"5E",X"8E",X"7B", - X"04",X"02",X"80",X"54",X"F8",X"50",X"20",X"50",X"38",X"70",X"F8",X"08",X"D0",X"5E",X"91",X"79", - X"03",X"01",X"C0",X"51",X"00",X"60",X"28",X"60",X"40",X"70",X"C0",X"68",X"F4",X"00",X"95",X"73", - X"03",X"01",X"40",X"4F",X"00",X"70",X"28",X"50",X"38",X"60",X"B8",X"78",X"F0",X"02",X"9A",X"6D", - X"03",X"01",X"80",X"34",X"00",X"60",X"30",X"70",X"38",X"60",X"F4",X"08",X"BC",X"72",X"9B",X"6E", - X"03",X"02",X"80",X"2C",X"00",X"60",X"30",X"70",X"40",X"70",X"F0",X"10",X"C4",X"6E",X"96",X"7A", - X"04",X"05",X"00",X"2F",X"00",X"60",X"28",X"60",X"40",X"70",X"F8",X"08",X"C8",X"64",X"9A",X"71", - X"04",X"07",X"00",X"32",X"00",X"60",X"28",X"50",X"38",X"60",X"F4",X"10",X"D4",X"64",X"A1",X"60", - X"03",X"03",X"80",X"3E",X"F8",X"60",X"20",X"30",X"30",X"50",X"F8",X"08",X"E0",X"5C",X"A3",X"5C", - X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"14",X"18",X"D8",X"0E",X"E9",X"39", - X"04",X"06",X"00",X"4F",X"F8",X"70",X"28",X"50",X"40",X"60",X"E4",X"60",X"F0",X"14",X"98",X"75", - X"03",X"06",X"00",X"66",X"F8",X"60",X"28",X"60",X"38",X"50",X"FC",X"08",X"E8",X"5E",X"9C",X"6B", - X"03",X"03",X"80",X"6F",X"F8",X"60",X"28",X"50",X"30",X"50",X"FC",X"00",X"EC",X"5C",X"99",X"69", - X"17",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"03",X"02",X"80",X"74",X"08",X"40",X"18",X"50",X"30",X"50",X"FC",X"18",X"F0",X"64",X"8F",X"7A", - X"03",X"05",X"00",X"74",X"00",X"50",X"18",X"60",X"30",X"50",X"00",X"10",X"EC",X"60",X"97",X"75", - X"04",X"06",X"00",X"6E",X"00",X"50",X"18",X"60",X"28",X"40",X"FC",X"08",X"E8",X"60",X"A1",X"6A", - X"04",X"05",X"00",X"74",X"00",X"50",X"18",X"60",X"28",X"40",X"F4",X"08",X"E8",X"5C",X"A3",X"68", - X"03",X"06",X"00",X"75",X"00",X"50",X"18",X"60",X"28",X"40",X"F8",X"10",X"E4",X"5C",X"A3",X"6A", - X"03",X"06",X"00",X"7B",X"00",X"50",X"18",X"50",X"30",X"40",X"FC",X"10",X"E4",X"60",X"A5",X"66", - X"03",X"04",X"00",X"89",X"00",X"00",X"18",X"40",X"28",X"40",X"FC",X"58",X"E0",X"66",X"A6",X"67", - X"03",X"00",X"C0",X"A2",X"F8",X"60",X"28",X"60",X"28",X"20",X"D8",X"60",X"F4",X"06",X"AA",X"53", - X"01",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"03",X"07",X"00",X"5D",X"00",X"50",X"18",X"60",X"38",X"60",X"F8",X"20",X"EC",X"4A",X"95",X"72", - X"03",X"06",X"00",X"6D",X"00",X"60",X"18",X"60",X"38",X"60",X"00",X"10",X"EC",X"58",X"97",X"70", - X"03",X"04",X"00",X"72",X"00",X"60",X"18",X"40",X"30",X"50",X"E4",X"60",X"F4",X"06",X"A1",X"5F", - X"03",X"01",X"40",X"7D",X"00",X"50",X"28",X"50",X"38",X"50",X"E0",X"58",X"E4",X"10",X"A9",X"4C", - X"03",X"00",X"70",X"81",X"00",X"10",X"10",X"30",X"38",X"60",X"F8",X"50",X"D8",X"52",X"A1",X"52", - X"03",X"00",X"40",X"89",X"F8",X"40",X"10",X"30",X"38",X"50",X"D0",X"48",X"04",X"F2",X"A5",X"4E", - X"0F",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"04",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"50",X"E8",X"36",X"CC",X"4F", - X"07",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"48",X"F0",X"3A",X"D3",X"4B", - X"08",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"48",X"F0",X"32",X"D7",X"3F", - X"08",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"48",X"F0",X"30",X"D7",X"4A", - X"09",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"48",X"F0",X"2E",X"D0",X"44", - X"05",X"00",X"C0",X"36",X"E8",X"30",X"18",X"30",X"30",X"40",X"C8",X"58",X"F8",X"00",X"AC",X"49", - X"05",X"00",X"C0",X"35",X"E8",X"40",X"18",X"40",X"30",X"40",X"CC",X"50",X"EC",X"FE",X"A7",X"59", - X"04",X"01",X"40",X"30",X"F0",X"40",X"18",X"30",X"38",X"60",X"D8",X"70",X"E0",X"08",X"A5",X"6B", - X"06",X"03",X"80",X"2E",X"F8",X"40",X"20",X"40",X"40",X"60",X"DC",X"60",X"E0",X"0C",X"AB",X"5E", - X"08",X"07",X"00",X"30",X"00",X"60",X"10",X"10",X"40",X"70",X"E4",X"50",X"E4",X"10",X"B5",X"53", - X"04",X"03",X"00",X"42",X"00",X"30",X"10",X"30",X"40",X"60",X"E0",X"48",X"E0",X"0C",X"B9",X"41", - X"02",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"04",X"07",X"00",X"4E",X"00",X"60",X"28",X"30",X"38",X"60",X"F0",X"28",X"DC",X"4E",X"A5",X"60", - X"02",X"05",X"00",X"70",X"00",X"40",X"10",X"20",X"38",X"40",X"F4",X"08",X"DC",X"58",X"AC",X"55", - X"03",X"03",X"00",X"7E",X"F8",X"50",X"18",X"50",X"40",X"50",X"F8",X"08",X"CC",X"48",X"AC",X"50", - X"0B",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"03",X"01",X"C0",X"7D",X"00",X"60",X"18",X"70",X"48",X"70",X"FC",X"08",X"C0",X"66",X"9F",X"69", - X"03",X"02",X"00",X"91",X"00",X"60",X"18",X"70",X"48",X"70",X"FC",X"08",X"BC",X"66",X"A3",X"64", - X"03",X"01",X"80",X"9C",X"00",X"60",X"18",X"60",X"40",X"60",X"F8",X"00",X"BC",X"60",X"A5",X"64", - X"02",X"01",X"00",X"A5",X"00",X"70",X"18",X"60",X"40",X"60",X"BC",X"60",X"F8",X"00",X"A7",X"5E", - X"03",X"01",X"00",X"B1",X"08",X"70",X"20",X"70",X"40",X"60",X"BC",X"70",X"F4",X"02",X"A6",X"5E", - X"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"01",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"04",X"05",X"00",X"36",X"08",X"40",X"28",X"60",X"38",X"50",X"F4",X"58",X"F0",X"14",X"8E",X"7E", - X"03",X"07",X"00",X"3A",X"08",X"50",X"28",X"60",X"38",X"50",X"F4",X"60",X"EC",X"10",X"93",X"73", - X"05",X"06",X"00",X"39",X"00",X"50",X"28",X"50",X"38",X"50",X"F0",X"60",X"EC",X"0C",X"9C",X"67", - X"03",X"07",X"00",X"3B",X"08",X"50",X"28",X"40",X"38",X"60",X"EC",X"60",X"E8",X"12",X"9F",X"72", - X"03",X"06",X"00",X"3A",X"08",X"50",X"28",X"40",X"40",X"60",X"EC",X"58",X"E4",X"1C",X"A0",X"71", - X"03",X"02",X"80",X"71",X"00",X"40",X"28",X"30",X"38",X"40",X"E8",X"68",X"E8",X"14",X"A1",X"70", - X"1A",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"02",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"50",X"08",X"40",X"CF",X"35", - X"03",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"58",X"1C",X"2E",X"E5",X"47", - X"01",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"01",X"00",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"38",X"0C",X"42",X"E3",X"12", - X"02",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"38",X"04",X"34",X"CD",X"24", - X"03",X"05",X"00",X"47",X"10",X"50",X"20",X"50",X"30",X"60",X"F4",X"70",X"E8",X"1C",X"98",X"6E", - X"04",X"06",X"00",X"3D",X"08",X"50",X"20",X"40",X"38",X"60",X"F0",X"60",X"E8",X"1A",X"9E",X"6D", - X"05",X"06",X"00",X"32",X"00",X"50",X"20",X"40",X"38",X"50",X"F0",X"58",X"E4",X"1C",X"A4",X"6A", - X"05",X"06",X"00",X"33",X"00",X"50",X"20",X"30",X"38",X"40",X"EC",X"50",X"E4",X"14",X"AA",X"61", - X"03",X"06",X"00",X"39",X"00",X"50",X"18",X"20",X"40",X"50",X"E8",X"50",X"F0",X"0E",X"AB",X"66", - X"03",X"01",X"40",X"47",X"00",X"40",X"18",X"20",X"40",X"50",X"E8",X"50",X"AC",X"60",X"DE",X"12", - X"1A",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"02",X"00",X"28",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"60",X"00",X"34",X"D0",X"24", - X"03",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"40",X"F0",X"FA",X"FC",X"43", - X"01",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"05",X"05",X"00",X"49",X"08",X"40",X"10",X"30",X"30",X"50",X"F4",X"50",X"E4",X"16",X"9A",X"75", - X"05",X"06",X"00",X"3D",X"00",X"30",X"10",X"50",X"40",X"50",X"F0",X"50",X"E8",X"0A",X"A1",X"6B", - X"05",X"04",X"00",X"35",X"10",X"40",X"18",X"20",X"40",X"60",X"E8",X"58",X"A8",X"5E",X"D7",X"19", - X"05",X"01",X"C0",X"30",X"00",X"20",X"18",X"60",X"40",X"50",X"E4",X"50",X"DC",X"0E",X"AB",X"55", - X"03",X"01",X"40",X"35",X"F8",X"40",X"20",X"60",X"48",X"70",X"DC",X"50",X"E8",X"00",X"AA",X"46", - X"0A",X"00",X"E0",X"2F",X"F8",X"40",X"18",X"60",X"48",X"60",X"E0",X"40",X"F4",X"02",X"93",X"65", - X"08",X"00",X"A0",X"32",X"F0",X"40",X"18",X"60",X"30",X"40",X"DC",X"50",X"04",X"FC",X"8D",X"6E", - X"06",X"00",X"50",X"34",X"F8",X"30",X"20",X"30",X"38",X"40",X"E4",X"38",X"F8",X"02",X"8B",X"71", - X"06",X"00",X"70",X"35",X"08",X"10",X"20",X"40",X"38",X"50",X"F4",X"50",X"E8",X"1A",X"90",X"67", - X"0B",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"07",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"38",X"00",X"42",X"DD",X"1F", - X"06",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"14",X"40",X"E4",X"00",X"E7",X"42", - X"05",X"03",X"00",X"8E",X"18",X"60",X"30",X"50",X"10",X"00",X"F0",X"58",X"E0",X"64",X"99",X"70", - X"03",X"02",X"80",X"8A",X"18",X"60",X"08",X"00",X"28",X"50",X"EC",X"60",X"DC",X"66",X"9C",X"6B", - X"04",X"02",X"80",X"B1",X"00",X"10",X"18",X"50",X"30",X"30",X"F0",X"58",X"DC",X"64",X"A2",X"6D", - X"02",X"02",X"80",X"C7",X"00",X"00",X"18",X"60",X"28",X"30",X"F0",X"50",X"E0",X"5C",X"A2",X"6E", - X"01",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"06",X"02",X"00",X"2D",X"08",X"70",X"20",X"50",X"40",X"50",X"C0",X"58",X"F0",X"04",X"AD",X"5B", - X"07",X"03",X"00",X"2C",X"08",X"60",X"20",X"60",X"40",X"50",X"F8",X"08",X"BC",X"78",X"A8",X"5C", - X"05",X"02",X"80",X"2A",X"08",X"70",X"20",X"60",X"38",X"60",X"BC",X"78",X"A4",X"66",X"F6",X"01", - X"05",X"01",X"C0",X"27",X"00",X"60",X"20",X"60",X"38",X"60",X"C0",X"60",X"F4",X"00",X"A0",X"74", - X"06",X"01",X"80",X"26",X"08",X"70",X"18",X"60",X"38",X"60",X"BC",X"60",X"F0",X"00",X"A0",X"76", - X"08",X"01",X"80",X"26",X"00",X"60",X"18",X"50",X"30",X"40",X"BC",X"60",X"F4",X"00",X"9F",X"78", - X"08",X"02",X"00",X"29",X"00",X"60",X"18",X"60",X"30",X"30",X"BC",X"70",X"04",X"FC",X"9B",X"77", - X"06",X"01",X"80",X"2D",X"00",X"50",X"18",X"50",X"28",X"20",X"B4",X"78",X"0C",X"FC",X"9B",X"71", - X"03",X"01",X"00",X"39",X"00",X"50",X"18",X"50",X"30",X"50",X"B4",X"60",X"F8",X"FC",X"9C",X"6D", - X"03",X"00",X"E0",X"3E",X"00",X"40",X"18",X"50",X"30",X"50",X"B0",X"68",X"F8",X"00",X"99",X"73", - X"03",X"01",X"40",X"50",X"00",X"60",X"18",X"50",X"28",X"50",X"B0",X"70",X"00",X"FE",X"99",X"6E", - X"04",X"01",X"40",X"68",X"00",X"60",X"18",X"50",X"28",X"60",X"B0",X"70",X"0C",X"00",X"9A",X"69", - X"03",X"00",X"C0",X"6D",X"00",X"60",X"18",X"60",X"20",X"40",X"B4",X"60",X"04",X"FC",X"9E",X"64", - X"03",X"00",X"A0",X"70",X"08",X"60",X"20",X"50",X"30",X"40",X"B0",X"60",X"08",X"00",X"9C",X"65", - X"03",X"00",X"40",X"7D",X"08",X"50",X"28",X"30",X"18",X"10",X"AC",X"70",X"10",X"02",X"9C",X"61", - X"01",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"04",X"02",X"80",X"54",X"10",X"20",X"18",X"50",X"30",X"60",X"00",X"70",X"BC",X"76",X"A3",X"6C", - X"04",X"02",X"80",X"51",X"08",X"10",X"18",X"60",X"30",X"60",X"04",X"68",X"BC",X"62",X"A0",X"72", - X"03",X"03",X"00",X"4B",X"00",X"00",X"20",X"60",X"30",X"60",X"04",X"68",X"B8",X"6C",X"A0",X"71", - X"05",X"02",X"80",X"43",X"00",X"70",X"20",X"60",X"28",X"40",X"B4",X"68",X"08",X"FC",X"A2",X"61", - X"04",X"02",X"00",X"41",X"00",X"00",X"20",X"70",X"40",X"50",X"04",X"60",X"B4",X"62",X"9E",X"6C", - X"04",X"01",X"C0",X"3F",X"00",X"60",X"20",X"60",X"40",X"50",X"FC",X"00",X"B4",X"6C",X"9B",X"71", - X"04",X"02",X"00",X"3C",X"00",X"00",X"18",X"60",X"38",X"40",X"00",X"60",X"B4",X"6C",X"9B",X"6F", - X"05",X"01",X"80",X"3E",X"18",X"50",X"00",X"00",X"28",X"40",X"00",X"50",X"B0",X"72",X"97",X"74", - X"05",X"01",X"C0",X"41",X"00",X"00",X"18",X"70",X"30",X"60",X"00",X"58",X"B0",X"70",X"98",X"72", - X"03",X"02",X"00",X"4A",X"18",X"70",X"30",X"50",X"08",X"00",X"00",X"50",X"B0",X"74",X"9B",X"67", - X"03",X"01",X"C0",X"5A",X"18",X"60",X"10",X"00",X"28",X"50",X"FC",X"58",X"B0",X"6A",X"97",X"70", - X"03",X"00",X"E0",X"63",X"00",X"00",X"18",X"60",X"38",X"60",X"00",X"48",X"AC",X"74",X"9E",X"62", - X"03",X"00",X"A0",X"69",X"08",X"40",X"18",X"50",X"38",X"50",X"B4",X"68",X"F4",X"00",X"A3",X"5B", - X"04",X"00",X"70",X"74",X"00",X"50",X"20",X"50",X"40",X"60",X"FC",X"00",X"B0",X"78",X"9D",X"64", - X"03",X"00",X"80",X"83",X"00",X"60",X"20",X"50",X"40",X"70",X"B4",X"70",X"04",X"FE",X"9C",X"6A", - X"02",X"00",X"38",X"88",X"00",X"50",X"20",X"60",X"40",X"60",X"B0",X"70",X"04",X"FE",X"A5",X"4B", - X"04",X"00",X"38",X"80",X"08",X"40",X"20",X"40",X"38",X"50",X"B4",X"78",X"FC",X"FA",X"B5",X"39", - X"01",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"07",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"58",X"20",X"36",X"E5",X"20", - X"05",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"50",X"1C",X"36",X"ED",X"20", - X"08",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"60",X"18",X"26",X"F4",X"20", - X"06",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"50",X"1C",X"26",X"ED",X"2A", - X"03",X"00",X"38",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"60",X"18",X"42",X"E0",X"3E", - X"0A",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"03",X"00",X"50",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"50",X"FC",X"10",X"D0",X"5E", - X"02",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"04",X"03",X"00",X"34",X"F8",X"50",X"20",X"70",X"30",X"60",X"F8",X"08",X"C4",X"5A",X"95",X"78", - X"06",X"04",X"00",X"2D",X"F8",X"50",X"20",X"60",X"28",X"40",X"F8",X"18",X"BC",X"70",X"9F",X"6D", - X"03",X"02",X"80",X"29",X"00",X"60",X"20",X"50",X"30",X"40",X"F4",X"08",X"C0",X"64",X"9C",X"7A", - X"05",X"01",X"40",X"26",X"00",X"60",X"20",X"70",X"38",X"50",X"C8",X"48",X"EC",X"00",X"9F",X"79", - X"06",X"00",X"A0",X"24",X"00",X"40",X"20",X"70",X"38",X"50",X"C0",X"48",X"EC",X"02",X"A5",X"6B", - X"09",X"00",X"70",X"20",X"00",X"40",X"20",X"70",X"38",X"40",X"C4",X"40",X"E8",X"FE",X"A5",X"6F", - X"06",X"00",X"A0",X"23",X"00",X"40",X"20",X"60",X"38",X"40",X"B0",X"78",X"F8",X"FE",X"9F",X"79", - X"04",X"00",X"E0",X"29",X"00",X"60",X"20",X"60",X"38",X"60",X"B4",X"68",X"F4",X"02",X"A4",X"61", - X"06",X"01",X"40",X"32",X"00",X"60",X"20",X"60",X"40",X"60",X"FC",X"00",X"B4",X"68",X"A5",X"5F", - X"05",X"01",X"40",X"3E",X"F8",X"60",X"20",X"60",X"38",X"60",X"B8",X"68",X"F4",X"02",X"A4",X"68", - X"04",X"02",X"80",X"58",X"08",X"00",X"20",X"60",X"38",X"60",X"F0",X"58",X"C0",X"66",X"A5",X"69", - X"03",X"01",X"00",X"65",X"E8",X"60",X"20",X"60",X"30",X"50",X"C4",X"60",X"FC",X"00",X"A7",X"69", - X"03",X"01",X"40",X"6E",X"E8",X"60",X"20",X"60",X"28",X"40",X"CC",X"58",X"04",X"FC",X"A9",X"62", - X"03",X"01",X"00",X"77",X"E8",X"50",X"20",X"60",X"28",X"30",X"D4",X"58",X"04",X"FE",X"A8",X"65", - X"05",X"00",X"C0",X"76",X"E8",X"50",X"20",X"60",X"28",X"20",X"D8",X"58",X"00",X"FC",X"A7",X"69", - X"01",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"03",X"02",X"80",X"45",X"00",X"60",X"20",X"40",X"30",X"50",X"00",X"18",X"BC",X"60",X"A1",X"65", - X"03",X"06",X"00",X"4B",X"08",X"60",X"28",X"60",X"38",X"60",X"00",X"00",X"CC",X"6E",X"9D",X"6A", - X"05",X"06",X"00",X"3E",X"08",X"60",X"28",X"50",X"38",X"50",X"EC",X"10",X"D4",X"5C",X"AF",X"63", - X"05",X"06",X"00",X"38",X"00",X"50",X"20",X"30",X"38",X"40",X"EC",X"10",X"DC",X"50",X"B6",X"5D", - X"06",X"06",X"00",X"37",X"00",X"50",X"20",X"30",X"38",X"40",X"E0",X"50",X"E4",X"16",X"BC",X"58", - X"03",X"06",X"00",X"3E",X"00",X"50",X"20",X"30",X"38",X"50",X"E4",X"50",X"E4",X"16",X"B9",X"5B", - X"04",X"04",X"00",X"4A",X"00",X"40",X"20",X"30",X"38",X"40",X"E4",X"48",X"B8",X"60",X"DF",X"11", - X"05",X"02",X"00",X"6D",X"00",X"50",X"28",X"40",X"38",X"40",X"E4",X"60",X"E0",X"0C",X"BB",X"5A", - X"05",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"24",X"38",X"F0",X"42",X"C6",X"40", - X"05",X"00",X"14",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"2C",X"40",X"F0",X"3E",X"C0",X"41", - X"07",X"00",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"34",X"30",X"20",X"3A",X"EA",X"28", - X"0C",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"02",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"38",X"F8",X"34",X"D1",X"27", - X"02",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"58",X"F0",X"FA",X"F5",X"24", - X"01",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"04",X"00",X"80",X"5E",X"10",X"60",X"20",X"60",X"38",X"50",X"F0",X"60",X"F8",X"04",X"8F",X"74", - X"03",X"01",X"80",X"4A",X"08",X"40",X"20",X"60",X"38",X"60",X"04",X"18",X"F0",X"60",X"8C",X"77", - X"04",X"03",X"00",X"3C",X"00",X"50",X"20",X"60",X"40",X"60",X"00",X"08",X"F0",X"60",X"93",X"6B", - X"03",X"03",X"80",X"36",X"00",X"10",X"28",X"60",X"40",X"60",X"FC",X"50",X"E8",X"58",X"97",X"65", - X"05",X"01",X"80",X"30",X"00",X"50",X"28",X"60",X"38",X"60",X"F8",X"10",X"D8",X"52",X"9D",X"5C", - X"06",X"00",X"C0",X"2A",X"00",X"50",X"28",X"70",X"38",X"60",X"CC",X"58",X"EC",X"08",X"A7",X"4B", - X"06",X"00",X"70",X"2B",X"00",X"60",X"28",X"50",X"38",X"60",X"BC",X"78",X"F0",X"06",X"A3",X"52", - X"06",X"00",X"38",X"27",X"08",X"60",X"30",X"60",X"30",X"30",X"C0",X"48",X"EC",X"02",X"A2",X"55", - X"06",X"00",X"50",X"29",X"08",X"60",X"30",X"70",X"38",X"50",X"EC",X"08",X"B8",X"52",X"AF",X"42", - X"04",X"00",X"60",X"2A",X"08",X"70",X"30",X"60",X"28",X"30",X"CC",X"78",X"E8",X"0A",X"9A",X"72", - X"04",X"01",X"00",X"45",X"08",X"70",X"28",X"50",X"30",X"30",X"E0",X"68",X"EC",X"0A",X"A2",X"69", - X"06",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"05",X"01",X"C0",X"51",X"10",X"60",X"20",X"30",X"40",X"60",X"EC",X"50",X"A8",X"6C",X"DF",X"13", - X"04",X"05",X"00",X"3B",X"08",X"50",X"10",X"20",X"40",X"60",X"EC",X"48",X"E4",X"12",X"AD",X"67", - X"07",X"05",X"00",X"33",X"08",X"50",X"18",X"30",X"40",X"50",X"E8",X"50",X"B4",X"60",X"E0",X"14", - X"06",X"02",X"80",X"2D",X"08",X"40",X"18",X"20",X"38",X"60",X"E0",X"50",X"DC",X"1E",X"AE",X"5D", - X"07",X"00",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"40",X"EC",X"22",X"DB",X"19", - X"19",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"05",X"01",X"80",X"43",X"08",X"60",X"20",X"70",X"40",X"40",X"C4",X"60",X"F0",X"04",X"A4",X"77", - X"03",X"03",X"80",X"3A",X"08",X"70",X"20",X"60",X"48",X"50",X"C0",X"60",X"F4",X"00",X"A8",X"61", - X"04",X"02",X"00",X"35",X"08",X"60",X"20",X"70",X"48",X"50",X"F4",X"00",X"BC",X"74",X"A4",X"6F", - X"04",X"01",X"C0",X"30",X"08",X"60",X"20",X"70",X"50",X"50",X"C4",X"60",X"E8",X"04",X"A6",X"6F", - X"07",X"00",X"E0",X"2C",X"08",X"40",X"18",X"50",X"38",X"30",X"C0",X"60",X"E4",X"06",X"AB",X"61", - X"06",X"01",X"00",X"2A",X"10",X"70",X"20",X"70",X"40",X"40",X"BC",X"60",X"E4",X"02",X"AA",X"5E", - X"07",X"01",X"00",X"2E",X"08",X"60",X"20",X"70",X"38",X"50",X"C0",X"50",X"E4",X"04",X"A6",X"66", - X"03",X"01",X"40",X"3C",X"08",X"60",X"20",X"70",X"38",X"50",X"B8",X"68",X"F0",X"00",X"A1",X"66", - X"05",X"00",X"A0",X"55",X"08",X"60",X"20",X"60",X"40",X"50",X"B4",X"70",X"EC",X"02",X"9F",X"63", - X"03",X"00",X"70",X"76",X"08",X"60",X"20",X"60",X"38",X"50",X"B0",X"68",X"F8",X"00",X"9C",X"66", - X"04",X"00",X"40",X"87",X"20",X"60",X"30",X"30",X"08",X"00",X"08",X"50",X"AC",X"76",X"93",X"75", - X"02",X"00",X"38",X"99",X"08",X"50",X"20",X"50",X"30",X"20",X"FC",X"00",X"B4",X"64",X"9B",X"6A", - X"01",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"03",X"00",X"40",X"8C",X"00",X"60",X"30",X"50",X"30",X"20",X"F8",X"40",X"B8",X"36",X"CF",X"32", - X"02",X"00",X"60",X"8A",X"00",X"60",X"28",X"50",X"40",X"60",X"F0",X"28",X"CC",X"1C",X"C0",X"49", - X"03",X"00",X"38",X"80",X"00",X"40",X"28",X"50",X"40",X"70",X"F8",X"18",X"C4",X"22",X"B9",X"5E", - X"02",X"01",X"C0",X"70",X"10",X"70",X"18",X"30",X"28",X"70",X"F8",X"00",X"BC",X"7A",X"AB",X"62", - X"03",X"03",X"80",X"57",X"10",X"60",X"20",X"50",X"40",X"60",X"C4",X"68",X"B0",X"5C",X"F0",X"04", - X"02",X"06",X"00",X"45",X"10",X"50",X"20",X"50",X"40",X"40",X"F4",X"18",X"C4",X"62",X"B5",X"55", - X"05",X"07",X"00",X"35",X"10",X"60",X"20",X"40",X"38",X"40",X"E4",X"20",X"D0",X"52",X"BE",X"44", - X"05",X"06",X"00",X"2F",X"10",X"50",X"18",X"30",X"38",X"50",X"DC",X"58",X"E0",X"18",X"BB",X"52", - X"08",X"04",X"00",X"2E",X"18",X"50",X"10",X"20",X"38",X"50",X"DC",X"60",X"E0",X"12",X"BB",X"46", - X"01",X"01",X"40",X"2F",X"00",X"10",X"18",X"60",X"40",X"50",X"DC",X"50",X"B0",X"4A",X"EB",X"07", - X"0B",X"00",X"80",X"2E",X"F0",X"30",X"18",X"60",X"30",X"50",X"DC",X"40",X"F8",X"F0",X"AD",X"44", - X"03",X"00",X"C0",X"31",X"F8",X"30",X"18",X"50",X"38",X"60",X"D8",X"48",X"04",X"FE",X"A3",X"51", - X"0A",X"00",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"70",X"00",X"1A",X"E3",X"0E", - X"04",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"58",X"18",X"36",X"E6",X"1C", - X"09",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"48",X"1C",X"3E",X"E4",X"20", - X"04",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"06",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"28",X"38",X"10",X"56",X"D9",X"26", - X"02",X"05",X"00",X"48",X"08",X"50",X"20",X"40",X"30",X"40",X"EC",X"38",X"D8",X"5E",X"97",X"75", - X"06",X"05",X"00",X"5E",X"18",X"50",X"28",X"50",X"20",X"20",X"E4",X"50",X"D4",X"66",X"9B",X"73", - X"02",X"04",X"00",X"74",X"18",X"40",X"20",X"30",X"28",X"40",X"E4",X"50",X"D8",X"58",X"A0",X"6E", - X"04",X"02",X"80",X"8B",X"18",X"40",X"18",X"20",X"38",X"50",X"E4",X"58",X"D8",X"64",X"A0",X"6D", - X"02",X"01",X"40",X"97",X"08",X"10",X"20",X"50",X"40",X"60",X"E4",X"60",X"D4",X"5E",X"A0",X"70", - X"03",X"01",X"40",X"A2",X"08",X"10",X"20",X"50",X"40",X"60",X"E8",X"60",X"D4",X"66",X"A0",X"74", - X"01",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"01",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"01",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"01",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"01",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"); -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/rtl/sp0256/sp256_003.vhd b/rtl/sp0256/sp256_003.vhd index 9d26e28..8d6be27 100644 --- a/rtl/sp0256/sp256_003.vhd +++ b/rtl/sp0256/sp256_003.vhd @@ -44,6 +44,7 @@ ENTITY sp256_003 IS PORT ( address : IN STD_LOGIC_VECTOR (15 DOWNTO 0); + clken : IN STD_LOGIC := '1'; clock : IN STD_LOGIC := '1'; q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); @@ -60,8 +61,8 @@ BEGIN altsyncram_component : altsyncram GENERIC MAP ( address_aclr_a => "NONE", - clock_enable_input_a => "BYPASS", - clock_enable_output_a => "BYPASS", + clock_enable_input_a => "NORMAL", + clock_enable_output_a => "NORMAL", init_file => "sp256_003.hex", intended_device_family => "Cyclone V", lpm_hint => "ENABLE_RUNTIME_MOD=NO", @@ -77,6 +78,7 @@ BEGIN PORT MAP ( address_a => address, clock0 => clock, + clocken0 => clken, q_a => sub_wire0 ); @@ -94,9 +96,9 @@ END SYN; -- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" -- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" -- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" --- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" --- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" --- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "1" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "1" +-- Retrieval info: PRIVATE: Clken NUMERIC "1" -- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" -- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" -- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" @@ -117,8 +119,8 @@ END SYN; -- Retrieval info: PRIVATE: rden NUMERIC "0" -- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all -- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" --- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" --- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "NORMAL" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "NORMAL" -- Retrieval info: CONSTANT: INIT_FILE STRING "sp256_003.hex" -- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone V" -- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" @@ -131,10 +133,12 @@ END SYN; -- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" -- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" -- Retrieval info: USED_PORT: address 0 0 16 0 INPUT NODEFVAL "address[15..0]" +-- Retrieval info: USED_PORT: clken 0 0 0 0 INPUT VCC "clken" -- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" -- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" -- Retrieval info: CONNECT: @address_a 0 0 16 0 address 0 0 16 0 -- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: @clocken0 0 0 0 0 clken 0 0 0 0 -- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 -- Retrieval info: GEN_FILE: TYPE_NORMAL sp256_003.vhd TRUE -- Retrieval info: GEN_FILE: TYPE_NORMAL sp256_003.inc FALSE diff --git a/rtl/vp_console.vhd b/rtl/vp_console.vhd index 3b84f7d..54191e1 100644 --- a/rtl/vp_console.vhd +++ b/rtl/vp_console.vhd @@ -55,6 +55,8 @@ library ieee; use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; entity vp_console is port ( @@ -63,6 +65,8 @@ entity vp_console is clk_i : in std_logic; clk_cpu_en_i : in std_logic; clk_vdc_en_i : in std_logic; + clk_250k : in std_logic; + clk_2m5 : in std_logic; res_n_i : in std_logic; -- Cartridge Interface ---------------------------------------------------- cart_cs_o : out std_logic; @@ -103,7 +107,14 @@ entity vp_console is vbl_o : out std_logic; -- Sound Interface -------------------------------------------------------- snd_o : out std_logic; - snd_vec_o : out std_logic_vector(3 downto 0) + snd_vec_o : out std_logic_vector(3 downto 0); + --------------------------------------------------------------------------- + --- The voice ------------------------------------------------------------- + --------------------------------------------------------------------------- + snd_voice_o : out signed(15 downto 0); + noise_voice_o : out signed(15 downto 0); + voice_enable : in std_logic + ); end vp_console; @@ -214,6 +225,29 @@ architecture struct of vp_console is signal vdd_s, gnd_s : std_logic; + -- The Voice + signal sp0256_ldq : std_logic; + signal sp0256_load : std_logic; + signal sp0256_fifo_we : std_logic; + signal sp0256_p14 : std_logic; + signal sp0256_wr : std_logic := '1'; + signal sp0256_rst : std_logic := '1'; + signal sp0256_ff : std_logic := '1'; + signal sp0256_ff_n : std_logic := '1'; + signal cart_do_s : std_logic_vector(7 downto 0); + signal sp0256_di : std_logic_vector(6 downto 0); + signal sp0256_do : std_logic_vector(6 downto 0); + signal cpu_t0_s : std_logic := '0'; + signal SP0256_trig : std_logic := '0'; + signal SP0256_trig_ff : std_logic := '0'; + signal fifo_empty_s : std_logic; + signal stage : integer := 1; + + signal cart_cs_s : std_logic; + signal cart_wr_n_s : std_logic; + + + begin vdd_s <= '1'; @@ -232,7 +266,7 @@ begin xtal_i => clk_i, xtal_en_i => clk_cpu_en_i, reset_n_i => res_n_i, - t0_i => cart_t0_i, + t0_i => not fifo_empty_s, --cart_t0_i, t0_o => cart_t0_o, t0_dir_o => cart_t0_dir_o, int_n_i => int_n_s, @@ -278,9 +312,9 @@ begin p14_i => p1_from_cpu_s(4), p16_i => p1_from_cpu_s(6), a_low_o => a_low_s, - cart_cs_o => cart_cs_o, + cart_cs_o => cart_cs_s, cart_cs_n_o => cart_cs_n_o, - cart_wr_n_o => cart_wr_n_o, + cart_wr_n_o => cart_wr_n_s, ram_cs_o => ram_cs_s, ram_cs_n_o => ram_cs_n_s, ram_wr_n_o => ram_wr_n_s, @@ -296,6 +330,8 @@ begin ); -- cart_d_o <= db_from_cpu_s; + cart_cs_o <= cart_cs_s; + cart_wr_n_o <= cart_wr_n_s; ----------------------------------------------------------------------------- @@ -435,4 +471,120 @@ begin others => '1'); end generate; + ----------------------------------------------------------------------------- + -- The Voice Module + -- Victor Trucco - 07/2019 + ----------------------------------------------------------------------------- + + + sp0256_ff_n <= not sp0256_ff; + + + process (sp0256_ff) + begin + if rising_edge(sp0256_ff) then + sp0256_rst <= db_from_cpu_s(5); + sp0256_di <= a_s(6 downto 0); + end if; + end process; + + process (clk_i) + begin + if rising_edge(clk_i) then + if a_s(7) = '1' and cart_wr_n_s = '0' and cart_cs_s = '0' and res_n_i = '1' and voice_enable = '1' then + sp0256_ff <= '0'; + else + sp0256_ff <= '1'; + end if; + + sp0256_fifo_we <= sp0256_ff; + + if fifo_empty_s = '1' then + sp0256_load <= '0'; + else + sp0256_load <= sp0256_ldq; + end if; + + + case (stage) is + + when 1 => + sp0256_trig <= '0'; + + if fifo_empty_s = '0' and sp0256_ldq = '1' then -- tem algo para tocar and SP free? + stage <= 2; + end if; + + when 2 => + sp0256_trig <= '1'; + stage <= 3; + + when 3 => + if sp0256_ldq = '0' then + sp0256_trig <= '0'; + stage <= 1; + end if; + when others => stage <= 1; + + end case; + + sp0256_trig_ff <= sp0256_trig; + end if; + end process; + + + sp0256 : entity work.sp0256 + port map + ( + clock_250k => clk_250k, + clock_2m5 => clk_2m5, + reset => not sp0256_rst, --reseta em '1'! + + input_rdy => sp0256_ldq, -- load request, is high when new allophone can be loaded + -- IC LOAD REQUEST. LRQ is a logic 1 + --output whenever the input buffer is + --full. When LRQ goes to a logic 0, the input + --port may be loaded by placing the 8 + --address bits on A1-A8 and pulsing the + --ALD output. + + allophone => sp0256_do, + trig_allophone => sp0256_trig_ff, -- input: positive pulse to trigger + -- IC ADDRESS LOAD. A negative pulse on + -- this input loads the 8 address bits into + -- the input port. The negative edge of this + -- pulse causes LRQ to go high. + + audio_out => snd_voice_o, + + noise_out => noise_voice_o + + + ); + + fifo : entity work.fifo + generic map + ( + DATA_WIDTH => 7, + FIFO_DEPTH => 64 + ) + port map + ( + clock_i => clk_i, + reset_i => not sp0256_rst, --not reset_n_s, + + -- input + fifo_we_i => sp0256_fifo_we, + fifo_data_i => sp0256_di, + + -- output + fifo_read_i => sp0256_load, + fifo_data_o => sp0256_do, + + -- flags + fifo_empty_o => fifo_empty_s, + fifo_full_o => open + ); + + end struct;