Trailing-Edge
-
PDP-10 Archives
-
BB-M081Z-SM
-
monitor-sources/dtesrv.mac
There are 49 other files named dtesrv.mac in the archive. Click here to see a list.
; Edit= 9020 to DTESRV.MAC on 8-Nov-88 by LOMARTIRE
;Merge Production changes to BUG text
; Edit= 8889 to DTESRV.MAC on 12-Aug-88 by RASPUZZI
;Update BUG. documentation.
; Edit= 8836 to DTESRV.MAC on 27-Apr-88 by GSCOTT (TCO 7.1280)
; UPD ID= 8706, RIP:<7.MONITOR>DTESRV.MAC.9, 25-Apr-88 13:41:39 by GSCOTT
;TCO 7.1280 - Remove edit 7449 (fix to power fail restart on DN60s), since
; you can't reliably load a DN60 with edit 7449 installed. A better fix
; will follow at some future time.
; UPD ID= 8660, RIP:<7.MONITOR>DTESRV.MAC.8, 22-Feb-88 18:48:22 by GSCOTT
;TCO 7.1235 - Run SETSPD at offset 1 in entry vector.
; UPD ID= 8510, RIP:<7.MONITOR>DTESRV.MAC.7, 9-Feb-88 15:04:54 by GSCOTT
;TCO 7.1219 - Front end dumps should go to BS:<SYSTEM>
; UPD ID= 8509, RIP:<7.MONITOR>DTESRV.MAC.6, 9-Feb-88 15:00:00 by GSCOTT
;TCO 7.1218 - Update copyright notice.
; UPD ID= 8411, RIP:<7.MONITOR>DTESRV.MAC.5, 4-Feb-88 11:10:55 by GSCOTT
;TCO 7.1210 - Set DN20ST, DTECGB, DTEERR, DTEIDP, DTEIPR, DTEKPA, DTELDB,
; DTELPI, DTEP2S, DTESUI, DTETIP, DTETPR, DTEWAT, INDCNT to be not normally
; dumpable.
; UPD ID= 114, RIP:<7.MONITOR>DTESRV.MAC.3, 15-Sep-87 18:56:00 by GSCOTT
;TCO 7.1056 - Output "[DECSYSTEM-20 continued]" message to 20F lines only
; *** Edit 7449 to DTESRV.MAC by PRATT on 15-Apr-87, for SPR #20974
; Fix DTBELL in DN60 code to not cause SKDCL1s during powerfail restart
; *** Edit 7407 to DTESRV.MAC by MCCOLLUM on 29-Dec-86
; Remove FEZDSN BUGCHK. It comes up for every non-existent FE drive.
; *** Edit 7396 to DTESRV.MAC by MCCOLLUM on 18-Nov-86, for SPR #21429
; Issue BUGCHK in FEDLOP if the FE reports a drive serial number of zero.
; *** Edit 7226 to DTESRV.MAC by GRANT on 14-Jan-86, for SPR #20842
; Prevent KPALVH BUGHLT when DTEN is changed
; Edit 7154 to DTESRV.MAC by GRANT on 15-Oct-85
; Fix bug which prevents monitor from finding all the disks ported to the FE.
;Move table FEDSKT to STG.MAC and fix routine FEDISK.
; UPD ID= 2069, SNARK:<6.1.MONITOR>DTESRV.MAC.57, 3-Jun-85 14:33:08 by MCCOLLUM
;TCO 6.1.1406 - Update copyright notice.
; UPD ID= 2016, SNARK:<6.1.MONITOR>DTESRV.MAC.56, 28-May-85 12:05:14 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1987, SNARK:<6.1.MONITOR>DTESRV.MAC.55, 17-May-85 15:52:50 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1943, SNARK:<6.1.MONITOR>DTESRV.MAC.54, 9-May-85 17:04:02 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1896, SNARK:<6.1.MONITOR>DTESRV.MAC.53, 4-May-85 15:54:33 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1876, SNARK:<6.1.MONITOR>DTESRV.MAC.52, 4-May-85 11:59:28 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1833, SNARK:<6.1.MONITOR>DTESRV.MAC.51, 26-Apr-85 09:51:07 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1712, SNARK:<6.1.MONITOR>DTESRV.MAC.50, 5-Apr-85 13:57:46 by MCCOLLUM
;TCO 6.1.1238 - Fix BUG. documentation
; UPD ID= 1648, SNARK:<6.1.MONITOR>DTESRV.MAC.49, 18-Mar-85 14:55:24 by PALMIERI
;Use MCBDBG instead of FTDEBUG
;Don't call DNADLL if no callback ID
; UPD ID= 1619, SNARK:<6.1.MONITOR>DTESRV.MAC.48, 12-Mar-85 13:39:40 by PALMIERI
; TCO 6.1.1231
; Don't issue DTETPR if running DECnet protocol
; Add DTBUGX - If zero DTESUI, DN20ST, and DTETPR will be skipped for MCB DTEs
; UPD ID= 1523, SNARK:<6.1.MONITOR>DTESRV.MAC.47, 13-Feb-85 17:36:30 by PALMIERI
;Don't issue DN20ST or DTESUI if procotol is MCB
;Put BUGINF DTEWAT under FTDEBUG
; UPD ID= 1141, SNARK:<6.1.MONITOR>DTESRV.MAC.46, 3-Dec-84 17:28:46 by GLINDELL
;D36COM is now in XCDSEC
; UPD ID= 922, SNARK:<6.1.MONITOR>DTESRV.MAC.45, 24-Oct-84 09:48:24 by PALMIERI
;Check to see if protocol is already running at DTDINI
; UPD ID= 786, SNARK:<6.1.MONITOR>DTESRV.MAC.41, 4-Sep-84 14:43:33 by PALMIERI
;Merge from M60:
; UPD ID= 4758, SNARK:<6.MONITOR>DTESRV.MAC.106, 27-Aug-84 11:31:35 by HAUDEL
;TCO 6.2199 - Add conditional assembly bughlt (SETSPF) under DTESW for
;a SETSPD failure after a FE reload.
; UPD ID= 745, SNARK:<6.1.MONITOR>DTESRV.MAC.40, 20-Aug-84 17:17:13 by TBOYLE
;Update TAKSTF for extended SYSERR (from m60:) It goes temporarily EA.ENT
; UPD ID= 735, SNARK:<6.1.MONITOR>DTESRV.MAC.39, 10-Aug-84 14:13:11 by GLINDELL
;Merge from M60:
; UPD ID= 4558, SNARK:<6.MONITOR>DTESRV.MAC.104, 18-Jul-84 16:41:49 by MCLEAN
;ADD FESER BIT TO INDICATE SERIAL NUMBERS FROM F/E HAVE ARRIVED
; UPD ID= 4553, SNARK:<6.MONITOR>DTESRV.MAC.103, 18-Jul-84 10:34:54 by MCLEAN
;ADD FE REPORTED DISK SERVICE
; UPD ID= 4513, SNARK:<6.MONITOR>DTESRV.MAC.102, 13-Jul-84 19:16:58 by PURRETTA
;Update copyright notice
; UPD ID= 4351, SNARK:<6.MONITOR>DTESRV.MAC.101, 15-Jun-84 16:37:01 by MCLEAN
;ADD TABLE ENTRY AND IGNORE SERIAL NUMBER STUFF
; UPD ID= 645, SNARK:<6.1.MONITOR>DTESRV.MAC.38, 29-Jun-84 15:25:45 by PALMIERI
;Change the way buffers are returned when DTE is cleared
; UPD ID= 638, SNARK:<6.1.MONITOR>DTESRV.MAC.37, 25-Jun-84 15:39:59 by PALMIERI
;Make sure CLRMCB is called each time the MCB line is halted
; UPD ID= 629, SNARK:<6.1.MONITOR>DTESRV.MAC.36, 18-Jun-84 13:32:47 by PALMIERI
;Don't check callback ID for non-zero at CALDVR
; UPD ID= 587, SNARK:<6.1.MONITOR>DTESRV.MAC.35, 1-Jun-84 10:09:52 by PALMIERI
;Use a safer AC at DTEQ14 45
; UPD ID= 583, SNARK:<6.1.MONITOR>DTESRV.MAC.34, 31-May-84 15:24:24 by PALMIERI
;At DTEQ13-15 or so, Don't put message pointer into QCOD if DN60 (MCB only)
; UPD ID= 548, SNARK:<6.1.MONITOR>DTESRV.MAC.33, 23-May-84 21:37:11 by PALMIERI
;Don't init protocol when opening MCB circuit, return MB when closing
; UPD ID= 542, SNARK:<6.1.MONITOR>DTESRV.MAC.32, 23-May-84 07:48:36 by MCINTEE
;Merge from M60:
; UPD ID= 4129, SNARK:<6.MONITOR>DTESRV.MAC.100, 25-Apr-84 11:09:06 by LOMARTIRE
;TCO 6.2046 - Adjust CALL RUNDII to use new argument format
; UPD ID= 484, SNARK:<6.1.MONITOR>DTESRV.MAC.31, 30-Apr-84 13:03:21 by PALMIERI
;Change to new DNADLL interface
; UPD ID= 344, SNARK:<6.1.MONITOR>DTESRV.MAC.30, 24-Feb-84 13:26:21 by PALMIERI
;Update for use with DNADLL
; UPD ID= 338, SNARK:<6.1.MONITOR>DTESRV.MAC.29, 20-Feb-84 09:04:18 by MCINTEE
;More of previous
; UPD ID= 337, SNARK:<6.1.MONITOR>DTESRV.MAC.28, 20-Feb-84 07:39:47 by MCINTEE
;Fix another ELORC bug.
; UPD ID= 334, SNARK:<6.1.MONITOR>DTESRV.MAC.27, 14-Feb-84 12:44:55 by MCINTEE
;Clean up previous
; UPD ID= 333, SNARK:<6.1.MONITOR>DTESRV.MAC.26, 14-Feb-84 12:25:44 by MCINTEE
;Fix ELORC bug.
; UPD ID= 316, SNARK:<6.1.MONITOR>DTESRV.MAC.25, 8-Feb-84 16:48:17 by PALMIERI
;Account for byte pointer overflow at CPYMS3-1
; UPD ID= 315, SNARK:<6.1.MONITOR>DTESRV.MAC.24, 8-Feb-84 11:00:59 by MCINTEE
;More FTPARANOID ELORC tracing.
; UPD ID= 306, SNARK:<6.1.MONITOR>DTESRV.MAC.23, 26-Jan-84 09:19:10 by MCINTEE
;Touch message blocks for MCB protocol in the ELORC quest. (Under FTPARANOID)
; UPD ID= 271, SNARK:<6.1.MONITOR>DTESRV.MAC.22, 7-Dec-83 10:02:34 by MCINTEE
;Typo in previous edit
; UPD ID= 270, SNARK:<6.1.MONITOR>DTESRV.MAC.21, 7-Dec-83 09:14:47 by MCINTEE
;Range check in DTEDSP - on failure, return.
; UPD ID= 266, SNARK:<6.1.MONITOR>DTESRV.MAC.20, 5-Dec-83 09:25:44 by MCINTEE
;Merge from M60:
; UPD ID= 3243, SNARK:<6.MONITOR>DTESRV.MAC.99, 1-Dec-83 12:57:08 by MCINTEE
;TCO 6.1889 - Fix sanity check in RELNOD. Also give the unnamed BUGHLT a name.
; UPD ID= 3156, SNARK:<6.MONITOR>DTESRV.MAC.98, 15-Nov-83 14:14:02 by PRATT
;TCO 6.1796 - ERJMP after "[DECSYSTEM-20 continued]" TTMSG
; UPD ID= 234, SNARK:<6.1.MONITOR>DTESRV.MAC.19, 7-Nov-83 12:29:37 by MCINTEE
;In DTDHLT, call CLRDT0 instead of CLRDTE for safety.
; UPD ID= 225, SNARK:<6.1.MONITOR>DTESRV.MAC.18, 26-Oct-83 18:35:34 by GROSSMAN
;WORK:<GROSSMAN.BUILD>DTESRV.MAC.17 26-Oct-83 18:32:01, Edit by GROSSMAN
;Merge in fixes for QP2 (MCB) protocol initialization. This makes DTESRV
;do a KI.PRU when the first incoming message occurs, instead of just after
;the handshake is completed.
; UPD ID= 216, SNARK:<6.1.MONITOR>DTESRV.MAC.17, 10-Oct-83 14:02:05 by MCINTEE
;UPDATE FROM M60:
; UPD ID= 3016, SNARK:<6.MONITOR>DTESRV.MAC.97, 10-Oct-83 13:22:00 by MOSER
;MORE TCO 6.1816 - REMOVE EDIT FROM DTESRV. MAKE WORD RESIDENT IN STG
; UPD ID= 2980, SNARK:<6.MONITOR>DTESRV.MAC.96, 4-Oct-83 15:07:53 by MOSER
;TCO 6.1816 - FIX PITRAP
; UPD ID= 198, SNARK:<6.1.MONITOR>DTESRV.MAC.16, 25-Aug-83 08:01:13 by MCINTEE
;Add an EA.ENT
; UPD ID= 190, SNARK:<6.1.MONITOR>DTESRV.MAC.15, 4-Aug-83 15:04:27 by MCINTEE
;Merge from SNARK:<6.MONITOR>
; UPD ID= 2783, SNARK:<6.MONITOR>DTESRV.MAC.94, 2-Aug-83 15:13:15 by HALL
;Cosmetic stuff -- improve the comments
; UPD ID= 2595, SNARK:<6.MONITOR>DTESRV.MAC.93, 20-Jun-83 10:36:48 by HALL
;TCO 6.1689 - Move fork tables to extended section
; Reference FKJOB via DEFSTR
; UPD ID= 108, SNARK:<6.1.MONITOR>DTESRV.MAC.13, 21-Apr-83 10:35:06 by MCINTEE
;Redo CPYMSG & SKVER2
; UPD ID= 101, SNARK:<6.1.MONITOR>DTESRV.MAC.12, 7-Apr-83 14:51:59 by MCINTEE
; Fix previous edit
; UPD ID= 100, SNARK:<6.1.MONITOR>DTESRV.MAC.11, 7-Apr-83 13:54:38 by MCINTEE
;Add BUGINFs telling about FE reloads.
; UPD ID= 99, SNARK:<6.1.MONITOR>DTESRV.MAC.10, 7-Apr-83 13:09:44 by MCINTEE
;In BTIPR, clean out output queue before initializing protocol.
; UPD ID= 92, SNARK:<6.1.MONITOR>DTESRV.MAC.9, 28-Mar-83 07:49:42 by MCINTEE
;In DTINMC, make ASGRES give section 0 buffers
; UPD ID= 90, SNARK:<6.1.MONITOR>DTESRV.MAC.8, 25-Mar-83 14:37:10 by MCINTEE
;before reloading a FE for keep-alive, BUGINF.
; UPD ID= 2084, SNARK:<6.MONITOR>DTESRV.MAC.92, 25-Mar-83 12:18:13 by WEAVER
;TCO 6.1570 - Change 0DUMP11.BIN to 0DMP11.BIN so name is 6 characters for DDT11
; UPD ID= 89, SNARK:<6.1.MONITOR>DTESRV.MAC.7, 25-Mar-83 07:36:45 by MCINTEE
;At DTDHLT, call DTREST, not DTERST !
; UPD ID= 85, SNARK:<6.1.MONITOR>DTESRV.MAC.6, 22-Mar-83 16:03:50 by MCINTEE
;Still more of 6.1073
; UPD ID= 2047, SNARK:<6.MONITOR>DTESRV.MAC.91, 21-Mar-83 09:56:43 by MCINTEE
;More of TCO 6.1073 - DISPLAY FLAGS FROM BOTH REGIONS
; UPD ID= 1895, SNARK:<6.MONITOR>DTESRV.MAC.90, 1-Mar-83 15:13:15 by GROSSMAN
;TCO 6.1531 - Put operating system type in comm region for front ends.
; UPD ID= 76, SNARK:<6.1.MONITOR>DTESRV.MAC.3, 7-Mar-83 08:18:34 by MCINTEE
;In CLRMCB, put address of buffer in A, not C
; UPD ID= 1796, SNARK:<6.MONITOR>DTESRV.MAC.89, 14-Feb-83 13:51:35 by MURPHY
;TCO 6.1504 - Init FFL before MCENTR at RELOAD.
; UPD ID= 5, SNARK:<6.DECNET>DTESRV.MAC.2, 8-Dec-82 14:20:42 by MCINTEE
;Problems in DTINMC - no more DECNET free pool, restore DTE #
; UPD ID= 1474, SNARK:<6.MONITOR>DTESRV.MAC.88, 23-Nov-82 13:33:30 by MCINTEE
;More of TCO 6.1321
; UPD ID= 1474, SNARK:<6.MONITOR>DTESRV.MAC.88, 23-Nov-82 13:33:30 by MCINTEE
;More of TCO 6.1321
; UPD ID= 1449, SNARK:<6.MONITOR>DTESRV.MAC.87, 16-Nov-82 15:25:17 by MCINTEE
;TCO 6.1377 - IFIWs in FNCTBL
; UPD ID= 1442, SNARK:<6.MONITOR>DTESRV.MAC.86, 15-Nov-82 08:49:45 by GRANT
;TCO 6.1010 - IFIWs in DTINI5's literal
; UPD ID= 1353, SNARK:<6.MONITOR>DTESRV.MAC.85, 19-Oct-82 06:53:51 by GRANT
;TCO 6.1321 - In DOFMCI, put in check for zero byte count
; UPD ID= 1130, SNARK:<6.MONITOR>DTESRV.MAC.84, 1-Sep-82 15:58:32 by HALL
;TCO 6.1245 - Fix RELOAD getting into section 0
; UPD ID= 928, SNARK:<6.MONITOR>DTESRV.MAC.83, 14-Jun-82 07:15:46 by MILLER
; UPD ID= 927, SNARK:<6.MONITOR>DTESRV.MAC.82, 13-Jun-82 20:56:59 by MILLER
;Additional fix for 5.1735. Restore a missing line
; UPD ID= 926, SNARK:<6.MONITOR>DTESRV.MAC.81, 12-Jun-82 20:08:59 by MILLER
;TCO 6.1168. Return input buffers on FE crash
; UPD ID= 925, SNARK:<6.MONITOR>DTESRV.MAC.80, 12-Jun-82 19:56:35 by MILLER
;TCO 5.1735. Fix DTEIOP
; UPD ID= 928, SNARK:<6.MONITOR>DTESRV.MAC.83, 14-Jun-82 07:15:46 by MILLER
; UPD ID= 927, SNARK:<6.MONITOR>DTESRV.MAC.82, 13-Jun-82 20:56:59 by MILLER
;Additional fix for 5.1735. Restore a missing line
; UPD ID= 926, SNARK:<6.MONITOR>DTESRV.MAC.81, 12-Jun-82 20:08:59 by MILLER
;TCO 6.1168. Return input buffers on FE crash
; UPD ID= 925, SNARK:<6.MONITOR>DTESRV.MAC.80, 12-Jun-82 19:56:35 by MILLER
;TCO 5.1735. Fix DTEIOP
; UPD ID= 876, SNARK:<6.MONITOR>DTESRV.MAC.79, 8-Jun-82 23:25:00 by MURPHY
;TCO 6.1147 - Move bugdefs from BUGS.MAC to here and put them in-line.
; UPD ID= 734, SNARK:<6.MONITOR>DTESRV.MAC.78, 11-May-82 17:45:57 by MURPHY
;More 6.1123 - LODCFE.
; UPD ID= 693, SNARK:<6.MONITOR>DTESRV.MAC.77, 5-May-82 10:43:16 by MCINTEE
;Again more TCO 6.1073 - less data in DTEMCC - BUG max. = 4
; UPD ID= 689, SNARK:<6.MONITOR>DTESRV.MAC.76, 4-May-82 18:02:55 by MURPHY
;TCO 6.1123 - Timeout CTY activity, reload FE if no CTY output.
; UPD ID= 676, SNARK:<6.MONITOR>DTESRV.MAC.75, 3-May-82 11:21:59 by MCINTEE
;Still more TCO 6.1073 - more data in DTEMCC (CMTST & CML11)
; UPD ID= 643, SNARK:<6.MONITOR>DTESRV.MAC.74, 14-Apr-82 15:15:42 by MCINTEE
;More TCO 6.1073 - put more of lost interrupt polling under CHNOFF, and
; put more data in DTEMCC (CMINI bit)
; UPD ID= 578, SNARK:<6.MONITOR>DTESRV.MAC.73, 2-Apr-82 14:10:01 by MURPHY
;Ditto. Get rid of brackets in comments.
; UPD ID= 576, SNARK:<6.MONITOR>DTESRV.MAC.72, 1-Apr-82 21:40:20 by MURPHY
;TCO 6.1074 - Revise build procedures. Assemble for KL only.
; UPD ID= 546, SNARK:<6.MONITOR>DTESRV.MAC.71, 22-Mar-82 10:06:36 by MCINTEE
;TCO 6.1073 - check for 0 bytes to -10 transfer in MCB protocol
; UPD ID= 428, SNARK:<6.MONITOR>DTESRV.MAC.70, 1-Mar-82 09:43:08 by GRANT
;TCO 5.1741 - CHECK FOR 0 FORWARD POINTER IN ASGND2
; UPD ID= 427, SNARK:<6.MONITOR>DTESRV.MAC.69, 26-Feb-82 14:09:55 by PLATUKIS
; TCO 5.1738 - clear CMTOT in COMM region in routine DN10MC
; UPD ID= 386, SNARK:<6.MONITOR>DTESRV.MAC.68, 5-Feb-82 16:30:46 by SOUTH
;TCO 5.1720 - fix DN60 protocol race.
; UPD ID= 375, SNARK:<6.MONITOR>DTESRV.MAC.67, 2-Feb-82 10:54:01 by PLATUKIS
;TCO 5.1715 - fix loops at DTINM1+1 and DTINM2+1
; UPD ID= 369, SNARK:<6.MONITOR>DTESRV.MAC.66, 1-Feb-82 15:52:23 by GRANT
;One more try at TCO 5.1711
; UPD ID= 367, SNARK:<6.MONITOR>DTESRV.MAC.65, 1-Feb-82 13:16:57 by GRANT
;Typo in previous edit
; UPD ID= 365, SNARK:<6.MONITOR>DTESRV.MAC.64, 1-Feb-82 09:08:25 by GRANT
;TCO 5.1711 - Under DTESW, zero packet header when it gets assigned
; UPD ID= 350, SNARK:<6.MONITOR>DTESRV.MAC.63, 25-Jan-82 16:29:07 by MURPHY
;Fix bug in previous; make source identical to 5 where only cosmetically different.
; UPD ID= 329, SNARK:<6.MONITOR>DTESRV.MAC.62, 19-Jan-82 17:23:50 by HALL
;TCO 5.1690 -IN DTSNGL, USE S0.ENT TO GET INTO SECTION 0. CODE WAS RETURNING
; IN SECTION 0 IF FRONT END WASN'T RUNNING
; UPD ID= 311, SNARK:<6.MONITOR>DTESRV.MAC.61, 18-Jan-82 10:46:14 by PLATUKIS
;TCO 5.1676 - fix loops at RMDNL1 and DOPAG1 to test done after timeup
;TCO 5.1677 - add BOTX20
; UPD ID= 297, SNARK:<6.MONITOR>DTESRV.MAC.60, 13-Jan-82 17:06:28 by GRANT
;More TCO 5.1650 - add checking for NCOMH being good
; UPD ID= 296, SNARK:<6.MONITOR>DTESRV.MAC.59, 13-Jan-82 16:57:01 by PAETZOLD
;TCO 5.1673 - change BOTX16 error to BOTX19
; UPD ID= 291, SNARK:<6.MONITOR>DTESRV.MAC.58, 11-Jan-82 13:24:22 by GRANT
;More TCO 5.1650
; UPD ID= 274, SNARK:<6.MONITOR>DTESRV.MAC.57, 5-Jan-82 09:40:52 by GRANT
;TCO 5.1650 - Define QINU, use it and some range checking in packet queuing
; UPD ID= 264, SNARK:<6.MONITOR>DTESRV.MAC.56, 20-Dec-81 16:00:56 by GRANT
;TCO 5.1640 - the word DECSYSTEM-20 should not be mixed case
; UPD ID= 254, SNARK:<6.MONITOR>DTESRV.MAC.55, 14-Dec-81 23:03:24 by SOUTH
; one more error exit in DN60 protocol
; UPD ID= 253, SNARK:<6.MONITOR>DTESRV.MAC.54, 14-Dec-81 20:23:21 by SOUTH
; put back 6.1045 for DN60 protocol only
; UPD ID= 252, SNARK:<6.MONITOR>DTESRV.MAC.53, 14-Dec-81 08:51:55 by SOUTH
; remove 6.1045 for decnet.
; UPD ID= 246, SNARK:<6.MONITOR>DTESRV.MAC.52, 10-Dec-81 23:27:53 by SOUTH
; morest 6.1044 - fix interference of time outs for waiting forks
; UPD ID= 245, SNARK:<6.MONITOR>DTESRV.MAC.51, 10-Dec-81 23:06:56 by SOUTH
; morer 6.1044 - change death test for waiting forks
; UPD ID= 244, SNARK:<6.MONITOR>DTESRV.MAC.50, 10-Dec-81 20:42:22 by SOUTH
; more 6.1044 - get it right this time.
; UPD ID= 241, SNARK:<6.MONITOR>DTESRV.MAC.49, 9-Dec-81 18:32:05 by SOUTH
; TCO 6.1045 - at DTINM1 and DTINM2 use process dismiss to wait for doorbell
; UPD ID= 238, SNARK:<6.MONITOR>DTESRV.MAC.48, 7-Dec-81 11:43:08 by SOUTH
; TCO 6.1044 - clean up error exits in DN60 protocol.
; UPD ID= 235, SNARK:<6.MONITOR>DTESRV.MAC.47, 5-Dec-81 02:27:03 by SOUTH
; TCO 6.1043 - DEDD60 sets D6%NT6 in D6STS to indicate front end death instead
; of releasing the page...unless there are pending operations
; UPD ID= 234, SNARK:<6.MONITOR>DTESRV.MAC.46, 4-Dec-81 19:38:26 by SOUTH
; TCO 6.1042 - at failure exit of CALL DTEQ after BTD63, change JRST BTD62
; to JRST BTD63
; UPD ID= 225, SNARK:<6.MONITOR>DTESRV.MAC.45, 1-Dec-81 09:51:43 by SOUTH
;TCO 6.1040 - bring release 6 version DN60 protocol up to current release 5
; state.
; UPD ID= 224, SNARK:<6.MONITOR>DTESRV.MAC.44, 1-Dec-81 08:41:43 by PAETZOLD
;TCO 6.1039 - Rework literal with label in RMGRNC
; UPD ID= 188, SNARK:<6.MONITOR>DTESRV.MAC.43, 6-Nov-81 11:12:56 by COBB
;Add an EA.ENT at RELOAD to force SEC1, temporary 'til SFORK code fixed to
; pick up section # added in UPD ID 172 (MURPHY)
; UPD ID= 180, SNARK:<6.MONITOR>DTESRV.MAC.42, 2-Nov-81 17:00:57 by COBB
;Move S0.ENT to avoid trashing stack at DTEFLO.
; UPD ID= 173, SNARK:<6.MONITOR>DTESRV.MAC.41, 30-Oct-81 11:47:22 by MURPHY
;Set T3 to 0 for CALL DTEQ in DTJZCD.
; UPD ID= 172, SNARK:<6.MONITOR>DTESRV.MAC.40, 30-Oct-81 11:44:55 by MURPHY
;Start RELOAD fork in section 1
; UPD ID= 169, SNARK:<6.MONITOR>DTESRV.MAC.39, 26-Oct-81 11:22:34 by COBB
; UPD ID= 165, SNARK:<6.MONITOR>DTESRV.MAC.38, 23-Oct-81 15:45:00 by COBB
; UPD ID= 161, SNARK:<6.MONITOR>DTESRV.MAC.37, 23-Oct-81 15:14:02 by COBB
; UPD ID= 151, SNARK:<6.MONITOR>DTESRV.MAC.35, 21-Oct-81 14:09:48 by GRANT
;Turn off DTEIPR BUGINF
; UPD ID= 136, SNARK:<6.MONITOR>DTESRV.MAC.34, 19-Oct-81 15:49:33 by COBB
;TCO 6.1029 - CHANGE SE1CAL TO EA.ENT
; UPD ID= 245, SNARK:<5.MONITOR>DTESRV.MAC.33, 5-Oct-81 11:37:13 by HALL
;Fix bug in temporary test routine, JHTEST
; UPD ID= 234, SNARK:<5.MONITOR>DTESRV.MAC.32, 30-Sep-81 09:55:50 by SOUTH
; tco 5.1549 - extend range of NOINT in DN60 protocol til dte deassigned
; from fork to protect from asynchronous exits with dte in busy state.
; UPD ID= 231, SNARK:<5.MONITOR>DTESRV.MAC.31, 29-Sep-81 11:26:27 by SOUTH
; tco 5.1546 - patch mcb error check to avoid checking DN60 messages.
; UPD ID= 218, SNARK:<5.MONITOR>DTESRV.MAC.30, 28-Sep-81 11:01:34 by SOUTH
; tco 5.1536 - insert DN60 protocol (.VND60). All dispatches on CMVRR extended
; to account for it. User access through BOOT jsys function code .BTD60.
; UPD ID= 38, SNARK:<5.MONITOR>DTESRV.MAC.29, 16-Jul-81 12:24:30 by HALL
;TEMPORARY CHECKS FOR RUNNING IN SECTION 0 IN RELOAD
; UPD ID= 2218, SNARK:<5.MONITOR>DTESRV.MAC.28, 19-Jun-81 08:32:24 by GRANT
;Add check in SKVR22 for bad message being sent to DN20
; UPD ID= 2185, SNARK:<5.MONITOR>DTESRV.MAC.27, 11-Jun-81 15:54:10 by MURPHY
;CHANGE TQNx TO TMNx REFLECTING CHANGE IN MACSYM
; UPD ID= 2082, SNARK:<5.MONITOR>DTESRV.MAC.26, 26-May-81 15:13:04 by GRANT
;Add DTEIPR BUGINF for debugging purposes
; UPD ID= 1726, SNARK:<5.MONITOR>DTESRV.MAC.25, 17-Mar-81 15:27:33 by MURPHY
;Change STKVAR to TRVAR in DTEQ
; UPD ID= 1717, SNARK:<5.MONITOR>DTESRV.MAC.23, 16-Mar-81 16:32:28 by MURPHY
;TYPO
; UPD ID= 1711, SNARK:<5.MONITOR>DTESRV.MAC.22, 16-Mar-81 14:37:15 by MURPHY
;Count message buffers in use by each DTE, limit to 1/2 of total
; UPD ID= 1698, SNARK:<5.MONITOR>DTESRV.MAC.21, 13-Mar-81 11:35:27 by MURPHY
;More of the same
; UPD ID= 1635, SNARK:<5.MONITOR>DTESRV.MAC.20, 2-Mar-81 18:01:06 by MURPHY
;Prevent failure of DTEQ at PI level
; UPD ID= 1497, SNARK:<5.MONITOR>DTESRV.MAC.19, 26-Jan-81 13:25:54 by ENGEL
;GET RID OF THE LCS STUFF. NO LONGER PART OF NEXT RELEASE.
; UPD ID= 1470, SNARK:<5.MONITOR>DTESRV.MAC.18, 22-Jan-81 09:21:31 by GRANT
;MAKE ALL DTESW CONDITIONALS CONFORM TO CODING STANDARD
; UPD ID= 1468, SNARK:<5.MONITOR>DTESRV.MAC.17, 21-Jan-81 21:56:35 by GRANT
;PUT CODE IN DOFMCI UNDER DTESW
; UPD ID= 1464, SNARK:<5.MONITOR>DTESRV.MAC.16, 21-Jan-81 11:23:05 by GRANT
;TCO 5.1230 - CHANGE OLD DEBUG SWITCH TO DTESW
; UPD ID= 1435, SNARK:<5.MONITOR>DTESRV.MAC.15, 13-Jan-81 16:22:32 by HALL
;TCO 5.1180 - Clear right half of index register in SEEER2 because fork
; 0 now calls it from section 1
; UPD ID= 1357, SNARK:<5.MONITOR>DTESRV.MAC.14, 16-Dec-80 13:03:38 by GRANT
;TCO 5.1216 - fix free space bug in DOFMCI
; UPD ID= 1344, SNARK:<5.MONITOR>DTESRV.MAC.13, 12-Dec-80 09:15:45 by GRANT
;Add resident free space debugging checks in DN10MC and DOFMCI
; UPD ID= 1303, SNARK:<5.MONITOR>DTESRV.MAC.12, 20-Nov-80 14:36:38 by HALL
;RELOAD - RUN IN SECTION 1 BECAUSE KILPAG LEADS TO GDSTX
; UPD ID= 1080, SNARK:<5.MONITOR>DTESRV.MAC.11, 1-Oct-80 11:43:12 by MURPHY
;FIX ACVAR, ETC.
; UPD ID= 974, SNARK:<5.MONITOR>DTESRV.MAC.10, 29-Aug-80 08:41:38 by ENGEL
;ADD LCS NSP CALLING STUFF
; UPD ID= 913, SNARK:<5.MONITOR>DTESRV.MAC.9, 18-Aug-80 22:30:53 by MURPHY
;TURN ON FE DEBUG MODE MESSAGES
; UPD ID= 904, SNARK:<5.MONITOR>DTESRV.MAC.8, 15-Aug-80 14:34:37 by MURPHY
;DITTO
; UPD ID= 895, SNARK:<5.MONITOR>DTESRV.MAC.7, 14-Aug-80 10:23:27 by MURPHY
;REVISE FE DEBUG MODE
; UPD ID= 891, SNARK:<5.MONITOR>DTESRV.MAC.6, 13-Aug-80 18:17:44 by MURPHY
;Send .DFDBG message depending on state of DBUGSW
; UPD ID= 814, SNARK:<5.MONITOR>DTESRV.MAC.5, 30-Jul-80 11:27:40 by MURPHY
;CHECK DBUGSW BEFORE "CONTINUED" MESSAGE
; UPD ID= 751, SNARK:<5.MONITOR>DTESRV.MAC.4, 11-Jul-80 14:16:28 by MURPHY
;FIX PREV EDIT CODING STYLE
; UPD ID= 722, SNARK:<5.MONITOR>DTESRV.MAC.3, 2-Jul-80 10:45:05 by LYONS
;J0NRUN from DTEQ when RSX is sick. Fork 0 can get blocked at HAVNOD.
; UPD ID= 421, SNARK:<4.1.MONITOR>DTESRV.MAC.63, 8-Apr-80 16:49:28 by KONEN
;Correct TCO 4.1.1059
; UPD ID= 336, SNARK:<4.1.MONITOR>DTESRV.MAC.62, 14-Mar-80 13:52:06 by MILLER
;TCO 4.1.1112. Add CMPCT to RSX20F protocol
; UPD ID= 329, SNARK:<4.1.MONITOR>DTESRV.MAC.61, 13-Mar-80 13:51:43 by KONEN
; UPD ID= 204, SNARK:<4.1.MONITOR>DTESRV.MAC.60, 16-Jan-80 15:07:47 by KONEN
;Make previous edit a little nicer
; UPD ID= 189, SNARK:<4.1.MONITOR>DTESRV.MAC.59, 8-Jan-80 09:37:01 by KONEN
;TCO 4.1.1059 - Add subroutine RMGRNC to call RMGRNK.
; UPD ID= 176, SNARK:<4.1.MONITOR>DTESRV.MAC.58, 21-Dec-79 16:36:42 by GRANT
;ADD DTETBE BUGHLT SYMBOL
;<4.MONITOR>DTESRV.MAC.57, 31-Oct-79 15:55:26, EDIT BY MILLER
;ADD DTEFLA. FLUSH ALL REQUESTS FOR A LINE
;<4.MONITOR>DTESRV.MAC.56, 31-Oct-79 15:23:21, EDIT BY MILLER
;FLUSH DTEQS IN SCHEDULER WHENEVER DTRLD IS SET OR DETECTED ON
;<4.MONITOR>DTESRV.MAC.55, 26-Sep-79 16:13:49, EDIT BY HALL
;LODSEC IN BOOT JSYS - CALL BLTUM1 INSTEAD OF BLTUM FOR EXTENDED
;ADDRESSING
;<4.MONITOR>DTESRV.MAC.54, 26-Sep-79 15:57:14, EDIT BY MILLER
;AVOID AWAKING JOB 0 AT TKACK2 IF DBUGSW IS 2
;<4.MONITOR>DTESRV.MAC.53, 20-Sep-79 12:29:31, EDIT BY MILLER
;ADD RLDFRK
;<4.MONITOR>DTESRV.MAC.52, 20-Sep-79 11:51:10, EDIT BY MILLER
;FIX DNSNGL
;<4.MONITOR>DTESRV.MAC.51, 19-Sep-79 17:05:08, EDIT BY MILLER
;<4.MONITOR>DTESRV.MAC.50, 19-Sep-79 11:25:59, EDIT BY MILLER
;CHECK FOR SINGLE CHAR PACKET IN CLRDTE
;<4.MONITOR>DTESRV.MAC.49, 19-Sep-79 10:43:35, EDIT BY MILLER
;ONE MORE TRY. CLEAR DTERL FIRST
;<4.MONITOR>DTESRV.MAC.48, 14-Sep-79 12:36:12, EDIT BY MILLER
;TCO 4.2467. FIX -11 RELOAD
;<OSMAN.MON>DTESRV.MAC.1, 10-Sep-79 15:27:43, EDIT BY OSMAN
;TCO 4.2412 - Move definition of BUGHLTs, BUGCHKs, and BUGINFs to BUGS.MAC
;<4.MONITOR>DTESRV.MAC.46, 30-Aug-79 19:49:02, EDIT BY MILLER
;FIX CODE AT DTPOL3 TO CALL DOFRGM WITH CORRECT ARGS
;<4.MONITOR>DTESRV.MAC.45, 3-Aug-79 14:32:03, EDIT BY ENGEL
;AVOID NOSKED PAGE FAULT AT PROINI
;<4.MONITOR>DTESRV.MAC.44, 11-Jun-79 17:32:50, Edit by KONEN
;REMOVE CALL TO KILPAG IN UNLPAG
;<4.MONITOR>DTESRV.MAC.43, 9-Jun-79 14:03:59, EDIT BY MILLER
;<4.MONITOR>DTESRV.MAC.42, 9-Jun-79 14:03:07, EDIT BY MILLER
;REPLACE MOST BUGHLTS WITH FE RELOADS.
;<4.MONITOR>DTESRV.MAC.41, 26-May-79 14:05:09, EDIT BY MILLER
;FIX ILULK2 BUGHLTS
;<4.MONITOR>DTESRV.MAC.40, 16-May-79 15:24:47, EDIT BY MILLER
;FIX DTEINA TO NOT WAIT FOREVER FOR TO -11 I/O COMPLETION
;<4.MONITOR>DTESRV.MAC.39, 20-Apr-79 10:23:44, EDIT BY KIRSCHEN
;SAVE ERROR CODE WHEN BOOT FUNCTION FAILS
;<4.MONITOR>DTESRV.MAC.38, 4-Apr-79 14:39:28, EDIT BY MILLER
;<4.MONITOR>DTESRV.MAC.37, 4-Apr-79 13:57:33, EDIT BY MILLER
;ZERO DTEEBP AND DTETBP AT DTREST
;<4.MONITOR>DTESRV.MAC.36, 26-Mar-79 10:09:24, EDIT BY MILLER
;<4.MONITOR>DTESRV.MAC.35, 23-Mar-79 09:28:19, EDIT BY MILLER
;PUT BACK TEST. BLOCK PROCESS IF CALL IS FOR MASTER DTE
;<4.MONITOR>DTESRV.MAC.34, 22-Mar-79 21:12:21, Edit by MCLEAN
;REMOVE JN DTERLD IN DTEQ12 SO WE DON'T LOOSE THINGS DURING RELOAD
;<4.MONITOR>DTESRV.MAC.33, 7-Mar-79 14:46:23, Edit by MCLEAN
;ADD A SETZM DTECMD TO RELOAD TO PREVENT ILQ FRONT-END HALTS
;<4.MONITOR>DTESRV.MAC.32, 4-Mar-79 15:32:17, EDIT BY KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<4.MONITOR>DTESRV.MAC.31, 4-Mar-79 14:44:33, EDIT BY MILLER
;ADD CODE TO CHECK FOR TO -10 TRANSFER TOO LONG
;<4.MONITOR>DTESRV.MAC.30, 14-Feb-79 16:56:07, EDIT BY MILLER
;<4.MONITOR>DTESRV.MAC.29, 14-Feb-79 16:46:35, EDIT BY MILLER
;SWITCH MEANINGS OF CMPCT AND CMQCT FOR MCB PROTOCOL
;<4.MONITOR>DTESRV.MAC.28, 7-Feb-79 15:42:07, EDIT BY KIRSCHEN
;FIX COMMENT ON DOFRGM
;<4.MONITOR>DTESRV.MAC.27, 1-Feb-79 17:05:35, EDIT BY KIRSCHEN
;DO NOT CLEAR -TO11 BYTE POINTER IN KILPAG; ALREADY CLEARED IN RMGRNK
;<4.MONITOR>DTESRV.MAC.26, 1-Feb-79 16:04:50, EDIT BY MILLER
;ADD DTE NUMBER TO ALL BUGCHK AND BUGINF MESSAGES
;<4.MONITOR>DTESRV.MAC.25, 30-Jan-79 13:47:43, EDIT BY KIRSCHEN
;CLEAR TO-11 BYTE POINTER IN EPT WHEN UNMAPPING DTERBT PAGE
;<4.MONITOR>DTESRV.MAC.24, 30-Jan-79 12:06:00, EDIT BY MILLER
;DON'T CHECK DTERL BIT IN DTEIOP
;<4.MONITOR>DTESRV.MAC.23, 14-Jan-79 15:08:09, Edit by MCLEAN
;REMOVE TTMVSP
;<4.MONITOR>DTESRV.MAC.21, 12-Jan-79 21:06:13, EDIT BY KIRSCHEN
;CHANGE SETZM T4, TO SETZ T4, IN BTCPN
;<4.MONITOR>DTESRV.MAC.20, 21-Dec-78 17:06:15, EDIT BY MILLER
;FIX BOOTTB FOR ILLEGAL FUNCTION TRANSFERS
;<4.MONITOR>DTESRV.MAC.19, 18-Dec-78 16:20:23, EDIT BY ENGEL
;FIX BAD PLACEMENT OF .BTCLI CHECK
;<4.MONITOR>DTESRV.MAC.18, 15-Dec-78 16:29:45, EDIT BY ENGEL
;FIX DTE CHECKING FOR .BTCLI (NOT WANTED)
;<4.MONITOR>DTESRV.MAC.17, 15-Nov-78 20:16:24, EDIT BY MILLER
;CHNAGE RMGRNK TO CLEAR BYTE COUNT REG AND TO -10 POINTER
;<4.MONITOR>DTESRV.MAC.16, 11-Nov-78 18:43:35, Edit by MCLEAN
;<4.MONITOR>DTESRV.MAC.15, 11-Nov-78 18:34:24, Edit by MCLEAN
;MAKE DTEFLO CHECK FOR INTERRUPT ADDRESS INSTEAD OF CODE
;THIS WILL HELP PREVENT MONPDL'S AND PERMIT XON/XOFF TO PASS
;<4.MONITOR>DTESRV.MAC.14, 6-Nov-78 16:29:13, EDIT BY ENGEL
;ADD RETSKP TO BTCPN
;<4.MONITOR>DTESRV.MAC.13, 6-Nov-78 14:27:05, EDIT BY ENGEL
;CHANGE COMPARE IN BTCLI
;<4.MONITOR>DTESRV.MAC.12, 6-Nov-78 11:03:42, EDIT BY ENGEL
;DON'T CHECK FOR NULL IN .BTCLI
;<4.MONITOR>DTESRV.MAC.11, 27-Oct-78 17:45:19, EDIT BY HALL
;FIX THE CHECKS ON Q2 AGAINST DTEN - WENT THE WRONG WAY
;<4.MONITOR>DTESRV.MAC.10, 27-Oct-78 10:10:38, EDIT BY ENGEL
;ADD .BTCLI AND .BTCPN
;<4.MONITOR>DTESRV.MAC.9, 18-Oct-78 14:43:36, EDIT BY KIRSCHEN
;REMOVE .BTLST
;<4.MONITOR>DTESRV.MAC.8, 13-Oct-78 09:07:34, EDIT BY KIRSCHEN
;FIX BOOT JSYS DISPATCH TABLE
;<4.MONITOR>DTESRV.MAC.7, 6-Oct-78 15:01:33, EDIT BY KIRSCHEN
;ADD BTLST FUNCTION TO BOOT JSYS
;<4.MONITOR>DTESRV.MAC.6, 16-Aug-78 11:19:42, EDIT BY MILLER
;FIX PROTOCOL PAUSE ROUTINES NOT TO GET CONFUSED IF IN SECONDARY PROTOCOL
;<4.MONITOR>DTESRV.MAC.5, 27-Jul-78 17:40:48, EDIT BY MILLER
;FIX RELOAD TO TRY MASTER FE AT LEAST 3 TIMES
;<4.MONITOR>DTESRV.MAC.4, 18-Jul-78 08:46:20, EDIT BY MILLER
;MORE OF "CONTINUED" CHANGES
;<4.MONITOR>DTESRV.MAC.3, 17-Jul-78 08:55:20, EDIT BY MILLER
;SUPPRESS "CONTINUED" MESSAGE ON PROTOCOL PAUSE
;<4.MONITOR>DTESRV.MAC.2, 14-Jul-78 13:59:58, EDIT BY MILLER
;MORE FIXES FOR RELAODING A DTE. FIX DTE SCHEDULER SO IT CAN RUN IN SECTION 1
; COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1976, 1988.
; ALL RIGHTS RESERVED.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
; TRANSFERRED.
;
; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
; CORPORATION.
;
; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
; SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
SEARCH PROLOG,SERCOD,D36PAR
TTITLE DTESRV
IFN KLFLG,< ;CONDITIONAL WHOLE FILE
RESCD
MAXSGL==6
SNGHDR==3
SNGONQ==1B2
SNGAVL==1B3
SNGACT==1B4
;LOCAL DEFINITIONS FOR RELOAD WAITS
PWRDN1==^D1150 ;-11 MUST COMPLETE POWER DOWN IN THIS TIME
ROMTIM==^D2000 ;ROM MUST ACK -10 IN THIS TIME
BUTTIM==^D5000 ;-11 BOOTSTRAP TRANSFER TIME
DRBTIM==^D60000 ;-11 RELOAD TIME
T10TIM==^D3000 ;MAX TIME FOR 1K OF -11 CORE TO BE
; TRANSFERRED TO THE -10
MONPRO==^D5000 ;MUST ENTER MONITOR PROTOCOL IN THIS TIME
PRIPRO==^D10000 ;MUST ENTER PRIMARY IN THIS TIME
MCINI0==^D1500 ;TIME FOR MCB TO INIT COMM REGIONS
MCINI1==^D500 ;TIME TO COMPLETE PROTOCOL TRANSITION
DTENL==^D256 ;LINES PER DTE20
SDTE==3 ;SHIFT VALUE FOR DTE UNITS
MAXINP==^D254 ;MAX NUMBER OF BYTES IN AN INDIRECT
; PACKET WHICH IS EVEN
DSK11==1B28 ;RP RELOAD DEVICE IN -11 ROM
;TEMPORARY DEFINITION OF DECNET BLOCK SIZE
UBLSIZ==^D600
;SPECIAL DEFINITIONS FOR SCHEDULER PRIORITY WORDS
BOTPRI==1 ;SPECIAL PRIORITY WORD FOR BOOT JSYS INIT
RLDPRI==<XWD ^D80,1> ;SPECIAL MASTER -11 RELOAD PRIORITY
;STORAGE USED HEREIN
RS NCOMH,1 ;NUMBER OF NODES IN FREE LIST
;DTE SERVICE ROUTINE. THIS CODE CONTAINS THE INITIALIZATION CODE,
;THE QUEUE HANDLING AND SCHEDULING CODE AND THE INTERRUPT HANDLER
;FOR THE DTE.
;LOCAL DEFINITIONS
PVERSN==1 ;PROTOCOL VERSION NUMBER
CVERSN==2 ;COMMUNICATIONS VERSION NUMBER
LDTEPI==DTEPI0+DLSCHN+DTEPIE ;TURN ON ALL PI'S
MAG11N==1365 ;THE RELOAD INDICATOR FOR THE -11 ROM
;DEFINE LOCAL STORAGE
DEFSTR (QLINK,0,35,18) ;LINK TO NEXT PACKET
DEFSTR (QINT,0,17,18) ;INT LOC FOR THIS FUNCTION
DEFSTR (QFNC,1,17,18) ;FUNCTION WORD FOR THIS REQUEST
DEFSTR (QDEV,1,35,18) ;DTE DEVICE CODE FOR THIS REQUEST
DEFSTR (QNSPH,1,35,36) ;FULL WORD FOR NSP BYTE POINTER
DEFSTR (QLIN,2,17,18) ;DEVICE UNIT NUMBER
DEFSTR (QMODE,2,18,1) ;IF ONE, INDIRECT DATA MUST BE BYTE MODE
DEFSTR (QINU,2,19,1) ;PACKET "IN USE" BIT
DEFSTR (QCNT,2,35,16) ;BYTE COUNT OR BYTE OR 0
DEFSTR (QPNTR,3,35,36) ;BYTE POINTER FOR INDIRECT OPERATION
;OR LOCAL 8-BIT DATUM IF QCNT=0
DEFSTR (QCOD,4,35,36) ;UNIQUE CODE RETURNED TO INTERRUPT
; ROUTINE
;DTE STATUS DEFINITIONS IN DTESTS
DEFSTR(DTERL,DTESTS,0,1) ;BIT TO SAY DTE IS RUNNING A PROTOCOL
.DTERL==1B0 ;so it can be used efficiently
DEFSTR(DTEBF,DTESTS,1,1) ;WHICH BUFFER IS IN USE FOR RSX20F
DEFSTR (DTBLK,DTESTS,2,1) ;FOR MCB, TO -10 IS BLOCKED ON FREE
; SPACE
DEFSTR(DTRLD,DTESTS,3,1) ;IF ONE, THIS -11 BEING RELOADED
.DTRLD==1B3 ;so it can be used efficiently
DEFSTR (DTKAC,DTESTS,4,1) ;IF ONE, THIS -11 IS ILL
DEFSTR (DTSTI,DTESTS,5,1) ;STATUS PACKET IS SPLIT
DEFSTR(DTEB1,DTESTS,17,12) ;BYTE COUNT OF LAST TRANSFER
DEFSTR (DTEBC,DTESTS,29,12) ;BYTE COUNT REMAINING FOR SUBSEQUENT
DEFSTR (DTIPU,DTESTS,31,1) ;Tell DECnet about protocol up on 1st doorbell
DEFSTR (DTEST,DTESTS,35,4) ;DTE STATUS
DTET10==1 ;-10 IS RECIEVING LAST FRAGMENT OF A MESSAGE
DTE11==2 ;-11 IS RECEIVING BYTES
DTE11I==4 ;-11 IS RECEIVING AN INDIRECT QUEUE ENTRY
DTET1F==10 ;10 RECEIVING FIRST FRAFMENT OF
; A MESSAGE
;PARALLEL STATUS TABLE CONTAINING CURRENT OPERATION DATA
DEFSTR(DT1FC,DTEST1,15,16) ;CURRENT FUNCTION CODE
DEFSTR(DT1DV,DTEST1,31,16) ;CURRENT DEVICE CODE
;SPECIAL REQUEST BITS FOR TO 11 CONDITIONS
DEFSTR(DT1TM,DTEST1,32,1) ;-11 WANTS TIME OF DAY
DEFSTR(DT1ID,DTEST1,33,1) ;WAITING FOR INDIRECT SETUP
DEFSTR(DTBTMR,DTETMR,35,36) ;TIMER VARIABLE
DEFSTR(DTBOBL,DTEOBL,35,36) ;SECTION ZERO OUTPUT BLOCK
DEFSTR(DTBIBL,DTEIBL,35,36) ;SECTION ZERO INPUT BLOCK
DEFSTR(DTBDID,DTEDID,35,36) ;DRIVER PORT IDENTIFIER
;MORE STORAGE DEFINITIONS
;STORAGE FOR INDIRECT PACKETS
DEFSTR (INUNT,DTEIND,7,8)
DEFSTR (INCNT,DTEIND,15,8)
DEFSTR (INVLD,DTEIND,16,1) ;SAYS IF UNIT FIELD IS VALID
;********* FOR MCB, DTEIND CONTAINS FREE SPACE BLOCK ********
;DEFINITIONS FOR DTE PACKETS
DEFSTR (HDCNT,0,15,16) ;COUNT
DEFSTR (HDFNC,0,31,16) ;FUNCTION
DEFSTR (HDDEV,1,15,16) ;DEVICE CODE
DEFSTR (HDSPR,1,31,16) ;SPARE
DEFSTR (HDLIN,2,7,8) ;LINE NUMBER
DEFSTR (HDDAT,2,15,8) ;DATUM
DEFSTR (HDDT1,2,15,16) ;DATUM FOR SINGLE DATUM PACKET
;DEFINE THE COMMUNICATIONS REGION
;FIELD DEFINITIONS FOR THE COMMUNCIATIONS REGION
;FIRST THE OWNED AREA
DEFSTR (CMTEN,0,0,1) ;TEN INDICATOR IN HEADER
DEFSTR (CMVER,0,3,3) ;VERSION NUMBER
DEFSTR (CPVER,0,11,6) ;COMMUNCIATIONS PROTOCOL VERSION NUMBER
DEFSTR (CMNPR,0,16,5) ;NUMBER OF PROCESSORS HERE
DEFSTR (CMSIZ,0,19,3) ;SIZE IN MULTIPLES OF 8 WORDS
DEFSTR (CMNAM,0,35,16) ;PROCESSOR NAME
DEFSTR (CMLNK,1,35,36) ;POINTER TO NEXT PROCESSOR
DEFSTR (CMOPS,2,3,4) ;OPERATING SYSTEM TYPE
DEFSTR (CMCPN,2,35,4) ;CPU NUMBER+1 FOR MULTI-PROCESSORS
DEFSTR (CMKAC,KPALIV,35,36) ;PROCESSOR KEEP ALIVE COUNTER
CMPCW==6 ;PC WORD
CMPIWD==7 ;CONI PI, WORD
CMPGWD==10 ;CONI PAG, WORD
CMPDWD==11 ;DATI PAG, WORD
CMAPRW==12 ;CONI APR, WORD
CMDAPR==13 ;DATI APR, WORD
;NOW THE "TO" AREA
DEFSTR (CMPRO,0,0,1) ;1 IF THIS IS CONNECTION TO A -10
DEFSTR (CMDTE,0,1,1) ;I IF A DTE IS CONNECTING THESE TWO
DEFSTR (CMDTN,0,3,2) ;DTE NUMBER
DEFSTR (CMSZ,0,19,3) ;SIZE OF BLOCK/8
DEFSTR (CMVRR,0,16,5) ;PROTOCOL IN USE BY THE TWO PROCESSORS
DEFSTR (CMPNM,0,35,16) ;PROCESSOR NUMBER
DEFSTR (CMPPT,1,35,36) ;POINTER TO ASSOCIATE PROCESSOR
DEFSTR (CMPWF,2,0,1) ;POWER FAIL INDICATOR
DEFSTR (CML11,2,1,1) ;LOAD-11 INDICATOR
DEFSTR (CMINI,2,2,1) ;INI BIT FOR MCB PROTOCOL ONLY
DEFSTR (CMTST,2,3,1) ;VALID EXAMINE BIT
DEFSTR (CMQP,2,13,1) ;1 IF USING QUEUED PROTOCOL
DEFSTR (CMFWD,2,17,1) ;SAYS TO DO FULL WORD TRANSFER
MSKSTR (CMIP,2,400000) ;INDIRECT POINTER IS SET UP
MSKSTR (CMTOT,2,200000) ;TOIT BIT
DEFSTR (CM0IC,2,27,8) ;TO10IC FOR QUEUE TRANSFERS
DEFSTR (CM1IC,2,35,8) ;TO11IC FOR QUEUE TRANSFERS
DEFSTR (CMQCT,3,35,16) ;COUNT OF WORDS IN CURRENT QUEUE
DEFSTR (CMPCT,3,19,16) ;COUNT OF ALL PIECES (OR QUEUES)
;DEFINITIONS FOR PROTOCOL VERSION .VNMCB ONLY
DEFSTR (CMTMD,3,3,4) ;MODE OF THE TRANSFER
DEFSTR (CMTBP,4,35,36) ;TO -10 POINTER AT END OF TRANSFER
;COMMON DEFINITIONS
DEFSTR (CMRLF,4,35,36) ;RELOAD PARAMETER FOR THIS -11
DEFSTR (CMKAK,5,35,36) ;MY COPY OF HIS CMKAC
CMCLR1==2 ;FIRST DYNAMIC WORD TO CLEAR
CMCLR2==3 ;OTHER WORD TO CLEAR
;FUNCTION TRANSFER VECTOR FOR RSX20F PROTOCOL (.VN20F) ONLY
FNCTBL: IFIW!TAKCTY ;FE TELLING ABOUT THE CTY
IFIW!TAKDS ;STRING DATA (FOR CDR)
IFIW!TAKLC ;LINE CHARACTERS (FOR DLS)
IFIW!NOOP ;NOT YET IMPLEMENTED
IFIW!NOOP ;NOT YET IMPLEMENTED
IFIW!TAKSTD ;-11 SENDING ERROR INFORMATION
IFIW!NOOP ;UNSUPPORTED
IFIW!SNDTOD ;-11 WANTS TIME OF DAY
IFIW!TAKTOD ;-11 IS SENDING TIME OF DAY
IFIW!NOOP ;FLUSH OUTPUT NOT SUPPORTED
IFIW!NOOP ;SEND ALL NOT SUPPORTED
IFIW!DIALUP ;A LINE DIALED UP
IFIW!HANGUP ;A LINE HUNG UP
IFIW!EMPTY ;LINE BUFFER EMPTY
IFIW!NOOP ;XOFF
IFIW!NOOP ;XON
IFIW!TAKSPD ;SET LINE SPEED
IFIW!LINEAL ;SET LINE ALLOCATION
IFIW!TAKRLW ;TAKE -11 RELOAD INFORMATION
IFIW!TAKACK ;ACK ALL DEVICES AND UNITS
IFIW!NOOP ;TURN ON/OFF LINES
IFIW!NOOP ;ENABLE/DISABLE DATASETS
IFIW!NOOP ;LOAD TRANSLATION RAM
IFIW!NOOP ;LOAD VFU
IFIW!NOOP ;SUPPRESS SYSTEM MESSAGES
IFIW!TAKKLI ;TAKE KLINIK DATA
IFIW!NOOP ;CODE 34
IFIW!NOOP ;CODE 35
IFIW!NOOP ;CODE 36
IFIW!NOOP ;CODE 37
IFIW!FEDISK ;CODE 40 IGNORE NEW CODE FOR SERIAL NUMBERS
MINFNC==2 ;FIRST IMPLEMENTED FUNCTION
MAXFNC==.-FNCTBL+MINFNC-1 ;MAX FUNCTION NUMBER
;DEFINITIONS FOR NSP HEADER PACKET USING MCB PROTOCOL
NSPDN==177777B23 ;POSITION OF DEST NODE ADDRESS
NSPMF==377B15 ;POSIITON OF MESSAGE FLAGS (WORD 1)
NSPRF==377B7 ;POSITION OF ROUTING FLAGS
NSPS0==377B31 ;POSITION OF FIRST BYTE OF SOURCE NODE
NSPS1==377B7 ;POSITION OF SECOND BYTE OF SOURCE NODE
; (WORD 1)
;COMM REGION MODE TYPES FOR MCB BYTE TRANSFERS
.TMBYT==0 ;BYTE MODE TRANSFERS
.TMWRD==2 ;WORD MODE TRANSFERS
.TMBWD==1 ;BYTES IN WORD MODE TRNASFERS
SUBTTL Initialization
;THIS IS THE DTE INITIALIZATION CODE. IT SETS UP THE
;COMMUNICATIONS AREA FOR THE MASTER DTE ONLY (WHICH RUNS .VN20F PROTOCOL)
SWAPCD ;IS CALLED FROM JOB 0
PROINI::SETOM BTLOCK ;INITIALIZE BOOT PAGE LOCK
SETOM RLDFRK ;INIT REOAD FORK I.D.
MOVEI A,^D5000 ;MAKE 5 SEC CHECK
MOVEM A,DTETIM ;TO THE TIMER
SETZM CTYUNT ;****TEMP VALUE FOR CTY
SETZM TO11TM ;FREE UP TIME PACKET
MOVE A,[DTEEPW,,DTEEPW+1] ;AVOID NOSKED PAGE FAULT
NOSKED ;NO SCHEDULING
CHNOFF DLSCHN ;TURN OFF THE DTE CHANNEL
BLT A,DTEDRW+<DTEN-1>*10 ;CLEAR ENTIRE REGION IN THE EPT
STBUF1: SETZ A, ;FIRST COMMUNICATIONS REGION
MOVEI B,DTEN ;NUMBER TO DO
STOBUF: MOVEM A,COMBUF(B) ;STORE THIS GUY
ADD A,[1B11+COMSIZ] ;NEXT REGION
CAIN B,DTEN ;IS THIS THE -10'S REGION?
ADDI A,COMRGN*<DTEN-1> ;YES. ADD IN SPACE FOR ALL OF THE -11'S
SOJGE B,STOBUF ;DO ALL OF REGION
SETZM COMBAS ;SET UP TO CLEAR ENTIRE COM AREA
MOVSI A,COMBAS ;FIRST WORD
HRRI A,COMBUF+DTEN+2 ;FIRST WORD BEYOND THAT
BLT A,COMBUF+DTEN+IEXSIZ ;CLEAR ENTIRE COMM REGION
;NOW CREATE THE REQUEST QUEUE
MOVSI A,1-NQPKT ;NUMBER OF LINKS TO MAKE
DOQLNK: MOVEI B,QPKT+COMQ(A) ;THE NEXT PACKET
MOVEM B,COMQ(A) ;MAKE A LINK
ADDI A,QPKT-1 ;TO MAKE THE AOBJN WORK
AOBJN A,DOQLNK ;DO ALL PACKETS
MOVEI A,COMQ ;THE FIRST PACKET
MOVEM A,COMH ;MAKE THE HEADER POINT TO THE FIRST
MOVEI A,NQPKT ;INIT FREE COUNT
MOVEM A,NCOMH
; ..
; INIT QUEUE HEADERS
;..
MOVSI A,-DTEN ;NUMBER TO DO
BUFFLP: SETZM DTEQS(A) ;INIT SCHEDULER QUEUE
AOBJN A,BUFFLP ;DO ALL DTE'S
MOVE A,MSTRDT ;GET NUMBER OF MASTER DTE
MOVEI B,.VN20F ;INIT IT TO RSX20F PROTOCOL
CALL DTINIT ;DO IT
CHNON DLSCHN ;TURN ON DTE CHANNEL
OKSKED ;AND ALLOW SCHEDULING AGAIN
CALL DFNDL1 ;GO FIX UP SPECIAL LINES ON THE FE
CALLRET INIDV1 ;AND GO DO THE FRONT END DEVICES
;ROUTINE TO DO POWER FAIL INIT FOR EACH OF THE DTE'S.
RESCD ;MUST BE RESIDENT SO RESTART WORKS
STODT2: SAVEP ;SAVE PERMANENT REGISTERS
MOVSI P1,-DTEN ;NUMBER OF DTE'S
STODTE: JE DTERL,(P1),NODTEH ;RUNNING?
MOVEI A,0(P1) ;YES. GET DTE NUMBER
CALL DTINTP ;GO DO POWER FAIL RECOVERY
NODTEH: AOBJN P1,STODTE ;GO DO ALL OF THEM
CHNON DLSCHN ;ALLOW INTS NOW
OKSKD1 ;TURN ON SCHEDULING IF NECESSARY
RET ;AND DONE
;CODE TO RESTART THE DTE'S ONE SYSTEM RESTART.
;CALLED FROM SYSRST
DTERST::NOSKD1 ;NO SCHEDULING PLEASE
CHNOFF DLSCHN ;AND NO DTE INTS
CALLRET STODT2 ;GO DO THE WORK
;ROUTINE TO CHECK IF A GIVEN DTE IS RUNNING A PROTOCOL
; A/ DTE NUMBER
;RETURNS:
; +1 /NOT RUNNING A PROTOCOL
; +2/RUNNING A PROTOCOL
SWAPCD ;IS SWAPPABLE
CHKDTE::CAIL A,DTEN ;AN EXTANT DTE?
RETBAD ;NO
JE DTERL,(A),R ;IF NOT RUNNING A PROTOCOL FAIL
RETSKP ;SUCCESS
;ROUTINES TO INIT INDIVIDUAL DTE DATA BASES. CALLED FROM DTEINI
;AS WELL AS FROM THE REBOOT CODE
;MAY RUN WITH INTS AND SCHEDULING ENABLED
;ACCEPTS A/ DTE NUMBER
; B/ PROTOCOL VERSION TO INIT IF ENTRY IS AT DTINIT
;IF ENTRY IS AT DTINTP, PROTOCOL WILL BE INITED TO PREVAILING TYPE
;ACCEPTS: A/ DTE #
; B/ PROTOCOL VERSION NUMBER FOR DTINIT ONLY
;DTINTP WILL INIT DTE TO THE PROTOCOL IN EFFECT BEFORE THE POWER FAIL
RESCD ;MUST BE RESIDENT FOR RESTART
DTINTP: SETO B, ;REMEMBER POWER RESTART ENTRY
DTINIT: STKVAR <DTNUMB,PROVER> ;TO SAVE DTE NUMBER
HRRZS A ;GET DTE NUMBER ONLY
MOVEM B,PROVER ;SAVE PROTOCOL VERSION NUMBER
SETZM DTESTS(A) ;CLEAR STATUS WORD
SETZM DTEST1(A) ;AND THE OTHER ONE
CALL DTREST ;GO RESET THIS DTE
SKIPGE PROVER ;POWER RESTART ENTRY?
JRST DTINP1 ;YES.
SETONE DT1TM,(A) ;NO. SAY HE NEEDS TIME THEN
DTINP1: LSH A,SDTE ;TO FIND THE EPT REGION
SETZM DTEEPW(A) ;FORCE SECONDARY PROTOCOL
LSH A,-SDTE ;RESTORE A
CALL SETRGN ;GO FIND THE REGIONS
SUBI D,COMDAT ;POINT TO FIXED PART OF -11'S REGION
MOVEI C,COMBAS ;GET -10'S FIXED REGION
EXCH D,C ;REVERSE MEANINGS OF REGISTERS
CAME A,MSTRDT ;IS THIS THE MASTER?
JRST [ CALL DING11 ;NO. JUST RING BELL
JRST DTINI1] ;AND PROCEED WITH INIT
SETZM DTEFLG ;CLEAR FLAG WORD
MOVEI B,DTEEMP ;ENTER SECONDARY COMMAND
MOVEM B,DTECMD ;TO THE COMMAND WORD
CALL DING11 ;GO DING HIM
MOVEI B,MONPRO ;TIME TO ENTER PROTOCOL
CALL NEWTIM ;GET TIME IN FUTURE
DTINI2: SKIPN DTEFLG ;GOT IT YET?
JRST [ CALL CHKTIM ;IS TIME UP YET?
JRST DTINI2 ;NO. GO WAIT SOME MORE
CALL LOADFE ;(T1) YES, REQUEST LATER RELOAD
RET] ;AND DONE
;..
;..
DTINI1: MOVEM A,DTNUMB ;SAVE DTE NUMBER
MOVEI A,1 ;TENIND
STOR A,CMTEN,(D) ;SAY FIRST BLOCK IS FOR A TEN
SETZRO CMTEN,(C) ;HE IS NOT
MOVEI A,CVERSN ;CURRENT COMMUNICATIONS VERSION
STOR A,CMVER,(D) ;STORE IT
STOR A,CMVER,(C) ;FOR THE -11 ALSO
MOVEI A,PVERSN ;PROTOCOL VERSION
STOR A,CPVER,(C)
STOR A,CPVER,(D) ;STORE THIS AS WELL
MOVEI A,2 ;EACH -11 ADDRESSES TWO PROCESSORS
STOR A,CMNPR,(C)
MOVEI A,DTEN+1 ;NUMBER OF PROCESSORS
STOR A,CMNPR,(D) ;STORE THESE
SKIPGE B,PROVER ;DOING INIT?
JRST DTINI7 ;NO.
MOVEI A,COMSIZ/COMRGN ;INTEGRAL SIZE OF A REGION
CAIE B,.VN20F ;RSX20F PROTOCOL?
MOVEI A,2 ;NO. MCB HEADER IS ALWAYS 2
STOR A,CMSIZ,(C)
MOVEI A,2 ;HEADER IN 10'S AREA IS 2
STOR A,CMSIZ,(D) ;REMEMBER THE SIZE
DTINI7: MOVE A,DTNUMB ;GET DTE NUMBER
AOS A ;GET OFFSET INDEX
STOR A,CMNAM,(C) ;HIS NUMBER
SETZRO CMNAM,(D) ;MY NUMBER IS ZERO
MOVEI B,COMBAS ;FIRST REGION
MOVEI A,4 ;THIS INDICATES THAT TOPS-20 IS RUNNING
STOR A,CMOPS,(C) ;FOR FRONT-ENDS INTERESTED IN SUCH THINGS
STOR A,CMOPS,(D) ;. . .
DTINI3: JE CMLNK,(B),[ SETZRO CMLNK,(C)
SUBI C,COMBAS ;OFFSET FOR -11
STOR C,CMLNK,(B) ;LINK IT IN TO ACTIVE LIST
JRST DTINI4] ;AND DONE
LOAD B,CMLNK,(B) ;GET THE LINK
ADDI B,COMBAS ;MAKE IT ABSOLUTE
CAME B,C ;IS THIS THE ONE WE WANT?
JRST DTINI3 ;NO, GO CHECK IT
; ..
;DTINIT ...
;NOW INIT THE PER PROCESSOR REGION OF EACH COM REGION
DTINI4: MOVE A,DTNUMB
CALL SETRGN ;GO FIND REGIONS AGAIN
EXCH C,D ;REVERSE REGS AGAIN
SETZM CMCLR1(C)
SETZM CMCLR2(C) ;CLEAR DYNAMIC WORDS IN -11'S REGION
SETZM CMCLR1(D)
SETZM CMCLR2(D) ;CLEAR TEN DYNAMIC WORDS
MOVEI A,1 ;TENIND WORD
STOR A,CMPRO,(C) ;TELL -11 HE IS CONNECTED TO A -10
STOR A,CMDTE,(C)
STOR A,CMDTE,(D) ;A DTE CONNECTS THESE TWO
STOR A,CMTST,(D) ;SET VALID EXAMINE
STOR A,CMSZ,(C)
STOR A,CMSZ,(D) ;TO THE REGIONS
MOVE A,DTNUMB ;GET DTE NUMBER
STOR A,CMDTN,(C) ;TO HIS REGION
STOR A,CMDTN,(D) ;AND TO MINE
AOS A ;INDEX
STOR A,CMPNM,(D) ;HIS NAME
SETZRO CMPNM,(C) ;AND MY NAME IN HIS REGION
SETZRO CMPPT,(C) ;HIS POINTER TO ME
SUBI C,COMBAS+COMDAT ;HIS RELATIVE OFFSET IN COMM REGION
STOR C,CMPPT,(D) ;MAKE MY REGION POINT TO HIM
ADDI C,COMBAS+COMDAT ;RESTORE POINTER
SKIPGE B,PROVER ;NEED TO DO MORE INITING?
JRST DTINI5 ;NO. ALL DONE FOR NOW
STOR B,CMVRR,(D) ;YES. STORE PROTOCOL VERSION NUMBER
STOR B,CMVRR,(C) ; IN BOTH REGIONS
CAIE B,.VN20F ;DOING RSX20F?
JRST DTINI5 ;NO. ALL DONE WITH COMM REGION
MOVEI A,1 ;YES. GET A ONE
STOR A,CMQP,(D) ;USING THE QUEUED PROTOCOL
STOR A,CMQP,(C) ;FOR HIS AS WELL
; ..
;NOW SET UP THE EPT FOR THIS DTE/-11 AND DO THE PROTOCOL
;TRANSITION
DTINI5: MOVEM D,PROVER ;SAVE COMM REGION POINTER
MOVE D,DTNUMB ;GET DTE NUMBER
LSH D,SDTE ;GET TO THE EPT OFFSET
MOVEI A,COMBUF+DTEN-1 ;HIS EXAMINE REGION
SUB A,DTNUMB ;WHERE IT REALLY IS
MOVEI B,IEXSIZ+2 ;GET INITIAL EXAMINE SIZE
ADD B,DTNUMB ;ADD IN DTE NUMBER
MOVEM A,DTEERW(D) ;EXAMINE RELOCATION WORD
SUBI C,COMDAT ;STORE DEPOSIT RELOCATION
MOVEM C,DTEDRW(D) ;STORE DEPOSIT RELOCATION
ADDI C,COMDAT ;GET BACK COMM REGION POINTER
MOVEM B,DTEEPW(D) ;STORE EXAMINE PROTECTION WORD
MOVEI B,COMSIZ ;SIZE OF A SINGLE REGION
MOVEM B,DTEDPW(D) ;STORE AS THE DEPOSIT PROTECTION
MOVE A,DTNUMB ;THE DTE NUMBER
MOVE B,DTETRP(A) ;GET TRAP INSTRUCTION
MOVEM B,DTEINT(D) ;TO THE EPT
MOVE D,PROVER ;RESTORE COMM REGION POINTER
LOAD B,CMVRR,(C) ;GET PROTOCOL VERSION TO USE
JRST @.+1(B) ;DISPATCH TO APPROPRIATE PROTOCOL INIT FCN
IFIW ! DTINRS ;RSX20F
IFIW ! DTINMC ;MCB
IFIW ! DTIND6 ;DN60 (IBM)
;HERE TO INIT RSX20F PROTOCOL FOR THIS DTE AND THIS -11
DTINRS: ;RSX20F protocol init fcn
SETZM DTEIND(A) ;CLEAR ANY RESIDUAL INDIRECT INFO
SKIPE DTBFWD(A) ;HAVE BUFFERS YET?
JRST DTIN10 ;YES. USE THEM THEN
MOVE A,[.RESP1,,BUFSIZ*2] ;NO. GET SOME SPACE THEN
MOVX B,<RS%SE0+.RESGP> ;FROM THE GENERAL POOL
CALL ASGRES ;GET THE SPACE
JRST [ MOVE A,DTNUMB ;FAILED. GET BACK DTE NUMBER
CAMN A,MSTRDT ;IS THIS THE MASTER?
BUG.(HLT,NORSXF,DTESRV,SOFT,<Failed to get space for master DTE>,,<
Cause: While attempting to initialize RSX20F protocol for the console
front end, the call to ASGRES (assign resident free space) failed.
>)
CALL LOADFE ;(T1) REQUEST JOB 0 RELOAD
RET] ;AND DONE
MOVE B,DTNUMB ;GOT IT. GET BACK DTE NUMBER
HRLI A,BUFSIZ(A) ;FORM BUFFER WORD
MOVEM A,DTBFWD(B) ;STORE IT
MOVE A,B ;GET DTE NUMBER
DTIN10: SETZM DTEFLG ;SET UP TO LEAVE MONITOR MODE
MOVEI B,DTEEPP+1 ;ENTER PRIMARY AND RESET COMM REGION
MOVEM B,DTECMD ;THE COMMAND TO MONFE
CALL DING11 ;GO DING HIM
CAME A,MSTRDT ;IS THIS THE MASTER?
JRST DTINI6 ;NO. SKIP PROTOCOL TRANSITION THEN
MOVEI B,PRIPRO ;TIME TO DO IT
CALL NEWTIM ;WHEN TIME IS UP
SKIPN DTEFLG ;WAIT FOR THE 11 TO ACKNOWLEDGE
JRST [ CALL CHKTIM ;TIME UP YET?
JRST .-1 ;NO. GO WAIT
CALL LOADFE ;(T1) REQUEST JOB 0 RELOAD
RET] ;AND DONE
SETOM FEFLG ;PRIMARY PROTOCL NOW AVAILABLE
DTINI6: CALL CLRBEL ;CLEAR OUT RESIDUAL DOORBELLS
CALL DTEON ;TURN ON PROTOCOL
;NOW THAT THE PROTOCOL EXISTS, QUERY THE FRONT END ON THE STATE
;OF THE CTY
CALL DTESKD ;START UP SCHEDULER IF NECESSARY
PUSH P,A ;SAVE DTE NUMBER
CALL LINFRQ ;GO GET THE LINE FREQUENCY
CAIN A,^D60 ;60 HZ?
SETZ A, ;YES. REMEMBER AS A 0
EXCH A,0(P) ;SAVE LINE FREQUENCY, RESTORE DTE NO
SETZ C, ;DIRECT
MOVE B,[.DFLCI,,.FEDLS] ;GIVE LINE COUNT
MOVEI D,NTTFE-1 ;THE NUMBER OF FE LINES
SKIPE 0(P) ;60 HZ?
TRO D,(1B2) ;NO. SET 50 HZ BIT
POP P,0(P) ;CLEAN UP STACK
CALL DTEQ ;DO IT
JFCL ;WILL GO
RET ;AND DONE
;HERE TO INIT THE DTE AND THE -11 FOR MCB PROTOCOL. AT THIS POINT:
; C/ POINTER TO -11'S COMM REGION
; D/ POINTER TO -10'S COMM REGION
; DTNUMB IS A STKVAR WITH THE DTE NUMBER IN IT
; PROVER IS A STKVAR WITH THE PROTOCOL VERSION IN IT
DTINMC: EA.ENT ;RUN IN EXTENDED SECTION
SETONE <CMTST,CMINI>,(D) ;SET MY INI BIT
MOVE B,CNDO(A) ;GET PROTOTYPE CONO
IORI B,DTEPIE!DTEPI0 ;TURN ON PI0 ONLY
XCT B ; SO -11 CAN EXAMINE ITS REGION
CALL DING11 ;GO RING -11'S BELL
MOVE B,[CONSO DTE0,DTETDB]
LSH A,^D26 ;POSOITION DTE NUMBER
ADD B,A ;MAKE PROPER WORD
MOVEM B,PROVER ;SAVE IT
MOVE A,DTNUMB ;RESTORE DTE NUMBER
MOVEI B,MCINI0 ;TIMEOUT FOR FIRST PHASE
CALL NEWTIM ;GET ABSOLUTE TIME
DTINM1: XCT PROVER ;SEE A DOORBELL YET?
JRST [ CALL CHKTIM ;TIME UP YET?
JRST DTINM1 ;NO. KEEP POLLING
XCT PROVER ; DOORBELL YET ?
JSP B,DTINM6 ; NO DOORBELL YET !
JRST .+1] ; DOORBELL CAME
TMNN CMINI,(C) ;SEE IF IT DID IT RIGHT
JSP B,DTINM7 ; BIT IS CLEAR--NO GOOD
CALL CLRBEL ;CLEAR DOORBELL
SETZRO CMINI,(D) ;CLEAR INI BIT
CALL DING11 ;RING 11'S BELL AGAIN
MOVEI B,MCINI1 ;TIME FOR THIS PHASE
CALL NEWTIM ;ABSOLUTE TIME
DTINM2: XCT PROVER ;SEE A BELL YET?
JRST [ CALL CHKTIM ;NO. TIME UP YET?
JRST DTINM2 ;NO. KEEP POLLING
XCT PROVER ; DOORBELL YET ?
JSP B,DTINM6 ; NO DOORBELL YET !
JRST .+1] ; DOORBELL CAME
TMNE CMINI,(C) ;MAKE SURE IT DID IT RIGHT
JSP B,DTINM7 ;BIT IS SET--NO GOOD, REPORT THE PROBLEM
;ALLOCATE A BLOCK A SECTION ZERO FREE SPACE FOR INPUT AND OUTPUT.
JN DTBOBL,(A),DTINM4 ;IF WE ALREADY HAVE ONE, WE'RE OK
MOVX A,<<UBLSIZ+3>/4> ;GET A BLOCK THIS BIG
HRLI A,.RESP1 ;USE THE HIGHEST PRIORITY (CAN'T SWAP)
MOVX B,<RS%SE0+.RESNP> ;USE THE DECnet POOL - SECTION 0
CALL ASGRES ;GET THE FREE SPACE
JSP B,DTINM8 ;OOPS, COULDN'T ALLOCATE IT
MOVE B,DTNUMB ;GET BACK THE DTE NUMBER
STOR A,DTBOBL,(B) ;STORE THE OUTPUT BLOCK POINTER
DTINM4: MOVE B,DTNUMB ;GET BACK THE DTE NUMBER
JN DTBIBL,(B),DTINM5 ;IF WE ALREADY HAVE INPUT BLOCK, WE'RE OK
MOVX A,<<UBLSIZ+3>/4> ;GET A BLOCK THIS BIG
HRLI A,.RESP1 ;USE THE HIGHEST PRIORITY (CAN'T SWAP)
MOVX B,<RS%SE0+.RESNP> ;USE THE NETWORK POOL - SECTION 0
CALL ASGRES ;GET THE FREE SPACE
JSP B,DTINM8 ;OOPS, COULDN'T ALLOCATE IT
MOVE B,A ;GET POINTER TO INPUT BLOCK
MOVE A,DTNUMB ;GET BACK DTE NUMBER
STOR B,DTBIBL,(A) ;STORE THE INPUT BLOCK POINTER
;NOW SIGNAL DRIVER (ROUTER) OF NEW CIRCUIT BEING OPENED.
DTINM5: MOVE A,DTNUMB ;GET THE DTE NUMBER BACK
MOVE B,DCNCID(A) ;Get DECnet callback ID
STOR B,DTBDID,(A) ;SAVE THE DRIVER'S BLOCK ID
SETONE DTIPU,DTESTS(A) ;TELL ROUTER ABOUT PROTOCOL UP ON 1ST DOORBELL
CALL DTEON ;GO TURN PROTOCOL ON
CALLRET DTESKD ;AND START THE PROTOCOL
;INIT FAILED. TIMED OUT WAITING FOR A DOORBELL
DTINM6: MOVE A,DTNUMB ;GET DTE #, IN CASE WE FORGOT.
IFN MCBDBG, < ;Buginf only if debugging
BUG.(INF,DTEWAT,DTESRV,SOFT,<DTE MCB initialization timed out>,<<A,DTE>,<B,PC>>,<
Cause: The KL timed out while waiting for the MCB to answer a doorbell during
QP2 initialization.
Action: Try again. If it still doesn't work, check the MCB software. Failing
that, have Field Service check out the DTE.
Data: A - DTE NUMBER.
B - PC OF CALLER.
>,,<DB%NND>) ;[7.1210]
> ;End of MCBDBG
DTINM9: SETONE DTRLD,(A) ;SET RELOAD
AOS LOAD11 ;SAY AN -11 DIED
SETZRO DTERL,(A) ;NO LONGER RUNNING A PROTOCOL
CALLRET DTREST ;AND RESET THE DTE
;INIT FAILED DURING HANDSHAKE. ONE OF:
; 1) HIS TO-ME BIT NOT SET
; 2) HIS TO-ME BIT NOT CLEAR
; AT THE APPROPRIATE TIMES
DTINM7: MOVE A,DTNUMB ;GET DTE #, IN CASE WE FORGOT.
BUG.(INF,DTEBWS,DTESRV,SOFT,<DTE MCB handshake incorrect>,<<A,DTE>,<B,PC>>,<
Cause: The KL detected that the MCB's init bit was not correct during a QP2
protocol initialization handshake.
Action: Try again. If it still doesn't work, check the MCB software. Failing
that, have field service check out the DTE.
Data: A - DTE number
B - PC of caller
>)
JRST DTINM9 ;GO DO NORMAL CLEANUP
;INIT FAILED BECAUSE WE COULDN'T GET SECTION ZERO MEMORY FOR INPUT OR OUTPUT
;BUFFERS
DTINM8: MOVE A,DTNUMB
BUG.(CHK,DTECGB,DTESRV,SOFT,<DTE MCB initialization timed out>,<<A,DTE>,<B,PC>>,<
Cause: Couldn't allocate memory for section zero input or output buffers.
Action: Try again later.
Data: DTE - DTE number
PC - PC of caller
>,,<DB%NND>) ;[7.1210]
JRST DTINM9 ;CLEANUP THINGS
;TIMING ROUTINES USED BY PROTOCOL INIT CODE
;COMPUTE TIME IN FUTRURE.
; B/ INCREMENT
NEWTIM: PUSH P,A ;SAVE DTE #
PUSH P,B ;SAVE INCREMENT
CALL GETMST ;GET NOW
POP P,B ;GET BAC INCREMENT
ADD B,A ;TIME IN FUTURE
POP P,A ;DTE #
RET ;DONE
;CHECK IF TIME HAS ELAPSED.
; B/ ABSOLUTE TIME
;RETURNS: +1/ TIME NOT UP
; +2 TIME UP
CHKTIM: SAVEAC <A> ;SAVE DTE #
PUSH P,B ;SAVE TIME
CALL GETMST ;GET NOW
POP P,B ;GET BACK TIME
CAMLE B,A ;TIME UP?
RET ;NO
RETSKP ;YES
SUBTTL DTE Interrupt Service
;DTE INTERRUPT SERVICE. THIS CODE IS ENTERED WHENEVER ANY FLAVOR
;OF DTE INTERRUPT IS GENERATED. THERE IS A SEPARATE ENTRY ROUTINE
;FOR EACH DTE.
;For each DTE there is an XPCW block called "DTXPC" followed by the
;unit number. The new PC for the DTE points to code that
; 1) Does JSR SVDTRJ, which comes here to SVDTAC
; 2) Stores double-word interrupt PC at DTETRA
; 3) Does CONI DTE into F
; 4) Jumps to INTDTE
;ROUTINE TO SAVE THE AC'S ON A DTE INTERRUPT
;Reached via JSR SVDTRJ at interrupt level
RESCD ;MUST BE RESIDENT
SVDTAC::MOVEM P,DTEACB+P ;GET A WORK REGISTER
MOVEI P,DTEACB ;BLT ARG
BLT P,DTEACB+P-1 ;SAVE REST OF ARGS
MOVE P,DTESTK ;GET LOCAL STACK
JRST @SVDTRJ ;RETURN TO INTERRUPT VECTOR
;DISMISS A DTE INTERRUPT
DTEDN1: JUMPE P4,DTEDNE ;IF NO MORE, GO DISMISS
MOVEI C,0(P4) ;PACKET SIZE
MOVE A,DTEDTE ;GET DTE NUMBER
JRST DOFNC3 ;GO DO THIS FUNCTION
DTEDNE: MOVSI P,DTEACB ;TO DO BLT
BLT P,P-1 ;DO ALL BUT P
MOVE P,DTEACB+P ;RESTORE P
XJEN DTETRA ;RESTORE STATE OF MACHINE
;INTERRUPT ON NON-EX OR RELOADING DTE. TURN OFF THE DTE
DTEPRG: CALL DTREST ;GO RESET THIS DTE
JRST DTEDNE ;AND GO DISMISS IT
;ROUTINE USED BY DTINIT TO TURN ON DTE PROTOCOL RACE FREE
; A/ DTE #
DTEON: NOSKD1 ;AVOID RACES WITH SCHEDULER
SETONE DTERL,(A) ;SAY NOW RUNNING A PROTOCOL
CALL DTPII ;TURN ON DTE PI'S
OKSKD1 ;ALLOW SCHEDULING AGAIN
RET ;AND DONE
;COMMON INTERRUPT ROUTINE. ENTERS WITH
; A/ DTE NUMBER WHICH CAUSED INTERRUPT
; P/ POINTS TO LOCAL DTE INTERRUPT STACK
; F/ RESULT OF CONI DTEN,
;
;THIS ROUTINE PROCESSES ALL DTE INTERRUPTS
INTDTE::JE DTERL,(A),DTEPRG ;IF NON-EX, FORGET IT
JN DTRLD,(A),DTEPRG ;IF RELOADING THE -11, FORGET THIS INTERRUPT
TXNE F,DTEPF ;-11 LOST POWER?
JRST POW11 ;YES. GO DO SOMETHING ABOUT IT
TXNE F,DTEEDN ;-11 DONE?
JRST [ CALL TO11DN ;CALL AS A SUBROUTINE
JRST DTEDNE] ;GO DISMISS THE INTERRUPT
TXNE F,DTETDN ;TO 10 DONE?
JRST TO10DN ;YES. GO MAKE SURE WE WERE TRANSFERRING
TXNE F,DTETDB ;-10 DOORBELL INTERRUPT
JRST DINGME ;YES. I WAS DINGED
TXNE F,DTEEER ;TO -11 ERROR TERMINATION
JRST TO11ER ;YES. GO TRY AGAIN THEN
TXNE F,DTETER ;TO 10 ERROR?
JRST TO10ER ;YES. BAD NEWS
JRST DTEDNE ;GO DISMISS THE INTERRUPT
;Here when hardware bit indicates to -10 done. See if software agrees.
TO10DN: STKVAR<OSTATE> ;WORD TO SAVE OLD STATE
MOVEM A,DTEDTE ;SAVE DTE NUMBER
MOVE B,CNDO(A) ;PROTOTYPE CONO
IORI B,DTETDN ;SET TO CLEAR THIS BIT
XCT B ;CLEAR IT
LOAD B,DTEST,(A) ;GET STATUS OF THE DTE
MOVEM B,OSTATE ;SAVE THE STATE
TXZE B,DTET10!DTET1F ;RECEIVING ANY FLAVOR OF MESSAGE?
JRST DODMSG ;YES. GO DO THE MESSAGE THEN
BUG.(CHK,DTETIP,DTESRV,HARD,<DTETDN - TO-10 done received with no transfer in progress>,<<A,DTE>>,<
Cause: The KL received indication from the DTE that a TO-10 transfer has
completed but the DTE status did not indicate that a transfer was
in progress.
Action: If the problem persists, call Field Service.
Data: DTE - DTE number
>,,<DB%NND>) ;[7.1210]
JRST DTEDNE ;GO DISMISS THIS INTERRUPT
;PROCESS TO -10 DONE. FIRST DETERMINE WHICH PROTOCOL IS IN USE...
DODMSG: STOR B,DTEST,(A) ;NEW STATUS
CALL SETRGN ;GO GET COMM REGION POINTERS
LOAD B,CMVRR,(C) ;GET PROTOCOL IN USE ON THIS DTE
MOVE B,DN10VC(B) ;GET ADDRESS OF PROCESSING ROUTINE
JRST 0(B) ;GO DO IT
;TRANSFER VECTOR FOR TO -10 DONE (BASED ON PROTOCOL TYPE)
DN10VC: EXP DN10RS ;FOR RSX20F PROTOCOL
EXP DN10MC ;FOR MCB PROTOCOL
EXP DN10D6 ;FOR DN60 PROTOCOL
;DN10RS - CODE TO PROCESS TO -10 DONE FOR RSX20F PROTOCOL
;AT THIS POINT:
; A/ DTE NUMBER
; C AND D POINT TO COMM REGIONS
DN10RS: LOAD B,DTEBC,(A) ;GET RESIDUE COUNT
SETZ P5, ;ASSUME NO HEADER ON MESSAGE
JUMPN B,[ CALL DOFRGM ;START THIS FRAGMENT
JRST DODMS1] ;AND MERGE THE CODES
SETZRO CMTOT,(C) ;CLEAR INTRANSIT BIT
LOAD C,DTEB1,(A) ;GET COUNT OF COMPLETED REQUEST
LOAD D,DTEBF,(A) ;THE BUFFER WE USED
DODMS1: XCT [ HRRZ D,DTBFWD(A)
HLRZ D,DTBFWD(A)](D) ;PICK UP THE BUFFER BASE ADDRESS
HRLI D,(<POINT ^D8,0>) ;MAKE IT A BYTE POINTER
JN INCNT,(A),[ ;HAVE A RESIDUAL FUNCTION COUNT?
LOAD P3,INCNT,(A) ;YES. GET IT
JRST OLDFC2] ;GO DO IT
;..
;GET THE FUNCTION AND DEVICE FROM THIS INITIAL FRAGMENT
DOFNC3: SETO P5, ;PROCESSING HEADER
CAIGE C,12 ;VALID PACKET?
JRST [ BUG.(CHK,DTEP2S,DTESRV,HARD,<TO10DN - Packet too small>,,<
Cause: The packet size field in a TO10 packet from a DTE contains an
invalid length.
Action: If the problem persists, call Field Service.
>,,<DB%NND>) ;[7.1210]
JRST DTEDNE] ;NO. IGNORE IT
ILDB B,D ;SECOND BYTE
ILDB P3,D ;GET COUNT
LSH P3,10 ;THE FIRST BYTE
IORI P3,0(B) ;MAKE COUNT FIELD
ILDB P1,D ;LAST EIGHT BITS OF THE FUNCTION
ILDB B,D ;FIRST 8 BITS OF THE FUNCTION
LSH B,10 ;TO FORM FULL CODE
IOR P1,B ;GET FUNCTION CODE
PUSH P,P1 ;SAVE CODE
TRZ P1,1B20 ;CLEAR INDIRECT BIT
STOR P1,DT1FC,(A) ;SAVE IT
ILDB P1,D ;GET DEVICE CODE
ILDB B,D
LSH B,10
IOR P1,B ;FORM FULL DEVICE CODE
STOR P1,DT1DV,(A) ;SAVE THIS
REPEAT 2,<ILDB B,D> ;SKIP THE SPARE
POP P,P1 ;GET BACK FUNCTION
TRZE P1,1B20 ;INDIRECT?
JRST [ SETONE DT1ID,(A) ;YES. REMEMBER THIS
LOAD B,DTEST,(A) ;GET STATE
CAIN C,12 ;MUST BE TWO BYTES LEFT
TXNE B,DTET10!DTET1F ;IS IT QUIET?
JRST [ BUG.(CHK,DTEIDP,DTESRV,HARD,<Bad indirect packet>,<<A,DTENO>>,<
Cause: An indirect packet from a DTE was received but the DTE status word
indicated that there is no transfer active.
Data: DTENO - DTE number
>,,<DB%NND>) ;[7.1210]
JRST DINGER]
ILDB B,D ;GET COUNT
STOR B,INCNT,(A) ;SAVE THIS TOO
ILDB B,D ;GET LINE
STOR B,INUNT,(A); SAVE IT
SETONE INVLD,(A); SAY UNIT IS VALID
JRST DTEDNE] ;AND DONE WITH THE REQUEST
SETZRO INVLD,(A) ;UNIT IN INDIRECT WORD IN INVALID
;..
;..
OLDFC2: CAILE P3,0(C) ;FUNCTION FULLY WITHIN PACKET?
JRST [ SETZ P4, ;NO. NO LOCAL RESIDUAL COUNT
SUBI P3,0(C) ;FIND HOW MANY IN NEXT PACKET
STOR P3,INCNT,(A) ;SAVE IT
JRST OLDFC1] ;GO DO IT
SETZRO INCNT,(A) ;NO NEXT RESIDUAL
EXCH P3,C
SUBI P3,0(C) ;FIND LOCAL RESIDUAL
MOVEI P4,0(P3) ;NEXT FUNCTION IS HERE
;Transfer according to the function code provided in the data
OLDFC1: SKIPE P5 ;NEED TO REMOVE HEADER?
SUBI C,10 ;BYTES IN HEADER
JUMPLE C,DTEDN1 ;IF NO BYTES, WE ARE DONE
LOAD B,DT1FC,(A) ;GET OPERATIVE FUNCTION CODE
CAIL B,MINFNC ;LEGAL FUNCTION?
CAILE B,MAXFNC ;STILL LEGAL?
JRST [ BUG.(CHK,DTEIFR,DTESRV,HARD,<DTESRV - Illegal FNC request>,<<A,DTENO>>,<
Cause: A packet from a DTE was received that contained an invalid function
code.
Action: If the problem persists, call Field Service.
Data: DTENO - DTE number
>)
JRST DINGER] ;NO. KILL THE FE THEN
JRST @FNCTBL-MINFNC(B) ;YES. GO DO IT THEN
;Here when function code provided is not supported
NOOP: BUG.(CHK,DTEUIF,DTESRV,HARD,<DTESRV - Unimplemented function from 11>,<<A,DTENO>>,<
Cause: A packet from a DTE was received that contained a function code
that is not supported by TOPS-20.
Data: DTENO - DTE number
>)
JRST DINGER ;AND ZAP THE FE
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 has sent line characters.
TAKLC: CALL TAKLC2 ;CALL PROCESSING ROUTINE
JRST DTEDN1 ;ALL DONE
TAKLC2: STKVAR <BYTC,BYTP,SAVOFS,SAVTYP>;-11 HAS SENT LINE CHARACTERS
TRNE C,1 ;AN EVEN NUMBER OF BYTES?
BUG.(CHK,DTEODD,DTESRV,HARD,<TAKLC - Odd byte count for line characters>,,<
Cause: A TO-10 transfer completion interrupt was recieved from the DTE
under RSX20F protocol that indicates the -11 has sent line
characters and the byte count is odd.
>)
LOAD B,DT1DV,(A) ;GET DEVICE FOR THIS OPERATION
MOVEM B,SAVTYP ;SAVE DEVICE TYPE
CAIN B,.FECTY ;IS IT THE CTY?
JRST [ SETZM SAVOFS
JRST ISCTY]
CAIE B,.FEDLS ;IS IT "TTY"?
JRST [ BUG.(CHK,DTETTY,DTESRV,HARD,<Non-TTY device>,<<A,DTENO>>,<
Cause: A TO-10 transfer completion interrupt from the DTE was recieved
under RSX20F protocol that indicates the -11 has sent line
characters, but the device type provided in the packet is not a
TTY.
Data: DTENO - DTE number
>)
JRST DINGER]
IMULI A,DTENL ;YES. GET LINE OFFSET
MOVEM A,SAVOFS ;SAVE IT FOR LATER
ISCTY: MOVEM C,BYTC ;SAVE COUNT OF BYTES
MOVEM D,BYTP ;AND THE BYTE POINTER
TAKLC1: SOS BYTC ;MUST BE AT LEAST TWO BYTES HERE
MOVE D,BYTP ;JUST IN CASE
SOSGE BYTC ;THIS MAKES TWO
RET ;ALL DONE
ILDB A,BYTP ;GET BYTE
ILDB B,BYTP ;GET LINE NUMBER
ADD B,SAVOFS ;MAKE IT A "REAL" LINE NUMBER
MOVE C,SAVTYP ;TYPE
CALL DTESTO ;STORE IN BIGBUF
JRST TAKLC1 ;DO ALL BYTES
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 has sent string data. Transfer according to device type
TAKDS: LOAD B,DT1DV,(A) ;GET THE DEVICE
CAIL B,MINDEV ;A REASONABLE DEVICE?
CAILE B,MAXDEV ;STILL?
JRST DMPBFR ;NO. FLUSH THE REQUEST
SKIPE P1,DTEDTV(B) ;A KNOWN DEVICE?
SKIPN P1,DTVSD(P1) ;YES. THIS DEVICE HAVE STRING DATA?
JRST DMPBFR ;NO. FORGET IT
CALL GETUNT ;FIND APPROPRIATE UNIT NUMBER
HRLI A,0(C) ;THE COUNT
LOAD C,DT1DV,(A) ;GET THE DEVICE
MOVSS A ;PUT ARGS IN PROPER ORDER
CALL 0(P1) ;GO DO DEVICE STUFF
JRST DTEDN1 ;ALL DONE
;MORE FUNCTIONS,ETC.
;COMMON ROUTINE USED BY TAKDS AND TAKSTS TO FIND UNIT. MAY BE
;STASHED AWAY IN DTEIND IF PACKET IS INDIRECT OR IN CURRENT
;PACKET
GETUNT: JN INVLD,(A),[
LOAD B,INUNT,(A) ;GET IT FROM INDIRECT WORD
RET] ;AND DONE
ILDB B,D ;NOT INDIRECT. GET IT FROM CURRENT
ILDB B,D ;IS THE SECOND BYTE
SUBI C,2 ;TWO FEWER BYTES
RET ;AND DONE
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 is providing time of day
TAKTOD: CAIGE C,2 ;AT LEAST TWO MORE BYTES?
JRST DNTIME ;NO. MUST NOT BE A TIME THEN
ILDB P1,D ;AND ANOTHER
ILDB B,D ;GET ONE BYTE
SUBI C,2 ;TOOK TWO OF THEM
JUMPE P1,DNTIME ;IF ZERO,NO TIME IN THE -11
CAIGE C,10 ;ENOUGH BYTES
JRST [ BUG.(CHK,DTEDAT,DTESRV,HARD,<TAKTOD - Illegal format for time/date>,,<
Cause: A TO-10 transfer completion interrupt from the DTE
under RSX20F protocol that indicates the -11 is providing the time
of day was recieved. The packet format is incorrect.
>)
JRST DNTIME] ;DONT BELIEVE IT
CALL GTTFLD ;GET YEAR FIELD
HRLM P1,TAD11 ;STORE YEAR
ILDB P1,D ;MONTH
HRRM P1,TAD11 ;TO MEMORY
ILDB P1,D ;DAY OF MONTH
HRLM P1,TAD11+1 ;TO MEMORY
ILDB P1,D ;DAY OF WEEK
HRRM P1,TAD11+1 ;TO MEMORY
MOVX C,IC%DSA!IC%UTZ ;IDCNV BITS
ILDB P1,D ;GET DST FLAG & TIME ZONE
TRZE P1,1B28 ;DST FLAG ON?
TXO C,IC%ADS ;YES - USE DST THEN
STOR P1,IC%TMZ,C ;STORE TIME ZONE
MOVEM C,TAD11+2 ;TO MEMORY
CALL GTTFLD ;GET SECONDS
LSH P1,1 ;*2
HRRM P1,TAD11+2 ;TO MEMORY
JRST DTEDN1 ;ALL FINISHED
DNTIME: SETOM TAD11 ;NONE GIVEN
DMPBFR: JUMPLE C,DTEDN1
IBP C,D ;ADJUST BYTE POINTER
MOVE D,C ;MOVE IT TO CORRECT REGISTER
JRST DTEDN1 ;AND RETURN
GTTFLD: ILDB P1,D ;GET NEXT TIME/DATE FIELD
ILDB C,D ;IN 2 BYTES
LSH P1,10 ;SLIDE FIRST PART OVER
IOR P1,C ;FORM -11 WORD
RET ;AND RETURN
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 wants to receive time of day
SNDTOD: SETONE DT1TM,(A) ;SAY -11 WANTS TIME OF DAY
JRST DMPBFR ;MAKE SURE ALL IS OK
;Here on interrupt for to -10 done, for RSX20F protocol, and
;LINE HUNG UP OR DIALED UP
HANGUP: TDZA P1,P1 ;CLEAR P1
DIALUP: MOVEI P1,1 ;DIAL UP
CAIGE C,2 ;ENOUGH BYTES LEFT?
JRST [ BUG.(CHK,DTECAR,DTESRV,HARD,<Carrier FNC with no line number>,<<A,DTENO>>,<
Cause: A TO-10 transfer completion interrupt from the DTE under RSX20F
protocol that indicates a line has hung up or dailed up was
received. The packet contains no line number due to a format
error.
Action: If problem persists, contact Field Service.
Data: DTENO - DTE number
>)
JRST DINGER]
LOAD P3,DT1DV,(A) ;GET DEVICE
IMULI A,DTENL ;BIAS THE LINE NUMBER
ALLLNE: ILDB B,D ;GET LINE NUMBER
ILDB P2,D ;THROW AWAY UPPER PART OF WORD
PUSH P,A ;SAVE BASE LINE NUMBER
ADDI B,0(A) ;LINE NUMBER IN B
PUSH P,C
PUSH P,D
MOVEI A,0(P3) ;DEVICE CODE
XCT [ CALL TTYHGU
CALL TTYDLU](P1) ;CALL PROPER ROUTINE
POP P,D
POP P,C
POP P,A ;GET BACK BASE LINE NUMBER
SOS C ;DECREMENT COUNT
SOJG C,ALLLNE ;DO ALL LINES
JRST DTEDN1 ;AND DONE
;Here on interrupt for to -10 done, for RSX20F protocol, and
;line buffers are empty
EMPTY: CALL EMPTY2 ;GO DO PROCESSING
JRST DMPBFR ;ALL DONE. MAKE SURE BUFFERS ALIGN
EMPTY2: STKVAR <CNTSV,DTESV,PTRSV>
MOVEM A,DTESV
MOVEM C,CNTSV
MOVEM D,PTRSV
LOAD D,DT1DV,(A) ;GET DEVICE -11 IS ACK-ING
CAIL D,MINDEV ;A REASONABLE DEVICE?
CAILE D,MAXDEV ;MAYBE, STILL SO?
JRST LINEA1 ;NO
SKIPE P1,DTEDTV(D) ;A KNOWN DEVICE?
SKIPN P1,DTVACK(P1) ;THIS DEVICE WANT AN ACK?
JRST EMPTY3 ;NO. SKIP THE PACKET
EMPTY1: MOVE A,DTESV ;GET DTE
LOAD A,DT1DV,(A) ;GET FUNCTION DEVICE
ILDB B,PTRSV ;GET LINE NUMBER
ILDB C,PTRSV ;THROW AWAY UPPER HALF
CALL 0(P1) ;GO DO THE POST
SOS CNTSV ;THE DUMMY BYTE
SOSLE CNTSV ;MORE LINES?
JRST EMPTY1 ;YES
EMPTY3: MOVE C,CNTSV ;GET COUNT
MOVE D,PTRSV ;RESTORE BYTE POINTER
RET ;END OF FUNCTION
;Here on interrupt for to -10 done, for RSX20F protocol, and
;11 sent line speed
;DONE ON -10 RELOAD
TAKSPD: CAIGE C,6 ;ENOUGH BYTES?
JRST DMPBFR ;NO. IGNORE IT THEN
SUBI C,5 ;YES. WE WILL USE FIVE OF THEM
PUSH P,C ;SAVE RESIDUE COUNT
CALL GETUNT ;GO FIND UNIT NUMBER
LOAD A,DT1DV,(A) ;PICK UP DEVICE FIELD
CALL GTTFLD ;GET INPUT SPEED
MOVSI P2,0(P1) ;SAVE IT
CALL GTTFLD ;GET OUTPUT SPEED
HRRI P2,0(P1) ;FORM SPEED WORD
ILDB C,D ;GET REMOTE INDICATOR
PUSH P,D ;SAVE BP
MOVE D,P2 ;ARG FOR TTYSRV
CALL TTSPST ;GO SET IT UP
POP P,D
POP P,C ;RESTORE IMPORTANT PARAMETERS
JRST DMPBFR ;AND DONE
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 is sending its reload register information:
TAKRLW: CAIGE C,2 ;MUST BE A WORD OF INFORMATION
JRST DMPBFR ;IGNORE IT
ILDB B,D ;GET LOW 8 BITS
ILDB P1,D ;GET HIGH 8 BITS
LSH P1,10 ;ADJUST IT
IORI P1,0(B) ;FORM SWITCH WORD
TRZ P1,(1B2) ;IGNORE RETRY BIT
PUSH P,C
PUSH P,D ;SAVE REGISTERS
CALL SETRGN ;FIND REGIONS
STOR P1,CMRLF,(C) ;SAVE IN MY REGION
POP P,D ;RESTORE REGISTERS
POP P,C
SUBI C,2 ;TOOK 2 BYTES
JRST DMPBFR ;GO ALIGN BUFFERS
;Here on interrupt for to -10 done, for RSX20F protocol, and
;WANTTO ACK ALL UNITS OF ALL DEVICES
;Transfer according to device type
TAKACK: MOVSI P1,MINDEV-MAXDEV+.FECTY
HRRI P1,.FECTY+1 ;START BEYOND THE CTY
PUSH P,D ;SAVE SP
PUSH P,C ;SAVE COUNTER
TKACK1: SKIPE C,DTEDTV(P1) ;THIS DEVICE EXIST?
SKIPN C,DTVACK(C) ;YES. WANT AN ACK?
JRST TKACK2 ;NO
MOVE A,DTEDTE ;GET DTE FOR THIS FUNCTION
SETO B, ;SAY TO ACK THEM ALL
CALL 0(C) ;GO DO IT
TKACK2: AOBJN P1,TKACK1 ;GO DO ALL DEVICES
POP P,C
POP P,D
MOVE A,DBUGSW ;GET RUNNING STATE
CAIE A,0 ;DEBUGGING SOME STUFF?
JRST DMPBFR ;YEP. SKIP MESSAGE THEN
AOS JB0FLG
MOVEI A,1
IORM 1,UPFLAG ;SAY WE NEED MESSAGE
JRST DMPBFR ;GO ALIGN BUFFERS
;Here when we receive a packet of front-end disk serial numbers
FEDISK: SETZ C,0 ;[7154] START WITH UNIT 0
FEDLOP: ILDB A,D ;GET THE HIGH ORDER PART OF THE SERIAL NUMBER
ILDB B,D ;GET LOW ORDER PART
LSH B,^D28 ;SHIFT SO WE CAN MAKE FULL PACKET
LSHC A,^D8 ;MAKE ONE FULL WORD
MOVEM A,FEDSKT(C) ;[7154] STORE IT IN THE TABLE
CAIE C,FEDSKL-1 ;[7154] LOOKED AT ALL UNITS?
AOJA C,FEDLOP ;[7154] NO, NEXT UNIT
CALL PHYFED ;[7154] () YES, SET THE UDBS
SETOM FESER ;TELL PHYSIO ALL SERIAL NUMBERS HAVE ARRIVED
JRST DTEDNE ;AND DONE
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 is sending KLINIK data
TAKKLI: CAILE C,KLIMAX ;WILL IT FIT?
JRST [ BUG.(CHK,KLIOVF,DTESRV,HARD,<DTESRV - KLINIK data base too large>,<<C,PAKSIZ>>,<
Cause: A TO-10 transfer completion interrupt from the DTE under RSX20F
protocol was recieved that indicates the -11 is sending KLINIK
data but the size of the data field is out of range.
Action: Contact Field Service if the problem persists.
Data: PAKSIZ - Size of KLINIK data field in packet
>)
JRST DTEDNE] ;AND IGNORE DATA
MOVEM C,KLIDTA ;SAVE COUNT
MOVE A,[POINT ^D8,KLIDTA+1] ;GET POINTER TO BUFFER
TAKKL1: ILDB B,D ;GET NEXT BYTE
IDPB B,A ;SAVE IT
SOJG C,TAKKL1 ;MOVE ALL BYTES
JRST DTEDNE ;AND DONE
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 is ending line allocation information
LINEAL: CALL LINEA2 ;GO DO PROCESSING
JRST DMPBFR ;ALL DONE. MAKE SURE BUFFERS ALIGN
LINEA2: STKVAR <CNTSV,DTESV,PTRSV>
MOVEM C,CNTSV ;SAVE COUNT
MOVEM A,DTESV ;SAVE DTE #
MOVEM D,PTRSV ;SAVE POINTER
LOAD D,DT1DV,(A) ;GET DEVICE CODE
CAIG D,MAXDEV ;A KNOWN DEVICE?
CAIGE D,MINDEV ;?
LINEA1: JRST [ BUG.(CHK,DTEDEV,DTESRV,HARD,<Illegal device>,<<A,DTENO>>,<
Cause: A TO-10 transfer completion interrupt from the DTE under RSX20F
protocol that indicates the -11 is ending line allocation
information was recieved. The device code provided is out of
range.
Action: If the problem persists, contact Field Service
Data: DTENO - DTE number
>)
JRST DINGER] ;ERROR
SKIPE P1,DTEDTV(D) ;A KNOWN DEVICE?
SKIPN P1,DTVTLA(P1) ;YES. CAN SET LINE ALLOCATION?
JRST EMPTY3 ;NO. GIVE IT UP
CALLRET EMPTY1 ;GO DO COMMON PROCESSING
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 IS SENDING ID OF THE CTY
TAKCTY: ILDB B,D ;GET LINE NUMBER
CALL IDCTY ;IDENTIFY IT TO TELETYPE SERVICE
SUBI C,1 ;TOOK ONE BYTE
JRST DMPBFR ;GO ALIGN BUFFERS
;Here on interrupt for to -10 done, for RSX20F protocol, and
;-11 is sending error information
;Transfer according to device type
TAKSTD: CALL GETUNT ;GET THE UNIT
STOR B,INUNT,(A) ;SAVE UNIT FOR SYSERR
JN DTSTI,(A),[ SETZRO DTSTI,(A) ;CLEAR SPLIT INDICATOR
MOVE B,D ;MOVE POINTER
JRST TAKSTF] ;AND GO
LOAD A,DT1DV,(A) ;GET DEVICE
CAIL A,MINDEV ;A REASONABLE DEVICE?
CAILE A,MAXDEV ;STILL?
TAKSTE: JRST SEEERR ;UNKNOWN, SEE IF SYSERR REQUESTED
SKIPE A,DTEDTV(A) ;A KNOWN DEVICE?
SKIPN A,DTVTLS(A) ;YES. WANT DEVICE STATUS?
JRST TAKSTE ;NO
PUSH P,C ;SAVE COUNT
PUSH P,D ;AND STRING POINTER
CALL 0(A) ;DISPATCH OFF
POP P,D ;RESTORE POINTER
POP P,C ;AND COUNT
SEEERR: ILDB B,D ;GET SOFTWARE STATUS
ILDB B,D ;LOW 8 BITS
SUBI C,2 ;COUNT DOWN THOSE BYTES
TXNN B,.DVFLG ;ERROR LOGGING REQUESTED?
JRST DMPBFR ;GO ALIGN BUFFERS
;..
;CODE TO MAKE FIRST PASS AT SYSERR ENTRY. THIS CODE WILL QUEUE
;UP ALL OF THE DEVICE DEPENDENT ERROR DATA, AND WILL STORE
;THE DEVICE CODE AND THE WORD COUNT OF THE ERROR DATA. IT WILL
;ALSO SCHEDULE A JOB 0 SUBROUTINE TO COMPLETE THE BLOCK
;..
ADDI C,2 ;GET BACK THE SOFTWARE STATUS
MOVNI B,2 ;NUMBER OF BYTES TO RECOVER
IBP B,D ;ADJUST THE BYTE POINTER
TAKSTF: PUSH P,C ;SAVE BYTE COUNT
PUSH P,B ;SAVE BYTE POINTER
ADDI C,3 ;CALCULATE WORDS IN ERROR REPORT
LSH C,-2 ;""
PUSH P,C ;SAVE WORD COUNT
MOVEI A,FE%LEN(C) ;WORDS TO ALLOCATE
MOVEI B,FE%SIZ(C) ;SIZE OF HEADER
EA.ENT ;EXTENDED FOR SYSERR
CALL ALCSBX ;GET THEM
JRST [S0.ENT ;***WARNING*** REMOVE THIS IF MADE EXTENDED
JRST SEEER1] ;NONE THERE. PUNT
MOVE B,DTEDTE ;GET DTE NUMBER
MOVEM B,FE%DTE+SEBDAT(A) ;SAVE DTE NUMBER IN THE PACKET
LOAD C,INUNT,(B) ;GET UNIT
LOAD B,DT1DV,(B) ;GET DEVICE CODE
HRLI B,0(C) ;MOVE UNIT TO LH
MOVEM B,FE%DEV+SEBDAT(A);SAVE DEVICE CODE
POP P,C ;WORD COUNT FOR ERROR STUFF
MOVNI D,0(C)
HRLM D,FE%PTR+SEBDAT(A) ;SAVE COUNT OF WORDS
POP P,D ;GET DATA STRING
POP P,C ;AND BYTE COUNT
MOVE B,[POINT ^D8,FE%INF+SEBDAT(A)] ;POINTER
MOVEM C,FE%BYT+SEBDAT(A) ;STORE # OF -11 BYTES
SEEER3: ILDB P1,D ;ERROR BYTE
IDPB P1,B ;SAVE IT
SOJG C,SEEER3 ;DO ALL BYTES
MOVE B,[-2,,[ ;INSERT EVENT CODE AND RECALL
SEBPTR 0,SBTEVC,SEC%FE ;EVENT CODE
SEBPTR 0,SBTFNA,SEEER2]] ;RECALL
MOVE P1,D ;SAVE SP
MOVE P2,A ;SAVE POINTER
CALL SEBCPY ;DO COPY
JFCL
MOVE A,P2 ;GET BACK POINTER
CALL QUESEB ;NOW QUEUE IT UP
S0.ENT ;***WARNING*** REMOVE THIS IF MADE EXTENDED
MOVE D,P1
CALL CHKFRG ;SEE IF MORE TO COME
JRST DTEDN1 ;ALL DONE
SEEER1: POP P,0(P) ;CLEAN UP STACK
POP P,D ;SP
POP P,C ;BYTE COUNT
CALL CHKFRG ;SEE IF MORE TO DO
JRST DMPBFR ;GO ALIGN BUFFERS
;CODE TO PROCESS TO -10 DONE FROM AN MCB FRONT END TRANSFER
; A/ DTE NUMBER
; C AND D POINT TO COMM REGIONS
DN10MC: EA.ENT ;DECNET RUNS IN EXTENDED SECTIONS
STKVAR <DTENO> ;PLACE TO SAVE DTE NUMBER
MOVEM A,DTENO ;SAVE DTE NUMBER FOR LATER
SETZRO CMTOT, (C) ; clear in transit flag
JN DTEBC,(A),DTEDNE ;IF MORE TO DO, GO WAIT.
MOVE B,DTEIND(A) ;GET THE MESSAGE BLOCK POINTER
LOAD A,DTBIBL,(A) ;POINT TO THE INPUT SECTION ZERO BLOCK
CALL CPYWDS ;COPY THE INPUT TO THE MSG BLOCK
MOVX B,DI.INC ;INPUT DONE INTERRUPT
MOVE A,DTENO ;GET BACK THE DTE NUMBER
SETZ C,
EXCH C,DTEIND(A) ;GET THE POINTER TO THE MSG BLOCK
CALL CALDVR ;CALL DRIVER (ROUTER)
JRST DTEDNE ;AND DONE
;HERE TO COPY DATA FROM INPUT BLOCK TO MESSAGE BLOCK
; CALLED WITH A/ SECTION ZERO BLOCK
; B/ MESSAGE BLOCK TO COPY TO
CPYWDS: XMOVEI B,UD.MSD(B) ;POINT TO THE "INPUT" MSD
LOAD C,MDBYT,(B) ; AND USE THAT AS THE BYTE COUNT
ADDI C,3 ;ROUND THE COUNT UP
LSH C,-2
LOAD B,MDALA,(B) ;GET THE ALLOCATED ADDRESS
XCALLRET (XCDSEC,DNCPYW) ;COPY THE WORDS TOGETHER
; -11 REQUESTED RELOAD OR INIT
DINGDY: MOVE B,$CMINI(D) ;GET WORD FROM -11'S REGION
LOAD C,CMVRR,(C) ;Get protocol version
SKIPN DTBUGX ; Skip this if we aren't interested
CAIE C,MCPRON ;If DECnet, no buginf
BUG.(INF,DTESUI,DTESRV,SOFT,<Front end requested reload or init>,<<A,DTE>,<B,STATUS>>,<
Cause: An -11 has requested a reload or init but the enabled
protocol for this DTE is not DECnet.
Data: DTE - DTE number.
STATUS - Status word from -11's comm region
>,,<DB%NND>) ;[7.1210]
JRST DINGER
;COLLECTION OF ROUTINES TO DO ERROR PROCESSING.
;Here on interrupt, when CONI bit DTEEER indicates to -11 error
TO11ER:
;Here on interrupt, when CONI bit DTETER indicates to -10 error
TO10ER: BUG.(CHK,DTEERR,DTESRV,HARD,<DTESRV - DTE device error>,<<A,DTENO>,<F,STATUS>>,<
Cause: A packet has been received from a DTE that has a flag lit
indicating a TO -10 or TO -11 error.
Action: Contact Field Service
Data: DTENO - DTE number
STATUS - Result of CONI DTEN,
>,,<DB%NND>) ;[7.1210]
JRST DINGER ;GO RELOAD THE MACHINE
;Here on interrupt, when CONI bit DTEPF indicates power failure
POW11: CALL DTEPF1 ;TELL -11 ABOUT THE POWER FAIL
JRST DTEPRG ;GO SHUT OFF THIS -11
;ROUTINE TO REQUEST A RELOAD OF THIS MACHINE
LOADME::MOVE A,MSTRDT ;THE MASTER -11
CALL SETRGN ;GO FIND REGIONS
SETONE CML11,(C) ;SET MY RELOAD INDICATOR
CALLRET DING11 ;GO TELL HIM TO DO IT
;ROUTINE CALLED FROM SCHED TO TELL MASTER -11 ABOUT A POWER FAIL
;INTERRUPT
DTEPWF::MOVE A,MSTRDT ;GET MASTER -11
DTEPF1: CALL SETRGN ;FIND COMM REGIONS
SETONE CMPWF,(C) ;SET OUR POWER-FAIL INDICATOR
CALLRET DING11 ;AND TELL THE -11
;ROUTINE TO SEE IF STATUS PACKKET WAS FRAGMENTED
CHKFRG: MOVE A,DTEDTE ;GET DTE NUMBER
MOVE B,DTESTS(A) ;GET STATUS
TXNN B,DTET10!DTET1F ;NOW ACTIVE?
RET ;NO
SETONE DTSTI,(A) ;REMEMBER NEXT PART TO DO LOGGING
RET ;AND DONE
;Here on interrupt, when CONI DTE bit DTETDB indicates doorbell.
;Most likely cause is that the -11 wants to start a to -10 transfer.
;-10 HAS RECEIVED A TO 10 DOORBELL. MUST FIGURE OUT WHAT THE -11
;WANTS AND HOW TO DO IT
DINGME: CALL SETRGN ;GO FIND THE COMM REGIONS
JN <CMINI,CML11>,(D),DINGDY ;WANT RELOAD OR REINIT?
DINGM1: LOAD B,CMVRR,(C) ;GET PROTOCOL TYPE
CAIE B,.VN20F ;IS THIS THE RSX20F FRONT END?
JRST DINGM2 ;NO. DON'T CHECK FOR INDIRECT THEN
JN DT1ID,(A),INDRCT ;YES, COMPLETING AN INDIRECT?
DINGM2: LOAD P1,CM0IC,(C) ;MY TO 10 COUNTER
LOAD P2,CM0IC,(D) ;HIS TO 10 COUNTER
CAMN P2,P1 ;DIFFERENT?
JRST [ CALL CLRBEL ;CLEAR BELL
JRST DTEDNE] ;GO AWAY
CAIE P2,1(P1) ;WITHIN ONE OF ME?
JRST [ CAIN P2,0 ;DID HIS WRAP AROUND?
CAIE P1,377 ;YES. IS MINE AT MAX VALUE?
JRST DINGM3 ;NO. ERROR
JRST .+1] ;YES. ALL IS WELL
STOR P2,CM0IC,(C) ;MAKE COUNTS THE SAME
INDRC1: MOVX B,DTET10!DTET1F ;TO 10 BITS
TDNE B,DTESTS(A) ;IS THERE A TO 10 GOING?
JRST DINGM4 ;YES. ERROR
SETONE CMTOT,(C) ;SET IN TRANSIT BIT
CALL CLRBEL ;CLEAR DOORBELL
LOAD B,CMQCT,(D) ;GET QUEUE COUNT
SKIPG B ;IS IT A VALID COUNT
JRST DINGM5 ;NO. ERROR
CALL DOFRGM ;START TRANSFER IN PROPER PROTOCOL
JRST DTEDNE ;AND DONE
;COMPLETING AN INDIRECT FOR RSX20F PROTOCOL ONLY
INDRCT: JE CMIP,(D),[
LOAD P1,CM0IC,(C) ;MY TO 10 COUNT
LOAD P2,CM0IC,(D) ;HIS TO 10 COUNT
CAIE P1,0(P2) ;COUNTS THE SAME?
JRST DINGM6 ;NO. ERROR
CALL CLRBEL ;YES. CLEAR EXTRANEOUS BELL
JRST DTEDNE] ;GO DISMISS THE INTERRUPT
SETZRO DT1ID,(A) ;CLEAR EXPECTING INDIRECT
LOAD B,INCNT,(A) ;GET COUNT FROM HEADER
OPSTR <CAME B,>,CMQCT,(D) ;SAME AS DATA NOW BEING SENT?
JRST [ BUG.(INF,INDCNT,DTESRV,HARD,<DTESRV - Bad indirect count>,<<A,DTENO>>,<
Cause: The DTE was attempting to complete an indirect but the count in
the data being sent does not match the count in the indirect
packet.
Data: DTENO - DTE number.
>,,<DB%NND>) ;[7.1210]
JRST DINGER] ;AND DO A RELOAD
JRST INDRC1 ;GO DO THE REQUEST
;ERROR ROUTINES FOR DOORBELL SERVICE
DINGER: SKIPE FEDBSW ;YES. WANT TO SUPPRESS RELOADS?
JRST DTEDNE ;YES. IGNORE CONDITION
CAME A,MSTRDT ;IS THIS THE MASTER?
CALL [ CALL DTREST ;NO. CLEAR IT
SETZRO DTERL,(A) ;AND SAY NOT RUNNING A PROTOCOL
CALLRET CLRDTE] ;AND DONE
CALL LOADFE ;(T1) REQUEST JOB 0 RELOAD
JRST DTEDNE ;AND GO DISMISS INTERRUPT
;TO -10 COUNTS ARE WRONG
DINGM3: BUG.(INF,DTECDM,DTESRV,HARD,<DTESRV - TO-10 counts do not match>,<<A,DTNENO>>,<
Cause: TOPS-20 received a doorbell interrupt from the DTE but the TO-10
counter in the front end does match the counter kept by TOPS-20.
Action: TOPS-20 is reloading the FE.
Data: DTENO - DTE number
>)
JRST DINGER ;AND GO RELOAD
;TO -10 REQUEST FROM FE WHILE ONE IS IN PROGRESS
DINGM4: BUG.(INF,DTEDIN,DTESRV,HARD,<DTESRV - TO-10 in progress on doorbell>,<<A,DTENO>>,<
Cause: The 10 received a doorbell from the 11, but a TO -10 transfer was
already in progress.
Data: DTENO - DTE number
>)
JRST DINGER
;INVALID Q COUNT FROM -11
DINGM5: BUG.(INF,DTEDME,DTESRV,HARD,<DTESRV - Zero queue count>,<<A,DTENO>>,<
Cause: A transfer from the 11 to the 10 is about to be started, but the
count of free bytes in the transfer queue is zero.
Action: Examine the DTE to see if it has hardware problems.
Data: DTENO - DTE number
>)
JRST DINGER
;INCORRECT INDIRECT SET UP FROM FE
DINGM6: BUG.(INF,DTEPNR,DTESRV,HARD,<DTESRV - Incorrect indirect setup>,<<A,DTENO>>,<
Cause: While trying to complete an indirect from an RSX20F FE the
TO -10 count provided by RSX did not match the count kept by
TOPS-20.
Data: DTENO - DTE number
>)
JRST DINGER
;ROUTINE TO PROCESS A TO 11 DONE INTERRUPT
TO11DN: MOVE B,CNDO(A) ;CONO WORD
IORI B,DTEEDN ;TO CLEAR 11 DONE
XCT B ;CLEAR THE BIT
CALL SETRGN
LOAD B,CMVRR,(C) ;GET PROTOCOL IN USE
MOVE B,DN11TR(B) ;GET ROUTINE TO PROCESS THIS
JRST 0(B) ;GO TO IT
;PROCESS RSX20F TO -11 DONE
DN11X: LOAD B,DTEST,(A) ;GET STATE OF DTE
TXZE B,DTE11 ;DOING TO 11?
JRST DN11 ;YES. GO HANDLE IT
TXZE B,DTE11I ;DOING INDIRECT?
JRST DN11I ;YES
RET ;ALL DONE
DN11I: TXO B,DTE11 ;DOING REGULAR 11
STOR B,DTEST,(A) ;NEW STATE
HRRZ B,DTEQS(A) ;GET QUEUE PACKET
LOAD D,QCNT,(B) ;GET BYTE SIZE
CAILE D,MAXINP ;TOO BIG FOR PROTOCOL?
MOVEI D,MAXINP ;YES. FRAGMENT IT THEN
STOR D,CMQCT,(C) ;TO MY REGION
LSH A,SDTE ;*4
JN QMODE,(B),[ ;FORCE BYTE MODE?
LOAD B,QPNTR,(B) ;YES. GET BYTE POINTER
JRST NOTWRD] ;AND GO DO IT
LOAD B,QPNTR,(B) ;GET BYTE POINTER
TLNN B,100000 ;EVEN # OF BYTES IN FIRST WORD?
TRNE D,1 ;YES. EVEN # OF BYTES IN MESSAGE?
JRST NOTWRD ;NO. SEND IN BYTE MODE THEN
LDB D,[POINT 6,B,11] ;GET BYTE SIZE
CAIN D,10 ;8 BITS?
JRST [ MOVEI D,^D16 ;YES. DO IT FULL WORD THEN
DPB D,[POINT 6,B,11]
SETONE CMFWD,(C) ;TELL -11 IT IS FULL WORD
JRST .+1]
NOTWRD: MOVEM B,DTEEBP(A) ;SET UP BYTE POINTER
LSH A,-SDTE ;RESTORE A
SETONE CMIP,(C) ;TELL -11 ALL IS OKAY
CALL DING11 ;GO DING -11
RET ;ALL DONE
DN11: STOR B,DTEST,(A) ;NEW STATE
SETZRO CMIP,(C) ;NOT DOING INDIRECT ANYMORE
HRRZ B,DTEQS(A) ;DEQUEUE THE PACKET
CALL TSTSGL ;IS THIS A SINGLE PACKET GROUP?
JRST DNSNGL ;YES. GO DO SPECIAL POSTING
LOAD D,QCNT,(B) ;SEE IF IT WAS INDIRECT
JUMPE D,DEQDTE ;NO. GO ON TO THE DEQUEUE LOGIC
CAIG D,MAXINP ;YES. DID WE SEND IT ALL?
JRST DEQDTE ;YES. GO ON
;INDIRECT REQUEST MUST BE PARTITIONED. DO NEXT PART
SUBI D,MAXINP ;SAY SENT ONE SECTION
STOR D,QCNT,(B) ;ABD STASH AWAY NEW COUNT
MOVEI D,MAXINP ;COUNT OF BYTES SENT
LOAD C,QPNTR,(B) ;GET BYTE POINTER
IBP D,C ;ADJUST IT
STOR D,QPNTR,(B) ;NEW BYTE POINTER
CALL DTESKD ;GO DO NEXT PART
RET ;AND DONE
;DEQUEUE COMPLETED REQUEST,POST IT, AND SCHEDULE NEXT REQUEST
DEQDTE: LOAD C,QLINK,(B) ;GET NEXT GUY
HRRM C,DTEQS(A) ;NEW HEAD
SKIPN C ;HAVE A HEAD?
SETZM DTEQS(A) ;NO. CLEAR THE WORD
LOAD C,QINT,(B) ;INTERRUPT GUY
PUSH P,C ;SAVE INTERRUPT
LOAD C,QDEV,(B) ;DEVICE CODE
PUSH P,C ;SAVE IT
LOAD C,QCOD,(B) ;UNIQUE CODE
PUSH P,C ;SAVE THIS AS WELL
LOAD C,QLIN,(B) ;UNIT
PUSH P,C ;SAVE IT
MOVE C,A
LSH C,SDTE ;FIND EPT OFFSET FOR THIS DTE
SETZM DTEEBP(C) ;CLEAR TO -11 POINTER
CALL RELNOD ;FREE THE NODE - RELNOD (A,B)
MSTSKD: OPSTR <SKIPE>,DTERL,(A) ;MAKE SURE DTE IS ACTIVE
CALL DTESKD ;START DTE AGAIN
POP P,B ;UNIT
POP P,A ;CODE
POP P,C ;DEVICE CODE
POP P,D ;ADDRESS
SKIPE D ;HAVE ONE?
CALL 0(D) ;YES. GO HANDLE IT
RET ;ALL DONE
;TRANSFER VECTOR FOR TO -11 DONE
DN11TR: DN11X ;RSX20F PROTOCOL
DN11MC ;MCB PROTOCOL
DN1160 ;DN60 protocol
;ROUTINE TO POST A SINGLE CHARACTER DONE
DNSNGL: LDB P1,[POINT 6,0(B),17] ;GET COUNT OF ENTRIES
LOAD C,QLINK,(B) ;GET Q LINK
HRRM C,DTEQS(A) ;NEW HEADER
SKIPN C ;Q NOW EMPTY?
SETZM DTEQS(A) ;YES
SETZM 0(B) ;CLEAR ALL FLAGS
MOVEI P2,SNGHDR(B) ;FIRST CHARACTER
CALL DTESKD ;REACTIVATE THE DTE
HRLI P2,(POINT ^D16,) ;MAKE A BYTE POINTER
SNGPST: ILDB B,P2 ;GET AN ENTRY
LSH B,-^D8 ;LINE NUMBER ONLY
SETZ A, ;NO CODE
MOVEI C,.FEDLS ;THE DSL
CALL TTYINT ;GO DO THE POST
SOJG P1,SNGPST ;DO ALL
RET ;AND DONE
;TEST IF PACKET POINTED TO BY B IS A SINGLE PACKET GROUP.
;INPUT B/ POINTER
;RETURNS: +1 IS A SINGLE GROUP
; +2 IS NOT
TSTSGL: MOVE D,0(B) ;GET FLAGS
TLNE D,(1B0) ;IS IT?
TLNN D,(1B1) ;MAYVE
RETSKP ;NO
RET ;YES
;ROUTINE TO PROCESS A TO -11 DONE FOR A FE RUNNING DN60 PROTOCOL
DN1160: EA.ENT
SAVEQ ;GET WORK REGS
HRRZ B,DTEQS(A) ;GET PACKET WE JUST COMPLETED
LOAD Q1,DTEST,(A) ;GET CURRENT STATE OF THE DTE
TXZN Q1,DTE11 ;DONE WITH DATA TRANSFER?
RET ;NO. IGNORE THE INTERRUPT THEN
STOR Q1,DTEST,(A) ;YES. SAVE NEW STATE
JRST DEQDTE ;AND GO FINISH UP THIS REQUEST
;ROUTINE TO PROCESS A TO -11 DONE FOR A FE RUNNING MCB PROTOCOL
DN11MC: EA.ENT
SAVEQ ;GET WORK REGS
HRRZ B,DTEQS(A) ;GET PACKET WE JUST COMPLETED
IFN FTPARANOID,<
LOAD D,QCOD,(B) ;Get address of message block
XMOVEI CX,. ;Touch
STOR CX,NMMAG,(D) ; it.
>;END IFN FTPARANOID
LOAD Q1,DTEST,(A) ;GET CURRENT STATE OF THE DTE
TXZN Q1,DTE11 ;DONE WITH DATA TRANSFER?
RET ;NO. IGNORE THE INTERRUPT THEN
IFN FTPARANOID,<
XMOVEI CX,. ;Touch
STOR CX,NMMAG,(D) ; message block
>;END IFN FTPARANOID
STOR Q1,DTEST,(A) ;YES. SAVE NEW STATE
JRST DEQDTE ;AND GO FINISH UP THIS REQUEST
;HERE TO POST OUTPUT COMPLETES BACK TO THE DRIVER (ROUTER, ETC.).
DNPOST: EA.ENT ;DECNET AND ALL OTHER USERS OF THE
;INTERFACE RUN IN SECTION MUMBLE
EXCH A,C ;EXCH QDEV AND QCOD (WHICH ARE DTE#
; AND MSG BLOCK POINTER RESPECTIVELY)
MOVX B,DI.ODN ;INTERRUPT TYPE WILL BE OUTPUT DONE
CALLRET CALDVR ;POST IT TO ROUTER
SUBTTL Start of to -10 transfer
;ROUTINE TO START A TO 10 TRANSFER. ACCEPTS:
; A/DTE NUMBER
; B/ BYTES LEFT IN QUEUE (FOR CONSOLE FRONT END ONLY)
;RETURNS +1 WITH
; A/DTE NUMBER
; B/CLOBBERED
; C/OLD COUNT FROM DTEB1
; D/BUFFER POINTER BIT FOR LAST OPERATION
DOFRGM: SAVEP ;PRESERVE THESE
PUSH P,B ;SAVE INPUT
CALL SETRGN ;GO FIND HIS REGION
POP P,B
LOAD P5,CMVRR,(C) ;GET PROTOCOL TYPE
JRST @DOFRTR(P5) ;GO HANDLE PROPER PROTOCOL
;CODE FOR RSX20F PROTOCOL
DOFRRS: LOAD P5,CMFWD,(D) ;GET WORD/BYTE INDICATOR
LOAD C,DTEBF,(A) ;GET CURRENT BUFFER BIT
MOVE D,C ;SAVE FOR CALLER
TRC C,1 ;NEXT BUFFER
STOR C,DTEBF,(A) ;STORE THIS AS CURRENT BUFFER
XCT [ HRRZ P4,DTBFWD(A)
HLRZ P4,DTBFWD(A)](C) ;PICK UP BUFFER BASE
HRLI P4,(<POINT ^D8,0>) ;MAKE IT A POINTER
SKIPE P5 ;DOING BYTE MODE?
HRLI P4,(<POINT ^D16,0>) ;NO. GET WORD POINTER THEN
LOAD C,DTEB1,(A) ;GET PREVIOUS COUNT
CAIG B,BYTBUF ;ROOM IN A BUFFER FOR THIS MESSAGE?
JRST [ SETZRO DTEBC,(A) ;YES. NO PENDING OPERATION THEN
STOR B,DTEB1,(A) ;NCURRENT COUNT
SKIPE P5 ;BYTE TRANSFER?
LSH B,-1 ;NO. CALCULATE 16 BIT COUNT
MOVNI B,0(B) ;GET NEG WORD COUNT
ANDI B,7777 ;ONLY 12 BITS FOR THE DTE
IORI B,1B23 ;SET I BIT TO INFORM 11
MOVEI P2,DTET10 ;DOING A TO 10 TRANSFER
JRST SET1] ;AND GO DO IT
MOVEI P2,DTET1F ;DOING A FRAGMENTED MESSAGE
SUBI B,BYTBUF ;FIND RESIDUE
STOR B,DTEBC,(A) ;SAVE IT FOR LATER
MOVNI B,BYTBUF ;NUMBER OF BYTES
SKIPE P5 ;BYTE MODE?
ASH B,-1 ;NO. GET WORD COUNT THEN
ANDI B,7777 ;ONLY WANT 12 BITS
MOVEI P1,BYTBUF
STOR P1,DTEB1,(A) ;REMEMBER THIS COUNT
; ..
; ..
;READY TO START THE TO -10 TRNASFER
SET1: LSH A,SDTE ;FIND DTE REGION
MOVEM P4,DTETBP(A) ;STORE APPROPRIATE BYTE POINTER
LSH A,-SDTE ;RESTORE DTE NUMBER
SET2: IORM P2,DTESTS(A) ;INSERT STATUS WORD
MOVE P1,DATO(A) ;DATAO WORD
IORI P1,B ;WHERE DATA LIVES
XCT P1 ;DO TRANSFER
MOVX B,DTIPU ;DO WE WANT TO INDICATE PROTOCOL UP?
TDNN B,DTESTS(A) ;???
RET ; NO, JUST RETURN
ANDCAM B,DTESTS(A) ;YES, CLEAR THE BIT
MOVX B,DI.LSC ;GET THE ROUTER FUNCTION
MOVX C,LS.ON ;The line went to the on state
CALLRET CALDVR ;AND TELL ROUTER ABOUT IT
;TRANSFER VECTOR FOR DOFRGM
DOFRTR: IFIW!DOFRRS ;FOR RSX20F
IFIW!DOFRMC ;FOR MC PROTOCOL
IFIW!D6DRBL ;for DN60 protocol
;CODE TO HANDLE TO -10 TRANSFER FOR MCB PROTOCOL
DOFRMC: EA.ENT ;RUN IN EXTENDED SECTION.
LOAD P5,DTEBC,(A) ;GET RESIDUAL COUNT
LOAD B,CMQCT,(D) ;GET PIECEMEAL COUNTER
JUMPLE B,DOFRMB ;IF COUNT IS NOT GOOD, BUGCHK AND RELOAD
JUMPE P5,DOFMCI ;NO RESIDUAL COUNT. GO GET A FREE BLOCK
LOAD P3,CMTMD,(D) ;GET MODE OF THIS TRANSFER
CAMG B,P5 ;REASONABLE TRANSFER?
IFSKP.
DOFRMB: BLOCK. ;no. complain.
SAVEAC <P4,P2>
MOVE P4,$CMTST(C) ;get flags from -10's region.
MOVE P2,$CMTST(D) ;get flags from -11's region.
BUG.(CHK,DTEMCC,DTESRV,SOFT,<DOFRGM - DN20 disagrees with count>,<<A,D>,<P5,REST>,<C,RGN10>,<P2,RGN11>>,<
Cause: Either the monitor has calculated a different value than it was
given by the front end, or an invalid count (.LE 0) has been found.
Action: Check for DTE hardware problems; if there is none, the code in the
DN20 should be investigated.
Data: D - Comm region address
REST - residual count of transfer
RGN10 - Flags from -10's region
RGN11 - Flags from -11's region
>)
ENDBK.
JRST DINGER ;AND RELOAD DN20
ENDIF.
SUB P5,B ;COMPUTE NEW RESIDUAL COUNT
STOR P5,DTEBC,(A) ;STASH IT
CAIE P3,.TMBYT ;BYTE MODE TRANSFER?
LSH B,-1 ;NO. HALVE NUMBER THEN
MOVNI B,0(B) ;GET NEG OF COUNT
ANDI B,7777 ;MAKE IT 12 BITS
IORI B,1B23 ;SET I BIT
MOVEI P2,DTET10 ;SAY DOING TO -10 TRANSFER
JRST SET2 ;AND GO DO THE TRANSFER
;HERE TO START A NEW TRANSFER
DOFMCI: LOAD CX,CMPCT,(D) ;GET COUNT OF ENTIRE MESSAGE
JUMPLE CX,DOFRMB ;IF BAD COUNT, BUGCHK AND RELOAD.
MOVE C,CX ;GET COUNT INTO C
STOR C,DTEBC,(A) ;SAVE STARTING COUNT
;********* Handle message too long *************
SKIPN DTEIND(A) ;Have a message block?
JRST [SETONE DTBLK,(A) ; SAY THIS DTE IS BLOCKED FOR FREE SPACE
SETZRO DTEBC,(A) ; INVALIDATE THE BYTE COUNT
RET] ; AND GIVE UP
LOAD P1,DTBIBL,(A) ;POINT TO THE SECTION ZERO INPUT BLOCK
CALL SETRGN ;FIND REGIONS AGAIN
LOAD B,CMTMD,(D) ;GET MODE OF THESE TRANSFERS
HRLI P1,(<POINT ^D8,>) ;ASSUME BYTE MODE
CAIE B,.TMBYT ;IS IT?
HRLI P1,(<POINT ^D16,>) ;NO. MAKE IT WORDS THEN
LSH A,SDTE ;FIND PROPER DTE GROUP
MOVEM P1,DTETBP(A) ;STORE INTO THE EPT
LSH A,-SDTE ;RESTORE DTE NUMBER
;NOW WE WILL SET UP SOME LOCATIONS IN THE MESSAGE BLOCK TO TELL
;ROUTER WHERE THE DATA IS LOCATED AND HOW MUCH THERE IS.
LOAD B,CMPCT,(D) ;GET THE COUNT OF THE TRANSFER
MOVE P1,DTEIND(A) ;GET THE MSG BLK POINTER BACK
XMOVEI C,UD.MSD(P1) ;CALCULATE THE "FIRST" MSD ADDRESS
STOR C,MBFMS,(P1) ;SET THAT UP FOR ROUTER
STOR B,MDBYT,(C) ; ALONG WITH THE COUNT
JRST DOFRMC ;AND GO DO INITIATE THE TRANSFER
;ROUTINE USED BY TTYSRV TO QUEUE UP A SINGLE CHARACTER OUTPUT
;REQUEST. THESE REQUESTS ARE HANDLED SPECIALLY IN THAT THEY ARE
;PACKED TOGETHER IN A SPECIAL PACKET.
;INPUT IS:
; B/ FUNCTION,,DEVICE
; C/ UNIT,,
; D/ BYTE
DTSNGL::CALL DTSNG0 ;DO WORK
JRST DTSNG3 ;COULDN'T DO IT
RETSKP ;SUCCESS
;WORKER ROUTINE
DTSNG0: SAVEP ;GET SOME WORK REGS
S0.ENT ;HAVE TO RUN IN SECTION 0
MOVE A,MSTRDT ;TO THE MASTER -11
JE DTERL,(A),R ;IF NOT RUNNING, GIVE UP FOR NOW
MOVEI P3,SNGPK1 ;ADDRESS
MOVE P4,SNGPK1 ;LOOK AT THIS ONE
TXNN P4,SNGACT ;INACTIVE?
TXNE P4,SNGAVL ;YES, THIS PACKET AHVE SPACE IN IT?
JRST DTSNG1 ;NO. TRY OTHERS
JRST DTSNG6 ;GO DO COMMON CODE
DTSNG1: MOVE P4,SNGPK2 ;GET FLAGS
MOVEI P3,SNGPK2
TXNN P4,SNGACT ;INACTIVE?
TXNE P4,SNGAVL ;THIS ONE HAVE ROOM?
RET
DTSNG6: CALL DTSNG2 ;GO ADD BYTE
RETSKP ;DONE
; ..
;DTSNGL...
;WORKER ROUTINE TO ADD BYTE TO SINGLE PACKET
DTSNG2: TXOE P4,SNGONQ ;ON THE QUEUE YET?
JRST DTSNG4 ;YES. GO ADD THE DATUM
TXO P4,3B1 ;SAY IS A SINGLE PACKET GROUP
HLRZ P1,DTEQS(A) ;NO. MUST ADD IT
HRLM P3,DTEQS(A) ;ADD IT TO THE TAIL
SKIPN P1 ;EMPTY QUEUE?
JRST [ HRRM P3,DTEQS(A) ;YES. MAKE IT THE HEAD ALSO
JRST DTSNG5]
STOR P3,QLINK,(P1) ;NO. LINK THIS ONE IN
DTSNG5: SETZRO QLINK,(P3) ;THIS ONE DOESN'T LINK
DMOVE P1,[BYTE (^D16) 10,.DFHLC
BYTE (^D16) .FEDLS,0]
DMOVEM P1,1(P3)
DTSNG4: MOVSI P1,(2B15) ;INCREASE Q COUNT
ADDM P1,1(P3) ;DO IT
LDB P1,[POINT 6,P4,17] ;GET COUNT OF ENTRIES IN QUEUE
IDIVI P1,2 ;ENTRIES PER -10 WORD
ADDI P3,SNGHDR(P1) ;WORD TO PUT IT IN
MOVEI B,0(B) ;DEVICE
CAIN B,.FECTY ;IS THIS THE CTY?
MOVS C,CTYUNT ;YES. GET REAL NAME
LSH C,-^D10 ;POSITION LINE NUMBER
IORI C,0(D) ;MERGE IN BYTE
XCT [ DPB C,[POINT ^D16,0(P3),15]
DPB C,[POINT ^D16,0(P3),31]](P2)
LDB P2,[POINT 6,P4,17] ;GET RESIDENT COUNT
AOS P2 ;INCREASE IT
CAIL P2,MAXSGL ;FULL?
TXO P4,SNGAVL ;YES. NO MORE THEN
DPB P2,[POINT 6,P4,17] ;PUT BACK THE COUNT
SUBI P3,SNGHDR(P1) ;BACK TO TOP OF PACKET
HLLM P4,0(P3) ;SET UP NEW FLAGS
MOVX B,DTE11!DTE11I ;ACTIVE STATUS
TDNN B,DTESTS(A) ;IS IT ACTIVE?
CALL DTESKD ;NO. GO START IT
RET ;AND DONE
;COULD NOT PUT ENTRY IN EITHER SINGLE PACKET. USE CONVENTIONAL
;MECAHNISM
DTSNG3: MOVSI A,TTYINT ;THE INTERRUPT LOCATION
CALLRET DTEQ ;DO IT
;REQUEST TIME AND DATE FROM 11
RQTAD1:: ;ALTERNATE ENTRY FOR REQUEST TIME AND DATE 11
MOVSI B,.DFRTD ;GET TIME/DATE FUNCTION
MOVE A,MSTRDT ;THE MASTER -11
SETZM C ;NO UNIT - SEND DIRECT
CALLRET DTEQ
;THIS IS ROUTER (AND POSSIBLY OTHER HIGHER LEVEL DRIVERS) ENTRY INTO
;DTESRV. DTESRV PERFORMS THREE FUNCTIONS FOR ROUTER; HALT A LINE,
;INITIALIZE A LINE AND QUEUE A MESSAGE ON A LINE.
;
;CALLED:
; A/ FUNCTION CODE (DD.OPN, DD.CLS, OR DD.XMT, DD.PRB)
; B/ LINE IDENTIFIER QUANTITY (DTE NUMBER IN OUR CASE)
; C/ MESSAGE BLOCK POINTER (FOR DD.XMT FUNCTION) or
; DNADLL callback ID for DD.OPN function or
; Message block address for DD.PRB function
;
;RETURNS:
; RET ;COULDN'T PERFORM FUNCTION
; ; * OR FUNCTION WAS DD.CLS OR DD.OPN *
; RETSKP ;ALL IS DONE
DTEDSP::EXCH A,C ;EXCHANGE FUNCTION AND MSG BLK POINTER
EXCH A,B ;EXCHANGE MSG BLK POINTER AND LINE BLOCK
; ADDRESS (DTE NUMBER)
SKIPL A ;[7226] RANGE CHECK
CAIL A,DTEN ;[7226] DTE NUMBER
RET ;[7226] NOT POSSIBLE FOR THIS CONFIGURATION
CAIL C,DD.OPN ;RANGE CHECK THE FUNCTION
CAILE C,DD.MAX ; TYPE
BUG.(CHK,INVDFN,DTESRV,SOFT,<DTEDSP - Bad function specified>,,<
Cause: The caller of DTEDSP supplied an illegal controller function.
>,RTN)
CALL @DTEDST(C) ;DISPATCH BY FUNCTION CODE
RET ;BAD RETURN * OR DD.CLS OR DD.OPN *
RETSKP ;GOOD RETURN
DTEDST: IFIW DTDINI ;0 = INITIALIZE PROTCOL
IFIW DTDHLT ;1 = HALT ALL PROTOCOL
IFIW DTDQUE ;2 = QUEUE OUTPUT BUFFER
IFIW DTDPRB ;3 = Post receive message block
IFIW DTREAL ;4 = Check existance of DTE
IFIW CPOPJ ;NTMAN - SET PARAMETER
IFIW CPOPJ ;NTMAN - CLEAR PARAMETER
IFIW CPOPJ ;NTMAN - READ PARAMETER
IFIW CPOPJ ;NTMAN - SHOW COUNTERS
IFIW CPOPJ ;NTMAN - SHOW and ZERO COUNTERS
;HERE TO HALT A LINE (A CONTAINS THE DTE NUMBER)
DTDHLT: CALL DTREST ;RESET THE DTE
SETZRO DTERL,(A) ;MAKE IT LOOK DEAD
CALL CLRDT0 ;CLEAR IT OUT AND POST ALL DEAD MESSAGES
SETZ B, ;Prepare to clear message block pointer
EXCH A,B ;Change AC with DTE number
EXCH A,DTEIND(B) ;Get message block if any
RETSKP ;Return with possible MB in T1(A)
;HERE TO INITIALIZE PROTOCOL ON A LINE (Turn the line on)
DTDINI: JN DTERL,(A),R ;If running a protocol already, then error
MOVEM B,DCNCID(A) ;Save DNADLL callback ID
MOVEI B,MCPRON ;Get protocol we will use
SKIPE T4 ;A buffer for us?
MOVEM T4,DTEIND(A) ;Yes, save it
RETSKP
;HERE TO QUEUE OUTPUT
DTDQUE: HRLI A,DNPOST ;CALLBACK ADDRESS FOR OUTPUT DONE
JRST DTEQ
;Here to post a receive buffer (message block)
DTDPRB: SKIPE DTEIND(A) ;Do we already have one?
RET ;Yes, we can only handle one now
MOVEM B,DTEIND(A) ;No, save address for next TO-10 transfer
RETSKP
SUBTTL ROUTER INTERFACE
;CALL CALDVR
;ALL CALLS TO ROUTER (OR ANOTHER HIGH LEVEL USER OF DTE) GO THROUGH
;THIS ROUTINE.
;
;CALL:
; A/ DTE#
; B/ FUNCTION CODE (DI.XXX; SEE D36PAR FOR DEFINTIONS)
; C/ FUNCTION SPECIFIC DATA
; D/ EVEN MORE FUNCTION SPECIFIC DATA
;
;RETURN:
; RET ;ALWAYS
CALDVR: EXCH A,B ;EXCHANGE DTE# AND FUNCTION CODE
LOAD B,DTBDID,(B) ;GET THE DRIVER'S (ROUTER'S) BLOCK ID
; (USUALLY THE ADDRESS OF HIS DATA BLOCK
; FOR HIS CIRCUIT)
JUMPE B,RTN ;Nobody cares...
CALLRET DTIPPI## ;CALL DNADLL (FOR NOW HE'S OUR ONLY USER)
SUBTTL DTEQ - Queue requests for the DTE
;THIS IS THE DTE REQUEST QUEUER. FOR RSX20F PROTOCOL ACCEPTS:
; F/DRIVER UNIQUE CODE
; A/DRIVER INT LOC,,DTE NUMBER
; B/DTE FUNCTION CODE,,FE DEVICE CODE
; C/UNIT NUMBER,,BYTE COUNT OR ZERO
; BIT 18 OF C IS A ONE IF INDIRECT DATA MUST BE SENT
; IN BYTE MODE. IF 0, THEN DTESRV DECIDES HOW TO PACKAGE
; AND SEND THE BYTES
; D/INDIRECT BYTE POINTER (IF RH OF C NE 0) OR LOCAL DATUM
; IF LOCAL DATUM SPECIFIED (I.E. RH OF C EQ 0) THEN
; IF LH OF C =0, DATUM IS 16 BITS. IF LINE NUMBER
; IS NON-ZERO, THEN DATUM IS 8 BITS.
;AND FOR MCB PROTOCOL ACCEPTS:
;
; A/ DRIVER INT LOC,,DTE NUMBER
; B/ POINTER TO MESSAGE BLOCK
;
; RETURNS:
; +1 IF NO PACKETS AND CALLED FROM SCHEDULER. REQUEST NOT
; QUEUED.
; +2 REQUEST QUEUED
;
;MAY BE CALLED FROM PI OR NON-PI LEVEL .
;DTEQI is alternate entry point. It returns +1 always. If called
;in scheduler or PI level, it will use the "reserve" of nodes to
;avoid failure.
;LOCAL FLAGS
NOFF==1B0 ;NO FAILURE POSSIBLE
DTEQI:: S0.ENT ;THIS RUNS IN SECTION 0
TRVAR <SAVF,SAVA,SAVB,SAVC,SAVD,PISTAT,PROVER,EFLAG> ;SAVE REGS HERE
MVI. NOFF,EFLAG ;INIT EFLAG
JRST DTEQ14
DCNMSO::
DTEQ:: S0.ENT ;THIS RUNS IN SECTION 0
TRVAR <SAVF,SAVA,SAVB,SAVC,SAVD,PISTAT,PROVER,EFLAG> ;SAVE REGS HERE
SETZM EFLAG ;INIT EFLAG
DTEQ14: JE DTERL,(A),DTEOFF ;DTE IS NOT RUNNING. CHECK OUT WHAT TO DO
MOVEM A,SAVA ;SAVE ALL ARGS
HRRZS A ;ISOLATE DTE NUMBER
CAIL A,DTEN ;A KNOWN DTE?
BUG.(HLT,INVDTE,DTESRV,SOFT,<DTEQ - Invalid DTE specified>,,<
Cause: The DTE request queuer for outgoing messages has been given
an invalid (greater than 3) DTE number.
Action: Look at the dump. The stack should indicate the calling
routine.
>)
CAMN A,MSTRDT ;IS THIS THE MASTER?
SKIPE FEFLG ;YES. PRIMARY PROTOCOL AVAILABLE?
SKIPA ;ALL SET
RETSKP ;NO PROTOCOL INIT. IGNORE REQUEST
MOVEM B,SAVB
MOVEM C,SAVC
MOVEM D,SAVD
MOVEM F,SAVF ;SAVE UNIQUE CODE AS WELL
CALL SETRGN ;GO GET COMM REGION POINTERS
LOAD C,CMVRR,(C) ;GET PROTOCOL VERSION
MOVEM C,PROVER ;SAVE IT FOR LATER
SETZM PISTAT ;ASSUME PI IS ON
CONSO PI,1B<DLSCHN+^D20> ;AT DTE PI LEVEL?
CONSO PI,1B<DLSCHN+^D28> ;IS PI OFF?
SETOM PISTAT ;YES, INTERLOCK ALREADY IF EFFECT
BLCAL. ASGNOD,<A,PISTAT,<NOFF,EFLAG>> ;GET BUFFER
RET ;COULDN'T AND CAN'T BLOCK - GIVE UP
MOVEI D,0(A) ;MOVE ADDRESS
HLRZ B,SAVA ;INT LOC
STOR B,QINT,(D) ;TO THE REQUEST
SETZRO QMODE,(D) ;ASSUME FREE CHOICE ON INDIRECT
HRRZ B,SAVC ;COUNT OR DATUM
STOR B,QCNT,(D) ;STORE COUNT
TXZE B,DTBYTM ;FORCE BYTE MODE?
JRST [ SETONE QMODE,(D) ;YES
JRST .+1] ;PROCEED
MOVE A,SAVF ;GET UNIQUE CODE
STOR A,QCOD,(D) ;PUT IN THE PACKET
MOVE C,PROVER ;GET PROTOCOL VERSION NUMBER
CAIN C,.VN20F ;IS THIS RSX20F PROTOCOL?
IFSKP. ;No, then must be DN60 or MCB
MOVE B,SAVB ;GET POINTER TO MESSAGE BLOCK
STOR B,QPNTR,(D) ;STORE IT
CAIE C,.VNMCB ;For the MCB?
IFSKP.
STOR B,QCOD,(D) ;STORE MESSAGE BLOCK HERE FOR TO -11 DONE CODE.
ENDIF.
HRRZ B,SAVA ;DTE NUMBER
STOR B,QDEV,(D) ; FOR TO -11 DONE CODE.
ELSE.
HLRZ C,SAVB ;THE FUNCTION CODE
SKIPE B ;AN INDIRECT INDICATOR?
TRO C,1B20 ;YES. MARK IT AS SUCH
STOR C,QFNC,(D) ;AND THE FUNCTION
HLRZ C,SAVC ;UNIT NUMBER
STOR C,QLIN,(D) ;TO THE PACKET
HRRZ B,SAVB ;DEVICE CODE
STOR B,QDEV,(D) ;TO REQUEST
MOVE B,SAVD ;BYTE POINTER OR DATUM
STOR B,QPNTR,(D) ;STORE POINTER OR DATUM
ENDIF.
HRRZ A,SAVA ;DTE NUMBER
SKIPE PISTAT ;PI OFF BY CALLER?
JRST DTEQ1 ;YES
NOSKD1 ;PROTECT THE DATA STRUCTURES
CHNOFF DLSCHN ;AND AGAIN
DTEQ1: HLRZ B,DTEQS(A) ;GET TAIL
HRLM D,DTEQS(A) ;MAKE THIS THE TAIL
SKIPN B ;WAS Q EMPTY?
JRST [ HRRM D,DTEQS(A) ;YES
JRST OCUPID] ;AND GO INLINE
STOR D,QLINK,(B) ;NO. ADD THIS ONE
OCUPID: SETZRO QLINK,(D) ;THIS ONE HAS NO LINK
LOAD B,DTEST,(A) ;GET STATUS OF THIS DTE
TXNN B,DTE11!DTE11I ;IS TO 11 IDLE?
CALL DTESKD ;GO START UP THE DTE
SKIPE PISTAT ;PI OFF BY CALLER?
IFSKP. < ;PI ON AND NOT IN PI
CHNON DLSCHN ;TURN ON THE DTE AGAIN
OKSKD1> ;AND THE SCHEDULER
TMNE NOFF,EFLAG ;TELL CALLER OF FAILURE?
RET ;NO
RETSKP ;AND RETURN
;DTEQ CONTINUED. DTE IS NOT RUNNING. SEE IF WE SHOULD BLOCK
DTEOFF: HRRZ CX,A ;GET DET #
CAME CX,MSTRDT ;IS THIS THE MASTER?
RET ;NO. GIVE UP NOW THEN
SKIPN INSKED ;IN THE SCHEDULER?
SKIPE NSKED ;OR NOSKED?
RET ;YES. GIVE UP THEN
MOVE CX,RLDFRK ;GET FORK ID OF RELOAD FORK
CAME CX,FORKX ;IS THIS IT?
CONSZ PI,1B<DLSCHN+^D20> ;AT DTE INTERRUPT LEVEL?
RET ;YES. GIVE UP
;CAN BLOCK THE PROCESS. DO IT
PUSH P,A ;SAVE ARG
MOVEI A,RLDTST ;WAIT FOR MASTER TO BE RELOADED
MDISMS ;DO IT
POP P,A ;GET BACK ARG
JRST DTEQ14 ;AND TRY AGAIN
;SCHEDULER TEST FOR ABOVE
RESCD
RLDTST: MOVE A,MSTRDT ;GET MASTER DTE NUMBER
OPSTR <SKIPE>,DTERL,(A) ;NOW RUNNING?
ADDI 4,1 ;YES.
JRST 0(4) ;AND DONE
ENDTV.
;ROUTINE TO START A TO 11 OPERATION FROM THE TOP OF THE DRIVER
;QUEUE
;ACCEPTS A/ DTE NUMBER
;TRANSFER VECTOR FOR PROTOCOL TYPES
SKDVEC: SKVER1 ;ROUTINE FOR RSX20F PROTOCOL
SKVER2 ;ROUTINE FOR MCB DECNET PROTOCOL
SKVER3 ;routine for DN60 protocol
DTESKD: SKIPN DTEQS(A) ;A REQUEST?
RET ;NO. ALL DONE THEN
JN DTRLD,(A),R ;IF RELOADING -11, DON'T DO ANYTHING
CALL SETRGN ;GO FIND MY COMM REGION TO THIS -11
LOAD D,CMVRR,(C) ;GET PROTOCOL VERSION NUMBER
MOVE D,SKDVEC(D) ;GET ROUTINE TO DO THIS PROCESSING
HRRZ B,DTEQS(A) ;MAKE SURE STILL A REQUEST THERE
JUMPN B,0(D) ;IF STILL HERE, DO IT
RET ;IF GONE, JUST RETURN
;CODE TO PROCESS PROTOCOL VERSION 1 PACKETS (RSX20F)
; A/ DTE NUMBER
; B/ PACKET
SKVER1: STKVAR <PCCNT> ;RESERVES SOME SPACE
SETZM PCCNT ;INIT EXTRA COUNT TO ZERO
CALL TSTSGL ;IS IT A SINGLE CHARACTER GROUP?
JRST [ MOVX C,DTE11 ;TO -11 STATUS
IORM C,DTESTS(A) ;SET IT
MOVX C,SNGACT ;GET ACTIVE BIT
IORM C,0(B) ;SAY SO
CALL SETRGN
MOVEI B,1(B) ;THE DATA
EXCH B,C
LDB D,[POINT ^D16,0(C),15] ;BYTES
JRST DTSKDM] ;GO DO IT
JE QFNC,(B),DEQDTE ;IF FLUSHED, POST ONLY
MOVEI C,0(A) ;DTE NUMBER
IMULI C,PKTSIZ ;SIZE OF QUEUE PACKET
ADDI C,PKTADR ;GET BASE ADDRESS OF THIS PACKET
LOAD D,QDEV,(B) ;DEVICE CODE
STOR D,HDDEV,(C) ;TO THE QUEUE
LOAD D,QFNC,(B) ;THE FUNCTION
STOR D,HDFNC,(C) ;TO THE QUEUE
SETZRO HDSPR,(C) ;ZERO THE SPARE
LOAD D,QCNT,(B) ;GET THE COUNT
JUMPN D,[CAILE D,MAXINP ;CAN WE SEND IT ALL?
MOVEI D,MAXINP ;NO. SEND MAX NUMBER
STOR D,HDDAT,(C) ;PUT SIZE IN PACKET
MOVEM D,PCCNT ;REMEMBER THIS AS SIZE OF EXTRA STUFF
LOAD D,DTEST,(A) ;DTE STATE
TXO D,DTE11I ;DOING INDIRECT
STOR D,DTEST,(A);NEW STATE
SETZRO HDLIN,(C) ;CLEAR OUT LINE NUMBER FIELD
JRST STOREG] ;GO STORE IN MY REGION
LOAD D,QPNTR,(B) ;GET DATUM
STOR D,HDDT1,(C) ;STORE IN PACKET
LOAD D,DTEST,(A) ;DTE STATE
TXO D,DTE11 ;REGULAR 11
STOR D,DTEST,(A) ;NEW STATE
; ..
; ..
STOREG: MOVEI D,12 ;INCLUDE DATUM
STOR D,HDCNT,(C) ;TO THE PACKET
LOAD D,QLIN,(B) ;UNIT
JUMPE D,STORG1 ;IF NO LINE GIVEN,ALLOW FOR 16 BIT DATUM
STOR D,HDLIN,(C) ;TO THE QUEUE
STORG1: PUSH P,C ;SAVE QUEUE POINTER
CALL SETRGN ;GET MY COMM REGION
MOVE B,C ;MOVE MY COMM REGION POINTER
POP P,C ;RESTORE Q POINTER
MOVEI D,12 ;THE COUNT OF THIS ONE
DTSKDM: HRLI C,(<POINT ^D8,0>) ;POINTER
SETZRO CMFWD,(B) ;DOING BYTE MODE
STOR D,CMQCT,(B) ;RECORD SIZE OF THIS PIECE
ADD D,PCCNT ;COMPUTE TOTAL MESSAGE SIZ
STOR D,CMPCT,(B) ;STORE FOR FE
;COMMON POINT FOR SKVER1 AND SKVER3
DTSTRT: LOAD D,CM1IC,(B) ;TO -11 COUNT
AOS D
STOR D,CM1IC,(B) ;UP IT
LSH A,SDTE ;*4
MOVEM C,DTEEBP(A) ;STORE POINTER
LSH A,-SDTE ;/4
IFN DTESW,<
HRRZ T2,DTEQS(T1) ;GET HEAD PACKET
CAIE T2,SNGPK1 ;IS THIS A
CAIN T2,SNGPK2 ; SINGLE PACKET SPECIAL?
JRST DTSTR1 ;YES, MOVE ON
CAIL T2,COMQ ;NO, REGULAR. IS IT
CAILE T2,COMQ+<NQPKT*QPKT>-1 ; WITHIN RANGE?
JSR BUGHLT ;NO
TMNN QINU,(T2) ;YES, PACKET IN USE?
JSR BUGHLT ;NO, THAT'S BAD
DTSTR1:
>
CALL DING11 ;GO START THE -11
RET ;AND DONE
;ROUTINE TO HANDLE PROTOCOL VERSION 2 PACKETS FOR MCB
; A/ DTE NUMBER
; B/ PACKET
; C/ COMM REGION POINTER
SKVER2: SAVEAC <Q1,Q2,Q3,P1,P2> ;SAVE REGS
STKVAR <DTENUM,QNOD,COMREG>
EA.ENT ;DECNET-36 RUNS IN EXTENDED SECTIONS
MOVEM A,DTENUM ;SAVE DTE NUMBER
MOVEM B,QNOD ; Q-PACKET
MOVEM C,COMREG ; COMM REGION POINTER
MOVX Q1,.TMBYT ;THIS WILL BE AN
STOR Q1,CMTMD,(C) ; 8-BIT XFER
MOVX D,DTE11 ;MAKE THE NEW STATE
IORM D,DTESTS(A) ; REG XFER IN PROGRESS
LOAD A,QPNTR,(B) ;GET MESSAGE BLOCK POINTER
XCALL (XCDSEC,DNLENG) ;GET THE LENGTH
MOVE C,COMREG ;GET BACK THE COMM REGION POINTER
STOR A,CMPCT,(C) ;STORE IN "PACKET COUNT" OF COMM REGION
STOR A,CMQCT,(C) ;ALONG WITH Q COUNT (WE WON'T DO SCATTER
;GATHER FOR NOW)
MOVE A,DTENUM ;GET DTE NUMBER BACK
MOVE B,QNOD ; AND POINTER TO Q-BLOCK
LOAD Q1,DTBOBL,(A) ;SET UP POINTER TO "OUTPUT" BLOCK
LOAD Q2,QPNTR,(B) ;LOAD UP POINTER TO THE MESSAGE BLOCK
IFN FTPARANOID,<
XMOVEI CX,. ;Touch
STOR CX,NMMAG,(Q2) ; message block.
>;END IFN FTPARANOID
CALL CPYMSG ;(Q1,Q2/A) COPY MESSAGE BLOCK TO SECTION ZERO
; BLOCK FOR DTE TRANSFER
MOVE C,COMREG ;SET UP COMM REGION POINTER
LOAD D,CM1IC,(C) ;GET TO-11 COUNT
AOS D ;INCREMENT IT TO INDICATE
STOR D,CM1IC,(C) ; NEW PACKET FOR 11
MOVE D,A ;GET BYTE POINTER FROM CPYMSG
MOVE A,DTENUM ;SET UP DTE NUMBER
LSH A,SDTE ;*4
MOVEM D,DTEEBP(A) ;STORE THE BYTE POINTER
MOVE A,DTENUM ;ONCE AGAIN GET THE DTE NUMBER
CALL DING11 ; AND RING THE DOOR-BELL TO WAKE UP 11
RET ;RETURN TO SENDER
;COPY MULTI-SEGMENT MESSAGE BLOCK TO SECTION ZERO CONTIGUOUS BLOCK
;USES SECTION 0 - SECTION 1 MAPPING.
;CALL CPYMSG
; Q1/ SECTION ZERO BLOCK POINTER
; Q2/ MESSAGE BLOCK POINTER
;RETURNS +1 ALWAYS WITH A/ BYTE POINTER TO START OF MESSAGE IN SECTION ZERO.
;USES Q1,Q2,Q3,P1,P2
;SOME OF THE AWKWARDNESS OF THE CODE IS CAUSED BY THIS FACT:
;IN AN EXTEND T1,[MOVSLJ], AC3 & AC6 MAY NOT BE USED AS INDEX REGISTERS
;FOR THE BYTE POINTERS IN AC2 & AC5
CPYMSG: SETZ D, ;COLLECT BYTE COUNT IN THIS REGISTER.
LOAD P1,MBFMS,(Q2) ;POINT TO FIRST MSD
;TALLY BYTE COUNT OF ALL BUT THE LAST MSD
CPYMS1: OPSTR <SKIPN B,>,MDNXT,(P1) ;IS THERE A NEXT ?
JRST CPYMS2 ;NO. THIS IS THE LAST. DON'T COUNT IT
OPSTR <ADD D,>,MDBYT,(P1) ;YES. COUNT THE BYTES
MOVE P1,B ;STEP TO
JRST CPYMS1 ; NEXT MSD
;IS THE LAST MSD BIG ?
CPYMS2: LOAD Q3,MDBYT,(P1) ;IS IT
CAIG Q3,20 ; WORTH OUR WHILE ?
JRST CPYMS6 ;NO. DO IT THE EASY WAY.
;AT THE LAST MSD, CONVERT BYTE POINTER, FIND ADDRESS OF IT, AND
;BLT TO DESTINATION
LOAD Q3,MDAUX,(P1) ;INDEXED B.P. TO START OF SOURCE
HRRZ B,Q3 ;ISOLATE OFFSET
TLNE Q3,700000 ;IS B.P. 041006,,nnn ?
JRST CPYMS3 ;NO. NO PROBLEM.
TLO Q3,400000 ;YES. MAKE IT
HRRI Q3,1(Q3) ; 441006,,nnn+1
ADDI B,1 ;Account for the nnn+1 we just did
CPYMS3: OPSTR <ADD B,>,MDALA,(P1) ;ADDRESS OF THE SOURCE DATA
MOVEI C,3(D) ;BYTES BEFORE THIS MSD, ROUNDED UP.
ASH C,-2 ;NUMBER OF WORDS "" ""
HRR Q3,C ;SAVE THIS FOR LATER CALC OF DEST B.P.
ADD C,Q1 ;DEST ADDR FOR THIS CHUNK
LOAD T1,MDBYT,(P1) ;# OF BYTES IN LAST MSD OF SOURCE
ADDI T1,3+3 ;SLOP FOR BLT - 3 BYTES BEFORE & 3 BYTES AFTER
ASH T1,-2 ;# OF WORDS TO BLT
CALL XBLTA ;(T1,T2,T3) MOVE IT.
;CALCULATE DESTINATION STARTING BYTE POINTER
IFE. D ;WERE THERE ANY BYTES BEFORE THE LAST MSD ?
HLL A,Q3 ;NO. MAKE BYTE POINTER
TLZ A,17 ; WITH NO INDEX
HRR A,Q1 ;ADDRESS OF DESTINATION BLOCK
RET ;ALL DONE.
ENDIF.
MOVN P1,D ;YES. NUMBER OF BYTES BEFORE LAST MSD
ADJBP P1,Q3 ;ADJUST
TLZ P1,17 ;GET RID OF INDEX
ADD P1,Q1 ;ADDRESS OF START OF BLOCK
TLZ P1,1 ;GET RID OF POSSIBLE CARRY.
;MAKE A BYTE POINTER FOR MOVSLJ IN Q1 -
HLLZ Q1,P1 ;P & S FIELDS
TLO Q1,Q3 ; INDEXED BY Q3
HRR Q3,P1 ;MAKE Q3 GLOBAL
HRLI Q3,MSEC1 ; SO MOVSLJ WILL WORK - NOTE SECTION NUMBER
; 1, EVEN THOUGH THE BUFFER IS IN SECTION
; ZERO. MOVSLJ REQUIRES THIS, SO IF THE
; SECTION 0-1 MAPPING GOES AWAY, THIS CODE
; WILL BE BROKEN.
;NOW MOVE BYTES FROM ALL MSDs EXCEPT THE LAST
OPSTR <SKIPE Q2,>,MBFMS,(Q2) ;POINT TO FIRST MSD, IF ANY.
CPYMS4: TMNN MDNXT,(Q2) ;IS THIS THE LAST MSD ?
JRST CPYMS5 ;YES. DONE
LOAD A,MDBYT,(Q2) ;BYTE COUNT.
LOAD B,MDAUX,(Q2) ;SOURCE BYTE POINTER
TLZ B,17 ;BUT MAKE
TLO B,P2 ; IT INDEXED BY P2
LOAD P2,MDALA,(Q2) ;LOAD UP THE INDEX
MOVE D,A ;THE DEST COUNT
EXTEND T1,[MOVSLJ] ;PREPEND HEADER TO USER DATA
BUG. (HLT,COMDTE,DTESRV,SOFT,<MOVSLJ failed>,,<
Cause: DTESRV attempted to execute a MOVSLJ instruction, but it failed.
Action: Look at the dump and try to determine why the instruction failed.
>)
LOAD Q2,MDNXT,(Q2) ;STEP TO NEXT
JRST CPYMS4 ;CONTINUE
CPYMS5: MOVE T1,P1 ;RETRIEVE B.P. TO START OF DEST
RET ;DONE.
;HERE WHEN LAST MSD IS SMALL. JUST MOVSLJ EVERYTHING
CPYMS6: XMOVEI Q3,(Q1) ;MAKE A FULL SECTION POINTER
LOAD P1,MBFMS,(Q2) ;POINT TO FIRST MSD
MOVE Q2,Q1 ;SAVE ADDRESS OF SECTION ZERO AREA
MOVE Q1,[POINT 8,(Q3)] ;MAKE BYTE POINTER TO MESSAGE DATA
CPYMS7: LOAD A,MDBYT,(P1) ;NOT DONE. GET BYTE COUNT.
LOAD B,MDAUX,(P1) ;SOURCE BYTE POINTER
TLZ B,17 ;BUT MAKE
TLO B,P2 ; IT INDEXED BY P2
LOAD P2,MDALA,(P1) ;LOAD UP THE INDEX
MOVE D,A ;THE DEST COUNT
EXTEND T1,[MOVSLJ] ;PREPEND HEADER TO USER DATA
BUG. (HLT,COMDT1,DTESRV,SOFT,<MOVSLJ failed>,,<
Cause: DTESRV attempted to execute a MOVSLJ instruction, but it failed.
Action: Look at the dump and try to determine why the instruction failed.
>)
LOAD P1,MDNXT,(P1) ;STEP TO NEXT
JUMPN P1,CPYMS7 ;CONTINUE
;Done
MOVE T1,Q2 ;MAKE BYTE POINTER
HRLI T1,(POINT ^D8) ; TO START OF BUFFER
RET
;ROUTINE TO HANDLE PROTOCOL VERSION 2 PACKETS FOR IBM COMM
; A/ DTE NUMBER
; B/ PACKET
; C/ COMM REGION POINTER
SKVER3: SAVEQ ;SAVE REGS
LOAD Q3,QPNTR,(B) ;GET POINTER
LDB Q1,[POINT 6,Q3,11] ;GET BYTE SIZE
MOVEI Q2,.TMBYT ;ASSUME BYTE
CAIN Q1,^D16 ;A WORD POINTER?
MOVEI Q2,.TMWRD ;YES. DO WORD MODE THEN
CAIE Q1,^D8 ;EIGHT BITS?
JRST SKVR22 ;NO. ALL SET THEN
SKVR22: STOR Q2,CMTMD,(C) ;PUT IN MODE OF THE TRANSFER
MOVX D,DTE11 ;SAY REGULAR TRANSFER IN PROGRESS
IORM D,DTESTS(A) ;""
LOAD D,QCNT,(B) ;GET Q COUNT
CAIN Q2,.TMWRD ;WORD MODE?
LSH D,1 ;YES. COMPUTE # OF 8 BIT BYTE THEN
STOR D,CMPCT,(C) ;STORE COUNT OF THIS TRANSFER
STOR D,CMQCT,(C) ;SIZE OF WHOLE TRANSFER IS THE SAME
MOVE B,Q3 ;BYTE POINTER TO B
EXCH B,C ;FIX UP REGS
JRST DTSTRT ;AND GO START THE DTE
;SPECIAL ROUTINES TO RING -11'S DOORBELL ,TO MANIPULATE THE
;PI CAPABILITY, TO RESET THE DTE, AND TO FINE COMM REGION POINTERS
;RING -11'S DOORBELL
; A/ DTE NUMBER
;CLOBBERS B
DING11: MOVE B,CNDO(A)
IORI B,DTEEDB ;THE -11'S BELL
XCT B
RET ;AND DONE
;CLEAR DOORBELL
CLRBEL: MOVE B,CNDO(A)
IORI B,DTETDB ;DOORBELL BIT
XCT B ;CLEAR IT
RET ;AND DONE
;ROUTINE TO RESET A DTE. TURNS OFF ITS INTS. ANY CONDITIONS
;ACCEPTS: A/ DTE #
DTREST: MOVE B,CNDO(A) ;GET PROTOTYE CONO
IORI B,DTEPIE!DTETDB!DTETDN!DTEEDN
XCT B ;CLEAR ALL CONDITIONS
PUSH P,A ;SAVE DTE ARG
HRRZS A ;ISOLATE DTE NUMBER
LSH A,SDTE ;FIND DTE EPT REGION
SETZM DTETBP(A) ;CLEAR LATENT POINTER
SETZM DTEEBP(A) ;AND THIS ONE ALSO
CALLRET PA1 ;AND DONE
;ROUTINE TO INIT INT STATE OF A DTE
;ACCEPTS: A/ DTE #
DTPII: CALL DTREST ;FIRST RESET IT
MOVE B,CNDO(A) ;GET PROTOTYPE CONO
IORI B,LDTEPI ;GET PI ASSIGNMENT
XCT B ;SET IT
RET ;AND DONE
;ROUTINE TO SET UP COMM REGION POINTERS. ACCEPTS:
; A/ DTE NUMBER
;RETURNS:
; C/ POINTER TO -10'S PER PROCESS REGION
; D/ POINTER TO -11'S PER PROCESS REGION
SETRGN: MOVEI C,0(A) ;THE DTE NUMBER
IMULI C,COMRGN ;SIZE OF A PER PROCESS REGION
ADDI C,COMBAS+COMDAT ;BASE OF -10'S REGION TO THE -11
MOVNI D,2(A) ;NOW FIND THE -11'S
HRRZ D,COMBUF+DTEN+1(D) ;GET VALUE FROM POINTER
ADDI D,COMBAS+COMDAT ;MAKE IT ABSOLUTE POINTER TO -11'S REGION
RET ;AND DONE
;ROUTINE TO FLUSH ALL OUTPUT REQUEUST FOR A GIVEN TTY UNIT.
;ACCEPTS: A/DTE #
; B/DEVICE
; C/UNIT,,0
;RETURNS: +1 WITH OUTPUT REQUESTS FLUSHED
;CLOBBERS ALL TEMP REGISTERS EXCEPT A,B,C
;MUST BE NOINT AND CHNOFF ON THE DTE CHANNEL
RESCD ;IS RESIDENT
DTEFLA::TDZA D,D ;ENTRY TO FLUSH ALL
DTEFLO::MOVEI D,1 ;ENTRY TO FLUSH ONLY DATA
S0.ENT ;MUST RUN IN SECTION 0
STKVAR <SVDTN,SVLIN,SVDEV,SVD>
MOVEM D,SVD ;SAVE ENTRY FLAG
MOVEM A,SVDTN ;SAVE DTE NUMBER
MOVEM B,SVDEV ;SAVE DEVICE CODE
MOVSM C,SVLIN ;SAVE LINE NUMBER (FROM LH)
HRLI A,DTEQS(A) ;INITIAL PREVIOUS
HRRZ C,DTEQS(A) ;TOP ITEM
JUMPE C,SKPPK1 ;IF EMPTY, JUST WRAP UP
CHKPKT: MOVE B,C ;MOVE POINTER
CALL TSTSGL ;IS THIS A SINGLE BYTE GROUP?
JRST SKPPKT ;YES. SKIP IT
LOAD B,QDEV,(C) ;DEVICE CODE
CAME B,SVDEV ;SAME DEVICE?
JRST SKPPKT ;NO. SKIP IT
LOAD B,QLIN,(C) ;LINE NUMBER
CAME B,SVLIN ;SAME LINE?
JRST SKPPKT ;NO. GO TO NEXT
LOAD B,QINT,(C) ;GET INTERRUPT ADDRESS
CAIE B,TTYINT ;IS IT TTYINT?
SKIPN SVD ;NO. FLUSH ALL?
SKIPA ;YES. FLUSH THIS PACKET
JRST SKPPKT ;NO. LEAVE IT
SETZRO QFNC,(C) ;YES. MARK IT AS FLUSHED
SETZRO QCOD,(C) ;AND PREVENT ACCOUTNING
SKPPKT: HRL A,C ;ESTABLISH NEW PREVIOUS
LOAD C,QLINK,(C) ;GET LINK
JUMPN C,CHKPKT ;GO LOOK AT IT
SKPPK1: MOVE A,SVDTN ;RESTORE DTE NUMBER
MOVE B,SVDEV ;RESTORE DEVICE
MOVS C,SVLIN ;RESTORE LINE (TO LH)
SE1CAL ;ENTER SEC1 FOR RETURN
RET ;AND DONE
;ROUTINE CALLED FROM APRSRV TO WAIT FOR ALL DTE'S
;TO COMPLETE TRANSFERS.MUST BE CALLED PIOFF AND NOT
;FROM INTERRUPT LEVEL
DTEINA::SAVEAC <Q1> ;GET A WORK REG
MOVSI Q1,-DTEN ;LOOK AT THEM ALL
DTENA0: JE DTERL,(Q1),DTENA1 ;IF NOT RUNNING, SKIP IT
MOVX A,DTET10!DTET1F ;SEE IF TO -10 IN PROGRESS
TDNN A,DTESTS(Q1) ;IS IT?
JRST DTENA2 ;NO. CHECK ON TO -11
MOVE B,CNDO(Q1) ;YES. GET A CONO WORD
TXO B,<<CONSO 0>-<CONO 0>+DTETDN+DTETER> ;GET CONSO WORD
XCT B ;DONE YET?
JRST .-1 ;NO. WAIT FOR IT THEN
DTENA2: MOVX A,DTE11!DTE11I ;SEE IF ANY TO -11 IN PROGRESS
TDNN A,DTESTS(Q1) ;IS IT?
JRST DTENA1 ;NO. GO TO NEXT DTE THEN
MOVE B,CNDO(Q1) ;YES. GET CONO WORD
TXO B,<<CONSO 0>-<CONO 0>+DTEEDN+DTEEER>
MOVX A,^D100000 ;# OF POLLS
XCT B ;WAIT FOR COMPLETTION
SOJGE A,.-1 ;WAIT, BUT NOT FOREVER
DTENA1: AOBJN Q1,DTENA0 ;DO ALL OF THEM
CALLRET DTPAUS ;PAUSE ALL DTE ACIVIITY
;ROUTINE TO REQUEST PAUSE OF ALL DTE ACTIVITY. MAY BE CALLED
;FROM ANY LEVEL
DTPAUS::MOVEI A,[SETZM DTEEPW(B)
RET] ;ROUTINE TO EXECUTE
JRST DTACT0 ;GO TO WORKER ROUTINE
;ROUTINE TO REACTIVATE FE'S. THIS CODE MERELY TURNS ON
;VALID EXAMINE FOR ALL ACTIVE DEVICES.
DTEACT::MOVEI A,[MOVEI C,IEXSIZ+2(A) ;GET EXAMINE SIZE
MOVEM C,DTEEPW(B) ;STORE CORRECT VALUE
RET]
DTACT0: SAVEAC <Q1,Q2> ;GET A WORK REG
SKIPN PROFLG ;DOING PRIMARY PROTOCOL?
RET ;NO. DON'T DO ANYTHING THEN
MOVE Q2,A ;SAVE SUBROUTINE ADDRESS
MOVSI Q1,-DTEN ;POLL ALL DEVICES
DTEAC0: HRRZ A,Q1 ;GET DTE NUMBER
JE DTERL,(A),DTEAC1 ;IF NOT ACTIVE, SKIP IT
SKIPE SVVEXM ;NOW IN FORCED SECONDARY PROTOCOL?
CAME A,MSTRDT ;YES. IS THIS THE MASTER -11?
SKIPA B,A ;NO. COPY DTE NUMBER AND PROCEED
JRST DTEAC1 ;YES. SKIP IT THEN
LSH B,SDTE ;GET EPT INDEX
CALL 0(Q2) ;DO ROUTINE
CALL DING11 ;MAKE FE SEE IT
DTEAC1: AOBJN Q1,DTEAC0 ;LOOK AT ALL FE
RET ;DONE
;SPECIAL ROUTINE TO INHIBIT "CONTINUED" MESSAGE
DTICON::MOVX A,1B0 ;GET "FIRST-TIME" BIT
ANDCAM A,UPFLAG ;NOT FIRST-TIME ANYMORE
RET ;DONE
;THESE ROUTINES ALLOCATE AND DEALLOCATE REQUEST NODES
;ASGNOD (DTENO,BLKFLG,FAILFLG)
; RETURNS:
; +1 failure, can't block
; +2 WITH A/ADDRESS OF NODE
;DTENO - number of DTE to which message being sent
;BLKFLG is non-0 if blocking is prohibited
;FAILFLG is non-0 if failure can't be handled. If failure can be
;handled, we will keep some buffers in reserve.
RESCD ;MUST BE RESIDENT
ASGNOD: BLSUB. <DTENO,BLKFLG,FAILFL>
SAVEAC <B>
SKIPN INSKED ;CHECK OBVIOUS BLOCK PREVENTION
SKIPE NSKED
SETOM BLKFLG ;CAN'T BLOCK
ASGND1: SKIPE FAILFL ;IS FAILURE OR BLOCK POSSIBLE?
SKIPN BLKFLG
IFSKP. <JRST ASGND2> ;NO, BYPASS ALL CHECKS
MOVE B,DTENO
MOVEI A,NQPKT/2
CAMG A,NDTEMQ(B) ;THIS DTE USING HALF OR MORE ALREADY?
JRST BLKNOD ;YES, DON'T DO IT
MOVEI A,NQPKT/3 ;USUAL THRESHOLD
SKIPN FORKX ;FORK 0?
MOVEI A,NQPKT/4 ;YES, LOWER THRESHOLD
CAMLE A,NCOMH ;ABOVE THRESHOLD?
JRST BLKNOD ;NO, BLOCK
ASGND2: PIOFF ;PREVENT ALL INTS
SKIPN A,COMH ;HAVE A NODE?
IFNSK. <PION
BUG.(CHK,NODTEN,DTESRV,SOFT,<DTESRV - NO DTE buffers available in critical case>,,<
Cause: A buffer is needed for a queued protocol message to a front-end
-11 via a DTE. There are no buffers available, and the
caller is not prepared to handle failure.
Action: Assume the message was sent.
>)
RET>
HRRZ B,0(A) ;GET LINK TO NEXT
IFN DTESW,<
CAIL A,COMQ ;IS HEAD
CAILE A,COMQ+<NQPKT*QPKT>-1 ; WITHIN RANGE?
JSR BUGHLT ;NO
TMNE QINU,(A) ;PACKET IN USE?
JSR BUGHLT ;YES, THAT'S BAD
SETZM (A) ;ZERO
HRLI C,(A) ; THE
HRRI C,1(A) ; PACKET
BLT C,QPKT-1(A) ; HEADER
SETONE QINU,(A) ;SAY IT'S NOW IN USE
JUMPE B,ASGND3 ;IF NEXT IS 0, O.K.
CAIL B,COMQ ;IS NEXT
CAILE B,COMQ+<NQPKT*QPKT>-1 ; WITHIN RANGE?
JSR BUGHLT ;NO
ASGND3: SKIPG NCOMH ;COUNT MUST BE POSITIVE
JSR BUGHLT ;TOO BAD
>
HRRZM B,COMH ;MAKE NEW LINK
SETZM 0(A) ;CLEAR HEADER
PION ;ALLOW INTS AGAIN
SOS NCOMH ;KEEP COUNT
MOVE B,DTENO
AOS NDTEMQ(B) ;COUNT USE BY EACH DTE
RETSKP ;GOOD RETURN
BLKNOD: SKIPE BLKFLG ;BLOCK POSSIBLE?
RET ;NO, FAIL
HRL A,A ;INCLUDE THRESHOLD LEVEL IN TEST
HRRI A,SPCTST ;MAKE TEST WORD
MDISMS ;WAIT HERE FOR A NODE
JRST ASGND1 ;GO TRY IT AGAIN
ENDBS.
SPCTST::CAML T1,NCOMH ;NOW ABOVE THRESHOLD?
JRST 0(4) ;NOT YET
JRST 1(4) ;YES
;RELNOD RELEASES A NODE
;ACCEPTS: A/ DTE NUMBER
; B/THE NODE ADDRESS
;RETURNS +1 ALWAYS
RELNOD: SAVEAC <C>
HRRZ C,COMH ; TOP OF QUEUE
IFN DTESW,<
IFN. C ;Is queue nonempty ?
CAIL C,COMQ ;Yes. IS HEAD
CAILE C,COMQ+<NQPKT*QPKT>-1 ; WITHIN RANGE?
CALL DTEREL ;NO. Die.
ELSE.
SKIPE NCOMH ;No. Is count correct ?
CALL DTEREL ;NO. Die.
ENDIF.
CAIL B,COMQ ;IS NODE BEING RELEASED
CAILE B,COMQ+<NQPKT*QPKT>-1 ; WITHIN RANGE?
CALL DTEREL ;NO. Die.
TMNN QINU,(B) ;PACKET IN USE?
CALL DTEREL ;NO. Die.
SETZRO QINU,(B) ;YES, SAY IT'S NO LONGER IN USE
MOVE D,NCOMH ;GET COUNT
CAIL D,NQPKT ;LEGIT?
CALL DTEREL ;NO. Die.
>;END IFN DTESW
MOVEM C,0(B) ;MAKE LINK TO THIS NEW HEAD
HRRZM B,COMH ;NEW HEAD
AOS NCOMH ;KEEP COUNT
SOS NDTEMQ(A) ;COUNT PER DTE
RET ;AND DONE
IFN DTESW,<
;THIS ROUTINE IS CALLED TO REPORT AN INCONSISTENCY IN THE DTESRV NODE
;PACKET DATA BASE
;CALL DTEREL with no arguments
;Never returns.
DTEREL: BUG.(HLT,DTENOD,DTESRV,HARD,<DTE data base bad>,,<
Cause: An inconsistency has been deteced in the DTESRV node data base.
Action: Look on the stack to find the caller of this BUGHLT. Try to
determine why the node data base has been trashed,
>)
>;END IFN DTESW
;THIS ROUTINE IS CALLED TO DEQUEUE AND POST ALL REQUESTS FOR
;A GIVEN DTE
;ACCEPTS: A/ DTE #
;RETURNS:
; +1. A PRESERVED
CLRDTE: JN DTERL,(A),R ;IF NOW ACITVE, IGNORE REQUEST
SASUBR <DTENM> ;SAVE DTE NUMBER
CLRDT1: SKIPE B,DTEQS(A) ;HAVE ANY REQUESTS?
IFSKP. ;If all done
LOAD B,DTEST,(A) ;Get state
TXZN B,DTET10!DTET1F ;To-10 in progress?
RET ;No
STOR B,DTEST,(A) ;Update status, in case called again
CALL SETRGN ;Find regions
SETZRO CMTOT,(C) ;Clear transfer in progress
RET
ENDIF.
HRRZS B ;YES. GET THE REQUEST
HRRZS A ;GET DTE # ONLY
CAMN A,MSTRDT ;IS THIS THE MASTER?
JRST [ CALL TSTSGL ;SINGLE CHAR PACKET?
SKIPA ;IT IS
JRST .+1 ;NOT
CALL DNSNGL ;HANDLE IT
JRST CLRDT2] ;GO ON
CALL DEQDTE ;AND DEQUEUE THIS REQUEST
CLRDT2: MOVE A,DTENM ;GET BACK DTE NUMBER
JRST CLRDT1 ;AND GO GET NEXT ONE
;CLRDT1: SKIPN B,DTEQS(A) ;HAVE ANY REQUESTS?
; JRST CLRDT3 ;No
; HRRZS B ;YES. GET THE REQUEST
; HRRZS A ;GET DTE # ONLY
; CAMN A,MSTRDT ;IS THIS THE MASTER?
; JRST [ CALL TSTSGL ;SINGLE CHAR PACKET?
; SKIPA ;IT IS
; JRST .+1 ;NOT
; CALL DNSNGL ;HANDLE IT
; JRST CLRDT2] ;GO ON
; CALL DEQDTE ;AND DEQUEUE THIS REQUEST
;CLRDT2: MOVE A,DTENM ;GET BACK DTE NUMBER
; JRST CLRDT1 ;AND GO GET NEXT ONE
;
;CLRDT3: CALL SETRGN ;Find regions (sets up C and D)
; LOAD B,DTEST,(A) ;Get state
; TXZN B,DTET10!DTET1F ;To-10 in progress?
; IFSKP.
; STOR B,DTEST,(A) ;Update status, in case called again
; SETZRO CMTOT,(C) ;Clear transfer in progress
; ENDIF.
; LOAD B,CMVRR,(C) ;Get version of protocol
; JRST @CLRVEC(B) ;Do any special stuff
;ENTRY TO ABOVE FOR NON-INTERRUPT CODE
CLRDT0: NOSKED
CHNOFF DLSCHN ;TURN OFF MACHINE
CALL CLRDTE ;PROCESS QUEUES
CHNON DLSCHN
OKSKED ;TURN ON MACHINE
RET ;AND DONE
;SPECIAL ENTRY FOR THE SCHEDULER
CLRDTF: CHNOFF DLSCHN ;TURN OFF CHANNEL
SETZRO DTERL,(A) ;MAKE IT DO IT
CALL CLRDTE ;CLEAR OUT THE ENTRIES
SETONE DTERL,(A) ;RESTORE BIT
CHNON DLSCHN ;RESTORE CHANNEL
RET ;AND DONE
;CLRDTE continued. Handle to -10 in progress here
;CLRVEC: IFIW!R ;20F
; IFIW!CLRMCB ;For MCB
; IFIW!R ;For DN60
;Here if a to -10 was inp progress when "clear" was requested for MCB
;CLRMCB: EA.ENT ;DECNET AND ALL OTHER USERS OF THE
; ;INTERFACE RUN IN SECTION MUMBLE
; SETZ B,
; EXCH B,DTEIND(A) ;GET BUFFER ADDRESS IF ANY
; RETSKP
SUBTTL I/O Page Fail
;ROUTINE CALLED FROM APRSRV WHEN A DTE CAUSES AN IO PAGE FAIL
;ACCEPTS: A/ DTE NUMBER
;RETURNS: +1 ALWAYS WITH DTE SHUT OFF
DTEIOP::CALL DTREST ;TURN OFF THE DTE
SETZRO DTERL,(A) ;Make sure it is dead
CALL CLRDTE ;GET RID OF ITS BLOCKS
SETONE DTRLD,(A) ;AND SAY IT NEEDS RELOADING
BUG.(CHK,DTEPGF,DTESRV,HARD,<DTE transfer page fail>,<<A,DTENO>>,<
Cause: A transfer from a DTE has generated a page fail. The FE is now
marked as dead.
Action: Check the DTE for hardware problems.
Data: DTENO - DTE number
>)
AOS LOAD11 ;SAY AN -11 DIED
AOS JB0FLG ;MAKE JOB 0 SEE IT ASAP
RET ;AND DONE
SUBTTL DTECHK - Periodic Check
;THIS ROUTINE PERFORMS LOST INTERRUPT POLLING FOR THE DTE20 DEVICES.
;IT IS STARTED PERIODICALLY TO LOOK FOR ANY ANAMOLOUS CONDITIONS
;ON THE DTE'S.
DTECHK::SKIPN FEFLG ;IN SECONDARY PROTOCOL?
JRST DTCHK2 ;NO, DON'T POLL THEN
SAVEQ ;SAVE PERMANENT REGS
STKVAR <PRCONI> ;PROTOTYPE CONI
MOVSI A,-DTEN ;NUMBER OF DTE'S IN CONFIGURATION
MOVE B,[CONI DTE0,D] ;THE CONI
MOVEM B,PRCONI ;SAVE IT
DTPOL1: CHNOFF DLSCHN ;prevent state changes.
JE DTERL,(A),DTPOL2 ;DONT POLL NON-EX DEVICE
HRRZ B,A ;GET DTE NUMBER
IFQN. DTRLD,(A)
CAMN B,MSTRDT ;BEING RELOADED - IS THIS THE MASTER?
CALL CLRDTF ;YES. KEEP EVERYBODY MOVING
JRST DTPOL2 ;AND GO ON
ENDIF.
CAME B,MSTRDT ;IS THIS THE MASTER?
IFSKP.
XCT PRCONI ;YES. GET CONI BITS
TXNE D,DTEPF ;POWER FAILING?
JRST DTPOL2 ;YES. DON'T POLL IT NOW THEM
SKIPE FEDBSW ;NO. WANT RELOADS?
JRST DTPL10 ;NO. DON'T LOOK THEN
ENDIF.
CALL SETRGN ;GO FIND APPROPRIATE COMM REGIONS
SUBI D,COMDAT ;GET POINTER TO -11'S OWNED AREA
LOAD B,CMKAC,(D) ;GET HIS KEEP ALIVE COUNTER
LOAD D,CMKAK,(C) ;GET MY COPY OF LAST ONE
CAME B,D ;SAME?
JRST DTPOL9 ;NO. ALL IS OK
IFQE. DTKAC,(A) ;IF FIRST TIME,LET HIM GO
SETONE DTKAC,(A) ;BUT REMEMBER THIS TRANSGRESSION
JRST DTPL10 ;AND GO ON
ENDIF.
;...
;...
;HERE WHEN RELOADING A FRONT END
HRRZ B,A ;ISOLATE DTE NUMBER
BUG.(INF,DTEKPA,DTESRV,SOFT,<DTE keep alive fail>,<<B,DTENO>>,<
Cause: The DTE keep alive counter is not being updated by the 11.
Action: Check the 11 to see if it is running properly.
Data: DTENO - DTE number
>,,<DB%NND>) ;[7.1210]
CAMN B,MSTRDT ;IS THIS THE MASTER?
IFSKP.
CALL DTREST ;NO. RESET THE DTE
CALL CLRDTF ;CLEAR OUT THE QUEUE NOW
SETZRO DTERL,(A) ;AND TURN OFF PROTOCOL
ENDIF.
CALL LOADFE ;(A) INITIATE A RELOAD IN JOB 0
JRST DTPOL2 ;FORGET ABOUT IT FOR NOW
DTPOL9: STOR B,CMKAK,(C) ;KEEP THIS COPY FOR NEXT TIME
SETZRO DTKAC,(A) ;IT PASSED THE TEST
;..
;DTECHK...
;NOW LOOK AT ITS STATE
DTPL10: XCT PRCONI ;LOOK AT THE DTE STATE
TRNE D,DLSCHN ;CHANNEL ASSIGNED?
JRST DTCHK1 ;YES. GO ON
CALL DTPII ;GO SET UP PI STUFF
HRRZ B,A ;ISOLATE DTE NUMBER
BUG.(INF,DTELPI,DTESRV,HARD,<DTECHK - DTE lost PI assignment>,<<B,DTENO>>,<
Cause: A CONI of the DTE has indicated it has lost it's channel assignment.
Action: Have Field Service check the DTE.
Data: DTENO - DTE number
>,,<DB%NND>) ;[7.1210]
DTCHK1:
REPEAT 0,<LOAD B,DTEST,(A) ;GET DEVICE'S STATE
TXNN B,DTE11!DTE11I ;SENDING TO -11?
JRST DTPOL3 ;NO. GO ON
CALL SETRGN ;FIND THE COMM REGIONS
MOVE B,D ;MOVE HIS POINTER
XCT PRCONI ;GET STATE OF DTE NOW
LOAD Q1,CM1IC,(B) ;HIS TO 11 COUNT
LOAD C,CM1IC,(C) ;MY TO 11 COUNT
CAMN C,Q1 ;SAME?
JRST DTPOL4 ;YES. GO SEE IF TRANSFER IS OK
TXNE D,DTEEDB ;IS -11 DOORBELL UP?
JRST DTPOL3 ;YES. ASSUME IT WILL FIND IT
CALL DING11 ;RING IT AGAIN
BUG.(INF,DTELDB,DTESRV,HARD,<DTECHK - 11 lost doorbell>,,<
Cause: The DTE's TO -11 count disagrees with our TO -11 count. TOPS-20 is
ringing the 11's doorbell.
>,,<DB%NND>) ;[7.1210]
JRST DTPOL3 ;GO TO NEXT
DTPOL4: LOAD D,CMVRR,(B) ;GET PROTOCOL VERSION
CAIN D,.VN20F ;RSX20F?
JRST DTPOL3 ;YES. DONE WITH POLLING THEN
JN CMTOT,(B),DTPOL3 ;IF IN TRANSIT, OK.
XCT PRCONI ;GET DEVICE STATE AGAIN
TXNE D,DTEEDN ;NOT IN TRANSIT. IS FLAG UP?
JRST DTPOL3 ;YES. ASSUME WE WILL SEE THE INTERRUPT
BUG.(INF,DT11DN,DTESRV,HARD,<DTECHK - 10 lost TO11DN interrupt>,,<
Cause: TOPS-20 has some how lost the TO-11 done interrupt.
Action: Call field service and have them check out the DTE.
>)
PUSH P,A ;SAVE DTE POINTER
CALL TO11DN ;GO FAKE THE INTERRUPT
POP P,A ;RESTORE POINTER
> ;END OF REPEAT 0
DTPOL3: JN DTBLK,(A),[ SETZRO DTBLK,(A) ;CLEAR INDICATOR
PUSH P,A ;SAVE AOBJN WORD
MOVEI A,0(A) ;GET DTE NUMBER ONLY
CALL DOFRGM ;IF BLOCKED. TRY NOW
POP P,A ;RESTORE AOBJN POINTER
JRST .+1] ;AND GO ON
DTPOL2: CHNON DLSCHN ;REENABLE CHANNEL
MOVX B,4B11 ;NEXT DTE
ADDM B,PRCONI ;NEXT DTE FOR THE CONI
AOBJN A,DTPOL1 ;DO ALL DTE'S
DTCHK2: MOVEI A,^D5000 ;NEXT CHECK IN 5 SECS
MOVEM A,DTETIM ;TO THE TIME CELL
RET ;AND DONE
;REQUEST RELOAD OF A FRONT-END
; T1/ DTE NUMBER
; CALL LOADFE ;(T1)
;(T1) RETURNS +1: ALWAYS, REQUESTS RELOAD BY JOB 0
;Or, CALL LODCFE
; Returns +1: Always, requests reload of console FE.
LODCFE::MOVE T1,MSTRDT ;FOR THE MASTER DTE PLEASE...
LOADFE::SETONE DTRLD,(A) ;SET RELOAD FLAG
AOS LOAD11 ;TELL JOB 0 OF RELOAD
AOS JB0FLG ;SCHEDULE JOB 0
RET
SUBTTL
;ROUTINE CALLED FORM JOB 0 TO SEE IF ANY DTE'S NEED ATTENTION
SWAPCD ;PART OF JOB 0
DTEPOL::CALL DTJZC1 ;DO CHECKS 1-4
CALL DTJZC2
CALL DTJZC3
CALL DTJZC4
CALL DTJZCD ;CHECK STATE OF DBUGSW
RET
;SEE IF DBUGSW HAS CHANGED SUCH THAT WE NEED TO TELL FE
DTJZCD: SKIPE T1,DBUGSW ;MONITOR IN DEBUG MODE?
SETO T1, ;YES
XOR T1,FEDBST ;SAME AS FE NOW?
JUMPE T1,R ;RETURN IF YES
MOVSI T2,.DFDBN ;DEBUG ON FUNCTION
SKIPN DBUGSW ;NOW DEBUGGING?
MOVSI T2,.DFDBF ;NO, DEBUG MODE OFF
MOVE T1,MSTRDT ;SEND MESSAGE
SETZ T3, ;DIRECT
CALL DTEQ
RET ;COULDN'T SEND, TRY AGAIN LATER
SETCMM FEDBST ;REMEMBER FE STATE TOGGLED
RET
;CHECK STATUS OF LOAD FORK IF PRESENT
DTJZC1:SKIPN A,LODFRK ;HAVE A FORK NOW?
JRST DTPOL8 ;NO
RFSTS ;YES. GET ITS STATUS
HLRZS A ;ONLY LH PLEASE
CAIE A,2 ;HALTED?
CAIN A,3 ;OR AN ERROR?
SKIPA A,LODFRK ;YES
JRST DTPOL8 ;NO. GO ON
KFORK ;KILL IT
SETZM LODFRK ;AND THE HANDLE
SETOM RLDFRK ;NO RELOAD FORK NOW
DTPOL8: RET
;CREATE FORK TO LOAD FE IF NECESSARY
DTJZC2: SKIPE LOAD11 ;-11'S TO LOAD?
SKIPE LODFRK ;YES. A FORK TO DO IT?
JRST DTPOL7 ;DON'T CREATE ANOTHER
MOVX A,1B1 ;SET CAPABILITIES TO WHEEL
SETZ B, ;NO START ADDRESS
CFORK ;GET ONE
JRST DTPOL7 ;FAILED WAIT TILL NEXT TIME
MOVEM A,LODFRK ;THE ID
MOVE B,[MSEC1,,RELOAD] ;START ADDRESS
MSFRK ;START IT IN MONITOR MODE
DTPOL7: RET
;DO "CONTINUED" MESSAGE IF NECESSARY
DTJZC3: SKIPN LOAD11 ;ALL -11'S DONE RELOADING?
SKIPN A,UPFLAG ;DO WE NEED A CONTINUE MESSAGE?
JRST DTPL87 ;NO . GO ON THEN
TRZN A,1 ;WANT A MESSAGE?
JRST DTPL87 ;NO
JUMPGE A,[MOVSI A,(1B0) ;IS FIRST TIME
MOVEM A,UPFLAG ;NEXT TIME WILL DO IT
JRST DTPL87] ;AND DONE
MOVEM A,UPFLAG
SKIPE DBUGSW ;DEBUG MODE?
JRST DTPL87 ;YES, NO MESSAGE
MOVNI A,2 ;[7.1056] Send to all console front end lines
HRROI B,[ASCIZ /
[DECSYSTEM-20 continued]
/]
TTMSG ;TELL THE WORLD
ERJMP .+1 ;IN CASE OF REFUSAL
DTPL87: RET
;SEND TIME TO FE'S IF NECESSARY
DTJZC4: SKIPE B,TAD11 ;HAVE A TIME?
CAMN B,[-1] ;?
JRST DTPL88 ;NO . GO ON
DMOVE C,TAD11+1 ;YES. GET REST OF IT
IDCNV ;GET INTERNAL FORMAT
JRST DTPL89 ;TIME IS BAD. INFORM HIM
PUSH P,B ;SAVE THE TIME
CALL LGTAD ;GET SYSTEM'S TIME
POP P,B ;GET -11'S TIME
CAME A,[-1] ;HAVE A TIME YET?
SKIPN DBUGSW ;DEBUGGING?
SKIPA ;NO. MUST CHECK THE TIME THEN
JRST DTPL88 ;YES. SKIP SETTING IT
CAMLE A,B ;NO. NEED TO SET THE TIME?
JRST DTPL89 ;NO. SKIP SETTING IT
MOVE A,B ;GET THE TIME
STAD ;AND SET IT
JFCL
JRST DTPL88 ;GO DO REST
DTPL89: MOVE A,MSTRDT ;TELL MASTER HE IS WRONG
SETONE DT1TM,(A) ;TELL HIM NOW
DTPL88: SETOM TAD11 ;NO TIME
SKIPE TO11TM ;TIME PACKET AVAILABLE?
RET ;NO. NO SENSE LOOKING THEN
SAVEPQ ;YES. SAVE ALL REGS
DTPOL6: MOVE A,MSTRDT ;GET MASTER -11
JE DT1TM,(A),DTPOL5 ;-11 WANT TIME?
SETZRO DT1TM,(A) ;SAY HE GOT IT
;-11 WANTS TIME OF DAY AND PACKET IS FREE
SETOM TO11TM ;IN USE
SETO B, ;GET CURRENT LOCAL TIME
SETZ D, ;SAY TO USE LOCAL TIME ZONE
ODCNV ;""
HLRZ A,B ;GET YEAR
DPB A,[POINT ^D16,TO11TM,31] ;STORE YEAR
MOVE P1,[POINT ^D8,TO11TM+1] ;WHERE REST IS GOING
IDPB B,P1 ;STORE MONTH
HLRZ A,C ;GET DAY OF MONTH
IDPB A,P1 ;STORE IT
IDPB C,P1 ;DAY OF WEEK
LOAD C,IC%TMZ,D ;GET TIMEZONE
TXNE D,IC%ADS ;DST IN EFFECT?
TRO C,1B28 ;YES - SET FLAG
IDPB C,P1 ;STORE INDICATOR
LSH D,-1 ;DIVIDE SECONDS BY 2
DPB D,[POINT ^D16,TO11TM+2,15];SECONDS SINCE MIDNIGHT
MOVSI A,TM1DON ;POSTING ROUTINE
HRR A,MSTRDT ;DTE NUMBER
MOVSI B,.DFHTD ;HERE IS TIME FUNCTION
MOVEI C,^D10 ;NUMBER OF BYTES IN MESSAGE
MOVE D,[POINT ^D8,TO11TM] ;BYTE POINTER
CALL DTEQ ;Q THE REQUEST
JFCL ;WILL GO
DTPOL5: RET ;AND DONE
RESCD ;MUST BE RESIDENT
;ROUTINE TO POST TIME SENT TO -11
TM1DON: SETZM TO11TM ;SAY TIME PACKET IS FREE
RET ;AND DONE
;ROUTINE CALLED FROM STAD JSYS TO ARRANGE FOR TIME TO BE SENT TO
;ALL 11'S.
SWAPCD ;IS SWAPPABLE
DTTIME::MOVSI A,-DTEN ;FORM AOBJN WORD
DTTIM2: JE DTERL,(A),DTTIM1 ;IF NOT EXISTANT, DON'T DO IT
SETONE DT1TM,(A) ;SAY HE NEEDS THE TIME
DTTIM1: AOBJN A,DTTIM2 ;DO ALL DTE'S
RET ;AND DONE
;ROUTINE CALLED BY JOB 0 TO COMPLETE A SYSERR PACKET.
;ARGS ARE:
; 1/ POINTER TO PACKET
;RETURNS +1 ALWAYS WITH REMAINDER OF INFO FILLED IN
;CALLS DEVICE DEPENDENT ROUTINES TO GET THE OWNING FORK. CALL IS
; CALL DEVICE-DEPENDENT-ROUTINE
;WITH:
; B/ UNIT,,DEVICE
;RETURNS:
; +1/NO OWNING PROCESS (AT LEAST, NOT NOW)
; +2/SUCCESS WITH 1=OWNING PROCESS ID
SWAPCD ;IS SWAPPABLE
SEEER2: HRRZ B,FE%DEV+SEBDAT(A) ;GET DEVICE CODE
CAIL B,MINDEV ;A KNOWN DEVICE?
CAILE B,MAXDEV ;?
JRST SEEER6 ;UNKNOWN
SKIPE C,DTEDTV(B) ;HAVE A TRANSFER VECTOR?
SKIPN C,DTVSER(C) ;THIS DEVICE PREPARED?
SEEER6: JRST [ MOVSI C,(1B0) ;UNKNOWN BIT
IORM C,FE%DEV+SEBDAT(A) ;SET IT
JRST SEEER4] ;GO SAY NO FORK,,JOB
PUSH P,A ;SAVE BLOCK
CALL 0(C) ;GET INFORMATION
JRST [ POP P,A ;CLEAN UP THE STACK
JRST SEEER4] ;AND ASSUME UNKNOWN
MOVE B,A ;FORK #
POP P,A ;BLOCK
CAIN B,-1 ;UNASSIGNED?
JRST [ HRLS B ;YES. PROPOGATE THE -1
MOVEM B,FE%FJB+SEBDAT(A) ;SAY IS UNASSIGNED
JRST SEEER5] ;AND GO WRAP UP
LOAD C,FKJO%,(B) ;GET JOB #
HRLI C,0(B) ;FORK
MOVEM C,FE%FJB+SEBDAT(A);STORE IN BLOCK
HRRZS C ;MAKE INDEXED REF WORK IN SECTION 1
MOVE B,JOBDIR(C) ;GET DIRS
HRLI B,USRLH ;SET UP A USER NUMBER
MOVEM B,FE%DIR+SEBDAT(A);TO THE BLOCK
MOVE B,JOBPNM(C) ;GET NAME
MOVEM B,FE%NAM+SEBDAT(A);TO THE BLOCK
SEEER5: MOVEI B,FE%INF ;START OF ERROR WORDS
HRRM B,FE%PTR+SEBDAT(A);TO THE BLOCK
SETZM FE%ID+SEBDAT(A) ;NO VERSION NUMBER YET
RET ;AND DONE
SEEER4: MOVE C,[-2,,-2] ;UNASSIGNED
MOVEM C,FE%FJB+SEBDAT(A);SAY SO
JRST SEEER5 ;GO FINSISH THE SETUP
;THIS CODE IS A COLLECTION OF SUBROUTINES USED TO RELOAD AN -11.
;ROUTINE TO INITIATE ROM BOOT AND OPTIONALLY DUMP OR LOAD THE -11
;ACCEPTS: A/FLAGS,, DTE #
;FLAGS ARE: GRONK/DON'T GRONK ROM
; B/ COROUTINE ADDRESS FOR DUMPING
; IF B=0, NO DUMP
; C/ COROUTINE ADDRESS TO GET NEXT PAGE TO LOAD
; IF C=0 NO LOAD WILL BE DONE
; D/ ERROR ROUTINE IF LOAD OR DUMP FAILED (FOR UNLOCKING PAGES)
;RETURNS: +1 FAILED. A CONTAINS THE CODE FOR THE FAILURE
; -1 MEANS NO SUCH DTE
; +2 SUCCESS. DUMP IS TAKEN AND BOOT IS ACTIVATED
;NOTE: THIS ROUTINE MUST HAVE RESET THE DTE AND INTERLOCKED THE
;BOOT LOCK
;NOTE SOME MORE: THE COROUTINES ARE CALLED WITH THE Q REGISTERS
;INTACT. THAT IS, Q1,Q2, AND Q3 WILL HAVE WHAT THE CALLER OF
;RMGRNK PUT IN THEM. THIS IS USEFUL FOR PASSING ARGS TO THE COROUTINES
;COROUTINES WORK AS FOLLOWS:
;RETURNS +1 IF NO MORE TO DO. AC1=0 SAYS NO EXTRA DOORBELL
; +2 MORE TO DO. IF LOADING, AC1 CONTAINS BYTE POINTER
; TO NEXT CHUNK OF CORE TO LOAD
; AND AC2 CONTAINS A ZERO IF NO DOORBELL
; WANTED AFTER BYTE POINTER IS SET UP. IF DUMPING,
; AC1 CONTAINS COUNT OF BYTES TO DUMP, AND
; AC2 CONTAINS BYTE POINTER.
SWAPCD ;IS SWAPPABLE
RMGRNC: CALL RMGRNK ;DO ACTUAL WORK
SKIPA ;NON-SKIP RETURN
RETSKP ;SKIP RETURN SO PASS IT DOWN
CAMN 1,[-1] ;NO SUCH DTE20?
RET ;RIGHT
JFFO 1,RMGLIT ;WHICH ERROR BIT IS SET?
SKIPA ;NO ERROR BITS SET
RMGLIT: CAILE T2,NBOTER ;MORE ERROR TYPES THAN KNOWN?
MOVEI T2,NBOTER ;YES, SET ERROR TO BE MOST GENERAL
MOVE T1,BOTERR(T2) ;GET ERROR CODE
RET
BOTERR: BOTX06
BOTX07
BOTX20
BOTX09
BOTX10
BOTX11
BOTX12
BOTX13
BOTX14
BOTX15
BOTX19
BOTX17
BOTX08
BOTX18 ;GENERAL BOOT ERROR CODE
NBOTER==.-BOTERR-1
RMGRNK: SAVEP ;GET PERM REGISTERS
MOVEI P1,3 ;MAX TRIES
SETZ P2, ;NO ERRORS YET
ASUBR <RMDTE,RMJFN,RMCORT,RMERR>
TXNN A,RM%ROM ;WANT TO GRONK ROM?
JRST RMWAT1 ;NO. SEE ABOUT DUMPING THEN
RMGRN1: HRRZ A,RMDTE ;GET DTE NUMBER AGAIN
CALL DTREAL ;GO VERIFY DTE EXISTS
JRST [ SETOM T1 ;NO SUCH DTE
RET ] ;RETURN FAILURE
MOVE B,DATO(A) ;GET DATAO WORD
IORI B,C ;DATA IS IN C
SETZM C ;CLEAR BYTE COUNT REG
XCT B ;DO IT
MOVE B,CNDO(A) ;GET PROTOTYPE CONO
IORI B,DTEPIE ;FIRST, TURN OFF PI0 TO RESET THE DTE
XCT B ;""
IORI B,DTESER!DTEPIE!DTEPI0 ;THE RELOAD INDICATOR AND PI
XCT B ;SET THE RELOAD INDICATOR
MOVEI B,PWRDN1 ;TIME TO COMPLETE POWER-FAIL
ADD B,TODCLK ;ABSOLUTE TIME WHEN IT IS OVER
CAML B,TODCLK ;READY?
JRST .-1 ;NO. KEEP WAITING
;ROM SHOULD BE READY FOR US NOW
MOVE B,CNDO(A) ;GET A CONO WORD AGAIN
IORI B,DTECER ;CLEAR RELOAD BIT
XCT B ;TURN OFF RELOAD
;NOW PUT A MAGIC NUMBER IN BYTE COUNT REGISTER SO ROM CAN FIND US
MOVE B,A ;GET DTE NUMBER
LSH B,SDTE ;GET TO EPT OFFSET
SETZM DTETBP(B) ;CLEAR TO -10 BYTE POINTER WORD
MOVE B,DATO(A) ;GET A DATAO WORD
IORI B,C ;MAGIC NUMBER WILL BE IN C
MOVEI C,MAG11N ;THE MAGIC NUMBER
XCT B ;DO IT
CALL DING11 ;AND RING -11'S DOORBELL
MOVE P3,[CONSO DTE0,DTEEDB] ;TEST WORD
LSH A,^D26 ;POSITION DTE #
ADD P3,A ;GET PROPER I/O WORD
HRRZ A,RMDTE ;RESTORE A
MOVEI B,ROMTIM ;TIME FOR ROM TO MAKE IT
ADD B,TODCLK ;ABSOLUTE TIME
RMWAT0: XCT P3 ;IS DOORBELL STILL UP?
JRST RMWAT1 ;NO. ROM RESPONDED
CAML B,TODCLK ;IS TIME UP YET?
JRST RMWAT0 ;NO. TRY AGAIN
TXO P2,.R1RMF ;NO ROM RESPONSE
RMTRY: MOVX A,RM%ROM ;MAKE SURE WE CAN RETRY
TDNE A,RMDTE ;CAN WE REGRONK ROM?
SOJG P1,RMGRN1 ;YES, GO TRY AGAIN
RMTRY1: HRRZ A,RMDTE ;ERROR-- GET BACK DTE #
CALL DTREST ;RESET DTE PI0 ENABLE
MOVE A,P2 ;GET ERROR INIDCATION
RET ;AND RETURN FAILURE
;ROM IS PROPERLY INITIALIZED HERE. TRY DOING THE BOOT
RMWAT1: SETZ P4, ;INIT COROUTINE COUNTER
RMWAT2: SKIPN B,RMJFN ;A DUMP ROUTINE GIVEN?
JRST RMLOAD ;NO. DON'T DO THE DUMP THEN
MOVEI A,0(P4) ;ARG TO COROUTINE
CALL 0(B) ;CALL THE DUMP COROUTINE
JRST [ SETZM RMJFN ;DON'T DO DUMP ON RETRY
CALL CHKBEL ;SEE IF A BELL IS NEEDED
JRST RMLOAD] ;AND GO SEE ABOUT LOADING
;COROUTINE RETURNED WITH:
; A/ COUNT OF WORDS TO DUMP
; B/ BYTE POINTER TO USE
MOVE C,A ;PUT COUNT INTO C
HRRZ A,RMDTE ;GET DTE NUMBER
CALL DODUMP ;TRY DUMPING THIS BUNCH
JRST [ TXO P2,.R1DPF ;DUMP ABORTED
TDO P2,A ;ADD IN BITS FROM DODUMP
SETO A, ;SAY FAILURE IS FROM THE DUMP
SKIPE B,RMERR ;WANT ERROR POSTING?
CALL 0(B) ;YES. DO IT
SKIPN RMCORT ;WANT TO LOAD IT TOO?
JRST RMTRY1 ;NO. ERROR OUT NOW THEN
SETZM RMJFN ;DON'T TRY DUMP AGAIN
JRST RMTRY] ;AND TRY, TRY AGAIN
AOJA P4,RMWAT2 ;GO DO NEXT PIECE OF DUMP
;ROUTINE CALLED BY DUMP AND LOAD CODE TO SEE IF A BELL IS NEEDED
;AFTER COMPLETION.
;ACCEPTS: A/ 0 = NO BELL
; RMDTE CONTAINS DTE NUMBER
CHKBEL: JUMPE A,R ;IF NO BELL NEEDED, RETURN
HRRZ A,RMDTE ;GET DTE NUMBER
CALLRET DING11 ;AND GO RING THE BELL
;-11 IS NOW DUMPED. SEE IF A LOAD IMAGE IS NEEDED
RMLOAD: SETZ P4, ;ARG TO COROUTINE
RMLOD0: SKIPN B,RMCORT ;HAVE A ROUTINE TO DO?
RETSKP ;NO. RETURN
HRRZ A,RMDTE ;GET DTE NUMBER
MOVE C,CNDO(A) ;GET A CONO WORD
IORI C,DTEEDN ;GET TEST BITS
XCT C ;TURN OFF TEST BITS
MOVE A,P4 ;TELL COROUTINE WHICH CALL THIS IS
CALL 0(B) ;GO GET NEXT PAGE
;RETURNS A=EXEC VIRT ADDRESS
; B=0 IF NO DOORBELL AFTER SETUP
JRST [ CALL CHKBEL ;SEE IF BELL IS NEEDED
RETSKP] ;AND DONE
MOVE C,A ;SAVE POINTER
HRRZ A,RMDTE ;GET DTE NUMBER AGAIN
LSH A,SDTE ;FIND THE EPT
MOVEM C,DTEEBP(A) ;PUT CORRECT BYTE POINTER IN EPT
HRRZ A,RMDTE ;DTE AGAIN
SKIPE B ;WANT A DOORBELL AFTER SETUP
CALL DING11 ;GO START TRANSFER
MOVEI B,BUTTIM ;TIME FOR THE PAGE TO CLEAR
ADD B,TODCLK ;WHEN IT MUST BE DONE
MOVE P3,CNDO(A) ;GET A CONO WORD
TXO P3,<<CONSO 0>-<CONO 0>+DTEEDN+DTEEER> ;MAKE IT A CONSO WORD
RMDNL1: XCT P3 ;DONE YET?
JRST [ CAML B,TODCLK ;NO. TIME UP?
JRST RMDNL1 ;NO. KEEP WAITING
XCT P3 ;did function complete ?
SKIPA ;no report error
JRST .+1 ;yes it did finally finish after all !!
CALL CLR11B ;YES. CLEAR BYTE POINTER
TXO P2,.R1BSF ;ERROR CODE
JRST RMLERR] ;AND GIVE ERROR
TXZ P3,DTEEDN ;FINISHED. SEE IF SUCCESSFUL
CALL CLR11B ;CLEAR BYTE POINTER
XCT P3 ;WAS IT AN ERROR
AOJA P4,RMLOD0 ;NO, GO SEE IF MORE LOAD WANTED
TXO P2,.R111E ;SAY ERROR
RMLERR: SETZ A, ;SAY ERROR OCCURRED ON LOAD
SKIPE B,RMERR ;WANT ERROR NOTICE?
CALL 0(B) ;YES. DO IT
JRST RMTRY ;GO TRY WHOLE THING AGAIN
;LOCAL ROUTINE TO CLEAR TO -11 BYTE POINTER IN THE EPT.
CLR11B: SAVEAC <A> ;SAVE ALL REGS
HRRZ A,RMDTE ;GET DTE #
LSH A,SDTE ;COMPUTE EPT REGION FOR THIS DTE
SETZM DTEEBP(A) ;ZERO THE BYTE POINTER
RET ;AND DONE
;PROCESS RUN BY JOB 0 TO RELOAD THE MASTER -11.
SWAPCD ;IS SWAPPABLE
;TEMPORARY CODE TO FIGURE OUT WHY KILPAG IS GETTING CALLED FROM SECTION 0
IFN DTESW,<
JHTEST: PUSH P,CX
MOVX CX,VSECNO
TDNN CX,-1(P) ;DIE IF RUNNING IN SECTION 0
JSR BUGHLT
POP P,CX
RET
> ;END OF IFN DTESW
RELOAD: MOVX A,UMODF
MOVEM A,FFL ;SIMULATE CALL FROM USER MODE
MCENTR ;ENTER MONITOR CONTEXT
MOVE A,FORKX ;GET OUR FORK HANDLE
MOVEM A,RLDFRK ;AND REMEMBER IT FOR LATER
MOVX A,RLDPRI ;GET SPECIAL PRIORITY WORD FOR RELOAD
MOVEM A,JOBBIT ;FOR REMAINDER OF RELOAD
RELOD2: MOVE A,MSTRDT ;GET ID OF MASTER
JN DTRLD,(A),RELOD1 ;FOUND ONE
MOVSI A,-DTEN ;NOW CHECK ALL OF THE OTHERS AS WELL
RELOD3: JE DTRLD,(A),RELOD4 ;THIS ONE NEED ATTENTION?
HRRZ B,A ;YES, GET DTE # ONLY
CAMN B,MSTRDT ;DID THE MASTER DIE AGAIN?
JRST RELOD1 ;YES. GO DO IT NOW
PUSH P,A ;NO.
CALL SETRGN ;Set up regions so we can get protocol type
LOAD C,CMVRR,(C) ;Get protocol version
SKIPN DTBUGX ; Skip this if we aren't interested
CAIE C,MCPRON ;If DECnet, no buginf
BUG.(INF,DN20ST,DTESRV,HARD,<DTESRV - DN20 stopped>,<<B,DTENO>>,<
Cause: A DN20 has crashed.
Action: Reload the DN20.
Data: DTENO - DTE number
>,,<DB%NND>) ;[7.1210]
LSH B,SDTE ;GET EPT OFFSET
SETZM DTEEPW(B) ;CLEAR "VALID EXAMINE"
CALL CLRDT0 ;CLEAR OUT THE QUEUES
CALL RELODR ;INFORM APPROPRIATE MONITOR ROUTINES
POP P,A ;GET BACK REG
SETZRO <DTRLD,DTKAC>,(A) ;TURN OFF ATTENTION BITS
RELOD4: AOBJN A,RELOD3 ;SCAN THEM ALL
SETZM LOAD11 ;ALL DONE
AOS JB0FLG ;MAKE JOB 0 SEE HALTED STATE ASAP
HALTF ;NONE LEFT. ALL DONE
;RELOAD MASTER -11. REGISTER USAGE AS FOLLOWS:
; Q1/ OFN,,JFN OF DUMP FILE (PASSED TO RELODD BY RMGRNK)
; Q2/ -11 ERROR WORDS RETURNED BY RELODD IF DUMP SUCCEEDED
; Q3/ CUMULATIVE ERROR REGISTER
; P5/ RETRY COUNT
RELOD1:
IFN DTESW,<
CALL JHTEST
> ;END OF IFN DTESW
SETZRO DTERL,(A) ;BE SURE NOT RUNNING A PROTOCOL
CALL CLRDT0 ;FLUSH SCHEDULING QUEUE
SETZB Q3,Q2 ;CLEAR STATUS AND ERROR WORDS
MOVE A,MSTRDT ;GET BACK DTE #
MOVEI P5,3 ;MAX TRIES
CALL FNDFIL ;GO GET JFN AND OFN FOR THE DUMP FILE
JRST [ TXO Q3,.R1DPF ;THE DUMP WON'T BE DONE
SETZ P1, ;NO JFN
JRST .+1] ;GO INLINE
IFN DTESW,<
CALL JHTEST
> ;END OF IFN DTESW
HRR Q1,P1 ;Q1 NOW HAS OFN,,JFN
;READY TO GRONK THE ROM.
RELODA: MOVEI B,RELODD ;DUMP COROUTINE
CAIN P5,3 ;IS THIS THE FIRST TIME?
SKIPN P1 ;HAVE A JFN FOR DUMPING?
SETZ B, ;NO. DON'T DO THE DUMP THEN
MOVEI C,RELODL ;ADDRESS OF LOAD ROUTINE
MOVEI D,RELODE ;ERROR ADDRESS
TXO A,RM%ROM ;MUST DO ROM BOOT
SETZM DTECMD ;CLEAR SECONDARY PROTOCOL COMMAND WORD
IFN DTESW,<
CALL JHTEST
> ;END OF IFN DTESW
CALL RMGRNK ;GO GRONK THE ROM
RELODF: JRST [ MOVE Q3,A ;SAVE ERROR FLAGS
SOJG P5,RELODA ;TRY AGAIN, MAYBE
MOVE A,MSTRDT ;THE DTE NUMBER
CALL RELOD7 ;GO DO SYSERR
AOS JB0FLG ;MAKE JOB 0 RUN NOW
MOVEI A,^D1000
DISMS ;WAIT HERE FOR IT TO RUN AND DO SYSERR
AOS SHLTW ;AND STOP SYSTEM
HALTF] ;DONE
; ..
; ..
;RELOAD OF THE -11 IS NOW IN PROGRESS. DO PROTOCOL INIT
MOVE A,MSTRDT ;THE -11 NUMBER
IFN DTESW,<
CALL JHTEST
> ;END OF IFN DTESW
CALL KILPAG ;GO PURGE THE BUFFER PAGE
MOVSI D,(<CONSO DTE0,>) ;GET A CONSO WORD
MOVE A,MSTRDT ;THE -11 NUMBER
LSH A,^D26 ;PSOITION IT
ADD D,A ;THE WORD
MOVE A,MSTRDT ;DTE # AGAIN
IORI D,DTETDB ;SET UP TO WAIT FOR A DOORBELL
MOVEI B,DRBTIM ;TIME TO WAIT FOR RELOAD TO COMPLETE
ADD B,TODCLK ;WHEN WAIT IS UP
RELD11: XCT D ;WAIT
JRST [ CAML B,TODCLK ;WAIT SOME MORE?
JRST RELD11 ;YES
TXO Q3,.R1NRL ;NO RELOAD
SOJG P5,RELODA ;SEE IF WE SHOULD TRY AGAIN
MOVE A,Q3 ;FLAGS
JRST RELODF] ;NO. FAIL!!!!!!
CALL DTREST ;GO RESET THE DTE
MOVEI B,.VN20F ; FOR RSX20F PROTOCOL
CALL DTINIT ;GO INIT THE COMM REGIONS
CALL RELOD7 ;GO DO SYSERR
MOVE A,MSTRDT ;RECOVER DTE NUMBER
JN DTRLD,(A),RELOD2 ;IF WANTS RELOAD AGAIN, GO DO IT NOW
CALL RELODR ;INFORM REST OF MONITOR
MOVX A,GJ%OLD!GJ%SHT!GJ%PHY
HRROI B,SETSPD
MOVEI C,1 ;[7.1235] Offset 1 in entry vector
SETZM D ;DO NOT RECORD FORK NUMBER
CALL RUNDII ;GO SET DEFAULT SPEEDS AGAIN
IFN DTESW,<
BUG.(HLT,SETSPF,DTESRV,SOFT,<SETSPD failed to run correctly after FE reload>,,<
Cause: SETSPD failed to run correctly after a FE reload.
Action: It is possible that all of the job 0 forks are in use and the monitor
could not start another one to run SETSPD. If this is not the case,
the submit an SPR reporting this problem.
>)
> ;END OF DTESW
JFCL ;CAN'T HELP IT
SKIPN C,KLIDTA ;HAVE ANY KLINIK DATA?
JRST RELOD2 ;NO,GO WRAP UP
HRRZ A,MSTRDT ;YES. GET I.D. OF MASTER
MOVSI B,.DFKLS ;GET FUNCTION TO SEND KLINIK DATA
MOVE D,[POINT ^D8,KLIDTA+1] ;GET KLINIK DATA BASE POINTER
CALL DTEQ ;GO SEND THE KLINIK DATA
JFCL ;WILL GO
JRST RELOD2 ;AND GO WRAP UP
;ROUTINE OF RELOAD TO INFORM APPROPRIATE MONITOR DRIVERS OF THIS RELOAD.
; A/ DTE #
RELODR: HRRZS A ;GET DTE #
ASUBR <DTENBR> ;SAVE DTE NUMBER
CALL SETRGN ;FIND COMM REGIONS
LOAD B,CMVRR,(C) ;GET PROTOCOL VERSION #
JRST @.+1(B) ;DISPATCH TO DEAD FE HANDLER
IFIW ! RLODR1 ;RSX20F
IFIW ! RELMCB ;MCB
IFIW ! DEDD60 ;DN60 (IBM)
;HERE FOR RSX20F PROTOCOL
RLODR1: MOVSI P5,MINDEV-MAXDEV+.FECTY ;TO SEARCH DTEDTV
HRRI P5,.FECTY+1 ;START AFTER CTY
RLODR2: MOVE A,DTENBR ;GET DTE #
SKIPE B,DTEDTV(P5) ;THIS DEVICE EXIST?
SKIPN B,DTVRLD(B) ;YES. WANT TO KNOW ABOUT RELOADS?
SKIPA ;NO
CALL 0(B) ;YES. TELL HIM
AOBJN P5,RLODR2 ;DO ALL DEVICES
RET ;AND DONE
;HERE WHEN THE MCB FELL OVER
RELMCB: EA.ENT ;DECNET-36 RUNS IN SECTION ONE
MOVX B,DI.LSC ;SIGNAL LINE STATE CHANGE
MOVX C,LS.OFF ; TO OFF
CALLRET CALDVR ;GIVE ROUTER THE NEWS
;COROUTINES OF RMGRNK TO DO LOADING OF -11
;COROUTINE TO LOAD BOOTSTRAP
RELODL: JUMPG A,[CALL UNLPAG ;IF NOT FIRST TIME, UNLOCK PAGE
CALLRET RTRUE] ;AND GET A FINAL BELL
CALL LOKPAG ;GO LOCK DOWN BOOT PAGE
MOVE B,[DTERBT,,DTERBT+1]
SETZM DTERBT ;SET UP TO CLEAR REBOOT PAGE
BLT B,DTERBT+1_PGSFT-1 ;ZAP THE WHOLE PAGE
MOVE A,MSTRDT ;GET DTE NUMBER
CALL CLRBEL ;TURN OFF TO -10 DOORBELL
CALL SETRGN ;FIND COMM REGIONS
DMOVE A,[12700,,0 ; MOVE #0,R0
137,,173034] ; JMP 173034 (A MAGIC ADDRESS)
LOAD C,CMRLF,(C) ;GET RELOAD FLAGS
TXZ C,7 ;TURN OFF RELOAD -10 FLAGS
; AND SWITCH REGISTER REQUEST
HRRI A,4(C) ;TO THE BOOT PROGRAM
; AND TURN ON NO -10 REBOOT BIT
DMOVEM A,DTERBT ;TO THE PAGE
TXNE A,DSK11 ;IS THIS AN RP REBOOT?
JRST [ MOVE B,[DSKRBT,,DTERBT] ;YES. MOVE PORT CONTENTION
; CODE IN FIRST
BLT B,DTERBT+DSKPSZ-1 ;MOVE IT ALL
HRRM A,DTERBT ;STICK IN THE UNIT STUFF
JRST .+1] ;ALL READY TO GO
MOVE A,[POINT ^D18,DTERBT] ;GET POINTER TO BOOT CODE
SETO B, ;AND RING DOORBELL AFTER SETUP
RETSKP ;AND GO BOOT IT
;ROUTINE TO LOCK DOWN DTERBT
LOKPAG: NOINT ;NO INTERRUPTS WITH LOCK LOCKED
LOCK BTLOCK ;LOCK THE BOOT PAGE
MOVEI A,DTERBT ;THE PAGE
MOVES 0(A) ;CREATE IT
CALL FPTA
CALL MLKPG ;AND LOCK IT
RET ;DONE
;ROUTINE TO UNLOCK DTERBT
UNLPAG: MOVEI A,DTERBT ;ADDRESS OF THE PAGE
CALL FPTA ;GET ID
CALL MULKPG ;GO DO IT
;DN20'S WON'T LOAD WITH THE FOLLOWING LINE
; CALL KILPAG ;CLEAN UP ADDRESS SPACE
UNLOCK BTLOCK ;NO LONGER OWN PAGE
OKINT ;PERMIT INTERRUPTS AGAIN
RET ;RETURN
;ERROR ROUTINE
RELODE: CALL UNLPAG ;FREE THE PAGE
RET ;AND DONE
;COROUTINE TO PERFORM THE DUMP OF THE MASTER -11
;ARGS: Q1/ OFN,,JFN OF THE DUMP FILE
; A/PAGE NUMBER
RELODD: ASUBR <PAGENO> ;THE ARG TO THIS COROUTINE
JUMPE A,[CALL LOKPAG ;IF FIRST TIME, LOCK DOWN PAGE
JRST RELDD1] ;AND GO PROVIDE ARGS
;NOT THE FIRST TIME. DTERBT CONTAINS GOOD DATA, AND A CONTAINS PAGE NUMBER
CAIN A,1 ;IS THIS THE FIRST 1 K OF -11 MEMEORY?
MOVE Q2,DTERBT ;YES. GET CODE FOR SYSERR
NOINT
CALL ASGPAG ;GET A WORK PAGE FOR THIS
JRST [ OKINT ;FAILED. ALLOW INTS AGAIN
JRST RELODE] ;AND GIVE ERROR
PUSH P,A ;SAVE CORE ADDRESS
HLL A,Q1 ;OFN OF THE FILE
HRR A,PAGENO ;PAGE NUMBER OF THE FILE
SOS A ;PAGE NUMBER FOR THE DUMP FILE
MOVE B,0(P) ;THE TEMP PAGE WE JUST GOT
TXO B,PA%WT!PA%RD ;NEED ACCESS
CALL SETMPG ;MAP THE FILE TO THE PAGE
MOVSI B,DTERBT ;WHERE THE DATA IS
HRR B,0(P) ;THE DESTINATION
POP P,A ;AGAIN
BLT B,777(A) ;MOVE THE DATA
CALL RELPAG ;RELEASE AND UNMAP THE PAGE
OKINT ;ALLOW INTS AGAIN
MOVE A,PAGENO ;THE PAGE NUMBER
CAIL A,^D28 ;DONE ALL OF CORE?
JRST RELODC ;YES. GO CLOSE FILE
RELDD1: MOVEI A,2000 ;COUNT OF BYTES
MOVE B,[POINT ^D18,DTERBT] ;WHERE TO DO NEXT DUMP
RETSKP ;GO DO IT
;DUMP IS DONE. CLOSE FILE
RELODC: HRRZ A,Q1 ;THE JFN
TXO A,1B0 ;DON'T RELEASE THE JFN
CLOSF ;CLOSE IT
JFCL
CALL UNLPAG ;GO UNMAP THE PAGE
CALLRET RFALSE ;AND SAY NO BELL NEEDED
;ROUTINE TO GET JFN AND OFN FOR THE DUMP FILE
;INPUT: A/ DTE NUMBER
;RETURNS: +1 /FAILURE. CONDITION BIT ON IN Q3
; +2/ SUCCESS. P1/THE JFN Q1/ OFN,,
FNDFIL: SAVET ;SAVE TEMPS
HRROI B,DTERBT ;WHERE TO FORM THE NAME
MOVEI D,"0"(A) ;FIRST BYTE IS -11 NUMBER
SETZ C, ;TERMINATE ON NULL
HRROI A,[ASCIZ /BS:<SYSTEM>/] ;[7.1219] Put file in BS:<SYSTEM>
SIN ;COPY STIRNG
IDPB D,B ;PUT IN -11 NUMBER
HRROI A,[ASCIZ /DMP11.BIN;P770000/]
SIN ;COPY REST OF NAME
IDPB C,B ;TIE IT OFF
MOVX A,GJ%FOU!GJ%PHY!GJ%SHT ;GTJFN BITS
HRROI B,DTERBT ;THE ADDRESS OF THE FILE PAGE
GTJFN ;GET A JFN
JRST [ TXO Q3,.R1GTF ;GTJFN FAILED
RET] ;AND GIVE UP
MOVEI P1,0(A) ;SAVE JFN
HRLI A,.FBBYV ;SET UP TO CHANGE BYTE SIZE
MOVX B,7777B11 ;SET RETENTION AND BYTE SIZE
MOVX C,0044B11 ;SET RETENTION TO INFINITE
CHFDB ;CHANGE IT
ERJMP FNDFL1 ;FAILED. PUNT IT
HRLI A,.FBSIZ ;EOF POINTER
SETO B, ;CHANGE WHOLE WORD
MOVEI C,^D28*^D512 ;SET TO 28 PAGES
CHFDB ;DO IT
ERJMP FNDFL1 ;FAILED. PUNT IT
FNDFL1: MOVE B,[440000+OF%WR] ;OPEN CONDITIONS
MOVEI A,0(P1) ;GET JFN AGAIN
OPENF ;OPEN THE FILE
JRST [ TXO Q3,.R1OPF ;OPENF FAILED
RET] ;GIVE IT UP
HRLZS A ;JFN TO LH
CALL JFNOFN ;GET THE OFN
JRST [TXO Q3,.R1OPF ;OPENF FAILED
RET]
MOVE Q1,A ;SAVE THE OFN
RETSKP ;MADE IT
;THIS ROUTINE PERFORMS THE ACTUAL DUMP OF THE -11. INPUT IS:
; A/ DTE NUMBER
; B/ BYTE POINTER TO USE FOR THE DUMP
; C/ FLAGS AND COUNT OF WORDS TO DUMP
; COUNT IS RIGHTMOST 12 BITS (DTEBYC)
; FLAGS: DTETI (SET "I" BIT ON TRANSFER)
;RETURNS:
; +1/ FAILED. CONDITION SET IN A
; +2/ SUCCESS
DODUMP: SAVEPQ ;SAVE ALL REGS
MOVE D,[CONSO DTE0,DTETDN!DTETER] ;DTE CONDITIONS
MOVE P3,DATO(A) ;GET A DATAO FOR THIS DTE
MOVE Q3,CNDO(A) ;GET A CONO WORD
IORI Q3,DTETDN ;TO SET UP PROPER STATE
IORI P3,A ;ARG WILL GO IN A
LSH A,^D26 ;POSITION DTE NUMBER
ADD D,A ;FORM HARDWARE TEST WORD
LSH A,-^D26+SDTE ;FORM EPT INDEX
MOVEM B,DTETBP(A) ;PUT BYTE POINTER IN EPT
XCT Q3 ;TURN OFF ALL TO -10 INDICATORS
;GO GET THE CORE
MOVE B,C ;COPY BYTE COUNT AND "I" BIT
MOVN A,C ;GET NEG OF COUNT
ANDI A,DTEBYC ;ONLY 12 BITS
TXNE B,DTETI ;WANT "I" BIT SET ?
TXO A,DTETI ;YES, SET "I" BIT
XCT P3 ;DO THE DATAO
MOVEI B,T10TIM ;TIME FOR IT TO COMPLETE
ADD B,TODCLK ;WHEN WAIT IS UP
DOPAG1: XCT D ;WAIT FOR IT TO COMPLETE
JRST [ CAML B,TODCLK ;WAIT SOME MORE?
JRST DOPAG1 ;YES. GO DO IT
XCT D ;did function complete ?
SKIPA ;no report error
JRST .+1 ;yes, it finally finished
SETZ A, ;NO. ASSUMED IT WON'T FINISH
XCT P3 ;ABORT TRANSFER
MOVX A,.R1RTM ;set read timeout status
JRST DMPERR] ;AND GO MARK ERROR
TXZ D,DTETER ;SEE IF IT WAS ERROR OR NORMAL DONE
XCT D ;""
JRST [ MOVX A,.R110E ;WAS AN ERROR. BAD NEWS
JRST DMPERR]
TXO D,DTETER ;RESTORE THIS
XCT Q3 ;TURN OFF DONE FLAGS
RETSKP ;DUMP IS DONE
;ERROR DOING THE DUMP
DMPERR: XCT Q3 ;RESET THE DTE
RET ;DONE
;ROUTINE TO MAKE SYSERR ENTRY FOR -11 RELOAD. INPUT IS:
; A/ DTE NUMBER
; P1/ JFN
; P3/ RETRY COUNT
; Q2/ -11 ERROR WORDS
; Q3/ STATUS
RELOD7: TRVAR <DTNOM,SYBLK,ER11,<FILESP,^D20>> ;FOR SYSERR INFO
MOVEM Q2,ER11 ;SAVE -11 ERROR WORDS
MOVEM A,DTNOM ;SAVE DTE NUMBER
MOVEI A,R1%LEN ;SIZE OF PACKET
MOVEI B,R1%SIZ ;LENGHT (INCLUDING STIRNGS)
CALL ALCSEB ;ALLOCATE A BLOCK
JRST [ MOVE A,DTNOM
RET] ;DONE
MOVEM A,SYBLK ;SAVE BLOCK
MOVEI B,3 ;MAX TRIES
SUBM B,P5 ;NUMBER OF TRIES
IOR P5,Q3 ;FORM FINAL STATUS WORD
MOVE B,[-4,,[ ;TO DO THE COPIES
SEBPTR 0,SBTEVC,SEC%11 ;CODE
SEBPTR R1%NUM,SBTWD,DTNOM ;-11 NUMBER
SEBPTR R1%STS,SBTWD,P5 ;STATUS
SEBPTR R1%ERW,SBTWD,ER11]] ;-11 ERROR WORDS
MOVE A,SYBLK ;BLOCK ADDRESS
CALL SEBCPY ;COPY THE DATA
JFCL
TXNE Q3,.R1DPF ;DID THE DUMP SUCCEED?
JRST RELOD9 ;NO. GO ON
MOVEI B,0(P1) ;YES. GET JFN
HRROI A,FILESP ;A BUFFER FOR THE FILE NAME
MOVE C,[11110,,10011] ;JFNS BITS
JFNS ;GET THE NAME
MOVE A,SYBLK ;SYSERR BLOCK
MOVE B,[-1,,[
SEBPTR R1%FNM,SBTSTR,FILESP]] ;COPY STRING
CALL SEBCPY ;DO IT
JFCL
RELOD9: MOVE A,SYBLK ;GET SYSERR BLOCK
CALL QUESEB ;QUEUE IT UP
JFCL ;?
RET ;AND DONE
;CODE TO DO THE RP REBOOT OF THE -11. THIS INCLUDES THE PORT
;CONTENTION LOGIC AND THE BOOT CODE
DSKRBT: 12700,,0 ;MOV #0,R0
12704,,176700 ;MOV #RPEXP,R4
12703,,176710 ;MOV #RPEXP+10,R3
12713,,40 ;MOV #40,@R3
10005,,305 ;MOV R0,R5
; SWAB R5
42705,,177770 ;BIC #177770,R5
110513,,12701 ;MOVB R5,@R3
2,,12714 ;MOV#2,R1
23,,32714 ;MOV #23,@R4
4000,,1771 ;BIT #DVA,@R4
; BEQ 10$
5301,,1371 ;DEC R1
; BNE 20$
137,,173034 ;JUMP 173034
DSKPSZ==.-DSKRBT
;ROUTINE TO CHECK IF A DTE EXISTS
;ACCEPTS: A/ DTE NUMBER
;RETURNS: +1 DOESN'T EXIST
; +2 EXISTS
DTREAL: JN DTERL,(A),RSKP ;IF NOW ACTIVE, IT EXISTS
CALL DTREST ;PUT IT IN A KNOWN STATE
MOVE B,CNDO(A) ;GET A CONO WORD
IORI B,DTEPIE+DTEPI0 ;ENABLE PI 0 ONLY
XCT B ;GO SET THEM
TXC B,<<CONSO 0>-<CONO 0>> ;CHANGE CONO INTO A CONSO
XCT B ;SEE IF BITS ARE ON
RET ;NO. DEVICE DOESN'T EXIST
CALL DTREST ;YES. RESET DEVICE
RETSKP ;AND SAY IT EXISTS
; BOOT JSYS - PERFORMS BOOTSTRAP FUNCTIONS FOR ADJACENT COMPUTERS
; TABLE OF DISPATCH ADDRESSES
BOOTTB: BTROM ; 0 ACTIVATE ROM
BTLDS ; 1 LOAD SECONDARY BOOTSTRAP PROGRAM
BTLOD ; 2 LOAD MEMORY
BTDMP ; 3 DUMP MEMORY
BTIPR ; 4 INITIALIZE PROTOCOL
BTTPR ; 5 TERMINATE PROTOCOL
BTSTS ; 6 RETURN STATUS
BTBEL ; 7 WAIT FOR TO-10 DOORBELL
BTRMP ; 10 READ MOP MESSAGE
REPEAT 3,<
[RETBAD (ARGX02)]> ; 11-13 ARE ILLEGAL
BTCLI ; 14 (.BTCLI) CONVERT LINE ID TO PORT NUMBER
BTCPN ; 15 (.BTCPN) CONVERT PORT NUMBER TO LINE ID
BTD60 ; 16 (.BTD60) perform a DN60 operation
BOOTLN==.-BOOTTB
.BOOT:: MCENT ;MONITOR CONTEXT ENTRY
MOVE T1,CAPENB ;GET ENABLED CAPABILITIES
TXNN T1,SC%WHL!SC%OPR!SC%MNT ;WHEEL, OPERATOR, OR MAINTENANCE ?
ITERR (CAPX1) ;NO, GIVE ERROR
; VALIDATE DTE-20 NUMBER
UMOVE Q1,2 ;GET ADDRESS OF USER'S ARGUMENT BLOCK
UMOVE Q2,.BTDTE(Q1) ;GET DTE-20 NUMBER FROM USER
UMOVE T1,1 ;GET FUNCTION CODE FROM USER
CAIN T1,.BTCLI ;SPECIAL CASE - DON'T CHECK DTE NUMBER
JRST BOOT1 ;YES - SKIP VALIDATION
CAIL Q2,DTEN ;VALID DTE-20 SPECIFIED ?
ITERR (BOTX01) ;NO, GIVE ERROR
; DISPATCH TO PROCESSING ROUTINE BASED ON REQUESTED FUNCTION
BOOT1: CAIL T1,.BTROM ;CHECK RANGE OF GIVEN
CAIL T1,BOOTLN ; FUNCTION CODE
ITERR (ARGX02) ;INVALID FUNCTION CODE
MOVE T1,BOOTTB(T1) ;GET ADDRESS OF PROCESSING ROUTINE
CALL (T1) ;DISPATCH TO APPROPRIATE ROUTINE
ITERR() ;ERROR
MRETNG ;SUCCESS, RETURN TO USER
; COMMON ERROR ROUTINE TO STORE FAILURE STATUS IN ARG BLOCK AND RETURN
; ACCEPTS IN T1/ ERROR STATUS
BTERR: CAMN T1,[-1] ;NO SUCH DTE20 ?
JRST [ MOVX T1,BOTX01 ;YUP, GET CORRECT ERROR CODE
RET ] ;AND DONE
UMOVEM T1,.BTERR(Q1) ;SAVE ERROR STATUS
RET ;GIVE FAIL RETURN
; ROUTINE TO ACTIVATE (GRONK) THE ROM
BTROM: CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
MOVE T1,Q2 ;GET DTE-20 NUMBER
TXO T1,RM%ROM ;INDICATE THAT ROM SHOULD BE GRONKED
SETZB T2,T3 ;DON'T DUMP, DON'T LOAD
CALL RMGRNC ;GO GRONK THE ROM
JRST BTERR ;FAILED, RETURN ERROR STATUS
RETSKP ;SUCCESS, GIVE GOOD RETURN
; ROUTINE TO ACTIVATE (GRONK) THE ROM AND LOAD A SECONDARY BOOTSTRAP
BTLDS: CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
MOVE T1,Q2 ;GET NUMBER OF DTE-20
TXO T1,RM%ROM ;NOTE THAT ROM SHOULD BE ACTIVATED
SETZM T2 ;NO DUMP WANTED
MOVE T3,[LODSEC] ;ADR OF COROUTINE TO LOAD SECONDARY BOOT
MOVE T4,[RELODE] ;ADDRESS OF ERROR COROUTINE
CALL RMGRNC ;INITIATE LOAD OF SECONADRY BOOTSTRAP
JRST BTERR ;FAILED, RETURN ERROR STATUS
RETSKP ;SUCCESS, GIVE GOOD RETURN
; COROUTINE TO PERFORM LOADING OF SECONDARY BOOTSTRAP
LODSEC: JUMPG T1,LDSEC2 ;IF SECOND CALL, GO UNLOCK PAGE AND RETURN
CALL LOKPAG ;LOCK THE PAGE TO HOLD THE DATA TO TRANSFER
CALL CLRRBT ;ZERO THE BOOT PAGE
MOVEI T1,200 ;NUMBER OF WORDS TO TRANSFER IS MAXIMUM SIZE
; OF SECONDARY BOOTSTRAP
UMOVE T2,.BTSEC(Q1) ;GET SOURCE ADDRESS OF DATA IN USER SPACE
MOVE T3,[DTERBT] ;GET ADDRESS OF BOOT PAGE (DESTINATION)
CALL BLTUM1 ;COPY BOOTSTRAP INTO MONITOR SPACE
MOVE T1,Q2 ;GET DTE-20 NUMBER
CALL CLRBEL ;TURN OFF THE TO -10 DOORBELL
SETOM T2 ;NOTE THAT A DOORBELL IS REQUESTED
MOVE T1,[POINT ^D16,DTERBT] ;GET BYTE POINTER TO SECONDARY BOOT PGM
RETSKP ;RETURN TO CALLER
; HERE ON SECOND ENTRY AFTER DATA HAS BEEN TRANSFERRED
LDSEC2: CALL UNLPAG ;DONE WITH BOOT PAGE
CALLRET RTRUE ;RETURN AND REQUEST FINAL DOORBELL
; ROUTINE TO LOAD MEMORY OF AN ADJACENT COMPUTER HAVING LOADED A BOOTSTRAP
CNTBYT==2 ;NUMBER OF COUNT BYTES PRECEDING DATA BYTES
BTLOD: CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
UMOVE T2,.BTCNT(Q1) ;GET TOTAL NUMBER OF DATA BYTES TO TRANSFER
JUMPLE T2,[RETBAD (BOTX04)] ;COUNT MUST BE POSITIVE
HRLM T2,Q2 ;SAVE NUMBER OF BYTES REMAINING TO LOAD
UMOVE T1,.BTFLG(Q1) ;GET FLAGS FROM USER SPACE
TXNE T1,BT%BEL ;USER WANT DOORBELL ?
TXO Q1,BT%BEL ;YES, NOTE REQUEST
UMOVE T1,.BTLPT(Q1) ;GET POINTER TO DATA BYTES IN USER SPACE
MOVEM T1,Q3 ;SAVE BYTE POINTER TO DATA
; VALIDATE THE USER'S BYTE POINTER
LDB T2,[POINT 6,T1,11] ;GET SIZE OF BYTES
CAIE T2,^D8 ;ONLY 8-BIT BYTES PERMITTED
RETBAD (BOTX02) ;INVALID BYTE SIZE SPECIFIED
; DETERMINE THE NUMBER OF DATA BYTES PER PAGE
MOVEI T1,^D36 ;GET NUMBER OF BITS/WORD
IDIV T1,T2 ;COMPUTE NUMBER OF BYTES/WORD
IMULI T1,PGSIZ ;FORM TOTAL NUMBER OF BYTES/PAGE
SUBI T1,CNTBYT ;COMPUTE NUMBER OF DATA BYTES/PAGE
HRRM T1,Q1 ;SAVE # OF DATA BYTES/PAGE
; SET UP TO DO THE TRANSFER
HRRZ T1,Q2 ;GET NUMBER OF DTE-20
SETZM T2 ;NO DUMP WANTED
MOVEI T3,LODRTN ;ADR OF COROUTINE TO LOAD DATA
MOVEI T4,RELODE ;ADDRESS OF ERROR COROUTINE
CALL RMGRNC ;INITIATE LOAD OF SECONADRY BOOTSTRAP
JRST BTERR ;FAILED, RETURN ERROR STATUS
RETSKP ;SUCCESS, GIVE GOOD RETURN
; COROUTINE TO PERFORM LOADING OF AN ADJACENT COMPUTER'S MEMORY
;
;ACCEPTS IN Q1/ FLAGS,,NUMBER OF DATA BYTES PER PAGE
; FLAGS: BT%BEL IF DOORBELL WANTED
; Q2/ # OF BYTES LEFT TO LOAD,,DTE-20 NUMBER
; Q3/ BYTE POINTER TO NEXT BYTE INTO USER'S ADDRESS SPACE
LODRTN: HLRZ T1,Q2 ;GET NUMBER OF BYTES LEFT TO DO
JUMPLE T1,LDRTN2 ;IF DONE ALL BYTES, UNLOCK BOOT PAGE AND RETURN
CALL LOKPAG ;LOCK THE BOOT PAGE
CALL CLRRBT ;ZERO THE BOOT PAGE
HLRZ T1,Q2 ;GET NUMBER OF BYTES LEFT TO DO
HRRZ T2,Q1 ;ASSUME AN ENTIRE PAGE OF BYTES LEFT TO DO
CAIGE T1,(Q1) ;LESS THAN A PAGE OF DATA BYTES LEFT ?
HLRZ T2,Q2 ;YES, GET JUST THE NUMBER LEFT TO LOAD
SUB T1,T2 ;COMPUTE BYTES REMAINING AFTER THIS LOAD
HRL Q2,T1 ;SAVE NEW NUMBER OF BYTES LEFT TO DO
; STORE THE NUMBER OF DATA BYTES TO TRANSFER AS THE FIRST TWO BYTES
MOVE T4,[POINT 8,DTERBT] ;SET UP DESTINATION POINTER
IDPB T2,T4 ;STORE LOW ORDER BYTE OF COUNT
LDB T3,[POINT 8,T2,27] ;GET HIGH ORDER BYTE OF COUNT
IDPB T3,T4 ;STORE HIGH ORDER BYTE OF COUNT
; GET THE DATA BYTES FROM THE USER (T2 NOW HAS NUMBER OF BYTES TO LOAD)
USRD10: XCTBU [ILDB T3,Q3] ;GET NEXT BYTE FROM THE USER
IDPB T3,T4 ;STORE NEXT DATA BYTE TO LOAD
SOJG T2,USRD10 ;LOOP FOR ALL BYTES TO LOAD
; NOW SET UP FLAGS AND POINTER TO DATA AND RETURN
HRRZ T1,Q2 ;GET NUMBER OF DTE-20
CALL CLRBEL ;TURN OFF THE TO -10 DOORBELL
SETZM T2 ;ASSUME NO TO -11 DOORBELL WANTED
TXNE Q1,BT%BEL ;USER WANT A TO -11 DORRBELL ?
SETOM T2 ;YES, NOTE THAT A DOORBELL IS REQUESTED
MOVE T1,[POINT 8,DTERBT] ;GET BYTE POINTER TO DATA
RETSKP ;RETURN AND DO TRANSFER
; HERE WHEN ALL DATA HAS BEEN LOADED - UNLOCK THE BOOT PAGE AND RETURN
LDRTN2: CALL UNLPAG ;UNLOCK THE BOOT PAGE
CALLRET RFALSE ;RETURN (NO DDORBELL)
; ROUTINE TO DUMP AN ADJACENT COMPUTER'S MEMORY
BTDMP: STKVAR <BTDBLK,BTDERR>
CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
MOVEM Q1,BTDBLK ;SAVE ADDRESS OF USER ARG BLOCK
UMOVE T2,.BTCNT(Q1) ;GET TOTAL NUMBER OF DATA BYTES TO TRANSFER
HRLM T2,Q2 ;SAVE NUMBER OF BYTES REMAINING TO DUMP
UMOVE T1,.BTDPT(Q1) ;GET POINTER TO DATA BYTES IN USER SPACE
MOVEM T1,Q3 ;SAVE BYTE POINTER TO DATA
; DETERMINE THE NUMBER OF DATA BYTES PER PAGE
LDB T2,[POINT 6,T1,11] ;GET SIZE OF BYTES
MOVEI T1,^D36 ;GET NUMBER OF BITS/WORD
IDIV T1,T2 ;COMPUTE NUMBER OF BYTES/WORD
IMULI T1,PGSIZ ;FORM TOTAL NUMBER OF BYTES/PAGE
HRRZM T1,Q1 ;SAVE # OF DATA BYTES/PAGE
; SET UP TO DO THE TRANSFER
SETZM BTDERR ;INITIALIZE ERROR FLAG
HRRZ T1,Q2 ;GET NUMBER OF DTE-20
MOVE T2,[DMPRTN] ;GET ADDRESS OF DUMP COROUTINE
SETZM T3 ;NO LOAD ROUTINE NEEDED
MOVE T4,[RELODE] ;ADDRESS OF ERROR COROUTINE
CALL RMGRNC ;INITIATE DUMP
MOVEM T1,BTDERR ;SAVE ERROR STATUS
MOVE Q1,BTDBLK ;GET ADDRESS OF USER ARG BLOCK AGAIN
UMOVEM Q3,.BTDPT(Q1) ;STORE UPDATE POINTER INTO USER SPACE
HLRZ T1,Q2 ;GET # OF BYTES LEFT TO DUMP
UMOVEM T1,.BTCNT(Q1) ;STORE UPDATED COUNT IN USER SPACE
SKIPE T1,BTDERR ;DID AN ERROR OCCUR ON THE DUMP ?
JRST BTERR ;YES, GO STORE ERROR CODE AND RETURN
RETSKP ;SUCCESS, GIVE GOOD RETURN
; COROUTINE TO PERFORM DUMPING OF AN ADJACENT COMPUTER'S MEMORY
;
;ACCEPTS IN Q1/ # OF BYTES DUMPED ON LAST CALL,,NUMBER OF DATA BYTES PER PAGE
; Q2/ # OF BYTES LEFT TO DUMP,,DTE-20 NUMBER
; Q3/ BYTE POINTER TO NEXT BYTE INTO USER'S ADDRESS SPACE
DMPRTN: STKVAR <DMPNUM>
MOVEM T1,DMPNUM ;SAVE NUMBER OF THIS CALL
SKIPN DMPNUM ;FIRST TIME HERE ?
JRST DMPRT1 ;YES, SKIP RETURNING BYTES TO USER
; RETURN DUMPED BYTES TO USER PROGRAM
HLRZ T4,Q1 ;GET # OF BYTES DUMPED LAST TIME
MOVE T3,[POINT 8,DTERBT] ;GET BYTE POINTER
LDB T1,[POINT 6,Q3,11] ;GET SIZE OF USER'S BYTE POINTER
DPB T1,[POINT 6,T3,11] ;FORM BYTE POINTER FOR CORRECT SIZE BYTES
DMPRT0: ILDB T1,T3 ;GET A DUMPED BYTE
XCTBU [IDPB T1,Q3] ;STORE BYTE INTO USER SPACE
SOJG T4,DMPRT0 ;LOOP OVER ALL BYTES TO DUMP
DMPRT1: SKIPE DMPNUM ;IS THIS THE FIRST CALL ?
JRST DMPRT2 ;NO, DO NOT INITIALIZE BOOT PAGE
CALL LOKPAG ;YES, LOCK THE BOOT PAGE
CALL CLRRBT ;ZERO THE BOOT PAGE
DMPRT2: HLRZ T2,Q2 ;GET NUMBER OF BYTES LEFT TO DO
JUMPLE T2,DMPRT3 ;IF DONE ALL BYTES, UNLOCK BOOT PAGE AND RETURN
HLRZ T1,Q2 ;GET NUMBER OF BYTES LEFT TO DO
HRRZ T2,Q1 ;ASSUME AN ENTIRE PAGE OF BYTES LEFT TO DO
CAIGE T1,(Q1) ;LESS THAN A PAGE OF DATA BYTES LEFT ?
HLRZ T2,Q2 ;YES, GET JUST THE NUMBER LEFT TO DUMP
HRLM T2,Q1 ;SAVE # OF BYTES TO BE DUMPED THIS PASS
SUB T1,T2 ;COMPUTE BYTES REMAINING AFTER THIS DUMP
HRL Q2,T1 ;SAVE NEW NUMBER OF BYTES LEFT TO DO
;SET UP TO DO THE NEXT DUMP
MOVE T1,T2 ;GET # OF BYTES TO DUMP
MOVE T2,[POINT 8,DTERBT] ;GET POINTER TO WHERE DUMPED BYTES GO
LDB T3,[POINT 6,Q3,11] ;GET SIZE OF USER'S BYTE POINTER
DPB T3,[POINT 6,T2,11] ;FORM BYTE POINTER FOR CORRECT SIZE BYTES
RETSKP ;REQUEST NEXT SET OF BYTES TO BE DUMPED
; HERE AFTER FINAL SET OF BYTES HAS BEEN DUMPED
DMPRT3: CALL UNLPAG ;UNLOCK THE BOOT PAGE
CALLRET RFALSE ;NO EXTRA DOORBELL NEEDED
; ROUTINE TO WAIT FOR A TO-10 DOORBELL
BTBEL: SE0ENT ;ENTER SECTION 0
HRLZ T1,Q2 ;GET DTE-20 NUMBER
HRRI T1,DBWAIT ;GET SCHEDULER TEST ROUTINE ADDRESS
MDISMS ;WAIT FOR DOORBELL TO COME ON
MOVE T1,Q2 ;GET DTE-20 NUMBER
LSH T1,^D26 ;POSITION DTE-20 NUMBER
ADD T1,[CONO DTE0,DTETDB] ;FORM INSTRUCTION TO TURN OFF DOORBELL
XCT T1 ;TURN OFF TO-20 DOORBELL
RETSKP ;DOORBELL WAS ON, RETURN
; SCHEDULER TEST TO WAIT FOR A DOORBELL FROM A DTE-20
; ACCEPTS IN T1/ DTE-20 NUMBER
RESCD
DBTMR: MOVE T2,TODCLK ;GET THE TIME
CAML T2,DTETMR(T1) ;TIME TO WAKE UP YET?
JRST 1(4) ;YES - SO SUC
;NO - THEN CHECK IF DOORBELL ARRIVED YET
DBWAIT: LSH T1,^D26 ;POSITION DTE-20 NUMBER
ADD T1,[CONSO DTE0,DTETDB] ;FORM TEST INSTRUCTION
XCT T1 ;IS DOORBELL ON YET ?
JRST 0(4) ;NO, WAIT SOME MORE
JRST 1(4) ;YES, RETURN SUCCESS
SWAPCD
; ROUTINE TO PURGE THE DTE BUFFER PAGE (DTERBT)
;
;ACCEPTS IN T1/ DTE #
KILPAG: SAVET
MOVEI T2,DTERBT ;GET ADDRESS OF BUFFER PAGE
SETZ T1, ;DELETE THE PAGE
CALLRET SETMPG ;...
; ROUTINE TO READ A MOP MESSAGE FROM AN ADJACENT COMPUTER
;
; PROTOCOL: BYTE COUNT (2 BYTES, INCLUDING BYTE COUNT)
; MOP MESSAGE
; ONLY 8-BIT BYTES ARE PERMITTED. A SECONDARY BOOTSTRAP CAPABLE OF
; ADHERING TO THIS PROTOCOL MUST HAVE BEEN LOADED INTO THE ADJACENT
; COMPUTER PRIOR TO PERFORMING THIS FUNCTION.
BTRMP: CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
SE0ENT ;ENTER SECTION 0
MOVE T1,Q2 ;GET DTE-20 NUMBER
MOVEI T2,RCVMOP ;ADDRESS OF DUMP COROUTINE
MOVEI T3,0 ;NO LOADING DESIRED
MOVEI T4,RELODE ;ADDRESS OF ERROR COROUTINE
CALL RMGRNC ;INITIATE THE TRANSFER
JRST BTERR ;FAILED, RETURN ERROR STATUS
; THE MESSAGE HAS BEEN TRANSFERRED TO MONITOR VIRTUAL ADDRESS SPACE.
; RETURN THE MESSAGE TO THE USER (Q3 CONTAINS THE # OF BYTES TRANSFERRED).
UMOVE T1,.BTMPT(Q1) ;GET DESTINATION BYTE POINTER TO USER SPACE
UMOVE T2,.BTCNT(Q1) ;GET MAX BYTE COUNT USER WILL ACCEPT
CAML T2,Q3 ;WAS LESS ACTUALLY TRANSFERRED ?
MOVE T2,Q3 ;YES, USE SMALLER BYTE COUNT
UMOVEM T2,.BTCNT(Q1) ;STORE UPDATED BYTE COUNT IN USER SPACE
MOVE T4,[POINT 8,DTERBT,15] ;GET BYTE POINTER TO SOURCE
JUMPE T2,BTRM20 ;IF DONE, RETURN
; LOOP TO RETURN THE MESSAGE TO THE USER
BTRM10: ILDB T3,T4 ;GET BYTE FROM MESSAGE
XCTBU [IDPB T3,T1] ;STORE BYTE INTO USER SPACE
SOJG T2,BTRM10 ;LOOP OVER ENTIRE MESSAGE
BTRM20: UMOVEM T1,.BTMPT(Q1) ;STORE UPDATED BYTE POINTER
RETSKP ;RETURN SUCCESS
; COROUTINE TO RECEIVE MOP MESSAGES
RCVMOP: JUMPN T1,RCVM10 ;IF NOT FIRST CALL, GO READ MSG OR RETURN
; THIS IS THE INITIAL CALL - SET UP TO READ THE BYTE COUNT
CALL LOKPAG ;LOCK THE BOOT PAGE
CALL CLRRBT ;ZERO THE BOOT PAGE
MOVEI T1,2 ;BYTE COUNT IS FIRST TWO BYTES
MOVE T2,[POINT 8,DTERBT] ;GET BYTE POINTER
RETSKP ;RETURN TO READ FIRST TWO BYTES
; HERE ON SECOND CALL - SET UP TO READ THE ACTUAL MOP MESSAGE
RCVM10: CAIE T1,1 ;IS THIS THE SECOND CALL ?
JRST RCVM20 ;NO, GO UNLOCK THE BOOT PAGE AND RETURN
LDB Q3,[POINT 8,DTERBT,7] ;YES, GET LOW ORDER BYTE OF BYTE COUNT
LDB T1,[POINT 8,DTERBT,15] ;GET HIGH ORDER BYTE OF BYTE COUNT
DPB T1,[POINT 8,Q3,27] ;FORM COMPLETE BYTE COUNT
MOVE T1,Q3 ;GET BYTE COUNT
CAILE T1,PGSIZ*4-2 ;MAX MESSAGE SIZE IS ONE PAGE-COUNT (2 BYTES)
MOVEI T1,PGSIZ*4-2 ;MESSAGE TOO LARGE, JUST GET ONE PAGE
TXO T1,DTETI ;REQUEST "I" BIT ALSO
MOVE T2,[POINT 8,DTERBT,15] ;START MESSAGE AT THIRD BYTE IN FIRST WORD
RETSKP ;RETURN AND TRANSFER DATA BYTES
; HERE ON THIRD CALL - ENTIRE MESSAGE HAS BEEN TRANSFERRED
RCVM20: CALL UNLPAG ;UNLOCK THE BOOT PAGE
UMOVE T2,.BTFLG(Q1) ;GET FLAGS FROM USER
SETZM T1 ;ASSUME NO DOORBELL WANTED
TXNE T2,BT%BEL ;USER ASK FOR A DOORBELL ?
SETOM T1 ;YES, REQUEST A DOORBELL
RET ;RETURN, TRANSFER COMPLETED
; ROUTINE TO TERMINATE PROTOCOL ON A DTE-20
BTTPR: CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
CAMN Q2,MSTRDT ;IS THIS THE MASTER -11?
RETBAD (BOTX01) ;YES. ILLEGAL TO STOP IT
MOVE T1,Q2 ;Get DTE # in T1 for SETRGN
CALL SETRGN ;Get comm region ptrs in C and D
LOAD T1,CMVRR,(C) ;Get protocol version
SKIPN DTBUGX ; Skip this if we aren't interested
CAIE T1,MCPRON ;If DECNET, do not issue buginf
BUG.(INF,DTETPR,DTESRV,SOFT,<DTE protocol terminated>,<<Q2,DTENO>>,<
Cause: The protocol on the DTE has been terminated due to a BOOT% request.
Data: DTENO - DTE number
>,,<DB%NND>) ;[7.1210]
LOAD T1,DTERL,(Q2) ;GET CURRENT PROTOCOL STATE
PUSH P,T1 ;SAVE IT
SETZRO DTERL,(Q2) ;NOTE THAT THIS DTE NOT RUNNING A PROTOCOL
MOVE T1,Q2 ;GET DTE-20 NUMBER
CALL DTREST ;GO TURN OF INTERRUPTS FOR THIS DTE
SKIPE 0(P) ;WAS IN PROTOCOL?
CALL LOADFE ;(T1) YES, REQUEST RELOAD IN JOB 0
POP P,T1 ;GET PREVIOUS PROTOCOL STATE
RETSKP ;RETURN
;FALL INTO ROUTINE TO RETURN DTE20 STATUS
; ROUTINE TO RETURN STATUS OF A DTE-20
BTSTS: CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
MOVE T1,Q2 ;GET DTE-20 NUMBER
CALL CHKDTE ;SEE IF THIS DTE IS RUNNING SOME PROTOCOL
JRST [ SETOM T1 ;NO PROTOCOL RUNNING
JRST BTST1 ] ;GO RETURN THAT STATUS TO USER
; DETERMINE WHICH PROTOCOL IS RUNNING IN THE SPECIFIED DTE
MOVE T1,Q2 ;GET DTE-20 NUMBER
CALL SETRGN ;GET ADDRESS OF COMM REGIONS
LOAD T1,CMVRR,(T3) ;GET VERSION OF RUNNING PROTOCOL
; HERE TO RETURN STATUS TO USER (STATUS IS IN T1)
BTST1: UMOVEM T1,.BTCOD(Q1) ;RETURN STATUS TO USER
RETSKP ;RETURN SUCCESS
; ROUTINE TO ZERO THE BOOT PAGE
CLRRBT: MOVE T2,[DTERBT,,DTERBT+1] ;SET UP TO CLEAR BOOT PAGE
SETZM DTERBT ;CLEAR FIRST WORD OF PAGE
BLT T2,DTERBT+PGSIZ-1 ;INITIALIZE PAGE TO HOLD BOOT PROGRAM DATA
RET ;RETURN
; ROUTINE TO INITIALIZE THE PROTOCOL ON A SPECIFIED DTE-20
BTIPR: CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
UMOVE Q3,.BTPRV(Q1) ;GET PROTOCOL VERSION NUMBER
MOVE T1,Q3 ;COPY PROTOCOL VERSION NUMBER
CALL CHKPRO ;VALIDATE THE PROTOCOL SPECIFIED
RETBAD () ;INVALID PROTOCOL SPECIFIED
MOVE T1,Q2 ;GET DTE-20 NUMBER
CALL DTREAL ;IS THIS DTE EXISTANT?
RETBAD (BOTX01) ;NO. CAN'T INIT IT THEN
JN <DTERL,DTRLD>,(T1),[RETBAD (BOTX01)] ;MUST BE INACTIVE ALSO
CALL CLRDT0 ;CLEAN OUT OUTPUT QUEUE
MOVE T2,Q3 ;GET PROTOCOL VERSION NUMBER
NOINT ;INHIBIT PROCESS INTERRUPTS
PUSH P,JOBBIT ;SAVE FORK'S PRIORITY WORD
MOVX T3,BOTPRI ;GET SPECIAL PRIORITY WORD
MOVEM T3,JOBBIT ;""
CALL DTINIT ;INITIALIZE COMM REGIONS AND PROTOCOL
REPEAT 0,<
BUG.(INF,DTEIPR,DTESRV,SOFT,<DTESRV - Protocol initialized on DTE>,<<T1,DTENUM>>,<
Cause: BOOT% JSYS was executed to initialize protocol. This BUG is not
assembled into the monitor and should not occur in the field.
Data: DTENUM - the DTE number
>,,<DB%NND>) ;[7.1210]
> ;DEBUGGING AID TO CATCH RANDOM RELOADS
POP P,JOBBIT ;RESTORE PRIORITY WORD
JN DTRLD,(Q2),[SETZRO DTRLD,(Q2)
OKINT ;INTS ALLOWED NOW
RETBAD (BOTX05)] ;IT DIDN'T. INFORM CALLER
OKINT ;ALLOW INTS NOW
RETSKP ;GIVE SUCCESS RETURN
;ROUTINE TO CONVERT LINE-ID TO PORT NUMBER
BTCLI: UMOVE T4,.BTLID(Q1) ;GET POINTER TO LINE-ID STRING
TLC T4,-1 ;SEE IF POINTER IS -1,,ADR TYPE
TLCN T4,-1 ;??
HRLI T4,(POINT 7,) ;MAKE INTO AN ASCII POINTER
SETZ T2, ;WHERE WE WILL BUILD STRING
MOVE T3,[POINT 7,2] ;POINT TO IT
XCTBU [ ILDB T1,T4] ;GET FIRST CHARACTER OF STRING
IDPB T1,T3 ;AND STUFF
XCTBU [ ILDB T1,T4] ;GET SECOND CHARACTER OF STRING
IDPB T1,T3 ;AND STUFF
XCTBU [ ILDB T1,T4] ;GET THIRD CHARACTER OF STRING
IDPB T1,T3 ;AND STUFF
XCTBU [ ILDB T1,T4] ;GET FOURTH CHARACTER OF STRING
IDPB T1,T3 ;AND STUFF
CAMN T2,[ASCIZ/DTE_/] ;ASKING FOR A DTE?
JRST BTCNUM ;YES GET THE NUMBER
XCTBU [ ILDB T1,T4] ;GET FIFTH CHARACTER OF STRING
IDPB T1,T3 ;AND STUFF
CAME T2,[ASCIZ/DTE20/] ;"DTE20_" IS ALSO ACCEPTIBLE
RETBAD(BOTX01) ;NUMBER OUT OF RANGE
XCTBU [ ILDB T1,T4] ;GET SIXTH CHARACTER OF STRING
CAIE T1,"_" ;IS THE THE "DTE20_" STRING
RETBAD(BOTX01) ;NUMBER OUT OF RANGE
BTCNUM: XCTBU [ ILDB T1,T4] ;GET LAST CHARACTER OF STRING
SUBI T1,60 ;MAKE INTO A NUMBER
CAIL T1,DTEN ;CHECK FOR OUT OF RANGE
RETBAD(BOTX01) ;NUMBER OUT OF RANGE
XCTBU [ ILDB T2,T4] ;STRING SHOULD END WITH NULL
UMOVEM T1,.BTPRT(Q1) ;GIVE USER THE NUMBER
RETSKP ;SUCCESS RETURN
;ROUTINE TO CONVERT PORT NUMBER TO LINE-ID
BTCPN: CAIGE Q2,DTEN ;VALID DTE-20 SPECIFIED ?
SKIPGE Q2 ;??
RETBAD (BOTX01) ;NO, GIVE ERROR
UMOVE T3,.BTLID(Q1) ;GET USER'S POINTER FOR WHERE TO PUT STRING
TLC T3,-1 ;SEE IF POINTER IS -1,,ADR TYPE
TLCN T3,-1 ;??
HRLI T3,(POINT 7,) ;MAKE INTO AN ASCII POINTER
MOVEI T2,"D" ;PUT THE STRING "DTE_" IN USER SPACE
XCTBU [ IDPB T2,T3]
MOVEI T2,"T"
XCTBU [ IDPB T2,T3]
MOVEI T2,"E"
XCTBU [ IDPB T2,T3]
MOVEI T2,"_"
XCTBU [ IDPB T2,T3]
MOVE T4,Q2 ;GET THE DTE NUMBER
ADDI T4,60 ;MAKE NUMBER INTO AN ASCII QUANTITY
XCTBU [ IDPB T4,T3] ;SAVE THE DTE NUMBER
SETZ T4, ;END WITH A NULL
XCTBU [ IDPB T4,T3] ;PUT NULL INTO USER SPACE
UMOVEM T3,.BTLID(Q1) ;SAVE UPDATED POINTER
RETSKP
;CHKPRO - ROUTINE TO VALIDATE A PROTOCOL VERSION NUMBER
;
;ACCEPTS IN T1/ PROTOCOL VERSION NUMBER TO CHECK
; CALL CHKPRO
;RETURNS: +1 INVALID PROTOCOL SPECIFIED, ERROR CODE IN T1
; +2 VALID PROTOCOL GIVEN
CHKPRO: MOVSI T4,-PRVSIZ ;SET UP TO LOOP THROUGH PROTOCOL TABLE
CHKPR1: CAMN T1,PRVTAB(T4) ;FOUND VALID PROTOCOL ?
RETSKP ;YES, GIVE SUCCESS RETURN
AOBJN T4,CHKPR1 ;NO, LOOP THROUGH REMAINDER OF TABLE
RETBAD (BOTX03) ;INVALID PROTOCOL VERSION NUMBER
PRVTAB: .VN20F ;RSX20F PROTOCOL
MCPRON ;DECNET NETWORK SERVICES PROTOCOL
;ASSEMBLE ONLY IF HAVE DECNET SUPPORT
.VND60 ;DN60 protocol
PRVSIZ==.-PRVTAB
;.BTD60==16 ;DN60 PROTOCL OPERATION
;.VND60==2 ;DN60 protocol type
;BTD60 ARG BLOCK
; DEFSTR (BT6DTE,0,35,36) ;DTE number
;.BT6DTE==0
; DEFSTR (BT6ERR,1,35,36) ;returned error flags
;.BT6ERR==1
; DEFSTR (BT6HBC,2,17,18) ;DN60 header byte count
;.BT6HBC==2
; DEFSTR (BT6HDR,2,35,18) ;DN60 header address(begins on word)
;.BT6HDR==2
; DEFSTR (BT6DBC,3,35,36) ;data byte count
;.BT6DBC==3
; positive = write data mode
; zero = no data transfer
; negative = read data mode
; DEFSTR (BT6PTR,4,35,36) ;data byte ptr
;.BT6PTR==4
;the following are returned for timing analysis
; DEFSTR (BT6TMR,5,35,36) ;time of request
;.BT6TMR==5
; DEFSTR (BT6TAS,6,35,36) ;TIME DTE ASSIGNED
;.BT6TAS==6
; DEFSTR (BT6THQ,7,35,36) ;time header queued to 11
;.BT6THQ==7
; DEFSTR (BT6TRD,10,35,36) ;time of -10 done for response header
;.BT6TRD==10
; DEFSTR (BT6TDD,11,35,36) ;time of -10 done for data
;.BT6TDD==11
; DEFSTR (BT6TFR,12,35,36) ;time finished request
;.BT6TFR==12
;DN60 header definitions
D6HWSZ==4 ;number of 36 bit words in header
D6HBSZ==4*D6HWSZ ;number of 8 bit bytes in header
;DN60/DTE database/work space definitions
D6WDBS==PGSIZ ;working space size in words
DEFSTR (D6STS,0,35,36) ;port status
$D6STS==0
;protocol flags
; D6%BSY==1B0 ;port is busy - sign bitness is used in testing
; D6%QHD==1B1 ;header has been queued
; D6%HDD==1B2 ;to -11 done for header seen
; D6%NDT==1B3 ;this is a no-data-transfer operation
; D6%RED==1B4 ;this is a read data type operation
; D6%QDT==1B5 ;data has been queued(for write fcn)
; D6%DTD==1B6 ;to -11 done for write data seen
; D6%RBL==1B7 ;to -10 doorbell for response header seen
; D6%RDN==1B8 ;to -10 done for response header seen
; D6%DBL==1B9 ;to -10 doorbell for read data seen
; D6%DDN==1B10 ;to -10 done for read data seen
; D6%FDN==1B11 ;to -10 done for read data was faked
;error flags
; D6%BDP==1B30 ;bad data byte ptr
; D6%ARD==1B31 ;11 attempted to send read data when
; when none was expected
; D6%TRS==1B32 ;timed out waiting for response header
; D6%TDT==1B33 ;timed out waiting for read data
; D6%TPO==1B34 ;timed out waiting for port to be free
; D6%NT6==1B35 ;not a DN60 front end
D6%SER==D6%BDP!D6%ARD!D6%TRS!D6%TDT!D6%TPO!D6%NT6 ;all errors
DEFSTR (D6DTE,1,17,18) ;DTE number for this work space
$D6DTE==1
DEFSTR (D6RBC,1,35,18) ;response byte count
$D6RBC==1
DEFSTR (D6WDC,2,17,18) ;write data byte count
$D6WDC==2
DEFSTR (D6RDC,2,35,18) ;read data byte count
$D6RDC==2
DEFSTR (D6BSZ,3,35,36) ;data byte size
$D6BSZ==3
DEFSTR (D6BPW,4,35,36) ;data bytes per word
$D6BPW==4
DEFSTR (D6BLF,5,35,36) ;data bytes left in 1st word
$D6BLF==5
DEFSTR (D6BDP,6,35,36) ;beginning data byte ptr
$D6BDP==6
DEFSTR (D6DAD,7,35,36) ;byte ptr to 1st data byte in user space
$D6DAD==7
DEFSTR (D6CLK,10,35,36) ;timer for 11 requests
$D6CLK==10
DEFSTR (D6FRK,11,35,36) ;requesting fork
$D6FRK==11
DEFSTR (D6SUP,12,35,36) ;count of waiting supplicants
$D6SUP==12
DEFSTR (D6TRD,13,35,36) ;time of -10 done for response header
$D6TRD==13
DEFSTR (D6TDD,14,35,36) ;time of -10 done for data
$D6TDD==14
D6HDR==15 ;offset to beginning of header area
D6BUF==D6HDR+D6HWSZ ;offset to beginning of data buffer
D6BFS==D6WDBS-D6BUF ;number of words in D6BUF
;here to handle DN60 io requests - from .BOOT
;parameters: Q1/arg block ptr
; Q2/DTE number
; user space: AC2/arg block ptr
BTD60: MOVE T1,TODCLK ;save the request time
USTOR T1,BT6TMR,(Q1)
XCT 4,[SETZM .BT6TAS(Q1)] ;now clear all other timer statistics
XCT 4,[SETZM .BT6THQ(Q1)]
XCT 4,[SETZM .BT6TRD(Q1)]
XCT 4,[SETZM .BT6TDD(Q1)]
XCT 4,[SETZM .BT6TFR(Q1)]
NOSKED ;flush scheduler while we check for contention
SKIPN Q3,D6DTP(Q2) ;get the work space ptr
JRST D6NOSK ;DN60 protocol not running on this dte
NOINT ;don't allow any soft interrupts while
;waiting here - it screws up the contention data
SKIPL $D6STS(Q3) ;look for clear status
JRST [MOVE T1,FORKX ;get the loser's fork
CAMN T1,$D6FRK(Q3) ;check greediness
SKIPN $D6SUP(Q3) ;greed is not always inconsiderate
JRST BTD61 ;ok to proceed
JRST .+1] ;others waiting(impatiently most likely)
;the loser must wait in line
BTD60A: AOS $D6SUP(Q3) ;one more loser
OKSKED ;allow scheduler to run
MOVEI T1,D6BWT ;hang the user til port is free
CALL D6WAIT ;twiddle thumbs
NOSKED ;just to be safe
SOSGE $D6SUP(Q3) ;one less loser(he hopes)
SETZM $D6SUP(Q3) ;for when all this care is inadequate
SKIPGE T1,$D6STS(Q3) ;check for unbusy now
JRST [TXNE T1,D6%NT6 ;check if protocol is alive and well
JRST D6NOSI ;indeed it's dead
JRST BTD60A] ;all is ok...just slow
BTD61: MOVX T1,D6%BSY ;port unbusy - make it so
IORB T1,$D6STS(Q3) ;init the port status to begin transaction
TXNE T1,D6%NT6 ;is the fe dead ?
JRST D6NOSI ;yes - exit
MOVE T1,FORKX ;remember user
MOVEM T1,$D6FRK(Q3)
MOVE T1,TODCLK ;record time of dte assignment
USTOR T1,BT6TAS,(Q1)
;can't allow asynchronous exits until
;dte is deassigned
OKSKED ;allow scheduler to run
SETZRO D6RBC,(Q3) ;init some transaction history
SETZRO D6WDC,(Q3)
SETZRO D6RDC,(Q3)
SETZRO D6BSZ,(Q3)
SETZRO D6BPW,(Q3)
SETZRO D6BLF,(Q3)
SETZRO D6BDP,(Q3)
SETZRO D6CLK,(Q3)
SETZRO D6TRD,(Q3)
SETZRO D6TDD,(Q3)
ULOAD T1,BT6HBC,(Q1) ;get xmit header byte count
SKIPLE T1 ;default to full size
CAILE T1,D6HBSZ ;limit to full size
MOVEI T1,D6HBSZ
MOVE P1,T1 ;save the header xmit count
TRNE T1,3 ;headers are always 8 bit bytes = 4 bytes/word
ADDI T1,4
LSH T1,-2
ULOAD T2,BT6HDR,(Q1) ;get header address
MOVEI T3,D6HDR(Q3) ;where it goes
CALL BLTUM1 ;xfer header to local space
MOVX T2,D6%RED ;check out type of operation
XCT 4,[SKIPN T1,.BT6DBC(Q1)];determine direction of data transfer
TXOA T2,D6%NDT ;zero byte = this a non-data-xfer fcn
SKIPL T1 ;skip if read data fcn
TXZ T2,D6%RED ;write type
IORB T2,$D6STS(Q3) ;set the appropriate indicator
TXNE T2,D6%NDT ;if not data transfer type
JRST BTD63 ;go queue the header
;data mover - calc some byte ptr things
XCT 10,[MOVEI T1,@.BT6PTR(2)] ;get the data effective address
XCT 4,[HLL T1,.BT6PTR(Q1)] ;get the ptr part
TLZ T1,77 ;flush extraneous things
IBP T1 ;make sure address field = address of 1st word
HRRZM T1,$D6DAD(Q3) ;keep it
TXNN T2,D6%RED ;read data ?
JRST BTD62 ;write
XCT 4,[MOVE T4,@$D6DAD(Q3)] ;read data - get the 1st dest word
MOVEM T4,D6BUF(Q3) ;write over it locally
BTD62: HRRI T1,D6BUF(Q3) ;beginning byte ptr
MOVNI T4,1 ;make T1 an ildb ptr
ADJBP T4,T1
STOR T4,D6BDP,(Q3) ;save it
LDB T1,[POINT 6,T4,11] ;the byte size
JUMPE T1,[MOVX T1,D6%BDP ;crufty data ptr
JRST D6TMO]
STOR T1,D6BSZ,(Q3) ;preserve it
LDB T4,[POINT 6,T4,5] ;the byte position
MOVEI T2,^D36
IDIV T2,T1 ;bytes per word
STOR T2,D6BPW,(Q3) ;preserve it too
HRREI T3,-^D36(T4) ;T3/- number bits used
IDIV T3,T1 ;T3/- number bytes used
ADD T2,T3 ;T2/ number bytes left in 1st word
STOR T2,D6BLF,(Q3) ;save this also
BTD63: LOAD T1,D6DTE,(Q3) ;get the dte number
HRLI T1,D6HDDN ;the to -11 done interrupt process
MOVEI T2,D6HDR(Q3) ;where the data is
HRLI T2,(POINT 8) ;the ptr thereto
MOVE T3,P1 ;retrieve the xmit header count
MOVE F,Q3 ;driver unique code = workspace ptr
MOVE T4,TODCLK ;record time we did this
USTOR T4,BT6THQ,(Q1)
CALL DTEQ ;queue the header
JRST [LOAD T1,D6STS,(Q3) ;failed - check if fe dead
TXNE T1,D6%NT6
JRST D6FAL ;yes - no use prolonging agony
MOVEI T1,SPCTST ;no queue blocks - wait for some
HDISMS (^D2000)
JRST BTD63]
MOVX T1,D6%QHD ;header queued
IORB T1,$D6STS(Q3)
TXNE T1,D6%RED!D6%NDT ;check for write data function
JRST BTDRSP ;no - read data or no data
BTDWRT: ULOAD T1,BT6DBC,(Q1) ;get the byte count
LOAD P1,D6BPW,(Q3) ;bytes per word
IMULI P1,D6BFS-1 ;check buffer space
ADD P1,$D6BLF(Q3) ;add no. bytes left in 1st word
CAMLE T1,P1 ;limit request to available room
SKIPA T1,P1
MOVE P1,T1 ;remember what we used
STOR T1,D6WDC,(Q3) ;save actual count
IDIV T1,$D6BPW(Q3) ;find buffer space needed in words
SKIPE T2
AOS T1
HRRZ T2,$D6DAD(Q3) ;get the source address
MOVEI T3,D6BUF(Q3) ;where it is going
CALL BLTUM1 ;move the data to local space
BTDWR1: LOAD T1,D6DTE,(Q3) ;get the dte number
HRLI T1,D6DTDN ;to -11 done for data interrupt process
LOAD T2,D6BDP,(Q3) ;get the beginning ptr
MOVE T3,P1 ;get actual bytes to send
MOVE F,Q3 ;driver unique code = workspace ptr
CALL DTEQ ;queue the data block
JRST [LOAD T1,D6STS,(Q3) ;failed - check if fe dead
TXNE T1,D6%NT6
JRST D6FAL ;yes - no use prolonging agony
MOVEI T1,SPCTST ;no queue blocks - wait for some
HDISMS (^D2000) ;wait for one
JRST BTDWR1] ;and try again
MOVX T1,D6%QDT ;mark this part done
IORM T1,$D6STS(Q3)
BTDRSP: MOVEI T1,D6RWT ;wait for the response sched test
MOVX T2,D6%RDN!D6%NT6
TDNN T2,$D6STS(Q3) ;check if already done
CALL D6WAIT ;twiddle thumbs
MOVE T1,$D6STS(Q3) ;check if fe died
TXNE T1,D6%NT6
JRST D6FAL ;yes - go away
TXNN T1,D6%RDN ;check if response came
JRST [MOVX T1,D6%TRS ;timed out
JRST D6TMO]
;response has arrived
LOAD T1,D6RBC,(Q3) ;get response byte count
CAILE T1,D6HBSZ ;i should hope so
MOVEI T1,D6HBSZ
USTOR T1,BT6HBC,(Q1) ;stuff back in arg block
JUMPE T1,BTDRS0 ;no response(and no data either)
TRNE T1,3 ;headers are always 8 bit bytes = 4 bytes/word
ADDI T1,4
LSH T1,-2
ULOAD T3,BT6HDR,(Q1) ;get header address
MOVEI T2,D6HDR(Q3)
CALL BLTMU1 ;xfer the header back to user
LOAD T1,D6STS,(Q3) ;get transaction status
TXNN T1,D6%NDT ;check if read data expected
TXNN T1,D6%RED
JRST BTDRS3 ;no - go finish up
MOVEI T1,D6DWT ;no - wait here for it
MOVX T2,D6%DDN!D6%NT6
TDNN T2,$D6STS(Q3) ;check if already done
CALL D6WAIT ;twiddle thumbs
LOAD T1,D6STS,(Q3) ;well, did it?
TXNE T1,D6%NT6 ;check if fe died
JRST D6FAL ;yes - go away
TXNN T1,D6%DDN
JRST [MOVX T1,D6%TDT ;no - not coming i guess
JRST D6TMO]
BTDRS0: LOAD T1,D6RDC,(Q3) ;data arrived - get the amount
USTOR T1,BT6DBC,(Q1) ;stuff in arg block
JUMPE T1,BTDRS3 ;no data received but protocol is happy
SUB T1,$D6BLF(Q3) ;find words beyond 1st
JUMPG T1,BTDRS1 ;some
MOVEI T1,1 ;none
JRST BTDRS2
BTDRS1: IDIV T1,$D6BPW(Q3)
SKIPE T2
AOS T1
SKIPE $D6BLF(Q3) ;no increment if 1st word is empty
AOS T1 ;add 1st word
BTDRS2: HRRZ T3,$D6DAD(Q3) ;get destination
MOVEI T2,D6BUF(Q3) ;local source
CALL BLTMU1
BTDRS3: CALL BTDRS4 ;record final statistics
LOAD T1,D6STS,(Q3) ;get transaction status back
TXNE T1,D6%SER ;did any errors occur?
JRST D6FAL ;yes - take error exit
XCT 4,[SETZM .BT6ERR,(Q1)] ;stuff transaction status in arg block
SETZRO D6STS,(Q3) ;make port available
OKINT ;allow soft interrupts now
RETSKP
D6TMO: IORB T1,$D6STS(Q3) ;timed out waiting for something
D6FAL: PUSH P,T1 ;save it
LOAD T1,D6DTE,(Q3) ;get the dte number
NOSKED
CALL CLRDTF ;clean up transaction
CALL BTDRS4 ;record final statistics
MOVX T1,D6%NT6 ;check if fe died
ANDB T1,$D6STS(Q3) ;never clear death bit
JUMPE T1,D6FAL1 ;all is hunkydory
SKIPE $D6SUP(Q3) ;are there any suplicants?
JRST D6FAL1 ;yes - can't blow away the workspace yet
LOAD T1,D6DTE,(Q3) ;no - blow it all away
SETZM D6DTP(T1) ;flush the ptr to workspace
MOVE T1,Q3
CALL RELRES ;and return the page to free space
D6FAL1: OKSKED
POP P,T1 ;get error status back
JRST D6NOGO ;and fail
D6NOSK: NOINT ;fe is dead
D6NOSI: MOVX T1,D6%NT6 ;DN60 protocol not running on this dte
SKIPE Q3,D6DTP(Q2) ;get the data base
ANDB T1,$D6STS(Q3) ;never clear death bit
OKSKED
D6NOGO: USTOR T1,BT6ERR,(Q1) ;set the error code
OKINT ;allow soft interrupts now
RET ;fail
BTDRS4: MOVE T2,TODCLK ;record some final statistics
USTOR T2,BT6TFR,(Q1) ;when we finished
MOVE T2,$D6TRD(Q3)
USTOR T2,BT6TRD,(Q1) ;when header got here
MOVE T2,$D6TDD(Q3)
USTOR T2,BT6TDD,(Q1) ;when data got here
RET
;init DTE and 11 for DN60 protocol - dispatched to from DTEINI
;parameters: T1/DTE number
; T3/ptr to 11's comm region
; T4/ptr to 10's comm region
; DTNUMB is a stkvar for DTE number
DTIND6: PUSH P,T3 ; protect these
PUSH P,T4
SKIPN T2,D6DTP(T1) ;find work space for DTE
JRST [PUSH P,T1
MOVE T1,[.RESP3,,D6WDBS] ;get some work space for this DTE
MOVX T2,<RS%SE0+.RESGP>
CALL ASGRES
JRST [POP P,T1 ;couldn't
POP P,T4
POP P,T3
RET] ;fail
POP P,T2 ;recover slot ptr
EXCH T1,T2 ;retrieve the DTE number,save the
MOVEM T2,D6DTP(T1) ; associated workspace ptr
JRST .+1]
SETZRO D6STS,(T2) ;T2/work space ptr
STOR T1,D6DTE,(T2) ;init some stuff
SETOM $D6FRK(T2) ;last forker that came by
SETZM $D6SUP(T2) ;none of them waiting in line
POP P,T4 ;get the region ptrs
POP P,T3
;now go init MCB protocol
D6INMC: SETONE <CMTST,CMINI>,(D) ;set my ini bit
MOVE B,CNDO(A) ;get prototype cono
IORI B,DTEPIE!DTEPI0 ;turn on pi0 only
XCT B ;so -11 can examine its region
CALL DING11 ;go ring -11's bell
MOVEI B,MCINI0 ;timeout for first phase
D6INM1: CALL DTBELL ;go wait for doorbell or timeout
JE CMINI,(C),D6INM3 ;see if it did it right
CALL CLRBEL ;clear doorbell
SETZRO CMINI,(D) ;clear ini bit
CALL DING11 ;ring 11's bell again
MOVEI B,MCINI1 ;time for this phase
D6INM2: CALL DTBELL ;go wait for doorbell or timeout
JN CMINI,(C),D6INM3 ;make sure it did it right
CALL DTEON ;go turn protocol on
JRST DTESKD ;and start the protocol
;init failed - kill off dte
D6INM3: SETONE DTRLD,(A) ;set reload
SETZRO DTERL,(A) ;no longer running a protocol
JRST DTREST ;and reset the dte
;DTBELL - Wait for doorbell upto specified increment of time.
;[7.1280] Replace old DTBELL code
;
; Call with A/ DTE #
; B/ time increment from now of when to time out
;
; Returns + 1 always
DTBELL: ADD B,TODCLK ;calc wakeup time
MOVEM B,DTETMR(A) ;save it
PUSH P,A ;save the dte number
HRLI A,DBTMR ;get scheduler test
MOVSS A ;put things in right place
HDISMS (^D2000) ;and wait
POP P,A ;return dte number
RET
REPEAT 0,< ;[7.1280] Remove edit 7449
;[7449]
;
; This code originally set up a scheduler test to wait for the
; doorbell. This caused SKDCL1 bughalts when the powerfail restart
; code ran. The new code waits for the doorbell without dismissing.
DTBELL: SAVEAC <A> ;SAVE AWAY THE DTE #
CALL NEWTIM ;(B/) CALCULATE NEW WAKE UP TIME
LSH A,^D26 ;PUT DTE # INTO CORRECT POSITION FOR CONSO
ADD A,[CONSO DTE0,DTETDB] ;FORM FULL CONSO TEST INSTRUCTION
DTBEL1: XCT A ;IS DOORBELL ON YET ?
IFNSK.
CALL CHKTIM ;NO, (B/) TIME TO QUIT ?
JRST DTBEL1 ;NO, TRY IT AGAIN
ENDIF.
RET ;RETURN
> ;[7.1280] End of REPEAT 0
;DEDD60 handles cleaning up dead DN60 nodes
; called from RELODR
DEDD60: PUSH P,T1 ;save the dte number
NOSKD1 ;protect from contention
SKIPN T1,D6DTP(T1) ;get the workspace ptr
JRST DEDD6X ;already dead
MOVX T2,D6%NT6 ;mark fe dead
IORB T2,$D6STS(T1)
JUMPL T2,DEDD6X ;currently in use
SKIPE $D6SUP(T1) ;not in use - check suplicants
JRST DEDD6X ;there are some - can't flush workspace
CALL RELRES ;release the storage
POP P,T1 ;get the dte number back
SETZM D6DTP(T1) ;no more workspace
JRST DEDD6Y
DEDD6X: POP P,T1 ;get dte number back
DEDD6Y: OKSKD1
RET
RS D6DTP,10 ;DN60 workspace/dte table
;resident code for interrupt processes and scheduler tests
RESCD
;scheduler tests
D6BWT: SKIPGE $D6STS(T1) ;dte busy wait test
JRST D6WKT ;check timer
JRST 1(4) ;free now
D6RWT: SKIPA T2,[D6%RDN!D6%NT6] ;wait for response header test or death
D6DWT: MOVX T2,D6%DDN!D6%NT6 ;wait for read data done test or death
TDNN T2,$D6STS(T1) ;T1/dte data base tpr
JRST (4) ;no - wait
JRST 1(4) ;yes - go ahead
D6WKT: SKIPE T2,$D6CLK(T1) ;get the timer
CAMG T2,TODCLK ;set - check the tempis
JRST 1(4) ;free now
JRST (4) ;more waiting
D6WAIT: MOVE T2,TODCLK ;T1/scheduler test
ADDI T2,^D1800
SKIPN $D6CLK(Q3) ;don't mung running timer
MOVEM T2,$D6CLK(Q3) ;set the alarm in the not too distant future
HRL T1,Q3 ;give a handle
HDISMS (^D2000) ;an outrageous time
SETZM $D6CLK(Q3) ;kleen up
RET
;interrupt processes
;the following two are called from TO11DN with T1/workspace ptr(driver unique code)
D6HDDN: SKIPA T2,[D6%HDD] ;to -11 done for header interrupt process
D6DTDN: MOVX T2,D6%DTD ;to -11 done for data interrupt process
IORM T2,$D6STS(T1) ;set write to -11 done flag
RET
;the following is dispatched to from to -10 doorbell interrupt
; T1/dte number
; T4/11 comm region ptr
D6DRBL: SKIPN T2,D6DTP(T1) ;find workspace ptr
JRST DBLER ;not a DN60 fe
PUSH P,Q2
PUSH P,Q3
DMOVE Q2,T1 ;save dte and workspace ptr
LOAD T1,D6STS,(Q3) ;get the transaction status
LOAD T2,CMQCT,(T4) ;yes - get the expected byte count(piecemeal)
STOR T2,DTEBC,(Q2) ;we will take it all - this,of course,
; assumes the 11 honors the limit sent
TXNE T1,D6%RDN ;have we seen response header done?
JRST D6BL1 ;yes - must be data doorbell
STOR T2,D6RBC,(Q3) ;save response header size
JUMPE T2,D6BL1 ;if no response - no data either
MOVEI T2,D6HDR(Q3) ;beg word of buffer
MOVEI T3,D6HWSZ-1(T2) ;last word of buffer
MOVSI P1,(POINT 8) ;make byte ptr for dte
HRR P1,T2
TXO T1,D6%RBL ;have seen response header doorbell
JRST D6BL2
D6BL1: TXO T1,D6%DBL!D6%RDN ;have seen data doorbell and response done
STOR T2,D6RDC,(Q3) ;where the data goes
JUMPE T2,D6BL1A ;no data to read!
TXNN T1,D6%NDT ;are we expecting data?
JRST D6BL1B ;yes - read it
SETZRO D6RDC,(Q3) ;no - we won't do it
TXO T1,D6%ARD ;set error flag
D6BL1A: TXO T1,D6%DDN!D6%FDN ;got data doorbell but no data is to be
;read - fake a to -10 done interrupt here
STOR T1,D6STS,(Q3) ;update transaction status
JRST DBLER0 ;and go neutralize the doorbell
D6BL1B: MOVEI T3,D6BFS-1(T2) ;end of it all
LOAD P1,D6BDP,(Q3) ;get the beg byte ptr
D6BL2: STOR T1,D6STS,(Q3) ;update transaction status
MOVEM T2,DTEIND(Q2)
MOVEM T3,DTEEND(Q2) ;MCB version 5 wants this for some reason
POP P,Q3
MOVE T1,Q2
POP P,Q2
CALL SETRGN ;get the comm region ptrs again
LSH A,SDTE ;find proper dte group
MOVEM P1,DTETBP(A) ;store into the ept
LSH A,-SDTE ;restore dte number
JRST DOFRMC ;rejoin mcb code
DBLER0: POP P,Q3 ;unexpected doorbell of some flavor
MOVE T1,Q2 ;get dte number back
POP P,Q2
DBLER: SETZRO DTEBC,(T1) ;nullify this request
RET
;to -10 done interrupt processing - called from TO10DN
; T1/ dte number
; T3/10 comm region ptr
; T4/11 comm region ptr
DN10D6: SKIPN T2,D6DTP(T1) ;find the workspace
JRST DTEDNE ;strange - try to ignore
LOAD T3,D6STS,(T2) ;get the transaction status
TXNN T3,D6%RBL!D6%DBL ;have we seen any doorbells?
JRST DTEDNE ;curiouser
TXNE T3,D6%DBL ;yes - which
TXOA T3,D6%DDN ;data - we go the data
TXO T3,D6%RDN ;response header
STOR T3,D6STS,(T2) ;update the transaction status
PUSH P,TODCLK ;save nowness
TXNN T3,D6%DDN ;was this data ?
JRST D6DDN1 ;header
POP P,$D6TDD(T2) ;record -10 done for data
JRST DTEDNE ;now go away in confidence
D6DDN1: POP P,$D6TRD(T2) ;record -10 done for response header
JRST DTEDNE
RESCD
;KEEP ALIVE INSTRUCTION USED BY SCHED TO DO KEEP ALIVE FUNCTION
;FOR THE 11
KEPALV::AOS COMBUF+DTEN+1+KPALIV ;BUMP KEEP ALIVE COUNTER
> ;** END IFN KLFLG ON FIRST PAGE **
TNXEND
END