Freeze the four-byte interface value ABI in src/common/interfaces.inc, add
the layout and transfer runtime in src/runtime/interfaces.s, and prove the
layout, canonical null, invalid conversion, four-byte copy, slot order,
four-byte result area, and pushed argument order with a new x128 fixture.
Dispatch, method-table emission, and interface lifetime remain
E06-S02/E06-S03/E06-S06.
src/common/interfaces.inc, src/runtime/interfaces.s (new)tests/runtime/interface-test.s (new)scripts/build-interface-test.ps1, scripts/verify-interface-test.ps1 (new)docs/decisions.md (D142), docs/architecture.md (7.2, 7.5, open questions),
docs/memory-map.md (Interface Values)planning/claims/E06-S01.mdbuild/src/common/interfaces.inc fixes IF_OBJECT at +0 and IF_TABLE at +2;
phase 1 of the fixture converts object $1234 with table $5678 and checks
the raw bytes 34 12 78 56 at the destination. All four bytes zero is the
canonical null: phase 2 checks that a null object writes four zeros and
ignores a non-zero table pointer.IF_SLOT_SIZE); phase 4 reads slot 0 as $BEEF and slot 1 as $CAFE from
a data table, and refuses a null value (IF_ERR_NULL) and a zero table
(IF_ERR_TABLE).docs/memory-map.md, and D142: four bytes
with no padding, callers push all four bytes right-to-left, the four-byte
result uses a fixed area. Phase 3 copies values without reading through a
null source pointer; phase 5 moves a value through IF_RESULT ($C6-$C9) and
shows a failed store leaves the previous result intact; phase 6 pushes four
bytes, reads them back at FP+2..FP+5, and confirms the caller discards
exactly IF_VALUE_SIZE bytes.src/runtime/interfaces.s states that every helper may clobber A/X/Y and
returns status in C plus if_error; a four-byte result travels through
IF_RESULT, never A/X. The module asserts at link time that IF_RESULT
follows the print vectors ($C0-$C5) and ends below the for-end values
($D0).if_conv cannot expose an invalid pair: a non-null object with a zero
table writes a zero table half and returns C=1/IF_ERR_TABLE (phase 2).src/common/class.inc (E05-S02) already reserves the descriptor's
interface-directory path, which this ABI reuses unchanged.C:\Program Files\cc65-snapshot-win32\bin, which is not on the default
shell PATH in this session; the verification command added it to PATH.interfaces.inc and interfaces.s, then the fixture. The fixture's
first macro used a as a parameter name, which ca65 rejects because it is
the accumulator keyword; renamed the parameters.CR_RAM0_KERNEL; the frozen constant in
src/common/c128.inc is spelled CR_RAM0_KERNAL. Fixed in the fixture..importzp for if_obj, if_tab, if_dst, and if_src.Stop-Nova128X128 quit handshake timed
out. A manual session read the mailbox and screen, and the committed verify
script then passed unchanged on port 6603, so both were transient
emulator/port issues rather than fixture failures.scripts/verify-interface-test.ps1 (x128, fresh D81);
git diff --check.$246A; mailbox
4E 38 03 A5 00 00 00 00 01 01 01 01 01 01 00 00; screen shows
NOVA128 INTERFACE ABI and INTERFACE OK; all six phase flags are 1.src/common/interfaces.inc, src/runtime/interfaces.s,
tests/runtime/interface-test.s, scripts/build-interface-test.ps1,
scripts/verify-interface-test.ps1, docs/decisions.md,
docs/architecture.md, docs/memory-map.md, this claim.IF_RESULT is a single fixed area, so a caller must copy a
result before evaluating another interface-returning call; the parser/emitter
does not yet enforce that rule because interface expressions are not emitted.
if_slot trusts the compile-time slot index (no runtime slot count), and no
helper validates a destination pointer. Generated new/delete for
interface-typed values and interface method tables are E06-S03/E06-S06.
Physical C128 testing remains P2 validation.Powered by TurnKey Linux.