ASMB,Q,C HED I.D. SEG. ADDRESS ROUTINE *(C) HEWLETT-PACKARD CO. 1980* NAM PGMAL,6 91750-1X146 REV.2013 800105 L EXT $ID#,$IDA,$IDSZ,$XQT,IDGET ENT PGMAD EXT .LBT,.MBT,.SBT,.ENTP,$LIBR,$LIBX * NAME: PGMAL * SOURCE: 91750-18146 * RELOC: 91750-1X146 * PGMR: C.C.H. [ 01/04/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. * * *************************************************************** * PGMAL 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. * PGMAL 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]]]) * * PGMAL 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 SUP [SUPPRESS EXTENDED LISTING] NAME NOP ASCII NAME ADDR. CONVERTED TO BYTE ADDR. P1 DEF A ADDRESS FOR RETURN OF PARAMETER #1. P2 DEF B ADDRESS FOR RETURN OF PARAMETER #2. P3 DEF PTEM ADDRESS FOR RETURN OF PARAMETER #3. P4 DEF PTEM+1 ADDRESS FOR RETURN OF PARAMETER #4. PGMAD NOP ENTRY/EXIT JSB $LIBR GAIN EXCLUSIVE USE NOP OF THIS SUBROUTINE. JSB .ENTP OBTAIN DIRECT ADDRESSES. DEF NAME DEFINE PARAMETER STORAGE AREA. LDA NAME GET THE ADDRESS OF THE ASCII ARRAY. SZA,RSS DID THE CALLER SUPPLY AN ADDRESS? JMP ERREX NO--ERROR! * STA SVNAM SAVE ARRAY ADDRESS, TEMPORARILY. CLE,ELA FORM A BYTE ADDRESS STA NAME 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 DPTEM 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 $ID# GET THE NUMBER OF I.D. SEGMENTS. CMB,INB FORM A COUNTER. LDA $IDA GET THE I.D. SEGMENT ADDRESS. ADCHK CPA IDSEG IF THE USER'S IS A VALID I.D. SEGMENT, JMP GETNM THEN CONTINUE PROCESSING THE REQUEST. ADA $IDSZ ADD OFFSET TO NEXT ID SEGMENT. INB,SZB HAVE ALL ID. SEGMENTS BEEN CHECKED? JMP ADCHK NO, CONTINUE CHECKING. JMP ERREX YES, THE USER'S ADDRESS IS INVALID! * GETNM ADA D12 POINT TO I.D. ASCII NAME WORDS. CLE,ELA FORM SOURCE BYTE ADDRESS. LDB NAME 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 $XQT GET CALLER'S I.D. SEGMENT ADDRESS. LDB SVNAM,I IF THE CALLER SPECIFIED SZB,RSS ZERO AS THE FIRST ASCII NAME JMP SEGAD PARAMETER, THEN RETURN DATA ON CALLER. * JSB IDGET GET I.D. SEGMENT ADDRESS DEF *+2 USING L'S ROUTINE, DEF SVNAM,I AND USER-SPECIFIED NAME. STA PTEM+2 SAVE I.D. SEGMENT ADDRESS. SZA,RSS IF THE PROGRAM WAS NOT FOUND, JMP ERREX TAKE THE ERROR EXIT; ELSE, * ESTAT LDB KEYPT,I GET THE I.D. SEGMENT ADDRESS, AGAIN. ADB D15 POINT TO I.D. SEGMENT WORD #16, STB PSTAT AND SAVE THE STATUS WORD ADDRESS. LDA B,I GET STATUS WORD FROM I.D. SEGMENT. AND B77 ISOLATE THE STATUS CODE (BITS# 5-0). SZA IF STATUS IS NON-DORMANT (#0) JMP SVST TIME LIST CHECKING IS NOT REQUIRED. ADB D2 POINT TO, AND RETRIEVE WORD #18 LDB B,I OF THE I.D. SEGMENT (RES,T,MULTIPLE). BLF,SLB POSITION THE 'T' BIT AND TEST IT. LDA BIT15 PROGRAM IN TIME LIST: STATUS =100000B. SVST STA STWRD SAVE THE MASKED STATUS CODE. SZA,RSS IF STATUS =0, IT'S DORMANT, SO JMP FATH? NO MAPPING IS REQUIRED. * STA B SAVE MASKED CODE FOR INDEXING. ADA M10B TEST FOR LOW RANGE CODES: 0 TO 7B. SSA,RSS LOW RANGE (<10B)? JMP HIRNG NO. GO TO TEST FOR HIGH RANGE. * LDA LOTBA YES. GET POINTER TO LOW RANGE TABLE, JMP GMAPS AND GO GET MAPPED STATUS CODE. * HIRNG ADA M37B TEST FOR UNDEFINED RANGE: 10B TO 46B. SSA IF THE STATUS CODE IS <47B, JMP ERREX THEN SOMETHING'S WRONG--FLAG AN ERROR! * STA B SAVE THE HIGH RANGE OFFSET VALUE. ADA M13B TEST FOR OUT-OF-RANGE CODES: >61B. SSA,RSS IF THE STATUS CODE IS >61B, JMP ERREX THEN SOMETHING'S WRONG--FLAG AN ERROR! * LDA HITBA GET THE POINTER TO THE HIGH RANGE TABLE. GMAPS ADA B INDEX TO THE MAPPED EQUIVALENT STATUS. LDB A,I GET THE RTE-M/III/IV EQUIVALENT CODE. CPB M1 IF THE MAPPED CODE = -1 (UNDEFINED), JMP ERREX THEN SOMETHING'S WRONG--FLAG AN ERROR! * STB STWRD SAVE THE MAPPED EQUIVALENT STATUS CODE, * FATH? CCB,CCE COMPUTE A BYTE ADDRESS ADB PSTAT FOR THE FATHER'S ELB ID SEGMENT NUMBER. JSB .LBT GET THE FATHER'S ID SEGMENT NO. SZA,RSS IF IT'S =0, NO FURTHER EFFORT NEEDED, JMP STR0 SO SKIP TO RETURN 0 TO THE CALLER. ADA M1 COMPUTE THE MPY $IDSZ FATHER'S ID SEGMENT ADA $IDA ADDRESS, AND RETURN IT STR0 STA FATHA,I TO THE CALLER. * LDA PSTAT RECOVER THE STATUS ADDRESS. LDA A,I GET WORD WITH SEGMENT SIZE (SS) FLAG. LSR 7 RTE-L'S 'SS' BIT IS WORD#16 BIT#7. 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 KEYPT,I = I.D. SEGMENT ADDRESS. CLB,SEZ,RSS = 0, IF THIS IS SHORT ID. SEG. LDB STWRD = 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 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. * SKP * ***** DO NOT CHANGE THE ORDER OF THE FOLLOWING STATEMENTS ***** * LOTBA DEF *+1 LOW RANGE MAP TABLE POINTER. OCT 0,-1,2,3,-1,-1,6,6 MAPPED CODES: 00B TO 07B. * HITBA DEF *+1 HIGH RANGE MAP TABLE POINTER. OCT 100000,3,3,3,3,3,3,2,1,1,4 MAP. CODES: 47B TO 61B. * A EQU 0 B EQU 1 B40 OCT 40 B77 OCT 77 DPTEM DEF PTEM DUMMY POINTER: PARAMETER #3. DEF PTEM+1 DUMMY POINTER: PARAMETER #4. 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'S ID ADDRESS. KEYPT NOP POINTER TO CURRENT I.D. SEGMENT ADDRESS. D2 DEC 2 D5 DEC 5 D12 DEC 12 OFFSET TO I.D. SEGMENT NAME-ENTRY. D15 DEC 15 OFFSET TO I.D. SEGMENT STATUS WORD. BIT15 EQU HITBA M1 DEC -1 M10B OCT -10 M13B OCT -13 M37B OCT -37 PSTAT NOP TEMPORARY STORAGE. PTEM BSS 3 TEMPORARY STORAGE. IDSEG EQU PTEM+2 REGDF DEF A DUMMY POINTER: PARAMETER #1. DEF B DUMMY POINTER: PARAMETER #2. STWRD NOP MASKED STATUS WORD. SVNAM EQU PSTAT TEMPORARY STORAGE FOR NAME ARRAY POINTER. END