ASMB,R,L,C
* 
*     NAME:   CLASS 
*     SOURCE: 92071-18093 
*     RELOC:  92071-16093 
*     PGMR:   E.J.W.,C.H.W.,N.J.S.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
* 
      NAM CLASS,0  92071-16093  REV.2041  800902
* 
* 
* 
      ENT $I.CL,$C.CL,$G.CL,$F.CL 
      ENT $$CLA,$.CLA 
* 
      EXT $IDNO,$LIST,$XEQ,$BLIM,.MWI,.MWF
      EXT $SCHD,$RTN,$ERAB,$ABRQ,$UNLK,$RTSM,$VBUF
      EXT $CLTA,$ROM,$XQT,$SUSP,$A,$B 
      EXT .CAX,.CBX,.XSA
      EXT $DV6,$DV8 
      EXT $RQRT,$RQP1,$RQP2,$RQP3,$RQP4,$RQP5 
      EXT $RQP6,$RQP7,$RQP8,$RQCT 
      EXT $RQ.1,$RQ.2,$RQ.3,$RQ.4,$RQ.5 
      EXT $RQ.6,$RQ.7,$RQ.8,$RQ.9 
      SPC 1 
* 
A     EQU 0 
B     EQU 1 
      HED ** RTE-L CLASS I/O MODULE  -  INITIATION CALL **
* 
* 
*     CLASS I/O  ALLOCATE CLASS FROM HIGH END OF TABLE
*                IF HE DID NOT SPECIFY A CLASS. 
* 
*      LDA WORD2     (A) = CONTROL WORD 
*      LDB T2        (B) = PRIORITY 
*      JSB $I.CL     CALL FROM IOC MODULE 
*      (RTN)   P+1: PENDING COUNT AT MAX
*      (RTN)   P+2: DO RETHREAD 
*      (RTN)   P+3: B=ADDR OF CLASS ENTRY 
* 
$I.CL NOP           CALLED BY $MIO MODULE 
      STA TEMP1     SAVE CONWD
      STB TEMP2     SAVE PRIORITY 
      CLA 
      STA $A,I      A=0 FOR INIT.GOOD RETURN
      STA NEWCL 
      STA NEWC2 
      CLB,INB 
      CPA $RQP7     IF NO CLASS WORD IN REQ,
      JMP ERRIO      FLUSH IT OUT (IO01). 
      LDA $RQ.7     GET CLASS WORD
      AND B377      MASK TO THE CLASS DEF.
      SZA           IF SUPPLIED 
      JMP L.4       SKIP ALLOCATION CODE
* 
* 
*     ALLOCATE A CLASS FROM THE HIGH END OF THE TABLE 
* 
      LDA B160K     GET BITS 15,14, & 13 FROM 
      AND $RQ.7      USER'S CLASS WORD
      STA SECCD 
      LDB $XQT      GET ID SEG ADDR 
      JSB $IDNO      CONVERT TO ID #
      STA TEMP0     SAVE ID # 
      AND B37        FOR USE AS SECURITY CODE 
      ALF,ALF 
      IOR SECCD     FILL IN USER'S BIT15,14,13
      STA $RQ.7      FOR RETURN AS CLASS NUMBER 
* 
      LDB $CLTA,I   GET THE LENGTH OF THE TABLE 
      SZB,RSS       IF NO CLASSES DEFINED 
      JMP ERRIO      REJECT THE CALL
      ADB $CLTA     ADD THE TABLE ADDRESS 
      CLA,CCE 
* 
L.1   CPA 1,I       IS THE ENTRY FREE (0)?
      JMP L.3        YES, GO USE IT 
      ADB N1         NO, STEP TO NEXT ONE 
      CPB $CLTA     END OF TABLE? 
      CCA,RSS       YES SKIP (A = -1) 
      JMP L.1       NO - GO TEST NEXT ONE.
* 
      STA $A,I      SET REASON FOR REJECT IN A REG. 
      LDA $CLTA     SET A=CLASS TABLE ADDR
      LDB $RQ.7      FOR L.8 IN CASE OF SUSPEND 
      SSB,RSS       NO-WAIT REQUESTED?
      JMP L.8        YES, SUSPEND UNTIL CLASS AVAILABLE 
* 
L.2   LDA $RQRT     UPDATE THE
      STA $SUSP,I    RETURN ADDR
      JMP $XEQ        & EXIT
* 
L.3   LDA $CLTA 
      CMA,INA 
      ADA 1         COMPUTE RELATIVE POSITION 
      IOR $RQ.7      ADD SECURITY CODE AND USER BIT 
      STA $RQ.7     RETURN NEW CLASS WORD TO USER 
      AND B174C     GET SECURITY CODE FOR CLASS QUEUE-HEAD
      RAL,ERA        SET THE ALLOCATED BIT
      STA B,I       PUT INTO CLASS QUEUE
      STB NEWCL     SAVE ADDR OF NEW CLASS ENTRY
      ADB $CLTA,I   POINT TO CLASS TBL WD #2
      LDA TEMP0     GET SEG ID # OF CALLER
      STA 1,I       ASSIGN OWNERSHIP
      STB NEWC2     SAVE ADDR FOR POSSIBLE CLEAN-UP 
* 
L.4   LDA $RQ.7     GET CLASS 
      JSB VERFY     VERIFY/SET-UP CLASS 
* 
      LDA CLSAD 
L.45  STA B         SET B TO ADDR OF QUEUE ENTRY
      LDA B,I 
      CLE,SSA,RSS   A POINTER?
      JMP L.45       YES, TRACE IT MORE 
* 
      JSB SECCK     CHECK SECURITY CODE 
      LDA 1,I       GET CLASS WORD
      AND B377      ISOLATE PENDING COUNT 
      CPA B377      FULL? 
      JMP $I.CL,I    YES
      ISZ $I.CL 
      LDA $RQCT     # OF PRAMS IN EXEC CALL 
      ADA N7        SET E IF 8 OR MORE PRAMS
      LDA CLASS     GET BIT 13 OF CLASS WD
      RAL,RAL       MOVE "RETHREAD" TO BIT15
      SEZ,SSA       RETHREAD BIT & 2ND CLASS SPECIFIED? 
      JMP L.5        YES, TREAT AS A RETHREAD 
* 
      ISZ $I.CL 
      JMP $I.CL,I   RETURN, B HAS ADDR OF CLASS WORD
      SKP 
*  RETHREAD, 1ST VERIFY PREVIOUS CLASS
L.5   STB TEMP      SAVE ADDR OF CLASS WORD 
      CLA 
      LDA $RQ.8     GET OLD CLASS 
      JSB VERFY     VERIFY IT 
      SSA           COMPLETED BUFFER ON CLASS?
      JMP ERR04      NO, ERROR
      LDB 0 
      LDA 0,I 
      SSA,RSS       CLASS WD? 
      JMP *-2        NO, TRACK IT DOWN
      JSB SECCK     CHECK SECURITY CODE 
      STB TMP8      SAVE ADDR OF HDR
      INB 
      LDA TEMP1     NEW CONWD 
      XOR 1,I 
      ALF,SLA       WAS "Z" BIT CHANGED?
      JMP ERR04      YES, THAT'S UNACCEPTABLE 
      INB 
      STB TEMP9     SAVE ADDR OF HDR WD 3 (PRAM1) 
      ADB .2
      STB TEMP0     SAVE ADDR OF HDR WD 5 (PRAM3) 
      ADB .3
      LDA 1,I       GET TOTAL BLOCK SIZE OUT OF WD 8
      ADA TMP8      POINT TO END OF BLOCK+1 
      STA TEMP6     SAVE FOR SIZE CHECKS
      LDA TEMP1 
      ALF,SLA       Z-BIT SET?
      RSS            YES
      JMP L.52      NO, SKIP Z LEN CHECK
*  VERIFY CTL BUFFER LENGTH NOT > THAN ORIGINAL 
      LDA $RQ.6     USERS "Z" LENGTH
      LDB TEMP0,I   GET Z BUFFER ADDR IN SAM
      JSB SIZCK     CHECK SIZE OF Z BUF OVERWRITE 
      LDA TEMP4 
      STA TEMP5     SAVE LEN FOR Z BUFR MOVE
      STB TEMP6     REDEFINE END OF DATA BUFR 
* 
L.52  LDA $RQ.1     USERS REQUEST CODE
      RAR 
      SSA,SLA       IS THIS A CLASS CONTROL RETHREAD? 
      JMP L.9        YES, BYPASS DATA BUFFER CK/MOVE
*  VERIFY DATA BUFFER LENGTH NOT > THAN ORIGINAL
      LDA $RQ.4     USERS LEN 
      SZA,RSS       ANY OVERWRITE?
      JMP L.6        NO, LEAVE BUFFER/LENGTH IN TACT
      LDB TEMP9,I   GET DATA BUFFER ADDR IN SAM 
      JSB SIZCK     CHECK SIZE OF DATA OVERWRITE
*  NOW RECOMPUTE SIZE OF DATA BUF SINCE "XLOG" MAY
*  BE IN POSITIVE BYTES 
      LDA TEMP4     GET LENGTH OF TRANSFER
      JSB .CAX       TO .X. 
      LDA $RQP3     ADDR OF USER'S BUFFER 
      JSB .MWF      OVERWRITE PART/ALL OF CLASS DATA BUFFER 
* 
      ISZ TEMP9     POINT TO DATA LENGTH IN HEADER
      LDA $RQ.4     GET USER'S LENGTH 
      STA TEMP9,I   UPDATE DATA LENGTH
      CLA 
* 
*  RETHREAD ACCEPTED, SO DO IT
L.6   STA $A,I      SET USER'S A REG
      LDA TEMP1     PASSED CONWD
      IOR B1400     SET "TY"=3
      ISZ TMP8
      STA TMP8,I    STORE IN CLASS HDR
      ALF,SLA       "Z" BIT SET?
      JMP L.7        YES, DON'T OVERRIDE PARMS
      LDA $RQ.5      NO, PICK-UP PASSED 
      LDB $RQ.6       OPT PARMS & 
      DST *            STORE THEM IN CLASS HEADER 
TEMP0 EQU *-1 
      JMP L.75      SKIP Z BUFFER MOVE SECTION
*  MOVE IN NEW "Z" BUFFER 
L.7   LDB TEMP0,I   POINT TO CTL BUFFER IN BLOCK
      LDA TEMP5     GET LENGTH OF TRANSFER
      JSB .CAX       TO .X. 
      LDA $RQP5     USERS CTL BUFFER ADDR 
      JSB .MWF      OVERWRITE ALL/PART/NONE OF Z BUF
* 
L.75  LDB TEMP0 
      ADB .2
      LDA TEMP2     PRIORITY
      STA 1,I       STORE IN 7TH WD 
      INB           POINT TO TOTAL SAM BLOCK SIZE 
      LDA 1,I 
      ADA $DV8,I    UPDATE BUFFER ACCUMULATOR 
      STA $DV8,I     ON NEW DVT 
      INB 
      LDA $RQ.7     GET NEW CLASS WD
      STA 1,I       STORE IN WD 9 
      ADB N8        POINT TO START
      ISZ TEMP,I    BUMP PENDING COUNT
      LDA 1,I 
      STA CLSAD,I   UNLINK BUFFER FROM OLD CLASS
      JMP $I.CL,I   RETURN
* 
L.8   LDB $XQT      ID SEG ADDR 
      JSB $LIST     PUT PROGRAM IN SUSPEND LIST 
      OCT 52         UNTIL CLASS RESOURCE AVAILABLE 
      JMP $XEQ      EXIT
* 
L.9   LDB $RQ.4     GET OPT PARAM # 2 
      LDA $RQ.3     GET OPT PARAM # 1 
      DST *         STORE IN HDR WORDS 3 & 4
TEMP9 EQU *-1 
      LDA $RQ.7     GET NEW CLASS 
      AND B.017      BITS 12-0
      JMP L.6       FINISH RETHREAD, RTN CLAS IN (A)
      SPC 3 
*  ROUTINE TO TO CHECK THAT RETHREAD DOESNT TRY TO OVERLAY MORE 
*  WORDS THAN THE ORIGINALLY ALLOCATED BUFFER SIZE
SIZCK NOP 
      SSA,RSS 
      JMP *+3       ALREADY A POSITIVE LENGTH 
      ARS 
      CMA,INA       CONVERT BYTES TO +WORDS 
      STA TEMP4     SAVE FOR MVW
      ADA 1         ADD BUFFERS ADDRESS 
      CMA,INA 
      ADA TEMP6     LAST WD+1  - LAST OVERWRITTEN+1 
      SSA,RSS       SIZE TOO LARGE? 
      JMP SIZCK,I    NO, SIZE OK SO RETURN
      JMP ERR04      YES, HE BLEW IT
      SPC 3 
* 
SECCD NOP 
CLASS NOP 
B174C OCT 17400     BITS 8-12 
N1    DEC -1
N7    DEC -7
N8    DEC -8
N10   DEC -10 
N12   DEC -12 
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.7    DEC 7 
.9    DEC 9 
.10   DEC 10
B37   OCT 37
B377  OCT 377 
B.017 OCT 17777 
B1400 OCT 140000
      SKP 
      HED ** RTE-L CLASS I/O MODULE  -  COMPLETION CALL **
*     CLASS REQUEST COMPLETION
* 
*     CLASS COMPLETION IS HANDLED AS FOLLOWS: 
* 
*     1.  THE EXCESS BUFFER IS RETURNED ON WRITE COMPLETION 
*         UNLESS "SAVE BUFFER" WAS SET
*     2.  IF THE CLASS QUEUE IS NOT EXPECTING A REQUEST 
*         THE WHOLE BUFFER IS RELEASED AND WE EXIT. 
*     3.  IF A PROGRAM IS WAITING FOR THE REQUEST IT IS 
*         RESCHEDULED.
*     4.  THE REQUEST IS MODIFIED TO PUT THE STATUS WORD
*         AND THE TRANSMISSION LOG (TLOG) IN WORDS
*         7 (PRIORITY) AND 4 (USER LENGTH WORD) 
*     5.  THE CLASS QUEUE IS UPDATED AND WE EXIT. 
* 
*     SEE DESCRIPTION OF CLASS QUEUE IN COMMENTS AT BEGINNING 
*     OF SECTION ON USER REQUESTS.
* 
*     LDA TLOG           (A) = TRANSMISSION LOG 
*     LDB PTR            (B) = CLASS QUEUE POINTER
*     JSB $C.CL           CALL FROM $MIO
*     <RETURN>           RETURN 
* 
* 
* 
$C.CL NOP 
      STA TEMP6     SAVE TRANSMISSION LOG 
      STB HEAD      SAVE QUEUE ADDR 
      ADB .7        POINT TO BUFFER SIZE
      STB TEMP5     SAVE ADDR 
      LDB 1,I       GET SIZE
      JSB $BLIM     ADJUST BUFR ACCUM & TEST B.L. 
      LDB TEMP5 
      INB 
      LDA 1,I       GET CLASS WD FROM BLOCK 
      ADB N7        POINT TO CONWD
      STA TEMP4     SAVE CLASS
      RAL,ELA       E=BIT 14
      LDA B,I       GET THE CON WORD
      SEZ,RSS       IF "SAVE" BUFFER SET
      SLA            OR IF A READ,
      JMP C.04      SKIP BUFFER DEALLOCATE
* 
      LDA TEMP5,I   GET BLOCK SIZE TO A.
      ADA N12       IF LESS THAN 2 WDS WILL BE LEFT 
      SSA            THEN SKIP
      JMP C.04        THE RETURN OF SAM 
      ADA .2
      STA TEMP2     SAVE LENGTH FOR RETURN
* 
      ADB .9        STEP TO RETURN BUFFER ADDRESS 
      STB TEMP1     SET THE BUFFER ADDRESS
      JSB $RTN      RETURN THE WRITE BUFFER 
TEMP1  NOP           BUFFER ADDRESS 
TEMP2  NOP           BUFFER LENGTH
* 
      LDA .10       SET BLOCKSIZE= HEADER LEN 
      STA TEMP5,I 
* 
C.04  LDA TEMP4     GET THE CLASS 
      JSB SETCA     SETUP CLASS ENTRY ADDRS 
* 
      JSB PENDG     DECR.PENDING CNT
      SEZ           FLUSH FLAG SET? 
      JMP C.09       YES
      LDA CLSAD 
      LDB TMP8,I    GET CONTENTS OF CLASS HEAD
      RBL,CLE,ELB   IF PROGRAM WAITING
      SEZ,RSS 
      JMP C.05      SKIP,ELSE GO LINK IN THE RQ.
* 
*     PROGRAM IS WAITING, CLEAR THE WAIT FLAG 
*     AND RESCHEDULE THE PROGRAM
* 
      RBR,RBR       CLEAR THE WAIT FLAG 
      STB A,I       AND RESET IN THE QUEUE. 
      JSB $SCHD     SCHEDULE ANY PROGRAMS WAITING 
      OCT 52
* 
C.05  LDB TMP8,I    GET CLASS ENTRY 
      STB HEAD,I    SET IN NEW END OF LIST
      LDB HEAD      SET NEW ELEMENT IN
      STB TMP8,I    THE LIST. 
* 
      ADB .3        POINT TO 4TH WD OF HDR
      LDA TEMP6     TRANSMISSION LOG
      STA 1,I        OVERLAYS BUFFER LENGTH 
      ADB .3        POINT TO 7TH WD OF HDR
      LDA $DV6,I    DVT STATUS
      STA 1,I        OVERLAYS PRIORITY
      JMP $C.CL,I   RETURN TO $MIO MODULE 
* 
C.09  LDB TEMP5,I   GET BUFFER SIZE 
      STB TEMP4 
      JSB $RTN      RTN SAM 
HEAD  NOP 
TEMP4 NOP 
      JMP $C.CL,I   RETURN
      SKP 
      HED ** RTE-L CLASS I/O MODULE  -  GET CALL ** 
*     $G.CL IS THE ENTRY POINT FOR A 'GET' EXEC CALL
* 
*     JMP $G.CL     CALL FROM $MEX
* 
* 
$G.CL EQU * 
      CLA 
      STA NEWCL     ENSURE NO DEALC ON ERROR
      STA NEWC2 
      LDA $RQ.2     GET THE CLASS 
      JSB VERFY     VERIFY/SET-UP CLASS 
* 
      LDA $RQ.4     GET THE LENGTH
      SSA,RSS       POS WORDS?
      JMP *+3        YES
      ARS 
      CMA,INA       CONVERT -BYTES TO +WORDS
      STA TMP8           SAVE.
* 
      LDB $XQT      GET PROGRAM'S ID SEGMENT ADDRESS
      JSB $VBUF     MAKE SURE GET BUFFER
      DEF $RQP3,I    DOESN'T EXTEND BEYOND END
      DEF TMP8        OF PARTITION OF SYS COMMON
      JMP ERR04     ERROR BAD LENGTH
* 
* 
      LDB CLSAD,I   GET QUEUE HEAD
      SSB           IF A COUNTER
      JMP G.06      GO SUSPEND THE PROGRAM
* 
      STB PTR       SAVE THE ADDRESS
      INB           GET THE CON WORD
      LDA B,I       AND 
      AND .3        ISOLATE THE REQUEST CODE
      JSB .XSA       RETURN IT TO USER'S IRCLS
      DEF $RQP7,I 
      ADB .2        INDEX TO THE
      LDA 1,I        LOG AND SET IT IN
      STA $B,I        THE 'B' REG 
      INB           INDEX TO THE 1ST
      LDA 1,I        OPTIONAL WORD AND SET IT 
      JSB .XSA        IN THE USER'S BUFFER
      DEF $RQP5,I 
      INB           NOW DO THE
      LDA 1,I        2ND OPTIONAL 
      JSB .XSA        WORD
      DEF $RQP6,I 
      INB           STEP TO STATUS WORD 
      LDA B,I       GET COMPLETION STATUS.
      STA $A,I      AND SET IT IN THE A REG.
      INB           GET THE BUFFER LENGTH 
      LDA B,I       AND SET IT
      STA TEMP5     FOR RETURN
      INB           STEP TO USER CLASS WORD 
      LDA B,I       GET IT
      JSB SECCK     CHECK SECURITY CODE 
      INB 
      LDA 1,I       GET OPT. USER PARAMETER 
      JSB .XSA       & RETURN IT
      DEF $RQP8,I 
      STB TEMP4     SAVE THE BUFFER ADDRESS 
      LDA TEMP5 
      ADA N10       LOP THE HEADER LENGTH TO
      LDB 0         GET DATA LENGTH 
      CMA,INA       SET MOVE COUNT NEG
      ADA TMP8      USE LESSOR OF THE TWO COUNTS
      SSA           USE QUEUE COUNT IF SMALLER
      LDB TMP8
      SSB           IF COUNT LESS THAN ZERO THEN
      JMP G.05      THEN SKIP MOVE
* 
      ISZ TEMP4     STEP THE BUFFER ADDRESS.
      LDA TEMP4     (A)= SOURCE 
      JSB .CBX      GET LENGTH TO .X. 
      LDB $RQP3     (B)= DESTINATION
      JSB .MWI
* 
G.05  LDA $RQ.2     IF SAVE 
      RAL,RAL       QUEUE OPTION
      SLA,ELA       THEN
      JMP L.2       THEN EXIT 
* 
      LDA PTR,I     ELSE
      STA CLSAD,I   UPDATE THE LIST 
      SSA           IF POINTER, SKIP COUNT CHECK
      AND B377      GET # PENDING REQUESTS LEFT 
      SEZ,SZA,RSS    NO REQUESTS LEFT 
      STA CLSAD,I    AND IF DEALLOCATE WANTED, DO IT. 
      SEZ,SZA,RSS 
      STA CLSA2,I   2ND WORD AS WELL
      JSB $RTN      RETURN THE MEMORY 
PTR    NOP           AND
TEMP5  NOP           THEN 
      JMP G.08      SCHEDULE WAITERS AND EXIT 
* 
G.06  LDA 1 
      JSB SECCK     CHECK SECURITY CODE 
      RBL,CLE,ELB   MOVE BIT14 (SOMEONE WAITING) TO E 
G.065 LDA CLSAD,I   GET CLASS WORD
      AND B377
      CMA,SEZ       ANYONE WAITING? (SET ONES COMP) 
      JMP SCEDT      YES,SORRY SOMEBODY BEAT YOU TO IT
* 
      STA $A,I      SET A FOR POSSIBLE RTN (NON-POSITIVE) 
      INA           GET CORRECT 2'S COMPLEMENT
      STA B 
      LDA $RQ.2     GET THE OPTION FLAG 
      ELA,RAL       SET E=BIT15 NO-WAIT OPT.
      SZB,RSS       IF PENDING CNT= 0 
      SSA             AND BIT13 SET,
      JMP G.07        DON'T DEQUEUE 
* 
      STB CLSAD,I   IF Q-H=0 AND BIT14=0 DEQUEUE! 
      STB CLSA2,I 
G.08  LDA $CLTA     NOW SCHEDULE ALL THOSE WAITING
      JSB $SCHD      FOR AN AVAILABLE CLASS NUMBER. 
      OCT 52
      JMP L.2       RETURN
* 
G.07  CLA,SEZ,INA 
      JMP L.2       BIT15=1 FOR NO-WAIT. RETURN.
      RAR,RAR       1 INTO BIT 14 
      IOR CLSAD,I   SET "SOMEONE IS WAITING" FLAG 
      STA CLSAD,I    IN CLASS TABLE 
      LDA CLSAD     GET CLASS ADDR IN A FOR L.8 
      JMP L.8       PUT PGM INTO SUSPENSION 
* 
* 
SCEDT ERB,RBR       CLEAR THE BIT AND 
      STB CLSAD,I   RESET THE CLASS HEAD
      LDA CLSAD     GET HEAD ADDRESS TO A AND 
      JSB $SCHD     RESCHEDULE THE WAITER IF ANY
      OCT 52
      LDB .10 
      LDA $LIST 
      CLE,SZA       WAS THERE A WAITER? 
      JMP ERRIO      YES, DOUBLE REQ ON CLASS - ERROR 
      JMP G.065     NO. MUST HAVE BEEN ABORTED, CONTINUE
      SKP 
* 
*  SUBROUTINE TO VERIFY USER'S CLASS NUMBER 
*     ON RETURN, A&B HAVE CLASS TABLE VALUES
* 
VERFY NOP 
      STA CLASS     USER'S CLASS
      AND B174C     ISOLATE SECURITY CODE 
      STA SECCD 
      LDA CLASS 
      JSB SETCA     SETUP CLASS ENTRY ADDRS 
      CMA,CLE,INA,SZA,RSS NEGATE, WAS IT ZERO?
      JMP ERR00      YES, ERROR IO00
      ADA $CLTA,I   SET E IF CLASS IN RANGE 
      LDA CLSAD,I   GET CONTENTS OF ENTRY 
      LDB CLSA2,I   GET "FLUSH" FLAG
      SEZ,SZA       ALLOCATED AND WITHIN RANGE? 
      SSB            YES, SKIP IF NOT FLUSHING
      JMP ERR00      OTHERWISE GIVE IO00
      JMP VERFY,I   RETURN
      SPC 1 
* 
*  THIS SUBROUTINE DECREMENTS THE PENDING COUNT, AND
*  IF IT GOES TO ZERO AND THE "FLUSH" FLAG IS SET, THE
*  CLASS IS DEALLOCATED.  ON EXIT, E-REG=1 IF FLUSH SET.
* 
PENDG NOP 
      LDA CLSAD 
      STA TMP8
      LDA TMP8,I    CHASE THE CLASS LIST
      SSA,RSS       CLASS WORD FOUND? 
      JMP *-3        NO, KEEP GOING 
      ADA N1        DECREMENT PENDING COUNT 
      STA TMP8,I
      LDA CLSA2,I   GET 2ND WORD
      CLE,SSA,RSS   FLUSHING? 
      JMP PENDG,I    NO, RTN
      LDA TMP8,I
      AND B377      EXAMINE PENDING COUNT 
      SZA,RSS       MORE PENDING? 
      JSB CLRCL      NO, CLEAR CLASS, RESCHED WAITERS 
      CCE           FLAG FLUSH
      JMP PENDG,I 
* 
*SUBROUTINE TO CLEAR CLASS & SCHEDULE WAITERS FOR A CLASS # 
CLRCL NOP 
      STA CLSAD,I   A IS ZERO ON ENTRY
      STA CLSA2,I   CLEAR BOTH WORDS OF CLASS TABLE 
      LDA $CLTA     ADDR OF CLASS TABLE 
      JSB $SCHD     RESCHEDULE THOSE WAITING
      OCT 52         FOR A CLASS #
      JMP CLRCL,I 
* 
*  SUBROUTINE TO SET-UP ADDRESSES FOR CLASS TABLE ENTRY 
SETCA NOP 
      AND B377
      LDB 0         LEAVE CLASS # IN A REG
      ADB $CLTA     POINT TO 1ST WORD OF CLASS ENTRY
      STB CLSAD 
      ADB $CLTA,I   POINT TO 2ND WORD 
      STB CLSA2 
      JMP SETCA,I 
      HED ** RTE-L CLASS I/O MODULE  -  FLUSH CALL ** 
*     CLASS FLUSH ROUTINE 
* 
*     THIS ROUTINE ALLOWS THE FLUSHING OF CLASS I/O REQUESTS
*     AND CLASS NUMBERS WITH VARIOUS OPTIONS FOR THE USE OF 
*     PROGRAM TERMINATION/ABORT PROCESSING AND THE "CLRQ" 
*     CLASS MANAGEMENT SUBROUTINE.
* 
*       CALLING SEQUENCE: 
*         LDB (DVT ADDRESS) (CODE 2&3 ONLY) 
*         LDA (ID SEG ADDR (CODE 0&2) OR CLASS # (CODE 1&3) 
*         JSB $F.CL 
*         (CODE)
* 
*       CODES ARE  0 = FLUSH ALL COMPLETED BUFFERS FOR CLASSES OWNED
*                      BY THE PASSED ID SEGMENT.  IF PENDING COUNT
*                      IS ZERO, DEALLOCATE THE CLASS, ELSE SET THE
*                      "FLUSH" FLAG IN THE CLASS TABLE ENTRY. 
*                      (USED UPON PGM TERMINATION OR ABORT) 
*                  1 = SAME AS ABOVE USING ONLY THE CLASS # PASSED
*                      IN THE A REGISTER (I.E. INDEPENDENT OF 
*                      CLASS OWNERSHIP. 
*                      (USED BY "CLRQ" CLASS FLUSH) 
*                  2 = FLUSH ALL NON-ACTIVE PENDING REQUEST BUFFERS 
*                      FOR CLASSES OWNED BY THE PASSED ID SEGMENT.
*                      FOR ALL ACTIVE REQUESTS (DVT BUSY), CALL 
*                      "$ABRQ" TO INITIATE A REQUEST ABORT.  IF 
*                      PENDING COUNT IS ZERO AND "FLUSH" FLAG IS
*                      SET, DEALLOCATE THE CLASS. 
*                      (USED UPON PGM ABORT)
*                  3 = SAME AS ABOVE USING ONLY THE CLASS # PASSED
*                      IN THE A REGISTER. 
*                      (USED BY "CLRQ" CLASS FLUSH AND LU FLUSH)
* 
$F.CL NOP 
      STA TEMP1     SAVE CLASS OR OWNER 
      STB TEMP2 
      INB 
      STB TEMP6     SAVE POSSIBLE ADDR OF DVT2
      LDB $F.CL,I   GET CODE
      SLB           OWNER OR CLASS? 
      JMP F.05      CLASS 
      LDB TEMP1     OWNER 
      JSB $IDNO     COMPUTE ID SEG #
      STA TEMP1     SAVE IT 
      JMP F.08
* 
F.05  JSB SETCA     SETUP CLASS ENTRY ADDRS 
      LDA CLSAD,I   GET 1ST WORD
      SZA,RSS       IS CLASS ALLOCATED? 
      JMP F.EX       NO 
      SSA           END OF STATE 2 LIST?
      JMP *+3       YES 
B160K LDA 0,I       GET NEXT LINK 
      JMP *-3 
      XOR TEMP1     COMPARE SECURITY CODE IN
      AND B174C      BITS 12-8
      SZA           SECURITY CODE OK? 
      JMP F.EX       NO, RTN ON INVALID CLASS 
* 
F.08  LDB $F.CL,I   GET CODE AGAIN
      RBR,SLB       FLUSH PENDING OR COMPLETED BUFFERS? 
      JMP F.30       GO FLUSH PENDING REQUEST BUFFERS.
* 
      SSB           BY CLASS OR OWNER?
      JMP F.20       CLASS
*  CODE = 0, FLUSH OWNED AND COMPLETED CLASS BUFFERS
      LDA $CLTA,I 
      CMA,INA 
      STA TEMP2     COUNT OF CLASSES
      CLA 
      JSB SETCA     SETUP CLASS ENTRY ADDRS 
* 
F.10  ISZ CLSAD     ADVANCE CLASS TABLE 
      ISZ CLSA2      POINTERS 
      LDA CLSA2,I   GET OWNER ID
      CPA TEMP1     MATCH?
      JSB FL.BF      YES, FLUSH IT
      ISZ TEMP2 
      JMP F.10      EXAMINE NEXT CLASS
* 
F.EX  ISZ $F.CL 
      JMP $F.CL,I   RETURN
* 
*  CODE = 1  FLUSH COMPLETED REQUEST BUFFERS & DEALLOCATE CLASS 
* 
F.20  JSB FL.BF     FLUSH COMPLETED BUFFERS 
      JMP F.EX       & EXIT 
      SKP 
* 
*  FLUSH PENDING REQUESTS 
* 
F.30  CCA 
      STA TEMP4     INITIALIZE "ACTIVE ABORT FLAG"
      LDB TEMP6,I   GET ADDR OF 1ST ENTRY 
      RBL,CLE,ERB   CLEAR SIGN
      STB HEAD      SAVE IT'S ADDRESS 
* 
F.32  SZB,RSS       MORE ENTRIES? 
      JMP F.60       NO 
      LDA 1,I       GET LINK TO NEXT
      STA TEMP5 
      STB PTR       SAVE ADDR OF REQUEST BLOCK
      INB           POINT TO CONWD
      LDA 1,I       GET IT
      RAL 
      SSA,SLA,RSS   CLASS REQUEST?
      JMP F.35       NO, SKIP IT
      ADB .7
      LDA 1,I       GET CLASS WORD
      STA TEMP
      JSB SETCA     SET-UP CLASS ENTRY ADDRS
      LDB $F.CL,I   GET CALLING CODE
      SLB           DOING IT BY CLASS?
      JMP F.40       YES
      LDA CLSA2,I   GET 2ND WD OF CLASS ENTRY 
      XOR TEMP1     TEST OWNER
      AND B377
      SZA,RSS       OWNER MATCH?
      JMP F.50       YES, GO FLUSH
* 
F.35  LDB TEMP5     GET LINK TO NEXT
      RBL,CLE,ERB   CLEAR SIGN
      JMP F.32      GO EXAMINE NEXT 
* 
F.40  LDA TEMP      GET CLASS 
      XOR TEMP1 
      AND B.017 
      SZA           IS THIS THE FLUSHING CLASS? 
      JMP F.35       NO 
* 
*  DEALLOCATE THE PENDING REQUEST 
F.50  LDB PTR       ADDR OF THIS REQUEST
      CPB HEAD      IS THIS AT HEAD OF THE DVT? 
      CLE,RSS        YES
      JMP F.55       NO 
      LDA TEMP6     ADDR OF DVT2
      ADA .4        POINT TO DVT6 
      LDA 0,I       GET "AV" FIELD
      CLE,SSA       IS THIS DVT BUSY? 
      JMP F.58       YES, WE'LL ABORT IT SHORTLY
* 
F.55  JSB $UNLK     UNLINK REQ FROM DVT INIT Q
TEMP6 NOP 
      LDA TEMP2 
      JSB $RTSM     RTN SAM & CHK FOR BELOW B.L.
      JSB PENDG     DECR.PENDING CNT, CHK FLUSH 
      JMP F.35      EXAMINE NEXT
* 
F.58  STB TEMP4     SET FLAG SO $ABRQ GETS CALLED 
      JMP F.35
* 
F.60  LDB TEMP2     GET ADDRESS OF DVT
      ISZ TEMP4     ACTIVE ENTRY TO ABORT?
      JSB $ABRQ      YES, THEN DO IT
      JMP F.EX
      SKP 
* 
*  THIS SUBROUTINE FLUSHES COMPLETED CLASS BUFFERS, AND DEALLOCATES 
*  THE CLASS IF PENDING COUNT IS ZERO, OTHERWISE THE FLUSH FLAG IS
*  SET. 
FL.BF NOP 
      LDA CLSAD     GET CLASS TBLE ADDR 
      JSB $SCHD     RESCHEDULE ANY WAITER 
      OCT 52
      LDA CLSAD,I   GET 1ST WORD OF CLASS TABLE 
FL.B2 SSA           MORE COMPLETED BUFFERS? 
      JMP FL.B4      NO 
      STA TEMP      SAVE BLOCK ADDRESS
      LDB 0,I 
      STB TEMP5     SAVE LINK WD OF BLOCK 
      ADA .7
      LDB 0,I       GET BLOCK LENGTH OUT OF 8TH WD
      STB TMP8
* 
      JSB $RTN      RETURN SYSTEM AVAILABLE MEMORY
TEMP  NOP 
TMP8  NOP 
      LDA TEMP5     GET LINK WD 
      JMP FL.B2     ITERATE 
* 
FL.B4 STA CLSAD,I   STORE CLASS WORD IN TABLE 
      AND B377      ISOLATE PENDING COUNT 
      CCE,SZA,RSS   ANYTHING PENDING? 
      JMP FL.B5      NO, DEALLOCATE CLASS NOW 
* 
      LDA CLSA2,I   GET 2ND WORD
      RAL,ERA       SET FLUSH FLAG
      STA CLSA2,I   IN 2ND WORD 
      JMP FL.BF,I   RETURN
* 
FL.B5 JSB CLRCL     CLEAR THE CLASS & SCHED WAITERS 
      JMP FL.BF,I   RETURN
* 
CLSAD NOP 
CLSA2 NOP 
NEWCL NOP 
NEWC2 NOP 
$$CLA EQU * 
$.CLA EQU * 
      SKP 
* 
*  THIS ROUTINE CHECKS SECURITY CODE
SECCK NOP 
      AND B174C     ISOLATE SEC.CODE
      CPA SECCD     MATCH?
      JMP SECCK,I    YES, RETURN
* 
ERR00 CLB,RSS       ILLEGAL CLASS# OR SECURITY CODE 
ERR04 LDB .4        ILLEGAL BUFFER ADDRESS
ERRIO CLA 
      STA NEWCL,I   CLEAR-OUT IF NEW CLASS
      STA NEWC2,I    WORD 2 ALSO
      LDA ERIO      (A) = ASCII "IO"
      JMP $ERAB     WRITE MESSAGE AND EXIT
* 
ERIO  ASC 1,IO
      ORG *         LENGTH OF MODULE
      END 
