root/src/dps8/dps8_cable.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * vim: filetype=c:tabstop=4:ai:expandtab
   3  * SPDX-License-Identifier: ICU
   4  * scspell-id: 5d03518d-f62d-11ec-a03b-80ee73e9b8e7
   5  *
   6  * ---------------------------------------------------------------------------
   7  *
   8  * Copyright (c) 2013-2016 Charles Anthony
   9  * Copyright (c) 2021-2022 The DPS8M Development Team
  10  *
  11  * All rights reserved.
  12  *
  13  * This software is made available under the terms of the ICU
  14  * License, version 1.8.1 or later.  For more details, see the
  15  * LICENSE.md file at the top-level directory of this distribution.
  16  *
  17  * ---------------------------------------------------------------------------
  18  */
  19 
  20 extern char * ctlr_type_strs [/* *enum ctlr_type_e */];
  21 extern char * chan_type_strs [/* *enum chan_type_e */];
  22 
  23 typedef enum chanType { chanTypeCPI, chanTypePSI, chanTypeDirect } chanType;
  24 
  25 // Multics devices (from prph card, AM81-04, pp 7-21 on)
  26 //
  27 //  CCUn   Combination record units  CCU0401
  28 //  DIAn   Direct Interface Adapter
  29 //  DSKn   Disk MSU0400 MSU0402 MSU0451 MSU0500 MSU0501 MSU3380 MSU3381
  30 //  FNPn   FNP DN6670
  31 //  OPCn   Operator Console CSU6001 CSU6004 CSU6601
  32 //  PRTn   Printer PRT401 PRT402 PRU1000 PRU1200 PRU1201 PRU1203 PRU1600
  33 //  PUNn   Card Punch PCU0120 PCU0121 CPZ201 PCU0300 CPZ300 CPZ301
  34 //  RDRn   Card Reader CRZ201 CRZ301 CRU0500 CRU0501 CRU1050
  35 //  TAPn   Tape Drive MTU0500 MTU0500 MTU0600 MTU0610 MTUo630 MTU8200
  36 //
  37 
  38 // Controllers
  39 //   mpc card, AM81-04, pp 7-15 on.
  40 //
  41 //   mpc mtpx model -- mtp is tape controller
  42 //    MTC501   mtp 501.
  43 //    MTC502   mtp 502.
  44 //    MTC0602  mtp 602.
  45 //    MTC0600  mtp 600.
  46 //    MTP0610  mtp 610.
  47 //    MTP0611  mtp 611.
  48 //    MTP8021  mtp 611.
  49 //    MTP8022  mtp 611.
  50 //    MTP8023  mtp 611.
  51 //
  52 //   mpc mspx model -- msp is disk controller
  53 //    MSP0400  msp 400.
  54 //    DSC0451  msp 451.
  55 //    MSP0451  msp 451.
  56 //    MSP0601  msp 601.
  57 //    MSP0603  msp 603.
  58 //    MSP0607  msp 607.
  59 //    MSP0609  msp 609.
  60 //    MSP0611  msp 611.
  61 //    MSP0612  msp 612.
  62 //    MSP8021  msp 800.
  63 //    MSP8022  msp 800.
  64 //    MSP8022  msp 800.
  65 //
  66 //   mpc urpx model -- urp is unit record controller
  67 //    URC002   urp   2.
  68 //    URP0600  urp 600.
  69 //    URP0601  urp 601.
  70 //    URP0602  urp 602.
  71 //    URP0604  urp 604.
  72 //
  73 
  74 enum chan_type_e { chan_type_CPI, chan_type_PSI, chan_type_direct };
  75 // DEVT_NONE must be zero for memset to init it properly.
  76 enum ctlr_type_e
  77   {
  78      CTLR_T_NONE = 0,
  79      CTLR_T_MTP,
  80      CTLR_T_MSP,
  81      CTLR_T_IPC,
  82      CTLR_T_OPC,
  83      CTLR_T_URP,
  84      CTLR_T_FNP,
  85      CTLR_T_ABSI,
  86      CTLR_T_SKC,
  87      // DEVT_DN355
  88   };
  89 
  90 // Connect SCU to IOM/CPU
  91 //
  92 //    (iom#, port#) = scu_to_iom (scu#, port#, subport#)
  93 //    (scu#, port#, subport#) = iom_to_scu (iom#, port#)
  94 //
  95 //    (cpu#, port#) = scu_to_cpu (scu#, port#, subport#)
  96 //    (scu#, port#, subport#) = cpu_to_scu (cpu#, port#)
  97 //
  98 //    cable SCUx port# IOMx port#
  99 //    cable SCUx port# CPUx port#
 100 //
 101 
 102 struct scu_to_iom_s
 103   {
 104     bool in_use;
 105     uint iom_unit_idx;
 106     uint iom_port_num;
 107   };
 108 
 109 struct iom_to_scu_s
 110   {
 111     bool in_use;
 112     uint scu_unit_idx;
 113     uint scu_port_num;
 114     uint scu_subport_num;
 115   };
 116 
 117 struct scu_to_cpu_s
 118   {
 119     bool in_use;
 120     uint cpu_unit_idx;
 121     uint cpu_port_num;
 122   };
 123 
 124 struct cpu_to_scu_s
 125   {
 126     bool in_use;
 127     uint scu_unit_idx;
 128     uint scu_port_num;
 129     uint scu_subport_num;
 130   };
 131 
 132 //
 133 // Connect iom to controller
 134 //
 135 //    (ctrl#, port#) = iom_to_ctlr (iom#, chan#)
 136 //    (iom#, chan#) = ctlr_to_iom (ctlr#, port#)
 137 //
 138 //    cable IOMx chan# MTPx [port#]  // tape controller
 139 //    cable IOMx chan# MSPx [port#] // disk controller
 140 //    cable IOMx chah# IPCx [port#] // FIPS disk controller
 141 //    cable IOMx chan# OPCx       // Operator console
 142 //    cable IOMx chan# FNPx       // FNP
 143 //    cable IOMx chan# ABSIx      // ABSI
 144 //    cable IOMx chan# URPx       // Unit record processor
 145 //    cable IOMx chan# SKx        // Socket
 146 //
 147 
 148 struct iom_to_ctlr_s
 149   {
 150     bool in_use;
 151     uint ctlr_unit_idx; // unit number ("ctrl#")
 152     uint port_num; // port#
 153     enum ctlr_type_e ctlr_type; // TAPE, DISK, CON, ...
 154     enum chan_type_e chan_type; // CPI, PSI, Direct
 155     DEVICE * dev; // ctlr device
 156     UNIT * board; // points into iomUnit
 157     iom_cmd_t * iom_cmd;
 158   };
 159 
 160 struct ctlr_to_iom_s
 161   {
 162     bool in_use;
 163     uint iom_unit_idx;
 164     uint chan_num;
 165   };
 166 
 167 // Connect controller to device
 168 //
 169 //    device# = ctlr_to_dev (ctlr#, dev_code)
 170 //    (ctlr#, dev_code) = dev_to_ctlr (disk#)
 171 //
 172 //   msp ctlr to disk
 173 //
 174 //     cable MSPx dev_code DISKx
 175 //
 176 //   ipc ctlr to disk
 177 //
 178 //     cable FIPSx dev_code DISKx
 179 //
 180 //   fnp doesn't have a device
 181 //
 182 //   absi doesn't have a device
 183 //
 184 //   opc doesn't have a device
 185 //
 186 //   mpt to tape
 187 //
 188 //     cable MTPx dev_code TAPEx
 189 //
 190 //   urp to  device
 191 //
 192 //     cable URPx dev_code RDRx
 193 //     cable URPx dev_code PUNx
 194 //     cable URPx dev_code PRTx
 195 //
 196 //  skc doesn't have a cableable device; channel n connects to unit n.
 197 
 198 struct ctlr_to_dev_s
 199   {
 200     bool in_use;
 201     uint unit_idx;
 202     iom_cmd_t * iom_cmd;
 203   };
 204 
 205 struct dev_to_ctlr_s
 206   {
 207     bool in_use;
 208     uint ctlr_unit_idx;
 209     uint dev_code;
 210     enum ctlr_type_e ctlr_type; // Used by disks to determine if the controller
 211                                 // is MSP or IPC
 212   };
 213 
 214 struct cables_s
 215   {
 216     // SCU->unit
 217     //  IOM
 218     struct scu_to_iom_s scu_to_iom [N_SCU_UNITS_MAX] [N_SCU_PORTS];
 219     struct iom_to_scu_s iom_to_scu [N_IOM_UNITS_MAX] [N_IOM_PORTS];
 220     //  CPU
 221     struct scu_to_cpu_s scu_to_cpu [N_SCU_UNITS_MAX] [N_SCU_PORTS] [N_SCU_SUBPORTS];
 222     struct cpu_to_scu_s cpu_to_scu [N_CPU_UNITS_MAX] [N_CPU_PORTS];
 223 
 224     // IOM->CTLR
 225     struct iom_to_ctlr_s iom_to_ctlr [N_IOM_UNITS_MAX]  [MAX_CHANNELS];
 226     //   mtp
 227     struct ctlr_to_iom_s mtp_to_iom  [N_MTP_UNITS_MAX]  [MAX_CTLR_PORTS];
 228     //   msp
 229     struct ctlr_to_iom_s msp_to_iom  [N_MSP_UNITS_MAX]  [MAX_CTLR_PORTS];
 230     //   ipc
 231     struct ctlr_to_iom_s ipc_to_iom  [N_IPC_UNITS_MAX]  [MAX_CTLR_PORTS];
 232     //   urp
 233     struct ctlr_to_iom_s urp_to_iom  [N_URP_UNITS_MAX]  [MAX_CTLR_PORTS];
 234     //   dia
 235     struct ctlr_to_iom_s dia_to_iom  [N_DIA_UNITS_MAX]  [MAX_CTLR_PORTS];
 236     //   fnp
 237     struct ctlr_to_iom_s fnp_to_iom  [N_FNP_UNITS_MAX]  [MAX_CTLR_PORTS];
 238     //   absi
 239     struct ctlr_to_iom_s absi_to_iom [N_ABSI_UNITS_MAX] [MAX_CTLR_PORTS];
 240     //   console
 241     struct ctlr_to_iom_s opc_to_iom  [N_OPC_UNITS_MAX]  [MAX_CTLR_PORTS];
 242     //   socket
 243     struct ctlr_to_iom_s sk_to_iom   [N_SKC_UNITS_MAX]  [MAX_CTLR_PORTS];
 244 
 245     // CTLR->DEV
 246     //   mtp->tape
 247     struct ctlr_to_dev_s mtp_to_tape [N_MTP_UNITS_MAX]  [N_DEV_CODES];
 248     struct dev_to_ctlr_s tape_to_mtp [N_MT_UNITS_MAX];
 249     //   ipc->disk
 250     //   msp->disk
 251     struct ctlr_to_dev_s ipc_to_dsk  [N_IPC_UNITS_MAX]  [N_DEV_CODES];
 252     struct ctlr_to_dev_s msp_to_dsk  [N_MSP_UNITS_MAX]  [N_DEV_CODES];
 253     struct dev_to_ctlr_s dsk_to_ctlr [N_DSK_UNITS_MAX];
 254     //   urp->rdr/pun/prt
 255     struct ctlr_to_dev_s urp_to_urd  [N_URP_UNITS_MAX]  [N_DEV_CODES];
 256     struct dev_to_ctlr_s rdr_to_urp  [N_RDR_UNITS_MAX];
 257     struct dev_to_ctlr_s pun_to_urp  [N_PUN_UNITS_MAX];
 258     struct dev_to_ctlr_s prt_to_urp  [N_PRT_UNITS_MAX];
 259   };
 260 
 261 extern struct cables_s * cables;
 262 
 263 t_stat sys_cable (UNUSED int32 arg, const char * buf);
 264 
 265 // Accessors
 266 
 267 // Get controller index from (IOM index, channel)
 268 
 269 #define get_ctlr_idx(iom_unit_idx, chan) \
 270    (cables->iom_to_ctlr[iom_unit_idx][chan].ctlr_unit_idx)
 271 
 272 // Get controller in_use from (IOM index, channel)
 273 
 274 #define get_ctlr_in_use(iom_unit_idx, chan) \
 275    (cables->iom_to_ctlr[iom_unit_idx][chan].in_use)
 276 
 277 // Get SCU index from (CPU index, port)
 278 
 279 #define get_scu_idx(cpu_unit_idx, cpu_port_num) \
 280    (cables->cpu_to_scu[cpu_unit_idx][cpu_port_num].scu_unit_idx)
 281 
 282 // Get SCU in_use from (CPU index, port)
 283 
 284 #define get_scu_in_use(cpu_unit_idx, cpu_port_num) \
 285    (cables->cpu_to_scu[cpu_unit_idx][cpu_port_num].in_use)
 286 
 287 t_stat sys_cable (UNUSED int32 arg, const char * buf);
 288 t_stat sys_cable_ripout (UNUSED int32 arg, UNUSED const char * buf);
 289 t_stat sys_cable_show (UNUSED int32 arg, UNUSED const char * buf);
 290 void sysCableInit (void);

/* [previous][next][first][last][top][bottom][index][help] */