1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-30 05:23:54 +00:00

RallyX: use MRAs, add New Rally-X, Jungler, Loco-Motion, Commando, Tactician

This commit is contained in:
Gyorgy Szombathelyi
2020-11-01 19:15:46 +01:00
parent 82bffa87d2
commit c367d7fbd7
44 changed files with 4309 additions and 4900 deletions

View File

@@ -3,8 +3,17 @@
-- Arcade: Rally-X port to MiST
-- 19 September 2019
-- From: https://github.com/MrX-8B/MiSTer-Arcade-RallyX
--
-- Enhanced with Konami/SEGA games
-- Time Pilot sound board by DarFpga
-- TODO:
-- - Starfield generator for Tactician
--
-- Usage:
-- - Create ROM and ARC files from the MRA files using the MRA utility.
-- Example: mra -A -z /path/to/mame/roms "Rally-X.mra"
-- - Copy the ROM files to the root of the SD Card
-- - Copy the RBF and ARC files to the same folder on the SD Card
--
---------------------------------------------------------------------------------
-- FPGA New Rally-X for Spartan-3 Starter Board
------------------------------------------------

View File

@@ -40,7 +40,7 @@
# Project-Wide Assignments
# ========================
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.1.2
set_global_assignment -name LAST_QUARTUS_VERSION 13.1
set_global_assignment -name LAST_QUARTUS_VERSION "13.1 SP4.26"
set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017"
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
@@ -79,6 +79,59 @@ set_location_assignment PIN_127 -to SPI_SS2
set_location_assignment PIN_91 -to SPI_SS3
set_location_assignment PIN_13 -to CONF_DATA0
set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component"
set_location_assignment PIN_49 -to SDRAM_A[0]
set_location_assignment PIN_44 -to SDRAM_A[1]
set_location_assignment PIN_42 -to SDRAM_A[2]
set_location_assignment PIN_39 -to SDRAM_A[3]
set_location_assignment PIN_4 -to SDRAM_A[4]
set_location_assignment PIN_6 -to SDRAM_A[5]
set_location_assignment PIN_8 -to SDRAM_A[6]
set_location_assignment PIN_10 -to SDRAM_A[7]
set_location_assignment PIN_11 -to SDRAM_A[8]
set_location_assignment PIN_28 -to SDRAM_A[9]
set_location_assignment PIN_50 -to SDRAM_A[10]
set_location_assignment PIN_30 -to SDRAM_A[11]
set_location_assignment PIN_32 -to SDRAM_A[12]
set_location_assignment PIN_83 -to SDRAM_DQ[0]
set_location_assignment PIN_79 -to SDRAM_DQ[1]
set_location_assignment PIN_77 -to SDRAM_DQ[2]
set_location_assignment PIN_76 -to SDRAM_DQ[3]
set_location_assignment PIN_72 -to SDRAM_DQ[4]
set_location_assignment PIN_71 -to SDRAM_DQ[5]
set_location_assignment PIN_69 -to SDRAM_DQ[6]
set_location_assignment PIN_68 -to SDRAM_DQ[7]
set_location_assignment PIN_86 -to SDRAM_DQ[8]
set_location_assignment PIN_87 -to SDRAM_DQ[9]
set_location_assignment PIN_98 -to SDRAM_DQ[10]
set_location_assignment PIN_99 -to SDRAM_DQ[11]
set_location_assignment PIN_100 -to SDRAM_DQ[12]
set_location_assignment PIN_101 -to SDRAM_DQ[13]
set_location_assignment PIN_103 -to SDRAM_DQ[14]
set_location_assignment PIN_104 -to SDRAM_DQ[15]
set_location_assignment PIN_58 -to SDRAM_BA[0]
set_location_assignment PIN_51 -to SDRAM_BA[1]
set_location_assignment PIN_85 -to SDRAM_DQMH
set_location_assignment PIN_67 -to SDRAM_DQML
set_location_assignment PIN_60 -to SDRAM_nRAS
set_location_assignment PIN_64 -to SDRAM_nCAS
set_location_assignment PIN_66 -to SDRAM_nWE
set_location_assignment PIN_59 -to SDRAM_nCS
set_location_assignment PIN_33 -to SDRAM_CKE
set_location_assignment PIN_43 -to SDRAM_CLK
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[*]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A[*]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[0]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA[1]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQMH
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQML
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nRAS
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCAS
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nWE
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_nCS
set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[*]
set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[*]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_*
# Classic Timing Assignments
# ==========================
@@ -134,33 +187,39 @@ set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -
# Incremental Compilation Assignments
# ===================================
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
# end DESIGN_PARTITION(Top)
# -------------------------
# end ENTITY(rallyX_mist)
# -----------------------
set_global_assignment -name ENABLE_SIGNALTAP OFF
set_global_assignment -name USE_SIGNALTAP_FILE output_files/timeplt.stp
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON
set_global_assignment -name AUTO_RAM_TO_LCELL_CONVERSION ON
set_global_assignment -name AUTO_RESOURCE_SHARING ON
set_global_assignment -name ALLOW_ANY_RAM_SIZE_FOR_RECOGNITION ON
set_global_assignment -name ALLOW_ANY_ROM_SIZE_FOR_RECOGNITION ON
set_global_assignment -name SYSTEMVERILOG_FILE rtl/rallyX_mist.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv
set_global_assignment -name VERILOG_FILE rtl/fpga_nrx.v
set_global_assignment -name VERILOG_FILE rtl/nrx_video.v
set_global_assignment -name VERILOG_FILE rtl/nrx_hvgen.v
set_global_assignment -name VERILOG_FILE rtl/nrx_sprite.v
set_global_assignment -name VERILOG_FILE rtl/nrx_sound.v
set_global_assignment -name VERILOG_FILE rtl/nrx_psg_voice.v
set_global_assignment -name VERILOG_FILE rtl/nrx_namco.v
set_global_assignment -name VERILOG_FILE rtl/rams.v
set_global_assignment -name VHDL_FILE rtl/roms/nrx_wav_rom.vhd
set_global_assignment -name VHDL_FILE rtl/roms/nrx_prg_rom.vhd
set_global_assignment -name VHDL_FILE rtl/roms/nrx_dot_rom.vhd
set_global_assignment -name VHDL_FILE rtl/roms/nrx_chr_rom.vhd
set_global_assignment -name VHDL_FILE rtl/roms/nrx_pal_rom.vhd
set_global_assignment -name VHDL_FILE rtl/roms/nrx_col_rom.vhd
set_global_assignment -name VHDL_FILE rtl/roms/nrx_nam_rom.vhd
set_global_assignment -name VERILOG_FILE rtl/pll.v
set_global_assignment -name VHDL_FILE rtl/dpram.vhd
set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip
set_global_assignment -name QIP_FILE ../../../common/CPU/T80/T80.qip
set_global_assignment -name VHDL_FILE rtl/spram.vhd
set_global_assignment -name VHDL_FILE rtl/time_pilot_sound_board.vhd
set_global_assignment -name VHDL_FILE ../../common/Sound/ym2149/vol_table_array.vhd
set_global_assignment -name VHDL_FILE ../../common/Sound/ym2149/YM2149.vhd
set_global_assignment -name QIP_FILE ../../common/mist/mist.qip
set_global_assignment -name QIP_FILE ../../common/CPU/T80/T80.qip
set_global_assignment -name SIGNALTAP_FILE output_files/spr.stp
set_global_assignment -name SIGNALTAP_FILE output_files/bg.stp
set_global_assignment -name SIGNALTAP_FILE output_files/timeplt.stp
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

View File

@@ -53,6 +53,8 @@ set_time_format -unit ns -decimal_places 3
create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}]
set sdram_clk "pll|altpll_component|auto_generated|pll1|clk[0]"
#**************************************************************
# Create Generated Clock
#**************************************************************
@@ -79,26 +81,33 @@ set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [ge
set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}]
set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}]
set_input_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -max 6.6 [get_ports SDRAM_DQ[*]]
set_input_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -min 3.5 [get_ports SDRAM_DQ[*]]
#**************************************************************
# Set Output Delay
#**************************************************************
set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}]
set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_L}]
set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {AUDIO_R}]
set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}]
set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}]
set_output_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -max 1.5 [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}]
set_output_delay -clock [get_clocks $sdram_clk] -reference_pin [get_ports {SDRAM_CLK}] -min -0.8 [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}]
#**************************************************************
# Set Clock Groups
#**************************************************************
set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}]
set_clock_groups -asynchronous -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[1]}]
#**************************************************************
# Set False Path
#**************************************************************
set_false_path -to [get_ports {AUDIO_L}]
set_false_path -to [get_ports {AUDIO_R}]
#**************************************************************

View File

@@ -1,123 +0,0 @@
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY dpram IS
GENERIC
(
init_file : string := "";
numwords_a : natural := 0; -- not used any more
widthad_a : natural;
width_a : natural := 8;
outdata_reg_a : string := "UNREGISTERED";
outdata_reg_b : string := "UNREGISTERED"
);
PORT
(
address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0);
address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0);
clock_a : IN STD_LOGIC ;
clock_b : IN STD_LOGIC ;
data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0);
data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0);
wren_a : IN STD_LOGIC := '1';
wren_b : IN STD_LOGIC := '1';
q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0);
q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0)
);
END dpram;
ARCHITECTURE SYN OF dpram IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0);
SIGNAL sub_wire1 : STD_LOGIC_VECTOR (width_a-1 DOWNTO 0);
COMPONENT altsyncram
GENERIC (
address_reg_b : STRING;
clock_enable_input_a : STRING;
clock_enable_input_b : STRING;
clock_enable_output_a : STRING;
clock_enable_output_b : STRING;
indata_reg_b : STRING;
init_file : STRING;
intended_device_family : STRING;
lpm_type : STRING;
numwords_a : NATURAL;
numwords_b : NATURAL;
operation_mode : STRING;
outdata_aclr_a : STRING;
outdata_aclr_b : STRING;
outdata_reg_a : STRING;
outdata_reg_b : STRING;
power_up_uninitialized : STRING;
widthad_a : NATURAL;
widthad_b : NATURAL;
width_a : NATURAL;
width_b : NATURAL;
width_byteena_a : NATURAL;
width_byteena_b : NATURAL;
wrcontrol_wraddress_reg_b : STRING
);
PORT (
wren_a : IN STD_LOGIC ;
clock0 : IN STD_LOGIC ;
wren_b : IN STD_LOGIC ;
clock1 : IN STD_LOGIC ;
address_a : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0);
address_b : IN STD_LOGIC_VECTOR (widthad_a-1 DOWNTO 0);
q_a : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0);
q_b : OUT STD_LOGIC_VECTOR (width_a-1 DOWNTO 0);
data_a : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0);
data_b : IN STD_LOGIC_VECTOR (width_a-1 DOWNTO 0)
);
END COMPONENT;
BEGIN
q_a <= sub_wire0(width_a-1 DOWNTO 0);
q_b <= sub_wire1(width_a-1 DOWNTO 0);
altsyncram_component : altsyncram
GENERIC MAP (
address_reg_b => "CLOCK1",
clock_enable_input_a => "BYPASS",
clock_enable_input_b => "BYPASS",
clock_enable_output_a => "BYPASS",
clock_enable_output_b => "BYPASS",
indata_reg_b => "CLOCK1",
init_file => init_file,
intended_device_family => "Cyclone III",
lpm_type => "altsyncram",
numwords_a => 2**widthad_a,
numwords_b => 2**widthad_a,
operation_mode => "BIDIR_DUAL_PORT",
outdata_aclr_a => "NONE",
outdata_aclr_b => "NONE",
outdata_reg_a => outdata_reg_a,
outdata_reg_b => outdata_reg_b,
power_up_uninitialized => "FALSE",
widthad_a => widthad_a,
widthad_b => widthad_a,
width_a => width_a,
width_b => width_a,
width_byteena_a => 1,
width_byteena_b => 1,
wrcontrol_wraddress_reg_b => "CLOCK1"
)
PORT MAP (
wren_a => wren_a,
clock0 => clock_a,
wren_b => wren_b,
clock1 => clock_b,
address_a => address_a,
address_b => address_b,
data_a => data_a,
data_b => data_b,
q_a => sub_wire0,
q_b => sub_wire1
);
END SYN;

View File

@@ -1,197 +0,0 @@
/**************************************************************
FPGA New Rally-X (Main part)
***************************************************************/
module fpga_nrx
(
input RESET, // RESET
input CLK24M, // Clock 24.576MHz
output hsync,
output vsync,
output hblank,
output vblank,
output [2:0] r,
output [2:0] g,
output [1:0] b,
output [7:0] SND, // Sound (unsigned PCM)
input [7:0] DSW, // DipSW
input [7:0] CTR1, // Controler (Negative logic)
input [7:0] CTR2,
output [1:0] LAMP
);
//--------------------------------------------------
// Clock Generators
//--------------------------------------------------
reg [2:0] _CCLK;
always @( posedge CLK24M ) _CCLK <= _CCLK+1;
wire CLK = CLK24M; // 24MHz
//wire CCLKx2 = _CCLK[1]; // CPU CLOCKx2 : 6.0MHz
wire CCLK = _CCLK[2]; // CPU CLOCK : 3.0MHz
//--------------------------------------------------
// CPU
//--------------------------------------------------
// memory access signals
wire rd, wr, me, ie, rf, m1;
wire [15:0] ad;
wire [7:0] odt, viddata;
wire mx = rf & (~me);
wire mr = mx & (~rd);
wire mw = mx & (~wr);
// interrupt signal/vector generator & other latches
reg inte = 1'b0;
reg intl = 1'b0;
reg [7:0] intv = 8'h0;
reg bang = 1'b0;
reg lp0r = 1'b0;
reg lp1r = 1'b0;
assign LAMP = { lp1r, lp0r };
wire vblk = (VP==224)&(HP<=8);
wire lat_Wce = ( ad[15:4] == 12'hA18 ) & mw;
wire bngw = ( lat_Wce & ( ad[3:0] == 4'h0 ) );
wire iewr = ( lat_Wce & ( ad[3:0] == 4'h1 ) );
//wire flip = ( lat_Wce & ( ad[3:0] == 4'h3 ) );
wire lp0w = ( lat_Wce & ( ad[3:0] == 4'h4 ) );
wire lp1w = ( lat_Wce & ( ad[3:0] == 4'h5 ) );
wire iowr = ( (~wr) & (~ie) & m1 );
always @( posedge CCLK ) begin
if ( iowr ) intv <= odt;
if ( vblk ) intl <= 1'b1;
if ( iewr ) begin
inte <= odt[0];
intl <= 1'b0;
end
if ( bngw ) bang <= odt[0];
if ( lp0w ) lp0r <= odt[0];
if ( lp1w ) lp1r <= odt[0];
end
wire irq_n = ~( intl & inte );
// address decoders
wire rom_Rce = ( ( ad[15:14] == 2'b00 ) & mr ); // $0000-$3FFF(R)
wire ram_Rce = ( ( ad[15:11] == 5'b1001_1 ) & mr ); // $9800-$9FFF(R)
wire ram_Wce = ( ( ad[15:11] == 5'b1001_1 ) & mw ); // $9800-$9FFF(W)
wire inp_Rce = ( ( ad[15:12] == 4'b1010 ) & mr ); // $A000-$AFFF(R)
wire snd_Wce = ( ( ad[15:8] == 8'b1010_0001 ) & mw ); // $A100-$A1FF(W)
wire vid_Rce;
wire [7:0] romdata;
nrx_prg_rom nrx_prg_rom (
.clk(CCLK),
.addr(ad[13:0]),
.data(romdata)
);
// Work RAM (2KB)
wire [7:0] ramdata;
GSPRAM #(11,8) workram(
.CL(CCLK),
.AD(ad[10:0]),
.WE(ram_Wce),
.DI(odt),
.DO(ramdata)
);
// Controler/DipSW input
wire [7:0] in0data = CTR1;
wire [7:0] in1data = CTR2;
wire [7:0] in2data = DSW;
wire [7:0] inpdata = ad[8] ? in2data : ad[7] ? in1data : in0data;
// databus selector
wire [7:0] romd = rom_Rce ? romdata : 8'h00;
wire [7:0] ramd = ram_Rce ? ramdata : 8'h00;
wire [7:0] vidd = vid_Rce ? viddata : 8'h00;
wire [7:0] inpd = inp_Rce ? inpdata : 8'h00;
wire [7:0] irqv = ( (~m1) & (~ie) ) ? intv : 8'h00;
wire [7:0] idt = romd | ramd | irqv | vidd | inpd;
T80s z80(
.RESET_n(~RESET),
.CLK(~CCLK),
.WAIT_n(1'b1),
.INT_n(irq_n),
.NMI_n(1'b1),
.BUSRQ_n(1'b1),
.DI(idt),
.M1_n(m1),
.MREQ_n(me),
.IORQ_n(ie),
.RD_n(rd),
.WR_n(wr),
.RFSH_n(rf),
.HALT_n(),
.BUSAK_n(),
.A(ad),
.DO(odt)
);
//--------------------------------------------------
// VIDEO
//--------------------------------------------------
wire [8:0] HP;
wire [8:0] VP;
wire PCLK;
nrx_video video(
.VCLKx4(CLK),
.HPOS(HP+3),
.VPOS(VP+1),
.PCLK(PCLK),
.POUT({b,g,r}),
.CPUCLK(CCLK),
.CPUADDR(ad),
.CPUDI(odt),
.CPUDO(viddata),
.CPUME(mx),
.CPUWE(mw),
.CPUDT(vid_Rce)
);
nrx_hvgen hvgen(
.HPOS(HP),
.VPOS(VP),
.PCLK(PCLK),
.HBLK(hblank),
.VBLK(vblank),
.HSYN(hsync),
.VSYN(vsync)
);
//--------------------------------------------------
// SOUND
//--------------------------------------------------
nrx_sound sound(
.CLK24M(CLK),
.CCLK(CCLK),
.SND(SND),
.AD(ad),
.DI(odt[3:0]),
.WR(snd_Wce),
.BANG(bang)
);
endmodule

View File

@@ -1,36 +0,0 @@
module nrx_hvgen
(
output [8:0] HPOS,
output [8:0] VPOS,
input PCLK,
output reg HBLK = 1,
output reg VBLK = 1,
output reg HSYN = 1,
output reg VSYN = 1
);
reg [8:0] hcnt = 0;
reg [8:0] vcnt = 0;
assign HPOS = hcnt;
assign VPOS = vcnt;
always @(posedge PCLK) begin
case (hcnt)
287: begin HBLK <= 1; HSYN <= 0; hcnt <= hcnt+1; end
311: begin HSYN <= 1; hcnt <= hcnt+1; end
383: begin
HBLK <= 0; HSYN <= 1; hcnt <= 0;
case (vcnt)
223: begin VBLK <= 1; vcnt <= vcnt+1; end
226: begin VSYN <= 0; vcnt <= vcnt+1; end
233: begin VSYN <= 1; vcnt <= vcnt+1; end
242: begin VBLK <= 0; vcnt <= 0; end
default: vcnt <= vcnt+1;
endcase
end
default: hcnt <= hcnt+1;
endcase
end
endmodule

View File

@@ -1,35 +0,0 @@
/**************************************************************
FPGA New Rally-X (Sound Part)
***************************************************************/
module nrx_namco
(
input clk,
input [7:0] a0,
input [7:0] a1,
input [7:0] a2,
output reg [3:0] d0,
output reg [3:0] d1,
output reg [3:0] d2
);
reg [1:0] ph=0;
reg [7:0] ad;
wire [7:0] dt;
nrx_nam_rom namrom(
.clk(clk),
.addr(ad),
.data(dt)
);
always @(negedge clk) begin
case (ph)
0: begin d2 <= dt[3:0]; ad <= a0; ph <= 1; end
1: begin d0 <= dt[3:0]; ad <= a1; ph <= 2; end
2: begin d1 <= dt[3:0]; ad <= a2; ph <= 0; end
default:;
endcase
end
endmodule

View File

@@ -1,154 +0,0 @@
module NRX_SPRITE
(
input VCLKx4,
input HBLK,
input [8:0] HPOS,
input [8:0] VPOS,
output reg [10:0] SPRAADRS,
input [15:0] SPRADATA,
output [3:0] ARAMADRS,
input [7:0] ARAMDATA,
output [11:0] SPCHRADR,
input [7:0] SPCHRDAT,
output [7:0] DROMAD,
input [7:0] DROMDT,
output reg [8:0] SPCOL
);
reg [1:0] clkcnt;
always @( posedge VCLKx4 ) clkcnt<=clkcnt+1;
wire VCLKx2 = clkcnt[0];
wire VCLK = clkcnt[1];
wire SIDE = VPOS[0];
reg [19:0] SPATR0;
reg [36:0] SPATRS[0:31];
reg [3:0] WWADR;
reg bHit;
assign ARAMADRS = SPRAADRS[3:0];
reg [7:0] WRADR;
reg [8:0] HPOSW;
reg [8:0] SPWCL;
wire [36:0] SPA = SPATRS[{~SIDE,WRADR[7:4]}];
wire [3:0] SH = WRADR[3:0]+4'h4;
wire [3:0] SV = SPA[35:32];
wire [2:0] SPFY = { 3{SPA[1]} };
wire [1:0] SPFX = { 1'b0, SPA[0] };
wire [5:0] SPPL = SPA[29:24];
assign SPCHRADR = { SPA[7:2], ( SV[3] ^ SPA[1] ), ( SH[3:2] ^ SPFX ), ( SV[2:0] ^ SPFY ) };
wire [7:0] CHRO = SPCHRDAT;
wire [8:0] YM = ( SPRADATA[15:8] + 8'h10 ) + VPOS[7:0];
assign DROMAD = { 1'b0, (~SPA[19:17]), SPA[33:32], WRADR[3:2] };
always @ ( posedge VCLKx2 ) begin
// in H-BLANK
if ( HBLK ) begin
// Sprite V-hit check & list-up
if ( SPRAADRS < 10'h20 ) begin
if ( SPRAADRS[0] ) begin
if ( bHit ) begin
SPATRS[{SIDE,WWADR}] <= { 1'b1, SPATR0[3:0], SPRADATA, SPATR0[19:4] };
WWADR <= WWADR+1;
end
end
else begin
if ( YM[7:4] == 4'b1111 ) begin
bHit <= 1;
SPATR0 <= { SPRADATA, YM[3:0] };
end
else bHit <= 0;
end
SPRAADRS <= ( SPRAADRS == 10'h1F ) ? 10'h34 : (SPRAADRS+1);
end
// Rader-dot V-hit check & list-up
else begin
if ( SPRAADRS < 10'h40 ) begin
if ( YM[7:2] == 6'b111111 ) begin
SPATRS[{SIDE,WWADR}] <= { 1'b0, 2'b00, YM[1:0], 8'h0, ARAMDATA, SPRADATA };
WWADR <= WWADR+1;
end
SPRAADRS <= SPRAADRS+1;
end
else SPATRS[{SIDE,WWADR}] <= 0;
end
if ( SPA ) begin
// Rend Sprite
if ( SPA[36] ) begin
HPOSW <= ( WRADR[3:0] ) ? (HPOSW+1) : { SPA[31], SPA[23:16] };
case ( SH[1:0] ^ {2{SPFX[0]}} )
2'b00: SPWCL <= { 1'b0, SPPL, CHRO[7], CHRO[3] };
2'b01: SPWCL <= { 1'b0, SPPL, CHRO[6], CHRO[2] };
2'b10: SPWCL <= { 1'b0, SPPL, CHRO[5], CHRO[1] };
2'b11: SPWCL <= { 1'b0, SPPL, CHRO[4], CHRO[0] };
endcase
WRADR <= WRADR+1;
end
// Rend Rader-dot
else begin
HPOSW <= ( WRADR[3:0] ) ? (HPOSW+1) : ({ (~SPA[16]), SPA[7:0] });
SPWCL <= ( DROMDT[1:0] != 2'b11 ) ? { 1'b1, 6'b000100, DROMDT[1:0] } : 0;
WRADR <= WRADR+4;
end
end
else SPWCL <= 0;
end
// in H-DISP
else begin
SPRAADRS <= 10'h14;
WWADR <= 0;
WRADR <= 0;
SPWCL <= 0;
end
end
reg [9:0] radr0=0,radr1=1;
wire [8:0] SPCOLi;
dpram #(
.widthad_a(10),
.width_a(9))
linebuffer(
.address_a({SIDE,HPOS}),
.address_b({~SIDE,HPOSW}),
.clock_a(VCLKx2),
.clock_b(VCLKx2),
.data_a(9'h0),
.data_b(SPWCL),
.wren_a(radr0==radr1),
.wren_b((SPWCL[0]|SPWCL[1])),
.q_a(SPCOLi),
.q_b()
);
always @(posedge VCLK) radr0 <= {SIDE,HPOS};
always @(negedge VCLK) begin
if (radr0!=radr1) SPCOL <= SPCOLi;
radr1 <= radr0;
end
endmodule

View File

@@ -1,241 +0,0 @@
/**************************************************************
FPGA New Rally-X (Video Part)
***************************************************************/
module nrx_video
(
input VCLKx4, // 24.976MHz
input [8:0] HPOS,
input [8:0] VPOS,
output PCLK,
output reg [7:0] POUT,
input CPUCLK,
input [15:0] CPUADDR,
input [7:0] CPUDI,
output [7:0] CPUDO,
input CPUME,
input CPUWE,
output CPUDT
);
//-----------------------------------------
// Clock generators
//-----------------------------------------
reg VCLKx2;
always @( posedge VCLKx4 ) begin
VCLKx2 <= ~VCLKx2;
end
reg VCLK;
always @( posedge VCLKx2 ) begin
VCLK <= ~VCLK;
end
//-----------------------------------------
// BG scroll registers
//-----------------------------------------
reg [7:0] BGHSCR;
reg [7:0] BGVSCR;
always @ ( posedge CPUCLK ) begin
if ( ( CPUADDR == 16'hA130 ) & CPUME & CPUWE ) begin
BGHSCR <= CPUDI-3;
end
if ( ( CPUADDR == 16'hA140 ) & CPUME & CPUWE ) begin
BGVSCR <= CPUDI;
end
end
//-----------------------------------------
// HV
//-----------------------------------------
wire [8:0] BGHPOS = HPOS + { 1'b0, BGHSCR };
wire [8:0] BGVPOS = VPOS + { 1'b0, BGVSCR };
wire oHB = ( HPOS > 288 ) ? 1 : 0;
wire oVB = ( VPOS > 224 ) ? 1 : 0;
//----------------------------------------
// VideoRAM Scanner
//----------------------------------------
wire BF = ( HPOS >= 224 );
wire [8:0] HP = BF ? HPOS : BGHPOS;
wire [8:0] VP = ( BF ? VPOS : BGVPOS ) + 9'h0F;
wire [10:0] SPRAADRS;
wire [3:0] ARAMADRS;
reg [10:0] VRAMADRS;
always @ ( HPOS ) begin
VRAMADRS <= oHB ?
SPRAADRS :
BF ? { 1'b0, VP[7:3], 2'b00, HP[5:3] } : { 1'b1, VP[7:3], HP[7:3] };
end
wire [7:0] CHRC;
wire [7:0] ATTR;
wire [7:0] ARDT;
wire [7:0] V0DO, V1DO;
wire CEV0 = ( ( CPUADDR[15:12] == 4'b1000 ) & (~CPUADDR[11]) ) & CPUME;
wire CEV1 = ( ( CPUADDR[15:12] == 4'b1000 ) & CPUADDR[11] ) & CPUME;
wire CEAT = ( CPUADDR[15:4] == 12'b1010_0000_0000 ) & CPUME;
wire [7:0] DTV0 = CEV0 ? V0DO : 8'h00;
wire [7:0] DTV1 = CEV1 ? V1DO : 8'h00;
assign CPUDO = DTV0 | DTV1;
assign CPUDT = ( ~CPUWE ) & ( CEV0 | CEV1 );
GDPRAM #(11,8) vram0( VCLKx4, VRAMADRS, CHRC, CPUCLK, CPUADDR[10:0], ( CPUWE & CEV0 ), CPUDI, V0DO );
/*dpram #(
.widthad_a(11),
.width_a(8))
vram0(
.address_a(VRAMADRS),
.address_b(CPUADDR[10:0]),
.clock_a(VCLKx4),
.clock_b(CPUCLK),
.data_a(),
.data_b(CPUDI),
.wren_a(),
.wren_b(( CPUWE & CEV0 )),
.q_a(CHRC),
.q_b(V0DO)
);*/
GDPRAM #(11,8) vram1( VCLKx4, VRAMADRS, ATTR, CPUCLK, CPUADDR[10:0], ( CPUWE & CEV1 ), CPUDI, V1DO );
/*dpram #(
.widthad_a(11),
.width_a(8))
vram1(
.address_a(VRAMADRS),
.address_b(CPUADDR[10:0]),
.clock_a(VCLKx4),
.clock_b(CPUCLK),
.data_a(),
.data_b(CPUDI),
.wren_a(),
.wren_b(( CPUWE & CEV1 )),
.q_a(ATTR),
.q_b(V1DO)
); */
GDPRAM #(4,8) aram0( VCLKx4, ARAMADRS, ARDT, CPUCLK, CPUADDR[3:0], ( CPUWE & CEAT ), CPUDI );
/*dpram #(
.widthad_a(8),
.width_a(4))
aram0(
.address_a(ARAMADRS),
.address_b(CPUADDR[3:0]),
.clock_a(VCLKx4),
.clock_b(CPUCLK),
.data_a(),
.data_b(CPUDI),
.wren_a(),
.wren_b(( CPUWE & CEAT )),
.q_a(ARDT),
.q_b()
); */
wire BGF = ATTR[5];
//----------------------------------------
// BG/Sprite chip data reader
//----------------------------------------
wire BGFX = ATTR[6];
wire [2:0] BGFY = { ATTR[7], ATTR[7], ATTR[7] };
wire [11:0] SPCHRADR;
wire [11:0] CHRA = oHB ? SPCHRADR : { CHRC, ( HP[2] ^ BGFX ), ( VP[2:0] ^ BGFY ) };
wire [7:0] CHRO;
nrx_chr_rom chrrom(
.clk(VCLKx4),
.addr(CHRA),
.data(CHRO)
);
//----------------------------------------
// Rader-dot chip ROM
//----------------------------------------
wire [7:0] DROMAD;
wire [7:0] DROMDT;
nrx_dot_rom dotrom(
.clk(VCLKx4),
.addr(DROMAD),
.data(DROMDT)
);
//----------------------------------------
// BG/FG scanline generator
//----------------------------------------
wire [5:0] BGPL = ATTR[5:0];
reg [7:0] BGCOL;
always @ ( posedge VCLK ) begin
case ( HP[1:0]^{2{BGFX}} )
2'b00: BGCOL <= { BGPL, CHRO[4], CHRO[0] };
2'b01: BGCOL <= { BGPL, CHRO[5], CHRO[1] };
2'b10: BGCOL <= { BGPL, CHRO[6], CHRO[2] };
2'b11: BGCOL <= { BGPL, CHRO[7], CHRO[3] };
endcase
end
//----------------------------------------
// Sprite Engine
//----------------------------------------
wire [8:0] SPCOL;
NRX_SPRITE speng(
.VCLKx4(VCLKx4),
.HBLK(oHB),
.HPOS(HPOS),
.VPOS(VPOS),
.SPRAADRS(SPRAADRS),
.SPRADATA({ ATTR, CHRC }),
.ARAMADRS(ARAMADRS),
.ARAMDATA(ARDT),
.SPCHRADR(SPCHRADR),
.SPCHRDAT(CHRO),
.DROMAD(DROMAD),
.DROMDT(DROMDT),
.SPCOL(SPCOL)
);
//----------------------------------------
// Color mixer
//----------------------------------------
wire bBGOPAQUE = ( ( BF | BGF ) & (~SPCOL[8]) );
wire bSPTRANSP = ( SPCOL[1:0] == 2'b00 );
wire [7:0] OUTCOL = ( bBGOPAQUE | bSPTRANSP ) ? BGCOL : SPCOL[7:0];
wire [3:0] CLUT;
nrx_col_rom colrom(
.clk(~VCLKx4),
.addr(OUTCOL),
.data(CLUT)
);
wire [4:0] PALA = SPCOL[8] ? SPCOL[4:0] : { 1'b0, CLUT };
wire [7:0] PALO;
nrx_pal_rom palrom(
.clk(VCLKx4),
.addr(PALA),
.data(PALO)
);
//----------------------------------------
// Color output
//----------------------------------------
always @ ( posedge PCLK ) POUT <= (oHB|oVB) ? 8'h0 : PALO;
assign PCLK = VCLK;
endmodule

View File

@@ -1,174 +0,0 @@
module rallyX_mist (
output LED,
output [5:0] VGA_R,
output [5:0] VGA_G,
output [5:0] VGA_B,
output VGA_HS,
output VGA_VS,
output AUDIO_L,
output AUDIO_R,
input SPI_SCK,
output SPI_DO,
input SPI_DI,
input SPI_SS2,
input SPI_SS3,
input CONF_DATA0,
input CLOCK_27
);
`include "rtl\build_id.v"
localparam CONF_STR = {
"RallyX;;",
"O8A,Difficulty,M1,M2,M3,M4,M5,M6,M7,M8;",
"OBC,Bonus Life,M1,M2,M3,Nothing;",
"OF,Service Mode,Off,On;",
"O34,Scanlines,None,CRT 25%,CRT 50%,CRT 75%;",
"O5,Blend ,Off,On;",
"T6,Reset;",
"V,v1.00.",`BUILD_DATE
};
assign LED = 1;
assign AUDIO_R = AUDIO_L;
wire clock_24, clock_12;
pll pll(
.inclk0(CLOCK_27),
.c0(clock_24)//24.576MHz
);
wire [31:0] status;
wire [1:0] buttons;
wire [1:0] switches;
wire [11:0] kbjoy;
wire [7:0] joystick_0;
wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
wire [7:0] audio;
wire hs, vs;
wire hb, vb;
wire blankn = ~(hb | vb);
wire [2:0] r, g;
wire [1:0] b;
wire key_strobe;
wire key_pressed;
wire [7:0] key_code;
wire [7:0] iDSW = ~{ 2'b00, status[10:8], status[12:11], status[15] };
wire [7:0] iCTR1 = ~{ btn_coin, btn_one_player, m_up1, m_down1, m_right1, m_left1, m_fire1, 1'b0 };
wire [7:0] iCTR2 = ~{ btn_coin, btn_two_players, m_up2, m_down2, m_right2, m_left2, m_fire2, 1'b0 };
fpga_nrx fpga_nrx(
.RESET(status[0] | status[6] | buttons[1]),
.CLK24M(clock_24),
.hsync(hs),
.vsync(vs),
.hblank(hb),
.vblank(vb),
.r(r),
.g(g),
.b(b),
.SND(audio),
.DSW(iDSW),
.CTR1(iCTR1),
.CTR2(iCTR2),
.LAMP()
);
mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video(
.clk_sys ( clock_24 ),
.SPI_SCK ( SPI_SCK ),
.SPI_SS3 ( SPI_SS3 ),
.SPI_DI ( SPI_DI ),
.R ( blankn ? r : 0 ),
.G ( blankn ? g : 0 ),
.B ( blankn ? {b,1'b0} : 0 ),
.HSync ( hs ),
.VSync ( vs ),
.VGA_R ( VGA_R ),
.VGA_G ( VGA_G ),
.VGA_B ( VGA_B ),
.VGA_VS ( VGA_VS ),
.VGA_HS ( VGA_HS ),
.blend ( status[5] ),
.scandoubler_disable( scandoublerD ),
.scanlines ( status[4:3] ),
.ypbpr ( ypbpr )
);
user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io(
.clk_sys (clock_24 ),
.conf_str (CONF_STR ),
.SPI_CLK (SPI_SCK ),
.SPI_SS_IO (CONF_DATA0 ),
.SPI_MISO (SPI_DO ),
.SPI_MOSI (SPI_DI ),
.buttons (buttons ),
.switches (switches ),
.scandoubler_disable (scandoublerD ),
.ypbpr (ypbpr ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status )
);
dac #(.C_bits(16))dac(
.clk_i(clock_24),
.res_n_i(1),
.dac_i({audio,audio}),
.dac_o(AUDIO_L)
);
wire m_up1 = btn_up | joystick_0[3];
wire m_down1 = btn_down | joystick_0[2];
wire m_left1 = btn_left | joystick_0[1];
wire m_right1 = btn_right | joystick_0[0];
wire m_fire1 = btn_fire1 | joystick_0[4];
wire m_up2 = joystick_1[3];
wire m_down2 = joystick_1[2];
wire m_left2 = joystick_1[1];
wire m_right2 = joystick_1[0];
wire m_fire2 = joystick_1[4];
reg btn_one_player = 0;
reg btn_two_players = 0;
reg btn_left = 0;
reg btn_right = 0;
reg btn_down = 0;
reg btn_up = 0;
reg btn_fire1 = 0;
//reg btn_fire2 = 0;
//reg btn_fire3 = 0;
reg btn_coin = 0;
always @(posedge clock_24) begin
reg old_state;
old_state <= key_strobe;
if(old_state != key_strobe) begin
case(key_code)
'h75: btn_up <= key_pressed; // up
'h72: btn_down <= key_pressed; // down
'h6B: btn_left <= key_pressed; // left
'h74: btn_right <= key_pressed; // right
'h76: btn_coin <= key_pressed; // ESC
'h05: btn_one_player <= key_pressed; // F1
'h06: btn_two_players <= key_pressed; // F2
// 'h14: btn_fire3 <= key_pressed; // ctrl
// 'h11: btn_fire2 <= key_pressed; // alt
'h29: btn_fire1 <= key_pressed; // Space
endcase
end
end
endmodule

View File

@@ -1,64 +0,0 @@
module GSPRAM #(parameter AW,parameter DW)
(
input CL,
input [(AW-1):0] AD,
input WE,
input [(DW-1):0] DI,
output reg [(DW-1):0] DO
);
reg [(DW-1):0] core[0:((2**AW)-1)];
always @(posedge CL) begin
DO <= core[AD];
if (WE) core[AD] <= DI;
end
endmodule
module GDPRAM #(parameter AW,parameter DW)
(
input CL0,
input [(AW-1):0] AD0,
output reg [(DW-1):0] DO0,
input CL1,
input [(AW-1):0] AD1,
input WE1,
input [(DW-1):0] DI1,
output reg [(DW-1):0] DO1
);
reg [(DW-1):0] core[0:((2**AW)-1)];
always @(posedge CL0) DO0 <= core[AD0];
always @(posedge CL1) begin DO1 <= core[AD1]; if (WE1) core[AD1] <= DI1; end
endmodule
/*
module GLINEBUF #(parameter AW,parameter DW)
(
input CL0,
input [(AW-1):0] AD0,
input WE0,
output reg [(DW-1):0] DO0,
input CL1,
input [(AW-1):0] AD1,
input WE1,
input [(DW-1):0] DI1
);
reg [(DW-1):0] core[0:((2**AW)-1)];
always @(posedge CL0) begin DO0 <= core[AD0]; if (WE0) core[AD0] <= 0; end
always @(posedge CL1) if (WE1) core[AD1] <= DI1;
endmodule*/

View File

@@ -1,278 +0,0 @@
library ieee;
use ieee.std_logic_1164.all,ieee.numeric_std.all;
entity nrx_chr_rom is
port (
clk : in std_logic;
addr : in std_logic_vector(11 downto 0);
data : out std_logic_vector(7 downto 0)
);
end entity;
architecture prom of nrx_chr_rom is
type rom is array(0 to 4095) of std_logic_vector(7 downto 0);
signal rom_data: rom := (
X"CC",X"66",X"33",X"33",X"33",X"22",X"CC",X"00",X"11",X"22",X"66",X"66",X"66",X"33",X"11",X"00",
X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"00",
X"EE",X"33",X"77",X"EE",X"CC",X"00",X"FF",X"00",X"33",X"66",X"00",X"11",X"33",X"77",X"77",X"00",
X"FF",X"66",X"CC",X"EE",X"33",X"33",X"EE",X"00",X"33",X"00",X"00",X"11",X"00",X"66",X"33",X"00",
X"EE",X"EE",X"66",X"66",X"FF",X"66",X"66",X"00",X"00",X"11",X"33",X"66",X"77",X"00",X"00",X"00",
X"EE",X"00",X"EE",X"33",X"33",X"33",X"EE",X"00",X"77",X"66",X"77",X"00",X"00",X"66",X"33",X"00",
X"EE",X"00",X"00",X"EE",X"33",X"33",X"EE",X"00",X"11",X"33",X"66",X"77",X"66",X"66",X"33",X"00",
X"FF",X"33",X"66",X"CC",X"88",X"88",X"88",X"00",X"77",X"66",X"00",X"00",X"11",X"11",X"11",X"00",
X"CC",X"22",X"22",X"CC",X"FF",X"33",X"EE",X"00",X"33",X"66",X"77",X"33",X"44",X"44",X"33",X"00",
X"EE",X"33",X"33",X"FF",X"33",X"66",X"CC",X"00",X"33",X"66",X"66",X"33",X"00",X"00",X"33",X"00",
X"CC",X"66",X"33",X"33",X"FF",X"33",X"33",X"00",X"11",X"33",X"66",X"66",X"77",X"66",X"66",X"00",
X"EE",X"33",X"33",X"EE",X"33",X"33",X"EE",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"77",X"00",
X"EE",X"33",X"00",X"00",X"00",X"33",X"EE",X"00",X"11",X"33",X"66",X"66",X"66",X"33",X"11",X"00",
X"CC",X"66",X"33",X"33",X"33",X"66",X"CC",X"00",X"77",X"66",X"66",X"66",X"66",X"66",X"77",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"66",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"CC",X"22",X"99",X"11",X"11",X"99",X"22",X"CC",X"33",X"44",X"99",X"AA",X"AA",X"99",X"44",X"33",
X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",
X"07",X"07",X"00",X"0F",X"0F",X"0C",X"0F",X"0F",X"08",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",
X"01",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"0F",X"0F",X"01",X"0F",X"0F",X"01",X"0F",X"0F",
X"0F",X"0F",X"09",X"09",X"09",X"09",X"09",X"09",X"0F",X"0F",X"09",X"09",X"09",X"09",X"09",X"09",
X"0F",X"0F",X"08",X"08",X"08",X"08",X"0F",X"0F",X"00",X"09",X"09",X"09",X"09",X"09",X"09",X"08",
X"03",X"07",X"06",X"06",X"06",X"06",X"07",X"03",X"0E",X"0E",X"00",X"00",X"00",X"00",X"0E",X"0E",
X"00",X"08",X"08",X"08",X"08",X"08",X"08",X"00",X"0F",X"0F",X"01",X"01",X"01",X"01",X"0F",X"0F",
X"EE",X"11",X"DD",X"55",X"FF",X"00",X"EE",X"00",X"33",X"44",X"55",X"55",X"55",X"44",X"33",X"00",
X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"11",X"11",X"00",X"33",X"33",
X"66",X"66",X"22",X"44",X"00",X"00",X"00",X"00",X"33",X"33",X"11",X"22",X"00",X"00",X"00",X"00",
X"66",X"66",X"FF",X"66",X"FF",X"66",X"66",X"00",X"33",X"33",X"77",X"33",X"77",X"33",X"33",X"00",
X"88",X"EE",X"88",X"EE",X"BB",X"EE",X"88",X"00",X"00",X"33",X"66",X"33",X"00",X"33",X"00",X"00",
X"11",X"22",X"44",X"88",X"33",X"55",X"77",X"00",X"77",X"55",X"66",X"00",X"11",X"22",X"44",X"00",
X"00",X"88",X"88",X"33",X"AA",X"44",X"BB",X"00",X"33",X"44",X"55",X"33",X"66",X"44",X"33",X"00",
X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"11",X"00",X"00",X"00",X"00",
X"CC",X"88",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"11",X"33",X"33",X"33",X"11",X"00",X"00",
X"88",X"CC",X"66",X"66",X"66",X"CC",X"88",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"11",X"00",
X"88",X"AA",X"CC",X"88",X"CC",X"AA",X"88",X"00",X"00",X"22",X"11",X"00",X"11",X"22",X"00",X"00",
X"00",X"88",X"88",X"EE",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"22",X"00",
X"00",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"CC",X"66",X"33",X"33",X"33",X"22",X"CC",X"00",X"11",X"22",X"66",X"66",X"66",X"33",X"11",X"00",
X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"00",
X"EE",X"33",X"77",X"EE",X"CC",X"00",X"FF",X"00",X"33",X"66",X"00",X"11",X"33",X"77",X"77",X"00",
X"FF",X"66",X"CC",X"EE",X"33",X"33",X"EE",X"00",X"33",X"00",X"00",X"11",X"00",X"66",X"33",X"00",
X"EE",X"EE",X"66",X"66",X"FF",X"66",X"66",X"00",X"00",X"11",X"33",X"66",X"77",X"00",X"00",X"00",
X"EE",X"00",X"EE",X"33",X"33",X"33",X"EE",X"00",X"77",X"66",X"77",X"00",X"00",X"66",X"33",X"00",
X"EE",X"00",X"00",X"EE",X"33",X"33",X"EE",X"00",X"11",X"33",X"66",X"77",X"66",X"66",X"33",X"00",
X"FF",X"33",X"66",X"CC",X"88",X"88",X"88",X"00",X"77",X"66",X"00",X"00",X"11",X"11",X"11",X"00",
X"CC",X"22",X"22",X"CC",X"FF",X"33",X"EE",X"00",X"33",X"66",X"77",X"33",X"44",X"44",X"33",X"00",
X"EE",X"33",X"33",X"FF",X"33",X"66",X"CC",X"00",X"33",X"66",X"66",X"33",X"00",X"00",X"33",X"00",
X"00",X"88",X"88",X"00",X"88",X"88",X"00",X"00",X"00",X"11",X"11",X"00",X"11",X"11",X"00",X"00",
X"00",X"88",X"88",X"00",X"88",X"88",X"00",X"00",X"00",X"11",X"11",X"00",X"11",X"00",X"11",X"00",
X"66",X"CC",X"88",X"00",X"88",X"CC",X"66",X"00",X"00",X"00",X"11",X"33",X"11",X"00",X"00",X"00",
X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"00",X"00",X"00",X"77",X"77",X"00",X"77",X"77",X"00",X"00",
X"00",X"88",X"CC",X"66",X"CC",X"88",X"00",X"00",X"33",X"11",X"00",X"00",X"00",X"11",X"33",X"00",
X"EE",X"33",X"33",X"66",X"CC",X"00",X"CC",X"CC",X"33",X"66",X"66",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"CC",X"66",X"33",X"33",X"FF",X"33",X"33",X"00",X"11",X"33",X"66",X"66",X"77",X"66",X"66",X"00",
X"EE",X"33",X"33",X"EE",X"33",X"33",X"EE",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"77",X"00",
X"EE",X"33",X"00",X"00",X"00",X"33",X"EE",X"00",X"11",X"33",X"66",X"66",X"66",X"33",X"11",X"00",
X"CC",X"66",X"33",X"33",X"33",X"66",X"CC",X"00",X"77",X"66",X"66",X"66",X"66",X"66",X"77",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"66",X"00",
X"FF",X"00",X"00",X"77",X"33",X"33",X"FF",X"00",X"11",X"33",X"66",X"66",X"66",X"33",X"11",X"00",
X"33",X"33",X"33",X"FF",X"33",X"33",X"33",X"00",X"66",X"66",X"66",X"77",X"66",X"66",X"66",X"00",
X"FF",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"33",X"00",
X"33",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"33",X"00",
X"33",X"66",X"CC",X"88",X"CC",X"EE",X"77",X"00",X"66",X"66",X"66",X"77",X"77",X"66",X"66",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"33",X"77",X"FF",X"FF",X"BB",X"33",X"33",X"00",X"66",X"77",X"77",X"77",X"66",X"66",X"66",X"00",
X"33",X"33",X"BB",X"FF",X"FF",X"77",X"33",X"00",X"66",X"77",X"77",X"77",X"66",X"66",X"66",X"00",
X"EE",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00",
X"EE",X"33",X"33",X"33",X"EE",X"00",X"00",X"00",X"77",X"66",X"66",X"66",X"77",X"66",X"66",X"00",
X"EE",X"33",X"33",X"33",X"FF",X"66",X"DD",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00",
X"EE",X"33",X"33",X"77",X"CC",X"EE",X"77",X"00",X"77",X"66",X"66",X"66",X"77",X"66",X"66",X"00",
X"CC",X"66",X"00",X"EE",X"33",X"33",X"EE",X"00",X"33",X"66",X"66",X"33",X"00",X"66",X"33",X"00",
X"FF",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"33",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"66",X"66",X"66",X"66",X"66",X"66",X"33",X"00",
X"33",X"33",X"33",X"77",X"EE",X"CC",X"88",X"00",X"66",X"66",X"66",X"77",X"33",X"11",X"00",X"00",
X"33",X"33",X"BB",X"FF",X"FF",X"77",X"33",X"00",X"66",X"66",X"66",X"77",X"77",X"77",X"66",X"00",
X"33",X"77",X"EE",X"CC",X"EE",X"77",X"33",X"00",X"66",X"77",X"33",X"11",X"33",X"77",X"66",X"00",
X"33",X"33",X"33",X"EE",X"CC",X"CC",X"CC",X"00",X"33",X"33",X"33",X"11",X"00",X"00",X"00",X"00",
X"FF",X"77",X"EE",X"CC",X"88",X"00",X"FF",X"00",X"77",X"00",X"00",X"11",X"33",X"77",X"77",X"00",
X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",
X"0F",X"0F",X"3F",X"BF",X"DB",X"FF",X"F6",X"FF",X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"0F",X"3F",
X"0F",X"EF",X"7F",X"96",X"F3",X"FF",X"F9",X"FF",X"0F",X"4F",X"FF",X"F3",X"FF",X"F7",X"FF",X"FF",
X"0F",X"0F",X"0F",X"0F",X"87",X"8F",X"0F",X"4F",X"0F",X"0F",X"CF",X"87",X"FC",X"FF",X"BF",X"EF",
X"FA",X"FB",X"FD",X"FF",X"B6",X"DB",X"EF",X"F6",X"7F",X"7E",X"3D",X"5F",X"7D",X"7D",X"3F",X"7E",
X"F9",X"F7",X"FE",X"7F",X"FF",X"F9",X"EF",X"F7",X"F7",X"F7",X"9F",X"EF",X"FE",X"F5",X"7F",X"FF",
X"EB",X"EB",X"CF",X"2F",X"EB",X"E7",X"EF",X"6F",X"FD",X"F3",X"FC",X"FF",X"F5",X"FB",X"EF",X"FB",
X"7E",X"FF",X"FB",X"FD",X"7B",X"1F",X"0F",X"0F",X"3F",X"2F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",
X"F7",X"FF",X"FF",X"FF",X"FF",X"F9",X"EF",X"0F",X"CC",X"FF",X"FD",X"FD",X"17",X"E9",X"6F",X"0F",
X"0F",X"CF",X"8F",X"8F",X"0F",X"0F",X"0F",X"0F",X"F7",X"FF",X"FA",X"F7",X"7F",X"0F",X"0F",X"0F",
X"FF",X"5F",X"0F",X"8F",X"C3",X"F3",X"9F",X"3F",X"FF",X"FF",X"FF",X"CF",X"CF",X"CF",X"CF",X"FF",
X"FF",X"EF",X"CF",X"CF",X"8F",X"FF",X"8F",X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"3F",X"1F",X"1F",X"1F",X"1F",X"3F",X"FF",X"3F",X"2F",X"2F",X"2F",X"79",X"F8",X"78",
X"7F",X"FF",X"FF",X"DF",X"1F",X"3F",X"3C",X"FC",X"FF",X"FF",X"FF",X"FF",X"EF",X"CF",X"CF",X"EF",
X"0F",X"0F",X"DF",X"6F",X"2F",X"0F",X"3F",X"3F",X"FF",X"BF",X"1F",X"0F",X"1F",X"9F",X"EF",X"C7",
X"5F",X"9F",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"78",X"F8",X"1E",X"1F",X"1F",X"3F",X"FF",X"FF",
X"3C",X"3F",X"1F",X"1F",X"2F",X"6F",X"FF",X"FF",X"FF",X"EF",X"CF",X"CF",X"CF",X"EF",X"FF",X"FF",
X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E7",X"97",X"0F",X"0F",X"0F",X"1F",X"3F",X"FF",
X"FF",X"7F",X"7F",X"9F",X"9F",X"1F",X"3F",X"FF",X"FF",X"CF",X"CF",X"3C",X"3C",X"1F",X"EF",X"FF",
X"EE",X"7F",X"1D",X"9F",X"97",X"9F",X"3F",X"7F",X"EC",X"CF",X"8F",X"3E",X"38",X"3E",X"8F",X"CF",
X"DD",X"7F",X"3F",X"9F",X"95",X"9F",X"3F",X"7F",X"FF",X"CF",X"8F",X"3E",X"34",X"3E",X"8F",X"CF",
X"1D",X"1F",X"C7",X"C3",X"C7",X"1F",X"3F",X"FF",X"CD",X"CF",X"17",X"9E",X"9B",X"CF",X"EF",X"FF",
X"EF",X"3F",X"1F",X"C7",X"C3",X"C7",X"1F",X"3F",X"33",X"EF",X"CF",X"9F",X"9E",X"9F",X"CF",X"EB",
X"8B",X"7F",X"3F",X"9F",X"97",X"9F",X"3F",X"6F",X"6E",X"CF",X"8F",X"3E",X"3C",X"3E",X"8F",X"4F",
X"7F",X"3F",X"9F",X"97",X"9F",X"3F",X"7F",X"FF",X"E6",X"8F",X"3E",X"3C",X"3E",X"8F",X"CF",X"FF",
X"3F",X"1F",X"C7",X"C3",X"C7",X"1F",X"3E",X"FF",X"EF",X"CF",X"9F",X"9E",X"9F",X"CF",X"AF",X"FF",
X"FF",X"7F",X"3F",X"9F",X"97",X"9F",X"3F",X"7F",X"FF",X"CF",X"8F",X"3E",X"3C",X"3E",X"8F",X"CF",
X"7F",X"3F",X"9F",X"97",X"9F",X"3F",X"5D",X"FF",X"CF",X"8F",X"3E",X"3C",X"3E",X"8F",X"0B",X"FF",
X"FF",X"FE",X"FE",X"FF",X"EF",X"FE",X"FC",X"ED",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FA",X"F3",X"FF",X"FF",X"F7",X"F7",X"F7",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"F7",X"FF",X"DF",X"CF",X"F8",X"BC",X"E8",X"BC",X"3C",
X"E9",X"DF",X"F8",X"F8",X"F8",X"78",X"78",X"78",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FE",X"FE",X"FE",X"EF",X"D6",X"FF",X"FF",X"F3",X"B3",X"F1",X"B1",X"10",X"91",X"91",X"11",
X"77",X"11",X"7F",X"77",X"31",X"75",X"FA",X"FF",X"78",X"E0",X"E3",X"E8",X"E0",X"E0",X"C0",X"EC",
X"68",X"D2",X"F2",X"F6",X"FE",X"FE",X"FE",X"FF",X"FE",X"EF",X"FF",X"FC",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"F7",X"FB",X"FF",X"FE",X"FF",X"FF",X"31",X"90",X"B1",X"FC",X"77",X"77",X"77",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"FF",X"FF",X"EC",X"EC",X"FF",X"FF",X"F2",X"F0",X"FF",X"79",
X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"10",X"10",X"00",X"00",X"00",X"00",X"10",X"10",
X"F0",X"F0",X"F0",X"F0",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00",X"00",
X"F0",X"F0",X"F0",X"78",X"1E",X"78",X"F0",X"F0",X"F0",X"78",X"1E",X"0F",X"0F",X"0F",X"1E",X"78",
X"F0",X"F0",X"E1",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"3C",X"3C",X"F0",X"F0",X"F0",X"F0",
X"F0",X"FC",X"F6",X"F0",X"FC",X"F6",X"F6",X"FC",X"F0",X"F3",X"F6",X"F6",X"F3",X"F0",X"F6",X"F3",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"F3",X"F7",X"EF",X"CF",X"CF",X"CF",X"CF",X"CF",
X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",
X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF",X"CF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"F0",X"60",X"40",X"F0",X"70",X"70",X"C0",X"B3",X"F0",X"E0",X"F0",X"C0",X"83",X"C1",X"E0",X"D0",
X"F0",X"F0",X"30",X"DC",X"9C",X"0E",X"0F",X"0F",X"F0",X"F0",X"C0",X"B3",X"33",X"67",X"67",X"67",
X"F0",X"F0",X"F0",X"F0",X"D0",X"70",X"38",X"38",X"F0",X"F0",X"90",X"F0",X"B0",X"C0",X"41",X"60",
X"67",X"67",X"67",X"67",X"47",X"47",X"00",X"0D",X"F0",X"F0",X"F0",X"C0",X"83",X"83",X"81",X"C1",
X"0F",X"0C",X"1F",X"2F",X"2F",X"4F",X"4F",X"0F",X"09",X"0D",X"0D",X"0D",X"0D",X"09",X"0D",X"0E",
X"70",X"F0",X"70",X"38",X"38",X"1C",X"18",X"1C",X"60",X"70",X"88",X"0F",X"0F",X"0B",X"0D",X"0D",
X"0D",X"0D",X"0D",X"0D",X"07",X"83",X"C0",X"F0",X"83",X"83",X"C0",X"E0",X"F0",X"90",X"90",X"F0",
X"0F",X"0F",X"0F",X"0E",X"0F",X"0E",X"10",X"F0",X"0E",X"08",X"0B",X"0B",X"0F",X"0E",X"10",X"F0",
X"18",X"70",X"70",X"F0",X"F0",X"50",X"70",X"F0",X"0D",X"0F",X"00",X"70",X"60",X"C1",X"E0",X"F0",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"F0",X"E0",X"D0",X"D0",X"D0",X"D0",X"D0",X"60",X"F0",X"E0",X"C0",X"E0",X"E0",X"E0",X"E0",X"C0",
X"F0",X"E0",X"50",X"50",X"D0",X"D0",X"D0",X"60",X"F0",X"C0",X"B0",X"B0",X"E0",X"D0",X"B0",X"80",
X"F0",X"E0",X"50",X"50",X"D0",X"50",X"50",X"E0",X"F0",X"C0",X"B0",X"F0",X"E0",X"F0",X"B0",X"C0",
X"F0",X"E0",X"D0",X"D0",X"D0",X"50",X"D0",X"E0",X"F0",X"A0",X"A0",X"A0",X"A0",X"80",X"E0",X"E0",
X"F0",X"60",X"D0",X"D0",X"50",X"50",X"50",X"E0",X"F0",X"80",X"B0",X"80",X"F0",X"F0",X"B0",X"C0",
X"F0",X"E0",X"50",X"D0",X"D0",X"50",X"50",X"E0",X"F0",X"C0",X"B0",X"B0",X"80",X"B0",X"B0",X"C0",
X"F0",X"60",X"50",X"D0",X"D0",X"D0",X"D0",X"E0",X"F0",X"80",X"F0",X"E0",X"E0",X"D0",X"D0",X"D0",
X"F0",X"E0",X"50",X"50",X"D0",X"50",X"50",X"E0",X"F0",X"C0",X"B0",X"B0",X"C0",X"B0",X"B0",X"C0",
X"F0",X"E0",X"50",X"50",X"50",X"50",X"50",X"E0",X"F0",X"C0",X"B0",X"B0",X"C0",X"F0",X"B0",X"C0",
X"00",X"10",X"B0",X"F0",X"B0",X"10",X"10",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"F0",X"30",X"D0",X"D0",X"D0",X"D0",X"D0",X"30",X"F0",X"70",X"A0",X"A0",X"A0",X"A0",X"A0",X"70",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"90",X"60",X"60",X"60",X"60",X"60",X"90",
X"F0",X"90",X"60",X"E0",X"D0",X"B0",X"00",X"F0",X"F0",X"F0",X"F0",X"50",X"B0",X"50",X"F0",X"F0",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"10",X"B0",X"F0",X"B0",X"10",X"10",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"D0",X"F0",X"D0",X"80",X"80",X"C0",
X"B0",X"F0",X"90",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",
X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"D0",X"F0",X"90",X"00",X"00",X"00",X"00",X"00",
X"F0",X"F0",X"E1",X"69",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"96",X"87",X"C3",X"C3",X"E1",X"E1",
X"F0",X"C3",X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"B4",X"3C",X"3C",X"1E",X"0F",X"0F",X"0F",X"0F",
X"F0",X"F0",X"96",X"1E",X"1E",X"3C",X"3C",X"3C",X"78",X"78",X"78",X"2D",X"0F",X"0F",X"0F",X"0F",
X"8F",X"5F",X"5F",X"9F",X"5F",X"5F",X"9F",X"0F",X"F3",X"E3",X"E3",X"3F",X"A7",X"E3",X"F3",X"E1",
X"8F",X"8F",X"CF",X"AF",X"9F",X"8F",X"8F",X"0F",X"CF",X"2F",X"2F",X"EF",X"2F",X"2F",X"2F",X"0F",
X"F8",X"7C",X"78",X"FC",X"7C",X"5E",X"DE",X"1E",X"9F",X"AF",X"AF",X"AF",X"AF",X"AF",X"9F",X"0F",
X"0F",X"0F",X"0F",X"1E",X"78",X"F0",X"F0",X"F0",X"E1",X"C3",X"C3",X"87",X"87",X"1E",X"78",X"F0",
X"0F",X"0F",X"0F",X"69",X"78",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"96",X"D2",
X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"1E",X"1E",X"1E",X"96",X"D2",X"D2",
X"F0",X"00",X"FF",X"FF",X"FF",X"FF",X"CC",X"BB",X"F0",X"E0",X"D1",X"B3",X"B3",X"B3",X"91",X"FF",
X"F7",X"FF",X"77",X"BB",X"BB",X"BB",X"33",X"CC",X"F0",X"70",X"00",X"77",X"77",X"FF",X"33",X"DD",
X"F0",X"70",X"B8",X"DC",X"DC",X"DC",X"DC",X"30",X"F8",X"EC",X"DD",X"DD",X"FF",X"FF",X"FF",X"FF",
X"77",X"77",X"55",X"BB",X"33",X"BB",X"CC",X"66",X"FF",X"FF",X"FF",X"FF",X"44",X"D9",X"D1",X"C0",
X"33",X"BB",X"BB",X"22",X"AA",X"DD",X"FF",X"FF",X"CC",X"FF",X"FF",X"EE",X"DD",X"DD",X"BB",X"77",
X"CC",X"EE",X"EE",X"EE",X"FF",X"10",X"F0",X"F0",X"FF",X"FF",X"FF",X"33",X"DD",X"DD",X"EE",X"EE",
X"DD",X"DD",X"EE",X"FF",X"EE",X"EE",X"00",X"F0",X"B3",X"B3",X"B3",X"77",X"77",X"91",X"E0",X"F0",
X"EE",X"99",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"77",X"99",X"EE",X"DD",X"DD",X"30",
X"70",X"B8",X"B8",X"DC",X"DC",X"30",X"F0",X"F0",X"CC",X"FF",X"FF",X"FF",X"FF",X"BB",X"88",X"70",
X"0F",X"69",X"69",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"87",X"87",X"87",X"87",X"87",X"87",X"00",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3",X"00",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"00",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",
X"EE",X"00",X"CC",X"00",X"00",X"00",X"00",X"08",X"77",X"66",X"77",X"66",X"66",X"00",X"00",X"00",
X"66",X"66",X"66",X"66",X"CC",X"00",X"00",X"00",X"66",X"66",X"66",X"66",X"33",X"00",X"00",X"02",
X"EE",X"00",X"CC",X"00",X"EE",X"00",X"00",X"02",X"77",X"66",X"77",X"66",X"77",X"00",X"80",X"80",
X"00",X"00",X"00",X"00",X"EE",X"00",X"00",X"08",X"66",X"66",X"66",X"66",X"77",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",
X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"CC",X"66",X"33",X"33",X"FF",X"33",X"33",X"00",X"11",X"33",X"66",X"66",X"66",X"33",X"11",X"00",
X"FF",X"00",X"00",X"77",X"33",X"33",X"FF",X"00",X"11",X"33",X"66",X"66",X"77",X"66",X"66",X"00",
X"33",X"33",X"33",X"77",X"EE",X"CC",X"88",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00",
X"EE",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"66",X"66",X"66",X"77",X"33",X"11",X"00",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"66",X"77",X"77",X"77",X"66",X"66",X"66",X"00",
X"33",X"77",X"FF",X"FF",X"BB",X"33",X"33",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"EE",X"33",X"33",X"77",X"CC",X"EE",X"77",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"77",X"66",X"66",X"66",X"77",X"66",X"66",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"CC",X"CC",X"CC",X"00",X"00",X"00",X"00",X"00",X"33",X"33",X"33",X"00",X"00",X"00",
X"01",X"03",X"8B",X"8F",X"8B",X"03",X"03",X"12",X"08",X"0C",X"1D",X"1F",X"1D",X"0C",X"0C",X"84",
X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"77",X"77",X"77",X"77",X"77",X"00",X"00",
X"16",X"16",X"16",X"1E",X"17",X"27",X"22",X"22",X"86",X"86",X"86",X"87",X"8E",X"4E",X"44",X"44",
X"00",X"00",X"08",X"08",X"33",X"7F",X"77",X"66",X"00",X"00",X"00",X"00",X"00",X"00",X"77",X"77",
X"33",X"77",X"77",X"66",X"00",X"01",X"03",X"12",X"00",X"07",X"07",X"0F",X"0F",X"0F",X"0E",X"86",
X"00",X"00",X"00",X"88",X"88",X"88",X"00",X"00",X"FF",X"EF",X"EF",X"01",X"00",X"11",X"11",X"00",
X"16",X"3C",X"78",X"3C",X"CF",X"23",X"44",X"44",X"C2",X"86",X"0C",X"3B",X"3B",X"77",X"77",X"77",
X"00",X"00",X"00",X"0C",X"0E",X"0E",X"0E",X"08",X"00",X"00",X"00",X"33",X"FF",X"FF",X"EE",X"01",
X"00",X"00",X"00",X"88",X"88",X"8B",X"16",X"3C",X"77",X"FF",X"EE",X"02",X"03",X"0F",X"0F",X"87",
X"77",X"FF",X"EE",X"00",X"00",X"00",X"00",X"00",X"03",X"23",X"DD",X"11",X"66",X"00",X"00",X"00",
X"F0",X"E1",X"4B",X"0E",X"1F",X"77",X"77",X"77",X"86",X"0C",X"00",X"00",X"CC",X"CC",X"CC",X"00",
X"00",X"00",X"CC",X"CC",X"CC",X"08",X"0E",X"0F",X"00",X"33",X"33",X"33",X"00",X"03",X"EF",X"13",
X"00",X"EE",X"EE",X"EE",X"08",X"0F",X"0F",X"F0",X"00",X"00",X"11",X"11",X"11",X"00",X"0F",X"87",
X"0F",X"0E",X"08",X"CC",X"CC",X"CC",X"00",X"00",X"13",X"EF",X"03",X"00",X"33",X"33",X"33",X"00",
X"F0",X"0F",X"0F",X"08",X"EE",X"EE",X"EE",X"00",X"87",X"0F",X"00",X"11",X"11",X"11",X"00",X"00");
begin
process(clk)
begin
if rising_edge(clk) then
data <= rom_data(to_integer(unsigned(addr)));
end if;
end process;
end architecture;

View File

@@ -1,38 +0,0 @@
library ieee;
use ieee.std_logic_1164.all,ieee.numeric_std.all;
entity nrx_col_rom is
port (
clk : in std_logic;
addr : in std_logic_vector(7 downto 0);
data : out std_logic_vector(7 downto 0)
);
end entity;
architecture prom of nrx_col_rom is
type rom is array(0 to 255) of std_logic_vector(7 downto 0);
signal rom_data: rom := (
X"00",X"00",X"00",X"00",X"00",X"09",X"0E",X"01",X"00",X"02",X"05",X"01",X"00",X"0C",X"08",X"00",
X"00",X"03",X"08",X"02",X"00",X"03",X"08",X"0E",X"00",X"02",X"08",X"00",X"08",X"02",X"02",X"02",
X"08",X"0F",X"0F",X"0F",X"08",X"0B",X"09",X"0F",X"08",X"0B",X"0F",X"02",X"00",X"02",X"03",X"07",
X"00",X"07",X"03",X"0A",X"00",X"0A",X"08",X"06",X"00",X"06",X"08",X"00",X"00",X"04",X"08",X"06",
X"00",X"0C",X"08",X"06",X"00",X"07",X"03",X"0A",X"00",X"0E",X"02",X"07",X"00",X"05",X"03",X"07",
X"00",X"03",X"0A",X"07",X"00",X"0B",X"08",X"06",X"00",X"03",X"08",X"02",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"0F",X"08",X"00",X"00",X"02",X"00",X"0D",X"03",X"04",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"0F",X"00",X"00",X"00",X"00",
X"00",X"03",X"00",X"00",X"00",X"00",X"03",X"03",X"00",X"00",X"00",X"03",X"00",X"0E",X"02",X"0A",
X"00",X"09",X"00",X"00",X"00",X"00",X"09",X"09",X"00",X"00",X"09",X"00",X"00",X"02",X"00",X"00",
X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"05",X"00",X"02",X"02",X"02",
X"05",X"00",X"00",X"00",X"05",X"00",X"00",X"02",X"05",X"00",X"00",X"03",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00");
begin
process(clk)
begin
if rising_edge(clk) then
data <= rom_data(to_integer(unsigned(addr)));
end if;
end process;
end architecture;

View File

@@ -1,38 +0,0 @@
library ieee;
use ieee.std_logic_1164.all,ieee.numeric_std.all;
entity nrx_dot_rom is
port (
clk : in std_logic;
addr : in std_logic_vector(7 downto 0);
data : out std_logic_vector(7 downto 0)
);
end entity;
architecture prom of nrx_dot_rom is
type rom is array(0 to 255) of std_logic_vector(7 downto 0);
signal rom_data: rom := (
X"02",X"02",X"03",X"03",X"02",X"02",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",
X"01",X"01",X"03",X"03",X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",
X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",
X"00",X"00",X"03",X"03",X"00",X"00",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",
X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",
X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",
X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",
X"02",X"02",X"02",X"02",X"02",X"01",X"01",X"02",X"02",X"01",X"01",X"02",X"02",X"02",X"02",X"02",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00");
begin
process(clk)
begin
if rising_edge(clk) then
data <= rom_data(to_integer(unsigned(addr)));
end if;
end process;
end architecture;

View File

@@ -1,38 +0,0 @@
library ieee;
use ieee.std_logic_1164.all,ieee.numeric_std.all;
entity nrx_nam_rom is
port (
clk : in std_logic;
addr : in std_logic_vector(7 downto 0);
data : out std_logic_vector(7 downto 0)
);
end entity;
architecture prom of nrx_nam_rom is
type rom is array(0 to 255) of std_logic_vector(7 downto 0);
signal rom_data: rom := (
X"08",X"08",X"08",X"08",X"08",X"0F",X"0F",X"08",X"08",X"00",X"00",X"00",X"08",X"08",X"08",X"08",
X"0F",X"0F",X"0F",X"08",X"00",X"00",X"08",X"08",X"08",X"08",X"0F",X"0F",X"08",X"08",X"00",X"00",
X"08",X"08",X"08",X"00",X"08",X"0F",X"0F",X"0F",X"08",X"08",X"08",X"00",X"08",X"08",X"08",X"00",
X"00",X"00",X"00",X"08",X"00",X"00",X"08",X"08",X"08",X"08",X"00",X"00",X"00",X"08",X"00",X"00",
X"08",X"08",X"0F",X"08",X"08",X"08",X"0F",X"08",X"08",X"00",X"00",X"00",X"08",X"0F",X"08",X"08",
X"0F",X"08",X"08",X"00",X"00",X"00",X"08",X"0F",X"08",X"08",X"08",X"0F",X"08",X"00",X"00",X"00",
X"08",X"08",X"08",X"00",X"08",X"08",X"0F",X"0F",X"00",X"00",X"08",X"08",X"08",X"0F",X"0F",X"0F",
X"00",X"08",X"08",X"00",X"0F",X"0F",X"08",X"08",X"08",X"08",X"0F",X"08",X"00",X"00",X"00",X"08",
X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",X"0F",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"01",X"02",X"03",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"08",X"07",X"06",X"05",X"04",X"03",X"02",X"01",X"00",X"00",
X"01",X"01",X"02",X"02",X"03",X"03",X"04",X"04",X"05",X"05",X"06",X"06",X"07",X"07",X"08",X"08",
X"09",X"09",X"0A",X"0A",X"0B",X"0B",X"0C",X"0C",X"0D",X"0D",X"0E",X"0E",X"0F",X"0F",X"00",X"00",
X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00");
begin
process(clk)
begin
if rising_edge(clk) then
data <= rom_data(to_integer(unsigned(addr)));
end if;
end process;
end architecture;

View File

@@ -1,278 +0,0 @@
library ieee;
use ieee.std_logic_1164.all,ieee.numeric_std.all;
entity nrx_nchr_rom is
port (
clk : in std_logic;
addr : in std_logic_vector(11 downto 0);
data : out std_logic_vector(7 downto 0)
);
end entity;
architecture prom of nrx_nchr_rom is
type rom is array(0 to 4095) of std_logic_vector(7 downto 0);
signal rom_data: rom := (
X"CC",X"66",X"33",X"33",X"33",X"22",X"CC",X"00",X"11",X"22",X"66",X"66",X"66",X"33",X"11",X"00",
X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"00",
X"EE",X"33",X"77",X"EE",X"CC",X"00",X"FF",X"00",X"33",X"66",X"00",X"11",X"33",X"77",X"77",X"00",
X"FF",X"66",X"CC",X"EE",X"33",X"33",X"EE",X"00",X"33",X"00",X"00",X"11",X"00",X"66",X"33",X"00",
X"EE",X"EE",X"66",X"66",X"FF",X"66",X"66",X"00",X"00",X"11",X"33",X"66",X"77",X"00",X"00",X"00",
X"EE",X"00",X"EE",X"33",X"33",X"33",X"EE",X"00",X"77",X"66",X"77",X"00",X"00",X"66",X"33",X"00",
X"EE",X"00",X"00",X"EE",X"33",X"33",X"EE",X"00",X"11",X"33",X"66",X"77",X"66",X"66",X"33",X"00",
X"FF",X"33",X"66",X"CC",X"88",X"88",X"88",X"00",X"77",X"66",X"00",X"00",X"11",X"11",X"11",X"00",
X"CC",X"22",X"22",X"CC",X"FF",X"33",X"EE",X"00",X"33",X"66",X"77",X"33",X"44",X"44",X"33",X"00",
X"EE",X"33",X"33",X"FF",X"33",X"66",X"CC",X"00",X"33",X"66",X"66",X"33",X"00",X"00",X"33",X"00",
X"CC",X"66",X"33",X"33",X"FF",X"33",X"33",X"00",X"11",X"33",X"66",X"66",X"77",X"66",X"66",X"00",
X"EE",X"33",X"33",X"EE",X"33",X"33",X"EE",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"77",X"00",
X"EE",X"33",X"00",X"00",X"00",X"33",X"EE",X"00",X"11",X"33",X"66",X"66",X"66",X"33",X"11",X"00",
X"CC",X"66",X"33",X"33",X"33",X"66",X"CC",X"00",X"77",X"66",X"66",X"66",X"66",X"66",X"77",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"66",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"CC",X"22",X"99",X"11",X"11",X"99",X"22",X"CC",X"33",X"44",X"99",X"AA",X"AA",X"99",X"44",X"33",
X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",
X"07",X"07",X"00",X"0F",X"0F",X"0C",X"0F",X"0F",X"08",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",
X"01",X"09",X"09",X"09",X"09",X"09",X"09",X"09",X"0F",X"0F",X"01",X"0F",X"0F",X"01",X"0F",X"0F",
X"0F",X"0F",X"09",X"09",X"09",X"09",X"09",X"09",X"0F",X"0F",X"09",X"09",X"09",X"09",X"09",X"09",
X"0F",X"0F",X"08",X"08",X"08",X"08",X"0F",X"0F",X"00",X"09",X"09",X"09",X"09",X"09",X"09",X"08",
X"03",X"07",X"06",X"06",X"06",X"06",X"07",X"03",X"0E",X"0E",X"00",X"00",X"00",X"00",X"0E",X"0E",
X"00",X"08",X"08",X"08",X"08",X"08",X"08",X"00",X"0F",X"0F",X"01",X"01",X"01",X"01",X"0F",X"0F",
X"EE",X"11",X"DD",X"55",X"FF",X"00",X"EE",X"00",X"33",X"44",X"55",X"55",X"55",X"44",X"33",X"00",
X"CC",X"CC",X"88",X"88",X"00",X"00",X"00",X"00",X"11",X"11",X"11",X"11",X"11",X"00",X"33",X"33",
X"66",X"66",X"22",X"44",X"00",X"00",X"00",X"00",X"33",X"33",X"11",X"22",X"00",X"00",X"00",X"00",
X"66",X"66",X"FF",X"66",X"FF",X"66",X"66",X"00",X"33",X"33",X"77",X"33",X"77",X"33",X"33",X"00",
X"88",X"EE",X"88",X"EE",X"BB",X"EE",X"88",X"00",X"00",X"33",X"66",X"33",X"00",X"33",X"00",X"00",
X"11",X"22",X"44",X"88",X"33",X"55",X"77",X"00",X"77",X"55",X"66",X"00",X"11",X"22",X"44",X"00",
X"00",X"88",X"88",X"33",X"AA",X"44",X"BB",X"00",X"33",X"44",X"55",X"33",X"66",X"44",X"33",X"00",
X"88",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",X"11",X"00",X"00",X"00",X"00",
X"CC",X"88",X"00",X"00",X"00",X"88",X"CC",X"00",X"00",X"11",X"33",X"33",X"33",X"11",X"00",X"00",
X"88",X"CC",X"66",X"66",X"66",X"CC",X"88",X"00",X"11",X"00",X"00",X"00",X"00",X"00",X"11",X"00",
X"88",X"AA",X"CC",X"88",X"CC",X"AA",X"88",X"00",X"00",X"22",X"11",X"00",X"11",X"22",X"00",X"00",
X"00",X"88",X"88",X"EE",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"11",X"22",X"00",
X"00",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"33",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"88",X"88",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"11",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"CC",X"66",X"33",X"33",X"33",X"22",X"CC",X"00",X"11",X"22",X"66",X"66",X"66",X"33",X"11",X"00",
X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"00",X"00",X"11",X"00",X"00",X"00",X"00",X"33",X"00",
X"EE",X"33",X"77",X"EE",X"CC",X"00",X"FF",X"00",X"33",X"66",X"00",X"11",X"33",X"77",X"77",X"00",
X"FF",X"66",X"CC",X"EE",X"33",X"33",X"EE",X"00",X"33",X"00",X"00",X"11",X"00",X"66",X"33",X"00",
X"EE",X"EE",X"66",X"66",X"FF",X"66",X"66",X"00",X"00",X"11",X"33",X"66",X"77",X"00",X"00",X"00",
X"EE",X"00",X"EE",X"33",X"33",X"33",X"EE",X"00",X"77",X"66",X"77",X"00",X"00",X"66",X"33",X"00",
X"EE",X"00",X"00",X"EE",X"33",X"33",X"EE",X"00",X"11",X"33",X"66",X"77",X"66",X"66",X"33",X"00",
X"FF",X"33",X"66",X"CC",X"88",X"88",X"88",X"00",X"77",X"66",X"00",X"00",X"11",X"11",X"11",X"00",
X"CC",X"22",X"22",X"CC",X"FF",X"33",X"EE",X"00",X"33",X"66",X"77",X"33",X"44",X"44",X"33",X"00",
X"EE",X"33",X"33",X"FF",X"33",X"66",X"CC",X"00",X"33",X"66",X"66",X"33",X"00",X"00",X"33",X"00",
X"00",X"88",X"88",X"00",X"88",X"88",X"00",X"00",X"00",X"11",X"11",X"00",X"11",X"11",X"00",X"00",
X"00",X"88",X"88",X"00",X"88",X"88",X"00",X"00",X"00",X"11",X"11",X"00",X"11",X"00",X"11",X"00",
X"66",X"CC",X"88",X"00",X"88",X"CC",X"66",X"00",X"00",X"00",X"11",X"33",X"11",X"00",X"00",X"00",
X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"00",X"00",X"00",X"77",X"77",X"00",X"77",X"77",X"00",X"00",
X"00",X"88",X"CC",X"66",X"CC",X"88",X"00",X"00",X"33",X"11",X"00",X"00",X"00",X"11",X"33",X"00",
X"EE",X"33",X"33",X"66",X"CC",X"00",X"CC",X"CC",X"33",X"66",X"66",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"CC",X"66",X"33",X"33",X"FF",X"33",X"33",X"00",X"11",X"33",X"66",X"66",X"77",X"66",X"66",X"00",
X"EE",X"33",X"33",X"EE",X"33",X"33",X"EE",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"77",X"00",
X"EE",X"33",X"00",X"00",X"00",X"33",X"EE",X"00",X"11",X"33",X"66",X"66",X"66",X"33",X"11",X"00",
X"CC",X"66",X"33",X"33",X"33",X"66",X"CC",X"00",X"77",X"66",X"66",X"66",X"66",X"66",X"77",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"00",X"00",X"77",X"66",X"66",X"77",X"66",X"66",X"66",X"00",
X"FF",X"00",X"00",X"77",X"33",X"33",X"FF",X"00",X"11",X"33",X"66",X"66",X"66",X"33",X"11",X"00",
X"33",X"33",X"33",X"FF",X"33",X"33",X"33",X"00",X"66",X"66",X"66",X"77",X"66",X"66",X"66",X"00",
X"FF",X"CC",X"CC",X"CC",X"CC",X"CC",X"FF",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"33",X"00",
X"33",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"00",X"00",X"00",X"00",X"00",X"66",X"33",X"00",
X"33",X"66",X"CC",X"88",X"CC",X"EE",X"77",X"00",X"66",X"66",X"66",X"77",X"77",X"66",X"66",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"33",X"77",X"FF",X"FF",X"BB",X"33",X"33",X"00",X"66",X"77",X"77",X"77",X"66",X"66",X"66",X"00",
X"33",X"33",X"BB",X"FF",X"FF",X"77",X"33",X"00",X"66",X"77",X"77",X"77",X"66",X"66",X"66",X"00",
X"EE",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00",
X"EE",X"33",X"33",X"33",X"EE",X"00",X"00",X"00",X"77",X"66",X"66",X"66",X"77",X"66",X"66",X"00",
X"EE",X"33",X"33",X"33",X"FF",X"66",X"DD",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00",
X"EE",X"33",X"33",X"77",X"CC",X"EE",X"77",X"00",X"77",X"66",X"66",X"66",X"77",X"66",X"66",X"00",
X"CC",X"66",X"00",X"EE",X"33",X"33",X"EE",X"00",X"33",X"66",X"66",X"33",X"00",X"66",X"33",X"00",
X"FF",X"CC",X"CC",X"CC",X"CC",X"CC",X"CC",X"00",X"33",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"33",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"66",X"66",X"66",X"66",X"66",X"66",X"33",X"00",
X"33",X"33",X"33",X"77",X"EE",X"CC",X"88",X"00",X"66",X"66",X"66",X"77",X"33",X"11",X"00",X"00",
X"33",X"33",X"BB",X"FF",X"FF",X"77",X"33",X"00",X"66",X"66",X"66",X"77",X"77",X"77",X"66",X"00",
X"33",X"77",X"EE",X"CC",X"EE",X"77",X"33",X"00",X"66",X"77",X"33",X"11",X"33",X"77",X"66",X"00",
X"33",X"33",X"33",X"EE",X"CC",X"CC",X"CC",X"00",X"33",X"33",X"33",X"11",X"00",X"00",X"00",X"00",
X"FF",X"77",X"EE",X"CC",X"88",X"00",X"FF",X"00",X"77",X"00",X"00",X"11",X"33",X"77",X"77",X"00",
X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"88",X"88",X"88",X"88",X"88",X"88",X"88",
X"0F",X"0F",X"3F",X"BF",X"DB",X"FF",X"F6",X"FF",X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"0F",X"3F",
X"0F",X"EF",X"7F",X"96",X"F3",X"FF",X"F9",X"FF",X"0F",X"4F",X"FF",X"F3",X"FF",X"F7",X"FF",X"FF",
X"0F",X"0F",X"0F",X"0F",X"87",X"8F",X"0F",X"4F",X"0F",X"0F",X"CF",X"87",X"FC",X"FF",X"BF",X"EF",
X"FA",X"FB",X"FD",X"FF",X"B6",X"DB",X"EF",X"F6",X"7F",X"7E",X"3D",X"5F",X"7D",X"7D",X"3F",X"7E",
X"F9",X"F7",X"FE",X"7F",X"FF",X"F9",X"EF",X"F7",X"F7",X"F7",X"9F",X"EF",X"FE",X"F5",X"7F",X"FF",
X"EB",X"EB",X"CF",X"2F",X"EB",X"E7",X"EF",X"6F",X"FD",X"F3",X"FC",X"FF",X"F5",X"FB",X"EF",X"FB",
X"7E",X"FF",X"FB",X"FD",X"7B",X"1F",X"0F",X"0F",X"3F",X"2F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",
X"F7",X"FF",X"FF",X"FF",X"FF",X"F9",X"EF",X"0F",X"CC",X"FF",X"FD",X"FD",X"17",X"E9",X"6F",X"0F",
X"0F",X"CF",X"8F",X"8F",X"0F",X"0F",X"0F",X"0F",X"F7",X"FF",X"FA",X"F7",X"7F",X"0F",X"0F",X"0F",
X"FF",X"5F",X"0F",X"8F",X"C3",X"F3",X"9F",X"3F",X"FF",X"FF",X"FF",X"CF",X"CF",X"CF",X"CF",X"FF",
X"FF",X"EF",X"CF",X"CF",X"8F",X"FF",X"8F",X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"3F",X"1F",X"1F",X"1F",X"1F",X"3F",X"FF",X"3F",X"2F",X"2F",X"2F",X"79",X"F8",X"78",
X"7F",X"FF",X"FF",X"DF",X"1F",X"3F",X"3C",X"FC",X"FF",X"FF",X"FF",X"FF",X"EF",X"CF",X"CF",X"EF",
X"0F",X"0F",X"DF",X"6F",X"2F",X"0F",X"3F",X"3F",X"FF",X"BF",X"1F",X"0F",X"1F",X"9F",X"EF",X"C7",
X"5F",X"9F",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"78",X"F8",X"1E",X"1F",X"1F",X"3F",X"FF",X"FF",
X"3C",X"3F",X"1F",X"1F",X"2F",X"6F",X"FF",X"FF",X"FF",X"EF",X"CF",X"CF",X"CF",X"EF",X"FF",X"FF",
X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E7",X"97",X"0F",X"0F",X"0F",X"1F",X"3F",X"FF",
X"FF",X"7F",X"7F",X"9F",X"9F",X"1F",X"3F",X"FF",X"FF",X"CF",X"CF",X"3C",X"3C",X"1F",X"EF",X"FF",
X"EE",X"7F",X"1D",X"9F",X"97",X"9F",X"3F",X"7F",X"EC",X"CF",X"8F",X"3E",X"38",X"3E",X"8F",X"CF",
X"DD",X"7F",X"3F",X"9F",X"95",X"9F",X"3F",X"7F",X"FF",X"CF",X"8F",X"3E",X"34",X"3E",X"8F",X"CF",
X"1D",X"1F",X"C7",X"C3",X"C7",X"1F",X"3F",X"FF",X"CD",X"CF",X"17",X"9E",X"9B",X"CF",X"EF",X"FF",
X"EF",X"3F",X"1F",X"C7",X"C3",X"C7",X"1F",X"3F",X"33",X"EF",X"CF",X"9F",X"9E",X"9F",X"CF",X"EB",
X"8B",X"7F",X"3F",X"9F",X"97",X"9F",X"3F",X"6F",X"6E",X"CF",X"8F",X"3E",X"3C",X"3E",X"8F",X"4F",
X"7F",X"3F",X"9F",X"97",X"9F",X"3F",X"7F",X"FF",X"E6",X"8F",X"3E",X"3C",X"3E",X"8F",X"CF",X"FF",
X"3F",X"1F",X"C7",X"C3",X"C7",X"1F",X"3E",X"FF",X"EF",X"CF",X"9F",X"9E",X"9F",X"CF",X"AF",X"FF",
X"FF",X"7F",X"3F",X"9F",X"97",X"9F",X"3F",X"7F",X"FF",X"CF",X"8F",X"3E",X"3C",X"3E",X"8F",X"CF",
X"7F",X"3F",X"9F",X"97",X"9F",X"3F",X"5D",X"FF",X"CF",X"8F",X"3E",X"3C",X"3E",X"8F",X"0B",X"FF",
X"FF",X"FE",X"FE",X"FF",X"EF",X"FE",X"FC",X"ED",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"F7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FA",X"F3",X"FF",X"FF",X"F7",X"F7",X"F7",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"77",X"F7",X"FF",X"DF",X"CF",X"F8",X"BC",X"E8",X"BC",X"3C",
X"E9",X"DF",X"F8",X"F8",X"F8",X"78",X"78",X"78",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FE",X"FE",X"FE",X"EF",X"D6",X"FF",X"FF",X"F3",X"B3",X"F1",X"B1",X"10",X"91",X"91",X"11",
X"77",X"11",X"7F",X"77",X"31",X"75",X"FA",X"FF",X"78",X"E0",X"E3",X"E8",X"E0",X"E0",X"C0",X"EC",
X"68",X"D2",X"F2",X"F6",X"FE",X"FE",X"FE",X"FF",X"FE",X"EF",X"FF",X"FC",X"FF",X"FF",X"FF",X"FF",
X"FF",X"FF",X"F7",X"FB",X"FF",X"FE",X"FF",X"FF",X"31",X"90",X"B1",X"FC",X"77",X"77",X"77",X"FF",
X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"FF",X"FF",X"EC",X"EC",X"FF",X"FF",X"F2",X"F0",X"FF",X"79",
X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",
X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"30",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"10",X"10",X"00",X"00",X"00",X"00",X"10",X"10",
X"F0",X"F0",X"F0",X"F0",X"30",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00",X"00",
X"F0",X"F0",X"F0",X"78",X"1E",X"78",X"F0",X"F0",X"F0",X"78",X"1E",X"0F",X"0F",X"0F",X"1E",X"78",
X"F0",X"F0",X"E1",X"E1",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"78",X"78",X"3C",X"3C",X"F0",X"F0",X"F0",X"F0",
X"F0",X"FC",X"F6",X"F0",X"FC",X"F6",X"F6",X"FC",X"F0",X"F3",X"F6",X"F6",X"F3",X"F0",X"F6",X"F3",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F2",X"FE",X"F0",X"F0",X"F6",X"F6",X"F6",X"F6",X"F6",X"F7",X"F0",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"F3",X"F7",X"EF",X"CF",X"CF",X"CF",X"CF",X"CF",
X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",
X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"CF",X"CF",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"F0",X"60",X"40",X"F0",X"70",X"70",X"C0",X"B3",X"F0",X"E0",X"F0",X"C0",X"83",X"C1",X"E0",X"D0",
X"F0",X"F0",X"30",X"DC",X"9C",X"0E",X"0F",X"0F",X"F0",X"F0",X"C0",X"B3",X"33",X"67",X"67",X"67",
X"F0",X"F0",X"F0",X"F0",X"D0",X"70",X"38",X"38",X"F0",X"F0",X"90",X"F0",X"B0",X"C0",X"41",X"60",
X"67",X"67",X"67",X"67",X"47",X"47",X"00",X"0D",X"F0",X"F0",X"F0",X"C0",X"83",X"83",X"81",X"C1",
X"0F",X"0C",X"1F",X"2F",X"2F",X"4F",X"4F",X"0F",X"09",X"0D",X"0D",X"0D",X"0D",X"09",X"0D",X"0E",
X"70",X"F0",X"70",X"38",X"38",X"1C",X"18",X"1C",X"60",X"70",X"88",X"0F",X"0F",X"0B",X"0D",X"0D",
X"0D",X"0D",X"0D",X"0D",X"07",X"83",X"C0",X"F0",X"83",X"83",X"C0",X"E0",X"F0",X"90",X"90",X"F0",
X"0F",X"0F",X"0F",X"0E",X"0F",X"0E",X"10",X"F0",X"0E",X"08",X"0B",X"0B",X"0F",X"0E",X"10",X"F0",
X"18",X"70",X"70",X"F0",X"F0",X"50",X"70",X"F0",X"0D",X"0F",X"00",X"70",X"60",X"C1",X"E0",X"F0",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"F0",X"E0",X"D0",X"D0",X"D0",X"D0",X"D0",X"60",X"F0",X"E0",X"C0",X"E0",X"E0",X"E0",X"E0",X"C0",
X"F0",X"E0",X"50",X"50",X"D0",X"D0",X"D0",X"60",X"F0",X"C0",X"B0",X"B0",X"E0",X"D0",X"B0",X"80",
X"F0",X"E0",X"50",X"50",X"D0",X"50",X"50",X"E0",X"F0",X"C0",X"B0",X"F0",X"E0",X"F0",X"B0",X"C0",
X"F0",X"E0",X"D0",X"D0",X"D0",X"50",X"D0",X"E0",X"F0",X"A0",X"A0",X"A0",X"A0",X"80",X"E0",X"E0",
X"F0",X"60",X"D0",X"D0",X"50",X"50",X"50",X"E0",X"F0",X"80",X"B0",X"80",X"F0",X"F0",X"B0",X"C0",
X"F0",X"E0",X"50",X"D0",X"D0",X"50",X"50",X"E0",X"F0",X"C0",X"B0",X"B0",X"80",X"B0",X"B0",X"C0",
X"F0",X"60",X"50",X"D0",X"D0",X"D0",X"D0",X"E0",X"F0",X"80",X"F0",X"E0",X"E0",X"D0",X"D0",X"D0",
X"F0",X"E0",X"50",X"50",X"D0",X"50",X"50",X"E0",X"F0",X"C0",X"B0",X"B0",X"C0",X"B0",X"B0",X"C0",
X"F0",X"E0",X"50",X"50",X"50",X"50",X"50",X"E0",X"F0",X"C0",X"B0",X"B0",X"C0",X"F0",X"B0",X"C0",
X"00",X"10",X"B0",X"F0",X"B0",X"10",X"10",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"F0",X"30",X"D0",X"D0",X"D0",X"D0",X"D0",X"30",X"F0",X"70",X"A0",X"A0",X"A0",X"A0",X"A0",X"70",
X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"90",X"60",X"60",X"60",X"60",X"60",X"90",
X"F0",X"90",X"60",X"E0",X"D0",X"B0",X"00",X"F0",X"F0",X"F0",X"F0",X"50",X"B0",X"50",X"F0",X"F0",
X"F0",X"00",X"D0",X"90",X"E0",X"60",X"90",X"F0",X"F0",X"F0",X"F0",X"50",X"B0",X"50",X"F0",X"F0",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"10",X"B0",X"F0",X"B0",X"10",X"10",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"D0",X"F0",X"D0",X"80",X"80",X"C0",
X"B0",X"F0",X"90",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"00",
X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"D0",X"F0",X"90",X"00",X"00",X"00",X"00",X"00",
X"F0",X"F0",X"E1",X"69",X"0F",X"0F",X"0F",X"0F",X"F0",X"F0",X"96",X"87",X"C3",X"C3",X"E1",X"E1",
X"F0",X"C3",X"87",X"0F",X"0F",X"0F",X"0F",X"0F",X"B4",X"3C",X"3C",X"1E",X"0F",X"0F",X"0F",X"0F",
X"F0",X"F0",X"96",X"1E",X"1E",X"3C",X"3C",X"3C",X"78",X"78",X"78",X"2D",X"0F",X"0F",X"0F",X"0F",
X"8F",X"5F",X"5F",X"9F",X"5F",X"5F",X"9F",X"0F",X"F3",X"E3",X"E3",X"3F",X"A7",X"E3",X"F3",X"E1",
X"8F",X"8F",X"CF",X"AF",X"9F",X"8F",X"8F",X"0F",X"CF",X"2F",X"2F",X"EF",X"2F",X"2F",X"2F",X"0F",
X"F8",X"7C",X"78",X"FC",X"7C",X"5E",X"DE",X"1E",X"9F",X"AF",X"AF",X"AF",X"AF",X"AF",X"9F",X"0F",
X"0F",X"0F",X"0F",X"1E",X"78",X"F0",X"F0",X"F0",X"E1",X"C3",X"C3",X"87",X"87",X"1E",X"78",X"F0",
X"0F",X"0F",X"0F",X"69",X"78",X"F0",X"F0",X"F0",X"0F",X"0F",X"0F",X"0F",X"0F",X"87",X"96",X"D2",
X"0F",X"0F",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"0F",X"0F",X"1E",X"1E",X"1E",X"96",X"D2",X"D2",
X"F0",X"00",X"FF",X"FF",X"FF",X"FF",X"CC",X"BB",X"F0",X"E0",X"D1",X"B3",X"B3",X"B3",X"91",X"FF",
X"F7",X"FF",X"77",X"BB",X"BB",X"BB",X"33",X"CC",X"F0",X"70",X"00",X"77",X"77",X"FF",X"33",X"DD",
X"F0",X"70",X"B8",X"DC",X"DC",X"DC",X"DC",X"30",X"F8",X"EC",X"DD",X"DD",X"FF",X"FF",X"FF",X"FF",
X"77",X"77",X"55",X"BB",X"33",X"BB",X"CC",X"66",X"FF",X"FF",X"FF",X"FF",X"44",X"D9",X"D1",X"C0",
X"33",X"BB",X"BB",X"22",X"AA",X"DD",X"FF",X"FF",X"CC",X"FF",X"FF",X"EE",X"DD",X"DD",X"BB",X"77",
X"CC",X"EE",X"EE",X"EE",X"FF",X"10",X"F0",X"F0",X"FF",X"FF",X"FF",X"33",X"DD",X"DD",X"EE",X"EE",
X"DD",X"DD",X"EE",X"FF",X"EE",X"EE",X"00",X"F0",X"B3",X"B3",X"B3",X"77",X"77",X"91",X"E0",X"F0",
X"EE",X"99",X"77",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"77",X"99",X"EE",X"DD",X"DD",X"30",
X"70",X"B8",X"B8",X"DC",X"DC",X"30",X"F0",X"F0",X"CC",X"FF",X"FF",X"FF",X"FF",X"BB",X"88",X"70",
X"0F",X"69",X"69",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"87",X"87",X"87",X"87",X"87",X"87",X"00",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3",X"00",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"00",
X"00",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"8F",X"8F",X"8F",X"8F",X"8F",X"8F",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"CF",X"CF",X"CF",X"CF",X"CF",X"CF",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"EF",X"EF",X"EF",X"EF",X"EF",X"EF",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F3",X"F3",X"F3",X"F3",X"F3",X"F3",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",
X"EE",X"00",X"CC",X"00",X"00",X"00",X"00",X"08",X"77",X"66",X"77",X"66",X"66",X"00",X"00",X"00",
X"66",X"66",X"66",X"66",X"CC",X"00",X"00",X"00",X"66",X"66",X"66",X"66",X"33",X"00",X"00",X"02",
X"EE",X"00",X"CC",X"00",X"EE",X"00",X"00",X"02",X"77",X"66",X"77",X"66",X"77",X"00",X"80",X"80",
X"00",X"00",X"00",X"00",X"EE",X"00",X"00",X"08",X"66",X"66",X"66",X"66",X"77",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",
X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"CC",X"66",X"33",X"33",X"FF",X"33",X"33",X"00",X"11",X"33",X"66",X"66",X"66",X"33",X"11",X"00",
X"FF",X"00",X"00",X"77",X"33",X"33",X"FF",X"00",X"11",X"33",X"66",X"66",X"77",X"66",X"66",X"00",
X"33",X"33",X"33",X"77",X"EE",X"CC",X"88",X"00",X"33",X"66",X"66",X"66",X"66",X"66",X"33",X"00",
X"EE",X"33",X"33",X"33",X"33",X"33",X"EE",X"00",X"66",X"66",X"66",X"77",X"33",X"11",X"00",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"66",X"77",X"77",X"77",X"66",X"66",X"66",X"00",
X"33",X"77",X"FF",X"FF",X"BB",X"33",X"33",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"EE",X"33",X"33",X"77",X"CC",X"EE",X"77",X"00",X"33",X"33",X"33",X"33",X"33",X"33",X"33",X"00",
X"FF",X"00",X"00",X"EE",X"00",X"00",X"FF",X"00",X"77",X"66",X"66",X"66",X"77",X"66",X"66",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",
X"00",X"88",X"88",X"88",X"00",X"00",X"00",X"08",X"00",X"33",X"33",X"33",X"00",X"00",X"01",X"03",
X"03",X"8B",X"CF",X"8B",X"07",X"07",X"0F",X"1E",X"08",X"3B",X"7F",X"3B",X"0C",X"0C",X"0F",X"0F",
X"08",X"00",X"EE",X"EE",X"EE",X"EE",X"EE",X"00",X"03",X"00",X"EE",X"EE",X"FF",X"EE",X"EE",X"00",
X"3C",X"3C",X"3C",X"3C",X"2F",X"6F",X"6F",X"66",X"87",X"86",X"86",X"86",X"9F",X"CE",X"CE",X"CC",
X"0C",X"0C",X"3B",X"7F",X"77",X"66",X"08",X"0C",X"00",X"00",X"00",X"00",X"01",X"00",X"66",X"FF",
X"11",X"33",X"11",X"00",X"0F",X"0F",X"0F",X"16",X"CD",X"8B",X"8B",X"07",X"0F",X"0F",X"4B",X"E1",
X"0C",X"0E",X"06",X"88",X"CC",X"EE",X"CC",X"88",X"EE",X"FF",X"45",X"01",X"00",X"11",X"11",X"00",
X"1E",X"3C",X"3E",X"7E",X"DD",X"DD",X"BB",X"33",X"E1",X"C3",X"86",X"8E",X"BF",X"9D",X"33",X"11",
X"CC",X"CC",X"8B",X"8F",X"0F",X"0E",X"19",X"77",X"00",X"33",X"77",X"FF",X"77",X"11",X"03",X"77",
X"00",X"07",X"8F",X"8F",X"07",X"1E",X"3C",X"F8",X"11",X"33",X"3B",X"0C",X"0F",X"87",X"C3",X"87",
X"77",X"22",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"CC",X"33",X"77",X"66",X"00",X"00",X"00",
X"F0",X"ED",X"8F",X"0F",X"2E",X"33",X"77",X"33",X"87",X"0F",X"0F",X"07",X"88",X"CC",X"88",X"00",
X"00",X"00",X"EE",X"EE",X"EE",X"44",X"0F",X"0F",X"77",X"77",X"77",X"11",X"07",X"EF",X"FF",X"07",
X"CC",X"CC",X"CD",X"01",X"0F",X"0F",X"F0",X"F0",X"00",X"00",X"08",X"0C",X"0C",X"0F",X"0F",X"87",
X"0F",X"44",X"EE",X"EE",X"EE",X"00",X"00",X"00",X"FF",X"EF",X"07",X"11",X"77",X"77",X"77",X"00",
X"F0",X"0F",X"0F",X"01",X"CD",X"CC",X"CC",X"00",X"0F",X"0F",X"0C",X"0C",X"08",X"00",X"00",X"00");
begin
process(clk)
begin
if rising_edge(clk) then
data <= rom_data(to_integer(unsigned(addr)));
end if;
end process;
end architecture;

View File

@@ -1,24 +0,0 @@
library ieee;
use ieee.std_logic_1164.all,ieee.numeric_std.all;
entity nrx_pal_rom is
port (
clk : in std_logic;
addr : in std_logic_vector(4 downto 0);
data : out std_logic_vector(7 downto 0)
);
end entity;
architecture prom of nrx_pal_rom is
type rom is array(0 to 31) of std_logic_vector(7 downto 0);
signal rom_data: rom := (
X"00",X"00",X"06",X"3F",X"5A",X"F1",X"15",X"18",X"66",X"D1",X"2A",X"03",X"A4",X"91",X"BF",X"F6",
X"00",X"07",X"F6",X"00",X"00",X"07",X"F6",X"00",X"00",X"07",X"F6",X"00",X"00",X"07",X"F6",X"F6");
begin
process(clk)
begin
if rising_edge(clk) then
data <= rom_data(to_integer(unsigned(addr)));
end if;
end process;
end architecture;

View File

@@ -0,0 +1,36 @@
<misterromdescription>
<name>Commando (SEGA)</name>
<mameversion>0220</mameversion>
<setname>commsega</setname>
<year>1980</year>
<manufacturer>SEGA</manufacturer>
<rbf>rallyx</rbf>
<switches base="8">
<dip bits="15" name="Cabinet" ids="Cocktail,Upright"/>
<dip bits="14" name="Difficulty" ids="Easy,Hard"/>
<dip bits="10,12" name="Coin A" ids="1C_1C,2C_1C,3C_1C,4C_1C,1C_2C,1C_3C,2C_3C,Free Play"/>
<dip bits="8,9" name="Lives" ids="3,4,5,6"/>
</switches>
<rom index="1"><part>0b</part></rom>
<rom index="0" zip="commsega.zip" md5="f28363ca8751084d3477c797d862bbae">
<part name="csega1"/>
<part name="csega2"/>
<part name="csega3"/>
<part name="csega4"/>
<part name="csega5"/>
<part name="csega5"/>
<part name="csega8"/>
<part name="csega8"/>
<part name="csega7"/>
<part name="csega6"/>
<part name="gg3.bpr"/>
<part repeat="0x100">FF</part>
<part name="gg2.bpr"/>
<part name="gg1.bpr"/>
</rom>
</misterromdescription>

View File

@@ -0,0 +1,32 @@
<misterromdescription>
<name>Jungler</name>
<mameversion>0220</mameversion>
<setname>jungler</setname>
<year>1980</year>
<manufacturer>Konami</manufacturer>
<rbf>rallyx</rbf>
<rom index="1"><part>1</part></rom>
<rom index="0" zip="jungler.zip" md5="d0f3409b8873b05a36668eb9e5ca69a0">
<part name="jungr1"/>
<part name="jungr2"/>
<part name="jungr3"/>
<part name="jungr4"/>
<part name="1b"/>
<part name="1b"/>
<part name="1b"/>
<part name="1b"/>
<part name="5k"/>
<part name="5m"/>
<part name="5k"/>
<part name="5m"/>
<part name="82s129.10g"/>
<part repeat="0x100">FF</part>
<part name="tbp24s10.9d"/>
<part name="18s030.8b"/>
</rom>
</misterromdescription>

View File

@@ -0,0 +1,36 @@
<misterromdescription>
<name>Loco-motion</name>
<mameversion>0220</mameversion>
<setname>locomotn</setname>
<year>1980</year>
<manufacturer>Konami</manufacturer>
<rbf>rallyx</rbf>
<switches base="8">
<dip bits="4,5" name="Lives" ids="3,4,5,255"/>
<dip bits="3" name="Cabinet" ids="Cocktail,Upright"/>
<dip bits="1" name="Intermissions" ids="On,Off"/>
<dip bits="0" name="Demo Sounds" ids="Off,On"/>
</switches>
<rom index="1"><part>3</part></rom>
<rom index="0" zip="locomotn.zip" md5="ffa8d1e4e0ccb462c23a83ef1c2bb041">
<part name="1a.cpu"/>
<part name="2a.cpu"/>
<part name="3.cpu"/>
<part name="4.cpu"/>
<part name="5.cpu"/>
<part name="5.cpu"/>
<part name="1b_s1.bin"/>
<part name="1b_s1.bin"/>
<part name="5l_c1.bin"/>
<part name="c2.cpu"/>
<part name="10g.bpr"/>
<part repeat="0x100">FF</part>
<part name="9d.bpr"/>
<part name="8b.bpr"/>
</rom>
</misterromdescription>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,35 @@
<misterromdescription>
<name>Tactician</name>
<mameversion>0220</mameversion>
<setname>tactcian</setname>
<year>1980</year>
<manufacturer>Sega</manufacturer>
<rbf>rallyx</rbf>
<switches default="FF,FF" base="8">
<dip bits="4,5" name="Lives" ids="255,5,4,3"/>
<dip bits="1,2" name="Coinage" ids="4C_1C,1C_2C,2C_1C,1C_1C"/>
<dip bits="0" name="Bonus Life" ids="20k/80k/100k,10k/80k/100k"/>
</switches>
<rom index="1"><part>7</part></rom>
<rom index="0" zip="tactcian.zip" md5="7245488c961632efdae1e859eeb707fd">
<part name="tacticia.001"/>
<part name="tacticia.002"/>
<part name="tacticia.003"/>
<part name="tacticia.004"/>
<part name="tacticia.005"/>
<part name="tacticia.006"/>
<part name="tacticia.s2"/>
<part name="tacticia.s1"/>
<part name="tacticia.c1"/>
<part name="tacticia.c2"/>
<part name="tact6301.004"/>
<part repeat="0x100">FF</part>
<part name="tact6301.003"/>
<part name="tact6331.002"/>
</rom>
</misterromdescription>

View File

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

View File

@@ -0,0 +1,275 @@
/**************************************************************
FPGA New Rally-X (Main part)
***************************************************************/
module fpga_nrx
(
input RESET, // RESET
input CLK24M, // Clock 24.576MHz
input CLK14M, // For Time Pilot sound board (Konami games)
input mod_jungler,
input mod_loco,
input mod_tact,
input mod_comm,
output hsync,
output vsync,
output hblank,
output vblank,
output [2:0] r,
output [2:0] g,
output [1:0] b,
output [14:0] cpu_rom_addr,
input [7:0] cpu_rom_data,
output [7:0] SND, // Sound (unsigned PCM)
input [7:0] DSW1, // DipSW
input [7:0] DSW2,
input [7:0] CTR1, // Controler (Negative logic)
input [7:0] CTR2,
output [1:0] LAMP,
input ROMCL, // Downloaded ROM image
input [15:0] ROMAD,
input [7:0] ROMDT,
input ROMEN
);
//--------------------------------------------------
// Clock Generators
//--------------------------------------------------
reg [2:0] _CCLK;
always @( posedge CLK24M ) _CCLK <= _CCLK+1'd1;
wire CLK = CLK24M; // 24MHz
wire CCLK_EN = _CCLK == 3'b011; // CPU CLOCK ENABLE : 3.0MHz
//--------------------------------------------------
// CPU
//--------------------------------------------------
// memory access signals
wire rd, wr, me, ie, rf, m1;
wire [15:0] ad;
wire [7:0] odt, viddata;
wire mx = rf & (~me);
wire mr = mx & (~rd);
wire mw = mx & (~wr);
// interrupt signal/vector generator & other latches
reg inte = 1'b0;
reg intl = 1'b0;
reg [7:0] intv = 8'h0;
reg bang = 1'b0;
reg lp0r = 1'b0;
reg lp1r = 1'b0;
assign LAMP = { lp1r, lp0r };
wire vblk = (VP==224)&(HP<=8);
wire bngw = ( lat_Wce & ( ad[3:0] == 4'h0 ) );
wire iewr = ( lat_Wce & ( ad[3:0] == 4'h1 ) );
//wire flip = ( lat_Wce & ( ad[3:0] == 4'h3 ) );
wire lp0w = ( lat_Wce & ( ad[3:0] == 4'h4 ) );
wire lp1w = ( lat_Wce & ( ad[3:0] == 4'h5 ) );
wire iowr = ( (~wr) & (~ie) & m1 );
always @( posedge CLK ) begin
if (CCLK_EN) begin
if ( iowr ) intv <= odt;
if ( vblk ) intl <= 1'b1;
if ( iewr ) begin
inte <= odt[0];
intl <= 1'b0;
end
if ( bngw ) bang <= odt[0];
if ( lp0w ) lp0r <= odt[0];
if ( lp1w ) lp1r <= odt[0];
end
end
wire irq_n = ~( intl & inte );
// address decoders
wire rom_Rce = ( ( ad[15:14] == 2'b00 ) & mr ); // $0000-$3FFF(R)
wire rom_Rce2= ( ( ad[15:14] == 2'b01 ) & mr ); // $4000-$7FFF(R)
wire ram_Rce = ( ( ad[15:11] == 5'b1001_1 ) & mr ); // $9800-$9FFF(R)
wire ram_Wce = ( ( ad[15:11] == 5'b1001_1 ) & mw ); // $9800-$9FFF(W)
wire inp_Rce = ( ( ad[15:12] == 4'b1010 ) & mr ); // $A000-$AFFF(R)
wire lat_Wce = ( ad[15:3] == {12'hA18, 1'b0} ) & mw; // $A180-$A187(W)
wire snd_Wce = ( ad[15:5] == {8'hA1, 3'b000} ) & mw; // $A100-$A11F(W)
wire vid_Rce;
wire [7:0] romdata;
assign cpu_rom_addr = ad[14:0];
assign romdata = cpu_rom_data;
/*
dpram #(8,14) nrx_prg_rom(
.clk_a(CLK),
.addr_a(ad[13:0]),
.we_a(1'b0),
.d_a(),
.q_a(romdata),
.clk_b(ROMCL),
.addr_b(ROMAD),
.we_b(ROMEN & (ROMAD[15:14]==2'b00)),
.d_b(ROMDT),
.q_b()
);
wire [7:0] romdata2;
dpram #(8,13) nrx_prg_rom2(
.clk_a(CLK),
.addr_a(ad[12:0]),
.we_a(1'b0),
.d_a(),
.q_a(romdata2),
.clk_b(ROMCL),
.addr_b(ROMAD),
.we_b(ROMEN & (ROMAD[15:13]==3'b010)),
.d_b(ROMDT),
.q_b()
);
*/
// Work RAM (2KB)
wire [7:0] ramdata;
spram #(8,11) workram(
.clk(CLK),
.addr(ad[10:0]),
.we(ram_Wce),
.d(odt),
.q(ramdata)
);
// Controler/DipSW input
wire [7:0] in0data = CTR1;
wire [7:0] in1data = CTR2;
wire [7:0] in2data = DSW1;
wire [7:0] in3data = DSW2;
wire [7:0] inpdata = ad[8] ? ((mod_jungler & ad[7]) ? in3data : in2data) : ad[7] ? in1data : in0data;
// databus selector
wire [7:0] romd = rom_Rce ? romdata : 8'h00;
wire [7:0] romd2 = rom_Rce2? romdata : 8'h00;
wire [7:0] ramd = ram_Rce ? ramdata : 8'h00;
wire [7:0] vidd = vid_Rce ? viddata : 8'h00;
wire [7:0] inpd = inp_Rce ? inpdata : 8'h00;
wire [7:0] irqv = ( (~m1) & (~ie) ) ? intv : 8'h00;
wire [7:0] idt = romd | romd2 | ramd | irqv | vidd | inpd;
T80s z80(
.RESET_n(~RESET),
.CLK(CLK),
.CEN(CCLK_EN),
.WAIT_n(1'b1),
.INT_n(irq_n | mod_jungler),
.NMI_n(irq_n | ~mod_jungler),
.BUSRQ_n(1'b1),
.DI(idt),
.M1_n(m1),
.MREQ_n(me),
.IORQ_n(ie),
.RD_n(rd),
.WR_n(wr),
.RFSH_n(rf),
.HALT_n(),
.BUSAK_n(),
.A(ad),
.DO(odt)
);
//--------------------------------------------------
// VIDEO
//--------------------------------------------------
wire [8:0] HP;
wire [8:0] VP;
wire PCLK_EN;
nrx_video video(
.VCLKx4(CLK),
.mod_jungler(mod_jungler),
.mod_loco(mod_loco),
.mod_tact(mod_tact),
.mod_comm(mod_comm),
.HPOS(HP+3),
.VPOS(VP+1),
.PCLK_EN(PCLK_EN),
.POUT({b,g,r}),
.CPUADDR(ad),
.CPUDI(odt),
.CPUDO(viddata),
.CPUME(mx),
.CPUWE(mw),
.CPUDT(vid_Rce),
.ROMCL(ROMCL),
.ROMAD(ROMAD),
.ROMDT(ROMDT),
.ROMEN(ROMEN)
);
nrx_hvgen hvgen(
.CLK(CLK),
.HPOS(HP),
.VPOS(VP),
.PCLK_EN(PCLK_EN),
.HBLK(hblank),
.VBLK(vblank),
.HSYN(hsync),
.VSYN(vsync)
);
//--------------------------------------------------
// SOUND
//--------------------------------------------------
wire [7:0] nrx_snd;
wire [10:0] timepilot_snd;
reg [7:0] timepilot_snd_dat;
reg [2:0] timepilot_snd_trig;
always @(posedge CLK) begin
if (RESET)
timepilot_snd_dat <= 0;
else if (snd_Wce)
timepilot_snd_dat <= odt;
end
always @(posedge CLK14M) timepilot_snd_trig = {bang, timepilot_snd_trig[2:1]};
assign SND = mod_jungler ? timepilot_snd[10:3] : nrx_snd;
nrx_sound sound(
.CLK24M(CLK),
.SND(nrx_snd),
.AD(ad),
.DI(odt[3:0]),
.WR(snd_Wce & ~mod_jungler),
.BANG(bang & ~mod_jungler),
.ROMCL(ROMCL),
.ROMAD(ROMAD),
.ROMDT(ROMDT),
.ROMEN(ROMEN)
);
time_pilot_sound_board sound2(
.clock_14(CLK14M),
.reset(RESET),
.audio_out(timepilot_snd),
.sound_cmd(timepilot_snd_dat),
.sound_trig(timepilot_snd_trig[0]),
.ROMCL(ROMCL),
.ROMAD(ROMAD[12:0]),
.ROMDT(ROMDT),
.ROMEN(ROMEN & (ROMAD[15:13]==3'b011)) // 6000-7FFF
);
endmodule

View File

@@ -0,0 +1,43 @@
module nrx_hvgen
(
input CLK,
output [8:0] HPOS,
output [8:0] VPOS,
input PCLK_EN,
output reg HBLK = 1,
output reg VBLK = 1,
output reg HSYN = 1,
output reg VSYN = 1
);
reg [8:0] hcnt = 0;
reg [8:0] vcnt = 0;
assign HPOS = hcnt;
assign VPOS = vcnt;
always @(posedge CLK) begin
if (PCLK_EN) begin
hcnt <= hcnt + 1'd1;
case (hcnt)
291: HBLK <= 1;
300: HSYN <= 0;
324: HSYN <= 1;
383: begin
hcnt <= 0;
vcnt <= vcnt + 1'd1;
case (vcnt)
223: VBLK <= 1;
228: VSYN <= 0;
235: VSYN <= 1;
242: begin VBLK <= 0; vcnt <= 0; end
default: ;
endcase
end
1: HBLK <= 0;
default: ;
endcase
end
end
endmodule

View File

@@ -6,13 +6,17 @@
module nrx_sound
(
input CLK24M,
input CCLK,
output reg [7:0] SND,
input [15:0] AD,
input [3:0] DI,
input WR,
input BANG
input BANG,
input ROMCL,
input [15:0] ROMAD,
input [7:0] ROMDT,
input ROMEN
);
reg [11:0] ccnt;
@@ -24,25 +28,29 @@ wire SCLK = ccnt[7];
wire [7:0] wa0, wa1, wa2;
wire [3:0] wd0, wd1, wd2;
nrx_namco namco(
.clk(SCLKx8),
.a0(wa0),
.a1(wa1),
.a2(wa2),
.d0(wd0),
.d1(wd1),
.d2(wd2)
);
NPSG_WAV waverom(
SCLKx8, wa0, wa1, wa2, wd0, wd1, wd2,
ROMCL,ROMAD[7:0],ROMDT[3:0],ROMEN & (ROMAD[15:8]==8'hA1)
);
reg bWavPlay = 1'b0;
reg [13:0] wap = 14'h0000;
wire [7:0] wdp;
wire [7:0] wo = bWavPlay ? wdp : 8'h80;
nrx_wav_rom nrx_wav_rom (
.clk(CLK6K),
.addr(wap),
.data(wdp)
dpram #(8,14) bangpcm(
.clk_a(CLK6K),
.addr_a(wap),
.we_a(1'b0),
.d_a(),
.q_a(wdp),
.clk_b(ROMCL),
.addr_b(ROMAD[13:0]),
.d_b(ROMDT),
.we_b(ROMEN & (ROMAD[15:14]==2'b01)),
.q_b()
);
always @( posedge CLK6K ) begin
@@ -99,7 +107,7 @@ nrx_psg_voice voice2(
reg [7:0] wout;
always @( posedge SCLK ) SND <= ( { 2'b0, wo } ) + ( o0 + o1 + o2 );
always @( posedge CCLK ) begin
always @( posedge CLK24M ) begin
if ( WR ) case ( AD[4:0] )
5'h05: n0 <= DI[2:0];
@@ -131,3 +139,50 @@ always @( posedge CCLK ) begin
end
endmodule
module NPSG_WAV
(
input clk,
input [7:0] a0,
input [7:0] a1,
input [7:0] a2,
output reg [3:0] d0,
output reg [3:0] d1,
output reg [3:0] d2,
input ROMCL,
input [7:0] ROMAD,
input [3:0] ROMDT,
input ROMEN
);
reg [1:0] ph=0;
reg [7:0] ad;
wire [3:0] dt;
dpram #(4,8) wrom(
.clk_a(clk),
.addr_a(ad),
.we_a(1'b0),
.d_a(),
.q_a(dt),
.clk_b(ROMCL),
.addr_b(ROMAD),
.we_b(ROMEN),
.d_b(ROMDT),
.q_b()
);
always @(negedge clk) begin
case (ph)
0: begin d2 <= dt; ad <= a0; ph <= 1; end
1: begin d0 <= dt; ad <= a1; ph <= 2; end
2: begin d1 <= dt; ad <= a2; ph <= 0; end
default:;
endcase
end
endmodule

View File

@@ -0,0 +1,178 @@
module NRX_SPRITE
(
input VCLKx4,
input VCLKx2_EN,
input VCLK_EN,
input HBLK,
input mod_jungler,
input mod_loco,
input mod_tact,
input mod_comm,
input [8:0] HPOS,
input [8:0] VPOS,
output reg [10:0] SPRAADRS,
input [15:0] SPRADATA,
output [3:0] ARAMADRS,
input [7:0] ARAMDATA,
output [12:0] SPCHRADR,
input [7:0] SPCHRDAT,
output [7:0] DROMAD,
input [7:0] DROMDT,
output reg [8:0] SPCOL
);
wire SIDE = VPOS[0];
reg [19:0] SPATR0;
reg [36:0] SPATRS[0:31];
reg [3:0] WWADR;
reg bHit;
assign ARAMADRS = SPRAADRS[3:0];
reg [7:0] WRADR;
reg [8:0] HPOSW;
reg [8:0] SPWCL;
wire [36:0] SPA = SPATRS[{~SIDE,WRADR[7:4]}];
wire [3:0] SH = WRADR[3:0] + (mod_jungler ? 4'h0 : 4'h4);
wire [3:0] SV = SPA[35:32];
wire [2:0] SPFY = { 3{SPA[1]} };
wire [1:0] SPFX = {2{mod_tact}} ^ { mod_loco ? ~SPA[1] : mod_jungler, mod_loco ? SPA[1] : SPA[0] };
wire [5:0] SPPL = SPA[29:24];
assign SPCHRADR = { mod_loco ? {SPA[7], SPA[0], SPA[6:2]} : {1'b0, SPA[7:2]},
mod_jungler ^ SV[3] ^ SPA[1],
SH[3:2] ^ SPFX,
{3{mod_jungler}} ^ SV[2:0] ^ SPFY };
wire [7:0] CHRO = SPCHRDAT;
wire [8:0] YM = ((mod_jungler & ~mod_tact) ? (9'd258 - SPRADATA[15:8]) : (SPRADATA[15:8] + 8'h10)) + VPOS[7:0];
wire [8:0] YM2 = ((mod_jungler & ~mod_tact) ? (9'd270 - SPRADATA[15:8]) : (SPRADATA[15:8] + 8'h10)) + VPOS[7:0];
assign DROMAD = { 1'b0, (mod_jungler ? ~SPA[18:16] : ~SPA[19:17]), SPA[33:32], WRADR[3:2] };
reg HBLK_D;
always @ ( posedge VCLKx4 ) begin
HBLK_D <= HBLK;
if (VCLKx2_EN) begin
// in H-BLANK
if (HBLK_D) begin
// Sprite V-hit check & list-up
if ( SPRAADRS < 10'h20 ) begin
if ( SPRAADRS[0] ) begin
if ( bHit ) begin
SPATRS[{SIDE,WWADR}] <= { 1'b1, SPATR0[3:0], SPRADATA, SPATR0[19:4] };
WWADR <= WWADR+1'd1;
end
end
else begin
if ( YM[7:4] == 4'b1111 ) begin
bHit <= 1;
SPATR0 <= { SPRADATA, YM[3:0] };
end
else bHit <= 0;
end
SPRAADRS <= ( SPRAADRS == 10'h1F ) ? (mod_comm ? 10'h20 : 10'h34) : (SPRAADRS+1'd1);
end
// Rader-dot V-hit check & list-up
else begin
if ( SPRAADRS < 10'h40 ) begin
if ( YM2[7:2] == 6'b111111 ) begin
SPATRS[{SIDE,WWADR}] <= { 1'b0, 2'b00, YM2[1:0], 8'h0, ARAMDATA, SPRADATA };
WWADR <= WWADR+1'd1;
end
SPRAADRS <= SPRAADRS+1'd1;
end
else SPATRS[{SIDE,WWADR}] <= 0;
end
if ( SPA ) begin
// Rend Sprite
if ( SPA[36] ) begin
HPOSW <= WRADR[3:0] ? (HPOSW+1'd1) : ((mod_jungler & ~mod_tact) ? ((mod_loco ? 9'd242 : 9'd278)-{ SPA[31], SPA[23:16] }) : ({ SPA[31], SPA[23:16] } + 2'd3));
case ({ mod_jungler, {2{mod_jungler}} ^ SH[1:0] ^ {2{SPFX[0]}} } )
3'b000: SPWCL <= { 1'b0, SPPL, CHRO[7], CHRO[3] };
3'b001: SPWCL <= { 1'b0, SPPL, CHRO[6], CHRO[2] };
3'b010: SPWCL <= { 1'b0, SPPL, CHRO[5], CHRO[1] };
3'b011: SPWCL <= { 1'b0, SPPL, CHRO[4], CHRO[0] };
3'b100: SPWCL <= { 1'b0, SPPL, CHRO[3], CHRO[7] };
3'b101: SPWCL <= { 1'b0, SPPL, CHRO[2], CHRO[6] };
3'b110: SPWCL <= { 1'b0, SPPL, CHRO[1], CHRO[5] };
3'b111: SPWCL <= { 1'b0, SPPL, CHRO[0], CHRO[4] };
endcase
WRADR <= WRADR+1'd1;
end
// Rend Rader-dot
else begin
HPOSW <=
WRADR[3:0] ?
(HPOSW+1'd1) :
(mod_tact ? { 1'b0, SPA[7:0] } :
mod_loco ? { 1'b0, ~SPA[7:0] } :
mod_jungler ? { SPA[19], ~SPA[7:0] + 8'd35 } :
({ ~SPA[16], SPA[7:0] } + 2'd3));
SPWCL <= ( DROMDT[1:0] != 2'b11 ) ? { 1'b1, 6'b000100, DROMDT[1:0] } : 9'd0;
WRADR <= WRADR+4'd4;
end
end
else SPWCL <= 0;
end
// in H-DISP
else begin
SPRAADRS <= mod_comm ? 10'h0 : 10'h14;
WWADR <= 0;
WRADR <= 0;
SPWCL <= 0;
end
end
end
reg [9:0] radr0=0,radr1=1;
wire [8:0] SPCOLi;
dpram #(9,10)
linebuffer(
.clk_a(VCLKx4),
.addr_a(radr0),
.we_a(radr0==radr1),
.d_a(9'h0),
.q_a(SPCOLi),
.clk_b(VCLKx4),
.addr_b({~SIDE,HPOSW}),
.d_b(SPWCL),
.we_b((SPWCL[0]|SPWCL[1])),
.q_b()
);
always @(posedge VCLKx4) begin
radr0 <= {SIDE,HPOS};
if (VCLK_EN) begin
if (radr0!=radr1) SPCOL <= SPCOLi;
radr1 <= radr0;
end
end
endmodule

View File

@@ -0,0 +1,283 @@
/**************************************************************
FPGA New Rally-X (Video Part)
***************************************************************/
module nrx_video
(
input VCLKx4, // 24.976MHz
input mod_jungler,
input mod_loco,
input mod_tact,
input mod_comm,
input [8:0] HPOS,
input [8:0] VPOS,
output PCLK_EN,
output reg [7:0] POUT,
input [15:0] CPUADDR,
input [7:0] CPUDI,
output [7:0] CPUDO,
input CPUME,
input CPUWE,
output CPUDT,
input ROMCL,
input [15:0] ROMAD,
input [7:0] ROMDT,
input ROMEN
);
//-----------------------------------------
// Clock generators
//-----------------------------------------
reg [1:0] VCLK_CNT;
wire VCLKx2_EN;
always @(posedge VCLKx4) VCLK_CNT <= VCLK_CNT + 1'd1;
assign PCLK_EN = VCLK_CNT == 2'b00;
assign VCLKx2_EN = !VCLK_CNT[0];
//-----------------------------------------
// BG scroll registers
//-----------------------------------------
reg [7:0] BGHSCR;
reg [7:0] BGVSCR;
always @ ( posedge VCLKx4 ) begin
if ( ( CPUADDR == 16'hA130 ) & CPUME & CPUWE ) begin
BGHSCR <= CPUDI-3'd3;
end
if ( ( CPUADDR == 16'hA140 ) & CPUME & CPUWE ) begin
BGVSCR <= CPUDI;
end
end
//-----------------------------------------
// HV
//-----------------------------------------
wire [8:0] BGHPOS = HPOS + { 1'b0, BGHSCR };
wire [8:0] BGVPOS = VPOS + { 1'b0, BGVSCR };
wire oHB = HPOS > 291;
wire oVB = VPOS > 224;
//----------------------------------------
// VideoRAM Scanner
//----------------------------------------
wire BF = ( HPOS >= 227 );
wire [8:0] HP = ( BF ? HPOS : BGHPOS ) - 2'd3;
wire [8:0] VP = ( BF ? VPOS : BGVPOS ) + 9'h0F;
wire [10:0] SPRAADRS;
wire [3:0] ARAMADRS;
reg [10:0] VRAMADRS;
always @ ( * ) begin
VRAMADRS = oHB ?
SPRAADRS :
BF ? { 1'b0, VP[7:3], 2'b00, HP[5:3] } : { 1'b1, VP[7:3], HP[7:3] };
end
wire [7:0] CHRC;
wire [7:0] ATTR;
wire [7:0] ARDT;
wire [7:0] V0DO, V1DO;
wire CEV0 = ( ( CPUADDR[15:12] == 4'b1000 ) & (~CPUADDR[11]) ) & CPUME;
wire CEV1 = ( ( CPUADDR[15:12] == 4'b1000 ) & CPUADDR[11] ) & CPUME;
wire CEAT = ( CPUADDR[15:4] == 12'b1010_0000_0000 ) & CPUME;
wire [7:0] DTV0 = CEV0 ? V0DO : 8'h00;
wire [7:0] DTV1 = CEV1 ? V1DO : 8'h00;
assign CPUDO = DTV0 | DTV1;
assign CPUDT = ( ~CPUWE ) & ( CEV0 | CEV1 );
dpram #(8,11)
vram0(
.clk_a(VCLKx4),
.addr_a(VRAMADRS),
.we_a(1'b0),
.d_a(),
.q_a(CHRC),
.clk_b(VCLKx4),
.addr_b(CPUADDR[10:0]),
.we_b(( CPUWE & CEV0 )),
.d_b(CPUDI),
.q_b(V0DO)
);
dpram #(8,11)
vram1(
.clk_a(VCLKx4),
.addr_a(VRAMADRS),
.we_a(1'b0),
.d_a(),
.q_a(ATTR),
.clk_b(VCLKx4),
.addr_b(CPUADDR[10:0]),
.we_b(CPUWE & CEV1),
.d_b(CPUDI),
.q_b(V1DO)
);
dpram #(8,4)
aram0(
.clk_a(VCLKx4),
.addr_a(ARAMADRS),
.we_a(1'b0),
.d_a(),
.q_a(ARDT),
.clk_b(VCLKx4),
.addr_b(CPUADDR[3:0]),
.we_b(CPUWE & CEAT),
.d_b(CPUDI),
.q_b()
);
wire BGF = ATTR[5];
//----------------------------------------
// BG/Sprite chip data reader
//----------------------------------------
wire BGFX = mod_loco ? ~ATTR[7] : ATTR[6];
wire [2:0] BGFY = { ATTR[7], ATTR[7], ATTR[7] };
wire [12:0] SPCHRADR;
wire [12:0] CHRA = oHB ? SPCHRADR : { mod_loco? {CHRC[7], ATTR[6], CHRC[6:0]} : {1'b0, CHRC}, ( HP[2] ^ BGFX ), ( VP[2:0] ^ BGFY ) };
wire [7:0] CHRO;
dpram #(8,13) chrrom (
.clk_a(VCLKx4),
.addr_a(CHRA),
.we_a(1'b0),
.d_a(),
.q_a(CHRO),
.clk_b(ROMCL),
.addr_b(ROMAD[12:0]),
.we_b(ROMEN & (ROMAD[15:13]==3'b100)), //8000-9FFF
.d_b(ROMDT),
.q_b()
);
//----------------------------------------
// Rader-dot chip ROM
//----------------------------------------
wire [7:0] DROMAD;
wire [7:0] DROMDT;
dpram #(8,8) dotrom (
.clk_a(VCLKx4),
.addr_a(DROMAD),
.we_a(1'b0),
.d_a(),
.q_a(DROMDT),
.clk_b(ROMCL),
.addr_b(ROMAD[7:0]),
.we_b(ROMEN & (ROMAD[15:8]==8'hA0)),
.d_b(ROMDT),
.q_b()
);
//----------------------------------------
// BG/FG scanline generator
//----------------------------------------
wire [5:0] BGPL = ATTR[5:0];
reg [7:0] BGCOL;
always @ ( posedge VCLKx4 ) begin
if (PCLK_EN) begin
case ( { mod_jungler, HP[1:0]^{2{BGFX}} } )
3'b000: BGCOL <= { BGPL, CHRO[4], CHRO[0] };
3'b001: BGCOL <= { BGPL, CHRO[5], CHRO[1] };
3'b010: BGCOL <= { BGPL, CHRO[6], CHRO[2] };
3'b011: BGCOL <= { BGPL, CHRO[7], CHRO[3] };
3'b100: BGCOL <= { BGPL, CHRO[0], CHRO[4] };
3'b101: BGCOL <= { BGPL, CHRO[1], CHRO[5] };
3'b110: BGCOL <= { BGPL, CHRO[2], CHRO[6] };
3'b111: BGCOL <= { BGPL, CHRO[3], CHRO[7] };
endcase
end
end
//----------------------------------------
// Sprite Engine
//----------------------------------------
wire [8:0] SPCOL;
NRX_SPRITE speng(
.VCLKx4(VCLKx4),
.VCLKx2_EN(VCLKx2_EN),
.VCLK_EN(PCLK_EN),
.mod_jungler(mod_jungler),
.mod_loco(mod_loco),
.mod_tact(mod_tact),
.mod_comm(mod_comm),
.HBLK(oHB),
.HPOS(HPOS),
.VPOS(VPOS),
.SPRAADRS(SPRAADRS),
.SPRADATA({ ATTR, CHRC }),
.ARAMADRS(ARAMADRS),
.ARAMDATA(ARDT),
.SPCHRADR(SPCHRADR),
.SPCHRDAT(CHRO),
.DROMAD(DROMAD),
.DROMDT(DROMDT),
.SPCOL(SPCOL)
);
//----------------------------------------
// Color mixer
//----------------------------------------
wire bBGOPAQUE = ~mod_jungler & ( BF | BGF ) & ~SPCOL[8];
wire bSPTRANSP = ( SPCOL[1:0] == 2'b00 );
wire [7:0] OUTCOL = ( bBGOPAQUE | bSPTRANSP ) ? BGCOL : SPCOL[7:0];
wire [3:0] CLUT;
dpram #(4,8) colrom (
.clk_a(~VCLKx4),
.addr_a(OUTCOL),
.we_a(1'b0),
.d_a(),
.q_a(CLUT),
.clk_b(ROMCL),
.addr_b(ROMAD[7:0]),
.we_b(ROMEN & (ROMAD[15:8]==8'hA2)),
.d_b(ROMDT[3:0]),
.q_b()
);
wire [4:0] PALA = SPCOL[8] ? SPCOL[4:0] : { 1'b0, CLUT };
wire [7:0] PALO;
dpram #(8,5) palrom (
.clk_a(VCLKx4),
.addr_a(PALA),
.we_a(1'b0),
.d_a(),
.q_a(PALO),
.clk_b(ROMCL),
.addr_b(ROMAD[4:0]),
.we_b(ROMEN & (ROMAD[15:5]=={8'hA3,3'b000})),
.d_b(ROMDT),
.q_b()
);
//----------------------------------------
// Color output
//----------------------------------------
always @ ( posedge VCLKx4 ) if (PCLK_EN) POUT <= (oHB|oVB) ? 8'h0 : PALO;
endmodule

View File

@@ -14,7 +14,7 @@
// ************************************************************
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
//
// 13.1.4 Build 182 03/12/2014 SJ Web Edition
// 13.1.4 Build 182 03/12/2014 Patches 4.26 SJ Web Edition
// ************************************************************
@@ -39,23 +39,27 @@
module pll (
inclk0,
c0,
c1,
locked);
input inclk0;
output c0;
output c1;
output locked;
wire [4:0] sub_wire0;
wire sub_wire2;
wire [0:0] sub_wire5 = 1'h0;
wire [0:0] sub_wire1 = sub_wire0[0:0];
wire c0 = sub_wire1;
wire [0:0] sub_wire6 = 1'h0;
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 sub_wire3 = inclk0;
wire [1:0] sub_wire4 = {sub_wire5, sub_wire3};
wire c0 = sub_wire3;
wire sub_wire4 = inclk0;
wire [1:0] sub_wire5 = {sub_wire6, sub_wire4};
altpll altpll_component (
.inclk (sub_wire4),
.inclk (sub_wire5),
.clk (sub_wire0),
.locked (sub_wire2),
.activeclock (),
@@ -98,6 +102,10 @@ module pll (
altpll_component.clk0_duty_cycle = 50,
altpll_component.clk0_multiply_by = 71,
altpll_component.clk0_phase_shift = "0",
altpll_component.clk1_divide_by = 27,
altpll_component.clk1_duty_cycle = 50,
altpll_component.clk1_multiply_by = 14,
altpll_component.clk1_phase_shift = "0",
altpll_component.compensate_clock = "CLK0",
altpll_component.inclk0_input_frequency = 37037,
altpll_component.intended_device_family = "Cyclone III",
@@ -131,7 +139,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_UNUSED",
altpll_component.port_clk1 = "PORT_USED",
altpll_component.port_clk2 = "PORT_UNUSED",
altpll_component.port_clk3 = "PORT_UNUSED",
altpll_component.port_clk4 = "PORT_UNUSED",
@@ -172,8 +180,11 @@ endmodule
// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0"
// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8"
// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "78"
// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "1"
// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000"
// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "24.576923"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "14.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"
@@ -194,18 +205,26 @@ 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 "ps"
// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any"
// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0"
// Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0"
// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "71"
// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "1"
// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "24.57600000"
// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "14.00000000"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1"
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz"
// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1"
// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0"
// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000"
// Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000"
// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0"
// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg"
// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "ps"
// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0"
// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0"
// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1"
@@ -228,11 +247,14 @@ 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: SWITCHOVER_COUNT_EDIT NUMERIC "1"
// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1"
// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
// Retrieval info: PRIVATE: USE_CLK0 STRING "1"
// Retrieval info: PRIVATE: USE_CLK1 STRING "1"
// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0"
// Retrieval info: PRIVATE: USE_CLKENA1 STRING "0"
// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0"
// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0"
// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
@@ -241,6 +263,10 @@ endmodule
// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50"
// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "71"
// 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 "14"
// Retrieval info: CONSTANT: CLK1_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"
@@ -273,7 +299,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_UNUSED"
// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED"
// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED"
@@ -292,11 +318,13 @@ endmodule
// 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: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0"
// Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1"
// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0"
// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked"
// 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: locked 0 0 0 0 @locked 0 0 0 0
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE

View File

@@ -0,0 +1,255 @@
module rallyX_mist (
output LED,
output [5:0] VGA_R,
output [5:0] VGA_G,
output [5:0] VGA_B,
output VGA_HS,
output VGA_VS,
output AUDIO_L,
output AUDIO_R,
input SPI_SCK,
output SPI_DO,
input SPI_DI,
input SPI_SS2,
input SPI_SS3,
input CONF_DATA0,
input CLOCK_27,
output [12:0] SDRAM_A,
inout [15:0] SDRAM_DQ,
output SDRAM_DQML,
output SDRAM_DQMH,
output SDRAM_nWE,
output SDRAM_nCAS,
output SDRAM_nRAS,
output SDRAM_nCS,
output [1:0] SDRAM_BA,
output SDRAM_CLK,
output SDRAM_CKE
);
`include "rtl\build_id.v"
localparam CONF_STR = {
"RALLYX;;",
"O2,Rotate Controls,Off,On;",
"O34,Scanlines,None,CRT 25%,CRT 50%,CRT 75%;",
"O5,Blend,Off,On;",
"DIP;",
"T0,Reset;",
"V,v1.00.",`BUILD_DATE
};
wire rotate = status[2];
wire [1:0] scanlines = status[4:3];
wire blend = status[5];
wire [1:0] orientation = {core_mod[2], core_mod[0]};
assign LED = ~ioctl_downl;
assign AUDIO_R = AUDIO_L;
assign SDRAM_CLK = clock_24;
assign SDRAM_CKE = 1;
wire pll_locked, clock_24, clock_14;
pll pll(
.inclk0(CLOCK_27),
.c0(clock_24), //24.576MHz
.c1(clock_14),
.locked(pll_locked)
);
wire [6:0] core_mod;
wire [31:0] status;
wire [1:0] buttons;
wire [1:0] switches;
wire [7:0] joystick_0;
wire [7:0] joystick_1;
wire scandoublerD;
wire ypbpr;
wire no_csync;
wire [7:0] audio;
wire hs, vs;
wire hb, vb;
wire blankn = ~(hb | vb);
wire [2:0] r, g;
wire [1:0] b;
wire key_strobe;
wire key_pressed;
wire [7:0] key_code;
reg [7:0] iDSW1, iDSW2, iCTR1, iCTR2;
always @(*) begin
iDSW1 = ~status[15:8];
iDSW2 = ~status[23:16];
iCTR1 = ~{ m_coin1, m_one_player, m_up, m_down, m_right, m_left, m_fireA, 1'b0 };
iCTR2 = ~{ m_coin2, m_two_players, m_up2, m_down2, m_right2, m_left2, m_fire2A, 1'b0 };
if (core_mod[0]) begin
//Jungler, Loco-Motion, Tactician
iCTR1 = ~{ m_coin1, m_coin2, m_right, m_left, m_fireA, 1'b0, m_fireB, m_up2 };
iCTR2 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2A, m_fire2B, m_down2, m_up };
iDSW1[7] = ~m_down;
end
if (core_mod[3]) begin
//Commando
iCTR1 = ~{ m_coin1, m_coin2, m_right, m_left, m_fireB, 2'b00, m_up };
iCTR2 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2B, m_fire2A, m_down2, m_up };
iDSW1[7] = ~m_down;
iDSW1[6] = ~m_fireA;
end
end
wire ioctl_downl;
wire [7:0] ioctl_index;
wire ioctl_wr;
wire [24:0] ioctl_addr;
wire [7:0] ioctl_dout;
reg port1_req;
reg [15:0] rom_dout;
reg [14:0] rom_addr;
data_io data_io(
.clk_sys ( clock_24 ),
.SPI_SCK ( SPI_SCK ),
.SPI_SS2 ( SPI_SS2 ),
.SPI_DI ( SPI_DI ),
.ioctl_download( ioctl_downl ),
.ioctl_index ( ioctl_index ),
.ioctl_wr ( ioctl_wr ),
.ioctl_addr ( ioctl_addr ),
.ioctl_dout ( ioctl_dout )
);
sdram #(.MHZ(24)) sdram(
.*,
.init_n ( pll_locked ),
.clk ( clock_24 ),
// ROM upload
.port1_req ( port1_req ),
.port1_ack ( ),
.port1_a ( ioctl_addr[22:1] ),
.port1_ds ( { ioctl_addr[0], ~ioctl_addr[0] } ),
.port1_we ( ioctl_downl ),
.port1_d ( {ioctl_dout, ioctl_dout} ),
// CPU
.cpu1_addr ( ioctl_downl ? 17'h1ffff : {3'b000, rom_addr[14:1] } ),
.cpu1_q ( rom_dout )
);
always @(posedge clock_24) begin
reg ioctl_wr_last = 0;
ioctl_wr_last <= ioctl_wr;
if (ioctl_downl) begin
if (~ioctl_wr_last && ioctl_wr) begin
port1_req <= ~port1_req;
end
end
end
fpga_nrx fpga_nrx(
.RESET(status[0] | buttons[1]),
.CLK24M(clock_24),
.CLK14M(clock_14),
.mod_jungler(core_mod[0]),
.mod_loco(core_mod[1]),
.mod_tact(core_mod[2]),
.mod_comm(core_mod[3]),
.hsync(hs),
.vsync(vs),
.hblank(hb),
.vblank(vb),
.r(r),
.g(g),
.b(b),
.cpu_rom_addr(rom_addr),
.cpu_rom_data(rom_addr[0] ? rom_dout[15:8] : rom_dout[7:0]),
.SND(audio),
.DSW1(iDSW1),
.DSW2(iDSW2),
.CTR1(iCTR1),
.CTR2(iCTR2),
.LAMP(),
// ROM download
.ROMCL(clock_24),
.ROMAD(ioctl_addr[15:0]),
.ROMDT(ioctl_dout),
.ROMEN(ioctl_wr)
);
mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(11)) mist_video(
.clk_sys ( clock_24 ),
.SPI_SCK ( SPI_SCK ),
.SPI_SS3 ( SPI_SS3 ),
.SPI_DI ( SPI_DI ),
.R ( blankn ? r : 0 ),
.G ( blankn ? g : 0 ),
.B ( blankn ? {b,1'b0} : 0 ),
.HSync ( hs ),
.VSync ( vs ),
.VGA_R ( VGA_R ),
.VGA_G ( VGA_G ),
.VGA_B ( VGA_B ),
.VGA_VS ( VGA_VS ),
.VGA_HS ( VGA_HS ),
.ce_divider ( 1'b1 ),
.blend ( blend ),
.rotate ( {orientation[1], rotate} ),
.scandoubler_disable( scandoublerD ),
.scanlines ( scanlines ),
.ypbpr ( ypbpr ),
.no_csync ( no_csync )
);
user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io(
.clk_sys (clock_24 ),
.conf_str (CONF_STR ),
.SPI_CLK (SPI_SCK ),
.SPI_SS_IO (CONF_DATA0 ),
.SPI_MISO (SPI_DO ),
.SPI_MOSI (SPI_DI ),
.buttons (buttons ),
.switches (switches ),
.scandoubler_disable (scandoublerD ),
.ypbpr (ypbpr ),
.no_csync (no_csync ),
.key_strobe (key_strobe ),
.key_pressed (key_pressed ),
.key_code (key_code ),
.joystick_0 (joystick_0 ),
.joystick_1 (joystick_1 ),
.status (status ),
.core_mod (core_mod )
);
dac #(.C_bits(16))dac(
.clk_i(core_mod[0] ? clock_14 : clock_24),
.res_n_i(1),
.dac_i({audio,audio}),
.dac_o(AUDIO_L)
);
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;
arcade_inputs inputs (
.clk ( clock_24 ),
.key_strobe ( key_strobe ),
.key_pressed ( key_pressed ),
.key_code ( key_code ),
.joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ),
.rotate ( rotate ),
.orientation ( orientation ),
.joyswap ( 1'b0 ),
.oneplayer ( 1'b1 ),
.controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
.player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
);
endmodule

View File

@@ -0,0 +1,10 @@
0000-3FFF CPU instruction
4000-7FFF "BANG!" PCM data or CPU ROM / TimePilot sound board CPU ROM
8000-9FFF Background/Object pattern
A000-A0FF Rader dot pattern
A100-A1FF Sound wave
A200-A2FF Lookup table
A300-A31F Palette
[EOF]

View File

@@ -0,0 +1,232 @@
//
// sdram.v
//
// sdram controller implementation for the MiST board
// https://github.com/mist-devel/mist-board
//
// Copyright (c) 2013 Till Harbaum <till@harbaum.org>
// Copyright (c) 2019 Gyorgy Szombathelyi
//
// This source file is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This source file is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
module sdram (
// interface to the MT48LC16M16 chip
inout reg [15:0] SDRAM_DQ, // 16 bit bidirectional data bus
output reg [12:0] SDRAM_A, // 13 bit multiplexed address bus
output reg SDRAM_DQML, // two byte masks
output reg SDRAM_DQMH, // two byte masks
output reg [1:0] SDRAM_BA, // two banks
output SDRAM_nCS, // a single chip select
output SDRAM_nWE, // write enable
output SDRAM_nRAS, // row address select
output SDRAM_nCAS, // columns address select
// cpu/chipset interface
input init_n, // init signal after FPGA config to initialize RAM
input clk, // sdram clock
input port1_req,
output reg port1_ack,
input port1_we,
input [23:1] port1_a,
input [1:0] port1_ds,
input [15:0] port1_d,
input [17:1] cpu1_addr,
output reg [15:0] cpu1_q
);
parameter MHZ = 80; // 80 MHz default clock, adjust to calculate the refresh rate correctly
localparam RASCAS_DELAY = 3'd1; // tRCD=20ns -> 2 cycles@<100MHz, 1 cycle @<50MHz
localparam BURST_LENGTH = 3'b000; // 000=1, 001=2, 010=4, 011=8
localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved
localparam CAS_LATENCY = 3'd2; // 2/3 allowed
localparam OP_MODE = 2'b00; // only 00 (standard operation) allowed
localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single access write
localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH};
// 64ms/8192 rows = 7.8us
localparam RFRSH_CYCLES = 16'd78*MHZ/10;
// ---------------------------------------------------------------------
// ------------------------ cycle state machine ------------------------
// ---------------------------------------------------------------------
/*
SDRAM state machine
1 word burst, CL2, <50MHz
cmd issued registered
0 RAS0
1 CAS0
2
3
4 data returned
*/
localparam STATE_RAS0 = 3'd0; // first state in cycle
localparam STATE_CAS0 = STATE_RAS0 + RASCAS_DELAY; // CAS phase - 3
localparam STATE_READ0 = STATE_CAS0 + CAS_LATENCY + 1'd1; // 4
localparam STATE_LAST = 3'd4;
reg [2:0] t;
always @(posedge clk) begin
t <= t + 1'd1;
if (t == STATE_LAST) t <= STATE_RAS0;
end
// ---------------------------------------------------------------------
// --------------------------- startup/reset ---------------------------
// ---------------------------------------------------------------------
// wait 1ms (32 8Mhz cycles) after FPGA config is done before going
// into normal operation. Initialize the ram in the last 16 reset cycles (cycles 15-0)
reg [4:0] reset;
reg init = 1'b1;
always @(posedge clk, negedge init_n) begin
if(!init_n) begin
reset <= 5'h1f;
init <= 1'b1;
end else begin
if((t == STATE_LAST) && (reset != 0)) reset <= reset - 5'd1;
init <= !(reset == 0);
end
end
// ---------------------------------------------------------------------
// ------------------ generate ram control signals ---------------------
// ---------------------------------------------------------------------
// all possible commands
localparam CMD_INHIBIT = 4'b1111;
localparam CMD_NOP = 4'b0111;
localparam CMD_ACTIVE = 4'b0011;
localparam CMD_READ = 4'b0101;
localparam CMD_WRITE = 4'b0100;
localparam CMD_BURST_TERMINATE = 4'b0110;
localparam CMD_PRECHARGE = 4'b0010;
localparam CMD_AUTO_REFRESH = 4'b0001;
localparam CMD_LOAD_MODE = 4'b0000;
reg [3:0] sd_cmd; // current command sent to sd ram
reg [15:0] sd_din;
// drive control signals according to current command
assign SDRAM_nCS = sd_cmd[3];
assign SDRAM_nRAS = sd_cmd[2];
assign SDRAM_nCAS = sd_cmd[1];
assign SDRAM_nWE = sd_cmd[0];
reg [24:1] addr_latch;
reg [24:1] addr_latch_next;
reg [15:0] din_latch;
reg oe_latch;
reg we_latch;
reg [1:0] ds;
localparam PORT_NONE = 2'd0;
localparam PORT_CPU1 = 2'd1;
localparam PORT_REQ = 2'd2;
reg [2:0] next_port;
reg [2:0] port;
reg port1_state;
reg [17:1] last_addr;
// PORT1
always @(*) begin
if (port1_req ^ port1_state) begin
next_port = PORT_REQ;
addr_latch_next = { 1'b0, port1_a };
end else if (cpu1_addr != last_addr) begin
next_port = PORT_CPU1;
addr_latch_next = { 7'd0, cpu1_addr };
end else begin
next_port = PORT_NONE;
addr_latch_next = addr_latch;
end
end
always @(posedge clk) begin
SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ;
{ SDRAM_DQMH, SDRAM_DQML } <= 2'b11;
sd_cmd <= CMD_NOP; // default: idle
if(init) begin
// initialization takes place at the end of the reset phase
if(t == STATE_RAS0) begin
if(reset == 15) begin
sd_cmd <= CMD_PRECHARGE;
SDRAM_A[10] <= 1'b1; // precharge all banks
end
if(reset == 10 || reset == 8) begin
sd_cmd <= CMD_AUTO_REFRESH;
end
if(reset == 2) begin
sd_cmd <= CMD_LOAD_MODE;
SDRAM_A <= MODE;
SDRAM_BA <= 2'b00;
end
end
end else begin
// RAS phase
if(t == STATE_RAS0) begin
addr_latch <= addr_latch_next;
port <= next_port;
{ oe_latch, we_latch } <= 2'b00;
if (next_port != PORT_NONE) begin
sd_cmd <= CMD_ACTIVE;
SDRAM_A <= addr_latch_next[22:10];
SDRAM_BA <= addr_latch_next[24:23];
if (next_port == PORT_REQ) begin
{ oe_latch, we_latch } <= { ~port1_we, port1_we };
ds <= port1_ds;
din_latch <= port1_d;
port1_state <= port1_req;
end else begin
{ oe_latch, we_latch } <= 2'b10;
last_addr <= cpu1_addr;
ds <= 2'b11;
end
end else begin
sd_cmd <= CMD_AUTO_REFRESH;
end
end
// CAS phase
if(t == STATE_CAS0 && (we_latch || oe_latch)) begin
sd_cmd <= we_latch?CMD_WRITE:CMD_READ;
{ SDRAM_DQMH, SDRAM_DQML } <= ~ds;
if (we_latch) begin
SDRAM_DQ <= din_latch;
port1_ack <= port1_req;
end
SDRAM_A <= { 4'b0010, addr_latch[9:1] }; // auto precharge
SDRAM_BA <= addr_latch[24:23];
end
// data returned
if(t == STATE_READ0 && oe_latch) cpu1_q <= SDRAM_DQ;
end
end
endmodule

View File

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

View File

@@ -0,0 +1,428 @@
---------------------------------------------------------------------------------
-- Time pilot sound board by Dar (darfpga@aol.fr) (29/10/2017)
-- http://darfpga.blogspot.fr
---------------------------------------------------------------------------------
-- gen_ram.vhd
--------------------------------
-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com)
-- http://www.syntiac.com/fpga64.html
---------------------------------------------------------------------------------
-- T80/T80se - Version : 0247
-----------------------------
-- Z80 compatible microprocessor core
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
---------------------------------------------------------------------------------
-- YM2149 (AY-3-8910)
-- Copyright (c) MikeJ - Jan 2005
---------------------------------------------------------------------------------
-- Educational use only
-- Do not redistribute synthetized file with roms
-- Do not redistribute roms whatever the form
-- Use at your own risk
---------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity time_pilot_sound_board is
port(
clock_14 : in std_logic;
reset : in std_logic;
sound_cmd : in std_logic_vector(7 downto 0);
sound_trig : in std_logic;
audio_out : out std_logic_vector(10 downto 0);
ROMCL : in std_logic;
ROMAD : in std_logic_vector(12 downto 0);
ROMDT : in std_logic_vector(7 downto 0);
ROMEN : in std_logic
);
end time_pilot_sound_board;
architecture struct of time_pilot_sound_board is
signal reset_n: std_logic;
signal clock_14n : std_logic;
signal clock_div1 : std_logic_vector(11 downto 0) := (others => '0');
signal biquinary_div : std_logic_vector(3 downto 0) := (others => '0');
signal cpu_clock_en : std_logic;
signal ayx_clock_en : 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_rd_n : std_logic;
signal cpu_wr_n : std_logic;
signal cpu_mreq_n : std_logic;
signal cpu_irq_n : std_logic;
signal cpu_iorq_n : std_logic;
signal cpu_m1_n : std_logic;
signal cpu_rom_do : std_logic_vector( 7 downto 0);
signal wram_do : std_logic_vector( 7 downto 0);
signal wram_we : std_logic;
signal clr_irq_n : std_logic;
signal sen1_n : std_logic;
signal sen2_n : std_logic;
signal sen3_n : std_logic;
signal sen4_n : std_logic;
signal sound_trig_r : std_logic;
signal ay1_do : std_logic_vector(7 downto 0);
signal ay1_cs_n : std_logic;
signal ay1_bdir : std_logic;
signal ay1_bc1 : std_logic;
signal ay1_audio_muxed : std_logic_vector(7 downto 0);
signal ay1_audio_chan : std_logic_vector(1 downto 0);
signal ay1_port_b_di : std_logic_vector(7 downto 0);
signal ay2_do : std_logic_vector(7 downto 0);
signal ay2_cs_n : std_logic;
signal ay2_bdir : std_logic;
signal ay2_bc1 : std_logic;
signal ay2_audio_muxed : std_logic_vector(7 downto 0);
signal ay2_audio_chan : std_logic_vector(1 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 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 filter_cmd_we : std_logic;
signal filter_cmd : std_logic_vector(11 downto 0);
signal mult_cmd : std_logic_vector(1 downto 0);
signal mult_value : integer range 0 to 779;
signal Vc_1a : integer range -256*1024 to 256*1024-1;
signal Vc_1b : integer range -256*1024 to 256*1024-1;
signal Vc_1c : integer range -256*1024 to 256*1024-1;
signal Vc_2a : integer range -256*1024 to 256*1024-1;
signal Vc_2b : integer range -256*1024 to 256*1024-1;
signal Vc_2c : integer range -256*1024 to 256*1024-1;
signal Vc : integer range -256*1024 to 256*1024-1;
signal Vin : integer range -256 to 255;
signal dV : integer range -512 to 511;
signal Vcn_a : integer range -1024*1024 to 1024*1024-1;
signal Vcn_b : integer range -1024*1024 to 1024*1024-1;
signal Vcn_c : integer range -256*1024 to 256*1024-1;
begin
clock_14n <= not clock_14;
reset_n <= not reset;
--------------------------------------------------------
-- RC filters equation
--
-- Vc : capacitor voltage = output voltage
-- fs : sample frequency
-- Vin : voltage at resistor input
--
-- Vc(k+1) = Vc(k) + (Vin-Vc(k))/(fs.R.C)
--
-- Vcn * 1024 <= Vcn * 1024 + (Vin-Vc) * 1024/(fs.R.C)
-- With Vcn = 1024 * Vc
--------------------------------------------------------
-- Filters will be run at 14.318MHz/512 = 27.96KHz
--------------------------------------------------------
-- 6 filters have to be implemented
-- RC equation is time multiplexed to save multiplier
-- for small FPGA
--------------------------------------------------------
-- mux Vc
with clock_div1(3 downto 0) select
Vc <= Vc_1a when X"0", -- Vc_xy : [0..255*1024]
Vc_1b when X"1", -- => Vc : [-256*1024..255*1024]
Vc_1c when X"2",
Vc_2a when X"3",
Vc_2b when X"4",
Vc_2c when others;
-- mux Vin
with clock_div1(3 downto 0) select
Vin <= to_integer(unsigned(ay1_chan_a)) when X"0", -- ayx_chan_y : [0..255]
to_integer(unsigned(ay1_chan_b)) when X"1", -- => Vin : [-256:255]
to_integer(unsigned(ay1_chan_c)) when X"2",
to_integer(unsigned(ay2_chan_a)) when X"3",
to_integer(unsigned(ay2_chan_b)) when X"4",
to_integer(unsigned(ay2_chan_c)) when others;
-- compute dV
dV <= Vin-Vc/1024; -- Vc/1024 : [0..255], dv : [-255..511] => [-512..511]
-- mux filter cmd
with clock_div1(3 downto 0) select
mult_cmd <= filter_cmd( 7 downto 6) when X"0",
filter_cmd( 9 downto 8) when X"1",
filter_cmd(11 downto 10) when X"2",
filter_cmd( 1 downto 0) when X"3",
filter_cmd( 3 downto 2) when X"4",
filter_cmd( 5 downto 4) when others;
-- mux multiplier value
with mult_cmd select
mult_value <= 779 when "10", -- 0.047uF/1KOhm => (1024/fs.R.C = 779, cut fcy 3386Hz)
166 when "01", -- 0.220uF/1KOhm => (1024/fs.R.C = 166, cut fcy 723Hz)
137 when "11", -- 0.267uF/1KOhm => (1024/fs.R.C = 137, cut fcy 596Hz)
779 when others; -- Not use
-- compute Vcn
Vcn_a <= Vin*1024 when mult_cmd = "00" else Vc + dv*mult_value; -- => Vcn_a : [-1024*1024..1023*1024]
-- limit to > 0
Vcn_b <= 0 when Vcn_a < 0 else Vcn_a;
-- limit to < 255*1024
Vcn_c <= 255*1024 when Vcn_b > 255*1024 else Vcn_b;
-- demux/store result and mix channels
process (clock_14)
begin
if rising_edge(clock_14) then -- 14.318MHz/512 => fs = 27.96KHz
-- demux & down sample
if clock_div1(8 downto 0) = '0'&X"00" then Vc_1a <= Vcn_c; end if;
if clock_div1(8 downto 0) = '0'&X"01" then Vc_1b <= Vcn_c; end if;
if clock_div1(8 downto 0) = '0'&X"02" then Vc_1c <= Vcn_c; end if;
if clock_div1(8 downto 0) = '0'&X"03" then Vc_2a <= Vcn_c; end if;
if clock_div1(8 downto 0) = '0'&X"04" then Vc_2b <= Vcn_c; end if;
if clock_div1(8 downto 0) = '0'&X"05" then Vc_2c <= Vcn_c; end if;
-- rescale and mix channels with down sample
if clock_div1(8 downto 0) = '0'&X"06" then
audio_out <= std_logic_vector(to_unsigned(Vc_1a/1024,11)) +
std_logic_vector(to_unsigned(Vc_1b/1024,11)) +
std_logic_vector(to_unsigned(Vc_1c/1024,11)) +
std_logic_vector(to_unsigned(Vc_2a/1024,11)) +
std_logic_vector(to_unsigned(Vc_2b/1024,11)) +
std_logic_vector(to_unsigned(Vc_2c/1024,11));
end if;
end if;
end process;
-- divide clocks
-- random generator ?
process (clock_14, reset)
begin
if reset='1' then
clock_div1 <= (others =>'0');
biquinary_div <= (others =>'0');
else
if rising_edge(clock_14) then
clock_div1 <= clock_div1 + '1';
if clock_div1 = X"800" then
if biquinary_div(3 downto 1) = "100" then
biquinary_div(3 downto 1) <= "000";
biquinary_div(0) <= not biquinary_div(0);
else
biquinary_div(3 downto 1) <= biquinary_div(3 downto 1) + '1';
end if;
end if;
end if;
end if;
end process;
-- make clocks for cpu and sound generators
cpu_clock_en <= '1' when clock_div1(2 downto 0) = "011" else '0';
ayx_clock_en <= '1' when clock_div1(2 downto 0) = "111" else '0';
-- mux rom/ram/devices data ouput to cpu data input w.r.t cpu address
cpu_di <= cpu_rom_do when cpu_addr(15 downto 13) = "000" and cpu_rd_n = '0' and cpu_mreq_n = '0' else -- 0000-1FFF
wram_do when cpu_addr(15 downto 12) = "0010" and cpu_rd_n = '0' and cpu_mreq_n = '0' else -- 2000-2FFF
ay1_do when cpu_addr(15 downto 13) = "010" and cpu_rd_n = '0' and cpu_mreq_n = '0' else -- 4000-5FFF
ay2_do when cpu_addr(15 downto 13) = "011" and cpu_rd_n = '0' and cpu_mreq_n = '0' else -- 6000-7FFF
X"FF";
-- write enable to working ram and filter command register
wram_we <= '1' when cpu_wr_n = '0' and cpu_addr(15 downto 12) = "0010" else '0';
filter_cmd_we <= '1' when cpu_wr_n = '0' and cpu_addr(15 downto 12) = "0011" else '0';
-- chip select with r/w direction to AY chips
sen1_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"4" else '1';
sen2_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"5" else '1';
sen3_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"6" else '1';
sen4_n <= '0' when cpu_mreq_n = '0' and cpu_addr(15 downto 12) = X"7" else '1';
-- finalise AY r/w & address controls
ay1_bc1 <= not sen2_n or ( cpu_wr_n and not sen1_n);
ay1_bdir <= not sen2_n or (not cpu_wr_n and not sen1_n);
ay1_cs_n <= sen1_n and sen2_n;
ay2_bc1 <= not sen4_n or ( cpu_wr_n and not sen3_n);
ay2_bdir <= not sen4_n or (not cpu_wr_n and not sen3_n);
ay2_cs_n <= sen3_n and sen4_n;
-- input random (?) to AY1 chip
ay1_port_b_di <= biquinary_div(0)&biquinary_div(3)&biquinary_div(2)&clock_div1(11)&"0000";
-- clear irq when reset and irq acknowledge
clr_irq_n <= reset_n and (cpu_m1_n or cpu_iorq_n);
-- regsiter filters commands (11 bits data are cpu address)
process (clock_14, cpu_clock_en)
begin
if rising_edge(clock_14) and cpu_clock_en = '1' then
if filter_cmd_we = '1' then filter_cmd <= cpu_addr(11 downto 0); end if;
end if;
end process;
-- latch sound trigger rising edge to set cpu_irq, and manage clear
process (clock_14)
begin
if rising_edge(clock_14) then
sound_trig_r <= sound_trig;
if clr_irq_n = '0' then
cpu_irq_n <= '1';
else
if sound_trig ='1' and sound_trig_r = '0' then
cpu_irq_n <= '0';
end if;
end if;
end if;
end process;
-- demux AY chips output
process (clock_14, ayx_clock_en)
begin
if rising_edge(clock_14) and ayx_clock_en = '1' then
if ay1_audio_chan = "00" then ay1_chan_a <= ay1_audio_muxed; end if;
if ay1_audio_chan = "01" then ay1_chan_b <= ay1_audio_muxed; end if;
if ay1_audio_chan = "10" then ay1_chan_c <= ay1_audio_muxed; end if;
if ay2_audio_chan = "00" then ay2_chan_a <= ay2_audio_muxed; end if;
if ay2_audio_chan = "01" then ay2_chan_b <= ay2_audio_muxed; end if;
if ay2_audio_chan = "10" then ay2_chan_c <= ay2_audio_muxed; end if;
end if;
end process;
-- microprocessor Z80
cpu : entity work.T80se
generic map(Mode => 0, T2Write => 1, IOWait => 1)
port map(
RESET_n => reset_n,
CLK_n => clock_14,
CLKEN => cpu_clock_en,
WAIT_n => '1',
INT_n => cpu_irq_n,
NMI_n => '1',
BUSRQ_n => '1',
M1_n => cpu_m1_n,
MREQ_n => cpu_mreq_n,
IORQ_n => cpu_iorq_n,
RD_n => cpu_rd_n,
WR_n => cpu_wr_n,
RFSH_n => open,
HALT_n => open,
BUSAK_n => open,
A => cpu_addr,
DI => cpu_di,
DO => cpu_do
);
-- cpu1 program ROM
rom_cpu1 : entity work.dpram
generic map( dWidth => 8, aWidth => 13)
port map(
clk_a => clock_14n,
addr_a => cpu_addr(12 downto 0),
we_a => '0',
q_a => cpu_rom_do,
clk_b => ROMCL,
addr_b => ROMAD,
we_b => ROMEN,
d_b => ROMDT
);
-- working RAM
wram : entity work.spram
generic map( dWidth => 8, aWidth => 10)
port map(
clk => clock_14n,
we => wram_we,
addr => cpu_addr(9 downto 0),
d => cpu_do,
q => wram_do
);
-- AY-3-8910 #1
ay_3_8910_1 : entity work.YM2149
port map(
-- data bus
I_DA => cpu_do, -- in std_logic_vector(7 downto 0);
O_DA => ay1_do, -- out std_logic_vector(7 downto 0);
O_DA_OE_L => open, -- out std_logic;
-- control
I_A9_L => ay1_cs_n, -- in std_logic;
I_A8 => '1', -- in std_logic;
I_BDIR => ay1_bdir, -- in std_logic;
I_BC2 => '1', -- in std_logic;
I_BC1 => ay1_bc1, -- in std_logic;
I_SEL_L => '1', -- in std_logic;
O_AUDIO => ay1_audio_muxed, -- out std_logic_vector(7 downto 0);
O_CHAN => ay1_audio_chan, -- out std_logic_vector(1 downto 0);
-- port a
I_IOA => sound_cmd, -- in std_logic_vector(7 downto 0);
O_IOA => open, -- out std_logic_vector(7 downto 0);
O_IOA_OE_L => open, -- out std_logic;
-- port b
I_IOB => ay1_port_b_di, -- in std_logic_vector(7 downto 0);
O_IOB => open, -- out std_logic_vector(7 downto 0);
O_IOB_OE_L => open, -- out std_logic;
ENA => ayx_clock_en, -- in std_logic; -- clock enable for higher speed operation
RESET_L => reset_n, -- in std_logic;
CLK => clock_14 -- in std_logic
);
-- AY-3-8910 #2
ay_3_8910_2 : entity work.YM2149
port map(
-- data bus
I_DA => cpu_do, -- in std_logic_vector(7 downto 0);
O_DA => ay2_do, -- out std_logic_vector(7 downto 0);
O_DA_OE_L => open, -- out std_logic;
-- control
I_A9_L => ay2_cs_n, -- in std_logic;
I_A8 => '1', -- in std_logic;
I_BDIR => ay2_bdir, -- in std_logic;
I_BC2 => '1', -- in std_logic;
I_BC1 => ay2_bc1, -- in std_logic;
I_SEL_L => '1', -- in std_logic;
O_AUDIO => ay2_audio_muxed, -- out std_logic_vector(7 downto 0);
O_CHAN => ay2_audio_chan, -- out std_logic_vector(1 downto 0);
-- port a
I_IOA => (others => '0'), -- in std_logic_vector(7 downto 0);
O_IOA => open, -- out std_logic_vector(7 downto 0);
O_IOA_OE_L => open, -- out std_logic;
-- port b
I_IOB => (others => '0'), -- in std_logic_vector(7 downto 0);
O_IOB => open, -- out std_logic_vector(7 downto 0);
O_IOB_OE_L => open, -- out std_logic;
ENA => ayx_clock_en, -- in std_logic; -- clock enable for higher speed operation
RESET_L => reset_n, -- in std_logic;
CLK => clock_14 -- in std_logic
);
end struct;