diff --git a/Arcade_MiST/.gitignore b/Arcade_MiST/.gitignore index 345e6aef..dae1c893 100644 --- a/Arcade_MiST/.gitignore +++ b/Arcade_MiST/.gitignore @@ -1 +1,4 @@ Test +*.rom +*.arc + diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/ReadMe.txt b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/ReadMe.txt index eff56ba4..96f07c0f 100644 --- a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/ReadMe.txt +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/ReadMe.txt @@ -2,18 +2,12 @@ Traverse USA by Dar (darfpga@aol.fr) (16/03/2019) Port to MiST -TRAVRUSA.ROM or SHTRIDER.ROM is required at the root of the SD-Card. - -Creating in Windows: -copy /B zr1-0.m3 + zr1-5.l3 + zr1-6a.k3 + zr1-7.j3 + mr10.1a + mr10.1a + zippyrac.001 + mr8.3c + mr9.3a + zr1-8.n3 + zr1-9.l3 + zr1-10.k3 + mmi6349.ij + tbp24s10.3 + tbp18s.2 > TRAVRUSA.ROM -copy /B sr01a.bin + sr02a.bin + sr03a.bin + sr04a.bin + sr11a.bin + sr05a.bin + sr06a.bin + sr07a.bin + sr08a.bin + sr09a.bin + sr10b.bin + 1.bpr + 2.bpr + 3.bpr + 4.bpr > SHTRIDER.ROM - -Creating in Linux: -cat zr1-0.m3 zr1-5.l3 zr1-6a.k3 zr1-7.j3 mr10.1a mr10.1a zippyrac.001 mr8.3c mr9.3a zr1-8.n3 zr1-9.l3 zr1-10.k3 mmi6349.ij tbp24s10.3 tbp18s.2 > TRAVRUSA.ROM -cat sr01a.bin sr02a.bin sr03a.bin sr04a.bin sr11a.bin sr05a.bin sr06a.bin sr07a.bin sr08a.bin sr09a.bin sr10b.bin 1.bpr 2.bpr 3.bpr 4.bpr > SHTRIDER.ROM - -Some ROM files contain different names, like: -zippyrac.000 -zippyrac.005 -zippyrac.006 -zippyrac.007 +-- Usage: +-- - Create ROM and ARC files from the MRA files in the meta directory +-- using the MRA utility. +-- Example: mra -A -z /path/to/mame/roms travrusa.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 +-- +-- MRA utility: https://github.com/sebdel/mra-tools-c/ +-- diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/meta/shtrider.mra b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/meta/shtrider.mra new file mode 100644 index 00000000..95bfca30 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/meta/shtrider.mra @@ -0,0 +1,32 @@ + + Shotrider + 0216 + shtrider + 201911270000 + 1983 + Irem + Racing / Motorbike + travrusa + 1 + + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/meta/travrusa.mra b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/meta/travrusa.mra new file mode 100644 index 00000000..96e9958f --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/meta/travrusa.mra @@ -0,0 +1,28 @@ + + Traverse USA - Zippy Race + 0216 + travrusa + 201911270000 + 1983 + Irem + Racing / Motorbike + travrusa + 0 + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/TraverseUSA_MiST.sv b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/TraverseUSA_MiST.sv index faad868f..ad291209 100644 --- a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/TraverseUSA_MiST.sv +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/TraverseUSA_MiST.sv @@ -50,24 +50,8 @@ module TraverseUSA_MiST( `include "rtl/build_id.v" -`define CORE_NAME "SHTRIDER" -//`define CORE_NAME "TRAVRUSA" - -reg shtrider = 0; -wire [7:0] dip1 = 8'hff; -reg [7:0] dip2; - -always @(*) begin - if (`CORE_NAME == "SHTRIDER") begin - shtrider = 1; - // Cocktail(3) / M-Km(1) / Flip(0) - dip2 = { 4'b1111, 2'b11, status[5], 1'b0 }; - end else begin - shtrider = 0; - // Diag(7) / Demo(6) / Zippy(5) / Freeze (4) / M-Km(3) / Coin mode (2) / Cocktail(1) / Flip(0) - dip2 = { ~status[9], ~status[8], ~status[7], ~status[6], ~status[5], 3'b110 }; - end -end +`define CORE_NAME "TRAVRUSA" +wire [6:0] core_mod; localparam CONF_STR = { `CORE_NAME,";;", @@ -83,6 +67,26 @@ localparam CONF_STR = { "V,v1.0.",`BUILD_DATE }; +wire rotate = status[2]; +wire [1:0] scanlines = status[4:3]; +wire blend = status[10]; + +reg shtrider = 0; +wire [7:0] dip1 = 8'hff; +reg [7:0] dip2; + +always @(*) begin + if (core_mod == 7'h1) begin + shtrider = 1; + // Cocktail(3) / M-Km(1) / Flip(0) + dip2 = { 4'b1111, 2'b11, status[5], 1'b0 }; + end else begin + shtrider = 0; + // Diag(7) / Demo(6) / Zippy(5) / Freeze (4) / M-Km(3) / Coin mode (2) / Cocktail(1) / Flip(0) + dip2 = { ~status[9], ~status[8], ~status[7], ~status[6], ~status[5], 3'b110 }; + end +end + assign LED = 1; assign AUDIO_R = AUDIO_L; assign SDRAM_CLK = clk_sys; @@ -105,13 +109,34 @@ wire [7:0] joystick_0; wire [7:0] joystick_1; wire scandoublerD; wire ypbpr; -wire [10:0] ps2_key; -wire [10:0] audio; -wire hs, vs; -wire blankn; -wire [2:0] g,b; -wire [1:0] r; +wire no_csync; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .no_csync (no_csync ), + .core_mod (core_mod ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + wire [14:0] cart_addr; wire [15:0] sdram_do; wire cart_rd; @@ -198,6 +223,11 @@ always @(posedge clk_sys) begin reset <= status[0] | buttons[1] | ~rom_loaded; end +wire [10:0] audio; +wire hs, vs; +wire blankn; +wire [2:0] g,b; +wire [1:0] r; // Traverse_usa traverse_usa traverse_usa ( @@ -219,19 +249,19 @@ traverse_usa traverse_usa ( .dip_switch_1 ( dip1 ), .dip_switch_2 ( dip2 ), - .start2 ( btn_two_players ), - .start1 ( btn_one_player ), - .coin1 ( btn_coin ), + .start2 ( m_two_players ), + .start1 ( m_one_player ), + .coin1 ( m_coin1 ), .right1 ( m_right ), .left1 ( m_left ), .brake1 ( m_down ), .accel1 ( m_up ), - .right2 ( m_right ), - .left2 ( m_left ), - .brake2 ( m_down ), - .accel2 ( m_up ), + .right2 ( m_right2 ), + .left2 ( m_left2 ), + .brake2 ( m_down2 ), + .accel2 ( m_up2 ), .cpu_rom_addr ( cart_addr ), .cpu_rom_do ( cart_addr[0] ? sdram_do[15:8] : sdram_do[7:0] ), @@ -258,33 +288,13 @@ mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video( .VGA_B ( VGA_B ), .VGA_VS ( VGA_VS ), .VGA_HS ( VGA_HS ), - .rotate ( {1'b1,status[2]} ), + .rotate ( { 1'b1, rotate } ), .scandoubler_disable( scandoublerD ), - .scanlines ( status[4:3] ), + .scanlines ( scanlines ), .ypbpr ( ypbpr ), + .no_csync ( no_csync ), .ce_divider ( 1'b0 ), - .blend ( status[10] ) - ); - -user_io #( - .STRLEN(($size(CONF_STR)>>3))) -user_io( - .clk_sys (clk_sys ), - .conf_str (CONF_STR ), - .SPI_CLK (SPI_SCK ), - .SPI_SS_IO (CONF_DATA0 ), - .SPI_MISO (SPI_DO ), - .SPI_MOSI (SPI_DI ), - .buttons (buttons ), - .switches (switches ), - .scandoubler_disable (scandoublerD ), - .ypbpr (ypbpr ), - .key_strobe (key_strobe ), - .key_pressed (key_pressed ), - .key_code (key_code ), - .joystick_0 (joystick_0 ), - .joystick_1 (joystick_1 ), - .status (status ) + .blend ( blend ) ); dac #( @@ -296,43 +306,24 @@ dac( .dac_o(AUDIO_L) ); -// Rotated Normal -wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3]; -wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2]; -wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1]; -wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0]; -wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; -wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +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; -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; -wire key_pressed; -wire [7:0] key_code; -wire key_strobe; - -always @(posedge clk_sys) begin - if(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 +arcade_inputs inputs ( + .clk ( clk_sys ), + .key_strobe ( key_strobe ), + .key_pressed ( key_pressed ), + .key_code ( key_code ), + .joystick_0 ( joystick_0 ), + .joystick_1 ( joystick_1 ), + .rotate ( rotate ), + .orientation ( 2'b11 ), + .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 diff --git a/Arcade_MiST/Konami Green Beret Hardware/README.txt b/Arcade_MiST/Konami Green Beret Hardware/README.txt index 30dc4750..9ca4a4d0 100644 --- a/Arcade_MiST/Konami Green Beret Hardware/README.txt +++ b/Arcade_MiST/Konami Green Beret Hardware/README.txt @@ -1,6 +1,13 @@ -- Arcade: Rush'n Attack (Green Beret) port to MiST by Slingshot -- --- GBERET.ROM is required on the SD Card +-- Usage: +-- - Create ROM and ARC files from the MRA files in the meta directory +-- using the MRA utility. +-- Example: mra -A -z /path/to/mame/roms gberet.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 +-- +-- MRA utility: https://github.com/sebdel/mra-tools-c/ -- -- Keyboard inputs : -- diff --git a/Arcade_MiST/Konami Green Beret Hardware/meta/gberet.mra b/Arcade_MiST/Konami Green Beret Hardware/meta/gberet.mra new file mode 100644 index 00000000..d08e94df --- /dev/null +++ b/Arcade_MiST/Konami Green Beret Hardware/meta/gberet.mra @@ -0,0 +1,30 @@ + + Green Beret + 0216 + gberet + 201911270000 + 1985 + Konami + Army / Fighter + gberet + + 0 + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Green Beret Hardware/meta/mrgoemon.mra b/Arcade_MiST/Konami Green Beret Hardware/meta/mrgoemon.mra new file mode 100644 index 00000000..53baa131 --- /dev/null +++ b/Arcade_MiST/Konami Green Beret Hardware/meta/mrgoemon.mra @@ -0,0 +1,26 @@ + + Mr. Goemon + 0216 + mrgoemon + 201911270000 + 1985 + Konami + Army / Fighter + gberet + + 2 + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Green Beret Hardware/meta/rushatck.mra b/Arcade_MiST/Konami Green Beret Hardware/meta/rushatck.mra new file mode 100644 index 00000000..09c5f0b9 --- /dev/null +++ b/Arcade_MiST/Konami Green Beret Hardware/meta/rushatck.mra @@ -0,0 +1,27 @@ + + Rush'n Attack (US) + 0216 + rushatck + 201911270000 + 1985 + Konami + Army / Fighter + gberet + + 1 + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Konami Green Beret Hardware/rtl/gberet_mist.sv b/Arcade_MiST/Konami Green Beret Hardware/rtl/gberet_mist.sv index 3bf22938..e08e3279 100644 --- a/Arcade_MiST/Konami Green Beret Hardware/rtl/gberet_mist.sv +++ b/Arcade_MiST/Konami Green Beret Hardware/rtl/gberet_mist.sv @@ -32,13 +32,10 @@ module gberet_mist ( `include "rtl\build_id.v" -//`define CORE_NAME "GBERET" -//`define CORE_NAME "RUSHNA" -`define CORE_NAME "MRGOEMON" - +`define CORE_NAME "GBERET" localparam CONF_STR = { - `CORE_NAME,";ROM;", + `CORE_NAME, ";ROM;", "O2,Rotate Controls,Off,On;", "O34,Scandoubler Fx,None,CRT 25%,CRT 50%,CRT 75%;", "O5,Blend,Off,On;", @@ -50,16 +47,21 @@ localparam CONF_STR = { "V,v1.00.",`BUILD_DATE }; +wire rotate = status[2]; +wire [1:0] scanlines = status[4:3]; +wire blend = status[5]; + wire [1:0] dsLives = ~status[9:8]; wire [1:0] dsExtend = ~status[11:10]; wire [1:0] dsDiff = ~status[13:12]; wire dsDemoSnd = ~status[14]; +wire [6:0] core_mod; -assign LED = ~ioctl_downl; -assign AUDIO_R = AUDIO_L; -assign SDRAM_CLK = clock_48; -assign SDRAM_CKE = 1; +assign LED = ~ioctl_downl; +assign AUDIO_R = AUDIO_L; +assign SDRAM_CLK = clock_48; +assign SDRAM_CKE = 1; wire clock_48, pll_locked; pll pll( @@ -75,14 +77,32 @@ 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 [3:0] r, g, b; +wire no_csync; wire key_strobe; wire key_pressed; wire [7:0] key_code; + +user_io #(.STRLEN($size(CONF_STR)>>3))user_io( + .clk_sys ( clock_48 ), + .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 ), + .core_mod ( core_mod ), + .key_strobe ( key_strobe ), + .key_pressed ( key_pressed ), + .key_code ( key_code ), + .joystick_0 ( joystick_0 ), + .joystick_1 ( joystick_1 ), + .status ( status ) + ); + wire [15:0] rom_addr; wire [15:0] rom_do; wire [15:1] spr_addr; @@ -104,7 +124,7 @@ wire [7:0] ioctl_dout; // 24200 - 2421F - pal - 32b - 2f data_io data_io( - .clk_sys ( clock_48 ), + .clk_sys ( clock_48 ), .SPI_SCK ( SPI_SCK ), .SPI_SS2 ( SPI_SS2 ), .SPI_DI ( SPI_DI ), @@ -170,6 +190,11 @@ always @(posedge clock_48) begin end ////////////////////////////////////////////// +wire [7:0] audio; +wire hs, vs; +wire hb, vb; +wire blankn = ~(hb | vb); +wire [3:0] r, g, b; wire PCLK; wire PCLK_EN; @@ -182,9 +207,9 @@ HVGEN hvgen .oRGB({b,g,r}),.HBLK(hb),.VBLK(vb),.HSYN(hs),.VSYN(vs) ); -wire [5:0] INP0 = { m_fire2, m_fire1, {m_left, m_down, m_right, m_up} }; -wire [5:0] INP1 = { m_fire2, m_fire1, {m_left, m_down, m_right, m_up} }; -wire [2:0] INP2 = { m_coin, m_start2, m_start1 }; +wire [5:0] INP0 = { m_fireB, m_fireA, m_left, m_down, m_right, m_up }; +wire [5:0] INP1 = { m_fire2B, m_fire2A, m_left2, m_down2, m_right2, m_up2 }; +wire [2:0] INP2 = { m_coin1 | m_coin2, m_two_players, m_one_player }; wire [7:0] DSW0 = {dsDemoSnd,dsDiff,dsExtend,1'b0,dsLives}; wire [7:0] DSW1 = 8'hFF; @@ -220,32 +245,14 @@ mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(10)) mist_video( .VGA_B ( VGA_B ), .VGA_VS ( VGA_VS ), .VGA_HS ( VGA_HS ), - .rotate ( {1'b1,status[2]} ), + .rotate ( { 1'b1, rotate } ), .scandoubler_disable( scandoublerD ), - .blend ( status[5] ), - .scanlines ( status[4:3] ), + .blend ( blend ), + .scanlines ( scanlines ), + .no_csync ( no_csync ), .ypbpr ( ypbpr ) ); -user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( - .clk_sys ( clock_48 ), - .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 #(8) dac( .clk_i(clock_48), .res_n_i(1), @@ -253,42 +260,24 @@ dac #(8) dac( .dac_o(AUDIO_L) ); -// Rotated Normal -wire m_up = status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_up | joystick_0[3] | joystick_1[3]; -wire m_down = status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_down | joystick_0[2] | joystick_1[2]; -wire m_left = status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_left | joystick_0[1] | joystick_1[1]; -wire m_right = status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_right | joystick_0[0] | joystick_1[0]; -wire m_fire1 = btn_fire1 | joystick_0[4] | joystick_1[4]; -wire m_fire2 = btn_fire2 | joystick_0[5] | joystick_1[5]; -wire m_start1 = btn_one_player; -wire m_start2 = btn_two_players; -wire m_coin = btn_coin; - -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_coin = 0; - -always @(posedge clock_48) begin - if(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 - 'h29: btn_fire1 <= key_pressed; // Space - 'h11: btn_fire2 <= key_pressed; // Alt - endcase - end -end +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_48 ), + .key_strobe ( key_strobe ), + .key_pressed ( key_pressed ), + .key_code ( key_code ), + .joystick_0 ( joystick_0 ), + .joystick_1 ( joystick_1 ), + .rotate ( rotate ), + .orientation ( 2'b10 ), + .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 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/README.txt b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/README.txt index f51e3b49..6329e838 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/README.txt +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/README.txt @@ -4,8 +4,8 @@ -- 10 November 2017 -- -- Usage: +-- Create ROM and ARC files from MAME ROM zip files using the mra utility and the MRA files. -- Copy the RBF and the ARC files to the same folder. --- Create ROM files from MAME ROM zip files using the mra utility and the MRA files. -- Example: mra -z /path/to/mame/roms scramble.mra -- Copy the ROM files to the root of the SD Card. -- diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Amidar.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Amidar.arc deleted file mode 100644 index 26925577..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Amidar.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=1 -CONF=O78,Lives,3,4,5,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Anteater.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Anteater.arc deleted file mode 100644 index c16e46b4..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Anteater.arc +++ /dev/null @@ -1,5 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=10 -CONF=O7,Lives,3,5 -CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Armored Car.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Armored Car.arc deleted file mode 100644 index 5d7ffe9b..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Armored Car.arc +++ /dev/null @@ -1,5 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=5 -CONF=O7,Lives,3,5 -CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Atlantis.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Atlantis.arc deleted file mode 100644 index 1f3d7c46..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Atlantis.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=13 -CONF=O7,Lives,3,5 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Calipso.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Calipso.arc deleted file mode 100644 index 0a7a0cd5..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Calipso.arc +++ /dev/null @@ -1,5 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=8 -CONF=O7,Lives,3,5 -CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Dark Planet.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Dark Planet.arc deleted file mode 100644 index 58ee2160..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Dark Planet.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=9 - diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Frogger.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Frogger.arc deleted file mode 100644 index e9d2fc09..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Frogger.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=2 -CONF=O78,Lives,3,5,7,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Lost Tomb.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Lost Tomb.arc deleted file mode 100644 index aa537248..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Lost Tomb.arc +++ /dev/null @@ -1,5 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=11 -CONF=O78,Lives,3,5,Free Play,Invuln. -CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mars.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mars.arc deleted file mode 100644 index a93c5876..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mars.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=12 -CONF=O7,Lives,3,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mighty Monkey.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mighty Monkey.arc deleted file mode 100644 index 686c7ce0..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Mighty Monkey.arc +++ /dev/null @@ -1,5 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=18 -CONF=O78,Lives,3,4,5,6 -CONF=O9,Infinite Lives,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Minefield.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Minefield.arc deleted file mode 100644 index 45fcca0d..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Minefield.arc +++ /dev/null @@ -1,7 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=16 -CONF=O7,Lives,3,5 -CONF=O89,Difficulty,Easy,Medium,Hard,Hardest -CONF=OB,Start Level,1,3 -CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Moon War.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Moon War.arc deleted file mode 100644 index 6e04cc34..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Moon War.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=6 -CONF=O78,Lives,3,4,5,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Rescue.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Rescue.arc deleted file mode 100644 index 41890e67..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Rescue.arc +++ /dev/null @@ -1,7 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=17 -CONF=O7,Lives,3,5 -CONF=O8,Difficulty,Easy,Hard -CONF=O9,Start Level,1,3 -CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Scramble.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Scramble.arc deleted file mode 100644 index f30fa498..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Scramble.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=0 -CONF=O78,Lives,3,4,5,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Speed Coin.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Speed Coin.arc deleted file mode 100644 index 5895d772..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Speed Coin.arc +++ /dev/null @@ -1,5 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=7 -CONF=O7,Lives,3,5 -CONF=OB,Difficulty,Easy,Hard diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/StrategyX.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/StrategyX.arc deleted file mode 100644 index 01cf90fa..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/StrategyX.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=14 -CONF=O78,Lives,3,4,5,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Super Cobra.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Super Cobra.arc deleted file mode 100644 index d2b6ac93..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Super Cobra.arc +++ /dev/null @@ -1,5 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=3 -CONF=O7,Lives,3,4 -CONF=O9,Continue,No,Yes diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Tazzmania.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Tazzmania.arc deleted file mode 100644 index 40cb853c..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Tazzmania.arc +++ /dev/null @@ -1,5 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=4 -CONF=O7,Lives,3,5 -CONF=OA,Demo Sounds,Off,On diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Turtles.arc b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Turtles.arc deleted file mode 100644 index f0cbc5d2..00000000 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/Turtles.arc +++ /dev/null @@ -1,4 +0,0 @@ -[ARC] -RBF=SCRAMBLE -MOD=15 -CONF=O78,Lives,3,4,5,Unl diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/amidar.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/amidar.mra index caeda697..3f75ef70 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/amidar.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/amidar.mra @@ -1,6 +1,11 @@ Amidar (Scramble hardware) + scramble 0209 + + + + 1 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/anteater.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/anteater.mra index 438719bc..fb761561 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/anteater.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/anteater.mra @@ -1,6 +1,12 @@ Ant Eater 0209 + scramble + + + + + 0A diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/armorcar.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/armorcar.mra index 800231da..22da3ed5 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/armorcar.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/armorcar.mra @@ -1,6 +1,12 @@ Armored Car 0209 + scramble + + + + + 5 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/atlantis.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/atlantis.mra index 332a5536..4ce34f75 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/atlantis.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/atlantis.mra @@ -1,6 +1,10 @@ Battle of Atlantis scramble + + + + 0D @@ -23,7 +27,7 @@ - + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/calipso.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/calipso.mra index 1f9d9347..260872ca 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/calipso.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/calipso.mra @@ -1,6 +1,12 @@ Calipso 0209 + scramble + + + + + 8 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/darkplnt.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/darkplnt.mra index 539be507..58f6a436 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/darkplnt.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/darkplnt.mra @@ -1,6 +1,11 @@ Dark Planet 0209 + scramble + + + + 9 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/frogger.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/frogger.mra index 2fabbfee..6d0002fe 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/frogger.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/frogger.mra @@ -1,6 +1,11 @@ Frogger (Sega set 2) 0209 + scramble + + + + 2 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/losttomb.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/losttomb.mra index 4a9bd17a..b97bd9d5 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/losttomb.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/losttomb.mra @@ -1,6 +1,12 @@ Lost Tomb 0209 + scramble + + + + + 0B diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mars.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mars.mra index 9bbdfc52..b593e249 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mars.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mars.mra @@ -1,6 +1,10 @@ Mars scramble + + + + 0C @@ -23,7 +27,7 @@ - + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mimonkey.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mimonkey.mra index 2965d346..76792be8 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mimonkey.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/mimonkey.mra @@ -1,7 +1,13 @@ Mighty Monkey 0209 - + scramble + + + + + 12 + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/minefld.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/minefld.mra index d500174a..ce45d884 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/minefld.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/minefld.mra @@ -1,5 +1,13 @@ Minefield + scramble + + + + + + + 10 0209 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/moonwar.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/moonwar.mra index 6cfc37cc..f9c3a1fa 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/moonwar.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/moonwar.mra @@ -1,6 +1,11 @@ - Moonwar + Moon War 0209 + scramble + + + + 6 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/rescue.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/rescue.mra index a58b56d4..5f9279c9 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/rescue.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/rescue.mra @@ -1,6 +1,14 @@ Rescue 0209 + scramble + + + + + + + 11 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scobra.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scobra.mra index 0166e106..24931773 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scobra.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scobra.mra @@ -1,6 +1,12 @@ Super Cobra 0209 + scramble + + + + + 3 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scramble.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scramble.mra index 08a2653e..222b363d 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scramble.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/scramble.mra @@ -1,6 +1,11 @@ Scramble (Stern Electronics set 1) 0209 + scramble + + + + 0 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/spdcoin.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/spdcoin.mra index a9f7d359..77d85d04 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/spdcoin.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/spdcoin.mra @@ -1,6 +1,12 @@ Speed Coin 0209 + scramble + + + + + 7 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/stratgyx.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/stratgyx.mra index 9db82b2d..3010e8e4 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/stratgyx.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/stratgyx.mra @@ -1,6 +1,10 @@ Strategy X scramble + + + + 0E @@ -13,7 +17,7 @@ - + diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/tazmania.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/tazmania.mra index 25c03b86..68b0a92f 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/tazmania.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/tazmania.mra @@ -1,6 +1,12 @@ - Tazmania + Tazzmania 0209 + scramble + + + + + 4 diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/turtles.mra b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/turtles.mra index 167eafbf..c7c6a2bf 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/turtles.mra +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/meta/turtles.mra @@ -1,6 +1,11 @@ Turtles 0209 + scramble + + + + 0F diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv index 80c93704..8f37c04a 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/ScrambleMist.sv @@ -54,8 +54,11 @@ module ScrambleMist `include "rtl\build_id.v" +`define CORE_NAME "SCRAMBLE" +wire [6:0] core_mod; + localparam CONF_STR = { - ";ROM;", + `CORE_NAME, ";ROM;", "O2,Rotate Controls,Off,On;", "O34,Scanlines,Off,25%,50%,75%;", "O5,Blending,Off,On;", @@ -66,8 +69,6 @@ localparam CONF_STR = { }; integer hwsel = 0; -wire [6:0] core_mod; -reg [8*8-1:0] core_name; reg [7:0] input0; reg [7:0] input1; reg [7:0] input2; @@ -80,144 +81,125 @@ always @(*) begin input2 = ~{ 1'b1, m_down, 1'b1, m_up, /*cabinet*/1'b1, /*coinage*/2'b11, m_down2 }; case (core_mod) - 7'h0: + 7'h0: // SCRAMBLE begin - core_name = "SCRAMBLE"; hwsel = 0; end - 7'h1: + 7'h1: // AMIDAR begin - core_name = "AMIDAR "; hwsel = 0; input1[1:0] = ~status[8:7]; // lives345unl //input2[1] = status[10]; // demo sounds - no effect end - 7'h2: + 7'h2: // FROGGER begin - core_name = "FROGGER "; hwsel = 1; end - 7'h3: + 7'h3: // SCOBRA begin - core_name = "SCOBRA "; hwsel = 2; input1[0] = status[9]; // allow continue input1[1] = status[7]; // lives34 end - 7'h4: + 7'h4: // TAZMANIA begin - core_name = "TAZMANIA"; hwsel = 2; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_fireA, m_fireB }; input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, /*demosnd*/status[10], /*lives35*/status[7] }; input2 = ~{ 1'b1, m_two_players, 2'b10, 3'b111, m_one_player }; // unknown, start2, 2xunknown, cabinet, 2xcoinage, start1 end - 7'h5: + 7'h5: // ARMORCAR begin - core_name = "ARMORCAR"; hwsel = 2; input1[0] = ~status[7]; //lives35 input1[1] = ~status[10]; // demo sounds end - 7'h6: + 7'h6: // MOONWAR begin - core_name = "MOONWAR "; hwsel = 2; input0 = ~{ m_coin1, m_coin2, 1'b0, dial }; input1 = ~{ m_fireA, m_fireB, m_fireC, m_fireD, m_two_players, m_one_player, /*live345*/~status[8:7] }; input2 = ~{ 4'h0, 1'b1, 2'b11, 1'b0 }; // 4xunused, cabinet, coinage, p2fire(cocktail) end - 7'h7: + 7'h7: // SPDCOIN begin - core_name = "SPDCOIN "; hwsel = 2; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_two_players, 1'b0, m_one_player, 1'b0 }; input1 = { 4'hf, 2'b00, 1'b0, 1'b0 }; // 6xunused, freeplay, freeze input2 = { 4'hf, ~status[7], status[11], 1'b1, 1'b1}; // 4xunused, lives35, difficulty, unknown, unused end - 7'h8: + 7'h8: // CALIPSO begin - core_name = "CALIPSO "; hwsel = 3; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, 1'b1, m_two_players|m_fire2A }; // coin1, coin2, left, right, down, up, unused, start 2p / player2 fire input1 = ~{ 1'b1, 1'b1, m_left2, m_right2, m_down2, m_up2, status[10], status[7] }; // unused, unused, left, right, down, up, demo sounds, lives 3/5 input2 = ~{ 5'b0, 2'b10, m_fireA | m_one_player }; // unused[7:3], coin dip[2:1], start 1p / player1 fire end - 7'h9: + 7'h9: // DARKPLNT begin - core_name = "DARKPLNT"; hwsel = 4; input0 = ~{ m_coin1, m_coin2, 3'b000, m_two_players | m_fireB, m_one_player | m_fireA, m_fireC }; input1 = { darkplnt_dial_scrambled, /*lives*/status[7], /*bonus*/1'b0 }; input2 = { /*unk*/4'hf, /*bonus life*/1'b0, /*coinage*/ 2'b10, /*unk*/1'b1 }; end - 7'hA: + 7'hA: // ANTEATER begin - core_name = "ANTEATER"; hwsel = 6; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_fireA, m_fireB }; input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, /*demosdns*/status[10], /*lives35*/status[7] }; input2 = ~{ 1'b1, m_two_players, 2'b10, 3'b111, m_one_player }; end - 7'hB: + 7'hB: // LOSTTOMB begin - core_name = "LOSTTOMB"; hwsel = 7; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_one_player, m_two_players }; input1 = ~{ 1'b0, m_fireA, m_left2, m_right2, m_down2, m_up2, /*lives35/free play/invulnerability*/~(status[8:7]+1'd1) }; input2 = ~{ 4'h0, status[10], 2'b10, 1'b0 }; //4xunused, demo sounds, 2xcoinage, unused end - 7'hC: + 7'hC: // MARS begin - core_name = "MARS "; hwsel = 10; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_left2 | m_fireA, m_right2 | m_fireB, 1'b0, 1'b0 }; input1 = ~{ m_one_player, m_two_players, 4'h0, /*coinage*/2'b11 }; input2 = ~{ m_up2 | m_fireC, m_down, m_down2 | m_fireD, m_up, /*lives*/status[7], /*unk*/1'b0, /*cabinet*/1'b1, 1'b0 }; end - 7'hD: + 7'hD: // ATLANTIS begin - core_name = "ATLANTIS"; hwsel = 0; input1[0] = 1'b0; // upright input1[1] = ~status[7]; // lives35 end - 7'hE: + 7'hE: // STRATGYX begin - core_name = "STRATGYX"; hwsel = 5; orientation = 2'b10; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_fireA, 1'b0, m_fireB, m_up2 }; input1 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2A, m_fire2B, ~status[8:7] }; input2 = ~{ m_fire2C, m_down, m_fireC, m_up, /*upright*/1'b1, /*coinage*/2'b00, m_down2 }; end - 7'hF: + 7'hF: // TURTLES begin - core_name = "TURTLES "; hwsel = 11; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_fireA, 1'b0, 1'b0, m_up2 }; input1 = ~{ m_one_player, m_two_players, m_left2, m_right2, m_fire2A, 1'b0, ~status[8:7] }; input2 = ~{ 1'b0, m_down, 1'b0, m_up, /*upright*/1'b1, /*coinage*/2'b00, m_down2 }; end - 7'h10: + 7'h10: // MINEFLD begin - core_name = "MINEFLD "; hwsel = 8; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, /*start level*/status[11], m_fireA }; input1 = ~{ /*2xunk*/2'b00, m_left2, m_right2, m_down2, m_up2, /*demosnd*/status[10], /*lives35*/status[7] }; input2 = ~{ /*unk*/1'b0, m_two_players, /*2xunk*/2'b00, /*difficulty*/status[9:8], /*coinage*/1'b0, m_one_player }; end - 7'h11: + 7'h11: // RESCUE begin - core_name = "RESCUE "; hwsel = 9; input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, /*start level*/status[9], m_fireA }; input1 = ~{ /*2xunk*/2'b00, m_left2, m_right2, m_down2, m_up2, /*demosnd*/status[10], /*lives35*/status[7] }; input2 = ~{ /*unk*/1'b0, m_two_players, /*2xunk*/2'b00, /*difficulty*/~status[8], /*coinage*/2'b11, m_one_player }; end - 7'h12: + 7'h12: // MIMONKEY begin - core_name = "MIMONKEY"; hwsel = 12; input2[5] = status[9]; // infinite lives end @@ -225,7 +207,6 @@ always @(*) begin default: begin hwsel = 0; - core_name = "SCRAMBLE"; end endcase end @@ -292,10 +273,10 @@ wire key_pressed; wire [7:0] key_code; user_io #( - .STRLEN(8+($size(CONF_STR)>>3))) + .STRLEN($size(CONF_STR)>>3)) user_io( .clk_sys (clk_sys ), - .conf_str ({core_name, CONF_STR}), + .conf_str (CONF_STR ), .SPI_CLK (SPI_SCK ), .SPI_SS_IO (CONF_DATA0 ), .SPI_MISO (SPI_DO ), @@ -462,14 +443,21 @@ spinner spinner ( .strobe(vs), .spin_angle(darkplnt_dial) ); -wire [5:0] darkplnt_dial_scrambled = { - darkplnt_dial[3], - darkplnt_dial[5], - darkplnt_dial[6], - darkplnt_dial[4], - darkplnt_dial[2:1] + +wire [5:0] dp_remap[64] = +'{ + 6'h03, 6'h02, 6'h00, 6'h01, 6'h21, 6'h20, 6'h22, 6'h23, + 6'h33, 6'h32, 6'h30, 6'h31, 6'h11, 6'h10, 6'h12, 6'h13, + 6'h17, 6'h16, 6'h14, 6'h15, 6'h35, 6'h34, 6'h36, 6'h37, + 6'h3f, 6'h3e, 6'h3c, 6'h3d, 6'h1d, 6'h1c, 6'h1e, 6'h1f, + 6'h1b, 6'h1a, 6'h18, 6'h19, 6'h39, 6'h38, 6'h3a, 6'h3b, + 6'h2b, 6'h2a, 6'h28, 6'h29, 6'h09, 6'h08, 6'h0a, 6'h0b, + 6'h0f, 6'h0e, 6'h0c, 6'h0d, 6'h2d, 6'h2c, 6'h2e, 6'h2f, + 6'h27, 6'h26, 6'h24, 6'h25, 6'h05, 6'h04, 6'h06, 6'h07 }; +wire [5:0] darkplnt_dial_scrambled = dp_remap[darkplnt_dial[6:1]]; + 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; diff --git a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd index 380d5dda..63ce130e 100644 --- a/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd +++ b/Arcade_MiST/Konami Scramble Hardware/Scramble_MiST/rtl/scramble_video.vhd @@ -585,7 +585,11 @@ begin if (ENA = '1') then if (sld_l = '0') then - shell_cnt <= hpla; + if I_HWSEL = I_HWSEL_DARKPLNT then + shell_cnt <= 240 - hpla; + else + shell_cnt <= hpla; + end if; elsif (cblank_l = '1') then shell_cnt <= shell_cnt + "1"; else @@ -781,10 +785,14 @@ begin video(2)(3) := '0'; -- r if (vidout_l = '0') then -- cs_l on col rom - - video(0)(2 downto 0) := obj_lut_out(7 downto 6) & '0'; - video(1)(2 downto 0) := obj_lut_out(5 downto 3); - video(2)(2 downto 0) := obj_lut_out(2 downto 0); + if I_HWSEL = I_HWSEL_DARKPLNT then + video(0) := "00" & obj_lut_out(5 downto 3); + video(2) := "00" & obj_lut_out(2 downto 0); + else + video(0)(2 downto 0) := obj_lut_out(7 downto 6) & '0'; + video(1)(2 downto 0) := obj_lut_out(5 downto 3); + video(2)(2 downto 0) := obj_lut_out(2 downto 0); + end if; else video(0)(2 downto 0) := "000"; video(1)(2 downto 0) := "000"; diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/README.txt b/Arcade_MiST/Midway MCR 2/MCR2/README.txt similarity index 97% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/README.txt rename to Arcade_MiST/Midway MCR 2/MCR2/README.txt index badac50d..8de83f73 100644 --- a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/README.txt +++ b/Arcade_MiST/Midway MCR 2/MCR2/README.txt @@ -10,6 +10,12 @@ -- Wacko: control Captain Krooz'r with the mouse, shoot with the joystick -- Kozmik Krooz'r: use the mouse for movement and shoot, rotate the turret with the joystick +-- Create ROM and ARC files from MAME ROM zip files using the mra utility and the MRA files. +-- Copy the RBF and the ARC files to the same folder. +-- Example: mra -z /path/to/mame/roms Tron.mra +-- Copy the ROM files to the root of the SD Card. +-- +-- MRA utilty: https://github.com/sebdel/mra-tools-c --------------------------------------------------------------------------------- -- DE10_lite Top level for Satan Hollow (Midway MCR) by Dar (darfpga@aol.fr) (19/10/2019) -- http://darfpga.blogspot.fr diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/clean.bat b/Arcade_MiST/Midway MCR 2/MCR2/clean.bat similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/clean.bat rename to Arcade_MiST/Midway MCR 2/MCR2/clean.bat diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/SatansHollow.qpf b/Arcade_MiST/Midway MCR 2/MCR2/mcr2.qpf similarity index 97% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/SatansHollow.qpf rename to Arcade_MiST/Midway MCR 2/MCR2/mcr2.qpf index 2cf4b561..4c4ea415 100644 --- a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/SatansHollow.qpf +++ b/Arcade_MiST/Midway MCR 2/MCR2/mcr2.qpf @@ -27,4 +27,4 @@ DATE = "13:02:51 November 09, 2019" # Revisions -PROJECT_REVISION = "SatansHollow" \ No newline at end of file +PROJECT_REVISION = "mcr2" \ No newline at end of file diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/SatansHollow.qsf b/Arcade_MiST/Midway MCR 2/MCR2/mcr2.qsf similarity index 98% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/SatansHollow.qsf rename to Arcade_MiST/Midway MCR 2/MCR2/mcr2.qsf index 7c720180..0163b0a8 100644 --- a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/SatansHollow.qsf +++ b/Arcade_MiST/Midway MCR 2/MCR2/mcr2.qsf @@ -25,7 +25,7 @@ # Notes: # # 1) The default values for assignments are stored in the file: -# SatansHollow_assignment_defaults.qdf +# mcr2_assignment_defaults.qdf # If this file doesn't exist, see file: # assignment_defaults.qdf # @@ -158,7 +158,7 @@ set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 # Analysis & Synthesis Assignments # ================================ set_global_assignment -name FAMILY "Cyclone III" -set_global_assignment -name TOP_LEVEL_ENTITY SatansHollow_MiST +set_global_assignment -name TOP_LEVEL_ENTITY MCR2_MiST set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP @@ -213,7 +213,7 @@ set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top # end ENTITY(SatansHollow_MiST) # ----------------------------- -set_global_assignment -name SYSTEMVERILOG_FILE rtl/SatansHollow_MiST.sv +set_global_assignment -name SYSTEMVERILOG_FILE rtl/MCR2_MiST.sv set_global_assignment -name VHDL_FILE rtl/satans_hollow.vhd set_global_assignment -name VHDL_FILE rtl/satans_hollow_sound_board.vhd set_global_assignment -name VHDL_FILE rtl/YM2149_linmix_sep.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/SatansHollow.sdc b/Arcade_MiST/Midway MCR 2/MCR2/mcr2.sdc similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/SatansHollow.sdc rename to Arcade_MiST/Midway MCR 2/MCR2/mcr2.sdc diff --git a/Arcade_MiST/Midway MCR 2/MCR2/meta/Domino Man.mra b/Arcade_MiST/Midway MCR 2/MCR2/meta/Domino Man.mra new file mode 100644 index 00000000..c1ec527f --- /dev/null +++ b/Arcade_MiST/Midway MCR 2/MCR2/meta/Domino Man.mra @@ -0,0 +1,34 @@ + + Domino Man + 0216 + 201912310000 + 1983 + Bally Midway + Action + MCR2 + domino + + + + + + 5 + + + + + + + 00 + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Midway MCR 2/MCR2/meta/Kozmik Kroozr.mra b/Arcade_MiST/Midway MCR 2/MCR2/meta/Kozmik Kroozr.mra new file mode 100644 index 00000000..f9cf9075 --- /dev/null +++ b/Arcade_MiST/Midway MCR 2/MCR2/meta/Kozmik Kroozr.mra @@ -0,0 +1,31 @@ + + Kozmik Krooz'r + 0216 + 201912310000 + 1983 + Bally Midway + Action + MCR2 + kroozr + + 4 + + + + + + + + 00 + + + + 00 + + + + + + + + diff --git a/Arcade_MiST/Midway MCR 2/MCR2/meta/Satans Hollow.mra b/Arcade_MiST/Midway MCR 2/MCR2/meta/Satans Hollow.mra new file mode 100644 index 00000000..64fe9e39 --- /dev/null +++ b/Arcade_MiST/Midway MCR 2/MCR2/meta/Satans Hollow.mra @@ -0,0 +1,31 @@ + + Satan's Hollow + 0216 + 201912310000 + 1983 + Bally Midway + Action + MCR2 + shollow + + 0 + + + + + + + + + + + + 00 + + + + + + + + diff --git a/Arcade_MiST/Midway MCR 2/MCR2/meta/Tron.mra b/Arcade_MiST/Midway MCR 2/MCR2/meta/Tron.mra new file mode 100644 index 00000000..b4ae5526 --- /dev/null +++ b/Arcade_MiST/Midway MCR 2/MCR2/meta/Tron.mra @@ -0,0 +1,34 @@ + + Tron + 0218 + 202002110000 + 1982 + Bally Midway + Action + MCR2 + tron + + + + + 1 + + + + + + + + + + + + 00 + + + + + + + + diff --git a/Arcade_MiST/Midway MCR 2/MCR2/meta/Two Tigers.mra b/Arcade_MiST/Midway MCR 2/MCR2/meta/Two Tigers.mra new file mode 100644 index 00000000..bd3a8212 --- /dev/null +++ b/Arcade_MiST/Midway MCR 2/MCR2/meta/Two Tigers.mra @@ -0,0 +1,47 @@ + + Two Tigers (Tron conversion) + 0218 + 202002110000 + 1984 + Bally Midway + Shooter + MCR2 + twotigerc + + 2 + + + + + + + 00 + + + + 00 + + + + + + + + + + + + + 00 + + + + 00 + + + + + + + + diff --git a/Arcade_MiST/Midway MCR 2/MCR2/meta/Wacko.mra b/Arcade_MiST/Midway MCR 2/MCR2/meta/Wacko.mra new file mode 100644 index 00000000..2a45fac6 --- /dev/null +++ b/Arcade_MiST/Midway MCR 2/MCR2/meta/Wacko.mra @@ -0,0 +1,30 @@ + + Wacko + 0216 + 201912310000 + 1983 + Bally Midway + Action + MCR2 + wacko + + 3 + + + + + + + 00 + + + + 00 + + + + + + + + diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/SatansHollow_MiST.sv b/Arcade_MiST/Midway MCR 2/MCR2/rtl/MCR2_MiST.sv similarity index 94% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/SatansHollow_MiST.sv rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/MCR2_MiST.sv index 4a1c49c3..9a1a3961 100644 --- a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/SatansHollow_MiST.sv +++ b/Arcade_MiST/Midway MCR 2/MCR2/rtl/MCR2_MiST.sv @@ -17,15 +17,15 @@ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. //============================================================================ -module SatansHollow_MiST( - output LED, +module MCR2_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, + output AUDIO_R, input SPI_SCK, output SPI_DO, input SPI_DI, @@ -48,19 +48,15 @@ module SatansHollow_MiST( `include "rtl/build_id.v" -// Uncomment one to choose core name/inputs `define CORE_NAME "SHOLLOW" -//`define CORE_NAME "TRON" -//`define CORE_NAME "TWOTIGER" -//`define CORE_NAME "WACKO" -//`define CORE_NAME "KROOZR" -//`define CORE_NAME "DOMINO" +wire [6:0] core_mod; localparam CONF_STR = { `CORE_NAME,";ROM;", "O2,Rotate Controls,Off,On;", "O5,Blend,Off,On;", "O6,Swap Joysticks,Off,On;", + "DIP;", "O7,Service,Off,On;", "T0,Reset;", "V,v2.0.",`BUILD_DATE @@ -80,49 +76,67 @@ reg [7:0] input_3; reg [7:0] input_4; always @(*) begin + input_0 = 8'hFF; + input_1 = 8'hFF; + input_2 = 8'hFF; + input_3 = 8'hFF; input_4 = 8'hFF; oneplayer = 1'b1; orientation = 2'b10; - if (`CORE_NAME == "SHOLLOW") begin + case (core_mod) + 7'h0: // SHOLLOW + begin orientation = 2'b11; input_0 = ~{ service, 1'b0, m_tilt, 1'b0, m_two_players, m_one_player, m_coin2, m_coin1 }; input_1 = ~{ m_fire2A, m_fire2B, m_right2, m_left2, m_fireA, m_fireB, m_right, m_left }; input_2 = 8'hFF; input_3 = ~{ 8'b00000010 }; - end else if (`CORE_NAME == "TRON") begin + end + 7'h1: // TRON + begin orientation = 2'b11; oneplayer = 1'b0; input_0 = ~{ service, 1'b0, m_tilt, m_fireA, m_two_players, m_one_player, m_coin2, m_coin1 }; input_1 = ~{ 1'b0, spin_angle2 }; input_2 = ~{ m_down, m_up, m_right, m_left, m_down, m_up, m_right, m_left }; - input_3 = ~{ m_fireA, 7'b00000010 }; + input_3 = ~{ m_fireA, 4'b0000,/*allow cont*/status[8], 2'b10 }; input_4 = ~{ 1'b0, spin_angle2 }; - end else if (`CORE_NAME == "TWOTIGER") begin + end + 7'h2: // TWOTIGER + begin oneplayer = 1'b0; input_0 = ~{ service, 1'b0, m_tilt, m_three_players, m_two_players, m_one_player, m_coin2, m_coin1 }; input_1 = ~{ 1'b0, spin_angle1 }; input_2 = ~{ 4'b0000, m_fire2B, m_fire2A, m_fireB, m_fireA }; input_3 = 8'hFF; input_4 = ~{ 1'b0, spin_angle2 }; - end else if (`CORE_NAME == "WACKO") begin + end + 7'h3: // WACKO + begin input_0 = ~{ service, 1'b0, m_tilt, 1'b0, m_two_players, m_one_player, m_coin2, m_coin1 }; input_1 = x_pos[10:3]; input_2 = y_pos[10:3]; input_3 = ~{ 8'b01000000 }; input_4 = ~{ m_up2, m_down2, m_left2, m_right2, m_up, m_down, m_left, m_right }; - end else if (`CORE_NAME == "KROOZR") begin + end + 7'h4: // KROOZR + begin input_0 = ~{ service, 1'b0, m_tilt, m_fireA | mouse_btns[0], m_two_players, m_one_player, m_coin2, m_coin1 }; input_1 = ~{ (m_fireB | mouse_btns[1]), spin_angle1[6], 3'b111, spin_angle1[5:3] }; input_2 = { x_pos_kroozr[9], x_pos_kroozr[9], x_pos_kroozr[7:2] }; input_3 = ~{ 8'b01000000 }; input_4 = { y_pos_kroozr[9], y_pos_kroozr[9], y_pos_kroozr[7:2] }; - end else if (`CORE_NAME == "DOMINO") begin + end + 7'h5: // DOMINO + begin input_0 = ~{ service, 1'b0, m_tilt, m_fireA, m_two_players, m_one_player, m_coin2, m_coin1 }; input_1 = ~{ 4'b0000, m_down, m_up, m_right, m_left }; input_2 = ~{ 3'b000, m_fire2A, m_down2, m_up2, m_right2, m_left2 }; - input_3 = ~{ 8'b01000000 }; + input_3 = ~{ 6'b010000,/*skin*/status[9], /*music*/status[8] }; end + default: ; + endcase end assign LED = ~ioctl_downl; @@ -145,10 +159,7 @@ wire [7:0] joystick_0; wire [7:0] joystick_1; wire scandoublerD; wire ypbpr; -wire [15:0] audio_l, audio_r; -wire hs, vs, cs; -wire blankn; -wire [2:0] g, r, b; +wire no_csync; wire key_pressed; wire [7:0] key_code; wire key_strobe; @@ -157,6 +168,33 @@ wire signed [8:0] mouse_y; wire mouse_strobe; reg [7:0] mouse_flags; +user_io #( + .STRLEN(($size(CONF_STR)>>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .no_csync (no_csync ), + .core_mod (core_mod ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .mouse_x (mouse_x ), + .mouse_y (mouse_y ), + .mouse_strobe (mouse_strobe ), + .mouse_flags (mouse_flags ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + wire [15:0] rom_addr; wire [15:0] rom_do; wire [13:0] snd_addr; @@ -238,6 +276,11 @@ always @(posedge clk_sys) begin reset <= status[0] | buttons[1] | ioctl_downl | ~rom_loaded; end +wire [15:0] audio_l, audio_r; +wire hs, vs, cs; +wire blankn; +wire [2:0] g, r, b; + satans_hollow satans_hollow( .clock_40(clk_sys), .reset(reset), @@ -271,8 +314,8 @@ satans_hollow satans_hollow( wire vs_out; wire hs_out; -assign VGA_VS = scandoublerD | vs_out; -assign VGA_HS = scandoublerD ? cs : hs_out; +assign VGA_HS = ((~no_csync & scandoublerD) || ypbpr)? cs : hs_out; +assign VGA_VS = ((~no_csync & scandoublerD) || ypbpr)? 1'b1 : vs_out; mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video( .clk_sys ( clk_sys ), @@ -298,31 +341,6 @@ mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video( .ypbpr ( ypbpr ) ); -user_io #( - .STRLEN(($size(CONF_STR)>>3))) -user_io( - .clk_sys (clk_sys ), - .conf_str (CONF_STR ), - .SPI_CLK (SPI_SCK ), - .SPI_SS_IO (CONF_DATA0 ), - .SPI_MISO (SPI_DO ), - .SPI_MOSI (SPI_DI ), - .buttons (buttons ), - .switches (switches ), - .scandoubler_disable (scandoublerD ), - .ypbpr (ypbpr ), - .key_strobe (key_strobe ), - .key_pressed (key_pressed ), - .key_code (key_code ), - .mouse_x (mouse_x ), - .mouse_y (mouse_y ), - .mouse_strobe (mouse_strobe ), - .mouse_flags (mouse_flags ), - .joystick_0 (joystick_0 ), - .joystick_1 (joystick_1 ), - .status (status ) - ); - dac #( .C_bits(16)) dac_l( diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/YM2149_linmix_sep.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/YM2149_linmix_sep.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/YM2149_linmix_sep.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/build_id.tcl b/Arcade_MiST/Midway MCR 2/MCR2/rtl/build_id.tcl similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/build_id.tcl rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/build_id.tcl diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/cmos_ram.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/cmos_ram.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/cmos_ram.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/cmos_ram.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/dpram.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/dpram.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/dpram.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/dpram.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/gen_ram.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/gen_ram.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/gen_ram.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/gen_ram.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/pll_mist.qip b/Arcade_MiST/Midway MCR 2/MCR2/rtl/pll_mist.qip similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/pll_mist.qip rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/pll_mist.qip diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/pll_mist.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/pll_mist.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/pll_mist.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/pll_mist.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/rom/midssio_82s123.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/rom/midssio_82s123.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/rom/midssio_82s123.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/rom/midssio_82s123.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/satans_hollow.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/satans_hollow.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/satans_hollow.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/satans_hollow.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/satans_hollow_sound_board.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/satans_hollow_sound_board.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/satans_hollow_sound_board.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/satans_hollow_sound_board.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/sdram.sv b/Arcade_MiST/Midway MCR 2/MCR2/rtl/sdram.sv similarity index 98% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/sdram.sv rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/sdram.sv index d81e0694..e99f4621 100644 --- a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/sdram.sv +++ b/Arcade_MiST/Midway MCR 2/MCR2/rtl/sdram.sv @@ -61,6 +61,8 @@ module sdram ( output reg [15:0] snd_q ); +parameter MHZ = 16'd80; // 80 MHz default clock, set it to proper value to calculate refresh rate + localparam RASCAS_DELAY = 3'd2; // tRCD=20ns -> 2 cycles@<100MHz localparam BURST_LENGTH = 3'b000; // 000=1, 001=2, 010=4, 011=8 localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved @@ -70,8 +72,8 @@ localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single acc localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; -// 64ms/8192 rows = 7.8us -> 842 cycles@108MHz -localparam RFRSH_CYCLES = 10'd842; +// 64ms/8192 rows = 7.8us +localparam RFRSH_CYCLES = 16'd78*MHZ/4'd10; // --------------------------------------------------------------------- // ------------------------ cycle state machine ------------------------ diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/spinner.vhd b/Arcade_MiST/Midway MCR 2/MCR2/rtl/spinner.vhd similarity index 100% rename from Arcade_MiST/Midway MCR 2/SatansHollow_MiST/rtl/spinner.vhd rename to Arcade_MiST/Midway MCR 2/MCR2/rtl/spinner.vhd diff --git a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/buildall.sh b/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/buildall.sh deleted file mode 100755 index 7dfdda92..00000000 --- a/Arcade_MiST/Midway MCR 2/SatansHollow_MiST/buildall.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -PROJECTS=" \ -SHOLLOW \ -TRON \ -TWOTIGER \ -WACKO \ -KROOZR \ -DOMINO" - -for PROJECT in $PROJECTS; do - echo "Compiling $PROJECT" - sed -i "s/^.define CORE_NAME.*/\`define CORE_NAME \"$PROJECT\"/" rtl/SatansHollow_MiST.sv - quartus_sh --flow compile SatansHollow.qsf && cp output_files/SatansHollow.rbf Releases/$PROJECT.rbf -done \ No newline at end of file diff --git a/Arcade_MiST/Midway MCR 3 Monoboard/mcr3mono.qsf b/Arcade_MiST/Midway MCR 3 Monoboard/mcr3mono.qsf index 3c3fb947..df1bcba3 100644 --- a/Arcade_MiST/Midway MCR 3 Monoboard/mcr3mono.qsf +++ b/Arcade_MiST/Midway MCR 3 Monoboard/mcr3mono.qsf @@ -41,7 +41,7 @@ # ======================== set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL -set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name LAST_QUARTUS_VERSION "13.1 SP4.26" set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" # Pin & Location Assignments @@ -75,6 +75,7 @@ set_location_assignment PIN_88 -to SPI_DI set_location_assignment PIN_126 -to SPI_SCK set_location_assignment PIN_127 -to SPI_SS2 set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 set_location_assignment PIN_13 -to CONF_DATA0 set_location_assignment PIN_49 -to SDRAM_A[0] set_location_assignment PIN_44 -to SDRAM_A[1] diff --git a/Arcade_MiST/Midway MCR 3 Monoboard/meta/Max RPM.mra b/Arcade_MiST/Midway MCR 3 Monoboard/meta/Max RPM.mra new file mode 100644 index 00000000..30b6e44f --- /dev/null +++ b/Arcade_MiST/Midway MCR 3 Monoboard/meta/Max RPM.mra @@ -0,0 +1,28 @@ + + Max RPM (ver 2) + 0217 + 20200202 + 1986 + Bally Midway + Action + MCR3Mono + maxrpm + + + + + 03 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Midway MCR 3 Monoboard/meta/Power Drive.mra b/Arcade_MiST/Midway MCR 3 Monoboard/meta/Power Drive.mra new file mode 100644 index 00000000..7536a37c --- /dev/null +++ b/Arcade_MiST/Midway MCR 3 Monoboard/meta/Power Drive.mra @@ -0,0 +1,32 @@ + + Power Drive + 0217 + 20200202 + 1986 + Bally Midway + Action + MCR3Mono + powerdrv + + + + + + + 02 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Midway MCR 3 Monoboard/meta/Rampage.mra b/Arcade_MiST/Midway MCR 3 Monoboard/meta/Rampage.mra new file mode 100644 index 00000000..c1d4259c --- /dev/null +++ b/Arcade_MiST/Midway MCR 3 Monoboard/meta/Rampage.mra @@ -0,0 +1,32 @@ + + Rampage (Rev 3) + 0217 + 20200202 + 1986 + Bally Midway + Action + MCR3Mono + rampage + + + + + + + 00 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Midway MCR 3 Monoboard/meta/Sarge.mra b/Arcade_MiST/Midway MCR 3 Monoboard/meta/Sarge.mra new file mode 100644 index 00000000..865d3491 --- /dev/null +++ b/Arcade_MiST/Midway MCR 3 Monoboard/meta/Sarge.mra @@ -0,0 +1,30 @@ + + Sarge + 0217 + 20200202 + 1985 + Bally Midway + Action + MCR3Mono + sarge + + + + + 01 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Midway MCR 3 Monoboard/rtl/MCR3Mono_MiST.sv b/Arcade_MiST/Midway MCR 3 Monoboard/rtl/MCR3Mono_MiST.sv index 2a5ba259..57eaadcb 100644 --- a/Arcade_MiST/Midway MCR 3 Monoboard/rtl/MCR3Mono_MiST.sv +++ b/Arcade_MiST/Midway MCR 3 Monoboard/rtl/MCR3Mono_MiST.sv @@ -27,10 +27,11 @@ module MCR3Mono_MiST( output AUDIO_L, output AUDIO_R, input SPI_SCK, - output SPI_DO, + inout SPI_DO, input SPI_DI, input SPI_SS2, input SPI_SS3, + input SPI_SS4, input CONF_DATA0, input CLOCK_27, output [12:0] SDRAM_A, @@ -48,11 +49,24 @@ module MCR3Mono_MiST( `include "rtl/build_id.v" -// Uncomment one to build with game-specific core name/inputs/sound board -//`define CORE_NAME "SARGE" -`define CORE_NAME "MAXRPM" -//`define CORE_NAME "RAMPAGE" -//`define CORE_NAME "POWERDRV" +`define CORE_NAME "RAMPAGE" +wire [6:0] core_mod; + +localparam CONF_STR = { + `CORE_NAME,";ROM;", + "O2,Rotate Controls,Off,On;", + "O5,Blend,Off,On;", + "O6,Swap Joystick,Off,On;", + "DIP;", + "O7,Service,Off,On;", + "T0,Reset;", + "V,v1.1.",`BUILD_DATE +}; + +wire rotate = status[2]; +wire blend = status[5]; +wire joyswap = status[6]; +wire service = status[7]; reg sg; // Sounds Good board reg [7:0] input0; @@ -65,8 +79,7 @@ reg [7:0] output6; // Game specific sound board/DIP/input settings always @(*) begin - if (`CORE_NAME == "SARGE" || - `CORE_NAME == "MAXRPM") + if (core_mod == 7'h1 || core_mod == 7'h3) sg = 0; else sg = 1; @@ -77,44 +90,43 @@ always @(*) begin input3 = 8'hff; input4 = 8'hff; - if (`CORE_NAME == "SARGE") begin - // Two stick/player like the original - input0 = ~{2'b00, service, 1'b0, m_two_players, m_one_player, m_coin2, m_coin1}; - input1 = ~{m_fireA | m_fireB, m_fireA | m_fireB, m_fire2A | m_fire2B, m_fire2A | m_fire2B, m_down, m_up, m_down, m_up}; - input2 = ~{m_fire3A | m_fire3B, m_fire3A | m_fire3B, m_fire4A | m_fire4B, m_fire4A | m_fire4B, m_down3, m_up3, m_down4, m_up4}; - end else if (`CORE_NAME == "MAXRPM") begin - input0 = ~{service, 3'b000, m_one_player, m_two_players, m_coin1, m_coin2}; - input1 = ~{maxrpm_adc_data}; - input2 = ~{maxrpm_gear1, maxrpm_gear2}; - end else if (`CORE_NAME == "RAMPAGE") begin + case (core_mod) + 7'h0: // RAMPAGE + begin // normal controls for 3 players input0 = ~{2'b00, service, 1'b0, 2'b00, m_coin2, m_coin1}; input1 = ~{2'b00, m_fireB, m_fireA, m_left, m_down, m_right, m_up}; input2 = ~{2'b00, m_fire2B, m_fire2A, m_left2, m_down2, m_right2, m_up2}; + input3 = ~{/*cheat*/status[11], /*coin B*/3'b000, /*coin A*/1'b0, /*score opt*/status[10], /*difficulty*/status[9:8]}; input4 = ~{2'b00, m_fire3B, m_fire3A, m_left3, m_down3, m_right3, m_up3}; - end else if (`CORE_NAME == "POWERDRV") begin + end + 7'h1: // SARGE + begin + // Two stick/player like the original + input0 = ~{2'b00, service, 1'b0, m_two_players, m_one_player, m_coin2, m_coin1}; + input1 = ~{m_fireA | m_fireB, m_fireA | m_fireB, m_fire2A | m_fire2B, m_fire2A | m_fire2B, m_down, m_up, m_down, m_up}; + input2 = ~{m_fire3A | m_fire3B, m_fire3A | m_fire3B, m_fire4A | m_fire4B, m_fire4A | m_fire4B, m_down3, m_up3, m_down4, m_up4}; + input3 = ~{2'b00, /*coinage*/2'b00, /*free play*/status[8], 3'b000}; + end + 7'h2: //POWERDRV + begin // Controls for 3 players using 4 buttons/joystick input0 = ~{2'b00, service, 1'b0, 1'b0, m_coin3, m_coin2, m_coin1}; input1 = ~{m_fire2B, m_fire2A, powerdrv_gear[1], m_fire2C, m_fireB, m_fireA, powerdrv_gear[0], m_fireC}; input2 = ~{sndstat[0], 3'b000, m_fire3B, m_fire3A, powerdrv_gear[2], m_fire3C}; + input3 = ~{/*cheat*/status[11], /*demosnd*/status[10], /*difficulty*/status[9:8], 1'b0, /*coinage*/2'b00}; end + 7'h3: // MAXRPM + begin + input0 = ~{service, 3'b000, m_one_player, m_two_players, m_coin1, m_coin2}; + input1 = ~{maxrpm_adc_data}; + input2 = ~{maxrpm_gear1, maxrpm_gear2}; + input3[0] = ~status[8]; // free play + end + default: ; + endcase end -localparam CONF_STR = { - `CORE_NAME,";ROM;", - "O2,Rotate Controls,Off,On;", - "O5,Blend,Off,On;", - "O6,Swap Joystick,Off,On;", - "O7,Service,Off,On;", - "T0,Reset;", - "V,v1.1.",`BUILD_DATE -}; - -wire rotate = status[2]; -wire blend = status[5]; -wire joyswap = status[6]; -wire service = status[7]; - assign LED = ~ioctl_downl; assign SDRAM_CLK = clk_mem; assign SDRAM_CKE = 1; @@ -138,14 +150,37 @@ wire [7:0] joystick_2; wire [7:0] joystick_3; wire scandoublerD; wire ypbpr; -wire [9:0] audio; -wire hs, vs, cs; -wire blankn; -wire [2:0] g, r, b; +wire no_csync; wire key_pressed; wire [7:0] key_code; wire key_strobe; +user_io #( + .STRLEN(($size(CONF_STR)>>3)), + .ROM_DIRECT_UPLOAD(1)) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .no_csync (no_csync ), + .core_mod (core_mod ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .joystick_2 (joystick_2 ), + .joystick_3 (joystick_3 ), + .status (status ) + ); + wire ioctl_downl; wire [7:0] ioctl_index; wire ioctl_wr; @@ -168,11 +203,13 @@ Rampage, Power Drive (Sounds Good board): 58000- SG 128k */ -data_io data_io( +data_io #(.ROM_DIRECT_UPLOAD(1)) data_io( .clk_sys ( clk_sys ), .SPI_SCK ( SPI_SCK ), .SPI_SS2 ( SPI_SS2 ), + .SPI_SS4 ( SPI_SS4 ), .SPI_DI ( SPI_DI ), + .SPI_DO ( SPI_DO ), .ioctl_download( ioctl_downl ), .ioctl_index ( ioctl_index ), .ioctl_wr ( ioctl_wr ), @@ -278,7 +315,11 @@ always @(posedge clk_sys) begin reset <= status[0] | buttons[1] | ioctl_downl | ~rom_loaded | (reset_count == 16'h0001); end -wire [1:0] sndstat; +wire [1:0] sndstat; +wire [9:0] audio; +wire hs, vs, cs; +wire blankn; +wire [2:0] g, r, b; mcr3mono mcr3mono ( .clock_40(clk_sys), @@ -318,8 +359,8 @@ mcr3mono mcr3mono ( wire vs_out; wire hs_out; -assign VGA_VS = scandoublerD | vs_out; -assign VGA_HS = scandoublerD ? cs : hs_out; +assign VGA_HS = ((~no_csync & scandoublerD) || ypbpr)? cs : hs_out; +assign VGA_VS = ((~no_csync & scandoublerD) || ypbpr)? 1'b1 : vs_out; mist_video #(.COLOR_DEPTH(3)) mist_video( .clk_sys ( clk_sys ), @@ -344,29 +385,6 @@ mist_video #(.COLOR_DEPTH(3)) mist_video( .ypbpr ( ypbpr ) ); -user_io #( - .STRLEN(($size(CONF_STR)>>3))) -user_io( - .clk_sys (clk_sys ), - .conf_str (CONF_STR ), - .SPI_CLK (SPI_SCK ), - .SPI_SS_IO (CONF_DATA0 ), - .SPI_MISO (SPI_DO ), - .SPI_MOSI (SPI_DI ), - .buttons (buttons ), - .switches (switches ), - .scandoubler_disable (scandoublerD ), - .ypbpr (ypbpr ), - .key_strobe (key_strobe ), - .key_pressed (key_pressed ), - .key_code (key_code ), - .joystick_0 (joystick_0 ), - .joystick_1 (joystick_1 ), - .joystick_2 (joystick_2 ), - .joystick_3 (joystick_3 ), - .status (status ) - ); - dac #(10) dac( .clk_i(clk_sys), .res_n_i(1), diff --git a/Arcade_MiST/Midway MCR 3 Monoboard/rtl/mcr3mono.vhd b/Arcade_MiST/Midway MCR 3 Monoboard/rtl/mcr3mono.vhd index ec287ea1..2d99759a 100644 --- a/Arcade_MiST/Midway MCR 3 Monoboard/rtl/mcr3mono.vhd +++ b/Arcade_MiST/Midway MCR 3 Monoboard/rtl/mcr3mono.vhd @@ -397,8 +397,8 @@ begin vcnt >= 1 and vcnt < 241 then video_blankn <= '1';end if; - if hs_cnt = 0 then hsync0 <= '0'; - elsif hs_cnt = 47 then hsync0 <= '1'; + if hs_cnt = 0 then hsync0 <= '0'; video_hs <= '0'; + elsif hs_cnt = 47 then hsync0 <= '1'; video_hs <= '1'; end if; if hs_cnt = 0 then hsync1 <= '0'; diff --git a/Arcade_MiST/Namco Mappy Hardware/Mappy_Hardware.qsf b/Arcade_MiST/Namco Mappy Hardware/Mappy_Hardware.qsf index 818a5dfd..968d74b8 100644 --- a/Arcade_MiST/Namco Mappy Hardware/Mappy_Hardware.qsf +++ b/Arcade_MiST/Namco Mappy Hardware/Mappy_Hardware.qsf @@ -40,7 +40,7 @@ # Project-Wide Assignments # ======================== set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.0.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 "19:48:06 MAY 24,2017" set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files @@ -228,9 +228,9 @@ set_global_assignment -name VERILOG_FILE rtl/wsg.v set_global_assignment -name VERILOG_FILE rtl/ioctrl.v set_global_assignment -name VERILOG_FILE rtl/hvgen.v set_global_assignment -name VHDL_FILE rtl/dpram.vhd -set_global_assignment -name VERILOG_FILE rtl/mc6809/mc6809i.v -set_global_assignment -name VERILOG_FILE rtl/mc6809/mc6809.v set_global_assignment -name VERILOG_FILE rtl/pll.v set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv +set_global_assignment -name VERILOG_FILE ../../common/CPU/MC6809/mc6809i.v +set_global_assignment -name VERILOG_FILE ../../common/CPU/MC6809/mc6809.v set_global_assignment -name QIP_FILE ../../common/mist/mist.qip set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/Namco Mappy Hardware/README.txt b/Arcade_MiST/Namco Mappy Hardware/README.txt index 165be9a0..e92d6333 100644 --- a/Arcade_MiST/Namco Mappy Hardware/README.txt +++ b/Arcade_MiST/Namco Mappy Hardware/README.txt @@ -1,13 +1,15 @@ The Tower of Druaga/Mappy/Motos/DigDug II to Mist FPGA by Slingshot -Appropriate ROMs are required at the root of the SD Card: -DRUAGA.ROM -MAPPY.ROM -MOTOS.ROM -DIGDUG2.ROM - - - +-- Usage: +-- - Create ROM and ARC files from the MRA files in the meta directory +-- using the MRA utility. +-- Example: mra -A -z /path/to/mame/roms motos.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 +-- +-- MRA utility: https://github.com/sebdel/mra-tools-c/ +-- +-- --------------------------------------------------------------------------------- -- -- Arcade: The Tower of Druaga port to MiSTer by MiSTer-X diff --git a/Arcade_MiST/Namco Mappy Hardware/meta/digdug2.mra b/Arcade_MiST/Namco Mappy Hardware/meta/digdug2.mra new file mode 100644 index 00000000..f8cd8ec4 --- /dev/null +++ b/Arcade_MiST/Namco Mappy Hardware/meta/digdug2.mra @@ -0,0 +1,28 @@ + + Dig Dug 2 + digdug2 + Druaga + + + + + + + 03 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Namco Mappy Hardware/meta/druaga.mra b/Arcade_MiST/Namco Mappy Hardware/meta/druaga.mra new file mode 100644 index 00000000..7ba9842b --- /dev/null +++ b/Arcade_MiST/Namco Mappy Hardware/meta/druaga.mra @@ -0,0 +1,25 @@ + + The Tower of Druaga + druaga + Druaga + + + + + 01 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Namco Mappy Hardware/meta/mappy.mra b/Arcade_MiST/Namco Mappy Hardware/meta/mappy.mra new file mode 100644 index 00000000..ad479a11 --- /dev/null +++ b/Arcade_MiST/Namco Mappy Hardware/meta/mappy.mra @@ -0,0 +1,34 @@ + + Mappy + mappy + + + + + + + + Druaga + + 02 + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Namco Mappy Hardware/meta/motos.mra b/Arcade_MiST/Namco Mappy Hardware/meta/motos.mra new file mode 100644 index 00000000..47ac6e24 --- /dev/null +++ b/Arcade_MiST/Namco Mappy Hardware/meta/motos.mra @@ -0,0 +1,29 @@ + + Motos + motos + Druaga + + + + + + + + 04 + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Namco Mappy Hardware/rtl/TheTowerofDruaga_mist.sv b/Arcade_MiST/Namco Mappy Hardware/rtl/TheTowerofDruaga_mist.sv index 3bf378fb..fcc56eee 100644 --- a/Arcade_MiST/Namco Mappy Hardware/rtl/TheTowerofDruaga_mist.sv +++ b/Arcade_MiST/Namco Mappy Hardware/rtl/TheTowerofDruaga_mist.sv @@ -28,28 +28,99 @@ module TheTowerofDruaga_mist ( ); -// Uncomment one of these to load the default ROM: - -`define CORE_NAME "DRUAGA" -//`define CORE_NAME "MAPPY" -//`define CORE_NAME "MOTOS" -//`define CORE_NAME "DIGDUG2" - -//`define CORE_NAME "GROBDA" -//`define CORE_NAME "PHOZON" - - `include "rtl\build_id.v" +`define CORE_NAME "DRUAGA" +wire [6:0] core_mod; + localparam CONF_STR = { - `CORE_NAME,";ROM;", + `CORE_NAME, ";ROM;", "O2,Rotate Controls,Off,On;", "O34,Scanlines,Off,25%,50%,75%;", "O5,Blend,Off,On;", + "DIP;", + "OU,Service Mode,Off,On;", + "OT,Freeze,Off,On;", "T0,Reset;", "V,v1.00.",`BUILD_DATE }; +wire rotate = status[2]; +wire [1:0] scanlines = status[4:3]; +wire blend = status[5]; + +wire dcFreeze = status[29]; +wire dcService = status[30]; +wire dcCabinet = 1'b0; // (upright only) + +// The Tower of Druaga [t] +wire [1:0] dtLives = status[9:8]; + +// Mappy [m] +wire dmRoundP = status[6]; +wire [2:0] dmRank = status[12:10]; +wire dmDemoSnd = status[13]; +wire [2:0] dmExtend = status[16:14]; +wire [1:0] dmLives = status[18:17]; + +// DigDug2 [d] +wire ddLives = status[19]; +wire [1:0] ddExtend = status[21:20]; +wire ddLevelSel = status[22]; + +// Motos [o] +wire doLives = status[23]; +wire doRank = status[24]; +wire [1:0] doExtend = status[26:25]; +wire doDemoSnd = status[27]; + +reg [7:0] DSW0; +reg [7:0] DSW1; +reg [7:0] DSW2; + +reg [5:0] INP0; +reg [5:0] INP1; +reg [2:0] INP2; + +always @(*) begin + INP0 = { m_fireB, m_fireA, m_left, m_down, m_right, m_up}; + INP1 = { m_fire2B, m_fire2A, m_left2, m_down2, m_right2, m_up2 }; + INP2 = { m_coin1 | m_coin2, m_two_players, m_one_player }; + DSW0 = 0; + DSW1 = 0; + DSW2 = 0; + + case (core_mod) + 7'h0, 7'h1: // DRUAGA + begin + DSW0 = {2'd0,dtLives,4'd0}; + DSW1 = {dcCabinet,6'd0,dcFreeze}; + DSW2 = {DSW1[3:0],dcService,3'd0}; + end + 7'h2: // MAPPY + begin + DSW0 = {dcFreeze,dmRoundP,dmDemoSnd,2'd0,dmRank}; + DSW1 = {dmLives,dmExtend,3'd0}; + DSW2 = {{2{dcService,dcCabinet,2'd0}}}; + end + 7'h3: // DIGDUG2 + begin + DSW0 = {2'd0,ddLives,5'd0}; + DSW1 = {dcCabinet,3'd0,dcFreeze,ddLevelSel,ddExtend}; + DSW2 = {DSW1[3:0],dcService,3'd0}; + end + 7'h4: // MOTOS + begin + DSW0 = {doDemoSnd,doExtend,doRank,doLives,3'd0}; + DSW1 = {dcService,dcCabinet,6'd0}; + DSW2 = {8'd0}; + end + 7'h5: ;// GROBDA + 7'h6: ;// PHOZON + default: ; + endcase +end + assign LED = ~ioctl_downl; assign AUDIO_R = AUDIO_L; assign SDRAM_CLK = clock_48; @@ -70,24 +141,50 @@ 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 [14:0] rom_addr; -wire [15:0] rom_do; -wire [12:0] snd_addr; -wire [15:0] snd_do; +wire no_csync; +wire key_strobe; +wire key_pressed; +wire [7:0] key_code; + +user_io #(.STRLEN($size(CONF_STR)>>3))user_io( + .clk_sys (clock_48 ), + .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 ), + .core_mod (core_mod ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + wire ioctl_downl; wire [7:0] ioctl_index; wire ioctl_wr; wire [24:0] ioctl_addr; wire [7:0] ioctl_dout; -wire key_strobe; -wire key_pressed; -wire [7:0] key_code; + +/* +ROM map +00000-07FFF cpu0 32k 3.1d+1.1b (+2.1c in Mappy) +08000-0BFFF spchip0 16k 6.3m +0C000-0FFFF spchip1 16k 7.3m +10000-11FFF cpu1 8k 4.1k +12000-12FFF bgchip 4k 5.3b +13000-133FF spclut 1k 7.5k +13400-134FF bgclut 256b 6.4c +13500-135FF wave 256b 3.3m +13600-1361F palet 32b 5.5b +*/ data_io data_io( .clk_sys ( clock_48 ), @@ -102,6 +199,11 @@ data_io data_io( ); reg port1_req, port2_req; +wire [14:0] rom_addr; +wire [15:0] rom_do; +wire [12:0] snd_addr; +wire [15:0] snd_do; + sdram sdram( .*, .init_n ( pll_locked ), @@ -154,17 +256,16 @@ always @(posedge clock_48) begin reset <= status[0] | buttons[1] | ioctl_downl | ~rom_loaded; end -wire [7:0] DSW0 = 0;//{2'h0,status[7:6],4'h0}; -wire [7:0] DSW1 = 0; -wire [7:0] DSW2 = 0;//{4'h0,status[8],3'h0}; - -wire [5:0] INP0 = { m_bomb, m_fire, m_left, m_down, m_right, m_up}; -wire [5:0] INP1 = { m_bomb, m_fire, m_left, m_down, m_right, m_up}; -wire [2:0] INP2 = { btn_coin, btn_two_players, btn_one_player }; - wire PCLK, PCLK_EN; wire [8:0] HPOS,VPOS; +wire [7:0] audio; +wire hs, vs; +wire hb, vb; +wire blankn = ~(hb | vb); +wire [2:0] r, g; +wire [1:0] b; + fpga_druaga fpga_druaga( .MCLK(clock_48), .CLKCPUx2(clock_6), @@ -218,32 +319,13 @@ mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(10)) mist_video( .VGA_B ( VGA_B ), .VGA_VS ( VGA_VS ), .VGA_HS ( VGA_HS ), - .rotate ( {1'b1,status[2]} ), + .rotate ( { 1'b1, rotate } ), .scandoubler_disable( scandoublerD ), - .scanlines ( status[4:3] ), - .blend ( status[5] ), + .scanlines ( scanlines ), + .blend ( blend ), .ypbpr ( ypbpr ) ); -user_io #(.STRLEN(($size(CONF_STR)>>3)))user_io( - .clk_sys (clock_48 ), - .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_48), .res_n_i(1), @@ -251,40 +333,24 @@ dac #(.C_bits(16))dac( .dac_o(AUDIO_L) ); -// Rotated Normal -wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3]; -wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2]; -wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1]; -wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0]; -wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; -wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; +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; -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_48) begin - if(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 +arcade_inputs inputs ( + .clk ( clock_48 ), + .key_strobe ( key_strobe ), + .key_pressed ( key_pressed ), + .key_code ( key_code ), + .joystick_0 ( joystick_0 ), + .joystick_1 ( joystick_1 ), + .rotate ( rotate ), + .orientation ( 2'b11 ), + .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 diff --git a/Arcade_MiST/Namco Mappy Hardware/rtl/ioctrl_0.v b/Arcade_MiST/Namco Mappy Hardware/rtl/ioctrl_0.v index 9bed2f27..f86ec387 100644 --- a/Arcade_MiST/Namco Mappy Hardware/rtl/ioctrl_0.v +++ b/Arcade_MiST/Namco Mappy Hardware/rtl/ioctrl_0.v @@ -1,40 +1,32 @@ //------------------------------------------ // I/O Chip for "Mappy/Druaga/DigDug2" // -// Copyright (c) 2007 MiSTer-X +// Copyright (c) 2007,19 MiSTer-X //------------------------------------------ -// TODO: DSW2 = DIPSW[23:16] case ( mema[4'h8] ) - 4'h1: begin - mema[4'h0] <= 0; - mema[4'h1] <= 0; - mema[4'h2] <= 0; - mema[4'h3] <= 0; - end - - 4'h3: begin + 4'h1,4'h3: begin credit_add = 0; credit_sub = 0; if ( iCSTART12[2] & ( credits < 99 ) ) begin credit_add = 8'h01; - credits = credits + 1'd1; + credits = credits + 1; end if ( mema[4'h9] == 0 ) begin if ( ( credits >= 2 ) & iCSTART12[1] ) begin credit_sub = 8'h02; - credits = credits - 2'd1; + credits = credits - 2; end else if ( ( credits >= 1 ) & iCSTART12[0] ) begin credit_sub = 8'h01; - credits = credits - 1'd1; + credits = credits - 1; end end mema[4'h0] <= credit_add; - mema[4'h1] <= credit_sub; + mema[4'h1] <= credit_sub | {7'd0,CSTART12[0]}; mema[4'h2] <= CREDIT_TENS; mema[4'h3] <= CREDIT_ONES; mema[4'h4] <= STKTRG12[3:0]; @@ -65,21 +57,14 @@ mema[4'h7] <= 4'hD; end - default: begin end + default:; endcase case ( memb[4'h8] ) - 4'h1: begin - memb[4'h0] <= 0; - memb[4'h1] <= 0; - memb[4'h2] <= 0; - memb[4'h3] <= 0; - end - - 4'h3: begin + 4'h1,4'h3: begin memb[4'h0] <= 0; memb[4'h1] <= 0; memb[4'h2] <= 0; @@ -91,15 +76,18 @@ end 4'h4: begin - memb[4'h0] <= DIPSW[11:8]; - memb[4'h1] <= DIPSW[3:0]; - memb[4'h2] <= DIPSW[7:4]; - memb[4'h4] <= DIPSW[15:12]; - memb[4'h6] <= DIPSW[7:4]; + memb[4'h0] <= DIPSW[11: 8]; // (P0) DSW1 Mappy + memb[4'h1] <= DIPSW[15:12]; + + memb[4'h2] <= DIPSW[ 3: 0]; // (P1) DSW0 + memb[4'h4] <= DIPSW[ 7: 4]; + + memb[4'h5] <={DIPSW[15:14],STKTRG12[ 5],iSTKTRG12[ 5]}; // (P2) DSW1 Druaga/DigDug2 + memb[4'h6] <= DIPSW[23:20]; // IsMappy ? DIPSW[19:16] : DIPSW[11:8] + + memb[4'h7] <={DIPSW[19:18],STKTRG12[11],iSTKTRG12[11]}; // (P3) DSW2 memb[4'h3] <= 0; - memb[4'h5] <= { DIPSW[3:2], STKTRG12[ 5], iSTKTRG12[ 5] }; - memb[4'h7] <= { 2'b00, STKTRG12[11], iSTKTRG12[11] }; end 4'h5: begin @@ -113,7 +101,7 @@ memb[4'h7] <= 4'hD; end - default: begin end + default:; endcase diff --git a/Arcade_MiST/Namco Mappy Hardware/rtl/ioctrl_1.v b/Arcade_MiST/Namco Mappy Hardware/rtl/ioctrl_1.v index cab08e36..9e12d024 100644 --- a/Arcade_MiST/Namco Mappy Hardware/rtl/ioctrl_1.v +++ b/Arcade_MiST/Namco Mappy Hardware/rtl/ioctrl_1.v @@ -1,17 +1,21 @@ //------------------------------------------ // I/O Chip for "Motos" // -// Copyright (c) 2007 MiSTer-X +// Copyright (c) 2007,19 MiSTer-X //------------------------------------------ -// TODO: DSW2 = DIPSW[23:16] case ( mema[4'h8] ) 4'h1: begin - mema[4'h0] <= { 3'b00, CSTART12[2] }; + mema[4'h0] <= { 3'd0, CSTART12[2] }; mema[4'h1] <= STKTRG12[3:0]; mema[4'h2] <= STKTRG12[9:6]; mema[4'h3] <= { CSTART12[1], CSTART12[0], STKTRG12[10], STKTRG12[4] }; + mema[4'h4] <= STKTRG12[9:6]; + mema[4'h5] <= STKTRG12[9:6]; + mema[4'h6] <= STKTRG12[9:6]; + mema[4'h7] <= STKTRG12[9:6]; + mema[4'h9] <= 0; end 4'h8: begin @@ -19,8 +23,8 @@ mema[4'h1] <= 4'h9; end - default: begin end - + default:; + endcase @@ -32,17 +36,18 @@ end 4'h9: begin + memb[4'h2] <= DIPSW[3:0]; + memb[4'h4] <= DIPSW[7:4]; + memb[4'h6] <= DIPSW[15:12]; + memb[4'h0] <= 0; memb[4'h1] <= 0; - memb[4'h2] <= 0; memb[4'h3] <= 0; - memb[4'h4] <= 0; memb[4'h5] <= 0; - memb[4'h6] <= 0; memb[4'h7] <= 0; end - default: begin end + default:; endcase diff --git a/Arcade_MiST/Namco Mappy Hardware/rtl/mc6809/mc6809.v b/Arcade_MiST/Namco Mappy Hardware/rtl/mc6809/mc6809.v deleted file mode 100644 index b19d1552..00000000 --- a/Arcade_MiST/Namco Mappy Hardware/rtl/mc6809/mc6809.v +++ /dev/null @@ -1,80 +0,0 @@ -`timescale 1ns / 1ps -////////////////////////////////////////////////////////////////////////////////// -// Company: -// Engineer: -// -// Create Date: 08:11:34 09/23/2016 -// Design Name: -// Module Name: mc6809e -// Project Name: -// Target Devices: -// Tool versions: -// Description: -// -// Dependencies: -// -// Revision: -// Revision 0.01 - File Created -// Additional Comments: -// -////////////////////////////////////////////////////////////////////////////////// -module mc6809( - input [7:0] D, - output [7:0] DOut, - output [15:0] ADDR, - output RnW, - output E, - output Q, - output BS, - output BA, - input nIRQ, - input nFIRQ, - input nNMI, - input EXTAL, - input XTAL, - input nHALT, - input nRESET, - input MRDY, - input nDMABREQ - - , output [111:0] RegData - - ); - -reg [1:0] clk_phase=2'b00; - -wire CLK; -assign CLK=EXTAL; - -wire LIC; -wire BUSY; -wire AVMA; -reg rE; -reg rQ; -assign E = rE; -assign Q = rQ; - -mc6809i cpucore(.D(D), .DOut(DOut), .ADDR(ADDR), .RnW(RnW), .E(E), .Q(Q), .BS(BS), .BA(BA), .nIRQ(nIRQ), .nFIRQ(nFIRQ), - .nNMI(nNMI), .AVMA(AVMA), .BUSY(BUSY), .LIC(LIC), .nHALT(nHALT), .nRESET(nRESET), .nDMABREQ(nDMABREQ) - ,.RegData(RegData) - ); - -always @(negedge CLK) -begin - case (clk_phase) - 2'b00: - rE <= 0; - 2'b01: - rQ <= 1; - 2'b10: - rE <= 1; - 2'b11: - rQ <= 0; - endcase - - if (MRDY == 1'b1) - clk_phase <= clk_phase + 2'b01; -end - - -endmodule diff --git a/Arcade_MiST/Namco Mappy Hardware/rtl/mc6809/mc6809i.v b/Arcade_MiST/Namco Mappy Hardware/rtl/mc6809/mc6809i.v deleted file mode 100644 index 5725aab4..00000000 --- a/Arcade_MiST/Namco Mappy Hardware/rtl/mc6809/mc6809i.v +++ /dev/null @@ -1,4156 +0,0 @@ -`timescale 1ns / 1ns -////////////////////////////////////////////////////////////////////////////////// -// Company: -// Engineer: Greg Miller -// Copyright (c) 2016, Greg Miller -// -// Create Date: 14:26:59 08/13/2016 -// Design Name: -// Module Name: mc6809 -// Project Name: Cycle-Accurate 6809 Core -// Target Devices: -// Tool versions: -// Description: -// -// Dependencies: Intended to be standalone Vanilla Verilog. -// -// Revision: -// Revision 1.0 - Initial Release -// Additional Comments: -// -////////////////////////////////////////////////////////////////////////////////// - - -// -// The 6809 has incomplete instruction decoding. A collection of instructions, if met, end up actually behaving like -// a binary-adjacent neighbor. -// -// The soft core permits three different behaviors for this situation, controlled by the instantiation parameter -// ILLEGAL_INSTRUCTIONS -// -// "GHOST" - Mimic the 6809's incomplete decoding. This is as similar to a hard 6809 as is practical. [DEFAULT] -// -// "STOP" - Cause the soft core to cease execution, placing $DEAD on the address bus and R/W to 'read'. Interrupts, -// bus control (/HALT, /DMABREQ), etc. are ignored. The core intentionally seizes in this instance. -// (Frankly, this is useful when making changes to the core and you have a logic analyzer connected.) -// -// "IGNORE"- Cause the soft core to merely ignore illegal instructions. It will consider them 1-byte instructions and -// attempt to fetch and run an exception 1 byte later. -// - -module mc6809i -#( - parameter ILLEGAL_INSTRUCTIONS="GHOST" -) -( - - input [7:0] D, - output [7:0] DOut, - output [15:0] ADDR, - output RnW, - input E, - input Q, - output BS, - output BA, - input nIRQ, - input nFIRQ, - input nNMI, - output AVMA, - output BUSY, - output LIC, - input nHALT, - input nRESET, - input nDMABREQ, - output [111:0] RegData -); - -reg [7:0] DOutput; - -assign DOut = DOutput; - -reg RnWOut; // Combinatorial - -reg rLIC; -assign LIC = rLIC; - -reg rAVMA; -assign AVMA = rAVMA; - -reg rBUSY; -assign BUSY = rBUSY; - -// Bus control -// BS BA -// 0 0 normal (CPU running, CPU is master) -// 0 1 Interrupt Ack -// 1 0 Sync Ack -// 1 1 CPU has gone high-Z on A, D, R/W -// - -assign RnW = RnWOut; - - -///////////////////////////////////////////////// -// Vectors -`define RESET_VECTOR 16'HFFFE -`define NMI_VECTOR 16'HFFFC -`define SWI_VECTOR 16'HFFFA -`define IRQ_VECTOR 16'HFFF8 -`define FIRQ_VECTOR 16'HFFF6 -`define SWI2_VECTOR 16'HFFF4 -`define SWI3_VECTOR 16'HFFF2 -`define Reserved_VECTOR 16'HFFF0 - -////////////////////////////////////////////////////// -// Latched registers -// - -// The last-latched copy. -reg [7:0] a; -reg [7:0] b; -reg [15:0] x; -reg [15:0] y; -reg [15:0] u; -reg [15:0] s; -reg [15:0] pc; -reg [7:0] dp; -reg [7:0] cc; -reg [15:0] tmp; -reg [15:0] addr; -reg [15:0] ea; - - -// Debug ability to export register contents -assign RegData[7:0] = a; -assign RegData[15:8] = b; -assign RegData[31:16] = x; -assign RegData[47:32] = y; -assign RegData[63:48] = s; -assign RegData[79:64] = u; -assign RegData[87:80] = cc; -assign RegData[95:88] = dp; -assign RegData[111:96] = pc; - - - -// The values as being calculated -reg [7:0] a_nxt; -reg [7:0] b_nxt; -reg [15:0] x_nxt; -reg [15:0] y_nxt; -reg [15:0] u_nxt; -reg [15:0] s_nxt; -reg [15:0] pc_nxt; -reg [7:0] dp_nxt; -reg [7:0] cc_nxt; -reg [15:0] addr_nxt; -reg [15:0] ea_nxt; -reg [15:0] tmp_nxt; - -reg BS_nxt; -reg BA_nxt; - -// for ADDR, BS/BA, assign them to the flops -assign BS = BS_nxt; -assign BA = BA_nxt; -assign ADDR=addr_nxt; - -localparam CC_E= 8'H80; -localparam CC_F= 8'H40; -localparam CC_H= 8'H20; -localparam CC_I= 8'H10; -localparam CC_N= 8'H08; -localparam CC_Z= 8'H04; -localparam CC_V= 8'H02; -localparam CC_C= 8'H01; - -localparam CC_E_BIT= 3'd7; -localparam CC_F_BIT= 3'd6; -localparam CC_H_BIT= 3'd5; -localparam CC_I_BIT= 3'd4; -localparam CC_N_BIT= 3'd3; -localparam CC_Z_BIT= 3'd2; -localparam CC_V_BIT= 3'd1; -localparam CC_C_BIT= 3'd0; - -// Convenience calculations -reg [15:0] pc_p1; -reg [15:0] pc_p2; -reg [15:0] pc_p3; -reg [15:0] s_p1; -reg [15:0] s_m1; -reg [15:0] u_p1; -reg [15:0] u_m1; -reg [15:0] addr_p1; -reg [15:0] ea_p1; - -////////////////////////////////////////////////////// -// NMI Mask -// -// NMI is supposed to be masked - despite the name - until the 6809 loads a value into S. -// Frankly, I'm cheating slightly. If someone does a LDS #$0, it won't disable the mask. Pretty much anything else -// that changes the value of S from the default (which is currently $0) will clear the mask. A reset will set the mask again. -reg NMIMask; - -reg NMILatched; -reg NMISample; -reg NMISample2; -reg NMIClear; -reg NMIClear_nxt; -wire wNMIClear = NMIClear; - -reg IRQLatched; - -reg IRQSample; -reg IRQSample2; -reg FIRQLatched; -reg FIRQSample; -reg FIRQSample2; -reg HALTLatched; -reg HALTSample; -reg HALTSample2; -reg DMABREQLatched; -reg DMABREQSample; -reg DMABREQSample2; - -// Interrupt types -localparam INTTYPE_NMI = 3'H0 ; -localparam INTTYPE_IRQ = 3'H1 ; -localparam INTTYPE_FIRQ = 3'H2 ; -localparam INTTYPE_SWI = 3'H3 ; -localparam INTTYPE_SWI2 = 3'H4 ; -localparam INTTYPE_SWI3 = 3'H5 ; - -reg [2:0] IntType; -reg [2:0] IntType_nxt; - -////////////////////////////////////////////////////// -// Instruction Fetch Details -// -reg InstPage2; -reg InstPage3; -reg InstPage2_nxt; -reg InstPage3_nxt; - -reg [7:0] Inst1; -reg [7:0] Inst2; -reg [7:0] Inst3; -reg [7:0] Inst1_nxt; -reg [7:0] Inst2_nxt; -reg [7:0] Inst3_nxt; - - -localparam CPUSTATE_RESET = 7'd0; -localparam CPUSTATE_RESET0 = 7'd1; - -localparam CPUSTATE_RESET2 = 7'd3; -localparam CPUSTATE_FETCH_I1 = 7'd4; -localparam CPUSTATE_FETCH_I1V2 = 7'd5; -localparam CPUSTATE_FETCH_I2 = 7'd8; - -localparam CPUSTATE_LBRA_OFFSETLOW = 7'd17; -localparam CPUSTATE_LBRA_DONTCARE = 7'd18; -localparam CPUSTATE_LBRA_DONTCARE2 = 7'd19; - - - -localparam CPUSTATE_BRA_DONTCARE = 7'd20; - -localparam CPUSTATE_BSR_DONTCARE1 = 7'd21; -localparam CPUSTATE_BSR_DONTCARE2 = 7'd22; -localparam CPUSTATE_BSR_RETURNLOW = 7'd23; -localparam CPUSTATE_BSR_RETURNHIGH = 7'd24; - -localparam CPUSTATE_TFR_DONTCARE1 = 7'd26; -localparam CPUSTATE_TFR_DONTCARE2 = 7'd27; -localparam CPUSTATE_TFR_DONTCARE3 = 7'd28; -localparam CPUSTATE_TFR_DONTCARE4 = 7'd29; - -localparam CPUSTATE_EXG_DONTCARE1 = 7'd30; -localparam CPUSTATE_EXG_DONTCARE2 = 7'd31; -localparam CPUSTATE_EXG_DONTCARE3 = 7'd32; -localparam CPUSTATE_EXG_DONTCARE4 = 7'd33; -localparam CPUSTATE_EXG_DONTCARE5 = 7'd34; -localparam CPUSTATE_EXG_DONTCARE6 = 7'd35; - -localparam CPUSTATE_ABX_DONTCARE = 7'd36; - -localparam CPUSTATE_RTS_HI = 7'd38; -localparam CPUSTATE_RTS_LO = 7'd39; -localparam CPUSTATE_RTS_DONTCARE2 = 7'd40; - -localparam CPUSTATE_16IMM_LO = 7'd41; -localparam CPUSTATE_ALU16_DONTCARE = 7'd42; -localparam CPUSTATE_DIRECT_DONTCARE = 7'd43; - -localparam CPUSTATE_ALU_EA = 7'd44; - -localparam CPUSTATE_ALU_DONTCARE = 7'd46; -localparam CPUSTATE_ALU_WRITEBACK = 7'd47; - -localparam CPUSTATE_LD16_LO = 7'd48; - -localparam CPUSTATE_ST16_LO = 7'd49; -localparam CPUSTATE_ALU16_LO = 7'd50; - - - - -localparam CPUSTATE_JSR_DONTCARE = 7'd53; -localparam CPUSTATE_JSR_RETLO = 7'd54; -localparam CPUSTATE_JSR_RETHI = 7'd55; -localparam CPUSTATE_EXTENDED_ADDRLO = 7'd56; -localparam CPUSTATE_EXTENDED_DONTCARE = 7'd57; -localparam CPUSTATE_INDEXED_BASE = 7'd58; - - -localparam CPUSTATE_IDX_DONTCARE3 = 7'd60; - -localparam CPUSTATE_IDX_OFFSET_LO = 7'd61; -localparam CPUSTATE_IDX_16OFFSET_LO = 7'd62; - -localparam CPUSTATE_IDX_16OFF_DONTCARE0= 7'd63; -localparam CPUSTATE_IDX_16OFF_DONTCARE1= 7'd64; -localparam CPUSTATE_IDX_16OFF_DONTCARE2= 7'd65; -localparam CPUSTATE_IDX_16OFF_DONTCARE3= 7'd66; - -localparam CPUSTATE_IDX_DOFF_DONTCARE1 = 7'd68; -localparam CPUSTATE_IDX_DOFF_DONTCARE2 = 7'd69; -localparam CPUSTATE_IDX_DOFF_DONTCARE3 = 7'd70; -localparam CPUSTATE_IDX_PC16OFF_DONTCARE = 7'd71; - -localparam CPUSTATE_IDX_EXTIND_LO = 7'd72; -localparam CPUSTATE_IDX_EXTIND_DONTCARE = 7'd73; - -localparam CPUSTATE_INDIRECT_HI = 7'd74; -localparam CPUSTATE_INDIRECT_LO = 7'd75; -localparam CPUSTATE_INDIRECT_DONTCARE = 7'd76; -localparam CPUSTATE_MUL_ACTION = 7'd77; - -localparam CPUSTATE_PSH_DONTCARE1 = 7'd80; -localparam CPUSTATE_PSH_DONTCARE2 = 7'd81; -localparam CPUSTATE_PSH_DONTCARE3 = 7'd82; -localparam CPUSTATE_PSH_ACTION = 7'd83; - -localparam CPUSTATE_PUL_DONTCARE1 = 7'd84; -localparam CPUSTATE_PUL_DONTCARE2 = 7'd85; -localparam CPUSTATE_PUL_ACTION = 7'd86; - -localparam CPUSTATE_NMI_START = 7'd87; -localparam CPUSTATE_IRQ_DONTCARE = 7'd88; -localparam CPUSTATE_IRQ_START = 7'd89; -localparam CPUSTATE_IRQ_DONTCARE2 = 7'd90; -localparam CPUSTATE_IRQ_VECTOR_HI = 7'd91; -localparam CPUSTATE_IRQ_VECTOR_LO = 7'd92; -localparam CPUSTATE_FIRQ_START = 7'd93; -localparam CPUSTATE_CC_DONTCARE = 7'd94; -localparam CPUSTATE_SWI_START = 7'd95; - -localparam CPUSTATE_TST_DONTCARE1 = 7'd96; -localparam CPUSTATE_TST_DONTCARE2 = 7'd97; - -localparam CPUSTATE_DEBUG = 7'd98; - -localparam CPUSTATE_16IMM_DONTCARE = 7'd99; - -localparam CPUSTATE_HALTED = 7'd100; - -localparam CPUSTATE_HALT_EXIT2 = 7'd102; -localparam CPUSTATE_STOP = 7'd105; -localparam CPUSTATE_STOP2 = 7'd106; -localparam CPUSTATE_STOP3 = 7'd107; - - -localparam CPUSTATE_CWAI = 7'd108; -localparam CPUSTATE_CWAI_DONTCARE1 = 7'd109; -localparam CPUSTATE_CWAI_POST = 7'd110; - -localparam CPUSTATE_DMABREQ = 7'd111; -localparam CPUSTATE_DMABREQ_EXIT = 7'd112; -localparam CPUSTATE_SYNC = 7'd113; -localparam CPUSTATE_SYNC_EXIT = 7'd114; - -localparam CPUSTATE_INT_DONTCARE = 7'd115; - - -reg [6:0] CpuState = CPUSTATE_RESET; -reg [6:0] CpuState_nxt = CPUSTATE_RESET; - -reg [6:0] NextState = CPUSTATE_RESET; -reg [6:0] NextState_nxt = CPUSTATE_RESET; - -wire [6:0] PostIllegalState; - -// If we encounter something like an illegal addressing mode (an index mode that's illegal for instance) -// What state should we go to? -generate -if (ILLEGAL_INSTRUCTIONS=="STOP") -begin : postillegal - assign PostIllegalState = CPUSTATE_STOP; -end -else -begin - assign PostIllegalState = CPUSTATE_FETCH_I1; -end -endgenerate - - - -/////////////////////////////////////////////////////////////////////// - -// -// MapInstruction - Considering how the core was instantiated, this -// will either directly return D[7:0] *or* remap values from D[7:0] -// that relate to undefined instructions in the 6809 to the instructions -// that the 6809 actually executed when these were encountered, due to -// incomplete decoding. -// -// NEG, COM, LSR, DEC - these four instructions, in Direct, Inherent (A or B) -// Indexed, or Extended addressing do not actually decode bit 0 on the instruction. -// Thus, for instance, a $51 encountered will be executed as a $50, which is a NEGB. -// - -// Specifically, the input is an instruction; if it matches an unknown instruction that the -// 6809 is known to ghost to another instruction, the output of the function -// is the the instruction that actually gets executed. Otherwise, the output is the -// input. - -function [7:0] MapInstruction(input [7:0] i); -reg [3:0] topnyb; -reg [3:0] btmnyb; -reg [7:0] newinst; -begin - newinst = i; - - topnyb = i[7:4]; - btmnyb = i[3:0]; - - if ( (topnyb == 4'H0) || - (topnyb == 4'H4) || - (topnyb == 4'H5) || - (topnyb == 4'H6) || - (topnyb == 4'H7) - ) - begin - if (btmnyb == 4'H1) - newinst = {topnyb, 4'H0}; - if (btmnyb == 4'H2) - newinst = {topnyb, 4'H3}; - if (btmnyb == 4'H5) - newinst = {topnyb, 4'H4}; - if (btmnyb == 4'HB) - newinst = {topnyb, 4'HA}; - end - MapInstruction = newinst; -end -endfunction - - -wire [7:0] MappedInstruction; -generate -if (ILLEGAL_INSTRUCTIONS=="GHOST") -begin : ghost - assign MappedInstruction = MapInstruction(D); -end -else -begin - assign MappedInstruction = D; -end -endgenerate - - - -/////////////////////////////////////////////////////////////////////// - -function IllegalInstruction(input [7:0] i); -reg [3:0] hi; -reg [3:0] lo; -reg illegal; -begin - illegal = 1'b0; - hi = i[7:4]; - lo = i[3:0]; - if ( (hi == 4'H0) || (hi == 4'H4) || (hi == 4'H5) || (hi == 4'H6) || (hi == 4'H7) ) - begin - if ( (lo == 4'H1) || (lo == 4'H2) || (lo == 4'H5) || (lo == 4'HB) ) - illegal = 1'b1; - if (lo == 4'HE) - if ( (hi == 4'H4) || (hi == 4'H5) ) - illegal = 1'b1; - end - if (hi == 4'H3) - begin - if ( (lo == 4'H8) || (lo == 4'HE) ) - illegal = 1'b1; - end - if (hi == 4'H1) - begin - if ( (lo == 4'H4) || (lo == 4'H5) || (lo == 4'H8) || (lo == 4'HB) ) - illegal = 1'b1; - end - if ( (hi == 4'H8) || (hi == 4'HC) ) - begin - if ( (lo == 4'H7) || (lo == 4'HF) ) - illegal = 1'b1; - if ( lo == 4'HD ) - if (hi == 4'HC) - illegal = 1'b1; - end - IllegalInstruction = illegal; -end -endfunction - -wire IsIllegalInstruction; - -generate -if (ILLEGAL_INSTRUCTIONS=="GHOST") -begin : never_illegal - assign IsIllegalInstruction = 1'b0; -end -else -begin - assign IsIllegalInstruction = IllegalInstruction(Inst1); -end -endgenerate - -wire [6:0] IllegalInstructionState; -generate -if (ILLEGAL_INSTRUCTIONS=="IGNORE") -begin : illegal_state - assign IllegalInstructionState = CPUSTATE_FETCH_I1; -end -else if (ILLEGAL_INSTRUCTIONS=="STOP") -begin - assign IllegalInstructionState = CPUSTATE_STOP; -end -else -begin - assign IllegalInstructionState = 7'd0; -end -endgenerate - - -/////////////////////////////////////////////////////////////////////// - - -always @(negedge NMISample2 or posedge wNMIClear) -begin - if (wNMIClear == 1) - NMILatched <= 1; - else if (NMIMask == 0) - NMILatched <= 0; - else - NMILatched <= 1; -end - -// -// The 6809 specs say that the CPU control signals are sampled on the falling edge of Q. -// It also says that the interrupts require 1 cycle of synchronization time. -// That's vague, as it doesn't say where "1 cycle" starts or ends. Starting from the -// falling edge of Q, the next cycle notices an assertion. From checking a hard 6809 on -// an analyzer, what they really mean is that it's sampled on the falling edge of Q, -// but there's a one cycle delay from the falling edge of E (0.25 clocks from the falling edge of Q -// where the signals were sampled) before it can be noticed. -// So, SIGNALSample is the latched value at the falling edge of Q -// SIGNALSample2 is the latched value at the falling edge of E (0.25 clocks after the line above) -// SIGNALLatched is the latched value at the falling edge of E (1 cycle after the line above) -// -// /HALT and /DMABREQ are delayed one cycle less than interrupts. The 6809 specs infer these details, -// but don't list the point-of-reference they're written from (for instance, they say that an interrupt requires -// a cycle for synchronization; however, it isn't clear whether that's from the falling Q to the next falling Q, -// a complete intermediate cycle, the falling E to the next falling E, etc.) - which, in the end, required an -// analyzer on the 6809 to determine how many cycles before a new instruction an interrupt (or /HALT & /DMABREQ) -// had to be asserted to be noted instead of the next instruction running start to finish. -// -always @(negedge Q) -begin - NMISample <= nNMI; - - IRQSample <= nIRQ; - - FIRQSample <= nFIRQ; - - HALTSample <= nHALT; - - DMABREQSample <= nDMABREQ; - - -end - - -reg rnRESET=0; // The latched version of /RESET, useful 1 clock after it's latched -always @(negedge E) -begin - rnRESET <= nRESET; - - NMISample2 <= NMISample; - - IRQSample2 <= IRQSample; - IRQLatched <= IRQSample2; - - FIRQSample2 <= FIRQSample; - FIRQLatched <= FIRQSample2; - - HALTSample2 <= HALTSample; - HALTLatched <= HALTSample2; - - DMABREQSample2 <= DMABREQSample; - DMABREQLatched <= DMABREQSample2; - - - if (rnRESET == 1) - begin - CpuState <= CpuState_nxt; - - // Don't interpret this next item as "The Next State"; it's a special case 'after this - // generic state, go to this programmable state', so that a single state - // can be shared for many tasks. [Specifically, the stack push/pull code, which is used - // for PSH, PUL, Interrupts, RTI, etc. - NextState <= NextState_nxt; - - // CPU registers latch from the combinatorial circuit - a <= a_nxt; - b <= b_nxt; - x <= x_nxt; - y <= y_nxt; - s <= s_nxt; - u <= u_nxt; - cc <= cc_nxt; - dp <= dp_nxt; - pc <= pc_nxt; - tmp <= tmp_nxt; - addr <= addr_nxt; - ea <= ea_nxt; - - InstPage2 <= InstPage2_nxt; - InstPage3 <= InstPage3_nxt; - Inst1 <= Inst1_nxt; - Inst2 <= Inst2_nxt; - Inst3 <= Inst3_nxt; - NMIClear <= NMIClear_nxt; - - IntType <= IntType_nxt; - - if (s != s_nxt) // Once S changes at all (default is '0'), release the NMI Mask. - NMIMask <= 1'b0; - end - else - begin - CpuState <= CPUSTATE_RESET; - NMIMask <= 1'b1; // Mask NMI until S is loaded. - NMIClear <= 1'b0; // Mark us as not having serviced NMI - end -end - - -///////////////////////////////////////////////////////////////// -// Decode the Index byte - -localparam IDX_REG_X = 3'd0; -localparam IDX_REG_Y = 3'd1; -localparam IDX_REG_U = 3'd2; -localparam IDX_REG_S = 3'd3; -localparam IDX_REG_PC = 3'd4; - -localparam IDX_MODE_POSTINC1 = 4'd0; -localparam IDX_MODE_POSTINC2 = 4'd1; -localparam IDX_MODE_PREDEC1 = 4'd2; -localparam IDX_MODE_PREDEC2 = 4'd3; -localparam IDX_MODE_NOOFFSET = 4'd4; -localparam IDX_MODE_B_OFFSET = 4'd5; -localparam IDX_MODE_A_OFFSET = 4'd6; -localparam IDX_MODE_5BIT_OFFSET= 4'd7; // Special case, not bit pattern 7; the offset sits in the bit pattern -localparam IDX_MODE_8BIT_OFFSET= 4'd8; -localparam IDX_MODE_16BIT_OFFSET = 4'd9; -localparam IDX_MODE_D_OFFSET = 4'd11; -localparam IDX_MODE_8BIT_OFFSET_PC = 4'd12; -localparam IDX_MODE_16BIT_OFFSET_PC= 4'd13; -localparam IDX_MODE_EXTENDED_INDIRECT = 4'd15; - -// Return: -// Register base [3 bits] -// Indirect [1 bit] -// Mode [4 bits] - -function [7:0] IndexDecode(input [7:0] postbyte); -reg [2:0] regnum; -reg indirect; -reg [3:0] mode; -begin - indirect = 0; - mode = 0; - - if (postbyte[7] == 0) // 5-bit - begin - mode = IDX_MODE_5BIT_OFFSET; - end - else - begin - mode = postbyte[3:0]; - indirect = postbyte[4]; - end - if ((mode != IDX_MODE_8BIT_OFFSET_PC) && (mode != IDX_MODE_16BIT_OFFSET_PC)) - regnum[2:0] = postbyte[6:5]; - else - regnum[2:0] = IDX_REG_PC; - - IndexDecode = {indirect, mode, regnum}; -end -endfunction - -wire [3:0] IndexedMode; -wire IndexedIndirect; -wire [2:0] IndexedRegister; - -assign {IndexedIndirect, IndexedMode, IndexedRegister} = IndexDecode(Inst2); - -///////////////////////////////////////////////////////////////// -// Is this a JMP instruction? (irrespective of addressing mode) -function IsJMP(input [7:0] inst); -reg [3:0] hi; -reg [3:0] lo; -begin - hi = inst[7:4]; - lo = inst[3:0]; - - IsJMP = 0; - if ((hi == 4'H0) || (hi == 4'H6) || (hi == 4'H7)) - if (lo == 4'HE) - IsJMP = 1; -end -endfunction - -/////////////////////////////////////////////////////////////////// -// Is this an 8-bit Store? - -localparam ST8_REG_A = 1'b0; -localparam ST8_REG_B = 1'b1; - -function [1:0] IsST8(input [7:0] inst); -reg regnum; -reg IsStore; -begin - - IsStore = 1'b0; - regnum = 1'b1; - - if ( (Inst1 == 8'H97) || (Inst1 == 8'HA7) || (Inst1 == 8'HB7) ) - begin - IsStore = 1'b1; - regnum = 1'b0; - end - else if ( (Inst1 == 8'HD7) || (Inst1 == 8'HE7) || (Inst1 == 8'HF7) ) - begin - IsStore = 1'b1; - regnum = 1'b1; - end - IsST8 = {IsStore, regnum}; -end -endfunction - -wire IsStore8; -wire Store8RegisterNum; - -assign {IsStore8, Store8RegisterNum} = IsST8(Inst1); - - -///////////////////////////////////////////////////////////////// -// Is this a 16-bit Store? - -localparam ST16_REG_X = 3'd0; -localparam ST16_REG_Y = 3'd1; -localparam ST16_REG_U = 3'd2; -localparam ST16_REG_S = 3'd3; -localparam ST16_REG_D = 3'd4; - - -function [3:0] IsST16(input [7:0] inst); -reg [3:0] hi; -reg [3:0] lo; -reg [2:0] regnum; -reg IsStore; -begin - hi = inst[7:4]; - lo = inst[3:0]; - IsStore = 1'b0; - regnum = 3'b111; - - if ((inst == 8'H9F) || (inst == 8'HAF) || (inst == 8'HBF)) - begin - IsStore = 1; - if (~InstPage2) - regnum = ST16_REG_X; - else - regnum = ST16_REG_Y; - end - else if ((inst == 8'HDF) || (inst == 8'HEF) || (inst == 8'HFF)) - begin - IsStore = 1; - if (~InstPage2) - regnum = ST16_REG_U; - else - regnum = ST16_REG_S; - end - else if ((inst == 8'HDD) || (inst == 8'HED) || (inst == 8'HFD)) - begin - IsStore = 1; - regnum = ST16_REG_D; - end - - IsST16 = {IsStore, regnum}; -end -endfunction - -wire IsStore16; -wire [2:0] StoreRegisterNum; - -assign {IsStore16, StoreRegisterNum} = IsST16(Inst1); - -///////////////////////////////////////////////////////////////// -// Is this a special Immediate mode instruction, ala -// PSH, PUL, EXG, TFR, ANDCC, ORCC -function IsSpecialImm(input [7:0] inst); -reg is; -reg [3:0] hi; -reg [3:0] lo; -begin - hi = inst[7:4]; - lo = inst[3:0]; - is = 0; - - if (hi == 4'H1) - begin - if ( (lo == 4'HA) || (lo == 4'HC) || (lo == 4'HE) || (lo == 4'HF) ) // ORCC, ANDCC, EXG, TFR - is = 1; - end - else if (hi == 4'H3) - begin - if ( (lo >= 4'H3) && (lo <= 4'H7) ) // PSHS, PULS, PSHU, PULU - is = 1; - end - else - is = 0; - - IsSpecialImm = is; -end -endfunction -wire IsSpecialImmediate = IsSpecialImm(Inst1); - -///////////////////////////////////////////////////////////////// -// Is this a one-byte instruction? [The 6809 reads 2 bytes for every instruction, minimum (it can read more). On a one-byte, we have to ensure that we haven't skipped the PC ahead. -function IsOneByteInstruction(input [7:0] inst); -reg is; -reg [3:0] hi; -reg [3:0] lo; -begin - hi = inst[7:4]; - lo = inst[3:0]; - is = 1'b0; - - if ( (hi == 4'H4) || (hi == 4'H5) ) - is = 1'b1; - else if ( hi == 4'H1) - begin - if ( (lo == 4'H2) || (lo == 4'H3) || (lo == 4'H9) || (lo == 4'HD) ) - is = 1'b1; - end - else if (hi == 4'H3) - begin - if ( (lo >= 4'H9) && (lo != 4'HC) ) - is = 1'b1; - end - else - is = 1'b0; - - IsOneByteInstruction = is; -end -endfunction - -///////////////////////////////////////////////////////////////// -// ALU16 - Simpler than the 8 bit ALU - -localparam ALU16_REG_X = 3'd0; -localparam ALU16_REG_Y = 3'd1; -localparam ALU16_REG_U = 3'd2; -localparam ALU16_REG_S = 3'd3; -localparam ALU16_REG_D = 3'd4; - -function [2:0] ALU16RegFromInst(input Page2, input Page3, input [7:0] inst); -reg [2:0] srcreg; -begin - srcreg = 3'b111; // default - casex ({Page2, Page3, inst}) // Note pattern for the matching below - 10'b1010xx0011: // 1083, 1093, 10A3, 10B3 CMPD - srcreg = ALU16_REG_D; - 10'b1010xx1100: // 108C, 109C, 10AC, 10BC CMPY - srcreg = ALU16_REG_Y; - 10'b0110xx0011: // 1183, 1193, 11A3, 11B3 CMPU - srcreg = ALU16_REG_U; - 10'b0110xx1100: // 118C, 119C, 11AC, 11BC CMPS - srcreg = ALU16_REG_S; - 10'b0010xx1100: // 8C,9C,AC,BC CMPX - srcreg = ALU16_REG_X; - - 10'b0011xx0011: // C3, D3, E3, F3 ADDD - srcreg = ALU16_REG_D; - - 10'b0011xx1100: // CC, DC, EC, FC LDD - srcreg = ALU16_REG_D; - 10'b0010xx1110: // 8E LDX, 9E LDX, AE LDX, BE LDX - srcreg = ALU16_REG_X; - 10'b0011xx1110: // CE LDU, DE LDU, EE LDU, FE LDU - srcreg = ALU16_REG_U; - 10'b1010xx1110: // 108E LDY, 109E LDY, 10AE LDY, 10BE LDY - srcreg = ALU16_REG_Y; - 10'b1011xx1110: // 10CE LDS, 10DE LDS, 10EE LDS, 10FE LDS - srcreg = ALU16_REG_S; - 10'b0010xx0011: // 83, 93, A3, B3 SUBD - srcreg = ALU16_REG_D; - - 10'H03A: // 3A ABX - srcreg = ALU16_REG_X; - 10'H030: // 30 LEAX - srcreg = ALU16_REG_X; - 10'H031: // 31 LEAY - srcreg = ALU16_REG_Y; - 10'H032: // 32 LEAS - srcreg = ALU16_REG_S; - 10'H033: // 32 LEAU - srcreg = ALU16_REG_U; - default: - srcreg = 3'b111; - endcase - ALU16RegFromInst = srcreg; -end -endfunction - -wire [2:0] ALU16Reg = ALU16RegFromInst(InstPage2, InstPage3, Inst1); - -localparam ALUOP16_SUB = 3'H0; -localparam ALUOP16_ADD = 3'H1; -localparam ALUOP16_LD = 3'H2; -localparam ALUOP16_CMP = 3'H3; -localparam ALUOP16_LEA = 3'H4; -localparam ALUOP16_INVALID = 3'H7; - -function [3:0] ALU16OpFromInst(input Page2, input Page3, input [7:0] inst); -reg [2:0] aluop; -reg writeback; -begin - aluop = 3'b111; - writeback = 1'b1; - casex ({Page2, Page3, inst}) - 10'b1010xx0011: // 1083, 1093, 10A3, 10B3 CMPD - begin - aluop = ALUOP16_CMP; - writeback = 1'b0; - end - 10'b1010xx1100: // 108C, 109C, 10AC, 10BC CMPY - begin - aluop = ALUOP16_CMP; - writeback = 1'b0; - end - 10'b0110xx0011: // 1183, 1193, 11A3, 11B3 CMPU - begin - aluop = ALUOP16_CMP; - writeback = 1'b0; - end - 10'b0110xx1100: // 118C, 119C, 11AC, 11BC CMPS - begin - aluop = ALUOP16_CMP; - writeback = 1'b0; - end - 10'b0010xx1100: // 8C,9C,AC,BC CMPX - begin - aluop = ALUOP16_CMP; - writeback = 1'b0; - end - - 10'b0011xx0011: // C3, D3, E3, F3 ADDD - aluop = ALUOP16_ADD; - - 10'b0011xx1100: // CC, DC, EC, FC LDD - aluop = ALUOP16_LD; - 10'b001xxx1110: // 8E LDX, 9E LDX, AE LDX, BE LDX, CE LDU, DE LDU, EE LDU, FE LDU - aluop = ALUOP16_LD; - 10'b101xxx1110: // 108E LDY, 109E LDY, 10AE LDY, 10BE LDY, 10CE LDS, 10DE LDS, 10EE LDS, 10FE LDS - aluop = ALUOP16_LD; - - 10'b0010xx0011: // 83, 93, A3, B3 SUBD - aluop = ALUOP16_SUB; - - 10'H03A: // 3A ABX - aluop = ALUOP16_ADD; - - 10'b00001100xx: // $30-$33, LEAX, LEAY, LEAS, LEAU - aluop = ALUOP16_LEA; - - default: - aluop = ALUOP16_INVALID; - endcase - ALU16OpFromInst = {writeback, aluop}; -end -endfunction - -wire ALU16OpWriteback; -wire [2:0] ALU16Opcode; - -assign {ALU16OpWriteback, ALU16Opcode} = ALU16OpFromInst(InstPage2, InstPage3, Inst1); - -wire IsALU16Opcode = (ALU16Opcode != 3'b111); - -function [23:0] ALU16Inst(input [2:0] operation16, input [15:0] a_arg, input [15:0] b_arg, input [7:0] cc_arg); -reg [7:0] cc_out; -reg [15:0] ALUFn; -reg carry; -reg borrow; -begin - cc_out = cc_arg; - case (operation16) - ALUOP16_ADD: - begin - {cc_out[CC_C_BIT], ALUFn} = {1'b0, a_arg} + b_arg; - cc_out[CC_V_BIT] = (a_arg[15] & b_arg[15] & ~ALUFn[15]) | (~a_arg[15] & ~b_arg[15] & ALUFn[15]); - end - - ALUOP16_SUB: - begin - {cc_out[CC_C_BIT], ALUFn} = {1'b0, a_arg} - {1'b0, b_arg}; - cc_out[CC_V_BIT] = (a_arg[15] & ~b_arg[15] & ~ALUFn[15]) | (~a_arg[15] & b_arg[15] & ALUFn[15]); - end - - ALUOP16_LD: - begin - ALUFn = b_arg; - cc_out[CC_V_BIT] = 1'b0; - end - - ALUOP16_CMP: - begin - {cc_out[CC_C_BIT], ALUFn} = {1'b0, a_arg} - {1'b0, b_arg}; - cc_out[CC_V_BIT] = (a_arg[15] & ~b_arg[15] & ~ALUFn[15]) | (~a_arg[15] & b_arg[15] & ALUFn[15]); - end - - ALUOP16_LEA: - begin - ALUFn = a_arg; - end - - default: - ALUFn = 16'H0000; - - endcase - cc_out[CC_Z_BIT] = (ALUFn[15:0] == 16'H0000); - if (operation16 != ALUOP16_LEA) - cc_out[CC_N_BIT] = ALUFn[15]; - ALU16Inst = {cc_out, ALUFn}; -end -endfunction - -reg [2:0] ALU16_OP; -reg [15:0] ALU16_A; -reg [15:0] ALU16_B; -reg [7:0] ALU16_CC; - -// Top 8 bits == CC, bottom 8 bits = output value -wire [23:0] ALU16 = ALU16Inst(ALU16_OP, ALU16_A, ALU16_B, ALU16_CC); - - -///////////////////////////////////////////////////////////////// -// ALU - -// The ops are organized from the 4 low-order bits of the instructions for the first set of ops, then 16-31 are the second set - even though bit 4 isn't representative. -localparam ALUOP_NEG = 5'd0; -localparam ALUOP_COM = 5'd3; -localparam ALUOP_LSR = 5'd4; -localparam ALUOP_ROR = 5'd6; -localparam ALUOP_ASR = 5'd7; -localparam ALUOP_ASL = 5'd8; -localparam ALUOP_LSL = 5'd8; -localparam ALUOP_ROL = 5'd9; -localparam ALUOP_DEC = 5'd10; -localparam ALUOP_INC = 5'd12; -localparam ALUOP_TST = 5'd13; -localparam ALUOP_CLR = 5'd15; - -localparam ALUOP_SUB = 5'd16; -localparam ALUOP_CMP = 5'd17; -localparam ALUOP_SBC = 5'd18; -localparam ALUOP_AND = 5'd20; -localparam ALUOP_BIT = 5'd21; -localparam ALUOP_LD = 5'd22; -localparam ALUOP_EOR = 5'd24; -localparam ALUOP_ADC = 5'd25; -localparam ALUOP_OR = 5'd26; -localparam ALUOP_ADD = 5'd27; - -function [5:0] ALUOpFromInst(input [7:0] inst); -reg [4:0] op; -reg writeback; -begin - // Okay, this turned out to be simpler than I expected ... - op = {inst[7], inst[3:0]}; - case (op) - ALUOP_CMP: - writeback = 0; - ALUOP_TST: - writeback = 0; - ALUOP_BIT: - writeback = 0; - default: - writeback = 1; - endcase - ALUOpFromInst = {writeback, op}; -end -endfunction - -wire [4:0] ALU8Op; -wire ALU8Writeback; - -assign {ALU8Writeback, ALU8Op} = ALUOpFromInst(Inst1); - -reg [7:0] ALU_A; -reg [7:0] ALU_B; -reg [7:0] ALU_CC; -reg [4:0] ALU_OP; - - -function [15:0] ALUInst(input [4:0] operation, input [7:0] a_arg, input [7:0] b_arg, input [7:0] cc_arg); -reg [7:0] cc_out; -reg [7:0] ALUFn; -reg carry; -reg borrow; -begin - cc_out = cc_arg; - case (operation) - ALUOP_NEG: - begin - ALUFn[7:0] = ~a_arg + 1'b1; - cc_out[CC_C_BIT] = (ALUFn[7:0] != 8'H00); - cc_out[CC_V_BIT] = (a_arg == 8'H80); - end - - ALUOP_LSL: - begin - {cc_out[CC_C_BIT], ALUFn} = {a_arg, 1'b0}; - cc_out[CC_V_BIT] = a_arg[7] ^ a_arg[6]; - end - - ALUOP_LSR: - begin - {ALUFn, cc_out[CC_C_BIT]} = {1'b0, a_arg}; - end - - ALUOP_ASR: - begin - {ALUFn, cc_out[CC_C_BIT]} = {a_arg[7], a_arg}; - end - - ALUOP_ROL: - begin - {cc_out[CC_C_BIT], ALUFn} = {a_arg, cc_arg[CC_C_BIT]}; - cc_out[CC_V_BIT] = a_arg[7] ^ a_arg[6]; - end - - ALUOP_ROR: - begin - {ALUFn, cc_out[CC_C_BIT]} = {cc_arg[CC_C_BIT], a_arg}; - end - - ALUOP_OR: - begin - ALUFn[7:0] = (a_arg | b_arg); - cc_out[CC_V_BIT] = 1'b0; - end - - ALUOP_ADD: - begin - {cc_out[CC_C_BIT], ALUFn[7:0]} = {1'b0, a_arg} + {1'b0, b_arg}; - cc_out[CC_V_BIT] = (a_arg[7] & b_arg[7] & ~ALUFn[7]) | (~a_arg[7] & ~b_arg[7] & ALUFn[7]); - cc_out[CC_H_BIT] = a_arg[4] ^ b_arg[4] ^ ALUFn[4]; - end - - ALUOP_SUB: - begin - {cc_out[CC_C_BIT], ALUFn[7:0]} = {1'b0, a_arg} - {1'b0, b_arg}; - cc_out[CC_V_BIT] = (a_arg[7] & ~b_arg[7] & ~ALUFn[7]) | (~a_arg[7] & b_arg[7] & ALUFn[7]); - end - - ALUOP_AND: - begin - ALUFn[7:0] = (a_arg & b_arg); - cc_out[CC_V_BIT] = 1'b0; - end - - ALUOP_BIT: - begin - ALUFn[7:0] = (a_arg & b_arg); - cc_out[CC_V_BIT] = 1'b0; - end - - ALUOP_EOR: - begin - ALUFn[7:0] = (a_arg ^ b_arg); - cc_out[CC_V_BIT] = 1'b0; - end - - ALUOP_CMP: - begin - {cc_out[CC_C_BIT], ALUFn[7:0]} = {1'b0, a_arg} - {1'b0, b_arg}; - cc_out[CC_V_BIT] = (a_arg[7] & ~b_arg[7] & ~ALUFn[7]) | (~a_arg[7] & b_arg[7] & ALUFn[7]); - end - - ALUOP_COM: - begin - ALUFn[7:0] = ~a_arg; - cc_out[CC_V_BIT] = 1'b0; - cc_out[CC_C_BIT] = 1'b1; - end - - ALUOP_ADC: - begin - {cc_out[CC_C_BIT], ALUFn[7:0]} = {1'b0, a_arg} + {1'b0, b_arg} + cc_arg[CC_C_BIT]; - cc_out[CC_V_BIT] = (a_arg[7] & b_arg[7] & ~ALUFn[7]) | (~a_arg[7] & ~b_arg[7] & ALUFn[7]); - cc_out[CC_H_BIT] = a_arg[4] ^ b_arg[4] ^ ALUFn[4]; - end - - ALUOP_LD: - begin - ALUFn[7:0] = b_arg; - cc_out[CC_V_BIT] = 1'b0; - end - - ALUOP_INC: - begin - {carry, ALUFn} = {1'b0, a_arg} + 1'b1; - cc_out[CC_V_BIT] = (~a_arg[7] & ALUFn[7]); - end - - ALUOP_DEC: - begin - {carry, ALUFn[7:0]} = {1'b0, a_arg} - 1'b1; - cc_out[CC_V_BIT] = (a_arg[7] & ~ALUFn[7]); - end - - ALUOP_CLR: - begin - ALUFn[7:0] = 8'H00; - cc_out[CC_V_BIT] = 1'b0; - cc_out[CC_C_BIT] = 1'b0; - end - - ALUOP_TST: - begin - ALUFn[7:0] = a_arg; - cc_out[CC_V_BIT] = 1'b0; - end - - ALUOP_SBC: - begin - {cc_out[CC_C_BIT], ALUFn[7:0]} = {1'b0, a_arg} - {1'b0, b_arg} - cc_arg[CC_C_BIT]; - cc_out[CC_V_BIT] = (a_arg[7] & ~b_arg[7] & ~ALUFn[7]) | (~a_arg[7] & b_arg[7] & ALUFn[7]); - end - - default: - ALUFn = 8'H00; - - endcase - - cc_out[CC_N_BIT] = ALUFn[7]; - cc_out[CC_Z_BIT] = (ALUFn == 8'H00); - ALUInst = {cc_out[7:0], ALUFn[7:0]}; -end -endfunction - - -// Top 8 bits == CC, bottom 8 bits = output value -wire [15:0] ALU = ALUInst(ALU_OP, ALU_A, ALU_B, ALU_CC); - -//////////////////////////////////////////////////////////// - -localparam TYPE_INHERENT = 3'd0; -localparam TYPE_IMMEDIATE = 3'd1; -localparam TYPE_DIRECT = 3'd2; -localparam TYPE_RELATIVE = 3'd3; -localparam TYPE_INDEXED = 3'd4; -localparam TYPE_EXTENDED = 3'd5; - -localparam TYPE_INVALID = 3'd7; - -// Function to decode the addressing mode the instruction uses -function [2:0] addressing_mode_type(input [7:0] inst); -begin - casex (inst) - 8'b0000???? : addressing_mode_type = TYPE_DIRECT; - 8'b0001???? : - begin - casex (inst[3:0]) - 4'b0010: - addressing_mode_type = TYPE_INHERENT; - - 4'b0011: - addressing_mode_type = TYPE_INHERENT; - - 4'b1001: - addressing_mode_type = TYPE_INHERENT; - - 4'b1101: - addressing_mode_type = TYPE_INHERENT; - - 4'b0110: - addressing_mode_type = TYPE_RELATIVE; - - 4'b0111: - addressing_mode_type = TYPE_RELATIVE; - - 4'b1010: - addressing_mode_type = TYPE_IMMEDIATE; - - 4'b1100: - addressing_mode_type = TYPE_IMMEDIATE; - - 4'b1110: - addressing_mode_type = TYPE_IMMEDIATE; - - 4'b1111: - addressing_mode_type = TYPE_IMMEDIATE; - - default: - addressing_mode_type = TYPE_INVALID; - endcase - end - - 8'b0010????: addressing_mode_type = TYPE_RELATIVE; - 8'b0011????: - begin - casex(inst[3:0]) - 4'b00??: - addressing_mode_type = TYPE_INDEXED; - - 4'b01??: - addressing_mode_type = TYPE_IMMEDIATE; - - 4'b1001: - addressing_mode_type = TYPE_INHERENT; - - 4'b101?: - addressing_mode_type = TYPE_INHERENT; - - 4'b1100: - addressing_mode_type = TYPE_INHERENT; - - 4'b1101: - addressing_mode_type = TYPE_INHERENT; - - 4'b1111: - addressing_mode_type = TYPE_INHERENT; - - default: - addressing_mode_type = TYPE_INVALID; - endcase - end - - 8'b010?????: addressing_mode_type = TYPE_INHERENT; - - 8'b0110????: addressing_mode_type = TYPE_INDEXED; - - 8'b0111????: addressing_mode_type = TYPE_EXTENDED; - - 8'b1000????: - begin - casex (inst[3:0]) - 4'b0111: addressing_mode_type = TYPE_INVALID; - 4'b1111: addressing_mode_type = TYPE_INVALID; - 4'b1101: addressing_mode_type = TYPE_RELATIVE; - default: addressing_mode_type = TYPE_IMMEDIATE; - endcase - end - - 8'b1001????: addressing_mode_type = TYPE_DIRECT; - 8'b1010????: addressing_mode_type = TYPE_INDEXED; - 8'b1011????: addressing_mode_type = TYPE_EXTENDED; - 8'b1100????: addressing_mode_type = TYPE_IMMEDIATE; - 8'b1101????: addressing_mode_type = TYPE_DIRECT; - 8'b1110????: addressing_mode_type = TYPE_INDEXED; - 8'b1111????: addressing_mode_type = TYPE_EXTENDED; - - endcase -end -endfunction - -wire [2:0] AddrModeType = addressing_mode_type(Inst1); - -////////////////////////////////////////////////// - -// Individual opcodes that are the top of a column of states. - -localparam OPCODE_INH_ABX = 8'H3A; -localparam OPCODE_INH_RTS = 8'H39; -localparam OPCODE_INH_RTI = 8'H3B; -localparam OPCODE_INH_CWAI = 8'H3C; -localparam OPCODE_INH_MUL = 8'H3D; -localparam OPCODE_INH_SWI = 8'H3F; -localparam OPCODE_INH_SEX = 8'H1D; -localparam OPCODE_INH_NOP = 8'H12; -localparam OPCODE_INH_SYNC = 8'H13; -localparam OPCODE_INH_DAA = 8'H19; - -localparam OPCODE_IMM_ORCC = 8'H1A; -localparam OPCODE_IMM_ANDCC = 8'H1C; -localparam OPCODE_IMM_EXG = 8'H1E; -localparam OPCODE_IMM_TFR = 8'H1F; -localparam OPCODE_IMM_PSHS = 8'H34; -localparam OPCODE_IMM_PULS = 8'H35; -localparam OPCODE_IMM_PSHU = 8'H36; -localparam OPCODE_IMM_PULU = 8'H37; - -localparam OPCODE_IMM_SUBD = 8'H83; -localparam OPCODE_IMM_CMPX = 8'H8C; -localparam OPCODE_IMM_LDX = 8'H8E; -localparam OPCODE_IMM_ADDD = 8'HC3; -localparam OPCODE_IMM_LDD = 8'HCC; -localparam OPCODE_IMM_LDU = 8'HCE; -localparam OPCODE_IMM_CMPD = 8'H83; // Page2 -localparam OPCODE_IMM_CMPY = 8'H8C; // Page2 -localparam OPCODE_IMM_LDY = 8'H8E; // Page2 -localparam OPCODE_IMM_LDS = 8'HCE; // Page2 -localparam OPCODE_IMM_CMPU = 8'H83; // Page3 -localparam OPCODE_IMM_CMPS = 8'H8C; // Page3 - -localparam EXGTFR_REG_D = 4'H0; -localparam EXGTFR_REG_X = 4'H1; -localparam EXGTFR_REG_Y = 4'H2; -localparam EXGTFR_REG_U = 4'H3; -localparam EXGTFR_REG_S = 4'H4; -localparam EXGTFR_REG_PC = 4'H5; -localparam EXGTFR_REG_A = 4'H8; -localparam EXGTFR_REG_B = 4'H9; -localparam EXGTFR_REG_CC = 4'HA; -localparam EXGTFR_REG_DP = 4'HB; - -function IsALU8Set0(input [7:0] instr); -reg result; -reg [3:0] hi; -reg [3:0] lo; -begin - hi = instr[7:4]; - lo = instr[3:0]; - if ( (hi == 4'H0) || (hi == 4'H4) || (hi == 4'H5) || (hi == 4'H6) || (hi == 4'H7) ) - begin - if ( (lo != 4'H1) && (lo != 4'H2) && (lo != 4'H5) && (lo != 4'HB) && (lo != 4'HE) ) // permit NEG, COM, LSR, ROR, ASR, ASL/LSL, ROL, DEC, INC, TST, CLR - result = 1; - else - result = 0; - end - else - result = 0; - IsALU8Set0 = result; -end -endfunction - -function IsALU8Set1(input [7:0] instr); -reg result; -reg [3:0] hi; -reg [3:0] lo; -begin - hi = instr[7:4]; - lo = instr[3:0]; - if ( (hi >= 4'H8) ) - begin - if ( (lo <= 4'HB) && (lo != 4'H3) && (lo != 4'H7) ) // 8-bit SUB, CMP, SBC, AND, BIT, LD, EOR, ADC, OR, ADD - result = 1; - else - result = 0; - end - else - result = 0; - IsALU8Set1 = result; -end -endfunction - -// Determine if the instruction is performing an 8-bit op (ALU only) -function ALU8BitOp(input [7:0] instr); -begin - ALU8BitOp = IsALU8Set0(instr) | IsALU8Set1(instr); -end -endfunction - -wire Is8BitInst = ALU8BitOp(Inst1); - -function IsRegA(input [7:0] instr); -reg result; -reg [3:0] hi; -begin - hi = instr[7:4]; - if ((hi == 4'H4) || (hi == 4'H8) || (hi == 4'H9) || (hi == 4'HA) || (hi == 4'HB) ) - result = 1; - else - result = 0; - IsRegA = result; -end -endfunction - -wire IsTargetRegA = IsRegA(Inst1); - -// -// -// Decode -// 00-0F = DIRECT -// 10-1F = INHERENT, RELATIVE, IMMEDIATE -// 20-2F = RELATIVE -// 30-3F = INDEXED, IMMEDIATE (pus, pul), INHERENT -// 40-4F = INHERENT -// 50-5F = INHERENT -// 60-6F = INDEXED -// 70-7F = EXTENDED -// 80-8F = IMMEDIATE, RELATIVE (BSR) -// 90-9F = DIRECT -// A0-AF = INDEXED -// B0-BF = EXTENDED -// C0-CF = IMMEDIATE -// D0-DF = DIRECT -// E0-EF = INDEXED -// F0-FF = EXTENDED - -// DIRECT; 00-0F, 90-9F, D0-DF -// INHERENT; 10-1F (12, 13, 19, 1D), 30-3F (39-3F), 40-4F, 50-5F, -// RELATIVE: 10-1F (16, 17), 20-2F, 80-8F (8D) -// IMMEDIATE: 10-1F (1A, 1C, 1E, 1F), 30-3F (34-37), 80-8F (80-8C, 8E), C0-CF -// INDEXED: 60-6F, A0-AF, E0-EF -// EXTENDED: 70-7F, B0-Bf, F0-FF - -localparam INST_LBRA = 8'H16; // always -- shitty numbering, damnit -localparam INST_LBSR = 8'H17; // - -localparam INST_BRA = 8'H20; // always -localparam INST_BRN = 8'H21; // never -localparam INST_BHI = 8'H22; // CC.Z = 0 && CC.C = 0 -localparam INST_BLS = 8'H23; // CC.Z != 0 && CC.C != 0 -localparam INST_BCC = 8'H24; // CC.C = 0 -localparam INST_BHS = 8'H24; // same as BCC -localparam INST_BCS = 8'H25; // CC.C = 1 -localparam INST_BLO = 8'H25; // same as BCS -localparam INST_BNE = 8'H26; // CC.Z = 0 -localparam INST_BEQ = 8'H27; // CC.Z = 1 -localparam INST_BVC = 8'H28; // V = 1 -localparam INST_BVS = 8'H29; // V = 0 -localparam INST_BPL = 8'H2A; // CC.N = 0 -localparam INST_BMI = 8'H2B; // CC.N = 1 -localparam INST_BGE = 8'H2C; // CC.N = CC.V -localparam INST_BLT = 8'H2D; // CC.N != CC.V -localparam INST_BGT = 8'H2E; // CC.N = CC.V && CC.Z = 0 -localparam INST_BLE = 8'H2F; // CC.N != CC.V && CC.Z = 1 -localparam INST_BSR = 8'H8D; // always - -localparam NYB_BRA = 4'H0; // always -localparam NYB_BRN = 4'H1; // never -localparam NYB_BHI = 4'H2; // CC.Z = 0 && CC.C = 0 -localparam NYB_BLS = 4'H3; // CC.Z != 0 && CC.C != 0 -localparam NYB_BCC = 4'H4; // CC.C = 0 -localparam NYB_BHS = 4'H4; // same as BCC -localparam NYB_BCS = 4'H5; // CC.C = 1 -localparam NYB_BLO = 4'H5; // same as BCS -localparam NYB_BNE = 4'H6; // CC.Z = 0 -localparam NYB_BEQ = 4'H7; // CC.Z = 1 -localparam NYB_BVC = 4'H8; // V = 0 -localparam NYB_BVS = 4'H9; // V = 1 -localparam NYB_BPL = 4'HA; // CC.N = 0 -localparam NYB_BMI = 4'HB; // CC.N = 1 -localparam NYB_BGE = 4'HC; // CC.N = CC.V -localparam NYB_BLT = 4'HD; // CC.N != CC.V -localparam NYB_BGT = 4'HE; // CC.N = CC.V && CC.Z = 0 -localparam NYB_BLE = 4'HF; // CC.N != CC.V && CC.Z = 1 - - - -function take_branch(input [7:0] Inst1, input [7:0] cc); -begin - take_branch = 0; //default - if ( (Inst1 == INST_BSR) || (Inst1 == INST_LBSR) || (Inst1 == INST_LBRA) ) - take_branch = 1; - else - case (Inst1[3:0]) - NYB_BRA: - take_branch = 1; - NYB_BRN: - take_branch = 0; - NYB_BHI: - if ( ( cc[CC_Z_BIT] | cc[CC_C_BIT] ) == 0) - take_branch = 1; - NYB_BLS: - if ( cc[CC_Z_BIT] | cc[CC_C_BIT] ) - take_branch = 1; - NYB_BCC: - if ( cc[CC_C_BIT] == 0 ) - take_branch = 1; - NYB_BCS: - if ( cc[CC_C_BIT] == 1 ) - take_branch = 1; - NYB_BNE: - if ( cc[CC_Z_BIT] == 0 ) - take_branch = 1; - NYB_BEQ: - if ( cc[CC_Z_BIT] == 1 ) - take_branch = 1; - NYB_BVC: - if ( cc[CC_V_BIT] == 0) - take_branch = 1; - NYB_BVS: - if ( cc[CC_V_BIT] == 1) - take_branch = 1; - NYB_BPL: - if ( cc[CC_N_BIT] == 0 ) - take_branch = 1; - NYB_BMI: - if (cc[CC_N_BIT] == 1) - take_branch = 1; - NYB_BGE: - if ((cc[CC_N_BIT] ^ cc[CC_V_BIT]) == 0) - take_branch = 1; - NYB_BLT: - if ((cc[CC_N_BIT] ^ cc[CC_V_BIT]) == 1) - take_branch = 1; - NYB_BGT: - if ( ((cc[CC_N_BIT] ^ cc[CC_V_BIT]) == 0) & (cc[CC_Z_BIT] == 0) ) - take_branch = 1; - NYB_BLE: - if ( ((cc[CC_N_BIT] ^ cc[CC_V_BIT]) == 1) | (cc[CC_Z_BIT] == 1) ) - take_branch = 1; - endcase -end -endfunction - -wire TakeBranch = take_branch(Inst1, cc); - -///////////////////////////////////////////////////////////////////// -// Convenience function for knowing the contents for TFR, EXG -function [15:0] EXGTFRRegister(input [3:0] regid); -begin - case (regid) - EXGTFR_REG_D: - EXGTFRRegister = {a, b}; - EXGTFR_REG_X: - EXGTFRRegister = x; - EXGTFR_REG_Y: - EXGTFRRegister = y; - EXGTFR_REG_U: - EXGTFRRegister = u; - EXGTFR_REG_S: - EXGTFRRegister = s; - EXGTFR_REG_PC: - EXGTFRRegister = pc_p1; // For both EXG and TFR, this is used on the 2nd byte in the instruction's cycle. The PC intended to transfer is actually the next byte. - EXGTFR_REG_DP: - EXGTFRRegister = {8'HFF, dp}; - EXGTFR_REG_A: - EXGTFRRegister = {8'HFF, a}; - EXGTFR_REG_B: - EXGTFRRegister = {8'HFF, b}; - EXGTFR_REG_CC: - EXGTFRRegister = {8'HFF, cc}; - default: - EXGTFRRegister = 16'H0; - endcase -end -endfunction -wire [15:0] EXGTFRRegA = EXGTFRRegister(D[7:4]); -wire [15:0] EXGTFRRegB = EXGTFRRegister(D[3:0]); - -// CPU state machine -always @(*) -begin - rLIC = 1'b0; - rAVMA = 1'b1; - rBUSY = 1'b0; - - addr_nxt = 16'HFFFF; - pc_p1 = (pc+16'H1); - pc_p2 = (pc+16'H2); - pc_p3 = (pc+16'H3); - s_p1 = (s+16'H1); - s_m1 = (s-16'H1); - u_p1 = (u+16'H1); - u_m1 = (u-16'H1); - addr_p1 = (addr+16'H1); - ea_p1 = (ea+16'H1); - BS_nxt = 1'b0; - BA_nxt = 1'b0; - - // These may be overridden below, but the "next" version by default should be - // the last latched version. - IntType_nxt = IntType; - NMIClear_nxt = NMIClear; - NextState_nxt = NextState; - a_nxt = a; - b_nxt = b; - x_nxt = x; - y_nxt = y; - s_nxt = s; - u_nxt = u; - cc_nxt = cc; - dp_nxt = dp; - pc_nxt = pc; - tmp_nxt = tmp; - ea_nxt = ea; - - ALU_A = 8'H00; - ALU_B = 8'H00; - ALU_CC = 8'H00; - ALU_OP = 5'H00; - - ALU16_OP = 3'H0; - ALU16_A = 16'H0000; - ALU16_B = 16'H0000; - ALU16_CC = 8'H00; - - DOutput = 8'H00; - RnWOut = 1'b1; // read - - Inst1_nxt = Inst1; - Inst2_nxt = Inst2; - Inst3_nxt = Inst3; - InstPage2_nxt = InstPage2; - InstPage3_nxt = InstPage3; - - CpuState_nxt = CpuState; - - case (CpuState) - CPUSTATE_RESET: - begin - addr_nxt = 16'HFFFF; - a_nxt = 0; - b_nxt = 0; - x_nxt = 0; - y_nxt = 0; - s_nxt = 16'HFFFD; // Take care about removing the reset of S. There's logic depending on the delta between s and s_nxt to clear NMIMask. - u_nxt = 0; - cc_nxt = CC_F | CC_I; // reset disables interrupts - dp_nxt = 0; - ea_nxt = 16'HFFFF; - - RnWOut = 1; // read - rLIC = 1'b0; // Instruction incomplete - NMIClear_nxt= 1'b0; - IntType_nxt = 3'b111; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_RESET0; - end - - CPUSTATE_RESET0: - begin - addr_nxt = `RESET_VECTOR; - rBUSY = 1'b1; - pc_nxt[15:8] = D[7:0]; - BS_nxt = 1'b1; // ACK RESET - rAVMA = 1'b1; - rLIC = 1'b1; - CpuState_nxt = CPUSTATE_RESET2; - end - - CPUSTATE_RESET2: - begin - addr_nxt = addr_p1; - BS_nxt = 1'b1; // ACK RESET - pc_nxt[7:0] = D[7:0]; - rAVMA = 1'b1; - rLIC = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_FETCH_I1: - begin - if (~DMABREQLatched) - begin - addr_nxt = pc; - RnWOut = 1'b1; - rAVMA = 1'b0; - tmp_nxt = {tmp[15:4], 4'b1111}; - BS_nxt = 1'b1; - BA_nxt = 1'b1; - rLIC = 1'b1; - CpuState_nxt = CPUSTATE_DMABREQ; - end - else if (~HALTLatched) - begin - addr_nxt = pc; - RnWOut = 1'b1; - rAVMA = 1'b0; - BS_nxt = 1'b1; - BA_nxt = 1'b1; - rLIC = 1'b1; - CpuState_nxt = CPUSTATE_HALTED; - end - else // not halting, run the inst byte fetch - begin - addr_nxt = pc; // Set the address bus for the next instruction, first byte - pc_nxt = pc_p1; - RnWOut = 1; // Set for a READ - Inst1_nxt = MappedInstruction; - InstPage2_nxt = 0; - InstPage3_nxt = 0; - - // New instruction fetch; service interrupts pending - if (NMILatched == 0) - begin - pc_nxt = pc; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_NMI_START; - end - else if ((FIRQLatched == 0) && (cc[CC_F_BIT] == 0)) - begin - pc_nxt = pc; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FIRQ_START; - end - else if ((IRQLatched == 0) && (cc[CC_I_BIT] == 0)) - begin - pc_nxt = pc; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IRQ_START; - end - - // The actual 1st byte checks - else if (Inst1_nxt == 8'H10) // Page 2 Note, like the 6809, $10 $10 $10 $10 has the same effect as a single $10. - begin - InstPage2_nxt = 1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1V2; - end - else if (Inst1_nxt == 8'H11) // Page 3 - begin - InstPage3_nxt = 1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1V2; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I2; - end - end // if not halting - end - - CPUSTATE_FETCH_I1V2: - begin - addr_nxt = pc; // Set the address bus for the next instruction, first byte - pc_nxt = pc_p1; - RnWOut = 1; // Set for a READ - Inst1_nxt = MappedInstruction; - - if (Inst1_nxt == 8'H10) // Page 2 Note, like the 6809, $10 $10 $10 $10 has the same effect as a single $10. - begin - if (InstPage3 == 0) // $11 $11 $11 $11 ... $11 $10 still = Page 3 - InstPage2_nxt = 1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1V2; - end - else if (Inst1_nxt == 8'H11) // Page 3 - begin - if (InstPage2 == 0) // $10 $10 ... $10 $11 still = Page 2 - InstPage3_nxt = 1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1V2; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I2; - end - end - - - CPUSTATE_FETCH_I2: // We've fetched the first byte. If a $10 or $11 (page select), mark those flags and fetch the next byte as instruction byte 1. - begin - addr_nxt = addr_p1; // Address bus++ - pc_nxt = pc_p1; - Inst2_nxt = D[7:0]; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - - if (IsIllegalInstruction) // Skip illegal instructions - begin - - rAVMA = 1'b1; - CpuState_nxt = IllegalInstructionState; - rLIC = 1'b1; - end - else - begin - // First byte Decode for this stage - case (AddrModeType) - TYPE_INDEXED: - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_INDEXED_BASE; - end - - - TYPE_EXTENDED: - begin - ea_nxt[15:8] = Inst2_nxt; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_EXTENDED_ADDRLO; - end - TYPE_DIRECT: - begin - ea_nxt = {dp, Inst2_nxt}; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_DIRECT_DONTCARE; - end - - TYPE_INHERENT: - begin - if (Inst1 == OPCODE_INH_NOP) - begin - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else if (Inst1 == OPCODE_INH_DAA) // Bcd lunacy - begin - if ( ((cc[CC_C_BIT]) || (a[7:4] > 4'H9)) || - ((a[7:4] > 4'H8) && (a[3:0] > 4'H9)) ) - tmp_nxt[7:4] = 4'H6; - else - tmp_nxt[7:4] = 4'H0; - - if ((cc[CC_H_BIT]) || (a[3:0] > 4'H9)) - tmp_nxt[3:0] = 4'H6; - else - tmp_nxt[3:0] = 4'H0; - - // DAA handles carry in the weirdest way. - // If it's already set, it remains set, even if carry-out is 0. - // If it wasn't set, but the output of the operation is set, carry-out gets set. - {tmp_nxt[8], a_nxt} = {1'b0, a} + tmp_nxt[7:0]; - - cc_nxt[CC_C_BIT] = cc_nxt[CC_C_BIT] | tmp_nxt[8]; - - cc_nxt[CC_N_BIT] = a_nxt[7]; - cc_nxt[CC_Z_BIT] = (a_nxt == 8'H00); - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else if (Inst1 == OPCODE_INH_SYNC) - begin - CpuState_nxt = CPUSTATE_SYNC; - rLIC = 1'b1; - rAVMA = 1'b0; - end - else if (Inst1 == OPCODE_INH_MUL) - begin - tmp_nxt = 16'H0000; - ea_nxt[15:8] = 8'H00; - ea_nxt[7:0] = a; - a_nxt = 8; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_MUL_ACTION; - end - else if (Inst1 == OPCODE_INH_RTS) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_RTS_HI; - end - else if (Inst1 == OPCODE_INH_RTI) - begin - rAVMA = 1'b1; - tmp_nxt = 16'H1001; // Set tmp[12] to indicate an RTI being processed, and at least pull CC. - CpuState_nxt = CPUSTATE_PUL_ACTION; - NextState_nxt = CPUSTATE_FETCH_I1; - end - else if (Inst1 == OPCODE_INH_SWI) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_SWI_START; - end - else if (Inst1 == OPCODE_INH_CWAI) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_CWAI; - end - else if (Inst1 == OPCODE_INH_SEX) - begin - a_nxt = {8{b[7]}}; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else if (Inst1 == OPCODE_INH_ABX) - begin - x_nxt = x + b; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_ABX_DONTCARE; - end - else - begin - ALU_OP = ALU8Op; - if (IsTargetRegA) - ALU_A = a; - else - ALU_A = b; - - ALU_B = 0; - ALU_CC = cc; - cc_nxt = ALU[15:8]; - - if (ALU8Writeback) - begin - if (IsTargetRegA) - a_nxt = ALU[7:0]; - else - b_nxt = ALU[7:0]; - end - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - if (IsOneByteInstruction(Inst1)) // This check is probably superfluous. Every inherent instruction is 1 byte on the 6809. - pc_nxt = pc; // The 6809 auto-reads 2 bytes for every instruction. :( Adjust by not incrementing PC on the 2nd byte read. - end - - TYPE_IMMEDIATE: - begin - if (IsSpecialImmediate) - begin - if (Inst1 == OPCODE_IMM_ANDCC) - begin - pc_nxt = pc_p1; - cc_nxt = cc & D; //cc_nxt & Inst2_nxt; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_CC_DONTCARE; - end - else if (Inst1 == OPCODE_IMM_ORCC) - begin - pc_nxt = pc_p1; - cc_nxt = cc | D; //cc_nxt | Inst2_nxt; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_CC_DONTCARE; - end - else if ( (Inst1 == OPCODE_IMM_PSHS) | (Inst1 == OPCODE_IMM_PSHU) ) - begin - pc_nxt = pc_p1; - tmp_nxt[15] = 1'b0; - tmp_nxt[14] = Inst1[1]; // Mark whether to save to U or S. - tmp_nxt[13] = 1'b0; // Not pushing due to an interrupt. - tmp_nxt[13:8] = 6'H00; - tmp_nxt[7:0] = Inst2_nxt; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_PSH_DONTCARE1; - NextState_nxt = CPUSTATE_FETCH_I1; - end - else if ( (Inst1 == OPCODE_IMM_PULS) | (Inst1 == OPCODE_IMM_PULU) ) - begin - pc_nxt = pc_p1; - tmp_nxt[15] = 1'b0; - tmp_nxt[14] = Inst1[1]; // S (0) or U (1) stack in use. - tmp_nxt[13:8] = 6'H00; - tmp_nxt[7:0] = Inst2_nxt; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_PUL_DONTCARE1; - NextState_nxt = CPUSTATE_FETCH_I1; - end - else if (Inst1 == OPCODE_IMM_TFR) - begin - // The second byte lists the registers; Top nybble is reg #1, bottom is reg #2. - - case (Inst2_nxt[3:0]) - EXGTFR_REG_D: - {a_nxt,b_nxt} = EXGTFRRegA; - EXGTFR_REG_X: - x_nxt = EXGTFRRegA; - EXGTFR_REG_Y: - y_nxt = EXGTFRRegA; - EXGTFR_REG_U: - u_nxt = EXGTFRRegA; - EXGTFR_REG_S: - s_nxt = EXGTFRRegA; - EXGTFR_REG_PC: - pc_nxt = EXGTFRRegA; - EXGTFR_REG_DP: - dp_nxt = EXGTFRRegA[7:0]; - EXGTFR_REG_A: - a_nxt = EXGTFRRegA[7:0]; - EXGTFR_REG_B: - b_nxt = EXGTFRRegA[7:0]; - EXGTFR_REG_CC: - cc_nxt = EXGTFRRegA[7:0]; - default: - begin - end - endcase - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_TFR_DONTCARE1; - - end - else if (Inst1 == OPCODE_IMM_EXG) - begin - // The second byte lists the registers; Top nybble is reg #1, bottom is reg #2. - - case (Inst2_nxt[7:4]) - EXGTFR_REG_D: - {a_nxt,b_nxt} = EXGTFRRegB; - EXGTFR_REG_X: - x_nxt = EXGTFRRegB; - EXGTFR_REG_Y: - y_nxt = EXGTFRRegB; - EXGTFR_REG_U: - u_nxt = EXGTFRRegB; - EXGTFR_REG_S: - s_nxt = EXGTFRRegB; - EXGTFR_REG_PC: - pc_nxt = EXGTFRRegB; - EXGTFR_REG_DP: - dp_nxt = EXGTFRRegB[7:0]; - EXGTFR_REG_A: - a_nxt = EXGTFRRegB[7:0]; - EXGTFR_REG_B: - b_nxt = EXGTFRRegB[7:0]; - EXGTFR_REG_CC: - cc_nxt = EXGTFRRegB[7:0]; - default: - begin - end - endcase - case (Inst2_nxt[3:0]) - EXGTFR_REG_D: - {a_nxt,b_nxt} = EXGTFRRegA; - EXGTFR_REG_X: - x_nxt = EXGTFRRegA; - EXGTFR_REG_Y: - y_nxt = EXGTFRRegA; - EXGTFR_REG_U: - u_nxt = EXGTFRRegA; - EXGTFR_REG_S: - s_nxt = EXGTFRRegA; - EXGTFR_REG_PC: - pc_nxt = EXGTFRRegA; - EXGTFR_REG_DP: - dp_nxt = EXGTFRRegA[7:0]; - EXGTFR_REG_A: - a_nxt = EXGTFRRegA[7:0]; - EXGTFR_REG_B: - b_nxt = EXGTFRRegA[7:0]; - EXGTFR_REG_CC: - cc_nxt = EXGTFRRegA[7:0]; - default: - begin - end - endcase - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_EXG_DONTCARE1; - end - end - // Determine if this is an 8-bit ALU operation. - else if (Is8BitInst) - begin - ALU_OP = ALU8Op; - if (IsTargetRegA) - ALU_A = a; - else - ALU_A = b; - - ALU_B = Inst2_nxt; - ALU_CC = cc; - cc_nxt = ALU[15:8]; - - if (ALU8Writeback) - begin - if (IsTargetRegA) - a_nxt = ALU[7:0]; - else - b_nxt = ALU[7:0]; - end - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else // Then it must be a 16 bit instruction - begin - // 83 SUBD - // 8C CMPX - // 8E LDX - // C3 ADDD - // CC LDD - // CE LDU - // 108E CMPD - // 108C CMPY - // 108E LDY - // 10CE LDS - // 1183 CMPU - // 118C CMPS - // Wow, they were just stuffing them in willy-nilly ... - - // LD* 16 bit immediate - if (IsALU16Opcode) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_16IMM_LO; - end - // there's a dead zone here; I need an else to take us back to CPUSTATE_FETCHI1 if we want to ignore illegal instructions, to CPUSTATE_DEAD if we want to catch them. - - end - - end - - TYPE_RELATIVE: - begin - // Is this a LB** or a B**? - // If InstPage2 is set, it's a long branch; if clear, a normal branch. - if ( (InstPage2) || (Inst1 == INST_LBRA) || (Inst1 == INST_LBSR) ) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_LBRA_OFFSETLOW; - end - else - begin - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_BRA_DONTCARE; - end - - end - default: - begin - CpuState_nxt = CPUSTATE_FETCH_I1; - end - endcase - end - end - - - CPUSTATE_LBRA_OFFSETLOW: - begin - addr_nxt = pc; - pc_nxt = pc_p1; - Inst3_nxt = D[7:0]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_LBRA_DONTCARE; - end - - CPUSTATE_LBRA_DONTCARE: - begin - addr_nxt = 16'HFFFF; - if ( TakeBranch ) - begin - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_LBRA_DONTCARE2; - end - else - begin - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - end - - CPUSTATE_BRA_DONTCARE: - begin - addr_nxt = 16'HFFFF; - tmp_nxt = pc; - if (TakeBranch) - begin - pc_nxt = pc + { {8{Inst2[7]}}, Inst2[7:0]}; // Sign-extend the 8 bit offset to 16. - - if (Inst1 == INST_BSR) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_BSR_DONTCARE1; - end - else - begin - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - end - else - begin - rLIC = 1'b1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - end - - CPUSTATE_LBRA_DONTCARE2: - begin - tmp_nxt= pc; - addr_nxt = 16'HFFFF; - - // Take branch - pc_nxt = pc + {Inst2[7:0], Inst3[7:0]}; - if (Inst1 == INST_LBSR) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_BSR_DONTCARE1; - end - else - begin - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - end - - CPUSTATE_BSR_DONTCARE1: - begin - addr_nxt = pc; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_BSR_DONTCARE2; - end - - CPUSTATE_BSR_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_BSR_RETURNLOW; - end - - CPUSTATE_BSR_RETURNLOW: - begin - addr_nxt = s_m1; - s_nxt = s_m1; - DOutput[7:0] = tmp[7:0]; - RnWOut = 0; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_BSR_RETURNHIGH; - end - - CPUSTATE_BSR_RETURNHIGH: - begin - addr_nxt = s_m1; - s_nxt = s_m1; - DOutput[7:0] = tmp[15:8]; - RnWOut = 0; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; // after this, RnWOut must go to 1, and the bus needs the PC placed on it. - end - - CPUSTATE_TFR_DONTCARE1: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_TFR_DONTCARE2; - end - - CPUSTATE_TFR_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_TFR_DONTCARE3; - end - - CPUSTATE_TFR_DONTCARE3: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_TFR_DONTCARE4; - end - - CPUSTATE_TFR_DONTCARE4: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - rLIC = 1'b1; // Instruction done! - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_EXG_DONTCARE1: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_EXG_DONTCARE2; - end - - CPUSTATE_EXG_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_EXG_DONTCARE3; - end - - CPUSTATE_EXG_DONTCARE3: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_EXG_DONTCARE4; - end - - CPUSTATE_EXG_DONTCARE4: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_EXG_DONTCARE5; - end - - CPUSTATE_EXG_DONTCARE5: - begin - rAVMA = 1'b0; - addr_nxt = 16'HFFFF; - CpuState_nxt = CPUSTATE_EXG_DONTCARE6; - end - - CPUSTATE_EXG_DONTCARE6: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - rLIC = 1'b1; // Instruction done! - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_ABX_DONTCARE: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - rLIC = 1'b1; // Instruction done! - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_RTS_HI: - begin - addr_nxt = s; - s_nxt = s_p1; - pc_nxt[15:8] = D[7:0]; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_RTS_LO; - end - - CPUSTATE_RTS_LO: - begin - addr_nxt = s; - s_nxt = s_p1; - pc_nxt[7:0] = D[7:0]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_RTS_DONTCARE2; - end - - CPUSTATE_RTS_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_16IMM_LO: - begin - addr_nxt = pc; - pc_nxt = pc_p1; - - ALU16_OP = ALU16Opcode; - ALU16_CC = cc; - ALU16_B = {Inst2, D[7:0]}; - - case (ALU16Reg) - ALU16_REG_X: - ALU16_A = x; - ALU16_REG_D: - ALU16_A = {a, b}; - ALU16_REG_Y: - ALU16_A = y; - ALU16_REG_U: - ALU16_A = u; - ALU16_REG_S: - ALU16_A = s; - default: - ALU16_A = 16'H0; - endcase - - if (ALU16OpWriteback) - begin - case (ALU16Reg) - ALU16_REG_X: - {cc_nxt, x_nxt} = ALU16; - ALU16_REG_D: - {cc_nxt, a_nxt, b_nxt} = ALU16; - ALU16_REG_Y: - {cc_nxt, y_nxt} = ALU16; - ALU16_REG_U: - {cc_nxt, u_nxt} = ALU16; - ALU16_REG_S: - {cc_nxt, s_nxt} = ALU16; - default: - begin - end - endcase - end - else - cc_nxt = ALU16[23:16]; - - if (ALU16_OP == ALUOP16_LD) - begin - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else - begin - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_16IMM_DONTCARE; - end - end - - CPUSTATE_DIRECT_DONTCARE: - begin - addr_nxt = 16'HFFFF; - - if (IsJMP(Inst1)) - begin - pc_nxt = ea; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_ALU_EA; - end - end - - CPUSTATE_ALU_EA: - begin - - // Is Figure 18/5 Column 2? JMP (not Immediate Mode) - // This actually isn't done here. All checks passing in to ALU_EA should check for a JMP; FIXME EVERYWHERE - - // Is Figure 18/5 Column 8? TST (not immediate mode) - // THIS IS BURIED IN THE COLUMN 3 section with comparisons to ALUOP_TST. - - // Is Figure 18/5 Column 3? - if (IsALU8Set1(Inst1)) - begin - addr_nxt = ea; - - ALU_OP = ALU8Op; - ALU_B = D[7:0]; - ALU_CC = cc; - - if (IsTargetRegA) - ALU_A = a; - else - ALU_A = b; - - cc_nxt = ALU[15:8]; - - if ( (ALU8Writeback) ) - begin - if (IsTargetRegA) - a_nxt = ALU[7:0]; - else - b_nxt = ALU[7:0]; - end - - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - // Is Figure 18/5 Column 4? (Store, 8 bits) - else if (IsStore8) - begin - addr_nxt = ea; - RnWOut = 0; // write - - ALU_OP = ALUOP_LD; // load has the same CC characteristics as store - ALU_A = 8'H00; - ALU_CC = cc; - - case (Store8RegisterNum) - ST8_REG_A: - begin - DOutput = a; - ALU_B = a; - end - ST8_REG_B: - begin - DOutput = b; - ALU_B = b; - end - - - endcase - - cc_nxt = ALU[15:8]; - - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - // Is Figure 18/5 Column 5? (Load, 16 bits) - else if (IsALU16Opcode & (ALU16Opcode == ALUOP16_LD)) - begin - addr_nxt = ea; - ea_nxt = ea_p1; - - case (ALU16Reg) - ALU16_REG_X: - x_nxt[15:8] = D[7:0]; - ALU16_REG_D: - a_nxt = D[7:0]; - ALU16_REG_Y: - y_nxt[15:8] = D[7:0]; - ALU16_REG_S: - s_nxt[15:8] = D[7:0]; - ALU16_REG_U: - u_nxt[15:8] = D[7:0]; - default: - begin - end - endcase - rAVMA = 1'b1; - rBUSY = 1'b1; - CpuState_nxt = CPUSTATE_LD16_LO; - - end - - // Is Figure 18/5 Column 6? (Store, 16 bits) - else if (IsStore16) - begin - addr_nxt = ea; - ea_nxt = ea_p1; - - ALU16_OP = ALUOP16_LD; // LD and ST have the same CC characteristics - ALU16_CC = cc; - ALU16_A = 8'H00; - - case (StoreRegisterNum) - ST16_REG_X: - begin - DOutput[7:0] = x[15:8]; - ALU16_B = x; - end - ST16_REG_Y: - begin - DOutput[7:0] = y[15:8]; - ALU16_B = y; - end - ST16_REG_U: - begin - DOutput[7:0] = u[15:8]; - ALU16_B = u; - end - ST16_REG_S: - begin - DOutput[7:0] = s[15:8]; - ALU16_B = s; - end - ST16_REG_D: - begin - DOutput[7:0] = a[7:0]; - ALU16_B = {a,b}; - end - default: - begin - end - endcase - - cc_nxt = ALU16[23:16]; - - RnWOut = 0; // Write - rAVMA = 1'b1; - rBUSY = 1'b1; - CpuState_nxt = CPUSTATE_ST16_LO; - end - - // Is Figure 18/5 Column 7? - else if (IsALU8Set0(Inst1)) - begin - // These are registerless instructions, ala - // ASL, ASR, CLR, COM, DEC, INC, (LSL), LSR, NEG, ROL, ROR - // and TST (special!) - // They require READ, Modify (the operation above), WRITE. Between the Read and the Write cycles, there's actually a /VMA - // cycle where the 6809 likely did the operation. We'll include a /VMA cycle for accuracy, but we'll do the work primarily in the first cycle. - addr_nxt = ea; - - ALU_OP = ALU8Op; - ALU_A = D[7:0]; - ALU_CC = cc; - tmp_nxt[15:8] = cc; // for debug only - tmp_nxt[7:0] = ALU[7:0]; - cc_nxt = ALU[15:8]; - if (ALU8Op == ALUOP_TST) - begin - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_TST_DONTCARE1; - end - else - begin - rAVMA = 1'b0; - rBUSY = 1'b1; - CpuState_nxt = CPUSTATE_ALU_DONTCARE; - end - - end - - // Is Figure 18/5 Column 8? TST - // NOTE: - // THIS IS BURIED IN THE COLUMN 3 section with comparisons to ALUOP_TST. [Directly above.] - - - // Is Figure 18/5 Column 9? (16-bit ALU ops, non-load) - else if (IsALU16Opcode && (ALU16Opcode != ALUOP16_LD) && ((Inst1 < 8'H30) || (Inst1 > 8'H33)) ) // 30-33 = LEAX, LEAY, LEAS, LEAU; don't include them here. - begin - addr_nxt = ea; - ea_nxt = ea_p1; - - tmp_nxt[15:8] = D[7:0]; - rAVMA = 1'b1; - rBUSY = 1'b1; - CpuState_nxt = CPUSTATE_ALU16_LO; - - end - - // Is Figure 18/5 Column 10? JSR (not Immediate Mode) - else if ((Inst1 == 8'H9D) || (Inst1 == 8'HAD) || (Inst1 == 8'HBD)) // JSR - begin - pc_nxt = ea; - addr_nxt = ea; - tmp_nxt = pc; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_JSR_DONTCARE; - end - // Is Figure 18/5 Column 11? LEA(X,Y,S,U) - else if ((Inst1 >= 8'H30) && (Inst1<= 8'H33)) - begin - addr_nxt = 16'HFFFF; // Ack, actually a valid cycle, this isn't a dontcare (/VMA) cycle! - - ALU16_OP = ALU16Opcode; - ALU16_CC = cc; - ALU16_A = ea; - - case (ALU16Reg) - ALU16_REG_X: - {cc_nxt, x_nxt} = ALU16; - ALU16_REG_Y: - {cc_nxt, y_nxt} = ALU16; - ALU16_REG_U: - u_nxt = ALU16[15:0]; - ALU16_REG_S: - s_nxt = ALU16[15:0]; - default: - begin - end - endcase - - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - - end - - end - - - CPUSTATE_ALU_DONTCARE: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - rBUSY = 1'b1; // We do nothing here, but on the real 6809, they did the modify phase here. :| - CpuState_nxt = CPUSTATE_ALU_WRITEBACK; - end - - CPUSTATE_ALU_WRITEBACK: - begin - addr_nxt = ea; - RnWOut = 0; // Write - DOutput = tmp[7:0]; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_LD16_LO: - begin - addr_nxt = ea; - - case (ALU16Reg) - ALU16_REG_X: - begin - x_nxt[7:0] = D[7:0]; - ALU16_B[15:8] = x[15:8]; - end - ALU16_REG_D: - begin - b_nxt = D[7:0]; - ALU16_B[15:8] = a; - end - ALU16_REG_Y: - begin - y_nxt[7:0] = D[7:0]; - ALU16_B[15:8] = y[15:8]; - end - ALU16_REG_S: - begin - s_nxt[7:0] = D[7:0]; - ALU16_B[15:8] = s[15:8]; - end - ALU16_REG_U: - begin - u_nxt[7:0] = D[7:0]; - ALU16_B[15:8] = u[15:8]; - end - default: - begin - end - - endcase - - ALU16_OP = ALU16Opcode; - ALU16_CC = cc; - ALU16_A = 8'H00; - ALU16_B[7:0] = D[7:0]; - cc_nxt = ALU16[23:16]; - - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_ST16_LO: - begin - addr_nxt = ea; - ea_nxt = ea_p1; - case (StoreRegisterNum) - ST16_REG_X: - DOutput[7:0] = x[7:0]; - ST16_REG_Y: - DOutput[7:0] = y[7:0]; - ST16_REG_U: - DOutput[7:0] = u[7:0]; - ST16_REG_S: - DOutput[7:0] = s[7:0]; - ST16_REG_D: - DOutput[7:0] = b[7:0]; - default: - begin - end - endcase - RnWOut = 0; // write - - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_ALU16_LO: - begin - addr_nxt = ea; - - ALU16_OP = ALU16Opcode; - ALU16_CC = cc; - - ALU16_B = {tmp[15:8], D[7:0]}; - - case (ALU16Reg) - ALU16_REG_X: - ALU16_A = x; - ALU16_REG_D: - ALU16_A = {a, b}; - ALU16_REG_Y: - ALU16_A = y; - ALU16_REG_S: - ALU16_A = s; - ALU16_REG_U: - ALU16_A = u; - default: - ALU16_A = 16'H0; - - endcase - - if (ALU16OpWriteback) - begin - case (ALU16Reg) - ALU16_REG_X: - {cc_nxt, x_nxt} = ALU16; - ALU16_REG_D: - {cc_nxt, a_nxt, b_nxt} = ALU16; - ALU16_REG_Y: - {cc_nxt, y_nxt} = ALU16; - ALU16_REG_U: - {cc_nxt, u_nxt} = ALU16; - ALU16_REG_S: - {cc_nxt, s_nxt} = ALU16; - default: - begin - end - endcase - end - else - cc_nxt = ALU16[23:16]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_ALU16_DONTCARE; - end - - CPUSTATE_ALU16_DONTCARE: - begin - addr_nxt = 16'HFFFF; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - - CPUSTATE_JSR_DONTCARE: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_JSR_RETLO; - end - - CPUSTATE_JSR_RETLO: - begin - addr_nxt = s_m1; - s_nxt = s_m1; - RnWOut = 0; - DOutput = tmp[7:0]; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_JSR_RETHI; - end - - CPUSTATE_JSR_RETHI: - begin - addr_nxt = s_m1; - s_nxt = s_m1; - RnWOut = 0; - DOutput = tmp[15:8]; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_EXTENDED_ADDRLO: - begin - addr_nxt = pc; - pc_nxt = pc_p1; - ea_nxt[7:0] = D[7:0]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_EXTENDED_DONTCARE; - end - - CPUSTATE_EXTENDED_DONTCARE: - begin - addr_nxt = 16'HFFFF; - if (IsJMP(Inst1)) - begin - pc_nxt = ea; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_ALU_EA; - end - end - - CPUSTATE_INDEXED_BASE: - begin - addr_nxt = pc; - - Inst3_nxt = D[7:0]; - - case (IndexedRegister) - IDX_REG_X: - ALU16_A = x; - IDX_REG_Y: - ALU16_A = y; - IDX_REG_U: - ALU16_A = u; - IDX_REG_S: - ALU16_A = s; - IDX_REG_PC: - ALU16_A = pc_p1; - default: - ALU16_A = 16'H0; - endcase - ALU16_OP = ALUOP16_ADD; - - case (IndexedMode) - IDX_MODE_NOOFFSET: - begin - case (IndexedRegister) - IDX_REG_X: - ea_nxt = x; - IDX_REG_Y: - ea_nxt = y; - IDX_REG_U: - ea_nxt = u; - IDX_REG_S: - ea_nxt = s; - default: - ea_nxt = 16'H0; - endcase - - if (IndexedIndirect) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_INDIRECT_HI; - end - else - begin - if (IsJMP(Inst1)) - begin - pc_nxt = ea_nxt; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_ALU_EA; - end - end - end - - IDX_MODE_5BIT_OFFSET: - begin - // The offset is the bottom 5 bits of the Index Postbyte, which is Inst2 here. - // We'll sign-extend it to 16 bits. - ALU16_B = { {11{Inst2[4]}}, Inst2[4:0] }; - ea_nxt = ALU16[15:0]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_DONTCARE3; - end - - - IDX_MODE_8BIT_OFFSET_PC: - begin - ALU16_B = { {8{D[7]}}, D[7:0] }; - pc_nxt = pc_p1; - ea_nxt = ALU16[15:0]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_DONTCARE3; - end - - IDX_MODE_8BIT_OFFSET: - begin - ALU16_B = { {8{D[7]}}, D[7:0] }; - pc_nxt = pc_p1; - ea_nxt = ALU16[15:0]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_DONTCARE3; - end - - IDX_MODE_A_OFFSET: - begin - ALU16_B = { {8{a[7]}}, a[7:0] }; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_DONTCARE3; - ea_nxt = ALU16[15:0]; - end - - IDX_MODE_B_OFFSET: - begin - ALU16_B = { {8{b[7]}}, b[7:0] }; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_DONTCARE3; - ea_nxt = ALU16[15:0]; - end - - IDX_MODE_D_OFFSET: - begin - ALU16_B = {a, b}; - - ea_nxt = ALU16[15:0]; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_DOFF_DONTCARE1; - end - - IDX_MODE_POSTINC1: - begin - ALU16_B = 16'H1; - ea_nxt = ALU16_A; - case (IndexedRegister) - IDX_REG_X: - x_nxt = ALU16[15:0]; - IDX_REG_Y: - y_nxt = ALU16[15:0]; - IDX_REG_U: - u_nxt = ALU16[15:0]; - IDX_REG_S: - s_nxt = ALU16[15:0]; - default: - begin - end - endcase - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE2; - end - - IDX_MODE_POSTINC2: - begin - ALU16_B = 16'H2; - ea_nxt = ALU16_A; - case (IndexedRegister) - IDX_REG_X: - x_nxt = ALU16[15:0]; - IDX_REG_Y: - y_nxt = ALU16[15:0]; - IDX_REG_U: - u_nxt = ALU16[15:0]; - IDX_REG_S: - s_nxt = ALU16[15:0]; - default: - begin - end - endcase - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE0; - end - - IDX_MODE_PREDEC1: - begin - ALU16_B = 16'HFFFF; // -1 - case (IndexedRegister) - IDX_REG_X: - x_nxt = ALU16[15:0]; - IDX_REG_Y: - y_nxt = ALU16[15:0]; - IDX_REG_U: - u_nxt = ALU16[15:0]; - IDX_REG_S: - s_nxt = ALU16[15:0]; - default: - begin - end - endcase - ea_nxt = ALU16[15:0]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE2; - end - - IDX_MODE_PREDEC2: - begin - ALU16_B = 16'HFFFE; // -2 - case (IndexedRegister) - IDX_REG_X: - x_nxt = ALU16[15:0]; - IDX_REG_Y: - y_nxt = ALU16[15:0]; - IDX_REG_U: - u_nxt = ALU16[15:0]; - IDX_REG_S: - s_nxt = ALU16[15:0]; - default: - begin - end - endcase - ea_nxt = ALU16[15:0]; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE0; - end - - IDX_MODE_16BIT_OFFSET_PC: - begin - tmp_nxt[15:8] = D[7:0]; - pc_nxt = pc_p1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_16OFFSET_LO; - end - - IDX_MODE_16BIT_OFFSET: - begin - tmp_nxt[15:8] = D[7:0]; - pc_nxt = pc_p1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_16OFFSET_LO; - end - - IDX_MODE_EXTENDED_INDIRECT: - begin - ea_nxt[15:8] = D[7:0]; - pc_nxt = pc_p1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_EXTIND_LO; - end - - default: - begin - rLIC = 1'b1; - CpuState_nxt = PostIllegalState; - end - - endcase - end - - CPUSTATE_IDX_OFFSET_LO: - begin - tmp_nxt[7:0] = D[7:0]; - addr_nxt = pc; - pc_nxt = pc_p1; - ALU16_B = tmp_nxt; - - case (IndexedRegister) - IDX_REG_X: - ALU16_A = x; - IDX_REG_Y: - ALU16_A = y; - IDX_REG_U: - ALU16_A = u; - IDX_REG_S: - ALU16_A = s; - IDX_REG_PC: - ALU16_A = pc; - default: - ALU16_A = 16'H0; - endcase - ALU16_OP = ALUOP16_ADD; - - ea_nxt = ALU16[15:0]; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE1; - end - - - CPUSTATE_IDX_DONTCARE3: - begin - addr_nxt = 16'HFFFF; - if (IndexedIndirect) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_INDIRECT_HI; - end - else - begin - if (IsJMP(Inst1)) - begin - pc_nxt = ea; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_ALU_EA; - end - end - - end - - CPUSTATE_IDX_16OFFSET_LO: - begin - addr_nxt = pc; - pc_nxt = pc_p1; - - case (IndexedRegister) - IDX_REG_X: - ALU16_A = x; - IDX_REG_Y: - ALU16_A = y; - IDX_REG_U: - ALU16_A = u; - IDX_REG_S: - ALU16_A = s; - IDX_REG_PC: - ALU16_A = pc_nxt; // Whups; tricky; not part of the actual pattern - default: - ALU16_A = x; // Default to something - endcase - - ALU16_OP = ALUOP16_ADD; - - ALU16_B = {tmp[15:8], D[7:0]}; - - ea_nxt = ALU16[15:0]; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE1; - end - - CPUSTATE_IDX_16OFF_DONTCARE1: - begin - addr_nxt = pc; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE2; - end - - CPUSTATE_IDX_16OFF_DONTCARE0: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE2; - end - - CPUSTATE_IDX_16OFF_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - if (IndexedRegister == IDX_REG_PC) - begin - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_PC16OFF_DONTCARE; - end - else - begin - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE3; - end - end - - CPUSTATE_IDX_PC16OFF_DONTCARE: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE3; - end - - - CPUSTATE_IDX_16OFF_DONTCARE3: - begin - addr_nxt = 16'HFFFF; - if (IndexedIndirect) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_INDIRECT_HI; - end - else - begin - if (IsJMP(Inst1)) - begin - pc_nxt = ea; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_ALU_EA; - end - end - end - - CPUSTATE_IDX_DOFF_DONTCARE1: - begin - addr_nxt = pc_p1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_DOFF_DONTCARE2; - end - - CPUSTATE_IDX_DOFF_DONTCARE2: - begin - addr_nxt = pc_p2; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IDX_16OFF_DONTCARE2; - end - - CPUSTATE_IDX_DOFF_DONTCARE3: - begin - addr_nxt = pc_p3; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_DOFF_DONTCARE2; - end - - CPUSTATE_IDX_EXTIND_LO: - begin - ea_nxt[7:0] = D[7:0]; - addr_nxt = pc; - pc_nxt = pc_p1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IDX_EXTIND_DONTCARE; - end - - CPUSTATE_IDX_EXTIND_DONTCARE: - begin - addr_nxt = pc; - if (IndexedIndirect) - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_INDIRECT_HI; - end - else - begin - if (IsJMP(Inst1)) - begin - pc_nxt = ea; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_ALU_EA; - end - end - end - - CPUSTATE_INDIRECT_HI: - begin - addr_nxt = ea; - tmp_nxt[15:8] = D[7:0]; - rAVMA = 1'b1; - rBUSY = 1'b1; - CpuState_nxt = CPUSTATE_INDIRECT_LO; - end - - CPUSTATE_INDIRECT_LO: - begin - addr_nxt = ea_p1; - ea_nxt[15:8] = tmp_nxt[15:8]; - ea_nxt[7:0] = D[7:0]; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_INDIRECT_DONTCARE; - end - - CPUSTATE_INDIRECT_DONTCARE: - begin - addr_nxt = 16'HFFFF; - if (IsJMP(Inst1)) - begin - pc_nxt = ea; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - else - begin - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_ALU_EA; - end - end - - CPUSTATE_MUL_ACTION: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - // tmp = result - // ea = additor (the shifted multiplicand) - // a = counter - // b is the multiplier (which gets shifted right) - if (a != 8'H00) - begin - if (b[0]) - begin - tmp_nxt = tmp + ea; - end - ea_nxt = {ea[14:0], 1'b0}; - b_nxt = {1'b0, b[7:1]}; - a_nxt = a - 8'H1; - end - else - begin - {a_nxt, b_nxt} = tmp; - - cc_nxt[CC_Z_BIT] = (tmp == 0); - cc_nxt[CC_C_BIT] = tmp[7]; - rLIC = 1'b1; // Instruction done! - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - end - - CPUSTATE_PSH_DONTCARE1: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_PSH_DONTCARE2; - end - - CPUSTATE_PSH_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_PSH_DONTCARE3; - end - - CPUSTATE_PSH_DONTCARE3: - begin - addr_nxt = (Inst1[1]) ? u : s; - - CpuState_nxt = CPUSTATE_PSH_ACTION; - end - - CPUSTATE_PSH_ACTION: - begin - rAVMA = 1'b1; - if (tmp[7] & ~(tmp[15])) // PC_LO - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = pc[7:0]; - RnWOut = 1'b0; // write - tmp_nxt[15] = 1'b1; - end - else if (tmp[7] & (tmp[15])) // PC_HI - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = pc[15:8]; - RnWOut = 1'b0; // write - tmp_nxt[7] = 1'b0; - tmp_nxt[15] = 1'b0; - end - else if (tmp[6] & ~(tmp[15])) // U/S_LO - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = (tmp[14]) ? s[7:0] : u[7:0]; - RnWOut = 1'b0; // write - tmp_nxt[15] = 1'b1; - end - else if (tmp[6] & (tmp[15])) // U/S_HI - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = (tmp[14]) ? s[15:8] : u[15:8]; - RnWOut = 1'b0; // write - tmp_nxt[6] = 1'b0; - tmp_nxt[15] = 1'b0; - end - else if (tmp[5] & ~(tmp[15])) // Y_LO - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = y[7:0]; - RnWOut = 1'b0; // write - tmp_nxt[15] = 1'b1; - end - else if (tmp[5] & (tmp[15])) // Y_HI - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = y[15:8]; - RnWOut = 1'b0; // write - tmp_nxt[5] = 1'b0; - tmp_nxt[15] = 1'b0; - end - else if (tmp[4] & ~(tmp[15])) // X_LO - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = x[7:0]; - RnWOut = 1'b0; // write - tmp_nxt[15] = 1'b1; - end - else if (tmp[4] & (tmp[15])) // X_HI - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = x[15:8]; - RnWOut = 1'b0; // write - tmp_nxt[4] = 1'b0; - tmp_nxt[15] = 1'b0; - end - else if (tmp[3]) // DP - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = dp; - RnWOut = 1'b0; // write - tmp_nxt[3] = 1'b0; - end - else if (tmp[2]) // B - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = b; - RnWOut = 1'b0; // write - tmp_nxt[2] = 1'b0; - end - else if (tmp[1]) // A - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = a; - RnWOut = 1'b0; // write - tmp_nxt[1] = 1'b0; - end - else if (tmp[0]) // CC - begin - addr_nxt = (tmp[14]) ? u_m1 : s_m1; - if (tmp[14]) - u_nxt = u_m1; - else - s_nxt = s_m1; - DOutput = cc; - RnWOut = 1'b0; // write - tmp_nxt[0] = 1'b0; - end - if (tmp[13]) // Then we're pushing for an IRQ, and LIC is supposed to be set. - rLIC = 1'b1; - if (tmp_nxt[7:0] == 8'H00) - begin - if (NextState == CPUSTATE_FETCH_I1) - begin - rAVMA = 1'b1; - rLIC = 1'b1; - end - else - rAVMA = 1'b0; - CpuState_nxt = NextState; - end - end - - CPUSTATE_PUL_DONTCARE1: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_PUL_DONTCARE2; - end - - CPUSTATE_PUL_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_PUL_ACTION; - end - - CPUSTATE_PUL_ACTION: - begin - rAVMA = 1'b1; - if (tmp[0]) // CC - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - cc_nxt = D[7:0]; - if (tmp[12] == 1'b1) // This pull is from an RTI, the E flag comes from the retrieved CC, and set the tmp_nxt accordingly, indicating what other registers to retrieve - begin - if (D[CC_E_BIT]) - tmp_nxt[7:0] = 8'HFE; // Retrieve all registers (ENTIRE) [CC is already retrieved] - else - tmp_nxt[7:0] = 8'H80; // Retrieve PC and CC [CC is already retrieved] - end - else - tmp_nxt[0] = 1'b0; - end - else if (tmp[1]) // A - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - a_nxt = D[7:0]; - tmp_nxt[1] = 1'b0; - end - else if (tmp[2]) // B - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - b_nxt = D[7:0]; - tmp_nxt[2] = 1'b0; - end - else if (tmp[3]) // DP - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - dp_nxt = D[7:0]; - tmp_nxt[3] = 1'b0; - end - else if (tmp[4] & (~tmp[15])) // X_HI - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - x_nxt[15:8] = D[7:0]; - tmp_nxt[15] = 1'b1; - end - else if (tmp[4] & tmp[15]) // X_LO - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - x_nxt[7:0] = D[7:0]; - tmp_nxt[4] = 1'b0; - tmp_nxt[15] = 1'b0; - end - else if (tmp[5] & (~tmp[15])) // Y_HI - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - y_nxt[15:8] = D[7:0]; - tmp_nxt[15] = 1'b1; - end - else if (tmp[5] & tmp[15]) // Y_LO - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - y_nxt[7:0] = D[7:0]; - tmp_nxt[5] = 1'b0; - tmp_nxt[15] = 1'b0; - end - else if (tmp[6] & (~tmp[15])) // U/S_HI - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - if (tmp[14]) - s_nxt[15:8] = D[7:0]; - else - u_nxt[15:8] = D[7:0]; - tmp_nxt[15] = 1'b1; - end - else if (tmp[6] & tmp[15]) // U/S_LO - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - if (tmp[14]) - s_nxt[7:0] = D[7:0]; - else - u_nxt[7:0] = D[7:0]; - tmp_nxt[6] = 1'b0; - tmp_nxt[15] = 1'b0; - end - else if (tmp[7] & (~tmp[15])) // PC_HI - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - pc_nxt[15:8] = D[7:0]; - tmp_nxt[15] = 1'b1; - end - else if (tmp[7] & tmp[15]) // PC_LO - begin - addr_nxt = (tmp[14]) ? u : s; - if (tmp[14]) - u_nxt = u_p1; - else - s_nxt = s_p1; - pc_nxt[7:0] = D[7:0]; - tmp_nxt[7] = 1'b0; - tmp_nxt[15] = 1'b0; - end - else - begin - addr_nxt = (tmp[14]) ? u : s; - if (NextState == CPUSTATE_FETCH_I1) - begin - rAVMA = 1'b1; - rLIC = 1'b1; - end - else - rAVMA = 1'b0; - CpuState_nxt = NextState; - end - end - - CPUSTATE_NMI_START: - begin - NMIClear_nxt = 1'b1; - addr_nxt = pc; - // tmp stands as the bits to push to the stack - tmp_nxt = 16'H20FF; // Save to the S stack, PC, U, Y, X, DP, B, A, CC; set LIC on every push - NextState_nxt = CPUSTATE_IRQ_DONTCARE2; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_IRQ_DONTCARE; - IntType_nxt = INTTYPE_NMI; - cc_nxt[CC_E_BIT] = 1'b1; - end - - CPUSTATE_IRQ_START: - begin - addr_nxt = pc; - tmp_nxt = 16'H20FF; // Save to the S stack, PC, U, Y, X, DP, B, A, CC; set LIC on every push - NextState_nxt = CPUSTATE_IRQ_DONTCARE2; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IRQ_DONTCARE; - IntType_nxt = INTTYPE_IRQ; - cc_nxt[CC_E_BIT] = 1'b1; - end - - CPUSTATE_FIRQ_START: - begin - addr_nxt = pc; - tmp_nxt = 16'H2081; // Save to the S stack, PC, CC; set LIC on every push - NextState_nxt = CPUSTATE_IRQ_DONTCARE2; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IRQ_DONTCARE; - IntType_nxt = INTTYPE_FIRQ; - cc_nxt[CC_E_BIT] = 1'b0; - end - - CPUSTATE_SWI_START: - begin - addr_nxt = pc; - tmp_nxt = 16'H00FF; // Save to the S stack, PC, U, Y, X, DP, B, A, CC - - NextState_nxt = CPUSTATE_IRQ_DONTCARE2; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IRQ_DONTCARE; - if (InstPage3) - IntType_nxt = INTTYPE_SWI3; - if (InstPage2) - IntType_nxt = INTTYPE_SWI2; - else - IntType_nxt = INTTYPE_SWI; - - cc_nxt[CC_E_BIT] = 1'b1; - end - - CPUSTATE_IRQ_DONTCARE: - begin - NMIClear_nxt = 1'b0; - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_PSH_ACTION; - end - - - CPUSTATE_IRQ_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_IRQ_VECTOR_HI; - rLIC = 1'b1; - end - - CPUSTATE_IRQ_VECTOR_HI: - begin - case (IntType) - INTTYPE_NMI: - begin - addr_nxt = `NMI_VECTOR; - BS_nxt = 1'b1; // ACK Interrupt - end - INTTYPE_IRQ: - begin - addr_nxt = `IRQ_VECTOR; - BS_nxt = 1'b1; // ACK Interrupt - end - INTTYPE_SWI: - begin - addr_nxt = `SWI_VECTOR; - end - INTTYPE_FIRQ: - begin - addr_nxt = `FIRQ_VECTOR; - BS_nxt = 1'b1; // ACK Interrupt - end - INTTYPE_SWI2: - begin - addr_nxt = `SWI2_VECTOR; - end - INTTYPE_SWI3: - begin - addr_nxt = `SWI3_VECTOR; - end - default: // make the default an IRQ, even though it really should never happen - begin - addr_nxt = `IRQ_VECTOR; - BS_nxt = 1'b1; // ACK Interrupt - end - endcase - - pc_nxt[15:8] = D[7:0]; - rAVMA = 1'b1; - rBUSY = 1'b1; - rLIC = 1'b1; - CpuState_nxt = CPUSTATE_IRQ_VECTOR_LO; - - - end - - CPUSTATE_IRQ_VECTOR_LO: - begin - case (IntType) - INTTYPE_NMI: - begin - addr_nxt = `NMI_VECTOR+16'H1; - cc_nxt[CC_I_BIT] = 1'b1; - cc_nxt[CC_F_BIT] = 1'b1; - BS_nxt = 1'b1; // ACK Interrupt - end - INTTYPE_IRQ: - begin - addr_nxt = `IRQ_VECTOR+16'H1; - cc_nxt[CC_I_BIT] = 1'b1; - BS_nxt = 1'b1; // ACK Interrupt - end - INTTYPE_SWI: - begin - addr_nxt = `SWI_VECTOR+16'H1; - cc_nxt[CC_F_BIT] = 1'b1; - cc_nxt[CC_I_BIT] = 1'b1; - rLIC = 1'b1; - end - INTTYPE_FIRQ: - begin - addr_nxt = `FIRQ_VECTOR+16'H1; - cc_nxt[CC_F_BIT] = 1'b1; - cc_nxt[CC_I_BIT] = 1'b1; - BS_nxt = 1'b1; // ACK Interrupt - end - INTTYPE_SWI2: - begin - addr_nxt = `SWI2_VECTOR+16'H1; - rLIC = 1'b1; - end - INTTYPE_SWI3: - begin - addr_nxt = `SWI3_VECTOR+16'H1; - rLIC = 1'b1; - end - default: - begin - end - endcase - - pc_nxt[7:0] = D[7:0]; - rAVMA = 1'b1; - rLIC = 1'b1; - CpuState_nxt = CPUSTATE_INT_DONTCARE; - end - - CPUSTATE_INT_DONTCARE: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - rLIC = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_CC_DONTCARE: - begin - addr_nxt = pc; - rLIC = 1'b1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_TST_DONTCARE1: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_TST_DONTCARE2; - end - - CPUSTATE_TST_DONTCARE2: - begin - addr_nxt = 16'HFFFF; - rLIC = 1'b1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_DEBUG: - begin - addr_nxt = tmp; - rLIC = 1'b1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_16IMM_DONTCARE: - begin - addr_nxt = 16'HFFFF; - rLIC = 1'b1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_SYNC: - begin - addr_nxt = 16'HFFFF; - BA_nxt = 1'b1; - rLIC = 1'b1; - rAVMA = 1'b0; - - if (~(NMILatched & FIRQLatched & IRQLatched)) - begin - CpuState_nxt = CPUSTATE_SYNC_EXIT; - end - end - - CPUSTATE_SYNC_EXIT: - begin - addr_nxt = 16'HFFFF; - BA_nxt = 1'b1; - rLIC = 1'b1; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - - CPUSTATE_DMABREQ: - begin - rAVMA = 1'b0; - addr_nxt = 16'HFFFF; - BS_nxt = 1'b1; - BA_nxt = 1'b1; - rLIC = 1'b1; - tmp_nxt[3:0] = tmp[3:0] - 1'b1; - if ( (tmp[3:0] == 4'H0) | (DMABREQSample2) ) - begin - CpuState_nxt = CPUSTATE_DMABREQ_EXIT; - end - end - - CPUSTATE_DMABREQ_EXIT: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_HALTED: - begin - rAVMA = 1'b0; - addr_nxt = 16'HFFFF; - BS_nxt = 1'b1; - BA_nxt = 1'b1; - rLIC = 1'b1; - if (HALTSample2) - begin - CpuState_nxt = CPUSTATE_HALT_EXIT2; - end - end - - - CPUSTATE_HALT_EXIT2: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_FETCH_I1; - end - - CPUSTATE_STOP: - begin - addr_nxt = 16'HDEAD; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_STOP2; - end - - CPUSTATE_STOP2: - begin - addr_nxt = pc; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_STOP3; - end - - CPUSTATE_STOP3: - begin - addr_nxt = 16'H0000; //{Inst1, Inst2}; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_STOP; - end - - // The otherwise critically useful Figure 18 in the 6809 datasheet contains an error; - // it lists that CWAI has a tri-stated bus while it waits for an interrupt. - // That is not true. SYNC tristates the bus, as do things like /HALT and /DMABREQ. - // CWAI does not. It waits with /VMA cycles on the bus until an interrupt occurs. - // The implementation here fits with the 6809 Programming Manual and other Motorola - // sources, not with that typo in Figure 18. - CPUSTATE_CWAI: - begin - addr_nxt = pc; - cc_nxt = {1'b1, (cc[6:0] & Inst2[6:0])}; // Set E flag, AND CC with CWAI argument - tmp_nxt = 16'H00FF; // Save to the S stack, PC, U, Y, X, DP, B, A, CC - - NextState_nxt = CPUSTATE_CWAI_POST; - rAVMA = 1'b0; - CpuState_nxt = CPUSTATE_CWAI_DONTCARE1; - end - - CPUSTATE_CWAI_DONTCARE1: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b1; - CpuState_nxt = CPUSTATE_PSH_ACTION; - end - - CPUSTATE_CWAI_POST: - begin - addr_nxt = 16'HFFFF; - rAVMA = 1'b0; - - CpuState_nxt = CPUSTATE_CWAI_POST; - - // Wait for an interrupt - if (NMILatched == 0) - begin - rAVMA = 1'b1; - IntType_nxt = INTTYPE_NMI; - cc_nxt[CC_F_BIT] = 1'b1; - cc_nxt[CC_I_BIT] = 1'b1; - CpuState_nxt = CPUSTATE_IRQ_VECTOR_HI; - end - else if ((FIRQLatched == 0) && (cc[CC_F_BIT] == 0)) - begin - rAVMA = 1'b1; - cc_nxt[CC_F_BIT] = 1'b1; - cc_nxt[CC_I_BIT] = 1'b1; - IntType_nxt = INTTYPE_FIRQ; - CpuState_nxt = CPUSTATE_IRQ_VECTOR_HI; - end - else if ((IRQLatched == 0) && (cc[CC_I_BIT] == 0)) - begin - rAVMA = 1'b1; - cc_nxt[CC_I_BIT] = 1'b1; - IntType_nxt = INTTYPE_IRQ; - CpuState_nxt = CPUSTATE_IRQ_VECTOR_HI; - end - end - - default: // Picky darned Verilog. - begin - CpuState_nxt = PostIllegalState; - end - - endcase -end - -endmodule - diff --git a/Arcade_MiST/Namco Mappy Hardware/rtl/mems.v b/Arcade_MiST/Namco Mappy Hardware/rtl/mems.v deleted file mode 100644 index ccde3726..00000000 --- a/Arcade_MiST/Namco Mappy Hardware/rtl/mems.v +++ /dev/null @@ -1,102 +0,0 @@ -module mems -( - input CPUCLKx2, - output [14:0] rom_addr, - input [7:0] rom_data, - input [15:0] MCPU_ADRS, - input MCPU_VMA, - input MCPU_WE, - input [7:0] MCPU_DO, - output [7:0] MCPU_DI, - output IO_CS, - input [7:0] IO_O, - - input [15:0] SCPU_ADRS, - input SCPU_VMA, - input SCPU_WE, - input [7:0] SCPU_DO, - output [7:0] SCPU_DI, - output SCPU_WSG_WE, - - input VCLKx4, - input [10:0] vram_a, - output [15:0] vram_d, - input [6:0] spra_a, - output [23:0] spra_d, - - - input ROMCL, // Downloaded ROM image - input [16:0] ROMAD, - input [7:0] ROMDT, - input ROMEN -); - -//wire [7:0] mrom_d; -wire [7:0] srom_d; -assign rom_addr = MCPU_ADRS[14:0]; -//assign mrom_d = rom_data; - -scpui_rom scpui_rom( - .clk(CPUCLKx2), - .addr(SCPU_ADRS[12:0]), - .data(srom_d) -); - - -wire mram_cs0 = ( MCPU_ADRS[15:11] == 5'b00000 ) & MCPU_VMA; // $0000-$07FF -wire mram_cs1 = ( MCPU_ADRS[15:11] == 5'b00001 ) & MCPU_VMA; // $0800-$0FFF -wire mram_cs2 = ( MCPU_ADRS[15:11] == 5'b00010 ) & MCPU_VMA; // $1000-$17FF -wire mram_cs3 = ( MCPU_ADRS[15:11] == 5'b00011 ) & MCPU_VMA; // $1800-$1FFF -wire mram_cs4 = ( MCPU_ADRS[15:11] == 5'b00100 ) & MCPU_VMA; // $2000-$27FF -wire mram_cs5 = ( MCPU_ADRS[15:10] == 6'b010000 ) & MCPU_VMA; // $4000-$43FF -assign IO_CS = ( MCPU_ADRS[15:11] == 5'b01001 ) & MCPU_VMA; // $4800-$4FFF -wire mrom_cs = ( MCPU_ADRS[15] ) & MCPU_VMA; // $8000-$FFFF - -wire mram_w0 = ( mram_cs0 & MCPU_WE ); -wire mram_w1 = ( mram_cs1 & MCPU_WE ); -wire mram_w2 = ( mram_cs2 & MCPU_WE ); -wire mram_w3 = ( mram_cs3 & MCPU_WE ); -wire mram_w4 = ( mram_cs4 & MCPU_WE ); -wire mram_w5 = ( mram_cs5 & MCPU_WE ); - -wire [7:0] mram_o0, mram_o1, mram_o2, mram_o3, mram_o4, mram_o5; - -assign MCPU_DI = mram_cs0 ? mram_o0 : - mram_cs1 ? mram_o1 : - mram_cs2 ? mram_o2 : - mram_cs3 ? mram_o3 : - mram_cs4 ? mram_o4 : - mram_cs5 ? mram_o5 : - mrom_cs ? rom_data ://mrom_d : - IO_CS ? IO_O : - 8'h0; - -wire [10:0] mram_ad = MCPU_ADRS[10:0]; - -DPRAM_2048V main_ram0( CPUCLKx2, mram_ad, MCPU_DO, mram_o0, mram_w0, VCLKx4, vram_a, vram_d[7:0] ); -DPRAM_2048V main_ram1( CPUCLKx2, mram_ad, MCPU_DO, mram_o1, mram_w1, VCLKx4, vram_a, vram_d[15:8] ); - -DPRAM_2048V main_ram2( CPUCLKx2, mram_ad, MCPU_DO, mram_o2, mram_w2, VCLKx4, { 4'b1111, spra_a }, spra_d[7:0] ); -DPRAM_2048V main_ram3( CPUCLKx2, mram_ad, MCPU_DO, mram_o3, mram_w3, VCLKx4, { 4'b1111, spra_a }, spra_d[15:8] ); -DPRAM_2048V main_ram4( CPUCLKx2, mram_ad, MCPU_DO, mram_o4, mram_w4, VCLKx4, { 4'b1111, spra_a }, spra_d[23:16] ); - - - // (SCPU ADRS) -wire SCPU_CS_SREG = ( ( SCPU_ADRS[15:13] == 3'b000 ) & ( SCPU_ADRS[9:6] == 4'b0000 ) ) & SCPU_VMA; -wire srom_cs = ( SCPU_ADRS[15:13] == 3'b111 ) & SCPU_VMA; // $E000-$FFFF -wire sram_cs0 = (~SCPU_CS_SREG) & (~srom_cs) & SCPU_VMA; // $0000-$03FF -wire [7:0] sram_o0; - -assign SCPU_DI = sram_cs0 ? sram_o0 : - srom_cs ? srom_d : - 8'h0; - -assign SCPU_WSG_WE = SCPU_CS_SREG & SCPU_WE; - -DPRAM_2048 share_ram -( - CPUCLKx2, mram_ad, MCPU_DO, mram_o5, mram_w5, - CPUCLKx2, { 1'b0, SCPU_ADRS[9:0] }, SCPU_DO, sram_o0, sram_cs0 & SCPU_WE -); - -endmodule \ No newline at end of file diff --git a/Arcade_MiST/Namco Mappy Hardware/rtl/regs.v b/Arcade_MiST/Namco Mappy Hardware/rtl/regs.v deleted file mode 100644 index b7e11f62..00000000 --- a/Arcade_MiST/Namco Mappy Hardware/rtl/regs.v +++ /dev/null @@ -1,110 +0,0 @@ -module regs -( - input MCPU_CLK, - input RESET, - input VBLANK, - - input [15:0] MCPU_ADRS, - input MCPU_VMA, - input MCPU_WE, - - input [15:0] SCPU_ADRS, - input SCPU_VMA, - input SCPU_WE, - - output reg [7:0] SCROLL, - output MCPU_IRQ, - output reg MCPU_IRQEN, - output SCPU_IRQ, - output reg SCPU_IRQEN, - output SCPU_RESET, - output IO_RESET, - output reg PSG_ENABLE -); - -// BG Scroll Register -wire MCPU_SCRWE = ( ( MCPU_ADRS[15:11] == 5'b00111 ) & MCPU_VMA & MCPU_WE ); -always @ ( negedge MCPU_CLK or posedge RESET ) begin - if ( RESET ) SCROLL <= 8'h0; - else if ( MCPU_SCRWE ) SCROLL <= MCPU_ADRS[10:3]; -end - -// MainCPU IRQ Generator -wire MCPU_IRQWE = ( ( MCPU_ADRS[15:1] == 15'b010100000000001 ) & MCPU_VMA & MCPU_WE ); -//wire MCPU_IRQWES = ( ( SCPU_ADRS[15:1] == 15'b001000000000001 ) & SCPU_VMA & SCPU_WE ); -assign MCPU_IRQ = MCPU_IRQEN & VBLANK; - -always @( negedge MCPU_CLK or posedge RESET ) begin - if ( RESET ) begin - MCPU_IRQEN <= 1'b0; - end - else begin - if ( MCPU_IRQWE ) MCPU_IRQEN <= MCPU_ADRS[0]; -// if ( MCPU_IRQWES ) MCPU_IRQEN <= SCPU_ADRS[0]; - end -end - - -// SubCPU IRQ Generator -wire SCPU_IRQWE = ( ( MCPU_ADRS[15:1] == 15'b010100000000000 ) & MCPU_VMA & MCPU_WE ); -wire SCPU_IRQWES = ( ( SCPU_ADRS[15:1] == 15'b001000000000000 ) & SCPU_VMA & SCPU_WE ); -assign SCPU_IRQ = SCPU_IRQEN & VBLANK; - -always @( negedge MCPU_CLK or posedge RESET ) begin - if ( RESET ) begin - SCPU_IRQEN <= 1'b0; - end - else begin - if ( SCPU_IRQWE ) SCPU_IRQEN <= MCPU_ADRS[0]; - if ( SCPU_IRQWES ) SCPU_IRQEN <= SCPU_ADRS[0]; - end -end - - -// SubCPU RESET Control -reg SCPU_RSTf = 1'b0; -wire SCPU_RSTWE = ( ( MCPU_ADRS[15:1] == 15'b010100000000101 ) & MCPU_VMA & MCPU_WE ); -wire SCPU_RSTWES = ( ( SCPU_ADRS[15:1] == 15'b001000000000101 ) & SCPU_VMA & SCPU_WE ); -assign SCPU_RESET = ~SCPU_RSTf; - -always @( negedge MCPU_CLK or posedge RESET ) begin - if ( RESET ) begin - SCPU_RSTf <= 1'b0; - end - else begin - if ( SCPU_RSTWE ) SCPU_RSTf <= MCPU_ADRS[0]; - if ( SCPU_RSTWES ) SCPU_RSTf <= SCPU_ADRS[0]; - end -end - - -// I/O CHIP RESET Control -reg IOCHIP_RSTf = 1'b0; -wire IOCHIP_RSTWE = ( ( MCPU_ADRS[15:1] == 15'b010100000000100 ) & MCPU_VMA & MCPU_WE ); -assign IO_RESET = ~IOCHIP_RSTf; - -always @( negedge MCPU_CLK or posedge RESET ) begin - if ( RESET ) begin - IOCHIP_RSTf <= 1'b0; - end - else begin - if ( IOCHIP_RSTWE ) IOCHIP_RSTf <= MCPU_ADRS[0]; - end -end - - -// Sound Enable Control -wire PSG_ENAWE = ( ( MCPU_ADRS[15:1] == 15'b010100000000011 ) & MCPU_VMA & MCPU_WE ); -wire PSG_ENAWES = ( ( SCPU_ADRS[15:1] == 15'b001000000000011 ) & SCPU_VMA & SCPU_WE ); - -always @( negedge MCPU_CLK or posedge RESET ) begin - if ( RESET ) begin - PSG_ENABLE <= 1'b0; - end - else begin - if ( PSG_ENAWE ) PSG_ENABLE <= MCPU_ADRS[0]; - if ( PSG_ENAWES ) PSG_ENABLE <= SCPU_ADRS[0]; - end -end - -endmodule \ No newline at end of file diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/DefenderHardware.sdc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/DefenderHardware.sdc index 1c565ca0..13477d83 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/DefenderHardware.sdc +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/DefenderHardware.sdc @@ -119,8 +119,8 @@ set_clock_groups -asynchronous -group [get_clocks $sdram_clk] -group [get_clocks set_multicycle_path -from [get_clocks $game_clk] -to [get_clocks $sdram_clk] -setup 2 set_multicycle_path -from [get_clocks $game_clk] -to [get_clocks $sdram_clk] -hold 1 -set_multicycle_path -to {VGA_*[*]} -setup 2 -set_multicycle_path -to {VGA_*[*]} -hold 1 +set_multicycle_path -to {VGA_*[*]} -setup 3 +set_multicycle_path -to {VGA_*[*]} -hold 2 #************************************************************** # Set Maximum Delay diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/ReadMe.txt b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/ReadMe.txt index 2265b0dd..57f083ff 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/ReadMe.txt +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/ReadMe.txt @@ -3,6 +3,16 @@ -- Arcade: Defender port to MiST by Gehstock -- 11 June 2019 -- +-- +-- Usage: +-- - Create ROM and ARC files from the MRA files in the meta directory +-- using the MRA utility. +-- Example: mra -A -z /path/to/mame/roms Defender.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 +-- +-- MRA utility: https://github.com/sebdel/mra-tools-c/ +-- --------------------------------------------------------------------------------- -- A simulation model of Williams 6809 hardware -- by Dar (darfpga@aol.fr) diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Colony7.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Colony7.mra new file mode 100644 index 00000000..a38f9e3f --- /dev/null +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Colony7.mra @@ -0,0 +1,33 @@ + + Colony 7 (set 1) + 0216 + colony7 + 201911270000 + 1981 + Taito + Space / Shooter + defender + + 1 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Defender.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Defender.mra new file mode 100644 index 00000000..a817d89e --- /dev/null +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Defender.mra @@ -0,0 +1,37 @@ + + Defender (Red label) + 0216 + 201911270000 + 1980 + Williams + Space / Defender + defender + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Jin.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Jin.mra new file mode 100644 index 00000000..bbe18afe --- /dev/null +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Jin.mra @@ -0,0 +1,29 @@ + + Jin + 0216 + jin + 201911270000 + 1982 + Falcon + Maze / Qix + defender + + 3 + + + + + + + + + + + + + + + + + + diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Mayday.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Mayday.mra new file mode 100644 index 00000000..adf130be --- /dev/null +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/meta/Mayday.mra @@ -0,0 +1,93 @@ + + Mayday (set 1) + 0216 + mayday + 201911270000 + 1980 + Hoei + Space / Defender + defender + + 2 + + + + + + + + + + +00 40 80 01 41 81 02 42 82 03 43 83 04 44 84 05 +45 85 06 46 86 07 47 87 08 48 88 09 49 89 0a 4a +8a 0b 4b 8b 0c 4c 8c 0d 4d 8d 0e 4e 8e 0f 4f 8f +10 50 90 11 51 91 12 52 92 13 53 93 14 54 94 15 +55 95 16 56 96 17 57 97 18 58 98 19 59 99 1a 5a +9a 1b 5b 9b 1c 5c 9c 1d 5d 9d 1e 5e 9e 1f 5f 9f +20 60 a0 21 61 a1 22 62 a2 23 63 a3 24 64 a4 25 +65 a5 26 66 a6 27 67 a7 28 68 a8 29 69 a9 2a 6a +aa 2b 6b ab 2c 6c ac 2d 6d ad 2e 6e ae 2f 6f af +30 70 b0 31 71 b1 32 72 b2 33 73 b3 34 74 b4 35 +75 b5 36 76 b6 37 77 b7 38 78 b8 39 79 b9 3a 7a +ba 3b 7b bb 3c 7c bc 3d 7d bd 3e 7e be 3f 7f bf +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 40 80 01 41 72 32 b1 71 31 b0 70 30 af 6f 2f +ae 6e 2e ad 6d 2d ac 6c 2c ab 6b 2b aa 6a 2a a9 +69 29 a8 68 28 a7 67 27 a6 66 26 a5 65 25 a4 64 +24 a3 63 23 a2 62 22 a1 61 21 a0 60 20 9f 5f 1f +9e 5e 1e 9d 5d 1d 9c 5c 1c 9b 5b 1b 9a 5a 1a 99 +59 19 98 58 18 97 57 17 96 56 16 95 55 15 94 54 +14 93 53 13 92 52 12 91 51 11 90 50 10 8f 4f 0f +8e 4e 0e 8d 4d 0d 8c 4c 0c 8b 4b 0b 8a 4a 0a 89 +49 09 88 48 08 87 47 07 86 46 06 85 45 05 84 44 +04 83 43 03 82 42 02 81 b2 33 73 b3 34 74 b4 35 +75 b5 36 76 b6 37 77 b7 38 78 b8 39 79 b9 3a 7a +ba 3b 7b bb 3c 7c bc 3d 7d bd 3e 7e be 3f 7f bf +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + + +00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f +10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f +20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f +30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f +40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f +50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f +60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f +70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f +80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f +90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f +a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af +b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf +c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf +d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df +e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef +f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff +fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ef ee ed ec +eb ea e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 df de dd dc +db da d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 cf ce cd cc +cb ca c9 c8 c7 c6 c5 c4 c3 c2 c1 c0 bf be bd bc +bb ba b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 af ae ad ac +ab aa a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 9f 9e 9d 9c +9b 9a 99 98 97 96 95 94 93 92 91 90 8f 8e 8d 8c +8b 8a 89 88 87 86 85 84 83 82 81 80 7f 7e 7d 7c +7b 7a 79 78 77 76 75 74 73 72 71 70 6f 6e 6d 6c +6b 6a 69 68 67 66 65 64 63 62 61 60 5f 5e 5d 5c +5b 5a 59 58 57 56 55 54 53 52 51 50 4f 4e 4d 4c +4b 4a 49 48 47 46 45 44 43 42 41 40 3f 3e 3d 3c +3b 3a 39 38 37 36 35 34 33 32 31 30 2f 2e 2d 2c +2b 2a 29 28 27 26 25 24 23 22 21 20 1f 1e 1d 1c +1b 1a 19 18 17 16 15 14 13 12 11 10 0f 0e 0d 0c +0b 0a 09 08 07 06 05 04 03 02 01 00 fc fd fe ff + + + + + + diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/Defender_MiST.sv b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/Defender_MiST.sv index d7006e43..042e85af 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/Defender_MiST.sv +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/Defender_MiST.sv @@ -34,21 +34,31 @@ module Defender_MiST( `include "rtl/build_id.v" -//`define CORE_NAME "DEFENDER" -//`define CORE_NAME "COLONY7" -//`define CORE_NAME "MAYDAY" -`define CORE_NAME "JIN" +`define CORE_NAME "DEFENDER" localparam CONF_STR = { `CORE_NAME,";ROM;", "O2,Rotate Controls,Off,On;", "O34,Scanlines,Off,25%,50%,75%;", "O5,Blend,Off,On;", + "DIP;", "T0,Reset;", "V,v1.2.",`BUILD_DATE }; -wire rotate = status[2]; +wire rotate = status[2]; +wire [1:0] scanlines = status[4:3]; +wire blend = status[5]; +wire autoup = status[7]; +wire adv = status[8]; +wire hsr = status[9]; + +wire advance, hsreset; +trigger adv_button(clk_sys, adv, advance); +trigger hsr_button(clk_sys, hsr, hsreset); + +wire [6:0] core_mod; +reg [8*8-1:0] core_name; reg [7:0] input0; reg [7:0] input1; reg [7:0] input2; @@ -61,7 +71,10 @@ always @(*) begin input1 = 0; input2 = 0; orientation = 2'b10; - if (`CORE_NAME == "DEFENDER") begin + + case (core_mod) + 7'h0: // DEFENDER + begin /* -- pia rom board port a - input0 -- bit 0 Auto Up / manual Down @@ -73,7 +86,7 @@ always @(*) begin -- bit 6 led 2 (output) -- bit 7 led 1 (output) */ - input0 = { 3'b000, m_coin1, 1'b0/*btn_score_reset*/, 1'b0, m_fireF, m_fireE }; + input0 = { 3'b000, m_coin1, /*btn_score_reset*/hsreset, 1'b0, advance, autoup }; /* -- pia io port a - input1 -- bit 0 Fire @@ -93,36 +106,45 @@ always @(*) begin -- other <= GND */ input2 = { 7'b000000, m_up }; - end else if (`CORE_NAME == "COLONY7") begin + end + 7'h1: // COLONY7 + begin orientation = 2'b01; - input0 = { 3'b000, m_coin1, 4'b0001 }; + input0 = { 3'b000, m_coin1, 2'b00, /*bonus at*/status[11], /*lives23*/status[10] }; input1 = { m_fireB, m_fireA, m_one_player, m_two_players, m_up, m_left, m_right, m_down }; input2 = { 7'b000000, m_fireC }; - end else if (`CORE_NAME == "MAYDAY") begin + end + 7'h2: // MAYDAY + begin mayday = 1; - input0 = { 2'b00, m_coin2, m_coin1, 1'b0, 1'b0/*service*/, m_fireF, m_fireE }; + input0 = { 2'b00, m_coin2, m_coin1, 1'b0, hsreset, advance, autoup }; input1 = { m_down, 1'b0, m_one_player, m_two_players, m_fireB, m_fireC, m_right, m_fireA }; input2 = { 7'b000000, m_up }; - end else if (`CORE_NAME == "JIN") begin + end + 7'h3: // JIN + begin orientation = 2'b11; input0 = { 3'b000, m_coin2, m_coin1, 3'b000 }; input1 = { m_fireB, m_fireA, m_one_player, m_two_players, m_right, m_left, m_down, m_up }; //unknown/Level completed/Level completed/unknown/Lives/Coinage/Coinage/Coinage - input2 = 0; + input2 = { 1'b0, ~status[12:11], 1'b0, status[10], 3'b000 }; end + default: ; + endcase + end assign LED = ~ioctl_downl; -assign SDRAM_CLK = clk_sys; +assign SDRAM_CLK = clk_mem; assign SDRAM_CKE = 1; -wire clk_sys, clk_6, clk_0p89; +wire clk_sys, clk_vid, clk_mem = clk_vid, clk_0p89; wire pll_locked; pll_mist pll( .inclk0(CLOCK_27), .areset(0), - .c0(clk_sys),//54 - .c1(clk_6),//6 + .c0(clk_vid),//72 + .c1(clk_sys),//6 .c2(clk_0p89),//0.89 .locked(pll_locked) ); @@ -134,15 +156,34 @@ wire [7:0] joystick_0; wire [7:0] joystick_1; wire scandoublerD; wire ypbpr; -wire [7:0] audio; -wire hs, vs; -wire blankn; -wire [2:0] r,g; -wire [1:0] b; +wire no_csync; wire key_pressed; wire [7:0] key_code; wire key_strobe; +user_io #( + .STRLEN($size(CONF_STR)>>3)) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .no_csync (no_csync ), + .core_mod (core_mod ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + wire ioctl_downl; wire [7:0] ioctl_index; wire ioctl_wr; @@ -179,7 +220,7 @@ wire [15:0] snd_do; sdram #(.MHZ(54)) sdram( .*, .init_n ( pll_locked ), - .clk ( clk_sys ), + .clk ( clk_mem ), // port1 used for main CPU .port1_req ( port1_req ), @@ -231,8 +272,14 @@ always @(posedge clk_sys) begin reset <= status[0] | buttons[1] | ioctl_downl | ~rom_loaded; end +wire [7:0] audio; +wire hs, vs; +wire blankn; +wire [2:0] r,g; +wire [1:0] b; + defender defender ( - .clock_6 ( clk_6 ), + .clock_6 ( clk_sys ), .clk_0p89 ( clk_0p89 ), .reset ( reset ), .video_r ( r ), @@ -263,7 +310,7 @@ defender defender ( ); mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(11)) mist_video( - .clk_sys ( clk_sys ), + .clk_sys ( clk_vid ), .SPI_SCK ( SPI_SCK ), .SPI_SS3 ( SPI_SS3 ), .SPI_DI ( SPI_DI ), @@ -279,42 +326,22 @@ mist_video #(.COLOR_DEPTH(3), .SD_HCNT_WIDTH(11)) mist_video( .VGA_HS ( VGA_HS ), .rotate ( {orientation[1],rotate} ), .scandoubler_disable( scandoublerD ), - .scanlines ( status[4:3] ), - .blend ( status[5] ), + .no_csync ( no_csync ), + .scanlines ( scanlines ), + .blend ( blend ), .ypbpr ( ypbpr ) ); -user_io #( - .STRLEN(($size(CONF_STR)>>3))) -user_io( - .clk_sys (clk_sys ), - .conf_str (CONF_STR ), - .SPI_CLK (SPI_SCK ), - .SPI_SS_IO (CONF_DATA0 ), - .SPI_MISO (SPI_DO ), - .SPI_MOSI (SPI_DI ), - .buttons (buttons ), - .switches (switches ), - .scandoubler_disable (scandoublerD ), - .ypbpr (ypbpr ), - .key_strobe (key_strobe ), - .key_pressed (key_pressed ), - .key_code (key_code ), - .joystick_0 (joystick_0 ), - .joystick_1 (joystick_1 ), - .status (status ) - ); - wire dac_o; assign AUDIO_L = dac_o; assign AUDIO_R = dac_o; dac #( - .C_bits(8)) + .C_bits(11)) dac( .clk_i(clk_0p89), .res_n_i(1), - .dac_i(audio), + .dac_i({3'b000, audio}), // silence by 9dB .dac_o(dac_o) ); @@ -338,4 +365,24 @@ arcade_inputs inputs ( .player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} ) ); -endmodule +endmodule + +module trigger ( + input clk, + input btn, + output trigger +); + +reg [23:0] counter; +assign trigger = (counter != 0); + +always @(posedge clk) begin + reg btn_d; + + btn_d <= btn; + if (~btn_d & btn) counter <= 24'hfffff; + if (counter != 0) counter <= counter - 1'd1; + +end + +endmodule diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/pll_mist.vhd b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/pll_mist.vhd index c6ccb266..cb9f503e 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/pll_mist.vhd +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Defender Hardware/rtl/pll_mist.vhd @@ -156,9 +156,9 @@ BEGIN altpll_component : altpll GENERIC MAP ( bandwidth_type => "AUTO", - clk0_divide_by => 1, + clk0_divide_by => 3, clk0_duty_cycle => 50, - clk0_multiply_by => 2, + clk0_multiply_by => 8, clk0_phase_shift => "0", clk1_divide_by => 9, clk1_duty_cycle => 50, @@ -255,7 +255,7 @@ END SYN; -- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" -- Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000" --- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "54.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "72.000000" -- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "6.000000" -- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "0.890110" -- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" @@ -284,14 +284,14 @@ END SYN; -- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" -- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" -- Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0" --- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "6" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "4" -- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "2" -- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "3" -- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" --- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "36.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "72.00000000" -- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "6.00000000" -- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "0.89000000" --- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" -- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" -- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" -- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" @@ -343,9 +343,9 @@ END SYN; -- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" -- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all -- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" --- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "1" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "3" -- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "2" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "8" -- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" -- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "9" -- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/README.md b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/README.md index ea048cd4..8fdf1d1c 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/README.md +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/README.md @@ -10,8 +10,8 @@ Sinistar has some graphics issues, and the speech chip is not implemented. Usage: ------ +- Create ROM and ARC files from MAME ROM zip files using the mra utility and the MRA files. - Copy the RBF and the ARC files to the same folder. -- Create ROM files from MAME ROM zip files using the mra utility and the MRA files. - Example: mra -z /path/to/mame/roms scramble.mra - Copy the ROM files to the root of the SD Card. diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Alien Arena.arc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Alien Arena.arc deleted file mode 100644 index 4dc18ef6..00000000 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Alien Arena.arc +++ /dev/null @@ -1,3 +0,0 @@ -[ARC] -RBF=ROBOTRON -MOD=5 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Bubbles.arc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Bubbles.arc deleted file mode 100644 index 85af9193..00000000 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Bubbles.arc +++ /dev/null @@ -1,3 +0,0 @@ -[ARC] -RBF=ROBOTRON -MOD=3 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Joust.arc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Joust.arc deleted file mode 100644 index f0b3f9ad..00000000 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Joust.arc +++ /dev/null @@ -1,3 +0,0 @@ -[ARC] -RBF=ROBOTRON -MOD=1 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Robotron 2084.arc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Robotron 2084.arc deleted file mode 100644 index 98c1ad76..00000000 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Robotron 2084.arc +++ /dev/null @@ -1,3 +0,0 @@ -[ARC] -RBF=ROBOTRON -MOD=0 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Sinistar.arc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Sinistar.arc deleted file mode 100644 index f561390f..00000000 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Sinistar.arc +++ /dev/null @@ -1,3 +0,0 @@ -[ARC] -RBF=ROBOTRON -MOD=6 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Splat.arc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Splat.arc deleted file mode 100644 index d674b450..00000000 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Splat.arc +++ /dev/null @@ -1,3 +0,0 @@ -[ARC] -RBF=ROBOTRON -MOD=2 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Stargate.arc b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Stargate.arc deleted file mode 100644 index 7712ab95..00000000 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/Stargate.arc +++ /dev/null @@ -1,3 +0,0 @@ -[ARC] -RBF=ROBOTRON -MOD=4 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/alienar.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/alienar.mra index 8eebe0a3..b4082c24 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/alienar.mra +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/alienar.mra @@ -1,6 +1,9 @@ Alien Arena 0209 + Robotron + alienar + 5 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/bubbles.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/bubbles.mra index 7c39b74e..cffa97b0 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/bubbles.mra +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/bubbles.mra @@ -1,6 +1,9 @@ Bubbles 0209 + robotron + bubbles + 3 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/joust.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/joust.mra index 40740b61..b0749b8b 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/joust.mra +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/joust.mra @@ -1,6 +1,9 @@ Joust 0209 + robotron + joust + 1 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/robotron.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/robotron.mra index a61ae4c4..2c4c9c6b 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/robotron.mra +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/robotron.mra @@ -1,6 +1,9 @@ Robotron 2084 0209 + robotron + robotron + 0 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/sinistar.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/sinistar.mra index 0cec8cd3..b7b8d402 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/sinistar.mra +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/sinistar.mra @@ -1,6 +1,9 @@ Sinistar 0209 + robotron + sinistar + 6 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/splat.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/splat.mra index e5aa1ef5..c827242b 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/splat.mra +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/splat.mra @@ -1,6 +1,9 @@ Splat 0209 + robotron + splat + 2 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/stargate.mra b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/stargate.mra index 3c22ce1b..c15e5e77 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/stargate.mra +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/meta/stargate.mra @@ -1,6 +1,9 @@ Stargate 0209 + robotron + stargate + 4 diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/RobotronFPGA_MiST.sv b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/RobotronFPGA_MiST.sv index fad7f994..9af17d6f 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/RobotronFPGA_MiST.sv +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/RobotronFPGA_MiST.sv @@ -38,8 +38,10 @@ module RobotronFPGA_MiST( `include "rtl/build_id.v" +`define CORE_NAME "ROBOTRON" + localparam CONF_STR = { - ";ROM;", + `CORE_NAME,";ROM;", "O2,Rotate Controls,Off,On;", "O34,Scanlines,Off,25%,50%,75%;", "O5,Blend,Off,On;", @@ -64,7 +66,6 @@ reg [3:0] BTN; reg blitter_sc2, sinistar; wire [6:0] core_mod; -reg [8*8-1:0] core_name; reg [1:0] orientation; // [left/right, landscape/portrait] // advance button @@ -85,59 +86,51 @@ always @(*) begin JA = 8'hFF; JB = 8'hFF; BTN = 4'hF; - core_name = "ROBOTRON"; blitter_sc2 = 0; sinistar = 0; case (core_mod) - 7'h0: + 7'h0: // ROBOTRON begin - core_name = "ROBOTRON"; BTN = { m_one_player, m_two_players, m_coin1 | m_coin2, reset }; // Fire Up/Down/Left/Right maps to joystick 1/2/3/4 and keyboard R/F/D/G (MAME style) JA = ~{ m_fireD|m_right2, m_fireC|m_left2, m_fireB|m_down2, m_fireA|m_up2, m_right, m_left, m_down, m_up }; JB = ~{ m_fireD|m_right2, m_fireC|m_left2, m_fireB|m_down2, m_fireA|m_up2, m_right, m_left, m_down, m_up }; end - 7'h1: + 7'h1: // JOUST begin - core_name = "JOUST "; BTN = { m_two_players, m_one_player, m_coin1 | m_coin2, reset }; JA = ~{ 5'b00000, m_fireA, m_right, m_left }; JB = ~{ 5'b00000, m_fire2A, m_right2, m_left2 }; end - 7'h2: + 7'h2: // SPLAT begin - core_name = "SPLAT "; blitter_sc2 = 1; BTN = { m_one_player, m_two_players, m_coin1 | m_coin2, reset }; // Fire Up/Down/Left/Right maps to joystick 1/2/3/4 and keyboard R/F/D/G (MAME style) JA = ~{ m_fireD|m_right2, m_fireC|m_left2, m_fireB|m_down2, m_fireA|m_up2, m_right, m_left, m_down, m_up }; JB = ~{ m_fireD|m_right2, m_fireC|m_left2, m_fireB|m_down2, m_fireA|m_up2, m_right, m_left, m_down, m_up }; end - 7'h3: + 7'h3: // BUBBLES begin - core_name = "BUBBLES "; BTN = { m_two_players, m_one_player, m_coin1 | m_coin2, reset }; JA = ~{ 4'b0000, m_right, m_left, m_down, m_up }; JB = ~{ 4'b0000, m_right2, m_left2, m_down2, m_up2 }; end - 7'h4: + 7'h4: // STARGATE begin - core_name = "STARGATE"; BTN = { m_two_players, m_one_player, m_coin1 | m_coin2, reset }; JA = ~{ m_fireE, m_up, m_down, m_left | m_right, m_fireD, m_fireC, m_fireB, m_fireA }; JB = ~{ m_fire2E, m_up2, m_down2, m_left2 | m_right2, m_fire2D, m_fire2C, m_fire2B, m_fire2A }; end - 7'h5: + 7'h5: // ALIENAR begin - core_name = "ALIENAR "; BTN = { m_one_player, m_two_players, m_coin1 | m_coin2, reset }; JA = ~{ 1'b0, 1'b0, m_fireB, m_fireA, m_right, m_left, m_down, m_up }; JB = ~{ 1'b0, 1'b0, m_fire2B, m_fire2A, m_right2, m_left2, m_down2, m_up2 }; end - 7'h6: + 7'h6: // SINISTAR begin - core_name = "SINISTAR"; sinistar = 1; orientation = 2'b01; BTN = { m_two_players, m_one_player, m_coin1 | m_coin2, reset }; @@ -181,10 +174,10 @@ wire [7:0] key_code; wire key_strobe; user_io #( - .STRLEN(8+($size(CONF_STR)>>3))) + .STRLEN($size(CONF_STR)>>3)) user_io( .clk_sys ( clk_sys ), - .conf_str ( {core_name, CONF_STR} ), + .conf_str ( CONF_STR ), .SPI_CLK ( SPI_SCK ), .SPI_SS_IO ( CONF_DATA0 ), .SPI_MISO ( SPI_DO ), @@ -274,7 +267,7 @@ wire [17:1] sdram_addr = ~romcs ? {1'b0, mem_addr[16], ~mem_addr[16] & mem_addr[ // IOCTL address to SDRAM address: // D000-D3FF -> 1CC00-1CFFF (CMOS), otherwise direct mapping -wire [22:0] downl_addr = (ioctl_addr[22:10] == { 7'h0, 4'hD, 2'b00 }) ? { 1'b1, 4'hC, 2'b11, ioctl_addr[9:0] } : ioctl_addr; +wire [22:0] downl_addr = (ioctl_addr[22:10] == { 7'h0, 4'hD, 2'b00 }) ? { 1'b1, 4'hC, 2'b11, ioctl_addr[9:0] } : ioctl_addr[22:0]; always @(posedge clk_mem) begin reg ioctl_wr_last = 0; diff --git a/common/mist/data_io.v b/common/mist/data_io.v index 4ca9518c..8aac528a 100644 --- a/common/mist/data_io.v +++ b/common/mist/data_io.v @@ -26,90 +26,153 @@ module data_io input clk_sys, input SPI_SCK, input SPI_SS2, + input SPI_SS4, input SPI_DI, + input SPI_DO, // yes, SPI_DO is input when SS4 active + + input clkref_n, // assert ioctl_wr one cycle after clkref stobe (negative active) // ARM -> FPGA download output reg ioctl_download = 0, // signal indicating an active download output reg [7:0] ioctl_index, // menu index used to upload the file - output ioctl_wr, + output reg ioctl_wr, // strobe indicating ioctl_dout valid output reg [24:0] ioctl_addr, output reg [7:0] ioctl_dout ); +parameter START_ADDR = 25'd0; +parameter ROM_DIRECT_UPLOAD = 0; + /////////////////////////////// DOWNLOADING /////////////////////////////// reg [7:0] data_w; -reg [24:0] addr_w; +reg [7:0] data_w2 = 0; reg rclk = 0; +reg rclk2 = 0; +reg addr_reset = 0; -localparam UIO_FILE_TX = 8'h53; -localparam UIO_FILE_TX_DAT = 8'h54; -localparam UIO_FILE_INDEX = 8'h55; +reg downloading_reg = 0; +reg [7:0] index_reg = 0; + +localparam DIO_FILE_TX = 8'h53; +localparam DIO_FILE_TX_DAT = 8'h54; +localparam DIO_FILE_INDEX = 8'h55; // data_io has its own SPI interface to the io controller always@(posedge SPI_SCK, posedge SPI_SS2) begin reg [6:0] sbuf; reg [7:0] cmd; - reg [4:0] cnt; + reg [3:0] cnt; reg [24:0] addr; if(SPI_SS2) cnt <= 0; else begin - rclk <= 0; - // don't shift in last bit. It is evaluated directly // when writing to ram if(cnt != 15) sbuf <= { sbuf[5:0], SPI_DI}; - // increase target address after write - if(rclk) addr <= addr + 1'd1; - - // count 0-7 8-15 8-15 ... - if(cnt < 15) cnt <= cnt + 1'd1; + // count 0-7 8-15 8-15 ... + if(cnt != 15) cnt <= cnt + 1'd1; else cnt <= 8; // finished command byte if(cnt == 7) cmd <= {sbuf, SPI_DI}; // prepare/end transmission - if((cmd == UIO_FILE_TX) && (cnt == 15)) begin - // prepare + if((cmd == DIO_FILE_TX) && (cnt == 15)) begin + // prepare if(SPI_DI) begin - addr <= 0; - ioctl_download <= 1; + addr_reset <= ~addr_reset; + downloading_reg <= 1; end else begin - addr_w <= addr; - ioctl_download <= 0; + downloading_reg <= 0; end end // command 0x54: UIO_FILE_TX - if((cmd == UIO_FILE_TX_DAT) && (cnt == 15)) begin - addr_w <= addr; + if((cmd == DIO_FILE_TX_DAT) && (cnt == 15)) begin data_w <= {sbuf, SPI_DI}; - rclk <= 1; + rclk <= ~rclk; end // expose file (menu) index - if((cmd == UIO_FILE_INDEX) && (cnt == 15)) ioctl_index <= {sbuf, SPI_DI}; + if((cmd == DIO_FILE_INDEX) && (cnt == 15)) index_reg <= {sbuf, SPI_DI}; end end -assign ioctl_wr = |ioctl_wrd; -reg [1:0] ioctl_wrd; -always@(negedge clk_sys) begin - reg rclkD, rclkD2; +// direct SD Card->FPGA transfer +generate if (ROM_DIRECT_UPLOAD == 1) begin - rclkD <= rclk; - rclkD2 <= rclkD; - ioctl_wrd<= {ioctl_wrd[0],1'b0}; +always@(posedge SPI_SCK, posedge SPI_SS4) begin + reg [6:0] sbuf2; + reg [2:0] cnt2; + reg [9:0] bytecnt; - if(rclkD & ~rclkD2) begin - ioctl_dout <= data_w; - ioctl_addr <= addr_w; - ioctl_wrd <= 2'b11; + if(SPI_SS4) begin + cnt2 <= 0; + bytecnt <= 0; + end else begin + // don't shift in last bit. It is evaluated directly + // when writing to ram + if(cnt2 != 7) + sbuf2 <= { sbuf2[5:0], SPI_DO }; + + cnt2 <= cnt2 + 1'd1; + + // received a byte + if(cnt2 == 7) begin + bytecnt <= bytecnt + 1'd1; + // read 514 byte/sector (512 + 2 CRC) + if (bytecnt == 513) bytecnt <= 0; + // don't send the CRC bytes + if (~bytecnt[9]) begin + data_w2 <= {sbuf2, SPI_DO}; + rclk2 <= ~rclk2; + end + end end end +end +endgenerate + +always@(posedge clk_sys) begin + // bring flags from spi clock domain into core clock domain + reg rclkD, rclkD2; + reg rclk2D, rclk2D2; + reg addr_resetD, addr_resetD2; + reg wr_int, wr_int_direct; + reg [24:0] addr; + + { rclkD, rclkD2 } <= { rclk, rclkD }; + { rclk2D ,rclk2D2 } <= { rclk2, rclk2D }; + { addr_resetD, addr_resetD2 } <= { addr_reset, addr_resetD }; + + ioctl_wr <= 0; + + ioctl_download <= downloading_reg; + + if (~clkref_n) begin + wr_int <= 0; + wr_int_direct <= 0; + if (wr_int || wr_int_direct) begin + ioctl_dout <= wr_int ? data_w : data_w2; + ioctl_wr <= 1; + addr <= addr + 1'd1; + ioctl_addr <= addr; + end + end + + // detect transfer start from the SPI receiver + if(addr_resetD ^ addr_resetD2) begin + addr <= START_ADDR; + ioctl_index <= index_reg; + end + + // detect new byte from the SPI receiver + if (rclkD ^ rclkD2) wr_int <= 1; + if (rclk2D ^ rclk2D2) wr_int_direct <= 1; +end + endmodule