Trailing-Edge
-
PDP-10 Archives
-
BB-Z759A-SM
-
cobol-source/usrdsp.mac
There are 7 other files named usrdsp.mac in the archive. Click here to see a list.
; UPD ID= 1436 on 11/14/83 at 11:59 AM by KILGORE
;TITLE USRDSP FOR COBLIB
SUBTTL ROUTINE FOR ADDING USER ROUTINES TO COBLIB /ACK
SEARCH COPYRT
SALL
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
COPYRIGHT (C) 1974, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION
COMMENT \
OVERVIEW:
THE PURPOSE OF THIS ROUTINE IS TO ALLOW INSTALLATIONS TO ADD THEIR OWN
MACRO SUBROUTINES TO COBLIB AND ENTER THEM FROM COBOL PROGRAMS.
NOTE THAT THIS MUST BE DONE ON A INSTALLATION AS OPPOSED TO AN
INDIVIDUAL USER BASIS.
THIS ROUTINE ACTUALLY CONSISTS OF TWO PARTS: A LOW SEGMENT
DISPATCH ROUTINE, WHICH WILL BE LOADED WITH THE USER'S PROGRAM UNLESS
HE GIVES "/R" IN HIS COMMAND STRING, AND A DISPATCH TABLE WHICH RESIDES
IN COBOTS.EXE.
IF THE USER SPECIFIES "/R" IN HIS COMMAND STRING THE DISPATCH
ROUTINE WILL NOT BE LOADED, INSTEAD THE USERS ROUTINES WILL BE LOADED
AND RESOLVED INTO DIRECT REFERNCES BY THE LOADER.
ONE OF THE LOCATIONS IN COBLIB'S DISPATCH TABLE WILL CONTAIN
THE FOLLOWING:
JRST 1,@USRTB.(15)
WHERE "USRTB." IS THE NAME OF THE USER DISPATCH TABLE IN COBOTS.EXE.
"USRTB." IS ALSO THE NAME OF THE COBLIB DISPATCH TABLE ENTRY FOR
THOSE OUTSIDE OF COBOTS.EXE.
THE FORMAT OF A USER DISPATCH TABLE ENTRY IN THE COBOTS HIGH SEGMENT
IS AS FOLLOWS:
EXTERNAL ROUTINE
XWD 0,ROUTINE
THE DISPATCH ROUTINE IN THE LOW SEGMENT DETERMINES THE OFFSET
INTO THE DISPATCH TABLE, PLACES THAT IN AC 15 AND THEN EXECUTES
JRST USRTB.##
AFTER CONTROL HAS BEEN TRANSFERED REGISTER 15 IS AVAILABLE TO THE
USER ROUTINE.
INSTALLATION INSTRUCTIONS:
FIRST COMLETE ANY OTHER REQUIRED SYSTEM REBUILDING AS
INSTRUCTED IN THE INSTALLATION GUIDE (COBOL.INS).
TO PLACE A ROUTINE IN COBLIB CALLABLE FROM A COBOL PROGRAM
SIMPLY LIST THE ROUTINE ENTRY POINT NAMES IN THE DISPATCH TABLE
SKELETON AT THE END OF THIS TEXT.
THEN COMPILE THIS ROUTINE WITH THE FOLLOWING COMMANDS:
R MACRO
USRDSL=USRDSP
USRDSH=TTY:,DSK:USRDSP
SHR==1
<CONTROL Z>
<CONTROL Z>
THEN REPLACE THE OLD USRDSL.REL AND USRDSH.REL IN COBLIB.REL BY THE NEW
ONES USING MAKLIB AND THEN ADD THE USER ROUTINES TO COBLIB.REL. THE
SEQUENCE OF THE REL FILES IN COBLIB IS VERY IMPORTANT AND MUST BE:
LILOWS.REL
.
.
.
USRDSL.REL
USRDSH.REL
RTN1.REL
RTN2.REL
.
.
.
RTNN.REL
AFTER THIS REBUILD COBOTS.EXE AS FOLLOWS:
.R LINK
*C8XSHR,COBLIB/SEARCH/GO
.SAVE COBOTS-V13
INSTALL THE SYSTEM AS INSTRUCTED IN THE INSTALLATION GUIDE.
USER ROUTINE LOW SEGMENTS:
FOR CURRENT AND FUTURE COMPATABILITY REASONS USER ROUTINES
ARE NOT PROVIDED WITH A STATIC LOW SEGMENT AREA. INSTEAD A
DYNAMIC (INDEXED) LOW SEGMENT FACILITY IS PROVIDED.
A. CHOOSE A REGISTER TO CONTAIN THE LOW SEGMENT BASE ADDRESS
TO BE USED BY ALL ROUTINES FOR LOW SEGMENT REFERENCE.
B. CREATE A SINGLE MACRO PROGRAM TO DEFINE THE LOW SEGMENT
FOR ALL USER ROUTINES. THE LOW SEGMENT IS DEFINED IN TERMS OF
INTERNAL SYMBOLS AND STANDARD BLOCK DEFINITIONS (NO PRESET
VALUES), BEGINNING WITH A "LOC 0".
C. A SINGLE STATIC LOW SEGMENT VARIABLE "USRLO.", PRESET TO ZERO,
IS PROVIDED TO STORE THE LOW SEGMENT BASE ADDRESS ACROSS
ROUTINE CALLS. THE FIRST TWO INSTRUCTIONS OF ROUTINES
USING A LOW SEGMENT SHOULD BE:
SKIPN IDX,USRLO.## ;GET LOW SEGMENT BASE
PUSHJ 17,GETLO ;SET IT UP IF NOT PREVIOUSLY DONE
IF CORE HAS BEEN OBTAINED FOR THE USER LOW SEGMENT, IE.
"USRLO." IS NON-ZERO, THE ROUTINE WILL PROCEED. ALL LOW
SEGMENT REFERENCES ARE MADE AS A FUNCTION OF IDX, FOR EXAMPLE:
MOVE T1,LOVAR##(IDX) ;OBTAIN CONTENTS OF LOSEG VARIABLE
IF CORE HAS NOT BEEN OBTAINED CONTROL IS TRANSFERED TO A USER
PROVIDED ROUTINE WHICH DETERMINES HOW MUCH CORE IS REQUIRED
FOR THE ENTIRE LOW SEGMENT, OBTAINS IT VIA A CALL TO ROUTINE
"FUNCT.", AND STORES THE RESULTANT BASE ADDRESS IN "USRLO.".
WHY IT WORKS:
CASE 1 (NO "/R" IN THE COMMAND STRING):
THE COMPILER WILL GENERATE AN EXTERNAL, "LILO.",
WHICH WILL CAUSE LILOWS.REL TO BE LOADED WHICH IN TURN WILL
GENERATE AN EXTERNAL REFERENCE "USRTB%" WHICH WILL CAUSE
USRDSL.REL TO BE LOADED. IN USRDSL.REL ALL OF THE USER COBLIB ROUTINE ENTRY NAMES
ARE DECLARED AS INTERNAL, THUS SATISFYING ALL REFERENCES TO ROUTINES
WHICH ARE IN COBOTS.EXE.
THE COBOTS.EXE DISPATCH TABLE REFERENCES THE USER DISPATCH
TABLE , CAUSING IT TO BE LOADED, WHICH IN TURN CAUSES THE ACTUAL
ROUTINES TO BE LOADED.
CASE 2 ("/R" IN THE COMMAND STRING):
THE COMPILER WILL NOT GENERATE AN EXTERNAL "LILO.".
SINCE THE ENTRY POINTS INTO THE USER'S ROUTINES IN USRDSL.REL
ARE DECLARED AS INTERNAL, USRDSL.REL WILL NOT BE LOADED. THUS
THE REFERENCES TO THE USER'S ROUTINES ARE SATISFIED BY ACTUAL
LOADING FROM COBLIB.REL.
\
SUBTTL DEFINITIONS
IFNDEF SHR,<SHR==0> ;0 ==> GENERATE LOW SEGMENT CODE TO DISPATCH
; TO "LOC".
;1 ==> GENERATE HIGH SEGMENT CODE TO DISPATCH
; TO USER'S ROUTINE FROM "LOC".
IFE SHR,<TITLE USRDSL FOR COBOTS>
IFN SHR,<TITLE USRDSH FOR COBOTS>
IFE SHR,<
ENTRY USRTB% ;THE LILOWS WILL GENERATE
USRTB%: BLOCK 0 ; EXTERNAL USRTB%
; IF "/R" IS NOT SPECIFIED TO FORCE THIS
; ROUTINE TO BE LOADED.
;MACRO TO GENERATE TABLE ENTRIES FOR DISPATCHING TO "LOC".
DEFINE $X(A)
<
INTERNAL A
A': JSP 15,DSPTCH
IDX==IDX+1
>
IDX==0
>
IFN SHR,<
ENTRY USRTB. ;SO COBOTS.EXE WILL HAVE THE TABLE IN IT.
; WHICH WILL FORCE ALL THE USER'S ROUTINES TO
; BE LOADED.
;MACRO TO GENERATE THE TABLE FOR DISPATCHING TO THE PARTICULAR ROUTINE
DEFINE $X(A)
<
EXTERNAL A
XWD 0,A
>
HISEG
>
SUBTTL THE DISPATCH TABLE.
SALL
IFN SHR,<
USRTB.:
>
IFE SHR,<
TABST.:
>
; ******* PLACE LIST OF ROUTINES HERE *****
;USING THE MACRO "$X" IN THE FOLLOWING FASHION:
; $X RTN1
; $X RTN2
; ...
;THE DISPATCH ROUTINE.
IFE SHR,<
IFN IDX,<
DSPTCH: SUBI 15,TABST.+1 ;COMPUTE THE TABLE OFFSET.
JRST USRTB.## ;DISPATCH
>>
.COPYRIGHT ;Put standard copyright statement in REL file
END