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).