125 lines
4.3 KiB
Markdown
125 lines
4.3 KiB
Markdown
# PT2 Menu State Machine
|
|
|
|
This is a focused reference for the ROM menu/display selection machinery that drives LCD pages and panel soft-key activity.
|
|
|
|
## Page Dispatch
|
|
|
|
Primary display selector:
|
|
|
|
- `F732` holds the current display/page selector.
|
|
- The high byte of `F732` selects a page wrapper through `493E`.
|
|
- The low byte is used as a page-local substate/selection, commonly through `F733`.
|
|
|
|
Important dispatcher:
|
|
|
|
- `48FA` bridges table/report state into LCD page dispatch.
|
|
- `493E[page]` points at a wrapper.
|
|
- Wrappers pass a local table pointer to `5FD2`.
|
|
|
|
For COPY status:
|
|
|
|
- `F732=H'1903` selects page `0x19`, substate `0x03`, `COPY IN PROGRESS`.
|
|
- `F732=H'1904` selects page `0x19`, substate `0x04`, `COPY COMPLETED`.
|
|
|
|
For OTHERS:
|
|
|
|
- `493E[0x01] -> H'631C`.
|
|
- Local table `H'632E` includes the OTHERS pages.
|
|
|
|
## Local Entry Selection
|
|
|
|
`loc_5FD2` is the local menu chooser.
|
|
|
|
Important RAM:
|
|
|
|
| RAM | Role |
|
|
| --- | --- |
|
|
| `F72C` | visible/selectable entry bitmask |
|
|
| `F72E` | count of visible/selectable entries |
|
|
| `F72F` | cached page high byte |
|
|
| `F733` | selected local entry index |
|
|
| `FB03.7` | no-entry/error/display suppression flag |
|
|
| `FB02` | display/session timer or message timer |
|
|
|
|
Observed algorithm shape:
|
|
|
|
1. If the page changed, clear `F72C/F72E` and cache the new page in `F72F`.
|
|
2. Walk the page-local handler table from the last entry down.
|
|
3. For each handler, read descriptor words immediately before the handler.
|
|
4. Compare the entry state descriptor against `F731`.
|
|
5. If the entry has required selector descriptors, test `E400 + selector*2`.
|
|
6. If requirements pass, set the entry bit in `F72C` and increment `F72E`.
|
|
7. Clamp or reset `F733` so it points at a visible entry.
|
|
8. If no entries are visible, set `FB03.7`, set `FB02=H'14`, clear `F72F`, and return `R4=H'FFFE`.
|
|
|
|
Practical meaning:
|
|
|
|
- A page can exist in ROM but be invisible/inactive until the CCU seeds the right `E400` feature/status selector.
|
|
- Command 6 writes the `E400-E7FF` secondary table, but only on the continuation side of the protocol.
|
|
|
|
## OTHERS / COPY TO SLAVES Gates
|
|
|
|
OTHERS page map:
|
|
|
|
| Local entry | Handler | Visible text | Required secondary selector |
|
|
| --- | --- | --- | --- |
|
|
| 1 | `H'6FF0` | `OTHERS` / `COPY TO SLAVES` | `E400[0x0015] != 0` |
|
|
| 2 | `H'70F6` | `OTHERS` / `CAM ID SET` | `E400[0x0043] != 0` |
|
|
| 3 | `H'7188` | `OTHERS` / `CAM ID IND` | `E400[0x0037] != 0` |
|
|
| 4 | `H'7258` | `OTHERS` / `CAM BARS` | `E400[0x0038] != 0` |
|
|
| 5-6 | `H'7328/H'73D8` | marker/percentage pages | `E400[0x0027] != 0` |
|
|
|
|
COPY TO SLAVES local action gate:
|
|
|
|
- Handler `H'6FF0` watches `F770.2`.
|
|
- If `F770.2` is clear, it only displays the OTHERS/COPY page.
|
|
- If `F770.2` is set and `F791.7` is set, it enters the local copy-start branch.
|
|
- If `F770.2` is set and `F791.7` is clear, it diverts to `SET RCP` / `MASTER`.
|
|
|
|
Root OTHERS soft-key bits:
|
|
|
|
- Root handler `H'6EE4` tests `E000[0x008F]` at `H'E11E`.
|
|
- Bit 11 sets `F711.6`.
|
|
- Bit 12 sets `F711.4`.
|
|
|
|
These look like CCU-provided OTHERS soft-key enable bits. If they are absent, some OTHERS controls can appear inactive even when the page table entry exists.
|
|
|
|
## Button / Lamp Masks
|
|
|
|
Important RAM:
|
|
|
|
| RAM | Role |
|
|
| --- | --- |
|
|
| `F711-F718` | panel output masks used by external panel chips |
|
|
| `F711.4-F711.7` | soft-key/menu-related bits seen around OTHERS/COPY |
|
|
| `F726` | countdown that temporarily preserves some soft-key bits |
|
|
| `F770` | local panel action/change code |
|
|
|
|
Relevant ROM behavior:
|
|
|
|
- Init clears `F711-F717` and sets `F718=H'FF`.
|
|
- `5A7A` clears `F711.4-F711.7` if `F726 == 0`.
|
|
- The FRT timer path decrements `F726`; when it expires, it clears `F713.6` and `F711.4-F711.7`.
|
|
- The OTHERS/COPY branch sets `F711.7` and `F726=H'64` to keep the local key/display state alive briefly.
|
|
|
|
## Bench Implications
|
|
|
|
To make the local COPY path available from the panel, the fake CCU probably needs to:
|
|
|
|
1. Recover to a live `CONNECT: OK` style session.
|
|
2. Seed root OTHERS soft-key bits:
|
|
|
|
```text
|
|
00 01 0F 18 00 4C ; E000[0x008F] bits 11+12
|
|
```
|
|
|
|
3. During a live continuation/report window, seed the COPY page visibility bit:
|
|
|
|
```text
|
|
06 00 15 00 01 48 ; E400[0x0015] nonzero
|
|
```
|
|
|
|
4. Still satisfy the `F791.7` local copy-start gate.
|
|
|
|
The current hardest unknown is step 4: the ROM uses `F791.7` in several places, but the source that sets it has not yet been identified.
|