mirror of
https://github.com/Tolik-Trek/Sprinter-BIOS.git
synced 2026-06-15 01:11:47 +03:00
751 lines
16 KiB
Plaintext
751 lines
16 KiB
Plaintext
|
|
TITLE "DCP";
|
|
|
|
PARAMETERS
|
|
(
|
|
UPDATE = 1
|
|
);
|
|
|
|
INCLUDE "lpm_ram_dp";
|
|
-- INCLUDE "DC_PORT2";
|
|
|
|
SUBDESIGN dcp
|
|
(
|
|
CLK42 : INPUT;
|
|
/RESET : INPUT;
|
|
|
|
/RES : OUTPUT;
|
|
|
|
CT[2..0] : INPUT;
|
|
|
|
CONTINUE : INPUT;
|
|
RAS : OUTPUT;
|
|
CAS : OUTPUT;
|
|
MC_END : OUTPUT;
|
|
MC_BEGIN : OUTPUT;
|
|
MC_TYPE : OUTPUT;
|
|
MC_WRITE : OUTPUT;
|
|
|
|
A[15..0] : INPUT;
|
|
DI[7..0] : INPUT;
|
|
DO[7..0] : OUTPUT;
|
|
MA[11..0] : OUTPUT;
|
|
MCA[1..0] : OUTPUT;
|
|
|
|
TURBO_HAND : INPUT;
|
|
CLK_Z80 : OUTPUT;
|
|
TURBO : OUTPUT;
|
|
|
|
/IO : INPUT;
|
|
/RD : INPUT;
|
|
/WR : INPUT;
|
|
/MR : INPUT;
|
|
/RF : INPUT;
|
|
/M1 : INPUT;
|
|
|
|
/WAIT : OUTPUT;
|
|
/IOM : OUTPUT;
|
|
/IOMM : OUTPUT;
|
|
|
|
MD[7..0] : INPUT;
|
|
RA[17..14] : OUTPUT;
|
|
PAGE[11..0] : OUTPUT;
|
|
|
|
TYPE[3..0] : OUTPUT;
|
|
|
|
CS_ROM : OUTPUT;
|
|
CS_RAM : OUTPUT;
|
|
V_RAM : OUTPUT;
|
|
PORT : OUTPUT;
|
|
-- DOS : OUTPUT;
|
|
DOS : INPUT;
|
|
|
|
WR_DWG : OUTPUT;
|
|
|
|
WR_TM9 : OUTPUT;
|
|
WR_AWG : OUTPUT;
|
|
RD_KP11 : OUTPUT;
|
|
KP11_MIX : OUTPUT;
|
|
|
|
REFRESH : INPUT;
|
|
|
|
G_LINE[9..0]: INPUT;
|
|
GA[9..0] : OUTPUT;
|
|
GRAF : OUTPUT;
|
|
|
|
SP_SCR : OUTPUT;
|
|
SP_SA : OUTPUT;
|
|
SCR128 : OUTPUT;
|
|
|
|
TEST_R : INPUT;
|
|
|
|
HDD_DATA : OUTPUT;
|
|
HDD_FLIP : OUTPUT;
|
|
RAM : OUTPUT;
|
|
BLK_R : OUTPUT;
|
|
|
|
PN4Q : OUTPUT;
|
|
|
|
ACC_ON : INPUT; -- asselerator state - 1 - present
|
|
|
|
DCPP[7..0] : OUTPUT;
|
|
|
|
DOUBLE_CAS : INPUT;
|
|
|
|
BLK_MEM : INPUT;
|
|
|
|
)
|
|
VARIABLE
|
|
|
|
CLK21 : NODE;
|
|
|
|
-- DC : DC_PORT2;
|
|
|
|
CLK84 : NODE;
|
|
CLK42X : NODE;
|
|
|
|
CTZ[1..0] : DFF;
|
|
|
|
-- CT[2..0] : DFF;
|
|
|
|
MEM : LPM_RAM_DP WITH (LPM_WIDTH=16,LPM_WIDTHAD=8,LPM_FILE="DCP.MIF");
|
|
|
|
D[7..0] : NODE;
|
|
ADR8_MEM : NODE;
|
|
MEM_D[15..0]: NODE;
|
|
MEM_WR : NODE;
|
|
|
|
DCP_CX : NODE;
|
|
SC_LCELL : NODE;
|
|
|
|
PG3[5..0] : NODE;
|
|
PG0[5..0] : NODE;
|
|
MPGS[7..0] : LCELL;
|
|
PGS[7..0] : DFF;
|
|
-- PGS[7..0] : NODE;
|
|
|
|
PN[7..0] : DFFE;
|
|
SC[7..0] : DFFE;
|
|
SYS : DFFE;
|
|
CNF[7..0] : DFFE;
|
|
AROM16 : DFFE;
|
|
TB_SW : DFFE;
|
|
|
|
CASH_ON : NODE;
|
|
NMI_ENA : NODE;
|
|
|
|
DD[7..0] : DFFE;
|
|
STARTING : NODE;
|
|
|
|
-- DOS_ : NODE;
|
|
-- DOS : NODE;
|
|
-- DOS_ON_ : NODE;
|
|
|
|
MC_RQ : NODE;
|
|
MC_END : DFFE;
|
|
MC_BEGIN : DFFE;
|
|
MC_TYPE : DFFE;
|
|
MC_WRITE : DFFE;
|
|
RAS : DFFE;
|
|
CAS : DFFE;
|
|
|
|
MA_[11..0] : DFFE;
|
|
MCA[1..0] : DFFE;
|
|
|
|
/IOM : DFFE;
|
|
/IOMM : DFFE;
|
|
/IOMX : DFFE;
|
|
/IOMY : DFFE;
|
|
|
|
WT_CT[3..0] : DFFE;
|
|
W_TAB[3..0] : LCELL;
|
|
HDD_W[3..0] : NODE;
|
|
/IO_WAIT : NODE;
|
|
/MR_WAIT : NODE;
|
|
|
|
MEM_RW : NODE;
|
|
IO_RW : NODE;
|
|
IO_RWM : NODE;
|
|
|
|
MA_CT[1..0] : DFFE;
|
|
|
|
WR_TM9 : DFFE;
|
|
RD_KP11 : DFFE;
|
|
|
|
/RES : NODE;
|
|
|
|
RFT : DFF;
|
|
RFC : DFFE;
|
|
|
|
GRAF : DFFE;
|
|
GRAF_X : NODE;
|
|
GA[9..0] : LCELL;
|
|
|
|
SP_SCR : LCELL;
|
|
SP_SA : LCELL;
|
|
|
|
HDD_FLIP : DFFE;
|
|
/IOMZ : DFFE;
|
|
|
|
HDD_DATA : NODE;
|
|
HDD_ENA : NODE;
|
|
|
|
BLK_C : NODE;
|
|
/CASH : NODE;
|
|
|
|
DCPP[7..0] : DFFE;
|
|
|
|
PORTS_X : NODE;
|
|
|
|
NO_IO_WAIT : NODE;
|
|
|
|
DCP_RES : NODE;
|
|
|
|
HDD_A[3..0] : DFF;
|
|
|
|
X_ADR[11..0]: LCELL;
|
|
X_MA_[11..0]: LCELL;
|
|
|
|
WR_AWGX : NODE;
|
|
|
|
/IOWR : NODE;
|
|
|
|
RA[17..14] : LCELL;
|
|
|
|
-- SPR_[1..0] : NODE;
|
|
SPR_[1..0] : LCELL;
|
|
|
|
SYS_ENA : NODE;
|
|
|
|
BEGIN
|
|
|
|
%
|
|
-- DC.CLK42 = CLK42;
|
|
-- DC./RESET = /RESET;
|
|
--
|
|
-- DC.A[15..0] = A[15..0];
|
|
--
|
|
-- DC./IO = /IO;
|
|
-- DC./WR = /WR;
|
|
-- DC./M1 = /M1;
|
|
--
|
|
-- -- DC./IOM;
|
|
-- -- DC./IOMM;
|
|
-- -- DC.DCP[7..0];
|
|
--
|
|
-- DC.DOS = DOS;
|
|
-- DC.CNF[1..0]= CNF[4..3];
|
|
--
|
|
-- DC.SYS = SYS;
|
|
--
|
|
-- -- DC.PORT_X;
|
|
%
|
|
|
|
|
|
-- ==============================================================
|
|
%
|
|
-- CT[].clk = CLK42;
|
|
--
|
|
-- IF CT1 THEN
|
|
-- CT[1..0] = GND;
|
|
-- CT2 = !CT2;
|
|
-- ELSE
|
|
-- CT[1..0] = CT[1..0]+1;
|
|
-- CT2 = CT2;
|
|
-- END IF;
|
|
%
|
|
|
|
/RES = DFFE(VCC,CLK42,,,CT0);
|
|
-- ==============================================================
|
|
|
|
-- TURBO = DFFE((TB_SW & TURBO_HAND),CLK42,,/RESET,CLK_Z80);
|
|
TURBO = DFF(DFFE((TB_SW & TURBO_HAND),CLK_Z80,,/RESET,!/RF),CLK42,,);
|
|
|
|
CLK84 = CLK42 xor LCELL(CLK42X);
|
|
CLK42X = DFF(!CLK42X,CLK84,,);
|
|
|
|
CTZ[].clk = CLK84 xor CTZ1;
|
|
CTZ[] = CTZ[]+1;
|
|
|
|
-- CLK_Z80 = CTZ1;
|
|
|
|
-- CLK_Z80 = DFF((!CLK21 & TURBO) or (TFF((CT2 & CT1),CLK42,,) & !TURBO),!CLK42,,);
|
|
-- CLK_Z80 = DFF((CLK21 & TURBO) or (TFF((CT2 & CT1),CLK42,,) & !TURBO),!CLK42,,);
|
|
|
|
CLK_Z80 = DFF((CLK21 & TURBO) or (TFF((!CT2 & CT1),CLK42,,) & !TURBO),!CLK42,,);
|
|
-- CLK_Z80 = DFF((!CLK21 & TURBO) or (TFF((!CT2 & CT1),CLK42,,) & !TURBO),!CLK42,,);
|
|
|
|
-- ==============================================================
|
|
CLK21 = DFF((!CT0 xor CT2),CLK42,,);
|
|
-- === Adress Multiplexer =======================================
|
|
|
|
MA_[].clk = CLK42;
|
|
-- MA_[].ena = (CT2 xor CT0);
|
|
MA_[].ena = CLK21;
|
|
|
|
WR_TM9.clk = CLK42;
|
|
-- WR_TM9.ena = (CT2 xor CT0);
|
|
WR_TM9.ena = CLK21;
|
|
WR_TM9.prn = /RES;
|
|
|
|
RD_KP11.clk = !CLK42;
|
|
-- RD_KP11.ena = (CT2 xor CT0);
|
|
RD_KP11.ena = CLK21;
|
|
RD_KP11.prn = /RES;
|
|
RD_KP11.d = !(MA_CT[] == 0);
|
|
|
|
-- WR_AWGX = DFF((WR_TM9 or CLK21),!CLK42,,);
|
|
WR_AWGX = DFF(GND,!WR_TM9,,DFF(WR_AWGX,CLK42,,));
|
|
|
|
-- WR_TM9 = (!MA_CT1 or (!IO_RW & !PORTS_X));
|
|
WR_TM9 = (!MA_CT1 or (!/IO & !PORTS_X));
|
|
|
|
WR_AWG = WR_AWGX;
|
|
|
|
KP11_MIX = TFF(VCC,RD_KP11,,);
|
|
|
|
WR_DWG = !MC_BEGIN;
|
|
-- WR_DWG = DFF(!MC_BEGIN,CLK42,,);
|
|
-- WR_DWG = LCELL(!MC_BEGIN);
|
|
|
|
-- MA_CT[].ena = (CT2 xor CT0);
|
|
MA_CT[].ena = CLK21;
|
|
MA_CT[].clk = CLK42;
|
|
|
|
IF !LCELL(CT2 & !CT1) THEN
|
|
MA_CT[] = MA_CT[]+1;
|
|
ELSE
|
|
MA_CT[] = GND;
|
|
END IF;
|
|
|
|
%
|
|
-- MA_[11..0] bit0 - WG_A5
|
|
-- bit1 - WG_A6
|
|
-- bit2 - MUX_KP11, 0 - WG,CMOS 1 - KMPS,TM9
|
|
-- bit3 - RD/WR 0 - WRITE 1 - READ
|
|
-- bit4 - CS_WG93 or WR_TM9
|
|
-- bit5 - HDD/CMOS strobe
|
|
-- bit7,6 - 00 - not
|
|
-- 01 - ????
|
|
-- 10 - HDD1/2
|
|
-- 11 - CMOS
|
|
-- bit8 - HDD CS1/CS3 or CMOS data/adr
|
|
-- bit9,10,11 - HDD_A[2..0]
|
|
%
|
|
CASE A[15..14] IS
|
|
WHEN 0 => SP_SCR = GND; SP_SA = GND;
|
|
WHEN 1 => SP_SCR = !GRAF; SP_SA = GND;
|
|
WHEN 2 => SP_SCR = GND; SP_SA = PG3[1];
|
|
WHEN 3 => SP_SCR = !GRAF & LCELL(PG3[] == B"1101X1"); SP_SA = PG3[1];
|
|
END CASE;
|
|
|
|
CASE GRAF IS
|
|
WHEN 0 => GA[] = (GND,GND,MEM.q[3..0],A[13..10]);
|
|
-- WHEN 1 => GA[] = (VCC,(G_LINE[8..0] + (B"00000",A[13..10])));
|
|
WHEN 1 => GA[] = (VCC,G_LINE[8..0]);
|
|
END CASE;
|
|
|
|
CASE (IO_RW,MA_CT0) IS
|
|
WHEN 0 => X_ADR[] = (GND,CNF4,PN5,DOS,/WR,A15,A14,A[6..5],A13,A7,A[2]);
|
|
WHEN 1 => X_ADR[] = (GND,GND,CNF[4..3],B"01000000");
|
|
WHEN 2 => X_ADR[] = (GND,GA3,GA[1..0],A[9..2]);
|
|
WHEN 3 => X_ADR[] = (GND,GND,GA[3..2],MEM.q[7..4],GA[7..4]);
|
|
END CASE;
|
|
|
|
CASE IO_RW IS
|
|
WHEN 0 => X_MA_[] = (HDD_A[2..0],MEM.q[8..6],((MEM.q[5..4]) & (!/IOMZ,!/IOMY)),/WR,MEM.q2,A[6..5]);
|
|
WHEN 1 => X_MA_[] = (HDD_A[2..0],B"00000",/WR,VCC,A[6..5]);
|
|
END CASE;
|
|
%
|
|
-- CASE MA_CT1 IS
|
|
---- WHEN 0 => MA_[] = X_ADR[];
|
|
-- WHEN 0 => MA_[] = (GND,X_ADR[10..0]);
|
|
-- WHEN 1 => MA_[] = (HDD_A[2..0],X_MA_[8..4],/WR,X_MA_[3],A[6..5]);
|
|
-- END CASE;
|
|
%
|
|
|
|
CASE (IO_RW,MA_CT1) IS
|
|
WHEN B"00" =>
|
|
MA_[] = (X_ADR[11..0]);
|
|
WHEN B"01" =>
|
|
MA_[] = (HDD_A[2..0],MEM.q[8..6],((MEM.q[5..4]) & (!/IOMZ,!/IOMY)),/WR,MEM.q2,A[6..5]);
|
|
WHEN B"10" =>
|
|
MA_[] = (X_ADR[11..0]);
|
|
WHEN B"11" =>
|
|
MA_[] = (HDD_A[2..0],B"00000",/WR,VCC,A[6..5]);
|
|
END CASE;
|
|
|
|
MA[] = MA_[];
|
|
|
|
MCA[].ena = CT2 & CT1;
|
|
MCA[].clk = CLK42;
|
|
MCA[] = A[1..0]; -- adress for CAS
|
|
|
|
HDD_A[].clk = CLK42;
|
|
CASE (A[14],A[2..0]) IS
|
|
WHEN 0 => HDD_A[] = 0;
|
|
WHEN 1 => HDD_A[] = 1;
|
|
WHEN 2 => HDD_A[] = 2;
|
|
WHEN 3 => HDD_A[] = 3;
|
|
WHEN 4 => HDD_A[] = 4;
|
|
WHEN 5 => HDD_A[] = 5;
|
|
WHEN 6 => HDD_A[] = 0;
|
|
WHEN 7 => HDD_A[] = 0;
|
|
WHEN 8 => HDD_A[] = 0;
|
|
WHEN 9 => HDD_A[] = 0;
|
|
WHEN 10 => HDD_A[] = 6;
|
|
WHEN 11 => HDD_A[] = 7;
|
|
WHEN 12 => HDD_A[] = 14;
|
|
WHEN 13 => HDD_A[] = 15;
|
|
WHEN 14 => HDD_A[] = 0;
|
|
WHEN 15 => HDD_A[] = 0;
|
|
END CASE;
|
|
|
|
|
|
-- === Memory Sinchronizer ======================================
|
|
|
|
|
|
% RF | MEM | RF
|
|
____ | | _______
|
|
/MR \__________/
|
|
| |
|
|
_____| | _______
|
|
MC_BEGIN \________/
|
|
| |__
|
|
MC_END ____________/ \_______
|
|
______ |__________
|
|
MC_TYPE \_____/
|
|
| |
|
|
RAS __ _ ___ __
|
|
\__/|\__/ | \__/
|
|
____ _ __
|
|
CAS \__/ | \__/|\__/
|
|
| |
|
|
|
|
%
|
|
|
|
-- MC_RQ = DFF(((/MR & DFF(/IO,CLK42,,)) or (/RD & /WR)),CLK42,,);
|
|
|
|
-- MC_RQ = DFF(((/MR & DFFE(GND,!CLK42,,!/IO,CT0)) or (/RD & /WR)),!CLK42,,);
|
|
|
|
-- MC_RQ = DFF((((/MR or !/RF) & DFF(/IO,CLK42,,/M1)) or (/RD & /WR)),CLK42,,);
|
|
|
|
-- MC_RQ = DFF((((/MR or !/RF) & IO_RW) or (/RD & /WR)),CLK42,,);
|
|
|
|
-- MC_RQ = DFF(((MEM_RW & IO_RW) or (/RD & /WR)),CLK42,,);
|
|
|
|
MC_RQ = DFF(((MEM_RW & DFF(DFF(IO_RW,CLK42,,!/IO),CLK42,,!/IO)) or (/RD & /WR)),!CLK42,,);
|
|
|
|
MC_BEGIN.clk= CLK42;
|
|
MC_BEGIN.ena= CT1 & CT2;
|
|
MC_BEGIN.d = MC_RQ;
|
|
MC_BEGIN.prn= !(/MR & /IO);
|
|
|
|
MC_END.clk = CLK42;
|
|
MC_END.d = VCC;
|
|
MC_END.ena = (CT0 & CT2) & !MC_BEGIN & CONTINUE & !BLK_C;
|
|
MC_END.clrn = !(/MR & /IO);
|
|
|
|
MC_TYPE.clk = CLK42;
|
|
MC_TYPE.ena = CT1 & CT2;
|
|
MC_TYPE.d = MC_RQ or MC_END;
|
|
MC_TYPE.prn = /RES;
|
|
|
|
MC_WRITE.clk= CLK42;
|
|
MC_WRITE.ena= CT1 & CT2;
|
|
MC_WRITE.d = MC_RQ or CS_RAM or /WR or MC_END;
|
|
MC_WRITE.prn= /RES;
|
|
|
|
RFT.clk = REFRESH;
|
|
RFT.d = GND;
|
|
RFT.prn = RFC;
|
|
-- RFT.prn = VCC;
|
|
|
|
RFC.clk = CLK42;
|
|
RFC.d = !MC_RQ or RFT;
|
|
-- RFC.d = !MC_RQ;
|
|
RFC.ena = CT1 & CT2;
|
|
|
|
RAS.ena = (!(CT1 or (CT0 xor MC_TYPE))) & (!MC_TYPE or !RFC);
|
|
CAS.ena = (!(CT1 or (CT0 xor !MC_TYPE))) & (!MC_TYPE or !RFC);
|
|
-- RAS.ena = (!(CT1 or (CT0 xor MC_TYPE)));
|
|
-- CAS.ena = (!(CT1 or (CT0 xor !MC_TYPE)));
|
|
|
|
RAS.clk = CLK42; CAS.clk = CLK42;
|
|
RAS.d = CT2; CAS.d = CT2 or BLK_C;
|
|
|
|
RAS.prn = /RES;
|
|
CAS.prn = /RES;
|
|
-- CAS.prn = !BLK_C;
|
|
|
|
-- /MR_WAIT = (MEM_RW or /CASH or DFF(MC_END,CLK42,!/MR,)) or (!TURBO & !ACC_ON);
|
|
-- /MR_WAIT = MC_END or LCELL(MEM_RW or /CASH or (!TURBO & !ACC_ON));
|
|
|
|
/MR_WAIT = LCELL(MC_END or MEM_RW or /CASH or (!TURBO & !ACC_ON));
|
|
|
|
-- MEM_RW = LCELL(/MR or !/RF);
|
|
|
|
-- anti gluk!
|
|
MEM_RW = DFF((!/RF or BLK_MEM),!/MR,,LCELL(MEM_RW or !/MR));
|
|
IO_RWM = DFF(!/M1,!/IO,,LCELL(IO_RW or !/IO));
|
|
|
|
IO_RW = DFF(/IO,CLK42,,/M1);
|
|
|
|
/IOMM.clk = CLK42;
|
|
-- /IOMM.ena = CT0 xor CT2;
|
|
/IOMM.ena = CLK21;
|
|
/IOMM.d = IO_RW or !MC_END or DFF((WT_CT[] == 0),CLK42,,);
|
|
/IOMM.prn = /RES;
|
|
|
|
/IOMX.clk = CLK42;
|
|
-- /IOMX.ena = CT0 xor CT2;
|
|
/IOMX.ena = CLK21;
|
|
/IOMX.d = /IOMM;
|
|
/IOMX.prn = /RES;
|
|
|
|
/IOMY.clk = CLK42;
|
|
-- /IOMY.ena = CT0 xor CT2;
|
|
/IOMY.ena = CLK21;
|
|
/IOMY.d = /IOMX or !MC_END or DFF((WT_CT[] == B"000X"),CLK42,,);
|
|
-- /IOMY.prn = /RES;
|
|
/IOMY.prn = PORTS_X;
|
|
|
|
PORTS_X = DFF(((DCPP[7..4] == B"0010") or (DCPP[7..4] == B"0001")),CLK42,,);
|
|
|
|
/IOMZ.clk = CLK42;
|
|
-- /IOMZ.ena = CT0 xor CT2;
|
|
/IOMZ.ena = CLK21;
|
|
/IOMZ.d = (A8 xor /RD) or /IOMX or !MC_END or DFF((WT_CT[] == B"000X"),CLK42,,);
|
|
/IOMZ.prn = PORTS_X;
|
|
|
|
HDD_DATA = DFF((HDD_ENA & DFF((MEM.q[11..8] == 0),CLK42,,) & PORTS_X),CLK42,,);
|
|
HDD_ENA = (MEM.q[7..5] == B"101");
|
|
|
|
HDD_FLIP.clk = /IOM;
|
|
HDD_FLIP.ena = HDD_ENA & DFF((DCPP[] == B"0010XXXX"),CLK42,,);
|
|
HDD_FLIP.d = !HDD_FLIP & (MEM.q[11..8] == 0);
|
|
HDD_FLIP.clrn = /RESET & DFF(GND,!DOUBLE_CAS,,HDD_FLIP);
|
|
|
|
/IOM.clk = CLK42;
|
|
-- /IOM.ena = CT0 xor CT2;
|
|
/IOM.ena = CLK21;
|
|
/IOM.d = (/IOMX & /IOM);
|
|
/IOM.prn = !/IO & /M1;
|
|
|
|
-- /IO_WAIT = LCELL(/IO or !/M1 or DFF(DFFE((WT_CT[] == 0),CLK42,,,CLK21),CLK42,,NO_IO_WAIT));
|
|
|
|
/IO_WAIT = LCELL(IO_RWM or DFF(DFFE((WT_CT[] == 0),CLK42,,,CLK21),CLK42,,NO_IO_WAIT));
|
|
|
|
NO_IO_WAIT = !DFF(((A[7..0] == B"111XX1XX") & !TURBO & DOS),CLK42,,);
|
|
-- NO_IO_WAIT = TURBO;
|
|
|
|
WT_CT[].clk = CLK42;
|
|
-- WT_CT[].ena = (CT2 xor CT0);
|
|
WT_CT[].ena = CLK21;
|
|
-- WT_CT[].ena = CT1;
|
|
WT_CT[].prn = MC_END;
|
|
|
|
CASE (/IOM,DFF((WT_CT[] == 0),CLK42,,)) IS
|
|
WHEN B"1X" => WT_CT[].d = W_TAB[];
|
|
WHEN B"00" => WT_CT[].d = WT_CT[]-1;
|
|
WHEN B"01" => WT_CT[].d = GND;
|
|
END CASE;
|
|
|
|
CASE (TURBO,MEM.q[14..12]) IS
|
|
WHEN 0 => W_TAB[] = 2; WHEN 8 => W_TAB[] = 2;
|
|
WHEN 1 => W_TAB[] = 2; WHEN 9 => W_TAB[] = 2;
|
|
WHEN 2 => W_TAB[] = 1; WHEN 10 => W_TAB[] = 4;
|
|
WHEN 3 => W_TAB[] = 1; WHEN 11 => W_TAB[] = 4;
|
|
WHEN 4 => W_TAB[] = 1; WHEN 12 => W_TAB[] = 7;
|
|
WHEN 5 => W_TAB[] = 2; WHEN 13 => W_TAB[] = 7;
|
|
-- WHEN 6 => W_TAB[] = 10; WHEN 14 => W_TAB[] = 10;
|
|
WHEN 6 => W_TAB[] = 7; WHEN 14 => W_TAB[] = 7;
|
|
-- WHEN 6 => W_TAB[] = 13; WHEN 14 => W_TAB[] = 13;
|
|
WHEN 7 => W_TAB[] = 10; WHEN 15 => W_TAB[] = 10;
|
|
END CASE;
|
|
|
|
CASE LCELL(MEM.q[11..8] == 0) IS
|
|
WHEN 0 => HDD_W[] = 10; -- registers wait
|
|
WHEN 1 => HDD_W[] = 4; -- datas wait
|
|
END CASE;
|
|
|
|
/WAIT = (/IO_WAIT & /MR_WAIT);
|
|
|
|
|
|
-- === Other Devicese CASHE, ISA, ROM... ===
|
|
|
|
V_RAM = PN2; -- for ORIGINAL Waits
|
|
|
|
IF UPDATE == 1 GENERATE
|
|
-- all ROM/RAM switches in main .tdf
|
|
BLK_R = SC4;
|
|
-- all cashes in main .tdf
|
|
/CASH = GND;
|
|
-- cashe dir in main .tdf
|
|
CASH_ON = GND;
|
|
ELSE GENERATE
|
|
-- for blk wait
|
|
/CASH = DFF((MEM.q[7..4] == 15),!CLK42,BLK_R,);
|
|
-- when BLK_R = 1 => Other Devices stay Active!
|
|
BLK_R = DFF( (LCELL((MEM.q7 & MEM.q6 & RAM) or
|
|
(MEM.q7 & LCELL(A14 & A15 & SC4))) &
|
|
!DFF(DFF(MC_RQ,CLK42,,!/MR),CLK42,,!/MR)),!CLK42,!/MR,);
|
|
CASH_ON = DFFE(A7,(/IO or /RD),/RESET,,DFF((DCPP[] == H"88"),CLK42,,));
|
|
END GENERATE;
|
|
|
|
RAM = !LCELL(A14 or A15 or (SC0 & SYS));
|
|
|
|
CS_ROM = LCELL(/MR or !RAM or !/RF);
|
|
CS_RAM = LCELL(/MR or RAM or !/RF);
|
|
|
|
-- ==============================================
|
|
|
|
-- graf screen enable for pages
|
|
|
|
GRAF_X = LCELL(MEM.q[7..4] == B"0101");
|
|
|
|
GRAF.clk = CLK42;
|
|
GRAF.ena = (CT0 & CT2);
|
|
GRAF.d = GRAF_X;
|
|
|
|
BLK_C = LCELL((GRAF_X xor GRAF) & !MC_TYPE);
|
|
|
|
-----------------------------------------
|
|
|
|
SCR128 = PN3;
|
|
|
|
D[] = DI[];
|
|
-- when not IO - reset DCPP!
|
|
|
|
DCP_RES = DFF((STARTING & !/IO & /M1),CLK42,,);
|
|
|
|
DCPP[].clk = CLK42;
|
|
DCPP[].ena = !DFF(MC_END,CLK42,,);
|
|
DCPP[].clrn = MC_END & DCP_RES; -- not in/out when START
|
|
DCPP[].d = MD[];
|
|
|
|
-- DD[].clk = !CLK42;
|
|
-- DD[].ena = !DFF(MC_END,!CLK42,,);
|
|
|
|
DD[].clk = CLK42;
|
|
DD[].ena = !DFF(MC_END,CLK42,,);
|
|
DD[].clrn = MC_END & DCP_RES;
|
|
|
|
CASE LCELL(MD[7..4] == 15) IS
|
|
WHEN 0 => DD[].d = MD[];
|
|
WHEN 1 => DD[].d = (VCC,VCC,PG3[]);
|
|
END CASE;
|
|
|
|
-- === Port Decoder =============================================
|
|
|
|
DCP_CX = (DCPP[] == B"1100XXXX");
|
|
SYS_ENA = DFF((DCP_CX & (DCPP[] == B"XXXXX110")),CLK42,,);
|
|
|
|
-- /IOWR = DFF((/WR or /IO),CLK42,,!/IO);
|
|
/IOWR = LCELL(/IO or /WR or !/M1);
|
|
|
|
CNF[].ena = SYS_ENA; CNF[].d = (DI[] & DI2) or (CNF[] & !DI2);
|
|
AROM16.ena = SYS_ENA; AROM16.d = (DI0 & !DI1) or (AROM16 & DI1);
|
|
TB_SW.ena = SYS_ENA; TB_SW.d = (DI0 & DI1) or (TB_SW & !DI1);
|
|
SYS.ena = SYS_ENA; SYS.d = !A6;
|
|
|
|
SC[].ena = DFF((DCP_CX & (DCPP[] == B"XXXXX000")),CLK42,,) ;SC[].d = DI[];
|
|
PN[].ena = DFF((DCP_CX & (DCPP[] == B"XXXXX001")),CLK42,,) ;PN[].d = DI[];
|
|
|
|
TB_SW.clk = /IOWR;
|
|
AROM16.clk = /IOWR;
|
|
PN[].clk = /IOWR;
|
|
SC[].clk = /IOWR;
|
|
SYS.clk = /IOWR;
|
|
CNF[].clk = /IOWR;
|
|
|
|
AROM16.clrn = /RESET;
|
|
TB_SW.prn = /RESET;
|
|
SYS.clrn = /RESET;
|
|
CNF[].clrn = /RESET;
|
|
|
|
SC[].clrn = /RESET & !CNF6; -- Scorpion-OFF
|
|
|
|
PN[5..0].clrn = /RESET & !CNF5; -- reset PN5
|
|
PN[7..6].clrn = /RESET & CNF7; -- set Pentagon-512
|
|
|
|
PN4Q = PN4;
|
|
|
|
-- ====================================
|
|
|
|
-- ********** Pages decoder ***********
|
|
|
|
-- ====================================
|
|
|
|
PG3[] = (!PN7,VCC,LCELL((SC4 & !CNF7) or (CNF7 & PN6)),PN[2..0]);
|
|
|
|
-- SC0,SC1,SYS,DOS,PN4,AROM16,CASH_ON,NMI_ENA
|
|
PG0[] = (VCC,GND,
|
|
LCELL(SC0 or !SYS or CASH_ON or !NMI_ENA),
|
|
LCELL(((AROM16 & !(SC0 & SYS)) or (CASH_ON & NMI_ENA))),
|
|
LCELL((SPR_1 & SC_LCELL) or !SYS or !NMI_ENA),
|
|
LCELL((SPR_0 & SC_LCELL) or !SYS or !NMI_ENA));
|
|
|
|
-- SC_LCELL = LCELL(!(SC0 & SYS) & !CASH_ON);
|
|
SC_LCELL = (!(SC0 & SYS) & !CASH_ON);
|
|
|
|
NMI_ENA = VCC;
|
|
|
|
SPR_[] = !SC1 & (DOS,(PN4 or !DOS)); -- expansion/dos/basic128/basic48
|
|
|
|
CASE (TEST_R,SYS) IS
|
|
WHEN B"X0" => RA[] = (!AROM16,B"000"); -- system 0/1
|
|
WHEN B"01" => RA[] = (!AROM16,GND,SPR_[]); -- expansion/dos/basic
|
|
WHEN B"11" => RA[] = (B"001",SPR_0); -- test
|
|
END CASE;
|
|
|
|
-- ====================================
|
|
|
|
CASE A[15..14] IS
|
|
WHEN 0 => MPGS[5..0] = PG0[];
|
|
WHEN 1 => MPGS[5..0] = B"101001"; %H"E9"%
|
|
WHEN 2 => MPGS[5..0] = B"101010"; %H"EA"%
|
|
WHEN 3 => MPGS[5..0] = PG3[];
|
|
END CASE;
|
|
MPGS[7..6] = VCC;
|
|
|
|
-- STARTING = DFF(GND,VCC,/RESET,(/IO or /RD));
|
|
STARTING = LCELL(/RESET & (STARTING or !(/IO or /RD)));
|
|
|
|
PGS[].clk = !CLK42;
|
|
CASE (LCELL(/IO & !(A14 & A15 & !STARTING)),MC_END) IS
|
|
WHEN B"1X" => PGS[] = (VCC,VCC,MPGS[5..0]);
|
|
WHEN B"01" => PGS[] = DD[];
|
|
WHEN B"00" => PGS[] = GND;
|
|
END CASE;
|
|
|
|
MEM_WR = DFFE((DCPP[7] & DCPP[6] & STARTING & DFF(DFF((MC_END & !/WR),CLK42,,),CLK42,,)),CLK42,!/IO,,CT1);
|
|
|
|
ADR8_MEM = GND;
|
|
|
|
CASE ADR8_MEM IS
|
|
WHEN 1 => MEM_D[] = (DI[],MEM.q[7..0]); DO[] = MEM.q[15..8];
|
|
WHEN 0 => MEM_D[] = (MEM.q[15..8],DI[]); DO[] = MEM.q[7..0];
|
|
END CASE;
|
|
|
|
MEM.wren = MEM_WR;
|
|
MEM.data[] = MEM_D[];
|
|
MEM.wraddress[] = PGS[];
|
|
MEM.wrclock = CLK42;
|
|
MEM.wrclken = VCC;
|
|
MEM.rden = VCC;
|
|
MEM.rdaddress[] = PGS[];
|
|
MEM.rdclock = CLK42;
|
|
MEM.rdclken = VCC;
|
|
-- = MEM.q[];
|
|
|
|
PAGE[] = MEM.q[11..0];
|
|
TYPE[] = MEM.q[15..12];
|
|
|
|
|
|
PORT = !(MEM.q[15..12] == 0) or /IO or (/RD & /WR);
|
|
|
|
END;
|
|
|
|
|