# Batch 4 -- collecting the rest of the unknowns

28 files, aimed at closing out every item still marked open in
`docs/reverse_engineering.md` (Batch 3 section) before starting on
`codegen.py` in earnest. Same drill: Build each `.mbs` in RoborunPlus, export
as `.hex` with the same base name, save back in this folder.

Device-I/O tests use `_VAR` (for `GetValue`/`SetCommand`) and `_ALIM` (for
`GetConfig`/`SetConfig`) specifically because both are confirmed-safe:
`_VAR` is used extensively in your real `PumpControllerV1.mbs` /
`PumpcontrollerR0-3...mbs` scripts, and `_ALIM` is the exact example the
MicroBasic manual itself uses for `GetConfig`/`SetConfig`. Should build
cleanly against your existing SDC2160 project without needing any other
config specifics.

## Groups

- **`55`** -- unary `+` (`z = +x`), the one gap (`0x0E`) left in the
  `0x09`-`0x1D` opcode block.
- **`56`-`58`** -- `Print` with a variable, multiple mixed string/variable
  arguments, and `Print(ToBool(x))`. Only string-literal `Print` is
  understood so far (from the real corpus).
- **`59`-`62`** -- `GetValue`/`SetCommand`/`GetConfig`/`SetConfig`, the four
  functions that cover essentially all drive I/O.
- **`63`-`66`** -- the four timer functions.
- **`67`-`71`** -- `Abs`, `Atan`, `Cos`, `Sin`, `Sqrt`.
- **`72`-`74`** -- `Dim ... As Boolean`, `True`/`False` literals, and
  `ToBool()` storing into a Boolean variable (rather than just printing it,
  per `58`).
- **`75`-`77`** -- `Do Until`/`Loop`, `Do`/`Loop While`, `Do`/`Loop Until`.
  Batch 3 only confirmed `While` and `Do While`; these three variants are
  the exit-early vs. exit-late, and while vs. until, combinations left.
- **`78`/`79`** -- `Exit While` and `Continue While`.
- **`80`** -- array access with a variable index (`arr[i]`) rather than a
  compile-time constant -- batch 3 only proved the constant-index case.
- **`81`/`82`** -- the still-unresolved real-corpus mystery: `#define FOO
  87` then `setconfig(_ALIM, 1, FOO)`, vs. `setconfig(_ALIM, 1, 87)`
  directly. Batch 3 proved `#define` is a non-issue for plain assignment;
  this checks whether it's specifically the function-call-argument position
  that changes the encoding.
