ASMB,R,L,C
      HED PROGL 91750-16150  (C) HEWLETT-PACKARD CO 1980
      NAM PROGL,19,30 91750-16150 REV.2013 800407 (ALL) 
      SPC 1 
******************************************************************
*  * (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.       *
******************************************************************
      SPC 4 
****************************************************************
* 
*    NAME: PROGL
*  SOURCE: 91750-18150
*   RELOC: 91750-16150
*    PGMR: JOHN LAMPING 
* 
*    WRITTEN BY CHUCK WHELAN [MAY 1976] 
*    MODIFIED BY DMT [JANUARY 1978] 
*    MODIFIED BY LYLE WEIMAN [JANUARY 1978] 
*    MODIFIED BY CCH [MARCH 1979] TO ELIMINATE REFERENCE TO <DRTEQ>.
*    MODIFIED BY PETER BRICKEY [MAY 1979] 
*    MODIFIED BY JOHN LAMPING [AUGUST 1979] 
* 
*************************************************************** 
      SPC 3 
* 
* 
*    DS/1000 PROGL MODULE FOR CONCURRENT MULTI-TERMINAL DOWNLOADS 
* 
      ENT PROGL 
* 
      EXT EXEC,OPEN,READF,CLOSE,$OPSY,#RQUE,#GETR 
      EXT CNUMD,KCVT,LOCF,.MVW,#PRLU,RMPAR,XLUEX,DTACH
* 
* 
* 
#ACTV EQU 4         NUMBER OF ACTIVE DOWNLOADS AT ONE TIME
* 
#TERM EQU 32        NUMBER OF POSSIBLE COMM. LINES
* 
#LSZ  EQU 2         DS HEADER APPENDAGE LENGTH
      SKP 
* 
* 
*       "PROGL" IS A DISTRIBUTED SYSTEM COMMUNICATIONS MONITOR.  IT 
*  SERVICES ALL SYSTEM DOWNLOAD REQUESTS FROM "CBL" 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/READ OPERATIONS TO THE COMMUNICATIONS 
*  DRIVER.
* 
*       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. 
* 
*       THE REQUEST PASSED TO "PROGL" BY "QUEUE" HAS THE DOWNLOAD FILE
*  FILE NUMBER (BINARY) IN THE FIRST WORD.  THE DOWNLOAD FILE NUMBER IS 
*  CONVERTED TO AN ASCII FILE NAME CONSISTING OF 'P' FOLLOWED BY THE FIVE 
*  ASCII DIGIT OCTAL EQUIVALENT OF THE NUMBER.
* 
*       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, SEQ #, THE 144 WORD DCB FOR THE DOWNLOAD
*  FILE, AND THE FILE NUMBER.  IF A NEW REQUEST IS RECEIVED WHILE 
*  THIS TABLE IS FULL, IT IS PLACED IN A TWO WORD (LU, & 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 "#ACTV". 
* 
*     THE LU, SEQ# AND DESTINATION ADDRESS OF THE DOWNLOAD REQUEST ARE
*  PASSED IN THE REQUEST BUFFER OF EACH CLASS I/O WRITE/READ.  THE ROUTINE
*  INSURES 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 ZERO-LENGTH RECORD TO THE SATELLITE 
*  TO INDICATE THE DOWNLOAD IS COMPLETE.  AT THIS TIME, THE FILE IS 
*  CLOSED (UNLESS IT IS OPEN MORE THAN ONCE), THE TABLE ENTRY IS CLEARED, 
*  AND UNLESS A WAIT QUEUE ENTRY CAN BE ACTIVATED, "PROGL" AGAIN SUSPENDS 
*  ON ITS CLASS.
* 
* 
*     OPTIONAL FEATURE:  THE USER MAY ELECT TO HAVE 'PROGL' PRINT 
*     A MESSAGE ON A SPECIFIED LU EACH TIME A DOWN-LOAD IS INITIATED, 
*     AND ALSO AT TERMINATION ( SUCCESS OR FAILURE).  AN EXAMPLE
*     MESSAGE IS SHOWN BELOW: 
*INITIATING VIA LU     7 DOWNLOAD OF FILE:P00000 AT DAY      5,  9 :10AM
*DOWNLOAD OF FILE:P00000 AT DAY      5,  9 :11AM WAS SUCCESSFUL 
* 
*     THE TIME OF INITIATION AND TIME OF TERMINATION ARE PRINTED (NOT 
*     NECESSARILY EQUAL). 
* 
*     THERE ARE TWO WAYS TO SELECT THIS OPTION: 
*      1) PROGRAMMATICALLY--WRITE A PROGRAM TO DECLARE '#PRLU' AS AN
*         EXTERNAL SYMBOL (THIS SYMBOL IS IN SUBSYSTEM GLOBAL AREA, SO
*         THE PROGRAM MUST BE LOADED GIVING IT ACCESS TO SSGA). 
*         IT SHOULD STORE THE LU ON WHICH YOU WANT THESE MESSAGES IN
* 
*         #PRLU.
*      2) AT GENERATION TIME--IN THE SECTION WHERE ENTRY POINT REPLACEMENTS 
*         ARE ACCEPTED BY THE RTE GENERATOR, ENTER THE FOLLOWING
*         LINE (THIS IS AN EXAMPLE, SHOWING HOW TO SPECIFY THAT THE 
*         MESSAGES ARE TO BE PRINTED ON LU 1):
* 
*           #PRLX,ABS,1 
      SKP 
* 
*     PROGL WAS MODIFIED TO SET THE DRIVER TO  NON-DS  MODE  BEFORE 
*     INITIATING  A  DOWNLOAD  AND  TO  USE  THE NEW CALLING FORMAT WHEN
*     REQUESTING THIS DOWNLOAD. IT WILL NOW SEND THE DRIVER  THE  ENTIRE
*     BUFFER  AND LET THE DRIVER FIGURE OUT THE DOWNLOAD ADDRESS AND THE
*     TRANSMISSION LENGTH. WHEN THE DOWNLOAD FINISHES OR  IS  TERMINATED
*     PROGL WILL SET THE DRIVER TO DS MODE. SINCE THE DRIVER ERROR CODES
*     WERE   ALSO  CHANGED,  PROGL'S  ERROR  DETECTION  WAS  CHANGED  TO
*     ACCOMODATE THESE CHANGES. 
* 
*          FOR TYPE 1 FILES PROGL WILL ADD 3 WORDS TO EACH  RECORD  SENT
*     TO  THE DRIVER, TWO WORDS WILL BE ADDED AT THE START OF THE RECORD
*     AND ONE WORD AT THE END. THE FIRST WORD WILL  CONTAIN  THE  RECORD
*     LENGTH  (NUMBER  OF ACTUAL DATA WORDS) IN THE HIGH ORDER BYTE, THE
*     LOW ORDER BYTE IS SET TO 0, WORD 2 WILL  CONTAIN  THE  DESTINATION
*     ADDRESS  FOR  THIS  RECORD  AND  THE  LAST  WORD  WILL CONTAIN THE
*     CHECKSUM. THE CHECKSUM WILL BE COMPUTED AND INSERTED INTO THE LAST
*     WORD OF THE RECORD BEFORE THE RECORD IS GIVEN TO THE DRIVER.
* 
*          SINCE THE ABOVE SETS UP THE TYPE 1 FILE TO LOOK LIKE A TYPE 7
*     FILE THE ONE VERSION OF PROGL WILL BE ABLE TO  DOWNLOAD  EITHER  A
*     TYPE  1  OR  A TYPE 7 FILE USING EITHER DVA65 OR DVA66. PROGL WILL
*     KNOW THAT IT IS DOWNLOADING A TYPE 1 FILE  SINCE,  FOR  A  TYPE  1
*     FILE, BIT 15 OF THE SEQ# IS SET.
*          NOTE:  SINCE  A TYPE 1 FILE DOES NOT CONTAIN A CHECKSUM THERE
*     IS NO WAY TO GUARANTEE THAT THE FILE  WILL  CONTAIN  CORRECT  DATA
*     WHEN PROGL RECEIVES IT. 
* 
*          FOR  EITHER  TYPE  1  OR TYPE 7 FILE THE DRIVER WILL SEE THE 
*     FOLLOWING FORMAT: 
* 
*                      15             8 7            0
*                      +---------------+--------------+ 
*           WORD 1     !  WORD COUNT   !      0       ! 
*                      +---------------+--------------+ 
* 
*                      +------------------------------+ 
*           WORD 2     !     DESTINATION ADDRESS      ! 
*                      +------------------------------+ 
* 
*                      +------------------------------+ 
*           WORD 3     !             DATA             ! 
*                      +------------------------------+ 
*                                      !
*                                      !
*                                      !
*                                      !
*                                      V
*                      +------------------------------+ 
*           WORD N-1   !             DATA             ! 
*                      +------------------------------+ 
* 
*                      +------------------------------+ 
*           WORD N     !           CHECKSUM           ! 
*                      +------------------------------+ 
      SKP 
* 
*          PROGL WILL DETERMINE THE TYPE OF THE REQUESTED DOWNLOAD FILE.
*     IF IT IS A TYPE 1 FILE, ONE RECORD (MAXIMUM OF 128 WORDS) WILL  BE
*     READ.  THE  WORD COUNT (N) WILL BE PUT INTO THE HIGH ORDER BYTE OF
*     THE FIRST WORD WHILE THE COMPUTED DESTINATION ADDRESS IS PUT  INTO
*     THE  SECOND  WORD. THE DESTINATION ADDRESS WILL BE 2 FOR THE FIRST
*     RECORD AND PROGL WILL START DOWNLOADING WITH  THE  THIRD  WORD  OF
*     THIS RECORD, THEN FOR THE FOLLOWING RECORDS IT WILL BE COMPUTED AS
*     DA[PRESENT]  =  DA[PAST]  +  N[PAST] AND THE ENTIRE RECORD WILL BE
*     DOWNLOADED. THE N DATA WORDS WILL THEN BE PLACED INTO  THE  BUFFER
*     STARTING  AT THE THIRD WORD, THE CHECKSUM IS COMPUTED AND PUT INTO
*     THE LAST WORD (N+3) OF THE BUFFER. THE FOLLOWING FORMAT IS USED 
*     BY PROGL TO CALL THE DRIVER:
* 
*                      JSB EXEC 
*                      DEF *+8
*                      DEF CONWD      300B+LU 
*                      DEF DBUF       DATA BUFFER ADDRESS 
*                      DEF DLEN       N+3 
*                      DEF RQBUF      3 WORD REQUEST BUFFER 
*                                       WORD 1 = LU 
*                                       WORD 2 = SEQ #
*                                       WORD 3 = DESTINATION ADDRESS
*                      DEF RLEN       3 
*                      DEF CLASS      CLASS NUMBER
* 
*          PROGL WILL ISSUE A CLASS WRITE TO THE DRIVER AND THEN GO INTO
*     ITS  WAIT  STATE UNTIL THE DRIVER RESPONDS. IF THE DRIVER RESPONDS
*     WITH A GOOD STATUS PROGL WILL PROCEED TO DOWNLOAD THE NEXT RECORD.
*     ASSUMING GOOD RESPONSES FROM THE DRIVER  PROGL  WILL  CONTINUE  TO
*     DOWNLOAD  RECORDS  UNTIL  IT GETS AN EOF WHEN READING THE FILE, AT
*     THIS TIME PROGL WILL ISSUE A CLASS WRITE WITH A DATA LENGTH  OF  3
*     (N=0)  AND  A 3 WORD DATA BUFFER CONISTING OF 0,0,0 TO SIGNIFY THE
*     END OF THIS DOWNLOAD. 
* 
*          IF THE DRIVER RESPONDS WITH  AN  ERROR  STATUS  INDICATING  A
*     PROTOCOL,  TIMEOUT  OR MEMORY OVERFLOW ERROR PROGL WILL ABORT THIS
*     DOWNLOAD. THE ABORT WILL BE INDICATED TO THE DRIVER BY  ISSUING  A
*     CLASS WRITE WITH A DATA LENGTH OF 3 WORDS AND A 3 WORD DATA BUFFER
*     CONSISTING  OF 0,-3,-3 (DRIVER ERROR). PROGL MAY ALSO INDICATE
*     AN ABORT TO THE DRIVER IN CASE OF FILE OPEN ERROR (0,-1,-1) OR
*     A FILE READ ERROR (0,-2,-2). AFTER ABORTING THE DOWNLOAD PROGL
*     WILL RETURN THE DRIVER TO DS MODE.
      SKP 
* 
*  PROGL IS ENTERED HERE INITIALLY
PROGL EQU *         ENTRY.
      JSB RMPAR     PROGL IS SCHEDULED
      DEF *+2        WITH ITS CLASS NUMBER
      DEF DBUF        AS A PARAMETER
      JSB DTACH     DETACH FROM ANY SESSION 
      DEF *+1         WE MIGHT HAVE BELONGED TO 
      LDA DBUF
      SZA,RSS 
      JMP PGET      NOT FIRST TIME
      AND MSKCN     GET JUST CLASS NUMBER 
      STA CLAS1     SAVE PROGL'S CLASS
      IOR B20K      ADD DO NOT DE-ALLOCATE BIT
      STA CLAS2     SAVE FOR BUFFER FLUSHING
*  INITIALIZE FILE NUMBERS
      LDB NACTV     SET UP LOOP 
      STB CNTR       COUNTER = - # ENTRIES
      LDB D12N      LOAD CLOSED MARKER
      CCA           POINT TO FIRST
      ADA TABAD      FILE NUMBER ENTRY
BUMP  ADA TLENT 
      STB 0,I       STORE MARKER
      ISZ CNTR      DONE? 
      JMP BUMP       NO. MARK NEXT ONE
* 
* 
*  SUSPEND UNTIL A NEW REQUEST IS WRITTEN TO MONITOR OR COMPLETION
*  ON A PREVIOUS DRIVER WRITE OCCURS
* 
PGET  JSB #GETR     WAIT FOR NEXT REQUEST OR I/O COMPLETION 
      DEF *+7 
      DEF CLAS1 
      DEF RQBUF 
      DEF D3
      DEF BUFR
      DEF D2
      DEF IERR
      HLT 77B       FATAL ERROR, GENERATE MP
      ADA LSIZE     SAVE ACTUAL 
      STA RQLEN      REQUEST LENGTH 
      CPA D3        IF REQ LEN IS 3, THIS IS I/O COMPLETION 
      JMP IOCOM     PROCESS I/O COMPLETION
      SZA,RSS       IS THERE NO Z BUFFER
      CMB,INB        AND DATA LENGTH
      INB,SZB,RSS     ALSO EQUAL TO 1?
      JMP REQST     YES, HANDLE NEW DOWNLOAD REQUEST
IGNOR JSB RLEAS     NO, RELEASE THIS BUFFER 
      JMP PGET      CONTINUE TO WAIT
* 
*  PROCESS NEW DOWNLOAD REQUEST 
* 
REQST JSB EXEC      RELEASE BUFFER AND GET OPTIONAL PARAMETER 
      DEF *+6 
      DEF D21 
      DEF CLAS2 
      DEF BUFR
      DEF D2
      DEF LU
      LDA D2        IN CASE THIS IS TO BE A TYPE 1 FILE 
      STA DADD      SET-UP THE DESTINATION ADDRESS
      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 
      JMP RSTR1 
* 
*  SAME LU, USE SAME TABLE ENTRY WITH NEW SEQ # & TIME-TAGS 
RSTRT EQU * 
      JSB PRFAL     PRINT OLD FILE NAME & MSG THAT
      DEF .ABR1       DOWN-LOAD WAS ABORTED 
      JSB CLSE      CLOSE PREVIOUS DOWNLOAD FILE
      SPC 2 
RSTR1 EQU * 
      LDA NONDS     MUST SET DVA65 TO NON-DS
      JSB SETMD              MODE 
      LDB BUFR      FILE # FROM PARMB 
* 
*  CONVERT FILE # TO BE DOWNLOADED INTO FILE NAME.
NEWLD EQU * 
*                   CONVERT FILE NUMBER TO ASCII FILE NAME, AND 
*                   ALSO CONVERT TIME-OF-DAY TO ASCII.
      LDA DCBAD     GET ADDRESS IN TABLE WHERE
      ADA D144        FILE # IS TO BE STORED
      STB 0,I       STORE FILE NUMBER THERE.
      JSB GFNAM 
* 
* 
*  OPEN FILE TO BE DOWNLOADED 
      JSB OPEN      DO FMGR OPEN
      DEF *+5 
      DEF DCBAD,I   DCB ADDRESS 
      DEF IERR
      DEF NAME
      DEF ZERO
* 
      LDA #PRLU     DOES USER WISH AN ANNOUNCEMENT OF THIS? 
      SZA,RSS 
      JMP POPN1     NO, CONTINUE
      STA LUPRN     YES, SAVE PRINT LU
* 
      JSB LOCF      FIND FILE LU
      DEF *+9 
      DEF DCBAD,I 
      DEF SRCH      DON'T CARE ABOUT THIS ERROR 
      DEF SRCH      DON'T CARE ABOUT 'IREC' PARAMETER 
      DEF SRCH      DON'T CARE ABOUT 'IRB' PARAMETER
      DEF SRCH      DON'T CARE ABOUT 'IOFF' PARAMETER 
      DEF SRCH      DON'T CARE ABOUT 'JSEC' PARAMETER 
      DEF .DLU      SAVE FILE LU HERE 
      DEF .TYP      SAVE FILE TYPE HERE 
      JSB KCVT      CONVERT FILE LU TO ASCII
      DEF *+2 
      DEF .DLU
      STA .DLU
      JSB KCVT      CONVERT FILE TYPE 
      DEF *+2 
      DEF .TYP
      STA .TYP
* 
      JSB CNUMD     CONVERT LINE LU NUMBER TO ASCII 
      DEF *+3 
      DEF LU
      DEF .LU.
      JSB EXEC      PRINT IT
      DEF *+8 
      DEF D18N      PROTECT OURSELVES AGAINST BOGUS LU
      DEF LUPRN 
      DEF MSG1
      DEF MSG1L 
      DEF D0
      DEF D4
      DEF CLAS1     USE OUR OWN CLASS NUMBER
      NOP 
* 
POPN1 EQU * 
* 
      LDA POOLS     GET THE POOL SEQUENCE NUMBER
      INA           INCREMENT TO GET SEQ# OF THIS DOWNLOAD
      SSA           MAKE SURE BIT 15 IS 0 
      CLA,INA       RESET POOL
      STA POOLS     IN ANY CASE REPLACE UPDATED POOL
      LDB IERR      GET ERROR STATUS
      CPB D1        IS THIS A TYPE 1 FILE?
      IOR BIT15     YES, BIT 15 OF SEQ# FLAGS TYPE 1 FILE 
      STA SEQ#      IN ANY CASE, PUT IT IN REQUEST BUFFER 
      STA SEQAD,I   AND 2ND WORD OF DOWNLOAD ENTRY
      CMB,SSB,INB   FINALLY CHECK ERROR STATUS
      JMP NEXT      ALL OK, CONTINUE
      SPC 2 
OPNER EQU * 
      STB IERR      SAVE POSITIVE ERROR FOR CNUMD 
      LDB #PRLU     USER WANT MESSAGES? 
      SZB,RSS 
      JMP ERR1      NO, JUST CLEAR OUT ENTRY
      STB LUPRN 
      JSB CNUMD 
      DEF *+3 
      DEF IERR
      DEF FILER 
      JSB EXEC      PRINT FILE-OPEN ERROR MESSAGE 
      DEF *+8 
      DEF D18N
      DEF LUPRN 
      DEF MSG3
      DEF MSG3L 
      DEF D0
      DEF D4
      DEF CLAS1 
      NOP 
      JSB PRFAL     PRINT "DOWNLOAD FAILED" MESSAGE 
      DEF .FAIL 
      JMP ERR1
      HED SEND NEXT DOWNLOAD RECORD      * (C) HEWLETT-PACKARD CO 1979
* 
* 
*  ENTER HERE WHEN COMPLETION OF PREVIOUS WRITE HAS OCCURRED
* 
IOCOM JSB SRCH      FIND DOWNLOAD TABLE ENTRY FOR LU
      JMP CLEAR     LU NOT IN TABLE, RELEASE LINKE
      LDA SEQAD,I   GET SEQ # OF TABLE ENTRY
      CPA SEQ#      DOES IT MATCH?
      RSS           YES 
      JMP IGNOR     NO, IGNORE THIS COMPLETION
*  CHECK DRIVER ERROR STATUS
      LDA IERR      GET ERROR STATUS FROM DRIVER
      RAR           BIT 1 WILL TELL 
      SLA,RSS       LSB OF EQT5 
      JMP ACCPT     NO ERRORS, DO NEXT
* 
*  DRIVER ERROR OCCURRED
* 
      AND B100      TEST FOA A RETRYABLE ERROR
      CLE,SZA 
      JMP FAIL      NONE, SO TREAT AS HARD FAILURE
* 
      LDA CURAD,I   GET RETRY COUNT 
      ADA RTBIT     BUMP RETRY COUNT
      STA CURAD,I 
      SEZ           RETRIES EXHAUSTED?
      JMP FAIL      YES 
* 
      ISZ ERCNT     KEEP RETRY COUNT
      NOP            FOR THOSE INTERESTED 
      JSB EXEC      SUSPEND FOR 200 MILLISECS 
      DEF *+6 
      DEF D12N
      DEF D0
      DEF D1
      DEF D0
      DEF M20 
D0    NOP 
      LDA LU        SET UP CONWRD 
      IOR BIT15      FOR RETHREAD CALL
      STA CONWD 
      JSB #RQUE     RE-THREAD REQUEST ONTO CLASS NUMBER 
      DEF *+9 
      DEF D20N
      DEF CONWD 
      DEF ZERO
      DEF ZERO
      DEF ZERO
      DEF ZERO
      DEF CLAS1 
      DEF CLAS1 
      SZA,RSS       OK? 
      JMP PGET      YES 
* 
FAIL  JSB RLEAS     RELEASE CLASS BUFFER
      JSB PRFAL     PRINT "DOWNLOAD FAILED..." MESSAGE
      DEF .FAL1 
      JMP ERR3      CLEAR OUT TABLE ENTRY 
* 
CLEAR JSB RLEAS     RELEASE CLASS BUFFER
      JMP CLMDE     SET DS MODE AND RETURN TO THE GET 
* 
ACCPT JSB RLEAS     RELEASE CLASS BUFFER
      SKP 
* 
*  THIS SECTION IS ENTERED TO GET NEXT RECORD FROM DOWNLOAD FILE. 
* 
NEXT  LDA SEQ#      DETERMINE IF THIS IS A
      LDB BFAD      TYPE 1 FILE 
      SSA           CHECK IT
      JMP *+3       TYPE 1, READF CALL MUST BE MODIFIED 
      LDA LEN7      TYPE 7, RESET THE MAXIMUM LENGTH
      JMP *+6       AND SKIP THE GARBAGE
      LDA DADD      NOW THE READ ADDRESS MUST BE MODIFIED 
      CPA D2        UNLESS IT IS THE FIRST RECORD 
      JMP *+2       IT IS 
      ADB D2        OK, ADD 2 WORDS TO START OF BUFFER
      LDA LEN1      AND READ ONLY 128 WORDS 
* 
      STA MAXL      SET THE READ LENGTH 
      STB RDBUF     ITS EITHER MODIFIED OR RESET
* 
      JSB READF     READ NEXT RECORD
      DEF *+6 
DCBAD NOP 
      DEF IERR
RDBUF DEF DBUF      THIS IS EITHER DBUF OR DBUF+2 (TYPE 1)
      DEF MAXL      MAX ALLOWED LENGTH
      DEF LENX      ACTUAL LENGTH 
* 
      LDA IERR      WAS THE READ ERRORLESS? 
      CPA M12       IF A TYPE 1 FILE -12 INDICATES EOF
      JMP EOFND     IT WAS
      SSA 
      JMP ERR2      ERROR IN FILE READ
* 
      LDB LENX
      SSB           CHECK FOR EOF 
      JMP EOFND     FOUND, WRAP IT UP 
* 
      LDA SEQ#      CHECK THE FILE TYPE 
      SSA,RSS       IS IT A TYPE 1 FILE?
      JMP VCKSM     THIS IS NOT A TYPE 1, VERIFY CHECKSUM 
      LDB DADD      GET THIS DESTINATION ADDRESS
      SSB           HAS THE ADDRESS GONE NEGATIVE?
      JMP EOFND     YES, ONLY LOAD 32K
      STB DBUF+1    SAVE IT IN THE SECOND WORD
      LDA LENX      THEN BUILD LENGHT WORD
      CPB D2        IS THIS THE FIRST TYPE 1 RECORD?
      ADA M2        YES MODIFY THE LENGTH 
      STA LENX      BETTER SAVE IT
      ADB LENX      WHILE WE ARE AT IT, BETTER COMPUTE
      STB DADD      THE NEW DESTINATION ADDRESS 
      ALF,ALF       NOW POSITION THE COUNT
      AND B1774     MAKE SURE BITS 0-7 ARE CLEAR
      STA DBUF      FIRST BUFFER WORD IS DONE 
      LDB LENX      AGAIN!
      ADB D3        THIS TIME FOR THE DRIVER
      STB LENX
* 
*  VERIFY/BUILD CHECKSUM OF NEXT RECORD TO BE DOWNLOADED
* 
VCKSM LDA DBUF      GET THE WORD COUNT
      ALF,ALF 
      AND B377
      SZA,RSS       IS THIS A ZERO LENGTH RECORD? 
      JMP NEXT      YES, IGNORE IT
      INA           INCLUDE DESTINATION ADDRESS 
      CMA,INA 
      STA CNTR      WORD COUNTER. 
      CLA 
      LDB DBFAD     BUFFER ADDRESS
CKSML ADA 1,I       ADD UP THE WORDS. 
      INB 
      ISZ CNTR
      JMP CKSML 
      STB BUFR      SAVE THE CHECKSUM ADDRESS FOR NOW 
      LDB SEQ#      SINCE WE HAVE TO DETERMINE IF 
      SSB           THIS WAS A TYPE 1 FILE
      STA BUFR,I    YES, SAVE THE CHECKSUM
      CPA BUFR,I    IN ANY CASE, COMPARE THE CHECKSUMS
      RSS 
      JMP CKSME     NOT EQUAL.
* 
*  CHECKSUM OK, SETUP TO WRITE THIS RECORD
      LDA LU        GET LU
      IOR BIT15     SET "TRUE LU" FLAG
      STA CONWD     
      LDA CURAD,I 
      AND MSKLU     INITIALIZE RETRY COUNT
      STA CURAD,I 
* 
*  NOW DO CLASS I/O WRITE/READ TO DRIVER
* 
      JSB XLUEX 
      DEF *+8 
      DEF D20N      NO ABORT BIT IS SET 
      DEF CONWD     WRITE DATA
      DEF DBUF      DATA BUFFER ADDR
      DEF LENX      BUFFER LENGTH 
      DEF RQBUF 
      DEF D3
      DEF CLAS1     WRITE IT ON PROGL'S CLASS 
      RSS           ERROR 
*  NOW GO INTO SUSPEND ON PROGL'S CLASS UNTIL A DRIVER WRITE COMPLETES
* OR A NEW REQUEST IS RECEIVED. 
      JMP PGET
      JSB PRFAL     CLASS-IO ERROR
      DEF .CLSR 
      JMP CLMDE     SET DS MODE THEN GO GET NEW REQUEST 
* 
* 
*  ENTER HERE WHEN END OF DOWNLOAD FILE IS DETECTED 
*  RETURN GOOD STATUS FOR A SUCCESSFUL DOWNLOAD 
* 
EOFND EQU * 
      LDA #PRLU     DOES USER WISH
      SZA,RSS         ANNOUNCEMENTS?
      JMP EOFN1     NO. 
      STA LUPRN 
      LDA DCBAD     GET ADDRESS OF
      ADA D144        FILE # ENTRY
      LDB 0,I 
      JSB GFNAM     CONVERT FILE NUMBER TO FILE NAME
      LDA @SUC      MOVE 'WAS SUCCESSFUL' TO PRINT BUFFER 
      LDB @RSLT 
      JSB .MVW
      DEF D8
      NOP 
      JSB EXEC
      DEF *+8 
      DEF D18N
      DEF LUPRN 
      DEF MSG2
      DEF MSG2L 
      DEF D0
      DEF D4
      DEF CLAS1 
      NOP 
EOFN1 EQU * 
      JSB CLSE      CLOSE DOWNLOAD FILE 
      CLA           0= GOOD DOWNLOAD
* 
TERM  STA EBUF+1    SET STATUS FOR TRANSMISSION 
      STA EBUF+2     AND IN CHECKSUM
      LDA LU
      IOR BIT15 
      STA CONWD     SET DVA65 CONTROL WORD
* 
      JSB XLUEX     WRITE FINAL REQUEST 
      DEF *+8 
      DEF D20N      CLASS WRITE/READ TO COMM DRIVER 
      DEF CONWD 
      DEF EBUF
      DEF D3
      DEF RQBUF 
      DEF D3
      DEF CLAS1     PROGL CLASS NUMBER
      NOP 
* 
*  THIS DOWNLOAD IS OVER
*  CLEAN OUT DOWNLOAD TABLE ENTRY AND GIVE SPACE TO 
*  ANY ENTRY FOUND IN WAITING QUEUE 
* 
      CLA 
      STA CURAD,I   SET DOWNLOAD ENTRY AS AVAILABLE 
      LDA DS        MUST ALSO SET THIS EQT
      JSB SETMD     TO DS MODE
      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, SUSPEND ON 'GET'
* 
*  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 
      STA LU         AND PUT IT IN "LU" TOO !!! 
      CLA 
      STA 1,I       CLEAR WAIT QUEUE ENTRY
      INB 
      LDB 1,I       PICKUP FILE # AND START DOWNLOADING IT
      JMP NEWLD 
* 
CLMDE LDA DS        SET EQT TO DS MODE
      JSB SETMD     BEFORE RETURNING TO 
      JMP PGET      WAIT ON THE CLASS GET 
* 
*     ROUTINE TO SET THE DRIVERS MODE 
SETMD NOP 
      STA DSCON+1   SAVE FUNCTION 
      LDA LU        SET 
      IOR BIT15       DRIVER
      STA DSCON         CONTROL WORD
      JSB XLUEX     SET DRIVER TO CORRECT MODE
      DEF *+4 
      DEF D3
      DEF DSCON 
      DEF SCODE 
      JMP SETMD,I 
      HED PROGL SUBROUTINES & DATA AREA  * (C) HEWLETT-PACKARD CO 1979
* 
*  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 
      AND MSKLU     MASK POSSIBLE RETRY COUNT 
      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 DCBAD      & ADDRESS FOR DCB
      JMP SRCH,I    RETURN
* 
*  RELEASE CLASS BUFFER 
* 
RLEAS NOP 
      JSB EXEC      DO DUMMY CLASS GET
      DEF *+5 
      DEF D21 
      DEF CLAS2 
      DEF BUFR
      DEF ZERO
      JMP RLEAS,I 
* 
*  CLOSE DOWNLOAD FILE, UNLESS IT IS OPEN FOR ANOTHER DOWNLOAD
* 
CLSE  NOP 
*  SET FILE # ENTRY TO INDICATE CLOSED FILE 
      CCA 
      ADA CURAD 
      ADA TLENT 
      LDB 0,I       SAVE FILE 
      STB FLNUM      NUMBER 
      LDB D12N      CLEAR 
      STB 0,I        ENTRY
*  CHECK TO SEE IF THE FILE IS STILL OPEN 
      LDA NACTV     SET UP LOOP 
      STA CNTR       COUNTER = - # ENTRIES
      CCA           POINT TO FIRST
      ADA TABAD      FILE NUMBER ENTRY
BUMP2 ADA TLENT 
      LDB 0,I       GET FILE NUMBER 
      CPB FLNUM     IF = CURRENT ONE, 
      JMP CLR9         GO DUMMY UP DCB
      ISZ CNTR      MORE TO SEARCH? 
      JMP BUMP2       YES--STAY IN LOOP 
*  CURRENT NUMBER NOT FOUND. CLOSE FILE FOR REAL
      JSB CLOSE 
      DEF *+3 
      DEF DCBAD,I 
      DEF IERR
      JMP CLSE,I
*  CLEAR WORD 9 OF DCB SO FMP THINKS IT'S CLOSED
CLR9  CLA 
      LDB DCBAD 
      ADB D9
      STA 1,I 
      JMP CLSE,I
* 
*  DOWNLOAD TABLE IS FULL, PUT THIS REQUEST IN WAITING QUEUE
* 
FULL  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 FILE #
      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      FILE #
      STA 1,I       GOES INTO 2ND WORD
      JMP PGET      GO BACK TO SUSPEND ON GET 
* 
ERR1  CCA           ERROR IN FILE OPEN (A=-1) 
      JMP TERM
*                   HERE WHEN FILE-READ ERROR OCCURS
* 
ERR2  EQU * 
      LDB #PRLU     SHOULD WE BOTHER PRINTING ERROR MESSAGE?
      SZB,RSS 
      JMP ER.2      NO
      STB LUPRN 
      CMA,INA       MAKE ERROR CODE NEGATIVE SO CNUMD CAN CONVERT 
      STA IERR
      JSB CNUMD 
      DEF *+3 
      DEF IERR
      DEF .FILE 
      JSB EXEC      PRINT FILE-READ ERROR 
      DEF *+8 
      DEF D18N
      DEF LUPRN 
      DEF .RDER 
      DEF D15 
      DEF D0
      DEF D4
      DEF CLAS1 
      NOP 
      JSB PRFAL 
      DEF .FAIL 
ER.2  EQU * 
      JSB CLSE      ERROR IN FILE READ, DO CLOSE
      LDA M2        (A=-2)
      JMP TERM
      SPC 2 
ERR3  JSB CLSE      DRIVER ERROR, DO CLOSE
      LDA M3        (A=-3)
      JMP TERM
      SPC 2 
*     HERE ON CHECKSUM ERROR ON READ
* 
CKSME EQU * 
      JSB PRFAL 
      DEF .CKER 
      JMP ER.2
      SPC 2 
*     SUBROUTINE TO CONVERT FILE NUMBER INTO ASCII FILE NAME. 
* 
*     CALLING SEQUENCE: 
*     LDB <FILE NUMBER> 
*     JSB GFNAM 
*     <RETURN>
* 
* 
GFNAM NOP 
      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
      STA NAME+2
      LDA #PRLU     USER WISH ANNOUNCEMENT? 
      SZA,RSS 
      JMP GFNAM,I   NO,RETURN 
      STA LUPRN 
      JSB EXEC      YES, INCLUDE TIME-OF-DAY
      DEF *+3 
      DEF D11 
      DEF DBUF
      JSB CNUMD     CONVERT DAY NUMBER
      DEF *+3 
      DEF DBUF+4
      DEF .DAY
      LDB AM        CONVERT 24-HR TIME TO 12-HR TIME
      LDA DBUF+3
      ADA M12       PM? 
      SSA 
      JMP GFNM1     NO. 
      SZA,RSS       12 NOON?
      LDA D12       YES 
      STA DBUF+3
      LDB PM
GFNM1 EQU * 
      STB AMPM
      LDA DBUF+3    GET HOUR AGAIN
      SZA,RSS       ZERO? 
      LDA D12       YES 
      STA DBUF+3
      JSB KCVT      CONVERT HOUR NUMBER 
      DEF *+2 
      DEF DBUF+3
      STA .HR 
      JSB KCVT      CONVERT MINUTES 
      DEF *+2 
      DEF DBUF+2
      STA .MIN
      JMP GFNAM,I   RETURN TO CALLER
      SPC 2 
*     SUBROUTINE TO HANDLE THE REPETITIVE PARTS OF PRINTING 
*     A "DOWN-LOAD FAILED" MESSAGE. 
* 
*     CALLING SEQUENCE: 
*     JSB PRFAL 
*     DEF <REASON FOR FAILURE MESSAGE>
*     <RETURN>
* 
PRFAL NOP 
      LDA PRFAL,I   GET ADDRESS OF MESSAGE
      ISZ PRFAL     BUMP RETURN 
      LDB #PRLU     ARE WE SUPPOSED TO
      SZB,RSS        PRINT A MESSAGE? 
      JMP PRFAL,I   NO, RETURN TO CALLER
      STB LUPRN     SAVE LU 
      LDB @RSLT     MOVE REASON FOR FAILURE INTO
      JSB .MVW        "DOWN LOAD OF..." MESSAGE AREA
      DEF D8
      NOP 
      LDA DCBAD     GET ADDRESS OF
      ADA D144        FILE NUMBER 
      LDB 0,I       GET FILE NUMBER 
      JSB GFNAM     CONVERT THIS TO ASCII & ALSO FORMAT TIME-OF-DAY 
      JSB EXEC      PRINT MESSAGE 
      DEF *+8 
      DEF D18N      USE CLASS-I/O 
      DEF LUPRN 
      DEF MSG2
      DEF MSG2L 
      DEF D0
      DEF D4        LENGTH OF 4 SO WE CAN SEPARATE
      DEF CLAS1        OUR OWN PRINTOUTS FROM 
ZERO  NOP              XMISSION LINE COMPLETIONS
      JMP PRFAL,I   RETURN TO CALLER
      SPC 2 
* 
*  DATA AREA
* 
      SUP 
MSG1  ASC 9, INITIATING VIA LU
.LU.  BSS 3 
MSG2  ASC 9, DOWNLOAD OF FILE:
NAME  BSS 3 
      ASC 2,::- 
.DLU  ASC 1,        STORAGE FOR FILE DISC LU HERE 
      ASC 1,: 
.TYP  ASC 1,        STORAGE FOR FILE TYPE HERE
      OCT 6412      CARRIAGE RETURN-LINEFEED
      ASC 4, AT DAY 
.DAY  BSS 3 
      ASC 1,, 
.HR   NOP 
      ASC 1, :
.MIN  NOP 
AMPM  BSS 1         'AM' OR 'PM'
* 
.RSLT BSS 8 
MSG1L ABS *-MSG1-8
MSG2L ABS *-MSG2-1
* 
@RSLT DEF .RSLT 
@SUC  DEF *+1 
      ASC 8, WAS SUCCESSFUL 
.FAIL ASC 8, HAS FAILED.
.ABR1 ASC 8, WAS ABORTED
.FAL1 ASC 8, FAILED:LINE ERR
.CLSR ASC 8, FAILED:CLASS ER
.RDER ASC 12,/PROGL:FILE READ ERROR-
.FILE BSS 3 
.CKER  ASC 8, FAILED:CKSM ERR 
MSG3  ASC 11,/PROGL:FMP OPEN ERROR- 
FILER BSS 3 
MSG3L ABS *-MSG3
LUPRN NOP 
AM    ASC 1,AM
PM    ASC 1,PM
FLNUM NOP 
RQLEN NOP 
IERR  NOP 
CLAS1 NOP 
CLAS2 NOP 
ERCNT NOP 
TPNT  NOP 
CNTR  NOP 
LENX  NOP 
* THE NEXT TWO WORDS MUST BE IN SEQUENCE. 
CONWD NOP 
      OCT 10300     SUBFUNCTION FOR PROGL WRITES
POOLS NOP 
CURAD NOP 
SEQAD NOP 
DSCON BSS 2 
*  3 WORD REQUEST AREA
RQBUF EQU * 
LU    NOP 
SEQ#  NOP 
DADD  NOP 
* 
D1    DEC 1 
D2    DEC 2 
D18N  OCT 100022    NO-ABORT CLASS-I/O 'WRITE' REQUEST CODE 
D3    DEC 3 
D4    DEC 4 
D7    DEC 7 
D8    DEC 8 
D9    DEC 9 
D11   DEC 11
D12   DEC 12
D15   DEC 15
D21   DEC 21
D144  DEC 144 
M2    DEC -2
M3    DEC -3
M12   DEC -12 
M20   DEC -20 
BIT15 OCT 100000
B100  OCT 100 
B377  OCT 377 
B1774 OCT 177400
B20K  OCT 20000 
D12N  OCT 100014
D20N  OCT 100024
NONDS OCT 3300
DS    OCT 3200
SCODE OCT 70736 
RTBIT OCT 1000      INCREMENT FOR RETRY FIELD 
MSKLU OCT 777       MASK FOR LU WORD
MSKCN OCT 17777     MASK TO GET JUST CLASS NUMBER 
LSIZE ABS #LSZ
* 
TLENT DEC 147       SIZE OF DOWNLOAD TABLE ENTRY
NACTV ABS -#ACTV
NQUE  ABS #ACTV-#TERM 
MAXL  NOP 
LEN1  DEC 128 
LEN7  DEC 255 
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 
BFAD  DEF DBUF      ACTUAL ADDRESS OF DOWNLOAD BUFFER 
* 
EBUF  DEC 0,0,0     TERMINATING BUFFER
BUFR  BSS 3         THIS MUST BE BEFORE THE FILE INPUT BUFFER 
DBUF  BSS 255       FILE INPUT BUFFER 
* 
*  THE FOLLOWING RESERVES SPACE FOR THE ACTIVE DOWNLOAD TABLE.
* 
*     FORMAT:  WORD 1 RETRY COUNT (BITS 15-8), LU (BITS 7-0)
*                   2 SEQUENCE NUMBER (NOT SAME AS SEQUENCE NUMBERS IN
*                     TCBS) 
*               3-146  DATA CONTROL BLOCK 
*                 147 FILE NUMBER 
DT    REP #ACTV 
      BSS 147 
* 
*  THE FOLLOWING RESERVES SPACE FOR THE WAIT QUEUE
WAITQ REP #TERM-#ACTV  WAITING QUEUE: LU & FILE # 
      BSS 2 
* 
      END PROGL 
                                                                