ASMB,R,Q,C HED "VIRTUAL TERMINAL" DRIVER FOR RTE-L REV 800327 NAM XDV00,0 91750-16181 REV.2013 800327 (L) * * 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 SOURCE SYSTEM. ALL I/O REQUESTS * SENT TO PROGRAM "LUMAP" FOR CONVERSION TO REMOTE 'EXEC' * CALLS. * * * NAME: XDV00 * SOURCE: 91750-18181 * RELOC: 91750-16181 * PGMR: JOHN LAMPING * * WRITTEN BY LYLE WEIMAN [MAY 1979] * MODIFIED BY JOHN LAMPING [OCTOBER 1979] * * *************************************************************** SPC 3 * * DEFINE ENTRY POINTS * ENT IDV00,DDV00 SPC 1 * * DEFINE EXTERNALS * EXT $XQSB,$ATTN,#SPLU,$DVLU,$Q.PV EXT $LUTA,$LUT# EXT $IF5 EXT $DV1,$DV2,$DV3,$DV4,$DV5,$DV6,$DV7,$DV8,$DV9,$DV10 EXT $DV11,$DV12,$DV13,$DV14,$DV15,$DV16,$DV17,$DV18 EXT $DV19,$DV20,$DV21,$DV22 * * 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, XDV00 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 * THE "Z" BIT MAY ONLY BE SET ON READ REQUESTS * 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 EXCEPT ON READ REQUESTS * 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 XDV00 AND PROGRAMS 'LUQUE' AND 'LUMAP'. * * THE FIRST TIME THE DRIVER IS ENTERED, IT WILL SET #SPLU TO THE * FIRST LU POINTING TO A DVT 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 DVT * * 4) SOURCE LU DOES NOT "POINT" TO XDV00 * * 5) DVT EXTENSION NOT EQUAL TO 5 WORDS * 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 DVT, 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 DVT 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 DVT 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 * DVT 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 DVT. 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 DVT 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 DVT, 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 DVT * AND THE ORIGINAL REQUEST DVT. * * 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 * DVT'S AT THE SAME TIME, THE MECHANISM IS AS FOLLOWS. IT SETS THE * CONTINUATION CODE IN THE ORIGINAL REQUEST'S DVT TO THE ACTION IT * WANTS TO PERFORM, PLACES THE IFT ON THE PHYSICAL DONE QUEUE, * SETS THE ADDRESS OF THE ORIGINAL DVT IN THE IFT EXTENSION, ALONG WITH * A TIMEOUT, AND TAKES A LOGICAL WAIT EXIT. RTIOL WILL ENTER THE * THE ORIGINAL DVT WITH A LOGICAL CONTINUE WHICH WILL BE PROCESSED * ACCORDING TO THE CONTINUATION CODE. THE DRIVER WILL PLACE THE IFT * BACK ON THE DONE QUEUE POINTING TO THE RESERVED DVT AND WILL * DO A LOGICAL DONE WHEN RE-ENTERED. IT IS NECESSARY TO USE THE * DONE QUEUE TWICE AS DESCRIBED ABOVE TO PREVENT CONTENTION FOR * THE IFT BY TWO MAPPING REQUESTS. 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 DVT 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 ATTENTION, AS IN REMOTE USE---------------------- * (SIMULATES OPERATOR STRIKING KEYBOARD ON LU # 1) * * 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 A MAPPABLE LU. * * ----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 SKP * * ERROR CODES (IN DVT 5 STATUS) -- SAME AS RETURNED BY ACTUAL * DEVICE DRIVER AT DESTINATION NODE * * * * DVT WORD USAGE BREAKDOWN * * DVT# USE * 6 !AV! EQUIPMENT TYPE! STATUS! * 13 TIME-OUT VALUE * 15 REQUEST CONTROL WORD (CONWD) * 16 ADDRESS OF DATA BUFFER * 17 LENGTH OF DATA BUFFER; ON EXIT, TRANSMISSION LOG * 18 1ST OPTIONAL PARAMETER * 19 2ND OPTIONAL PARAMETER * 22 ADDRESS OF DVT EXTENSION AREA * * STATUS FIELD FILLED IN FROM ACTUAL DEVICE * STATUS AT DESTINATION COMPUTER. FIELD IN "RESERVED" * DVT IS MEANINGLESS. * * DVT EXTENSION AREA * 1 SEQUENCE NUMBER * 2 CONTINUATION CODE * 3 # RETRIES COUNTER, FOR ATTEMPTS TO SCHEDULE LUQUE * 4 DESTINATION NODE # * 5 DESTINATION NODE LU # * * * * 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 SIZE OF DIRVER "REQUEST" AREA DRPYL EQU 4 SIZE OF DRIVER "REPLY" AREA SPC 2 DDV00 NOP STA DIREC SAVE DIRECTIVE CODE LDA $DV22,I SET UP DVT JSB SEXT EXTENSION POINTERS LDA DIREC RECOVER DIRECTIVE CODE AND B3 MASK DIRECTIVE CODE CPA B1 INITIATE? JMP INIT YES CPA B2 CONTINUE? JMP CNTNU YES CPA B3 TIME-OUT? JMP TMOUT YES JMP IEXIT IMMEDIATE COMPLETION ON ALL OTHERS * INIT EQU * LDA $DV6,I CLEAR OLD STATUS AND =B177600 STA $DV6,I LDB $DV20,I RBL,CLE,ERB CLEAR "FIRST ENTRY" INDICATOR STB $DV20,I LDB SPDVT SPECIAL DVT SZB FOUND YET? JMP IV1 YES * * THIS IS THE FIRST TIME THIS DRIVER HAS BEEN ENTERED. * WE MUST LOCATE THE RESERVED DVT AND ITS LU NUMBER. * THIS CODE IS ONLY EXECUTED THIS ONCE AND WILL BE * OVERLAYED BY TEMPORARIES LATER. * OVRLY EQU * * LDB $DV5,I GET ADB =D6 IFT LDA B,I EXTENSION AND =B777 LENGTH CPA =D2 BETTER BE 2 RSS OK JMP REJCT NO, NO LU MAPPING FOR THIS DUDE LDB $DV1 GET POINTER TO FIRST DVT SPSR1 LDA B GET ADA =D20 WORD LDA A,I 21 SZA,RSS ANY EXTENSION OR PARAMETERS? JMP SPSR2 NO, THIS IS IT ADB B3 YES, ADVANCE TO NEXT DVT LDB B,I IN CIRCULAR LIST CPB $DV1 IS THIS WHERE WE GOT ON? JMP REJCT YES, NO RESERVED DVT, BAD GEN JMP SPSR1 NO, TRY NEXT ONE SPSR2 STB SPDVT SAVE RESERVED DVT POINTER JSB $DVLU SET ITS LU STA #SPLU FOR OTHER FOLKS TO SEE LDB SPDVT * * OVREN EQU * END OF OVERLAY AREA * IV1 CPB $DV1 IS THIS THE "RESERVED" DVT? 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 XDV00 ON ITS "RESERVED" * LU. SINCE NO OTHER I/O REQUESTS ARE ALLOWED ON THIS LU AND * IT ALWAYS COMPLETES THESE REQUESTS IMMEDIATELY, THIS DVT * IS NEVER BUSY. SPC 2 LDA $DV21,I DOES THIS DVT ADA MEXTZ HAVE THE CORRECT SZA LENGTH EXTENSION? JMP REJCT NO LDA $DV15,I GET THE REQUEST CODE RAR,SLA,RAL IS THIS A READ? RSS JMP ORDA YES, Z BIT IS OK IOR ZBIT IS THE CPA $DV15,I Z BIT SET? JMP REJCT YES--ERROR! ORDA AND B3 CONTROL CPA B3 REQUEST? JMP ORDI YES LDA $DV17,I JSB CHTW CONVERT WORD COUNT TO CHARACTER COUNT ADA MAXBF BUFFER LENGTH SSA,RSS GREATER THAN MAX. ALLOWED? JMP REJCT YES, REJECT IT. LDA $DV15,I IS THIS A AND ZBIT DOUBLE BUFFERED SZA,RSS WRITE/READ? JMP ORDC NO LDA $DV19,I YES, CHECK LENGTH JSB CHTW OF SECOND BUFFER ADA MAXBF SSA,RSS JMP REJCT TOO LONG JMP ORDC * ORDI LDA $DV16,I MOVE PARAMETER STA $DV18,I TO A BETTER SPOT * ORDC EQU * LDB EXTLU,I PICK UP DESTINATION LU FROM I-O MAP SZB,RSS DOES THIS ENTRY HAVE AN ACTIVE MAP IN IT? JMP LOG0 NO, IGNORE THIS REQUEST SPC 2 LDA SEQN# ASSIGN A INA SEQUENCE STA SEQN# NUMBER STA SEQN,I LDA NSCDL SET UP # RETRIES COUNTER STA NTRY,I JMP LIST CALL $LIST TO SCHEDULE LUQUE * DIREC NOP DIRECTIVE CODE SPC 2 * HERE TO REJECT REQUEST REJCT EQU * LDA =B140001 "DON'T DOWN & DO FINISH" THIS REQUEST STA $DV16,I CLA CLEAR STA $DV17,I TRANSMISSION LOG JMP LDEX COMPLETION STATUS TO RTIOL SPC 2 * HERE FOR READ & WRITE REQUESTS ON "RESERVED" DVT * SPECL EQU * LDA $DV15,I REQUEST CONTROL WORD AND =B3703 IS THIS REQUEST TO CPA =B3602 SET UP I/O MAP? JMP MAPEQ YES CPA =B3601 IS THIS A REQUEST TO RETURN I/O MAP INFORMATION? JMP RTMAP YES CPA =B3503 OBTAIN SYSTEM ATTENTION? JMP SYSAT YES JSB SXDVT SET UP POINTERS TO OTHER DVT LDB $DV19,I GET SEQUENCE NUMBER LDA $DV15,I GET BACK AND =B3703 REQUEST CODE CPA =B3701 IS THIS AN ORIGINAL RSS REQUEST FROM LUQUE? CPB SEQN,I NO, SEQUENCE NUMBER MUST MATCH RSS JMP LOG0 NO GOOD, NO MATCH 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 $DV15,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 $DV15,I OBTAIN REQUEST CODE AGAIN SLA,RSS WAS THIS REQUEST A "READ"? JMP MVRPL NO, MOVE REPLY BACK TO ORIGINAL REQUESTOR. SKP * HERE TO PASS ORIGINAL REQUEST TO LUMAP. * * SPC 1 * * DETERMINE ID SEGMENT ADDRESS OF CALLER * LDA XDT6,I IS REQUEST STILL PENDING? SSA,RSS JMP LOG0 NO LDB XDT2,I YES, GET I/O LINK WORD LDA XDT15,I GET REQUEST 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 $DV16,I LOAD CLASS I/O BUFFER ADDRESS LDA EXTNO,I STORE DESTINATION NODE NUMBER STA B,I IN BUFFER(1) INB LDA EXTLU,I STORE DESTINATION NODE LU NUMBER STA B,I IN BUFFER(2) INB LDA XDT15,I STORE ORIGINAL CONTROL WORD STA B,I IN BUFFER (3) INB LDA XDT17,I STORE ORIGINAL REQUEST LENGTH STA B,I IN BUFFER(4) INB LDA XDT18,I STORE ORIGINAL 1ST OPTIONAL PARAMETER STA B,I IN BUFFER(5) INB LDA XDT19,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 GET SEQUENCE NUMBER STA B,I STORE IN BUFFER(9) LDA XDT15,I LOAD ORIGINAL CONTROL WORD AGAIN IOR ZBIT IS THE Z BIT CPA XDT15,I SET? JMP MVXI YES, MUST SEND SECOND BUFFER AND B3 MASK CPA B2 "WRITE" REQUEST? MVXI INB,RSS YES, (B) POINTS TO BUFFER ADDRESS JMP MVX3 NO, SKIP DATA TRANSFER * * SET UP DATA TRANSFER * STB SEXT SAVE DESTINATION BUFFER ADDRESS LDA XDT17,I LOAD ORIGINAL REQUEST LENGTH LDB XDT15,I IF DOUBLE BUFFERED BLF,SLB MUST USE LDA XDT19,I SECOND BUFFER JSB CHTW CONVERT CHAR COUNT TO WORDS CMA,INA CONVERT COUNT TO NEGATIVE SSA,RSS IS IT REALLY NEGATIVE? JMP MVX3 NO, SKIP THE TRANSFER STA SXDVT SAVE ADA $DV17,I MAKE SURE THE LENGTH CPA .REQL WE GOT FROM LUQUE IS RIGHT RSS JMP LOG0 NO WAY! LDA XDT16,I LOAD "SOURCE" ADDRESS LDB XDT15,I IF DOUBLE BUFFERED BLF,SLB MUST USE LDA XDT18,I SECOND BUFFER * MXVL EQU * MOVE-WORDS LOOP LDB A,I MOVE DATA FROM HERE STB SEXT,I TO HERE INA INCREMENT ADDRESSES ISZ SEXT ISZ SXDVT END OF LOOP? JMP MXVL NO, CONTINUE * * MVX3 EQU * LDB B4 "SET MASTER TIME-OUT" CONTINUATION CODE STB CCODE,I STORE CONTINUATION CODE LDB $DV19,I LOAD DS TIMEOUT LDA XDT15,I GET THE OR RAL,RAL OF THE PROMPT FLAG IOR EXTLU,I AND THE Z-BIT CMA (COMPLEMENTED) ALF,RAR IN BIT 1 IOR XDT15,I IF THIS IS A READ AND RAR,SLA PROMPT OR Z-BIT IS SET RSS LDB BIT15 THEN USE MAXIMUM TIMEOUT LDA $DV5,I SET IN IFT ADA =D8 WHERE IT CAN BE FOUND STB A,I ON NEXT ENTRY JMP SEXIT DO SPECIAL EXIT 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 (DEVICE TYPE & STATUS) * 3 TRANSMISSION LOG * 4 EXTENDED STATUS WORD 1 * 5 EXTENDED STATUS WORD 2 * 6 & FOL. : ORIGINAL DATA ("READ" REQUEST ONLY) * * ORIGINAL REQUEST IS SPECIFIED VIA THE DVT ADDRESS * (CONTAINED IN 1ST OPTIONAL PARAMETER). MVRPL EQU * LDA XDT6,I IS A REQUEST STILL WAITING? SSA,RSS JMP LOG0 NO LDA CCODE,I YES, IS IT WAITING CPA B3 FOR A RESPONSE? RSS JMP LOG0 NO LDA $DV16,I LOAD BUFFER ADDRESS STA TEMP SAVE IT LDA TEMP,I GET ACTUAL DEVICE STATUS XOR XDT6,I AND =B37777 MASK OFF "AV" FIELD FROM DESTINATION XOR XDT6,I INCLUDE "AV" FIELD FROM ORIGINAL REQUEST'S DVT STA XDT6,I STORE NEW I/O STATUS & EQUIPMENT TYPE ISZ TEMP POINT TO TRANSMISSION LOG LDB XDT17,I SAVE ORIGINAL REQUEST LENGTH LDA TEMP,I STORE ACTUAL TRANSMISSION LOG IN DVT-- STA XDT17,I WE'LL PICK IT UP ON I/O COMPLETION. ISZ TEMP BUMP TO EXTENDED STATUS LDA TEMP,I LOAD EXTENDED STATUS WORD # 1 STA XDT18,I AND SAVE IN DVT WORD 18 ISZ TEMP BUMP POINTER TO 2ND EXTENDED-STATUS WORD LDA TEMP,I LOAD 2ND STATUS WORD STA XDT19,I AND SAVE LDA XDT15,I WAS ORIGINAL AND B3 REQUEST CPA B1 A "READ"? RSS YES JMP RPXIT NO, RETURN I/O COMPLETION TO IOC * ISZ TEMP BUMP POINTER TO DATA AREA * * ORIGINAL REQUEST WAS A "READ". * DATA IS TO BE PASSED TO ORIGINAL CALLING PROGRAM'S BUFFER, AS READ * LDA XDT17,I BUFFER LENGTH SSB IF ORIGINAL REQUEST WAS CHARACTERS CMA,INA BUFFER LENGTH IS CHARACTERS JSB CHTW CONVERT WORDS TO CHARACTERS CMA,INA CONVERT WORD COUNT TO NEGATIVE SSA,RSS IS IT REALLY NEGATIVE? JMP RPXIT NO, SKIP TRANSFER STA SXDVT SAVE WORD COUNT LDB XDT16,I LOAD DESTINATION ADDRESS XL EQU * WORD-MOVE LOOP LDA TEMP,I GET DATA STA B,I STORE DATA ISZ TEMP INCREMENT INB ADDRESSES ISZ SXDVT END OF LOOP? JMP XL NO, CONTINUE * RPXIT EQU * LDA B2 SET "IMMEDIATE COMPLETION" STA CCODE,I COMPLETION CODE * * SPECIAL EXIT: EXIT WITH THE IFT ON THE PRIVILEDGED DONE QUEUE * POINTING TO THE OTHER DVT. THE OTHER DVT WILL BE HANDLED AS ITS * CONTINUATION CODE INDICATES WHEN IT GETS A PHYSICAL COMPLETE * ENTRY FROM THE PHYSICAL LEVEL, AND WILL PUT THE IFT BACK ON THE * DONE QUEUE TO RE-ENTER THE RESERVED DVT, WHICH WILL THEN DO A * COMPLETION. SEXIT LDA XDT1 GET ADDRESS OF OTHER DVT JSB IFDQ SET UP IFT DONE QUEUE JMP LWEX DO LOGICAL WAIT EXIT SPC 2 * * THIS EXIT IS TAKEN TO LEAVE TRANSMISSION LOG ZERO * LOG0 EQU * CLA STA $DV17,I JMP IEXIT RETURN SKP * HERE TO SET UP THE I/O MAPPING FUNCTION * MAPEQ EQU * LDA $DV16,I GET BUFFER ADDRESS LDB A,I GET SECURITY CODE CPB FNMBR CORRECT? INA,RSS JMP LOG0 NO, REJECT * MOVE I/O MAP SET-UP INFO TO LOCAL STORAGE STA SXDVT SAVE ADDRESS DLD SXDVT,I GET 1ST TWO WORDS DST VLU SAVE ISZ SXDVT BUMP POINTER ISZ SXDVT LDA SXDVT,I LOAD DESTINATION NODE # STA RNODE SAVE * LDA VLU CPA M1 ARE WE TO FIND AN LU? JMP FMPEQ YES. * LDB VLU CHECK THE SPECIFIED LU FOR "MAPPABILITY" JSB CKMLU JMP NOMAP ERROR--CRITERIA NOT MET JMP SETMP CRITERIA MET: SET UP I/O MAP SPC 2 * HERE TO ALLOCATE AN UNUSED "MAP LU" FROM THE POOL. * THAT IS, FIND AN LU WHICH "POINTS" TO THIS DRIVER, AND * WHICH DOES NOT HAVE AN ACTIVE MAP ENTRY: LU WORD IS 0 * * FMPEQ EQU * LDA $LUT# 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 FMNXT NO, TRY NEXT LU SPC 2 LDA B INA LDA A,I LOAD ENTRY SZA EMPTY? JMP FMNXT NO--ENTRY IN USE * * FOUND AN ENTRY THAT'S AVAILABLE. SETMP EQU * POINTS TO ADDRESS OF "NODE #" WORD IN I/O MAP LDA RNODE STORE DESTINATION NODE # STA B,I IN THE TABLE INB ADVANCE PNTR TO "LU" WORD LDA RLU STORE THE LU NUMBER STA B,I IN THE TABLE LDB VLU RETURN LU # TO USE FMXIT STB $DV17,I IN TRANSMISSION LOG JMP IEXIT SPC 2 FMNXT EQU * HERE TO ADVANCE TO NEXT LU ISZ VLU BUMP LU # ISZ CNTR END OF LOOP? JMP FMLUP NO, CONTINUE TRYING LUS NOMAP EQU * HERE TO RETURN "NO GOOD" STATUS TO CALLER CLB JMP FMXIT SKP * SUBROUTINE TO CHECK THE DVT ASSOCIATED WITH AN LU * TO VERIFY THAT IT IS "MAPPABLE". BY THIS WE MEAN: * 1) THE LU POINTS TO AN DVT WHICH "POINTS" TO THIS DRIVER. * 2) THE LU IS NOT THE "RESERVED" LU, AND DOES NOT POINT TO * THE "RESERVED" DVT. * 3) THE DVT ASSOCIATED WITH IT HAS AN EXTENSION SIZE * OF 6 * * CALLING SEQUENCE: * LDB * JSB CKMLU * CONTAINS ADDRESS * OF "DESTINATION NODE #" WORD IN I/O MAP> * 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 $LUT# SSA JMP CKMLU,I LU > MAX # LUS IN SYSTEM ADB M1 COMPUTE DVT ADDRESS SSB SPECIFIED LU < 1? JMP CKMLU,I YES, TAKE "NO" EXIT ADB $LUTA ADD ADDRESS OF LU TABLE LDB B,I GET THE DVT ADDRESS SZB,RSS BIT BUCKET? JMP CKMLU,I IF YES, TAKE "NO" EXIT ADB B4 ADVANCE TO @ ASSOCIATED IFT ADDRESS LDA B,I GET IFT ENTRY ADDRESS XOR $DV5,I SAME AS THIS DRIVER? CLE,ELA SZA JMP CKMLU,I NO, TAKE "NO GOOD" EXIT * * WE'VE FOUND A DVT WHICH "BELONGS" TO THIS DRIVER. * IF IT HAS AN UNUSED "I/O MAP" ENTRY, THEN WE CAN SET IT UP * WITH ONE. ADB =D16 ADVANCE POINTER TO EXTENSION SIZE LDA B,I GET SIZE ADA MEXTZ IS EXTENSION SZA EXACTLY THE RIGHT SIZE? JMP CKMLU,I NO, TAKE "NO GOOD" ENTRY INB GOOD! ADVANCE TO ADDRESS OF EXT. AREA LDB B,I LOAD EXTENSION ADDRESS ADB B3 ADVANCE TO I/O MAP ISZ CKMLU -TAKE "GOOD" EXIT JMP CKMLU,I NOW RETURN: = I/O MAP ADDRESS SPC 2 * HERE TO RETURN I/O MAP INFORMATION FOR A SPECIFIED LU SPC 1 RTMAP EQU * LDA $DV17,I GET BUFFER LENGTH CPA B2 TWO WORDS? RSS JMP REJCT NO! REJECT LDB $DV18,I GET THE LU JSB CKMLU CHECK IT FOR MAPPABILITY CCA,RSS NOT MAPABLE JMP RTGUD ***GOOD LU *** LDB $DV16,I GET DATA BUFFER ADDRESS STA B,I RETURN -1 JMP IEXIT SPC 2 RTGUD EQU * HERE WHEN LU RETURNED IS A GOOD ONE STB CHTW SAVE I/O MAP ADDRESS FOR JUST A FEW LINES.... LDA $DV16,I GET USER BUFFER ADDRESS STA CKTMP SAVE ADDRESS DLD CHTW,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 XDT6,I SET "I/O TIMEOUT" STATUS BIT IOR =B40 STA XDT6,I CLA SET ZERO STA XDT17,I TRANSMISSION LOG LDA B6 SET CONTINUATION CODE STA CCODE,I FOR DELAYED COMPLETION JMP SEXIT DO SPECIAL EXIT SPC 2 RETRY EQU * HERE TO SET UP ORIGINAL REQUEST RE-TRY LDA B5 WE WILL RE-ATTEMPT TO EXECUTE THE ENTIRE STA CCODE,I REQUEST ON RE-ENTRY AFTER 1 SECOND JMP SEXIT DO SPECIAL EXIT SPC 2 * HERE TO SIMULATE A REQUEST FOR SYSTEM ATTENTION SYSAT EQU * LDA $DV16,I PICK UP LU TO USE SZA,RSS DEFAULTED? CLA,INA YES, USE LU = 1 STA TEMP LDB A MAKE SURE THIS LU JSB CKMLU IS MAPPABLE JMP IEXIT NO, NO ATTENTION LDA TEMP YES, GET BACK LU STA $ATTN SET "OPERATOR ATTENTION" FLAG JMP IEXIT HED CONTINUATION INTERRUPT PROCESSING SECTION SKP CNTNU EQU * CONTINUATOR ENTRY POINT LDA SPDVT IS THIS THE CPA $DV1 SPECIAL DVT? RSS JSB IFDQ NO, SET UP RE-ENTRY ON SPECIAL DVT TMOUT EQU * LDA $DV6,I IS THIS A SSA,RSS SPURIOUS INTERRUPT? JMP LWEX YES LDA $DV1 SPECIAL DVT? CPA SPDVT JMP IEXIT YES, ALWAYS DO COMPLETION LDA CCODE,I LOAD CONTINUATION CODE SSA,RSS VERIFY IT SZA,RSS JMP LWEX NOT VALID, CONTINUATION RETURN TO $CIC ADA CTABL TOO SSA,RSS BIG? JMP LWEX YES, INVALID LDA CCODE,I LOAD CODE AGAIN ADA CTBLE CONVERT TO JUMP ADDRESS JMP A,I AND GO THERE. SPC 2 * * WARNING: DO NOT DISTURB THE ORDER OF ENTRIES IN * THE "CONTINUATION JUMP" AND "ORIGINAL REQUESTOR'S * DVT POINTERS" TABLES. * * "CONTINUATION JUMP TABLE" * CTBLE DEF *,I DEF LISTX 1: RE-TRY LUQUE SCHEDULE DEF IEXIT 2: I/O COMPLETION DEF MTMOT 3: MASTER TIME-OUT DEF SMSTM 4: SET MASTER TIME OUT DEF W1SEC 5: WAIT 1 SECOND AND RETRY DEF DCOMP 6: DELAYED COMPLETION CTABL ABS CTBLE-* NEG. LENGTH OF CONTINUATION TABLE * * END OF "CONTINUATION JUMP" TABLE SPC 2 * ROUTINE TO RE-ATTEMPT TO SCHEDULE LUQUE * SPC 2 LISTX EQU * HERE ON CONTINUATION CODE = 1 ISZ NTRY,I BUMP RE-TRY COUNTER. EXHAUSTED? RSS NO, CONTINUE JMP MTMOT YES--MASTER TIMEOUT JMP LIST ATTEMPT TO SCHEDULE IT SPC 2 MTMOT EQU * HERE ON MASTER TIME-OUT(CC=3) LDA $DV6,I IOR =B40 SET I/O TIME-OUT BIT STA $DV6,I JMP LOG0 SPC 2 SMSTM EQU * LDB $DV5,I GET ADB =D8 TIMEOUT LDA B,I FROM IFT EXTENSION STA $DV12,I SET TIMEOUT LDA B3 SET COMPLETION CODE STA CCODE,I TO "MASTER TIMEOUT" JMP LWEX SPC 2 W1SEC LDA =D-100 GET 1 SECOND TIMEOUT JMP DELAY SET UP FOR RETRY IN 1 SECOND SPC 2 DCOMP LDB $DV15,I IF REQUEST IS WRITE RBR,SLB OR CONTROL JMP IEXIT COMPLETE IMMEDIATELY LDA B2 OTHERWISE, WAIT STA CCODE,I 2.5 SECONDS AND THEN LDA MB400 COMPLETE STA $DV12,I (THIS PREVENTS READ LOOPS JMP LWEX FROM HOGGING THE MACHINE) SPC 2 IEXIT EQU * CLA SAY NO ERROR STA $DV16,I JMP LDEX SPC 2 * * EXITS FROM LOGICAL LEVEL * LWEX ISZ DDV00 LOGICAL WAIT ISZ DDV00 PHYSICAL INITIATE LDEX CLA,INA LOGICAL DONE (ALWAYS ENABLE TIMEOUT) JMP DDV00,I RETURN SPC 5 * * PLACE IFT ON PRIVILEDGED DONE QUEUE POINTING TO DVT POINTED TO * BY A * IFDQ NOP LDB $DV5,I POINT TO IFT'S ADB =D4 DVT REFERENCE WORD STA B,I PLACE THE DVT'S ADDRESS THERE ADB =D3 POINT TO THE PRIVILEDGED DONE QUEUE LINK CLC 4 LDA $Q.PV PLACE IFT STB $Q.PV ON PRIVILEDGED STA B,I DONE QUEUE STC 4 JMP IFDQ,I SPC 5 * * INTERFACE DRIVER: ANY ENTRY HERE IS AN ERROR * IDV00 NOP CLE,ERA INITIALIZE OR SZA ABORT REQUEST? ISZ IDV00 NO, DO WAIT EXIT CLA NO OPTIONS WANTED JMP IDV00,I GET OUT OF HERE HED SUBROUTINES SPC 2 * * CODE TO SCHEDULE LUQUE * * CALLING SEQUENCE: * * P JMP LIST * * LIST WILL EXIT THE DRIVER THROUGH LWEX AFTER SETTING * A CONTINUATION CODE OF 1 * LIST EQU * LDA $DV1 STA PRAM5 PARAMETER 1: DVT ADDRESS LDA EXTNO,I PARAMETER 2: DESTINATION NODE # STA PRAM5+1 LDA $DV17,I PARAMETER 3: BUFFER LENGTH LDB $DV15,I UNLESS WRITE SLB DON'T SEND CLA DATA BLF,SLB BUT IF WRITE/READ LDA $DV19,I SEND SECOND BUFFER LENGTH STA PRAM5+2 LDA SEQN,I PARAMETER 4: SEQUENCE NUMBER STA PRAM5+3 STORE IN BUFFER * JSB $XQSB SCHEDULE 'LUQUE' DEF LUQUE NAME DEF PRAM5 5-PARAMETER AREA DEC 0 DON'T CHANGE TTY LDB LUPTO SET ONE-SECOND TIME-OUT SZA,RSS UNLESS LUQUE WASN'T SCHEDULED, DELAY LDB =D-100 IN WHICH CASE IT IS SHORTER STB $DV12,I CLA,INA SET CONTINUATION CODE FOR RETRY STA CCODE,I STORE CONTINUATION CODE JMP LWEX WAIT FOR LUQUE TO CALL US SPC 2 * * 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 "XDT" TABLE POINTERS. * THIS TABLE CONTAINS POINTERS TO THE ORIGINAL REQUEST'S * DVT. IT IS USED WHEN THE DRIVER IS ENTERED VIA THE * "RESERVED" LU, AND PROVIDES CONVENIENT ACCESS TO THE * ORIGINAL REQUEST'S DVT. * SXDVT NOP ENTRY/EXIT LDA SZXDT SET UP LOOP COUNTER STA CNTR LDA $DV18,I GET ORIGINAL REQUEST'S DVT ADDRESS LDB @XDT LOAD ADDRESS OF XDT TABLE JSB SETP SET PARAMETER POINTERS LDA XDT22,I LOAD DVT EXTENSION ADDRESS JSB SEXT SET ADDRESSES OF EXTENSION AREA JMP SXDVT,I 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 * CCODE 2ND * ETC. SEXT NOP LDB MEXTZ SET UP LOOP STB CNTR LDB @SEQN JSB SETP JMP SEXT,I SPC 2 * SUBROUTINE TO SET UP POINTERS SETP NOP STA B,I SET ADDRESS INA INB ISZ CNTR DONE WITH LOOP? JMP SETP+1 NO, CONTINUE JMP SETP,I YES, EXIT A EQU 0 B EQU 1 * SPC 2 PRAM5 BSS 5 B1 OCT 1 B2 OCT 2 B3 OCT 3 B4 OCT 4 B5 OCT 5 B6 OCT 6 BIT15 OCT 100000 MB400 OCT 177400 M1 DEC -1 NSCDL DEC -20 LIMIT OF ATTEMPTS TO SCHEDULE LUQUE LUPTO DEC -5 RE-TRY DELAY FOR ATTEMPT TO SCHEDULE LUQUE * * NOTE: LEAVE "LUQUE" AND "MAXBF" CONTIGUOUS, SO USERS MAY * FIND & MODIFY MAXBF, IF DESIRED. LUQUE ASC 3,LUQUE NAME OF 'LUQUE' MAXBF DEC -513 NEG. OF MAX. ALLOWABLE BUFFER SIZE -1 * * * "ORIGINAL REQUESTOR'S DVT POINTERS" TABLE * * WARNING: DO NOT DISTURB ORDER OF ENTRIES IN THIS TABLE. * * THIS TABLE OVERLAYS THE CODE THAT FINDS THE RESERVED DVT * @XDT DEF XDT1 ADDRESS OF INTERNAL TABLE XDT1 EQU OVRLY POINTER TO ORIGINAL REQUEST'S DVT WRD 1 XDT2 EQU XDT1+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 2 XDT3 EQU XDT2+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 3 XDT4 EQU XDT3+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 4 XDT5 EQU XDT4+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 5 XDT6 EQU XDT5+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 6 XDT7 EQU XDT6+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 7 XDT8 EQU XDT7+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 8 XDT9 EQU XDT8+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 9 XDT10 EQU XDT9+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 10 XDT11 EQU XDT10+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 11 XDT12 EQU XDT11+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 12 XDT13 EQU XDT12+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 13 XDT14 EQU XDT13+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 14 XDT15 EQU XDT14+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 15 XDT16 EQU XDT15+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 16 XDT17 EQU XDT16+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 17 XDT18 EQU XDT17+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 18 XDT19 EQU XDT18+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 19 XDT20 EQU XDT19+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 20 XDT21 EQU XDT20+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 21 XDT22 EQU XDT21+1 POINTER TO ORIGINAL REQUEST'S DVT WRD 22 SZXDT ABS XDT1-XDT22-1 NEGATIVE OF SIZE OF XDT TABLE * CHECK EQU OVREN-1-XDT22 WILL GENERATE AN ERROR IF OVERLAY * AREA EXCEEDED * * * STORAGE BELOW FOR DVT EXTENSION AREA * ( MUST BE CONTIGUOUS ) * SEQN NOP ADDRESS OF SEQUENCE NUMBER CCODE NOP ADDRESS OF CONTINUATION CODE NTRY NOP ADDRESS OF # RETRIES COUNTER EXTNO NOP ADDRESS OF I-O MAP: DESTINATION NODE NUMBER EXTLU NOP " " " " " " LU # * MEXTZ ABS SEQN-EXTLU-1 NEGATIVE SIZE OF DVT EXTENSION * * END OF "ORIGINAL REQUESTOR'S DVT POINTERS" TABLE * @SEQN DEF SEQN .REQL ABS DREQL LENGTH OF DRIVER REQUEST AREA IDADR NOP ZBIT OCT 10000 "Z" BIT FNMBR DEC 25834 MAP SET UP SECURITY CODE SEQN# OCT 0 SEQUENCE NUMBER SPDVT NOP HOLDS ADDRESS OF "RESERVED" DVT TEMP NOP * * WARNING: DO NOT DISTURB ORDER OF "VLU", "RLU" AND "RNODE" * VLU NOP RLU NOP RNODE NOP * CNTR NOP END