ASMB,R,L,C
      HED EXECM: 'EXEC' REQUEST PROCESSOR * (C) HEWLETT-PACKARD CO. 1978 *
      NAM EXECM,19,30 91740-16005 REV 1840 780721 
      SPC 1 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978. ALL RIGHTS      *
*  * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY.   *
*  ***************************************************************
      SPC 1 
* 
*    NAME:   EXECM        DS/1000 'EXEC' REQUEST MONITOR
*    SOURCE: 91740-18005
*    RELOC:  91740-16005
*    PGMR:   C. HAMILTON  [07/21/78]
* 
      SPC 2 
      EXT DRTEQ,PGMAD 
      EXT $CLAS,$LIBR,$LIBX,$OPSY,EXEC
      EXT #BREJ,#GRPM,#NODE,#NCNT,#PLOG,#REQU,#RPCV,#RSAX 
A     EQU 0 
B     EQU 1 
KEYWD EQU 1657B 
XEQT  EQU 1717B 
XTEMP EQU 1721B 
XPRIO EQU 1726B 
      SUP 
      SPC 2 
EXECM JMP CONFG     CONFIGURE: 1RST TIME; 'NOP' THEREAFTER. 
      LDA B,I       GET THE PASSED PARAMETER. 
      IFZ 
      EXT DBUG
      SZA 
      JMP SETCL 
      JSB DBUG
      DEF *+1 
      JSB EXEC
      DEF *+4 
      DEF D6
      DEF D0
      DEF D1
      JMP EXECM+1 
      XIF 
* 
SETCL STA SAVCL     SAVE <EXECM> CLASS NUMBER.
      IOR BIT15     PREPARE A NO-WAIT CLASS WORD           #
      STA RDCLS      FOR CLASS-READ REQUESTS.              #
      ALR,RAR       REMOVE BUFFER-SAVE BIT(#14) FROM CLASS. 
      STA PURCL     SAVE FOR CLASS-PURGE ROUTINE. 
      AND B377      ISOLATE THE ORDINAL,                   #
      ADA DFCLS      AND COMPUTE THE                       #
      STA CLTBA       CLASS-TABLE ENTRY ADDRESS.           #
* 
      SKP 
*  <EXECM> WAITS IN GENERAL WAIT QUEUE, UNTIL A NEW REQUEST ARRIVES,
*          OR UNTIL A CLASS READ/WRITE/CONTROL REQUEST COMPLETES. 
* 
GET   JSB EXEC      PERFORM A CLASS 'GET',
      DEF *+8        IN ORDER TO UN-OBTRUSIVELY AWAIT 
      DEF D21         ARRIVAL OF REQUESTS & I/O COMPLETION. 
      DEF SAVCL     SPECIFY: MONITOR'S CLASS
DABFA DEF DABUF     SPECIFY: DATA BUFFER ADDRESS. 
      DEF D0        IGNORE DATA--INITIALLY. 
      DEF SAMAD     RETURNED: REQUEST BUFFER ADDRESS. 
      DEF SAMLN     RETURNED: REQUEST LENGTH. 
      DEF SAMRC     RETURNED: REQUEST CODE. 
* 
      DST SAVA      SAVE THE REGISTERS. 
* 
      LDA D7        PREPARE FOR A 
      STA RPLYL      MINIMUM-LENGTH REPLY.
      CMA,INA 
      ADA SAMLN     IF THE REQUEST-LENGTH 
      SSA            IS LESS THAN THE MINIMUM: 7, 
      JMP CLNUP       IT CANNOT BE PROCESSED--IGNORE IT!
* 
      CLA           SET <A> =0, TO PREPARE
      STA BL/CP      FOR REPLY W/O DATA.
* 
      LDA SAMLN     GET THE REQUEST LENGTH. 
      CAX           PREPARE FOR POSSIBLE DMS WORD-MOVE. 
      ADA DM16      IF THE REQUEST LENGTH 
      SSA,RSS        IS GREATER THAN 15 WORDS,
      JMP CLNUP       THEN THE REQUEST IS UNACCEPTABLE! 
* 
      LDA SAMAD     SOURCE = REQUEST BUFFER IN S.A.M. 
      LDB RQBFA     DESTINATION = LOCAL REQUEST BUFFER. 
DMS1  MVW SAMLN     OBTAIN REQUEST PARAMETERS ('MWF',IF DMS). 
* 
      LDA RQBUF+4   GET THE REQUEST CODE FROM THE CALLER. 
      STA RCODE     SAVE THE REQUEST CODE FOR LATER USE.
* 
      LDB RQBUF     GET THE STREAM WORD.                   #
      RBL,SLB,RBL   IF THIS IS A NEW DS/3000 REQUEST,      #
      JSB GD3K       GO TO FLAG IT AS SUCH.                #
*                                                                          #
      LDB SAMRC     GET THE RETURNED REQUEST CODE.
      CLE,SZB       IS THIS A NEW REQUEST?
      JMP RWCMP      NO-PROCESS READ/WRITE/CNTRL COMPLETION.
* 
      JSB PLOG      EXAMINE NEED FOR REQUEST LOGGING. 
* 
      CPA D99       SPECIAL REQUEST FOR PROGRAM STATUS? 
      JMP PGMST      YES--GO TO ACCOMODATE THE CALLER.
      STA B          NO.SAVE REQUEST CODE FOR VALIDITY CHECK. 
      SZB           IF REQUEST CODE=0--REJECT: ERROR "DS06"!
      ADB UPLIM     FORM A NEGATIVE TABLE INDEX.
      SSB,RSS       0 < REQUEST CODE < 27 ? 
      JMP ERDS6       NO! OUT OF RANGE--ERROR: "DS06".
* 
      IOR BIT15     INCLUDE NO-ABORT BIT(#15),
      STA RQBUF+4    AND RESTORE THE REQUEST CODE.
* 
      ADB TABAD     COMPUTE PRE-PROCESSOR ADDRESS.
      CLE           PREPARE FOR A 'NO ERROR' REPLY. 
      JMP B,I       GO TO EXECUTE THE PRE-PROCESSING. 
* 
      SPC 3 
*  ERROR PROCESSING SECTION.
* 
ERDS6 LDB "06"      "DS06": ILLEGAL REQUEST CODE. 
      JMP GETDS 
ERDS8 LDB "08"      "DS08": INSUFFICIENT RESOURCES. 
GETDS LDA "DS"
      JMP ERRTN 
ERIO1 LDB "01"      "IO01": IMPROPER OR MISSING PARAMETER.
      JMP GETIO 
ERIO2 LDB "02"      "IO02": ILLEGAL LOGICAL UNIT. 
      JMP GETIO 
ERIO7 LDB "07"      "IO07": DRIVER REJECTED ILLEGAL REQUEST.
GETIO LDA "IO"
      JMP ERRTN 
ERSC1 LDB "01"      "SC01": MISSING SCHEDULING PARAMETER. 
      JMP GETSC 
ERSC2 LDB "02"      "SC02": ILLEGAL SCHEDULING PARAMETER. 
      JMP GETSC 
ERSC5 LDB "05"      "SC05": PROGRAM NOT DEFINED.
GETSC LDA "SC"
* 
ERRTN CCE           ERROR RETURN. 
      JMP DONE
* 
      SPC 2 
* 
"01"  ASC 1,01
"02"  ASC 1,02
"05"  ASC 1,05
"06"  ASC 1,06
"07"  ASC 1,07
"08"  ASC 1,08
"DS"  ASC 1,DS
"IO"  ASC 1,IO
"SC"  ASC 1,SC
* 
      SKP 
*  REPLY PROCESSING SECTION.
* 
DONE  DST RQBUF+4   STORE REGISTERS IN WORDS 5&6 OF REPLY.
      CLA,SEZ,RSS   IF THIS IS A NORMAL RETURN, 
      JMP CLERR      GO TO CLEAR THE REPLY-ERROR INDICATOR. 
      STA BL/CP       ELSE, PREPARE FOR REPLY SANS DATA.
      LDB D7        ESTABLISH THE 
      STB RPLYL      MINIMUM-LENGTH REPLY.
* 
CLERR LDA #NODE     GET THE LOCAL NODE NUMBER.
      ELA,CLE,RAR   INCLUDE ASCII-ERROR FLAG (BIT#15).
      STA RQBUF+6   STORE THE ERROR INDICATOR--IF ANY.
* 
      LDB CLTBA,I   GET THE CLASS-HEADER ADDRESS. 
      ADB D8        POINT TO THE DATA BUFFER. 
      ADB BL/CP     ESTABLISH THE REPLY AFTER THE DATA. 
      STB RPLAD     SAVE THE NEW REPLY ADDRESS. 
* 
      LDA RQBUF     GET THE STREAM WORD.
      AND RPMSK     REMOVE THE OLD RE-TRY COUNT,
      IOR #BREJ      AND INCLUDE THE NEW. 
      IOR BIT14     ADD THE REPLY FLAG (BIT#14).
      STA RQBUF     RESTORE THE MODIFIED WORD.
* 
      LDA RPLYL     GET THE REPLY LENGTH. 
      CAX           PREPARE FOR A DMS "MWI".
      CMA,INA 
      ADA SAMLN     IF THE REPLY-LENGTH EXCEEDS 
      SSA            THE AVAILABLE CLASS BUFFER, THEN INFORM
      JMP ERDS8       THE USER OF THE ERROR OF HIS WAYS!
* 
      JSB CLTCB     GO TO CLEAR THE TRANSACTION RECORD. 
      STA RQBUF+1   RESTORE THE ORIGINAL SEQUENCE NUMBER. 
* 
      LDA RQBFA     GET THE REPLY-DATA ADDRESS. 
      LDB RPLAD     GET THE REPLY ADDRESS IN S.A.M. 
      JSB $LIBR 
      NOP 
DMS2  MVW RPLYL     MOVE REPLY TO CLASS BUFFER. [DMS: 'MWI']
      JSB $LIBX 
      DEF *+1 
      DEF REPLY 
* 
      SKP 
* 
REPLY LDA RQBUF     GET THE STREAM WORD.                   #
      RAL,CLE,SLA,ERA  SET <E>= DS/3000 BIT(#15)--IF ANY.  #
      JMP LOCAL        DS/3000 REPLY: REQUEUE VIA #RPCV.   #
      LDA RQBUF+2   GET THE SOURCE NODE NO. 
      CPA #NODE     IF THE REPLY IS FOR THIS NODE,
      JMP LOCAL      THEN RE-QUEUE IT TO <#GRPM>. 
* 
      DLD #NCNT     GET NRV SIZE AND ADDRESS
      CAX           X HAS COUNTER FOR NODAL ADDRESS PAIRS 
* 
NLOOP LDA B,I       GET A NODAL ADDRESS FROM THE NRV TABLE. 
      NOP           (XLA B,I IN THESE 2 INSTRUCTIONS IF DMS)
      INB           POINT TO THE ASSOCIATED ROUTING VECTOR
      CPA RQBUF+2   IF THIS IS THE SOURCE-NODE ENTRY, 
      JMP GETLU      GO TO GET THE ROUTING VECTOR (LU); 
      INB             ELSE, ADVANCE THE ENTRY-POINTER, AND
      ISX              IF ALL ENTRIES HAVE NOT BEEN CHECKED,
      JMP NLOOP         GO TO EXAMINE THE NEXT NRV ENTRY. 
* 
      JMP CLNP0     ENTRY NOT FOUND--FORGET THE REPLY!
* 
GETLU LDA B,I       ENTRY FOUND: GET THE LOGICAL UNIT NO. 
      NOP           (XLA B,I IN THESE 2 INSTRUCTIONS IF DMS)
      AND B77       REMOVE POSSIBLE TIMEOUT DATA. 
      IOR B100      INCLUDE THE <DVA65> 'WRITE-BIT(#6)'.
      STA RQBUF+5   SAVE THE CONWD FOR USE BY 'CONWP'.
      LDA D1        SIMULATE A CLASS 'WRITE-READ' REQUEST.
      STA RCODE     INITIALIZE PARAMETER FOR 'CONWP'. 
      JSB CONWP     GO PREPARE CONWD FOR USE BY <#REQU>.
      IOR ZBIT      ADD DOUBLE-BUFFER BIT(#12) FOR <DVA65>, 
      STA CONWD      AND RESTORE THE MODIFIED CONWD.
* 
      JSB #REQU     CALL <#REQU>
      DEF *+9        TO TRANSFER THE REPLY
      DEF SAVCL       FROM <EXECM'S> CLASS
      DEF #GRPM        [COMPLETION VIA <#GRPM>] 
      DEF RQBUF+5       TO THE LU WHICH LINKS THE CALLER. 
      DEF CONWD     SPECIFY: COMM. LINE CONWORD 
      DEF XPRIO,I            <EXECM'S> PRIORITY LEVEL 
      DEF BL/CP              REPLY DATA LENGTH--IF ANY
      DEF RPLAD              REVISED REPLY-BUFFER ADDRESS 
      DEF RPLYL              REPLY-BUFFER LENGTH
      SSA,RSS       IF THE RE-QUEUEING WAS SUCCESSFUL, THEN 
      JMP GET        GO TO AWAIT NEXT REQUEST/COMPLETION; 
      JMP CLNP0       ELSE, GO CLEAN UP & FORGET REPLY! 
* 
      SKP 
*     PRE-PROCESS FOR READ/WRITE AND CONTROL REQUESTS               RC=1,2,3
* 
RWC   JSB CONWP     PREPARE CONTROL WORD & CHECK DEVICE.
* 
      LDB RQBUF+6   GET BUFFER LENGTH/CONTROL PARAMETER.
      STB BL/CP     INITIALIZE <#REQU> PARAMETER. 
* 
      LDA RCODE     GET THE REQUEST CODE. 
      CPA D1        IF THIS IS A READ REQUEST,
      JMP *+2        THEN SKIP TO CHECK FOR WRITE-READ; 
      JMP REQUE       ELSE, SIMPLY RE-QUEUE THE REQUEST.
* 
      LDA RQBUF+5   GET THE CALLER'S CONTROL WORD.
      ALF           POSITION INTER-ACTIVE BIT(#11) TO SIGN. 
      SSA,RSS       IS THIS AN INTER-ACTIVE WRITE-READ? 
      JMP CLSRD      NO. GO TO CLASS-READ PROCESSING.      #
* 
      ISZ CONWD      YES. CONVERT REQUEST CODE TO 'WRITE(2)'. 
      LDA RQBUF+8   GET WRITE LENGTH FROM OPT. PRAM. #2 
      STA BL/CP     INITIALIZE WRITE LENGTH FOR <#REQU>.
      SSA           IF CHARACTERS WERE SPECIFIED, 
      ARS            CONVERT TO A NEGATIVE WORD COUNT.
      SSA,RSS       IF CHARACTERS--SKIP: ALREADY CONVERTED. 
      CMA,INA       VERIFY THAT THE 
      ADA SAVB       SPECIFIED LENGTH IS
      SSA             CONTAINED WITHIN RECEIVED BUFFER; 
      JMP ERIO1        ELSE, IT'S A PARAMETER ERROR!
* 
      JSB #RSAX     GO TO  THE
      DEF *+4        TCB MANAGEMENT ROUTINE 
      DEF D5          TO SEARCH FOR 
      DEF RQBUF+1      THE CURRENT REQUEST
      DEF RQBUF         ON <EXECM'S> STREAM.
      SSB,INB       IF THE TCB EXISTS, POINT TO 2ND WORD; 
      JMP CLNP0      ELSE, CLEAN UP: NOTHING MORE POSSIBLE! 
* 
      LDA D16       ALLOW A 20 MINUTE TIMEOUT 
      JSB STORE      FOR THE WRITE-READ REQUEST.
      JMP REQUE     GO TO RE-QUEUE THE REQUEST. 
* 
      SKP 
* * * NOTE: THIS PROCESSOR MAY BE REPLACED BY A SIMPLE, EXPEDIENT,         #
* * *       RE-QUEUEING OF THE CLASS-READ REQUEST, IF THE APPROPRIATE      #
* * *       DATA BUFFER IS ALLOCATED BY <QUEUE>, UPON ENTRY OF THE         #
* * *       REQUEST INTO THE LOCAL NODE.                                   #
*                                                                          #
CLSRD LDA RQBUF+5   GET THE CALLER'S CONTROL WORD.         #
      IOR ZBIT      INCLUDE DOUBLE-BUFFER SPECIFICATION.   #
      STA RQBUF+5   RESTORE MODIFIED CONTROL WORD.         #
*                                                                          #
      JSB EXEC      CALL 'EXEC'                            #
      DEF *+8        TO PERFORM                            #
      DEF D17N        A CLASS-READ.                        #
      DEF RQBUF+5   SPECIFY: CALLER'S CONWORD              #
      DEF *                  DUMMY READ BUFFER             #
      DEF RQBUF+6            READ-BUFFER LENGTH            #
      DEF RQBUF              REQUEST-BUFFER ADDRESS        #
      DEF SAMLN              REQUEST-BUFFER LENGTH         #
      DEF RDCLS              <EXECM'S> CLASS--NO WAIT.     #
      JMP ERRTN     SYSTEM-DETECTED ERROR--TELL CALLER!    #
*                                                                          #
      SZA           IF THE REQUEST WAS NOT PROPERLY QUEUED,#
      JMP ERDS8       THEN, TELL CALLER: RESOURCE PROBLEM; #
      JMP CLNP0        ELSE, CLEAN UP & AWAIT COMPLETION   #
*                                                                          #
*  READ/WRITE/CONTROL CLASS-COMPLETION PROCESSING 
* 
RWCMP CPB D3        IF IT IS A CONTROL REQUEST, 
      JMP FINIS      THEN GO TO PREPARE THE REPLY. [<E>=0]
      LDA RQBUF+5   GET THE CALLER'S CONTROL WORD.
      ALF,ELA       POSITION WRITE-READ BIT(#11) TO <E>.
      LDA RQBUF+6   GET THE CALLER'S DATA-LENGTH VALUE. 
      CPB D1        IF A 'READ' HAS COMPLETED, THEN 
      JMP LENCK      GO TO PROCESS THE REPLY DATA-LENGTH. 
      CLB,SEZ,CLE,INB,RSS  IF NORMAL WRITE-COMPLETION,
      JMP FINIS             GO TO PREPARE THE REPLY.
* 
      STA BL/CP     WRITE-READ: SAVE READ LENGTH FOR <#REQU>, 
      STB RCODE      AND INITIALIZE 'RCODE' FOR 'CONWP'.
      JSB CONWP     GO TO PREPARE CONTROL WORD FOR <#REQU>. 
      JMP REQUE     RE-QUEUE AS 'READ' FOR SPECIFIED DEVICE.
* 
LENCK LDB SAVB      GET THE TRANSMISSION LOG: +CHARS/+WORDS 
      CLE,SSA,RSS   IF CHARACTERS WERE SPECIFIED, SKIP; 
      JMP SETLN      ELSE, GO TO SAVE THE WORD COUNT. 
      SLB,BRS       CONVERT CHARACTER COUNT TO WORDS, AND 
      INB            IF ODD ADD ONE TO THE WORD COUNT.
SETLN STB BL/CP     SAVE THE REPLY DATA-LENGTH FOR <#REQU>. 
* 
FINIS LDA SAVA      GET EQT5 STATUS WORD. 
      AND BIT14     ISOLATE THE "DRIVER-REJECT" BIT(#14). 
      CLE,SZA       IF THE DRIVER REJECTED THE REQUEST, 
      JMP ERIO7      THEN INFORM CALLER OF ERROR: "IO07"; 
      DLD SAVA        ELSE, GET THE REGISTERS FOR CALLER. 
      JMP DONE      GO COMPLETE THE REPLY.[<E>=0: NO ERRORS]
* 
      SKP 
* RE-QUEUEING PROCESSOR: CONSERVE ALREADY-ALLOCATED SYSTEM RESOURCES
*  BY RE-QUEUEING THE REQUEST AS A CLASS-I/O REQUEST FOR A DEVICE.
* 
REQUE JSB #REQU     CALL <#REQU>, TO MOVE 
      DEF *+7        THE CURRENTLY-QUEUED REQUEST 
      DEF SAVCL       FROM <EXECM'S> CLASS, TO THE DEVICE;
      DEF SAVCL        WITH COMPLETION REPORTED TO <EXECM>. 
      DEF RQBUF+5   SPECIFY: DEVICE LOGICAL UNIT NUMBER 
      DEF CONWD              CONFIGURED CONTROL WORD
      DEF XPRIO,I            <EXECM'S> PRIORITY LEVEL 
      DEF BL/CP              BUFFER LENGTH/CONTROL PARAMETER
* 
      SSA,RSS       IF THE RE-QUEUEING WAS SUCCESSFUL,
      JMP GET        THEN, GO TO AWAIT COMPLETION;
      JMP ERDS8       ELSE, REPORT: RESOURCE ERROR! 
* 
* THE 'CONWP' SUBROUTINE PREPARES THE ACTUAL CONWORD WHICH IS TO BE 
* PASSED TO THE DEVICE DRIVER. THE CONWORD WILL INCLUDE ALL ITEMS 
* WHICH <RTIOC> NORMALLY CONFIGURES: 'T'-FIELD[BITS#15,14-ADDED BY #REQU],
* SUB-CHANNEL(BITS#13,5-2),SUBFUNCTION(BITS#10-6),RCODE(BITS#1-0).
* [THIS PROCESSOR IS REQUIRED, DUE TO THE LACK OF ACCESS TO <RTIOC'S> 
*  'WORD2' PROCESSOR].
* 
CONWP NOP           ENTRY/EXIT: CONTROL WORD PREPARATION
      LDA RQBUF+5   GET THE CALLER-SUPPLIED CONWORD.
      AND B3700     ISOLATE SUBFUNCTION(BITS#10-6)
      STA CONWD     SAVE THEM, TEMPORARILY. 
      JSB DRTEQ     GO TO GET THE 
      DEF *+3        LU-LOCK & SUB-CHANNEL BITS 
      DEF RQBUF+5     FOR THE SPECIFIED 
      DEF DRTEN        LOGICAL UNIT NUMBER. 
      SSB,RSS       IS IT AN INVALID LOGICAL UNIT,
      SZB,RSS        OR IS IT LINKED TO THE 'BIT BUCKET'? 
      JMP ERIO2       YES, TELL CALLER: LOGICAL UNIT ERROR! 
      AND B3700     IF THE LOGICAL UNIT 
      SZA            IS CURRENTLY LOCKED, 
      JMP ERDS8       THEN REJECT THE REQUEST: 'DS08'.
* 
      ADB D4        POINT TO FIFTH WORD OF THE EQT ENTRY. 
      LDB B,I       GET THE EQT'S STATUS WORD.
      RBL,CLE,SLB   IF BIT #15 IS SET, THEN IT'S BUSY,
      JMP *+3        OR AWAITING A DMA CHANNEL--CONTINUE; 
      SSB             ELSE, IF THE DEVICE IS DOWN, THEN 
      JMP ERDS8        REJECT THE REQUEST: RESOURCE PROBLEM!
* 
      LDA DRTEN     GET THE DRT ENTRY, AGAIN. 
      AND B174K     ISOLATE SUB-CHANNEL BITS FROM DRT ENTRY.
      ELA,ALF       POSITION MSB TO <E>, AND
      RAL,RAL        POSITION LSB'S TO BITS #5-2. 
      IOR CONWD     INCLUDE THE CALLER'S SUBFUNCTION, AND 
      SEZ            IF THE SUB-CHANNEL MSB WAS SET, THEN 
      IOR B20K        SET BIT #13 OF THE CONWORD, ALSO. 
      IOR RCODE     INCLUDE CALLER'S REQUEST CODE, AND
      STA CONWD       SAVE THE CONWD FOR USE BY <#REQU>.
      JMP CONWP,I   RETURN. 
* 
*     PROGRAM SCHEDULE, TIMED EXECUTION, AND PROGRAM COMPLETION 
* 
PKILL EQU *         PROGRAM TERMINATION.                RC=6
* 
SCHED JSB PSTAT     GO TO GET PROGRAM STATUS.       RC=10,12
      SZA           ANY ATTEMPT TO
      CPA XEQT       REMOTELY CONTROL <EXECM> 
      JMP ERSC5       IS UN-ACCEPTABLE! ERROR: "SC05".
* 
      LDB RCODE     GET THE REQUEST CODE. 
      CPB D6        PROGRAM TERMINATION REQUEST?
      JMP *+2        YES. SKIP TO DETERMINE LINEAGE.
      JMP SCHD0      NO. IT'S A NORMAL SCHEDULE REQUEST.
* 
      ADA D20       POINT TO WORD #21 IN I.D. SEGMENT.
      LDA A,I       GET THE CONTENTS. 
      AND B377      ISOLATE THE FATHER'S I.D. SEG. NO.
      ADA KEYWD     COMPUTE THE ADDRESS OF
      ADA DM1        THE KEYWORD TABLE ENTRY. 
      LDA A,I       GET THE FATHER'S I.D. SEGMENT ADDRESS.
      CPA XEQT      OUR OFFSPRING?
      JMP SCHD0      YES, WE CAN HONOR THE REQUEST. 
      JMP PASON      NO. <EXECW> MUST HAVE BEEN THE SIRE. 
* 
SCHD0 LDA SAMLN     GET THE REQUEST BUFFER SIZE.
      LDB RTNDF     GET THE DEFAULT RETURN POINTER. 
      ADA DM8       SUBTRACT THE MINIMUM REQUEST SIZE.
      ADB A         COMPUTE THE ACTUAL RETURN ADDRESS,
      STB RTNAD      AND CONFIGURE THE RETURN POINTER.
      SZA,RSS       ANY ADDITIONAL PARAMETERS?
      JMP SCHD2      NO. GO CLEAR REMAINDER OF CALL BUFFER. 
      SSA           WERE WE SUPPLIED WITH ENOUGH PARAMETERS?
      JMP ERSC1      NO. * ERROR: SC01 !
* 
      CAX            YES. SAVE ADDITIONAL PARAMETER COUNT.
      LDA PR3DF     <A>= ADDRESS OF NEXT USER-PARAMETER 
      LDB RTNDF     <B>=ADDRESS OF NEXT CALL-BUFFER LOCATION. 
SCHD1 STA B,I       STORE PARAM ADDR INTO CALL BUFFER.
      INA           ADVANCE PARAMETER POINTER.
      INB           ADVANCE CALL BUFFER POINTER.
      DSX           ALL PARAMETERS PROCESSED? 
      JMP SCHD1      NO. PROCESS THE NEXT ONE.
* 
      CLA           PREPARE TO CLEAR REST OF CALL BUFFER. 
SCHD2 CPB LASTA     LAST CALL BUFFER LOCATION CLEARED?
      JMP SCHD3      YES. GO TO COMPLETE THE CALL.
      STA B,I        NO. CLEAR THE LOCATION.
      INB           ADVANCE THE CALL BUFFER POINTER, AND
      JMP SCHD2      GO TO CLEAR THE NEXT LOCATION. 
* 
      SKP 
SCHD3 LDA STRAD+1   GET THE STRING-SIZE POINTER--IF ANY.
      SZA,RSS       PASSING A STRING TO THE PROGRAM?
      JMP SCHD4      NO. BYPASS DATA BUFFER RECOVERY. 
      LDA SAVB       YES. GET THE DATA BUFFER SIZE. 
      CAX           SAVE COUNT FOR POSSIBLE DMS MOVE. 
      CMA,INA,SZA,RSS FORM A NEGATIVE VALUE. ANY DATA?
      JMP ERSC2        NO--IMPROPER PARAMETERS! 
* 
      LDB D512      GET MAXIMUM DATA BUFFER SIZE. 
      ADB A         IF THE TRANSMITTED DATA BUFFER
      SSB            EXCEEDS THE ALLOWABLE SIZE,
      JMP ERSC2       THEN THE REQUEST CANNOT BE PROCESSED! 
* 
      ADA SAMAD     COMPUTE DATA BUFFER ADDRESS IN S.A.M. 
      LDB DABFA     GET THE LOCAL DATA BUFFER ADDRESS.
      STB STRAD     ESTABLISH STRING-BUFFER ADDRESS IN CALL.
DMS4  MVW SAVB      MOVE DATA TO LOCAL BUFFER [DMS: MWF]. 
* 
SCHD4 DLD ERRIN     LOAD THE ERROR-DETECTION INSTRUCTIONS.
      DST RTNAD,I   STORE THEM AT END OF CALLING SEQUENCE.
* 
* THE CONFIGURED 'EXEC' CALLING SEQUENCE IS EXECUTED BELOW. 
* 
      JSB EXEC      BUFFER FOR ASSEMBLING EXEC REQS.
RTNAD DEF PR3AD     RETURN POINTER (CONFIGURED).
      DEF RQBUF+4   REQUEST CODE (SUPPLIED BY CALLER) 
      DEF RQBUF+5   POINTER TO FIRST REQUEST PARAMETER. 
PR3AD NOP           CONFIGURED POINTERS (7-MAX.) TO 
      NOP            USER-SUPPLIED CALLING-PARAMETERS,
      NOP             WHICH RESIDE IN THE REQUEST BUFFER. 
      NOP           UN-USED CALLING-SEQUENCE LOCATIONS ARE
      NOP            DYNAMICALLY CHANGED TO 'NOP'.
STRAD NOP           STRING-BUFFER ADDRESS--IF ANY.
      NOP           STRING-LENGTH POINTER--IF ANY.
      NOP           [ ERROR-DETECTION INSTRUCTIONS: WILL BE 
      NOP             POSITIONED TO FOLLOW LAST POINTER ] 
ENDBF JMP DONE      REQUEST COMPLETED. <E>=0:NORMAL;=1:ERROR
* 
      SPC 2 
* 
*     TIME REQUEST PROCESSING                                          RC=11
* 
STIME LDA D13       GET THE REPLY SIZE. 
      STA RPLYL     SET THE REPLY LENGTH
* 
      JSB EXEC      REQUEST CURRENT SYSTEM TIME.
      DEF *+4 
      DEF RQBUF+4   RCODE = 11 (SIGN IS SET). 
      DEF RQBUF+7   TIME IS RETURNED TO REPLY BUFFER. 
      DEF RQBUF+12  SO IS THE YEAR. 
      CCE           RETURN ERROR-INFO TO THE CALLER!
      JMP DONE      ALL IS WELL--RETURN THE TIME DATA.
* 
      SKP 
*     I/O OR PARTITION STATUS-REQUEST PROCESSING
* 
PARST EQU *                                            RC=25
ISTAT LDA D10       GET THE REPLY SIZE.                RC=13
      STA RPLYL     SET THE LENGTH OF THE REPLY 
* 
      JSB EXEC      REQUEST STATUS FOR THE I/O DEVICE.
      DEF *+6 
      DEF RQBUF+4   RCODE = 13/25 (SIGN IS SET).
      DEF RQBUF+5   CONWORD(LU) / PARTITION NUMBER
      DEF RQBUF+7   RETURN- RC=13: EQT#5 / RC=25: FIRST PAGE
PR3DF DEF RQBUF+8   RETURN- RC=13: EQT#4 / RC=25: NO. PAGES 
      DEF RQBUF+9   RETURN- RC=13: LU STAT/RC=25: PART. STAT
      CCE           'EXEC' ERROR-INFO RETURNED TO CALLER. 
      JMP DONE      RETURN TO CALLER WITH STATUS INFO.
      SPC 1 
PASON LDA RQBUF    GET THE STREAM WORD   RC=6,9,23,24<EXECW>
      XOR D6       CONVERT TO STREAM-3 <EXECW>. 
      LDB SAMAD    GET REQUEST BUFFER ADDRESS IN S.A.M. 
      JSB STORE    GO TO REPLACE STREAM TYPE IN CLASS BUFFER. 
      JSB CLTCB    GO TO CLEAR RECORD FROM <EXECM'S> STREAM.
      LDB SAMAD    POINT TO THE SECOND WORD OF THE REQUEST
      CLE,INB       BUFFER IN S.A.M. [<E>=0:PASS TO <#GRPM>]
      JSB STORE    REPLACE THE ORIGINAL SEQUENCE NUMBER.
* 
LOCAL LDA #GRPM     DESTINATION CLASS IS <#GRPM'S>,        #
      SEZ            UNLESS THIS IS A DS/3000 REPLY,       #
      LDA #RPCV       IN WHICH CASE, IT'S <#RPCV'S> CLASS. #
      STA CLTCB     ESTABLISH THE DESTINATION CLASS NUMBER.#
      LDA RQBUF     GET THE STREAM WORD.                   #
      AND BIT14     ISOLATE THE REPLY FLAG(BIT#14)         #
      SZA,RSS       IS THIS A REPLY, OR A FORWARD PASS?    #
      JMP LOCRQ      FORWARD PASS: SET PLAY IN MOTION.     #
* 
      LDB CLTBA,I    REPLY: GET CLASS HEADER ADDRESS.      #
      ADB D2        POINT TO THE THIRD WORD.               #
      LDA FAKST     GET FAKE DVA65 STATUS (32401B) FOR GRPM#
      JSB STORE     REPLACE STATUS WORD IN CLASS HEADER.   #
      ADB D3        ADVANCE POINTER TO WORD #6.            #
      LDA BL/CP     GET THE REPLY DATA LENGTH.             #
      JSB STORE     REPLACE THE TRANSMISSION LOG IN HEADER.#
      INB           ADVANCE POINTER TO FIRST OPT. PARAMETER#
      LDA RPLAD     GET THE NEW REPLY-BUFFER ADDRESS.      #
      JSB STORE     REPLACE THE FIRST OPTIONAL PARAMETER.  #
      INB           ADVANCE POINTER TO SECOND OPT. PARAM.  #
      LDA RPLYL     GET THE REPLY LENGTH.                  #
      JSB STORE     REPLACE THE SECOND OPTIONAL PARAMETER. #
* 
LOCRQ JSB #REQU    RE-QUEUE 
      DEF *+3       THE REQUEST 
      DEF SAVCL      FROM <EXECM'S> CLASS 
      DEF CLTCB       ONTO THE DESTINATION CLASS. 
      SSA,RSS      IF THE OPERATION WAS SUCCESSFUL, 
      JMP GET       GO TO AWAIT NEXT REQUEST/COMPLETION;
      JMP CLNP0      ELSE, SIMPLY CLEAN UP--WHAT ELSE?
* 
*  THE FOLLOWING PROGRAM-STATUS REQUEST PROCESSING IS SUPPORTED 
*  >>>>>>>>>>>>>>>> IN DS/1000 NETWORKS--ONLY! <<<<<<<<<<<<<<<< 
* 
PGMST JSB PSTAT    GO TO GET THE PROGRAM'S STATUS.     RC=99
      SZA          DOES THE PROGRAM EXIST?
      JMP GETST     YES. GO TO PROCESS THE STATUS.
      CCA           NO. SET <A>=-1 FOR ERROR INDICATION!
      JMP RTNER    GO TO RETURN THE ERROR INFORMATION.
* 
GETST LDA B        GET THE STATUS WORD. 
      AND D15      ISOLATE THE STATUS.
      RAL,ERA      INCLUDE THE 'SEGMENT' FLAG.
RTNER STA RQBUF+7  SAVE FOR RETURN TO THE CALLER. 
      LDB D8       ESTABLISH A
      STB RPLYL     REPLY LENGTH OF 8 WORDS.
      CLB,CLE      <B> =0 FOR RETURN TO CALLER. 
      JMP DONE     RETURN THE INFO TO THE CALLER. 
                                                                                                                                                        