ASMB,R,Q,C NAM LUMAP,18,30 91750-16133 REV.2013 800317 ALL EXT DSTIO,EXEC,CNUMD,KCVT,.MVW,XLUEX,D$OVR EXT #MSTC,#RSAX,#LOGR *# EXT IO3K,#LU3K EXT #NODE,#LMPE,#SPLU,#LUMP,PGMAD 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. * ****************************************************************** * * * NAME: LUMAP * SOURCE: 91750-18133 * RELOC: 91750-16133 * PGMR: JOHN LAMPING * * WRITTEN BY LYLE WEIMAN [MARCH 1979] * MODIFIED BY JOHN LAMPING [NOVEMBER 1979] * * * * LUMAP IS THE DS/1000 PROGRAM WHICH PERFORMS THE REMOTE I/O. * IT IS PART OF THE DVV00/LUQUE/LUMAP TRIUMVIRATE. * * REMOTE "EXEC" CALLS ARE ISSUED VIA CALLS TO SUBROUTINE * "DSTIO", WITHOUT WAITING FOR THE REPLY. * * THESE ARE "NO-WAIT" CALLS, THEREFORE LUMAP IS NOT A BOTTLENECK * TO SYSTEM "MAPPED-I/O" TRAFFIC. * *NOTE: PROVISION HAS BEEN MADE FOR "VIRTUAL TERMINAL" * I/O TO/FROM HP 3000 NODES. TO ALLOW THIS CAPABILITY, REMOVE * THE TWO CHARACTERS *# IN COLUMNS 1 & 2 FROM ALL LINES * WHICH HAVE THEM, RE-ASSEMBLE, AND CODE A MODULE ANSWERING * A CALL TO IO3K WHICH HAS A "DSTIO-LIKE" CALLING SEQUENCE * (SEE INTERNAL CODE). PROVISION MUST ALSO BE MADE FOR SETTING UP * A MAP ENTRY WHEN A REMOTE HP 3000 SESSION "SIGNS ON", AND FOR * CLEARING IT UPON TERMINATION OF THE SESSION. SKP * GLBLK-START * ****************************************************************** * * * G L O B A L B L O C K REV 2001 790531 * * * * GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY: * * * * REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST * * GET, #SLAV, RQCNV, RPCNV, GRPM, DINIT, PTOPM * * EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3 * * DSTIO, LUMAP, #CMGT * ****************************************************************** * ***!!!!! THE ORDER OF THE FIRST 7 WORDS (#STR THRU #ENO) IS * ***!!!!! FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES * ***!!!!! AND ERROR CODES ALWAYS BE IN THE SAME PLACE, * ***!!!!! REGARDLESS OF MESSAGE FORMAT. THIS MAKES STORE-AND-* ***!!!!! FORWARD CODE MUCH SIMPLER. * #STR EQU 0 STREAM WORD. #SEQ EQU #STR+1 SEQUENCE NUMBER. #SRC EQU #SEQ+1 SOURCE NODE #. #DST EQU #SRC+1 DEST. NODE #. #EC1 EQU #DST+1 REPLY ECOD1. #EC2 EQU #EC1+1 REPLY ECOD2. #ENO EQU #EC2+1 NUMBER OF NODE REPORTING ERROR. * #ECQ EQU #ENO+1 ERROR CODE QUALIFIER (BITS 4 TO 7) #LVL EQU #ECQ MESSAGE FORMAT LEVEL (BITS 0 TO 3) #MAS EQU #LVL+1 MA "SEND" SEQ. # #MAR EQU #MAS+1 MA "RECV" SEQ. # #MAC EQU #MAR+1 MA "CANCEL" FLAGS #HCT EQU #MAC+1 HOP COUNT #SID EQU #HCT+1 SESSION ID WORD * #EHD EQU #SID LAST ITEM OF HEADER #MHD EQU #EHD+1 MINIMUM HEADER SIZE #REQ EQU #MHD START OF REQUEST SPECIFIC AREA #REP EQU #MHD START OF REPLY SPECIFIC AREA * #MXR EQU #MHD+24 <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>> #LSZ EQU 2 <<< SIZE OF LOCAL APPENDAGE AREA >>> * ****************************************************************** * * GLBLK-END SKP * DXBLK-START * ****************************************************************** * * * D E X E C B L O C K REV 2001 790716 * * * * OFFSETS INTO DS/1000 DEXEC MESSAGE BUFFERS, USED BY: * * * * DEXEC, EXECM, EXECW, RQCNV, RPCNV, FLOAD, REMAT * * DSTIO, LUMAP * ****************************************************************** * * OFFSETS INTO DEXEC REQUEST BUFFERS. * #ICD EQU #REQ ICODE FOR DEXEC(ALL) #CNW EQU #ICD+1 CONWD FOR DEXEC(1,2,3,13) #CWX EQU #CNW+1 DLUEX EXTENSION FOR DEXEC(1,2,3,13) #BFL EQU #CWX+1 IBUFL FOR DEXEC(1,2) #PM1 EQU #BFL+1 IPRM1 FOR DEXEC(1,2) #PM2 EQU #PM1+1 IPRM2 FOR DEXEC(1,2) #PRM EQU #CWX+1 IPRAM FOR DEXEC(3) #PGN EQU #ICD+1 PRGNM FOR DEXEC(6,9,10,12,23,24,99) #INU EQU #PGN+3 INUMB FOR DEXEC(6) #DPM EQU #INU+1 PARMS FOR DEXEC(6) (5-WORD AREA) #PMS EQU #PGN+3 PARMS FOR DEXEC(9,10,23,24) (5-WORD AREA) #IBF EQU #PMS+5 IBUFR FOR DEXEC(9,10,23,24) #IBL EQU #IBF+1 IBUFL FOR DEXEC(9,10,23,24) #FNO EQU #IBL+1 FNOD FOR DEXEC(9) (APLDR) #RSL EQU #PGN+3 IRESL FOR DEXEC(12) #MPL EQU #RSL+1 MTPLE FOR DEXEC(12) #HRS EQU #MPL+1 IHRS FOR DEXEC(12) #MIN EQU #HRS+1 IMIN FOR DEXEC(12) #SEC EQU #MIN+1 ISECS FOR DEXEC(12) #MSC EQU #SEC+1 MSECS FOR DEXEC(12) #PAR EQU #ICD+1 PARTI FOR DEXEC(25) (PARTITION #) #IST EQU #PGN+3 ISTAT FOR DEXEC(99) * * OFFSETS INTO DEXEC REPLY BUFFERS. * #EQ5 EQU #EC1 EQT 5 FOR DEXEC(1,2,3) #XML EQU #EC2 TRANSMISSION LOG (DEXEC 1,2) #RPM EQU #REP PRAMS FOR DEXEC(9,23) (5-WORD AREA) #TMS EQU #REP MSEC FOR DEXEC(11) #TSC EQU #TMS+1 SEC FOR DEXEC(11) #TMN EQU #TSC+1 MIN FOR DEXEC(11) #THR EQU #TMN+1 HRS FOR DEXEC(11) #TDA EQU #THR+1 DAY FOR DEXEC(11) #TYR EQU #TDA+1 YEAR FOR DEXEC(11) #ST1 EQU #REP ISTA1 FOR DEXEC(13) #ST2 EQU #ST1+1 ISTA2 FOR DEXEC(13) #ST3 EQU #ST2+1 ISTA3 FOR DEXEC(13) #PAG EQU #REP IPAGE FOR DEXEC(25) #IPN EQU #PAG+1 IPNUM FOR DEXEC(25) #PST EQU #IPN+1 ISTAT FOR DEXEC(25) #KST EQU #REP ISTAT FOR DEXEC(99) * * MAXIMUM SIZE OF DEXEC REQUEST/REPLY BUFFER. * #DLW EQU #MHD+11+#LSZ M A X I M U M S I Z E ! ! ! * * MAXIMUM SIZE OF DEXEC/EXECM DATA BUFFER. * #DBS EQU 512 M A X I M U M S I Z E ! ! ! * * DXBLK-END SKP LUMAP EQU * CLA,INA TURN ON STA D$OVR SESSION OVERRIDE LDA #LUMP SAVE CLASS NUMBER STA #MSTC IN "#CMGT" (WITH "NO-DEALLOCATE" BIT) IOR =B40000 ADD "SAVE BUFFER" BIT STA CLASS AND SAVE WITH THAT LDA #SPLU CONFIGURE CONTROL WORD IOR BIT15 WITH "TRUE LU" BIT STA RTRLU RETRY STA STPLU STOP STA SPCLU REPLY JSB CNUMD CONVERT LOCAL DEF *+3 NODE NUMBER DEF #NODE TO ASCII DEF .NOD. * * SET UP TRANSACTION TABLE (TT) * * LDA NTTEN NEGATIVE # TT ENTRIES STA CNTR LDA @TT ADDRESS OF TT CLB SLUP EQU * LOOP STB A,I (0 IN 1ST WORD OF ENTRY DENOTES EMPTY) ADA TTSIZ INCREMENT TO NEXT ENTRY ISZ CNTR END OF SET-UP? JMP SLUP NO, CONTINUE * * HERE TO AWAIT NEXT TRANSACTION (CLASS BUFFER). * MAY BE ONE OF THREE KINDS: * * 1) NEW REQUEST. SCAN TRANSACTION TABLE (TT). * IF AN EMPTY "TRANSACTION TABLE" (TT) ENTRY * CANNOT BE FOUND, THEN DRIVER IS CALLED TO RE-TRY THE REQUEST * AFTER ONE SECOND. IF AN ENTRY CAN BE FOUND, THEN A SET-UP * IS MADE TO SEND THE REQUEST TO THE REMOTE NODE. SUBROUTINE * "DSTIO" IS CALLED, AND RETURN IS REQUESTED WITHOUT WAITING * FOR THE REPLY. THE TRANSACTION SEQUENCE NUMBER (ASSIGNED BY * #RSAX) IS USED TO UNIQUELY IDENTIFY THIS REQUEST. ALL INFORMATION * REQUIRED TO SEND THE REPLY BACK TO THE ORIGINAL REQUESTOR IS * SAVED IN THE "TT" UNDER THIS KEY. LUMAP AWAITS THE NEXT * CLASS BUFFER. * * 2) A REPLY TO THE "DSTIO" CALL. THE SEQUENCE NUMBER IN THE * "DS HEADER" IS USED TO SCAN THE TRANSACTION TABLE, LOOKING FOR * THE ORIGINAL REQUEST. IF NO MATCH IS FOUND, THE CLASS BUFFER * IS DISCARDED. OTHERWISE, THE REPLY INFORMATION, AND DATA, * IF ANY, ARE SENT BACK TO THE ORIGINAL REQUESTING PROGRAM * VIA THE DRIVER, USING A CLASS-I/O CALL (COMPLETIONS OF THESE * REQUESTS ARE DESCRIBED IN # 3, BELOW). THE TT ENTRY IS * CLEARED, AND LUMAP GOES BACK TO AWAIT THE NEXT REQUEST. * * 3) COMPLETION OF THE CLASS-I/O "WRITE" (THESE ARE DISCARDED). * GET EQU * JSB EXEC OBTAIN NEXT REQUEST DEF *+8 DEF D21I DEF CLASS @DVDT DEF DVDTA DRIVER "HEADER" AREA & DATA DEF DVSIZ SIZE OF AREA DEF VEQT "VIRTUAL EQT"/SEQ.#(ON REPLIES) DEF TOVAL I/O TIME-OUT TO SET/LNTH DS HEADER(REPLIES) DEF IPRM3 RETURN READ/WRITE CODE JMP BADCL OUR CLASS # IS BAD--CLEAR IT & QUIT DST ABREG SAVE REGISTERS SPC 2 LDA IPRM3 IF REQUEST WAS A "WRITE", THEN IT'S CPA D2 ONE OF MY OWN REPLIES TO DRIVER. JMP DUMP (IGNORE IT) LDA TOVAL IS THIS A REPLY? SSA,RSS JMP SRPLY YES. SZB,RSS IS THIS A GOOD REQUEST? JMP DUMP NO, IGNORE IT JSB DSCRD YES, FIRST CHUCK OLD BUFFER HED NEW REQUEST INITIATION SECTION * THIS IS A NEW REQUEST TO BE INITIATED. * LDA @DVDT MOVE DRIVER HEADER LDB @NODE OUT OF JSB .MVW I/O BUFFER DEF DVHDL DRIVER HEADER LENGTH NOP * * * SCAN TT FOR AN AVAILABLE ENTRY. * LDA NTTEN NEGATIVE # TT ENTRIES STA CNTR LDA @TT NULUP EQU * SEARCH LOOP LOOKING FOR AVAILABLE ENTRY LDB A,I IS SZB,RSS THIS ONE EMPTY? JMP NURQ YES, START NEW REQUEST * * IF THIS ENTRY HAS THE SAME "ORIGINAL REQUESTOR EQT/DVT" ADDRESS, * THEN THE ORIGINAL REQUEST FOR IT MUST HAVE TIMED OUT, AND IT IS * OBSOLETE (BECAUSE THE ORIGINAL REQUEST'S EQT/DVT REMAINS "BUSY" THROUGHOUT * THE EXECUTION OF THE REQUEST). * STA TEMP ADA @.C1 ADVANCE TO ORIGINAL EQT/DVT ADDRESS OF ENTRY LDB A,I LOAD THE EQT/DVT ADDRESS FOR THE ENTRY CPB VEQT DOES IT MATCH THIS ONE? JMP NX1 YES, WE'LL JUST USE THIS ENTRY. LDA TEMP NO, RECOVER TABLE ADDRESS, AND ADA TTSIZ ADVANCE TO NEXT ENTRY ISZ CNTR END OF TABLE? JMP NULUP NO, CONTINUE JMP RETRY NO TABLE SPACE NOW. TRY AGAIN LATER. * NX1 EQU * HERE TO RE-USE TABLE ENTRY LDA TEMP * * HERE WE HAVE AN AVAILABLE TT ENTRY. NURQ EQU * JSB SETPT SET UP POINTERS LDA @BUFR SET ADDRESS OF ACTUAL DATA STA @@@@ INTO "DSTIO" CALL LDA @PRM1 SET PARAMETER POINTER STA @@@1 INTO DSTIO CALL * LDA CONWD SET REQUEST CODE STA @RC,I SAVE IN TT AND D3 IOR =B100000 SET "NO-ABORT" INDICATION STA RCODE LDA DSEQN SAVE DRIVER-ASSIGNED SEQUENCE STA @DSEQ,I NUMBER IN TT LDA VEQT STA @EQT,I SAVE ORIGINAL EQT/DVT ADDRESS IN TT LDA REQLN SET REQUEST LENGTH STA @ORLN,I SAVE IN TT STA DLEN LDA REQLN VERIFY DATA WILL FIT JSB CKLEN IN OUR BUFFER LDB CONWD MUST ALSO CHECK LDA IPRM2 SECOND BUFFER BLF,SLB IF THIS IS JSB CKLEN A WRITE/READ * *# LDA RLU LOAD "REMOTE LU" WORD *# SSA,RSS NEGATIVE? *# JMP X1 NO, DON'T CHECK FOR I/O TO HP 3000 *# CMA,INA *# CPA #LU3K SAME AS LU TO HP 3000? *# JMP STDLS YES, I/O TO HP 3000 LDA RLU STRIP OFF "OPTION" BITS AND =B377 LDB CONWD IS THE BLF,BLF TRANSPARENT BIT RBL,RBL SET? SLB STA RLU YES, SUPPRES SPECIAL FEATURES IOR SIGNB SIGNAL USE OF "TRUE" LU STA XLU LDA CONWD AND =B3700 MASK ONLY SUB-FUNCTION BITS STA XLU+1 LDA RCODE GET THE REQUEST CODE AGAIN AND D3 MASK ONLY REQUEST CODE PART CPA D3 IS THIS A "CONTROL" REQUEST? JMP CNTRL YES. SPC 2 LDB CONWD SLB,RSS ASCII "WRITE" REQUEST? JMP ASCWR YES * * * ASCII "READ" REQUEST. * LDA RLU GET THE RAL PROMPT INDICATION BLF,SLB Z BIT SET? JMP WREAD YES, MUST DO WRITE/READ SSA,RSS SHOULD WE PROMPT? JMP XQUT NO. * * CHANGE ORDINARY "READ" INTO "PROMPT READ" * CLB SET SECOND BUFFER LENGTH STB IPRM2 TO ZERO * * MAKE PROMPT READ * WREAD LDB XLU+1 SET "INTERACTIVE WRITE/READ" BIT ADB =B4000 STB XLU+1 LDB @BUFR MAKE SECOND BUFFER STB @@@1 POINT TO OUR AREA SSA,RSS SHOULD WE PROMPT? JMP XQUT NO LDB IPRM2 POINT TO CLE,SSB,RSS WORD CONTAINING JMP WREA1 FIRST CHARACTER CMB,INB PAST USERS CLE,ERB WRITE BUFFER WREA1 ADB @@@1 SEZ,RSS LOWER BYTE? JMP WREA2 NO LDA B,I YES, PUT AND =B177400 A SPACE ADA =B40 THERE INB ADVANCE TO FIRST FREE WORD WREA2 LDA .NOD. STORE FIRST DIGIT OF ADA =B4000 NODE NUMBER WITH STA B,I "(" IN FRONT LDA .NOD.+1 STORE INB REST OF STA B,I NODE LDA .NOD.+2 NUMBER INB STA B,I LDA =A)_ STORE CLOSING INB ") " STA B,I CMB COMPUTE ADB @@@1 NEW CMB,INB LENGTH STB IPRM2 JMP XQUT DO REQUEST SKP * "ASCII" WRITE REQUEST. * IF SPECIFICALLY DIRECTED TO DO SO, * THE USER-SPECIFIED MESSAGE WILL BE PRECEDED BY A * MESSAGE (GENERATED BY THIS PROGRAM) INDICATING ITS SOURCE & TIME * ASCWR EQU * LDA RLU SHOULD WE INHIBIT SSA,RSS THE MESSAGE HEADER? JMP XQUT YES. JSB EXEC GET TIME-OF-DAY DEF *+3 DEF D11 DEF PARAM * JSB CNUMD CONVERT DAY NUMBER DEF *+3 DEF PARAM+4 DAY DEF .DAY. JSB KCVT CONVERT SECONDS DEF *+2 DEF PARAM+1 STA .SEC. JSB KCVT CONVERT MINUTES DEF *+2 DEF PARAM+2 STA .MIN. JSB KCVT CONVERT HOURS DEF *+2 DEF PARAM+3 STA .HR. * * FILL IN PROGRAM'S NAME, OR (SYS) * LDA IDADR IS THE ID SEGMENT ADDRESS OF SZA,RSS CALLING PROGRAM KNOWN? JMP NOPRG NO, FILL IN (SYS) CMA,INA YES, 'PGMAD' WILL FILL IN NAME STA IDADR JSB PGMAD DEF *+3 DEF .PRG. FILL IN PROGRAM NAME DEF IDADR FROM ID SEGMENT ADDRESS LDA @PRGM LOAD ADDRESS OF "PRGM " RSS NOPRG LDA @SYS LOAD ADDRESS OF "(SYS I/O)" LDB @SRCP MOVE SOURCE PROCESS NAME INTO AREA JSB .MVW DEF D6 NOP LDA @MHED MOVE MSG HDR INTO AREA IMMEDIATELY LDB @MXX PRECEDING DATA BUFFER STB @@@@ SET DATA ADDRESS FOR "DSTIO" CALL JSB .MVW DEF MHEDL NOP LDA DLEN WAS ORIGINAL REQUEST LDB MHEDL LENGTH SPECIFIED IN SSA,RSS CHARACTERS? JMP *+3 NO, WORDS RBL CHARACTERS. CONVERT HEADER LENGTH TO CMB,INB NEGATIVE # CHARACTERS ADA B ADD HEADER LENGTH STA DLEN STORE COMBINED LENGTH SKP * ***** MAKE "DSTIO" CALL XQUT EQU * SPC 2 JSB DSTIO EXECUTE REMOTE I/O REQUEST DEF *+8 DEF RNODE REMOTE NODE NUMBER DEF RCODE REQUEST CODE DEF XLU DOUBLE-WD LU/SUBFUNCTION @@@@ NOP ADDRESS OF BUFFER STORED HERE DEF DLEN DATA LENGTH @@@1 NOP OPTIONAL PARAM/"PROMPT" BUFFER STORED HERE DEF IPRM2 2ND OPTIONAL PARAM/"PROMPT" BUFFER LEN JMP DSERR ERROR RETURN XQ5 EQU * STA @SEQ#,I SAVE TRANSACTION SEQUENCE NUMBER JMP GET AWAIT NEXT CLASS BUFFER SPC 2 * RETRY ENTRY FOR CASE WHERE PARAMETERS ARE IN TT ENTRY * RETR1 LDA @EQT,I GET PARAMETERS STA VEQT FROM LDA @DSEQ,I TT ENTRY STA DSEQN CLA CLEAR STA @RC,I TT ENTRY * * HERE TO FORCE DRIVER TO RE-TRY REQUEST LATER * RETRY EQU * JSB XLUEX DEF *+7 DEF K2N NO-ABORT DEF RTRLU DEF D0 BUFFER DEF D0 IS A DUMMY DEF VEQT ORIGINAL EQT/DVT ADDRESS DEF DSEQN SEQUENCE NUMBER NOP IGNORE ERRORS JMP GET AWAIT NEXT CLASS BUFFER SPC 2 * HERE TO SEND REQUEST TO HP 3000 * STDLS EQU * *# JSB IO3K *# DEF *+5 *# DEF RCODE 1,2 OR 3 *# DEF RLU SESSION # *# DEF @@@@,I BUFFER ADDRESS *# DEF DLEN BUFFER LENGTH *# JMP DSERR --ERROR RETURN-- *# JMP XQ5 AWAIT REPLY SPC 2 SPC 2 CNTRL EQU * HERE TO EXECUTE "CONTROL" REQUEST JSB DSTIO SEND REQUEST CODE DEF *+5 DEF RNODE DEF RCODE DEF XLU @PRM1 DEF IPRM1 JMP DSERR -ERROR- RETURN JMP XQ5 NORMAL RETURN HED "SEND REPLY TO ORIGINAL REQUESTOR" SECTION * HERE WHEN WE HAVE THE REPLY TO A "MAPPED I/O" REQUEST * SRPLY EQU * * * !! WE NEED TO GET EXTENDED STATUS WORDS TO PASS TO DRIVER. !! * * OBTAIN TRANSACTION SEQUENCE NUMBER, AND SET UP POINTERS TO * VARIOUS PARTS OF DS HEADER. SPC 1 * NOTE: OUR "DVDTA" BUFFER CONTAINS THE USER DATA (IF ANY), * FOLLOWED BY THE "DEXEC/DSTIO" REPLY INFO. WE REQUIRE THE * TRANSACTION SEQUENCE NUMBER FROM THIS, IN ORDER TO FIND THE * ORIGINAL REQUESTOR FROM OUR TT TABLE. SPC 2 LDB #MSTC GET CLASS NUMBER JSB #LOGR LOG THIS REPLY JSB DSCRD BLEW IT, DISCARD BUFFER LDA @DVDT COMPUTE ADDRESS OF DS HEADER ADA ABREG+1 STA @STR ADA =L#SEQ-#STR ADVANCE TO SEQUENCE # STA @HSEQ SAVE ADDRESS OF SEQUENCE # LDB A,I OBTAIN ITS TRANSACTION SEQUENCE NUMBER STB TSEQ# SAVE LOCALLY SO WE HAVE DIRECT ADDRESS ADA =L#EC1-#SEQ IN SEARCH. ADVANCE TO ERROR CODE STA @HERR SAVE ADDRESS OF ERROR CODE ADA =L#EC2-#EC1 ADVANCE TO 2ND ERROR CODE WORD STA @HER2 ADA =L#ENO-#EC2 ADVANCE TO REPORTING NODE # STA @HENO SAVE ADDRESS OF REPORTING NODE # ADA CONS1 ADVANCE TO A-REGISTER RETURN AREA STA @HEQ5 ADA =L#XML-#EQ5 ADVANCE TO B-REGISTER RETURN AREA STA @HXML LDA TOVAL LDB DVDTA CPA D1 MA RETRANSMISSION REQUEST? JMP SRP1 YES, SEQUENCE NUMBER IS FIRST WORD SZA WAS THERE A TRANSACTION TIME-OUT? JMP SRP2 NO. LDB VEQT YES, SET THE SEQUENCE NUMBER FOR THE SRP1 STB TSEQ# T.T. SEARCH. SRP2 JSB #RSAX RELEASE TCB DEF *+3 DEF D6 DEF TSEQ# * * SEARCH TRANSACTION TABLE FOR AN ENTRY WHICH * MATCHES THIS ONE'S TRANSACTION SEQUENCE NUMBER * LDA NTTEN SET # ENTRIES COUNTER STA CNTR LDA @TT SRLUP LDB A,I IS ENTRY SZB,RSS EMPTY? JMP SRLP1 YES LDB A NO, GET INB TRANSACTION LDB B,I SEQUENCE NUMBER CPB TSEQ# IS THIS THE ONE WE WANT? JMP SRP5 YES * NO MATCH. CONTINUE THE SEARCH SRLP1 ADA TTSIZ ADVANCE TO NEXT ENTRY ISZ CNTR END OF LOOP? JMP SRLUP NO, CONTINUE * * NO ENTRY FOUND. IF 'LUMAP' WAS ABORTED & SUBSEQUENTLY RE-SCHEDULED, * ITS TABLES WOULD BE EMPTY, BUT REPLIES MAY STILL BE COMING IN. * WE CAN DO NOTHING BUT IGNORE THIS BUFFER. THE USER PROGRAM WILL * EVENTUALLY TIME-OUT. * JMP GET IGNORE THIS BUFFER * * HAVE FOUND THE ENTRY. SET UP POINTERS * SRP5 EQU * JSB SETPT SET UP THE POINTERS * LDA TOVAL MA RETRANSMISSION CPA D1 REQUEST? JMP RETR1 YES, TELL DRIVER TO RETRY SZA NO, TRANSACTION TIME-OUT? JMP SRP6 NO. LDA "DS SET ERROR "DSO5" LDB "05 DST @HERR,I LDA #NODE STORE LOCAL NODE # IOR SIGNB STA @HENO,I IN AREA SRP6 EQU * * SET UP "DRIVER REPLY" HEADER (DRIVER SEQUENCE #, * (A) - REGISTER RETURN STATUS, TRANSMISSION LOG, ETC.) LDA @HENO,I WAS THERE SSA,RSS AN ERROR RETURNED? JMP XQ1 NO. DLD @HERR,I YES, LOAD ERROR CODE JMP DSERR HANDLE IT XQ1 LDA @DVDT COMPUTE THE ADDRESS OF THE REPLY DATA, ADA MRPLY BACK UP TO ALLOW ROOM FOR DVR HDR STA @RPLY SET ADDRESS FOR SENDING REPLY TO DRIVER LDB @HEQ5,I PASS I/O STATUS STB A,I TO DRIVER INA LDB @HXML,I PASS TRANSMISSION LOG STB A,I TO DRIVER LDB PRPLY LDA @RC,I WAS ORIGINAL AND D3 REQUEST CPA D1 A "READ" ? RSS JMP XQ3 NO, DON'T ADJUST THE LENGTH LDB @ORLN,I YES. WAS ORIGINAL REQUEST LENGTH SSB,RSS SPECIFIED IN CHARACTERS? JMP XQ2 NO LDB PRPLY YES, RBL CONVERT REPLY LENGTH TO CHARACTERS ADB @HXML,I INCLUDING # CHARS IN USER DATA CMB,INB RETURN A NEGATIVE NUMBER OF CHARS JMP XQ3 XQ2 EQU * ORIGINAL RQST LNTH SPECIFIED IN WORDS LDB @HXML,I USE USER DATA LENGTH ADB PRPLY XQ3 EQU * STB DLEN STORE LENGTH * JSB XLUEX SEND THIS INFO TO DRIVER DEF *+8 DEF D18I DEF SPCLU @RPLY NOP SET TO ADDRESS OF DRIVER REPLY DATA DEF DLEN DEF @EQT,I ORIGINAL REQUEST EQT/DVT ADDRESS DEF @DSEQ,I DRIVER SEQUENCE NUMBER DEF #MSTC NOP IGNORE ERRORS * CLEAR EQU * HERE TO CLEAR TT ENTRY CLA STA @RC,I JMP GET SPC 2 BADCL EQU * HERE IF CLASS # IS BAD CLA CLEAR CLASS NUMBER STORED IN 'RES' STA #LUMP JSB EXEC & TERMINATE. IF A NEW RQST COMES IN, LUQUE WILL DEF *+2 NOTIFY US. DEF D6 SPC 2 SKP * ERRORS SECTION DS03 EQU * HERE FOR ILLEGAL LENGTH DLD "DS03 * * HERE ON "DS" ERRORS. * "DS08" ERRORS ARE TRAPPED, AND RETRIED BY SENDING THEM * BACK TO THE "LU MAPPING" DRIVER, WHICH RE-TRIES A FIXED * NUMBER OF TIMES. * DSERR EQU * CPA "DS IS THIS A "DS08" ERROR? RSS JMP DSER1 CPB "08 RSS JMP DSER1 NO, PRINT ERROR JMP RETR1 * DSER1 EQU * DST #LMPE STORE ERROR LDA @HENO,I LOAD REPORTING NODE NUMBER ELA,CLE,ERA CLEAR SIGN BIT STA #LMPE+2 JSB XLUEX SEND "STOP" DEF *+7 DEF K2N NO-ABORT DEF STPLU "SPECIAL" LU + 'STOP' CODE DEF D0 DUMMY DEF D0 BUFFER DEF @EQT,I ORIGINAL EQT/DVT ADDRESS DEF @DSEQ,I DRIVER SEQUENCE NUMBER NOP IGNORE ERRORS JMP CLEAR CLEAR TT ENTRY SPC 2 * SUBROUTINE TO SET UP THE TT POINTERS * SETPT NOP STA @RC INA STA @SEQ# INA STA @ORLN INA STA @EQT INA STA @DSEQ JMP SETPT,I RETURN TO CALLER SPC 2 * * CHECK REQUEST LENGTH IN A, JUMP TO DS03 IF ILLEGAL * CKLEN NOP SSA,RSS WAS LENGTH IN CHARACTERS? JMP *+4 NO CMA,INA YES, CONVERT INA TO WORDS ARS ADA MAXBL BIGGER THAN THE LIMIT? SSA,RSS JMP DS03 YES, ERROR JMP CKLEN,I NO, OKAY SPC 2 * * SUBROUTINE TO DISCARD BUFFER FROM CLASS * DSCRD NOP JSB EXEC DO CLASS GET WITH DISCARD DEF *+5 DEF D21I DEF #MSTC DEF DVDTA DEF D0 NOP IGNORE ERRORS JMP DSCRD,I * * DUMP JSB DSCRD JMP GET SKP * DATA SECTION * SUP * EQUATES .RQST EQU 9 SIZE OF DRIVER REQUEST HEADER .RPLY EQU 4 SIZE OF DRIVER REPLY HEADER .MXBL EQU 512 MAXIMUM ALLOWABLE USER DATA SIZE * CONS1 ABS #EQ5-#ENO MAXBL ABS -.MXBL-1 MRPLY ABS -.RPLY NEGATIVE OF DRIVER REPLY HEADER LENGTH PRPLY ABS .RPLY POSITIVE OF DRIVER REPLY HEADER LENGTH M1 DEC -1 D0 DEC 1 D1 DEC 1 D2 DEC 2 D3 DEC 3 SIGNB DEF 0,I SIGN BIT K2N OCT 100002 I/O WRITE REQUEST, NO-ABORT D6 DEC 6 D11 DEC 11 "DS03 ASC 2,DS03 "DS EQU "DS03 "05 ASC 1,05 "08 ASC 1,08 PARAM BSS 5 D21I DEF 21,I XLU OCT 0,0 DOUBLE-WORD LU/SUBFUNCTION * * WARNING: DO NOT DISTURB THE ORDER OF THE FOLLOWING * TABLES!!! * * * "DRIVER HEADER" AREA. * * * RNODE NOP REMOTE NODE NUMBER RLU NOP REMOTE LU CONWD NOP ORIGINAL REQUEST 'CONWD' REQLN NOP ORIGINAL REQUEST LENGTH IPRM1 NOP 1ST OPTIONAL PARAMETER IPRM2 NOP 2ND OPTIONAL PARAMETER IPRM3 NOP RETURNED AS READ/WRITE CODE FOR LAST CLASS-I/O IDADR NOP CALLING PROGRAM'S ID SEGMENT ADDRESS, OR ZERO DSEQN NOP DRIVER-ASSIGNED SEQUENCE NUMBER .DVHL EQU *-RNODE # WORDS IN DRIVER HEADER DVHDL ABS .DVHL SIZE OF HEADER * * "MESSAGE HEADER" AREA: * "MESSAGE FROM NODE # NNNNNN PRGM AAAAA AT DAY DDDDD, HH :MM :SS * MHEDR ASC 9,MESSAGE FROM NODE # .NOD. BSS 3 SRCP BSS 6 SOURCE PROCESS ASC 4, AT DAY .DAY. BSS 3 ASC 1, .HR. NOP ASC 1, : .MIN. NOP ASC 1, : .SEC. NOP OCT 6412 CARRIAGE RETURN/LINE FEED .HEDL EQU *-MHEDR MESSAGE HEADER LENGTH DVSIZ ABS .MXBL MHEDL ABS .HEDL LENGTH OF MESSAGE HEADER @BUFR DEF BUFFR+.DVHL ADDR OF DATA PORTION OF NEW RQST * * * END OF FIXED-ORDER TABLES. * @MXX DEF MXX @SYS DEF SYS SYS ASC 6, (SYS I/O) @PRGM DEF PRGM PRGM ASC 3, PRGM .PRG. BSS 3 STORAGE FOR PROGRAM NAME @SRCP DEF SRCP ADDRESS WHERE TO STORE PROGRAM NAME OR (SYS I/O) @NODE DEF RNODE @MHED DEF MHEDR VEQT NOP ABREG BSS 2 TEMP NOP CNTR NOP TSEQ# NOP THIS TRANSACTION'S SEQUENCE NUMBER CLASS NOP CLASS NUMBER WITH NO-DEALLOCATE RTRLU NOP OCT 3400 RETRY FUNCTION CODE STPLU NOP OCT 3500 STOP FUNCTION CODE SPCLU NOP OCT 3700 REPLY FUNCTION CODE DLEN NOP D18I OCT 100022 CLASS WRITE, NO-ABORT BIT15 OCT 100000 RCODE NOP TOVAL NOP STORAGE FOR TIME-OUT VALUE @STR NOP ADDRESS OF STREAM @HSEQ NOP ADDRESS IN BUFFER OF TRANSACTION SEQ. # @HERR NOP @HER2 NOP @HENO NOP @HEQ5 NOP @HXML NOP SKP * TRANSACTION TABLE DEFINITIONS * * FOLLOWING POINTERS DESCRIBE THE FORMAT & SIZE OF EACH * TT ENTRY. * (DO NOT DISTURB ORDER!) * @RC NOP PNTR TO ORIGINAL REQUEST CODE * NOTE: IF 1ST WORD IS ZERO, ENTRY IS EMPTY @SEQ# NOP PNTR TO TRANSACTION SEQUENCE NUMBER ENTRY @ORLN NOP PNTR TO ORIGINAL REQUEST LENGTH WORD @EQT NOP PNTR TO ORIGINAL REQUESTOR'S EQT/DVT ADDRESS @DSEQ NOP PNTR TO DRIVER-ASSIGNED SEQUENCE NUMBER .TSIZ EQU *-@RC # WORDS IN EACH ENTRY @TT DEF TTABL SPC 2 * DEFINE SIZE & # ENTRIES IN TRANSACTION TABLE SPC 2 .NENT EQU 64 # TABLE ENTRIES NTTEN ABS -.NENT NEGATIVE # ENTRIES IN TABLE TTSIZ ABS .TSIZ # WORDS PER ENTRY * DEFINE OFFSET FROM REQUEST CODE TO EQT/DVT ADDRESS ENTRIES @.C1 ABS @EQT-@RC * MXX BSS .HEDL-.RQST SPACE FOR MESSAGE HEADER BUFFR BSS .MXBL BSS 4 EXTRA SPACE FOR APPENDED PROMPT DVDTA EQU BUFFR SUP TTABL EQU * TRANSACTION TABLE REP .NENT BSS .TSIZ A EQU 0 B EQU 1 END LUMAP