1
0
mirror of https://github.com/ibm2030/IBM2030.git synced 2026-01-11 23:52:47 +00:00
ibm2030.IBM2030/FMD2030_5-02A-B.vhd

254 lines
9.7 KiB
VHDL

---------------------------------------------------------------------------
-- Copyright 2010 Lawrence Wilkinson lawrence@ljw.me.uk
--
-- This file is part of LJW2030, a VHDL implementation of the IBM
-- System/360 Model 30.
--
-- LJW2030 is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- LJW2030 is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with LJW2030 . If not, see <http://www.gnu.org/licenses/>.
--
---------------------------------------------------------------------------
--
-- File: FMD2030_5-02A-B.vhd
-- Creation Date:
-- Description:
-- X6,X7 assembly, ASCII latch, X6,X7 backup (5-02A), WX reg gating (5-02B)
-- Page references like "5-01A" refer to the IBM Maintenance Diagram Manual (MDM)
-- for the 360/30 R25-5103-1
-- References like "02AE6" refer to coordinate "E6" on page "5-02A"
-- Logic references like "AB3D5" refer to card "D5" in board "B3" in gate "A"
-- Gate A is the main logic gate, B is the second (optional) logic gate,
-- C is the core storage and X is the CCROS unit
--
-- Revision History:
-- Revision 1.0 2010-07-09
-- Initial Release
-- Revision 1.1 2012-04-07
-- Enable MPX interruptions
---------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
library work;
use work.Gates_package.all;
use work.Buses_package.all;
ENTITY X6X7 IS
port
(
SALS : IN SALS_Bus; -- 01C
DECIMAL : IN STD_LOGIC; -- 06B
CONNECT : IN STD_LOGIC; -- 06B
N_CTRL_LM : IN STD_LOGIC; -- 06B
CTRL_N : IN STD_LOGIC; -- 06B
R_REG_0_BIT : IN STD_LOGIC; -- 06C
V67_00_OR_GM_WM : IN STD_LOGIC; -- 05A
STATUS_IN_LCHD : IN STD_LOGIC; -- 06A
OPNL_IN_LCHD : IN STD_LOGIC; -- 06A
CARRY_0_LCHD : IN STD_LOGIC; -- 06A
S_REG_1_OR_R_REG_2 : IN STD_LOGIC; -- 05A
S : IN STD_LOGIC_VECTOR(0 to 7); -- 07B
G : IN STD_LOGIC_VECTOR(0 to 7); -- 05C
TIMER_UPDATE : IN STD_LOGIC; -- 04C
EXTERNAL_INT : IN STD_LOGIC; -- 04C
MPX_INTERRUPT : IN STD_LOGIC; -- 08C
SX1_INTERRUPT : IN STD_LOGIC; -- 12D
SX2_INTERRUPT : IN STD_LOGIC; -- 14D
-- HSMPX : IN STD_LOGIC; -- XXXXX
I_WRAPPED_CPU : IN STD_LOGIC; -- 03B
TIMER_UPDATE_OR_EXT_INT : IN STD_LOGIC; -- 04C
U_WRAPPED_MPX : IN STD_LOGIC; -- 03B
H_REG_6_BIT : IN STD_LOGIC; -- 04C
ADDR_IN_LCHD : IN STD_LOGIC; -- 06A
SERV_IN_LCHD : IN STD_LOGIC; -- 06A
R_REG_VAL_DEC_DIG : IN STD_LOGIC; -- 05A
N1BC_OR_R1 : IN STD_LOGIC; -- 05A
Z_BUS_0 : IN STD_LOGIC; -- 06B
G_REG_1_OR_R_REG_3 : IN STD_LOGIC; -- 05A
GT_BU_ROSAR_TO_WX_REG : IN STD_LOGIC; -- 01B
H_REG_5_PWR : IN STD_LOGIC; -- 04C
MPX_SHARE_PULSE : IN STD_LOGIC; -- 03A
SX_CHAIN_PULSE : IN STD_LOGIC; -- 03A
MACH_RST_SW : IN STD_LOGIC; -- 03D
R_REG_4_BIT : IN STD_LOGIC; -- 06C
ANY_PRIORITY_PULSE : IN STD_LOGIC; -- 03A
-- Outputs
XOR_OR_OR : OUT STD_LOGIC; -- 03A,04A
INTERRUPT : OUT STD_LOGIC; -- 01B
GT_GWX_TO_WX_REG : OUT STD_LOGIC; -- 01B
GT_FWX_TO_WX_REG : OUT STD_LOGIC; -- 01B
USE_CA_BASIC_DECODER : OUT STD_LOGIC; -- 02B,01A,03C,04C,05C,07A,07C,10C
MPX_ROS_LCH : OUT STD_LOGIC; -- 08C
X6 : OUT STD_LOGIC;
X7 : OUT STD_LOGIC;
USE_ALT_CA_DECODER : OUT STD_LOGIC; -- 07C,04C,10C,07A,11C
GT_CA_TO_W_REG : OUT STD_LOGIC; -- 01B,07A
GT_UV_TO_WX_REG : OUT STD_LOGIC; -- 01B
DIAG_LATCH_RST : OUT STD_LOGIC; -- NEW
-- Debug
DEBUG : OUT STD_LOGIC;
-- Clocks
T1,T2,T3,T4 : IN STD_LOGIC;
clk : IN STD_LOGIC
);
END X6X7;
ARCHITECTURE FMD OF X6X7 IS
signal TEST_ASCII : STD_LOGIC;
signal TEST_INTRP : STD_LOGIC;
signal TEST_WRAP : STD_LOGIC;
signal GT_ASCII_LCH : STD_LOGIC;
signal GT_MPX_LCH : STD_LOGIC; -- Output of AA3E3
signal GT_SX_LCH : STD_LOGIC; -- Output of AA3L6
signal X6_MUX,X7_MUX : STD_LOGIC;
signal CA_TO_X7_DECO : STD_LOGIC;
signal X6_BRANCH,X7_BRANCH : STD_LOGIC;
signal SX_CH_ROAR_RESTORE : STD_LOGIC;
signal MPX_CH_ROAR_RESTORE : STD_LOGIC;
signal RESTORE_0 : STD_LOGIC; -- Output of AA3K5,FL0
signal ASCII_LCH : STD_LOGIC;
signal MPX_CH_X6,MPX_CH_X7 : STD_LOGIC;
signal SX_CH_X6,SX_CH_X7 : STD_LOGIC;
signal X6_DATA,X7_DATA : STD_LOGIC;
signal STORED_X6,STORED_X7 : STD_LOGIC;
signal sXOR_OR_OR : STD_LOGIC;
signal sINTERRUPT : STD_LOGIC;
signal sGT_GWX_TO_WX_REG : STD_LOGIC;
signal sGT_FWX_TO_WX_REG : STD_LOGIC;
signal sUSE_CA_BASIC_DECODER : STD_LOGIC;
signal sMPX_ROS_LCH : STD_LOGIC;
signal REST0_LCH_Set,REST0_LCH_Reset,SXREST_LCH_Set,SXREST_LCH_Reset,
MPXROS_LCH_Reset,MPXROS_LCH_Set,MPXREST_LCH_Set,MPXREST_LCH_Reset : STD_LOGIC;
BEGIN
-- Fig 5-02A
TEST_ASCII <= '1' when SALS.SALS_CK="1001" and SALS.SALS_AK='1' else '0'; -- AB3E7
TEST_INTRP <= '1' when SALS.SALS_CK="1010" and SALS.SALS_AK='1' else '0'; -- AB3E7
TEST_WRAP <= '1' when SALS.SALS_CK="0011" and SALS.SALS_AK='1' else '0'; -- AB3E6
DIAG_LATCH_RST <= '1' when SALS.SALS_CK="0000" and SALS.SALS_AK='1' and T1='1' else '0'; -- NEW!
sXOR_OR_OR <= DECIMAL and CONNECT and N_CTRL_LM; -- AB3D2
XOR_OR_OR <= sXOR_OR_OR;
GT_ASCII_LCH <= sXOR_OR_OR and CTRL_N and T2; -- AB3D2
DEBUG <= ASCII_LCH;
-- ?? Debug remove other interrupt sources
-- sINTERRUPT <= TIMER_UPDATE or EXTERNAL_INT or MPX_INTERRUPT or SX1_INTERRUPT or SX2_INTERRUPT; -- AA3K4
sINTERRUPT <= EXTERNAL_INT or MPX_INTERRUPT;
INTERRUPT <= sINTERRUPT;
with (SALS.SALS_CH) select X6_MUX <= -- AA3G5
'1' when "0001",
R_REG_0_BIT when "0010",
V67_00_OR_GM_WM when "0011",
STATUS_IN_LCHD when "0100",
OPNL_IN_LCHD when "0101",
CARRY_0_LCHD when "0110",
S(0) when "0111",
S_REG_1_OR_R_REG_2 when "1000",
S(2) when "1001",
S(4) when "1010",
S(6) when "1011",
G(0) when "1100",
G(2) when "1101",
G(4) when "1110",
G(6) when "1111",
'0' when others; -- 0000
with (SALS.SALS_CL) select X7_MUX <= -- AA3H5
'1' when "0001",
'1' when "0010", -- CL=0010 is CA>W ?? Needed otherwise CA>W always forces X7 to 0 ??
ADDR_IN_LCHD when "0011",
SERV_IN_LCHD when "0100",
R_REG_VAL_DEC_DIG when "0101",
N1BC_OR_R1 when "0110",
Z_BUS_0 when "0111",
G(7) when "1000",
S(3) when "1001",
S(5) when "1010",
S(7) when "1011",
G_REG_1_OR_R_REG_3 when "1100",
G(3) when "1101",
G(5) when "1110",
sINTERRUPT when "1111",
'0' when others; -- 0000
X6_BRANCH <= (not ASCII_LCH or not TEST_ASCII) and -- AA3K3
(not TIMER_UPDATE_OR_EXT_INT or not TEST_INTRP) and -- AA3K3
(not SX2_INTERRUPT or SX1_INTERRUPT or not TEST_INTRP) and -- AA3K4
(not I_WRAPPED_CPU or not TEST_WRAP) and -- AA3K3
X6_MUX;
X7_BRANCH <= (not TIMER_UPDATE_OR_EXT_INT or not TEST_INTRP) and -- AA3K3
(not SX1_INTERRUPT or not TEST_INTRP) and -- AA3B7
(not TEST_WRAP or not U_WRAPPED_MPX or not H_REG_6_BIT) and -- AA3J5
X7_MUX ;
-- and CA_TO_X7_DECO; ?? Removed as it forced X7 to 0 on CA>W ??
sGT_GWX_TO_WX_REG <= GT_BU_ROSAR_TO_WX_REG and H_REG_5_PWR; -- AA3L5
GT_GWX_TO_WX_REG <= sGT_GWX_TO_WX_REG;
sGT_FWX_TO_WX_REG <= GT_BU_ROSAR_TO_WX_REG and not H_REG_5_PWR; -- AA3C2
GT_FWX_TO_WX_REG <= sGT_FWX_TO_WX_REG;
sUSE_CA_BASIC_DECODER <= not SALS.SALS_AA;
USE_CA_BASIC_DECODER <= sUSE_CA_BASIC_DECODER;
REST0_LCH_Set <= T2 and sGT_GWX_TO_WX_REG;
REST0_LCH_Reset <= MACH_RST_SW or T1;
REST0_LCH: entity FLL port map(REST0_LCH_Set,REST0_LCH_Reset,RESTORE_0); -- AA3K5 Bit 0
SXREST_LCH_Set <= T4 and RESTORE_0;
SXREST_LCH_Reset <= MACH_RST_SW or T3;
SXREST_LCH: entity FLL port map(SXREST_LCH_Set,SXREST_LCH_Reset,SX_CH_ROAR_RESTORE); -- AA3K5 Bit 1
MPXROS_LCH_Set <= T2 and sGT_FWX_TO_WX_REG;
MPXROS_LCH_Reset <= MACH_RST_SW or T1;
MPXROS_LCH: entity FLL port map(MPXROS_LCH_Set,MPXROS_LCH_Reset,sMPX_ROS_LCH); -- AA3L2 Bit 2
MPX_ROS_LCH <= sMPX_ROS_LCH;
MPXREST_LCH_Set <= T4 and sMPX_ROS_LCH;
MPXREST_LCH_Reset <= MACH_RST_SW or T3;
MPXREST_LCH: entity FLL port map(MPXREST_LCH_Set,MPXREST_LCH_Reset,MPX_CH_ROAR_RESTORE); -- AA3L2 Bit 3
X6_DATA <= X6_BRANCH and not SX_CH_ROAR_RESTORE and not MPX_CH_ROAR_RESTORE; -- AA3L6
X7_DATA <= X7_BRANCH and not SX_CH_ROAR_RESTORE and not MPX_CH_ROAR_RESTORE; -- AA3L6
GT_MPX_LCH <= (MPX_SHARE_PULSE and T1) or MACH_RST_SW; -- AA3L4,AA3E3
GT_SX_LCH <= (SX_CHAIN_PULSE and T1) or MACH_RST_SW; -- AA3F3,AA3L6
-- ASCII latch plus X6,X7 storage for
ASC_LCH: entity PH port map(R_REG_4_BIT,GT_ASCII_LCH,ASCII_LCH); -- AA3L3
M7_LCH: entity PH port map(X7_DATA,GT_MPX_LCH,MPX_CH_X7); -- AA3L3
S7_LCH: entity PH port map(X7_DATA,GT_SX_LCH,SX_CH_X7); -- AA3L3
M6_LCH: entity PH port map(X6_DATA,GT_MPX_LCH,MPX_CH_X6); -- AA3L3
S6_LCH: entity PH port map(X6_DATA,GT_SX_LCH,SX_CH_X6); -- AA3L3
STORED_X6 <= (SX_CH_ROAR_RESTORE and SX_CH_X6) or (MPX_CH_ROAR_RESTORE and MPX_CH_X6); -- AA3K6
STORED_X7 <= (SX_CH_ROAR_RESTORE and SX_CH_X7) or (MPX_CH_ROAR_RESTORE and MPX_CH_X7); -- AA3K6
X6 <= X6_DATA or STORED_X6; -- Wire-AND of negated signals
X7 <= X7_DATA or STORED_X7; -- Wire-AND of negated signals
-- Page 5-02B
USE_ALT_CA_DECODER <= not sUSE_CA_BASIC_DECODER and not ANY_PRIORITY_PULSE; -- AB2F7 ??
CA_TO_X7_DECO <= '0' when SALS.SALS_CL="0010" else '1'; -- AA3H5
GT_CA_TO_W_REG <= not CA_TO_X7_DECO and not ANY_PRIORITY_PULSE; -- AA3L4,AA3G4
GT_UV_TO_WX_REG <= '1' when SALS.SALS_CK="0001" and SALS.SALS_AK='1' and ANY_PRIORITY_PULSE='0' else '0'; -- AB3E6,AB3B3
END FMD;