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 . * 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 * JSB GFNAM * * * 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 * * 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