Sprinter-BIOS/src/altera/acex/k30/DCP.TDF

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;