From 18ac7d64e28a9e632a6e8bdd2b8fa54bc87870c3 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Thu, 5 Nov 2020 23:05:26 -0500 Subject: [PATCH] IBM360: Added support for Block Multiplexer channels. --- IBM360/ibm360_chan.c | 88 ++++++++++++++++++++++++++++++++++--------- doc/ibm360.doc | Bin 120320 -> 120320 bytes 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/IBM360/ibm360_chan.c b/IBM360/ibm360_chan.c index 057aba3..24def42 100644 --- a/IBM360/ibm360_chan.c +++ b/IBM360/ibm360_chan.c @@ -87,6 +87,8 @@ extern uint8 key[MAXMEMSIZE / 2048]; #define UNIT_V_TYPE (UNIT_V_UF + 0) #define UNIT_SEL (1 << UNIT_V_TYPE) /* Selector channel */ #define UNIT_MUX (0 << UNIT_V_TYPE) /* Multiplexer channel */ +#define UNIT_BMUX (2 << UNIT_V_TYPE) /* Multiplexer channel */ +#define UNIT_M_TYPE (3 << UNIT_V_TYPE) #define UNIT_V_SUBCHAN (UNIT_V_UF + 2) #define UNIT_M_SUBCHAN 0xff @@ -97,10 +99,13 @@ int irq_pend = 0; t_stat chan_reset(DEVICE *); t_stat set_subchan(UNIT * uptr, int32 val, CONST char *cptr, void *desc); t_stat show_subchan(FILE * st, UNIT * uptr, int32 v, CONST void *desc); +t_stat chan_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); +const char *chan_description (DEVICE *dptr); MTAB chan_mod[] = { - { UNIT_SEL, 0, NULL, "MUX", NULL, NULL, NULL, "Multiplexer channel"}, - { UNIT_SEL, UNIT_SEL, NULL, "SEL", NULL, NULL, NULL, "Selector channel"}, + { UNIT_M_TYPE, UNIT_MUX, NULL, "MUX", NULL, NULL, NULL, "Multiplexer channel"}, + { UNIT_M_TYPE, UNIT_SEL, NULL, "SEL", NULL, NULL, NULL, "Selector channel"}, + { UNIT_M_TYPE, UNIT_BMUX, NULL, "BMUX", NULL, NULL, NULL, "Block Multiplexer channel"}, { MTAB_XTD|MTAB_VUN|MTAB_VALR, 0, "SUB", "SUB", set_subchan, show_subchan, NULL, "Number of subchannels"}, {0} @@ -157,7 +162,7 @@ DEVICE chan_dev = { MAX_CHAN, 8, 15, 1, 8, 8, NULL, NULL, &chan_reset, NULL, NULL, NULL, NULL, DEV_DEBUG, 0, dev_debug, -// NULL, NULL, &chan_help, NULL, NULL, &chan_description + NULL, NULL, &chan_help, NULL, NULL, &chan_description }; struct _dev { @@ -225,12 +230,23 @@ find_subchan(uint16 device) { uptr = &chan_unit[chan]; if ((uptr->flags & UNIT_DIS) != 0) return NULL; - if ((uptr->flags & UNIT_SEL) != 0) + if ((uptr->flags & UNIT_M_TYPE) == UNIT_SEL) { return &(chan_ctl[0]); + } device &= 0xff; + if ((uptr->flags & UNIT_M_TYPE) == UNIT_BMUX) { + extern uint32 cregs[16]; + if ((cpu_unit[0].flags & FEAT_370) != 0 && + (cregs[0] & 0x80000000) != 0) { + device = (device >> 3) & 0x1f; + return &(chan_ctl[device]); + } + return &(chan_ctl[0]); + } if (device >= uptr->schans) { - if (device >= 128) /* All shared devices over subchannels */ + if (device <= 128) { /* All shared devices over subchannels */ return NULL; + } device = (device >> 4) & 0x7; } return &(chan_ctl[device]); @@ -757,7 +773,6 @@ chan_end(uint16 addr, uint8 flags) { if ((flags & SNS_DEVEND) != 0) chan->ccw_flags &= ~(FLAG_CD|FLAG_SLI); -// dev_status[addr] = 0; irq_pend = 1; sim_debug(DEBUG_DETAIL, &cpu_dev, "chan_end(%x, %x) %x %04x end\n", addr, flags, chan->chan_status, chan->ccw_flags); @@ -794,7 +809,7 @@ startio(uint16 addr) { uint16 status; if (dev == NULL || chan == NULL) { - sim_debug(DEBUG_CMD, &cpu_dev, "SIO %x cc=3\n", addr); + sim_debug(DEBUG_CMD, &cpu_dev, "SIO %x dc cc=3\n", addr); return 3; } @@ -803,7 +818,7 @@ startio(uint16 addr) { /* Find channel this device is on, if no none return cc=3 */ if (dibp == NULL || uptr == NULL) { - sim_debug(DEBUG_CMD, &cpu_dev, "SIO %x cc=3\n", addr); + sim_debug(DEBUG_CMD, &cpu_dev, "SIO %x cu cc=3\n", addr); return 3; } @@ -1108,11 +1123,21 @@ int testchan(uint16 channel) { } /* Multiplexer channels return channel is available */ - if ((uptr->flags & UNIT_SEL) == 0) { + if ((uptr->flags & UNIT_M_TYPE) == UNIT_MUX) { sim_debug(DEBUG_CMD, &cpu_dev, "TCH CC %x cc=0, mux\n", channel); return 0; } + /* Block Multiplexer channels operating in select mode */ + if ((uptr->flags & UNIT_M_TYPE) == UNIT_BMUX) { + extern uint32 cregs[16]; + if ((cpu_unit[0].flags & FEAT_370) != 0 && + (cregs[0] & 0x80000000) != 0) { + sim_debug(DEBUG_CMD, &cpu_dev, "TCH CC %x cc=0, bmux\n", channel); + return 0; + } + } + chan = &(chan_ctl[0]); /* If channel is processing a command, return 2 */ @@ -1212,8 +1237,15 @@ scan_chan(uint16 mask, int irq_en) { if ((uptr->flags & UNIT_DIS) != 0) continue; nchan = 1; - if ((uptr->flags & UNIT_SEL) == 0) + if ((uptr->flags & UNIT_M_TYPE) == UNIT_BMUX) { + extern uint32 cregs[16]; + if ((cpu_unit[0].flags & FEAT_370) != 0 && + (cregs[0] & 0x80000000) != 0) { + nchan = 32; + } + } else if ((uptr->flags & UNIT_M_TYPE) == UNIT_MUX) { nchan = UNIT_G_SCHAN(uptr->flags); + } /* Scan all subchannels on this channel */ for (j = 0; j < nchan; j++) { chan = &(chan_ctl[j]); @@ -1305,7 +1337,7 @@ chan_reset(DEVICE * dptr) for (i = 0; i < dptr->numunits; i++) { UNIT *uptr = &dptr->units[i]; - int n; + unsigned int n; if (uptr->up7 != NULL) free(uptr->up7); @@ -1316,8 +1348,10 @@ chan_reset(DEVICE * dptr) if (uptr->flags & UNIT_DIS) continue; n = 1; - if ((uptr->flags & UNIT_SEL) == 0) + if ((uptr->flags & UNIT_M_TYPE) == UNIT_MUX) n = UNIT_G_SCHAN(uptr->flags)+1; + if ((uptr->flags & UNIT_M_TYPE) == UNIT_BMUX) + n = 32; uptr->schans = n; uptr->up7 = calloc(n, sizeof(struct _chanctl)); uptr->up8 = calloc(256, sizeof(struct _dev)); @@ -1340,7 +1374,7 @@ chan_set_devs() /* Readjust subchannels if there was a change */ for (i = 0; i < chan_dev.numunits; i++) { UNIT *uptr = &chan_unit[i]; - int n; + unsigned int n; /* If channel disconnected free the buffers */ if (uptr->flags & UNIT_DIS) { @@ -1353,12 +1387,14 @@ chan_set_devs() continue; } n = 1; - if ((uptr->flags & UNIT_SEL) == 0) - n = UNIT_G_SCHAN(uptr->flags) + 1; + if ((uptr->flags & UNIT_M_TYPE) == UNIT_MUX) + n = UNIT_G_SCHAN(uptr->flags)+1; + if ((uptr->flags & UNIT_M_TYPE) == UNIT_BMUX) + n = 32; /* If no device array, create one */ if (uptr->up8 == NULL) uptr->up8 = calloc(256, sizeof(struct _dev)); - if (uptr->up7 == NULL || uptr->schans != n) { + if (uptr->up7 == NULL || (uint32)uptr->schans != n) { if (uptr->up7 != NULL) free(uptr->up7); uptr->up7 = calloc(n, sizeof(struct _chanctl)); @@ -1442,8 +1478,10 @@ show_subchan(FILE * st, UNIT * uptr, int32 v, CONST void *desc) if (uptr == NULL) return SCPE_IERR; - if ((uptr->flags & UNIT_SEL) != 0) { + if ((uptr->flags & UNIT_M_TYPE) == UNIT_SEL) { fprintf(st, "SEL"); + } else if ((uptr->flags & UNIT_M_TYPE) == UNIT_BMUX) { + fprintf(st, "BMUX"); } else { n = UNIT_G_SCHAN(uptr->flags); fprintf(st, "MUX SUB=%d", n); @@ -1574,3 +1612,19 @@ show_dev_addr(FILE * st, UNIT * uptr, int32 v, CONST void *desc) return SCPE_OK; } +t_stat +chan_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) +{ + fprintf(st, "IBM360/370 Chan\n\n"); + fprint_set_help(st, dptr); + fprint_show_help(st, dptr); + return SCPE_OK; +} + +const char * +chan_description (DEVICE *dptr) +{ + return "IBM 360/370 Channel"; +} + + diff --git a/doc/ibm360.doc b/doc/ibm360.doc index 8acab189f5aa8420fb79a037c896d23b304be1f4..c101a0dd5e1c9cd9b5d98d39937b7e266695e425 100644 GIT binary patch delta 6253 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 YlZF`ca^S-Irf0ahJMhJardQbi0^jfTRR910 delta 6054 zcmb8z4^&j=naAhrR|zGA7(_HFC4?n}5JRj2 zAxKP0k$9h`1gV=|Jc*k!qYp^a_za97q;vd`zS@MWl<5 z>wki_=^|B6imZEz_L(B5pBBmekw`7OO3D$*d{!hipSI77OnO12p55;*5*d7n&v}{s zz9OZPx=|z#mDq_EoWLLgN9>w685^tUKDK>39b@x{*2`~hB?*j z6fVy(ivmV z@gjei$M*NKj|C!cC0a32EB}G!&AXyf{O{P8$bNbGO&Tp_Ut;sbyN>yPH@f*vjzYwE zmM^_cB!RsIO9Ko1<+U0u|8{9Z^OV@WaZT}?f`aei9I;(l-1Pk$t+(!v2sl3Y&X%|8 zt(N<<{mQmju7o&_&sv@kHJ(c?LDowNZ_MW6ir+-8>^LgkS7bO>$e$}anJdo@FWezA z&5HC7n=yqeLc_u7A{8_);1~9gZWL}s#?7C4G*V=(pZ7y3g87`O&5?26Ga-9unZTm< zFp*dqzczJ%8Vhf{XdKL%7n`qqfA8Yv_E*oE=E)VOmzcTMCx>do0=W*j4+(ex3$Pf; zR!Haf%v$T=&ImJNt>L}e+SnQ4=a_D7?{t}Z>$faQwvKjAUvO1E_q^nPWne)1rN3W# z`p=x9BFDYu2j231Z}~fK+1!7|T6lQ65i9%fFD54Hⅅ*h?`*zbxsS~K0{;&2CSg2 z2vcXx;yu%Puq(nZKFrGOa+zz^D=fNX{hasR*1KI1X_?%fYw-;9R{iV6&p*E?7v+Mt z?Ddu(d&^_q@{qUO?=9QBWs|403Xc@VP8^r}BG)h=&^#V!`~r=Cd{UgqIR0QwHy82x z8d+kU?wZ-`-#x`V^_7gs@P%{yqwfq_)I?IzYJPsC#P98Cj-2q zt#?11VtsJ(pGvj$IrQQRzC<)*MGWTSKBOWI)u=%oevMYNp$|H~T*3$(>5LypLppMh zi*i)p0CX%mmCiXoO{E_Lh-Glf#hcK9Y8M*Nj{(eEDKeMSG!IP~BKxo(z39W;s~AI& zfCrF-WvGD;cw2D+gBa5K>Qa&0vgk7rip3~~X zN78E4;1HaQsyc{Y9lk0>Ej%CQX)WHDweQ0) ztNo1A8vHP*^aj;+vvejxHBw#5tBy7hH zyn`m}!+u=BmpPnId6oeX8PG(LrS)8H3~a`m*n=^ z;+MEo>#1D8uh)sZjRWXI!pr=AuoP)XM+-Cro<$GhiuoSl$1(>9&%BHLpT8^u__uF$VNLl;J2CkX$xNl8OTH~@{kXLvbEsM z<5umNya4KiW&+Khja3)uG^Xk7p90ML&4+qFGZgK8UwexF*?#7Id-qave{;n74iKA?LfAy(f)_QaQm2kg+|D5oI@2enQOE>-(JO zQ@`D(euqzes!x5oPkn|@{Z5~HxKBO8JQx}Dod2uAk4^lquvGW@MP}IC_}gmlyWjnr z#eBCL%iLV4<;GsV$OPNh9yX;n)_7XKx5NzG)Ov#7jW+ImN#?N6de1gTmYKb`EL%Rt zvSjn{ct_h3hKWb`EhF<0>n}aC-H)c3-x{Yrm1Us}yU>6Ga4fZ51!lgToNk`AA6#wT zwpTrArfKb`VG^Lvag%U2%29zjt^eTfZZ%T^^vSORnvgUdg(Y$4qZ_VAZC43DtyMEk z$lcrM0j|Gluh*zl`~I<+DF1J^%QE5i`PF9Xwg@xb{#Ax?dcWlaeaf7PDAb@9b?6w~ zmvybjX)oMnzOb)N=DH-?Cdj^PwfXluBtV}{58@p38TBW&E6dEV=VY1xG4=MOHRe-? zE_NaX)yv$DwI#%KT7EOY9^att&eYB;QchQhuTo(tek&M~`+(#NaW>Lu zH#8J#AY1^=f2}Fr-Q@FST$%*ipy{uG^jGLjfV)yP0lL{mubHh;P=lR@ISq1mLj#7;^ zn#`cdt?J1eN9itHXR3`$gPexAMreqePl&tE8|2nKWxFcObM7~a&C6z%&P!;l(i+O^gOR4RjY)k7l@svd9GpUNf5IG{c>K+MbhXR@qB3 zIqxeDPq5W(|D)Rt`{2Za)0FJmg+Sw&3AdweAkICXvWiE zRh#X0mC-0l6V*0olF}6A4^2|hIiqPRDaZHxl55(rKF;rzXUmUTNx$OP8iWBbCM}jZ&G=DAoVG_qa4q4M6kM zQY1k$l}4vYFN_|SOQ(Y-L$i|Rq%vq$(wtOZ=yp}^vVt%X8)S^kn@rv73%lDqfyp~Kt_Xgtf zM$Q0IH+s5vI<`L;ht7GWAq#mMZO3iqtbO5M&8&bvN5zzcJMG)onAfeEuLAA2*O&~4 z&W`1y7?m5{j_vem<2^0y_+OfCht8aB##ZdSY5jkgqaiG=!!ESkv|2aU3Aa{s;KUf~ zbu#W0&S7wj^*T{Egb@UkxE*ib^!0QSFA$S4bBy&m!54*iEE;3IPW~;%GOQe9y-o~f zAQ#1Btk+4y^{7DY80&RHaU1H;ciNJ{?bLNXbRRV4`fuj4AP{R&wAoF|UNcuGOn2Y_hA{UH z1{cJ?$qkKNKjpaLU&RL?xXNDGPWD*d&Vch$yV>A3>8`)|rLMHk{@z4S)k)ZFV1jdyLbG;+fFrf|bzcfX