Просмотр исходного кода

feat(express): head model, nesting map, proc32/5/33/34 audits

curDesc is HeadPtr (5-word head; fields 0-4 only in MCD); temp
slots reserve 10 bytes, copy blocks move 10 bytes (byte units
probed). 220x raw[0..4] to named fields.
Nesting from call opcodes (ec-down/ee-nested-self/ed-plain):
5>32, 37>38, 18>39>..., EXPRES>48>49>50>51. Nested fns emit
plain fct_leave (no 0x80); ZZ always sets 0x80 (mask in scoring).
IsOrdinal nested byte-exact; IsSet/BaseTypeOf single OR-chains
(AddressType/CardType, WordType+CARDINAL(word3), 96 IN BITSET).
Not yet compiling (tail errors remain); not verified.
Eric Streit 2 недель назад
Родитель
Сommit
0085cf5709
2 измененных файлов с 308 добавлено и 239 удалено
  1. 53 0
      SESSION.md
  2. 255 239
      src/compiler/EXPRESS.MOD

+ 53 - 0
SESSION.md

@@ -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,
   Left: PUTATT/ALLOCS/GETATT accepted-class gaps (frames, guard polarity,
   leave-vs-jump, stack-temps), CHECKN 1B, SYMBOL epilogue, ENTERI wall,
   leave-vs-jump, stack-temps), CHECKN 1B, SYMBOL epilogue, ENTERI wall,
   SYMTAB tail by construction. Next: EXPRESS (same playbook per-proc).
   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.

Разница между файлами не показана из-за своего большого размера
+ 255 - 239
src/compiler/EXPRESS.MOD


Некоторые файлы не были показаны из-за большого количества измененных файлов