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

Merge pull request #36 from gyurco/crater

Crater Raider: works
This commit is contained in:
Marcel 2019-12-23 11:24:27 +01:00 committed by GitHub
commit 288805b0dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 287 additions and 2502 deletions

View File

@ -41,7 +41,7 @@
# ========================
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
set_global_assignment -name LAST_QUARTUS_VERSION 13.1
set_global_assignment -name LAST_QUARTUS_VERSION "13.1 SP4.26"
set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl"
# Pin & Location Assignments
@ -180,7 +180,7 @@ set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -
# end ENTITY(Kickman_MiST)
# ------------------------
set_global_assignment -name ENABLE_SIGNALTAP OFF
set_global_assignment -name USE_SIGNALTAP_FILE output_files/reset.stp
set_global_assignment -name USE_SIGNALTAP_FILE output_files/crt.stp
set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON
set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS"
@ -189,22 +189,6 @@ set_global_assignment -name FITTER_EFFORT "STANDARD FIT"
set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS ON
set_global_assignment -name SMART_RECOMPILE ON
set_global_assignment -name ALLOW_SYNCH_CTRL_USAGE ON
set_global_assignment -name SYSTEMVERILOG_FILE rtl/CraterRaider_MiST.sv
set_global_assignment -name VHDL_FILE rtl/crater_raider.vhd
set_global_assignment -name VHDL_FILE rtl/ctc_counter.vhd
set_global_assignment -name VHDL_FILE rtl/ctc_controler.vhd
set_global_assignment -name VHDL_FILE rtl/spy_hunter_sound_board.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/cmos_ram.vhd
set_global_assignment -name VHDL_FILE rtl/rom/crater_ch_bits.vhd
set_global_assignment -name VHDL_FILE rtl/rom/crater_bg_bits_2.vhd
set_global_assignment -name VHDL_FILE rtl/rom/crater_bg_bits_1.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
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 PARTITION_NETLIST_TYPE SOURCE -section_id Top
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
@ -239,4 +223,20 @@ set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_VS
set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_L
set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_R
set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SPI_DO
set_global_assignment -name SYSTEMVERILOG_FILE rtl/CraterRaider_MiST.sv
set_global_assignment -name VHDL_FILE rtl/spinner.vhd
set_global_assignment -name VHDL_FILE rtl/crater_raider.vhd
set_global_assignment -name VHDL_FILE rtl/ctc_counter.vhd
set_global_assignment -name VHDL_FILE rtl/ctc_controler.vhd
set_global_assignment -name VHDL_FILE rtl/spy_hunter_sound_board.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/cmos_ram.vhd
set_global_assignment -name VHDL_FILE rtl/rom/midssio_82s123.vhd
set_global_assignment -name VHDL_FILE rtl/dpram.vhd
set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv
set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd
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/crt.stp
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

View File

@ -48,12 +48,11 @@ module CraterRaider_MiST(
`include "rtl/build_id.v"
localparam CONF_STR = {
"CRATER;ROM;",
"CRATER;;",
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blend,Off,On;",
"O6,Service,Off,On;",
"O7,Swap Joystick,Off,On;",
"T0,Reset;",
"V,v1.1.",`BUILD_DATE
};
@ -75,8 +74,8 @@ pll_mist pll(
wire [31:0] status;
wire [1:0] buttons;
wire [1:0] switches;
wire [7:0] joy_0;
wire [7:0] joy_1;
wire [7:0] joystick_0;
wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
wire [15:0] audio_l, audio_r;
@ -107,7 +106,8 @@ data_io data_io(
.ioctl_dout ( ioctl_dout )
);
wire [24:0] sp_ioctl_addr = ioctl_addr - 17'h10000;
wire [24:0] sp_ioctl_addr = ioctl_addr - 17'he000; // sound cpu prg offset
wire [24:0] dl_addr = ioctl_addr - 18'h2e000; // background + char grfx offset
reg port1_req, port2_req;
sdram sdram(
@ -132,7 +132,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[18: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} ),
@ -172,6 +172,19 @@ always @(posedge clk_sys) begin
end
// spinner
wire [7:0] spin_angle;
spinner spinner (
.clock_40(clk_sys),
.reset(reset),
.btn_acc(),
.btn_left(m_left),
.btn_right(m_right),
.ctc_zc_to_2(vs),
.spin_angle(spin_angle)
);
Crater_Raider Crater_Raider(
.clock_40(clk_sys),
.reset(reset),
@ -192,6 +205,7 @@ Crater_Raider Crater_Raider(
.start2(btn_two_players),
.up(m_up),
.down(m_down),
.dial(spin_angle),
.fire1(m_fire1),
.fire2(m_fire2),
.fire3(m_fire3),//not working
@ -201,7 +215,10 @@ Crater_Raider Crater_Raider(
.snd_rom_addr ( snd_addr ),
.snd_rom_do ( snd_addr[0] ? snd_do[15:8] : snd_do[7:0] ),
.sp_addr ( sp_addr ),
.sp_graphx32_do ( sp_do )
.sp_graphx32_do ( sp_do ),
.dl_addr ( dl_addr ),
.dl_wr ( ioctl_wr ),
.dl_data ( ioctl_dout )
);
wire vs_out;
@ -249,8 +266,8 @@ user_io(
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joy_0 ),
.joystick_1 (joy_1 ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
@ -272,17 +289,13 @@ dac_r(
.dac_o(AUDIO_R)
);
wire [7:0] joystick_0 = status[7] ? joy_1 : joy_0;
wire [7:0] joystick_1 = status[7] ? joy_0 : joy_1;
// Rotated Normal
wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3];
wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2];
wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1];
wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0];
wire m_fire1 = btn_fire1 | joystick_0[4] | joystick_1[4];
wire m_fire2 = btn_fire2 | joystick_0[5] | joystick_1[5];
wire m_fire3 = btn_fire3 | joystick_0[6] | joystick_1[6];
wire m_up = btn_up | joystick_0[3] | joystick_1[3];
wire m_down = btn_down | joystick_0[2] | joystick_1[2];
wire m_left = btn_left | joystick_0[1] | joystick_1[1];
wire m_right = btn_right | joystick_0[0] | joystick_1[0];
wire m_fire1 = btn_fire1 | joystick_0[4] | joystick_1[4];
wire m_fire2 = btn_fire2 | joystick_0[5] | joystick_1[5];
wire m_fire3 = btn_fire3 | joystick_0[6] | joystick_1[6];
reg btn_one_player = 0;
reg btn_two_players = 0;

View File

@ -157,19 +157,25 @@ port(
start1 : in std_logic;
start2 : in std_logic;
up : in std_logic;
up : in std_logic;
down : in std_logic;
dial : in std_logic_vector(7 downto 0);
fire1 : in std_logic;
fire2 : in std_logic;
fire3 : in std_logic;
service : in std_logic;
cpu_rom_addr : out std_logic_vector(14 downto 0);
cpu_rom_addr : out std_logic_vector(15 downto 0);
cpu_rom_do : in std_logic_vector(7 downto 0);
snd_rom_addr : out std_logic_vector(13 downto 0);
snd_rom_do : in std_logic_vector(7 downto 0);
sp_addr : out std_logic_vector(14 downto 0);
sp_graphx32_do : in std_logic_vector(31 downto 0);
dl_addr : in std_logic_vector(15 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 crater_raider;
@ -319,7 +325,7 @@ architecture struct of crater_raider is
signal sp_buffer_sel : std_logic;
signal sp_vid : std_logic_vector(3 downto 0);
-- signal sp_col : std_logic_vector(3 downto 0);
signal sp_col : std_logic_vector(3 downto 0);
-- signal sp_palette_addr : std_logic_vector(5 downto 0);
signal palette_addr : std_logic_vector(5 downto 0);
@ -336,14 +342,16 @@ architecture struct of crater_raider is
signal input_4 : std_logic_vector(7 downto 0);
signal output_4 : std_logic_vector(7 downto 0);
signal dl_bg_graphics_1_we : std_logic;
signal dl_bg_graphics_2_we : std_logic;
signal dl_cg_graphics_we : std_logic;
begin
clock_vid <= clock_40;
clock_vidn <= not clock_40;
reset_n <= not reset;
-- make enables clock from clock_vid
process (clock_vid, reset)
begin
@ -400,7 +408,7 @@ begin
if hcnt = 512+90+9+11 then video_hs <= '1'; end if; -- sync pulse 96/25*20 = 77
-- back porch 48/25*20 = 38
video_blankn <= '0';
if hcnt >= 2+16+16 and hcnt < 514+16-1 and
if hcnt >= 2+16+16 and hcnt < 514-1 and
vcnt >= 2 and vcnt < 481 then video_blankn <= '1';end if;
else -- interlaced mode
@ -421,7 +429,7 @@ begin
end if;
video_blankn <= '0';
if hcnt >= 2+16+16 and hcnt < 514+16-1 and
if hcnt >= 2+16+16 and hcnt < 514-1 and
vcnt >= 1 and vcnt < 241 then video_blankn <= '1';end if;
if hs_cnt = 0 then hsync0 <= '0';
@ -483,7 +491,7 @@ end process;
-- "11" for test & tilt & unused
input_0 <= not service & "11" & not fire1 & not start2 & not start1 & not coin2 & not coin1;
input_1 <= "11111111";--dail
input_1 <= dial;
input_2 <= '1' & not fire2 & '1' & not fire3 & not down & not up & "11";
input_3 <= x"FF";
input_4 <= x"FF";
@ -498,7 +506,7 @@ input_4 <= x"FF";
------------------------------------------
-- cpu data input with address decoding --
------------------------------------------
cpu_di <= cpu_rom_do when cpu_mreq_n = '0' and cpu_addr(15 downto 12) < X"E" else -- 0000-DFFF 56Ko
cpu_di <= cpu_rom_do when cpu_mreq_n = '0' and cpu_addr(15 downto 12) < X"A" else -- 0000-9FFF 48Ko
bg_ram_do_r when cpu_mreq_n = '0' and (cpu_addr and x"F800") = x"E000" else -- video ram E000-E7FF 2Ko
ch_ram_do_r when cpu_mreq_n = '0' and (cpu_addr and x"FC00") = x"E800" else -- char ram E800-EBFF 1Ko + mirroring 0400
wram_do when cpu_mreq_n = '0' and (cpu_addr and X"F800") = x"F000" else -- work ram F000-F7FF 2Ko
@ -554,8 +562,8 @@ end process;
---------- sprite machine ----------
---- 91433 Video Gen III Board ----
------------------------------------
hflip <= not(hcnt); -- apply mirror horizontal flip
--hflip <= hcnt; -- do not apply mirror horizontal flip
--hflip <= not(hcnt); -- apply mirror horizontal flip
hflip <= hcnt; -- do not apply mirror horizontal flip
vflip <= vcnt(8 downto 0) & not top_frame when tv15Khz_mode = '1' else vcnt; -- do not apply mirror flip
@ -599,7 +607,7 @@ begin
sp_byte_cnt <= (others => '0');
when "000001" =>
sp_attr <= sp_ram_do;
when "000010" =>
when "000010" =>
sp_code <= sp_ram_do;
sp_addr <= sp_ram_do(7 downto 0) & (sp_line xor sp_vflip) & (sp_byte_cnt xor sp_hflip); -- graphics rom addr
when "000011" =>
@ -608,7 +616,7 @@ when "000010" =>
sp_graphx32_do_r <= sp_graphx32_do; -- latch incoming sprite data
sp_addr <= sp_code(7 downto 0) & (sp_line xor sp_vflip) & (sp_byte_cnt+1 xor sp_hflip); -- advance graphics rom addr
sp_on_line <= '1';
when "010010"|"011010"|"100010" => -- 18,26,34
when "010010"|"011010"|"100010" => -- 18,26,34
sp_graphx32_do_r <= sp_graphx32_do; -- latch incoming sprite data
sp_addr <= sp_code(7 downto 0) & (sp_line xor sp_vflip) & (sp_byte_cnt+2 xor sp_hflip); -- advance graphics rom addr
sp_byte_cnt <= sp_byte_cnt + 1;
@ -660,32 +668,33 @@ sp_graphx_b_ok <= '1' when sp_graphx_b /= x"0" else '0';
sp_buffer_ram1a_di <= sp_attr(3 downto 0) & sp_graphx_a when sp_buffer_sel = '1' else x"00";
sp_buffer_ram1b_di <= sp_attr(3 downto 0) & sp_graphx_b when sp_buffer_sel = '1' else x"00";
sp_buffer_ram1_addr <= sp_hcnt(8 downto 1) when sp_buffer_sel = '1' else hflip(8 downto 1) - x"04";
sp_buffer_ram1_addr <= not sp_hcnt(8 downto 1) when sp_buffer_sel = '1' else hflip(8 downto 1) - x"C";
sp_buffer_ram1a_we <= not sp_hcnt(0) and sp_on_line and sp_graphx_a_ok when sp_buffer_sel = '1' else hcnt(0);
sp_buffer_ram1b_we <= not sp_hcnt(0) and sp_on_line and sp_graphx_b_ok when sp_buffer_sel = '1' else hcnt(0);
sp_buffer_ram2a_di <= sp_attr(3 downto 0) & sp_graphx_a when sp_buffer_sel = '0' else x"00";
sp_buffer_ram2b_di <= sp_attr(3 downto 0) & sp_graphx_b when sp_buffer_sel = '0' else x"00";
sp_buffer_ram2_addr <= sp_hcnt(8 downto 1) when sp_buffer_sel = '0' else hflip(8 downto 1) - x"04";
sp_buffer_ram2_addr <= not sp_hcnt(8 downto 1) when sp_buffer_sel = '0' else hflip(8 downto 1) - x"C";
sp_buffer_ram2a_we <= not sp_hcnt(0) and sp_on_line and sp_graphx_a_ok when sp_buffer_sel = '0' else hcnt(0);
sp_buffer_ram2b_we <= not sp_hcnt(0) and sp_on_line and sp_graphx_b_ok when sp_buffer_sel = '0' else hcnt(0);
sp_vid <= sp_buffer_ram1_do_r(11 downto 8) when (sp_buffer_sel = '0') and (hflip(0) = '1') else
sp_buffer_ram1_do_r( 3 downto 0) when (sp_buffer_sel = '0') and (hflip(0) = '0') else
sp_buffer_ram2_do_r(11 downto 8) when (sp_buffer_sel = '1') and (hflip(0) = '1') else
sp_vid <= sp_buffer_ram1_do_r(11 downto 8) when (sp_buffer_sel = '0') and (hflip(0) = '0') else
sp_buffer_ram1_do_r( 3 downto 0) when (sp_buffer_sel = '0') and (hflip(0) = '1') else
sp_buffer_ram2_do_r(11 downto 8) when (sp_buffer_sel = '1') and (hflip(0) = '0') else
sp_buffer_ram2_do_r( 3 downto 0);-- when (sp_buffer_sel = '1') and (hflip(0) = '0');
--sp_col <= sp_buffer_ram1_do_r(15 downto 12) when (sp_buffer_sel = '0') and (hflip(0) = '1') else
-- sp_buffer_ram1_do_r( 7 downto 4) when (sp_buffer_sel = '0') and (hflip(0) = '0') else
-- sp_buffer_ram2_do_r(15 downto 12) when (sp_buffer_sel = '1') and (hflip(0) = '1') else
-- sp_buffer_ram2_do_r( 7 downto 4);-- when (sp_buffer_sel = '1') and (hflip(0) = '0');
sp_col <= sp_buffer_ram1_do_r(15 downto 12) when (sp_buffer_sel = '0') and (hflip(0) = '0') else
sp_buffer_ram1_do_r( 7 downto 4) when (sp_buffer_sel = '0') and (hflip(0) = '1') else
sp_buffer_ram2_do_r(15 downto 12) when (sp_buffer_sel = '1') and (hflip(0) = '0') else
sp_buffer_ram2_do_r( 7 downto 4);-- when (sp_buffer_sel = '1') and (hflip(0) = '0');
----------------------------
------- char machine -------
--- 91442 MCR III Board ----
--- 91721 MCR III Board ----
----------------------------
ch_ram_addr <= cpu_addr(4 downto 0) & cpu_addr(9 downto 5) when hcnt(0) = '0' else vflip(8 downto 4) & hflip(8 downto 4);
ch_ram_addr <= cpu_addr(4 downto 0) & cpu_addr(9 downto 5) when hcnt(0) = '0' else vflip(8 downto 4) & not hflip(8 downto 4);
ch_code_line <= ch_code & vflip(3 downto 1) & hflip(3);
ch_code_line <= ch_code & vflip(3 downto 1) & not hflip(3);
process (clock_vid)
begin
@ -699,10 +708,11 @@ begin
end if;
case hflip(2 downto 1) is
when "00" => ch_color <= ch_graphx_do(7 downto 6);
when "01" => ch_color <= ch_graphx_do(5 downto 4);
when "10" => ch_color <= ch_graphx_do(3 downto 2);
when others => ch_color <= ch_graphx_do(1 downto 0);
when "11" => ch_color <= ch_graphx_do(7 downto 6);
when "10" => ch_color <= ch_graphx_do(5 downto 4);
when "01" => ch_color <= ch_graphx_do(3 downto 2);
when "00" => ch_color <= ch_graphx_do(1 downto 0);
when others => null;
end case;
end if;
@ -713,12 +723,12 @@ end process;
----------------------------
---- background machine ----
--- 91442 MCR III Board ----
--- 91721 MCR III Board ----
----------------------------
bg_ram_addr <= cpu_addr(10) & cpu_addr(3 downto 0) & cpu_addr(9 downto 4) when hcnt(0) = '0' else
vshift(9 downto 5) & hshift(11 downto 6);
vshift(9 downto 5) & not hshift(11 downto 6);
bg_code_line <= bg_code(7) & bg_code(5 downto 0) & (vshift(4 downto 1) xor (bg_code(6) & bg_code(6) & bg_code(6) & bg_code(6))) & hshift(5 downto 3);
bg_code_line <= bg_code(7) & bg_code(5 downto 0) & (vshift(4 downto 1) xor (bg_code(6) & bg_code(6) & bg_code(6) & bg_code(6))) & not hshift(5 downto 3);
process (clock_vid)
begin
@ -733,17 +743,17 @@ begin
if pix_ena = '1' then
if hcnt = "1001001001" then -- tune background h pos w.r.t char (use odd value to keep hshift(0) = hcnt(0))
hshift <= hoffset & '0';
if hcnt = 603 then
hshift <= not (hoffset+288) & '0'; -- tune background h pos w.r.t char
else
hshift <= hshift + 1 ;
end if;
if (vflip(9 downto 1) = "100000111" and tv15Khz_mode = '1') or
(vflip(9 downto 0) = "1000001100" and tv15Khz_mode = '0') then -- tune background v pos w.r.t char
vshift <= voffset & '0';
vshift <= voffset & '0';
else
if hcnt = "1001001001" then
if hcnt = 603 then
if tv15Khz_mode = '0' then vshift <= vshift + 1; end if;
if tv15Khz_mode = '1' then vshift <= vshift + 2; end if;
end if;
@ -753,10 +763,11 @@ begin
if hshift(5 downto 0) = "111111" then bg_code <= bg_ram_do; end if;
case hshift(2 downto 1) is
when "00" => bg_color <= bg_graphx2_do(7 downto 6) & bg_graphx1_do(7 downto 6);
when "01" => bg_color <= bg_graphx2_do(5 downto 4) & bg_graphx1_do(5 downto 4);
when "10" => bg_color <= bg_graphx2_do(3 downto 2) & bg_graphx1_do(3 downto 2);
when others => bg_color <= bg_graphx2_do(1 downto 0) & bg_graphx1_do(1 downto 0);
when "11" => bg_color <= bg_graphx2_do(7 downto 6) & bg_graphx1_do(7 downto 6);
when "10" => bg_color <= bg_graphx2_do(5 downto 4) & bg_graphx1_do(5 downto 4);
when "01" => bg_color <= bg_graphx2_do(3 downto 2) & bg_graphx1_do(3 downto 2);
when "00" => bg_color <= bg_graphx2_do(1 downto 0) & bg_graphx1_do(1 downto 0);
when others => null;
end case;
end if;
@ -769,8 +780,8 @@ end process;
-- mux char/sprite video --
---------------------------
palette_addr <= cpu_addr(6 downto 1) when palette_we = '1' else
"01" & bg_color when sp_vid(2 downto 0) = "000" else
"00" & sp_vid;
"11" & bg_color when sp_vid(2 downto 0) = "000" else
not sp_col(1 downto 0) & sp_vid;
process (clock_vid)
begin
@ -921,7 +932,7 @@ port map(
-- data => cpu_rom_do
--);
cpu_rom_addr <= cpu_addr(14 downto 0);
cpu_rom_addr <= cpu_addr(15 downto 0);
-- working RAM F000-F7FF 2Ko
wram : entity work.cmos_ram
@ -955,7 +966,7 @@ port map(
d => cpu_do,
q => bg_ram_do
);
-- sprite RAM (no cpu access)
sprite_ram : entity work.gen_ram
generic map( dWidth => 8, aWidth => 9)
@ -1023,27 +1034,66 @@ port map(
);
-- char graphics ROM 10G
ch_graphics : entity work.crater_ch_bits
ch_graphics : entity work.dpram
generic map(
aWidth => 12,
dWidth => 8
)
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,
addr_b => dl_addr(11 downto 0),
we_b => dl_cg_graphics_we,
d_b => dl_data
);
dl_cg_graphics_we <= '1' when dl_wr = '1' and dl_addr(15 downto 12) = "1000" else '0';
-- background graphics ROM 3A/4A
bg_graphics_1 : entity work.crater_bg_bits_1
bg_graphics_1 : entity work.dpram
generic map(
aWidth => 14,
dWidth => 8
)
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,
addr_b => dl_addr(13 downto 0),
we_b => dl_bg_graphics_1_we,
d_b => dl_data
);
dl_bg_graphics_1_we <= '1' when dl_wr = '1' and dl_addr(15 downto 14) = "00" else '0';
-- background graphics ROM 5A/6A
bg_graphics_2 : entity work.crater_bg_bits_2
bg_graphics_2 : entity work.dpram
generic map(
aWidth => 14,
dWidth => 8
)
port map(
clk_a => clock_vidn,
addr_a => bg_code_line,
q_a => bg_graphx2_do,
clk_b => clock_vid,
addr_b => dl_addr(13 downto 0),
we_b => dl_bg_graphics_2_we,
d_b => dl_data
);
dl_bg_graphics_2_we <= '1' when dl_wr = '1' and dl_addr(15 downto 14) = "01" else '0';
-- background & sprite palette
palette : entity work.gen_ram
generic map( dWidth => 9, aWidth => 6)
port map(
clk => clock_vidn,
addr => bg_code_line,
data => bg_graphx2_do
we => palette_we,
addr => palette_addr,
d => cpu_addr(0) & cpu_do,
q => palette_do
);
-- Spy hunter sound board
@ -1075,15 +1125,4 @@ port map(
dbg_cpu_addr => open --dbg_cpu_addr
);
-- background & sprite palette
palette : entity work.gen_ram
generic map( dWidth => 9, aWidth => 6)
port map(
clk => clock_vidn,
we => palette_we,
addr => palette_addr,
d => cpu_addr(0) & cpu_do,
q => palette_do
);
end struct;

View File

@ -60,7 +60,7 @@ begin
int_reg_1 <= '0';
int_reg_2 <= '0';
int_reg_3 <= '0';
load_data_r <= load_data;
load_data_r <= '0';
int_vector <= (others => '0');
else
if rising_edge(clock) then

View File

@ -70,7 +70,7 @@ begin
restart_on_next_trigger <= '0';
count_in <= (others=> '0');
zc_to_in <= '0';
clk_trg_r <= clk_trg;
clk_trg_r <= '0';
else
if rising_edge(clock) then
if clock_ena = '1' then
@ -132,7 +132,8 @@ begin
if ((control_word(6) = '1' and trigger = '1' ) or
(control_word(6) = '0' and count_ena = '1') ) and time_constant_loaded = '1' then
if prescale_in = 0 then
prescale_in <= '0'&prescale_max(7 downto 1); -- test divide by 2 !
prescale_in <= prescale_max;
-- prescale_in <= '0'&prescale_max(7 downto 1); -- test divide by 2 !
if count_in = 0 then
zc_to_in <= '1';
count_in <= count_max;

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 crater_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 crater_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"00",X"00",X"FF",X"FF",X"C0",X"01",X"C0",X"01",X"C0",X"01",X"C0",X"01",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"C0",X"05",X"C0",X"05",X"C0",X"05",X"C0",X"05",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"C0",X"15",X"C0",X"15",X"C0",X"15",X"C0",X"15",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"C0",X"55",X"C0",X"55",X"C0",X"55",X"C0",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"C1",X"55",X"C1",X"55",X"C1",X"55",X"C1",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"C5",X"55",X"C5",X"55",X"C5",X"55",X"C5",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"D5",X"55",X"D5",X"55",X"D5",X"55",X"D5",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"00",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"01",X"00",X"01",X"00",X"01",X"00",X"01",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"05",X"00",X"05",X"00",X"05",X"00",X"05",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"15",X"00",X"15",X"00",X"15",X"00",X"15",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"55",X"00",X"55",X"00",X"55",X"00",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"01",X"55",X"01",X"55",X"01",X"55",X"01",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"05",X"55",X"05",X"55",X"05",X"55",X"05",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"15",X"55",X"15",X"55",X"15",X"55",X"15",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"07",X"00",X"07",X"00",X"07",X"00",X"07",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"17",X"00",X"17",X"00",X"17",X"00",X"17",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"57",X"00",X"57",X"00",X"57",X"00",X"57",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"01",X"57",X"01",X"57",X"01",X"57",X"01",X"57",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"05",X"57",X"05",X"57",X"05",X"57",X"05",X"57",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"15",X"57",X"15",X"57",X"15",X"57",X"15",X"57",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"55",X"57",X"55",X"57",X"55",X"57",X"55",X"57",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"03",X"00",X"03",X"00",X"03",X"00",X"03",X"FF",X"FF",
X"00",X"00",X"00",X"10",X"00",X"50",X"01",X"50",X"05",X"50",X"00",X"10",X"00",X"10",X"00",X"10",
X"00",X"00",X"00",X"30",X"00",X"F0",X"03",X"F0",X"0F",X"F0",X"00",X"30",X"00",X"30",X"00",X"30",
X"00",X"C0",X"30",X"C3",X"30",X"C3",X"3F",X"FF",X"3F",X"FF",X"3F",X"FF",X"33",X"F3",X"30",X"03",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",
X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",X"55",
X"00",X"00",X"03",X"C0",X"03",X"C0",X"3F",X"FC",X"3F",X"FC",X"03",X"C0",X"03",X"C0",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"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"FC",X"00",X"00",X"00",X"00",X"3F",X"FC",X"00",X"00",X"00",X"00",
X"00",X"00",X"30",X"0C",X"0C",X"30",X"03",X"C0",X"0C",X"30",X"30",X"0C",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"0C",X"00",X"0C",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"0C",X"00",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"00",X"00",X"0F",X"C0",X"0F",X"C0",X"03",X"00",X"3F",X"F0",X"03",X"00",X"0C",X"C0",X"30",X"30",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"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"FC",X"3C",X"0C",X"3C",X"0C",X"30",X"0C",X"30",X"0C",X"30",X"0C",X"3F",X"FC",
X"00",X"00",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"C0",
X"00",X"00",X"3F",X"FC",X"30",X"0C",X"30",X"00",X"3F",X"FC",X"00",X"3C",X"00",X"3C",X"3F",X"FC",
X"00",X"00",X"0F",X"FC",X"0C",X"00",X"3F",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"0C",X"3F",X"FC",
X"00",X"00",X"0C",X"00",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"3F",X"FC",X"0F",X"00",X"0F",X"00",
X"00",X"00",X"3F",X"FC",X"00",X"0C",X"00",X"0C",X"3F",X"FC",X"3C",X"00",X"3C",X"0C",X"3F",X"FC",
X"00",X"00",X"3F",X"FC",X"00",X"0C",X"00",X"0C",X"3F",X"FC",X"3C",X"0C",X"3C",X"0C",X"3F",X"FC",
X"00",X"00",X"3F",X"FC",X"30",X"00",X"30",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"00",
X"00",X"00",X"0F",X"F0",X"0C",X"30",X"0C",X"30",X"3F",X"FC",X"3C",X"0C",X"3C",X"0C",X"3F",X"FC",
X"00",X"00",X"3F",X"FC",X"30",X"0C",X"30",X"0C",X"3F",X"FC",X"3C",X"00",X"3C",X"00",X"3F",X"FC",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"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"F0",X"0C",X"30",X"0C",X"30",X"3F",X"FC",X"30",X"3C",X"30",X"3C",X"30",X"3C",
X"00",X"00",X"0F",X"FC",X"0C",X"0C",X"0C",X"0C",X"3F",X"FC",X"30",X"3C",X"30",X"3C",X"3F",X"FC",
X"00",X"00",X"3F",X"FC",X"30",X"0C",X"00",X"0C",X"00",X"3C",X"00",X"3C",X"30",X"3C",X"3F",X"FC",
X"00",X"00",X"0F",X"FC",X"3C",X"0C",X"30",X"0C",X"30",X"3C",X"30",X"3C",X"3C",X"3C",X"0F",X"FC",
X"00",X"00",X"3F",X"FC",X"00",X"0C",X"00",X"0C",X"3F",X"FC",X"00",X"3C",X"00",X"3C",X"3F",X"FC",
X"00",X"00",X"3F",X"FC",X"00",X"0C",X"00",X"0C",X"3F",X"FC",X"00",X"3C",X"00",X"3C",X"00",X"3C",
X"00",X"00",X"3F",X"FC",X"30",X"0C",X"00",X"0C",X"3F",X"3C",X"30",X"3C",X"30",X"3C",X"3F",X"FC",
X"00",X"00",X"30",X"0C",X"30",X"0C",X"30",X"0C",X"3F",X"FC",X"30",X"3C",X"30",X"3C",X"30",X"3C",
X"00",X"00",X"00",X"C0",X"00",X"C0",X"00",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",
X"00",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"0C",X"3F",X"FC",
X"00",X"00",X"3C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0F",X"FC",X"3C",X"3C",X"30",X"3C",X"30",X"3C",
X"00",X"00",X"00",X"0C",X"00",X"0C",X"00",X"0C",X"00",X"3C",X"00",X"3C",X"00",X"3C",X"3F",X"FC",
X"00",X"00",X"3F",X"FC",X"33",X"0C",X"33",X"0C",X"33",X"3C",X"33",X"3C",X"33",X"3C",X"33",X"3C",
X"00",X"00",X"30",X"FC",X"33",X"CC",X"33",X"0C",X"33",X"3C",X"3F",X"3C",X"3C",X"3C",X"3C",X"3C",
X"00",X"00",X"3F",X"FC",X"3C",X"0C",X"3C",X"0C",X"30",X"0C",X"30",X"0C",X"30",X"0C",X"3F",X"FC",
X"00",X"00",X"3F",X"FC",X"30",X"0C",X"30",X"0C",X"3F",X"FC",X"00",X"3C",X"00",X"3C",X"00",X"3C",
X"00",X"00",X"3F",X"FC",X"30",X"0C",X"30",X"0C",X"33",X"0C",X"3F",X"0C",X"3C",X"0C",X"3F",X"FC",
X"00",X"00",X"0F",X"FC",X"0C",X"0C",X"0C",X"0C",X"3F",X"FC",X"30",X"3C",X"30",X"3C",X"30",X"3C",
X"00",X"00",X"3F",X"FC",X"30",X"0C",X"00",X"0C",X"3F",X"FC",X"3C",X"00",X"3C",X"0C",X"3F",X"FC",
X"00",X"00",X"3F",X"FC",X"00",X"C0",X"00",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",X"03",X"C0",
X"00",X"00",X"30",X"0C",X"30",X"0C",X"30",X"0C",X"30",X"3C",X"30",X"3C",X"30",X"3C",X"3F",X"FC",
X"00",X"00",X"30",X"3C",X"30",X"3C",X"30",X"3C",X"0C",X"3C",X"0C",X"30",X"0C",X"30",X"0F",X"F0",
X"00",X"00",X"33",X"0C",X"33",X"0C",X"33",X"0C",X"33",X"3C",X"33",X"3C",X"33",X"3C",X"3F",X"FC",
X"00",X"00",X"30",X"0C",X"30",X"0C",X"30",X"30",X"0F",X"C0",X"30",X"3C",X"30",X"3C",X"30",X"3C",
X"00",X"00",X"30",X"0C",X"30",X"0C",X"3C",X"3C",X"0F",X"F0",X"03",X"C0",X"03",X"C0",X"03",X"C0",
X"00",X"00",X"3F",X"FC",X"3C",X"0C",X"0F",X"00",X"03",X"C0",X"00",X"F0",X"30",X"3C",X"3F",X"FC",
X"00",X"00",X"15",X"54",X"14",X"04",X"14",X"04",X"10",X"04",X"10",X"04",X"10",X"04",X"15",X"54",
X"00",X"00",X"01",X"40",X"01",X"40",X"01",X"40",X"01",X"40",X"01",X"40",X"01",X"40",X"01",X"40",
X"00",X"00",X"15",X"54",X"10",X"04",X"10",X"00",X"15",X"54",X"00",X"14",X"00",X"14",X"15",X"54",
X"00",X"00",X"05",X"54",X"04",X"00",X"15",X"00",X"14",X"00",X"14",X"00",X"14",X"04",X"15",X"54",
X"00",X"00",X"04",X"00",X"04",X"04",X"04",X"04",X"04",X"04",X"15",X"54",X"05",X"00",X"05",X"00",
X"00",X"00",X"15",X"54",X"00",X"04",X"00",X"04",X"15",X"54",X"14",X"00",X"14",X"04",X"15",X"54",
X"00",X"00",X"15",X"54",X"00",X"04",X"00",X"04",X"15",X"54",X"14",X"04",X"14",X"04",X"15",X"54",
X"00",X"00",X"15",X"54",X"10",X"00",X"10",X"00",X"14",X"00",X"14",X"00",X"14",X"00",X"14",X"00",
X"00",X"00",X"05",X"50",X"04",X"10",X"04",X"10",X"15",X"54",X"14",X"04",X"14",X"04",X"15",X"54",
X"00",X"00",X"15",X"54",X"10",X"04",X"10",X"04",X"15",X"54",X"14",X"00",X"14",X"00",X"15",X"54",
X"00",X"00",X"05",X"50",X"04",X"10",X"04",X"10",X"15",X"54",X"10",X"14",X"10",X"14",X"10",X"14",
X"00",X"00",X"05",X"54",X"04",X"04",X"04",X"04",X"15",X"54",X"10",X"14",X"10",X"14",X"15",X"54",
X"00",X"00",X"15",X"54",X"10",X"04",X"00",X"04",X"00",X"14",X"00",X"14",X"10",X"14",X"15",X"54",
X"00",X"00",X"05",X"54",X"14",X"04",X"10",X"04",X"10",X"14",X"10",X"14",X"14",X"14",X"05",X"54",
X"00",X"00",X"15",X"54",X"00",X"04",X"00",X"04",X"15",X"54",X"00",X"14",X"00",X"14",X"15",X"54",
X"00",X"00",X"15",X"54",X"00",X"04",X"00",X"04",X"15",X"54",X"00",X"14",X"00",X"14",X"00",X"14",
X"00",X"00",X"15",X"54",X"10",X"04",X"00",X"04",X"15",X"14",X"10",X"14",X"10",X"14",X"15",X"54",
X"00",X"00",X"10",X"04",X"10",X"04",X"10",X"04",X"15",X"54",X"10",X"14",X"10",X"14",X"10",X"14",
X"00",X"00",X"00",X"40",X"00",X"40",X"00",X"40",X"01",X"40",X"01",X"40",X"01",X"40",X"01",X"40",
X"00",X"00",X"04",X"00",X"04",X"00",X"04",X"00",X"14",X"00",X"14",X"00",X"14",X"04",X"15",X"54",
X"00",X"00",X"14",X"04",X"04",X"04",X"04",X"04",X"05",X"54",X"14",X"14",X"10",X"14",X"10",X"14",
X"00",X"00",X"00",X"04",X"00",X"04",X"00",X"04",X"00",X"14",X"00",X"14",X"00",X"14",X"15",X"54",
X"00",X"00",X"15",X"54",X"11",X"04",X"11",X"04",X"11",X"14",X"11",X"14",X"11",X"14",X"11",X"14",
X"00",X"00",X"10",X"54",X"11",X"44",X"11",X"04",X"11",X"14",X"15",X"14",X"14",X"14",X"14",X"14",
X"00",X"00",X"15",X"54",X"14",X"04",X"14",X"04",X"10",X"04",X"10",X"04",X"10",X"04",X"15",X"54",
X"00",X"00",X"15",X"54",X"10",X"04",X"10",X"04",X"15",X"54",X"00",X"14",X"00",X"14",X"00",X"14",
X"00",X"00",X"15",X"54",X"10",X"04",X"10",X"04",X"11",X"04",X"15",X"04",X"14",X"04",X"15",X"54",
X"00",X"00",X"05",X"54",X"04",X"04",X"04",X"04",X"15",X"54",X"10",X"14",X"10",X"14",X"10",X"14",
X"00",X"00",X"15",X"54",X"10",X"04",X"00",X"04",X"15",X"54",X"14",X"00",X"14",X"04",X"15",X"54",
X"00",X"00",X"15",X"54",X"00",X"40",X"00",X"40",X"01",X"40",X"01",X"40",X"01",X"40",X"01",X"40",
X"00",X"00",X"10",X"04",X"10",X"04",X"10",X"04",X"10",X"14",X"10",X"14",X"10",X"14",X"15",X"54",
X"00",X"00",X"10",X"14",X"10",X"14",X"10",X"14",X"04",X"14",X"04",X"10",X"04",X"10",X"05",X"50",
X"00",X"00",X"11",X"04",X"11",X"04",X"11",X"04",X"11",X"14",X"11",X"14",X"11",X"14",X"15",X"54",
X"00",X"00",X"10",X"04",X"10",X"04",X"10",X"10",X"05",X"40",X"10",X"14",X"10",X"14",X"10",X"14",
X"00",X"00",X"10",X"04",X"10",X"04",X"14",X"14",X"05",X"50",X"01",X"40",X"01",X"40",X"01",X"40",
X"00",X"00",X"15",X"54",X"14",X"04",X"05",X"00",X"01",X"40",X"00",X"50",X"10",X"14",X"15",X"54",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",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

@ -1,25 +0,0 @@
make_vhdl_prom crcpu.10g crater_ch_bits.vhd
copy /B crcpu.3a + crcpu.4a crater_bg_bits_1.bin
copy /B crcpu.5a + crcpu.6a crater_bg_bits_2.bin
make_vhdl_prom crater_bg_bits_1.bin crater_bg_bits_1.vhd
make_vhdl_prom crater_bg_bits_2.bin crater_bg_bits_2.vhd
copy /B crcpu.6d + crcpu.7d + crcpu.8d + crcpu.9d + crcpu.10d crater_cpu.bin
copy /B crsnd4.a7 + crsnd1.a8 + crsnd2.a9 + crsnd3.a10 crater_sound_cpu.bin
make_vhdl_prom 82s123.12d midssio_82s123.vhd
copy /B crvid.a4 + crvid.a3 crater_sp_bits_1.bin
copy /B crvid.a6 + crvid.a5 crater_sp_bits_2.bin
copy /B crvid.a8 + crvid.a7 crater_sp_bits_3.bin
copy /B crvid.a10 + crvid.a9 crater_sp_bits_4.bin
copy /B crater_cpu.bin + crater_sound_cpu.bin + crater_sp_bits_1.bin + crater_sp_bits_2.bin + crater_sp_bits_3.bin + crater_sp_bits_4.bin CRATER.ROM
pause

View File

@ -0,0 +1,46 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity spinner is
port(
clock_40 : in std_logic;
reset : in std_logic;
btn_left : in std_logic;
btn_right : in std_logic;
btn_acc : in std_logic; -- speed up button
ctc_zc_to_2 : in std_logic;
spin_angle : out std_logic_vector(7 downto 0)
);
end spinner;
architecture rtl of spinner is
signal ctc_zc_to_2_r : std_logic;
signal spin_count : std_logic_vector(9 downto 0);
begin
spin_angle <= spin_count(9 downto 2);
process (clock_40, reset)
begin
if reset = '1' then
spin_count <= (others => '0');
elsif rising_edge(clock_40) then
ctc_zc_to_2_r <= ctc_zc_to_2;
if ctc_zc_to_2_r ='0' and ctc_zc_to_2 = '1' then
if btn_acc = '0' then -- space -- speed up
if btn_left = '1' then spin_count <= spin_count + 10; end if; -- left
if btn_right = '1' then spin_count <= spin_count - 10; end if; -- right
else
if btn_left = '1' then spin_count <= spin_count + 55; end if;
if btn_right = '1' then spin_count <= spin_count - 55; end if;
end if;
end if;
end if;
end process;
end rtl;