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