.TITLE HST$FI - FIND HDB AND POINT TO IT .IDENT /11MAY7/ ;14:30:00, EM ; .ENTRY HST$FI - FIND HDB AND POINT TO IT ;+ ; H S T $ F I ; ; PURPOSE: THIS ROUTINE IS ENTERED WITH A POINTER TO A ; USER-SPECIFIED HDA (HISTOGRAM DESCRIPTOR ; ARRAY). IT RETURNS A POINTER TO THE CORRESPONDING ; SYSTEM-MAINTAINED HDB (HISTOGRAM DESCRIPTOR BLOCK). ; IF THE HDB CORRESPONDING TO THE GIVEN HDA CANNOT BE ; FOUND, C IS SET ON RETURN. ; ; INTERFACE: CALLING SEQUENCE: ; CALL HST$FI ; ; INPUT: R4 = POINTER TO HDA ; ; OUTPUT: R3 = POINTER TO HDB ; C IS SET AND R3 IS UNDEFINED IF HDB ; CANNOT BE FOUND ; ALL REGISTERS EXCEPT R3 ARE PRESERVED. ; ; LANGUAGE: MACRO-11 ; ; RESTRICTIONS: NOT FORTRAN-CALLABLE. THIS ROUTINE IS AN INTERNAL ; ROUTINE TO THE HISTOGRAM PACKAGE AND IS NOT ; INTENDED FOR GENERAL USE. ;- ; REVISIONS: ; 02-JUN-75 MK WRITTEN ; 14-JAN-76 MK FIX SCREWUP OF NAMES <3 CHARS ; 02-FEB-77 NS CHANGE GLOBAL NAMES IN HCOM1 TO AVOID ; NAME CONFLICTS. ; ENABL=H.ENBL, HDBCHN=H.DBCH, HDBPTR=H.DBPT, ; MAXHST=H.MXHT ; 11-MAY-77 EM UPDATED TO CONFORM TO STANDARDS ; .MCALL PUSH,POP HST$FI:: TST H.ENBL ;PACKAGE ENABLED? BEQ EREX ;NO TST (R4) ;CHECK FOR CALL-BY-NUMBER BEQ CALLN ;YES ; ; THIS IS A CALL-BY-NAME. SEARCH THE HDB CHAIN FOR THE GIVEN NAME. ; PUSH ;SAVE REGS MOV R4,R0 ;POINT TO NAME IN HDA JSR R1,(PC) ;SAVE R1, SET NON-ZERO CALL $CAT5 ;CONVERT 1ST 3 CHARS OF NAME BCC 9$ ;3 CHARS CONVERTED DEC R0 ;POINT BACK TO NON-RAD50 CHAR (OR SPACE) 9$: JSR R1,(PC) ;SAVE RAD50, SET R1 NON-ZERO CALL $CAT5 ;CONVERT 2ND 3 CHARS OF NAME POP R0 ;RECOVER 1ST 3 CHARS BCC 11$ 10$: CMP R2,#40 ;DID SPACE STOP THE SCAN? BNE 3$ ;NO - BAD NAME 11$: MOV H.DBCH,R3 ;POINT TO FIRST HDB IN CHAIN BEQ 3$ ;OOPS, NO CHAIN 1$: CMP R0,HDB.NM(R3) ;CHECK NAME BNE 2$ CMP R1,HDB.NM+2(R3) BNE 2$ CMP HDA.OW(R4),HDB.OW(R3) ;CHECK OWNER BEQ 4$ ;HDB FOUND 2$: MOV (R3),R3 ;POINT TO NEXT HDB IN CHAIN BNE 1$ ;BRANCH IF THERE IS ANOTHER 3$: SEC 4$: POP ;RESTORE REGS RETURN ;(CMP THAT FOUND HDB CLEARED C) ; ; THIS IS A CALL-BY-NUMBER. SEE IF THE NUMBER HAS AN ENTRY. ; CALLN: MOV HDA.NB(R4),R3 ;GET NUMBER FROM HDA BLE 1$ ;BAD NUMBER CMP R3,#H.MXHT ;CHECK NUMBER RANGE BGT 1$ ;BAD NUMBER ASL R3 ;INDEX INTO HDB PTR TABLE MOV H.DBPT-2(R3),R3 ;PICK UP HDB POINTER BNE 2$ ;ENTRY FOR THIS NUMBER EREX= . 1$: SEC ;NO ENTRY FOR THIS NUMBER 2$: RETURN ;(ASL CLEARED C) .END