1
0
mirror of https://github.com/mist-devel/mist-board.git synced 2026-02-05 07:34:41 +00:00

NES: add FDS and NSF support

This commit is contained in:
Gyorgy Szombathelyi
2020-02-22 00:11:14 +01:00
parent da005fdd1b
commit 55e2c21f27
8 changed files with 836 additions and 33 deletions

View File

@@ -45,19 +45,21 @@ module NES_mist(
input UART_RX,
input UART_TX
);
// the configuration string is returned to the io controller to allow
// it to control the menu on the OSD
parameter CONF_STR = {
"NES;NES;",
"NES;NESFDSNSF;",
"F,BIN,Load FDS BIOS;",
"O12,System Type,NTSC,PAL,Dendy;",
"O34,Scanlines,OFF,25%,50%,75%;",
"O5,Joystick swap,OFF,ON;",
"O6,Invert mirroring,OFF,ON;",
"O7,Hide overscan,OFF,ON;",
"O8,Palette,FCEUX,Unsaturated-V6;",
"T9,Reset;",
"V,v1.0;"
"O9B,Disk side,Auto,A,B,C,D;",
"T0,Reset;",
"V,v2.0-test1;"
};
wire [31:0] status;
@@ -70,7 +72,7 @@ wire joy_swap = status[5];
wire mirroring_osd = status[6];
wire overscan_osd = status[7];
wire palette2_osd = status[8];
wire reset_osd = status[9];
wire [2:0] diskside_osd = status[11:9];
wire scandoubler_disable;
wire ypbpr;
@@ -125,7 +127,7 @@ wire [7:0] nes_joy_B = { joyB[0], joyB[1], joyB[2], joyB[3], joyB[7], joyB[6], j
always @(posedge clk) begin
if(downloading)
download_reset_cnt <= 8'd255;
else if(download_reset_cnt != 0)
else if(!loader_busy && download_reset_cnt != 0)
download_reset_cnt <= download_reset_cnt - 8'd1;
end
@@ -181,7 +183,7 @@ wire [7:0] nes_joy_B = { joyB[0], joyB[1], joyB[2], joyB[3], joyB[7], joyB[6], j
end
// Loader
wire [7:0] loader_input;
wire [7:0] loader_input = (loader_busy && !downloading) ? nsf_data : ioctl_dout;
wire loader_clk;
wire [21:0] loader_addr;
wire [7:0] loader_write_data;
@@ -190,8 +192,13 @@ wire [7:0] nes_joy_B = { joyB[0], joyB[1], joyB[2], joyB[3], joyB[7], joyB[6], j
wire [31:0] loader_flags;
reg [31:0] mapper_flags;
wire loader_done, loader_fail;
wire type_bios, type_nes = 1, type_fds, type_nsf;
wire loader_busy;
wire type_bios = (menu_index == 2);
wire is_bios = 0;//type_bios;
wire type_nes = (menu_index == 0) || (menu_index == {2'd0, 6'h1});
wire type_fds = (menu_index == {2'd1, 6'h1});
wire type_nsf = (menu_index == {2'd2, 6'h1});
GameLoader loader
(
.clk ( clk ),
@@ -205,12 +212,12 @@ GameLoader loader
.mem_addr ( loader_addr ),
.mem_data ( loader_write_data ),
.mem_write ( loader_write ),
.bios_download ( bios_download ),
.bios_download ( ),
.mapper_flags ( loader_flags ),
.busy ( loader_busy ),
.done ( loader_done ),
.error ( loader_fail ),
.rom_loaded ( rom_loaded )
.rom_loaded ( )
);
always @(posedge clk)
@@ -222,13 +229,24 @@ GameLoader loader
always @(posedge clk) begin
led_blink <= led_blink + 13'd1;
end
assign LED = downloading ? 1'b0 : loader_fail ? led_blink[23] : 1'b1;
wire reset_nes = (init_reset || buttons[1] || arm_reset || reset_osd || download_reset || loader_fail);
// Loopy's NSF player ROM
reg [7:0] nsf_player [4096];
reg [7:0] nsf_data;
initial begin
$readmemh("nsf.hex", nsf_player);
end
always @(posedge clk) nsf_data <= nsf_player[loader_addr[11:0]];
wire ext_audio = 1;
wire int_audio = 1;
assign LED = downloading ? 1'b0 : loader_fail ? led_blink[23] : 1'b1;
wire reset_nes = (init_reset || buttons[1] || arm_reset || download_reset || loader_fail);
wire ext_audio = 1;
wire int_audio = 1;
wire [1:0] diskside_req;
wire [1:0] diskside = (diskside_osd == 0) ? diskside_req : (diskside_osd - 1'd1);
NES nes(
.clk(clk),
@@ -243,12 +261,10 @@ NES nes(
.joypad_data({powerpad_d4[0],powerpad_d3[0],joypad_bits2[0],joypad_bits[0]}),
.mic(),
.fds_busy(),
.fds_eject(0),
.diskside_req(),
.diskside(),
.fds_eject(fds_eject),
.diskside_req(diskside_req),
.diskside(diskside),
.audio_channels(5'b11111), // enable all channels
.ex_sprites(),
.mask(),
.cpumem_addr(memory_addr_cpu),
.cpumem_read(memory_read_cpu),
.cpumem_din(memory_din_cpu),
@@ -281,7 +297,8 @@ always @(posedge clk) begin
loader_write_data_mem <= loader_write_data;
end
if(nes_ce == 1) begin
// signal write in the PPU memory phase
if(nes_ce == 3) begin
loader_write_mem <= loader_write_triggered;
if(loader_write_triggered)
loader_write_triggered <= 1'b0;
@@ -305,16 +322,16 @@ sdram sdram (
.init ( !clock_locked ),
// cpu/chipset interface
.addrA ( downloading ? {3'b000, loader_addr_mem} : {3'b000, memory_addr_cpu} ),
.addrA ( (downloading | loader_busy) ? {3'b000, loader_addr_mem} : {3'b000, memory_addr_cpu} ),
.addrB ( {3'b000, memory_addr_ppu} ),
.weA ( memory_write_cpu || loader_write_mem ),
.weA ( loader_write_mem || memory_write_cpu ),
.weB ( memory_write_ppu ),
.dinA ( downloading ? loader_write_data_mem : memory_dout_cpu ),
.dinA ( (downloading | loader_busy) ? loader_write_data_mem : memory_dout_cpu ),
.dinB ( memory_dout_ppu ),
.oeA ( memory_read_cpu ),
.oeA ( ~(downloading | loader_busy) & memory_read_cpu ),
.doutA ( memory_din_cpu ),
.oeB ( memory_read_ppu ),
@@ -322,6 +339,8 @@ sdram sdram (
);
wire downloading;
wire [7:0] menu_index;
wire [7:0] ioctl_dout;
data_io data_io (
.clk_sys ( clk ),
@@ -331,10 +350,11 @@ data_io data_io (
.SPI_DI ( SPI_DI ),
.ioctl_download ( downloading ),
.ioctl_index ( menu_index ),
// ram interface
.ioctl_wr ( loader_clk ),
.ioctl_dout ( loader_input )
.ioctl_dout ( ioctl_dout )
);
wire nes_hs, nes_vs;
@@ -412,6 +432,7 @@ sigma_delta_dac sigma_delta_dac (
wire [7:0] kbd_joy0;
wire [7:0] kbd_joy1;
wire [11:0] powerpad;
wire fds_eject;
keyboard keyboard (
.clk(clk),
@@ -422,7 +443,8 @@ keyboard keyboard (
.joystick_0(kbd_joy0),
.joystick_1(kbd_joy1),
.powerpad(powerpad)
.powerpad(powerpad),
.fds_eject(fds_eject)
);
endmodule

View File

@@ -10,7 +10,8 @@ module keyboard
output [7:0] joystick_0,
output [7:0] joystick_1,
output reg [11:0] powerpad
output reg [11:0] powerpad,
output reg fds_eject
);
reg pressed;
@@ -77,6 +78,8 @@ always @(posedge reset or posedge clk) begin
9'H02A: powerpad[9] <= pressed; // V
9'H032: powerpad[10] <= pressed; // B
9'H031: powerpad[11] <= pressed; // N
9'H17D: fds_eject <= pressed; //PgUp
endcase;
pressed <= 1'b1;

View File

@@ -123,7 +123,7 @@ set_location_assignment PIN_43 -to SDRAM_CLK
set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE BALANCED
set_global_assignment -name SMART_RECOMPILE ON
set_global_assignment -name ENABLE_SIGNALTAP OFF
set_global_assignment -name USE_SIGNALTAP_FILE out/sdram.stp
set_global_assignment -name USE_SIGNALTAP_FILE out/cpu.stp
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC ON
set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION ON
set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT NORMAL
@@ -323,4 +323,6 @@ set_global_assignment -name SYSTEMVERILOG_FILE src/mappers/misc.sv
set_global_assignment -name SYSTEMVERILOG_FILE src/mappers/JYCompany.sv
set_global_assignment -name SYSTEMVERILOG_FILE src/mappers/generic.sv
set_global_assignment -name SYSTEMVERILOG_FILE src/mappers/FDS.sv
set_global_assignment -name SIGNALTAP_FILE out/loader.stp
set_global_assignment -name SIGNALTAP_FILE out/cpu.stp
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

180
cores/nes/nsf.hex Normal file
View File

@@ -0,0 +1,180 @@
/* http://srecord.sourceforge.net/ */
@00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000017 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@0000002E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000045 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@0000005C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000073 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@0000008A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000000A1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000000B8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000000CF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000000E6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000000FD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000114 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@0000012B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000142 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000159 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 78 A2 F3 9A 8E F5 01
@00000187 A9 00 8D 00 20 8D 01 20 20 8B 42 A2 08 A0 00 8C 06 20 8C 06 20 A9 32
@0000019E 85 00 A9 45 85 01 B1 00 8D 07 20 C8 D0 F8 E6 01 CA 10 F3 A9 3F 8D 06
@000001B5 20 A9 00 8D 06 20 A2 08 A9 0F 8D 07 20 A9 30 8D 07 20 8D 07 20 8D 07
@000001CC 20 CA D0 ED A9 20 8D 06 20 A9 00 8D 06 20 AA A0 04 A9 20 8D 07 20 E8
@000001E3 D0 FA 88 D0 F7 A9 22 8D 06 20 A9 10 8D 06 20 A9 2F 8D 07 20 AD 06 41
@000001FA 20 05 45 B9 FC 01 8D 07 20 88 10 F7 A9 20 8D 06 20 A9 C2 8D 06 20 A0
@00000211 00 B9 0E 41 F0 08 8D 07 20 C8 C0 1E D0 F3 A9 21 8D 06 20 A9 02 8D 06
@00000228 20 A0 00 B9 2E 41 F0 08 8D 07 20 C8 C0 1E D0 F3 A9 21 8D 06 20 A9 42
@0000023F 8D 06 20 A0 00 B9 4E 41 F0 08 8D 07 20 C8 C0 1E D0 F3 AD 7B 41 8D F3
@00000256 5F 09 40 A2 55 8E F2 3F A2 AA 8E EA 3F 8D FA 3F 20 6F 43 AD 07 41 8D
@0000026D F4 01 20 A7 42 A9 0A 8D 01 20 AD F2 5F 10 FB 8D F2 5F EE F9 01 20 51
@00000284 44 20 2E 44 4C 77 42 AD 02 20 AD 02 20 10 FB A0 18 A2 64 CA D0 FD 88
@0000029B D0 FA AD 02 20 30 01 E8 8E FA 01 60 20 9D 43 20 2D 43 AD 7B 41 29 04
@000002B2 D0 12 A9 60 85 01 A9 00 85 00 A8 91 00 C8 D0 FB E6 01 10 F7 A9 00 AA
@000002C9 95 00 9D 00 02 9D 00 03 9D 00 04 9D 00 05 9D 00 06 9D 00 07 E8 D0 E9
@000002E0 AD F4 01 20 05 45 A9 20 C8 99 FC 01 C0 03 D0 F8 AD 02 20 AD 02 20 10
@000002F7 FB A9 22 8D 06 20 A9 0D 8D 06 20 AD FE 01 8D 07 20 AD FD 01 8D 07 20
@0000030E AD FC 01 8D 07 20 A9 00 8D 06 20 8D 06 20 AD F5 01 D0 01 60 AE F4 01
@00000325 CA 8A AE FA 01 6C 0A 41 A9 00 A2 07 1D 70 41 CA 10 FA AA D0 1D AD 09
@0000033C 41 4A 4A 4A 4A AA A0 00 98 9D F0 5F C8 E8 E0 10 D0 F6 88 8C F7 5F 88
@00000353 8C F6 5F 60 A2 07 BD 70 41 9D F8 5F CA 10 F7 AD 76 41 8D F6 5F AD 77
@0000036A 41 8D F7 5F 60 AD 6E 41 AC 6F 41 AE FA 01 F0 06 AD 78 41 AC 79 41 C0
@00000381 00 F0 08 C9 41 D0 0A C0 1A D0 06 BD 9B 43 BC 99 43 8D F0 5F 8C F1 5F
@00000398 60 41 4E 1A 20 A9 00 8D 15 40 8D 08 40 A9 10 8D 00 40 8D 04 40 8D 0C
@000003AF 40 A9 0F 8D 15 40 A9 40 8D 17 40 A9 C0 8D 83 40 8D 80 40 8D 84 40 8D
@000003C6 87 40 8D 89 40 A9 E8 8D 8A 40 AD 7B 41 29 01 F0 0B A9 00 8D 00 90 8D
@000003DD 00 A0 8D 00 B0 AD 7B 41 29 02 F0 16 A9 00 A2 35 A0 10 8E 10 90 EA EA
@000003F4 EA EA 8D 30 90 88 D0 FD CA D0 EE AD 7B 41 29 08 F0 03 8D 15 50 AD 7B
@0000040B 41 29 10 F0 0B A2 80 8E 00 F8 8D 00 48 CA 10 FA AD 7B 41 29 20 F0 0B
@00000422 A2 0F 8E 00 C0 8D 00 E0 CA 10 F7 60 AD F5 01 F0 1D A9 04 2C F6 01 F0
@00000439 06 AD F9 01 4A 90 10 A9 08 2C F6 01 F0 06 20 4D 44 20 4D 44 6C 0C 41
@00000450 60 AD F6 01 48 20 B2 44 AD F6 01 8D F8 01 20 B2 44 AD F6 01 4D F8 01
@00000467 D0 EF 68 4D F6 01 2D F6 01 8D F7 01 0A 90 11 AE F4 01 EC 06 41 90 02
@0000047E A2 00 E8 8E F4 01 4C A7 42 0A 90 0E CE F4 01 D0 06 AD 06 41 8D F4 01
@00000495 4C A7 42 0A 90 03 4C 12 45 0A 90 08 A9 01 8D F5 01 4C A7 42 0A 0A 0A
@000004AC B0 DC 0A B0 C5 60 A2 01 8E 16 40 CA 8E 16 40 A2 08 18 AD 17 40 AD 16
@000004C3 40 09 FC 69 03 2E F6 01 CA D0 EF 60 A2 00 8E FB 01 C9 A0 90 02 E9 A0
@000004DA 2E FB 01 C9 50 90 02 E9 50 2E FB 01 C9 28 90 02 E9 28 2E FB 01 C9 14
@000004F1 90 02 E9 14 2E FB 01 C9 0A 90 02 E9 0A 2E FB 01 AE FB 01 60 A0 FF 20
@00000508 CF 44 C8 99 FC 01 8A D0 F6 60 A9 00 8D 00 20 8D 01 20 20 9D 43 A2 07
@0000051F BD 2A 45 95 00 CA 10 F8 4C 00 00 A9 01 8D 07 42 6C FC FF 7C C6 C6 C6
@00000536 C6 C6 7C 00 00 00 00 00 00 00 00 00 30 70 30 30 30 30 78 00 00 00 00
@0000054D 00 00 00 00 00 7C C6 C6 0C 30 60 FE 00 00 00 00 00 00 00 00 00 7C C6
@00000564 06 3C 06 C6 7C 00 00 00 00 00 00 00 00 00 1C 3C 6C 4C CC FE 0C 00 00
@0000057B 00 00 00 00 00 00 00 FE C0 FC C6 06 C6 7C 00 00 00 00 00 00 00 00 00
@00000592 7C C6 C0 FC C6 C6 7C 00 00 00 00 00 00 00 00 00 FE C6 0C 18 18 30 30
@000005A9 00 00 00 00 00 00 00 00 00 7C C6 C6 7C C6 C6 7C 00 00 00 00 00 00 00
@000005C0 00 00 7C C6 C6 7E 06 C6 7C 00 00 00 00 00 00 00 00 00 38 6C 44 C6 FE
@000005D7 C6 C6 00 00 00 00 00 00 00 00 00 FC C2 C2 FC C2 C2 FC 00 00 00 00 00
@000005EE 00 00 00 00 7C C2 C0 C0 C0 C2 7C 00 00 00 00 00 00 00 00 00 FC C2 C2
@00000605 C2 C2 C2 FC 00 00 00 00 00 00 00 00 00 FE C0 C0 FC C0 C0 FE 00 00 00
@0000061C 00 00 00 00 00 00 FE C0 C0 FC C0 C0 C0 00 00 00 00 00 00 00 00 00 00
@00000633 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@0000064A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000661 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000678 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@0000068F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000006A6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000006BD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000006D4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@000006EB 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000702 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000719 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000730 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 08 08 08 08
@00000747 00 08 00 00 00 00 00 00 00 00 00 6C 6C 24 48 00 00 00 00 00 00 00 00
@0000075E 00 00 00 00 00 24 7E 24 24 7E 24 00 00 00 00 00 00 00 00 00 10 3C 50
@00000775 38 14 78 10 00 00 00 00 00 00 00 00 00 42 A4 48 10 24 4A 84 00 00 00
@0000078C 00 00 00 00 00 00 38 40 48 30 4A 44 3A 00 00 00 00 00 00 00 00 00 60
@000007A3 60 20 40 00 00 00 00 00 00 00 00 00 00 00 00 00 08 10 10 10 10 08 00
@000007BA 00 00 00 00 00 00 00 00 00 20 10 10 10 10 20 00 00 00 00 00 00 00 00
@000007D1 00 00 00 10 54 10 54 10 00 00 00 00 00 00 00 00 00 00 10 10 7C 10 10
@000007E8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60 60 20 40 00 00 00 00 00
@000007FF 00 00 00 00 00 00 7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000816 00 60 60 00 00 00 00 00 00 00 00 00 02 06 0C 18 30 60 C0 00 00 00 00
@0000082D 00 00 00 00 00 7C C6 C6 C6 C6 C6 7C 00 00 00 00 00 00 00 00 00 30 70
@00000844 30 30 30 30 78 00 00 00 00 00 00 00 00 00 7C C6 C6 0C 30 60 FE 00 00
@0000085B 00 00 00 00 00 00 00 7C C6 06 3C 06 C6 7C 00 00 00 00 00 00 00 00 00
@00000872 1C 3C 6C 4C CC FE 0C 00 00 00 00 00 00 00 00 00 FE C0 FC C6 06 C6 7C
@00000889 00 00 00 00 00 00 00 00 00 7C C6 C0 FC C6 C6 7C 00 00 00 00 00 00 00
@000008A0 00 00 FE C6 0C 18 18 30 30 00 00 00 00 00 00 00 00 00 7C C6 C6 7C C6
@000008B7 C6 7C 00 00 00 00 00 00 00 00 00 7C C6 C6 7E 06 C6 7C 00 00 00 00 00
@000008CE 00 00 00 00 30 30 00 00 30 30 00 00 00 00 00 00 00 00 00 00 00 60 60
@000008E5 00 60 60 20 40 00 00 00 00 00 00 00 00 04 08 10 20 10 08 04 00 00 00
@000008FC 00 00 00 00 00 00 00 00 7C 00 7C 00 00 00 00 00 00 00 00 00 00 00 40
@00000913 20 10 08 10 20 40 00 00 00 00 00 00 00 00 00 38 44 08 10 10 00 10 00
@0000092A 00 00 00 00 00 00 00 00 3C 42 9E 96 9C 40 3C 00 00 00 00 00 00 00 00
@00000941 00 38 6C 44 C6 FE C6 C6 00 00 00 00 00 00 00 00 00 FC C2 C2 FC C2 C2
@00000958 FC 00 00 00 00 00 00 00 00 00 7C C2 C0 C0 C0 C2 7C 00 00 00 00 00 00
@0000096F 00 00 00 FC C2 C2 C2 C2 C2 FC 00 00 00 00 00 00 00 00 00 FE C0 C0 FC
@00000986 C0 C0 FE 00 00 00 00 00 00 00 00 00 FE C0 C0 FC C0 C0 C0 00 00 00 00
@0000099D 00 00 00 00 00 7C C2 C0 DE C2 C6 7C 00 00 00 00 00 00 00 00 00 C2 C2
@000009B4 C2 FE C2 C2 C2 00 00 00 00 00 00 00 00 00 3C 18 18 18 18 18 3C 00 00
@000009CB 00 00 00 00 00 00 00 7E 0C 0C 0C 0C 8C 78 00 00 00 00 00 00 00 00 00
@000009E2 C2 C2 C4 F8 C4 C2 C2 00 00 00 00 00 00 00 00 00 C0 C0 C0 C0 C0 C0 FE
@000009F9 00 00 00 00 00 00 00 00 00 C6 EE FE D6 C6 C6 C6 00 00 00 00 00 00 00
@00000A10 00 00 C2 E2 D2 CA C6 C2 C2 00 00 00 00 00 00 00 00 00 7C C2 C2 C2 C2
@00000A27 C2 7C 00 00 00 00 00 00 00 00 00 FC C2 C2 FC C0 C0 C0 00 00 00 00 00
@00000A3E 00 00 00 00 7C C2 C2 C2 DA D4 7A 00 00 00 00 00 00 00 00 00 FC C2 C2
@00000A55 FC C8 C4 C2 00 00 00 00 00 00 00 00 00 7C C2 C0 7C 02 C2 7C 00 00 00
@00000A6C 00 00 00 00 00 00 7E 18 18 18 18 18 18 00 00 00 00 00 00 00 00 00 C2
@00000A83 C2 C2 C2 C2 C2 7C 00 00 00 00 00 00 00 00 00 C6 C6 C6 C6 6C 6C 38 00
@00000A9A 00 00 00 00 00 00 00 00 C6 C6 D6 D6 FE EE 44 00 00 00 00 00 00 00 00
@00000AB1 00 C6 C6 6C 38 6C C6 C6 00 00 00 00 00 00 00 00 00 C4 C4 68 30 30 30
@00000AC8 30 00 00 00 00 00 00 00 00 00 FC 08 10 20 40 C0 FC 00 00 00 00 00 00
@00000ADF 00 00 00 1C 18 18 18 18 18 1C 00 00 00 00 00 00 00 00 00 80 C0 60 30
@00000AF6 18 0C 06 00 00 00 00 00 00 00 00 00 70 30 30 30 30 30 70 00 00 00 00
@00000B0D 00 00 00 00 00 10 28 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000B24 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 20 10 08 00 00 00 00 00 00
@00000B3B 00 00 00 00 00 00 00 00 00 78 CC CC CC 76 00 00 00 00 00 00 00 00 00
@00000B52 C0 C0 F8 CC CC CC F8 00 00 00 00 00 00 00 00 00 00 00 7C C0 C0 C0 7C
@00000B69 00 00 00 00 00 00 00 00 00 0C 0C 7C CC CC CC 7C 00 00 00 00 00 00 00
@00000B80 00 00 00 00 78 CC FC C0 7C 00 00 00 00 00 00 00 00 00 1C 30 30 FC 30
@00000B97 30 30 00 00 00 00 00 00 00 00 00 00 00 7C CC CC 7C 0C 78 00 00 00 00
@00000BAE 00 00 00 00 C0 C0 C0 F8 CC CC CC 00 00 00 00 00 00 00 00 00 00 18 00
@00000BC5 18 18 18 18 00 00 00 00 00 00 00 00 00 00 18 00 18 18 18 D8 70 00 00
@00000BDC 00 00 00 00 00 00 C0 C0 CC D8 F0 D8 CC 00 00 00 00 00 00 00 00 00 38
@00000BF3 18 18 18 18 18 18 00 00 00 00 00 00 00 00 00 00 00 EC D6 D6 D6 D6 00
@00000C0A 00 00 00 00 00 00 00 00 00 00 F8 CC CC CC CC 00 00 00 00 00 00 00 00
@00000C21 00 00 00 78 CC CC CC 78 00 00 00 00 00 00 00 00 00 00 00 F8 CC CC F8
@00000C38 C0 C0 00 00 00 00 00 00 00 00 00 00 7C CC CC 7C 0C 0C 00 00 00 00 00
@00000C4F 00 00 00 00 00 DC E0 C0 C0 C0 00 00 00 00 00 00 00 00 00 00 00 78 C0
@00000C66 78 0C F8 00 00 00 00 00 00 00 00 00 70 30 FC 30 30 30 1C 00 00 00 00
@00000C7D 00 00 00 00 00 00 00 CC CC CC CC 78 00 00 00 00 00 00 00 00 00 00 00
@00000C94 CC CC CC 78 30 00 00 00 00 00 00 00 00 00 00 00 C6 D6 D6 D6 6C 00 00
@00000CAB 00 00 00 00 00 00 00 00 00 C6 6C 38 6C C6 00 00 00 00 00 00 00 00 00
@00000CC2 00 00 CC CC 78 30 60 C0 00 00 00 00 00 00 00 00 00 00 FC 18 30 60 FC
@00000CD9 00 00 00 00 00 00 00 00 00 0C 08 08 18 08 08 0C 00 00 00 00 00 00 00
@00000CF0 00 00 10 10 10 00 10 10 10 00 00 00 00 00 00 00 00 00 60 20 20 30 20
@00000D07 20 60 00 00 00 00 00 00 00 00 00 00 00 00 32 4C 00 00 00 00 00 00 00
@00000D1E 00 00 00 00 00 00 00 10 28 44 7C 00 00 00 00 00 00 00 00 00 00 00 00
@00000D35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000D4C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000D63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000D7A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000D91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000DA8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000DBF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000DD6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000DED 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000E04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000E1B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000E32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000E49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000E60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000E77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000E8E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000EA5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000EBC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000ED3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000EEA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000F01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000F18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000F2F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000F46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000F5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000F74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000F8B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000FA2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000FB9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000FD0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@00000FE7 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 41
@00000FFE 00 00

View File

@@ -0,0 +1,14 @@
Loopy's NSF Player
------------------
Use asm6 to compile:
asm6 nsf.asm
Strip header:
dd if=nsf.bin of=nsf.rom bs=1 skip=16 count=4096
Convert to hex:
srec_cat nsf.rom -bin -Output nsf.hex -vmem 8

Binary file not shown.

View File

@@ -0,0 +1,581 @@
;----------------------------------
; NSF player for PowerPak
;
; Player rom is at $4100-4FFF (NSF header at $4100)
;
; PowerPak registers:
;
; 5FF0: timer latch LSB
; 5FF1: timer latch MSB
; 5FF2: timer status (Read: bit7=timer wrapped, Write: clear status)
; 5FF3: Expansion audio control (copy header[0x7B] here)
; 5FF6-5FFF: banking registers (as described in NSF spec)
;
; Timer details:
; PowerPak NSF mapper has a 16bit 1MHz counter that counts down from [5FF1:5FF0] to 0.
; After the counter reaches 0, it's automatically reloaded and timer status bit is set.
; Clear the status bit by writing to $5FF2.
;
;-----------------------------------
A = $80
B = $40
SELECT = $20
START = $10
UP = $08
DOWN = $04
LEFT = $02
RIGHT = $01
HDR_BASE = $4100
HDR_SONGS = HDR_BASE+$06
HDR_FIRST = HDR_BASE+$07
HDR_LOAD = HDR_BASE+$08
HDR_INIT = HDR_BASE+$0a
HDR_PLAY = HDR_BASE+$0c
HDR_TITLE = HDR_BASE+$0e
HDR_ARTIST = HDR_BASE+$2e
HDR_COPYRIGHT = HDR_BASE+$4e
HDR_NTSC_LO = HDR_BASE+$6E
HDR_NTSC_HI = HDR_BASE+$6F
HDR_BANK = HDR_BASE+$70
HDR_PAL_LO = HDR_BASE+$78
HDR_PAL_HI = HDR_BASE+$79
HDR_EXP_HW = HDR_BASE+$7b
STACK_TOP = $1f4
CURRENT = $1f4 ;song#
PLAYING = $1f5 ;nonzero=song is playing
JOYPAD = $1f6 ;button state
JOYD = $1f7 ;button 0->1
JOYTMP = $1f8
FRAME = $1f9
PAL = $1fa ;1=PAL detected
DIVTMP = $1fb
STR = $1fc ;4 bytes used for printing current song #
; header ------
db $4E,$45,$53,$1A
db $01 ;PRG size/16k
db $00 ;CHR size/8k
db $00,$00 ;flags,mapper
db $00,$00,$00,$00,$00,$00,$00,$00
.org $4000
.pad HDR_BASE+$80
reset ;-------
sei
ldx #<(STACK_TOP-1)
txs
stx PLAYING
lda #$00
sta $2000 ;nmi off
sta $2001 ;screen off
jsr pal_detect
ldx #8 ;load CHR: 128 tiles = $800 bytes
ldy #$00
sty $2006
sty $2006
lda #<chr
sta 0
lda #>chr
sta 1
- lda (0),y
sta $2007
iny
bne -
inc 1
dex
bpl -
lda #$3f ;set palette
sta $2006
lda #$00
sta $2006
ldx #8
- lda #$0f
sta $2007
lda #$30
sta $2007
sta $2007
sta $2007
dex
bne -
lda #$20 ;clear screens
sta $2006
lda #$00
sta $2006
tax
ldy #4 ;$10
lda #$20 ;" "
- sta $2007
inx
bne -
dey
bne -
lda #$22
sta $2006
lda #$10
sta $2006
lda #$2f ;"/"
sta $2007
lda HDR_SONGS
jsr deci
- lda STR,y ;print #songs
sta $2007
dey
bpl -
lda #$20 ;print song infos
sta $2006
lda #$c2
sta $2006
ldy #0
- lda HDR_TITLE,y
beq +
sta $2007
iny
cpy #30
bne -
+
lda #$21
sta $2006
lda #$02
sta $2006
ldy #0
- lda HDR_ARTIST,y
beq +
sta $2007
iny
cpy #30
bne -
+
lda #$21
sta $2006
lda #$42
sta $2006
ldy #0
- lda HDR_COPYRIGHT,y
beq +
sta $2007
iny
cpy #30
bne -
+
lda HDR_EXP_HW ;enable extra audio HW (also PRG write enable for FDS)
sta $5ff3
ora #$40 ;- kevtris - swap VRC6 registers which is how all NSFs use VRC6
ldx #$55
stx $3ff2
ldx #$aa
stx $3fea ;- these two writes enable the chip select mode in the HDNES hardware
sta $3ffa ;- automatic enable setting for HDNES
jsr timer_init
lda HDR_FIRST ;init first song
sta CURRENT
jsr init
lda #%00001010 ;screen on, sprites off
sta $2001
busywait
lda $5ff2
bpl busywait
sta $5ff2
inc FRAME
jsr joyread
jsr play
jmp busywait
pal_detect ;-----------------
lda $2002
- lda $2002
bpl -
ldy #24 ;eat about 30000 cycles (1 NTSC frame)
ldx #100
- dex
bne -
dey
bne -
lda $2002 ;VBL flag is set if NTSC
bmi +
inx
+ stx PAL
rts
init ;------------------ ;begin CURRENT song
jsr stopsound
jsr bank_init
lda HDR_EXP_HW ;clear 6000-7fff unless FDS is enabled
and #4
bne no_wram_clear
lda #$60
sta 1
lda #0
sta 0
tay
- sta (0),y
iny
bne -
inc 1
bpl -
no_wram_clear
lda #0 ;clear 0000-07ff
tax
- sta $00,x
sta $200,x ;(not 100-1ff)
sta $300,x
sta $400,x
sta $500,x
sta $600,x
sta $700,x
inx
bne -
lda CURRENT ;print song#
jsr deci
lda #$20 ;<---
- iny
sta STR,y
cpy #3
bne -
lda $2002
- lda $2002
bpl -
lda #$22
sta $2006
lda #$0d
sta $2006
lda STR+2
sta $2007
lda STR+1
sta $2007
lda STR
sta $2007
lda #$00 ;reset scroll
sta $2006
sta $2006
lda PLAYING
bne +
rts
+
ldx CURRENT ;call INIT w/ A=song#, X=pal
dex
txa
ldx PAL
jmp (HDR_INIT)
bank_init ;---------------
lda #0
ldx #7
- ora HDR_BANK,x
dex
bpl -
tax
bne banked_nsf
not_banked:
lda HDR_LOAD+1
lsr
lsr
lsr
lsr
tax
ldy #0
- tya
sta $5ff0,x
iny
inx
cpx #$10
bne -
dey
sty $5ff7
dey
sty $5ff6
rts
banked_nsf:
ldx #7
- lda HDR_BANK,x
sta $5ff8,x
dex
bpl -
lda HDR_BANK+6 ;FDS also has banks @ 6000-7FFF
sta $5ff6
lda HDR_BANK+7
sta $5ff7
rts
timer_init ;-------------
lda HDR_NTSC_LO
ldy HDR_NTSC_HI
ldx PAL
beq +
lda HDR_PAL_LO
ldy HDR_PAL_HI
+
cpy #0
beq fixit
+ cmp #$41
bne time_ok
cpy #$1a
bne time_ok
fixit
lda time_lo,x
ldy time_hi,x
time_ok
sta $5ff0
sty $5ff1
rts
time_hi db $41, $4e
time_lo db $1a, $20
stopsound ;---------------
lda #$00 ;reset sound regs
sta $4015
sta $4008
lda #$10
sta $4000
sta $4004
sta $400c
lda #$0f
sta $4015
lda #$40
sta $4017
lda #$c0 ;FDS reset
sta $4083
sta $4080
sta $4084
sta $4087
sta $4089
lda #$e8
sta $408a
;-----------------------kevtris start
lda HDR_EXP_HW
and #$01
beq szz0
lda #$00 ;shut up VRC6
sta $9000
sta $a000
sta $b000
szz0
lda HDR_EXP_HW
and #$02
beq szz1
lda #$00 ;shut up VRC7
ldx #$35
sswt ldy #$10
stx $9010
nop
nop
nop
nop
sta $9030
sswx dey
bne sswx
dex
bne sswt
szz1
lda HDR_EXP_HW
and #$08
beq ssz2
sta $5015 ;shut up MMC5
ssz2
lda HDR_EXP_HW
and #$10
beq ssz3
ldx #$80 ;shut up N163
stx $f800 ;start from address 0, auto increment
sswq sta $4800
dex
bpl sswq ;clear all RAM
ssz3
lda HDR_EXP_HW
and #$20
beq ssz4
ldx #$0f ;shut up 5B
sswz stx $c000
sta $e000
dex
bpl sswz
ssz4
;-------------------kevtris end
rts
play ;--------------------
lda PLAYING
beq +
lda #DOWN
bit JOYPAD
beq ++
lda FRAME
lsr
bcc +
++ lda #UP
bit JOYPAD
beq playhere
jsr playhere
jsr playhere
playhere
jmp (HDR_PLAY)
+ rts
joyread ;----------------
lda JOYPAD
pha
jsr joyread2
retry lda JOYPAD
sta JOYTMP
jsr joyread2
lda JOYPAD
eor JOYTMP
bne retry
pla
eor JOYPAD
and JOYPAD
sta JOYD
asl ;A
bcc +
_A ldx CURRENT
cpx HDR_SONGS
bcc ++
ldx #$00
++ inx
stx CURRENT
jmp init
+
asl ;B
bcc +
_B dec CURRENT
bne ++
lda HDR_SONGS
sta CURRENT
++ jmp init
+
asl ;SEL
bcc +
;lda #$00
;sta PLAYING
;jmp stopsound
jmp powerpak_bios_reset
+
asl ;START
bcc +
lda #$01
sta PLAYING
jmp init
+
asl ;UP
asl ;DOWN
asl ;LEFT
bcs _B
asl ;RIGHT
bcs _A
rts
joyread2 ;----------------
ldx #1
stx $4016
dex
stx $4016
ldx #$08
- clc
lda $4017 ;kevtris - added to read controller 2 so the HDNES menu is still accessable
lda $4016
ora #$fc
adc #3
rol JOYPAD
dex
bne -
rts
div10 ;------------------
ldx #0 ;in: A=#
stx DIVTMP ;out: X=#/10, A=remainder
cmp #%10100000
bcc +
sbc #%10100000
+ rol DIVTMP
cmp #%01010000
bcc +
sbc #%01010000
+ rol DIVTMP
cmp #%00101000
bcc +
sbc #%00101000
+ rol DIVTMP
cmp #%00010100
bcc +
sbc #%00010100
+ rol DIVTMP
cmp #%00001010
bcc +
sbc #%00001010
+ rol DIVTMP
ldx DIVTMP
rts
deci ;------------------- ;in: A=#
ldy #$ff ;out: A,X=? Y=strlen-1
- jsr div10
iny
sta STR,y
txa
bne -
rts
powerpak_bios_reset ;---------
lda #$00 ;screen off
sta $2000
sta $2001
jsr stopsound
ldx #(resetcode_end - resetcode - 1)
- lda resetcode,x
sta $0,x
dex
bpl -
jmp 0
resetcode
lda #1
sta $4207
jmp ($fffc)
resetcode_end
;------------------------
chr .bin "font.chr" ;ascii chr set
.pad $4ffc ;powerpak bios jumps to (4FFC)
.dw reset ;vectors are NOT mapped to $Fxxx, IRQ/NMI must be disabled.
.align $4000

View File

@@ -200,9 +200,10 @@ always @(posedge clk) begin
mem_addr <= mem_addr + 1'd1;
end
end else begin
mem_addr <= 22'b00_0000_0000_0000_0000_0000;
bytes_left <= 21'h2000;
state <= S_COPYBIOS;
// mem_addr <= 22'b00_0000_0000_0000_0000_0000;
// bytes_left <= 21'h2000;
// state <= S_COPYBIOS;
state <= S_DONE;
clearclk <= 4'h0;
end
end