ASMB,R,L,C
      HED PROGL 91700-16104 REV A * (C) HEWLETT-PACKARD CO 1976 
      NAM PROGL,2,30 91700-16104 REV A 760330 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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.       *
******************************************************************
      SPC 2 
* 
* 
*    PROGL MODULE FOR CONCURRENT MULTI-TERMINAL DOWNLOADS 
* 
      ENT PROGL 
* 
*  WRITTEN BY: CHUCK WHELAN  NOV 1975 
* 
* 
* PROGL 
* 
* 
      EXT EXEC,OPEN,READF,CLOSE 
      EXT RNRQ,DRTEQ
      EXT #RSAX 
* 
* 
* 
#ACTV EQU 10        NUMBER OF ACTIVE DOWNLOADS AT ONE TIME
* 
#TERM EQU 32        NUMBER OF POSSIBLE COMM. LINES
* 
      SKP 
* 
* 
*       "PROGL" IS A DISTRIBUTED SYSTEM COMMUNICATIONS MONITOR.  IT 
*  SERVICES ALL SYSTEM DOWNLOAD REQUESTS FROM "SCE-1" SOFTWARE AT 
*  REMOTE SATELLITES.  WHEN A NEW REQUEST IS RECEIVED, THE REQUESTED
*  ABSOLUTE FILE CONTAINING THE CORELOAD IS TRANSMITTED RECORD-BY-
*  RECORD USING CLASS I/O WRITE OPERATIONS TO THE COMMUNICATIONS
*  DRIVER ("DVR65").
* 
*       WHEN "PROGL" IS NOT EXECUTING IT IS IN A CLASS I/O GET
*  SUSPENSION WAITING FOR AN ENTRY TO BE PLACED ON THE CLASS QUEUE
*  FOR ITS CLASS NUMBER.  ENTRIES ARE PLACED ON THIS QUEUE WHEN A 
*  NEW DOWNLOAD REQUEST IS RECEIVED OR A PREVIOUS CLASS I/O WRITE 
*  COMPLETES.  SINCE NEW REQUESTS ARE WRITTEN TO "PROGL"S CLASS BY
*  "GRPM" WITH A CLASS I/O MAILBOX WRITE/READ, "PROGL" IS ABLE
*  TO DIFFERENTIATE BETWEEN THE TWO BY EXAMINING "IPRM3". 
* 
*       THE PARMB PASSED TO "PROGL" BY "GRPM" CONTAINS THE LU IN THE
*  25TH WORD, AND THE DOWNLOAD FILE NUMBER (BINARY) IN THE 2ND WORD.
*  THESE ARE THE ONLY WORDS IN THE PARMB USED BY "PROGL".  THE DOWN-
*  LOAD FILE NUMBER IS CONVERTED TO AN ASCII FILE NAME CONSISTING 
*  OF "P" FOLLOWED BY THE FIVE ASCII DIGIT OCTAL EQUIVALENT OF THE
*  NUMBER. NON-SCE1 REQUESTS TO PROGL PLACE A ZERO IN THE 2ND WORD, 
*  AND THE ASCII FILE NAME IN THE 3RD, 4TH, & 5TH WORD OF THE PARMB.
* 
*       THE NUMBER OF DOWNLOADS THAT CAN BE ACTIVE AT ANY ONE TIME
*  IS LIMITED ONLY BY SYSTEM AVAILABLE MEMORY AND THE SIZE OF THE 
*  ACTIVE DOWNLOAD TABLE.  IN-PROCESS DOWNLOADS HAVE AN ENTRY IN
*  THIS TABLE CONSISTING OF LU, TIME-TAGS, SEQ #, AND THE 144 WORD
*  DCB FOR THE DOWNLOAD FILE.  IF A NEW REQUEST IS RECEIVED WHILE 
*  THIS TABLE IS FULL, IT IS PLACED IN A FOUR WORD (LU, TIME-TAGS, &
*  FILE #) ENTRY IN A WAIT QUEUE.  WHEN AN ENTRY BECOMES AVAILABLE
*  IN THE ACTIVE TABLE, AN ENTRY IN THE WAIT QUEUE CAN BE ACTIVATED.
*  THE NUMBER OF ENTRIES IN THE ACTIVE TABLE IS SET AT ASSEMBLY TIME
*  BY THE ITEM "NACTV". 
* 
*       THE LU AND SEQ # OF A DOWNLOAD REQUEST ARE PASSED IN THE
*  OPTIONAL PARAMETERS OF EACH CLASS I/O WRITE.  THE PROGRAM ENSURES
*  THAT ONLY ONE DOWNLOAD TO A LU IS IN PROCESS BY RE-USING THE SAME
*  TABLE ENTRY WITH A NEW SEQ # IF A DOWNLOAD IS RESTARTED, AND 
*  IGNORING I/O COMPLETIONS (ERRORS OR NOT) WITH WRONG SEQ. NUMBERS.
* 
*       EACH TIME THAT "PROGL" IS ENTERED ON A CLASS WRITE
*  COMPLETION, IT CHECKS THE RETURNED ERROR STATUS FOR DRIVER 
*  ERRORS AND IF NONE, READS THE NEXT RECORD FROM THE DOWNLOAD
*  FILE, WRITES IT TO THE DRIVER AND AGAIN SUSPENDS ON ITS CLASS. 
* 
*       WHEN ALL RECORDS IN THE DOWNLOAD FILE HAVE BEEN SUCCESSFULLY
*  TRANSMITTED, "PROGL" SENDS A ONE-WORD REQUEST TO THE SATELLITE 
*  TO INDICATE THE DOWNLOAD IS COMPLETE.  AT THIS TIME, THE FILE IS 
*  CLOSED, THE TABLE ENTRY IS CLEARED, AND UNLESS A WAIT QUEUE
*  ENTRY CAN BE ACTIVATED, "PROGL" AGAIN SUSPENDS ON ITS CLASS. 
* 
* 
      SKP 
* 
*  PROGL IS ENTERED HERE INITIALLY
PROGL BSS 0         ENTRY.
      LDA 1,I 
      AND MSK14     RELEASE CLASS BUFFER
      SZA           SKIP IF NOT 1ST TIME
      STA ICLAS     SAVE CLASS # FOR PROGL
* 
* 
*  SUSPEND UNTIL A NEW REQUEST IS WRITTEN TO MONITOR OR COMPLETION
*  ON A PREVIOUS DRIVER WRITE OCCURS
* 
PGET  JSB EXEC      WAIT FOR NEXT REQST OR I/O COMPLETION 
      DEF *+8 
      DEF D21 
      DEF ICLAS 
      DEF BUFR
      DEF LEN 
      DEF LU
      DEF SEQ#
      DEF TYPE
* 
      LDB TYPE      CHECK TYPE OF CLASS I/O 
      CPB D2
      JMP IOCOM     IT WAS WRITE, PROCESS I/O COMPLETION
* 
*  PROCESS NEW DOWNLOAD REQUEST 
* 
      LDA BUFR+24 
      STA LU        SET LU FROM PARMB 
      JSB SRCH      SEARCH FOR ENTRY IN DOWNLOAD TABLE
      CLB,RSS       THIS LU WASN'T IN TABLE 
      JMP RSTRT     FOUND, CLEAR & RESTART
* 
*  NO PREVIOUS ACTIVE ENTRY FOR LU
      CPB CURAD     WAS DOWNLOAD TABLE FULL?
      JMP FULL      YES, QUEUE THIS ENTRY 
      LDA LU        LU
      STA CURAD,I   STORE IN 1ST WORD OF DOWNLOAD ENTRY 
      RSS 
* 
*  SAME LU, USE SAME TABLE ENTRY WITH NEW SEQ # & TIME-TAGS 
RSTRT JSB CLSE      CLOSE PREVIOUS DOWNLOAD FILE
      DLD BUFR+33   GET TIME-TAGS 
      DST TAGAD,I   SAVE IN ACTIVE DOWNLOAD ENTRY 
      LDB BUFR+1    PGM # FROM PARMB
      SZB           SKIP IF A NON-SCE1 REQUEST
      JMP NEWLD     OTHERWISE CONVERT A BINARY PGM #
      LDA BUFR+2    CHARS 1 & 2 OF FILE NAME
      STA NAME
      LDA BUFR+3    CHARS 4 & 5 
      STA NAME+1
      LDA BUFR+4    5TH CHAR
      JMP SETNM 
* 
*  CONVERT PGM # TO BE DOWNLOADED 
NEWLD RRL 4         DUAL ROTATE LEFT 4
      AND D7
      IOR ASCP0     FORM ASCII OF 1ST 2 CHARS 
      STA NAME
      CLA 
      RRL 3         POSITION 3RD OCTAL DIGIT
      ALF,RAL       MOVE TO LHW 
      RRL 3         GET 4TH DIGIT 
      IOR ASC00     ASCII FOR 3RD & 4TH DIGITS
      STA NAME+1
      CLA 
      RRL 3         5TH DIGIT 
      ALF,RAL       TO LHW
      RRL 3         GET 6TH & FINAL DIGIT 
      IOR ASC00     CONVERT TO ASCII
SETNM STA NAME+2
* 
      LDA POOLS     GET SEQ # OF THIS DOWNLOAD FROM POOL
      STA SEQAD,I   2ND WORD OF DOWNLOAD ENTRY
      ISZ POOLS     UPDATE POOL SEQUENCE NUMBER 
ZERO  NOP 
* 
*  OPEN FILE TO BE DOWNLOADED 
      JSB OPEN      DO FMGR OPEN
      DEF *+5 
      DEF DCBAD,I   DCB ADDRESS 
      DEF IERR
      DEF NAME
      DEF ZERO
* 
      LDA IERR
      SSA           SKIP IF NO ERROR FROM FMP 
      JMP ERR1      SEND REJECT IF ERROR
* 
*  LOCK PRN SO PROGL HAS EXCLUSIVE USE OF LINE
      JSB DORN      DO LOCAL LOCK ON PROGL RN 
      OCT 100001
      JMP NEXT      NOW XFER NEXT RECORD
      HED SEND NEXT DOWNLOAD RECORD      * (C) HEWLETT-PACKARD CO 1976
* 
* 
*  ENTER HERE WHEN COMPLETION OF PREVIOUS WRITE HAS OCCURRED
* 
IOCOM STA IERR      SAVE STATUS 
      JSB SRCH      FIND DOWNLOAD TABLE ENTRY FOR LU
      JMP PGET      LU NOT IN TABLE, IGNORE 
      LDA SEQAD,I   GET SEQ # OF TABLE ENTRY
      CPA SEQ#      DOES IT MATCH?
      RSS           YES 
      JMP PGET      NO, IGNORE THIS COMPLETION
*  CHECK DRIVER ERROR STATUS
      LDA IERR      GET ERROR STATUS FROM DRIVER
      SLA,RSS       LSB OF EQT5 
      JMP ERR3      DRIVER ERROR OCCURRED 
* 
*  THIS SECTION IS ENTERED TO GET NEXT RECORD FROM DOWNLOAD FILE. 
* 
NEXT  JSB READF     READ NEXT RECORD
      DEF *+6 
DCBAD NOP 
      DEF IERR
      DEF DBUF
      DEF MAXL      MAX ALLOWED LENGTH
      DEF LENX      ACTUAL LENGTH 
* 
      LDA IERR      CHECK FOR ERRORS
      SSA 
      JMP ERR2      ERROR IN FILE READ
* 
      LDA LENX
      SSA           CHECK FOR END-OF-FILE 
      JMP EOFND     FOUND, WRAP IT UP 
* 
*  VERIFY CHECKSUM OF NEXT RECORD TO BE DOWNLOADED
* 
      LDA DBUF
      ALF,ALF 
      AND B377
      STA 1         SAVE BUFFER LENGTH IN B 
      CMB,INB       NEGATE LENGTH 
      STB DBUF      SET IN LENGTH FIELD FOR SCE-1 
      INA 
      CMA,INA 
      STA CNTR      WORD COUNTER. 
      LDB DBFAD     BUFFER ADDRESS. 
      CLA 
CKSML ADA 1,I       ADD UP THE WORDS. 
      INB 
      ISZ CNTR
      JMP CKSML 
      CPA 1,I       COMPARE CHECKSUMS.
      RSS 
      JMP ERR2      NOT EQUAL.
* 
*  CHECKSUM OK, SETUP TO WRITE THIS RECORD
      LDA LU        GET LU
      IOR B400      WRITE DATA ONLY (PROGL SPECIAL) 
      STA CONWD 
* 
*  NOW DO CLASS I/O WRITE TO DRIVER 
* 
      JSB EXEC
      DEF *+8 
      DEF D18N      NO ABORT BIT IS SET 
      DEF CONWD     WRITE DATA
      DEF DBUF      DATA BUFFER ADDRESS 
      DEF LENX      LENGTH
CURAD NOP           OPT.PARAM 1 = LU
SEQAD NOP           OPT.PARAM 2 = SEQ # OF DOWNLOAD 
      DEF ICLAS     WRITE IT ON PROGL'S CLASS 
* 
      JMP ERR3      ERROR 
*  NOW GO INTO SUSPEND ON PROGL'S CLASS UNTIL A DRIVER WRITE COMPLETES
* OR A NEW REQUEST IS RECEIVED. 
      JMP PGET
* 
* 
*  ENTER HERE WHEN END OF DOWNLOAD FILE IS DETECTED 
*  RETURN GOOD STATUS FOR A SUCCESSFUL DOWNLOAD 
* 
EOFND JSB CLSE      CLOSE DOWNLOAD FILE 
      CLA           0= GOOD DOWNLOAD
* 
TERM  STA ISTAT     SET STATUS FOR TRANSMISSION 
* 
      JSB EXEC      WRITE FINAL REQUEST 
      DEF *+8 
      DEF D18N      CLASS WRITE TO COMM DRIVER
      DEF LU        REQ ONLY
      DEF ISTAT     1 WORD REQUEST HAS STATUS 
      DEF D1
      DEF LU        OPT.PARAM 1 = LU
      DEF SEQAD,I   OPT.PARAM 2 = DOWNLOAD SEQ #
      DEF ICLAS     PROGL CLASS NUMBER
      NOP 
* 
*  CLEAR PRN SO ANYONE ELSE CAN USE THIS LU 
      JSB DORN      CLEAR PROGL RESOURCE NUMBER 
      OCT 100004
* 
      JSB #RSAX     CLEAR TRANSACTION 
      DEF *+5 
      DEF D3
      DEF ST/LS     STREAM 9
      DEF SCODE     SELECT CODE 
TAGAD NOP           ADDR OF TIMETAGS
* 
      LDA ISTAT 
      CPA M4        IS THIS A NON-SCE1 BUSY REJECT? 
      JMP PGET      YES, DONE 
* 
*  THIS DOWNLOAD IS OVER
*  CLEAN OUT DOWNLOAD TABLE ENTRY AND GIVE SPACE TO 
*  ANY ENTRY FOUND IN WAITING QUEUE 
* 
CLNUP CLA 
      STA CURAD,I   SET DOWNLOAD ENTRY AS AVAILABLE 
      LDB WAITA 
      LDA NQUE
      STA CNTR      COUNTER= -# OF WAITQ ENTRIES
CKQUE LDA 1,I 
      SZA           SKIP IF SLOT EMPTY
      JMP ACTIV     OTHERWISE, ACTIVATE IT
      ADB D2
      ISZ CNTR
      JMP CKQUE 
      JMP PGET      NOTHING QUEUED, GO TO GET SUSPEND 
* 
*  NOW ACTIVATE A WAITING DOWNLOAD REQUEST FROM THE WAIT QUEUE USING
*  THE ACTIVE DOWNLOAD TABLE SPACE WHICH WAS JUST MADE AVAILABLE
* 
ACTIV STA CURAD,I   MOVE LU TO TABLE ENTRY JUST CLEARED 
      CLA 
      STA 1,I       CLEAR WAIT QUEUE ENTRY
      INB 
      STB TPNT
      DLD 1,I       GET TIME-TAGS FROM WAIT QUEUE ENTRY 
      DST TAGAD,I    & SAVE IN ACTIVE DOWNLOAD ENTRY
      ISZ TPNT
      ISZ TPNT      ADDR OF PGM # IN WAIT QUEUE ENTRY 
      LDB TPNT,I    PICKUP PGM # AND START DOWNLOADING IT 
      JMP NEWLD 
      HED PROGL SUBROUTINES & DATA AREA  * (C) HEWLETT-PACKARD CO 1976
* 
*  THIS SUBROUTINE SEARCHES FOR A DOWNLOAD TABLE ENTRY FOR
*  THE PASSED LU. RETURNS TO P+1 IF NOT FOUND, OTHERWISE P+2
* 
SRCH  NOP 
      LDA NACTV 
      STA CNTR      - # OF ACTIVE ENTRIES ALLOWED 
      CLA           INITIALIZE ADDR OF EMPTY SLOT 
      STA TPNT
      LDB TABAD     ADDR OF DOWNLOAD TABLE
SNXT  LDA 1,I       PICKUP LU OF THIS ENTRY 
      CPA LU        DOES THIS ONE MATCH LU? 
      JMP SRCHX     YES, FOUND DOWNLOAD ENTRY 
      IOR TPNT      NO, IS THIS THE 1ST EMPTY SLOT? 
      SZA,RSS       SKIP IF EMPTY SLOT ALREADY FOUND
      STB TPNT      STORE ADDR OF 1ST EMPTY SLOT
      ADB TLENT     BUMP TABLE POINTER
      ISZ CNTR
      JMP SNXT      TRY NEXT
*  LU NOT IN ACTIVE TABLE 
      LDB TPNT      RETURN 1ST EMPTY SLOT INSTEAD 
      RSS           RETURN +1 
* 
*  FOUND AN ENTRY IN THE ACTIVE DOWNLOAD TABLE FOR THIS LU
SRCHX ISZ SRCH      RETURN+2
      STB CURAD     SET ADDRESS OF ENTRY
      INB 
      STB SEQAD      & ADDRESS FOR SEQ #
      INB 
      STB TAGAD      & ADDRESS FOR TIME-TAGS
      ADB D2
      STB DCBAD      & ADDRESS FOR DCB
      JMP SRCH,I    RETURN
* 
*  CLOSE DOWNLOAD FILE
* 
CLSE  NOP 
      JSB CLOSE 
      DEF *+3 
      DEF DCBAD,I 
      DEF IERR
      JMP CLSE,I
* 
*  GET PROGL RESOURCE NUMBER FOR THIS LU FROM EQT EXTENSION+1 
*  AND PERFORM REQUESTED LOCK/UNLOCK ON IT
* 
DORN  NOP 
      JSB DRTEQ     GET EQT FOR LU
      DEF *+2 
      DEF LU
      SSB 
      JMP CLNUP     LU NOT FOUND, CLEAN OUT THIS ENTRY
      ADB D3
      LDA 1,I       PICK UP EQT 4 
      AND B77       ISOLATE SELECT CODE 
      ALF,ALF 
      STA SCODE     SAVE FOR #RSAX CALL 
      ADB D9        COMPUTE EQT13 ADDR
      LDB 1,I 
      RBL,CLE,SLB,ERB 
      JMP *-2       RESOLVE 
      INB           POINT TO EXTENSION + 1
      LDA 1,I       GET RESOURCE NUMBER 
      STA PRN 
* 
      JSB RNRQ      DO REQUESTED OPERATION ON RN
      DEF *+4 
      DEF DORN,I
      DEF PRN 
      DEF IERR
* 
      ISZ DORN
      JMP DORN,I
* 
*  DOWNLOAD TABLE IS FULL, PUT THIS REQUEST IN WAITING QUEUE
* 
FULL  LDA M4
      LDB BUFR+1    2ND WORD OF PARMB 
      SZB,RSS       IS THIS AN SCE-1 DOWNLOAD?
      JMP TERM      NO, GIVE A BUSY REJECT
* 
      LDA NQUE
      STA CNTR      -QUEUE TABLE SIZE 
      CLA 
      STA TPNT
      LDB WAITA     ADDR OF WAIT QUEUE
CKQ   LDA 1,I       GET LU OF THIS ENTRY
      CPA LU        DOES IT MATCH THIS REQUEST
      JMP BLDQ      YES, THEN SET NEW PGM # & TIME-TAGS 
      IOR TPNT      CHECK IF THIS IS 1ST EMPTY SLOT IN QUEUE
      SZA,RSS       SKIP IF NOT 
      STB TPNT      SAVE ITS ADDRESS
      ADB D2        BUMP QUEUE POINTER
      ISZ CNTR
      JMP CKQ       EXAMINE NEXT ENTRY
* 
*  WE NOW KNOW THAT THIS LU WASN'T ALREADY IN WAIT QUEUE
      LDB TPNT      GET ADDRESS OF 1ST EMPTY SLOT 
      SZB,RSS       WERE THERE ANY EMPTIES? 
      JMP PGET      NO, WE'RE IN TROUBLE
      LDA LU        LU
      STA 1,I       INTO 1ST WORD OF WAIT QUEUE ENTRY 
* 
BLDQ  INB 
      LDA BUFR+33   1ST WORD OF PASSED TIME-TAGS
      STA 1,I       STORE IN WAIT QUEUE ENTRY 
      INB 
      LDA BUFR+34   2ND WORD
      STA 1,I 
      INB 
      LDA BUFR+1    PGM # 
      STA 1,I       GOES INTO 4TH WORD
      JMP PGET      GO BACK TO SUSPEND ON GET 
* 
ERR1  CCA           ERROR IN FILE OPEN
      JMP TERM
ERR2  JSB CLSE      ERROR IN FILE READ, DO CLOSE
      LDA M2
      JMP TERM
ERR3  JSB CLSE      DRIVER ERROR, DO CLOSE
      LDA M3
      JMP TERM
* 
*  DATA AREA
* 
NAME  BSS 3 
IERR  NOP 
ISTAT NOP 
ICLAS NOP 
PRN   NOP 
TPNT  NOP 
CNTR  NOP 
TYPE  NOP 
LENX  NOP 
CONWD NOP 
POOLS NOP 
LU    NOP 
SEQ#  NOP 
SCODE NOP 
* 
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D7    DEC 7 
D9    DEC 9 
D21   DEC 21
M2    DEC -2
M3    DEC -3
M4    DEC -4
B77   OCT 77
B400  OCT 400 
B377  OCT 377 
D18N  OCT 100022
MSK14 OCT 137777
ST/LS OCT 4402
* 
TLENT DEC 146       SIZE OF DOWNLOAD TABLE ENTRY
NACTV ABS -#ACTV
NQUE  ABS #ACTV-#TERM 
MAXL  DEC 255 
LEN   DEC 35        PARMB LENGTH
ASC00 ASC 1,00
ASCP0 ASC 1,P0
* 
DBFAD DEF DBUF+1
TABAD DEF DT        ADDR OF DOWNLOAD TABLE
WAITA DEF WAITQ     ADDR OF WAITING QUEUE 
* 
BUFR  BSS 35        PARMB 
DBUF  BSS 255       FILE INPUT BUFFER 
* 
*  THE FOLLOWING RESERVES SPACE FOR THE ACTIVE DOWNLOAD TABLE 
DT    REP #ACTV     DOWNLOAD TABLE: LU,SEQ#,TAGS,& DCB
      BSS 148 
* 
*  THE FOLLOWING RESERVES SPACE FOR THE WAIT QUEUE
WAITQ REP #TERM-#ACTV  WAITING QUEUE: LU, TIME-TAGS, & PGM #
      BSS 4 
* 
      END PROGL 
  