SYSTEM BY EVAN GALEN STRATEGIES Applications of TSO CLIST Built-in Variables to System Data Set Names

n the September 1996 issue of Technical Support I presented an article highlighting some applications of the MVS/ESA INCLUDE JCL state- ment. The INCLUDE statement was used to demonstrate an IPL recov- Iery mechanism for the primary JES2 cataloged procedure. It was also used as a technique for removing user dependence on system-level dataset This article presents the names through the use of JCL variables. The system-level INCLUDE groups application of the JCL described in the article used the JCL SET statement to define system dataset SET statement concept names as variables to be used in user JCL. This article presents the application to the TSO LOGON of the JCL SET statement concept to the TSO LOGON process and to pro- process and to program gram product execution through the use of TSO CLIST built-in variables. A product execution description of the variables used in one implementation is discussed. The vari- through the use of TSO ables are implemented in a locally written TSO/E exit IKJCT44B, one locally CLIST built-in variables. written TSO command called ISPDSNCP and two programs named ISPDSNLD and ISPISNLD. A local LOGON CLIST, which creates a user TSO environment, is constructed and appropriate installation exit points are indicated for possible customization. Any reference to “local” means local to the installation and not vendor-related. MVS/ESA Version 5 and TSO/E Version 2.5 were used for all programming samples and figures.

DEFINITIONS TSO/E, an IBM module named IKJCT44B. A CLIST (Command LIST) built-in function The CLIST built-in function exit may is defined as an operation that can be performed be written by the systems programmer on a variable, an expression or a character and must be named IKJCT44B. When string. It consists of a name followed by an CLIST processing encounters a variable argument in parentheses. The argument can be with the &SYSX prefix that has not been a variable, an expression or a character string. defined in the executing CLIST, it passes Examples of a CLIST built-in function include control to the CLIST built-in function exit, &STR(string), &SUBSTR(expr[:expr],string), if one exists. It is within the exit processing and &LENGTH(expression). An example of a that a character string is substituted for the local CLIST built-in function is &SYSXPRE- built-in variable. When the CLIST execution EXEC(&PARMSFX). IKJCT44B is called to resumes, the appropriate data is presented process this built-in function. A TSO CLIST when the variable is referenced. For more built-in variable is a CLIST built-in function information on , refer to IBM with no argument, such as &SYSXJCOBCM- TSO Extensions for MVS: CLISTs (SC28- PLIB. IKJCT44B is called to process this 1876). For more information on CLIST built-in variable. built-in functions and how to write one, CLIST built-in variables are implemented refer to IBM TSO Extensions for MVS: in the CLIST built-in function exit of Customization (SC28-1872).

TECHNICAL SUPPORT JANUARY 1997 SYSTEM STRATEGIES

CONSTRUCTING A LOCAL LOGON CLIST Figure 1: Sample TSO User Output Listing The first application of TSO CLIST built-in variables to system dataset names is in the 1 //userid1 JOB (0000,0000),’userid1 LOGON process. The user logs onto a system ‘,REGION=0K, with the LOGON command.The LOGON // TIME=NOLIMIT command invokes a LOGON cataloged proce- //* dure which was established by the installation 2 //LCLDSNS INCLUDE MEMBER=ISDSNS1S systems progra m m e r. With the va ry i n g 8 //$SYSTEMS EXEC $SYSTEMS requirements of different local user groups, XX********************************************************************* LOGON cata l o ged proc e d u r es may prol i fe r ate , XX* 08/07/96.220 * thus creating a systems programming mainte- XX* * nance problem. It is desirable to keep the XX* SYSTEMS LOGON PROCEDURE FOR TSO AND ISPF/PDF. * number of LOGON proc e d u r es to a minimum. XX* * XX********************************************************************* XX* 9 XX$SYSTEMS EXEC PGM=IKJEFT01, A CLIST (Command LIST) XX DYNAMNBR=200, XX PARM=’EX ‘’&CLISTSYS($LOGON)’’’ built-in function XX* is defined as an operation IEFC653I SUBSTITUTION JCL - PGM=IKJEFT01,DYNAMNBR=200,PARM=’EX ‘’SYS2.SYSTEM.CLIST($LOGON)’’’ 10 XXSYSPRINT DD TERM=TS,SYSOUT=* that can be performed 11 XXSYSTERM DD TERM=TS,SYSOUT=* on a variable, 12 XXSYSIN DD TERM=TS

an expression STMT NO. MESSAGE or a character string. 2 IEFC002I INCLUDE GROUP ISDSNS1S WAS EXPANDED USING SYSTEM LIBRARY SYS1.JES2.V522.JOB. INCLLIB It consists of a name 8 IEFC001I PROCEDURE $SYSTEMS WAS EXPANDED USING SYSTEM LIBRARY followed by an argument SYS1.JES2.V522.TSU.PROCLIB IEF236I ALLOC. FOR userid1 $SYSTEMS $SYSTEMS in parentheses. IEF237I TRM ALLOCATED TO SYSPRINT IEF237I TRM ALLOCATED TO SYSTERM IEF237I TRM ALLOCATED TO SYSIN

The local LOGON process must be engi- neered to be easily maintained.The LOGON Figure 2: Sample Local LOGON CLIST Segment cataloged procedure should have a minimum of dataset names to maintain. With a minimum . of dataset names, a very small set of LOGON . p ro e d u res needs to be maintained. See . Figure 1 for a sample output listing from a %LOGONPRE &DEBUG FILE(NOALLOC) ISPF(&ISPF) + simplified TSO LOGON cataloged procedure. PARMLIB(&SYSCLIST) SYSID(&SYSID) USERLIBS(&USERLIBS) + The local LOGON CLIST provides a solu- MSGGEN(&MSGGEN) MSGLOG(&MSGLOG) TIME(&TIME) VER(‘&VER’) tion for the LOGON process that allows easy /* User PRE exit point */ maintenance.The purpose of a local LOGON %ISPALLOC &DEBUG FILE(NOALLOC) ISPF(&ISPF) + CLIST is to create a TSO user environment PARMLIB(&SYSCLIST) SYSID(&SYSID) USERLIBS(&USERLIBS) + within MVS with a minimum of effort on the MSGGEN(&MSGGEN) MSGLOG(&MSGLOG) TIME(&TIME) VER(‘&VER’) user’s part. A TSO user environment encom- /* Allocate ISPF environment */ passes the virtual storage region within which SET &ISPALLOCRC = &LASTCC /* Save return code */ to execute TSO commands, the dat a s e t s %LOGONPST &DEBUG FILE(NOALLOC) ISPF(&ISPF) + required to accomplish useful work, and the PARMLIB(&SYSCLIST) SYSID(&SYSID) USERLIBS(&USERLIBS) + terminal monitor program (TMP) or Session MSGGEN(&MSGGEN) MSGLOG(&MSGLOG) TIME(&TIME) VER(‘&VER’) M a n ager wh i ch establishes a conve rs at i o n /* User POST exit point */ between the user and the system. Each user . group may have specific requirements for . their particular TSO environment. The local . LOGON CLIST should be able to be cus- tomized by a particular user group to handle these requirements. The local LOGON CLIST built-in variables are used to maximize perfor- exit point is also defined.The local LOGON also promotes the use of a very small set of mance of the TSO session. A local LOGON CLIST also supports a pre- and post-set of LOGON pro c e d u res with no imbedd e d CLIST dataset pre a l l o c ation exit point is user-customizable dataset name tables. Refer dataset names. defined to allow the user group to customize to Figure 2 for a sample segment of a LOGON The local LOGON CLIST is designed to the LOGON process for their particular needs. CLIST which executes user requests and per- use a table of system dataset names. CLIST A local LOGON CLIST dataset post allocati o n forms dataset allocations. The %LOGONPRE

TECHNICAL SUPPORT JANUARY 1997 SYSTEM STRATEGIES

Figure 3: Sample System Dataset Name LOGON Source Table, ISPDSN20 and %LOGONPST CLISTs are user- c u stomizable CLISTs. If these CLISTs do not exist in any user SYSPROC datasets, the /*********************************************************************/ /* */ default system LOGONPRE and LOGONPST /* ISPF dataset names. */ CLISTs will execute.These system CLISTs /* */ are programming stubs. The %ISPALLOC /* This file contains the group level and common dataset names */ CLIST allocates the datasets required for the /* for use with the local ISPF. */ TSO environment and uses the table of system /* */ /* The positional parameters are as follows: */ dataset names as built-in variables. /* */ /* 1 - DDNAME of ISPF file. */ /* 2 - ACF UID string segment. An * indicates a common library. */ /* SCPLIST indicates a data security administrator. */ /* 3 - Dataset name. */ To complement the TSO /* */ /* The concatenation order is derived from the order in which */ CLIST built-in variables /* entries are defined in this table. */ /* */ used for system dataset /*********************************************************************/ names, a local command /* */ ISPMLIB * SYS1.ISP.V4R2M0.SISPMENU was introduced to handle ISPMLIB * SYS1.SBPXMENU ISPMLIB * SYS1.VSFORT.V260.VSF2MLIB execution of modules /* */ ISPPLIB * SYS1.ISP.V4R2M0.SISPPENU residing in the linklist. ISPPLIB * SYS1.SBPXPENU ISPPLIB * SYS1.VSFORT.V260.VSF2PLIB Called CALL@, this TSO /* */ ISPSLIB * SYS1.ISP.V4R2M0.SISPSENU command uses only the ISPSLIB * SYS1.ISP.V4R2M0.SISPSLIB /* */ linklisted module name ISPTLIB * SYS1.ISP.V4R2M0.SISPTENU to invoke the module. ISPTLIB * SYS1.SBPXTENU ISPTLIB * SYS1.VSFORT.V260.VSF2TLIB /* */ SYSEXEC * SYS1.ISP.V4R2M0.SISPEXEC The table of system dataset names contains SYSEXEC * SYS1.EUV.SEUVEXEC the basic set of datasets to allow the LOGON SYSEXEC * SYS1.SBPXEXEC process to complete. It also supports the invo- SYSEXEC * SYS1.SIOEEXEC ca tion of the ISPF/PDF app l i c a tion. The system /* */ source table is named ISPDSNss, where ss is SYSHELP * SYS1.HELP SYSHELP * SYS1.ISP.V4R2M0.SISPHELP the system suffix. User source tabl e s /* */ ISPPREss and ISPPSTss are also scanned if SYSPROC * SYS1.ISP.V4R2M0.SISPCLIB.VB they exist. The table is parsed by a subroutine SYSPROC * SYS1.COB2CLIB.VB in IKJCT44B and all dataset name objects are SYSPROC * SYS1.SERBCLS.VB SYSPROC * SYS1.VSFORT.V260.VSF2CLIB.VB assigned to an ap p ro p ri ate built-in va ri abl e. /* */ A table of these built-in vari a bles is maintained SYSINCLD * SYS1.JES2.V522.JOB.INCLLIB in virtual storage for maximum CLIST perfor- mance. A local command processor named ISPDSNCP manages the deletion of this table Figure 4: Sample ISPALLOC ISPDSNS Invocation to allow rei n i t i a l i z a tion of the built-in vari a ble s . . ISPDSNCP also provides functions to list and . . alter the table. SYSCALL ISPDSNS &DEBUG PARMSFX(&SYSID) ISPPARM(&PARMLIB) ISPF(&ISPF) + ISPPREss indicates that user dat a s e t s MSGGEN(&MSGGEN) MSGLOG(&MSGLOG) TIME(&TIME) VER(‘&VER’) should be first in the dataset concatenation for /* Get dataset names */ a designated file name. ISPPSTss indicates . that user datasets should be last in the dataset . . concatenation for a designated file name. An example of when these tables should be used Figure 5: Sample ISPDSNS Dataset Name String Construction Segment is for the allocation of special dat a s e t s required by a specific user group, such as for . systems programming.With the PRE and PST . user tables, users could also mix their own . libraries with their group libraries, such as ISPDSNCP DEL(&PARMSFX) NOLIST /* Clear requested table */ SET &EXECDSNS = &STR(&SYSXPREEXEC(&PARMSFX) + using the PRE table for the group and the PST &SYSXEXEC(&PARMSFX) + table for private datasets. &SYSXPSTEXEC(&PARMSFX)) /* Initial EXEC */ The format of the dataset name source table . is as follows: . . ddname string datasetname

TECHNICAL SUPPORT JANUARY 1997 SYSTEM STRATEGIES

Figure 6: Sample ISPALLOC System Dataset Allocation Segment table. A reference to any dataset name built-in va ri able from any CLIST in the user T S O . s e s s i o n will automat i c a l ly cre ate a new . . dataset name table in virtual storage. /*********************************************************************/ The complete source code for modules /* */ I K J C T 4 4 B, I S P D S N C P, I S P D S N L D, a n d /* Allocate the user and system datasets. */ ISPISNLD are available for download from /* */ the TECHSUPT LIB of the NaSCOM Internet /*********************************************************************/ site as filename JAN97001.EX1. Th i s IF &USERLIBS = YES THEN + includes all COPY members and macros. The SET &UDSN = &STR(‘&SYSUID..&DSNVER.REXX’) ISPALLOC CLIST executed during LOGON ELSE + is also included. SET UDSN = &STR() SET &LIBFILE = &STR(&EXECLIB) SET &LIBDSNS = &STR(&EXECDSNS) PROGRAM PRODUCT EXECUTION UNDER TSO/E SYSCALL TSOEALLC &DEBUG + C u s t o m i z ation of user ap p l i c ations and MSGGEN(&MSGGEN) MSGLOG(&MSGLOG) TIME(&TIME) VER(‘&VER’) CLISTs whi c h refe r ence system dataset names /* Allocate TSO/E datasets. */ . occurs using the CLIST built-in variables. . Datasets required for a particular application . under ISPF are allocated within an application w rap p e r. The datasets are A LTLIBed and LIBDEFed under ISPF.The datasets are refer- where ddname is the ISPF file name to be enced by built-in variables. The first time an allocated, string is any string to allow specific Customization application is invoked within a TSO session t a rget user groups to have this fi l e, a n d and the built-in variables are referenced, the datasetname is the allocated dataset. A local of user applications INCLUDE group for that system variable is security product was the basis for the string and CL I S T s read from the appropriate JES2 INCLUDE shown in Figure 3. If string is an “*”, this l i b ra ry. The JES2 INCLUDE libra ry is implies that the dataset name is a common which reference defined in the SYSINCLD definition in the library name and that it is to be allocated to all system dataset names system dataset name table. See Figure 3 for an users. A ddname of SYSINCLD indicates that example. A subroutine in IKJCT44B parses the dataset name is to be used for any occurs using the CLIST the INCLUDE group member and assigns the INCLUDE group member built-in variable built-in variables. JCL variable definition to a built-in variable. references. This will be explained in the sec- The local format of the assigned built-in vari- tion “ P rogram Product Execution Under able is as follows: TSO/E”. Refer to Figure 3 for a sample sys- ISPDSNS (Figure 4) which parses the dataset tem dataset name LOGON source table. name tables through built-in variable refer- &SYSXJpppvvvvvvvv The local format of the built-in variable that ences. When the first system dataset name the dataset name is assigned to is as follows: built-in variable is referenced, IKJCT44B is wh e re &SYSX is a string defined by T S O / E called to process the va ri abl e. IKJCT44B for built-in va ri abl e s , J (JCL) is a local &SYSXpppvvvv in vok es local command ISPDSNLD to actually c o nvention indicating an INCLUDE gro u p , parse the system dataset name table and any ppp is the product identifier and vvvvvvvv where &SYSX is a string defined by TSO/E user PRE and POST name tables. The concate - is the INCLUDE group va ri able name. for built-in variables, ppp is either PRE, indi- nat i o n of the dataset name built-in variables is The local fo rm at of the built-in function cating the variable is initialized from the user ordered with the PRE name first followed by is as fo l l ow s : PRE table; a null string indicating a system the system dataset name variable followed by dataset name string from the system dataset the POST dataset name variable.The result of &SYSXJpppvvvvvvvv(&ss) name table ISPDSNss; or PST, indicating the these dataset name references is a dataset variable is initialized from the user POST name string which will be used to allocate the The &ss suffix allows for multiple versions of table; vvvv indicates the target dataset type or concatenation of datasets to a particular file the INCLUDE group member and facilitates file name abbreviation. name. See Figure 5 for a sample segment of a testing.The local convention for INCLUDE The local format of the built-in function is dataset name string construction. Once the group member names which define product as follows: dataset name string has been created, ISPAL- datasets is as follows: LOC calls an internal allocation subroutine &SYSXpppvvvv(&ss) TSOEALLC to allocate the concatenation of ISpppss datasets (Figure 6). The &ss suffix allows for multiple versions of The re fe rence to local command where IS defines the member as an INCLUDE the dataset name string and facilitates testing. ISPDSNCP in Figure 5 deletes, if it exists, a group at the system dataset level, ppp is the See Figure 5 for a sample of the system p rev i o u s ly allocated dataset name table in product identifier, and ss is a suffix. The SET dataset name built-in functions. v i rtual storage. This fa c i l i t ates the user statements in the INCLUDE group member The ISPALLOC CLIST is the heart of the ch a n gi n g d ataset names in user tabl e s contain the dataset name definitions. LOGON CLIST. It allocates all of the datasets ISPPREss or ISPPSTss without having to As an ex a m p l e, consider the invo c ation referenced in the dataset name tables. ISPAL- l ogo ff. This also fa c i l i t ates systems pro- of a program product under ISPF from the LOC calls an internal subroutine named gra m m e rs changing the system dataset name program product panel. Refer to Figures 7, 8,

TECHNICAL SUPPORT JANUARY 1997 SYSTEM STRATEGIES and 9 for this ex a m p l e. Fi g u re 7 descri b e s Figure 7: ISOPT20 INCLUDE Group Member the INCLUDE group JCL member with the p rogra m p roduct dataset name refe re n c e s . This member resides in the JES2 INCLUDE library. The CLIST in Figure 8 is invoked from the //*PRINT OFF ISPF program product panel. Any ISPF panel //* can be used to point to an application. When //********************************************************************* the &SYSXJOPTOPT2CLIB built-in variable //* * //* OPTIMIZER AND OPTIMIZER II DATASET DEFINITIONS * is referenced in the CLIST, IKJCT44B is //* * called to process the variable. IKJCT44B calls //********************************************************************* ISPISNLD to build the INCLUDE gro u p //* member dataset name table if it does not // SET OPT2LIB=’SYS11.OPTIMIZR.II.V200.CAILIB’ // SET OPT2LPA=’SYS11.OPTIMIZR.II.V200.CAILPA’ already exist. The INCLUDE group member //* ISOPT20 is read from the JES2 library. The // SET OPT2CLIB=’SYS2.OPTIMIZR.II.V200.CAICLIB’ suffix 20 indicates the system identifier which // SET OPT2ISPM=’SYS2.OPTIMIZR.II.V200.CAIISPM’ is executing the commands. All dataset name // SET OPT2ISPP=’SYS2.OPTIMIZR.II.V200.CAIISPP’ references in the remainder of the CLIST are // SET OPT2ISPS=’SYS2.OPTIMIZR.II.V200.CAIISPS’ // SET OPT2ISPT=’SYS2.OPTIMIZR.II.V200.CAIISPT’ obtained from the dataset name table.When //* the LCLIOPT2 CLIST is invo ke d, t h e //*PRINT ON & S Y S X J O P TOPT2LIB built-in va ri able is re s o l ved from the dataset name tabl e. Figure 8: INITOPT2 CLIST Invoked From ISPF Program Product Panel However, the &SYSXJCOBCMP2LIB will cause a table to be built from ISCOB20, if it /*********************************************************************/ does not exist. /* */ /* INITOPT2 ALLOCATES THE APPLICATION DATASETS, INVOKES THE */ /* CA-OPTIMIZER APPLICATION, AND FREES THE APPLICATION DATASETS. */ /* */ A future MVS/ESA /*********************************************************************/ TSO/E enhancement PROC 0 DEBUG

would be for IBM CONTROL PROMPT NOLIST NOMSG NOFLUSH END(ENDO) to implement IF &DEBUG Ñ= THEN CONTROL LIST CONLIST MSG END(ENDO) /*********************************************************************/ a standard set of TSO /* */ /* ALLOCATE THE CA-OPTIMIZER ISPF LIBRARIES. */ built-in variables /* */ for the standard installation /*********************************************************************/ named system datasets ALTLIB ACTIVATE APPLICATION(CLIST) DATASET( + ‘&SYSXJOPTOPT2CLIB’ + for TSO ) ISPEXEC LIBDEF ISPMLIB DATASET ID( + and ISPF operation. ‘&SYSXJOPTOPT2ISPM’ + ) ISPEXEC LIBDEF ISPPLIB DATASET ID( + To complement the TSO CLIST built-in var i- ‘&SYSXJOPTOPT2ISPP’ + ables used for system dataset names, a local ) command was introduced to handle exec u t i o n ISPEXEC LIBDEF ISPSLIB DATASET ID( + of modules residing in the linklist. Called ‘&SYSXJOPTOPT2ISPS’ + ) CA L L @ , this TSO command uses only the lin- ISPEXEC LIBDEF ISPTLIB DATASET ID( + klisted module name to invok e the module. For ‘&SYSXJOPTOPT2ISPT’ + non-linklisted data s e t s , the CALL command ) ma y be used but a built-in vari a ble should be /*********************************************************************/ /* */ used for the dataset name. With the use of bui l t - /* INVOKE THE CA-OPTIMIZER SPF VARIABLE INITIALIZATION CLIST. */ in vari a bles and the CALL@ command, no /* */ da taset names need to be coded in any CLISTs, /*********************************************************************/ thus allevi a ting a major maintenance probl e m ISPEXEC SELECT CMD(LCLIOPT2) NEWAPPL(CAOX) PASSLIB with product upgrad e s . /*********************************************************************/ FUTURE MVS/ESA TSO/E DIRECTIONS /* */ A future MVS/ESA TSO/E enhancement /* FREE THE APPLICATION DATASETS. */ /* */ would be for IBM to implement a standard set /*********************************************************************/ of TSO built-in vari a bles for the stand-ard in s t a l l a tion named system datasets for TSO and ISPEXEC LIBDEF ISPSLIB ISPF operation. The implementation could be ISPEXEC LIBDEF ISPTLIB modeled after SMP/E DDDEFs. To allow site ISPEXEC LIBDEF ISPPLIB ISPEXEC LIBDEF ISPMLIB ma n a gement of these vari a ble s , PAR M L I B ALTLIB DEACTIVATE APPLICATION(CLIST) member IKJTSO00 could be used.

TECHNICAL SUPPORT JANUARY 1997 SYSTEM STRATEGIES

Figure 9: LCLIOPT2 CLIST Referenced by INITOPT2 CLIST

/*********************************************************************/ /* */ /* LCLIOPT2 CHECKS FOR APPLICATION PROFILE VARIABLES AND IF THEY */ /* DO NOT EXIST, BUILDS THEM FROM THE SYSTEM WIDE INCLUDE */ /* CLIST VARIABLES. THIS CLIST SUPPORTS THE CA-OPTIMIZER II */ /* ISPF APPLICATION AND IS INVOKED FROM THE STANDARD INITOPT2 */ /* CLIST. */ /* */ /*********************************************************************/

PROC 0 DEBUG

CONTROL PROMPT NOLIST NOMSG NOFLUSH END(ENDO) IF &DEBUG Ñ= THEN CONTROL LIST CONLIST MSG END(ENDO)

ISPEXEC VGET (VOXCALIB) PROFILE IF &LASTCC ¬= 0 THEN DO SET &VOXCALIB = &STR(&SYSXJOPTOPT2LIB) ISPEXEC VPUT (VOXCALIB) PROFILE ENDO

ISPEXEC VGET (VOXCOBLB) PROFILE IF &LASTCC ¬= 0 THEN DO SET &VOXCOBLB = &STR(&SYSXJCOBCMP2LIB) ISPEXEC VPUT (VOXCOBLB) PROFILE ENDO

/*********************************************************************/ /* */ /* INVOKE THE CA-OPTIMIZER II APPLICATION. */ /* */ /*********************************************************************/

ISPEXEC SELECT PANEL(CAOPNL00) NEWAPPL(CAOX) PASSLIB

Fig u r es 7 and 8 would provide an easy way Evan Galen is an IBM systems programmer who for ven d o r s to distrib ute the TS O e xecution por- has worked in computing since 1974. He is expe- tion of their program product. This packa gin g rienced in MVS programming support and . would allevi a te the need for all datasets to be He can be reached on the Internet at al l o c a ted to a TSO session for ever y program [email protected]. pr oduct in an installation. Program prod u c t da tasets would then be dyn a m i c a l l y allocated as ©1997 Technical Enterprises, Inc. Reprinted needed by program product exec u t i o n . with permission of Technical Support maga- These suggestions would complete another zine. For subscription information, email step in isolating the TSO/E environment from [email protected] or call 414-768-8000, the users and make the inevi t a ble TSO program Ext. 116. p roduct ch a n ges easier to implement. ts

TECHNICAL SUPPORT JANUARY 1997