Код:
-- =====================================================
-- === AUDIO OUT =======================================
-- =====================================================
DAC_DATA = DFFE(DFF(AUDIO_R15,CT2,,),!CT2,,,);
-- DAC_DATA = DFF(AUDIO_R15,CLK42,,);
-- DAC_DATA = AUDIO_R15;
DAC_WS = DFF(CTH1,CLK42,,);
DAC_BCK = DFF(CT2,CLK42,,);
AUDIO_R[15..0].clk = CLK42;
AUDIO_R[15..0].ena = !CT2 & DFF(CT2,CLK42,,);
AUDIO_CH = DFF(((CTH0,CT[5..3]) == 15),CT2,,);
IF AUDIO_CH THEN
AUDIO_R[15..0].d = AY_CHS[15..0];
ELSE
AUDIO_R[15..0].d = (AUDIO_R[14..0],GND);
END IF;
-- ====== COVOX ==========
CBL_MODE = CBL_XX7;
CBL_STEREO = CBL_XX6;
CBL_MODE16 = CBL_XX5;
CBL_INT_ENA = CBL_XX4;
CBL_INT = DFF(GND,!CBL_CNT6,,(CBL_INT_ENA & (/IO or /M1)));
CBL_XX[].clk = /IOWR;
CBL_XX[].ena = DFF((DCPP[] == B"10001001"),CLK42,,); -- 89
CBL_XX[] = D[];
CBL_CTX[].clk = !CTH1;
CBL_CNT[].clk = !CTH1;
CASE CBL_XX[3..0] IS
WHEN 0 => CBL_TAB[] = 13; -- 16khz -- mono/stereo
WHEN 1 => CBL_TAB[] = 9; -- 22khz -- mono/stereo
WHEN 2 => CBL_TAB[] = 0; -- reserved
WHEN 3 => CBL_TAB[] = 0; -- reserved
WHEN 4 => CBL_TAB[] = 0; -- reserved
WHEN 5 => CBL_TAB[] = 0; -- reserved
WHEN 6 => CBL_TAB[] = 0; -- reserved
WHEN 7 => CBL_TAB[] = 0; -- reserved
WHEN 8 => CBL_TAB[] = 27; -- 7.8125 KHz -- mono/stereo 8/16 bit
WHEN 9 => CBL_TAB[] = 19; -- 10.9375 KHz -- mono/stereo 8/16 bit
WHEN 10=> CBL_TAB[] = 13; -- 15.625 KHz -- mono/stereo 8/16 bit
WHEN 11=> CBL_TAB[] = 9; -- 21.875 KHz -- mono/stereo 8/16 bit
WHEN 12=> CBL_TAB[] = 6; -- 31.25 KHz -- mono/stereo 8/16 bit
WHEN 13=> CBL_TAB[] = 4; -- 43.75 KHz -- mono/stereo 8/16 bit
WHEN 14=> CBL_TAB[] = 3; -- 54.6875 KHz -- mono/stereo 8/16 bit
WHEN 15=> CBL_TAB[] = 1; -- 109.375 KHz -- mono/stereo 8/16 bit
-- WHEN 15=> CBL_TAB[] = 0; -- (218.75)KHz -- stereo 110 only
END CASE;
IF (CBL_CTX[] == 0) THEN
CBL_CTX[].d = CBL_TAB[];
ELSE
CBL_CTX[].d = CBL_CTX[] - 1;
END IF;
CASE (CBL_STEREO,LCELL(CBL_CTX[] == 0)) IS
WHEN 0,2 => CBL_CNT[].d = CBL_CNT[];
WHEN 1 => CBL_CNT[].d = CBL_CNT[]+1;
WHEN 3 => CBL_CNT[].d = CBL_CNT[]+2;
END CASE;
CBL_CNT[].clrn = CBL_MODE;
CBL_IND = CBL_CNT7 xor CBL_WA7;
-- CBL_WR = DFF((DCPP[] == B"10001000"),CLK42,,) & !/IOWR; -- 88
CBL_WR = (DFF((DCPP[] == B"10001000"),CLK42,,) & !/IOWR) or
(DFF((DECODE.PAGE[7..0] == B"11111101"),CLK42,(CBL_INT_ENA & ACC.ACC_DIR1),) &
!DFF((DECODE.MC_WRITE or DECODE.CAS),CLK42,,/RESET));
CBL_WAE = CBL_MODE16 & DFF(!CBL_WAE,!CBL_WR,,CBL_INT);
CBL_WA[].clk = !CBL_WR;
CBL_WA[].ena = !CBL_WAE;
CBL_WA[7].clrn = CBL_MODE & CBL_INT_ENA & (CBL_INT or !CBL_CNT7);
CBL_WA[7].prn = (CBL_INT or CBL_CNT7);
CBL_WA[6..0].clrn = CBL_MODE & CBL_INT_ENA & CBL_INT;
CBL_WA[].d = CBL_WA[] + 1;
CBD[].clk = !CBL_WR;
CBD[].ena = CBL_WAE;
-- CBD[].d = D[];
CBD[].d = ACC.MDO[7..0];
CBD[].clrn = CBL_MODE16;
CBL.wren = (CBL_WR & !CBL_WAE);
-- CBL.data[] = ((D7 xor CBL_MODE16),D[6..0],CBD[]);
CBL.data[] = ((ACC.MDO15 xor CBL_MODE16),ACC.MDO[14..8],CBD[]);
CBL.wraddress[] = ((!A[15..8]) & !CBL_INT_ENA) xor CBL_WA[];
CBL.wrclock = CLK42;
CBL.wrclken = VCC;
CBL.rden = VCC;
CBL.rdaddress[] = (CBL_CNT[7..1],LCELL((CBL_CNT0 & !CBL_STEREO) or (AUDIO_CH & CBL_STEREO)));
CBL.rdclock = CLK42;
CBL.rdclken = VCC;
CBL_R[].ena = DFF((CBL_MODE or (CBL_WR)),CLK42,,);
CBL_R[].CLK = CLK42;
CBL_R[15].prn = /RESET;
CBL_R[14..0].clrn = /RESET;
CASE CBL_MODE IS
WHEN 0 => CBL_R[] = (D[7..0],B"00000000");
WHEN 1 => CBL_R[] = CBL.q[];
END CASE;
-- ====== AY-3-8910 ========
AY3.CLK42 = CLK42;
AY3./RESET = /RESET;
AY3.AY_T[8..0] = (CTH[2..0],CT[5..0]);
AY3.AY_D_WR = DFF((DECODE./IOM or /WR) or !DFF((DCPP[] == H"91"),CLK42,,),CLK42,,);
AY3.AY_A_WR = DFF((DECODE./IOM or /WR) or !DFF((DCPP[] == H"90"),CLK42,,),CLK42,,);
AY3.D[7..0] = D[];
AY3.BEEPER = BORDER4;
-- AY3.DO[7..0] : OUTPUT;
-- AY3.AY_CH_A[3..0] : OUTPUT;
-- AY3.AY_CH_B[3..0] : OUTPUT;
-- AY3.AY_CH_C[3..0] : OUTPUT;
AY_FULL[].clk = CLK42;
-- AY_CHS[].clk = !CTH0;
AY_CHS[].clk = !DFF((CTH1 & (CTH0 or !CT5)),CLK42,,);
AY_CHS[].ena = VCC;
-- AY_FULL[] = (GND,AY_CH_L[]) + (GND,AY_CH_R[]);
CASE DFF(CTH0,CLK42,,) IS
WHEN 0 => AY_FULL[] = (AY3.AY_CH_L[],GND);
WHEN 1 => AY_FULL[] = (AY3.AY_CH_R[],GND);
END CASE;
-- AY_CHS[].d = (((GND,AY_FULL[]) + (VCC,CBL.q[15..5])),B"0000");
-- AY_CHS[].d = (((GND,AY_FULL[]) + (VCC,CBL.q[15..8],B"000")),B"0000");
AY_CHS[].d = (((GND,AY_FULL[]) + (VCC,CBL_R[15..5])),CBL_R[4..1]);