docs: level-1 errors are status-code dispatched; withdraw the unsound failing-address claim

This commit is contained in:
SDD committed 2026-10-16 10:36:27 +03:00
1 parent cca49dc27d
commit 9a2363a68f
1 file changed
+46 -4
+46 -4
View File
@@ -857,11 +857,53 @@ remaining candidates:
**Honest status: level 1 is NOT passing.** Video memory is located, correctly mapped and now
proven to round-trip a walking-bit pattern; the test's remaining requirement is not yet met.
## Error strings come from a STATUS-CODE DISPATCHER, not from addresses (2026-10-16)
Following the level-1 error path in Ghidra corrects a wrong turn I had taken.
The block immediately before the error handlers is a switch on a status code:
```
07fbe0c6: MOVE *A13(0xffe0),A8,0x1 ; A8 = status code set by the test
07fbe0ca: JREQ 0x07fbdfd0 ; code 0 -> (no error)
07fbe0cc: DEC A8 / JREQ 0x07fbce12 ; codes 1..8 -> ROM CHECKSUM handler
07fbe0fc: SUBI -0xff88,A8 / JREQ 0x07fbcf40
07fbe104: SUBI -0xff80,A8 / JREQ 0x07fbcfe0 ; <- VIDEO MEMORY handler
07fbe10c: SUBI -0xff00,A8 / JREQ 0x07fbd02a
...
```
So each error string is selected by a **code**, and the values printed alongside (e.g.
`0x40000C`, `0x4000C0`) are **constants in the message**, not addresses.
**Correction.** My earlier claim that "the video RAM test fails at bit `0x040000C0`" rested on
reading `a11` at the printer breakpoint. `a11` is a stale local, and `0x40000C` turned out to
be a printed constant that also appears in the ROM-checksum path. **That inference was
unsound and is withdrawn.** The video RAM test's failing address is not known.
**Useful landmarks now mapped (Ghidra addresses):**
| what | address |
|---|---|
| the level-1 test routine | `0x07FBCB02`-`0x07FBE21B` |
| status-code dispatcher | `0x07FBE0C6` |
| VIDEO MEMORY error handler | `0x07FBCFE0` (reached only for its one code) |
| ROM CHECKSUM error handler | `0x07FBCE12` |
| hex-format + draw helper | `0x07FBBF96`-`0x07FBC015` |
**Method note, worth keeping.** A register snapshot at a call is not evidence of an argument.
Read the **call site in the ROM** — which is what Ghidra just made easy, and what I should
have done before chasing an address for several rounds. Ghidra and `smart34010` agree
instruction-for-instruction on every range checked, so the two disassemblers cross-validate.
**Next:** find where the test **sets** `*A13(0xffe0)` to the video-memory code — that
assignment is the actual failing comparison, and it is the thing to fix.
---
## Next steps
1. Map video memory across the FULL extent the bank walk reaches (bit 0x200000C0 and
beyond) -- the last bank is currently unmapped.
2. Pin the unit of the reported address (0x0040000C): bank base vs failing offset.
3. Re-run the console check (cap.lua) after each change; it reports the failing address.
1. Find where the test SETS *A13(0xffe0) to the video-memory code -- that assignment
is the failing comparison.
2. Everything else is in place: console capture (cap.lua), video memory located and
mapped, Ghidra project seeded and saved (25 functions).