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);