Pārlūkot izejas kodu

Begin transfer from VOC to Ofront+

Arthur Yefimov 4 gadi atpakaļ
vecāks
revīzija
ab4e79c031
12 mainītis faili ar 162 papildinājumiem un 133 dzēšanām
  1. 20 20
      .gitignore
  2. 2 0
      src/Editor.Mod
  3. 37 35
      src/EditorText.Mod
  4. 27 39
      src/FreeOberon.Mod
  5. 12 10
      src/Graph.Mod
  6. 3 1
      src/Int.Mod
  7. 16 19
      src/OV.Mod
  8. 4 3
      src/SDL2.Mod
  9. 12 1
      src/SDL2.h0
  10. 2 0
      src/Term.Mod
  11. 6 5
      src/Terminal.Mod
  12. 21 0
      src/make.bat

+ 20 - 20
.gitignore

@@ -1,22 +1,22 @@
 (use "git add <file>..." to include in what will be committed)
-FreeOberon
-FreeOberon.exe
-bin/*
-src/Makefile
-src/*.o
-src/*.h
-src/*.c
-src/*.sym
-src/.*.swp
-src/term/*.o
-src/term/.*.swp
-data/bin/voc/C
-data/bin/voc/bin
-data/bin/voc/lib
-data/bin/voc/src/Configuration.Make
-data/bin/voc/src/Configuration.Mod
-data/bin/voc/src/voc.exe
-data/bin/voc/src/voc
+/FreeOberon
+/FreeOberon.exe
+/bin/*
+/src/Makefile
+/src/*.o
+/src/*.h
+/src/*.oh
+/src/*.c
+/src/*.sym
+/src/term/*.o
+/data/bin/voc/C
+/data/bin/voc/bin
+/data/bin/voc/lib
+/data/bin/voc/src/Configuration.Make
+/data/bin/voc/src/Configuration.Mod
+/data/bin/voc/src/voc.exe
+/data/bin/voc/src/voc
+.*.swp
 *.dll
-!data/bin/mingw32/bin/*.dll
-!data/bin/mingw32/libexec/gcc/i686-w64-mingw32/6.2.0/*.dll
+!/data/bin/mingw32/bin/*.dll
+!/data/bin/mingw32/libexec/gcc/i686-w64-mingw32/6.2.0/*.dll

+ 2 - 0
src/Editor.Mod

@@ -44,6 +44,8 @@ CONST
   save* = 2;
 
 TYPE
+  CHAR = SHORTCHAR;
+
   FileDialog* = POINTER TO FileDialogDesc;
   FileDialogDesc* = RECORD(OV.WindowDesc)
     type*: INTEGER; (* open or save *)

+ 37 - 35
src/EditorText.Mod

@@ -22,6 +22,8 @@ CONST
   lineLen = 256;
 
 TYPE
+  CHAR = SHORTCHAR;
+
   String* = ARRAY lineLen OF CHAR;
 
   Line* = POINTER TO LineDesc;
@@ -57,7 +59,7 @@ BEGIN
   NEW(L); InitLine(L); RETURN L
 END NewLine;
 
-PROCEDURE (L: Line) InsertChar*(ch: CHAR; pos: INTEGER);
+PROCEDURE (L: Line) InsertChar*(ch: CHAR; pos: INTEGER), NEW;
 VAR i: INTEGER;
 BEGIN
   IF L.len + 1 < LEN(L.s) THEN (*!FIXME*)
@@ -68,7 +70,7 @@ BEGIN
   END
 END InsertChar;
 
-PROCEDURE (L: Line) Delete(start, count: INTEGER);
+PROCEDURE (L: Line) Delete(start, count: INTEGER), NEW;
 VAR i: INTEGER;
 BEGIN
   IF count > 0 THEN
@@ -99,7 +101,7 @@ BEGIN
   NEW(t); InitText(t); RETURN t
 END NewText;
 
-PROCEDURE (t: Text) RemoveLine(L: Line);
+PROCEDURE (t: Text) RemoveLine(L: Line), NEW;
 BEGIN
   IF L.prev # NIL THEN L.prev.next := L.next END;
   IF L.next # NIL THEN L.next.prev := L.prev END;
@@ -107,7 +109,7 @@ BEGIN
 END RemoveLine;
 
 (* Объединить данную строку со следующей, прицепив её к данной *)
-PROCEDURE (t: Text) Combine2Lines(L: Line);
+PROCEDURE (t: Text) Combine2Lines(L: Line), NEW;
 VAR i: INTEGER;
 BEGIN
   ASSERT(L.next # NIL, 101);
@@ -118,7 +120,7 @@ BEGIN
   t.RemoveLine(L.next)
 END Combine2Lines;
 
-PROCEDURE (t: Text) GetFirstSelLine*(): Line;
+PROCEDURE (t: Text) GetFirstSelLine*(): Line, NEW;
 VAR y: INTEGER; L: Line;
 BEGIN
   y := t.y; L := t.cur;
@@ -127,7 +129,7 @@ BEGIN
   RETURN L
 END GetFirstSelLine;
 
-PROCEDURE (t: Text) SelectAll*;
+PROCEDURE (t: Text) SelectAll*, NEW;
 VAR count: INTEGER; L: Line;
 BEGIN t.selected := TRUE;
   t.selT := 0; t.selL := 0;
@@ -138,7 +140,7 @@ END SelectAll;
 
 (**Returns true if at least one whole line is selected,
    but leading spaces may still be unselected*)
-PROCEDURE (t: Text) WholeLineSelected*(): BOOLEAN;
+PROCEDURE (t: Text) WholeLineSelected*(): BOOLEAN, NEW;
 VAR L: Line;
   i: INTEGER;
   res: BOOLEAN;
@@ -156,7 +158,7 @@ BEGIN res := FALSE;
   END;
 RETURN res END WholeLineSelected;
 
-PROCEDURE (t: Text) RemoveIndent*;
+PROCEDURE (t: Text) RemoveIndent*, NEW;
 VAR L: Line;
   i, y, endY: INTEGER;
 BEGIN
@@ -180,7 +182,7 @@ BEGIN
   END
 END RemoveIndent;
 
-PROCEDURE (t: Text) AddIndent*;
+PROCEDURE (t: Text) AddIndent*, NEW;
 VAR L: Line;
   i, y, endY: INTEGER;
 BEGIN
@@ -200,7 +202,7 @@ BEGIN
   END
 END AddIndent;
 
-PROCEDURE (t: Text) DeleteSelection*;
+PROCEDURE (t: Text) DeleteSelection*, NEW;
 VAR x0, x, y: INTEGER; L0, L: Line;
 BEGIN
   IF t.selected THEN
@@ -225,7 +227,7 @@ BEGIN
   END
 END DeleteSelection;
 
-PROCEDURE (t: Text) HandleBackspace*;
+PROCEDURE (t: Text) HandleBackspace*, NEW;
 BEGIN
   IF t.selected THEN t.DeleteSelection
   ELSIF t.x > 0 THEN
@@ -239,7 +241,7 @@ BEGIN
   END
 END HandleBackspace;
 
-PROCEDURE (t: Text) HandleDelete*;
+PROCEDURE (t: Text) HandleDelete*, NEW;
 BEGIN
   IF t.selected THEN
     t.DeleteSelection;
@@ -251,7 +253,7 @@ BEGIN
   END
 END HandleDelete;
 
-PROCEDURE (t: Text) HandleEnter*(autoIndent: BOOLEAN);
+PROCEDURE (t: Text) HandleEnter*(autoIndent: BOOLEAN), NEW;
 VAR L: Line; i, spaces: INTEGER;
 BEGIN
   L := NewLine(); spaces := 0;
@@ -283,14 +285,14 @@ BEGIN
   t.changed := TRUE
 END HandleEnter;
 
-PROCEDURE (t: Text) InsertChar*(ch: CHAR);
+PROCEDURE (t: Text) InsertChar*(ch: CHAR), NEW;
 BEGIN
   t.cur.InsertChar(ch, t.x);
   INC(t.x);
   t.changed := TRUE
 END InsertChar;
 
-PROCEDURE (t: Text) Insert*(s: ARRAY OF CHAR; autoIndent: BOOLEAN);
+PROCEDURE (t: Text) Insert*(s: ARRAY OF CHAR; autoIndent: BOOLEAN), NEW;
 VAR i: INTEGER;
 BEGIN
   i := 0;
@@ -304,7 +306,7 @@ BEGIN
   END
 END Insert;
 
-PROCEDURE (t: Text) Clear*;
+PROCEDURE (t: Text) Clear*, NEW;
 BEGIN
   t.cur := NewLine(); t.first := t.cur;
   t.last := t.cur; t.scrFirst := t.cur;
@@ -313,7 +315,7 @@ BEGIN
   t.changed := TRUE
 END Clear;
 
-PROCEDURE (t: Text) CopySelection*(VAR buf: ARRAY OF CHAR);
+PROCEDURE (t: Text) CopySelection*(VAR buf: ARRAY OF CHAR), NEW;
 VAR i, x, len, y: INTEGER; L: Line;
 BEGIN
   L := t.GetFirstSelLine();
@@ -338,15 +340,15 @@ BEGIN
   i := 0; s[LEN(s) - 1] := 0X;
   WHILE s[i] # 0X DO
     ch := s[i];
-    IF ORD(ch) < 128 THEN Files.Write(r, ch) (* ASCII *)
+    IF ORD(ch) < 128 THEN Files.WriteChar(r, ch) (* ASCII *)
     ELSIF ORD(ch) = 240 THEN (* Big cyrillic Yo *)
-      Files.Write(r, 0D0X); Files.Write(r, 81X)
+      Files.WriteChar(r, 0D0X); Files.WriteChar(r, 81X)
     ELSIF ORD(ch) < 224 THEN (* Before small cyrillic R *)
-      Files.Write(r, 0D0X);
-      Files.Write(r, CHR(ORD(ch) - 128 + 090H))
+      Files.WriteChar(r, 0D0X);
+      Files.WriteChar(r, CHR(ORD(ch) - 128 + 090H))
     ELSE
-      Files.Write(r, 0D1X);
-      Files.Write(r, CHR(ORD(ch) - 224 + 080H))
+      Files.WriteChar(r, 0D1X);
+      Files.WriteChar(r, CHR(ORD(ch) - 224 + 080H))
     END;
     INC(i)
   END
@@ -354,18 +356,18 @@ END WriteString;
 
 PROCEDURE WriteLn(VAR r: Files.Rider);
 BEGIN
-  IF Config.isWindows THEN Files.Write(r, 0DX) END;
-  Files.Write(r, 0AX)
+  IF Config.isWindows THEN Files.WriteChar(r, 0DX) END;
+  Files.WriteChar(r, 0AX)
 END WriteLn;
 
-PROCEDURE (t: Text) SaveToFile*(fName: ARRAY OF CHAR): BOOLEAN;
+PROCEDURE (t: Text) SaveToFile*(fName: ARRAY OF CHAR): BOOLEAN, NEW;
 VAR f: Files.File; r: Files.Rider;
   success: BOOLEAN;
   fPath: ARRAY 1024 OF CHAR;
   L: Line;
 BEGIN
   success := FALSE;
-  COPY('Programs/', fPath);
+  fPath := 'Programs/';
   Strings.Append(fName, fPath);
   f := Files.New(fPath);
   IF f # NIL THEN (*!FIXME error checking is wrong *)
@@ -393,29 +395,29 @@ PROCEDURE ReadLine(VAR r: Files.Rider; L: Line);
 VAR ch: CHAR; i: INTEGER;
 BEGIN
   i := 0;
-  Files.Read(r, ch);
+  Files.ReadChar(r, ch);
   WHILE ~r.eof & (i < LEN(L.s) - 1) & (ch # 0AX) & (ch # 0DX) DO
     IF ORD(ch) < 128 THEN L.s[i] := ch
     ELSIF ch = 0D0X THEN
-      Files.Read(r, ch);
+      Files.ReadChar(r, ch);
       IF ch = 081X THEN L.s[i] := CHR(240) (* Big Yo *)
       ELSE L.s[i] := CHR(ORD(ch) - 16)
       END
     ELSIF ch = 0D1X THEN
-      Files.Read(r, ch); L.s[i] := CHR(ORD(ch) + 96)
+      Files.ReadChar(r, ch); L.s[i] := CHR(ORD(ch) + 96)
     END;
-    Files.Read(r, ch);
+    Files.ReadChar(r, ch);
     INC(i)
   END;
   L.s[i] := 0X;
   IF ch = 0DX THEN
     L.lineEndLen := 2; (* Assume CRLF (DOS) *)
-    Files.Read(r, ch) (* Skip LF *)
+    Files.ReadChar(r, ch) (* Skip LF *)
   ELSE L.lineEndLen := 1 (* Assume LF (UNIX) *)
   END
 END ReadLine;
 
-PROCEDURE (t: Text) LoadFromFile*(fName: ARRAY OF CHAR): BOOLEAN;
+PROCEDURE (t: Text) LoadFromFile*(fName: ARRAY OF CHAR): BOOLEAN, NEW;
 VAR f: Files.File; r: Files.Rider;
   success: BOOLEAN;
   fPath: ARRAY 1024 OF CHAR;
@@ -423,7 +425,7 @@ VAR f: Files.File; r: Files.Rider;
 BEGIN
   success := FALSE;
   IF fName[0] # 0X THEN
-    COPY('Programs/', fPath);
+    fPath := 'Programs/';
     Strings.Append(fName, fPath);
     f := Files.Old(fPath);
     IF f # NIL THEN
@@ -449,7 +451,7 @@ BEGIN
   RETURN success
 END LoadFromFile; 
 
-PROCEDURE (t: Text) MoveToPos*(pos, winH: INTEGER);
+PROCEDURE (t: Text) MoveToPos*(pos, winH: INTEGER), NEW;
 CONST pad = 3;
 VAR i, centerY: INTEGER; L: Line;
 BEGIN

+ 27 - 39
src/FreeOberon.Mod

@@ -16,7 +16,7 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with Free Oberon.  If not, see <http://www.gnu.org/licenses/>.
 *)
-IMPORT G := Graph, T := Terminal, Files, Modules,
+IMPORT G := Graph, T := Terminal, Files, Args,
        OV, Editor, Term, Config, Strings, Out;
 CONST
   version* = '1.0.4';
@@ -47,6 +47,8 @@ CONST
   tokenComment = 4;
 
 TYPE
+  CHAR = SHORTCHAR;
+
   StrList = POINTER TO StrListDesc;
   StrListDesc = RECORD
     s: ARRAY 256 OF CHAR;
@@ -61,7 +63,6 @@ VAR
   programFinished: BOOLEAN;
   tempWindowed: BOOLEAN; (* True if editor is in windowed mode while program is running *)
   needWindowed: BOOLEAN;
-  blockToggle: BOOLEAN; (* If true, ALT+ENTER will not toggle fullscreen *)
   sysModules: StrList;
 
   app: OV.App;
@@ -198,7 +199,7 @@ BEGIN
   newWin := (e = NIL) OR ~Editor.IsEmpty(e);
   IF newWin THEN e := Editor.NewEditor() END;
   IF e.text.LoadFromFile(filename) THEN
-    e.caption := filename; e.filename := filename;
+    e.caption := filename$; e.filename := filename$;
     IF newWin THEN OV.AddWindow(app, e) END
   END
 END DoOpenFile;
@@ -349,10 +350,7 @@ BEGIN
   ELSE
     CASE key.code OF
       G.kEnter, G.kEnterPad:
-      IF key.mod * G.mAlt # {} THEN
-        IF blockToggle THEN blockToggle := FALSE
-        ELSE T.ToggleFullscreen; blockToggle := TRUE
-        END
+      IF key.mod * G.mAlt # {} THEN T.ToggleFullscreen
       ELSE T.Ln;
         WriteToProcess(inputBuf, inputBufLen);
         inputBufLen := 0; buf[0] := 0AX;
@@ -444,7 +442,7 @@ BEGIN
     ELSE T.PutString(0, T.charsY - 1, 'Could not find cmd.exe', 15, 4, 0)
     END
   ELSE (* Linux *)
-    COPY('data/bin/', cmd); Strings.Append(command, cmd);
+    cmd := 'data/bin/'; Strings.Append(command, cmd);
     Strings.Append('.sh ', cmd)
   END;
   Strings.Append(filename, cmd);
@@ -498,7 +496,7 @@ END Link;
 PROCEDURE ResetSysModules;
   PROCEDURE Add(s: ARRAY OF CHAR);
   VAR p: StrList;
-  BEGIN NEW(p); p.s := s; p.next := sysModules; sysModules := p
+  BEGIN NEW(p); p.s := s$; p.next := sysModules; sysModules := p
   END Add;
 BEGIN sysModules := NIL;
   Add('SYSTEM');  Add('Texts');    Add('Files');  Add('Strings');
@@ -516,7 +514,7 @@ BEGIN
     ok := TRUE; p := modules; graph := FALSE;
     WHILE ok & (p.next # NIL) DO
       IF ModuleExists(p.s) THEN
-        s := p.s; Strings.Append('.Mod', s);
+        s := p.s$; Strings.Append('.Mod', s);
         IF ~Compile(s, FALSE) THEN ok := FALSE END
       ELSIF IsSysModule(p.s) THEN
         IF p.s = 'Graph' THEN graph := TRUE END
@@ -526,7 +524,7 @@ BEGIN
     END;
     IF ok THEN
       IF ModuleExists(p.s) THEN
-        s := p.s; Strings.Append('.Mod', s);
+        s := p.s$; Strings.Append('.Mod', s);
         IF ~Compile(s, TRUE) THEN ok := FALSE END
       END;
       IF ok & ~Link(p.s, graph, modules) THEN ok := FALSE END
@@ -547,7 +545,7 @@ BEGIN
   IF x >= 0 THEN Strings.Delete(prg, 0, x + 1) END;
 
   (* Construct 'bin/MyProg' or 'bin\MyProg' *)
-  IF Config.isWindows THEN COPY('bin\', cmd) ELSE COPY('bin/', cmd) END;
+  IF Config.isWindows THEN cmd := 'bin\' ELSE cmd := 'bin/' END;
   Strings.Append(prg, cmd);
 
   IF ~Term.StartProcess(cmd) THEN
@@ -569,7 +567,7 @@ BEGIN
   IF filename[0] # 0X THEN w := c.app.windows;
     IF (w # NIL) & (w IS Editor.Editor) THEN e := w(Editor.Editor);
       IF e.text.SaveToFile(filename) THEN
-        COPY(filename, e.caption); e.filename := filename
+        e.caption := filename$; filename := e.filename$
       END
     END
   END
@@ -620,24 +618,24 @@ END FileSave;
 
 PROCEDURE SkipComment(VAR R: Files.Rider; VAR ch: CHAR; VAR s: ARRAY OF CHAR);
 VAR last: CHAR;
-BEGIN last := ch; Files.Read(R, ch);
+BEGIN last := ch; Files.ReadChar(R, ch);
   WHILE ~R.eof & ((last # '*') OR (ch # ')')) DO
     IF (last = '(') & (ch = '*') THEN SkipComment(R, ch, s) END;
-    last := ch; Files.Read(R, ch)
+    last := ch; Files.ReadChar(R, ch)
   END;
-  IF ~R.eof THEN Files.Read(R, ch) END;
-  WHILE ~R.eof & (ch <= ' ') DO Files.Read(R, ch) END
+  IF ~R.eof THEN Files.ReadChar(R, ch) END;
+  WHILE ~R.eof & (ch <= ' ') DO Files.ReadChar(R, ch) END
 END SkipComment;
 
 PROCEDURE GetSym(VAR R: Files.Rider; VAR ch: CHAR; VAR s: ARRAY OF CHAR);
 VAR i: INTEGER;
 BEGIN
-  WHILE ~R.eof & (ch <= ' ') DO Files.Read(R, ch) END;
+  WHILE ~R.eof & (ch <= ' ') DO Files.ReadChar(R, ch) END;
   i := 0;
   IF ~R.eof THEN
     IF ch = '(' THEN
-      Files.Read(R, ch);
-      IF ch = '*' THEN Files.Read(R, ch); SkipComment(R, ch, s)
+      Files.ReadChar(R, ch);
+      IF ch = '*' THEN Files.ReadChar(R, ch); SkipComment(R, ch, s)
       ELSE s[i] := ch; INC(i)
       END
     END;
@@ -646,14 +644,14 @@ BEGIN
             (('A' <= CAP(ch)) & (CAP(ch) <= 'Z') OR
              ('0' <= ch) & (ch <= '9')) DO
         IF i < LEN(s) - 1 THEN s[i] := ch; INC(i) END;
-        Files.Read(R, ch)
+        Files.ReadChar(R, ch)
       END
     ELSE
       WHILE ~R.eof & (ch > ' ') &
             ~(('A' <= CAP(ch)) & (CAP(ch) <= 'Z') OR
               ('0' <= ch) & (ch <= '9')) DO
         IF i < LEN(s) - 1 THEN s[i] := ch; INC(i) END;
-        Files.Read(R, ch)
+        Files.ReadChar(R, ch)
       END
     END
   END;
@@ -671,7 +669,7 @@ BEGIN NEW(top); top.next := NIL; p := top;
   s := 'Programs/'; Strings.Append(modname, s); Strings.Append('.Mod', s);
   F := Files.Old(s);
   IF F # NIL THEN
-    Files.Set(R, F, 0); Files.Read(R, ch); GetSym(R, ch, s);
+    Files.Set(R, F, 0); Files.ReadChar(R, ch); GetSym(R, ch, s);
     ok := s = 'MODULE'; GetSym(R, ch, s); GetSym(R, ch, s); (*!FIXME check module name*)
     IF ok THEN
       ok := s = ';'; GetSym(R, ch, s);
@@ -682,7 +680,7 @@ BEGIN NEW(top); top.next := NIL; p := top;
           GetSym(R, ch, s);
           IF s = ':=' THEN GetSym(R, ch, s); mod := s; GetSym(R, ch, s) END;
           IF IsSysModule(mod) OR ModuleExists(mod) THEN
-            NEW(p.next); p := p.next; p.next := NIL; p.s := mod
+            NEW(p.next); p := p.next; p.next := NIL; p.s := mod$
           END;
           IF s = ',' THEN GetSym(R, ch, s) ELSE ok := FALSE END
         END
@@ -691,14 +689,6 @@ BEGIN NEW(top); top.next := NIL; p := top;
   END;
 RETURN top.next END GetImportedModules;
 
-PROCEDURE DebugStrList(p: StrList);
-BEGIN
-  WHILE p # NIL DO
-    Out.Char("'"); Out.String(p.s); Out.Char("'"); Out.Ln;
-    p := p.next
-  END
-END DebugStrList;
-
 PROCEDURE AddUniqueToList(what: StrList; VAR where: StrList);
 VAR p, q, nextP: StrList;
 BEGIN
@@ -727,7 +717,7 @@ BEGIN res := NIL;
     AddUniqueToList(list2, res);
     p := p.next
   END;
-  NEW(p); p.s := modname; p.next := NIL; AddUniqueToList(p, res);
+  NEW(p); p.s := modname$; p.next := NIL; AddUniqueToList(p, res);
 RETURN res END UsedModuleList;
 
 PROCEDURE ImportsGraph(p: StrList): BOOLEAN;
@@ -753,10 +743,9 @@ BEGIN w := c.app.windows;
   IF (w # NIL) & (w IS Editor.Editor) THEN
     IF Editor.TextChanged(w(Editor.Editor)) THEN FileSave(c) END;
     IF w(Editor.Editor).filename[0] # 0X THEN
-      COPY(w(Editor.Editor).filename, primaryFile);
+      primaryFile := w(Editor.Editor).filename$;
       GetModuleName(primaryFile, modname);
       modules := UsedModuleList(modname);
-      (*DebugStrList(modules);*)
       graph := ImportsGraph(modules);
       needWindowed := graph;
       IF CompileAll(modules) THEN
@@ -997,12 +986,12 @@ PROCEDURE ParseArgs(VAR fs, sw: BOOLEAN;
 VAR i, nofnames: INTEGER;
   s: ARRAY 256 OF CHAR;
 BEGIN fs := TRUE; sw := FALSE; i := 0; nofnames := 0;
-  WHILE i # Modules.ArgCount DO
-    Modules.GetArg(i, s);
+  WHILE i # Args.argc DO
+    Args.Get(i, s);
     IF s = '--window' THEN fs := FALSE
     ELSIF s = '--software' THEN sw := TRUE
     ELSIF nofnames < LEN(fnames) THEN
-      COPY(s, fnames[nofnames]); INC(nofnames)
+      fnames[nofnames] := s$; INC(nofnames)
     END;
     INC(i)
   END;
@@ -1018,7 +1007,6 @@ BEGIN
   IF T.Init(fs, sw) THEN
     InitIDE;
     needWindowed := TRUE;
-    blockToggle := FALSE;
     ResetSysModules;
     OpenFiles(fnames);
     success := TRUE

+ 12 - 10
src/Graph.Mod

@@ -191,7 +191,9 @@ CONST
   mGui*   = {mLGui, mRGui};
 
 TYPE
-  SET32 = SYSTEM.SET32;
+  ADRINT = SYSTEM.ADRINT;
+  CHAR = SHORTCHAR;
+  SET32 = SET;
 
   Bitmap* = POINTER TO BitmapDesc;
   BitmapDesc* = RECORD
@@ -311,7 +313,7 @@ TYPE P = POINTER TO ARRAY 10240 OF CHAR;
 VAR p: P;
 BEGIN
   p := SYSTEM.VAL(P, SDL.GetError());
-  COPY(p^, s)
+  s := p^$
 END GetError;
 
 PROCEDURE Settings*(w, h: INTEGER; flags: SET);
@@ -435,19 +437,19 @@ BEGIN
 END UnlockBitmap;
 
 PROCEDURE PutPixelFast*(bmp: Bitmap; x, y, color: INTEGER);
-VAR n: SYSTEM.ADDRESS;
-BEGIN n := SYSTEM.VAL(SYSTEM.ADDRESS, bmp.surface.pixels);
+VAR n: ADRINT;
+BEGIN n := SYSTEM.VAL(ADRINT, bmp.surface.pixels);
   INC(n, (y * bmp.w + x) * 4);
   SYSTEM.PUT(n, color)
 END PutPixelFast;
 
 PROCEDURE PutPixel*(bmp: Bitmap; x, y, color: INTEGER);
-VAR n: SYSTEM.ADDRESS;
+VAR n: ADRINT;
 BEGIN
   IF (x >= 0) & (x < bmp.w) &
      (y >= 0) & (y < bmp.h) THEN
     SDL.LockSurface(bmp.surface);
-    n := SYSTEM.VAL(SYSTEM.ADDRESS, bmp.surface.pixels);
+    n := SYSTEM.VAL(ADRINT, bmp.surface.pixels);
     INC(n, (y * bmp.w + x) * 4);
     SYSTEM.PUT(n, color);
     SDL.UnlockSurface(bmp.surface)
@@ -456,12 +458,12 @@ END PutPixel;
 
 PROCEDURE GetPixel*(bmp: Bitmap; x, y: INTEGER): INTEGER;
 VAR color: INTEGER;
-  n: SYSTEM.ADDRESS;
+  n: ADRINT;
 BEGIN
   IF (x >= 0) & (x < bmp.w) &
      (y >= 0) & (y < bmp.h) THEN
     SDL.LockSurface(bmp.surface);
-    n := SYSTEM.VAL(SYSTEM.ADDRESS, bmp.surface.pixels);
+    n := SYSTEM.VAL(ADRINT, bmp.surface.pixels);
     INC(n, (y * bmp.w + x) * 4);
     SYSTEM.GET(n, color);
     SDL.UnlockSurface(bmp.surface)
@@ -593,7 +595,7 @@ END FloodFill;
 
 (* Bitmap *)
 
-PROCEDURE (bmp: Bitmap) Finalize*;
+PROCEDURE (bmp: Bitmap) Finalize*, NEW;
 BEGIN
 END Finalize;
 
@@ -801,7 +803,7 @@ BEGIN
     QueueEvent;
     events.buf[events.last].type := textInput;
     events.buf[events.last].key.sym := sym; (*!FIXME sym needed?*)
-    COPY(e.text, events.buf[events.last].s)
+    events.buf[events.last].s := e.text$
   END
 END PumpTextEvent;
 

+ 3 - 1
src/Int.Mod

@@ -1,6 +1,8 @@
 MODULE Int;
 IMPORT Strings;
 
+TYPE CHAR = SHORTCHAR;
+
 PROCEDURE Str*(n: INTEGER; VAR s: ARRAY OF CHAR);
 VAR i, j: INTEGER; tmp: CHAR; neg: BOOLEAN;
 BEGIN
@@ -45,7 +47,7 @@ BEGIN
       INC(s); DEC(e)
     END
   END;
-  COPY(b, str)
+  str := b$
 END Val;
 
 PROCEDURE Append*(n: INTEGER; VAR s: ARRAY OF CHAR);

+ 16 - 19
src/OV.Mod

@@ -560,13 +560,15 @@ CONST
   hCtrlAltShiftPause*     = 700H + 72;
 
 TYPE
+  CHAR = SHORTCHAR;
+
   App* = POINTER TO AppDesc;
   Control* = POINTER TO ControlDesc;
   ControlMethod* = POINTER TO ControlMethodDesc;
 
   ClickHandler* = PROCEDURE (c: Control);
   
-  ControlDesc* = RECORD
+  ControlDesc* = EXTENSIBLE RECORD
     app*: App;
     parent*, children*: Control;
     prev*, next*: Control;
@@ -578,7 +580,7 @@ TYPE
     do*: ControlMethod
   END;
 
-  ControlMethodDesc* = RECORD
+  ControlMethodDesc* = EXTENSIBLE RECORD
     added*: PROCEDURE (c, child: Control);
     draw*: PROCEDURE (c: Control; x, y: INTEGER);
     resize*: PROCEDURE (c: Control; x, y, w, h: INTEGER);
@@ -594,7 +596,7 @@ TYPE
   END;
 
   Menu* = POINTER TO MenuDesc;
-  MenuDesc* = RECORD(ControlDesc)
+  MenuDesc* = EXTENSIBLE RECORD(ControlDesc)
     innerW*, innerH*: INTEGER;
     hint*: ARRAY 40 OF CHAR;
     hintW*: INTEGER;
@@ -603,22 +605,22 @@ TYPE
   END;
 
   QuickBtn* = POINTER TO QuickBtnDesc;
-  QuickBtnDesc* = RECORD(MenuDesc) END;
+  QuickBtnDesc* = EXTENSIBLE RECORD(MenuDesc) END;
 
   Button* = POINTER TO ButtonDesc;
-  ButtonDesc* = RECORD(ControlDesc) END;
+  ButtonDesc* = EXTENSIBLE RECORD(ControlDesc) END;
 
   WinBtn* = POINTER TO WinBtnDesc;
-  WinBtnDesc* = RECORD(ButtonDesc) END;
+  WinBtnDesc* = EXTENSIBLE RECORD(ButtonDesc) END;
 
   Edit* = POINTER TO EditDesc;
-  EditDesc* = RECORD(ControlDesc)
+  EditDesc* = EXTENSIBLE RECORD(ControlDesc)
     len*: INTEGER; (* Actual amount of characters before 0X *)
     pos*: INTEGER
   END;
 
   Window* = POINTER TO WindowDesc;
-  WindowDesc* = RECORD(ControlDesc)
+  WindowDesc* = EXTENSIBLE RECORD(ControlDesc)
     cur*: Control;
     modal*: BOOLEAN;
     resizable*: BOOLEAN;
@@ -629,7 +631,7 @@ TYPE
     mx*, my*, mw*, mh*: INTEGER (* To save x, y, w, h when maximized *)
   END;
 
-  AppDesc* = RECORD
+  AppDesc* = EXTENSIBLE RECORD
     windows*: Window;
     menu*: Menu;
     statusbar*: Menu;
@@ -650,8 +652,6 @@ VAR
   menuMethod-: ControlMethod;
   quickBtnMethod-: ControlMethod;
 
-  blockToggle: BOOLEAN; (* If true, ALT+ENTER will not toggle fullscreen *)
-
 PROCEDURE DrawAppWindows*(app: App);
 VAR w, br: Control;
 BEGIN
@@ -892,9 +892,9 @@ END InitControlMethod;
 PROCEDURE InitMenu*(m: Menu; caption, hint: ARRAY OF CHAR;
     hotkey: INTEGER; onClick: ClickHandler);
 BEGIN InitControl(m);
-  m.caption := caption;
+  m.caption := caption$;
   m.innerW := 0; m.innerH := 0;
-  m.hint := hint; m.hintW := 0;
+  m.hint := hint$; m.hintW := 0;
   m.hotkey := hotkey;
   m.lastSelected := NIL;
   m.onClick := onClick;
@@ -1301,7 +1301,7 @@ END InitQuickBtnMethod;
 PROCEDURE InitButton*(c: Button; caption: ARRAY OF CHAR);
 BEGIN InitControl(c);
   c.w := 10; c.h := 1;
-  c.caption := caption;
+  c.caption := caption$;
   c.do := buttonMethod
 END InitButton;
 
@@ -1815,7 +1815,7 @@ BEGIN SetApp(m, app); Add(app.menu, m); RefreshAppMenu(app.menu)
 END AddMenu;
 
 PROCEDURE SetStatusText*(app: App; text: ARRAY OF CHAR);
-BEGIN app.statusText := text
+BEGIN app.statusText := text$
 END SetStatusText;
 
 PROCEDURE CheckMenuOpenKey(app: App; key: G.Key): BOOLEAN;
@@ -1874,9 +1874,7 @@ BEGIN handled := FALSE; p := app.cur;
   END;
   IF ~handled THEN
     IF (key.code = G.kEnter) & (key.mod * G.mAlt # {}) THEN
-      IF blockToggle THEN blockToggle := FALSE
-      ELSE T.ToggleFullscreen; blockToggle := TRUE
-      END
+      T.ToggleFullscreen
     ELSIF p # NIL THEN
       IF p.do.keyDown # NIL THEN p.do.keyDown(p, key) END;
       IF (p.parent # NIL) & (p.parent IS Window) &
@@ -1991,7 +1989,6 @@ BEGIN
 END RunApp;
 
 BEGIN
-  blockToggle := FALSE;
   NEW(controlMethod); InitControlMethod(controlMethod);
   NEW(buttonMethod); InitButtonMethod(buttonMethod);
   NEW(winBtnMethod); InitWinBtnMethod(winBtnMethod);

+ 4 - 3
src/SDL2.Mod

@@ -149,6 +149,7 @@ CONST
   getEvent*  = 2;
 
 TYPE
+  CHAR = SHORTCHAR;
   INT8* = SYSTEM.INT8;
   INT16* = SYSTEM.INT16;
 
@@ -293,7 +294,7 @@ TYPE
 
   KeyArray* = POINTER [1] TO ARRAY 1024 OF BOOLEAN;
 
-PROCEDURE -AAIncludeSDL2h0* '#include "SDL2.h0"';
+PROCEDURE -AAIncludeSDL2h0 '#include "SDL2.h0"';
 
 PROCEDURE -Init*(flags: SET): SHORTINT "SDL_Init(flags)";
 PROCEDURE -Quit* "SDL_Quit()";
@@ -392,10 +393,10 @@ PROCEDURE -GetDesktopDisplayMode*(displayIndex: INTEGER; VAR mode: DisplayMode)
     "SDL_GetDesktopDisplayMode(displayIndex, mode)";
 
 PROCEDURE -FillRect*(dst: Surface; VAR rect: Rect; color: INTEGER)
-  "SDL_FillRect(dst, rect, color)";
+    "SDL_FillRect(dst, rect, color)";
 
 PROCEDURE -FillRectNil*(dst: Surface; color: INTEGER)
-  "SDL_FillRect(dst, (void *)0, color)"; (* !FIXME *)
+    "SDL_FillRect(dst, (void *)0, color)"; (* !FIXME *)
 
 PROCEDURE -LockSurface*(surface: Surface) "SDL_LockSurface(surface)";
 PROCEDURE -UnlockSurface*(surface: Surface) "SDL_UnlockSurface(surface)";

+ 12 - 1
src/SDL2.h0

@@ -1,6 +1,10 @@
 #ifndef SDL2__h0
 #define SDL2__h0
 
+typedef unsigned char UINT8;
+typedef unsigned short UINT16;
+typedef unsigned int UINT32;
+
 typedef enum {
   SDL_FALSE = 0,
   SDL_TRUE  = 1
@@ -26,6 +30,7 @@ extern int SDL_FillRect(void *, void *, UINT32);
 extern void SDL_FreeSurface(void *);
 extern int SDL_GetDesktopDisplayMode(int, void *);
 extern void *SDL_GetError(void);
+extern int SDL_GetModState();
 extern void *SDL_GetKeyboardState(void *);
 extern UINT32 SDL_GetMouseState(void *, void *);
 extern UINT32 SDL_GetTicks(void);
@@ -33,10 +38,11 @@ extern UINT32 SDL_GetWindowFlags(void *);
 extern void SDL_GetWindowSize(void *, void *, void *);
 extern int IMG_Init(int);
 extern void *IMG_Load(void *);
+extern void IMG_Quit(void);
 extern int IMG_SavePNG(void *, void *);
 extern int IMG_SaveJPG(void *, void *);
-extern void IMG_Quit(void);
 extern int SDL_Init(UINT32);
+extern int SDL_InitSubSystem(UINT32);
 extern void *SDL_LoadBMP_RW(void *, int);
 extern int SDL_SaveBMP_RW(void *, void *, int);
 extern int SDL_LockSurface(void *);
@@ -45,6 +51,7 @@ extern int SDL_PollEvent(void *);
 extern int SDL_WaitEvent(void *);
 extern int SDL_WaitEventTimeout(void *, int timeout);
 extern void SDL_Quit(void);
+extern void SDL_QuitSubSystem(UINT32);
 extern void *SDL_RWFromFile(void *, void *);
 extern int SDL_RenderClear(void *);
 extern int SDL_RenderCopy(void *, void *, void *, void *);
@@ -62,6 +69,7 @@ extern int SDL_SetSurfaceColorMod(void *, UINT8, UINT8, UINT8);
 extern int SDL_SetWindowFullscreen(void *, UINT32);
 extern void SDL_SetWindowSize(void *, int, int);
 extern void SDL_SetWindowTitle(void *, void *);
+extern void SDL_SetWindowIcon(void *, void *);
 extern int SDL_ShowCursor(int);
 extern void SDL_UnlockSurface(void *);
 extern void SDL_StartTextInput(void);
@@ -70,5 +78,8 @@ extern int SDL_HasEvent(int);
 extern int SDL_HasEvents(int, int);
 extern int SDL_PeepEvents(void *, int, int, int, int);
 extern int SDL_SetSurfaceAlphaMod(void *, UINT8);
+extern int SDL_SetTextureColorMod(void *, UINT8, UINT8, UINT8);
+extern int SDL_SetTextureAlphaMod(void *, UINT8);
+extern SDL_bool SDL_SetClipRect(void *, void *);
 
 #endif

+ 2 - 0
src/Term.Mod

@@ -18,6 +18,8 @@ along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 *)
 IMPORT SYSTEM;
 
+TYPE CHAR = SHORTCHAR;
+
 PROCEDURE -AAIncludeTermh* '#include "term/term.h"';
 
 PROCEDURE -StartProcess*

+ 6 - 5
src/Terminal.Mod

@@ -22,6 +22,7 @@ CONST
   cursorTicks* = 10; (* Ticks before cursor flashes *)
 
 TYPE
+  CHAR = SHORTCHAR;
   ScreenChar* = RECORD
     ch*: CHAR;
     fg*, bg*: INTEGER; (* Цвет текста и цвет фона*)
@@ -107,7 +108,7 @@ BEGIN
     fg := InvertColor(chars[mouseY, mouseX].fg);
     ch := chars[mouseY, mouseX].ch
   ELSE bg := 6; fg := 0; ch := ' ' END;
-  x := mouseX * charW;  y := mouseY * charH;
+  x := mouseX * charW; y := mouseY * charH;
   DrawChar(ch, x, y, fg, bg)
 END DrawMouse;
 
@@ -133,7 +134,7 @@ BEGIN
     (* Text Cursor *)
     IF cursorShown THEN
       color := ExpandColor(chars[cursorY, cursorX].fg);
-      x := cursorX * charW;  y := cursorY * charH;
+      x := cursorX * charW; y := cursorY * charH;
       IF insertCursor THEN
         G.RectFill(screen, x, y, x + charW - 1, y + charH - 1, color) (*!FIXME*)
       ELSE
@@ -332,7 +333,7 @@ BEGIN
   options := {G.buffered, G.initMouse, G.spread};
   IF fullscreen THEN INCL(options, G.fullscreen) END;
   IF software THEN INCL(options, G.software) END;
-  G.Settings(640, 400, options);
+  G.Settings(768, 432, options);
   G.SetSizeStep(charW, charH);
   screen := G.Init();
   IF screen # NIL THEN
@@ -346,8 +347,8 @@ BEGIN
       insertCursor := FALSE;
       cursorOn := FALSE;
       cursorShown := FALSE;
-      cursorX := 1;  cursorY := 2;
-      mouseX := 0;  mouseY := 0;
+      cursorX := 1; cursorY := 2;
+      mouseX := 0; mouseY := 0;
       ResizeScreen
     END
   END;

+ 21 - 0
src/make.bat

@@ -0,0 +1,21 @@
+@SET PROG=FreeOberon
+@SET OFRDIR=C:\prg\OfrontPlus\Target\Win64
+@REM SET SDL2Opts=-w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2
+@SET SDL2Opts=-lmingw32 -lSDL2main -lSDL2
+@SET OFR=ofront+ -88 -C -s
+
+%OFR% Config_win32.Mod
+%OFR% Int.Mod
+%OFR% -i SDL2.Mod
+%OFR% Graph.Mod
+%OFR% Terminal.Mod
+%OFR% Term.Mod
+%OFR% OV.Mod
+%OFR% EditorText.Mod
+%OFR% Editor.Mod
+%OFR% -m FreeOberon.Mod
+
+windres resources.rc resources.o
+
+REM                        -O0 change to -Os (?)   add -s (?)
+gcc -g3 -O0 -fno-exceptions -I %OFRDIR%\..\..\Mod\Lib -I %OFRDIR%\Lib\Obj Config.c term\term_win32.c Int.c SDL2.c Graph.c Term.c Terminal.c OV.c EditorText.c Editor.c %PROG%.c resources.o -o ..\%PROG%.exe %OFRDIR%\Lib\Ofront.a %SDL2Opts% -lSDL2_image