Skip to content

71B DisableEscape

In progress   MON 71B (57 decimal) · Mnemonic DESCF · Group: Input and Output Monitor Calls (manual section 2.5)

Available from: All programs (manual compatibility box)

Emulation source: src/handlers/mon_71B_DisableEscape.c

Description

The ESCAPE key on the terminal normally terminates a program. This is called user break. This monitor call disables the escape function.

Notes

  • The escape function is enabled again by EnableEscape.
  • The escape function is enabled when you log out.
  • When escape function is disabled, the escape character is treated as any other character.

Parameters

Name Type Direction Description
DeviceNumber INTEGER In The terminal's logical device number. This parameter is ignored for background programs. Your own terminal is always selected.

Direction: In = the program supplies the value, Out = the call returns it, In/Out = both.

See also

EnableEscape, SetEscapeHandling, @DISABLE-ESCAPE-FUNCTION

Compatibility

Machines Users Programs
ND-100 and ND-500 All users All programs

The manual's compatibility box for this call, word for word.

Yes/no fields from the YAML extraction (not in the manual's words):

ND-100 ND-500 User programs RT programs System programs
Yes Yes Yes Yes No

Examples

From the manual (OCR text, not corrected).

INTEGER : DeviceNumber
...
Monitor_Call('DisableEscape', DeviceNumber)
INTEGER DeviceNumber
...
Monitor_Call('DisableEscape', DeviceNumber)
IF (ErrCode .NE. 0) THEN ...
DeviceNumber : INTEGER2;
...
EscapeDisable(DeviceNumber); [Note routine name.]
IF ErrCode <> 0 THEN ...
01 DeviceNumber COMP.
01 ErrCode COMP.
...
MONITOR-CALL "DisableEscape" USING DeviceNumber.
CALL "CbError" USING ErrCode.
IF ErrCode NOT = 0 GO ...
DeviceNumber : W BLOCK 1
DisableEscape : EQU 37B9 + 71B
...
CALLG DisableEscape, 1, DeviceNumber
LDT DEVNO      %Logical device number.
MON 71         %Monitor call DisableEscape.
...
DEVNO, ...

ndmonlib implementation

In progress Registered MON_STATUS_IN_PROGRESS: partly implemented. The dispatcher calls the handler.

Handler mon_71B_DisableEscape
Code lines 12 (non-blank, non-comment lines in the file)

Notes from the handler source

src/handlers/mon_71B_DisableEscape.c line 17

DeviceNumber is ignored for background programs; own terminal is selected.
Device 1 == "own terminal".

src/handlers/mon_71B_DisableEscape.c line 23

Disable the ESCAPE (user-break) key on that terminal. Sets the terminal
datafield's 5IESC (inhibit-escape) bit - real per-device state, so a later
ESCAPE will not user-break until 72B EESCF re-enables it.

Emulation research

Source

This section comes from the emulation: block of the call's YAML file in the NDInsight repo. It records what was learned while implementing the call in nd500x; its status is nd500x's, not ndmonlib's.

Status (nd500x) implemented
nd500x handler nd500x/src/libmon/handlers/mon_71B_DisableEscape.c
Last updated 2026-07-17

Health note

71B DESCF IS FINE. It is backed by real per-device state, not a no-op, and its effect is observable in the 1B input path. Recorded explicitly because it sat under suspicion during the linker investigation and was cleared.

Parameter notes

1. DeviceNumber

Field Value
Note Read as a 32-bit word. Device 0 is NORMALISED TO 1 ("own terminal") - note this is the OPPOSITE of 1B InByte, where device 0 means the command buffer. The manual's own rule is that a background program always uses its own terminal and the device number selects the terminal only for RT programs.
Verified No

Return contract

  • Success: K flag cleared.
  • Errors

Verified

1. 71B/72B drive REAL per-device state, inherited from the SINTRAN terminal input datafield structure 5TTIFIELD: TerminalState gains escape_inhibited (DFLAG.5IESC, default = escape ENABLED), escape_set, and escape_char (VESCAPE, default 033B / 0x1B).

Field Value
Evidence Commit 68e290d, nd500x/src/libmon/mon_terminal_state.h - accessors mon_set/get_escape_enabled, mon_set/get_escape_char, mon_is_escape_break.

2. THE STATE IS ACTUALLY CONSUMED, which is what makes this more than a no-op: with escape DISABLED the escape character passes through 1B InByte as ORDINARY INPUT DATA; with escape ENABLED the same byte is treated as a USER BREAK (console->user_break() is invoked and the call returns error 3 / 003B).

Field Value
Evidence nd500x/src/libmon/handlers/mon_1B_InByte.c - mon_is_escape_break(device_no, byte) gate. Commit 68e290d.

3. THE DISPATCH PATH, byte-verified: MON 71B -> ENT14(072167B) -> GOTAB[71B] = MFELL(072114B) -> CALLP(032201B) -> MCTAB[71B] = MCDES, i.e. MCTAB[71B] = 005711B = MCDES = 047020B, in segment 003-S3CP.

Field Value
Evidence dd if=044-S3IDPIT.bin bs=1 skip=1938 count=2 -> 4e 10. Carve NDInsight/tools/sintran-segment-carver/versions/L-VSX-500/re/mon-analysis/71B-DisableEscape/README.md (CORRECTED 2026-07-15).

Unverified

  • THE WORKER BODY IS NOT RECOVERABLE FROM THE CARVED BYTES, and the carve says so: GOTAB[71B] = 121417B (byte-proven) points at the F1643 entry stub in overlay 025-S3IRPIT, but in this real SINTRAN L image THE 3-WORD F1643 STUB IS ALL ZERO (runtime-populated pointer cells, bounded by NOWTS = 121422B), so the onward transfer to the actual disable-escape routine is NOT byte-followable from a static decode. The named ND-100 worker is not isolated in any carved segment (the DESCF symbol resolves only to the ND-500 side) - the worker body is attached BY NAME ONLY. So nd500x's escape model is built on the MANUAL plus the 5TTIFIELD datafield structure, NOT on a carved worker.
  • Device 0 -> 1 normalisation is a CHOICE the handler makes; no manual text or carve proves that real DESCF treats device 0 as "own terminal".
  • nd500x's DESCF NEVER FAILS - it validates nothing, not even that the device is a terminal. Real DESCF's error returns (e.g. for a non-terminal device, or an RT privilege violation) are unknown. Do not guess a code.
  • The manual's "The escape function is enabled when you log out" (see 72B) is not modelled - there is no logout event in the emulator.
  • NO OBSERVED CALLER with a checked expectation. The 1B handler's comment names the linker as a plausible DESCF caller ("If escape is DISABLED, e.g. the linker called 71B DESCF"), but no trace in the evidence reviewed here records the linker actually issuing 71B. Treat that as INFERENCE.
  • Both 71B and 72B still carry a stale "TODO: Implement" comment in their handler headers despite being implemented in commit 68e290d, and are registered MON_STATUS_IN_PROGRESS. The behaviour is real; the labels lag.

Sources

Doc Note
SINTRAN III Monitor Calls (ND-860228.2 EN) The manual body of this YAML.
NDInsight/tools/sintran-segment-carver/versions/L-VSX-500/re/mon-analysis/71B-DisableEscape/README.md Dispatch carve (MCTAB[71B] = MCDES) and the honest "worker body not recoverable" caveat.

Source

SINTRAN III Monitor Calls (ND-860228.2 EN).