ASMB,R,L,C HED GRPM 91740-16014 REV 1913 * (C) HEWLETT-PACKARD CO. 1979 NAM GRPM,17,4 91740-16014 REV 2001 791024 SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. 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 ENT GRPM EXT EXEC,#RSAX,#NCNT,#REQU,#RTRY,$OPSY EXT #NODE,#GRPM,$TIME,#PLOG EXT #NULL,#LDEF,#QCLM,#BREJ EXT #TBRN,#QRN,$RNTB EXT $LIBR,$LIBX,RNRQ,DRTEQ * SUP * * NAME: GRPM * SOURCE: 91740-18014 * RELOC: 91740-16014 * PGMR: CHUCK WHELAN * DATE: 17 DEC 76 * MODIFIED BY: LYLE WEIMAN, AUG. '78 * * * * GRPM IS THE GENERAL REQUEST PRE-PROCESS MODULE FOR DS/1000. * IT PROCESSES INCOMING REQUESTS AND OUTGOING COMPLETIONS. * * I INCOMING REQUESTS * * 1. HANGS ON A GET ON ITS CLASS NUMBER, AND WHEN * SATISFIED, MOVES THE REQUEST INTO ITS LOCAL BUFFER. * 2. IF THE REQUEST IS NOT DESTINED FOR THE LOCAL NODE, * THE REQ/DATA IS RETHREADED FOR OUTPUT TO THE * APPROPRIATE LU ON "GRPM"S CLASS NUMBER. * 3. IF LOCAL AND A NEW REQUEST, DOES THE FOLLOWING: * A) IF NO TCBS ARE AVAILABLE, SETS THE REPLY FLAG * AND REMOTE BUSY FLAG AND RETURNS THE REQUEST TO * THE ORIGINATOR BY RETHREADING THE REPLY FOR OUTPUT ON * "GRPM"S CLASS. * B) IF SYSTEM IS GOING QUIESCENT, OR THE MONITOR IS * IN AVAILABLE MEMORY SUSPEND (STATE 4), THE "BUSY" * FLAG IS SET IN THE REQUEST AND THE ENTIRE TRANSACTION * IS RETURNED TO THE ORIGINATOR. * C) OTHERWISE, CALLS "#RSAX" TO CREATE THE SLAVE TCB. * D) DETERMINES THE MONITORS CLASS NUMBER FROM "RES" * TABLE AND RETHREADS THE REQ/DATA TO THAT CLASS. * IF THE MAXIMUM QUEUE DEPTH LIMIT FOR THAT MONITOR IS * EXCEEDED BY THIS RE-THREAD, THE ENTIRE REQUEST IS RETURNED * TO THE ORIGINATOR (AS DESCRIBED ABOVE), WITH A "DS08" * ERROR. * 4. IF LOCAL AND A REPLY, DOES THE FOLLOWING: * A) IF "BUSY" FLAG IS SET, CLEARS IT AND RETHREADS * THE REQUEST TO RTRY SO AFTER A DELAY IT CAN * BE REATTEMPTED. HOWEVER, IF IT IS A LOCAL * REQUEST, DS08 IS RETURNED IMMEDIATELY. * B) CALLS #RSAX TO SEARCH FOR THE MASTER TCB. * C) IF FOUND, RETHREADS THE REQ/DATA ON THE MASTER'S * CLASS #. * 5. IF #PLOG IS NON-ZERO, COMPLETED WRITE CLASS BUFFERS * ARE RETHREADED TO PLOG, OTHERWISE THEY ARE DEALLOCATED. * 6. WHEN DONE, "GRPM" RETURNS TO ITS GET. * * II OUTGOING LINE COMPLETIONS * * GRPM PROCESSES COMPLETION STATUS OF ALL COMMUNICATION REQUEST/DATA * WRITE OPERATIONS (EXCEPT PROGL). IF AN OPERATION IS SUCCESSFUL * AND PLOG IS ENABLED, THE REQUEST IS RETHREADED TO PLOG'S CLASS, * IF NOT, THE CLASS BUFFER IS DEALLOCATED. * ON REMOTE OR LOCAL BUSY ERRORS, GRPM CHECKS THE RETRY COUNT IN * THE STREAM WORD OF THE REQUEST. IF ALL RETRIES HAVE BEEN * EXHAUSTED, IT IS TREATED AS A LINE ERROR AND A DS08 IS RETURNED. * IF ANOTHER RETRY IS POSSIBLE, THE ABSOLUTE SYSTEM TIME AT WHICH * THE RETRY SHOULD BE ATTEMPTED IS COMPUTED AND STORED IN THE * EQT5 STATUS SAVE AREA IN THE CLASS HEADER. THE CLASS BUFFER IS * THEN RETHREADED ON "RTRY"S CLASS. * PARITY OR LINE TIMEOUT ERRORS ARE RETRIED 3 TIMES BY RETHREADING * TO "RTRY". IF ALL 4 TRIES FAIL, A DS02 ERROR IS RETURNED. IF * A "STOP RECEIVED" CONDITION IS DETECTED, A DS01 ERROR IS RETURNED. * ALL LINE ERRORS HAVE THE ERROR CODE AND THE LOCAL NODE NUMBER * STORED IN THE ERROR FIELD IN THE REQUEST. * IF THE REQUEST WAS A REPLY, THE CLASS BUFFER IS SIMPLY * CLEARED OR THE REQUEST IS RETHREADED TO PLOG (IF ENABLED). * IF A NON-REPLY, AND THE ORIGINATOR IS NOT THE LOCAL NODE, THE * REPLY FLAG IS SET, AND THE REQUEST IS SENT BACK TO THE ORIGINATOR. * IF THE ORIGINATOR IS LOCAL, THE REPLY IS RETHREADED ON THE * MASTER REQUESTORS CLASS. SKP GRPM EQU * LDB $OPSY RBR,SLB SKIP IF NON-DMS CLA,RSS JMP GRGET STA MOD1 MODIFY FOR DMS STA LOOP STA LUFND STA MOD4 STA MOD5 * GRGET JSB EXEC HANG ON CLASS DEF *+6 DEF K21 DEF #GRPM RQADR DEF RQBUF REQUEST BUFFER DEF K0 ZERO LENGTH GET DEF BFADR ADDR OF SAM REQST BUFFER * STA TEMP SAVE ERROR STATUS ADB K8 CMB,INB ADB BFADR COMPUTE CLASS HEADER ADDRESS STB HEADR * LDA BFADR LDB RQADR SET TO MOVE 4 WORDS OF REQUEST MOD1 JMP RQLOC NOP HERE IF DMS LDX K4 MWF MOVE 4 WORDS FROM SYSTEM MAP JMP *+4 RQLOC MVW K4 MOVE 4 WORDS LDA TEMP SLA,RSS ANY DRIVER ERRORS JMP ERCHK YES ALF,ALF SSA WAS THIS A WRITE COMPLETION? JMP WASOK YES, PROCESS IT SPC 3 * * SUCCESSFUL READ COMPLETION LOGIC FOLLOWS * LDA RQBUF GET STREAM WORD CKNOD LDB RQBF3 ADDR OF SOURCE NODE RAL SSA,RSS REPLY? INB NO, POINT TO DESTINATION NODE LDB 1,I GET NODE # STB TEMP2 SAVE NODAL ADDRESS SSB,RSS SKIP IF ALWAYS LOCAL CPB #NODE IS IT US? JMP LOCAL YES SKP * * STORE & FORWARD OR BUSY/ERROR REPLY TO ANOTHER NODE * * INITIALIZE THE WRITE RETRY COUNTS * LDA RQBUF AND LEMSK CLEAR COMM LINE RETRY COUNT LDB BFADR JSB STUFF STORE MODIFIED STREAM WORD * * CONVERT DESTINATION NODE TO LU * DLD #NCNT GET ADDR & COUNT OF NRV TABLE STA TEMP SAVE COUNTER * LOOP JMP LOOP0 NOP'D IF DMS SYSTEM XLA 1,I CROSS-LOAD CPU # IF DMS SYSTEM RSS LOOP0 LDA 1,I LOAD CPU # IF NON-DMS INB POINT TO CORRESPONDING LU CPA TEMP2 IS IT THE GOOD ONE ? JMP LUFND YES INB BUMP ADDR TO NEXT NODE # ISZ TEMP END OF TABLE ? JMP LOOP NO, CONTINUE * * NODAL ADDRESS CAN'T BE CONVERTED TO OUTPUT LU LDA ASC04 GIVE A "DS04" JMP ERETN ERROR, NODE IS NON-ADDRESSABLE * LUFND JMP LUFN0 NOP'D IF DMS SYSTEM XLA 1,I CROSS-LOAD LU IF DMS SYSTEM RSS LUFN0 LDA 1,I LOAD LU IF NON-DMS AND B77 ISOLATE IT * * RETHREAD CLASS BUFFER FOR OUTPUT TO NODE * STA TEMP SAVE OUTPUT LU JSB DRTEQ GET THE LOGICAL UNIT DEF *+2 SUBCHANNEL BITS DEF TEMP FROM THE DRT ENTRY ALF,CLE,ELA POSITION SUBCHANNEL LSB TO LDA ICNWD REMOVE THE PREVIOUS SUBCHANNEL LSB AND N5 FROM THE CONTROL WORD SEZ IF THE OUTPUT LU SPECIFIES AN ODD SUBCHANNEL, IOR K4 THEN SET BIT # 2 STA ICNWD IN THE CONFIGURED CONTROL WORD JSB #REQU OUTPUT BUFFER DEF *+5 DEF #GRPM DEF #GRPM DEF TEMP OUTPUT LU DEF ICNWD NEW CONTROL WORD SZA JSB ERR1 CATASTROPHIC ERROR IF IT FAILED JMP GRGET BACK TO GET SKP * * WRITE WAS SUCCESSFUL * WASOK LDA #PLOG PLOG CLASS NUMBER SZA LOGGING? JMP THRED+1 YES, RETHREAD TO PLOG * JUST DEALLOCATE THIS CLASS BUFFER CLSAM LDA #GRPM ALR,RAR CLEAR "SAVE BUFFER" FLAG STA CLASS * JSB EXEC DO DUMMY GET TO CLEAR CLASS BUFFER DEF *+5 DEF K21 DEF CLASS DEF RQBUF DEF K0 * JMP GRGET BACK TO GET SKP * * THIS REQ/DATA IS DESTINED LOCALLY LOCAL EQU * LDA RQBUF GET STREAM WORD AND B10K ISOLATE LEVEL FIELD SZA LEVEL PRESENT? JMP ERLVL .YES, ERROR LDA RQBUF RAL,RAL SLA TEST REPLY FLAG JMP REPLY IT'S A REPLY * LDB #NULL SZB,RSS ANY TCBS AVAILABLE? JMP QRJCT NO, SEND IT BACK FOR AWHILE * LDA RQBUF AND B77 ISOLATE STREAM ADA #LDEF ADA K2 POINT TO LIST HEADER PNTR LDB 0,I POINT TO LIST HEADER INB STB TEMP SAVE ADDRESS OF CLASS # INB LDB 1,I GET ID SEGMENT ADDR OF MONITOR RBL,CLE,ERB CLEAR "NO ABORT" FLAG SZB,RSS IS THIS MONITOR ENABLED? JMP ILLRQ NO, RETURN A "DS06" ADB K15 POINT TO STATUS LDA 1,I GET MONITOR'S STATUS AND K15 CPA K4 AVAILABLE MEMORY SUSPEND? JMP QRJCT YES, REJECT REQUEST * LDB $RNTA RSS LDB 1,I RBL,CLE,SLB,ERB RESOLVE INDIRECT JMP *-2 LDA #QRN GET QUIESCENT RN AND B377 ISOLATE TABLE INDEX ADB 0 COMPUTE POSITION IN RN TABLE LDA 1,I GET IT AND B377 SZA QUIESCING? JMP QRJCT YES, SEND IT BACK SKP * * THIS REQUEST CAN NOW BE PASSED TO THE REQUIRED MONITOR * JSB #RSAX BUILD TCB FOR THIS STREAM DEF *+5 DEF K3 DEF RQBUF+1 PASS ORIGINATORS SEQ # DEF RQBUF & STREAM DEF RQBUF+2 & ORIGIN NODE NO. * SSB OK? JMP ILLRQ NO, GIVE DS06 ERROR * LDB BFADR INB POINT TO SECOND REQUEST WORD JSB STUFF STORE LOCAL SEQUENCE # * LDB #NULL NUMBER OF TCB'S LEFT SZB DID WE USE THE LAST ONE? JMP MONIT NO * JSB RNRQ YES! LOCK THE TABLE ACCESS RN DEF *+4 DEF LGNW GLOBAL LOCK, NO WAIT, NO ABORT DEF #TBRN DEF TEMP2 NOP MONIT LDA TEMP,I GET MONITOR'S CLASS SPC 2 SKP * * ENTER HERE TO RETHREAD THE CLASS BUFFER FROM #GRPM TO THE CLASS * NUMBER PASSED IN THE A REGISTER. * THRED RAL,CLE,ERA CLEAR SIGN STA CLASS * JSB #REQU RETHREAD TO DEF *+3 MONITOR/MASTER/RTRY/PLOG DEF #GRPM DEF CLASS * SZA,RSS OK? JMP GRGET YES,BACK TO GET CPA N10 MAXIMUM QUEUE DEPTH EXCEEDED? JMP BZYER YES, RETURN "DS08" ERROR. JMP ERR1 OTHER CATASTROPHIC ERROR. SPC 4 * * HERE WHEN LOCAL REPLY RECEIVED * REPLY SSA,RSS IS THIS A QUIESCENT/BUSY REJECT JMP REPOK NO LDA RQBUF YES AND B1174 CLEAR REPLY & BUSY FLAGS & LINE ERR CNTR STA RQBUF WORD GETS STORED IN SAM LATER LDB RQBUF+3 GET DESTINATION NODE CPB #NODE WAS THIS A LOCAL REQUEST? JMP BZYER YES! GIVE A DS08 NOW JMP RTRY2+1 RETHREAD TO RTRY * REPOK JSB #RSAX SEARCH FOR MASTER TCB DEF *+3 DEF K4 DEF RQBUF+1 SSB FOUND? JSB ERR1 NO, PURGE THE REQUEST JMP THRED RETHREAD IT (A REG = MASTER CLASS #) * QRJCT LDA RQBUF AND LEMSK CLEAR LINE ERROR COUNT IOR RPBZY SET "BUSY" & "REPLY" FLAGS JMP RPLYR SEND REPLY SKP * * ERROR OCCURRED * ERCHK LDB 0 GET EQT STATUS BLF,BLF SSB,RSS IS THIS AN OUTPUT COMPLETION? JMP EREAD NO, NOTE BUT IGNORE THE ERROR * LDB LBZY# DELAY FACTOR FOR LOCAL BUSY REJECTS RAR,SLA,RAR LOCAL BUSY REJECT? JMP DELAY YES, RETRY WITH DELAY SLA,RAR SIMULTANEOUS REQUEST? JMP SIMRQ LDB 0 RAR,SLA,RAR STOP RECEIVED? JMP LFAIL YES SLA REMOTE BUSY? JMP RTRY2 YES * * PARITY ERROR OR LINE TIMEOUT, CHECK RETRY COUNT LDA RQBUF STREAM WORD AND B300 ISOLATE RETRY COUNT CPA B300 ALL RETRIES EXHAUSTED? JMP LFAIL YES, GIVE LINE ERROR * LDB LERR# LINE ERROR DELAY FACTOR JSB SETDL SET DELAY LDA B100 BUMP BITS 7-6 JMP RBUMP * * REMOTE BUSY REJECT RTRY2 LDA RQBUF STREAM WORD AND .074 BITS 11-8 HAVE RETRY COUNT CPA .074 ALL RETRIES EXHAUSTED? JMP BZYER YES, GIVE ERROR LDA B400 BUMP BITS 11-8 LDB RBZY# DELAY FOR REMOTE BUSY (1 SEC) STB TEMP2 SAVE OFFSET (10'S OF MSECS) * RBUMP ADA RQBUF BUMP RETRY COUNT LDB BFADR ADDRESS OF REQUEST IN SAM JSB STUFF STORE MODIFIED STREAM WORD JMP DELA2 SKP * * SIMULTANEOUS REQUEST, DELAY REQUIRED SIMRQ LDB SIRQ# DELAY FACTOR FOR SIMULTANEOUS REQUEST * DELAY JSB SETDL COMPUTE REQUIRED DELAY * DELA2 CLE DLD $TIME CURRENT SYSTEM TIME ADA TEMP2 ADD DELAY TIME SEZ,RSS CARRY? JMP *+3 NO INB,SZB,RSS WILL DAY ROLL OVER? ADA B2500 YES, COMPENSATE FOR IT LDB HEADR POINT TO CLASS BUFFER HEADER ADB K2 BUMP TO 3RD WORD OF HEADER JSB STUFF PUT OFFSET THERE (A REG TO RTRY) * LDA #RTRY RTRY'S CLASS JMP THRED+1 NOW RETHREAD THIS CLASS BUFFER SKP * * IRRECOVERABLE LINE ERRORS * LFAIL LDA ASC01 GET A DS01 SLB WAS IT DRIVER TIMEOUT? INA YES, MAKE IT A DS02 RSS * * BUSY RETRY COUNT EXHAUSTED, GIVE A DS08 ERROR * BZYER LDA ASC08 RSS * * NO MONITOR FOR REQUESTED STREAM IS PRESENT, ILLEGAL REQUEST * ILLRQ LDA ASC06 * ERETN LDB RQBUF GET STREAM WORD RBL CCE,SSB REPLY? JMP ERRFL YES, NO RECOVERY POSSIBLE * LDB BFADR ADB K5 POINT TO REQUEST+5 JSB STUFF STORE ASCII CODE INB POINT TO REQUEST+6 LDA #NODE GET LOCAL NODAL ADDRESS RAL,ERA INDICATE THERE'S AN ASCII ERROR JSB STUFF STORE ERROR LOCATION WORD ADB N2 POINT TO REQUEST+4 LDA ASCDS GET "DS" JSB STUFF STORE IT LDB HEADR ADDRESS OF CLASS HEADER ADB K5 POINT TO XMISSION LOG (DATA LENGTH) CLA SET IT TO ZERO JSB STUFF SO NO DATA GETS SENT LDA RQBUF AND RTYCT IOR BIT14 SET REPLY FLAG IOR #BREJ INITIALIZE RETRY COUNTERS * RPLYR STA RQBUF LDB BFADR POINT TO 1ST REQUEST WORD IN SAM JSB STUFF STORE NEW VALUE JMP CKNOD NOW GO BACK TO SEND REPLY SKP * FORMAT OF BUFFER PASSED TO QCLM: * -------------------------------- * * **************************************** * 1 * STREAM WORD * NOTE: ON 'READ' ERRORS, WORD 1 * *--------------------------------------* IS LINE EQT ADDRESS. * 2 * SEQUENCE NUMBER * * *--------------------------------------* * 3 * SOURCE (ORIGINATING) NODE NUMBER * * *--------------------------------------* * 4 * DESTINATION NODE NUMBER * * *--------------------------------------* * 5 * P-REGISTER WHEN ERROR DETECTED * * *--------------------------------------* NOTE: CERTAIN COMBINATIONS * 6 * A-REGISTER WHEN ERROR DETECTED * OF A- AND B-REGISTER VALUES * *--------------------------------------* ARE USED TO FLAG SUCH CONDI- * 7 * B-REGISTER WHEN ERROR DETECTED * TIONS AS "COMMUNICATIONS * *--------------------------------------* READ ERROR", "TCB NOT FOUND, * 8 * TIME OF DAY WHEN ERROR DETECTED * ETC. * 9 * (2 WORDS) * * **************************************** * * FIRST OPTIONAL PARAMETER = ID SEGMENT ADDRESS OF SENDER * (USUALLY 'GRPM'). * * **************************************** * ERRFL CLB ERROR SENDING REPLY, ENCODE STB ERR1 SO QCLM PRINTS "REPLY FLUSHED..." LDB ASCDS JMP ERR1+1 * EREAD EQU * LDA TEMP MOVE I/O COMPLETION STATUS TO STA RQBUF+1 REQUEST BUFFER LDA N5 ENCODE SO 'QCLM' PRINTS LDB 0 "COMMUNICATIONS READ ERROR" JMP ERR1+1 * ERLVL EQU * LDA N6 ENCODE FOR LEVEL ERROR LDB 0 RSS * * THIS REQUEST IS NON-RECOVERABLE, CLEAR, LOG, THEN IGNORE IT ERR1 NOP HERE TO REPORT IRRECOVERABLE ERROR DST AREG SAVE REGS FOR QCLM LDA ERR1 STA PREG PASS ERROR ADDR TO QCLM DLD $TIME RECORD TIME OF ERROR DST TOD LDA #QCLM STA CLASS SAVE QCLM CLASS LOCALLY * JSB EXEC MAILBOX WRITE/READ TO QCLM DEF *+8 DEF K20N DEF K0 DEF RQBUF DEF K9 DEF XEQT DEF K0 DEF CLASS NOP * JMP CLSAM GO DEALLOCATE CLASS BUFFER SKP * * MULTIPLY PASSED TIMING FACTOR BY THE LINE TIMEOUT VALUE SETDL NOP STB TEMP2 LDB HEADR INB POINT TO 2ND WORD OF CLASS HEADER MOD4 JMP SETD0 NOP'D IF DMS SYSTEM XLA 1,I X-LOAD LINE'S TIMEOUT VALUE (DMS) RSS SETD0 LDA 1,I LOAD LINE'S TIMEOUT VALUE (NON-DMS) RAR FORM EQT14'S VALUE MPY TEMP2 TIMING FACTOR * LINE TIMEOUT STA TEMP2 SAVE ABSOLUTE DELAY (10'S OF MSECS) JMP SETDL,I * * STORE A WORD IN SAM * STUFF NOP JSB $LIBR GO PRIVILEGED K0 NOP MOD5 JMP STUF2 NOP HERE IF DMS XSA 1,I STORE IN ALTERNATE MAP RSS STUF2 STA 1,I JSB $LIBX DEF STUFF SKP * * CONSTANTS AND STORAGE * B77 OCT 77 BFADR NOP HEADR NOP TEMP NOP CLASS NOP TEMP2 NOP RPBZY OCT 60000 BIT14 OCT 40000 RTYCT OCT 170077 STREAM WORD RETRY COUNT MASK LEMSK OCT 177477 MASK TO CLEAR LINE ERROR COUNT ICNWD OCT 150101 LGNW OCT 140002 K2 DEC 2 K3 DEC 3 K4 DEC 4 K5 DEC 5 K8 DEC 8 K9 DEC 9 K15 DEC 15 K21 DEC 21 N2 DEC -2 N5 DEC -5 N6 DEC -6 N10 DEC -10 K20N OCT 100024 B100 OCT 100 B300 OCT 300 B377 OCT 377 B400 OCT 400 B2500 OCT 25000 B1174 OCT 117477 B10K OCT 010000 .074 OCT 007400 $RNTA DEF $RNTB * * TIME DELAY CONSTANTS LBZY# DEC -5 LOCAL BUSY DELAY = 5 * LINE TIMEOUT RBZY# DEC 100 REMOTE BUSY DELAY = 1 SECOND LERR# DEC -10 LINE ERROR RETRY DELAY = 10 * LINE TO SIRQ# DEC -4 SIMULTANEOUS REQ DELAY = 4 * LINE TO * ASC01 ASC 1,01 ASC04 ASC 1,04 ASC06 ASC 1,06 ASC08 ASC 1,08 ASCDS ASC 1,DS * RQBF3 DEF RQBUF+2 RQBUF BSS 9 IBUF EQU RQBUF * STREM EQU IBUF SEQ# EQU IBUF+1 SRC# EQU IBUF+2 DESTN EQU IBUF+3 PREG EQU IBUF+4 AREG EQU IBUF+5 BREG EQU IBUF+6 TOD EQU IBUF+7 * XEQT EQU 1717B * SIZE BSS 0 * END GRPM