# DEC Device Status Reports (DECDSR)

> DEC's private status requests: the extended cursor position, the printer, the keyboard, macro space and the like.

- **Sequence:** `CSI ? Ps n`
- **DEC STD 070:** [§5.4.4 Extended Cursor Position Report, p. 5-55](https://archive.org/details/bitsavers_decstandar0VideoSystemsReferenceManualDec91_74264381/page/n309/mode/1up)
- **VT510:** [DSR—Device Status Reports](https://vt100.net/docs/vt510-rm/DSR.html)

With a `?` before the parameter, a [device status report](https://control-codes.page/csi/dsr/index.html.md) asks
one of DEC's own questions. Each has its own answer:

| `Ps` | Asks for | xterm, as a VT420, answers |
| --- | --- | --- |
| `6` | the cursor position, with the page: DECXCPR | `CSI ? Pl ; Pc ; 1 R` |
| `15` | the printer's status | `CSI ? 13 n`, no printer |
| `25` | whether the user-defined keys are locked | `CSI ? 20 n`, unlocked |
| `26` | the keyboard | `CSI ? 27 ; 1 ; 0 ; 0 n`: North American, ready, an LK201 |
| `55` | the locator's status | `CSI ? 53 n`, no locator |
| `56` | the locator's type | `CSI ? 57 ; 0 n`, unknown |
| `62` | the space left for macros: DECMSR | `CSI 0000 * {`, none |
| `63 ; Pid` | a checksum of the macros: DECCKSR | `DCS Pid ! ~ 0000 ST` |
| `75` | the data integrity flag | `CSI ? 70 n`, no errors |
| `85` | the multiple-session configuration | `CSI ? 83 n`, not configured |

These are the answers in xterm's
[`CASE_DSR`](https://github.com/ThomasDickey/xterm-snapshots/blob/xterm-411a/charproc.c#L4599-L4746),
from a default build, which is a VT420
([`DFT_DECID`](https://github.com/ThomasDickey/xterm-snapshots/blob/xterm-411a/ptyx.h#L398-L400)).
Each is gated on a terminal level: the printer, keyboard and user-defined
key reports need a VT220 or later, the locator reports a VT330, and DECMSR,
DECCKSR, data integrity and multiple sessions a VT420. The locator answers
depend on how xterm was built: with `--enable-dec-locator`, which is off by
default, it answers `CSI ? 50 n` (ready) and `CSI ? 57 ; 1 n` (a mouse)
instead. xterm also answers `CSI ? 5 n` with `CSI ? 0 n`, the operating
status in the private form.

**DECXCPR** is the cursor position report with the page number added.
DEC STD 070 makes it a level 3 and 4 function, and counts the line and
column from the margins in origin mode, as [CPR](https://control-codes.page/csi/dsr/index.html.md) does. Its
answer starts `CSI ?`; the VT510 manual's
[DECXCPR](https://vt100.net/docs/vt510-rm/DECXCPR.html) page leaves the `?`
out, but xterm sends it, and esctest2's `test_DECDSR_DECXCPR` expects it.
xterm, with one page, always reports page 1.

**DECMSR** reports the bytes free for macros, divided by 16
([DEC STD 070 §5.12.3, p. 5-185](https://archive.org/details/bitsavers_decstandar0VideoSystemsReferenceManualDec91_74264381/page/n439/mode/1up)).
xterm has no macros and reports none; it writes the number as four
hexadecimal digits, `0000`, where DEC STD 070 defines a plain number.

**DECCKSR** reports a checksum as four hexadecimal digits in a control
string labelled with the `Pid` the request gave
([DEC STD 070 §5.12.2, p. 5-181](https://archive.org/details/bitsavers_decstandar0VideoSystemsReferenceManualDec91_74264381/page/n435/mode/1up)).
The same report answers [DECRQCRA](https://vt100.net/docs/vt510-rm/DECRQCRA.html)'s
checksum of a rectangle. With no macros, xterm reports `0000`.

The VT510 manual describes the others on their own pages:
[printer port](https://vt100.net/docs/vt510-rm/DSR-PP.html),
[user-defined keys](https://vt100.net/docs/vt510-rm/DSR-UDK.html),
[keyboard](https://vt100.net/docs/vt510-rm/DSR-KBD.html),
[macro space](https://vt100.net/docs/vt510-rm/DSR-MSR.html),
[memory checksum](https://vt100.net/docs/vt510-rm/DECCKSR.html) and
[data integrity](https://vt100.net/docs/vt510-rm/DSR-DIR.html).

## Not in libghostty-vt

libghostty-vt answers none of these. Its DSR dispatch in `stream.zig` looks
the request up in a table, `entries` in `device_status.zig`, that has only
the ANSI requests `5` and `6` and two private ones of its own, `?996` (the
color scheme) and `?998` (visibility); any other request, and any with two parameters
such as `?63 ; Pid`, is logged as invalid and dropped. Every case below
that expects an answer is therefore a known difference: xterm, a VT420 by
default, sends it.

## Validation

### DECDSR-1: Extended cursor position

*A known difference: libghostty-vt does not pass this case.*

Input, one step per line:

```text
\e[2;3H
\e[?6n
```

Expected screen:

```text
|_____|
|_____|
|_____|
reply \e[?2;3;1R
```

### DECDSR-2: Counted from the margins in origin mode

*A known difference: libghostty-vt does not pass this case.*

Input, one step per line:

```text
\e[?69h   # allow left and right margins
\e[2;5s   # margins at columns 2 and 5
\e[2;4r   # region is lines 2 to 4
\e[?6h    # origin mode
\e[2;2H   # line 3, column 3 of the screen
\e[?6n
```

Expected screen:

```text
|_____|
|_____|
|_____|
|_____|
cursor 3,3
reply \e[?2;2;1R
```

### DECDSR-3: Operating status, the private way

*A known difference: libghostty-vt does not pass this case.*

Input, one step per line:

```text
\e[?5n
```

Expected screen:

```text
|_____|
reply \e[?0n
```

### DECDSR-4: Printer, user-defined keys and keyboard

*A known difference: libghostty-vt does not pass this case.*

Input, one step per line:

```text
\e[?15n   # printer
\e[?25n   # user-defined keys
\e[?26n   # keyboard
```

Expected screen:

```text
|_____|
reply \e[?13n\e[?20n\e[?27;1;0;0n
```

### DECDSR-5: The locator

*A known difference: libghostty-vt does not pass this case.*

Input, one step per line:

```text
\e[?55n   # status
\e[?56n   # type
```

Expected screen:

```text
|_____|
reply \e[?53n\e[?57;0n
```

### DECDSR-6: Macro space

*A known difference: libghostty-vt does not pass this case.*

Input, one step per line:

```text
\e[?62n
```

Expected screen:

```text
|_____|
reply \e[0000*{
```

### DECDSR-7: Memory checksum

*A known difference: libghostty-vt does not pass this case.*

Input, one step per line:

```text
\e[?63;123n
```

Expected screen:

```text
|_____|
reply \eP123!~0000\e\\
```

### DECDSR-8: Data integrity and multiple sessions

*A known difference: libghostty-vt does not pass this case.*

Input, one step per line:

```text
\e[?75n   # data integrity
\e[?85n   # multiple sessions
```

Expected screen:

```text
|_____|
reply \e[?70n\e[?83n
```

### DECDSR-9: A request it does not know

Input, one step per line:

```text
\e[?99n
```

Expected screen:

```text
|_____|
reply none
```

---

This is the Markdown version of <https://control-codes.page/csi/decdsr/>. On that page every validation case runs live in libghostty-vt, the terminal emulation core of Ghostty, compiled to WebAssembly.

The validation cases are written in the notation described in <https://control-codes.page/notation/index.html.md>.
