mirror of
https://github.com/MiSTer-devel/Gameboy_MiSTer.git
synced 2026-05-24 03:03:25 +00:00
SERIAL: added 8192Hz timer to transfer (dummy) data, fixes Baseball
This commit is contained in:
53
gb.v
53
gb.v
@@ -76,14 +76,15 @@ wire dma_sel_iram = (dma_addr[15:14] == 2'b11) && (dma_addr[15:8] != 8'hff); //
|
||||
// the boot roms sees a special $42 flag in $ff50 if it's supposed to to a fast boot
|
||||
wire sel_fast = fast_boot && cpu_addr == 16'hff50 && boot_rom_enabled;
|
||||
|
||||
wire sc_r = {sc_start,6'h3F,sc_shiftclock};
|
||||
|
||||
// http://gameboy.mongenel.com/dmg/asmmemmap.html
|
||||
wire [7:0] cpu_di =
|
||||
irq_ack?irq_vec:
|
||||
sel_fast?8'h42: // fast boot flag
|
||||
sel_joy?joy_do: // joystick register
|
||||
sel_sb?sb_r:
|
||||
sel_sc?sc_r:
|
||||
sel_sb?8'hFF: // serial transfer data register
|
||||
sel_sc?sc_r: // serial transfer control register
|
||||
sel_timer?timer_do: // timer registers
|
||||
sel_video_reg?video_do: // video registers
|
||||
sel_video_oam?video_do: // video object attribute memory
|
||||
@@ -150,23 +151,43 @@ gbc_snd audio (
|
||||
// -----------------------serial port(dummy)---------------------------
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
reg [7:0] sb_r;
|
||||
reg [7:0] sc_r;
|
||||
reg [3:0] serial_counter;
|
||||
reg sc_start,sc_shiftclock;
|
||||
|
||||
reg serial_irq;
|
||||
reg [8:0] serial_clk_div; //8192Hz
|
||||
|
||||
always @(posedge clk) begin
|
||||
serial_irq <= 0;
|
||||
if(reset) begin
|
||||
sb_r <= 8'h0;
|
||||
sc_r <= 8'h7E;
|
||||
serial_irq <= 1'b0;
|
||||
if(reset) begin
|
||||
sc_start <= 1'b0;
|
||||
sc_shiftclock <= 1'b0;
|
||||
end else if (sel_sc && !cpu_wr_n) begin //cpu write
|
||||
sc_start <= cpu_do[7];
|
||||
sc_shiftclock <= cpu_do[0];
|
||||
if (cpu_do[7]) begin //enable transfer
|
||||
serial_clk_div <= 9'h3FF;
|
||||
serial_counter <= 4'd8;
|
||||
end
|
||||
end else if (sc_start && sc_shiftclock) begin // serial transfer and serial clock enabled
|
||||
|
||||
serial_clk_div <= serial_clk_div - 9'd1;
|
||||
|
||||
if (serial_clk_div == 9'd0 && serial_counter)
|
||||
serial_counter <= serial_counter - 4'd1;
|
||||
|
||||
if (!serial_counter) begin
|
||||
serial_irq <= 1'b1; //trigger interrupt
|
||||
sc_start <= 1'b0; //reset transfer state
|
||||
serial_clk_div <= 9'h3FF;
|
||||
serial_counter <= 4'd8;
|
||||
end
|
||||
|
||||
end
|
||||
else if (sel_sc && !cpu_wr_n) begin
|
||||
if (cpu_do == 8'h81) begin
|
||||
sb_r <= 8'hFF;
|
||||
sc_r <= 8'h01;
|
||||
serial_irq<=1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// ------------------------------ inputs ------------------------------
|
||||
|
||||
Reference in New Issue
Block a user