Overview
The standard procedures incorporated in PRODAMP can only be called from within procedures. The syntax of the procedure calls corresponds to the Pascal syntax.
PRODAMP makes use of the following standard procedures:
Procedure name | Function |
COMMAND DMP_#REFRESH DUMP_MEMORY ENTER_MODULE EXTRACT INSERT LIST LIST_CONTROL_BLOCK MESSAGE NEW_TASK NEXT_WINDOW READ READ_WINDOW REFERENCE SET_HEADER UNSIGNED_ON UNSIGNED_OFF WRITE | Issue DAMP statements from within a procedure Refresh the data area Output a memory area to SYSLST Provide an interface between PRODAMP procedures and Assembler modules Manipulate strings Manipulate strings Output a string to SYSLST Output a control block to SYSLST Output a message Set a new 'current' task Switch to a PRODAMP procedure in the next visible window of the DAMP Read from an EDT area Interrupt the PRODAMP procedure and allow entries or markings to be made Define a symbol as an element of a substructure Create a header for a listing Turn on unsigned arithmetic Turn off unsigned arithmetic Write to an EDT area |
The specified names should not be used for separate procedures, as this may lead to the program being interpreted incorrectly.
COMMAND Issue
DAMP statements
The standard procedure COMMAND enables the user to issue DAMP statements from within a PRODAMP procedure, e.g. in order to assign a private symbol file.
Procedure call
Operation | Operands |
COMMAND | (text) |
Operands
text | This specifies the text of the DAMP statement. “text” must be a string expression and must contain the statement in the form in which it was entered in the DAMP batch task or procedure. “text” cannot be any of the following:
|
DMP_#REFRESH
Refresh data areas
The standard procedure DMP_#REFRESH enables you to refresh data areas within a PRODAMP procedure. This may be required every now and then when diagnosing the active system.
Procedure call
Operation | Operands |
DMP_#REFRESH |
DUMP_MEMORY
Output memory area
The standard procedure DUMP_MEMORY can be used to output a memory area to SYSLST in one of the standard dump formats. All parameters must be numeric expressions.
Procedure call
Operation | Operands |
DUMP_MEMORY | (address,relad,length) |
Operands
address | Specifies the start address of the area. Depending on the value of CURRENT.ATYPE, the virtual (default value), real, absolute or HSA memory or areas from data spaces are output. In the case of large real and absolute addresses, only a value within a 4 GB segment can be specified in “address”. The associated segment must be specified in CURRENT.SEGMENT (see "Pseudo-structures"). | |
relad | Represents the displacement value from the start address. If “relad” is set to 0, the addresses are output relative to the start of the area. (DAMP uses this format, for example, for output of the TCB.) | |
length | Specifies the length of the area to be output. |
Example
A := .ETCBTFT; DUMP_MEMORY (A, 0, LENGTH ('IDMTFT','DS'))
The first TFT is output to SYSLST with the length of DSECT “IDMTFT” (see also the description of the standard function LENGTH, "Standard functions").
ENTER_MODULE
Call modules
The standard procedure ENTER_MODULE provides an interface between PRODAMP procedures and Assembler modules. It is also possible to branch to modules created with other languages provided that they conform to the conventions described below.
Procedure call
Operation | Operands |
ENTER_MODULE | (module, par1, par2, ...) |
Operands
module | Indicates the module to be called. The system expects module to be contained as an R type element in the PRODAMP library which has been defined as the object library. module must be a string type expression containing the name of the module in uppercase characters. Only the first 8 characters are evaluated. If module contains less than 8 characters, it is padded with blanks until it is 8 characters in length. |
par1, par2, ... | This is the list of parameters to be made available to the called module. Each parameter must be an identifier for a PRODAMP variable or (in more general terms) a PRODAMP expression. These expressions or variables can be of any type. The list (par1, par2, ...) can be empty. |
The registers are set as follows when the system branches to module:
R1 | points to a parameter area supplied with values by PRODAMP. |
When control is returned from the module, PRODAMP expects registers R1 to R12 to contain the same values they contained when control was passed to the module.
The parameter area has the following format:
Byte Byte Byte Byte | 0-1 2-3 4-11 12-n | Total length of the parameter area. Contains the value 0. Name of the module called. Transfer area containing the values of the parameters par1, par2,... in unbroken sequence.
|
The entire parameter area must not exceed the length of a 4K page (4096 bytes). This means that the total length of the transfer area must not be greater than 4084 bytes.
When control is returned from the module, each variable which was passed as a parameter is updated using the value from the transfer area. This means that ENTER_MODULE also provides write access to PRODAMP variables.
ENTER_MODULE can also be used to start a module that was loaded in some other way. Thus, you can use the PRODAMP procedure COMMAND to issue the DAMP statement LOAD-MODULE in which a load library can be specified.
An entered module is unloaded on returning to the PRODAMP procedure only if it was not loaded with LOAD-MODULE. The loading of modules with the DAMP statement LOAD-MODULE (which is also possible from within PRODAMP via the COMMAND statement) can thus reduce the runtime of PRODAMP procedures considerably if these modules are called frequently. Furthermore, a load library can be specified in the LOAD-MODULE statement.
Examples
Example of a PRODAMP procedure that enters the ASSEMBLER module “TEST”, which changes the string “CARSICK” to “SEASICK”:
PRODAMP procedure
STR := 'CARSICK'; ENTER_MODULE ( 'TEST', STR ); MESSAGE ( STR );
Assembler module TEST
TEST CSECT TEST AMODE ANY USING *,15 STM 14,12,12(13) MVC 12(3,1),='SEA' LM 14,12,12(13) BR 14 END
The example also shows how to save and restore registers. (In this case, this is in fact unnecessary, since TEST does not change the registers.)
Example of a PRODAMP procedure to reduce the runtime
COMMAND ('LOAD-MODULE *P-U-O-L(TEST)'); "The error case leads to the runtime error (Abort)" MESSAGE ('The module TEST was loaded'); "No unloading now occurs for ENTER_MODULE" N := 0; STR := ' '*4; WHILE (N<100) DO ENTER_MODULE ('TEST',STR); N := N+1; END WHILE;
EXTRACT
Manipulate strings
The standard procedure EXTRACT transfers as many characters from a source string, starting at a specified position, to a target string as will fit into this target string. If the length of the target string is greater than the number of characters to be transferred, the remaining characters in the target string are unaffected.
Procedure call
Operation | Operands |
EXTRACT | (target,source,position) |
Operands
target | Must be an identifier for an initialized variable of the type string. This variable contains the target string. | |
source position | Specifies the source string (as a string type expression). Specifies the position of the first character to be transferred within the source string. The first character of the source string is located at position 0. |
Examples
A := 'XXXX' ; EXTRACT ( A, 'Output for TSN 1234 under TSOS',15 );
Once the statement has been executed, A contains the text “1234”.
A := 'without problems'; EXTRACT ( A, 'This will probably not work.',19 );
Following execution of the EXTRACT procedure, A contains the string “not work.roblems”. Both examples assume that A has already been initialized by the statement shown.
INSERT
Manipulate strings
INSERT replaces the characters of a target string, starting at a specified position, with the characters of a source string. Characters are replaced until the last character from the source string has been transferred or the last character in the target string has been replaced.
Procedure call
Operation | Operands |
INSERT | (source,target,position) |
Operands
source target | Specifies the source string (expression of the type string). Must be an identifier for an initialized variable of the type string. This variable contains the target string. | |
position | Specifies the position of the character as of which the target string is to be overwritten. |
Examples
A := 'Output for TSN XXXX under user ID $$$$$$$$.'; INSERT ('1234',A,15); INSERT ('TSOS ',A,34);
Once the statements have been executed, A contains the following text:
“Output for TSN 1234 under user ID TSOS.”
A := 'This will probably not work.' INSERT ( 'function.',A,22 );
Once the statements have been executed, variable A contains the text:
“This will probably not funct”
Both examples assume that A has already been initialized by the statement shown.
LIST
Output strings to SYSLST
The standard procedure LIST serves to output a string to SYSLST.
Procedure call
Operation | Operands |
LIST | (string[,skiplines]) |
Operands
string skiplines | Specifies the string to be output. Defines how many empty lines are to be inserted before the string. |
LIST_CONTROL_BLOCK
Output a control block to SYSLST
The standard procedure LIST_CONTROL_BLOCK can be used to output the contents of a given control block of the currently opened diagnosis object to SYSLST in symbolic layout (see example in section "Symbolic layout"). All substructures and arrays will be in the “revealed” state. All parameters except cbname must be numeric expressions.
Procedure call
Operation | Operands |
LIST_CONTROL_BLOCK | (cbname,address,relad,length) |
Operands
cbname | Specifies the name of the control block to be displayed (expression of the type string). The symbols file containing the desired control block must be loaded with command ADD-SYMBOLS (see ADD-SYMBOLS command) before the command can be used, if it is not a standard one. |
address | Specifies the start address of the area for the control block. |
relad | Represents the displacement value from the start address. If “relad” is set to 0, the addresses are output from the start of the area. If a negative value is specified for “relad”, it will be automatically changed to 0. |
length | Specifies the length of the control block to be output. |
Example
LIST_CONTROL_BLOCK ('FAFG', X'BAD01400', 0, LENGTH ( 'FAFG', 'DS' ));
Once the statements have been executed, SYSLST will contain the following information:
|
MESSAGE
Display message on screen
When issued without the optional numeric parameter “line”, the standard procedure MESSAGE causes a specified text to be displayed in one of the two message lines in the DAMP screen mask (lines 2 and 3) as soon as the PRODAMP procedure is terminated and the screen is refreshed. If the value 1 or 2 is assigned to the line parameter, the specified text is output to screen immediately.
line parameter not specified:
As soon as the buffer for the two message lines is full, any additional messages are ignored. For this reason, it is advisable to follow a MESSAGE call with either an INTERRUPT or a RETURN statement. If INTERRUPT is used, the user can read the text and then, if desired, resume the procedure with RESUME. However, if the message is an error message and the procedure is to be aborted, it is better to use RETURN.
line parameter specified:
This allows interim messages providing information on the current state of processing in the procedure to be issued during PRODAMP procedures which run over longer periods.
Procedure call
Operation | Operands |
MESSAGE | (text[,line]) |
Operands
text line | Text to be displayed. stands for a numeric expression with the value 0, 1 or 2. The values indicate the message lines to which the messages are to be written. |
NEW_TASK
Set current task
The standard procedure NEW_TASK sets a new current task as defined by DAMP. This is meaningful only for SLED dumps, SNAP dumps and the active system. All accesses to task-specific tables (ETCB, EJCB etc.) or to addresses in user memory then refer to the new task.
Procedure call
Operation | Operands |
NEW_TASK | (task[,map]) |
Operands
task | Specifies the new current task. “task” must be a string expression or a numeric expression. NEW_TASK works differently in both cases. If task is a string expression, it must contain a TSN (up to 4 characters in length). If a task exists with this TSN, it is set as the current task. If this is not the case, CURRENT.ERROR is set. If task is a numeric expression, the last 3 half-bytes of this value are interpreted as an ITN. If an active task with this ITN exists in the diagnosis object, this task is set. If this is not the case, the subsequent task (in the TLT) is set. CURRENT.ERROR is only set if it is not possible to find a task in this manner. |
map | Specifies whether the existing system overview (CSECT map) is to be extended to include the overview of the nonprivileged subsystems for the new task. The specification TRUE results in decreased performance and can easily cause a memory overflow on systems with a large number of active tasks. The optional parameter map should therefore only be used when absolutely necessary. |
Example
NEW_TASK ( '0A33' ); —————————————————————————————————————————————————— (1) TASK_ID := X'AB'; ————————————————————————————————————————————————————— (2) NEW_TASK ( TASK_ID );
(1) | The task with the TSN 0A33 is selected first. If this task does not exist, CURRENT.ERROR is set. |
(2) | Then the task with the ITN X'AB' is selected as the current task. If this task does not exist either, the next task in the TLT (which could be X'AE') is selected and its TID is returned in TASK_ID. CURRENT.ERROR is set only if task X'AB' is not active and there are no more active tasks in the TLT. |
NEXT_WINDOW
Switch to next visible window
NEXT_WINDOW can only be called if READ_WINDOW has previously been called successfully. It provides the pseudo symbols INFIELDS.xxx for the next diagnostic window in the screen read by READ_WINDOW. Please refer to READ_WINDOW for further information.
If the DAMP screen does not have any more visible windows, the pseudo symbol CURRENT.ERROR is set to a value other than 0.
The pseudo symbol INFIELDS.COMMAND can always be used to access the command line of the DAMP screen, irrespective of the viewed window.
Procedure call
Operation | Operand |
NEXT_WINDOW |
Example
READ_WINDOW; —————————————————————————————————————————————————————————— (1) WHILE (CURRENT.ERROR = 0) DO —————————————————————————————————————————— (2) WRITE (DEC_STRING (INFIELDS.WNDNO)); ——————————————————————————————— (3) NEXT_WINDOW; ——————————————————————————————————————————————————————— (4) END WHILE;
(1) | The procedure is interrupted. The procedure is reactivated when the key is pressed, and the entries made in the last screen are stored internally. The topmost diagnostic window on the screen is the current diagnostic window to which INFIELDS.xxx refers. |
(2) | Aborts the procedure if NEXT_WINDOW does not display any further visible window. |
(3) | This allows the pseudo symbols INFIELDS.xxx to be evaluated for the current window. In the example, the window number is written to the EDT area. Since INFIELDS.WNDNO always exists, it is not necessary to evaluate CURRENT.ERROR. |
(4) | Switch to next window. |
READ
Read from EDT area
The standard procedure READ reads sequentially from the current EDT area and assigns the record read to a string variable text. If this string variable has not yet been initialized, a string with the maximum permissible length (133 bytes) is created. If the EDT line is too short, the variable is filled with blanks; if it is too long, surplus characters are ignored.
In addition to being used to access diagnostic data that is not in the diagnosis object (such as the REP file), this function can be used, for example, to store table layouts in separate files and to read them into the PRODAMP procedure, thereby doing away with the need for resource-intensive initialization operations.
The user is advised not to alternate between the procedures READ and WRITE, since it is possible that WRITE will change the current line number set internally by EDT. A subsequent READ operation could possibly return the wrong line.
Procedure call
Operation | Operand |
READ | (text) |
Operands
text | String variable to be assigned to the text read. |
READ_WINDOW
Interrupt PRODAMP procedure and allow entries or markings to be made in diagnostic window
The standard procedure READ_WINDOW interrupts the PRODAMP procedure. The PRODAMP procedure is reactivated after you press the key. Until you do this, you can carry out any work required in the DAMP screens.
When the procedure is reactivated using the key, the entries in the last DAMP screen are not passed to the DAMP screen, but to PRODAMP instead. The pseudo symbols INFIELDS.xxx (see below) make available entries in the topmost diagnostic window on the screen as well as entries in the command line. The standard procedure NEXT_WINDOW allows access to the entries in any subsequent diagnostic window (on the same screen). Calling the NEXT_WINDOW procedure a number of times in succession makes the entries from all the diagnostic windows on the screen (from top to bottom) available.
As well as entries, READ_WINDOW allows you to determine a number of values assigned to the windows (such as the window number). Not all entries are available. This applies particularly to entries in most of the special windows. Please refer to the list below for details. This list contains the permitted INFIELDS.xxx pseudo symbols.
Users can program their own interfaces for DAMP by incorporating READ_WINDOW and NEXT_WINDOW procedures in a PRODAMP procedure and always using the key for transferring data. This allows implementation of new, user-specific DAMP statements.
Procedure call
Operation | Operands |
READ_WINDOW |
The following pseudo-symbols can be accessed:
INFIELDS.ADDRESS
Contains any entry made in the Absolute address field in the header line of the viewed window; 4-digit numeric value.
INFIELDS.ASEL
Contains any entry made in the ASEL (Address Space Selector) field in the header line of the viewed window; 3-character string.
INFIELDS.ASID
Contains any entry made in the ASID (Address Space Identifier) field in the header line of the viewed window; 17-character string.
INFIELDS.COMMAND
Contains any entry made in the DAMP statement line; 72-character string.
INFIELDS.LAYOUT
Contains any entry made in the Window layout field in the header line of the viewed window; 3-character string.
INFIELDS.LENGTH
Contains any entry made in the Length field in the header line of the viewed window; 1-digit numeric value.
INFIELDS.MARK1 to INFIELDS.MARK6
Contains any addresses marked in the viewed window; 4-digit numeric value (for each address).
INFIELDS.RELATIVE
Contains any entry made in the Relative address field in the header line of the viewed window; 4-digit numeric value.
INFIELDS.STACK
Contains any entry made in the Stack number field in the header line of the viewed stack window; 4-digit numeric value.
INFIELDS.SYMBOL
Contains any entry made in the Symbol field in the header line of the viewed window;31-character string.
(For reasons of compatibility, the last (i.e. 32nd) character of the Symbol field is ignored.
INFIELDS.TID
Contains any entry made in the TID field in the title line of the viewed dump window; 4-digit numeric value.
INFIELDS.TSN
Contains any entry made in the TSN field in the title line of the viewed dump window; 4-digit numeric value.
INFIELDS.WNDNO
Contains the window number of the viewed window; single-digit numeric value.
INFIELDS.WNDTSK
Contains the TID to which the data in the viewed window belongs; 4-digit numeric value.
Notes
If the pseudo-symbol is queried even though no entry has been made in the corresponding field in the DAMP window, the pseudo-symbol CURRENT.ERROR is set to a value other than 0. The pseudo-symbols WNDNO and WNDTSK are set implicitly. WNDNO is always valid and WNDTSK is valid whenever the window contains data from a user task. If the data is system data, the value contained in WNDTSK is not valid (CURRENT.ERROR is set).
If the PRODAMP procedure interrupted with READ_WINDOW is resumed using the RESUME-PRODAMP-PROGRAM statement, the procedure is always aborted if an attempt is made to access one of the pseudo-symbols. In this event, an appropriate message is issued.
The data stored in the pseudo-symbols is not destroyed if the PRODAMP procedure is interrupted normally using the INTERRUPT statement. It remains available after the procedure has been resumed (using the RESUME-PRODAMP-PROGRAM) statement.Each time a PRODAMP procedure is restarted, however, the data area accessed by the pseudo-base INFIELDS is set to an invalid value. This is also the case if a different procedure was started between the INTERRUPT and RESUME-PRODAMP-PROGRAM statements.
Irrespective of the number of windows displayed on the screen, a maximum of 6 markers are transferred and assigned to the relevant windows with the READ_WINDOW and NEXT_WINDOW procedures. The markers are available in the PRODAMP procedure via the pseudo-symbols INFIELDS.MARK1 through INFIELDS.MARK6.
Example
The following procedure waits in the background until an address field is marked and transferred using the key. If this happens, the procedure outputs the first word located at the marked address in the message line.
ARRANGE .WORD : OFFSET = 0, LENGTH = 4, TYPE = NUMERIC; END ARRANGE; B := 0; WHILE B=B DO CURRENT.ERROR := 0; READ_WINDOW; WHILE CURRENT.ERROR = 0 DO A := INFIELDS.MARK1; MESSAGE ( HEX_STRING(A,8)+': '+HEX_STRING(A.WORD,8) ); NEXT_WINDOW; END WHILE; END WHILE;
REFERENCE
Localize symbol which is element of substructure
The standard procedure REFERENCE is only used in conjunction with the standard functions ADDRESS and LENGTH. The procedure is used for specifying references if the symbol to be processed using ADDRESS or LENGTH is an element of a substructure. The REFERENCE procedure must be called for each symbol which lies on the “path” to the required element. This must be done in the correct sequence (see example). Symbols must be specified as a string of up to 32 characters. These are collected by the REFERENCE calls, but not checked for validity. The strings are only checked when the ADDRESS or LENGTH function is called.
All REFERENCE calls are only valid locally within a procedure. If the calls are not resolved by calling ADDRESS or LENGTH when the procedure is terminated, the procedure is aborted. If the call is resolved, the referenced path is deleted. If the element is required again, you must make new REFERENCE calls.
Procedure call
Operation | Operand |
REFERENCE | (symbol) |
Operands
symbol | Specifies the symbol to be localized; 31-character string. |
Example
NKLCB_MDL.COPY_PARAMETER.USER_ADMINISTRATION.WAIT_FACTOR —————————————— (1) REFERENCE ( 'NKLCB_MDL' ); REFERENCE ( 'COPY_PARAMETER' ); REFERENCE ( 'USER_ADMINISTRATION' ); —————————————————————————————————— (2) A := ADDRESS ( 'WAIT_FACTOR', 'RF' ); ————————————————————————————————— (3)
(1) | This SPL structure field is to be evaluated. |
(2) | The REFERENCE procedure is used three times to indicate the path (“NKLCB_MDL.COPY_PARAMETER.USER_ADMINISTRATION”) leading to the WAIT_FACTOR symbol. |
(3) | This returns the address of the WAIT_FACTOR symbol. The address is calculated relative to the first symbol of the chain of references (NKLCB_MDL in the example). Specifying “RF” indicates that REFERENCE calls were required to find this symbol. |
SET_HEADER
Generate header for list output
SET_HEADER can be used to generate a header for a list output. This header is output for the first time when SET_HEADER is called; after this, it is output after each subsequent new page in the list until the text is changed by a new SET_HEADER call.
Procedure call
Operation | Operands |
SET_HEADER | (string,skiplines,reservelines) |
Operands
string | must be an expression of the type “string” and contains the text for the header. | |
skiplines | must be a numeric expression and specifies the number of lines to be skipped before the header is printed for the first time. 0 ≤ skiplines ≤ 255. | |
reservelines | must be a numeric expression and has the following effect: if there are less than “reservelines” lines left on the current page before the next page break, a form feed to a new page is executed before the header is printed for the first time. |
Example
SET_HEADER ('TEXT',0,255); ————————————————————————————————————————————(1) SET_HEADER ('TFT FOR TASK'+CURRENT.TSN, 2, 20); ———————————————————————(2)
(1) | This forces a form feed before the header. |
(2) | 2 lines are skipped before the header (one line is always skipped after the header). If there are less than 20 lines left on the current page, a form feed is executed. |
UNSIGNED_ON and UNSIGNED_OFF
Enable and disable unsigned arithmetic
When performing calculations with addresses, it can sometimes be a disadvantage to work with signed arithmetic. For this reason, it is possible to select between unsigned and signed arithmetic for the numeric data type of PRODAMP by calling a standard procedure.
In the signed interpretation of 32-bit data, the leading bit has a value of -231; in the unsigned interpretation, its value is 231.
A PRODAMP main routine initially runs with signed arithmetic enabled (UNSIGNED_OFF, the default setting for PRODAMP). Unsigned arithmetic must be enabled with the procedure UNSIGNED_ON and can be disabled again with UNSIGNED_OFF.
On calling a subroutine, this arithmetic execution mode (i.e. signed or unsigned) is inherited by the subroutine. Changing the mode in the called routine has no effect on the arithmetic execution mode in the calling routine.
The arithmetic execution mode only affects calculations with the arithmetic data type of length 4 (32-bit data). The addressing of data objects is not affected.
Signed arithmetic (UNSIGNED_OFF)
Calculations with signed arithmetic are performed as usual in PRODAMP. If errors occur (overflow on addition, subtraction and multiplication; division by zero), the PRODAMP run is aborted with a runtime error.
Unsigned arithmetic (UNSIGNED_ON)
Overflows on addition, subtraction and multiplication are ignored (the result is “modulo 232”, which is correct) and, in particular, do not result in a runtime error.
In the case of a division by zero, the PRODAMP run is aborted with a runtime error.Comparisons in unsigned arithmetic are performed as binary “logical comparisons”.
In the standard functions “DEC_BINARY - Convert decimal number” and “DEC_STRING - Convert numeric values”, the switch to signed arithmetic with UNSIGNED_ON is ignored.
Procedure call
Operation | Operand |
UNSIGNED_ON | |
UNSIGNED_OFF |
WRITE
Write to EDT area
The standard procedure WRITE causes a text to be written to an EDT area (namely area 8, unless otherwise specified). This makes it possible, for example, to generate a table of system values in the EDT area and then evaluate this table in EDT.
The EDT output area can be modified at any time with the aid of WRITE (“@PROC nn”).
Strings which begin with the character “@” are interpreted as EDT statements. “@WRITE ''filename''” can thus be used to save the contents of the EDT area to a file.
However, only EDT statements accepted in EDT F mode are accepted in the WRITE procedure. Other statements can only be issued by way of an EDT procedure file.
PRODAMP simulates the EDT statements @PROC and @END, albeit with the following restrictions:
Only procedure files 1 to 9 can be used.
If the system recognizes the number of a valid procedure file, no further syntax checking is carried out. Any further command entry is ignored.
The @END command must not be abbreviated.
It is not possible to chain @PROC or @END together with other EDT commands.
If old PRODAMP procedures which still use L mode EDT commands are recompiled under DAMP V4.7, they will no longer run.
The standard procedure WRITE may modify the current line number set internally by EDT. If it is followed by a READ procedure, the resultant line contents will be other than expected. For this reason, alternate use of WRITE and READ should be avoided.
Procedure call
Operation | Operands |
WRITE | (text) |
Operands
text | Specifies the string expression to be written to the EDT area. |