ASMB,R,Q,C,N IFN HED "VIRTUAL TERMINAL" DRIVER FOR RTE-IV/M-III NAM DVV00,0 91750-16109 REV.2013 800416 (4/M3) XIF IFZ HED "VIRTUAL TERMINAL" DRIVER FOR RTE-M-II NAM DVV00,0 91750-16110 REV.2013 800416 (M2) XIF * * USE "N" OPTION FOR DMS RTES: RTE-IV, RTE-M-III * USE "Z" OPTION FOR NON-DMS RTES: RTE-M-II * SPC 2 ****************************************************************** * * (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 2 *************************************************************** * * "VIRTUAL TERMINAL" DRIVER FOR DS/1000 * SIMULATES DVR00/DVR05 TO LOCAL SYSTEM. ALL I/O REQUESTS * SENT TO PROGRAM "LUMAP" FOR CONVERSION TO REMOTE 'EXEC' * CALLS. * * IFN * NAME: DVV00 * SOURCE: 91750-18109 * RELOC: 91750-16109 * PGMR: JOHN LAMPING XIF IFZ * NAME: DVV00 * SOURCE: 91750-18109 * RELOC: 91750-18110 * PGMR: JOHN LAMPING XIF * * WRITTEN BY LYLE WEIMAN [MARCH 1979] * MODIFIED BY JOHN LAMPING [OCTOBER 1979] * *************************************************************** SPC 3 ENT IV00,CV00 EXT .MVW,$LIST,#SPLU IFN EXT $OPSY XIF SPC 2 * * IN THIS DRIVER, THE TERM "I/O MAP" IS USED TO REFER TO THE MAPPING * BETWEEN LUS AT THE SOURCE NODE, AND DESTINATION NODE AND LU NUMBERS. * IT HAS NOTHING TO DO WITH "SESSION LU MAPPING", ALTHOUGH IT CAN * OPERATE WITHIN THAT CONTEXT (PROVIDING TWO LEVELS OF I/O MAPPING, * WHICH CAN PERHAPS BE CONFUSING). TO ALLAY THIS CONFUSION, THE * TERM WILL IS ONLY USED HERE WITHIN THE FORMER CONTEXT. * * THE "MAPPING" FROM AN LU IN THE SOURCE SYSTEM TO A DESTINATION NODE * AND LU NUMBER IS PERFORMED BY THE DRIVER, BUT THE ENTIRE OPERATION * REQUIRES ASSISTANCE FROM PROGRAMS "LUQUE" AND "LUMAP". SPC 5 * CALLING SEQUENCES (ORDINARY I/O): * * (NOTE: PRIOR TO ESTABLISHING A MAP FOR AN LU, DVV00 COMPLETES * ALL I/O REQUESTS TO THAT LU WITHOUT TRANSFERRING ANY DATA, I.E., * IT IGNORES ALL I/O REQUESTS). * SPC 2 * "READ" OR "WRITE" DATA SPC 1 * JSB EXEC * DEF *+5,6 OR 7 * DEF RCODE OCT 1 OR 2 * DEF CONWD LU (ANY LU EXCEPT "RESERVED" LU) * ANY SUBFUNCTION BITS EXCEPT "Z" BIT MAY BE SET * DEF DBUF DATA BUFFER ADDRESS * DEF DBUFL DATA BUFFER LENGTH (+ WORDS OR - CHARS) * LIMIT: 512 WORDS, THE LENGTH OF THE BUFFER IN 'LUMAP' * [DEF IPRM1] 1ST OPTIONAL PARAMETER * [DEF IPRM2] 2ND OPTIONAL PARAMETER SPC 2 * THE FOLLOWING ERROR CONDITIONS RESULT IN I/O REJECT: * * 1) DOUBLE-BUFFER ("Z") BIT SET * 2) ORDINARY I/O ISSUED UPON "RESERVED" LU * 3) BUFFER LENGTH >512 WORDS * SPC 2 * CONTROL REQUESTS: * * JSB EXEC * DEF *+3 OR 4 * DEF D3 * DEF CONWD MAY SET ANY SUBFUNCTION BITS * [DEF ] * * I/O REJECT IF: * * 1) "RESERVED" LU IS USED * * UPON RETURN, (A)-REGISTER CONTAINS STATUS INFORMATION AS * RETURNED BY ACTUAL DRIVER AT DESTINATION NODE. * (B)-REGISTER CONTAINS ACTUAL DRIVER-SUPPLIED TRANSMISSION LOG. * SKP * CALLING SEQUENCES ON "RESERVED" LU: * * NOTE: THE "RESERVED LU" IS MEANT TO BE USED ONLY FOR COMMUNICATION * BETWEEN DVV00 AND PROGRAMS 'LUQUE' AND 'LUMAP'. * * THE FIRST TIME THE DRIVER IS ENTERED, IT WILL SET #SPLU TO THE * FIRST LU POINTING TO A EQT WITH A ZERO-LENGTH EXTENSION * THIS LU BECOMES THE RESERVED LU. * * SUB-FUNCTION SUMMARY: * SUB- ACTION * FUNCTION * -------- ----------------------------- * CONTROL CALLS: * * 35 OBTAIN SYSTEM ATTENTION * 36 RE-TRY ORIGINAL REQUEST AFTER 1 SEC * 37 'STOP': ERROR ON ORIGINAL REQUEST. "COMPLETE" ORIGINAL * REQUEST WITH I/O TIME-OUT INDICATION. * * READ & WRITE CALLS: * * 36 (WRITE) SET UP I/O MAP * 36 (READ) RETURN I/O MAP INFORMATION ON SPECIFIED LU * 37 (READ) SEND REQUEST INFO TO 'LUQUE' * 37 (WRITE) SEND REPLY TO ORIGINAL REQUESTOR * * ALL OTHER CODES IGNORED * * * TO SET UP THE I/O-MAPPING FUNCTION: * * JSB EXEC * DEF *+5 * DEF D2 * DEF CONWD "RESERVED" LU + 3600B * DEF BUFFR SET-UP BUFFER (SEE BELOW) * DEF D4 * * SET-UP BUFFER FORMAT: * * 1 SECURITY CODE (25834) * * 2 "SOURCE" LU NUMBER (IF -1 THEN DRIVER WILL FIND AN UNUSED LU * FROM THE SET OF LUS WHICH "POINT" TO THIS DRIVER--I.E., ONE * WHICH DOES NOT ALREADY HAVE AN I/O MAP CURRENTLY SET UP, AND * EXCLUDING THE "RESERVED" LU--AND RETURN THAT LU IN THE B- * REGISTER, AND SET UP THE I/O MAP FOR IT ACCORDING TO THE * SPECIFICATIONS IN THE REMAINDER OF THIS BUFFER. ZERO IS * RETURNED IF NO LU CAN BE FOUND). * * 3 DESTINATION LU NUMBER * SET BIT 15 IF MESSAGE HEADER IS TO BE APPENDED ("WRITES" ONLY) * SET BIT 14 IF "PROMPT" IS TO BE APPENDED ("READS" ONLY) * THE TWO FUNCTIONS MAY BE COMBINED. * * 4 DESTINATION NODE NUMBER * * THE FOLLOWING ERROR CONDITIONS RESULT IN AN I/O REJECT: * * 1) SECURITY CODE SPECIFIED DOES NOT MATCH 25834 * * 2) SOURCE LU INVALID (NOT IN RANGE 1 TO $LUT#) * * 3) SOURCE LU SPECIFIED IS SAME AS "RESERVED" LU, OR POINTS TO * SAME EQT * * 4) SOURCE LU DOES NOT "POINT" TO DVV00 * * 5) EQT EXTENSION NOT LARGE ENOUGH TO HOLD MAP * SPC 2 * TO RETURN I/O MAP INFORMATION ON A SPECIFIED LU: * * JSB EXEC * DEF *+6 * DEF D1 "READ" * DEF CONWD "RESERVED" LU + 3600B * DEF BUFFR RETURN DATA BUFFER * DEF D2 RETURNS TWO DATA WORDS * DEF LU LOGICAL UNIT WHOSE I/O MAP IS TO BE RETURNED. * * UPON RETURN: * BUFFR(1) = DESTINATION NODE NUMBER (-1 IF LU DOES NOT * "POINT" TO THIS DRIVER) * BUFFR(2) = DESTINATION NODE LU NUMBER, OR ZERO IF MAP ENTRY IS EMPTY. * THE LU NUMBER WILL HAVE BITS 15 AND 14 SET AS SPECIFIED * IN THE SETUP CALL SKP * THE NORMAL SEQUENCE OF EVENTS IS SUMMARIZED BELOW: * * 1) ORDINARY PROGRAM (ONE WHICH HAS NOT BEEN SPECIFICALLY MODIFIED * FOR REMOTE-EXEC I/O) CALLS EXEC FOR I/O, SPECIFYING AN LU WHICH * "POINTS" TO THIS DRIVER. THE REAL-TIME I/O CONTROL * MODULE CALLS THIS DRIVER. THE REQUEST IS ASSIGNED A SEQUENCE * NUMBER BY THE DRIVER. * * 2) THE DRIVER SCHEDULES "LUQUE", PASSING IT THE ADDRESS OF THE * ORIGINAL REQUEST'S EQT, LENGTH, DESTINATION NODE NUMBER, AND * AND SEQUENCE NUMBER. * * 3) LUQUE ISSUES A CLASS-I/O "READ" CALL, SPECIFYING A "RESERVED" * LU (THIS ONE IS NOT FOR USE BY "ORDINARY" PROGRAMS, AND THUS * IS NOT NORMALLY "BUSY" AT THIS TIME). THE ADDRESS OF THE * ORIGINAL REQUEST EQT IS PASSED BACK TO THE DRIVER IN ONE * OF THE I/O PARAMETERS. THE CLASS NUMBER USED IS THE ONE * ON WHICH "LUMAP" IS SUSPENDED. * * 4) THE DRIVER LOCATES THE ORIGINAL REQUEST'S EQT VIA THE I/O PARAMETER. * IT COPIES THE ORIGINAL REQUEST I/O PARAMETERS (ACTUAL DEVICE NODE * AND LU NUMBER, SUB-FUNCTION, ETC.), AND DATA IN THE CASE THAT THE * ORIGINAL REQUEST WAS A "WRITE", INTO THE BUFFER IN SYSTEM AVAILABLE * MEMORY PROVIDED BY THE LUQUE'S CLASS-I/O REQUEST. * THE DRIVER RETURNS I/O COMPLETION STATUS ON THIS REQUEST, * CAUSING "LUMAP" TO BE SCHEDULED. AND CHANGES THE TIMEOUT * ON THE ORIGINAL REQUEST TO BE SET TO THE MASTER TIMEOUT. * * 5) LUMAP DETERMINES THAT THIS IS A NEW REQUEST, ENTERS INFORMATION * IN A TABLE IT KEEPS, AND BUILDS A REMOTE-EXEC CALL FROM THE * INFORMATION SUPPLIED. RATHER THAN WAIT FOR THE REPLY, AS DO * OTHER REMOTE-EXEC CALLS, IT RETURNS TO ITS "GET" TO AWAIT THE * NEXT NEW REQUEST, OR THE REPLY. THE SAME CLASS NUMBER IS USED * FOR BOTH. * * 6) AT THE DESTINATION NODE, "EXECM" PERFORMS THE REQUESTED I/O * OPERATION AND RETURNS THE REPLY. * * 7) WHEN THE REPLY ARRIVES, GRPM RE-QUEUES IT TO LUMAP'S CLASS, AS IT * RE-QUEUES ALL REPLIES TO THE APPROPRIATE MASTER PROGRAM. * LUMAP DETERMINES THE PROPER ORIGINAL REQUESTOR FROM INFORMATION * IN ITS INTERNAL TABLE, AND MAKES A CLASS-I/O "WRITE" CALL TO THIS * DRIVER, SPECIFYING THE "RESERVED" LU AND THE ORIGINAL REQUEST'S * EQT ADDRESS, AND DATA IN THE CASE WHERE THE ORIGINAL REQUEST * HAD BEEN A "READ". THE SAME CLASS NUMBER IS USED FOR THIS, ALSO. * IT THEN RETURNS TO ITS "GET". * * 8) THE DRIVER LOCATES THE ORIGINAL REQUEST EQT. IF THE ORIGINAL * REQUEST HAD BEEN A "READ", THEN DATA IS TRANSFERRED BACK TO * THE ORIGINAL PROGRAM'S BUFFER. THE ACTUAL DEVICE TYPE AND * STATUS (FROM EQT 5/DVT 6) RETURNED BY THE ACTUAL DRIVER * USED ARE STORED IN THE ORIGINAL REQUEST'S EQT WORD 6. * NOTE THAT THIS FEATURE IS INTENDED TO BE USED SO THAT AN "INNOCUOUS" * I/O REQUEST BE MADE AFTER THE I/O MAP IS SET UP, PRIOR TO SCHEDULING * ANY PROGRAMS WHICH USE THAT LU. THE RETURNED STATUS, POSTED IN * THE EQT, SOLVES THE PROBLEM WHICH WOULD OTHERWISE EXIST BY THE * POSSIBILITY THAT THE PROGRAM MAY ISSUE AN EXEC (13) I/O STATUS * REQUEST TO A MAPPED LU, WHICH IS HANDLED ENTIRELY BY RTIOL, * WITHOUT ANY ASSISTANCE FROM THE DRIVER. THUS, THE CORRECT * DEVICE TYPE AND STATUS WILL BE OBTAINED. * * 9) THE DRIVER DOES A I/O COMPLETION RETURN ON BOTH THE RESERVED EQT * AND THE ORIGINAL REQUEST EQT. * * 10) LUMAP IS RE-SCHEDULED TO PROCESS THE I/O COMPLETION OF ITS "WRITE" * REQUEST. IT SIMPLY GOES BACK TO ITS "GET". * * AT STEPS 4 AND 9 ABOVE, WHERE THE DRIVER NEEDS TO TAKE ACTION ON TWO * EQT'S AT THE SAME TIME, THE MECHANISM IS AS FOLLOWS. IT SETS THE * CONTINUATION CODE IN THE ORIGINAL REQUEST'S EQT TO THE ACTION IT * WANTS TO PERFORM, AND SETS A ONE TICK TIMEOUT ON THAT EQT. * WHEN THE CLOCK TICKS, IT WILL BE RE-ENTERED ON THAT EQT AND * THE APPROPRIATE ACTION. SPC 2 * THE SEPARATE CALLS TO THE DRIVER MENTIONED ABOVE ARE DESCRIBED * BELOW IN MORE DETAIL. SPC 2 * A "READ" REQUEST IS ISSUED BY 'LUQUE' (SCHEDULED BY THIS DRIVER * WHENEVER AN I/O REQUEST IS MADE ON ANY LU EXCEPT THE "RESERVED" ONE). * THE REQUEST LENGTH MUST BE AT LEAST 9 WORDS (PLUS USER DATA LENGTH, * IN THE CASE OF A "WRITE" REQUEST). * * JSB EXEC * DEF *+7 * DEF D17 CLASS "READ" * DEF <"RESERVED" LU> SUB-FUNCTION = 37 (8) * DEF * DEF * DEF * DEF * * * * INFORMATION RETURNED BY DRIVER IN : * * WORD CONTENTS * ---- ----------------------------------- * 1 DESTINATION NODE NUMER * 2 DESTINATION NODE LU NUMBER * 3 ORIGINAL REQUEST CONTROL WORD (ALL 16 BITS) * 4 ORIGINAL REQUEST LENGTH (+ WORDS OR - CHARS) * 5 " " " OPTIONAL PARAMETER 1 * 6 " " " OPTIONAL PARAMETER 2 * 7 " " " " " 3 * 8 ID SEGMENT ADDRESS OF CALLER (OR ZERO, IF SYSTEM) * 9 SEQUENCE NUMBER (ASSIGNED BY DRIVER) * 10 & FOLL.: USER-SPECIFIED DATA BUFFER ("WRITE" REQUESTS ONLY) * * NOTE: WORDS 1 THRU 9 ARE CALLED THE "DRIVER REQUEST HEADER AREA" SPC 5 * A "WRITE" REQUEST IS ISSUED BY LUMAP WHEN THE REPLY COMES BACK. * * JSB EXEC * DEF *+7 * DEF D18 CLASS "WRITE" * DEF SUB-FUNCTION = 37(8) * DEF * DEF * DEF * DEF * * PRIOR TO THE CALL, DATA MUST BE SET UP IN THE BUFFER IN THE FOLLOWING * FORMAT: * * 1 (A)-REGISTER STATUS UPON I/O COMPLETION (ACTUAL DEVICE STATUS) * THIS VALUE IS PLACED IN EQT WORD 6 * 2 "ACTUAL" DEVICE TRANSMISSION LOG * 3 EXTENDED STATUS WORD 1 * 4 " " " 2 * * WORDS 5 & FOLLOWING ARE FILLED BY THE DRIVER ("READ" * REQUESTS ONLY) * 5 ORIGINAL \ * 6 DATA, "READ" * 7 AS REQUESTS * ... ONLY * N+4 READ / * * NOTE: WORDS 1 THRU 4 ARE CALLED THE "DRIVER REPLY AREA" * * I/O REJECT IF NOT CLASS-I/O REQUEST SKP * OTHER CAPABILITIES, NOT DESCRIBED ABOVE: SPC 2 * ----TO OBTAIN SYSTEM OR PROGRAM ATTENTION, AS IN REMOTE USE------------------- * (SIMULATES OPERATOR STRIKING KEYBOARD) * * JSB EXEC * DEF *+4 * DEF D3 * DEF LU "RESERVED" LU + 3500 * DEF "ATTENTION" LOGICAL UNIT, I.E., LU SYSTEM SENDS * "PROMPT" & "READ" TO. * THE MUST BE MAPABLE. * IF THE ATN LU IS 1, SYSTEM ATTENTION IS REQUESTED * OTHERWISE, IF THE INTERRUPT CELL FOR THE EQT POINTED TO BY * THE LU CONTAINS A NEGATIVE ID SEGMENT ADDRESS, THAT PROGRAM * IS SCHEDULED AND PASSED THE EQT4 ADDRESS IN THE B REGISTER * (IE LIKE DVR05 DOES) * * ----TO CAUSE THE DRIVER TO RETRY THE REQUEST ----------------------- * * JSB EXEC * DEF *+7 * DEF RCODE OCT 2 * DEF CONWD LU + 3400 * DEF <0> * DEF <0> * DEF * DEF SPC 2 * ----A 'STOP' REQUEST IS SENT TO THE DRIVER, VIA THE "RESERVED" LU,----- * IF THE REQUEST CANNOT BE HONORED, DUE TO AN ERROR -- ANY ERROR). SPC 1 * JSB EXEC * DEF *+7 * DEF RCODE OCT 2 * DEF CONWD LU + 3500 = 'STOP' * DEF <0> * DEF <0> * DEF IDENTIFIES ORIGINAL REQUEST * DEF * * ERROR CODES (IN EQT 5 STATUS) -- SAME AS RETURNED BY ACTUAL * DEVICE DRIVER AT REMOTE NODE * * * * EQT WORD USAGE BREAKDOWN * * EQT# USE * 5 !AV! EQUIPMENT TYPE! STATUS! * 6 REQUEST CONTROL WORD (CONWD) * 7 ADDRESS OF DATA BUFFER * 8 LENGTH OF DATA BUFFER * 9 1ST OPTIONAL PARAMETER * 10 2ND OPTIONAL PARAMETER * NOTE: AFTER LUMAP SENDS THE REPLY, THE TRANSMISSION * LOG IS STORED HERE FOR USE ON THE I/O TIME-OUT * ENTRY SIGNALING I/O COMPLETION * 11 POINTER TO REMOTE NODE NUMBER IN EXTENSION * FOR CURRENT REQUEST ONLY * 12 LENGTH OF EQT EXTENSION AREA * 13 ADDRESS OF EQT EXTENSION AREA * 14 TIME-OUT RE-SET VALUE * 15 TIME-OUT CLOCK VALUE * * EQT EXTENSION AREA * 1 SEQUENCE NUMBER * 2 CONTINUATION CODE * 3 # RETRIES COUNTER, FOR ATTEMPTS TO SCHEDULE LUQUE * 4 FIRST USER MAP PAGE NUMBER FOR BUFFER * 5 SECOND USER MAP PAGE NUMBER FOR BUFFER * WORDS 6 & FOLLOWING CONTAIN THE "I/O MAP": * * 6 REMOTE NODE NUMBER --SUBCHANNEL 0 * 7 " " LU NUMBER " * 8 REMOTE NODE NUMBER --SUBCHANNEL 1 * 9 " " LU NUMBER " * * ETC. * * * THE "CONTINUATION CODE" IS USED TO DIRECT CONTROL TO THE * NEXT STAGE OF PROCESSING AFTER AN I/O TIME-OUT. * THE CODE IS VALIDATED BEFORE BEING ADDED TO THE "CONTINUATION * JUMP TABLE ADDRESS" TO OBTAIN THE ADDRESS OF THE CONTINUATION * PROCESSOR. HED DRIVER INITIALIZATION SECTION DREQL EQU 9 DRPRY EQU 4 SPC 2 IV00 NOP LDA EQT5,I CLEAR OLD STATUS AND MB400 STA EQT5,I LDA EQT4,I SET "I WILL IOR IWPTO PROCESS TIMEOUT" STA EQT4,I FLAG LDB SPEQT HAVE WE FOUND SZB THE RESERVED EQT YET? JMP IV1 YES * * THIS IS THE FIRST TIME THIS DRIVER HAS BEEN ENTERED. * WE MUST LOCATE THE RESERVED EQT AND ITS LU NUMBER. * THIS CODE IS ONLY EXECUTED THIS ONCE AND WILL BE * OVERLAYED BY TEMPORARIES LATER. * OVRLY EQU * * LDA LUMAX GET NUMBER OF LU'S CMA,INA NEGATIVE FOR STA CNTR A COUNTER CLB START AT STB VLU LU 1 SPSR1 ISZ VLU ADVANCE TO NEXT LU LDB VLU IS LU JSB OWNLU ONE OF OURS? JMP SPSR3 NO LDA B YES ADA D11 DOES IT'S EQT LDA A,I HAVE AN EXTENSION? SZA,RSS JMP SPSR2 NO, THIS IS IT SPSR3 ISZ CNTR YES, MORE LU'S? JMP SPSR1 YES, TRY NEXT JMP REJCT NO, REJECT THIS REQUEST SPSR2 STB SPEQT SAVE POINTER TO RESERVED EQT LDA VLU STORE RESERVED LU STA #SPLU WHERE OTHER PROGRAMS CAN GET IT * OVREN EQU * END OF OVERLAY AREA * IV1 CPB EQT1 IS THIS THE RESERVED EQT? JMP SPECL YES SPC 2 * HERE FOR ALL I/O ON NON-"RESERVED" LU * * THE 'LUQUE' PROGRAM IS SCHEDULED TO PERFORM THE CLASS-I/O "READ"). * DRIVER EXITS, AND PROCESSING RESUMES WHEN THE CLASS "READ" REQUEST * IS MADE ON THE DRIVER, BEGINNING AT LABEL "MVRED" (ASSUMING THAT * 'LUQUE' IS SCHEDULABLE, AND NO OTHER ERRORS ARE DETECTED). * * THE CLASS-I/O REQUEST GOES TO DVV00 ON ITS "RESERVED" * LU. SINCE NO OTHER I/O REQUESTS ARE ALLOWED ON THIS LU AND * IT ALWAYS COMPLETES THESE REQUESTS IMMEDIATELY, THIS EQT * IS NEVER BUSY. SPC 2 LDA EQT13,I SET UP EXTENSION POINTERS JSB SEXT LDA EQT6,I CPA =B100003 IS THIS A SYSTEM CLEAR REQUEST? JMP IEXIT YES IOR ZBIT IS THE "Z" BIT SET? CPA EQT6,I JMP REJCT YES--ERROR! AND B3 CONTROL CPA B3 REQUEST? JMP ORDI YES LDA EQT8,I JSB CHTW CONVERT WORD COUNT TO CHARACTER COUNT ADA =D-513 BUFFER LENGTH SSA,RSS GREATER THAN 512? JMP REJCT YES, REJECT IT. IFN LDB $OPSY IS THIS A MAPPED SYSTEM? RBR SLB,RSS JMP ORDI0 NO RSB ARE WE IN THE USER MAP? BLF,SLB RSS JMP ORDI0 NO LDA EQT7,I RECORD THE RELEVANT MAP REGISTERS LDB MAP1 LDX M2 JSB MVMAP XIF JMP ORDI1 * ORDI LDA EQT7,I CONTROL REQUEST, MOVE PARAMETER STA EQT9,I TO A BETTER SPOT IFN ORDI0 EQU * CCA INDICATE USER MAP NOT NEEDED STA MAP1,I XIF * ORDI1 EQU * LDA EQT4,I PICK UP SUBCHANNEL NUMBER ALF,ALF RAL,RAL AND B37 RAL CONVERT TO ADA .EXTZ TABLE OFFSET LDB A ADB B2 CMB,INB ADB EQT12,I I/O MAP BIG ENOUGH? SSB JMP REJCT NO ADA EQT13,I GET POINTER TO NODE NUMBER STA EQT11,I SAVE IN EQT INA ADVANCE TO REMOTE NODE LU NUMBER LDB A,I PICK UP LU SZB,RSS EMPTY ENTRY? JMP LOG0 YES, IGNORE THIS REQUEST SPC 2 LDA SEQN# ASSIGN A INA SEQUENCE STA SEQN# NUMBER STA SEQN,I LDA NSCDL SET # RETRIES COUNTER STA NTRY,I JSB LIST CALL $LIST TO SCHEDULE LUQUE CLA CONTINUATION RETURN TO JMP IV00,I RTIOC SPC 2 * HERE TO REJECT REQUEST REJCT EQU * LDA B2 CLB JMP IV00,I RETURN TO RTIOC SPC 2 * HERE FOR READ & WRITE REQUESTS ON "RESERVED" EQT * SPECL EQU * LDA EQT6,I REQUEST CONTROL WORD AND =B3703 IS THIS REQUEST TO CPA =B3602 SET UP I/O MAP? JMP MAPEQ YES CPA =B3601 RETURN I/O MAP SET-UP INFORMATION? JMP RTMAP YES CPA =B3503 OBTAIN SYSTEM ATTENTION? JMP SYSAT YES JSB SXEQT SET UP ALTERNATE EQT POINTERS LDA EQT6,I GET BACK AND =B3703 REQUEST CODE LDB EQT10,I SEQUENCE NUMBER CPA =B3701 MUST MATCH RSS UNLESS THIS IS CPB SEQN,I A READ FROM LUQUE RSS JMP LOG0 NO MATCH, PRETEND NOTHING HAPPENED CPA =B3402 RETRY LATER? JMP RETRY YES CPA =B3502 "STOP" REQUEST? JMP SSTOP YES AND =B3700 MASK SUB-FUNCTION CPA =B3700 CORRECT FOR "SPECIAL" LU? RSS YES, CONTINUE JMP REJCT NO, REJECT REQUEST LDA EQT6,I LOAD REQUEST CONTROL WORD AND =B140000 MASK CLASS-I/O REQUEST BITS CPA =B140000 IS THIS A CLASS-I/O REQUEST? RSS YES, CONTINUE JMP REJCT NO, REJECT LDA EQT6,I OBTAIN REQUEST CODE AGAIN SLA,RSS IS THIS A "WRITE" REQUEST? JMP MVRPL YES, MOVE REPLY SKP * * HERE TO PASS ORIGINAL REQUEST TO LUMAP. * * * * DETERMINE ID SEGMENT ADDRESS OF CALLER * LDB XQT5,I IS THE REQUEST SSB,RSS STILL PENDING? JMP LOG0 NO, IGNORE THIS LDB XQT1,I GET I/O 'LINK' WORD LDA XQT6,I GET REQUEST CODE SSA "SYSTEM" I/O? CLB YES, CAN'T GET ID SEGMENT ADDRESS RAL ROTATE THE 'BUFFERED RQST' BIT SSA BUFFERED? CLB YES, CAN'T GET ID SEGMENT ADDRESS STB IDADR & SAVE LOCALLY FOR USE LATER * LDB EQT7,I LOAD CLASS I/O BUFFER ADDRESS LDA XQT11,I STORE REMOTE NODE NUMBER LDA A,I STA B,I IN BUFFER(1) INB LDA XQT11,I STORE REMOTE NODE LU NUMBER INA LDA A,I STA B,I IN BUFFER(2) INB LDA XQT6,I STORE ORIGINAL CONTROL WORD STA B,I IN BUFFER (3) INB LDA XQT8,I STORE ORIGINAL REQUEST LENGTH STA B,I IN BUFFER(4) INB LDA XQT9,I STORE ORIGINAL 1ST OPTIONAL PARAMETER STA B,I IN BUFFER(5) INB LDA XQT10,I STORE ORIGINAL 2ND OPTIONAL PARAMETER STA B,I IN BUFFER(6) INB CLA 3RD OPTIONAL PARAMETER ALWAYS ZERO FOR THIS RTE STA B,I IN BUFFER(7) INB LDA IDADR STORE CALLING PROGRAM'S ID SEGMENT STA B,I ADDRESS IN BUFFER(8) INB LDA SEQN,I LOAD SEQUENCE NUMBER STA B,I STORE IN BUFFER(9) LDA XQT6,I LOAD ORIGINAL CONTROL WORD AGAIN AND B3 MASK CPA B2 "WRITE" REQUEST? INB,RSS YES, (B) POINTS TO BUFFER ADDRESS JMP MVX3 NO, SKIP DATA TRANSFER * * SET UP DATA TRANSFER * STB CV00 SAVE DESTINATION BUFFER ADDRESS LDA XQT8,I LOAD ORIGINAL REQUEST LENGTH JSB CHTW CONVERT CHAR COUNT TO WORDS SZA ZERO? SSA OR NEGATIVE COUNT? JMP MVX3 YES, BYPASS THE TRANSFER STA TEMP SAVE # WORDS TO MOVE CMA,INA MAKE SURE ADA EQT8,I THE LENGTH CPA .REQL WE GOT FROM LUQUE RSS IS RIGHT? JMP LOG0 NO WAY! * * SET UP USER MAP, IF NECESSARY, BEFORE TRANSFERRING DATA. * IFN JSB SETMP SET UP USER MAP XIF MV1 EQU * LDA XQT7,I LOAD "SOURCE" ADDRESS LDB CV00 LOAD "DESTINATION" ADDRESS IFN SEZ,RSS USER MAP NEEDED? JMP MV2 NO, USE SYSTEM MAP LDX TEMP MWF MOVE WORDS FROM USER MAP JSB RSTMP RESTORE USER MAP JMP MVX3 MV2 EQU * XIF JSB .MVW MOVE WORDS, IN SAME MAP DEF TEMP BUFFER LENGTH NOP MVX3 EQU * LDB B3 "MASTER TIME-OUT" CONTINUATION CODE STB CCODE,I STORE CONTINUATION CODE LDB EQT10,I LOAD DS TIMEOUT LDA XQT11,I GET THE INA PROMPT FLAG LDA A,I (COMPLEMENTED) CMA IN BIT 1 ALF,RAR IOR XQT6,I IF THIS IS A READ RAR,SLA AND PROMPT IS SET RSS LDB BIT15 THEN USE MAXIMUM TIMEOUT STB XQT15,I STORE I/O TIME-OUT CLB,INB GET NON-ZERO TRANSMISSION LOG JMP IEXIT IMMEDIATE COMPLETION SKP * HERE TO SEND THE REPLY BACK TO THE CALLING PROGRAM SPC 2 * BUFFER CONTAINS THE REPLY TO THE ORIGINAL REQUEST, * PLUS DATA (AS READ) IN THE CASE WHERE THE * ORIGINAL REQUEST WAS A "READ". INCLUDED IN THE DATA ARE: * * WORD 1 SEQUENCE NUMBER--ASSIGNED BY DRIVER. MUST BE PROVIDED WITH * REPLY, IN ORDER TO BE SURE OF MATCHING ORIGINAL REQUEST. * 2 (A)-REGISTER AT COMPLETION * 3 TRANSMISSON LOG * 4 EXTENDED STATUS WORD 1 (NOT USED) * 5 EXTENDED STATUS WORD 2 (NOT USED) * 6 & FOL. : ORIGINAL DATA ("READ" REQUEST ONLY) * * ORIGINAL REQUEST IS SPECIFIED VIA THE EQT ADDRESS * (CONTAINED IN 1ST OPTIONAL PARAMETER). MVRPL EQU * LDA XQT5,I IS THE ORIGINAL REQUESTOR SSA,RSS STILL WAITING? JMP LOG0 NO, MUST HAVE TIMED OUT. COMPLETE THIS RQST LDA CCODE,I YES, IS IT CPA B3 WAITING FOR A RSS RESPONSE? JMP LOG0 NO LDA EQT7,I LOAD BUFFER ADDRESS STA TEMP SAVE IT LDA TEMP,I GET ACTUAL DEVICE STATUS AND =B37777 MASK OFF "AV" FIELD FROM REMOTE IOR =B100000 INCLUDE "AV" FIELD FROM ORIGINAL REQUEST'S EQT STA XQT5,I STORE NEW I/O STATUS & EQUIPMENT TYPE ISZ TEMP POINT TO TRANSMISSION LOG LDA TEMP,I STORE ACTUAL TRANSMISSION LOG IN EQT-- STA XQT10,I WE'LL PICK IT UP ON I/O COMPLETION. CCA SET UP ORIGINAL REQUEST EQT FOR STA XQT15,I I/O TIME-OUT & IMMEDIATE LDB B2 COMPLETION ON RE-ENTRY STB CCODE,I LDA XQT6,I WAS THE ORIGINAL AND B3 REQUEST CPA B1 A "READ"? RSS YES JMP LOG0 NO, RETURN I/O COMPLETION TO RTIOC ISZ TEMP BUMP TO EXTENDED STATUS ISZ TEMP PASS OVER EXTENDED ISZ TEMP STATUS WORDS * * ORIGINAL REQUEST WAS A "READ". * DATA IS TO BE PASSED TO ORIGINAL CALLING PROGRAM'S BUFFER, AS READ * LDA XQT10,I LOAD TRANSMISSION LOG LDB XQT8,I WAS ORIGINAL REQUEST SSB,RSS SPECIFIED IN CHARACTERS? JMP *+3 NO, WORDS INA CHARACTERS: ROUND UP TRUE LNTH, ARS AND CONVERT TO WORDS SZA,RSS WAS LENGTH ZERO?? JMP LOG0 YES, DON'T MOVE THEM STA SXEQT SAVE + WORD COUNT IFN JSB SETMP SET UP USER MAP XIF LDA TEMP LOAD "SOURCE" ADDRESS LDB XQT7,I LOAD DESTINATION ADDRESS SPC 2 IFN SEZ,RSS USER MAP NEEDED? JMP SP2 NO LDX SXEQT MWI MOVE WORDS INTO USER MAP JSB RSTMP RESTORE MAP JMP LOG0 SP2 EQU * XIF * HERE FOR I/O IN SYSTEM MAP (OR NON-DMS SYSTEM) JSB .MVW MOVE DATA DEF SXEQT BUFFER LENGTH NOP SPC 3 LOG0 EQU * CLB SET ZERO TRANSMISSION LOG SPC 1 IEXIT EQU * IMMEDIATE COMPLETION RETURN TO RTIOC LDA B4 JMP IV00,I RETURN TO RTIOC SKP * HERE TO SET UP THE I/O MAPPING FUNCTION * MAPEQ EQU * LDA EQT7,I GET BUFFER ADDRESS LDB A,I GET SECURITY CODE CPB FNMBR CORRECT? RSS JMP LOG0 NO INA LDB @VLU MOVE MAP SET-UP TO LOCAL STORAGE JSB .MVW DEF B3 NOP * LDA VLU CPA M1 ARE WE TO FIND AN LU? JMP FMPEQ YES. LDB VLU LOAD THE LU NUMBER TO BE CHECKED JSB CKMLU CHECK THE LU FOR "MAPPABILITY" JMP SETUP EQT IS GOOD! SET IT UP! JMP LOG0 EQT NOT RIGHT, OR SIZE TOO SMALL SPC 2 * HERE TO SCAN THE LUS TO FIND ONE WHICH IS "MAPPABLE" AND HAS * AN EMPTY MAP ENTRY. * * NOTE: DURING SEARCH, THE FOLLOWING LABELS ARE USED: * * SETTO CONTAINS NUMBER OF LAST EQT CHECKED * TEMP CONTAINS ADDRESS OF LAST EQT CHECKED * FMPEQ EQU * LDA LUMAX SET LOOP CMA,INA COUNTER FOR MAX. # LUS STA CNTR CLB,INB INITIALIZE LU NUMBER STB VLU FMLUP EQU * LDB VLU LOAD LU TO BE CHECKED JSB CKMLU CHECK THE LU FOR "MAPPABILITY". JMP FML1 FOUND ONE!! SPC 2 FMNXT EQU * HERE TO ADVANCE TO NEXT LU ISZ VLU BUMP LU # ISZ CNTR END OF LOOP? JMP FMLUP NO, CONTINUE JMP LOG0 RETURN TO CALLER SPC 2 FML1 EQU * LDA B INA LDA A,I LOAD ENTRY SZA EMPTY? JMP FMNXT NO--ENTRY IN USE * * FOUND AN ENTRY THAT'S AVAILABLE. SETUP EQU * LDA RNODE STORE LU IN THE STA B,I TABLE INB ADVANCE TO NEXT MAP TABLE LOCN LDA RLU STORE THE STA B,I REMOTE LU NUMBER IN THE TABLE LDB VLU RETURN W/ (B) = LU # TO USE JMP IEXIT SPC 2 * SUBROUTINE TO CHECK THE EQT ASSOCIATED WITH AN LU * TO VERIFY THAT IT IS "MAPPABLE". BY THIS IS MEANS: * 1) THE LU POINTS TO AN EQT WHICH "POINTS" TO THIS DRIVER. * 2) THE LU IS NOT THE "RESERVED" LU, AND DOES NOT POINT TO * THE "RESERVED" EQT. * 3) THE EQT ASSOCIATED WITH IT HAS AN EXTENSION SIZE * OF AT LEAST TWICE THE SUBCHANNEL NUMBER PLUS THE FIXED * STORAGE AREA SIZE (SEE THE EQT LAYOUT IN THE COMMENTS * IN THE FRONT OF THIS LISTING) * * CALLING SEQUENCE: * LDB * JSB CKMLU * CONTAINS ADDRESS OF THIS LU'S CORRESPONDING * ENTRY IN THE MAP TABLE. * CONTAINS ADDRESS OF EQT'S WORD 13 * * * SPC 2 * TEMPORARY STORAGE AREA CKTMP NOP TEMPORARY STORAGE FOR THIS ROUTINE SPC 2 CKMLU NOP ENTRY/EXIT LDA B CHECK THAT LU # IS A VALID ONE CMA,INA ADA LUMAX SSA JMP CKXIT LU > MAX # LUS IN SYSTEM SSB,RSS IS LU SZB,RSS ZERO OR NEGATIVE? JMP CKXIT YES, NO GOOD STB CKTMP SAVE LU JSB OWNLU IS IT ONE OF OURS? JMP CKXIT NO LDA CKTMP YES, GET BACK LU ADB D11 SAVE POINTER STB CKTMP TO EQT WORD 12 ADA M1 GET ADA DRT THE LDA A,I SUBCHANNEL ALF,RAL AND B37 COMPUTE INDEX RAL INTO EQT ADA .EXTZ EXTENSION LDB A IS THE EXTENSION ADA B2 BIG ENOUGH? CMA,INA ADA CKTMP,I SSA CKXIT ISZ CKMLU NO--TAKE "ERROR" EXIT * * COMPUTE ADDRESS OF "I/O MAP" ENTRY ASSOCIATED WITH THIS * LU, AND LEAVE IN UPON RETURN (VALID ONLY FOR "GOOD" EXIT) * ISZ CKTMP POINT TO EXTENSION ADDRESS ADB CKTMP,I ADD ADDRESS TO OFFSET JMP CKMLU,I NOW RETURN SPC 2 * * CHECK LU FOR BELONGING TO THE LU MAPPING DRIVER * ON ENTRY, B=VALID LU NUMBER * NO SKIP RETURN IF LU DOES NOT BELONG TO DVV00 * SINGLE SKIP RETURN WITH B POINTING TO THE LU'S EQT IF * IT DOES BELONG TO DVV00 * OWNLU NOP ADB M1 GET THE ADB DRT EQT NUMBER LDA B,I FROM AND B77 THE DRT SZA,RSS BIT BUCKET? JMP OWNLU,I YES, CAN'T MAP THAT ADA M1 GET THE MPY EQTSZ EQT'S ADA EQTA ADDRESS LDB A INB COMPARE LDA B,I INITIATION XOR EQT2,I ADDRESSES CLE,ELA SZA JMP OWNLU,I NO MATCH INB COMPARE LDA B,I CONTINUE XOR EQT3,I ADDRESSES CLE,ELA SZA JMP OWNLU,I NO MATCH INB COMPARE LDA B,I SELECT XOR EQT4,I CODES AND B77 ADB M3 RESTORE B IN CASE OF SUCCESS SZA,RSS DO SELECT CODES MATCH? ISZ OWNLU YES, TAKE GOOD RETURN JMP OWNLU,I RETURN SPC 2 * HERE TO RETURN I/O MAP INFORMATION FOR A SPECIFIED LU SPC 1 RTMAP EQU * LDA EQT8,I GET BUFFER LENGTH CPA B2 TWO WORDS? RSS JMP REJCT NO! REJECT LDB EQT9,I GET THE LU JSB CKMLU CHECK IT FOR MAPPABILITY JMP RTGUD ***GOOD LU *** CCA LDB EQT7,I GET DATA BUFFER STA B,I RETURN -1 JMP IEXIT SPC 2 RTGUD EQU * HERE WHEN LU RETURNED IS A GOOD ONE LDA EQT7,I GET USER BUFFER ADDRESS STA CKTMP SAVE ADDRESS DLD B,I GET THE MAP ENTRY WORDS DST CKTMP,I RETURN THEM TO USER * JMP IEXIT IMMEDIATE COMPLETION SKP * HERE ON REQUESTS TO SEND A 'STOP' TO ORIGINATING USER PROGRAM * SSTOP EQU * LDA XQT5,I SET "I/O TIME-OUT" STATUS BIT IOR =B40 STA XQT5,I CLA CLEAR STA XQT10,I TRANSMISSION LOG LDB XQT6,I SET TIMEOUT FOR RE-ENTRY LDA MB400 ON OTHER EQT TO 2.5 SEC FOR READ RBR,SLB AND 10 MS OTHERWISE CCA (THIS PREVENTS READ LOOPS STA XQT15,I FROM HOGGING THE SYSTEM) LDA B2 SET CONTINUATION CODE FOR "I/O COMPLETION" STA CCODE,I LDA B4 "IMMEDIATE COMPLETION" RETURN ON THIS 'SEND STOP' REQUEST JMP IV00,I SPC 2 RETRY EQU * HERE TO SET UP ORIGINAL REQUEST RE-TRY LDA =D-100 SET UP 1-SEC TIME-OUT STA XQT15,I CLA,INA WE WILL RE-ATTEMPT TO EXECUTE THE ENTIRE STA CCODE,I REQUEST ON RE-ENTRY LDA NSCDL SET UP # SCHEDULE ATTEMPTS COUNTER LDB NTRY,I ....UNLESS THE TIMER'S SZB,RSS ALREADY RUNNING STA NTRY,I JMP IEXIT IMMEDIATE COMPLETION RETURN TO RTIOC SPC 2 * HERE TO SIMULATE A REQUEST FOR SYSTEM ATTENTION SYSAT EQU * LDB EQT7,I GET THE LU THE GUY WANTS JSB CKMLU IS IT MAPPABLE? CLA,INA,RSS YES JMP IEXIT NO, THROW THE BUM OUT CPA EQT7,I IS IT LU 1? JMP SYSA1 BINGO! LDB CKTMP SAVE EQT4 ADDRESS ADB M9 OF THE EQT STB BVAL IN QUESTION LDA EQT4,I GET AND B77 SELECT CODE ADA M6 GET ADA INTBA INTERRUPT TABLE LDA A,I CONTENTS CMA,SSA,INA AN ID SEGMENT ADDRESS? JMP IEXIT NO, THROW THE BUM OUT STA SYSID YES, SAVE POSITIVE VALUE JSB $LIST SCHEDULE OURSELVES OCT 601 A PROGRAM, AND SYSID NOP TELL HIM WHERE TO FIND BVAL NOP THE EQT IN QUESTION JMP IEXIT OUR WORK IS DONE FOR NOW * SYSA1 STA OPATN GET OPERATOR ATTENTION JMP IEXIT THAT WAS EASY HED CONTINUATION INTERRUPT PROCESSING SECTION SKP CV00 NOP CONTINUATOR ENTRY POINT LDA EQT5,I IS THIS A SSA,RSS SPURIOUS INTERRUPT? JMP CEXIT YES LDA EQT4,I AND =B4000 TIME-OUT BIT SET? SZA,RSS JMP CEXIT NO, MUST BE SPURIOUS LDA EQT13,I SET UP EQT EXTENSION POINTERS JSB SEXT POINTERS LDA CCODE,I LOAD CONTINUATION CODE SSA,RSS VERIFY IT SZA,RSS JMP CEXIT NOT VALID, CONTINUATION RETURN TO $CIC ADA CTABL TOO SSA,RSS BIG? JMP CEXIT YES, INVALID LDA CCODE,I LOAD CODE AGAIN ADA CTBLE CONVERT TO JUMP ADDRESS JMP A,I AND GO THERE. SPC 2 * ROUTINE TO RE-ATTEMPT TO SCHEDULE LUQUE * SPC 2 LISTX EQU * ISZ NTRY,I BUMP RE-TRY COUNTER. EXHAUSTED? RSS NO, CONTINUE JMP MTMOT YES--MASTER TIME-OUT JSB LIST SCHEDULE LUQUE SPC 1 CEXIT EQU * ISZ CV00 I/O CONTINUATION RETURN JMP CV00,I TO CIC * SPC 2 IODUN EQU * HERE FOR I/O COMPLETION LDB EQT10,I RECOVER TRANSMISSION LOG CLA I/O COMPLETION RETURN JMP CV00,I TO CIC SPC 2 * MTMOT EQU * HERE ON MASTER TIME-OUT LDA EQT5,I IOR =B40 SET I/O TIME-OUT BIT STA EQT5,I CLB CLA JMP CV00,I RETURN TO $CIC SKP * SUBROUTINE TO SCHEDULE LUQUE * * CALLING SEQUENCE: * * JSB LIST * LIST NOP LDA EQT11,I GET LDA A,I NODE STA TEMP NUMBER LDA SEQN,I GET SEQUENCE NUMBER STA TEMP2 SAVE IT WHERE RTE CAN FIND IT LDB EQT6,I SEND LDA EQT8,I DATA SLB ONLY IF CLA WRITE STA CHTW JSB $LIST SCHEDULE 'LUQUE' OCT 701 FUNCTION 1, SUBFUNCTION 7 DEF *+6 RETURN POINT DEF LUQUE NAME DEF EQT1 P1: EQT ADDRESS DEF TEMP P2: REMOTE NODE NUMBER DEF CHTW P3: BUFFER LENGTH DEF TEMP2 P4: SEQUENCE NUMBER LDB LUPTO GET SCHEDULE RETRY TIMEOUT SZA,RSS LUQUE SCHEDULED? LDB =D-100 YES, SET ONE-SECOND TIME-OUT FOR LUMAP STB EQT15,I CLA,INA SET CONTINUATION CODE FOR RETRY STA CCODE,I STORE CONTINUATION CODE JMP LIST,I RETURN TO CALLER SPC 2 IFN * * SUBROUTINE TO SAVE OR RESTORE TWO USER MAP REGISTERS THAT * MAP A GIVEN BUFFER (BUFFER MUST BE <= 1024 WORDS LONG) * * ON ENTRY: * A POINTS TO START OF BUFFER WHOSE MAP IS TO BE SAVED/RESOTRED * B POINTS TO TWO WORD TEMP AREA FOR MAP REGISTERS * X IS -2 TO SAVE REGISTERS AND 2 TO RESTORE REGISTERS * MVMAP NOP ALF GET THE PAGE NUMBER RAL,RAL AND B37 CPA B37 IF LAST PAGE, BACK UP ONE ADA M1 ADA B40 SPECIFY USER MAP XMM MOVE IT JMP MVMAP,I SPC 2 * * SET UP MAP TO MOVE DATA TO/FROM REQUEST * E REGISTER SET IF REQUEST IS IN USER MAP * SETMP NOP LDA MAP1,I IS USER MAP NEEDED? CMA,CLE,SZA,RSS JMP SETMP,I NO LDA XQT7,I SAVE CURRENT USER MAP REGISTERS LDB MAPAD LDX M2 JSB MVMAP LDA XQT7,I SET NEW USER MAP REGISTERS LDB MAP1 LDX B2 JSB MVMAP CCE INDICATE USER MAP NEEDED JMP SETMP,I SPC 2 * * RESTORE USER MAP * RSTMP NOP LDA XQT7,I RESTORE USER MAP REGISTERS LDB MAPAD LDX B2 JSB MVMAP JMP RSTMP,I * MAPAD DEF *+1 BSS 2 SAVE AREA FOR USER MAP REGISTERS SPC 2 XIF * SUBROUTINE TO CONVERT CHARACTER COUNT TO WORDS * CALLING SEQUENCE: * LDA + = WORDS, - = CHARS * JSB CHTW * (A) = + WORD COUNT, (B) = SAME AS AT CALL * CHTW NOP SSA,RSS ALREADY HAVE COUNT IN WORDS? JMP CHTW,I YES, RETURN CMA,INA CONVERT INA ROUNDED ARS WORDS JMP CHTW,I RETURN TO CALLER SPC 2 * SUBROUTINE TO SET UP THE "XQT" TABLE POINTERS. * THIS TABLE CONTAINS POINTERS TO THE ORIGINAL REQUEST'S * EQT. IT IS USED WHEN THE DRIVER IS ENTERED VIA THE * "RESERVED" LU, AND PROVIDES CONVENIENT ACCESS TO THE * ORIGINAL REQUEST'S EQT. * SXEQT NOP ENTRY/EXIT LDA SZXQT SET UP LOOP COUNTER STA CNTR LDA EQT9,I GET ORIGINAL REQUEST'S EQT ADDRESS LDB @XQT LOAD ADDRESS OF XQT TABLE L1 EQU * LOOP STA B,I SET ADDRESS INA INB BUMP POINTERS ISZ CNTR DONE? JMP L1 NO, CONTINUE LDA XQT13,I LOAD EQT EXTENSION ADDRESS JSB SEXT SET ADDRESSES OF EXTENSION AREA JMP SXEQT,I YES, RETURN TO CALLER SPC 2 * SUBROUTINE TO SET UP THE "EXT" TABLE POINTERS * ON ENTRY, (A) = ADDRESS OF EXTENSION WORD 1 * ON RETURN, SEQN = ADDRESS OF 1ST EXTENSION WORD * 2 2ND * 3 3RD * ETC. SEXT NOP STA SEQN INA STA CCODE INA STA NTRY INA STA MAP1 INA STA MAP2 JMP SEXT,I SPC 2 A EQU 0 B EQU 1 OPATN EQU 1734B OPERATOR ATTENTION FLAG INTBA EQU 1654B EQTA EQU 1650B DRT EQU 1652B LUMAX EQU 1653B EQT1 EQU 1660B EQT2 EQU 1661B EQT3 EQU 1662B EQT4 EQU 1663B EQT5 EQU 1664B EQT6 EQU 1665B EQT7 EQU 1666B EQT8 EQU 1667B EQT9 EQU 1670B EQT10 EQU 1671B EQT11 EQU 1672B EQT12 EQU 1771B EQT13 EQU 1772B EQT14 EQU 1773B EQT15 EQU 1774B SPC 2 B1 OCT 1 B2 OCT 2 B3 OCT 3 B4 OCT 4 B37 OCT 37 B40 OCT 40 B77 OCT 77 D11 DEC 11 EQTSZ DEC 15 SIZE OF EQUIPMENT TABLE ENTRY BIT15 OCT 100000 M1 DEC -1 M2 DEC -2 M3 DEC -3 M6 DEC -6 M9 DEC -9 MB400 OCT -400 NSCDL DEC -20 LIMIT OF ATTEMPTS TO SCHEDULE LUQUE LUPTO DEC -5 RE-TRY DELAY FOR ATTEMPT TO SCHEDULE LUQUE LUQUE ASC 3,LUQUE NAME OF 'LUQUE' * * WARNING: DO NOT DISTURB THE ORDER OF ENTRIES IN * THE "CONTINUATION JUMP" AND "ORIGINAL REQUESTOR'S * EQT POINTERS" TABLES. * * "CONTINUATION JUMP TABLE" * CTBLE DEF *,I DEF LISTX 1: RE-TRY LUQUE SCHEDULE DEF IODUN 2: I/O COMPLETION DEF MTMOT 3: MASTER TIME-OUT CTABL ABS CTBLE-* NEG. LENGTH OF CONTINUATION TABLE * * END OF "CONTINUATION JUMP" TABLE * * "ORIGINAL REQUESTOR'S EQT POINTERS" TABLE * * WARNING: DO NOT DISTURB ORDER OF ENTRIES IN THIS TABLE. * * THIS TABLE OVERLAYS THE CODE THAT FINDS THE RESERVED EQT * @XQT DEF XQT1 ADDRESS OF INTERNAL TABLE XQT1 EQU OVRLY POINTER TO ORIGINAL REQUEST'S EQT WORD 1 XQT2 EQU XQT1+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 2 XQT3 EQU XQT2+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 3 XQT4 EQU XQT3+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 4 XQT5 EQU XQT4+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 5 XQT6 EQU XQT5+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 6 XQT7 EQU XQT6+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 7 XQT8 EQU XQT7+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 8 XQT9 EQU XQT8+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 9 XQT10 EQU XQT9+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 10 XQT11 EQU XQT10+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 11 XQT12 EQU XQT11+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 12 XQT13 EQU XQT12+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 13 XQT14 EQU XQT13+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 14 XQT15 EQU XQT14+1 POINTER TO ORIGINAL REQUEST'S EQT WORD 15 SZXQT ABS XQT1-XQT15-1 NEGATIVE OF SIZE OF XQT TABLE SEQN EQU XQT15+1 ADDRESS OF EQT EXTENSION WORD # 1 CCODE EQU SEQN+1 ADDRESS OF EQT EXTENSION WORD # 2 NTRY EQU CCODE+1 ADDRESS OF EQT EXTENSION WORD # 3 MAP1 EQU NTRY+1 ADDRESS OF EQT EXTENSION WORD # 4 MAP2 EQU MAP1+1 ADDRESS OF EXT EXTENSION WORD # 5 .EXTZ ABS MAP2+1-SEQN NEGATIVE SIZE OF EQT EXTENSION * CHECK EQU OVREN-1-MAP2 WILL GENERATE AN ERROR IF OVERLAY * AREA EXCEEDED * * * END OF "ORIGINAL REQUESTOR'S EQT POINTERS" TABLE * .REQL ABS DREQL IDADR NOP FNMBR DEC 25834 MAP SET UP SECURITY CODE ZBIT OCT 10000 "Z" BIT IWPTO EQU ZBIT "I WILL PROCESS TIME-OUT" BIT SEQN# OCT 0 SEQUENCE NUMBER * EQT SPEQT NOP HOLDS ADDRESS OF "RESERVED" EQT TEMP NOP TEMP2 NOP * * NOTE: DO NOT CHANGE ORDER OF "VLU", "RLU" OR "RNODE" * VLU NOP RLU NOP RNODE NOP * CNTR NOP @VLU DEF VLU END