# DOSBox Staging API

Welcome to the DOSBox REST API. This embedded webserver exposes REST endpoints to access the internal state of the emulated machine and control DOSBox Staging remotely.

For example, api/v1/memory/0/0x100000 downloads a snapshot of the entire lower memory area.

All endpoints access the internal state atomically between steps of the emulated CPU. They will never be executed during natively implemented DOS functions or interrupts — this means the internal data structures are guaranteed to be consistent in any given snapshot.

NOTE: This feature has been primarily tested with `core = normal` running 16-bit real-mode applications at the moment. Your experience with other CPU modes and different memory models may vary.

## GET /api/v1/cpu/state

Read the state of the CPU. Returns the values of all CPU registers.

## GET /api/v1/memory/:offset/:len

## GET /api/v1/memory/:segment/:offset/:len

Read memory from the given address.

The optional segment parameter can be the name of a segment register or a number. All URL parameters accept hex strings if prefixed with `0x`.

By default this outputs the raw binary data; set `Accept: application/json` to request a JSON response with the data encoded in Base64.

## PUT /api/v1/memory/:offset

## PUT /api/v1/memory/:segment/:offset

Write memory to the given address.

Path parameters work the same as for GET.

This accept either raw binary data with `Content-Type: application/octet-stream` or a JSON object with a Base64 encoded field `data` with `Content-Type: application/json`.

The `If-Match` header can be set to Base64 encoded data to perform an atomic compare-and-swap operation. The length of this comparison data can be different from the written data.

Returns 412 (Precondition Failed) if the current data does not match the `If-Match` header.

## POST /api/v1/memory/allocate

Allocate memory.

Request

    {
        "size": size_bytes,
        "area": "conv"|"UMA"|"XMS
        "strategy": "best_fit"|"first_fit"|"last_fit"
    }

Response

    {
        "addr": physical_address
    }

`conv` and `UMA` allocate memory from DOS. `XMS` allocates raw pages and marks them as reserved for EMS and XMS.

`strategy` controls the allocator behavior, the default is `best_fit` which is almost always the best setting. The other options will prefer lower/higer addresses in the selected area.

The XMS allocator only supports `best_fit`.

## POST /api/v1/memory/free

Frees allocated memory at the given address.

Request

    {
        "addr": physical_address,
    }

Returns 400 on invalid addresses.

## GET /api/v1/dos/internals

Retrieve pointers to internal DOS data structures like the DOS swappable area and list of lists.

## GET /api/v1/dosbox/info

Retrieve DOSBox version and relevant paths.