ASMB,Q,C HED I.D. SEG. ADDRESS ROUTINE *(C) HEWLETT-PACKARD CO. 1980* NAM PGMAD,30 91750-1X145 REV.2013 800419 MEF ENT PGMAD EXT .CBT,.LBT,.MBT,.MVW,.SBT,.ENTP,$LIBR,$LIBX,$OPSY SUP * NAME: PGMAD * SOURCE: 91750-18145 * RELOC: 91750-1X145 * PGMR: C.C.H. [ 04/19/80 ] * *************************************************************** * * (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. * * *************************************************************** * PGMAD ACCEPTS A USER-SUPPLIED ADDRESS OF A 3-WORD ARRAY WHICH * CONTAINS THE ASCII CODE FOR THE NAME OF A PARTICULAR PROGRAM. * OPTIONALLY, IF THE FIRST WORD OF THE ARRAY IS A ZERO, THIS INDICATES * A REQUEST TO RETURN THE ASCII NAME, ETC. FOR THE CALLING PROGRAM. * PGMAD RETURNS THE I.D. SEGMENT ADDRESS OF THE PROGRAM, THE STATUS, * AN INDICATION OF THE TYPE OF I.D. SEGMENT (I.E.,LONG/SHORT), AND THE * FATHER'S I.D. SEGMENT ADDRESS./ * A DORMANT PROGRAM, ALSO IN THE TIME LIST, HAS STATUS SET =100000B. * >>CAUTION: SHORT ID ADDRESS REPORTED= +(ADDRESS-13B) [KEY WORD FORMAT]. * * IF THE USER SUPPLIES A NEGATIVE I.D. SEGMENT ADDRESS VIA PARAMETER * 'IDAD', THEN PGMAD WILL RETURN RETURN 3 WORDS, CONTAINING THE * ASCII PROGRAM NAME, TO THE BUFFER DEFINED BY THE 'NAME' PARAMETER. * >>CAUTION: SHORT ID ADDRESS MUST BE= -(ID ADDR.-13B) [KEY WORD FORMAT]. * * PGMAD CALLING SEQUENCE: * * JSB PGMAD * DEF *+2 [ OR *+2+N WHERE N= NUMBER OF OPTIONAL PARAMETERS ] * DEF NAME ADDRESS OF 3-WORD ASCII PROGRAM NAME ARRAY. * [DEF IDAD] [OPT. IF PARAM NEG: ASCII RETURNED; ELSE,0/+(ID ADDR)] * [DEF ISTAT] [OPTIONAL ADDRESS FOR RETURN OF PROGRAM STATUS] * [DEF IDTYP] [OPTIONAL ADDRESS FOR RETURN OF I.D.SEGMENT TYPE] * [DEF FATHA] [OPTIONAL ADDRESS FOR RETURN OF FATHER'S I.D. ADDRESS] * = I.D. SEGMENT ADDRESS. * = PROGRAM STATUS. [ DORMANT, IN TIME LIST =100000B] * = 0: STANDARD I.D. SEGMENT. * = 1: SHORT I.D. SEGMENT. * * FORTRAN CALLING SEQUENCE: CALL PGMAD(NAME [,IDAD [,ISTAT [,IDTYP]]]) * * PGMAD ERROR DETECTION: * * A. ADDRESS OF NAME-ARRAY NOT SUPPLIED. * B. CHARACTER #5 OF USER-SUPPLIED PROGRAM NAME IS NULL. * C. I.D. SEGMENT WITH EQUIVALENT PROGRAM NAME CANNOT BE FOUND. * * -- RETURN TO WITH: * 1. & AND 'IDAD' & 'ISTAT' ALL SET = 0. * 2. AND 'IDTYP' ARE SET =1. SKP NAME NOP POINTER TO ASCII NAME ARRAY. P1 DEF A POINTER FOR RETURN OF ID SEG. ADDRESS. P2 DEF B POINTER FOR RETURN OF PROGRAM STATUS. P3 DEF TEMP POINTER FOR RETURN OF ID SEG. TYPE. P4 DEF TEMP+1 POINTER FOR RETURN OF FATHER ID ADDRESS. PGMAD NOP ENTRY/EXIT JSB $LIBR NOP OF THIS SUBROUTINE. JSB .ENTP OBTAIN DIRECT ADDRESSES. DEF NAME DEFINE PARAMETER STORAGE AREA. FIRST JMP CONFG CONFIGURE IF DMS, THEN FIRST =NOP. LDA NAME GET THE ADDRESS OF THE ASCII ARRAY. SZA,RSS DID THE CALLER SUPPLY AN ADDRESS? JMP ERREX NO--ERROR! * CLE,ELA FORM A BYTE ADDRESS STA NAMBA FOR THE USER'S ASCII BUFFER. SPC 1 * RESET POINTERS TO ALLOW USER TO CALL WITHOUT RETURN-DATA PARAMETERS. SPC 1 DLD P1 GET PARAMETER ADDRESSES-IF ANY. DST IDAD SAVE FOR DATA RETURN. DLD REGDF GET INITIAL PARAMETER DEFINITION DST P1 AND RE-INITIALIZE FOR NO PARAMETERS. DLD P3 GET 'IDTYP' & 'FATHA' ADDRESSES--IF ANY. DST IDTYP SAVE PARAMETER ADDRESSES. DLD DTEMP GET DEF'S TO DUMMY PARAMETER STORAGE. DST P3 RE-SET FOR NO 'IDTYP' & 'FATHA' PARAMS. INB INITIALIZE I.D. POINTER STB KEYPT TO TEMPORARY STORAGE. CLA LDA IDAD,I GET THE ID ADDRESS--IF ANY. CMA,SSA,INA IF THE ADDRESS IS NOT NEGATIVE, JMP ASCNM THEN, USER IS SUPPLYING THE ASCII NAME. SPC 1 * DETERMINE ASCII PROGRAM NAME FROM USER'S I.D. SEGMENT ADDRESS. SPC 1 SEGAD STA IDSEG SAVE I.D. SEGMENT ADDRESS. LDB KEYWD GET KEYWORD TABLE ADDRESS. KEYCK LDA B,I GET THE KEYWORD ENTRY. [DMS: XLA B,I] NOP SZA,RSS IF THIS IS THE ENO OF THE TABLE, JMP ERREX THEN TELL THE CALLER OF HIS ERROR! * CPA IDSEG IF THE USER'S IS A VALID I.D. SEGMENT, JMP GETNM THEN CONTINUE PROCESSING THE REQUEST. INB ELSE, ADVANCE TO THE NEXT ENTRY, JMP KEYCK AND CONTINUE THE SEARCH. * GETNM JSB GETID MOVE NEEDED ID INFO TO LOCAL BUFFER. LDA LOCBA GET SOURCE BYTE ADDRESS. LDB NAMBA GET USER BUFFER BYTE ADDRESS. JSB .MBT MOVE THE FIVE DEF D5 NAME CHARACTERS NOP TO THE USER'S BUFFER. LDA B40 PAD THE LAST WORD JSB .SBT WITH AN ASCII SPACE. JMP ESTAT COMPLETE THE PROCESSING. SPC 1 * DETERMINE I.D. SEGMENT ADDRESS FROM USER'S ASCII PROGRAM NAME. SPC 1 ASCNM LDA XEQT GET CALLER'S I.D. SEGMENT ADDRESS. LDB NAME,I IF THE CALLER SPECIFIED SZB,RSS ZERO AS THE FIRST ASCII NAME JMP SEGAD PARAMETER, THEN RETURN DATA ON CALLER. * LDB KEYWD GET ADDRESS OF KEYWORD TABLE. STB KEYPT SET POINTER TO TOP OF TABLE. PLOOP LDA B,I GET KEYWORD-TABLE ENTRY. [DMS: XLA B,I] NOP SZA,RSS IF THIS IS THE END-OF-LIST (0), JMP ERREX THEN GO TO RETURN AN ERROR INDICATION. * STA IDSEG SAVE CURRENT ID SEGMENT ADDRESS. JSB GETID MOVE NEEDED ID INFO TO LOCAL BUFFER. LDA LOCBA GET BYTE ADDR. OF I.D. SEG NAME ENTRY. LDB NAMBA GET BYTE ADDRESS OF USER'S BUFFER. JSB .CBT COMPARE THE FIVE CHARACTER BYTE STRING. DEF D5 NOP JMP ESTAT NAME COMPARES. GO ESTABLISH STATUS ADDR. NOP DOES NOT COMPARE. ISZ KEYPT NO COMPARISON. POINT TO NEXT ENTRY. LDB KEYPT GET NEXT KEYWORD TABLE ADDRESS. JMP PLOOP GO TO CHECK NEXT KEYWORD ENTRY. * ESTAT LDA PSTAT GET STATUS WORD FROM LOCAL ID COPY. AND B17 ISOLATE THE STATUS CODE (BITS# 4-0). CCE,SZA IF STATUS IS NON-DORMANT (#0) JMP SVST TIME LIST CHECKING IS NOT REQUIRED. LDB TBIT GET COPY OF 'T-BIT' WORD. BLF,SLB POSITION 'T' BIT AND TEST IT. ERA PROGRAM IN TIME LIST: STATUS =100000B. SVST STA PSTAT SAVE THE MASKED STATUS CODE. * LDB FBYTA GET BYTE ADDRESS OF FATHER POINTER. JSB .LBT AND GET THE ID NUMBER. SZA,RSS IF IT'S =0, NO FURTHER EFFORT NEEDED, JMP SVDAD SO SKIP TO RETURN 0 TO THE CALLER. STA B MOVE FATHER INDEX TO . ADB M1 COMPUTE THE FATHER'S ID SEGMENT ADDRESS ADB KEYWD FROM AN OFFSET INTO THE KEYWORD TABLE. DMS1 LDA B,I GET KEYWORD TABLE ENTRY.[DMS: XLA B,I] NOP SVDAD STA FATHA,I RETURN THE FATHER'S ID TO THE CALLER. * LDA TYPID GET WORD WITH SEGMENT SIZE (SS) FLAG. LSR 4 RTE-M,III,IV 'SS' BIT IS WORD#15 BIT#4. CLE,ERA SET TO: 0-LONG/1-SHORT ID.SEG. TYPE. CLA,SEZ IF STANDARD I.D. SEG.: =0; ELSE, INA SET =1 FOR SHORT I.D. SEGMENT. STA IDTYP,I RETURN THE I.D. SEGMENT TYPE. LDA IDSEG = I.D. SEGMENT ADDRESS. CLB,SEZ = 0, IF THIS IS SHORT ID. SEG. STB FATHA,I NO PATRIARCH FOR SHORT ID'S. SEZ,RSS IF THIS IS A LONG ID SEGMENT: LDB PSTAT = PROGRAM'S CURRENT STATUS. * EROUT STA IDAD,I RETURN DATA TO STB ISTAT,I USER'S PARAMETERS--IF ANY. JSB $LIBX RETURN TO THE CALLER DEF PGMAD VIA THE PRIVILEGED PROCESSOR. * ERREX CLA,CCE,INA SET 'IDTYP' & STA IDTYP,I TO 1--FOR ERROR RETURN. CLA RETURN WITH & AND 'IDAD' & CLB 'ISTAT' ALL SET TO ZERO! JMP EROUT GO TO RETURN THE BAD NEWS. * GETID NOP = ID SEGMENT ADDRESS. ADA D12 POINT TO WORD #13 (NAME). LDB LOCAD DESTINATION IS LOCAL ID BUFFER. DMS2 JMP SAMAP NON-DMS: BYPASS; DMS =NOP. LDX D9 MOVE 9 WORDS FROM ACTUAL ID SEGMENT, MWF INTO THE LOCAL BUFFER. JMP GETID,I RETURN. SAMAP JSB .MVW COPY PART OF DEF D9 THE ID SEGMENT NOP WITHOUT CROSS-MAP OPERATIONS. JMP GETID,I RETURN. * SKP ***** DO NOT CHANGE THE ORDER OF THE FOLLOWING STATEMENTS ***** * A EQU 0 B EQU 1 B17 OCT 17 B40 OCT 40 D5 DEC 5 D9 DEC 9 D12 DEC 12 M1 DEC -1 REGDF DEF A DUMMY POINTER: PARAMETER #1. DEF B DUMMY POINTER: PARAMETER #2. DTEMP DEF TEMP DUMMY POINTER: PARAMETER #3. DEF TEMP+1 DUMMY POINTER: PARAMETER #4. FBYTA DBR FATHR BYTE ADDRESS: LOCAL ID FATHER POINTER. LOCAD DEF TEMP+3 ADDRESS OF LOCAL ID COPY'S NAME BYTES. LOCBA DBL TEMP+3 BYTE ADDRESS OF LOCAL ID NAME BYTES. IDAD NOP ADDRESS FOR RETURN OF I.D. SEG. ADDRESS. ISTAT NOP ADDRESS FOR RETURN OF PROGRAM STATUS. IDTYP NOP ADDRESS FOR RETURN OF I.D. SEGMENT TYPE. FATHA NOP ADDRESS FOR RETURN OF FATHER ID SEG. NO. KEYPT NOP POINTER TO CURRENT I.D. SEGMENT ADDRESS. TEMP BSS 13 TEMPORARY BUFFER: PARAMS AND ID SEGMENT. IDSEG EQU TEMP+2 POINTER TO ID SEG ADDRESS. TYPID EQU TEMP+5 POINTER TO ID TYPE 'SS' BIT, IN LOCAL ID. PSTAT EQU TEMP+6 POINTER TO STATUS WORD, IN LOCAL ID COPY. TBIT EQU TEMP+8 POINTER TO 'T' BIT (TIME LIST). FATHR EQU TEMP+11 POINTER TO FATHER INDEX. NAMBA EQU TEMP+12 POINTER TO NAME ARRAY BYTE ADDRESS. KEYWD EQU 1657B BASE PAGE POINTER TO KEYWORD TABLE. XEQT EQU 1717B CURRENTLY EXECUTING ID ADDRESS. * * DMS CONFIGURATION--FIRST PASS, ONLY. * ORG IDAD CODE IN BUFFER TO SAVE SPACE. CONFG CLB LDA $OPSY GET OP-SYSTEM IDENTIFIER. RAR,SLA DMS SYSTEM? STB DMS2 YES, CLEAR PATH TO 'MWF' INSTRUCTION. STB FIRST PREVENT RE-EXECUTION OF THIS CODE. SLA,RSS DMS SYSTEM? JMP FIRST+1 NO, RETURN TO MAIN CODE. DLD XLABI YES, CONFIGURE DST KEYCK INSTRUCTIONS DST PLOOP FOR CROSS-MAP DST DMS1 OPERATIONS. JMP FIRST+1 RETURN. * XLABI XLA B,I * ORR * END