1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-03-09 20:18:22 +00:00

New Core Sonson by Slingshot

This commit is contained in:
Gehstock
2020-03-26 02:25:15 +01:00
parent 7864e0fd5e
commit d543ba623f
83 changed files with 1318 additions and 17042 deletions

View File

@@ -0,0 +1,14 @@
Capcom SonSon Arcade game
=========================
Based on old PACE code by Mark McDougall(tcdev)
MiST port usage
===============
- Create ROM file from the MRA file using the MRA utility.
Example: mra -z /path/to/mame/roms SonSon.mra
- Copy the ROM files to the root of the SD Card
- Copy the RBF files to the SD Card
MRA utility: https://github.com/sebdel/mra-tools-c/

View File

@@ -158,7 +158,7 @@ set_global_assignment -name GENERATE_RBF_FILE ON
# SignalTap II Assignments
# ========================
set_global_assignment -name ENABLE_SIGNALTAP OFF
set_global_assignment -name USE_SIGNALTAP_FILE output_files/druaga.stp
set_global_assignment -name USE_SIGNALTAP_FILE output_files/sprite.stp
# Power Estimation Assignments
# ============================
@@ -190,40 +190,6 @@ set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED
set_global_assignment -name FITTER_EFFORT "STANDARD FIT"
set_global_assignment -name SMART_RECOMPILE ON
set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008
set_global_assignment -name SYSTEMVERILOG_FILE rtl/SonSon_MiST.sv
set_global_assignment -name VHDL_FILE rtl/target_top.vhd
set_global_assignment -name VHDL_FILE rtl/platform_pkg.vhd
set_global_assignment -name VHDL_FILE rtl/platform.vhd
set_global_assignment -name VHDL_FILE rtl/pace_pkg_body.vhd
set_global_assignment -name VHDL_FILE rtl/pace_pkg.vhd
set_global_assignment -name VHDL_FILE rtl/pace.vhd
set_global_assignment -name VHDL_FILE rtl/Graphics.VHD
set_global_assignment -name VHDL_FILE rtl/video_mixer.vhd
set_global_assignment -name VHDL_FILE rtl/video_controller_pkg_body.vhd
set_global_assignment -name VHDL_FILE rtl/video_controller_pkg.vhd
set_global_assignment -name VHDL_FILE rtl/video_controller.vhd
set_global_assignment -name VHDL_FILE rtl/spritereg.vhd
set_global_assignment -name VHDL_FILE rtl/spritectl.vhd
set_global_assignment -name VHDL_FILE rtl/sprite_pkg_body.vhd
set_global_assignment -name VHDL_FILE rtl/sprite_pkg.vhd
set_global_assignment -name VHDL_FILE rtl/sprite_array.vhd
set_global_assignment -name VHDL_FILE rtl/bitmapctl_e.vhd
set_global_assignment -name VHDL_FILE rtl/tilemapctl_e.vhd
set_global_assignment -name VHDL_FILE rtl/tilemapctl.vhd
set_global_assignment -name VHDL_FILE rtl/sonson_soundboard.vhd
set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv
set_global_assignment -name VHDL_FILE rtl/sound.vhd
set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv
set_global_assignment -name VERILOG_FILE rtl/pll.v
set_global_assignment -name VHDL_FILE rtl/dprom_2r.vhd
set_global_assignment -name VHDL_FILE rtl/dpram.vhd
set_global_assignment -name VHDL_FILE rtl/sprom.vhd
set_global_assignment -name VHDL_FILE rtl/spram.vhd
set_global_assignment -name VHDL_FILE rtl/cpu09s.vhd
set_global_assignment -name VHDL_FILE rtl/roms/sonson/sound_rom.vhd
set_global_assignment -name VHDL_FILE ../../../common/CPU/T80/Z80.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
@@ -258,6 +224,34 @@ 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 VERILOG_FILE ../../../common/CPU/MC6809/mc6809.v
set_global_assignment -name VERILOG_FILE ../../../common/CPU/MC6809/mc6809i.v
set_global_assignment -name SYSTEMVERILOG_FILE rtl/SonSon_MiST.sv
set_global_assignment -name VHDL_FILE rtl/target_top.vhd
set_global_assignment -name VHDL_FILE rtl/platform_pkg.vhd
set_global_assignment -name VHDL_FILE rtl/platform.vhd
set_global_assignment -name VHDL_FILE rtl/pace_pkg_body.vhd
set_global_assignment -name VHDL_FILE rtl/pace_pkg.vhd
set_global_assignment -name VHDL_FILE rtl/pace.vhd
set_global_assignment -name VHDL_FILE rtl/Graphics.VHD
set_global_assignment -name VHDL_FILE rtl/video_mixer.vhd
set_global_assignment -name VHDL_FILE rtl/sonson_video_controller.vhd
set_global_assignment -name VHDL_FILE rtl/video_controller_pkg_body.vhd
set_global_assignment -name VHDL_FILE rtl/video_controller_pkg.vhd
set_global_assignment -name VHDL_FILE rtl/spritereg.vhd
set_global_assignment -name VHDL_FILE rtl/spritectl.vhd
set_global_assignment -name VHDL_FILE rtl/sprite_pkg_body.vhd
set_global_assignment -name VHDL_FILE rtl/sprite_pkg.vhd
set_global_assignment -name VHDL_FILE rtl/sprite_array.vhd
set_global_assignment -name VHDL_FILE rtl/bitmapctl_e.vhd
set_global_assignment -name VHDL_FILE rtl/tilemapctl_e.vhd
set_global_assignment -name VHDL_FILE rtl/tilemapctl.vhd
set_global_assignment -name VHDL_FILE rtl/sonson_soundboard.vhd
set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv
set_global_assignment -name VERILOG_FILE rtl/pll.v
set_global_assignment -name VHDL_FILE rtl/dprom_2r.vhd
set_global_assignment -name VHDL_FILE rtl/dpram.vhd
set_global_assignment -name VHDL_FILE rtl/sprom.vhd
set_global_assignment -name VHDL_FILE rtl/spram.vhd
set_global_assignment -name VERILOG_FILE ../../common/CPU/MC6809/mc6809i.v
set_global_assignment -name QIP_FILE ../../common/mist/mist.qip
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

View File

@@ -54,7 +54,7 @@ set_time_format -unit ns -decimal_places 3
create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}]
set sys_clk "pll|altpll_component|auto_generated|pll1|clk[0]"
set sdram_clk "pll|altpll_component|auto_generated|pll1|clk[0]"
set sdram_clk "pll|altpll_component|auto_generated|pll1|clk[2]"
#**************************************************************
# Create Generated Clock
#**************************************************************

View File

@@ -0,0 +1,42 @@
<misterromdescription>
<name>SonSon</name>
<mameversion>0216</mameversion>
<setname>sonson</setname>
<manufacturer>Capcom</manufacturer>
<rbf>sonson</rbf>
<rom index="0" zip="sonson.zip" md5="d17bc11db95dd6e2d44ac342b3462259" type="merged|nonmerged">
<!-- CPU2, 8k -->
<part name="ss_6.c11"/>
<part repeat="0x2000">FF</part>
<!-- CPU1, 48k -->
<part name="ss.01e"/>
<part name="ss.02e"/>
<part name="ss.03e"/>
<!-- gfx1, 16k -->
<group width="16">
<part name="ss_7.b6"/>
<part name="ss_8.b5"/>
</group>
<!-- gfx2, 48k -->
<part name="ss_9.m5"/>
<part name="ss_10.m6"/>
<part name="ss_11.m3"/>
<part name="ss_12.m4"/>
<part name="ss_13.m1"/>
<part name="ss_14.m2"/>
<!-- other proms -->
<part name="ssb2.c4"/>
<part name="ssb3.h7"/>
<part name="ssb1.k11"/>
<part name="ssb4.b2"/>
<part name="ssb5.b1"/>
</rom>
</misterromdescription>

View File

@@ -20,20 +20,20 @@ entity Graphics is
sprite_reg_i : in to_SPRITE_REG_t;
sprite_ctl_i : in to_SPRITE_CTL_t;
sprite_ctl_o : out from_SPRITE_CTL_t;
spr0_hit : out std_logic;
spr0_hit : out std_logic;
graphics_i : in to_GRAPHICS_t;
graphics_o : out from_GRAPHICS_t;
video_i : in from_VIDEO_t;
video_o : out to_VIDEO_t
video_i : in from_VIDEO_t;
video_o : out to_VIDEO_t
);
end Graphics;
architecture SYN of Graphics is
alias clk : std_logic is video_i.clk;
alias clk : std_logic is video_i.clk;
signal from_video_ctl : from_VIDEO_CTL_t;
signal bitmap_ctl_o_s : from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS);
@@ -41,21 +41,21 @@ architecture SYN of Graphics is
signal sprite_ctl_o_s : from_SPRITE_CTL_t;
signal sprite_pri : std_logic;
signal rgb_data : RGB_t;
signal rgb_data : RGB_t;
-- before OSD is mixed in
signal video_o_s : to_VIDEO_t;
begin
-- dodgy OSD transparency...
video_o.clk <= video_o_s.clk;
video_o.clk <= video_o_s.clk;
video_o.rgb.r <= video_o_s.rgb.r;
video_o.rgb.g <= video_o_s.rgb.g;
video_o.rgb.b <= video_o_s.rgb.b;
video_o.hsync <= video_o_s.hsync;
video_o.vsync <= video_o_s.vsync;
video_o.hblank <= video_o_s.hblank;
video_o.vblank <= video_o_s.vblank;
video_o.hsync <= video_o_s.hsync;
video_o.vsync <= video_o_s.vsync;
video_o.hblank <= video_o_s.hblank;
video_o.vblank <= video_o_s.vblank;
graphics_o.y <= from_video_ctl.y;
-- should this be the 'real' vblank or the 'active' vblank?
@@ -63,38 +63,21 @@ begin
graphics_o.hblank <= video_o_s.hblank;
graphics_o.vblank <= video_o_s.vblank;
--graphics_o.vblank <= from_video_ctl.vblank;
pace_video_controller_inst : entity work.pace_video_controller
generic map
(
CONFIG => PACE_VIDEO_CONTROLLER_TYPE,
DELAY => PACE_VIDEO_PIPELINE_DELAY,
H_SIZE => PACE_VIDEO_H_SIZE,
V_SIZE => PACE_VIDEO_V_SIZE,
L_CROP => PACE_VIDEO_L_CROP,
R_CROP => PACE_VIDEO_R_CROP,
H_SCALE => PACE_VIDEO_H_SCALE,
V_SCALE => PACE_VIDEO_V_SCALE,
H_SYNC_POL => PACE_VIDEO_H_SYNC_POLARITY,
V_SYNC_POL => PACE_VIDEO_V_SYNC_POLARITY,
BORDER_RGB => PACE_VIDEO_BORDER_RGB
)
pace_video_controller_inst : entity work.sonson_video_controller
port map
(
-- clocking etc
video_i => video_i,
-- register interface
reg_i.h_scale => "000",
reg_i.v_scale => "000",
-- video data signals (in)
rgb_i => rgb_data,
rgb_i => rgb_data,
-- video control signals (out)
video_ctl_o => from_video_ctl,
-- VGA signals (out)
video_o => video_o_s
video_o => video_o_s
);
pace_video_mixer_inst : entity work.pace_video_mixer
@@ -105,19 +88,19 @@ begin
sprite_rgb => sprite_ctl_o_s.rgb,
sprite_set => sprite_ctl_o_s.set,
sprite_pri => sprite_pri,
video_ctl_i => from_video_ctl,
graphics_i => graphics_i,
rgb_o => rgb_data
);
GEN_NO_BITMAPS : if PACE_VIDEO_NUM_BITMAPS = 0 generate
GEN_NO_BITMAPS : if PACE_VIDEO_NUM_BITMAPS = 0 generate
--bitmap_ctl_o_s <= ((others => '0'), (others => (others => '0')), '0');
end generate GEN_NO_BITMAPS;
GEN_BITMAP_1 : if PACE_VIDEO_NUM_BITMAPS > 0 generate
forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_1)
end generate GEN_NO_BITMAPS;
GEN_BITMAP_1 : if PACE_VIDEO_NUM_BITMAPS > 0 generate
forground_bitmapctl_inst : entity work.bitmapCtl(BITMAP_1)
generic map
(
DELAY => PACE_VIDEO_PIPELINE_DELAY
@@ -222,30 +205,30 @@ begin
ctl_o => tilemap_ctl_o_s(2),
graphics_i => graphics_i
);
);
end generate GEN_TILEMAP_2;
end generate GEN_TILEMAP_2;
tilemap_ctl_o <= tilemap_ctl_o_s;
GEN_NO_SPRITES : if PACE_VIDEO_NUM_SPRITES = 0 generate
GEN_NO_SPRITES : if PACE_VIDEO_NUM_SPRITES = 0 generate
sprite_ctl_o_s <= ((others => '0'), (others => (others => '0')), '0');
sprite_pri <= '0';
spr0_hit <= '0';
end generate GEN_NO_SPRITES;
GEN_SPRITES : if PACE_VIDEO_NUM_SPRITES > 0 generate
sprites_inst : sprite_array
end generate GEN_NO_SPRITES;
GEN_SPRITES : if PACE_VIDEO_NUM_SPRITES > 0 generate
sprites_inst : sprite_array
generic map
(
N_SPRITES => PACE_VIDEO_NUM_SPRITES,
DELAY => PACE_VIDEO_PIPELINE_DELAY
)
port map
(
reset => video_i.reset,
port map
(
reset => video_i.reset,
-- register interface
reg_i => sprite_reg_i,
@@ -254,16 +237,16 @@ begin
graphics_i => graphics_i,
row_a => sprite_ctl_o_s.a,
row_d => sprite_ctl_i.d,
rgb => sprite_ctl_o_s.rgb,
set => sprite_ctl_o_s.set,
pri => sprite_pri,
spr0_set => spr0_hit
);
row_a => sprite_ctl_o_s.a,
row_d => sprite_ctl_i.d,
end generate GEN_SPRITES;
rgb => sprite_ctl_o_s.rgb,
set => sprite_ctl_o_s.set,
pri => sprite_pri,
spr0_set => spr0_hit
);
end generate GEN_SPRITES;
sprite_ctl_o <= sprite_ctl_o_s;

View File

@@ -1,38 +1,3 @@
/***************************************************************************
Son Son memory map (preliminary)
driver by Mirko Buffoni
MAIN CPU:
0000-0fff RAM
1000-13ff Video RAM
1400-17ff Color RAM
2020-207f Sprites
4000-ffff ROM
read:
3002 IN0
3003 IN1
3004 IN2
3005 DSW0
3006 DSW1
write:
3000 horizontal scroll
3008 watchdog reset
3018 flipscreen (inverted)
3010 command for the audio CPU
3019 trigger FIRQ on audio CPU
SOUND CPU:
0000-07ff RAM
e000-ffff ROM
read:
a000 command from the main CPU
write:
2000 8910 #1 control
2001 8910 #1 write
4000 8910 #2 control
4001 8910 #2 write
TODO:
- Fix Service Mode Output Test: press p1/p2 shot to insert coin
- Flip Screen DIP is noted in service manual and added to DIP LOCATIONS, but not working.
***************************************************************************/
module SonSon_MiST(
output LED,
output [5:0] VGA_R,
@@ -66,12 +31,12 @@ module SonSon_MiST(
`include "rtl/build_id.v"
localparam CONF_STR = {
"SONSON;ROM;",
"SONSON;;",
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
"O5,Blending,Off,On;",
"O6,Freeze,Off,On;",
"O7,Flip,Off,On;",
//"O7,Flip,Off,On;",
"O8,Test,Off,On;",
"T0,Reset;",
"V,v1.0.",`BUILD_DATE
@@ -87,13 +52,13 @@ wire test = status[8];
assign LED = ~ioctl_downl;
assign SDRAM_CKE = 1;
assign SDRAM_CLK = clk_sd;
wire clk_sys, clk_vid, clk_sd;
wire clk_sys, clk_sd;
wire pll_locked;
pll pll(
.inclk0(CLOCK_27),
.areset(0),
.c0(clk_sys),//20
.c1(clk_vid),//40
.c0(clk_sys),//24
.c2(clk_sd),
.locked(pll_locked)
);
@@ -133,11 +98,12 @@ user_io(
);
wire [15:0] cpu_rom_addr;
//wire [15:0] rom_addr;
wire [15:0] rom_do;
wire [12:0] tile_rom_addr;
//wire [12:0] tile_addr;
wire [12:0] snd_rom_addr;
wire [15:0] snd_do;
wire [13:1] tile_rom_addr;
wire [15:0] tile_do;
wire ioctl_downl;
@@ -147,7 +113,7 @@ wire [24:0] ioctl_addr;
wire [7:0] ioctl_dout;
data_io data_io(
.clk_sys ( clk_sd ),
.clk_sys ( clk_sys ),
.SPI_SCK ( SPI_SCK ),
.SPI_SS2 ( SPI_SS2 ),
.SPI_DI ( SPI_DI ),
@@ -164,7 +130,7 @@ sdram sdram(
.init_n ( pll_locked ),
.clk ( clk_sd ),
// port1 used for main + sound CPU
// port1 used for main CPU + tiledata
.port1_req ( port1_req ),
.port1_ack ( ),
.port1_a ( ioctl_addr[23:1] ),
@@ -175,17 +141,19 @@ sdram sdram(
.cpu1_addr ( ioctl_downl ? 16'hffff : {1'b0, cpu_rom_addr[15:1]} ),
.cpu1_q ( rom_do ),
.snd_addr ( ioctl_downl ? 16'hffff : (16'h6000 + tile_rom_addr[12:1]) ),
.snd_q ( tile_do ),
.tile_addr ( ioctl_downl ? 16'hffff : {1'b1, 2'b00, tile_rom_addr} ),
.tile_q ( tile_do ),
// port2 for sprite graphics
.port2_req ( ),
// port2 for sound CPU
.port2_req ( port2_req ),
.port2_ack ( ),
.port2_a ( ),
.port2_ds ( ),
.port2_we ( ),
.port2_d ( ),
.port2_q ( )
.port2_a ( ioctl_addr[23:1] ),
.port2_ds ( {ioctl_addr[0], ~ioctl_addr[0]} ),
.port2_we ( ioctl_downl ),
.port2_d ( {ioctl_dout, ioctl_dout} ),
.port2_q ( ),
.snd_addr ( snd_rom_addr[12:1] ),
.snd_q ( snd_do )
);
// ROM download controller
@@ -198,7 +166,6 @@ always @(posedge clk_sys) begin
port2_req <= ~port2_req;
end
end
// async clock domain crossing here (clk_snd -> clk_sys)
end
// reset signal generation
@@ -217,18 +184,28 @@ always @(posedge clk_sys) begin
end
wire [11:0] audio;
wire [9:0] snd_l, snd_r;
wire hs, vs, hb, vb;
wire blankn = ~(hb | vb);
reg blankn;
wire [3:0] g,b,r;
wire vma;
reg clk_vid_en; // 6 MHz
always @(posedge clk_sys) begin
reg [1:0] count;
count <= count + 1'd1;
clk_vid_en <= 0;
if (count == 0) clk_vid_en <= 1;
if (clk_vid_en) blankn <= ~(hb | vb);
end
target_top target_top(
.clk_sys(clk_sys),
.clk_vid(clk_vid),
.clk_vid_en(clk_vid_en),
.reset_in(reset),
.vma(vma),
.snd_l(),
.snd_r(),
.snd_l(snd_l),
.snd_r(snd_r),
.vid_hs(hs),
.vid_vs(vs),
.vid_hb(hb),
@@ -236,16 +213,18 @@ target_top target_top(
.vid_r(r),
.vid_g(g),
.vid_b(b),
.inputs_p1(~{2'b00,m_down,m_up,m_right,m_left,1'b0,m_fireC}),
.inputs_p2(~{2'b00,m_down2,m_up2,m_right2,m_left2,1'b0,m_fire2C}),
.inputs_p1(~{2'b00,m_down,m_up,m_right,m_left,1'b0,m_fireA}),
.inputs_p2(~{2'b00,m_down2,m_up2,m_right2,m_left2,1'b0,m_fire2A}),
.inputs_sys(~{2'b00,m_coin2,m_coin1,2'b00,m_two_players,m_one_player}),
.inputs_dip1(~{flip,test,"011111"}),
.inputs_dip2(~{freeze,"1111111"}),
.inputs_dip1(~{flip,test,6'b011111}),
.inputs_dip2(~{freeze,7'b1111111}),
.cpu_rom_addr(cpu_rom_addr),
.cpu_rom_do(cpu_rom_addr[0] ? rom_do[15:8] : rom_do[7:0]),
.snd_rom_addr(snd_rom_addr),
.snd_rom_do(snd_rom_addr[0] ? snd_do[15:8] : snd_do[7:0]),
.tile_rom_addr(tile_rom_addr),
.tile_rom_do(tile_do)
);
);
mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video(
.clk_sys ( clk_sys ),
@@ -255,35 +234,40 @@ mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video(
.R ( blankn ? r : 0 ),
.G ( blankn ? g : 0 ),
.B ( blankn ? b : 0 ),
.HSync ( hs ),
.VSync ( vs ),
.HSync ( ~hs ),
.VSync ( ~vs ),
.VGA_R ( VGA_R ),
.VGA_G ( VGA_G ),
.VGA_B ( VGA_B ),
.VGA_VS ( VGA_VS ),
.VGA_HS ( VGA_HS ),
.rotate ( { 1'b1, rotate } ),
.ce_divider ( 1'b0 ),
.scandoubler_disable( 1),// scandoublerD ),
.ce_divider ( 1'b1 ),
.scandoubler_disable( scandoublerD ),
.scanlines ( scanlines ),
.blend ( blend ),
.ypbpr ( ypbpr ),
.no_csync ( no_csync )
);
wire dac_o;
assign AUDIO_L = dac_o;
assign AUDIO_R = dac_o;
dac #(
.C_bits(12))
dac(
.C_bits(10))
dac_l(
.clk_i(clk_sys),
.res_n_i(1),
.dac_i(audio),
.dac_o(dac_o)
.dac_i(snd_l),
.dac_o(AUDIO_L)
);
dac #(
.C_bits(10))
dac_r(
.clk_i(clk_sys),
.res_n_i(1),
.dac_i(snd_r),
.dac_o(AUDIO_R)
);
wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF;
wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F;
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;

View File

@@ -13,7 +13,7 @@ entity PACE is
(
-- clocks and resets
clkrst_i : in from_CLKRST_t;
vma : out std_logic;
-- controller inputs
inputs_p1 : in std_logic_vector(7 downto 0);
inputs_p2 : in std_logic_vector(7 downto 0);
@@ -29,10 +29,12 @@ entity PACE is
audio_o : out to_AUDIO_t;
platform_i : in from_PLATFORM_IO_t;
platform_o : out to_PLATFORM_IO_t;
cpu_rom_addr : out std_logic_vector(15 downto 0);
cpu_rom_do : in std_logic_vector(7 downto 0);
tile_rom_addr : out std_logic_vector(12 downto 0);
tile_rom_do : in std_logic_vector(15 downto 0)
cpu_rom_addr : out std_logic_vector(15 downto 0);
cpu_rom_do : in std_logic_vector(7 downto 0);
tile_rom_addr : out std_logic_vector(12 downto 0);
tile_rom_do : in std_logic_vector(15 downto 0);
snd_rom_addr : out std_logic_vector(12 downto 0);
snd_rom_do : in std_logic_vector(7 downto 0)
);
end entity PACE;
@@ -54,50 +56,53 @@ architecture SYN of PACE is
signal to_graphics : to_GRAPHICS_t;
signal from_graphics : from_GRAPHICS_t;
signal to_sound : to_SOUND_t;
signal from_sound : from_sound_t;
signal snd_irq : std_logic;
signal snd_data : std_logic_vector(7 downto 0);
signal video_out : to_VIDEO_t;
begin
video_o <= video_out;
platform_inst : entity work.platform
port map
(
-- clocking and reset
clkrst_i => clkrst_i,
vma => vma,
-- controller inputs
inputs_p1 => inputs_p1,
inputs_p2 => inputs_p2,
inputs_sys => inputs_sys,
inputs_dip1 => inputs_dip1,
inputs_dip2 => inputs_dip2,
inputs_p1 => inputs_p1,
inputs_p2 => inputs_p2,
inputs_sys => inputs_sys,
inputs_dip1 => inputs_dip1,
inputs_dip2 => inputs_dip2,
-- graphics
bitmap_i => from_bitmap_ctl,
bitmap_o => to_bitmap_ctl,
tilemap_i => from_tilemap_ctl,
tilemap_o => to_tilemap_ctl,
sprite_reg_o => to_sprite_reg,
sprite_i => from_sprite_ctl,
sprite_o => to_sprite_ctl,
spr0_hit => spr0_hit,
graphics_i => from_graphics,
graphics_o => to_graphics,
-- sound
snd_i => from_sound,
snd_o => to_sound,
snd_irq => snd_irq,
snd_data => snd_data,
platform_i => platform_i,
platform_o => platform_o,
cpu_rom_addr => cpu_rom_addr,
cpu_rom_do => cpu_rom_do,
tile_rom_addr => tile_rom_addr,
tile_rom_do => tile_rom_do
cpu_rom_addr => cpu_rom_addr,
cpu_rom_do => cpu_rom_do,
tile_rom_addr => tile_rom_addr,
tile_rom_do => tile_rom_do
);
graphics_inst : entity work.Graphics
@@ -113,48 +118,30 @@ begin
sprite_ctl_i => to_sprite_ctl,
sprite_ctl_o => from_sprite_ctl,
spr0_hit => spr0_hit,
graphics_i => to_graphics,
graphics_o => from_graphics,
-- video (incl. clk)
video_i => video_i,
video_o => video_o
video_i => video_i,
video_o => video_out
);
SOUND_BLOCK : block
signal snd_data_l : std_logic_vector(7 downto 0);
signal snd_data_r : std_logic_vector(7 downto 0);
signal snd_a : std_logic_vector(15 downto 0);
begin
snd_a <= std_logic_vector(resize(unsigned(to_sound.a), snd_a'length));
sound_inst : entity work.Sound
generic map
sound_inst : entity work.sonson_soundboard
port map
(
CLK_MHz => CLK0_FREQ_MHz
)
port map
(
sysclk => clkrst_i.clk(0), -- fudge for now
reset => clkrst_i.rst(0),
-- clocking and reset
clkrst_i => clkrst_i,
sndif_rd => to_sound.rd,
sndif_wr => to_sound.wr,
sndif_addr => snd_a,
sndif_datai => to_sound.d,
sound_irq => snd_irq,
sound_data => snd_data,
vblank => video_out.vblank,
snd_clk => audio_o.clk,
snd_data_l => snd_data_l,
snd_data_r => snd_data_r,
sndif_datao => from_sound.d
);
audio_out_l => audio_o.ldata(9 downto 0),
audio_out_r => audio_o.rdata(9 downto 0),
snd_rom_addr => snd_rom_addr,
snd_rom_do => snd_rom_do
);
-- route audio to both channels
audio_o.ldata <= snd_data_l & "00000000";
audio_o.rdata <= snd_data_r & "00000000";
end block SOUND_BLOCK;
end SYN;

View File

@@ -0,0 +1,469 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.pace_pkg.all;
use work.video_controller_pkg.all;
use work.sprite_pkg.all;
use work.platform_pkg.all;
entity platform is
port
(
-- clocking and reset
clkrst_i : in from_CLKRST_t;
-- controller inputs
inputs_p1 : in std_logic_vector(7 downto 0);
inputs_p2 : in std_logic_vector(7 downto 0);
inputs_sys : in std_logic_vector(7 downto 0);
inputs_dip1 : in std_logic_vector(7 downto 0);
inputs_dip2 : in std_logic_vector(7 downto 0);
bitmap_i : in from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS);
bitmap_o : out to_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS);
tilemap_i : in from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS);
tilemap_o : out to_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS);
sprite_reg_o : out to_SPRITE_REG_t;
sprite_i : in from_SPRITE_CTL_t;
sprite_o : out to_SPRITE_CTL_t;
spr0_hit : in std_logic;
snd_irq : out std_logic;
snd_data : out std_logic_vector(7 downto 0);
-- various graphics information
graphics_i : in from_GRAPHICS_t;
graphics_o : out to_GRAPHICS_t;
platform_i : in from_PLATFORM_IO_t;
platform_o : out to_PLATFORM_IO_t;
cpu_rom_addr : out std_logic_vector(15 downto 0);
cpu_rom_do : in std_logic_vector(7 downto 0);
tile_rom_addr : out std_logic_vector(12 downto 0);
tile_rom_do : in std_logic_vector(15 downto 0)
);
end platform;
architecture SYN of platform is
alias clk_24M : std_logic is clkrst_i.clk(0);
alias rst_24M : std_logic is clkrst_i.rst(0);
alias clk_video : std_logic is clkrst_i.clk(1);
signal cpu_reset : std_logic;
-- uP signals
signal clk_E : std_logic;
signal clk_Q : std_logic;
signal cpu_r_wn : std_logic;
signal cpu_a : std_logic_vector(15 downto 0);
signal cpu_d_i : std_logic_vector(7 downto 0);
signal cpu_d_o : std_logic_vector(7 downto 0);
signal cpu_irq : std_logic;
signal cpu_bs : std_logic;
signal cpu_ba : std_logic;
-- ROM signals
signal rom_cs : std_logic;
signal rom_d_o : std_logic_vector(7 downto 0);
-- RAM signals
signal wram_cs : std_logic;
signal wram_wr : std_logic;
signal wram_d_o : std_logic_vector(7 downto 0);
signal vram_cs : std_logic;
signal vram_d_o : std_logic_vector(7 downto 0);
signal vram_wr : std_logic;
signal cram_cs : std_logic;
signal cram_d_o : std_logic_vector(7 downto 0);
signal cram_wr : std_logic;
signal sprite_cs : std_logic;
-- I/O signals
signal scroll_cs : std_logic;
signal in0_cs : std_logic;
signal in1_cs : std_logic;
signal in2_cs : std_logic;
signal dsw1_cs : std_logic;
signal dsw2_cs : std_logic;
signal snd_cs : std_logic;
signal vblank_r : std_logic;
COMPONENT mc6809i
GENERIC ( ILLEGAL_INSTRUCTIONS : STRING := "GHOST" );
PORT
(
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOut : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
ADDR : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
RnW : OUT STD_LOGIC;
E : IN STD_LOGIC;
Q : IN STD_LOGIC;
BS : OUT STD_LOGIC;
BA : OUT STD_LOGIC;
nIRQ : IN STD_LOGIC;
nFIRQ : IN STD_LOGIC;
nNMI : IN STD_LOGIC;
AVMA : OUT STD_LOGIC;
BUSY : OUT STD_LOGIC;
LIC : OUT STD_LOGIC;
nHALT : IN STD_LOGIC;
nRESET : IN STD_LOGIC;
nDMABREQ : IN STD_LOGIC;
RegData : OUT STD_LOGIC_VECTOR(111 DOWNTO 0)
);
END COMPONENT;
begin
wram_cs <= '1' when STD_MATCH(cpu_a, "0000------------") else '0';-- RAM $0000-$0FFF
vram_cs <= '1' when STD_MATCH(cpu_a, "000100----------") else '0';-- video ram $1000-$13FF
cram_cs <= '1' when STD_MATCH(cpu_a, "000101----------") else '0';-- colour ram $1400-$17FF
sprite_cs <= '1' when STD_MATCH(cpu_a, X"20"&"001-----") else
'1' when STD_MATCH(cpu_a, X"20"&"01------") else
'0';-- sprite 'ram' $2020-$207F
-- I/O
scroll_cs <= '1' when STD_MATCH(cpu_a, X"3000") else '0';
in0_cs <= '1' when STD_MATCH(cpu_a, X"3002") else '0';
in1_cs <= '1' when STD_MATCH(cpu_a, X"3003") else '0';
in2_cs <= '1' when STD_MATCH(cpu_a, X"3004") else '0';
dsw1_cs <= '1' when STD_MATCH(cpu_a, X"3005") else '0';
dsw2_cs <= '1' when STD_MATCH(cpu_a, X"3006") else '0';
rom_cs <= '1' when (cpu_a > X"3FFF") else '0';
snd_cs <= '1' when cpu_a(15 downto 4) = x"301" else '0';
-- memory block write enables
wram_wr <= wram_cs and not cpu_r_wn;
vram_wr <= vram_cs and not cpu_r_wn;
cram_wr <= cram_cs and not cpu_r_wn;
-- memory read mux
cpu_d_i <= wram_d_o when wram_cs = '1' else
vram_d_o when vram_cs = '1' else
cram_d_o when cram_cs = '1' else
inputs_p1 when in0_cs = '1' else
inputs_p2 when in1_cs = '1' else
inputs_sys when in2_cs = '1' else
inputs_dip1 when dsw1_cs = '1' else
inputs_dip2 when dsw2_cs = '1' else
-- flip off, service off, coin A, 1C1C
-- (X"80" or X"40" or X"10" or X"0F") when dsw1_cs = '1' else
-- freeze off, easy, 20K/80K/100K, 3 lives
-- (X"80" or X"60" or X"08" or X"03") when dsw2_cs = '1' else
rom_d_o when rom_cs = '1' else
(others => 'Z');
-- sound control
process (clk_24M, rst_24M)
variable count : unsigned(3 downto 0);
begin
if rst_24M = '1' then
snd_irq <= '0';
snd_data <= (others => '0');
elsif rising_edge(clk_24M) then
if snd_cs = '1' then
if cpu_a(3) = '1' then
snd_irq <= cpu_d_o(0);
else
snd_data <= cpu_d_o;
end if;
end if;
end if;
end process;
-- system timing
process (clk_24M)
variable count : unsigned(3 downto 0);
begin
if rising_edge(clk_24M) then
count := count + 1;
if count(1 downto 0) = "11" then
case count(3 downto 2) is
when "00" => clk_E <= '0';
when "01" => clk_Q <= '1';
when "10" => clk_E <= '1';
when "11" => clk_Q <= '0';
end case;
end if;
end if;
end process;
cpu_reset <= rst_24M;
cpu_inst : mc6809i
port map
(
D => cpu_d_i,
DOut => cpu_d_o,
ADDR => cpu_a,
RnW => cpu_r_wn,
E => clk_E,
Q => clk_Q,
BS => cpu_bs,
BA => cpu_ba,
nIRQ => not cpu_irq,
nFIRQ => '1',
nNMI => '1',
AVMA => open,
BUSY => open,
LIC => open,
nHALT => '1',
nRESET => not cpu_reset,
nDMABREQ => '1',
RegData => open
);
--WRAm_cs
wram_inst : entity work.spram
generic map
(
widthad_a => 12,
width_a => 8
)
port map
(
address => cpu_a(11 downto 0),
clock => clk_24M,
data => cpu_d_o,
wren => wram_wr,
q => wram_d_o
);
-- irq vblank interrupt
process (clk_24M, rst_24M)
begin
if rst_24M = '1' then
cpu_irq <= '0';
elsif rising_edge(clk_24M) then
vblank_r <= graphics_i.vblank;
if vblank_r = '0' and graphics_i.vblank = '1' then
cpu_irq <= '1';
elsif cpu_ba = '0' and cpu_bs = '1' then
cpu_irq <= '0';
end if;
end if;
end process;
-- scroll register
process (clk_24M, rst_24M)
begin
if rst_24M = '1' then
graphics_o.bit8(0) <= (others => '0');
elsif rising_edge(clk_24M) then
if scroll_cs and not cpu_r_wn then
graphics_o.bit8(0) <= cpu_d_o;
end if;
end if;
end process;
cpu_rom_addr <= cpu_a(15 downto 0);
rom_d_o <= cpu_rom_do;
-- wren_a *MUST* be GND for CYCLONEII_SAFE_WRITE=VERIFIED_SAFE
vram_inst : entity work.dpram
generic map
(
init_file => "./roms/vram.hex",
widthad_a => 10
)
port map
(
clock_b => clk_24M,
address_b => cpu_a(9 downto 0),
wren_b => vram_wr,
data_b => cpu_d_o,
q_b => vram_d_o,
clock_a => clk_video,
address_a => tilemap_i(1).map_a(9 downto 0),
wren_a => '0',
data_a => (others => 'X'),
q_a => tilemap_o(1).map_d(7 downto 0)
);
tilemap_o(1).map_d(tilemap_o(1).map_d'left downto 8) <= (others => 'Z');
-- wren_a *MUST* be GND for CYCLONEII_SAFE_WRITE=VERIFIED_SAFE
cram_inst : entity work.dpram
generic map
(
init_file => "./roms/cram.hex",
widthad_a => 10
)
port map
(
clock_b => clk_24M,
address_b => cpu_a(9 downto 0),
wren_b => cram_wr,
data_b => cpu_d_o,
q_b => cram_d_o,
clock_a => clk_video,
address_a => tilemap_i(1).attr_a(9 downto 0),
wren_a => '0',
data_a => (others => 'X'),
q_a => tilemap_o(1).attr_d(7 downto 0)
);
tilemap_o(1).attr_d(tilemap_o(1).attr_d'left downto 8) <= (others => 'Z');
tile_rom_addr <= tilemap_i(1).tile_a(12 downto 0);
tilemap_o(1).tile_d(15 downto 0) <= tile_rom_do;
BLK_SPRITES : block
signal bit0_1 : std_logic_vector(7 downto 0); -- offset 0
signal bit0_2 : std_logic_vector(7 downto 0); -- offset 0
signal bit0_3 : std_logic_vector(7 downto 0); -- offset 16
signal bit0_4 : std_logic_vector(7 downto 0); -- offset 16
signal bit1_1 : std_logic_vector(7 downto 0);
signal bit1_2 : std_logic_vector(7 downto 0);
signal bit1_3 : std_logic_vector(7 downto 0);
signal bit1_4 : std_logic_vector(7 downto 0);
signal bit2_1 : std_logic_vector(7 downto 0);
signal bit2_2 : std_logic_vector(7 downto 0);
signal bit2_3 : std_logic_vector(7 downto 0);
signal bit2_4 : std_logic_vector(7 downto 0);
signal sprite_a_00 : std_logic_vector(12 downto 0);
signal sprite_a_16 : std_logic_vector(12 downto 0);
begin
-- registers
sprite_reg_o.clk <= clk_24M;
sprite_reg_o.clk_ena <= '1';
sprite_reg_o.a <= cpu_a(sprite_reg_o.a'range);
sprite_reg_o.d <= cpu_d_o;
sprite_reg_o.wr <= sprite_cs and not cpu_r_wn;
-- - sprite data consists of:
-- 16 consecutive bytes for the 1st half
-- then the next 16 bytes for the 2nd half
-- - because we need to fetch an entire row at once
-- use dual-port memory to access both halves of each row
-- generate address for each port
sprite_a_00 <= sprite_i.a(12 downto 5) & '0' & sprite_i.a(3 downto 0);
sprite_a_16 <= sprite_i.a(12 downto 5) & '1' & sprite_i.a(3 downto 0);
-- sprite rom (bit 0, part 1/2)
ss_9_m5_inst : entity work.dprom_2r
generic map
(
init_file => "./roms/ss_9_m5.hex",
widthad_a => 13,
widthad_b => 13
)
port map
(
clock => clk_video,
address_a => sprite_a_00,
q_a => bit0_1,
address_b => sprite_a_16,
q_b => bit0_3
);
-- sprite rom (bit 0, part 2/2)
ss_10_m6_inst : entity work.dprom_2r
generic map
(
init_file => "./roms/ss_10_m6.hex",
widthad_a => 13,
widthad_b => 13
)
port map
(
clock => clk_video,
address_a => sprite_a_00,
q_a => bit0_2,
address_b => sprite_a_16,
q_b => bit0_4
);
sprite_o.d(15 downto 0) <= (bit0_1 & bit0_3) when sprite_i.a(13) = '0' else
(bit0_2 & bit0_4);
-- sprite rom (bit 1, part 1/2)
ss_11_m3_inst : entity work.dprom_2r
generic map
(
init_file => "./roms/ss_11_m3.hex",
widthad_a => 13,
widthad_b => 13
)
port map
(
clock => clk_video,
address_a => sprite_a_00,
q_a => bit1_1,
address_b => sprite_a_16,
q_b => bit1_3
);
-- sprite rom (bit 1, part 2/2)
ss_12_m4_inst : entity work.dprom_2r
generic map
(
init_file => "./roms/ss_12_m4.hex",
widthad_a => 13,
widthad_b => 13
)
port map
(
clock => clk_video,
address_a => sprite_a_00,
q_a => bit1_2,
address_b => sprite_a_16,
q_b => bit1_4
);
sprite_o.d(31 downto 16) <= (bit1_1 & bit1_3) when sprite_i.a(13) = '0' else
(bit1_2 & bit1_4);
-- sprite rom (bit 2, part 1/2)
ss_13_m1_inst : entity work.dprom_2r
generic map
(
init_file => "./roms/ss_13_m1.hex",
widthad_a => 13,
widthad_b => 13
)
port map
(
clock => clk_video,
address_a => sprite_a_00,
q_a => bit2_1,
address_b => sprite_a_16,
q_b => bit2_3
);
-- sprite rom (bit 2, part 2/2)
ss_14_m2_inst : entity work.dprom_2r
generic map
(
init_file => "./roms/ss_14_m2.hex",
widthad_a => 13,
widthad_b => 13
)
port map
(
clock => clk_video,
address_a => sprite_a_00,
q_a => bit2_2,
address_b => sprite_a_16,
q_b => bit2_4
);
sprite_o.d(47 downto 32) <= (bit2_1 & bit2_3) when sprite_i.a(13) = '0' else
(bit2_2 & bit2_4);
end block BLK_SPRITES;
-- unused outputs
graphics_o.bit16(0) <= (others => '0');
end SYN;

View File

@@ -8,35 +8,24 @@ use work.video_controller_pkg.all;
package platform_pkg is
constant PACE_HAS_PLL : boolean := true;
constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_VGA_800x600_60Hz; --40
constant PACE_CLK0_DIVIDE_BY : natural := 27;
constant PACE_CLK0_MULTIPLY_BY : natural := 20; -- 20MHz
constant PACE_CLK0_MULTIPLY_BY : natural := 24; -- 20MHz
constant PACE_CLK1_DIVIDE_BY : natural := 27;
constant PACE_CLK1_MULTIPLY_BY : natural := 40; -- 40MHz
constant PACE_VIDEO_H_SCALE : integer := 2;
constant PACE_VIDEO_V_SCALE : integer := 2;
constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '1';
constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '1';
constant PACE_CLK1_MULTIPLY_BY : natural := 6; -- 40MHz
constant PACE_VIDEO_BORDER_RGB : RGB_t := RGB_BLACK;
constant PACE_VIDEO_NUM_BITMAPS : natural := 0;
constant PACE_VIDEO_NUM_TILEMAPS : natural := 1;
constant PACE_VIDEO_NUM_SPRITES : natural := 24;
constant PACE_VIDEO_H_SIZE : integer := 256; -- 240
constant PACE_VIDEO_V_SIZE : integer := 256; -- 240
constant PACE_VIDEO_L_CROP : integer := (256-240)/2;
constant PACE_VIDEO_R_CROP : integer := PACE_VIDEO_L_CROP;
constant PACE_VIDEO_PIPELINE_DELAY : integer := 3;
constant PACE_INPUTS_NUM_BYTES : integer := 4;
--
-- Platform-specific constants (optional)
--
constant PACE_VIDEO_NUM_BITMAPS : natural := 0;
constant PACE_VIDEO_NUM_TILEMAPS : natural := 1;
constant PACE_VIDEO_NUM_SPRITES : natural := 24;
constant PACE_VIDEO_PIPELINE_DELAY : integer := 3;
constant PACE_INPUTS_NUM_BYTES : integer := 4;
--
-- Platform-specific constants (optional)
--
constant CLK0_FREQ_MHz : natural :=
27 * PACE_CLK0_MULTIPLY_BY / PACE_CLK0_DIVIDE_BY;

View File

@@ -14,11 +14,11 @@
// ************************************************************
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
//
// 13.1.0 Build 162 10/23/2013 SJ Web Edition
// 13.1.4 Build 182 03/12/2014 Patches 4.26 SJ Web Edition
// ************************************************************
//Copyright (C) 1991-2013 Altera Corporation
//Copyright (C) 1991-2014 Altera Corporation
//Your use of Altera Corporation's design tools, logic functions
//and other software and tools, and its AMPP partner logic
//functions, and any output files from any of the foregoing
@@ -40,14 +40,12 @@ module pll (
areset,
inclk0,
c0,
c1,
c2,
locked);
input areset;
input inclk0;
output c0;
output c1;
output c2;
output locked;
`ifndef ALTERA_RESERVED_QIS
@@ -58,24 +56,22 @@ module pll (
// synopsys translate_on
`endif
wire [4:0] sub_wire0;
wire sub_wire2;
wire [0:0] sub_wire7 = 1'h0;
wire [2:2] sub_wire4 = sub_wire0[2:2];
wire [0:0] sub_wire3 = sub_wire0[0:0];
wire [1:1] sub_wire1 = sub_wire0[1:1];
wire c1 = sub_wire1;
wire locked = sub_wire2;
wire c0 = sub_wire3;
wire c2 = sub_wire4;
wire sub_wire5 = inclk0;
wire [1:0] sub_wire6 = {sub_wire7, sub_wire5};
wire sub_wire0;
wire [4:0] sub_wire1;
wire [0:0] sub_wire6 = 1'h0;
wire locked = sub_wire0;
wire [2:2] sub_wire3 = sub_wire1[2:2];
wire [0:0] sub_wire2 = sub_wire1[0:0];
wire c0 = sub_wire2;
wire c2 = sub_wire3;
wire sub_wire4 = inclk0;
wire [1:0] sub_wire5 = {sub_wire6, sub_wire4};
altpll altpll_component (
.areset (areset),
.inclk (sub_wire6),
.clk (sub_wire0),
.locked (sub_wire2),
.inclk (sub_wire5),
.locked (sub_wire0),
.clk (sub_wire1),
.activeclock (),
.clkbad (),
.clkena ({6{1'b1}}),
@@ -111,17 +107,13 @@ module pll (
.vcounderrange ());
defparam
altpll_component.bandwidth_type = "AUTO",
altpll_component.clk0_divide_by = 27,
altpll_component.clk0_divide_by = 9,
altpll_component.clk0_duty_cycle = 50,
altpll_component.clk0_multiply_by = 20,
altpll_component.clk0_multiply_by = 8,
altpll_component.clk0_phase_shift = "0",
altpll_component.clk1_divide_by = 27,
altpll_component.clk1_duty_cycle = 50,
altpll_component.clk1_multiply_by = 40,
altpll_component.clk1_phase_shift = "0",
altpll_component.clk2_divide_by = 40,
altpll_component.clk2_divide_by = 3,
altpll_component.clk2_duty_cycle = 50,
altpll_component.clk2_multiply_by = 83,
altpll_component.clk2_multiply_by = 8,
altpll_component.clk2_phase_shift = "0",
altpll_component.compensate_clock = "CLK0",
altpll_component.inclk0_input_frequency = 37037,
@@ -156,7 +148,7 @@ module pll (
altpll_component.port_scanread = "PORT_UNUSED",
altpll_component.port_scanwrite = "PORT_UNUSED",
altpll_component.port_clk0 = "PORT_USED",
altpll_component.port_clk1 = "PORT_USED",
altpll_component.port_clk1 = "PORT_UNUSED",
altpll_component.port_clk2 = "PORT_USED",
altpll_component.port_clk3 = "PORT_UNUSED",
altpll_component.port_clk4 = "PORT_UNUSED",
@@ -197,14 +189,11 @@ endmodule
// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0"
// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8"
// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "27"
// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27"
// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "40"
// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000"
// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000"
// Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "20.000000"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "40.000000"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "56.025002"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.000000"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "72.000000"
// 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"
@@ -225,33 +214,25 @@ endmodule
// 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 "deg"
// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 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: MIRROR_CLK2 STRING "0"
// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "20"
// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "40"
// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "83"
// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "20.00000000"
// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "40.00000000"
// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "56.00000000"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0"
// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.00000000"
// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "72.00000000"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "1"
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz"
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT2 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_SHIFT2 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 "deg"
// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "deg"
// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0"
// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1"
@@ -275,32 +256,25 @@ endmodule
// 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: STICKY_CLK2 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_CLK2 STRING "1"
// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0"
// Retrieval info: PRIVATE: USE_CLKENA1 STRING "0"
// Retrieval info: PRIVATE: USE_CLKENA2 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 "27"
// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "9"
// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50"
// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "20"
// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8"
// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0"
// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27"
// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50"
// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "40"
// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0"
// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "40"
// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "3"
// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50"
// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "83"
// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "8"
// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0"
// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0"
// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037"
@@ -334,7 +308,7 @@ endmodule
// 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_clk1 STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_USED"
// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED"
@@ -354,7 +328,6 @@ endmodule
// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]"
// Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset"
// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0"
// Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1"
// Retrieval info: USED_PORT: c2 0 0 0 0 OUTPUT_CLK_EXT VCC "c2"
// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0"
// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked"
@@ -362,7 +335,6 @@ endmodule
// 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: CONNECT: c2 0 0 0 0 @clk 0 0 1 2
// Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE

View File

@@ -46,8 +46,10 @@ module sdram (
input [15:0] port1_d,
output [15:0] port1_q,
input [15:1] cpu1_addr,
input [16:1] cpu1_addr,
output reg [15:0] cpu1_q,
input [16:1] tile_addr,
output reg [15:0] tile_q,
input port2_req,
output reg port2_ack,
@@ -61,6 +63,8 @@ module sdram (
output reg [15:0] snd_q
);
parameter MHZ = 16'd80; // 80 MHz default clock, set it to proper value to calculate refresh rate
localparam RASCAS_DELAY = 3'd2; // tRCD=20ns -> 2 cycles@<100MHz
localparam BURST_LENGTH = 3'b000; // 000=1, 001=2, 010=4, 011=8
localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved
@@ -70,8 +74,8 @@ localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single acc
localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH};
// 64ms/8192 rows = 7.8us -> 842 cycles@108MHz
localparam RFRSH_CYCLES = 10'd842;
// 64ms/8192 rows = 7.8us
localparam RFRSH_CYCLES = 16'd78*MHZ/4'd10;
// ---------------------------------------------------------------------
// ------------------------ cycle state machine ------------------------
@@ -147,16 +151,20 @@ assign SDRAM_nWE = sd_cmd[0];
reg [24:1] addr_latch[2];
reg [24:1] addr_latch_next[2];
reg [15:1] addr_last[2];
reg [15:1] addr_last2[2];
reg [16:1] addr_last[2];
reg [16:1] addr_last2[2];
reg [15:0] din_latch[2];
reg [1:0] oe_latch;
reg [1:0] we_latch;
reg [1:0] ds[2];
reg port1_state;
reg port2_state;
localparam PORT_NONE = 2'd0;
localparam PORT_CPU1 = 2'd1;
localparam PORT_REQ = 2'd2;
localparam PORT_TILE = 2'd2;
localparam PORT_REQ = 2'd3;
localparam PORT_SND = 2'd1;
@@ -172,12 +180,15 @@ always @(*) begin
if (refresh) begin
next_port[0] = PORT_NONE;
addr_latch_next[0] = addr_latch[0];
end else if (port1_req ^ port1_ack) begin
end else if (port1_req ^ port1_state) begin
next_port[0] = PORT_REQ;
addr_latch_next[0] = { 1'b0, port1_a };
end else if (cpu1_addr != addr_last[PORT_CPU1]) begin
next_port[0] = PORT_CPU1;
addr_latch_next[0] = { 9'd0, cpu1_addr };
addr_latch_next[0] = { 8'd0, cpu1_addr };
end else if (tile_addr != addr_last[PORT_TILE]) begin
next_port[0] = PORT_TILE;
addr_latch_next[0] = { 8'd0, tile_addr };
end else begin
next_port[0] = PORT_NONE;
addr_latch_next[0] = addr_latch[0];
@@ -186,7 +197,7 @@ end
// PORT2: bank 2,3
always @(*) begin
if (port2_req ^ port2_ack) begin
if (port2_req ^ port2_state) begin
next_port[1] = PORT_REQ;
addr_latch_next[1] = { 1'b1, port2_a };
end else if (snd_addr != addr_last2[PORT_SND]) begin
@@ -238,11 +249,12 @@ always @(posedge clk) begin
sd_cmd <= CMD_ACTIVE;
SDRAM_A <= addr_latch_next[0][22:10];
SDRAM_BA <= addr_latch_next[0][24:23];
addr_last[next_port[0]] <= addr_latch_next[0][15:1];
addr_last[next_port[0]] <= addr_latch_next[0][16:1];
if (next_port[0] == PORT_REQ) begin
{ oe_latch[0], we_latch[0] } <= { ~port1_we, port1_we };
ds[0] <= port1_ds;
din_latch[0] <= port1_d;
port1_state <= port1_req;
end else begin
{ oe_latch[0], we_latch[0] } <= 2'b10;
ds[0] <= 2'b11;
@@ -266,6 +278,7 @@ always @(posedge clk) begin
{ oe_latch[1], we_latch[1] } <= { ~port2_we, port2_we };
ds[1] <= port2_ds;
din_latch[1] <= port2_d;
port2_state <= port1_req;
end else begin
{ oe_latch[1], we_latch[1] } <= 2'b10;
ds[1] <= 2'b11;
@@ -307,6 +320,7 @@ always @(posedge clk) begin
case(port[0])
PORT_REQ: begin port1_q <= sd_din; port1_ack <= port1_req; end
PORT_CPU1: begin cpu1_q <= sd_din; end
PORT_TILE: begin tile_q <= sd_din; end
default: ;
endcase;
end

View File

@@ -0,0 +1,262 @@
library ieee;
use work.pace_pkg.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
library work;
entity sonson_soundboard is
port(
clkrst_i : in from_CLKRST_t;
sound_irq : in std_logic;
sound_data : in std_logic_vector(7 downto 0);
vblank : in std_logic;
audio_out_l : out std_logic_vector(9 downto 0);
audio_out_r : out std_logic_vector(9 downto 0);
snd_rom_addr : out std_logic_vector(12 downto 0);
snd_rom_do : in std_logic_vector(7 downto 0)
);
end sonson_soundboard;
architecture SYN of sonson_soundboard is
component YM2149
port (
CLK : in std_logic;
CE : in std_logic;
RESET : in std_logic;
A8 : in std_logic := '1';
A9_L : in std_logic := '0';
BDIR : in std_logic; -- Bus Direction (0 - read , 1 - write)
BC : in std_logic; -- Bus control
DI : in std_logic_vector(7 downto 0);
DO : out std_logic_vector(7 downto 0);
CHANNEL_A : out std_logic_vector(7 downto 0);
CHANNEL_B : out std_logic_vector(7 downto 0);
CHANNEL_C : out std_logic_vector(7 downto 0);
SEL : in std_logic;
MODE : in std_logic;
ACTIVE : out std_logic_vector(5 downto 0);
IOA_in : in std_logic_vector(7 downto 0);
IOA_out : out std_logic_vector(7 downto 0);
IOB_in : in std_logic_vector(7 downto 0);
IOB_out : out std_logic_vector(7 downto 0)
);
end component;
COMPONENT mc6809i
GENERIC ( ILLEGAL_INSTRUCTIONS : STRING := "GHOST" );
PORT
(
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOut : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
ADDR : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
RnW : OUT STD_LOGIC;
E : IN STD_LOGIC;
Q : IN STD_LOGIC;
BS : OUT STD_LOGIC;
BA : OUT STD_LOGIC;
nIRQ : IN STD_LOGIC;
nFIRQ : IN STD_LOGIC;
nNMI : IN STD_LOGIC;
AVMA : OUT STD_LOGIC;
BUSY : OUT STD_LOGIC;
LIC : OUT STD_LOGIC;
nHALT : IN STD_LOGIC;
nRESET : IN STD_LOGIC;
nDMABREQ : IN STD_LOGIC;
RegData : OUT STD_LOGIC_VECTOR(111 DOWNTO 0)
);
END COMPONENT;
alias clk : std_logic is clkrst_i.clk(0);
alias reset : std_logic is clkrst_i.rst(0);
signal clk_E : std_logic;
signal clk_Q : std_logic;
signal cpu_addr : std_logic_vector(15 downto 0);
signal cpu_di : std_logic_vector( 7 downto 0);
signal cpu_do : std_logic_vector( 7 downto 0);
signal cpu_rw : std_logic;
signal cpu_irq : std_logic;
signal cpu_ba : std_logic;
signal cpu_bs : std_logic;
signal wram_cs : std_logic;
signal wram_we : std_logic;
signal wram_do : std_logic_vector( 7 downto 0);
signal rom_cs : std_logic;
signal snd_rd : std_logic;
signal clk_en_snd : std_logic; -- 1.5 MHz
signal ay1_cs : std_logic;
signal ay1_chan_a : std_logic_vector(7 downto 0);
signal ay1_chan_b : std_logic_vector(7 downto 0);
signal ay1_chan_c : std_logic_vector(7 downto 0);
signal ay1_do : std_logic_vector(7 downto 0);
signal ay1_port_b_do : std_logic_vector(7 downto 0);
signal ay2_cs : std_logic;
signal ay2_chan_a : std_logic_vector(7 downto 0);
signal ay2_chan_b : std_logic_vector(7 downto 0);
signal ay2_chan_c : std_logic_vector(7 downto 0);
signal ay2_do : std_logic_vector(7 downto 0);
signal vblank_r : std_logic;
begin
-- cs
snd_rd <= '1' when cpu_addr(15 downto 13) = "101" else '0'; -- a000
wram_cs <= '1' when cpu_addr(15 downto 13) = "000" else '0'; -- 0000-07ff RAM
rom_cs <= '1' when cpu_addr(15 downto 13) = "111" else '0'; -- e000-ffff ROM
ay1_cs <= '1' when cpu_addr(15 downto 13) = "001" else '0'; -- 2000
ay2_cs <= '1' when cpu_addr(15 downto 13) = "010" else '0'; -- 4000
-- write enables
wram_we <= '1' when cpu_rw = '0' and wram_cs = '1' else '0';
-- mux cpu in data between roms/io/wram
cpu_di <= wram_do when wram_cs = '1' else
sound_data when snd_rd = '1' else
ay1_do when ay1_cs = '1' else
ay2_do when ay2_cs = '1' else
snd_rom_do when rom_cs = '1' else X"FF";
process (clk)
variable count : unsigned(3 downto 0);
begin
if rising_edge(clk) then
count := count + 1;
if count(1 downto 0) = "11" then
case count(3 downto 2) is
when "00" => clk_E <= '0';
when "01" => clk_Q <= '1';
when "10" => clk_E <= '1';
when "11" => clk_Q <= '0';
end case;
end if;
clk_en_snd <= '0';
if count = "0000" then
clk_en_snd <= '1';
end if;
end if;
end process;
process (clk, reset)
begin
if reset = '1' then
cpu_irq <= '0';
elsif rising_edge(clk) then
vblank_r <= vblank;
if vblank_r = '0' and vblank = '1' then
cpu_irq <= '1';
elsif cpu_ba = '0' and cpu_bs = '1' then
cpu_irq <= '0';
end if;
end if;
end process;
cpu_inst : mc6809i
port map
(
D => cpu_di,
DOut => cpu_do,
ADDR => cpu_addr,
RnW => cpu_rw,
E => clk_E,
Q => clk_Q,
BS => cpu_bs,
BA => cpu_ba,
nIRQ => not cpu_irq,
nFIRQ => sound_irq,
nNMI => '1',
AVMA => open,
BUSY => open,
LIC => open,
nHALT => '1',
nRESET => not reset,
nDMABREQ => '1',
RegData => open
);
snd_rom_addr <= cpu_addr(12 downto 0);
cpu_ram : entity work.spram
generic map( widthad_a => 11)
port map(
clock => clk,
wren => wram_we,
address => cpu_addr(10 downto 0),
data => cpu_do,
q => wram_do
);
ay83910_inst1: YM2149
port map (
CLK => clk,
CE => clk_en_snd,
RESET => reset,
A8 => '1',
A9_L => not ay1_cs,
BDIR => not cpu_rw,
BC => not cpu_addr(0) or cpu_rw,
DI => cpu_do,
DO => ay1_do,
CHANNEL_A => ay1_chan_a,
CHANNEL_B => ay1_chan_b,
CHANNEL_C => ay1_chan_c,
SEL => '0',
MODE => '1',
ACTIVE => open,
IOA_in => (others => '0'),
IOA_out => open,
IOB_in => (others => '0'),
IOB_out => open
);
audio_out_l <= "0000000000" + ay1_chan_a + ay1_chan_b + ay1_chan_c;
ay83910_inst2: YM2149
port map (
CLK => clk,
CE => clk_en_snd,
RESET => reset,
A8 => '1',
A9_L => not ay2_cs,
BDIR => not cpu_rw,
BC => not cpu_addr(0) or cpu_rw,
DI => cpu_do,
DO => ay2_do,
CHANNEL_A => ay2_chan_a,
CHANNEL_B => ay2_chan_b,
CHANNEL_C => ay2_chan_c,
SEL => '0',
MODE => '1',
ACTIVE => open,
IOA_in => (others => '0'),
IOA_out => open,
IOB_in => (others => '0'),
IOB_out => open
);
audio_out_r <= "0000000000" + ay2_chan_a + ay2_chan_b + ay2_chan_c;
end SYN;

View File

@@ -0,0 +1,129 @@
library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.video_controller_pkg.all;
entity sonson_video_controller is
port
(
-- clocking etc
video_i : in from_VIDEO_t;
-- video input data
rgb_i : in RGB_t;
-- control signals (out)
video_ctl_o : out from_VIDEO_CTL_t;
-- video output control & data
video_o : out to_VIDEO_t
);
end sonson_video_controller;
architecture SYN of sonson_video_controller is
alias clk : std_logic is video_i.clk;
alias clk_ena : std_logic is video_i.clk_ena;
alias reset : std_logic is video_i.reset;
signal hcnt : unsigned(8 downto 0);
signal vcnt : unsigned(8 downto 0);
signal hsync : std_logic;
signal vsync : std_logic;
signal hblank : std_logic; -- hblank mux
signal hblank1 : std_logic; -- normal hblank
signal hblank2 : std_logic; -- shifted hblank for some games
signal vblank : std_logic;
begin
-------------------
-- Video scanner --
-------------------
-- Note: this is not what the hardware originally has.
-- hcnt [x180..x1FF-x000..x0FF] => 128+256 = 384 pixels, 384/6Mhz => 1 line is 64us (15.6KHz)
-- vcnt [x1FA..x1FF-x000..x0FF] => 6+256 = 262 lines, 1 frame is 262 x 64us = 16.76ms (59.6Hz)
process (reset, clk, clk_ena)
begin
if reset='1' then
hcnt <= (others=>'0');
vcnt <= '1'&X"FC";
elsif rising_edge(clk) and clk_ena = '1'then
hcnt <= hcnt + 1;
if hcnt = '0'&x"FF" then
hcnt <= '1'&x"80";
vcnt <= vcnt + 1;
if vcnt = '0'&x"FF" then
vcnt <= '1'&x"FA";
end if;
end if;
end if;
end process;
process (reset, clk, clk_ena)
begin
if reset = '1' then
hsync <= '0';
vsync <= '0';
hblank <= '1';
vblank <= '1';
elsif rising_edge(clk) and clk_ena = '1' then
-- display blank
if hcnt = '0'&x"0F" then
hblank <= '0';
if vcnt = '0'&x"00" then
vblank <= '0';
end if;
end if;
if hcnt = '0'&x"FF" then
hblank <= '1';
if vcnt = '0'&x"FF" then
vblank <= '1';
end if;
end if;
-- display sync
if hcnt = '1'&x"A8" then
hsync <= '1';
if vcnt = '1'&x"FC" then
vsync <= '1';
end if;
end if;
if hcnt = '1'&x"DF" then
hsync <= '0';
if vcnt = '1'&x"FE" then
vsync <= '0';
end if;
end if;
-- registered rgb output
if hblank = '1' or vblank = '1' then
video_o.rgb <= RGB_BLACK;
else
video_o.rgb <= rgb_i;
end if;
end if;
end process;
video_o.hsync <= hsync;
video_o.vsync <= vsync;
video_o.hblank <= hblank;
video_o.vblank <= vblank;
video_ctl_o.stb <= '1';
video_ctl_o.x <= "00"&std_logic_vector(hcnt);
video_ctl_o.y <= "00"&std_logic_vector(vcnt);
-- blank signal goes to tilemap/spritectl
video_ctl_o.hblank <= hblank;
video_ctl_o.vblank <= vblank;
-- pass-through for tile/bitmap & sprite controllers
video_ctl_o.clk <= clk;
video_ctl_o.clk_ena <= clk_ena;
-- for video DACs and TFT output
video_o.clk <= clk;
end SYN;

View File

@@ -73,12 +73,12 @@ begin
i := 0;
elsif rising_edge(clk) and clk_ena = '1' then
ld_r <= ld_r(ld_r'left-1 downto 0) & ld_r(ld_r'left);
row_a <= ctl_o(i).a;
if i = N_SPRITES-1 then
i := 0;
else
i := i + 1;
end if;
row_a <= ctl_o(i).a;
end if;
end process;

View File

@@ -47,10 +47,9 @@ architecture SYN of spritectl is
begin
-- handle xflip
flipData(47 downto 32) <= flip_row (ctl_i.d(47 downto 32), reg_i.xflip);
flipData(31 downto 16) <= flip_row (ctl_i.d(31 downto 16), reg_i.xflip);
flipData(15 downto 0) <= flip_row (ctl_i.d(15 downto 0), reg_i.xflip);
flipData(47 downto 32) <= ctl_i.d(47 downto 32);
flipData(31 downto 16) <= ctl_i.d(31 downto 16);
flipData(15 downto 0) <= ctl_i.d(15 downto 0);
process (clk)
@@ -61,10 +60,7 @@ begin
variable yMat : boolean; -- raster is between first and last line of sprite
variable xMat : boolean; -- raster in between left edge and end of line
-- the width of rowCount determines the scanline multipler
-- - eg. (4 downto 0) is 1:1
-- (5 downto 0) is 2:1 (scan-doubling)
variable rowCount : std_logic_vector(3+PACE_VIDEO_V_SCALE downto 0);
variable rowCount : std_logic_vector(4 downto 0);
variable clut_i : integer range 0 to 31;
variable clut_entry : sprite_clut_entry_t;
@@ -77,7 +73,7 @@ begin
if rising_edge(clk) then
if clk_ena = '1' then
x := unsigned(reg_i.x);
x := unsigned(reg_i.x) + 8;
y := unsigned(reg_i.y);
if video_ctl.hblank = '1' then
@@ -92,7 +88,7 @@ begin
-- start counting sprite row
rowCount := (others => '0');
yMat := true;
elsif rowCount(rowCount'left downto rowCount'left-4) = "10000" then
elsif rowCount(4 downto 0) = "10000" then
yMat := false;
end if;
@@ -103,21 +99,28 @@ begin
rowStore := (others => '0');
end if;
end if;
elsif video_ctl.stb = '1' then
if unsigned(video_ctl.x) = x then
-- count up at left edge of sprite
rowCount := std_logic_vector(unsigned(rowCount) + 1);
xMat := true;
end if;
if xMat then
-- shift in next pixel
pel := rowStore(32) & rowStore(16) & rowStore(0);
rowStore(47 downto 32) := '0' & rowStore(47 downto 33);
rowStore(31 downto 16) := '0' & rowStore(31 downto 17);
rowStore(15 downto 0) := '0' & rowStore(15 downto 1);
if reg_i.xflip = '1' then
pel := rowStore(47) & rowStore(31) & rowStore(15);
rowStore(47 downto 32) := rowStore(46 downto 32) & '0';
rowStore(31 downto 16) := rowStore(30 downto 16) & '0';
rowStore(15 downto 0) := rowStore(14 downto 0) & '0';
else
pel := rowStore(32) & rowStore(16) & rowStore(0);
rowStore(47 downto 32) := '0' & rowStore(47 downto 33);
rowStore(31 downto 16) := '0' & rowStore(31 downto 17);
rowStore(15 downto 0) := '0' & rowStore(15 downto 1);
end if;
end if;
end if;
@@ -149,11 +152,11 @@ begin
-- use dual-port memory to access both halves of each row
ctl_o.a(4) <= '0'; -- used for 1st/2nd port of dual-port memory
if reg_i.yflip = '1' then
ctl_o.a(3 downto 0) <= not rowCount(rowCount'left-1 downto rowCount'left-4);
ctl_o.a(3 downto 0) <= not rowCount(3 downto 0);
else
ctl_o.a(3 downto 0) <= rowCount(rowCount'left-1 downto rowCount'left-4);
ctl_o.a(3 downto 0) <= rowCount(3 downto 0);
end if;
end if; -- rising_edge(clk)
end process;

View File

@@ -26,7 +26,7 @@ architecture SYN of sptReg is
begin
process (clk)
process (clk, reg_i)
variable i : integer range 0 to 31;
begin
-- sprite registers $2020-$207F, 4 bytes per sprite

View File

@@ -0,0 +1,109 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
library work;
use work.pace_pkg.all;
use work.video_controller_pkg.all;
use work.platform_pkg.all;
entity target_top is
port(
clk_sys : in std_logic;
clk_vid_en : in std_logic;
reset_in : in std_logic;
snd_l : out std_logic_vector(9 downto 0);
snd_r : out std_logic_vector(9 downto 0);
vid_hs : out std_logic;
vid_vs : out std_logic;
vid_hb : out std_logic;
vid_vb : out std_logic;
vid_r : out std_logic_vector(3 downto 0);
vid_g : out std_logic_vector(3 downto 0);
vid_b : out std_logic_vector(3 downto 0);
inputs_p1 : in std_logic_vector(7 downto 0);
inputs_p2 : in std_logic_vector(7 downto 0);
inputs_sys : in std_logic_vector(7 downto 0);
inputs_dip1 : in std_logic_vector(7 downto 0);
inputs_dip2 : in std_logic_vector(7 downto 0);
cpu_rom_addr : out std_logic_vector(15 downto 0);
cpu_rom_do : in std_logic_vector(7 downto 0);
tile_rom_addr : out std_logic_vector(12 downto 0);
tile_rom_do : in std_logic_vector(15 downto 0);
snd_rom_addr : out std_logic_vector(12 downto 0);
snd_rom_do : in std_logic_vector(7 downto 0)
);
end target_top;
architecture SYN of target_top is
signal clkrst_i : from_CLKRST_t;
signal video_i : from_VIDEO_t;
signal video_o : to_VIDEO_t;
signal audio_i : from_AUDIO_t;
signal audio_o : to_AUDIO_t;
signal platform_i : from_PLATFORM_IO_t;
signal platform_o : to_PLATFORM_IO_t;
begin
clkrst_i.clk(0) <=clk_sys;
clkrst_i.clk(1) <= clk_sys;
clkrst_i.arst <= reset_in;
clkrst_i.arst_n <= not clkrst_i.arst;
video_i.clk <= clk_sys;
video_i.clk_ena <= clk_vid_en;
video_i.reset <= reset_in;
GEN_RESETS : for i in 0 to 3 generate
process (clkrst_i)
variable rst_r : std_logic_vector(2 downto 0) := (others => '0');
begin
if clkrst_i.arst = '1' then
rst_r := (others => '1');
elsif rising_edge(clkrst_i.clk(i)) then
rst_r := rst_r(rst_r'left-1 downto 0) & '0';
end if;
clkrst_i.rst(i) <= rst_r(rst_r'left);
end process;
end generate GEN_RESETS;
vid_r <= video_o.rgb.r(9 downto 6);
vid_g <= video_o.rgb.g(9 downto 6);
vid_b <= video_o.rgb.b(9 downto 6);
vid_hs <= video_o.hsync;
vid_vs <= video_o.vsync;
vid_hb <= video_o.hblank;
vid_vb <= video_o.vblank;
snd_l <= audio_o.ldata(9 downto 0);
snd_r <= audio_o.rdata(9 downto 0);
pace_inst : entity work.pace
port map(
clkrst_i => clkrst_i,
inputs_p1 => inputs_p1,
inputs_p2 => inputs_p2,
inputs_sys => inputs_sys,
inputs_dip1 => inputs_dip1,
inputs_dip2 => inputs_dip2,
video_i => video_i,
video_o => video_o,
audio_i => audio_i,
audio_o => audio_o,
platform_i => platform_i,
platform_o => platform_o,
cpu_rom_addr => cpu_rom_addr,
cpu_rom_do => cpu_rom_do,
tile_rom_addr => tile_rom_addr,
tile_rom_do => tile_rom_do,
snd_rom_addr => snd_rom_addr,
snd_rom_do => snd_rom_do
);
end SYN;

View File

@@ -55,34 +55,35 @@ begin
if rising_edge(clk) then
if clk_ena = '1' then
-- video is clipped left and right (only 224 wide)
-- don't scroll the fist 5 lines
if unsigned(y) < 40 then
x_adj := unsigned(x);
else
x_adj := unsigned(x) + unsigned(scroll);
end if;
-- 1st stage of pipeline
-- - read tile from tilemap
-- - read attribute data
if stb = '1' then
ctl_o.map_a(4 downto 0) <= std_logic_vector(x_adj(7 downto 3));
ctl_o.attr_a(4 downto 0) <= std_logic_vector(x_adj(7 downto 3));
if x_adj(2 downto 0) = "000" then
ctl_o.map_a(4 downto 0) <= std_logic_vector(x_adj(7 downto 3));
ctl_o.attr_a(4 downto 0) <= std_logic_vector(x_adj(7 downto 3));
end if;
end if;
-- 2nd stage of pipeline
-- - read tile data from tile ROM
if stb = '1' then
if x_adj(2 downto 0) = "001" then
attr_d_r := ctl_i.attr_d(attr_d_r'range);
--map_d_r := ctl_i.map_d(map_d_r'range);
if x_adj(2 downto 0) = "010" then
ctl_o.tile_a(12 downto 11) <= ctl_i.attr_d(1 downto 0);
ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0);
end if;
end if;
ctl_o.tile_a(12 downto 11) <= attr_d_r(1 downto 0);
ctl_o.tile_a(10 downto 3) <= ctl_i.map_d(7 downto 0);
if stb = '1' then
if x_adj(2 downto 0) = "010" then
if x_adj(2 downto 0) = "111" then
attr_d_r := ctl_i.attr_d(attr_d_r'range);
tile_d_r := ctl_i.tile_d(tile_d_r'range);
else
tile_d_r(15 downto 8) := tile_d_r(14 downto 8) & '0';

File diff suppressed because it is too large Load Diff

View File

@@ -1,109 +0,0 @@
# Cycle Accurate MC6809 Core
## Details
This is a Verilog implementation of the Motorola MC6809 and MC6809E microprocessors from late 1970s. It is intentionally implemented in a manner to make it as similar as possible to the original microprocessors.
When this was implemented, other 6809 cores already had been written. These other cores were in use and had been verified. Although I've never used any of these cores, I'm confident that they're excellent replications of the instruction set. However, none (as far as I know) was verified to be cycle-accurate. Encouragement from several sources (particularly one very generous source) convinced me to invest the time.
Beyond merely cycle-accurate, the goal was to attempt to preserve as much of the actual bus signals and protocols as possible. Signals such as DMABREQ, TSC, MRDY, and LIC, while infrequently used were still implemented. Bus traffic was identified with a Logic Analyzer and matched to the 6809's specs (and, truthfully, when the specs were vague, details captured from hard MC6809/MC6809E part behavior). The particulars in the Motorola specifications were replicated.
The goal was cycle accuracy and that dictated much of the design. This was never intended to be a supercharged superset of a MC6809. If you're looking to mega-power your existing system, this might not be the best choice. (Read the section on What This Is Not for explanation.)
## Purpose, License
I invested the time in the desire that *people use it*. I haven't given away hardware designs or software since the 1980s. However, this seems like a worthwhile exception.
While the source is completely available, this is *not* an "open-source *group* project". You may modify it as you see fit. If you find errors, notifying me would be appreciated. Still, this is **not** a group project. I don't intend that to come off as rude quite so much as frank. I may choose to modify the core in the future; many "open-source group projects" seem to me to become interesting social studies in design-by-commitee, and how much time is required just to manage multiple people with multiple inclinations becomes significant. I confess that this scenario is not something that appeals to me. [Outside of a day job, I prefer to work with a very small and fairly private group.] If you're enthusiastic or appreciative, use the core in a design and I'll be thrilled - tell me about it, and I'll explain to you how thrilled I am.
Refer to the [licensing](./documentation/LICENSE.md) requirements if you choose to leverage this work.
This isn't an attempt to deal with part scarcity. Any variant of 6809 is still quite easy to obtain (at darned cheap prices, too). In truth, *far cheaper* than an FPGA.
The actual target are people who are reimplementing retro-devices (Arcade games, Computers) that have incorporated entire designs into an FPGA, but require cycle accuracy. The core's required space on an FPGA isn't overwhelming once you hit a certain range of parts and integration. (If you're looking at CPLDs, you might want to scale up a bit.)
## Implementation
The core was implemented using Motorola's original documentation. Particularly, **Figure 18** in the MC6809 and MC6809E datasheets. There is a very close mapping between those five pages of diagrams and the bus and cycle activity of the CPU.
I have noticed that some repositories of HDL tend to be only slightly more organized than *people tossing HDL files "over the wall"*. Explanations of how they work, how you as a consumer of the HDL should deal with it, etc. tend to be lacking or totally non-existent.
I do have an interest (outside of this project) in HDL education; not quite in tutorials, but in implementations of HDMI, USB, SATA, etc. and explaining clearly how an implementation works - along with the hardware standard at the same time.
Please - if you're not experienced in an HDL already, this cpu core isn't likely very useful to you as a learning mechanism. There are wonderful tutorials out there already; I highly recommend learning, experimenting, and so forth *first*, before attempting to absorb this design.
## Validation
The design was validated in multiple fashions, including against a Vectrex from 1982, a TRS-80 Color Computer 3, A slew of Williams Arcade games, and another wave of Taito Arcade games.
Literal bus compatibility was achieved using a [GODIL-40](http://www.oho-elektronik.de/) against the above scenarios. I can't say enough nice things about the [GODIL](http://www.oho-elektronik.de/) design. Slick, compact. It's darned nice work. The only bad thing is that they're in short supply. (Oh, and they're 10x-20x the price of a hard CPU. I wouldn't recommend replacing your daily-use CPUs with a soft CPU in a GODIL unless you have a strong reason for doing so.)
Functional testing was against the list of platforms above. They all work.
Actual instruction cycle testing was done with the frequent help of Erik Gavriluk, who donated his time, consideration, and even hardware to the project. In this case, MAME sports a cycle-accurate 6809 emulator; Erik generated code that ran (nearly) every instruction in every addressing mode, and then ran that through MAME and kept an absolute cycle count. I captured the soft core's bus on a GODIL running the exact same code and matched the cycle counts. To improve things, Erik provided me with the register contents after every instruction. I wrote a testbench to run the same code and validated that the registers changed after each instruction identically in each scenario and in the exact same number of cycles. The result was gratifying. (Ahem, once it worked. Believe me, the CoCo, the cycle testing, the GODIL - they *all* pointed me at problems. I won't claim that the design is flawless - nothing I've ever written truly is - but effort *has* been made to actually verify the thing, and I'll list each of the platforms and experiences. [I'll even grumpily point out that Stargate has illegal instructions in it that they're darned lucky the 6809 happened to walk over.]
Precise control signal testing (Interrupts, /HALT) were primarily done on JROK's Williams board. The Williams arcade games had a blitter, and it used /HALT to gain the bus and take action. JROK had done some extensive timing validation to prove that his implementation of the Williams design was **accurate**. I contacted him and being as he's an incredibly nice person, he gave me some advice and access to his source + prebuilt binaries. I was quite thankful - I found bus timing errors (related to /HALT and related to /IRQ latency) in the same vein (how many cycles before the next-new-instruction does each have to be asserted in order to be serviced at the beginning of the next instruction?) as a result. A very worthwhile endeavor, as I'd been convinced that I was correct; however, his code led me to swap hard CPUs with my soft core on analyzer captures and to realize that despite my intention to match the documentation perfectly there were cases where the documentation left details unclear, requiring comparison between a hard CPU and my existing timing.
## What This Is Not
This isn't an attempt to deal with parts scarcity, nor prepare for it. I can't imagine that 6809s will become *hard to get* in the next decade or so. There isn't a ton of volume required and there are lots of warehouses from companies that make their entire businesses on out-of-production parts.
This isn't an attempt to make a faster MC6809. The implementation would have been different had that been a goal. It has extensive 'dead' cycles on the bus to fit MC6809 specifications. If I conditionally remove them, it would be significantly more efficient than a real MC6809 (but once again, not cycle-accurate).
This core does not include HD6309 instructions. I did check, and without the 'dead' cycles mentioned above (the things that make it cycle-accurate), every instruction is at least as efficient as the HD6309, and most are more efficient. (I do have advantages of 40 years of technology over the original MC6809 design team, and at least 30 years over the HD6309 design team.) New registers and instructions from the HD6309 aren't there. Once again, that wasn't the goal. [I may still enable a dynamic mechanism to switch between cycle-accurate and minimum-cycles-required as an instantiation parameter.]
If your goal really is "a super 6809", I have [strong opinions](./documentation/super6809.md) on the topic.
## Perfection?
While I'd love to say that this is a perfect replica, logic-level details of the implementation of the CPU aren't available. The Motorola documentation is *excellent*, but still not complete.
I know of inconsistencies - but inconsistencies that I expect are trivial. Anything deemed as serious has been dealt with as soon as I've been made aware of it.
The instructions have been heavily validated, and I'm confident in their accuracy - but not quite so arrogant as to insist that there could not be an oversight. (I'm not a young man any longer; I've been wrong too many times to be as remotely as confident as I was when I was 16.)
Should issues be discovered, expect transparency and fixes - even if it's an incredibly rare edge case. [If you're actively using `/DMABREQ`, please contact me. You're the first.]
## How does it work?
This isn't quite the same question as the next, but if you really want to dig in and grasp the implementation, I've written a summary of the design [here](./documentation/CoreDesign.md).
## How Do I Use It?
### Samples
Application of the core in a GODIL is provided. With this, you can - although for what reason, I'm not sure - plug-replace a MC6809 or MC6809E in nearly any design (*note the oscillator in the Vectrex instead of the crystal*). This is intended to demonstrate compatibility.
A sample implementation is provided against a cheap Xilinx Spartan 6 LX9 board from eBay (China), a cheap Altera Cyclone IV EP4CE6 board (also from eBay, China), and two Cyclone V boards from terasic. These aren't attempting to run at original speeds, so I set them to 25Mhz for no reason other than "I can". These are intended to demonstrate use of the core entirely internal to an FPGA.
### General Guidelines
A list of general guidelines is provided. They are likely worth reading if you consider using this core.
## Documentation
1. [Explanation of the CPU Core design.](./documentation/CoreDesign.md)
2. [Validation Efforts.](./documentation/Validation.md)
3. [Implementation Examples](./documentation/samples.md).
## Who Am I?
Despite a certain degree of desire to remain anonymous, that seems pointless in today's world.
My name is Greg Miller; I learned assembly in 1981 on a 6809 in a TRS-80 Color Computer, leaving me *fond* of this CPU architecture.
Not surprisingly, I work in the tech industry (although quite definitely not implementing legacy hardware in FPGAs), do not represent my employer in any capacity whatsoever here, and have a family and a mortgage.
You can contact me via:
gregmiller6809@gmail.com
## Final Thoughts
I'll keep track of my [Final Thoughts](./documentation/FinalThoughts.md) on the project.
## Acknowledgements
[I do want to thank a few people](documentation/Acknowledgements.md).

View File

@@ -1,80 +0,0 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 08:11:34 09/23/2016
// Design Name:
// Module Name: mc6809e
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mc6809(
input [7:0] D,
output [7:0] DOut,
output [15:0] ADDR,
output RnW,
output E,
output Q,
output BS,
output BA,
input nIRQ,
input nFIRQ,
input nNMI,
input EXTAL,
input XTAL,
input nHALT,
input nRESET,
input MRDY,
input nDMABREQ
, output [111:0] RegData
);
reg [1:0] clk_phase=2'b00;
wire CLK;
assign CLK=EXTAL;
wire LIC;
wire BUSY;
wire AVMA;
reg rE;
reg rQ;
assign E = rE;
assign Q = rQ;
mc6809i cpucore(.D(D), .DOut(DOut), .ADDR(ADDR), .RnW(RnW), .E(E), .Q(Q), .BS(BS), .BA(BA), .nIRQ(nIRQ), .nFIRQ(nFIRQ),
.nNMI(nNMI), .AVMA(AVMA), .BUSY(BUSY), .LIC(LIC), .nHALT(nHALT), .nRESET(nRESET), .nDMABREQ(nDMABREQ)
,.RegData(RegData)
);
always @(negedge CLK)
begin
case (clk_phase)
2'b00:
rE <= 0;
2'b01:
rQ <= 1;
2'b10:
rE <= 1;
2'b11:
rQ <= 0;
endcase
if (MRDY == 1'b1)
clk_phase <= clk_phase + 2'b01;
end
endmodule

View File

@@ -1,48 +0,0 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 08:11:34 09/23/2016
// Design Name:
// Module Name: mc6809e
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mc6809e(
input [7:0] D,
output [7:0] DOut,
output [15:0] ADDR,
output RnW,
input E,
input Q,
output BS,
output BA,
input nIRQ,
input nFIRQ,
input nNMI,
output AVMA,
output BUSY,
output LIC,
input nHALT,
input nRESET
);
mc6809i cpucore (.D(D), .DOut(DOut), .ADDR(ADDR), .RnW(RnW), .E(E), .Q(Q), .BS(BS), .BA(BA), .nIRQ(nIRQ), .nFIRQ(nFIRQ),
.nNMI(nNMI), .AVMA(AVMA), .BUSY(BUSY), .LIC(LIC), .nHALT(nHALT), .nRESET(nRESET), .nDMABREQ(1)
);
endmodule

View File

@@ -1,82 +0,0 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 09/18/2016 09:25:01 PM
// Design Name:
// Module Name: 6809 Superset module of MC6809 and MC6809E signals
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mc6809s(
input [7:0] D,
output [7:0] DOut,
output [15:0] ADDR,
output RnW,
input CLK4,
output BS,
output BA,
input nIRQ,
input nFIRQ,
input nNMI,
output AVMA,
output BUSY,
output LIC,
input nRESET,
input nHALT,
input nDMABREQ,
output E,
output Q,
output reg [1:0] clk4_cnt,
output [111:0] RegData
);
reg rE;
reg rQ;
assign E = rE;
assign Q = rQ;
reg nCoreRESET;
mc6809i corecpu(.D(D), .DOut(DOut), .ADDR(ADDR), .RnW(RnW), .E(rE), .Q(rQ), .BS(BS), .BA(BA), .nIRQ(nIRQ), .nFIRQ(nFIRQ), .nNMI(nNMI), .AVMA(AVMA), .BUSY(BUSY), .LIC(LIC), .nRESET(nCoreRESET),
.nDMABREQ(nDMABREQ), .nHALT(nHALT), .RegData(RegData) );
always @(posedge CLK4)
begin
clk4_cnt <= clk4_cnt+2'b01;
if (nRESET == 0)
begin
clk4_cnt <= 0;
nCoreRESET <= 0;
end
if ( clk4_cnt == 2'b00 ) // RISING EDGE OF E
rE <= 1;
if (clk4_cnt == 2'b01) // RISING EDGE OF Q
rQ <= 1;
if (clk4_cnt == 2'b10) // FALLING EDGE OF E
rE <= 0;
if (clk4_cnt == 2'b11) // FALLING EDGE OF Q
begin
rQ <= 0;
nCoreRESET <= 1;
end
end
endmodule

View File

@@ -1,567 +0,0 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.pace_pkg.all;
use work.video_controller_pkg.all;
use work.sprite_pkg.all;
use work.platform_pkg.all;
entity platform is
port
(
-- clocking and reset
clkrst_i : in from_CLKRST_t;
vma : out std_logic;
-- controller inputs
inputs_p1 : in std_logic_vector(7 downto 0);
inputs_p2 : in std_logic_vector(7 downto 0);
inputs_sys : in std_logic_vector(7 downto 0);
inputs_dip1 : in std_logic_vector(7 downto 0);
inputs_dip2 : in std_logic_vector(7 downto 0);
bitmap_i : in from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS);
bitmap_o : out to_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS);
tilemap_i : in from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS);
tilemap_o : out to_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS);
sprite_reg_o : out to_SPRITE_REG_t;
sprite_i : in from_SPRITE_CTL_t;
sprite_o : out to_SPRITE_CTL_t;
spr0_hit : in std_logic;
-- various graphics information
graphics_i : in from_GRAPHICS_t;
graphics_o : out to_GRAPHICS_t;
snd_i : in from_SOUND_t;
snd_o : out to_SOUND_t;
platform_i : in from_PLATFORM_IO_t;
platform_o : out to_PLATFORM_IO_t;
cpu_rom_addr : out std_logic_vector(15 downto 0);
cpu_rom_do : in std_logic_vector(7 downto 0);
tile_rom_addr : out std_logic_vector(12 downto 0);
tile_rom_do : in std_logic_vector(15 downto 0)
);
end platform;
architecture SYN of platform is
alias clk_20M : std_logic is clkrst_i.clk(0);
alias rst_20M : std_logic is clkrst_i.rst(0);
alias clk_video : std_logic is clkrst_i.clk(1);
signal cpu_reset : std_logic;
-- uP signals
signal clk_2M_en : std_logic;
signal cpu_clk_en : std_logic;
signal cpu_r_wn : std_logic;
signal cpu_a : std_logic_vector(15 downto 0);
signal cpu_d_i : std_logic_vector(7 downto 0);
signal cpu_d_o : std_logic_vector(7 downto 0);
signal cpu_irq : std_logic;
-- ROM signals
signal rom_cs : std_logic;
-- RAM signals
signal wram_cs : std_logic;
signal wram_wr : std_logic;
signal wram_d_o : std_logic_vector(7 downto 0);
signal vram_cs : std_logic;
signal vram_d_o : std_logic_vector(7 downto 0);
signal vram_wr : std_logic;
signal cram_cs : std_logic;
signal cram_d_o : std_logic_vector(7 downto 0);
signal cram_wr : std_logic;
signal sprite_cs : std_logic;
-- I/O signals
signal scroll_cs : std_logic;
signal in0_cs : std_logic;
signal in1_cs : std_logic;
signal in2_cs : std_logic;
signal dsw1_cs : std_logic;
signal dsw2_cs : std_logic;
signal rom4_d_o : std_logic_vector(7 downto 0);
signal rom8_d_o : std_logic_vector(7 downto 0);
signal romC_d_o : std_logic_vector(7 downto 0);
signal rom_d_o : std_logic_vector(7 downto 0);
signal cpu_rn_w : std_logic;
COMPONENT mc6809i
GENERIC ( ILLEGAL_INSTRUCTIONS : STRING := "GHOST" );
PORT
(
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOut : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
ADDR : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
RnW : OUT STD_LOGIC;
E : IN STD_LOGIC;
Q : IN STD_LOGIC;
BS : OUT STD_LOGIC;
BA : OUT STD_LOGIC;
nIRQ : IN STD_LOGIC;
nFIRQ : IN STD_LOGIC;
nNMI : IN STD_LOGIC;
AVMA : OUT STD_LOGIC;
BUSY : OUT STD_LOGIC;
LIC : OUT STD_LOGIC;
nHALT : IN STD_LOGIC;
nRESET : IN STD_LOGIC;
nDMABREQ : IN STD_LOGIC;
RegData : OUT STD_LOGIC_VECTOR(111 DOWNTO 0)
);
END COMPONENT;
begin
wram_cs <= '1' when STD_MATCH(cpu_a, "0000------------") else '0';-- RAM $0000-$0FFF
vram_cs <= '1' when STD_MATCH(cpu_a, "000100----------") else '0';-- video ram $1000-$13FF
cram_cs <= '1' when STD_MATCH(cpu_a, "000101----------") else '0';-- colour ram $1400-$17FF
sprite_cs <= '1' when STD_MATCH(cpu_a, X"20"&"001-----") else
'1' when STD_MATCH(cpu_a, X"20"&"01------") else
'0';-- sprite 'ram' $2020-$207F
-- I/O
scroll_cs <= '1' when STD_MATCH(cpu_a, X"3000") else '0';
in0_cs <= '1' when STD_MATCH(cpu_a, X"3002") else '0';
in1_cs <= '1' when STD_MATCH(cpu_a, X"3003") else '0';
in2_cs <= '1' when STD_MATCH(cpu_a, X"3004") else '0';
dsw1_cs <= '1' when STD_MATCH(cpu_a, X"3005") else '0';
dsw2_cs <= '1' when STD_MATCH(cpu_a, X"3006") else '0';
rom_cs <= '1' when (cpu_a > X"3FFF") else '0';
-- memory block write enables
wram_wr <= wram_cs and clk_2M_en and not cpu_r_wn;
vram_wr <= vram_cs and clk_2M_en and not cpu_r_wn;
cram_wr <= cram_cs and clk_2M_en and not cpu_r_wn;
-- memory read mux
cpu_d_i <= wram_d_o when wram_cs = '1' else
vram_d_o when vram_cs = '1' else
cram_d_o when cram_cs = '1' else
inputs_p1 when in0_cs = '1' else
inputs_p2 when in1_cs = '1' else
inputs_sys when in2_cs = '1' else
inputs_dip1 when dsw1_cs = '1' else
inputs_dip2 when dsw2_cs = '1' else
-- flip off, service off, coin A, 1C1C
-- (X"80" or X"40" or X"10" or X"0F") when dsw1_cs = '1' else
-- freeze off, easy, 20K/80K/100K, 3 lives
-- (X"80" or X"60" or X"08" or X"03") when dsw2_cs = '1' else
rom_d_o when rom_cs = '1' else
-- cpu_rom_do when rom_cs = '1' else
(others => 'Z');
-- system timing
process (clk_20M, rst_20M)
variable count : integer range 0 to 10-1;
begin
if rst_20M = '1' then
count := 0;
elsif rising_edge(clk_20M) then
clk_2M_en <= '0'; -- default
case count is
when 0 =>
clk_2M_en <= '1';
when others =>
null;
end case;
if count = count'high then
count := 0;
else
count := count + 1;
end if;
end if;
end process;
-- cpu09 core uses negative clock edge
--cpu_clk_en <= not (clk_2M_en and not platform_pause);
cpu_clk_en <= clk_2M_en;
-- add game reset later
cpu_reset <= rst_20M;
-- cpu_inst : entity work.cpu09
-- generic map
-- (
-- CLK_POL => '1'
-- )
-- port map
-- (
-- clk => clk_20M,
-- clk_en => cpu_clk_en,
-- rst => cpu_reset,
-- rw => cpu_r_wn,
-- vma => vma,
--ba => open,
--bs => open,
-- addr => cpu_a,
-- data_in => cpu_d_i,
-- data_out => cpu_d_o,
-- halt => '0',
-- hold => '0',
-- irq => cpu_irq,
-- firq => '0',
--- nmi => '0'
-- );
--changed for test
cpu_inst : mc6809i
port map
(
D => cpu_d_i,
DOut => cpu_d_o,
ADDR => cpu_a,
RnW => cpu_r_wn,
E => cpu_clk_en,
Q => clk_20M,
BS => open,
BA => open,
nIRQ => not cpu_irq,
nFIRQ => '1',
nNMI => '1',
AVMA => open,
BUSY => open,
LIC => open,
nHALT => '1',
nRESET => not cpu_reset,
nDMABREQ => '1',
RegData => open
);
--WRAm_cs
wram_inst : entity work.spram
generic map
(
widthad_a => 12,
width_a => 8
)
port map
(
address => cpu_a(11 downto 0),
clock => clk_20M,
data => cpu_d_o,
wren => wram_wr,
q => wram_d_o
);
-- irq vblank interrupt
process (clk_20M, rst_20M)
variable vblank_r : std_logic_vector(3 downto 0);
alias vblank_prev : std_logic is vblank_r(vblank_r'left);
alias vblank_um : std_logic is vblank_r(vblank_r'left-1);
begin
if rst_20M = '1' then
vblank_r := (others => '0');
cpu_irq <= '0';
elsif rising_edge(clk_20M) then
if vblank_um = '1' and vblank_prev = '0' then
cpu_irq <= '1';
elsif vblank_um = '0' then
cpu_irq <= '0';
end if;
-- numeta the vblank
vblank_r := vblank_r(vblank_r'left-1 downto 0) & graphics_i.vblank;
end if;
end process;
-- scroll register
process (clk_20M, rst_20M)
begin
if rst_20M = '1' then
graphics_o.bit8(0) <= (others => '0');
elsif rising_edge(clk_20M) then
if scroll_cs and clk_2M_en and not cpu_r_wn then
graphics_o.bit8(0) <= cpu_d_o;
end if;
end if;
end process;
rom_4000_inst : entity work.sprom
generic map
(
init_file => "./roms/ss_01e.hex",
widthad_a => 14
)
port map
(
clock => clk_20M,
address => cpu_a(13 downto 0),
q => rom4_d_o
);
rom_8000_inst : entity work.sprom
generic map
(
init_file => "./roms/ss_02e.hex",
widthad_a => 14
)
port map
(
clock => clk_20M,
address => cpu_a(13 downto 0),
q => rom8_d_o
);
rom_C000_inst : entity work.sprom
generic map
(
init_file => "./roms/ss_03e.hex",
widthad_a => 14
)
port map
(
clock => clk_20M,
address => cpu_a(13 downto 0),
q => romC_d_o
);
rom_d_o <= rom4_d_o when STD_MATCH(cpu_a, "01--------------") else
rom8_d_o when STD_MATCH(cpu_a, "10--------------") else
romC_d_o;
--cpu_rom_addr <= cpu_a(15 downto 0);
--rom_d_o <= cpu_rom_do;
-- wren_a *MUST* be GND for CYCLONEII_SAFE_WRITE=VERIFIED_SAFE
vram_inst : entity work.dpram
generic map
(
init_file => "./roms/vram.hex",
widthad_a => 10
)
port map
(
clock_b => clk_20M,
address_b => cpu_a(9 downto 0),
wren_b => vram_wr,
data_b => cpu_d_o,
q_b => vram_d_o,
clock_a => clk_video,
address_a => tilemap_i(1).map_a(9 downto 0),
wren_a => '0',
data_a => (others => 'X'),
q_a => tilemap_o(1).map_d(7 downto 0)
);
tilemap_o(1).map_d(tilemap_o(1).map_d'left downto 8) <= (others => 'Z');
-- wren_a *MUST* be GND for CYCLONEII_SAFE_WRITE=VERIFIED_SAFE
cram_inst : entity work.dpram
generic map
(
init_file => "./roms/cram.hex",
widthad_a => 10
)
port map
(
clock_b => clk_20M,
address_b => cpu_a(9 downto 0),
wren_b => cram_wr,
data_b => cpu_d_o,
q_b => cram_d_o,
clock_a => clk_video,
address_a => tilemap_i(1).attr_a(9 downto 0),
wren_a => '0',
data_a => (others => 'X'),
q_a => tilemap_o(1).attr_d(7 downto 0)
);
tilemap_o(1).attr_d(tilemap_o(1).attr_d'left downto 8) <= (others => 'Z');
--tile rom (bit 0)
ss_7_b6_inst : entity work.sprom
generic map
(
init_file => "./roms/ss_7_b6.hex",
widthad_a => 13
)
port map
(
clock => clk_video,
address => tilemap_i(1).tile_a(12 downto 0),
q => tilemap_o(1).tile_d(7 downto 0)
);
-- tile rom (bit 1)---will not fit in FPGA Block Ram
-- ss_8_b5_inst : entity work.sprom
-- generic map
-- (
--- init_file => "./roms/ss_8_b5.hex",
-- widthad_a => 13
-- )
-- port map
-- (
-- clock => clk_video,
-- address => tilemap_i(1).tile_a(12 downto 0),
-- q => tilemap_o(1).tile_d(15 downto 8)
-- );
--tile_rom_addr <= tilemap_i(1).tile_a(12 downto 0);
--tilemap_o(1).tile_d(15 downto 0) <= tile_rom_do;
BLK_SPRITES : block---will not fit in FPGA Block Ram
signal bit0_1 : std_logic_vector(7 downto 0); -- offset 0
signal bit0_2 : std_logic_vector(7 downto 0); -- offset 0
signal bit0_3 : std_logic_vector(7 downto 0); -- offset 16
signal bit0_4 : std_logic_vector(7 downto 0); -- offset 16
signal bit1_1 : std_logic_vector(7 downto 0);
signal bit1_2 : std_logic_vector(7 downto 0);
signal bit1_3 : std_logic_vector(7 downto 0);
signal bit1_4 : std_logic_vector(7 downto 0);
signal bit2_1 : std_logic_vector(7 downto 0);
signal bit2_2 : std_logic_vector(7 downto 0);
signal bit2_3 : std_logic_vector(7 downto 0);
signal bit2_4 : std_logic_vector(7 downto 0);
signal sprite_a_00 : std_logic_vector(12 downto 0);
signal sprite_a_16 : std_logic_vector(12 downto 0);
begin
-- registers
sprite_reg_o.clk <= clk_20M;
sprite_reg_o.clk_ena <= clk_2M_en;
sprite_reg_o.a <= cpu_a(sprite_reg_o.a'range);
sprite_reg_o.d <= cpu_d_o;
sprite_reg_o.wr <= sprite_cs and clk_2M_en and not cpu_r_wn;
-- - sprite data consists of:
-- 16 consecutive bytes for the 1st half
-- then the next 16 bytes for the 2nd half
-- - because we need to fetch an entire row at once
-- use dual-port memory to access both halves of each row
-- generate address for each port
-- sprite_a_00 <= sprite_i.a(12 downto 5) & '0' & sprite_i.a(3 downto 0);
-- sprite_a_16 <= sprite_i.a(12 downto 5) & '1' & sprite_i.a(3 downto 0);
-- sprite rom (bit 0, part 1/2)
-- ss_9_m5_inst : entity work.dprom_2r
-- generic map
-- (
-- init_file => "./roms/ss_9_m5.hex",
-- widthad_a => 13,
-- widthad_b => 13
-- )
-- port map
-- (
-- clock => clk_video,
-- address_a => sprite_a_00,
-- q_a => bit0_1,
-- address_b => sprite_a_16,
-- q_b => bit0_3
-- );
-- sprite rom (bit 0, part 2/2)
-- ss_10_m6_inst : entity work.dprom_2r
-- generic map
-- (
-- init_file => "./roms/ss_10_m6.hex",
-- widthad_a => 13,
-- widthad_b => 13
-- )
-- port map
-- (
-- clock => clk_video,
-- address_a => sprite_a_00,
--- q_a => bit0_2,
-- address_b => sprite_a_16,
-- q_b => bit0_4
-- );
-- sprite_o.d(15 downto 0) <= (bit0_1 & bit0_3) when sprite_i.a(13) = '0' else
-- (bit0_2 & bit0_4);
-- sprite rom (bit 1, part 1/2)
-- ss_11_m3_inst : entity work.dprom_2r
-- generic map
-- (
-- init_file => "./roms/ss_11_m3.hex",
-- widthad_a => 13,
-- widthad_b => 13
-- )
-- port map
-- (
-- clock => clk_video,
-- address_a => sprite_a_00,
-- q_a => bit1_1,
-- address_b => sprite_a_16,
-- q_b => bit1_3
-- );
-- sprite rom (bit 0, part 2/2)
-- ss_12_m4_inst : entity work.dprom_2r
-- generic map
-- (
-- init_file => "./roms/ss_12_m4.hex",
-- widthad_a => 13,
-- widthad_b => 13
-- )
-- port map
-- (
-- clock => clk_video,
-- address_a => sprite_a_00,
-- q_a => bit1_2,
-- address_b => sprite_a_16,
--- q_b => bit1_4
--- );
-- sprite_o.d(31 downto 16) <= (bit1_1 & bit1_3) when sprite_i.a(13) = '0' else
-- (bit1_2 & bit1_4);
-- sprite rom (bit 2, part 1/2)
-- ss_13_m1_inst : entity work.dprom_2r
-- generic map
-- (
-- init_file => "./roms/ss_13_m1.hex",
-- widthad_a => 13,
-- widthad_b => 13
-- )
-- port map
-- (
-- clock => clk_video,
-- address_a => sprite_a_00,
-- q_a => bit2_1,
-- address_b => sprite_a_16,
-- q_b => bit2_3
-- );
-- sprite rom (bit 2, part 2/2)
-- ss_14_m2_inst : entity work.dprom_2r
-- generic map
-- (
-- init_file => "./roms/ss_14_m2.hex",
-- widthad_a => 13,
-- widthad_b => 13
-- )
-- port map
-- (
-- clock => clk_video,
-- address_a => sprite_a_00,
-- q_a => bit2_2,
-- address_b => sprite_a_16,
-- q_b => bit2_4
-- );
-- sprite_o.d(47 downto 32) <= (bit2_1 & bit2_3) when sprite_i.a(13) = '0' else
-- (bit2_2 & bit2_4);
end block BLK_SPRITES;
-- unused outputs
graphics_o.bit16(0) <= (others => '0');
end SYN;

View File

@@ -1,4 +0,0 @@
set_global_assignment -name IP_TOOL_NAME "ALTPLL"
set_global_assignment -name IP_TOOL_VERSION "13.1"
set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll_mist.vhd"]
set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_mist.ppf"]

View File

@@ -1,429 +0,0 @@
-- megafunction wizard: %ALTPLL%
-- GENERATION: STANDARD
-- VERSION: WM1.0
-- MODULE: altpll
-- ============================================================
-- File Name: pll_mist.vhd
-- Megafunction Name(s):
-- altpll
--
-- Simulation Library Files(s):
-- altera_mf
-- ============================================================
-- ************************************************************
-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
--
-- 13.1.0 Build 162 10/23/2013 SJ Web Edition
-- ************************************************************
--Copyright (C) 1991-2013 Altera Corporation
--Your use of Altera Corporation's design tools, logic functions
--and other software and tools, and its AMPP partner logic
--functions, and any output files from any of the foregoing
--(including device programming or simulation files), and any
--associated documentation or information are expressly subject
--to the terms and conditions of the Altera Program License
--Subscription Agreement, Altera MegaCore Function License
--Agreement, or other applicable license agreement, including,
--without limitation, that your use is for the sole purpose of
--programming logic devices manufactured by Altera and sold by
--Altera or its authorized distributors. Please refer to the
--applicable agreement for further details.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY pll_mist IS
PORT
(
areset : IN STD_LOGIC := '0';
inclk0 : IN STD_LOGIC := '0';
c0 : OUT STD_LOGIC ;
c1 : OUT STD_LOGIC ;
c2 : OUT STD_LOGIC ;
locked : OUT STD_LOGIC
);
END pll_mist;
ARCHITECTURE SYN OF pll_mist 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 ;
SIGNAL sub_wire5 : STD_LOGIC ;
SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0);
SIGNAL sub_wire7 : 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;
clk2_divide_by : NATURAL;
clk2_duty_cycle : NATURAL;
clk2_multiply_by : NATURAL;
clk2_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;
self_reset_on_loss_lock : STRING;
width_clock : NATURAL
);
PORT (
areset : IN STD_LOGIC ;
clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0);
inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0);
locked : OUT STD_LOGIC
);
END COMPONENT;
BEGIN
sub_wire7_bv(0 DOWNTO 0) <= "0";
sub_wire7 <= To_stdlogicvector(sub_wire7_bv);
sub_wire4 <= sub_wire0(2);
sub_wire3 <= sub_wire0(0);
sub_wire1 <= sub_wire0(1);
c1 <= sub_wire1;
locked <= sub_wire2;
c0 <= sub_wire3;
c2 <= sub_wire4;
sub_wire5 <= inclk0;
sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5;
altpll_component : altpll
GENERIC MAP (
bandwidth_type => "AUTO",
clk0_divide_by => 27,
clk0_duty_cycle => 50,
clk0_multiply_by => 20,
clk0_phase_shift => "0",
clk1_divide_by => 27,
clk1_duty_cycle => 50,
clk1_multiply_by => 40,
clk1_phase_shift => "0",
clk2_divide_by => 50,
clk2_duty_cycle => 50,
clk2_multiply_by => 163,
clk2_phase_shift => "0",
compensate_clock => "CLK0",
inclk0_input_frequency => 37037,
intended_device_family => "Cyclone III",
lpm_hint => "CBX_MODULE_PREFIX=pll_mist",
lpm_type => "altpll",
operation_mode => "NORMAL",
pll_type => "AUTO",
port_activeclock => "PORT_UNUSED",
port_areset => "PORT_USED",
port_clkbad0 => "PORT_UNUSED",
port_clkbad1 => "PORT_UNUSED",
port_clkloss => "PORT_UNUSED",
port_clkswitch => "PORT_UNUSED",
port_configupdate => "PORT_UNUSED",
port_fbin => "PORT_UNUSED",
port_inclk0 => "PORT_USED",
port_inclk1 => "PORT_UNUSED",
port_locked => "PORT_USED",
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_USED",
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",
self_reset_on_loss_lock => "OFF",
width_clock => 5
)
PORT MAP (
areset => areset,
inclk => sub_wire6,
clk => sub_wire0,
locked => sub_wire2
);
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 "27"
-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27"
-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "50"
-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000"
-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000"
-- Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "20.000000"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "40.000000"
-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "88.019997"
-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0"
-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0"
-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1"
-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0"
-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0"
-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575"
-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1"
-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000"
-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz"
-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000"
-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1"
-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1"
-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz"
-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1"
-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "1"
-- 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 "deg"
-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 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: MIRROR_CLK2 STRING "0"
-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "20"
-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "40"
-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "163"
-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "20.00000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "13.50000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "88.00000000"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz"
-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT2 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_SHIFT2 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 "deg"
-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "deg"
-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0"
-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1"
-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1"
-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0"
-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0"
-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0"
-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0"
-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0"
-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0"
-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0"
-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll_mist.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: STICKY_CLK2 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_CLK2 STRING "1"
-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0"
-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0"
-- Retrieval info: PRIVATE: USE_CLKENA2 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 "27"
-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50"
-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "20"
-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0"
-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27"
-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50"
-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "40"
-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0"
-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "50"
-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50"
-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "163"
-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0"
-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0"
-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037"
-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll"
-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL"
-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO"
-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_USED"
-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED"
-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED"
-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_USED"
-- 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_USED"
-- 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: SELF_RESET_ON_LOSS_LOCK STRING "OFF"
-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5"
-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]"
-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]"
-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset"
-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0"
-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1"
-- Retrieval info: USED_PORT: c2 0 0 0 0 OUTPUT_CLK_EXT VCC "c2"
-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0"
-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked"
-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0
-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0
-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0
-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0
-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1
-- Retrieval info: CONNECT: c2 0 0 0 0 @clk 0 0 1 2
-- Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0
-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.vhd TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.ppf TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.inc FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.cmp FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.bsf FALSE
-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist_inst.vhd FALSE
-- Retrieval info: LIB_FILE: altera_mf
-- Retrieval info: CBX_MODULE_PREFIX: ON

View File

@@ -1,10 +0,0 @@
copy /b ss.01e + ss.02e + ss.03e cpu.rom
copy /b ss_7.b6 + ss_8.b5 tile.rom
copy /b ss_9.m5 + ss_10.m6 + ss_11.m3 + ss_12.m4 + ss_13.m1 + ss_14.m2 sprite.rom
copy /b cpu.rom + tile.rom + sprite.rom SONSON.ROM
make_vhdl_prom ss_6.c11 sound_rom.vhd

View File

@@ -1,534 +0,0 @@
library ieee;
use ieee.std_logic_1164.all,ieee.numeric_std.all;
entity sound_rom is
port (
clk : in std_logic;
addr : in std_logic_vector(12 downto 0);
data : out std_logic_vector(7 downto 0)
);
end entity;
architecture prom of sound_rom is
type rom is array(0 to 8191) of std_logic_vector(7 downto 0);
signal rom_data: rom := (
X"86",X"FF",X"1F",X"8A",X"8E",X"00",X"00",X"CC",X"00",X"00",X"ED",X"81",X"8C",X"07",X"FF",X"23",
X"F9",X"10",X"CE",X"08",X"00",X"BD",X"E0",X"76",X"1C",X"AF",X"20",X"FE",X"34",X"FF",X"0C",X"00",
X"BD",X"E0",X"2F",X"BD",X"E1",X"3F",X"BD",X"F2",X"5D",X"BD",X"E0",X"40",X"35",X"FF",X"3B",X"96",
X"01",X"26",X"01",X"39",X"0F",X"01",X"CE",X"E6",X"78",X"96",X"02",X"84",X"1F",X"48",X"6E",X"D6",
X"5F",X"CE",X"01",X"00",X"4F",X"74",X"01",X"1A",X"49",X"74",X"01",X"19",X"49",X"74",X"01",X"18",
X"49",X"74",X"01",X"14",X"49",X"74",X"01",X"13",X"49",X"74",X"01",X"12",X"49",X"8B",X"C0",X"C6",
X"07",X"F7",X"20",X"00",X"B7",X"20",X"01",X"39",X"34",X"7E",X"B6",X"A0",X"00",X"97",X"02",X"86",
X"FF",X"97",X"01",X"35",X"7E",X"3B",X"CE",X"02",X"00",X"86",X"20",X"C6",X"1B",X"6F",X"C4",X"33",
X"C6",X"5A",X"26",X"F9",X"39",X"0B",X"3C",X"0A",X"9B",X"0A",X"02",X"09",X"73",X"08",X"EB",X"08",
X"6B",X"07",X"F2",X"07",X"80",X"07",X"14",X"06",X"AE",X"06",X"4E",X"05",X"F4",X"05",X"9E",X"05",
X"4D",X"05",X"01",X"04",X"B9",X"04",X"75",X"04",X"35",X"03",X"F9",X"03",X"C0",X"03",X"8A",X"03",
X"57",X"03",X"27",X"02",X"FA",X"02",X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D",X"02",X"3B",X"02",
X"1B",X"01",X"FC",X"01",X"E0",X"01",X"C5",X"01",X"A5",X"01",X"94",X"01",X"7D",X"01",X"68",X"01",
X"53",X"01",X"40",X"01",X"2E",X"01",X"1D",X"01",X"0D",X"00",X"FE",X"00",X"F0",X"00",X"E2",X"00",
X"D6",X"00",X"CA",X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",X"8F",X"00",
X"87",X"00",X"7F",X"00",X"78",X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",X"5A",X"00",
X"55",X"00",X"50",X"00",X"4C",X"00",X"47",X"00",X"43",X"00",X"40",X"00",X"3C",X"00",X"39",X"00",
X"35",X"00",X"32",X"00",X"30",X"00",X"2D",X"00",X"2A",X"00",X"28",X"00",X"26",X"00",X"24",X"00",
X"22",X"00",X"20",X"00",X"1E",X"00",X"1C",X"00",X"1B",X"00",X"19",X"00",X"18",X"00",X"16",X"00",
X"15",X"00",X"14",X"00",X"13",X"00",X"12",X"00",X"11",X"00",X"10",X"00",X"0F",X"00",X"0E",X"BD",
X"E1",X"46",X"BD",X"E1",X"6B",X"39",X"8E",X"02",X"00",X"0F",X"0F",X"0F",X"04",X"A6",X"84",X"27",
X"0B",X"9B",X"0F",X"BD",X"E1",X"9E",X"96",X"0F",X"81",X"03",X"24",X"0E",X"0C",X"04",X"96",X"04",
X"81",X"0F",X"27",X"06",X"86",X"20",X"30",X"86",X"20",X"E3",X"39",X"8E",X"04",X"60",X"C6",X"60",
X"A6",X"84",X"26",X"08",X"8E",X"04",X"00",X"A6",X"84",X"26",X"12",X"39",X"BD",X"EE",X"5B",X"86",
X"20",X"30",X"86",X"BD",X"EE",X"5B",X"86",X"20",X"30",X"86",X"7E",X"EE",X"5B",X"BD",X"EE",X"5B",
X"86",X"20",X"30",X"86",X"BD",X"EE",X"5B",X"86",X"20",X"30",X"86",X"7E",X"EE",X"60",X"CE",X"E1",
X"A6",X"96",X"04",X"48",X"6E",X"D6",X"E1",X"C4",X"E2",X"07",X"E2",X"2F",X"E2",X"E5",X"E3",X"BC",
X"E3",X"BD",X"E4",X"24",X"E4",X"75",X"E4",X"88",X"E4",X"C6",X"E4",X"FB",X"E5",X"2F",X"E5",X"C6",
X"E5",X"C7",X"E6",X"10",X"6A",X"0D",X"27",X"1B",X"A6",X"0D",X"44",X"CE",X"E1",X"D3",X"A6",X"C6",
X"A7",X"07",X"39",X"01",X"02",X"03",X"05",X"07",X"09",X"0A",X"0B",X"0C",X"0D",X"0D",X"0D",X"0C",
X"0A",X"08",X"06",X"A6",X"0C",X"6C",X"0C",X"81",X"05",X"27",X"19",X"CE",X"E1",X"FF",X"A6",X"C6",
X"CE",X"E0",X"E5",X"48",X"EC",X"C6",X"A7",X"02",X"E7",X"01",X"86",X"1F",X"A7",X"0D",X"39",X"07",
X"0C",X"10",X"13",X"13",X"6F",X"84",X"39",X"6A",X"0D",X"27",X"01",X"39",X"6C",X"0C",X"A6",X"0C",
X"81",X"03",X"27",X"18",X"C6",X"3C",X"E7",X"0D",X"81",X"01",X"27",X"08",X"CC",X"00",X"26",X"A7",
X"02",X"E7",X"01",X"39",X"CC",X"00",X"2A",X"A7",X"02",X"E7",X"01",X"39",X"6F",X"84",X"39",X"A6",
X"88",X"12",X"26",X"45",X"6A",X"88",X"13",X"27",X"01",X"39",X"6C",X"88",X"12",X"CC",X"00",X"18",
X"A7",X"02",X"E7",X"01",X"CC",X"00",X"20",X"A7",X"04",X"E7",X"03",X"CC",X"00",X"28",X"A7",X"06",
X"E7",X"05",X"86",X"00",X"A7",X"0C",X"86",X"0F",X"A7",X"0D",X"86",X"07",X"A7",X"07",X"86",X"01",
X"A7",X"0E",X"86",X"10",X"A7",X"0F",X"86",X"03",X"A7",X"08",X"86",X"01",X"A7",X"88",X"10",X"86",
X"10",X"A7",X"88",X"11",X"86",X"0D",X"A7",X"09",X"39",X"BD",X"E2",X"83",X"BD",X"E2",X"A1",X"BD",
X"E2",X"BF",X"39",X"A6",X"0C",X"84",X"01",X"27",X"0C",X"6A",X"07",X"27",X"01",X"39",X"6A",X"0D",
X"27",X"50",X"6C",X"0C",X"39",X"6C",X"07",X"A6",X"07",X"A1",X"0D",X"27",X"01",X"39",X"6C",X"0C",
X"39",X"A6",X"0E",X"84",X"01",X"27",X"0C",X"6A",X"08",X"27",X"01",X"39",X"6A",X"0F",X"27",X"32",
X"6C",X"0E",X"39",X"6C",X"08",X"A6",X"08",X"A1",X"0F",X"27",X"01",X"39",X"6C",X"0E",X"39",X"A6",
X"88",X"10",X"84",X"01",X"27",X"0E",X"6A",X"09",X"27",X"01",X"39",X"6A",X"88",X"11",X"27",X"12",
X"6C",X"88",X"10",X"39",X"6C",X"09",X"A6",X"09",X"A1",X"88",X"11",X"27",X"01",X"39",X"6C",X"88",
X"10",X"39",X"6F",X"84",X"39",X"A6",X"0D",X"27",X"03",X"6A",X"0D",X"39",X"A6",X"88",X"10",X"6C",
X"88",X"10",X"81",X"10",X"27",X"21",X"E6",X"0F",X"E7",X"0D",X"CE",X"E3",X"06",X"A6",X"C6",X"A7",
X"07",X"A7",X"08",X"A7",X"09",X"39",X"09",X"0A",X"0B",X"0C",X"0D",X"0C",X"0B",X"0A",X"09",X"08",
X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"6F",X"88",X"10",X"A6",X"0C",X"6C",X"0C",X"48",X"48",
X"CE",X"E3",X"88",X"33",X"C6",X"A6",X"C4",X"81",X"FF",X"27",X"5A",X"A7",X"0F",X"A7",X"0D",X"86",
X"09",X"A7",X"07",X"A7",X"08",X"A7",X"09",X"A6",X"41",X"BD",X"E3",X"53",X"A7",X"02",X"E7",X"01",
X"A6",X"42",X"BD",X"E3",X"53",X"A7",X"04",X"E7",X"03",X"A6",X"43",X"BD",X"E3",X"53",X"A7",X"06",
X"E7",X"05",X"39",X"10",X"8E",X"E3",X"5F",X"48",X"31",X"A6",X"A6",X"A4",X"E6",X"21",X"39",X"00",
X"00",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",X"00",
X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00",X"71",X"00",X"6B",X"00",X"65",X"00",X"5F",X"00",
X"5A",X"00",X"55",X"00",X"50",X"6F",X"84",X"39",X"04",X"01",X"05",X"08",X"02",X"00",X"00",X"00",
X"02",X"01",X"05",X"08",X"02",X"01",X"05",X"08",X"02",X"01",X"05",X"08",X"02",X"03",X"06",X"0A",
X"02",X"00",X"00",X"00",X"02",X"03",X"06",X"0A",X"02",X"00",X"00",X"00",X"02",X"03",X"06",X"0C",
X"02",X"00",X"00",X"00",X"0C",X"05",X"08",X"0D",X"FF",X"FF",X"FF",X"FF",X"39",X"A6",X"0D",X"27",
X"2E",X"6A",X"0D",X"A6",X"0E",X"27",X"0D",X"81",X"02",X"27",X"15",X"A6",X"0D",X"81",X"20",X"27",
X"00",X"6C",X"0E",X"39",X"6C",X"07",X"A6",X"07",X"81",X"0D",X"27",X"01",X"39",X"6C",X"0E",X"39",
X"A6",X"07",X"27",X"0A",X"96",X"00",X"84",X"03",X"27",X"01",X"39",X"6A",X"07",X"39",X"39",X"6F",
X"0E",X"C6",X"30",X"A6",X"0C",X"6C",X"0C",X"CE",X"E4",X"18",X"A6",X"C6",X"81",X"FF",X"27",X"15",
X"48",X"24",X"02",X"C6",X"90",X"E7",X"0D",X"CE",X"E0",X"9D",X"EC",X"C6",X"A7",X"02",X"E7",X"01",
X"86",X"06",X"A7",X"07",X"39",X"6F",X"84",X"39",X"18",X"97",X"18",X"9A",X"15",X"91",X"0E",X"8C",
X"09",X"85",X"02",X"FF",X"A6",X"0D",X"6C",X"0D",X"CE",X"E4",X"4C",X"A6",X"C6",X"81",X"FF",X"27",
X"18",X"81",X"FE",X"26",X"07",X"86",X"42",X"A7",X"01",X"8B",X"08",X"39",X"A7",X"07",X"96",X"00",
X"84",X"01",X"27",X"04",X"6A",X"01",X"6A",X"03",X"39",X"6F",X"84",X"39",X"04",X"05",X"06",X"07",
X"08",X"09",X"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"FE",X"03",X"04",X"05",X"06",X"07",
X"08",X"07",X"06",X"05",X"04",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"08",X"07",X"06",X"05",
X"04",X"03",X"02",X"01",X"FF",X"E6",X"01",X"A6",X"02",X"83",X"00",X"1E",X"81",X"F0",X"24",X"05",
X"A7",X"02",X"E7",X"01",X"39",X"6F",X"84",X"39",X"A6",X"0C",X"27",X"1E",X"81",X"02",X"27",X"0C",
X"6A",X"0D",X"27",X"01",X"39",X"6C",X"0C",X"86",X"10",X"A7",X"0E",X"39",X"6A",X"0E",X"27",X"01",
X"39",X"6A",X"07",X"27",X"1E",X"86",X"0E",X"A7",X"0E",X"39",X"6C",X"0E",X"A6",X"0E",X"84",X"01",
X"27",X"01",X"39",X"6C",X"07",X"A6",X"07",X"81",X"0B",X"27",X"01",X"39",X"6C",X"0C",X"86",X"48",
X"A7",X"0D",X"39",X"6F",X"84",X"39",X"A6",X"0D",X"27",X"09",X"6A",X"0D",X"A6",X"0E",X"A7",X"07",
X"A7",X"08",X"39",X"A6",X"0C",X"27",X"10",X"6A",X"0E",X"A6",X"0E",X"81",X"02",X"27",X"05",X"86",
X"05",X"A7",X"0D",X"39",X"6F",X"84",X"39",X"6C",X"0E",X"A6",X"0E",X"81",X"0A",X"27",X"05",X"86",
X"02",X"A7",X"0D",X"39",X"6C",X"0C",X"86",X"05",X"A7",X"0D",X"39",X"A6",X"0D",X"27",X"12",X"6A",
X"0D",X"CE",X"E5",X"09",X"A6",X"C6",X"A7",X"07",X"39",X"0B",X"0B",X"0C",X"0C",X"0D",X"0B",X"09",
X"06",X"E6",X"01",X"5A",X"6C",X"0C",X"A6",X"0C",X"84",X"01",X"27",X"01",X"5A",X"A6",X"0C",X"84",
X"03",X"26",X"02",X"6A",X"07",X"E7",X"01",X"C1",X"80",X"23",X"01",X"39",X"6F",X"84",X"39",X"96",
X"00",X"84",X"01",X"27",X"F9",X"6A",X"0D",X"27",X"1A",X"A6",X"0D",X"CE",X"E5",X"43",X"A6",X"C6",
X"A7",X"07",X"39",X"03",X"04",X"05",X"06",X"07",X"08",X"09",X"09",X"0A",X"0A",X"09",X"09",X"08",
X"08",X"07",X"06",X"A6",X"0C",X"6C",X"0C",X"81",X"0C",X"27",X"14",X"CE",X"E5",X"BA",X"A6",X"C6",
X"CE",X"E5",X"8A",X"48",X"EC",X"C6",X"A7",X"02",X"E7",X"01",X"86",X"0C",X"A7",X"0D",X"39",X"6F",
X"84",X"39",X"03",X"57",X"03",X"27",X"02",X"FA",X"02",X"CF",X"02",X"A7",X"02",X"81",X"02",X"5D",
X"02",X"3B",X"02",X"1B",X"01",X"FC",X"01",X"E0",X"01",X"C5",X"01",X"A5",X"01",X"94",X"01",X"7D",
X"01",X"68",X"01",X"53",X"01",X"40",X"01",X"2E",X"01",X"1D",X"01",X"0D",X"00",X"FE",X"00",X"F0",
X"00",X"E2",X"00",X"D6",X"00",X"CA",X"00",X"BE",X"00",X"B4",X"00",X"AA",X"00",X"A0",X"00",X"97",
X"00",X"8F",X"00",X"87",X"00",X"7F",X"00",X"78",X"00",X"71",X"00",X"02",X"04",X"05",X"00",X"02",
X"04",X"05",X"00",X"02",X"04",X"05",X"39",X"A6",X"0D",X"6C",X"0D",X"CE",X"E5",X"EC",X"A6",X"C6",
X"81",X"FF",X"27",X"03",X"A7",X"07",X"39",X"6C",X"0C",X"A6",X"0C",X"81",X"05",X"27",X"2E",X"C6",
X"2E",X"85",X"01",X"26",X"02",X"C6",X"34",X"E7",X"01",X"6F",X"0D",X"39",X"04",X"05",X"06",X"07",
X"08",X"09",X"0A",X"0B",X"0C",X"0D",X"0E",X"0F",X"0F",X"0E",X"0D",X"0C",X"0B",X"0A",X"09",X"09",
X"08",X"08",X"07",X"07",X"06",X"06",X"05",X"04",X"03",X"02",X"01",X"00",X"FF",X"6F",X"84",X"39",
X"A6",X"0D",X"27",X"38",X"6A",X"0D",X"A6",X"0E",X"27",X"20",X"81",X"02",X"27",X"0E",X"A6",X"0D",
X"81",X"20",X"23",X"01",X"39",X"6C",X"0E",X"86",X"02",X"A7",X"0F",X"39",X"6A",X"0F",X"27",X"01",
X"39",X"6A",X"07",X"6A",X"08",X"86",X"06",X"A7",X"0F",X"39",X"6C",X"07",X"6C",X"08",X"A6",X"07",
X"81",X"0C",X"27",X"01",X"39",X"6C",X"0E",X"86",X"40",X"A7",X"0F",X"39",X"A6",X"0C",X"6C",X"0C",
X"CE",X"E6",X"6E",X"A6",X"C6",X"81",X"FF",X"27",X"1C",X"48",X"CE",X"E1",X"15",X"EC",X"C6",X"A7",
X"02",X"E7",X"01",X"86",X"06",X"A7",X"07",X"6F",X"0E",X"C6",X"30",X"E7",X"0D",X"39",X"00",X"07",
X"04",X"07",X"0C",X"FF",X"FF",X"6F",X"84",X"39",X"E6",X"FD",X"E7",X"5C",X"E7",X"6E",X"E7",X"91",
X"EB",X"51",X"E7",X"C2",X"E7",X"C2",X"E7",X"D2",X"E7",X"E9",X"E8",X"04",X"E8",X"2A",X"E8",X"50",
X"E8",X"6D",X"E8",X"7F",X"E8",X"80",X"E8",X"94",X"E9",X"ED",X"EB",X"D8",X"E6",X"F9",X"ED",X"38",
X"EC",X"90",X"E6",X"BC",X"F0",X"FA",X"E8",X"A4",X"F1",X"71",X"E6",X"BD",X"E6",X"C1",X"E6",X"C5",
X"E6",X"C9",X"E6",X"CD",X"E6",X"D1",X"E6",X"D5",X"E6",X"D9",X"E6",X"DD",X"39",X"86",X"07",X"20",
X"20",X"86",X"08",X"20",X"1C",X"86",X"09",X"20",X"18",X"86",X"0A",X"20",X"14",X"86",X"0B",X"20",
X"10",X"86",X"0C",X"20",X"0C",X"86",X"0D",X"20",X"08",X"86",X"0E",X"20",X"04",X"86",X"0F",X"20",
X"00",X"8E",X"04",X"00",X"A7",X"88",X"17",X"A7",X"88",X"37",X"A7",X"88",X"57",X"A7",X"88",X"77",
X"A7",X"89",X"00",X"97",X"A7",X"89",X"00",X"B7",X"39",X"7F",X"04",X"60",X"39",X"CE",X"02",X"00",
X"6F",X"C4",X"6F",X"C8",X"20",X"6F",X"C8",X"40",X"6F",X"C8",X"60",X"6F",X"C9",X"00",X"80",X"6F",
X"C9",X"00",X"A0",X"6F",X"C9",X"00",X"C0",X"6F",X"C9",X"00",X"E0",X"6F",X"C9",X"01",X"00",X"6F",
X"C9",X"01",X"20",X"6F",X"C9",X"01",X"40",X"6F",X"C9",X"01",X"60",X"6F",X"C9",X"01",X"80",X"6F",
X"C9",X"01",X"A0",X"6F",X"C9",X"01",X"C0",X"6F",X"C9",X"01",X"E0",X"6F",X"C9",X"02",X"00",X"6F",
X"C9",X"02",X"20",X"6F",X"C9",X"02",X"40",X"6F",X"C9",X"02",X"C0",X"6F",X"C9",X"02",X"E0",X"6F",
X"C9",X"03",X"00",X"6F",X"C9",X"03",X"20",X"6F",X"C9",X"03",X"40",X"39",X"8E",X"02",X"00",X"86",
X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"86",X"01",X"A7",X"0D",X"6F",X"0C",X"39",X"8E",X"02",
X"20",X"A6",X"84",X"26",X"1B",X"86",X"01",X"A7",X"84",X"CC",X"00",X"47",X"A7",X"02",X"E7",X"01",
X"86",X"FE",X"A7",X"0A",X"86",X"0A",X"A7",X"07",X"86",X"00",X"A7",X"0C",X"86",X"3C",X"A7",X"0D",
X"39",X"8E",X"02",X"40",X"86",X"03",X"A7",X"84",X"CC",X"00",X"50",X"A7",X"02",X"E7",X"01",X"CC",
X"00",X"58",X"A7",X"04",X"E6",X"03",X"CC",X"00",X"60",X"A7",X"06",X"E7",X"05",X"86",X"F8",X"A7",
X"0A",X"86",X"09",X"A7",X"07",X"A7",X"08",X"A7",X"09",X"6F",X"88",X"12",X"86",X"30",X"A7",X"88",
X"13",X"39",X"8E",X"02",X"A0",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"6F",X"0C",X"6F",
X"0D",X"39",X"8E",X"02",X"C0",X"CC",X"00",X"4C",X"A7",X"02",X"E7",X"01",X"86",X"01",X"A7",X"84",
X"86",X"F8",X"A7",X"0A",X"6F",X"0C",X"6F",X"0D",X"39",X"8E",X"02",X"E0",X"86",X"01",X"A7",X"84",
X"CC",X"03",X"FF",X"A7",X"02",X"E7",X"01",X"86",X"08",X"A7",X"07",X"86",X"FE",X"A7",X"0A",X"86",
X"00",X"A7",X"0C",X"39",X"8E",X"03",X"00",X"86",X"02",X"A7",X"84",X"CC",X"0E",X"80",X"A7",X"02",
X"E7",X"01",X"CC",X"0E",X"70",X"A7",X"04",X"E7",X"03",X"86",X"04",X"A7",X"07",X"A7",X"08",X"86",
X"E4",X"A7",X"0A",X"86",X"0E",X"A7",X"0B",X"6F",X"0C",X"39",X"8E",X"03",X"20",X"86",X"02",X"A7",
X"84",X"CC",X"00",X"24",X"A7",X"02",X"E7",X"01",X"CC",X"00",X"26",X"A7",X"04",X"E7",X"03",X"86",
X"FC",X"A7",X"0A",X"86",X"00",X"A7",X"0C",X"86",X"04",X"A7",X"0D",X"86",X"08",X"A7",X"0E",X"39",
X"8E",X"03",X"40",X"86",X"01",X"A7",X"84",X"CC",X"00",X"A2",X"A7",X"02",X"E7",X"01",X"86",X"09",
X"A7",X"07",X"86",X"FE",X"A7",X"0A",X"6F",X"0C",X"86",X"08",X"A7",X"0D",X"39",X"8E",X"03",X"60",
X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"6F",X"0C",X"86",X"01",X"A7",X"0D",X"39",X"39",
X"8E",X"03",X"A0",X"86",X"01",X"A7",X"84",X"6F",X"01",X"6F",X"02",X"86",X"FE",X"A7",X"0A",X"6F",
X"0C",X"6F",X"0D",X"39",X"8E",X"03",X"C0",X"86",X"01",X"A7",X"84",X"86",X"FC",X"A7",X"0A",X"6F",
X"0C",X"6F",X"0D",X"39",X"8E",X"04",X"60",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",
X"E8",X"FA",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",
X"04",X"80",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"E9",X"50",X"ED",X"0C",X"ED",
X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"A0",X"86",X"01",X"A7",
X"84",X"86",X"FE",X"A7",X"0A",X"86",X"17",X"A7",X"0B",X"CC",X"E9",X"97",X"ED",X"0C",X"ED",X"88",
X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"39",X"5F",X"0B",X"3F",X"06",X"1F",X"23",
X"75",X"76",X"95",X"B2",X"B1",X"B4",X"75",X"76",X"95",X"B2",X"B1",X"B4",X"76",X"78",X"99",X"B9",
X"B8",X"B9",X"BB",X"B9",X"B8",X"B6",X"94",X"98",X"99",X"B4",X"98",X"B9",X"94",X"98",X"99",X"B4",
X"98",X"B9",X"96",X"99",X"9D",X"B6",X"99",X"BD",X"9D",X"9D",X"99",X"BB",X"99",X"98",X"96",X"94",
X"98",X"99",X"9B",X"99",X"B8",X"94",X"94",X"98",X"99",X"9B",X"99",X"B8",X"94",X"9E",X"9D",X"9B",
X"99",X"98",X"99",X"9D",X"9B",X"9B",X"9A",X"9B",X"9A",X"9B",X"99",X"98",X"96",X"7F",X"E9",X"16",
X"5F",X"0B",X"3F",X"06",X"1F",X"23",X"E0",X"E0",X"E0",X"B2",X"B2",X"B4",X"B2",X"91",X"91",X"91",
X"B1",X"91",X"B1",X"91",X"91",X"91",X"B1",X"91",X"B1",X"92",X"92",X"92",X"B2",X"92",X"B2",X"92",
X"92",X"92",X"B2",X"92",X"92",X"92",X"91",X"91",X"91",X"91",X"91",X"B1",X"91",X"91",X"91",X"91",
X"91",X"91",X"B1",X"91",X"99",X"98",X"96",X"94",X"92",X"94",X"98",X"94",X"96",X"96",X"96",X"96",
X"96",X"94",X"92",X"91",X"7F",X"E9",X"5D",X"5F",X"0B",X"3F",X"06",X"1F",X"23",X"A5",X"81",X"81",
X"A8",X"A1",X"A5",X"81",X"81",X"A8",X"A1",X"A6",X"83",X"83",X"A8",X"A6",X"86",X"86",X"83",X"83",
X"88",X"88",X"86",X"86",X"81",X"81",X"81",X"A1",X"81",X"A1",X"88",X"88",X"88",X"A8",X"88",X"A8",
X"8A",X"8A",X"8A",X"AA",X"8A",X"AA",X"83",X"83",X"83",X"A3",X"83",X"83",X"83",X"88",X"88",X"88",
X"88",X"88",X"A8",X"88",X"83",X"83",X"83",X"83",X"83",X"A3",X"83",X"85",X"85",X"85",X"85",X"85",
X"A5",X"85",X"86",X"88",X"86",X"88",X"83",X"83",X"83",X"83",X"7F",X"E9",X"B4",X"8E",X"04",X"00",
X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"EA",X"C5",X"ED",X"0C",X"ED",X"88",X"18",
X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"20",X"86",X"01",X"A7",X"84",X"86",
X"FE",X"A7",X"0A",X"CC",X"EA",X"50",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",
X"A7",X"88",X"11",X"8E",X"04",X"40",X"86",X"01",X"A7",X"84",X"86",X"F6",X"A7",X"0A",X"86",X"17",
X"A7",X"0B",X"CC",X"EA",X"43",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",
X"88",X"11",X"39",X"5F",X"0B",X"3F",X"06",X"1F",X"23",X"8C",X"6C",X"6C",X"7F",X"EA",X"49",X"FF",
X"5F",X"0A",X"3F",X"06",X"1F",X"23",X"C0",X"C0",X"C0",X"9F",X"A0",X"80",X"83",X"C5",X"80",X"83",
X"85",X"88",X"DF",X"8C",X"6C",X"8A",X"88",X"DF",X"8C",X"6C",X"8A",X"88",X"DF",X"8A",X"6A",X"88",
X"8A",X"A5",X"A5",X"BF",X"01",X"80",X"83",X"85",X"63",X"65",X"C8",X"80",X"8A",X"88",X"8A",X"AC",
X"8F",X"6C",X"6F",X"DF",X"B1",X"8F",X"AC",X"8A",X"88",X"DF",X"8A",X"6A",X"88",X"8A",X"A5",X"A5",
X"1F",X"2F",X"5F",X"0D",X"B1",X"AF",X"8C",X"8F",X"AA",X"88",X"8A",X"A5",X"A3",X"A5",X"A3",X"85",
X"88",X"AA",X"88",X"8A",X"AC",X"8F",X"6C",X"6F",X"D1",X"C0",X"74",X"74",X"71",X"71",X"6F",X"6F",
X"6C",X"6C",X"6F",X"6F",X"6C",X"6C",X"6A",X"6A",X"68",X"68",X"1F",X"23",X"85",X"80",X"A0",X"5F",
X"0A",X"7F",X"EA",X"59",X"FF",X"5F",X"0A",X"3F",X"06",X"1F",X"0B",X"B1",X"8C",X"8F",X"DF",X"91",
X"71",X"8C",X"8F",X"B1",X"8C",X"8F",X"9F",X"DF",X"91",X"71",X"8C",X"8F",X"B1",X"8C",X"8F",X"DF",
X"91",X"71",X"8C",X"8F",X"B4",X"8F",X"91",X"DF",X"94",X"74",X"8F",X"91",X"DF",X"96",X"76",X"91",
X"94",X"B1",X"8C",X"8F",X"BF",X"01",X"DF",X"91",X"71",X"8C",X"8F",X"B4",X"8F",X"91",X"DF",X"94",
X"74",X"8F",X"91",X"B4",X"8F",X"91",X"B1",X"8C",X"8F",X"DF",X"91",X"71",X"8C",X"8F",X"DF",X"96",
X"76",X"91",X"94",X"DF",X"91",X"71",X"8C",X"8F",X"1F",X"2F",X"5F",X"0D",X"AC",X"AA",X"87",X"8A",
X"A5",X"83",X"85",X"1F",X"23",X"AC",X"AA",X"AC",X"AA",X"8C",X"1F",X"2F",X"83",X"A5",X"83",X"85",
X"A7",X"8A",X"67",X"6A",X"CC",X"C0",X"6F",X"6F",X"6C",X"6C",X"6A",X"6A",X"68",X"68",X"6A",X"6A",
X"68",X"68",X"65",X"65",X"63",X"63",X"1F",X"0B",X"5F",X"0A",X"B1",X"8C",X"8F",X"7F",X"EA",X"D6",
X"FF",X"8E",X"04",X"60",X"A6",X"84",X"26",X"52",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",
X"CC",X"EB",X"AB",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",
X"8E",X"04",X"80",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"EB",X"BA",X"ED",X"0C",
X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"A0",X"86",X"01",
X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"86",X"17",X"A7",X"0B",X"CC",X"EB",X"C9",X"ED",X"0C",X"ED",
X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"39",X"5F",X"0B",X"3F",X"03",X"1F",
X"2F",X"A1",X"81",X"81",X"81",X"A3",X"A1",X"A1",X"E3",X"FF",X"5F",X"0B",X"3F",X"03",X"1F",X"2F",
X"A5",X"85",X"85",X"85",X"A6",X"A6",X"A6",X"E8",X"FF",X"5F",X"0B",X"3F",X"03",X"1F",X"2F",X"A8",
X"88",X"88",X"88",X"AA",X"AA",X"AC",X"ED",X"FF",X"8E",X"04",X"60",X"86",X"01",X"A7",X"84",X"86",
X"FE",X"A7",X"0A",X"CC",X"EC",X"2E",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",
X"A7",X"88",X"11",X"8E",X"04",X"80",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"EC",
X"4A",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",
X"A0",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"86",X"17",X"A7",X"0B",X"CC",X"EC",X"66",
X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"39",X"5F",X"0B",
X"3F",X"05",X"1F",X"23",X"E0",X"E0",X"80",X"94",X"80",X"95",X"80",X"96",X"80",X"97",X"80",X"96",
X"80",X"97",X"80",X"98",X"80",X"99",X"7F",X"EC",X"34",X"FF",X"5F",X"0B",X"3F",X"05",X"1F",X"23",
X"E0",X"E0",X"80",X"8E",X"80",X"8F",X"80",X"90",X"80",X"91",X"80",X"90",X"80",X"91",X"80",X"92",
X"80",X"93",X"7F",X"EC",X"50",X"FF",X"5F",X"0B",X"3F",X"05",X"1F",X"23",X"86",X"87",X"87",X"87",
X"87",X"87",X"87",X"87",X"86",X"87",X"87",X"87",X"87",X"87",X"87",X"87",X"85",X"80",X"86",X"80",
X"87",X"80",X"88",X"80",X"87",X"80",X"88",X"80",X"89",X"80",X"8A",X"80",X"7F",X"EC",X"6C",X"FF",
X"7F",X"04",X"00",X"8E",X"04",X"60",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"EC",
X"E9",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",
X"80",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"ED",X"0F",X"ED",X"0C",X"ED",X"88",
X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"A0",X"86",X"01",X"A7",X"84",
X"86",X"FE",X"A7",X"0A",X"86",X"17",X"A7",X"0B",X"CC",X"ED",X"29",X"ED",X"0C",X"ED",X"88",X"18",
X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"39",X"5F",X"0B",X"3F",X"07",X"1F",X"23",X"DF",
X"6F",X"51",X"DF",X"74",X"98",X"54",X"91",X"DF",X"6E",X"51",X"DF",X"74",X"98",X"54",X"91",X"DF",
X"6D",X"51",X"DF",X"74",X"98",X"54",X"76",X"60",X"94",X"80",X"A0",X"FF",X"7F",X"EC",X"EF",X"5F",
X"0B",X"3F",X"07",X"1F",X"23",X"A8",X"A8",X"A8",X"A8",X"A5",X"85",X"67",X"60",X"88",X"80",X"1F",
X"17",X"88",X"1F",X"23",X"80",X"FF",X"7F",X"ED",X"15",X"5F",X"0B",X"3F",X"07",X"1F",X"23",X"A3",
X"A3",X"A2",X"A2",X"A1",X"81",X"80",X"C0",X"FF",X"8E",X"04",X"60",X"86",X"01",X"A7",X"84",X"86",
X"FE",X"A7",X"0A",X"CC",X"ED",X"8E",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",
X"A7",X"88",X"11",X"8E",X"04",X"80",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"ED",
X"CD",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",
X"A0",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"86",X"17",X"A7",X"0B",X"CC",X"EE",X"0C",
X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"39",X"5F",X"09",
X"3F",X"06",X"1F",X"23",X"9F",X"DF",X"B9",X"7B",X"79",X"96",X"99",X"94",X"96",X"DF",X"D1",X"8F",
X"8D",X"8F",X"92",X"96",X"99",X"80",X"92",X"96",X"99",X"BD",X"BB",X"B9",X"B8",X"BF",X"01",X"9F",
X"DF",X"B6",X"78",X"76",X"93",X"96",X"91",X"93",X"DF",X"CE",X"8C",X"8A",X"8C",X"8F",X"93",X"96",
X"80",X"8F",X"93",X"96",X"BA",X"B8",X"B6",X"B8",X"BF",X"01",X"7F",X"ED",X"94",X"5F",X"09",X"3F",
X"06",X"1F",X"23",X"9F",X"DF",X"B4",X"76",X"74",X"91",X"94",X"8F",X"91",X"DF",X"CC",X"8A",X"88",
X"8A",X"8D",X"91",X"94",X"80",X"8D",X"91",X"94",X"B4",X"B2",X"B1",X"AF",X"BF",X"01",X"9F",X"DF",
X"B1",X"73",X"71",X"8E",X"91",X"8C",X"8E",X"DF",X"C9",X"87",X"85",X"87",X"8A",X"8E",X"91",X"80",
X"8A",X"8E",X"91",X"B1",X"AF",X"AE",X"AC",X"BF",X"01",X"7F",X"ED",X"D3",X"5F",X"09",X"3F",X"06",
X"1F",X"17",X"9F",X"8D",X"8D",X"94",X"8D",X"8D",X"8D",X"94",X"8D",X"8D",X"8D",X"94",X"8D",X"8D",
X"8D",X"94",X"8D",X"86",X"86",X"8D",X"86",X"86",X"86",X"8D",X"86",X"88",X"88",X"8F",X"88",X"88",
X"88",X"8F",X"88",X"BF",X"01",X"9F",X"8A",X"8A",X"91",X"8A",X"8A",X"8A",X"91",X"8A",X"8A",X"8A",
X"91",X"8A",X"8A",X"8A",X"91",X"8A",X"83",X"83",X"8A",X"83",X"83",X"83",X"8A",X"83",X"85",X"85",
X"8C",X"85",X"85",X"85",X"8C",X"85",X"BF",X"01",X"7F",X"EE",X"12",X"A6",X"84",X"26",X"4A",X"39",
X"BD",X"EE",X"8A",X"BD",X"EE",X"67",X"39",X"6C",X"88",X"1E",X"A6",X"88",X"1E",X"84",X"03",X"27",
X"01",X"39",X"A6",X"07",X"81",X"05",X"27",X"07",X"A6",X"07",X"27",X"02",X"6A",X"07",X"39",X"86",
X"F6",X"A7",X"0A",X"86",X"03",X"A7",X"0B",X"6A",X"07",X"39",X"A6",X"88",X"12",X"27",X"46",X"6A",
X"88",X"1A",X"26",X"37",X"6A",X"88",X"12",X"27",X"3C",X"A6",X"88",X"17",X"A7",X"88",X"1A",X"39",
X"86",X"FE",X"A7",X"0A",X"6F",X"88",X"1E",X"20",X"2C",X"A6",X"88",X"12",X"27",X"27",X"6A",X"88",
X"1A",X"26",X"18",X"6A",X"88",X"12",X"27",X"1D",X"A6",X"88",X"17",X"A7",X"88",X"1A",X"A6",X"07",
X"E6",X"88",X"1B",X"A3",X"88",X"1C",X"A7",X"07",X"E7",X"88",X"1B",X"39",X"A6",X"88",X"15",X"A7",
X"07",X"39",X"6F",X"07",X"39",X"BD",X"F0",X"4F",X"84",X"1F",X"27",X"7A",X"81",X"1F",X"10",X"27",
X"00",X"C1",X"BD",X"EE",X"EC",X"BD",X"EF",X"5C",X"BD",X"EE",X"CC",X"39",X"10",X"AE",X"88",X"13",
X"48",X"31",X"A6",X"EC",X"A4",X"A7",X"02",X"E7",X"01",X"39",X"35",X"40",X"BD",X"F0",X"4F",X"84",
X"1F",X"27",X"08",X"BD",X"EE",X"EC",X"BD",X"EF",X"0F",X"20",X"C1",X"6F",X"02",X"6F",X"01",X"E6",
X"88",X"16",X"59",X"59",X"59",X"59",X"C4",X"07",X"E7",X"88",X"1F",X"CE",X"EF",X"3E",X"A6",X"C5",
X"A7",X"88",X"12",X"A6",X"88",X"17",X"A7",X"88",X"1A",X"A6",X"88",X"15",X"A7",X"07",X"6F",X"88",
X"1B",X"A6",X"88",X"1F",X"48",X"CE",X"EF",X"46",X"EC",X"C6",X"ED",X"88",X"1C",X"39",X"01",X"03",
X"06",X"0C",X"18",X"30",X"60",X"C0",X"07",X"00",X"03",X"81",X"01",X"C2",X"00",X"E4",X"00",X"78",
X"00",X"48",X"00",X"3C",X"00",X"4E",X"6F",X"02",X"6F",X"01",X"20",X"89",X"E6",X"88",X"16",X"59",
X"59",X"59",X"59",X"C4",X"07",X"E7",X"88",X"1F",X"CE",X"EF",X"8B",X"A6",X"C5",X"A7",X"88",X"12",
X"A6",X"88",X"17",X"A7",X"88",X"1A",X"A6",X"88",X"15",X"A7",X"07",X"6F",X"88",X"1B",X"CE",X"EF",
X"93",X"A6",X"88",X"1F",X"48",X"EC",X"C6",X"ED",X"88",X"1C",X"39",X"01",X"02",X"04",X"08",X"10",
X"20",X"40",X"80",X"07",X"00",X"03",X"80",X"01",X"C0",X"00",X"E0",X"00",X"70",X"00",X"38",X"00",
X"1C",X"00",X"0E",X"BD",X"EF",X"A9",X"16",X"FF",X"2C",X"E6",X"88",X"16",X"59",X"59",X"59",X"59",
X"C4",X"07",X"58",X"CE",X"EF",X"B8",X"6E",X"D5",X"EF",X"C8",X"EF",X"D5",X"EF",X"DF",X"EF",X"E6",
X"EF",X"F4",X"EF",X"FC",X"EE",X"FA",X"F0",X"4A",X"BD",X"F0",X"4F",X"CE",X"E0",X"85",X"48",X"33",
X"C6",X"EF",X"88",X"13",X"39",X"BD",X"F0",X"4F",X"A7",X"88",X"17",X"A7",X"88",X"1A",X"39",X"BD",
X"F0",X"4F",X"A7",X"88",X"15",X"39",X"BD",X"F0",X"4F",X"E6",X"88",X"16",X"BD",X"F0",X"4F",X"A7",
X"0D",X"E7",X"0C",X"39",X"EC",X"0C",X"ED",X"0E",X"6F",X"88",X"10",X"39",X"96",X"02",X"81",X"15",
X"10",X"27",X"00",X"5C",X"BD",X"F0",X"4F",X"6C",X"88",X"10",X"A6",X"88",X"10",X"A1",X"88",X"16",
X"23",X"01",X"39",X"EC",X"0E",X"ED",X"0C",X"39",X"39",X"BD",X"F0",X"4F",X"6C",X"88",X"10",X"A6",
X"88",X"10",X"A1",X"88",X"16",X"27",X"07",X"BD",X"F0",X"4F",X"BD",X"F0",X"4F",X"39",X"BD",X"F0",
X"4F",X"E6",X"88",X"16",X"BD",X"F0",X"4F",X"A7",X"0D",X"E7",X"0C",X"39",X"BD",X"F0",X"4F",X"6C",
X"88",X"10",X"A1",X"88",X"16",X"27",X"E7",X"7E",X"F0",X"13",X"35",X"40",X"6F",X"84",X"39",X"EE",
X"0C",X"A6",X"C4",X"A7",X"88",X"16",X"86",X"01",X"33",X"C6",X"EF",X"0C",X"A6",X"88",X"16",X"39",
X"8E",X"04",X"60",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"F0",X"B6",X"ED",X"0C",
X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"80",X"86",X"01",
X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"F0",X"CE",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",
X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"A0",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",
X"0A",X"86",X"17",X"A7",X"0B",X"CC",X"F0",X"E6",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",
X"86",X"04",X"A7",X"88",X"11",X"39",X"5F",X"09",X"3F",X"07",X"1F",X"23",X"DF",X"B9",X"79",X"79",
X"DF",X"B9",X"79",X"79",X"92",X"60",X"76",X"B9",X"95",X"60",X"79",X"BC",X"FD",X"FF",X"5F",X"09",
X"3F",X"07",X"1F",X"23",X"DF",X"B4",X"74",X"74",X"DF",X"B4",X"74",X"74",X"8D",X"60",X"72",X"B6",
X"90",X"60",X"75",X"B9",X"F9",X"FF",X"5F",X"09",X"3F",X"07",X"1F",X"17",X"AD",X"AC",X"AA",X"A8",
X"8A",X"60",X"6B",X"B2",X"8D",X"60",X"70",X"B5",X"F4",X"FF",X"8E",X"04",X"60",X"86",X"01",X"A7",
X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"F1",X"4D",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",
X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"80",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",
X"CC",X"F1",X"5F",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",
X"8E",X"04",X"A0",X"6F",X"01",X"6F",X"02",X"86",X"FE",X"A7",X"0A",X"39",X"CC",X"F1",X"70",X"ED",
X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"39",X"5F",X"0A",X"3F",
X"09",X"1F",X"23",X"7E",X"7E",X"7E",X"7E",X"9B",X"99",X"9B",X"7B",X"7B",X"DB",X"A0",X"FF",X"5F",
X"0A",X"3F",X"09",X"1F",X"23",X"79",X"79",X"79",X"79",X"96",X"94",X"96",X"76",X"76",X"D6",X"A0",
X"FF",X"8E",X"04",X"60",X"86",X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"F1",X"C7",X"ED",
X"0C",X"ED",X"88",X"18",X"6F",X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"80",X"86",
X"01",X"A7",X"84",X"86",X"FE",X"A7",X"0A",X"CC",X"F1",X"F9",X"ED",X"0C",X"ED",X"88",X"18",X"6F",
X"88",X"12",X"86",X"04",X"A7",X"88",X"11",X"8E",X"04",X"A0",X"86",X"01",X"A7",X"84",X"86",X"FE",
X"A7",X"0A",X"86",X"17",X"A7",X"0B",X"CC",X"F2",X"2B",X"ED",X"0C",X"ED",X"88",X"18",X"6F",X"88",
X"12",X"86",X"04",X"A7",X"88",X"11",X"39",X"5F",X"0B",X"3F",X"07",X"1F",X"23",X"94",X"76",X"71",
X"74",X"74",X"76",X"71",X"94",X"76",X"71",X"74",X"74",X"76",X"71",X"76",X"79",X"60",X"76",X"79",
X"60",X"76",X"79",X"6F",X"6F",X"71",X"71",X"72",X"72",X"74",X"74",X"72",X"72",X"76",X"79",X"74",
X"74",X"78",X"7B",X"79",X"99",X"99",X"7B",X"9D",X"FF",X"5F",X"0B",X"3F",X"07",X"1F",X"23",X"8D",
X"6D",X"6D",X"6D",X"6D",X"6D",X"6D",X"8E",X"6E",X"6E",X"6E",X"6E",X"6E",X"6E",X"72",X"6F",X"60",
X"72",X"6F",X"60",X"73",X"6F",X"6A",X"6A",X"6C",X"6C",X"6D",X"6D",X"6E",X"6E",X"6D",X"6D",X"72",
X"72",X"6F",X"6F",X"74",X"74",X"71",X"91",X"91",X"72",X"94",X"FF",X"5F",X"0B",X"3F",X"07",X"1F",
X"23",X"81",X"68",X"65",X"61",X"61",X"68",X"65",X"82",X"68",X"65",X"62",X"62",X"68",X"65",X"66",
X"63",X"60",X"66",X"63",X"60",X"67",X"63",X"69",X"69",X"6B",X"6B",X"6C",X"6C",X"6D",X"6D",X"66",
X"66",X"6D",X"6A",X"68",X"68",X"6F",X"6C",X"61",X"81",X"81",X"68",X"8D",X"FF",X"86",X"FF",X"B7",
X"01",X"12",X"B7",X"01",X"13",X"B7",X"01",X"14",X"B7",X"01",X"18",X"B7",X"01",X"19",X"B7",X"01",
X"1A",X"BD",X"F3",X"14",X"7E",X"F2",X"78",X"39",X"8E",X"04",X"60",X"A6",X"84",X"26",X"12",X"8E",
X"04",X"00",X"A6",X"84",X"26",X"0B",X"C6",X"07",X"F7",X"40",X"00",X"86",X"FF",X"B7",X"40",X"01",
X"39",X"5F",X"F7",X"40",X"00",X"A6",X"01",X"B7",X"40",X"01",X"5C",X"F7",X"40",X"00",X"A6",X"02",
X"B7",X"40",X"01",X"5C",X"F7",X"40",X"00",X"A6",X"88",X"21",X"B7",X"40",X"01",X"5C",X"F7",X"40",
X"00",X"A6",X"88",X"22",X"B7",X"40",X"01",X"5C",X"F7",X"40",X"00",X"A6",X"88",X"41",X"B7",X"40",
X"01",X"5C",X"F7",X"40",X"00",X"A6",X"88",X"42",X"B7",X"40",X"01",X"5C",X"F7",X"40",X"00",X"A6",
X"88",X"4B",X"B7",X"40",X"01",X"C6",X"FF",X"A6",X"0A",X"44",X"56",X"A6",X"88",X"2A",X"44",X"56",
X"A6",X"88",X"4A",X"44",X"56",X"56",X"56",X"44",X"44",X"44",X"56",X"56",X"56",X"86",X"07",X"B7",
X"40",X"00",X"F7",X"40",X"01",X"C6",X"08",X"F7",X"40",X"00",X"A6",X"07",X"B7",X"40",X"01",X"5C",
X"F7",X"40",X"00",X"A6",X"88",X"27",X"B7",X"40",X"01",X"5C",X"F7",X"40",X"00",X"A6",X"88",X"47",
X"B7",X"40",X"01",X"39",X"8E",X"02",X"00",X"86",X"0F",X"97",X"03",X"0F",X"05",X"A6",X"84",X"27",
X"03",X"BD",X"F3",X"35",X"96",X"05",X"81",X"03",X"27",X"0A",X"0A",X"03",X"27",X"06",X"86",X"20",
X"30",X"86",X"20",X"E9",X"39",X"A6",X"84",X"81",X"01",X"27",X"07",X"81",X"02",X"27",X"48",X"16",
X"00",X"B0",X"D6",X"05",X"58",X"F7",X"20",X"00",X"A6",X"01",X"B7",X"20",X"01",X"5C",X"F7",X"20",
X"00",X"A6",X"02",X"B7",X"20",X"01",X"96",X"05",X"8B",X"08",X"B7",X"20",X"00",X"A6",X"07",X"B7",
X"20",X"01",X"A6",X"0B",X"27",X"08",X"C6",X"06",X"F7",X"20",X"00",X"B7",X"20",X"01",X"96",X"05",
X"10",X"8E",X"01",X"12",X"31",X"A6",X"A6",X"0A",X"44",X"69",X"A4",X"C6",X"06",X"31",X"A5",X"44",
X"44",X"44",X"69",X"A4",X"0C",X"05",X"39",X"D6",X"05",X"C1",X"02",X"27",X"B5",X"58",X"F7",X"20",
X"00",X"A6",X"01",X"B7",X"20",X"01",X"5C",X"F7",X"20",X"00",X"A6",X"02",X"B7",X"20",X"01",X"5C",
X"F7",X"20",X"00",X"A6",X"03",X"B7",X"20",X"01",X"5C",X"F7",X"20",X"00",X"A6",X"04",X"B7",X"20",
X"01",X"D6",X"05",X"CB",X"08",X"F7",X"20",X"00",X"A6",X"07",X"B7",X"20",X"01",X"5C",X"F7",X"20",
X"00",X"A6",X"08",X"B7",X"20",X"01",X"A6",X"0B",X"27",X"08",X"C6",X"06",X"F7",X"20",X"00",X"B7",
X"20",X"01",X"96",X"05",X"10",X"8E",X"01",X"12",X"31",X"A6",X"A6",X"0A",X"46",X"69",X"A4",X"46",
X"69",X"21",X"C6",X"06",X"31",X"A5",X"46",X"46",X"69",X"A4",X"46",X"69",X"21",X"0C",X"05",X"0C",
X"05",X"39",X"D6",X"05",X"C1",X"02",X"10",X"27",X"FF",X"48",X"C1",X"01",X"27",X"89",X"58",X"F7",
X"20",X"00",X"A6",X"01",X"B7",X"20",X"01",X"5C",X"F7",X"20",X"00",X"A6",X"02",X"B7",X"20",X"01",
X"5C",X"F7",X"20",X"00",X"A6",X"03",X"B7",X"20",X"01",X"5C",X"F7",X"20",X"00",X"A6",X"04",X"B7",
X"20",X"01",X"5C",X"F7",X"20",X"00",X"A6",X"05",X"B7",X"20",X"01",X"5C",X"F7",X"20",X"00",X"A6",
X"06",X"B7",X"20",X"01",X"D6",X"05",X"CB",X"08",X"F7",X"20",X"00",X"A6",X"07",X"B7",X"20",X"01",
X"5C",X"F7",X"20",X"00",X"A6",X"08",X"B7",X"20",X"01",X"5C",X"F7",X"20",X"00",X"A6",X"08",X"B7",
X"20",X"01",X"A6",X"0B",X"27",X"08",X"C6",X"06",X"F7",X"20",X"00",X"B7",X"20",X"01",X"96",X"05",
X"10",X"8E",X"01",X"12",X"31",X"A6",X"A6",X"0A",X"46",X"69",X"A4",X"46",X"69",X"21",X"46",X"69",
X"22",X"C6",X"06",X"31",X"A5",X"46",X"69",X"A0",X"46",X"69",X"A0",X"46",X"69",X"A4",X"0C",X"05",
X"0C",X"05",X"0C",X"05",X"39",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E0",X"68",X"E0",X"1C",X"FF",X"FF",X"FF",X"FF",X"E0",X"00");
begin
process(clk)
begin
if rising_edge(clk) then
data <= rom_data(to_integer(unsigned(addr)));
end if;
end process;
end architecture;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,513 +0,0 @@
:1000000000003C666666663C001838581818187E72
:10001000003C66060C30607E003C66061C06663CB2
:10002000000E1E36667F0606007E607C6606663C15
:10003000003C66607C66663C007E060E1C18181844
:10004000003C66663C66663C003C66663E060C38D4
:100050003C429DA1A19D423C0018181818001800B0
:100060000000123F12123F1200080C0F090A383824
:10007000003C66660C1000180000013E5415376005
:100080000000000000000000001C3663637F636313
:10009000007E63637E63637E003E63606060633EF8
:1000A000007E63636363637E007F60607E60607F69
:1000B000007F60607E606060003E63606067633EFA
:1000C000006363637F636363001E0C0C0C0C0C1EE7
:1000D000001F06060606663C0063666C787C6E634D
:1000E000006060606060607F004163777F6B636386
:1000F0000063737B6F676363003E63636363633EA8
:10010000007E63637E606060003E6363636F663B96
:10011000007E63637E6C6663003E63603E03633E05
:10012000007F0C0C0C0C0C0C006363636363633E78
:10013000006363636363361C00636363636B7F36D2
:100140000063361C1C366341003333331E0C0C0C29
:10015000007F03060C18307F073927392127E6C0B6
:100160001010180C061E32100000003D6666663B3B
:10017000001E33333633336E000066FFFF7E3C18BB
:1001800000183E183E6B673D000060636363637058
:10019000000E001E3303030E001C003E0C183C67CB
:1001A00000183C1B3E6B6B3B0007307E3636363604
:1001B00000183E0C3E0C603C000C18306030180CEF
:1001C0000006667F6666060C003F03060000603F7F
:1001D000000C3F060360603E006060606063633E49
:1001E00000067F1E36361E3C0036367F3630301E07
:1001F0000033367C3F60603C0008087F3E1C36229E
:1002000005183E0C0660603E006065606066663CF6
:10021000050C7F3C6C6C3C780500367F3636301E12
:100220000533367C3F60603C0530377E36363636E7
:1002300005183E0C3E0C603C050018306030180C70
:100240000500667F6666060C05003F020000603F01
:1002500000667F66666F7B6E007C18376663633E60
:1002600000180C0C186D6D6D000000386C660300F2
:10027000007F667F666F7B6EF080E08EF909090E65
:10028000003078373030303700187E181E03033EB8
:1002900000007E0303031E00007F060C1830301E92
:1002A0000063361C1830301E00187C37661F361C61
:1002B00000006F6060606C670000333E355D5F3743
:1002C000003033773B37753700003E6D6D6D6D390B
:1002D0000367667F666F7B6E037B18376663633EDA
:1002E000031B0C0C186D6D6D000303386C66030066
:1002F00003637F667F6E7B6EE090F0A091110A042D
:10030000003578373030303705187E181E03033E2D
:1003100005007E0303031E0005007E0C1830301E0E
:100320000560361C1830301E000036367E333730FC
:10033000000000363F35051E00000C0F0C1F361C58
:1003400000000E001E040817000000003E03030E0C
:1003500005667F66666F7B6E057C18376663633E55
:1003600005180C0C186D6D6D0005386C66030000E7
:10037000057F667F666F7B6E0000000019191D18EF
:10038000000C3E0C7F3C6E3C0000781A3A5F5A3AF3
:1003900000187C1B385B5B3E0000333E775D6D3A96
:1003A00000307C307C33331E003336FE333336303E
:1003B00000006C6E7B6B0B3E000C0F0C3C6F6C38BE
:1003C000000C66607E03033E00066E766606060C31
:1003D000003E0C183E033B3E003033773B33733313
:1003E000003E0C183E03033E003030773B3373363B
:1003F00000187C301E38603E001830606C7E7667D6
:1004000077D2926DA3E29CB3FF0C12D22D2062C56D
:10041000E724241818679870BC54995925854248D8
:100420009E91906F1020404007F21121A25C40463F
:10043000F13142818181423CFF182424DAA5C204B3
:10044000CE7C4C78989864137D442919191620CED7
:10045000F1102121627C8989E623454539CD33336A
:1004600060E06C73737F6C000000CC3232FECC0015
:1004700060E06976767F6900000024DADAFE240005
:10048000E27B00000000000002FF0000000000000E
:1004900010F800000000000084F0000000000000E0
:1004A000708800000000000089FC000000000000CF
:1004B00001FE000000000000C23900000000000042
:1004C000109F00000000000011F900000000000073
:1004D00048CF000000000000E7FE00000000000020
:1004E0001E10111E06071D000000986464FC980091
:1004F0000000669999FF66000000000000000000FF
:10050000609086E9B9BF6600F0303639696F6600E1
:1005100070989E79999F760060B0B679393FE60071
:10052000F0888B88887B0000F0888B88887B0000AF
:100530007F4040403F000000FE010101FF007F407E
:10054000007F4040403F800100FE010101FF00406C
:100550007F4040403F00FE01FE010101FF0000001E
:10056000F0888B88887B00F0F0888B88887B00007F
:10057000F0888B88887B0000F0888B88887B00015E
:1005800070981E3969CFFE0070981E39199F760049
:10059000103076B9B9FF3600F08086E9393FE600C1
:1005A00000FF00027C7C800000FF00027C7C800059
:1005B000000000000000000040403F00000000007C
:1005C0000101FF000000000040403F00000000006B
:1005D0000101FF000000000000000000000000001A
:1005E000807F00027C7C800000FF00027C7C800019
:1005F00000FF00027C7C800001FF00027C7C800008
:100600002047478800027C7C20C7C70800027C7C0A
:100610008080C04060301F0701010302060CF8E033
:10062000000000000001030700002070F8F0E0C0A7
:100630002F3F3E3C3E000000800000000000000014
:10064000000000000000010000000000000000C0E9
:1006500000000000010004040000000000C0006071
:100660000000010004040209000000C00060A008AE
:10067000E0C7C70800027C7C20C7C70800027C7C5A
:100680008000204747880002800020C7C70800027A
:1006900000000000010004040000000000C0006031
:1006A0000000010004040201000000C00060A00876
:1006B000010004040201100800C00060A008902896
:1006C00004040201100804020060A0089028488871
:1006D0000201100804020100A00890284888008048
:1006E0001008040201000000902848880484442473
:1006F0008000E0C7C7080002800020C7C7080002CA
:10070000808FA02000202020007A02020002020236
:10071000E0C7C70800027C7C21C6C60800027C7CBA
:1007200084C2C2C3C1C1C3C682840000000080600D
:100730008CC4C2C0C0C1C2C2162C205060808000D0
:1007400088C5C5C6CA31C1C082040000000040800F
:1007500080C0CEF710C0C0C04A54C040A0806040E6
:1007600080C0C0C1C1C1C3C30204000000000000BA
:1007700080C0C0C0C020F0D0A2A4406030180000EB
:100780008020A0A08020202000020202000202029D
:100790008000E0C7C7080002800021C6C60800022A
:1007A000B367000000000000E0FC00000000000053
:1007B000BE77000000000000F87C00000000000090
:1007C000BF7F000000000000B8BC00000000000077
:1007D000BF7F000000000000D8DC00000000000027
:1007E000BD79000000000000F8FC000000000000DF
:1007F000B773000000000000F8FC000000000000DB
:10080000FF80A080808080A0FE010501010101051C
:1008100000FF80A08080808000FE010501010101B1
:100820000000FF80A08080800000FE010501010122
:10083000FF80800000000000FE01010101010101B4
:10084000FF80000000000000FE0101010101010124
:10085000FF80800000000000FE0101010101010194
:1008600000FE828282FE0F08FE828282FE00EF2856
:10087000FE828282FE00EF28FE828282FE00EF2846
:10088000807F00000000000001FF00000000000069
:10089000A0807F00000000000501FF0000000000B4
:1008A00080A0807F00000000010501FF0000000023
:1008B00080FF00000000000001FF000000000000B9
:1008C000007F00000000000001FF000000000000A9
:1008D000807F00000000000001FF00000000000019
:1008E00008080F00000000002828EF0000000000AA
:1008F0002828EF00000000002828EF00000000007A
:1009000000FC828282FE00CFFE828282FE000FE81F
:10091000FE828282FE00E02F00FE828282FE0FE8CD
:10092000FE828282FE00EF2800FE828282FEE020AC
:1009300060B0343B6BCFF40060B0346B3BBF6400FD
:10094000103074BBBBFF140000000000000000006A
:10095000FF80808E9FB2A2A5F0080808884808088A
:10096000FF80800E5F32A2A5F008080888480808BA
:10097000C794940E5F32A2A5C02058288848080862
:100980002828E8070000000028282FE000000000C9
:100990002828E80F0000000028282FE000000000B1
:1009A0002828EF00000000002020E00000000000E8
:1009B000F08084EB3B3FE400609084EBBBBF6400BD
:1009C000F030346B6B6F64000000926D6DFF92002D
:1009D000988E8087808080800808080808080808AA
:1009E00018CEA05720C08080080828502010080882
:1009F00018CEA05724CB8A94080868B010080808BD
:100A000000F089898A897802F0888B88887B006762
:100A1000F0888A888A7903FCF0888B88887B007349
:100A200000F08B88888B7880F088A19AD81B007F93
:100A3000F088888B887803CCF0888B88887B00636B
:100A4000F088888B887803E400F0888B88887B00A6
:100A5000F0888B88887B00F8F0888B88887B00FF83
:100A6000F0888B88887B00E700F08B88888B788300
:100A7000F0888B88887B00F8F088888A897903FC65
:100A800041423E000000000054947300000000004A
:100A90000000FE000000000014C40100000000007F
:100AA0000802FE000000000080807F0000000000BF
:100AB0002951DF000000000054542700000000000E
:100AC0001515F3000000000040409F0000000000EA
:100AD0000200FE000000000040A03F0000000000F7
:100AE0001428E700000000002414C70000000000E4
:100AF0000401FF000000000082423E0000000000F0
:100B0000EFA85728D090E817FF0E91514946982436
:100B1000FD0810100846AD509FD050AE312151D283
:100B2000FF003C42818181429F9090600E111192A2
:100B30009C8A8A9262091516FFB0C8C8B60911319D
:100B40009F292954B454235467140AED2D4A348A3A
:100B5000FF324A85878CB442DF101052EDADC60AD1
:100B6000FF1C22414141225C7EA55B2D030C0E132C
:100B7000C116862E5F32A2A5C0A058A8D868202032
:100B8000901F00000000000024E7000000000000AB
:100B900010F2000000000000AC6700000000000040
:100BA0003DFF0000000000004C7F0000000000003E
:100BB00028CF0000000000004AF100000000000003
:100BC000529F000000000000853C00000000000073
:100BD00008F70000000000000AFC00000000000010
:100BE000A0BF00000000000013F3000000000000A0
:100BF000188EA05700CBAAA408082850A010A85807
:100C00001E7B92066C3D1F03F9DF4A02B6DEBD1C57
:100C1000DEF7931034D7CF8F76BF2D48DAB7B5D82B
:100C2000BDEECA1839FBF170F1FB7324ACC7DBF6DB
:100C3000CFFFCE80912F6EC73E7D6C0099E3F74EBB
:100C4000CFBE9680295FEFC738FE73208DEC808081
:100C500004380F2010030C00200C27469021160E9C
:100C600000C38D5060438C000026D861021D608057
:100C70000026D861021D6080003C478C00E01B0408
:100C80000000000000000000000000000000000064
:100C90000000000000000000000000000000000054
:100CA0000000000000000000000000000000000044
:100CB0000000000000000000000000000000000034
:100CC0000000000000000000000000000000000024
:100CD0000000000000000000000000000000000014
:100CE0006000000000000000300C00000000000068
:100CF00030000000000000000600000000000000BE
:100D000040B9C6310234C8200623D40B8046211ACC
:100D100031C629224C30C804030EC12056480700B2
:100D20001429C20C1023C01808D619A2458201420A
:100D30000876D9200060C1321C30A44084489460F9
:100D400000027E7EFE000607087272EE0020672712
:100D5000126666DE0020E0E4027E7EFE000027E7E9
:100D600000027E7EFE80E0E7029E4EEE000027E756
:100D7000027E7EFE0020E6E600027E7EFE006767C1
:100D80001000000000000000041008000000000037
:100D90000000000000000000000000000000000053
:100DA0000000000000000000020000000000000041
:100DB0001C1100000000000008800000000000007E
:100DC0000F000000000000006F00000000000000A5
:100DD000E60E0000000000006FE0000000000000D0
:100DE000E70F000000000000EFE00000000000003E
:100DF000ED00000000000000EF0000000000000017
:100E000000027E7EFE80E2E700027E7EFE00672713
:100E1000047062EE0020E7E7027E7EFE002027A736
:100E2000047C78F20020E0E4027E7EFE000027E7EA
:100E3000027E7EFE0021E6E400027E7EFE0060E08F
:100E400000000008420F3ED9000000000009C0E386
:100E5000000040E070FEBCFF000010004000C56FC5
:100E60000000000004307FD9000000040061FEE7AC
:100E700000000003108060FB00000080E068FF7F3E
:100E8000E70F0000000000002F60000000000000DD
:100E9000EF00000000000000AF00000000000000B4
:100EA0000B00000000000000E00000000000000057
:100EB000ED00000000000000E00000000000000065
:100EC000FFFFF7FFDFFEFFFFFFBBFFFFFD7FFFFF21
:100ED000E7FBFFBBFFDFFFFFFDFFFDEFFFBFFFFFF6
:100EE000FFFFF7FFDFFEFFFFFFBBFFFFFD7FFFFF01
:100EF0009F7FFDFFEFFFFFFF7FEDFFFDEFFFFFFF98
:100F0000000000000846E3CF00000800100CC77D79
:100F1000000000000B4385FF0000000000C4F3FF49
:100F2000000000000000021E0000000000004078E9
:100F300000001F3F3F1F0F070133FAF8F8F8F0E3F6
:100F40004040071F3F7F3F7F0167F7F6F0F0F0E179
:100F50000418303103030707040E7EFEFFFFFFFF76
:100F600000000F1F1F1F3F3F00089EFFFFFFFEFEF8
:100F700000020F1F1F3F1E3E011E380000041F3FCE
:100F8000FFDBFFFBDFFFFFFFFFEFFFFD6FFFFFFF5B
:100F9000DFFFDFFFEFFF7FFE6FFF9EFFDFFBFFFF47
:100FA000062F2D0D0603030060F4B4B060C0C0002E
:100FB0007330000000000000C107000000000000C6
:100FC0003F4F400000000000C38F00000000000001
:100FD0001339000000000000FEF8000000000000CF
:100FE0001F03000000000000FCF0000000000000F3
:100FF0001C000000000000001E1C0000000000009B
:101000000F3E386060604003C685223030366F6C1A
:101010000F3F70674E39073E860FD9DB1EC6F004BE
:101020001F3F60606060400184C62E6D6969CBD34C
:10103000060E060606060600000000000008042250
:1010400000000000000103070000404870F0FCE0D1
:10105000010100000000000040400000000000000E
:1010600001010000000000004040000000000000FE
:1010700001010000000000004040000000000000EE
:101080001F07000000000000ED93000000000000BA
:101090007807000000000000DAFC000000000000FB
:1010A0003F1F000000000000960E0000000000003E
:1010B00002050B0610295A3155306814AC58C0800F
:1010C0000F0F1F3F3C786000E0C080000000000070
:1010D00000000000003F02010000000000FF80004F
:1010E0000000000000FF02010000000000FC804042
:1010F00000000000001F02010000000000FF80400F
:10110000010100000000000040400000000000005D
:10111000FF80808080808080FF00000000000080D1
:10112000FF0101010101018180808080808080FFBA
:1011300000000000000000FF01010101010101FFAA
:101140000042810000003C660042810000183858CF
:10115000000000000000000000000020601060F0AF
:10116000000000000000000000000000485060384F
:10117000000000000000000000000000000000006F
:101180000000000000FF02010000000000FC8040A1
:1011900080808080808080800000000000000080CF
:1011A0000101010101010181FFFFFFFFFFFFFFFFBF
:1011B000000000000000000000000000000000002F
:1011C0006666663C000000001818187E00000000EB
:1011D0000000020713256D3230D0D020E0C000009F
:1011E00000000000000000000000000000000000FF
:1011F0000004000000210000486CF4FC7C1C080086
:101200000000010303030D06000000000010302061
:1012100000000000000002000000000804C21010DE
:101220000C1C2C2C3E0C0C000C12101C16160C0066
:101230001838191A1A1B190000008C5252DE8C0043
:1012400024A0008F1EB0606228480010000000003B
:10125000000A180F5E7020220301113010000800F0
:101260000080800F1822200710E301008042000850
:1012700020C180000500022010E3210000020404C8
:10128000020000010103061800E050808000000009
:1012900001021011030A04012464C4CC9838F0C080
:1012A0000C1606060C181E000C16160C16160C0052
:1012B00000003048487830000C16060C06160C006A
:1012C00002A9059C18904143D0B01000C02810809E
:1012D0000229051C5810C043C08001180800108264
:1012E0008A2905C484440883C0880001000C148046
:1012F000800620C38000489B8000000909000092FE
:10130000000000000000000500000000000080D088
:10131000000001000C06070F00000080C0B060C094
:101320000000000000000000000000000000206835
:101330000000000000070E10000000003C4E83007B
:10134000000000000000000000000000000000801D
:101350001C10101C06061C001E06060C0C0C0C00B3
:101360000C16160E06061C0000000000007020601F
:10137000000000000101043A00000000002050C0FD
:1013800005020010180C030030E0C0048098F00043
:10139000181000080000000000000000000000001D
:1013A0000304040808000000F4181C1408000000DE
:1013B000030604020000000000000000000000001E
:1013C0000771EEFE7F726201F0C0200E7C7EEE603F
:1013D000000000000000000000000000000000000D
:1013E0000001020800000000901010002000000022
:1013F000371725151A1B0D00D0A0B0D8D8B0200083
:1014000000000000000000000000000000000000DC
:1014100000000000000000000000000000000000CC
:1014200000000000000000000000000000000000BC
:1014300000000000000000000000000000000000AC
:10144000000000000000000000000000000000009C
:10145000000000000000000000000000000000008C
:10146000000000000000000000000000000000007C
:10147000000000000000000000000000000000006C
:1014800060B0B46BBBBF64000000926D6DFF920052
:10149000000000000000000000000000000000004C
:1014A000000000000000000000000000000000003C
:1014B000000000000000000000000000000000002C
:1014C000000000000000000000000000000000001C
:1014D000000000000000000000000000000000000C
:1014E00000000000000000000000000000000000FC
:1014F00000000000000000000000000000000000EC
:10150000003BFDA0A101000867FD8A8A0498DF4A1C
:10151000F3FDA1A0106CDF1AE3FD91A02010DF08FD
:1015200073FD91880959D31FECFD858809821FD866
:10153000BCFD9091619AD22F99E7FD9284B193C836
:1015400072DFFD908139538ACBFD909020B9DF0A7C
:101550000159FE84C908544F86FDA89810A15FC8A0
:10156000C6FFA1C0402BDF4800CCFC90A02010009B
:101570000000000000000103000000004850E0F8F7
:10158000080700000000000028E70000000000003D
:1015900028E700000000000028E70000000000002D
:1015A00028E80700000000002827E00000000000F5
:1015B00028E80700000000002827E00000000000E5
:1015C00028E700000000000028E7000000000000FD
:1015D00028E80700000000002827E00000000000C5
:1015E00028E700000000000020E0000000000000EC
:1015F0000307070C18100000C08000000000000066
:1016000000808000000000000000000000000000DA
:10161000C02020E0000000000000000000000000EA
:10162000F00808F8000080800000000000000000C2
:10163000FC82827E00C0202000000000000000002C
:101640003FA0A09F00F008080080808000000000FC
:10165000CF2828E700FC8282C02020E000000000A4
:10166000F30A0AF9003FA0A0F00808F80000808003
:10167000FC82827E00CF2828FC82827E00C020204F
:10168000000000000000000000000000000000005A
:10169000000000000000000000000000000000004A
:1016A00080000000000000000000000000000000BA
:1016B000E00000000000000000000000000000004A
:1016C000F800000000000000000000000000000022
:1016D0007E0000000000000000000000000000008C
:1016E0009F000000000000008000000000000000DB
:1016F000EF00000000000000E0000000000000001B
:10170000C7A86C08C0206880F30A2C1800101808BD
:10171000C7A86C08C0A0A8A0FF00241800100800EB
:10172000C0AA6C08C0A0E8007F8024180010080040
:10173000C1AA6C08C0A0A8A4FC822418001008004C
:10174000C7A86C08C0A0A8A0FF002418001008E0DB
:10175000C6AA6C08C0A0A8A07F80241800100800AA
:101760004B4C484C4B484848000C5041910E0000EF
:10177000006384088C730000000C1041518E00003F
:10178000C46A0A3E0000000000FC82827E00000065
:10179000A06C0A7A3E000000FE84887200000000FF
:1017A00044EA0A3E00000000FC82827E0000000045
:1017B000AE6A8E0000000000DCD2223E0000000075
:1017C000A46A0A3E000000002ED26600000000005D
:1017D000A46A0A3E000000009CD2AA660000000035
:1017E0004848A850200000000162800A897000006B
:1017F00089092929C90909090909150A04000000EC
:101800000000000000000201000000000000F0B82D
:1018100000060C08080C070000000000000000FC97
:10182000000000000000070F000000000000F8FCAE
:101830000000000000000F1F000000000000E0F0AA
:10184000D8F8787060C08000000000000001030438
:1018500000000000C0809000000000000000003F79
:1018600000000000000000C0000000000000007F39
:101870000000000000000001000000000000000067
:10188000000000000000000100000000000101FF56
:10189000071F3C70E0C08000FF8F010000000000C7
:1018A0000CCCEC7C3C1C0C040E0707030303010169
:1018B000181898D8D8F8F8F8383C3E3F3F3F3F3FDB
:1018C00000000103070E0CFC1F7FE08000000000F9
:1018D000F0FC1E07010000007F606060E0E0602017
:1018E000E070783C3E3E1F1FFFC1C1C1C1C1C1C1F4
:1018F00080C0E0F0F8F8F8F8282828201008030045
:10190000070F1C387060E0C0FF0101010101017F79
:10191000000103070F1F1F1F00F8FEFFFFFFFFFF5F
:10192000020201018180C0C0000000000090909878
:10193000F8F8F878783939393F3860C0C08080814C
:10194000FC040404040404FC00071F3F7F7FFFFF26
:1019500000C0F0F8F8FCFEFE20101008080804048F
:101960000F0F0F0707030383C1C1C1C1C1C1C1C1AB
:10197000F8F8F8F8F8F8F8F8040404040810C000BF
:10198000C0C1C1C0C0C06070C0F8F8F8F8380E031C
:101990003F3F3F3F3F3F1F9FF8E0C0C080808080B7
:1019A00060606060606060C098989C9C9E9E9E9FF6
:1019B0001919090909010000838383818180C0C04E
:1019C00080C1C1C1C161380CFFFFFFFEFEFCFC7C81
:1019D000C38303030303030604040404040404048C
:1019E0008181C1C0E0E0F0F0C1C1C1C1C14141018C
:1019F000F8F8F8F8F8F8F8F8000000000000000126
:101A000030383C1F0F07070F00000000C0F0FCFE3D
:101A1000CF673F1F0F0603038081C7FFFC00000054
:101A2000C08001010302060C9F9F1F1F1F1F1F1F65
:101A3000808080C0C0E0E0F06070383E3F3F7FDFD4
:101A40000703010180C0E0F07C3C9CDE6F67303012
:101A5000060C1878F0C0000004040C080818106088
:101A6000F0F8F8F8FCFCFEFE0101010101010101A2
:101A7000F8F8F8F8F8F8F8F803030D1E1E0C00004B
:101A80000F191830302060C0FEFEFE3C0000000040
:101A90000202020202020707000000010FFFFFFF1F
:101AA0001C3C7FFFFFFFFFFF1F1FFFFFFFFFFFFF2C
:101AB000B0B19F9F87868783CF8783000000000097
:101AC000F0F0F0E00000000020202020282F3F7FD1
:101AD000000001071FFFFFFF60E0E0FFFFFFFFFFC7
:101AE000FEFFFFFDFDFCFCFC010101FFFFFF7F3F4E
:101AF000F8F8F8F8F8F8F8F800000000307878B056
:101B0000C0703C1F0F07030100000001FFFFFFFF33
:101B10000D1B7FFFFFFFFFFFFFFFFFFFCFC0800018
:101B2000FFFEF8F0800000007F3F00000000000092
:101B30008301000000000000C0E0F07C3F1F0F07A1
:101B40000001030FFFFFFFFFFFFFFFFFFFFEFEFC93
:101B5000FFFFFF3F00000000FFF7E08000000000F3
:101B6000FCF80000000000001F0F00000000000053
:101B7000F8F0000000000000C0C08000000000007D
:101B80000000000000000000FF7F1F0700000000B1
:101B9000FFFEF8E00000000001000203050106005E
:101BA0000404040CB8000000000000000000010064
:101BB00000000000000010C803000000000000004A
:101BC000FFFF0F0000000000F8F0C0000000000060
:101BD0000000000000000000000000000000000005
:101BE000060C0C0305050000603030C0A0A000000A
:101BF000020D080000003F004080E04040C080002F
:101C00001F7FFFFF7F7F3C0F00000080C0406020EF
:101C100000000001030206060000000000010005AC
:101C2000050C0A16A0240548E05010B0A6018F2527
:101C30000000000000808040F0FDFEDFDFBD7EFF81
:101C4000073FFFFFFFFFFF77F0FBFFFFBFBD7DFA00
:101C50001FFFFFFFF7F7FBFDF8F9FFFFFDFDFB7727
:101C600007EFFFFFFFBFBFDF80E3FFFFFFFBF7F7DB
:101C700001C3FFFFFDF5EEC1F0FFFFFFFFFEFDFD1D
:101C80000000000000000000303010181818183054
:101C90001C0C30226642412600030302C2221406B5
:101CA00008001F7E7D1E0719DA00F8E040C080089A
:101CB00080A080640E1C0C0CFC00000000000000E2
:101CC0000700000000000000E0000000000000002D
:101CD0003C000000000000000000000000000000C8
:101CE0003F0F000000000000E800000000000000BE
:101CF000000000000000000078000000000000006C
:101D00000FFFFFFBF7F7EF8200000000000001006B
:101D100000000318360E46A0010704168605058547
:101D2000EDFD0303F3E5C1E00D1E202000070303D2
:101D3000C2C6246828A8E8E2000060504C5D183153
:101D400000000000000000C0F0FFFFFFFFDE3EFDCE
:101D500003DFFFFFFFFFDF9F80F8FCDEEEECF4F017
:101D6000000003070E1C1B360379FCEE9F0BD97392
:101D7000AA4EAB70A44C8CE3000020D0A8140A9AA1
:101D8000000000000000000000040D021515041200
:101D9000A4C802A8EA02A8A0C545A54402A3818060
:101DA000E0F4E6D5070080E30707E39BD0081DFFBA
:101DB000E6E4A82000C0801022440C1831E3C60CD1
:101DC000707078C09C061743E0000000000000001F
:101DD0003F0E000000000000E000000000000000D6
:101DE0003C6D6FD6E2D4E3D490A157A72F1B3F7D63
:101DF0000442353222201A9D0D0D7216A31F63571F
:101E0000000000000000000010071E0C18342E26F1
:101E100002F30B367C79B993550607538B63296916
:101E20000F834020B89EDFEFD8200107070ECC813A
:101E3000141198216B52D483668000006088099940
:101E40000000C060203818C400000000000000003E
:101E500000428100003C660600428100003C6606AC
:101E6000D5E3D563F2A67D5585C29EBBEF47330906
:101E70005CB0000911120418112519251A624105D8
:101E80000000000000030C00141B181878789090D4
:101E90004E3A06040C1B264E61C00CC4B0984C266A
:101EA000F7F3F8BF574F2710E3C78EF7ECD9EAE0F6
:101EB000A7238045830080C479004488888A8A8A61
:101EC000C5F8C0A080A0A0A0000000004010381CF1
:101ED0000C30607E000000001C06663C0000000024
:101EE00039291C0F0503000080C0AA15C060D83C2A
:101EF000C30454AAA0430CF3CA021428D020C00083
:101F00002569DBF7F56B6A0AF0E0C1C284810F0F27
:101F1000CE9D3B60E1C81A349FCFC763F17C3E1F62
:101F20000780E0F8FFBF5B2CD0010119F2E4CCD9A7
:101F300060F0F3E74F1FAE7468C60CC08206071D41
:101F4000C21A3327168B45A6CC629199470200002E
:101F500000428100000E1E3600428100007E607C3F
:101F600000428100003C666600428100003C6666DB
:101F700000428100003C666000428100007E060C49
:101F80008A6864381C0600000E0C040200C0C24FB0
:101F900005E9FAB2020D024187C301F8FCFCF0E149
:101FA000178B86E3380F8CF0F3C6DCF102FEE007F6
:101FB0002103800103383E0E25052531B939000281
:101FC00043514060F0200000061C10C08C880000C7
:101FD000667E0606000000006606663C0000000003
:101FE0003C66663C000000003E060C380000000025
:101FF0007C66663C000000001830303000000000B5
:00000001FF

View File

@@ -1,513 +0,0 @@
:1000000000000000000000000000000000000000F0
:1000100000000000000000000000000000000000E0
:1000200000000000000000000000000000000000D0
:1000300000000000000000000000000000000000C0
:1000400000000000000000000000000000000000B0
:1000500000000000000000000000000000000000A0
:100060000000000000000000000000000000000090
:100070000000000000000000000000000000000080
:100080000000000000000000000000000000000070
:100090000000000000000000000000000000000060
:1000A0000000000000000000000000000000000050
:1000B0000000000000000000000000000000000040
:1000C0000000000000000000000000000000000030
:1000D0000000000000000000000000000000000020
:1000E0000000000000000000000000000000000010
:1000F0000000000000000000000000000000000000
:1001000000000000000000000000000000000000EF
:1001100000000000000000000000000000000000DF
:1001200000000000000000000000000000000000CF
:1001300000000000000000000000000000000000BF
:1001400000000000000000000000000000000000AF
:10015000000000000000000000000000000000009F
:10016000000000000000000000000000000000008F
:10017000000000000000000000000000000000007F
:10018000000000000000000000000000000000006F
:10019000000000000000000000000000000000005F
:1001A000000000000000000000000000000000004F
:1001B000000000000000000000000000000000003F
:1001C000000000000000000000000000000000002F
:1001D000000000000000000000000000000000001F
:1001E000000000000000000000000000000000000F
:1001F00000000000000000000000000000000000FF
:1002000000000000000000000000000000000000EE
:1002100000000000000000000000000000000000DE
:1002200000000000000000000000000000000000CE
:1002300000000000000000000000000000000000BE
:1002400000000000000000000000000000000000AE
:10025000000000000000000000000000000000009E
:10026000000000000000000000000000000000008E
:10027000000000000000000000000000000000007E
:10028000000000000000000000000000000000006E
:10029000000000000000000000000000000000005E
:1002A000000000000000000000000000000000004E
:1002B000000000000000000000000000000000003E
:1002C000000000000000000000000000000000002E
:1002D000000000000000000000000000000000001E
:1002E000000000000000000000000000000000000E
:1002F00000000000000000000000000000000000FE
:1003000000000000000000000000000000000000ED
:1003100000000000000000000000000000000000DD
:1003200000000000000000000000000000000000CD
:1003300000000000000000000000000000000000BD
:1003400000000000000000000000000000000000AD
:10035000000000000000000000000000000000009D
:10036000000000000000000000000000000000008D
:10037000000000000000000000000000000000007D
:10038000000000000000000000000000000000006D
:10039000000000000000000000000000000000005D
:1003A000000000000000000000000000000000004D
:1003B000000000000000000000000000000000003D
:1003C000000000000000000000000000000000002D
:1003D000000000000000000000000000000000001D
:1003E000000000000000000000000000000000000D
:1003F00000000000000000000000000000000000FD
:100400007FEFEF96FCFDE7CFFFF3EF2FFFFFFDFB44
:10041000FFDFDFFFFF9877EFFFBB77F7FB7BFFEF97
:10042000FE7F7FF0EFDFBFBF0FEFEFDF5FEFFFF982
:10043000FFCFBF7F7F7FBFDFFFE7DFDF3D7BEFF7D2
:10044000CDBBBB977777EBDCFFFBF7F7F7FBFFF351
:10045000FFEFDFDF9F8F767EFEDEBEBEDE32EEEE8A
:1004600060E06C62626E6C000000CC2222EECC0078
:1004700060E06964646D69000000249292B6240013
:100480009F04000000000000FF00000000000000CA
:10049000EF07000000000000F7010000000000006E
:1004A0008F07000000000000F703000000000000BC
:1004B000FE000000000000003B0200000000000001
:1004C000DF20000000000000EF0600000000000038
:1004D000BF30000000000000DC0000000000000051
:1004E0001E10111C06071C000000984444DC9800F4
:1004F0000000661111776600000000000000000097
:10050000609086E1B1B76600F03036316167660011
:1005100070989A71999B760060B0B6713137E60099
:10052000F8F0F3F3F38000FFF8F0F3F3F38000FF4B
:100530007F7F7F7F40000000FFFEFEFE00007F7F88
:10054000007F7F7F7F4080FE00FFFEFEFE00007F79
:100550007F7F7F7F4000FFFEFFFEFEFE0000000069
:10056000F8F0F3F3F38000FFF8F0F3F3F38000FF0B
:10057000F8F0F3F3F38000FFF8F0F3F3F38000FEFC
:1005800070981A3161C7FA0070981A31199B760079
:10059000103072B1B1FB3600F08086E13137E600F1
:1005A000FF0000FC80800000FF0000FC8080000055
:1005B00000000000000000007F7F400000000000FD
:1005C000FEFE0000000000007F7F400000000000F1
:1005D000FEFE00000000000000000000000000001F
:1005E000FF8000FC80800000FF0000FC8080000095
:1005F000FF0000FC80800000FE0000FC8080000006
:10060000CF88880000FC8080CF08080000FC808034
:10061000FFEFBF777D3F1D07FFF7FDEEBAFCD8E087
:10062000000000000001030700002070F8F0E0C0A7
:100630002F3F3E3C3E000000800000000000000014
:100640000000000000000101000000000000004068
:1006500000000000010107010000000000408000D0
:10066000000001010701040600000040800040680E
:100670000F08080000FC8080CF08080000FC808084
:100680000000CF88880000FC0000CF08080000FCB4
:100690000000000001010701000000000040800090
:1006A000000001010701040E0000004080004068C6
:1006B00001010701040E1F130040800040680090F4
:1006C0000701040E1F13191C800040680090307051
:1006D000040E1F13191C3E3F40680090307078389C
:1006E0001F13191C3E3F3F3F00903070783898C868
:1006F00000000F08080000FC0000CF08080000FC04
:100700006F60404000C0C0C07E04040400040404C4
:100710000F08080000FC8080CE08080000FC8080E4
:10072000F8FCFCFDFEFEFDFBFCF8F8F8F878789884
:10073000F7FBFDFFFFFEFCFDE4C8C898B838F8F8E9
:10074000F0F9F9FBF0C6FEFFFCF8F8F8F8F8783895
:10075000FFFFF1CEFFFFFFFF8C9878783838B8B8EC
:10076000FFFFFFFEFEFEFDFDFCF8F8F8F8F8F8F8D4
:10077000FFFFFFFFFFFFDFEF7C38B8B8D8E0F8F8E5
:1007800000404040004040C0000404040004040451
:1007900000000F08080000FC0000CE08080000FC64
:1007A000C4880000000000000000000000000000FD
:1007B000C0800000000000000000000000000000F9
:1007C000C0800000000000000000000000000000E9
:1007D000C0800000000000000000000000000000D9
:1007E000C0820000000000000000000000000000C7
:1007F000C0840000000000000000000000000000B5
:10080000FFFFEFCFFFFFFFEFFFFEFCF8FEFEFEFC59
:1008100000FFFFEFCFFFFFFF00FFFEFCF8FEFEFE34
:100820000000FFFFEFCFFFFF0000FFFEFCF8FEFE21
:10083000FFFF8301393F3901FFFEC68292920038E3
:10084000FFFF03013901033FFFFE8000383E3800FF
:10085000FFFF830139393901FFFE381000002838C5
:1008600000FEFCFCFC000F0FFEFCFCFC0000EFCFC8
:10087000FEFCFCFC0000EFCFFEFCFCFC0000EFCF18
:10088000CF80000000000000F80000000000000021
:10089000EFCF800000000000FCF800000000000026
:1008A000FFEFCF8000000000FEFCF8000000000019
:1008B000830000000000000038000000000000007D
:1008C0003F800000000000008200000000000000E7
:1008D00083800000000000003800000000000000DD
:1008E0000F0F000000000000CFCF0000000000004C
:1008F000CFCF000000000000CFCF000000000000BC
:1009000000FEFCFCFC0000EFFEFCFCFC00000FEF16
:10091000FEFCFCFC0000E0CF00FEFCFCFC000FEF46
:10092000FEFCFCFC0000EFCF00FEFCFCFC00E0C085
:1009300060B0343262C6F40060B0346232B6640033
:10094000103074B2B2FA1400000000000000000081
:10095000FFFFFEEFDFB2E2E7F8F070B0D0602020DA
:10096000FFFFFEEF5F32A2A7F8F070B0D06020204A
:10097000E7E7E7EF5F32A2A7E8C810B0D060202019
:10098000CFCF0F0800000000CFCFC0000000000054
:10099000CFCF0F0000000000CFCFC000000000004C
:1009A000CFCF000000000000C0C000000000000029
:1009B000F08084E23236E400609084E2B2B66400F3
:1009C000F0303462626664000000924949DB9200B4
:1009D000DAEFF5FFFCFFFFFFD0B03070F0F0F0F081
:1009E0001AEFC59F3CFFFFFFD0B01040E0F8F0F0D9
:1009F0001AEFC59F38F3F3E7D0B050E0F8F0F0F00D
:100A000000F8F1F1F3F28003F8F0F3F3F3800077EC
:100A1000F8F0F2F2F08200F8F8F0F3F3F380007BE4
:100A200000F8F3F3F3F08000F8F0C1D393A0007F57
:100A3000F8F0F0F3F38300E8F8F0F3F3F3800063E9
:100A4000F8F0F0F3F38300F000F8F0F3F3F3800034
:100A5000F8F0F3F3F38000FCF8F0F3F3F38000FF19
:100A6000F8F0F3F3F38000F700F8F3F3F3F080030A
:100A7000F8F0F3F3F38000F8F8F0F0F3F28200F806
:100A80007E7C40000000000067E78400000000005A
:100A9000FFFF000000000000E70702000000000068
:100AA000F0FC000000000000FFFF800000000000DC
:100AB000CE9E0000000000006767480000000000B4
:100AC000E6E60400000000007F7F20000000000038
:100AD000FCFF0000000000007F3F4000000000001D
:100AE000E7CF080000000000C7E708000000000092
:100AF000F8FE000000000000FC7C40000000000048
:100B0000EFCF9837EFEF97FFFFF16FEFF7FFE7DFDA
:100B1000FAF7EFEFF7BF72EEDF9F9F31AF3F1F9FF6
:100B2000FFFFC3BF7F7F7FBFFF7F7FFFF1EFEF6FCF
:100B3000FE7C7C7CFCF1E5E4FFCFBFBFF9F7EF2F33
:100B4000DFCECEA767E7C298F7E7EDCBCB8F27F3D1
:100B5000FECDB57E7C7B7BFE3FFFFF9DCBCB8733FD
:100B6000FFE3DFBFBFBFFFBFFF3A96CEE2E9D0EEA3
:100B7000E56480CF1F32A227E8C810308040000013
:100B8000FFE0000000000000DF180000000000008F
:100B9000EE0C000000000000CF8800000000000004
:100BA000DE00000000000000FF80000000000000E8
:100BB000CF100000000000008F06000000000000C1
:100BC0009C20000000000000F9410000000000002F
:100BD000F100000000000000F30100000000000030
:100BE0007F40000000000000EE0C0000000000004C
:100BF0001AAF859F00D3C3C7D0B01040E038309003
:100C00000000046DFD7F7F3F000000B7FCFCFDFF8E
:100C10000000007CEFEFFFFF000040DAF7F7FFFF76
:100C20000000103DF7F7F7FF000004ACDFDFFFFF27
:100C3000000000313F7FFFFF00008093F3F7FFFFCC
:100C4000000000297FFFFFFF0000008CDECEDEFCED
:100C50007076FE8C030F3F001C1F7BE1C1B77F182D
:100C6000030FDEBC33EFDF8C30F8FD831F6EFCE03A
:100C700030F8FD831F6EFCE03873FFC3A07BFF1FBD
:100C80001F03000000000000BF1C00000000000067
:100C9000DF8F000000000000FDD800000000000011
:100CA000FD78000000000000FFF6000000000000DA
:100CB000EFC7000000000000FFCE000000000000B1
:100CC000EFC7000000000000F080000000000000FE
:100CD00070C00000000000000800000000000000DC
:100CE000000000000000000068200000000000007C
:100CF0008000000000000000000000000000000074
:100D0000387CFDC337FEFCC821F7FFDC08E17B3FE0
:100D1000C6EDEB0F3EFCF0C00CDFEFF0381F0F0705
:100D200001C3EFDE39F3E3C0C6CFBF79A6C78301A5
:100D300066EFBF990081F3FF0C9EF1E04099FEF44D
:100D400000FC82827E000A09F296966E00CFA868A7
:100D5000E4AAAA4E00C02D29FC82827E000FE8285A
:100D600000FC82827E802F28BC22D26E000FC82811
:100D7000FC82827E00CF282A00FC82827E00A8A806
:100D800000000000000000001E0400000000000041
:100D90000000000000000000000000000000000053
:100DA0000000000000000000000000000000000043
:100DB0002E0C000000000000600000000000000099
:100DC00007000000000000002700000000000000F5
:100DD000EA06000000000000A7600000000000001C
:100DE000E80700000000000027E00000000000000D
:100DF000E400000000000000E70000000000000028
:100E000000FC82827E802C2800FC82827E00886822
:100E1000F892AE6600CF2828FC82827E004F688858
:100E2000F884887200C02D2DFC82827E000FC828B5
:100E3000FC82827E00CE2A2D00FC82827E00A020D1
:100E400000002008440823E60000000002080178A2
:100E500000004080508CE30000001000480083D860
:100E6000000000008430FFE60002000400E11B786F
:100E70000000000210848001000000008078C0E0C3
:100E8000E9070000000000006720000000000000EB
:100E9000E7000000000000008700000000000000E4
:100EA0000100000000000000E00000000000000061
:100EB000E400000000000000E0000000000000006E
:100EC00000001C006007C00000C7000007C00070E1
:100ED000183F00C60063001F0600023800E007004C
:100EE00000001C006007C00000C7000007C00070C1
:100EF000F0800F00780007E083720003D00E00003E
:100F0000000020000844847800000802400000E34C
:100F1000000004200002C70000000002000083005F
:100F20000000000002000D11000000004080B088A9
:100F30007FFFE04020100807EFD51A08081836EDAB
:100F4000871F3860C0804046DEE9331610303266B5
:100F50007C695336040C082478F28E0607010337A7
:100F60000F3F706060604038F8FE62070F0B066E3E
:100F70001C3C73636343263EFE6658003C7A614323
:100F800000AC000C61003F00003C0007D0001C00DA
:100F90007800E3005E00C0079E00F900300600857F
:100FA0001F3931111F1F0F00F89C8C88F8F8F000D2
:100FB0001330000000000000C70300000000000024
:100FC0003F8F400000000000CD8B000000000000BB
:100FD0006259000000000000FEF800000000000060
:100FE0001F03000000000000FCF0000000000000F3
:100FF0001C000000000000002E1C0000000000008B
:101000000F3F3F7F7F7F7F3CC7E6C0C0C0C68F8F4A
:101010000F3F7F787001073F868F1E1C10C0F0F8CD
:101020001F3F7F7F7F7F7F3E84E6CF8E8E8E0C1C9E
:10103000060E06060606060000000000000000403E
:1010400000000000000103070000000000C0E0E015
:1010500003033F3E3F3F3F3E8080FFFFFFFFFFFF18
:101060000303FFFEFFFFFFFE8080FCFCFCFCFCFC9A
:1010700003033F3E3F3F3F3E8080FFFFFFFFFFFFF8
:1010800000000000000000000E1C00000000000036
:101090007F38000000000000240000000000000075
:1010A0000000000000000000180000000000000028
:1010B000040E040021732100E0400018108000009D
:1010C0000F1F1F3F3E786000E0C08000000000005E
:1010D0003F3F3F3E3F000103FFFFFFFFFF00008057
:1010E000FFFFFFFEFF000103FCFCFCFCFC00008096
:1010F0003F3F3F3E3F000103FFFFFFFFFF00008037
:101100000303FFFEFFFFFFFE8080FCFCFCFCFCFCF9
:1011100000000000000000000000000000000000CF
:1011200000000000000000000000000000000000BF
:1011300000000000000000000000000000000000AF
:10114000003C7EFFFFFFFDE6003C7EFFFFFBFBDB7C
:10115000000000000000000000000000000000008F
:10116000000000000000010300000000000080C03B
:10117000000000000000000000000000000000600F
:10118000FFFFFFFEFF000103FCFCFCFCFC000080F5
:10119000000000000000000000000000000000004F
:1011A000000000000000000000000000000000003F
:1011B000000000000000000000000000000000002F
:1011C000EEEEEEBCC1FFFFFFFBFBFBFE80FFFFFF6F
:1011D000000101000C101000C080000000000000A1
:1011E0000307070F1E182000E0E0C0800000000089
:1011F000060F0F06317B7B31F000000080C0C080FD
:1012000000000103030311380000008080808884FF
:10121000000000000001040C00000000000000605D
:101220000C1C2C2C3E0C0C000C12101C16160C0066
:101230001838191A1A1B190000008C5252DE8C0043
:10124000C184800E1FF2A2A5C08010208040000043
:101250000030020E1F3222250000E04080481000BE
:10126000C300003E1FB0A2A0E7000000000038103D
:10127000C300000E08A0A080E7000000000C0000E2
:101280002C0707060E0C08000000A010000000004C
:101290000913030604040000C080000000000000E1
:1012A0000C1606060C181E000C16160C16160C0052
:1012B00000003048487830000C16060C06160C006A
:1012C000188E801700C3828400000040A0102010F8
:1012D000180E005700008384000000000000E0109A
:1012E000100E8007080803C4081001000040E01039
:1012F0001008C004001013C4000001000000C0600A
:10130000000000000000000500000000000080D088
:101310000000000000010C1F000000000040903899
:10132000000000000000000100000000000000803C
:10133000000000000000010300000000000040E089
:10134000000000000000030F000000000000E0F8B3
:101350001C10101C06061C001E06060C0C0C0C00B3
:101360000C16160E06061C0000000000000000000F
:101370000000000000001821000000000000201004
:101380000707070304020000F0F0F0E01820000057
:101390003F3F3F1F0F030000FCFCFCF8F0C00000C3
:1013A0000306070D0F0E070000E0C068F0D0E00054
:1013B000070F0F0F07030300E0F0F0F0E0C000009C
:1013C0001F0F010101020000FCFCF8F0000000000A
:1013D000000000000000000000000000000000000D
:1013E00000000C1E1E0C0000000000307878300059
:1013F0002222120201000000101000000000000074
:1014000000000000000000000000000000000000DC
:1014100000000000000000000000000000000000CC
:1014200000000000000000000000000000000000BC
:1014300000000000000000000000000000000000AC
:10144000000000000000000000000000000000009C
:10145000000000000000000000000000000000008C
:10146000000000000000000000000000000000007C
:10147000000000000000000000000000000000006C
:1014800060B0B462B2B664000000924949DB9200D9
:10149000000000000000000000000000000000004C
:1014A000000000000000000000000000000000003C
:1014B000000000000000000000000000000000002C
:1014C000000000000000000000000000000000001C
:1014D000000000000000000000000000000000000C
:1014E00000000000000000000000000000000000FC
:1014F00000000000000000000000000000000000EC
:101500000000EEDCDC80000F00EEF4F48000AB8D18
:1015100000EEDCDC8000EDCD00CEECDC8000EFC71F
:1015200000DEECF48000E0CB00FAF8F480000EEF6F
:1015300000F6ECEC8000E0C60000DEECF800018F65
:101540000000F6ECFC80014D00F6ECEC8000EBCDE9
:1015500000005C78B480008B00F6D4E480000DAF0E
:1015600000DCDCBC8000AE8F0000EEECDC8000C054
:10157000000000000000010300000000000080C027
:101580000F08000000000000CF080000000000006D
:10159000CF08000000000000CF080000000000009D
:1015A000CF0F080000000000CFC8000000000000BE
:1015B000CF0F080000000000CFC8000000000000AE
:1015C000CF08000000000000CF080000000000006D
:1015D000CF0F080000000000CFC80000000000008E
:1015E000CF08000000000000C00000000000000064
:1015F0000307070F1E182000E0E0C0800000000075
:10160000800000000000000000000000000000005A
:10161000E0C0C0000000000000000000000000006A
:10162000F8F0F00000800000000000000000000062
:10163000FEFCFC8000E0C0C00000000000000000D4
:10164000BF3F3F2000F8F0F08000000000000000E5
:10165000EFCFCF0800FEFCFCE0C0C000000000009F
:10166000FBF3F30200BF3F3FF8F0F0000080000002
:10167000FEFCFC8000EFCFCFFEFCFC8000E0C0C091
:10168000000000000000000000000000000000005A
:10169000000000000000000000000000000000004A
:1016A000000000000000000000000000000000003A
:1016B000000000000000000000000000000000002A
:1016C000000000000000000000000000000000001A
:1016D000800000000000000000000000000000008A
:1016E00020000000000000000000000000000000DA
:1016F00000000000000000000000000000000000EA
:10170000EFC78000E0C80080FBF330100018101015
:10171000EFC78000E0C8C0C0FFFF381000181000FD
:10172000ECC48000E0C880807FFF381000181000F3
:10173000EDC48000E0C8C0C6FEFC381000181000E0
:10174000EFC78000E0C8C0C0FFFF3810001810F2DB
:10175000EFC48000E0C8C0C07FFF38100018100040
:10176000F3F4F4F0F0F0F0F0804E111000000000FF
:1017700000738C8400000000008E511000000000F7
:10178000EE8404C00000000000FEFCFC80000000AD
:10179000C0860484C0000000FCF8F2840000000051
:1017A0006E8404C000000000FEFCFC00000000008D
:1017B000C4840000000000009E9CBC4000000000AB
:1017C000CE8404C000000000309C880000000000AF
:1017D000CE8404C000000000DE9CCC880000000025
:1017E000F0F070200000000001728A80000000000C
:1017F000DE3E1E1E1E1E1E1E1E1E0E0400000000CB
:101800000000000000000201000000000000F0B82D
:10181000070F1F1F1F07000000000000000000FC52
:10182000000000000000070F000000000000F8FCAE
:101830000000000000000F1F000000000000E0F0AA
:10184000D8F8F890800000000000000000000C1F95
:1018500000000000C080E0F8000000000000003F31
:1018600000000000000000C0000000000000007F39
:101870000000000000000001000000000000000067
:10188000000000000000000100000000000101FF56
:10189000071F3F7FFFFFFFFFFFFFFFFFFFFFFFFF70
:1018A0000FCFEFFFFFFFFFFDFCFEFEFEFFFFFFFF80
:1018B0001F1F1F1F1F1F9F9FF0F0F0F0F0F0F0F7A9
:1018C00000000103070F0FFF1F7FFFFFFFFFFFFF58
:1018D000F0FCFEFFFFFFFFFF7F7F7F7FFFFFFFEF3B
:1018E000E0E0E0F0F0F0F8F8FFFFFFFFFFFFFFFFA0
:1018F00080808080808080801F1F1F1F0F07000056
:10190000070F1F3F7F7FFFFFFFFFFFFFFFFFFFFF6F
:101910007F7F7F7F7C7C7878FFFFFF0703010000DB
:10192000FEFEFFFFFFFFFFFFFFFF7F7F3FBFBFBF49
:10193000DFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFF17
:10194000FDFDFDFDFDFDFDFDFFFFFFFCF0E0E0C046
:10195000FFFFFF3F1F0F0707EFF7F7FBFBFBFDFD47
:10196000F8FCFCFEFEFEFFFFFFFFFFFFFFFFFFFF97
:101970008080808080808080F8F8F8F8F0E00000B7
:10198000FFFFFFFFFFFF7F7FC09F9FDFFFFFFFFF86
:1019900070F0F0F0F0F0F8F8000000000000000037
:1019A0007F7F7F7F7F7F7FFFBFBFBFBFBFBFBBBBCF
:1019B000FFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFF38
:1019C000017F7FFFFFFFFFFFC080808080C0C0409D
:1019D0000303030303030307FDFDFDFDFDFDFDFD03
:1019E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07
:1019F00080808080808080800000000000000001E6
:101A00003F3F1F0F0301060FFFFFFFFFFFFF7F0F89
:101A1000FCFCF7FBFDFDFEFE000107FFFFFFFFFFE3
:101A2000FFFFFFFFFFFEFEFDBBB9397878F8F8F83D
:101A3000FFFFFFFFFF7F7F7FFFFFFFFFF7F3F8FC54
:101A4000FFFFFFFFFFFFFF7FE0E0F0BCDFDFEFEF16
:101A5000070F1F7FFFFFFFFFFDFDFDFBFBFBF7EF08
:101A6000DFDFDFDFCFCFC7C7FFFFFFFFFFFFFFFFD6
:101A7000808080808080808003010C1E0C102040BC
:101A80000F1F1F3F3F3F7FFFC7FFFFFFFFFFFFFF0E
:101A9000FEFEFEFEFEFEFEFCFFFFFFFFFFFFFC0062
:101AA000FFFFFFE7C0800000F8F8F8F0000000003A
:101AB0003F3F1F1F03070703FEFFFFFFFFFFFFFF5F
:101AC0003FFFFFFFFFFFFFFFEFEFEFEFEFEFEFE075
:101AD000FFFFFFFFFFFCF000EFEFFFFF7F000000C4
:101AE000C7C3C3C181000000FFFFFFFFFF0000006C
:101AF0008080808000000000000000043878308082
:101B0000FF7F3F0F07010000FFFFFFFFFFFE000008
:101B1000FEFCF0E08000000000000000000000007B
:101B200000000000000000000000000000000000B5
:101B30000301000000000000FFFFFF3F1F0700003F
:101B4000FFFFFFFFFEF80000C0C0800000000000A3
:101B50000000000000000000000000000000000085
:101B60000000000000000000000000000000000075
:101B70000000000000000000C08000000000000025
:101B80000000000000000000000000000000000055
:101B90000000000000000000030100060E0E00001F
:101BA000F8F8F870000000000000000000000003DA
:101BB000000000000000E0F0000000000000000055
:101BC0000000000000000000000000000000000015
:101BD0000000000000001C0F00000000000038F0B2
:101BE0000F1D1D3C38381F00F0B8B83C1C1CF80015
:101BF0000C1E1F1F1F1F00004080E080800000009F
:101C00000F3F7F7FBF1C433000000000008080C07A
:101C100000000000000101010000000000010201BD
:101C20000F18170500A64303A08000A00210D9F0EA
:101C30000000000000000040E8F37DBFBF7BFD18FE
:101C4000031FFFFEFFEF4E88E8F5FFFF777BF2658D
:101C50002FBFFDFBF9F93C02E4FEFFFBFBFB6488B0
:101C60000B9FFFEFDFDF5F2F4091E3FFF7F7E8C83F
:101C700000A5CFFFEEEAD13EE8F1FF7FFDFD7A023D
:101C80000F00000000000000C0C0E0E0E0E0E0C0A5
:101C900003030B19193D3C180806040D01C0E08030
:101CA000AA00FFFEFD1E03E18800FEFC7EE0800727
:101CB00000802000000212A203FC000000000000CF
:101CC000F80F0300000000001FFCF00000000000FF
:101CD000C33C0000000000001F00000000000000E6
:101CE000C0300F000000000017F8C0000000000026
:101CF000C100000000000000877C00000000000020
:101D000013CFF7F7EFCB107D0000000000000000BC
:101D10000000031D788040C08740406061E3E3E33A
:101D2000F3E30105FDF3EBF31E1F00101F0F1787F0
:101D300000000004C6C6C6C6000000400010714284
:101D40000000000000000000C8F1FFFFDD3DF902C7
:101D500004AFFFFFFFDF3E6F4094FABDDDDAEA0C0F
:101D60000000010204081304071B9D6E9311E00795
:101D7000CC803346C9890CE30000C0E0B0180CECFD
:101D8000C3000000000000000206061C1E16161408
:101D9000C8CC88C8CC89C9C3E3E3430381C0C0C8A9
:101DA000FCFEF9EFF3F87F1F0F7F1FE7EF1FFEFC2C
:101DB000C6C6C4C4C0010D0D450B13274E1C38F018
:101DC00080E0C0001030648C1FF8000000000000AC
:101DD000C0310F000000000018E00000000000000B
:101DE00029294658A499A59918215BABB3023D7BDC
:101DF0001884DAD5CD409CDE1696631B2599A599EB
:101E0000000000000000000010000F0F0F2F27033C
:101E10000101C78FBF3E7E7C93C5C68602433371E6
:101E200003C06070383C1E8FE0C000000830F0F83E
:101E3000080808181133236418000173FBF3F260DB
:101E40001C1E8FEFF5C000F800000000000000002D
:101E5000003C7EFFFFFDE68E003C7EFFFFFDE68E30
:101E60009DA599A55A4629297B3D0233AB9B41305C
:101E70009E3C40CDD5DA841891A599251B734A164E
:101E80000000000000030F07232020204040C0C0B6
:101E9000B00000000100000171F170C0E0D84C36C4
:101EA000878380CCE672381FF0C001D9B3A61CF836
:101EB00063C7C78200000000010188CC8844CCCCF5
:101EC000F8C000C08040C0C00000000080E0F0F812
:101ED000FCF1E7FE80FFFFFFFDE6FEBCC1FFFFFF58
:101EE00015110904030000000F402AD515CA300F50
:101EF000E30454ABA8530FFCEC0C9830E0C0000096
:101F0000262C58F2F4642C0C81830604090A101064
:101F100010214381000C1C3809060301C0E0703811
:101F2000038060B0D86C361BE00103060D1B33E65E
:101F300040A060C2858B160C8C08000000010002D6
:101F4000000000010180C86438180EC7E0F0FC7C76
:101F5000003C7EFFFFFEFEF6003C7EFFFFFEE1FD43
:101F6000003C7EFFFFFDE6EE003C7EFFFFFDE6EE5F
:101F7000003C7EFFFFFDE6E8003C7EFFFFFE86FCA6
:101F80000C0C0501000000001012090404100000F0
:101F900079516323030E1C009CCEE7030000000070
:101FA0000C0781E0F83F03008C38E10003FFFC00E0
:101FB00059F363C6800000001A3ABABA320202002E
:101FC000AAB1B0900000000098C00000000000001E
:101FD000EEFE86FEF8FFFFFFE6CEFEBCC1FFFFFF70
:101FE000FCE6EEBCC1FFFFFFBEC6FCF9C3FFFFFF6E
:101FF000FDE6EEBCC1FFFFFFFBF3F7F7C7FFFFFFF6
:00000001FF

View File

@@ -1,315 +0,0 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
library work;
--SOUND CPU:
--0000-07ff RAM
--e000-ffff ROM
--read:
--a000 command from the main CPU
--write:
--2000 8910 #1 control
--2001 8910 #1 write
--4000 8910 #2 control
--4001 8910 #2 write
--WRITE_HANDLER( sonson_sh_irqtrigger_w )
--{
-- static int last;
-- if (last == 0 && data == 1)
-- {
-- setting bit 0 low then high triggers IRQ on the sound CPU
-- cpu_cause_interrupt(1,M6809_INT_FIRQ);
-- }
--- last = data;
--}
--void sonson_state::sound_map(address_map &map)
--{
-- map(0x0000, 0x07ff).ram();
-- map(0x2000, 0x2001).w("ay1", FUNC(ay8910_device::address_data_w));
-- map(0x4000, 0x4001).w("ay2", FUNC(ay8910_device::address_data_w));
-- map(0xa000, 0xa000).r("soundlatch", FUNC(generic_latch_8_device::read));
-- map(0xe000, 0xffff).rom();
--}
/* basic machine hardware */
-- {
-- {
-- CPU_M6809,
-- 2000000, /* 2 Mhz (?) */
-- readmem,writemem,0,0,
-- interrupt,1
-- },
-- {
-- CPU_M6809 | CPU_AUDIO_CPU,
-- 2000000, /* 2 Mhz (?) */
-- sound_readmem,sound_writemem,0,0,
-- interrupt,4 /* FIRQs are triggered by the main CPU */
-- },
-- },
entity sonson_soundboard is
port(
clk_2 : in std_logic;
clk_1p5 : in std_logic;
sound_rd : in std_logic;--a000 command from the main CPU
areset : in std_logic;
sound_data : in std_logic_vector(7 downto 0);
audio_out : out std_logic_vector(11 downto 0)
);
end sonson_soundboard;
architecture SYN of sonson_soundboard is
component YM2149
port (
CLK : in std_logic;
CE : in std_logic;
RESET : in std_logic;
A8 : in std_logic := '1';
A9_L : in std_logic := '0';
BDIR : in std_logic; -- Bus Direction (0 - read , 1 - write)
BC : in std_logic; -- Bus control
DI : in std_logic_vector(7 downto 0);
DO : out std_logic_vector(7 downto 0);
CHANNEL_A : out std_logic_vector(7 downto 0);
CHANNEL_B : out std_logic_vector(7 downto 0);
CHANNEL_C : out std_logic_vector(7 downto 0);
SEL : in std_logic;
MODE : in std_logic;
ACTIVE : out std_logic_vector(5 downto 0);
IOA_in : in std_logic_vector(7 downto 0);
IOA_out : out std_logic_vector(7 downto 0);
IOB_in : in std_logic_vector(7 downto 0);
IOB_out : out std_logic_vector(7 downto 0)
);
end component;
COMPONENT mc6809i
GENERIC ( ILLEGAL_INSTRUCTIONS : STRING := "GHOST" );
PORT
(
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOut : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
ADDR : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
RnW : OUT STD_LOGIC;
E : IN STD_LOGIC;
Q : IN STD_LOGIC;
BS : OUT STD_LOGIC;
BA : OUT STD_LOGIC;
nIRQ : IN STD_LOGIC;
nFIRQ : IN STD_LOGIC;
nNMI : IN STD_LOGIC;
AVMA : OUT STD_LOGIC;
BUSY : OUT STD_LOGIC;
LIC : OUT STD_LOGIC;
nHALT : IN STD_LOGIC;
nRESET : IN STD_LOGIC;
nDMABREQ : IN STD_LOGIC;
RegData : OUT STD_LOGIC_VECTOR(111 DOWNTO 0)
);
END COMPONENT;
signal reset : std_logic := '1';
signal reset_cnt : integer range 0 to 1000000 := 1000000;
signal cpu_addr : std_logic_vector(15 downto 0);
signal cpu_di : std_logic_vector( 7 downto 0);
signal cpu_do : std_logic_vector( 7 downto 0);
signal cpu_rw : std_logic;
signal cpu_irq : std_logic;
signal cpu_nmi : std_logic;
signal clk_2M_en : std_logic;
signal cpu_clk_en : std_logic;
signal cpu_reset : std_logic;
signal wram_cs : std_logic;
signal wram_we : std_logic;
signal wram_do : std_logic_vector( 7 downto 0);
signal rom_cs : std_logic;
signal rom_do : std_logic_vector( 7 downto 0);
signal ay1_chan_a : std_logic_vector(7 downto 0);
signal ay1_chan_b : std_logic_vector(7 downto 0);
signal ay1_chan_c : std_logic_vector(7 downto 0);
signal ay1_do : std_logic_vector(7 downto 0);
signal ay1_audio : std_logic_vector(9 downto 0);
signal ay1_port_b_do : std_logic_vector(7 downto 0);
signal ay2_chan_a : std_logic_vector(7 downto 0);
signal ay2_chan_b : std_logic_vector(7 downto 0);
signal ay2_chan_c : std_logic_vector(7 downto 0);
signal ay2_do : std_logic_vector(7 downto 0);
signal ay2_audio : std_logic_vector(9 downto 0);
signal ay1_control : std_logic;
signal ay1_write : std_logic;
signal ay2_control : std_logic;
signal ay2_write : std_logic;
signal ports_cs : std_logic;
signal ports_we : std_logic;
signal port1_bus : std_logic_vector(7 downto 0);
signal port1_data : std_logic_vector(7 downto 0);
signal port1_ddr : std_logic_vector(7 downto 0);
signal port1_in : std_logic_vector(7 downto 0);
signal port2_bus : std_logic_vector(7 downto 0);
signal port2_data : std_logic_vector(7 downto 0);
signal port2_ddr : std_logic_vector(7 downto 0);
signal port2_in : std_logic_vector(7 downto 0);
begin
-- cs
wram_cs <= '1' when cpu_addr(15 downto 12) = "0000" else '0'; --0000-07ff RAM 0000 1000 0000 0000
rom_cs <= '1' when cpu_addr(15 downto 13) = "111" else '0'; --e000-ffff ROM 1110 0000 00000000
ay1_control <= '1' when cpu_addr(13 downto 0) = X"2000" else '0'; --2000 8910 #1 control 0010 0000 0000 0000
ay1_write <= '1' when cpu_addr(13 downto 0) = X"2001" else '0'; --2001 8910 #1 write 0010 0000 0000 0001
ay2_control <= '1' when cpu_addr(14 downto 0) = X"4000" else '0'; --4000 8910 #2 control 0100 0000 0000 0000
ay2_write <= '1' when cpu_addr(14 downto 0) = X"4001" else '0'; --4001 8910 #2 write 0100 0000 0000 0001
--ports_cs <= '1' when cpu_addr(15 downto 4) = X"000" else '0'; -- 0000-000F
--adpcm_cs <= '1' when cpu_addr(14 downto 11) = "0001" else '0'; -- 0800-0FFF / 8800-8FFF
--irqraz_cs <= '1' when cpu_addr(14 downto 12) = "001" else '0'; -- 1000-1FFF / 9000-9FFF
-- write enables
wram_we <= '1' when cpu_rw = '0' and wram_cs = '1' else '0';
--ports_we <= '1' when cpu_rw = '0' and ports_cs = '1' else '0';
--adpcm_we <= '1' when cpu_rw = '0' and adpcm_cs = '1' else '0';
--irqraz_we <= '1' when cpu_rw = '0' and irqraz_cs = '1' else '0';
-- mux cpu in data between roms/io/wram
cpu_di <= wram_do when wram_cs = '1' else
sound_data when sound_rd = '1' else
-- port1_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"0" else
-- port2_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"1" else
-- port1_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"2" else
-- port2_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"3" else
rom_do when rom_cs = '1' else X"FF";
cpu_inst : mc6809i
port map
(
D => cpu_di,
DOut => cpu_do,
ADDR => cpu_addr,
RnW => cpu_rw,
E => '1',
Q => clk_2,
BS => open,
BA => open,
nIRQ => not cpu_irq,
nFIRQ => '1',
nNMI => '1',
AVMA => open,
BUSY => open,
LIC => open,
nHALT => '1',
nRESET => not cpu_reset,
nDMABREQ => '1',
RegData => open
);
cpu_prog_rom : entity work.sound_rom
port map(
clk => clk_2,
addr => cpu_addr(12 downto 0),
data => rom_do
);
cpu_ram : entity work.spram
generic map( widthad_a => 11)
port map(
clock => clk_2,
wren => wram_we,
address => cpu_addr(11 downto 0),
data => cpu_do,
q => wram_do
);
ay83910_inst1: YM2149
port map (
CLK => clk_1p5,
CE => '1',
RESET => reset,
A8 => '1',
A9_L => port2_data(4),
BDIR => port2_data(0),
BC => port2_data(2),
DI => port1_data,
DO => ay1_do,
CHANNEL_A => ay1_chan_a,
CHANNEL_B => ay1_chan_b,
CHANNEL_C => ay1_chan_c,
SEL => '0',
MODE => '1',
ACTIVE => open,
IOA_in => (others => '0'),--select_sound_r,
IOA_out => open,
IOB_in => (others => '0'),
IOB_out => ay1_port_b_do
);
ay1_audio <= "0000000000" + ay1_chan_a + ay1_chan_b + ay1_chan_c;
ay83910_inst2: YM2149
port map (
CLK => clk_1p5,
CE => '1',
RESET => reset,
A8 => '1',
A9_L => port2_data(3),
BDIR => port2_data(0),
BC => port2_data(2),
DI => port1_data,
DO => ay2_do,
CHANNEL_A => ay2_chan_a,
CHANNEL_B => ay2_chan_b,
CHANNEL_C => ay2_chan_c,
SEL => '0',
MODE => '1',
ACTIVE => open,
IOA_in => (others => '0'),
IOA_out => open,
IOB_in => (others => '0'),
IOB_out => open
);
ay2_audio <= "0000000000" + ay2_chan_a + ay2_chan_b + ay2_chan_c;
end SYN;

View File

@@ -1,107 +0,0 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
library work;
use work.pace_pkg.all;
use work.video_controller_pkg.all;
use work.platform_pkg.all;
entity target_top is
port(
vma : out std_logic;
clk_sys : in std_logic;
clk_vid : in std_logic;
reset_in : in std_logic;
snd_l : out std_logic_vector(7 downto 0);
snd_r : out std_logic_vector(7 downto 0);
vid_hs : out std_logic;
vid_vs : out std_logic;
vid_hb : out std_logic;
vid_vb : out std_logic;
vid_r : out std_logic_vector(3 downto 0);
vid_g : out std_logic_vector(3 downto 0);
vid_b : out std_logic_vector(3 downto 0);
inputs_p1 : in std_logic_vector(7 downto 0);
inputs_p2 : in std_logic_vector(7 downto 0);
inputs_sys : in std_logic_vector(7 downto 0);
inputs_dip1 : in std_logic_vector(7 downto 0);
inputs_dip2 : in std_logic_vector(7 downto 0);
cpu_rom_addr : out std_logic_vector(15 downto 0);
cpu_rom_do : in std_logic_vector(7 downto 0);
tile_rom_addr : out std_logic_vector(12 downto 0);
tile_rom_do : in std_logic_vector(15 downto 0)
);
end target_top;
architecture SYN of target_top is
signal clkrst_i : from_CLKRST_t;
signal video_i : from_VIDEO_t;
signal video_o : to_VIDEO_t;
signal audio_i : from_AUDIO_t;
signal audio_o : to_AUDIO_t;
signal platform_i : from_PLATFORM_IO_t;
signal platform_o : to_PLATFORM_IO_t;
begin
clkrst_i.clk(0) <=clk_sys;
clkrst_i.clk(1) <= clk_vid;
clkrst_i.arst <= reset_in;
clkrst_i.arst_n <= not clkrst_i.arst;
video_i.clk <= clk_vid;
video_i.clk_ena <= '1';
video_i.reset <= reset_in;
GEN_RESETS : for i in 0 to 3 generate
process (clkrst_i.clk(i), clkrst_i.arst)
variable rst_r : std_logic_vector(2 downto 0) := (others => '0');
begin
if clkrst_i.arst = '1' then
rst_r := (others => '1');
elsif rising_edge(clkrst_i.clk(i)) then
rst_r := rst_r(rst_r'left-1 downto 0) & '0';
end if;
clkrst_i.rst(i) <= rst_r(rst_r'left);
end process;
end generate GEN_RESETS;
vid_r <= video_o.rgb.r(9 downto 6);
vid_g <= video_o.rgb.g(9 downto 6);
vid_b <= video_o.rgb.b(9 downto 6);
vid_hs <= video_o.hsync;
vid_vs <= video_o.vsync;
vid_hb <= video_o.hblank;
vid_vb <= video_o.vblank;
snd_l <= audio_o.ldata(15 downto 8);
snd_r <= audio_o.rdata(15 downto 8);
pace_inst : entity work.pace
port map(
clkrst_i => clkrst_i,
vma => vma,
inputs_p1 => inputs_p1,
inputs_p2 => inputs_p2,
inputs_sys => inputs_sys,
inputs_dip1 => inputs_dip1,
inputs_dip2 => inputs_dip2,
video_i => video_i,
video_o => video_o,
audio_i => audio_i,
audio_o => audio_o,
platform_i => platform_i,
platform_o => platform_o,
cpu_rom_addr => cpu_rom_addr,
cpu_rom_do => cpu_rom_do,
tile_rom_addr => tile_rom_addr,
tile_rom_do => tile_rom_do
);
end SYN;

View File

@@ -1,455 +0,0 @@
library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.video_controller_pkg.all;
entity pace_video_controller is
generic
(
CONFIG : PACEVideoController_t := PACE_VIDEO_NONE;
DELAY : integer := 1;
H_SIZE : integer;
V_SIZE : integer;
L_CROP : integer range 0 to 255;
R_CROP : integer range 0 to 255;
H_SCALE : integer;
V_SCALE : integer;
H_SYNC_POL : std_logic := '1';
V_SYNC_POL : std_logic := '1';
BORDER_RGB : RGB_t := RGB_BLACK
);
port
(
-- clocking etc
video_i : in from_VIDEO_t;
-- register interface
reg_i : in VIDEO_REG_t;
-- video input data
rgb_i : in RGB_t;
-- control signals (out)
video_ctl_o : out from_VIDEO_CTL_t;
-- video output control & data
video_o : out to_VIDEO_t
);
end pace_video_controller;
architecture SYN of pace_video_controller is
constant SIM_DELAY : time := 2 ns;
constant VIDEO_H_SIZE : integer := H_SIZE * H_SCALE;
constant VIDEO_V_SIZE : integer := V_SIZE * V_SCALE;
subtype reg_t is integer range 0 to 2047;
alias clk : std_logic is video_i.clk;
alias clk_ena : std_logic is video_i.clk_ena;
alias reset : std_logic is video_i.reset;
-- registers
signal h_front_porch_r : reg_t := 0;
signal h_sync_r : reg_t := 0;
signal h_back_porch_r : reg_t := 0;
signal h_border_r : reg_t := 0;
signal h_video_r : reg_t := 0;
signal v_front_porch_r : reg_t := 0;
signal v_sync_r : reg_t := 0;
signal v_back_porch_r : reg_t := 0;
signal v_border_r : reg_t := 0;
signal v_video_r : reg_t := 0;
signal border_rgb_r : RGB_t := ((others=>'0'), (others=>'0'), (others=>'0'));
-- derived values
signal h_sync_start : reg_t := 0;
signal h_back_porch_start : reg_t := 0;
signal h_left_border_start : reg_t := 0;
signal h_video_start : reg_t := 0;
signal h_right_border_start : reg_t := 0;
signal h_line_end : reg_t := 0;
signal v_sync_start : reg_t := 0;
signal v_back_porch_start : reg_t := 0;
signal v_top_border_start : reg_t := 0;
signal v_video_start : reg_t := 0;
signal v_bottom_border_start : reg_t := 0;
signal v_screen_end : reg_t := 0;
signal hsync_s : std_logic := '0';
signal vsync_s : std_logic := '0';
signal hactive_s : std_logic := '0';
signal vactive_s : std_logic := '0';
signal hblank_s : std_logic := '0';
signal vblank_s : std_logic := '0';
subtype count_t is integer range 0 to 2047;
signal x_count : count_t := 0;
signal y_count : count_t := 0;
signal x_s : unsigned(10 downto 0) := (others => '0');
signal y_s : unsigned(10 downto 0) := (others => '0');
--signal extended_reset : std_logic := '1';
alias extended_reset : std_logic is video_i.reset;
begin
-- registers
reg_proc: process (reset, clk)
begin
--if reset = '1' then
case CONFIG is
when PACE_VIDEO_VGA_240x320_60Hz =>
-- P3M, clk=11.136MHz, clk_ena=5.568MHz
h_front_porch_r <= 272-240;
h_sync_r <= 5;
h_back_porch_r <= 22;
h_border_r <= (240-VIDEO_H_SIZE)/2;
v_front_porch_r <= 326-320;
v_sync_r <= 1;
v_back_porch_r <= 5;
v_border_r <= (320-VIDEO_V_SIZE)/2;
when PACE_VIDEO_VGA_320x480_60Hz =>
-- VGA, clk=12.588MHz
--# 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio
--Modeline "320x240" 12.588 320 336 384 400 240 245 246 262 Doublescan
h_front_porch_r <= 16;
h_sync_r <= 48;
h_back_porch_r <= 16;
h_border_r <= (320-VIDEO_H_SIZE)/2;
v_front_porch_r <= (5*2);
v_sync_r <= (1*2);
v_back_porch_r <= (16*2);
v_border_r <= (480-VIDEO_V_SIZE)/2;
when PACE_VIDEO_VGA_640x480_60Hz =>
-- VGA, clk=25.175MHz
h_front_porch_r <= 16;
h_sync_r <= 96;
h_back_porch_r <= 48;
h_border_r <= (640-VIDEO_H_SIZE)/2;
v_front_porch_r <= 10;
v_sync_r <= 2;
v_back_porch_r <= 33;
v_border_r <= (480-VIDEO_V_SIZE)/2;
when PACE_VIDEO_VGA_800x600_60Hz =>
-- SVGA, clk=40MHz
h_front_porch_r <= 40;
h_sync_r <= 128;
h_back_porch_r <= 88;
h_border_r <= (800-VIDEO_H_SIZE)/2;
v_front_porch_r <= 1;
v_sync_r <= 4;
v_back_porch_r <= 23;
v_border_r <= (600-VIDEO_V_SIZE)/2;
when PACE_VIDEO_VGA_1024x768_60Hz =>
-- XVGA, clk=65MHz
h_front_porch_r <= 24;
h_sync_r <= 136;
h_back_porch_r <= 160;
h_border_r <= (1024-VIDEO_H_SIZE)/2;
v_front_porch_r <= 3;
v_sync_r <= 6;
v_back_porch_r <= 29;
v_border_r <= (768-VIDEO_V_SIZE)/2;
when PACE_VIDEO_VGA_1366x768_60Hz =>
-- XVGA(NAVICO ROCKY), clk=72MHz
h_front_porch_r <= 88; --64;
h_sync_r <= 44; --112;
h_back_porch_r <= 148; --248;
h_border_r <= (1366-VIDEO_H_SIZE)/2;
v_front_porch_r <= 4; --3;
v_sync_r <= 5; --6;
v_back_porch_r <= 36; --18;
v_border_r <= (768-VIDEO_V_SIZE)/2;
when PACE_VIDEO_VGA_1280x800_60Hz =>
-- Sentinel Mode 36, clk=103.2MHz
h_front_porch_r <= 64;
h_sync_r <= 32;
h_back_porch_r <= 362-32-64;
h_border_r <= (1280-VIDEO_H_SIZE)/2;
v_front_porch_r <= 3;
v_sync_r <= 4;
v_back_porch_r <= 38-4-3;
v_border_r <= (800-VIDEO_V_SIZE)/2;
when PACE_VIDEO_VGA_1280x1024_60Hz =>
-- SXGA, clk=108MHz
h_front_porch_r <= 48;
h_sync_r <= 112;
h_back_porch_r <= 248;
h_border_r <= (1280-VIDEO_H_SIZE)/2;
v_front_porch_r <= 1;
v_sync_r <= 3;
v_back_porch_r <= 38;
v_border_r <= (1024-VIDEO_V_SIZE)/2;
when PACE_VIDEO_VGA_1680x1050_60Hz =>
-- WSXGA+, clk=147.14MHz
h_front_porch_r <= 104;
h_sync_r <= 184;
h_back_porch_r <= 288;
v_front_porch_r <= 1;
v_sync_r <= 3;
v_back_porch_r <= 33;
-- WSXGA+, clk=118MHz
--h_front_porch_r <= 48;
--h_sync_r <= 32;
--h_back_porch_r <= 80;
--v_front_porch_r <= 3;
--v_sync_r <= 6;
--v_back_porch_r <= 21;
h_border_r <= (1680-VIDEO_H_SIZE)/2;
v_border_r <= (1050-VIDEO_V_SIZE)/2;
when PACE_VIDEO_ARCADE_STD_336x240_60Hz =>
-- arcade standard resolution, clk=7.16MHz
h_front_porch_r <= 34;
h_sync_r <= 34;
h_back_porch_r <= 51;
h_border_r <= (336-VIDEO_H_SIZE)/2;
v_front_porch_r <= 3;
v_sync_r <= 3;
v_back_porch_r <= 16;
v_border_r <= (240-VIDEO_V_SIZE)/2;
when PACE_VIDEO_ARCADE_STD_336x240_60Hz_28M64 =>
-- arcade standard resolution, clk=28.64MHz
h_front_porch_r <= 4*34;
h_sync_r <= 4*34;
h_back_porch_r <= 4*51;
h_border_r <= 4*(336-VIDEO_H_SIZE)/2;
v_front_porch_r <= 3;
v_sync_r <= 3;
v_back_porch_r <= 16;
v_border_r <= (240-VIDEO_V_SIZE)/2;
when PACE_VIDEO_CVBS_720x288p_50Hz =>
-- generic composite, clk=13.5MHz
h_front_porch_r <= (8+12);
h_sync_r <= 64;
h_back_porch_r <= (144-64-(8+12));
h_border_r <= (720-VIDEO_H_SIZE)/2;
v_front_porch_r <= 1;
v_sync_r <= 3;
v_back_porch_r <= 20;
v_border_r <= (288-VIDEO_V_SIZE)/2;
when PACE_VIDEO_LCM_320x240_60Hz =>
-- DE1/2, clk=18MHz
h_front_porch_r <= 59;
h_sync_r <= 1;
h_back_porch_r <= 151;
h_border_r <= (320-VIDEO_H_SIZE)*3/2;
v_front_porch_r <= 8;
v_sync_r <= 1;
v_back_porch_r <= 13;
v_border_r <= (240-VIDEO_V_SIZE)/2;
when others =>
null;
end case;
h_video_r <= VIDEO_H_SIZE;
v_video_r <= VIDEO_V_SIZE;
border_rgb_r <= BORDER_RGB;
--end if;
end process reg_proc;
-- register some arithmetic
init_proc: process (reset, clk, clk_ena)
begin
if reset = '1' then
null;
elsif rising_edge(clk) then
h_sync_start <= h_front_porch_r - 1;
h_back_porch_start <= h_sync_start + h_sync_r;
h_left_border_start <= h_back_porch_start + h_back_porch_r;
h_video_start <= h_left_border_start + h_border_r;
h_right_border_start <= h_video_start + h_video_r;
h_line_end <= h_right_border_start + h_border_r;
v_sync_start <= v_front_porch_r - 1;
v_back_porch_start <= v_sync_start + v_sync_r;
v_top_border_start <= v_back_porch_start + v_back_porch_r;
v_video_start <= v_top_border_start + v_border_r;
v_bottom_border_start <= v_video_start + v_video_r;
v_screen_end <= v_bottom_border_start + v_border_r;
end if;
end process init_proc;
reset_proc: process (reset, clk)
variable count_v : integer;
begin
if reset = '1' then
--extended_reset <= '1';
count_v := 7;
elsif rising_edge(clk) then
if count_v = 0 then
--extended_reset <= '0';
else
count_v := count_v - 1;
end if;
end if;
end process reset_proc;
-- video control outputs
timer_proc: process (extended_reset, clk, clk_ena)
begin
if extended_reset = '1' then
hblank_s <= '1';
vblank_s <= '1';
hactive_s <= '0';
vactive_s <= '0';
hsync_s <= not H_SYNC_POL;
x_count <= 0;
y_count <= 0;
elsif rising_edge(clk) and clk_ena = '1' then
if x_count = h_line_end then
hblank_s <= '1';
hactive_s <= '0'; -- for 0 borders
if y_count = v_screen_end then
vblank_s <= '1';
vactive_s <= '0'; -- for 0 borders
y_count <= 0;
else
y_s <= y_s + 1;
if y_count = v_sync_start then
vsync_s <= V_SYNC_POL;
elsif y_count = v_back_porch_start then
vsync_s <= not V_SYNC_POL;
elsif y_count = v_video_start then
vblank_s <= '0'; -- for 0 borders
vactive_s <= '1';
y_s <= (others => '0');
-- check the borders last in case they're 0
elsif y_count = v_top_border_start then
vblank_s <= '0';
elsif y_count = v_bottom_border_start then
vactive_s <= '0';
end if;
y_count <= y_count + 1;
end if;
x_count <= 0;
else
x_s <= x_s + 1;
if x_count = h_sync_start then
hsync_s <= H_SYNC_POL;
elsif x_count = h_back_porch_start then
hsync_s <= not H_SYNC_POL;
elsif x_count = h_video_start then
hblank_s <= '0'; -- for 0 borders
hactive_s <= '1';
x_s <= (others => '0');
-- check the borders last in case they're 0
elsif x_count = h_left_border_start then
hblank_s <= '0';
elsif x_count = h_right_border_start then
hactive_s <= '0';
end if;
x_count <= x_count + 1;
end if;
end if; -- rising_edge(clk) and clk_ena = '1'
end process timer_proc;
-- pass-through for tile/bitmap & sprite controllers
video_ctl_o.clk <= clk;
video_ctl_o.clk_ena <= clk_ena;
-- for video DACs and TFT output
video_o.clk <= clk;
BLK_VIDEO_O : block
constant PIPELINE_DELAY : natural := DELAY+1;
-- won't synthesize correctly under ISE if these are variables
signal hactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0');
signal vactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0');
begin
video_o_proc: process (extended_reset, clk, clk_ena)
variable hsync_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0');
variable vsync_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0');
--variable hactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0');
--variable vactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0');
variable hblank_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0');
variable vblank_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0');
alias hsync_v : std_logic is hsync_v_r(hsync_v_r'left);
alias vsync_v : std_logic is vsync_v_r(vsync_v_r'left);
alias hactive_v : std_logic is hactive_v_r(hactive_v_r'left);
alias vactive_v : std_logic is vactive_v_r(vactive_v_r'left);
alias hblank_v : std_logic is hblank_v_r(hblank_v_r'left);
alias vblank_v : std_logic is vblank_v_r(vblank_v_r'left);
variable stb_cnt_v : unsigned(3 downto 0); -- up to 16x scaling
begin
if extended_reset = '1' then
hsync_v_r := (others => not H_SYNC_POL);
vsync_v_r := (others => not V_SYNC_POL);
hactive_v_r <= (others => '0');
vactive_v_r <= (others => '0');
hblank_v_r := (others => '0');
vblank_v_r := (others => '0');
stb_cnt_v := (others => '1');
elsif rising_edge(clk) and clk_ena = '1' then
-- register control signals and handle scaling
video_ctl_o.hblank <= not hactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers
video_ctl_o.vblank <= not vactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers
-- handle scaling
video_ctl_o.stb <= stb_cnt_v(H_SCALE-1) after SIM_DELAY;
if hactive_s = '1' and vactive_s = '1' then
stb_cnt_v := stb_cnt_v + 2;
elsif hblank_s = '0' and vblank_s = '0' then
stb_cnt_v := (others => '1');
end if;
video_ctl_o.x <= std_logic_vector(resize(x_s(x_s'left downto H_SCALE-1), video_ctl_o.x'length)) after SIM_DELAY;
video_ctl_o.y <= std_logic_vector(resize(y_s(y_s'left downto V_SCALE-1), video_ctl_o.y'length)) after SIM_DELAY;
-- register video outputs
if hactive_v = '1' and vactive_v = '1' then
-- active video
if x_s(x_s'left downto H_SCALE-1) < (L_CROP + PIPELINE_DELAY) or
x_s(x_s'left downto H_SCALE-1) >= (H_SIZE - R_CROP + PIPELINE_DELAY) then
video_o.rgb <= RGB_BLACK after SIM_DELAY;
else
video_o.rgb <= rgb_i after SIM_DELAY;
end if;
elsif hblank_v = '0' and vblank_v = '0' then
-- border
video_o.rgb <= border_rgb_r after SIM_DELAY;
else
video_o.rgb.r <= (others => '0') after SIM_DELAY;
video_o.rgb.g <= (others => '0') after SIM_DELAY;
video_o.rgb.b <= (others => '0') after SIM_DELAY;
end if;
video_o.hsync <= hsync_v after SIM_DELAY;
video_o.vsync <= vsync_v after SIM_DELAY;
video_o.hblank <= hblank_v after SIM_DELAY;
video_o.vblank <= vblank_v after SIM_DELAY;
-- pipelined signals
hsync_v_r := hsync_v_r(hsync_v_r'left-1 downto 0) & hsync_s;
vsync_v_r := vsync_v_r(vsync_v_r'left-1 downto 0) & vsync_s;
hactive_v_r <= hactive_v_r(hactive_v_r'left-1 downto 0) & hactive_s;
vactive_v_r <= vactive_v_r(vactive_v_r'left-1 downto 0) & vactive_s;
hblank_v_r := hblank_v_r(hblank_v_r'left-1 downto 0) & hblank_s;
vblank_v_r := vblank_v_r(vblank_v_r'left-1 downto 0) & vblank_s;
end if;
end process video_o_proc;
end block BLK_VIDEO_O;
end SYN;