|
|
@@ -188,3 +188,56 @@ Next: GENZ80 media hunt; stage-2 pty-driven MCD diff per module.
|
|
|
Left: PUTATT/ALLOCS/GETATT accepted-class gaps (frames, guard polarity,
|
|
|
leave-vs-jump, stack-temps), CHECKN 1B, SYMBOL epilogue, ENTERI wall,
|
|
|
SYMTAB tail by construction. Next: EXPRESS (same playbook per-proc).
|
|
|
+
|
|
|
+## EXPRESS session 2026-10-08 (ground-truth verdict + compile groundwork)
|
|
|
+- VERDICT (byte-proven): Reversing `express.txt` (module base 15a5) and
|
|
|
+ Reloaded `COMPILE.DIR/EXPRESS.MCD` (base 17fd, 6303B) are DIFFERENT BUILDS
|
|
|
+ of the same source family — NOT the same file. Same proc numbering, same
|
|
|
+ dep table (7 deps incl DOUBLES), 20+ procs byte-identical (e.g. proc32
|
|
|
+ 43/43B), rest differs by small edits. Reloaded = newer (extra error
|
|
|
+ strings " assignment", "this type"; front-proc growth +0x258 before
|
|
|
+ old-proc4). Ground truth stays Reloaded MCDs (matches all verified
|
|
|
+ modules + v1.00 runtime); REV txts are advisory only.
|
|
|
+- Old-unassemble artifacts (do NOT chase): per-file address rebase
|
|
|
+ (EXPRESS REV+0x258=ours; PASS1 REV+0x3F0; STATEMEN +0x0), missed procs
|
|
|
+ (EXPRESS REV lacks 1,2,3,6,10,11,22-31 = walk bug, procs exist+are called),
|
|
|
+ AAAAAA ghosts, `load (ix)` vs `load outer frame`, `65535` vs `-1`,
|
|
|
+ `call_rel N` vs string-print spellings. Same-dialect (old-vs-old) +
|
|
|
+ immediate-normalized fp is the honest comparator.
|
|
|
+- PASS1 dep "skew" was a misread (truncated head): both show 11 deps incl
|
|
|
+ LOADER. PASS1 old-tool output has 66 garbage heads (walk bug on that
|
|
|
+ file); use new-tool disassembly as reference.
|
|
|
+- Committed: EXPRESS.DEF (22 exports + Desc type), PASS1.DEF stub
|
|
|
+ (CondInsert/InsertEntry BOOLEAN), MOD mechanical fixes (Desc->DEF,
|
|
|
+ leak-rule imports, 29x comment markers). New EXPRESS procs (no draft
|
|
|
+ coverage, decompile fresh): 1,2,3,6,10,11,22-31 (tiny predicates:
|
|
|
+ proc25 opt-12 guard, proc26/23/24 kind predicates, proc6/22 cond-copy,
|
|
|
+ proc27 TypeSizeOf callswitch). Genuine Borland helpers, not LONGREAL.
|
|
|
+- Next: per-proc audit in MCD order; first fix IsOrdinal WORD>=0 via
|
|
|
+ INTEGER view (MCD uses SIGNED igreater_or_equal on word5/word6).
|
|
|
+
|
|
|
+## EXPRESS session 2026-10-08 (head model + nesting map + first blood)
|
|
|
+- HEAD MODEL (proven): curDesc (global word2) is HeadPtr (5-word head:
|
|
|
+ typ,mode,value,extra,kind) — 149 MCD accesses all fields 0-4, never 5+.
|
|
|
+ Temp slots reserve 10 bytes; all copy blocks move 10 bytes (units are
|
|
|
+ BYTES: R1/R2/R5/R10 -> 2/4/10/20). `y := x` (R10) = dest,src,20,copyblock.
|
|
|
+ MOVE() is a separate opcode (not copyblock). Full descs (low/high) via
|
|
|
+ full-typed params/locals; global never field-5+. curDesc never stored
|
|
|
+ (link-time init). 220x curDesc^.raw[0..4] -> named fields; 6x raw[5]/[6]
|
|
|
+ flagged FIXME-HEAD (draft misattribution, MCD audit pending).
|
|
|
+- NESTING MAP (proven by call opcodes + fct_leave bit): ec=parent->nested
|
|
|
+ child, ee=nested-self/sibling (call_with_frame), ed=same/up/top-sibling.
|
|
|
+ Nested fns emit plain fct_leave (no 0x80 GP-restore); top-level get 0x80
|
|
|
+ (ZZ programs always 0x80 — mask bit7 in ZZ-vs-MCD scoring!). Map:
|
|
|
+ proc5>32, proc37>38, proc18>39>{40>{41,42},44,45,46,43}, EXPRES>48>49>50>51,
|
|
|
+ ASSIGN>52(ghost?). Rest top-level. IsSet/IsOrdinal callers re-read (no
|
|
|
+ phantom recursion: proc33 self-calls via ed).
|
|
|
+- AUDITED (ZZ-verified shapes): IsOrdinal nested-in-PopExprDesc byte-exact
|
|
|
+ (nested-IF + INTEGER() views for signed ige + RETURN TRUE=load 1);
|
|
|
+ PopExprDesc (isOrd CARDINAL via ORD(), INTEGER() wraps, IntType not Card,
|
|
|
+ mode:=2, ABS(INTEGER()) wrap, EmitStandardOp(0+ORD(neg)), OR-assign);
|
|
|
+ IsSet single-OR + AddressType/CardType pairs (word7/8, +2 rule) + 96 IN
|
|
|
+ BITSET(field); BaseTypeOf single-OR + WordType(word18) + CARDINAL(word3).
|
|
|
+- Probes banked: INTEGER()/CARDINAL() zero-cost, ORD() zero-cost,
|
|
|
+ CARDINAL->INTEGER assign OK, ADDRESS->RecordPtr OK, ABS needs INTEGER,
|
|
|
+ CARDINAL/INTEGER mixed ops incompatible, H5Ptr(cur)^ transfer-deref banned.
|