1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-20 01:34:38 +00:00

Spy Hunter: add MRA, no built-in ROMs

This commit is contained in:
Gyorgy Szombathelyi 2020-02-15 23:27:06 +01:00
parent 5bf298591d
commit 9a3bb64765
9 changed files with 212 additions and 2427 deletions

View File

@ -3,8 +3,10 @@
-- Arcade: Spy Hunter port to MiST by Gehstock
-- 16 November 2019
--
SHUNTER.ROM is required at the root of the SD-Card.
-- Usage:
-- Create ROM file from MRA file and MAME spyhunt.zip file using the MRA utility
-- Copy the ROM and the RBF to the SD Card
-- MRA utility: https://github.com/sebdel/mra-tools-c
Controls
Joy Keyboard
@ -14,9 +16,9 @@ left left : Left
right right : Right
ESC : Coin
start TAB,LShift : VAN
A Space : Gun
A LCtrl : Gun
B LAlt : Missle
C LCtrl : Shift
C SPACE : Shift
X Z : Oil
Y X : Smoke

View File

@ -229,10 +229,8 @@ set_global_assignment -name VHDL_FILE rtl/spy_hunter_sound_board.vhd
set_global_assignment -name VHDL_FILE rtl/spy_hunter_control.vhd
set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd
set_global_assignment -name VHDL_FILE rtl/gen_ram.vhd
set_global_assignment -name VHDL_FILE rtl/dpram.vhd
set_global_assignment -name VHDL_FILE rtl/cmos_ram.vhd
set_global_assignment -name VHDL_FILE rtl/rom/spy_hunter_bg_bits_2.vhd
set_global_assignment -name VHDL_FILE rtl/rom/spy_hunter_bg_bits_1.vhd
set_global_assignment -name VHDL_FILE rtl/rom/spy_hunter_ch_bits.vhd
set_global_assignment -name VHDL_FILE rtl/rom/midssio_82s123.vhd
set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv
set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd
@ -242,5 +240,4 @@ set_global_assignment -name VHDL_FILE ../../../common/IO/pia6821.vhd
set_global_assignment -name QIP_FILE ../../../common/CPU/68000/FX68k/fx68k.qip
set_global_assignment -name QIP_FILE ../../../common/CPU/T80/T80.qip
set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip
set_global_assignment -name SIGNALTAP_FILE output_files/csd.stp
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

View File

@ -0,0 +1,38 @@
<misterromdescription>
<name>Spy Hunter</name>
<mameversion>0216</mameversion>
<mratimestamp>201912310000</mratimestamp>
<manufacturer>Bally Midway</manufacturer>
<setname>spyhunt</setname>
<rom index="0" zip="spyhunt.zip" md5="83494589c7ec76729e0d776d999e3a70" type="merged|nonmerged">
<part name="spy-hunter_cpu_pg0_2-9-84.6d"/>
<part name="spy-hunter_cpu_pg1_2-9-84.7d"/>
<part name="spy-hunter_cpu_pg2_2-9-84.8d"/>
<part name="spy-hunter_cpu_pg3_2-9-84.9d"/>
<part name="spy-hunter_cpu_pg4_2-9-84.10d"/>
<part name="spy-hunter_cpu_pg5_2-9-84.11d"/>
<part name="spy-hunter_snd_0_sd_11-18-83.a7"/>
<part name="spy-hunter_snd_1_sd_11-18-83.a8"/>
<part name="spy-hunter_cs_deluxe_u17_b_11-18-83.u17"/>
<part name="spy-hunter_cs_deluxe_u18_d_11-18-83.u18"/>
<part name="spy-hunter_cs_deluxe_u7_a_11-18-83.u7"/>
<part name="spy-hunter_cs_deluxe_u8_c_11-18-83.u8"/>
<part name="spy-hunter_video_1fg_11-18-83.a7"/>
<part name="spy-hunter_video_0fg_11-18-83.a8"/>
<part name="spy-hunter_video_3fg_11-18-83.a5"/>
<part name="spy-hunter_video_2fg_11-18-83.a6"/>
<part name="spy-hunter_video_5fg_11-18-83.a3"/>
<part name="spy-hunter_video_4fg_11-18-83.a4"/>
<part name="spy-hunter_video_7fg_11-18-83.a1"/>
<part name="spy-hunter_video_6fg_11-18-83.a2"/>
<part name="spy-hunter_cpu_bg0_11-18-83.3a"/>
<part name="spy-hunter_cpu_bg1_11-18-83.4a"/>
<part name="spy-hunter_cpu_bg2_11-18-83.5a"/>
<part name="spy-hunter_cpu_bg3_11-18-83.6a"/>
<part name="spy-hunter_cpu_alpha-n_11-18-83"/>
</rom>
</misterromdescription>

View File

@ -48,7 +48,7 @@ module SpyHunter_MiST(
`include "rtl/build_id.v"
localparam CONF_STR = {
"SHUNTER;;",
"SPYHUNT;;",
"O2,Rotate Controls,Off,On;",
"O5,Blend,Off,On;",
"O6,Service,Off,On;",
@ -85,14 +85,32 @@ wire [15:0] joystick_0;
wire [15:0] joystick_1;
wire scandoublerD;
wire ypbpr;
wire [15:0] audio_l, audio_r;
wire [9:0] csd_audio;
wire hs, vs, cs;
wire blankn;
wire [2:0] g, r, b;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
wire no_csync;
wire key_pressed;
wire [7:0] key_code;
wire key_strobe;
user_io #(
.STRLEN(($size(CONF_STR)>>3)))
user_io(
.clk_sys (clk_sys ),
.conf_str (CONF_STR ),
.SPI_CLK (SPI_SCK ),
.SPI_SS_IO (CONF_DATA0 ),
.SPI_MISO (SPI_DO ),
.SPI_MOSI (SPI_DI ),
.buttons (buttons ),
.switches (switches ),
.scandoubler_disable (scandoublerD ),
.ypbpr (ypbpr ),
.no_csync (no_csync ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
wire [15:0] rom_addr;
wire [15:0] rom_do;
@ -125,12 +143,16 @@ data_io data_io(
// 0000 - DFFF - Main ROM (8 bit)
// E000 - FFFF - Super Sound board ROM (8 bit)
// 10000 - 17FFF - CSD ROM (16 bit)
// 18000 - Sprite ROMs (32 bit)
// 18000 - 37FFF - Sprite ROMs (32 bit)
// 38000 - 3FFFF - BG
// 40000 - 40FFF - Char
// spy-hunter_cpu_pg0_2-9-84.6d spy-hunter_cpu_pg1_2-9-84.7d spy-hunter_cpu_pg2_2-9-84.8d spy-hunter_cpu_pg3_2-9-84.9d spy-hunter_cpu_pg4_2-9-84.10d spy-hunter_cpu_pg5_2-9-84.11d
// spy-hunter_snd_0_sd_11-18-83.a7 spy-hunter_snd_1_sd_11-18-83.a8
// spy-hunter_cs_deluxe_u17_b_11-18-83.u17 spy-hunter_cs_deluxe_u18_d_11-18-83.u18 spy-hunter_cs_deluxe_u7_a_11-18-83.u7 spy-hunter_cs_deluxe_u8_c_11-18-83.u8
// spy-hunter_video_1fg_11-18-83.a7 spy-hunter_video_0fg_11-18-83.a8 spy-hunter_video_3fg_11-18-83.a5 spy-hunter_video_2fg_11-18-83.a6 spy-hunter_video_5fg_11-18-83.a3 spy-hunter_video_4fg_11-18-83.a4 spy-hunter_video_7fg_11-18-83.a1 spy-hunter_video_6fg_11-18-83.a2
// spy-hunter_cpu_bg0_11-18-83.3a spy-hunter_cpu_bg1_11-18-83.4a spy-hunter_cpu_bg2_11-18-83.5a spy-hunter_cpu_bg3_11-18-83.6a
// spy-hunter_cpu_alpha-n_11-18-83
wire [24:0] rom_ioctl_addr = ~ioctl_addr[16] ? ioctl_addr : // 8 bit ROMs
{ioctl_addr[24:16], ioctl_addr[15], ioctl_addr[13:0], ioctl_addr[14]}; // 16 bit ROM
@ -162,7 +184,7 @@ sdram sdram(
// port2 for sprite graphics
.port2_req ( port2_req ),
.port2_ack ( ),
.port2_a ( {sp_ioctl_addr[14:0], sp_ioctl_addr[16]} ), // merge sprite roms to 32-bit wide words
.port2_a ( {sp_ioctl_addr[23:17], sp_ioctl_addr[14:0], sp_ioctl_addr[16]} ), // merge sprite roms to 32-bit wide words
.port2_ds ( {sp_ioctl_addr[15], ~sp_ioctl_addr[15]} ),
.port2_we ( ioctl_downl ),
.port2_d ( {ioctl_dout, ioctl_dout} ),
@ -202,6 +224,12 @@ always @(posedge clk_sys) begin
end
wire [15:0] audio_l, audio_r;
wire [9:0] csd_audio;
wire hs, vs, cs;
wire blankn;
wire [2:0] g, r, b;
spy_hunter_control spy_hunter_control(
.clock_40(clk_sys),
.reset(reset),
@ -250,13 +278,16 @@ spy_hunter spy_hunter(
.csd_rom_addr ( csd_addr ),
.csd_rom_do ( csd_do ),
.sp_addr ( sp_addr ),
.sp_graphx32_do ( sp_do )
.sp_graphx32_do ( sp_do ),
.dl_addr ( ioctl_addr[18:0]),
.dl_data ( ioctl_dout ),
.dl_wr ( ioctl_wr )
);
wire vs_out;
wire hs_out;
assign VGA_VS = scandoublerD | vs_out;
assign VGA_HS = scandoublerD ? cs : hs_out;
assign VGA_HS = ((~no_csync & scandoublerD) || ypbpr)? cs : hs_out;
assign VGA_VS = ((~no_csync & scandoublerD) || ypbpr)? 1'b1 : vs_out;
mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video(
.clk_sys ( clk_sys ),
@ -281,27 +312,6 @@ mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video(
.ypbpr ( ypbpr )
);
user_io #(
.STRLEN(($size(CONF_STR)>>3)))
user_io(
.clk_sys (clk_sys ),
.conf_str (CONF_STR ),
.SPI_CLK (SPI_SCK ),
.SPI_SS_IO (CONF_DATA0 ),
.SPI_MISO (SPI_DO ),
.SPI_MOSI (SPI_DI ),
.buttons (buttons ),
.switches (switches ),
.scandoubler_disable (scandoublerD ),
.ypbpr (ypbpr ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
dac #(
.C_bits(16))
dac_l(

View File

@ -0,0 +1,81 @@
-- -----------------------------------------------------------------------
--
-- Syntiac's generic VHDL support files.
--
-- -----------------------------------------------------------------------
-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com)
-- http://www.syntiac.com/fpga64.html
--
-- Modified April 2016 by Dar (darfpga@aol.fr)
-- http://darfpga.blogspot.fr
-- Remove address register when writing
--
-- -----------------------------------------------------------------------
--
-- dpram.vhd
--
-- -----------------------------------------------------------------------
--
-- generic ram.
--
-- -----------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
-- -----------------------------------------------------------------------
entity dpram is
generic (
dWidth : integer := 8;
aWidth : integer := 10
);
port (
clk_a : in std_logic;
we_a : in std_logic := '0';
addr_a : in std_logic_vector((aWidth-1) downto 0);
d_a : in std_logic_vector((dWidth-1) downto 0) := (others => '0');
q_a : out std_logic_vector((dWidth-1) downto 0);
clk_b : in std_logic;
we_b : in std_logic := '0';
addr_b : in std_logic_vector((aWidth-1) downto 0);
d_b : in std_logic_vector((dWidth-1) downto 0) := (others => '0');
q_b : out std_logic_vector((dWidth-1) downto 0)
);
end entity;
-- -----------------------------------------------------------------------
architecture rtl of dpram is
subtype addressRange is integer range 0 to ((2**aWidth)-1);
type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0);
signal ram: ramDef;
signal addr_a_reg: std_logic_vector((aWidth-1) downto 0);
signal addr_b_reg: std_logic_vector((aWidth-1) downto 0);
begin
-- -----------------------------------------------------------------------
process(clk_a)
begin
if rising_edge(clk_a) then
if we_a = '1' then
ram(to_integer(unsigned(addr_a))) <= d_a;
end if;
q_a <= ram(to_integer(unsigned(addr_a)));
end if;
end process;
process(clk_b)
begin
if rising_edge(clk_b) then
if we_b = '1' then
ram(to_integer(unsigned(addr_b))) <= d_b;
end if;
q_b <= ram(to_integer(unsigned(addr_b)));
end if;
end process;
end architecture;

View File

@ -1,278 +0,0 @@
library ieee;
use ieee.std_logic_1164.all,ieee.numeric_std.all;
entity spy_hunter_ch_bits is
port (
clk : in std_logic;
addr : in std_logic_vector(11 downto 0);
data : out std_logic_vector(7 downto 0)
);
end entity;
architecture prom of spy_hunter_ch_bits is
type rom is array(0 to 4095) of std_logic_vector(7 downto 0);
signal rom_data: rom := (
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"3F",X"3F",X"0C",X"0C",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF",X"0C",X"0C",X"3F",X"3F",
X"00",X"00",X"3F",X"3F",X"0C",X"0C",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF",X"0C",X"0C",X"3F",X"3F",
X"00",X"00",X"3F",X"FC",X"C0",X"03",X"CC",X"33",X"CC",X"33",X"CF",X"F3",X"C0",X"03",X"3F",X"FC",
X"33",X"00",X"3F",X"FC",X"00",X"00",X"03",X"FC",X"3F",X"0C",X"33",X"0C",X"3F",X"FC",X"00",X"00",
X"00",X"0C",X"3F",X"FC",X"00",X"00",X"00",X"0C",X"00",X"0C",X"3F",X"FC",X"00",X"00",X"3F",X"FC",
X"00",X"00",X"F0",X"00",X"0F",X"C0",X"00",X"3F",X"3C",X"00",X"0F",X"FC",X"3C",X"00",X"00",X"0C",
X"00",X"00",X"3F",X"FC",X"00",X"00",X"3F",X"FC",X"0C",X"00",X"03",X"00",X"0C",X"00",X"3F",X"FC",
X"00",X"0C",X"00",X"30",X"00",X"0C",X"3F",X"F0",X"00",X"00",X"0F",X"F0",X"30",X"0C",X"3F",X"FC",
X"0F",X"FC",X"3C",X"00",X"00",X"00",X"3F",X"FC",X"33",X"00",X"3F",X"FC",X"00",X"00",X"3F",X"F0",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"00",
X"15",X"54",X"00",X"00",X"15",X"54",X"10",X"44",X"15",X"44",X"00",X"00",X"15",X"54",X"00",X"00",
X"00",X"00",X"00",X"00",X"15",X"54",X"11",X"04",X"11",X"04",X"00",X"00",X"15",X"54",X"11",X"04",
X"00",X"00",X"00",X"00",X"2A",X"A0",X"A0",X"28",X"80",X"08",X"A0",X"28",X"2A",X"A8",X"0A",X"A0",
X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"08",X"AA",X"A8",X"2A",X"A8",X"08",X"08",X"00",X"08",
X"00",X"00",X"00",X"00",X"28",X"08",X"AA",X"08",X"A2",X"88",X"80",X"A8",X"A0",X"A8",X"A0",X"28",
X"00",X"00",X"00",X"00",X"00",X"A8",X"A8",X"A8",X"82",X"88",X"82",X"08",X"A0",X"28",X"A0",X"28",
X"00",X"00",X"00",X"00",X"AA",X"A8",X"AA",X"A8",X"02",X"80",X"A2",X"80",X"2A",X"80",X"02",X"80",
X"00",X"00",X"00",X"00",X"80",X"A8",X"82",X"A8",X"82",X"08",X"82",X"08",X"AA",X"08",X"AA",X"08",
X"00",X"00",X"00",X"00",X"20",X"A8",X"82",X"88",X"82",X"08",X"A2",X"08",X"2A",X"A8",X"0A",X"A8",
X"00",X"00",X"00",X"00",X"A8",X"00",X"AA",X"00",X"82",X"80",X"80",X"A0",X"80",X"28",X"A0",X"08",
X"00",X"00",X"00",X"00",X"28",X"A8",X"AA",X"A8",X"82",X"08",X"AA",X"08",X"2A",X"A8",X"00",X"A8",
X"00",X"00",X"00",X"00",X"2A",X"A0",X"AA",X"A8",X"82",X"08",X"82",X"80",X"AA",X"80",X"2A",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"F0",X"00",X"FC",X"00",X"FF",X"00",X"0F",X"C0",X"00",X"F0",X"00",X"03",X"00",X"0F",X"00",X"00",
X"FF",X"FF",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"FF",X"FF",
X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"FF",X"FF",
X"FF",X"FF",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"FF",X"FF",
X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"FC",X"00",X"0F",X"C0",X"00",X"FC",X"00",X"0F",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"3F",X"F0",X"F0",X"3C",X"C0",X"0C",X"F0",X"3C",X"3F",X"FC",X"0F",X"F0",
X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"0C",X"FF",X"FC",X"3F",X"FC",X"0C",X"0C",X"00",X"0C",
X"00",X"00",X"00",X"00",X"3C",X"0C",X"FF",X"0C",X"F3",X"CC",X"C0",X"FC",X"F0",X"FC",X"F0",X"3C",
X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"C3",X"CC",X"C3",X"0C",X"F0",X"3C",X"F0",X"3C",
X"00",X"00",X"00",X"00",X"FF",X"FC",X"FF",X"FC",X"03",X"C0",X"F3",X"C0",X"3F",X"C0",X"03",X"C0",
X"00",X"00",X"00",X"00",X"C0",X"FC",X"C3",X"FC",X"C3",X"0C",X"C3",X"0C",X"FF",X"0C",X"FF",X"0C",
X"00",X"00",X"00",X"00",X"30",X"FC",X"C3",X"CC",X"C3",X"0C",X"F3",X"0C",X"3F",X"FC",X"0F",X"FC",
X"00",X"00",X"00",X"00",X"FC",X"00",X"FF",X"00",X"C3",X"C0",X"C0",X"F0",X"C0",X"3C",X"F0",X"0C",
X"00",X"00",X"00",X"00",X"3C",X"FC",X"FF",X"FC",X"C3",X"0C",X"FF",X"0C",X"3F",X"FC",X"00",X"FC",
X"00",X"00",X"00",X"00",X"3F",X"F0",X"FF",X"FC",X"C3",X"0C",X"C3",X"C0",X"FF",X"C0",X"3F",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"3F",X"FF",X"30",X"03",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"F3",X"30",X"03",X"3F",X"FF",
X"00",X"00",X"00",X"0C",X"3F",X"FC",X"F0",X"C0",X"C0",X"C0",X"FF",X"FC",X"3F",X"FC",X"00",X"0C",
X"00",X"00",X"00",X"00",X"FC",X"FC",X"FF",X"FC",X"C3",X"0C",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",
X"00",X"00",X"00",X"00",X"30",X"3C",X"C0",X"0C",X"C0",X"0C",X"F0",X"3C",X"3F",X"FC",X"0F",X"F0",
X"00",X"00",X"00",X"00",X"3F",X"F0",X"F0",X"3C",X"C0",X"0C",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",
X"00",X"00",X"00",X"00",X"F0",X"3C",X"C0",X"0C",X"CF",X"0C",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",
X"00",X"00",X"00",X"00",X"F0",X"00",X"C0",X"00",X"CF",X"0C",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",
X"00",X"00",X"00",X"C0",X"30",X"FC",X"C0",X"CC",X"C0",X"0C",X"F0",X"3C",X"3F",X"FC",X"0F",X"F0",
X"00",X"00",X"C0",X"00",X"FF",X"FC",X"0F",X"00",X"0F",X"00",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",
X"00",X"00",X"00",X"00",X"00",X"0C",X"C0",X"0C",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",X"00",X"0C",
X"00",X"00",X"C0",X"00",X"FF",X"FC",X"C0",X"3C",X"C0",X"0C",X"00",X"0C",X"00",X"FC",X"00",X"F0",
X"00",X"00",X"F0",X"0C",X"FC",X"3C",X"0C",X"F0",X"03",X"00",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",
X"00",X"00",X"00",X"00",X"00",X"3C",X"00",X"0C",X"C0",X"0C",X"FF",X"FC",X"FF",X"FC",X"C0",X"00",
X"00",X"00",X"C0",X"0C",X"FF",X"FC",X"3C",X"00",X"0F",X"00",X"3C",X"00",X"FF",X"FC",X"FF",X"FC",
X"00",X"00",X"C0",X"00",X"FF",X"FC",X"00",X"F0",X"0F",X"00",X"3C",X"00",X"FF",X"FC",X"FF",X"FC",
X"00",X"00",X"00",X"00",X"3F",X"F0",X"F0",X"3C",X"C0",X"0C",X"F0",X"3C",X"3F",X"FC",X"0F",X"F0",
X"00",X"00",X"00",X"00",X"3F",X"C0",X"F3",X"C0",X"C0",X"C0",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",
X"00",X"00",X"00",X"00",X"3F",X"CC",X"F0",X"30",X"C0",X"CC",X"F0",X"0C",X"3F",X"FC",X"0F",X"F0",
X"00",X"00",X"00",X"0C",X"FC",X"3C",X"CF",X"F0",X"C3",X"C0",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",
X"00",X"00",X"00",X"00",X"30",X"F0",X"C3",X"FC",X"C3",X"0C",X"FF",X"0C",X"FF",X"3C",X"3C",X"3C",
X"00",X"00",X"00",X"00",X"F0",X"00",X"C0",X"00",X"FF",X"FC",X"FF",X"FC",X"C0",X"0C",X"F0",X"00",
X"00",X"00",X"C0",X"00",X"FF",X"FC",X"00",X"0C",X"00",X"0C",X"FF",X"FC",X"FF",X"FC",X"C0",X"00",
X"00",X"00",X"C0",X"00",X"FC",X"00",X"0F",X"F0",X"00",X"3C",X"0F",X"FC",X"FF",X"C0",X"F0",X"00",
X"00",X"00",X"F0",X"00",X"3F",X"FC",X"00",X"3C",X"03",X"F0",X"00",X"3C",X"FF",X"FC",X"F0",X"00",
X"00",X"00",X"C0",X"00",X"F0",X"0C",X"3F",X"3C",X"03",X"C0",X"0F",X"F0",X"FC",X"3C",X"F0",X"0C",
X"00",X"00",X"C0",X"00",X"FF",X"00",X"03",X"FC",X"03",X"FC",X"FF",X"00",X"FF",X"00",X"F0",X"00",
X"00",X"00",X"F0",X"00",X"FC",X"0C",X"CF",X"0C",X"C3",X"CC",X"C0",X"FC",X"F0",X"3C",X"00",X"0C",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"00",X"00",X"00",X"08",X"2A",X"A8",X"A0",X"80",X"80",X"80",X"AA",X"A8",X"2A",X"A8",X"00",X"08",
X"00",X"00",X"00",X"00",X"A8",X"A8",X"AA",X"A8",X"82",X"08",X"AA",X"A8",X"AA",X"A8",X"80",X"08",
X"00",X"00",X"00",X"00",X"20",X"28",X"80",X"08",X"80",X"08",X"A0",X"28",X"2A",X"A8",X"0A",X"A0",
X"00",X"00",X"00",X"00",X"2A",X"A0",X"A0",X"28",X"80",X"08",X"AA",X"A8",X"AA",X"A8",X"80",X"08",
X"00",X"00",X"00",X"00",X"A0",X"28",X"80",X"08",X"8A",X"08",X"AA",X"A8",X"AA",X"A8",X"80",X"08",
X"00",X"00",X"00",X"00",X"A0",X"00",X"80",X"00",X"8A",X"08",X"AA",X"A8",X"AA",X"A8",X"80",X"08",
X"00",X"00",X"00",X"80",X"20",X"A8",X"80",X"88",X"80",X"08",X"A0",X"28",X"2A",X"A8",X"0A",X"A0",
X"00",X"00",X"80",X"00",X"AA",X"A8",X"0A",X"00",X"0A",X"00",X"AA",X"A8",X"AA",X"A8",X"80",X"08",
X"00",X"00",X"00",X"00",X"00",X"08",X"80",X"08",X"AA",X"A8",X"AA",X"A8",X"80",X"08",X"00",X"08",
X"00",X"00",X"80",X"00",X"AA",X"A8",X"80",X"28",X"80",X"08",X"00",X"08",X"00",X"A8",X"00",X"A0",
X"00",X"00",X"A0",X"08",X"A8",X"28",X"08",X"A0",X"02",X"00",X"AA",X"A8",X"AA",X"A8",X"80",X"08",
X"00",X"00",X"00",X"00",X"00",X"28",X"00",X"08",X"80",X"08",X"AA",X"A8",X"AA",X"A8",X"80",X"00",
X"00",X"00",X"80",X"08",X"AA",X"A8",X"28",X"00",X"0A",X"00",X"28",X"00",X"AA",X"A8",X"AA",X"A8",
X"00",X"00",X"80",X"00",X"AA",X"A8",X"00",X"A0",X"0A",X"00",X"28",X"00",X"AA",X"A8",X"AA",X"A8",
X"00",X"00",X"00",X"00",X"2A",X"A0",X"A0",X"28",X"80",X"08",X"A0",X"28",X"2A",X"A8",X"0A",X"A0",
X"00",X"00",X"00",X"00",X"2A",X"80",X"A2",X"80",X"80",X"80",X"AA",X"A8",X"AA",X"A8",X"80",X"08",
X"00",X"00",X"00",X"00",X"2A",X"88",X"A0",X"20",X"80",X"88",X"A0",X"08",X"2A",X"A8",X"0A",X"A0",
X"00",X"00",X"00",X"08",X"A8",X"28",X"8A",X"A0",X"82",X"80",X"AA",X"A8",X"AA",X"A8",X"80",X"08",
X"00",X"00",X"00",X"00",X"20",X"A0",X"82",X"A8",X"82",X"08",X"AA",X"08",X"AA",X"28",X"28",X"28",
X"00",X"00",X"00",X"00",X"A0",X"00",X"80",X"00",X"AA",X"A8",X"AA",X"A8",X"80",X"08",X"A0",X"00",
X"00",X"00",X"80",X"00",X"AA",X"A8",X"00",X"08",X"00",X"08",X"AA",X"A8",X"AA",X"A8",X"80",X"00",
X"00",X"00",X"80",X"00",X"A8",X"00",X"0A",X"A0",X"00",X"28",X"0A",X"A8",X"AA",X"80",X"A0",X"00",
X"00",X"00",X"A0",X"00",X"2A",X"A8",X"00",X"28",X"02",X"A0",X"00",X"28",X"AA",X"A8",X"A0",X"00",
X"00",X"00",X"80",X"00",X"A0",X"08",X"2A",X"28",X"02",X"80",X"0A",X"A0",X"A8",X"28",X"A0",X"08",
X"00",X"00",X"80",X"00",X"AA",X"00",X"02",X"A8",X"02",X"A8",X"AA",X"00",X"AA",X"00",X"A0",X"00",
X"00",X"00",X"A0",X"00",X"A8",X"08",X"8A",X"08",X"82",X"88",X"80",X"A8",X"A0",X"28",X"00",X"08",
X"00",X"00",X"2A",X"2A",X"08",X"08",X"2A",X"AA",X"2A",X"AA",X"2A",X"AA",X"08",X"08",X"2A",X"2A",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF");
begin
process(clk)
begin
if rising_edge(clk) then
data <= rom_data(to_integer(unsigned(addr)));
end if;
end process;
end architecture;

View File

@ -180,7 +180,12 @@ port(
csd_rom_addr : out std_logic_vector(14 downto 1);
csd_rom_do : in std_logic_vector(15 downto 0);
sp_addr : out std_logic_vector(14 downto 0);
sp_graphx32_do : in std_logic_vector(31 downto 0);
sp_graphx32_do : in std_logic_vector(31 downto 0);
-- internal ROM download
dl_addr : in std_logic_vector(18 downto 0);
dl_data : in std_logic_vector(7 downto 0);
dl_wr : in std_logic;
dbg_cpu_addr : out std_logic_vector(15 downto 0)
);
end spy_hunter;
@ -335,7 +340,11 @@ architecture struct of spy_hunter is
signal lamp_van : std_logic;
signal lamp_smoke : std_logic;
signal lamp_gun : std_logic;
signal bg_graphics_1_we : std_logic;
signal bg_graphics_2_we : std_logic;
signal ch_graphics_we : std_logic;
type texte is array(0 to 31) of std_logic_vector(7 downto 0);
signal lamp_text: texte := (
x"00", x"49", x"48", x"00", -- hi/lo
@ -1028,28 +1037,46 @@ port map(
);
-- char graphics ROM 10G
ch_graphics : entity work.spy_hunter_ch_bits
ch_graphics : entity work.dpram
generic map( dWidth => 8, aWidth => 12)
port map(
clk => clock_vidn,
addr => ch_code_line,
data => ch_graphx_do
clk_a => clock_vidn,
addr_a => ch_code_line,
q_a => ch_graphx_do,
clk_b => clock_vid,
we_b => ch_graphics_we,
addr_b => dl_addr(11 downto 0),
d_b => dl_data
);
ch_graphics_we <= '1' when dl_addr(18 downto 12) = "1000000" and dl_wr = '1' else '0'; -- 40000 - 40FFF
-- background graphics ROM 3A/4A
bg_graphics_1 : entity work.spy_hunter_bg_bits_1
bg_graphics_1 : entity work.dpram
generic map( dWidth => 8, aWidth => 14)
port map(
clk => clock_vidn,
addr => bg_code_line,
data => bg_graphx1_do
clk_a => clock_vidn,
addr_a => bg_code_line,
q_a => bg_graphx1_do,
clk_b => clock_vid,
we_b => bg_graphics_1_we,
addr_b => dl_addr(13 downto 0),
d_b => dl_data
);
bg_graphics_1_we <= '1' when dl_addr(18 downto 14) = "01110" and dl_wr = '1' else '0'; -- 38000 - 3BFFF
-- background graphics ROM 5A/6A
bg_graphics_2 : entity work.spy_hunter_bg_bits_2
bg_graphics_2 : entity work.dpram
generic map( dWidth => 8, aWidth => 14)
port map(
clk => clock_vidn,
addr => bg_code_line,
data => bg_graphx2_do
clk_a => clock_vidn,
addr_a => bg_code_line,
q_a => bg_graphx2_do,
clk_b => clock_vid,
we_b => bg_graphics_2_we,
addr_b => dl_addr(13 downto 0),
d_b => dl_data
);
bg_graphics_2_we <= '1' when dl_addr(18 downto 14) = "01111" and dl_wr = '1' else '0'; -- 3C000 - 3FFFF
-- sprite graphics ROM A7-A8/A5-A6/A3-A4/A1-A2
--sprite_graphics : entity work.timber_sp_bits -- full size sprite rom