kpmy 6 年之前
父节点
当前提交
50e4c5ec15

+ 2 - 2
personal/wirth/Lola/Sources/LSC.Mod.txt

@@ -343,7 +343,7 @@ MODULE LSC;  (*Lola System Compiler, NW 8.1.95 / 27.8.2018 for RISC (LSCX)*)
   BEGIN
   BEGIN
     IF sym = LSS.ident THEN
     IF sym = LSS.ident THEN
       obj := NewObj(LSB.const); LSS.Get(sym);
       obj := NewObj(LSB.const); LSS.Get(sym);
-      IF (sym = LSS.becomes) OR (sym = LSS.eql) THEN LSS.Get(sym) ELSE LSS.Mark(":= ?") END ;
+      IF sym = LSS.eql THEN LSS.Get(sym) ELSE LSS.Mark(":= ?") END ;
       expression(obj.b); obj.type := LSB.integer;
       expression(obj.b); obj.type := LSB.integer;
       IF sym = LSS.semicolon THEN LSS.Get(sym) ELSE LSS.Mark("semicolon ?") END
       IF sym = LSS.semicolon THEN LSS.Get(sym) ELSE LSS.Mark("semicolon ?") END
     ELSE LSS.Mark("ident ?")
     ELSE LSS.Mark("ident ?")
@@ -376,7 +376,7 @@ MODULE LSC;  (*Lola System Compiler, NW 8.1.95 / 27.8.2018 for RISC (LSCX)*)
   BEGIN
   BEGIN
     IF sym = LSS.ident THEN
     IF sym = LSS.ident THEN
       obj := NewObj(LSB.typ); LSS.Get(sym);
       obj := NewObj(LSB.typ); LSS.Get(sym);
-      IF (sym = LSS.becomes) OR (sym = LSS.eql) THEN LSS.Get(sym) ELSE LSS.Mark(":= ?") END ;
+      IF sym = LSS.eql THEN LSS.Get(sym) ELSE LSS.Mark(":= ?") END ;
       IF sym = LSS.module THEN
       IF sym = LSS.module THEN
         LSS.Get(sym); NEW(utyp); Unit(utyp.firstobj); obj.type := utyp; obj.type.typobj := obj
         LSS.Get(sym); NEW(utyp); Unit(utyp.firstobj); obj.type := utyp; obj.type.typobj := obj
       ELSE Type0(obj.type)
       ELSE Type0(obj.type)

+ 63 - 1
personal/wirth/Lola/Sources/MouseP.Lola.txt

@@ -3,7 +3,7 @@ MODULE MouseP (   (*NW 7.9.2015*)
   INOUT msclk, msdat: BIT;
   INOUT msclk, msdat: BIT;
   OUT out: [28] BIT);
   OUT out: [28] BIT);
   (* init mouse cmd F4 (start reporting) with start, parity and stop bits added *)
   (* init mouse cmd F4 (start reporting) with start, parity and stop bits added *)
-  CONST InitBuf := 0FFFFFDE8H;  (* 1...1 1 0 1111 0100 0 *)
+  CONST InitBuf = 0FFFFFDE8H;  (* 1...1 1 0 1111 0100 0 *)
   REG (clk) x, y: [10] BIT;   (*counters*)
   REG (clk) x, y: [10] BIT;   (*counters*)
     btns: [3] BIT;
     btns: [3] BIT;
     Q0, Q1, run: BIT;
     Q0, Q1, run: BIT;
@@ -29,3 +29,65 @@ BEGIN TS(msclk, msclk0, 0'1, rst);
   y := ~rst -> 0'10 : endbit -> y + dy : y;
   y := ~rst -> 0'10 : endbit -> y + dy : y;
   btns := ~rst -> 0'3 : endbit -> {shreg.1, shreg.3, shreg.2} : btns
   btns := ~rst -> 0'3 : endbit -> {shreg.1, shreg.3, shreg.2} : btns
 END MouseP.
 END MouseP.
+
+MODULE MouseP (
+  IN clk, rst, msdat: BIT;
+  INOUT msclk: BIT;
+  OUT out: [28] BIT);
+
+  CONST InitBuf := 0; (*0FFFFFBE8H;  hex*)
+  TYPE IOBUF = MODULE (IN I: BIT; OUT O: BIT; INOUT IO: BIT; IN T: BIT) ^;
+  REG x, y: [10] BIT;   (*counters*)
+    btns: [3] BIT;
+    Q0, Q1, run: BIT;
+    shreg: [32] BIT;
+    iobuf: IOBUF;
+  VAR shift, endbit, reply, q: BIT;
+    dx, dy: [10] BIT;
+BEGIN iobuf (0, q msclk, rst);
+  shift := Q1 & ~Q0;   (*falling edge detector*)
+  reply := ~run & ~shreg.11;   (*start bit of echoed initBuf, if response*)
+  endbit := run & ~shreg.0;   (*normal packet received*)
+  dx := {shreg.5 !2, shreg.7 -> 0'8 : shreg[19:12]};   (*sign + ovfl*)
+  dy := {shreg.6 !2, shreg.8 -> 0'8 : shreg[30:23]};   (*sign + ovfl*)
+  out := {run, btns, 0'2, y, 0'2, x};
+
+  run := rst & (reply | run);
+  Q0 := q; Q1 := Q0;
+  shreg := ~rst -> InitBuf : (endbit | reply) -> 0FFFFFFFFH'32: shift -> {msdat, shreg[31:1]} : shreg;
+  x := ~rst -> 0'10 : endbit -> x + dx : x;
+  y := ~rst -> 0'10 : endbit -> y + dy : y;
+  btns := ~rst -> 0'3 : endbit -> {shreg.1, shreg.3, shreg.2} : btns
+END MouseP.
+
+MODULE MouseP (
+  IN clk, rst: BIT;
+  INOUT io: [2] BIT;
+  OUT out: [28] BIT);
+
+  (* init mouse cmd F4 (start reporting) with start, parity and stop bits added *)
+  CONST InitBuf := 0FFFFFDE8H;  (* 1...1 1 0 1111 0100 0 *)
+  TYPE PS2BUF = MODULE (OUT O: [2] BIT; INOUT IO: [2] BIT; IN T: [2] BIT) ^;
+  REG x, y: [10] BIT;   (*counters*)
+    btns: [3] BIT;
+    Q0, Q1, run: BIT;
+    shreg: [32] BIT;
+  VAR shift, endbit, reply: BIT;
+    dx, dy: [10] BIT;
+    in: [2] BIT;
+    ps2buf: PS2BUF;
+BEGIN ps2buf(in, io, {run | shreg[0], rst});  (*open-collector wiring*)
+  shift := Q1 & ~Q0;   (*falling edge detector*)
+  reply := ~run & ~shreg.11;   (*start bit of echoed initBuf, if response*)
+  endbit := run & ~shreg.0;   (*normal packet received*)
+  dx := {shreg.5 !2, shreg.7 -> 0'8 : shreg[19:12]};   (*sign + ovfl*)
+  dy := {shreg.6 !2, shreg.8 -> 0'8 : shreg[30:23]};   (*sign + ovfl*)
+  out := {run, btns, 0'2, y, 0'2, x};
+
+  run := rst & (reply | run);
+  Q0 := in[0]; Q1 := Q0;
+  shreg := ~rst -> InitBuf : (endbit | reply) -> 0FFFFFFFFH'32: shift -> {in[1], shreg[31:1]} : shreg;
+  x := ~rst -> 0'10 : endbit -> x + dx : x;
+  y := ~rst -> 0'10 : endbit -> y + dy : y;
+  btns := ~rst -> 0'3 : endbit -> {shreg.1, shreg.3, shreg.2} : btns
+END MouseP.

+ 8 - 8
personal/wirth/Lola/Sources/RISC5.Lola.txt

@@ -7,32 +7,32 @@ MODULE RISC5(   (*NW 14.8.2018; with floating-point and interrupts*)
   
   
   CONST StartAdr = 3FF800H'22;
   CONST StartAdr = 3FF800H'22;
 
 
-  TYPE Registers := MODULE (IN clk, wr: BIT;
+  TYPE Registers = MODULE (IN clk, wr: BIT;
       IN rno0, rno1, rno2: [4] BIT;
       IN rno0, rno1, rno2: [4] BIT;
       IN din: WORD;
       IN din: WORD;
       OUT dout0, dout1, dout2: WORD) ^;
       OUT dout0, dout1, dout2: WORD) ^;
 
 
-    Multiplier := MODULE (IN clk, run, u: BIT;
+    Multiplier = MODULE (IN clk, run, u: BIT;
       OUT stall: BIT;
       OUT stall: BIT;
       IN x, y: WORD;
       IN x, y: WORD;
       OUT z: [64] BIT) ^;
       OUT z: [64] BIT) ^;
 
 
-    Divider := MODULE (IN clk, run, u: BIT;
+    Divider = MODULE (IN clk, run, u: BIT;
       OUT stall: BIT;
       OUT stall: BIT;
       IN x, y: WORD;
       IN x, y: WORD;
       OUT quot, rem: WORD) ^;
       OUT quot, rem: WORD) ^;
 
 
-    LeftShifter := MODULE (IN x: WORD; sc: [5] BIT; OUT y: WORD) ^;
+    LeftShifter = MODULE (IN x: WORD; sc: [5] BIT; OUT y: WORD) ^;
 
 
-    RightShifter := MODULE (IN x: WORD; sc: [5] BIT; md: BIT; OUT y: WORD) ^;
+    RightShifter = MODULE (IN x: WORD; sc: [5] BIT; md: BIT; OUT y: WORD) ^;
 
 
-    FPAdder := MODULE (IN clk, run, u, v: BIT; OUT stall: BIT;
+    FPAdder = MODULE (IN clk, run, u, v: BIT; OUT stall: BIT;
       IN x, y: WORD; OUT z: WORD) ^;
       IN x, y: WORD; OUT z: WORD) ^;
 
 
-    FPMultiplier := MODULE (IN clk, run: BIT; OUT  stall: BIT;
+    FPMultiplier = MODULE (IN clk, run: BIT; OUT  stall: BIT;
       IN x, y: WORD; OUT z: WORD) ^;
       IN x, y: WORD; OUT z: WORD) ^;
 
 
-    FPDivider := MODULE (IN clk, run: BIT; OUT stall: BIT;
+    FPDivider = MODULE (IN clk, run: BIT; OUT stall: BIT;
       IN x, y: WORD; OUT z: WORD) ^;
       IN x, y: WORD; OUT z: WORD) ^;
 
 
   REG (clk) PC: [22] BIT;  (*program counter*)
   REG (clk) PC: [22] BIT;  (*program counter*)

+ 7 - 7
personal/wirth/Lola/Sources/RISC5Top.Lola.txt

@@ -30,37 +30,37 @@ MODULE RISC5Top(   (*NW 25.7.2018*)
   8  general-purpose I/O data
   8  general-purpose I/O data
   9  general-purpose I/O tri-state control *)
   9  general-purpose I/O tri-state control *)
 
 
-TYPE RISC5 := MODULE (
+TYPE RISC5 = MODULE (
     IN clk, rst, irq, stallX: BIT;
     IN clk, rst, irq, stallX: BIT;
       inbus, codebus: WORD;
       inbus, codebus: WORD;
     OUT adr: [24] BIT;
     OUT adr: [24] BIT;
       rd, wr, ben: BIT;
       rd, wr, ben: BIT;
       outbus: WORD) ^;
       outbus: WORD) ^;
 
 
-  PROM := MODULE (IN clk: BIT;
+  PROM = MODULE (IN clk: BIT;
       IN adr: [9] BIT;
       IN adr: [9] BIT;
       OUT data: WORD) ^;
       OUT data: WORD) ^;
 
 
-  RS232R := MODULE (
+  RS232R = MODULE (
     IN clk, rst, done, RxD, fsel: BIT;
     IN clk, rst, done, RxD, fsel: BIT;
     OUT rdy: BIT; data: BYTE) ^;
     OUT rdy: BIT; data: BYTE) ^;
 
 
-  RS232T := MODULE (
+  RS232T = MODULE (
     IN clk, rst, start, fsel: BIT; data: BYTE;
     IN clk, rst, start, fsel: BIT; data: BYTE;
     OUT rdy, TxD: BIT) ^;
     OUT rdy, TxD: BIT) ^;
 
 
-  SPI := MODULE (
+  SPI = MODULE (
     IN clk, rst, start, fast: BIT; dataTx: WORD;
     IN clk, rst, start, fast: BIT; dataTx: WORD;
     OUT dataRx: WORD; rdy: BIT;
     OUT dataRx: WORD; rdy: BIT;
     IN MISO: BIT; 
     IN MISO: BIT; 
     OUT MOSI, SCLK: BIT)  ^;
     OUT MOSI, SCLK: BIT)  ^;
 
 
-  VID := MODULE (
+  VID = MODULE (
     IN clk, inv: BIT; viddata: WORD;
     IN clk, inv: BIT; viddata: WORD;
     OUT req: BIT; vidadr: [18] BIT;
     OUT req: BIT; vidadr: [18] BIT;
       hsync, vsync: BIT; RGB: [3] BIT) ^;
       hsync, vsync: BIT; RGB: [3] BIT) ^;
 
 
-  MouseP := MODULE ( 
+  MouseP = MODULE ( 
     IN clk, rst: BIT;
     IN clk, rst: BIT;
     INOUT msclk, msdat: BIT;
     INOUT msclk, msdat: BIT;
     OUT out: [28] BIT) ^;
     OUT out: [28] BIT) ^;

+ 36 - 1
personal/wirth/Lola/Sources/VID.Lola.txt

@@ -6,7 +6,7 @@ MODULE VID (
     hsync, vsync: BIT;  (*to display*)
     hsync, vsync: BIT;  (*to display*)
     RGB: [3] BIT);
     RGB: [3] BIT);
 
 
-  CONST Org := 37FC0H; (* DFF00: adr of vcnt=1023 *)
+  CONST Org = 37FC0H; (* DFF00: adr of vcnt=1023 *)
   TYPE DCMX3 = MODULE (IN CLKIN: BIT; OUT CLKFX: BIT) ^;
   TYPE DCMX3 = MODULE (IN CLKIN: BIT; OUT CLKFX: BIT) ^;
   VAR hend, vend, vblank, xfer, vid, pclk: BIT;
   VAR hend, vend, vblank, xfer, vid, pclk: BIT;
     dcmx3: DCMX3;
     dcmx3: DCMX3;
@@ -36,3 +36,38 @@ BEGIN dcmx3 (clk, pclk);  (* pixel clock generation *)
   req := req1; req1 := ~vblank & ~hcnt.10 & (hcnt.5 ^ hword.0);
   req := req1; req1 := ~vblank & ~hcnt.10 & (hcnt.5 ^ hword.0);
   vidbuf := req -> viddata : vidbuf
   vidbuf := req -> viddata : vidbuf
 END VID.
 END VID.
+
+MODULE VID (
+  IN clk, inv: BIT;
+    viddata: WORD;
+  OUT  req: BIT;   (*SRAM read request*)
+    vidadr: [18] BIT;
+    hsync, vsync: BIT;
+    RGB: [3] BIT);
+
+  CONST Org := 0DFF00H;
+  REG (clk) hcnt, vcnt: [10] BIT;
+    buffer: WORD;  (*from hcnt, but latched in the clk domain*)
+    hblank1: BIT;
+  VAR hend, vend, hblank, vblank, pixel, vid: BIT;
+    
+BEGIN (*25MHz clock; 2 pixels per cycle*)
+  hend := (hcnt = 591);
+  vend := (vcnt = 791);
+  hblank := hcnt.9;  (*hcnt = 512*)
+  vblank := vcnt.8 & vcnt.9;  (*vcnt >= 768*)
+  hsync := (hcnt >= 537) & (hcnt < 553);
+  vsync := ~((vcnt >= 772) & (vcnt < 776));
+
+  vidadr := {0'3, ~vcnt, hcnt[8:4]} + 37FC0H'18;
+  req := ~vblank & ~hcnt.9 & (hcnt[3:0] = 0'4);
+  pixel := clk -> buffer.0 : buffer.1;
+  vid := (pixel ^ inv) & ~hblank1 & ~vblank;
+  RGB := {vid, vid, vid};
+
+  hcnt := hend -> 0 : hcnt+1;
+  vcnt := hend -> (vend -> 0 : vcnt+1) : vcnt;
+  hblank1 := hblank;
+  buffer := req -> viddata : {0'2, buffer[31:2]}
+END VID.
+

+ 3 - 3
personal/wirth/ProjectOberon/Sources/Modules.Mod.txt

@@ -1,4 +1,4 @@
-MODULE Modules;  (*Link and load on RISC; NW 20.10.2013 / 9.4.2016*)
+MODULE Modules;  (*Link and load on RISC; NW 20.10.2013 / 8.1.2019*)
   IMPORT SYSTEM, Files;
   IMPORT SYSTEM, Files;
   CONST versionkey = 1X; MT = 12; DescSize = 80;
   CONST versionkey = 1X; MT = 12; DescSize = 80;
 
 
@@ -56,7 +56,7 @@ MODULE Modules;  (*Link and load on RISC; NW 20.10.2013 / 9.4.2016*)
       name1, impname: ModuleName;
       name1, impname: ModuleName;
       F: Files.File; R: Files.Rider;
       F: Files.File; R: Files.Rider;
       import: ARRAY 16 OF Module;
       import: ARRAY 16 OF Module;
-  BEGIN mod := root; res := 0; nofimps := 0;
+  BEGIN mod := root; error(0, name); nofimps := 0;
     WHILE (mod # NIL) & (name # mod.name) DO mod := mod.next END ;
     WHILE (mod # NIL) & (name # mod.name) DO mod := mod.next END ;
     IF mod = NIL THEN (*load*)
     IF mod = NIL THEN (*load*)
       Check(name);
       Check(name);
@@ -178,7 +178,7 @@ MODULE Modules;  (*Link and load on RISC; NW 20.10.2013 / 9.4.2016*)
           SYSTEM.PUT(adr, inst); adr := adr - disp*4
           SYSTEM.PUT(adr, inst); adr := adr - disp*4
         END ;
         END ;
         body   (*initialize module*)
         body   (*initialize module*)
-      ELSIF res = 3 THEN importing := name;
+      ELSIF res >= 3 THEN importing := name;
         WHILE nofimps > 0 DO DEC(nofimps); DEC(import[nofimps].refcnt) END
         WHILE nofimps > 0 DO DEC(nofimps); DEC(import[nofimps].refcnt) END
       END 
       END 
     END ;
     END ;

+ 7 - 4
personal/wirth/ProjectOberon/Sources/Texts.Mod.txt

@@ -1,4 +1,4 @@
-MODULE Texts; (*JG 21.11.90 / NW 11.7.90 / 24.12.95 / 22.11.10 / 18.11.2014 / 30.11.2018*)
+MODULE Texts; (*JG 21.11.90 / NW 11.7.90 / 24.12.95 / 22.11.10 / 18.11.2014 / 7.1.2019*)
   IMPORT Files, Fonts;
   IMPORT Files, Fonts;
 
 
   CONST (*scanner symbol classes*)
   CONST (*scanner symbol classes*)
@@ -240,7 +240,8 @@ MODULE Texts; (*JG 21.11.90 / NW 11.7.90 / 24.12.95 / 22.11.10 / 18.11.2014 / 30
     END;
     END;
     T.len := T.len + B.len; end := pos + B.len;
     T.len := T.len + B.len; end := pos + B.len;
     B.last := B.header; B.last.next := NIL; B.len := 0;
     B.last := B.header; B.last.next := NIL; B.len := 0;
-    T.changed := TRUE; T.notify(T, insert, pos, end)
+    T.changed := TRUE;
+    IF T.notify # NIL THEN  T.notify(T, insert, pos, end) END
   END Insert;
   END Insert;
 
 
   PROCEDURE Append* (T: Text; B: Buffer);
   PROCEDURE Append* (T: Text; B: Buffer);
@@ -261,7 +262,8 @@ MODULE Texts; (*JG 21.11.90 / NW 11.7.90 / 24.12.95 / 22.11.10 / 18.11.2014 / 30
     B.last.next := NIL; B.len := end - beg;
     B.last.next := NIL; B.len := end - beg;
     per.prev := pbr.prev; pbr.prev.next := per;
     per.prev := pbr.prev; pbr.prev.next := per;
     T.len := T.len - B.len;
     T.len := T.len - B.len;
-    T.changed := TRUE; T.notify(T, delete, beg, end)
+    T.changed := TRUE;
+    IF T.notify # NIL THEN T.notify(T, delete, beg, end) END
   END Delete;
   END Delete;
 
 
   PROCEDURE ChangeLooks* (T: Text; beg, end: LONGINT; sel: SET; fnt: Fonts.Font; col, voff: INTEGER);
   PROCEDURE ChangeLooks* (T: Text; beg, end: LONGINT; sel: SET; fnt: Fonts.Font; col, voff: INTEGER);
@@ -277,7 +279,8 @@ MODULE Texts; (*JG 21.11.90 / NW 11.7.90 / 24.12.95 / 22.11.10 / 18.11.2014 / 30
       IF 2 IN sel THEN p.voff := voff END;
       IF 2 IN sel THEN p.voff := voff END;
       p := p.next
       p := p.next
     UNTIL p = pe;
     UNTIL p = pe;
-    T.changed := TRUE; T.notify(T, replace, beg, end)
+    T.changed := TRUE;
+    IF T.notify # NIL THEN T.notify(T, replace, beg, end) END
   END ChangeLooks;
   END ChangeLooks;
 
 
   PROCEDURE Attributes*(T: Text; pos: LONGINT; VAR fnt: Fonts.Font; VAR col, voff: INTEGER);
   PROCEDURE Attributes*(T: Text; pos: LONGINT; VAR fnt: Fonts.Font; VAR col, voff: INTEGER);

+ 5 - 0
personal/wirth/news.txt

@@ -1,3 +1,8 @@
+20190109 - Syntax change in Lola: Use "=" in (const and type) declarations;
+  use ":=" in statements (like in Oberon)
+  Update LSC.Mod.txt, RISC5.Lola.txt, RISC5a.Lola.txt, RISC5Top.Lola.txt, MouseP.Lola.txt, VID.Lola.txt
+20190108 - Update Texts.Mod.txt (see Insert, Delete, ChangeLooks) and
+  Modules.Mod.txt (Load)
 20181201 - Update Texts.Mod.txt (Read), and ORB.Mod.txt (outType)
 20181201 - Update Texts.Mod.txt (Read), and ORB.Mod.txt (outType)
 20180918 - Update Oberon compiler
 20180918 - Update Oberon compiler
   Compiler now consumes considerably less heap space -- ORS.Mod.txt
   Compiler now consumes considerably less heap space -- ORS.Mod.txt