mirror of
https://github.com/UzixLS/zx-sizif-xxs.git
synced 2025-07-19 07:11:28 +03:00
improve turbo modes reliability
This commit is contained in:
@ -24,17 +24,19 @@ module divmmc(
|
|||||||
|
|
||||||
output reg [3:0] page,
|
output reg [3:0] page,
|
||||||
output map,
|
output map,
|
||||||
output reg automap,
|
output automap,
|
||||||
output ram,
|
output ram,
|
||||||
output ramwr_mask,
|
output ramwr_mask,
|
||||||
output cpuwait
|
output cpuwait
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
reg automap0;
|
||||||
reg automap_next;
|
reg automap_next;
|
||||||
always @(posedge clk28 or negedge rst_n) begin
|
always @(posedge clk28 or negedge rst_n) begin
|
||||||
if (!rst_n) begin
|
if (!rst_n) begin
|
||||||
automap_next <= 0;
|
automap_next <= 0;
|
||||||
automap <= 0;
|
automap0 <= 0;
|
||||||
end
|
end
|
||||||
else if (bus.m1 && bus.memreq && !magic_map) begin
|
else if (bus.m1 && bus.memreq && !magic_map) begin
|
||||||
if (!en_hooks || !en || rammap) begin
|
if (!en_hooks || !en || rammap) begin
|
||||||
@ -55,14 +57,18 @@ always @(posedge clk28 or negedge rst_n) begin
|
|||||||
end
|
end
|
||||||
else if (bus.a_reg[15:8] == 8'h3D) begin // tr-dos mapping area
|
else if (bus.a_reg[15:8] == 8'h3D) begin // tr-dos mapping area
|
||||||
automap_next <= 1'b1;
|
automap_next <= 1'b1;
|
||||||
automap <= 1'b1;
|
automap0 <= 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else if (!bus.m1) begin
|
else if (!bus.m1) begin
|
||||||
automap <= automap_next;
|
automap0 <= automap_next;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
// #3Dxx entrypoint is critical for timings, so we're arming 'map' signal as soon as possible
|
||||||
|
assign automap = automap0 || (bus.m1 && bus.memreq && !magic_map && en_hooks && en && !rammap && bus.a_reg[15:8] == 8'h3D);
|
||||||
|
|
||||||
|
|
||||||
reg conmem, mapram;
|
reg conmem, mapram;
|
||||||
wire port_e3_cs = en && bus.ioreq && bus.a_reg[7:0] == 8'hE3;
|
wire port_e3_cs = en && bus.ioreq && bus.a_reg[7:0] == 8'hE3;
|
||||||
wire port_e7_cs = en && bus.ioreq && bus.a_reg[7:0] == 8'hE7;
|
wire port_e7_cs = en && bus.ioreq && bus.a_reg[7:0] == 8'hE7;
|
||||||
|
@ -16,7 +16,7 @@ module magic(
|
|||||||
input div_automap,
|
input div_automap,
|
||||||
|
|
||||||
output reg magic_mode,
|
output reg magic_mode,
|
||||||
output reg magic_map,
|
output magic_map,
|
||||||
|
|
||||||
output reg magic_reboot,
|
output reg magic_reboot,
|
||||||
output reg magic_beeper,
|
output reg magic_beeper,
|
||||||
@ -34,11 +34,12 @@ module magic(
|
|||||||
|
|
||||||
reg magic_unmap_next;
|
reg magic_unmap_next;
|
||||||
reg magic_map_next;
|
reg magic_map_next;
|
||||||
|
reg magic_map0;
|
||||||
always @(posedge clk28 or negedge rst_n) begin
|
always @(posedge clk28 or negedge rst_n) begin
|
||||||
if (!rst_n) begin
|
if (!rst_n) begin
|
||||||
n_nmi <= 1'b1;
|
n_nmi <= 1'b1;
|
||||||
magic_mode <= 1'b1;
|
magic_mode <= 1'b1;
|
||||||
magic_map <= 1'b1;
|
magic_map0 <= 1'b1;
|
||||||
magic_map_next <= 0;
|
magic_map_next <= 0;
|
||||||
magic_unmap_next <= 0;
|
magic_unmap_next <= 0;
|
||||||
end
|
end
|
||||||
@ -49,26 +50,29 @@ always @(posedge clk28 or negedge rst_n) begin
|
|||||||
magic_mode <= 1'b1;
|
magic_mode <= 1'b1;
|
||||||
end
|
end
|
||||||
|
|
||||||
if (magic_map && bus.memreq && bus.rd && bus.a_reg == 16'hf000 && !magic_map_next) begin
|
if (magic_map0 && bus.memreq && bus.rd && bus.a_reg == 16'hf000 && !magic_map_next) begin
|
||||||
magic_unmap_next <= 1'b1;
|
magic_unmap_next <= 1'b1;
|
||||||
magic_mode <= 1'b0;
|
magic_mode <= 1'b0;
|
||||||
end
|
end
|
||||||
else if (magic_map && bus.memreq && bus.rd && bus.a_reg == 16'hf008) begin
|
else if (magic_map0 && bus.memreq && bus.rd && bus.a_reg == 16'hf008) begin
|
||||||
magic_unmap_next <= 1'b1;
|
magic_unmap_next <= 1'b1;
|
||||||
magic_map_next <= 1'b1;
|
magic_map_next <= 1'b1;
|
||||||
end
|
end
|
||||||
else if (magic_unmap_next && !bus.memreq) begin
|
else if (magic_unmap_next && !bus.memreq) begin
|
||||||
magic_map <= 1'b0;
|
magic_map0 <= 1'b0;
|
||||||
magic_unmap_next <= 1'b0;
|
magic_unmap_next <= 1'b0;
|
||||||
end
|
end
|
||||||
else if (magic_mode && bus.m1 && bus.memreq && (bus.a_reg == 16'h0066 || magic_map_next)) begin
|
else if (magic_mode && bus.m1 && bus.memreq && (bus.a_reg == 16'h0066 || magic_map_next)) begin
|
||||||
n_nmi <= 1'b1;
|
n_nmi <= 1'b1;
|
||||||
magic_map <= 1'b1;
|
magic_map0 <= 1'b1;
|
||||||
magic_map_next <= 1'b0;
|
magic_map_next <= 1'b0;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
// this signal is critical for timings, so we're arming it as soon as possible
|
||||||
|
assign magic_map = magic_map0 || (magic_mode && bus.m1 && bus.memreq && (bus.a_reg == 16'h0066 || magic_map_next) && !magic_unmap_next);
|
||||||
|
|
||||||
|
|
||||||
/* MAGIC CONFIG */
|
/* MAGIC CONFIG */
|
||||||
wire config_cs = magic_map && bus.ioreq && bus.a_reg[7:0] == 8'hFF;
|
wire config_cs = magic_map && bus.ioreq && bus.a_reg[7:0] == 8'hFF;
|
||||||
|
@ -52,7 +52,7 @@ module memcontrol(
|
|||||||
|
|
||||||
reg romreq, ramreq, ramreq_wr;
|
reg romreq, ramreq, ramreq_wr;
|
||||||
reg [18:13] va_18_13;
|
reg [18:13] va_18_13;
|
||||||
always @(posedge clk28) begin
|
always @(negedge clk28) begin
|
||||||
romreq = bus.mreq && bus.a[15:14] == 2'b00 &&
|
romreq = bus.mreq && bus.a[15:14] == 2'b00 &&
|
||||||
(magic_map || (!div_ram && div_map) || (!div_ram && !port_dffd[4] && !port_1ffd[0]));
|
(magic_map || (!div_ram && div_map) || (!div_ram && !port_dffd[4] && !port_1ffd[0]));
|
||||||
ramreq = bus.mreq && !romreq;
|
ramreq = bus.mreq && !romreq;
|
||||||
|
@ -214,7 +214,7 @@ cpucontrol cpucontrol0(
|
|||||||
.machine(machine),
|
.machine(machine),
|
||||||
.screen_contention(screen_contention),
|
.screen_contention(screen_contention),
|
||||||
.turbo(turbo),
|
.turbo(turbo),
|
||||||
.ext_wait_cycle(div_wait || up_active),
|
.ext_wait_cycle(div_wait),
|
||||||
.init_done_in(init_done),
|
.init_done_in(init_done),
|
||||||
|
|
||||||
.n_rstcpu(n_rstcpu),
|
.n_rstcpu(n_rstcpu),
|
||||||
|
@ -1,20 +1,22 @@
|
|||||||
DEVICE ZXSPECTRUM48
|
DEVICE ZXSPECTRUM48
|
||||||
|
|
||||||
ORG #8000 // mapped #0000
|
ORG #0000
|
||||||
Start:
|
Start:
|
||||||
nop
|
nop
|
||||||
jp #1000
|
jp Main
|
||||||
|
|
||||||
ORG #8038
|
ORG #0038
|
||||||
Int1:
|
Int1:
|
||||||
reti
|
reti
|
||||||
|
|
||||||
ORG #8066
|
ORG #0066
|
||||||
Nmi:
|
Nmi:
|
||||||
retn
|
retn
|
||||||
|
|
||||||
ORG #9000
|
ORG #1000
|
||||||
Main:
|
Main:
|
||||||
|
jp #3D00
|
||||||
|
|
||||||
im 2
|
im 2
|
||||||
ei
|
ei
|
||||||
|
|
||||||
@ -35,23 +37,44 @@ Main:
|
|||||||
//ld b, #ff
|
//ld b, #ff
|
||||||
//ld hl, #4000
|
//ld hl, #4000
|
||||||
//otir
|
//otir
|
||||||
|
|
||||||
jp #1fff
|
|
||||||
Loop:
|
Loop:
|
||||||
halt
|
halt
|
||||||
jr Loop
|
jr Loop
|
||||||
|
|
||||||
|
|
||||||
ORG #C000 // mapped #0000
|
ORG #8000 // mapped #0000
|
||||||
|
MagicROM_Start:
|
||||||
|
ld bc, #09ff ; divmmc = 1
|
||||||
|
ld a, 1 ; ...
|
||||||
|
out (c), a ; ...
|
||||||
|
ld bc, #03ff ; cpu freq = 7mhz
|
||||||
|
ld a, 3 ; ...
|
||||||
|
out (c), a ; ...
|
||||||
|
ld bc, #0000
|
||||||
|
push bc
|
||||||
|
jp #f008
|
||||||
|
ORG #F000
|
||||||
|
MagicROM_ExitVector:
|
||||||
|
ret
|
||||||
|
ORG #F008
|
||||||
|
MagicROM_ReadoutVector:
|
||||||
|
nop
|
||||||
|
ret
|
||||||
|
|
||||||
|
ORG #A000 // mapped #0000
|
||||||
DivROM_Start:
|
DivROM_Start:
|
||||||
nop
|
nop
|
||||||
ld bc, #3D00
|
ld bc, #1000
|
||||||
push bc
|
push bc
|
||||||
jp #1FFF
|
jp #1FFF
|
||||||
ORG #DFFF // mapped #1FFF
|
ORG #BFFF // mapped #1FFF
|
||||||
nop
|
DivROM_ExitVector:
|
||||||
|
ret
|
||||||
ORG #1D00 // mapped #3D00
|
ORG #1D00 // mapped #3D00
|
||||||
jp #0000
|
DivROM_EnterVector_TRDOS:
|
||||||
|
ld bc, #1000
|
||||||
|
push bc
|
||||||
|
jp #1FFF
|
||||||
|
|
||||||
|
|
||||||
SAVEBIN "rom.bin",0,65536
|
SAVEBIN "rom.bin",0,65536
|
||||||
|
Reference in New Issue
Block a user