Explorar el Código

feat(codegen): CODEGEN.MOD compiles on v1.00, 34/37 mnemonic-identical

Stale Scanner.* renames fixed. keywordTable low-byte read decoded
(limit_check+shl1+LXB = [i][0] of 2-byte entries); local 2D-BYTE overlay
(Q1/Q2-proven) at 2 sites, +2mn each, rest of both procs identical.
proc0 trailing absolute-address tables shift consequentially.
Eric Streit hace 4 días
padre
commit
ed962dbc1e
Se han modificado 2 ficheros con 20 adiciones y 6 borrados
  1. 10 0
      SESSION.md
  2. 10 6
      src/compiler/CODEGEN.MOD

+ 10 - 0
SESSION.md

@@ -67,3 +67,13 @@ Next: GENZ80 media hunt; stage-2 pty-driven MCD diff per module.
   `load immediate 128` at call site); CODEGEN.MOD:392 already 2-arg.
 - Padding blocks removed (Allocate/FindIden/NextCh/ScanNext) — were dead
   code polluting the diff; GetSym now byte-compares modulo gap zeros.
+
+## CODEGEN verify checkpoint (2026-10-12)
+- CODEGEN.MOD compiles on v1.00 (2393 bytes): 34/37 mnemonic-identical.
+- Stale renames fixed (codeBuf/EnterMod/ScanErr). keywordTable saga closed:
+  original COMPILER.MOD also Allocate+CARDINAL-stores (proven byte-shape),
+  CODEGEN reads low byte via `limit_check+shl1+LXB` = `compTab[i][0]` shape;
+  v1.00 can't spell that from ADDRESS global, so local 2D-BYTE overlay
+  (Q1/Q2-proven ADDRESS:=pointer assigns) at 2 use sites, +2mn each.
+- proc0 trailing region = embedded absolute-address tables shifted by the
+  +6 growth (every byte -4): consequential, not semantic.

+ 10 - 6
src/compiler/CODEGEN.MOD

@@ -482,7 +482,7 @@ VAR ptr : POINTER TO Record;
 BEGIN 
   IF emitEnabled THEN
     IF pendActive THEN FlushPendingOp END;
-    IF fixupCount >= 16 THEN Scanner.ScannerError(90) END;
+    IF fixupCount >= 16 THEN Scanner.ScanErr(90) END;
     ptr := ADR(fixupQueue[fixupCount]);
     ptr^.word0 := 1;
     ptr^.word1 := value;
@@ -495,7 +495,7 @@ VAR ptr : POINTER TO Record;
 BEGIN 
   IF emitEnabled THEN
     IF pendActive THEN FlushPendingOp END;
-    IF fixupCount >= 16 THEN Scanner.ScannerError(90) END;
+    IF fixupCount >= 16 THEN Scanner.ScanErr(90) END;
     ptr := ADR(fixupQueue[fixupCount]);
     ptr^.word0 := kind;
     ptr^.long1 := value;
@@ -570,7 +570,7 @@ BEGIN
     END; (* 0512 *)
     FlushConstQueue;
     IF (typeKind = 5) OR (subOp = 18) THEN
-      extBase := Scanner.EnterModuleSymbol("DOUBLES", 9567H) * 16;
+      extBase := Scanner.EnterMod("DOUBLES", 9567H) * 16;
     END; (* 0532 *)
     CASE typeKind OF
     | 0: (* 0536 *)
@@ -662,6 +662,7 @@ END EmitExtendedOp;
 
 PROCEDURE EmitStandardOp(stdNo: CARDINAL);
 VAR ptr: RecordPtr;
+    kwTab: POINTER TO ARRAY [0..29] OF ARRAY [0..1] OF BYTE; (* overlay: keywordTable holds heap CARDINALs; [i][0] reads the low byte (proven shape: limit_check+shl1+LXB) *)
 BEGIN 
   IF emitEnabled THEN
     IF (stdNo = 0) AND (fixupCount <> 0) THEN
@@ -678,12 +679,14 @@ BEGIN
       Emit1(OPEXTENDED);
     END; (* 06F7 *)
 (* $T+ *)
-    Emit1( Compiler.keywordTable[stdNo][0] );
+    kwTab := Compiler.keywordTable;
+    Emit1( kwTab^[stdNo][0] );
 (* $T- *)
   END; (* 0701 *)
 END EmitStandardOp;
 
 PROCEDURE EmitMiscOp(subOp, n: CARDINAL);
+VAR kwTab: POINTER TO ARRAY [0..29] OF ARRAY [0..1] OF BYTE; (* same overlay as EmitStandardOp *)
 BEGIN 
   IF emitEnabled THEN
     FlushConstQueue;
@@ -699,7 +702,8 @@ BEGIN
         END; (* 073D *)
       ELSE (* 073F *)
 (* $T+ *)
-        Emit1(Compiler.keywordTable[n+27][0]);
+        kwTab := Compiler.keywordTable;
+        Emit1(kwTab^[n+27][0]);
 (* $T- *)
       END; (* 074B *)
     ELSE (* 074D *)
@@ -843,7 +847,7 @@ END OpenEmitter;
 PROCEDURE InitCodeGenerator;
 BEGIN 
   checkOverflow := (execute = 4);
-  codeWindow  := ADDRESS(Scanner.codeBuffer);
+  codeWindow  := ADDRESS(Scanner.codeBuf);
   windowBase  := 0;
   windowLimit  := 4096;
   nextEmitPos  := 16;