Warp-SE/cpld/CS.v

77 lines
2.7 KiB
Coq
Raw Normal View History

2021-10-29 10:04:59 +00:00
module CS(
/* MC68HC000 interface */
2024-10-15 07:29:31 +00:00
input [23:1] A, input CLK, input nRES, input nWE,
2021-10-29 10:04:59 +00:00
/* AS cycle detection */
input BACT,
/* QoS enable input */
2024-10-03 09:51:10 +00:00
input QoSEN,
2021-10-29 10:04:59 +00:00
/* Device select outputs */
2024-10-20 23:51:05 +00:00
output IOCS, output IORealCS, output IOPWCS,
output ROMCS, output ROMCS4X,
2024-10-03 11:59:29 +00:00
output RAMCS, output RAMCS0X,
2024-10-15 07:29:31 +00:00
output IACKCS, output IACK0CS, output IACK1CS,
output VIACS, output IWMCS,
2024-10-11 20:41:31 +00:00
output SCCCS, output SCSICS, output SndCSWR,
output SetCSWR);
2021-10-29 10:04:59 +00:00
/* Overlay control */
reg Overlay;
2023-03-31 10:14:47 +00:00
always @(posedge CLK) begin
if (!BACT && !nRES) Overlay <= 1;
else if (BACT && ROMCS4X) Overlay <= 0;
2021-10-29 10:04:59 +00:00
end
/* I/O select signals */
2024-10-20 23:51:05 +00:00
assign IACKCS = A[23:20]==4'hF && A[19];
2024-10-15 07:29:31 +00:00
assign IACK0CS = IACKCS && A[1];
assign IACK1CS = IACKCS && A[2];
2024-10-11 20:41:31 +00:00
assign VIACS = A[23:20]==4'hE;
assign IWMCS = A[23:20]==4'hD;
assign SCCCS = A[23:20]==4'hB || A[23:20]==4'h9;
assign SCSICS = A[23:20]==4'h5;
/* ROM select signals */
assign ROMCS4X = A[23:20]==4'h4;
2024-10-20 23:51:05 +00:00
wire ROMCSF0X = A[23:16]==8'hF0;
assign ROMCS = Overlay || ROMCS4X || ROMCSF0X;
/* RAM select signals */
assign RAMCS0X = A[23:22]==2'b00;
2023-04-07 06:33:04 +00:00
assign RAMCS = RAMCS0X && !Overlay;
wire VidRAMCSWR64k = A[23:16]==8'h3F && !nWE; // 3F0000-3FFFFF
wire VidRAMCSWR = VidRAMCSWR64k; //&& (
//A[15:12]==4'h2 || // 1792 bytes RAM, 2304 bytes video
//A[15:12]==4'h3 || // 4096 bytes video
//A[15:12]==4'h4 || // 4096 bytes video
//A[15:12]==4'h5 || // 4096 bytes video
//A[15:12]==4'h6 || // 4096 bytes video
//A[15:12]==4'h7 || // 3200 bytes video, 896 bytes RAM
//A[15:12]==4'hA || // 256 bytes RAM, 768 bytes sound, 768 bytes RAM, 2304 bytes video
//A[15:12]==4'hB || // 4096 bytes video
//A[15:12]==4'hC || // 4096 bytes video
//A[15:12]==4'hD || // 4096 bytes video
2024-09-24 05:11:57 +00:00
//A[15:12]==4'hE || // 4096 bytes video
//A[15:12]==4'hF); // 3200 bytes video, 128 bytes RAM (system error space), 768 bytes sound
2024-10-11 20:41:31 +00:00
assign SndCSWR = VidRAMCSWR64k && (
((A[15:12]==4'hF) && (A[11:8]==4'hD || A[11:8]==4'hE || A[11:8]==4'hF)) ||
((A[15:12]==4'hA) && (A[11:8]==4'h1 || A[11:8]==4'h2 || A[11:8]==4'h3)));
2024-10-11 20:41:31 +00:00
2024-10-17 03:33:00 +00:00
assign SetCSWR = A[23:20]==4'hF && A[19:16]==4'h0 && !nWE;
2021-10-29 10:04:59 +00:00
/* Select signals - IOB domain */
assign IORealCS =
2024-10-20 23:51:05 +00:00
(A[23:20]==4'hF && A[19]) || // IACK
A[23:20]==4'hE || // VIA
A[23:20]==4'hD || // IWM
A[23:20]==4'hC || // empty / fast ROM
A[23:20]==4'hB || // SCC write
A[23:20]==4'hA || // empty
A[23:20]==4'h9 || // SCC read/reset
A[23:20]==4'h8 || // empty
A[23:20]==4'h7 || // empty (expansion RAM on final rev. A except last 64 kB)
A[23:20]==4'h6 || // empty (expansion RAM on final rev. A)
A[23:20]==4'h5; // SCSI
2024-10-03 09:51:10 +00:00
assign IOCS = IORealCS || VidRAMCSWR || QoSEN;
2024-10-15 07:29:31 +00:00
assign IOPWCS = IACKCS || (VidRAMCSWR64k && !QoSEN); // Posted write to video RAM only when QoS disabled
2021-10-29 10:04:59 +00:00
endmodule